commit 600daa11421434de89e658a7c542df1d9c9ed783 Author: Quixos Template Publisher Date: Sat Jan 1 00:00:00 2000 +0000 Export template source from 4c88728f144add3457b4273d4b9a04ee53c53be3:quixos-instance/packages/project-react-runtime diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9c2c842 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.yarn/install-state.gz +node_modules diff --git a/.quixos-template-source.json b/.quixos-template-source.json new file mode 100644 index 0000000..0701d26 --- /dev/null +++ b/.quixos-template-source.json @@ -0,0 +1,4 @@ +{ + "monorepoCommit": "4c88728f144add3457b4273d4b9a04ee53c53be3", + "sourcePath": "quixos-instance/packages/project-react-runtime" +} diff --git a/.yarn/plugins/yarn-plugin-nixify.cjs b/.yarn/plugins/yarn-plugin-nixify.cjs new file mode 100644 index 0000000..44f7f79 --- /dev/null +++ b/.yarn/plugins/yarn-plugin-nixify.cjs @@ -0,0 +1 @@ +module.exports={name:"yarn-plugin-nixify",factory:function(e){var t;return(()=>{"use strict";var n={d:(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},r={};n.r(r),n.d(r,{default:()=>E});const a=e("@yarnpkg/core"),o=e("clipanion");class i extends o.Command{constructor(...e){super(...e),this.locator=o.Option.String({required:!1})}async execute(){const e=await a.Configuration.find(this.context.cwd,this.context.plugins),{project:t}=await a.Project.find(e,this.context.cwd),n=await a.Cache.find(e),r=e.makeFetcher();return(await a.StreamReport.start({configuration:e,stdout:this.context.stdout},(async e=>{if(this.locator){const{locatorHash:o}=a.structUtils.parseLocator(this.locator,!0),i=t.originalPackages.get(o);if(!i)return void e.reportError(0,`Invalid locator: ${this.locator}`);await r.fetch(i,{checksums:t.storedChecksums,project:t,cache:n,fetcher:r,report:e})}else await e.startTimerPromise("Resolution step",(async()=>{await t.resolveEverything({report:e,lockfileOnly:!0})})),await e.startTimerPromise("Fetch step",(async()=>{await t.fetchEverything({cache:n,report:e,fetcher:r})}))}))).exitCode()}}i.paths=[["nixify","fetch"]];const s=e("@yarnpkg/fslib"),c=e("crypto");class l extends o.Command{constructor(...e){super(...e),this.locator=o.Option.String(),this.source=o.Option.String(),this.installLocation=o.Option.String()}async execute(){const e=await a.Configuration.find(this.context.cwd,this.context.plugins),{project:t}=await a.Project.find(e,this.context.cwd);return await t.restoreInstallState({restoreResolutions:!1}),(await a.StreamReport.start({configuration:e,stdout:this.context.stdout},(async n=>{await t.resolveEverything({report:n,lockfileOnly:!0});const r=a.structUtils.parseLocator(this.locator,!0),o=t.storedPackages.get(r.locatorHash);if(!o)return void n.reportError(0,`Invalid locator: ${this.locator}`);const i=s.ppath.join(t.cwd,this.installLocation);await s.xfs.mkdirpPromise(s.ppath.dirname(i)),await a.execUtils.execvp("cp",["-R",this.source,i],{cwd:t.cwd,strict:!0}),await a.execUtils.execvp("chmod",["-R","u+w",i],{cwd:t.cwd,strict:!0});const l=(0,c.createHash)("sha512");l.update(process.versions.node),e.triggerHook((e=>e.globalHashGeneration),t,(e=>{l.update("\0"),l.update(e)}));const d=l.digest("hex"),p=new Map,h=e=>{let n=p.get(e.locatorHash);if(void 0!==n)return n;const r=t.storedPackages.get(e.locatorHash);if(void 0===r)throw new Error("Assertion failed: The package should have been registered");const o=(0,c.createHash)("sha512");o.update(e.locatorHash),p.set(e.locatorHash,"");for(const e of r.dependencies.values()){const n=t.storedResolutions.get(e.descriptorHash);if(void 0===n)throw new Error(`Assertion failed: The resolution (${a.structUtils.prettyDescriptor(t.configuration,e)}) should have been registered`);const r=t.storedPackages.get(n);if(void 0===r)throw new Error("Assertion failed: The package should have been registered");o.update(h(r))}return n=o.digest("hex"),p.set(e.locatorHash,n),n},u=(0,c.createHash)("sha512").update(d).update(h(o)).update(i).digest("hex");t.storedBuildState.set(o.locatorHash,u),await t.persistInstallStateFile()}))).exitCode()}}l.paths=[["nixify","inject-build"]];const d=e("@yarnpkg/plugin-pnp"),p=JSON.stringify,h=(e,t,n=!1)=>t.split("\n").map((t=>t||n?e+t:t)).join("\n"),u=(e,t)=>{let n=e;for(const[e,r]of Object.entries(t))if("string"==typeof r&&(n=n.replace(new RegExp(`@@${e}@@`,"g"),r)),"boolean"==typeof r)for(;;){const t=n.split("\n"),a=t.indexOf(`#@@ IF ${e}`),o=t.indexOf(`#@@ ENDIF ${e}`);if(-1===a||o{if(!n)return;const o=s.npath.toPortablePath(this.binDir);for(const[r,a]of n.manifest.bin){const n=s.ppath.join(o,r),i=s.ppath.join(t.cwd,s.npath.toPortablePath(a));await this.writeWrapper(n,i,{configuration:e,project:t})}if(e.get("installNixBinariesForDependencies")){await t.resolveEverything({report:r,lockfileOnly:!0});const n=await a.scriptUtils.getPackageAccessibleBinaries(t.topLevelWorkspace.anchoredLocator,{project:t});for(const[r,[a,i]]of n.entries()){const n=s.ppath.join(o,r);await this.writeWrapper(n,s.npath.toPortablePath(i),{configuration:e,project:t})}}}))).exitCode()}async writeWrapper(e,t,{configuration:n,project:r}){let a;switch(n.get("nodeLinker")){case"pnp":{const e=(0,d.getPnpPath)(r),n=[];await s.xfs.existsPromise(e.cjs)&&n.push(`--require "${s.npath.fromPortablePath(e.cjs)}"`),await s.xfs.existsPromise(e.esmLoader)&&n.push(`--experimental-loader "${(0,f.pathToFileURL)(s.npath.fromPortablePath(e.esmLoader)).href}"`),a=u("#!/bin/sh\nexport NODE_OPTIONS='@@NODE_OPTIONS@@'\nexec '@@NODE_PATH@@' '@@BINARY_PATH@@' \"$@\"\n",{NODE_PATH:process.execPath,NODE_OPTIONS:n.join(" "),BINARY_PATH:t});break}case"node-modules":a=u("#!/bin/sh\nexec '@@NODE_PATH@@' '@@BINARY_PATH@@' \"$@\"\n",{NODE_PATH:process.execPath,BINARY_PATH:t});break;default:throw Error("Assertion failed: Invalid nodeLinker")}await s.xfs.writeFilePromise(e,a),await s.xfs.chmodPromise(e,493)}}g.paths=[["nixify","install-bin"]];const m=e("os"),y=e("@yarnpkg/plugin-patch"),b=(e,t)=>(0,c.createHash)(e).update(t).digest(),x=(e,t,{storePath:n="/nix/store",recursive:r=!1}={})=>{const[a,o]=t.split("-"),i=Buffer.from(o,"base64").toString("hex"),c=b("sha256",`fixed:out:${r?"r:":""}${a}:${i}:`).toString("hex"),l=(e=>{let t="",n=[...e].reverse().map((e=>e.toString(2).padStart(8,"0"))).join("");for(;n;)t+="0123456789abcdfghijklmnpqrsvwxyz"[parseInt(n.slice(0,5),2)],n=n.slice(5);return t})(((e,t)=>{const n=Buffer.alloc(20);for(let t=0;te.replace(/^\.+/,"").replace(/[^a-zA-Z0-9+._?=-]+/g,"-").slice(0,207)||"unknown",w=(e,t="sha512")=>t+"-"+Buffer.from(e,"hex").toString("base64"),k=e=>Buffer.from(e.split("-")[1],"base64").toString("hex"),I=2**32-1,P=(e,...t)=>{let n=0;const r=t.map((e=>{const t=Buffer.from(e);if(t.byteLength>I)throw Error(`NAR string too long: ${t.byteLength}`);return n+=8+8*Math.ceil(t.byteLength/8),t})),a=Buffer.alloc(n);let o=0;for(const e of r)a.writeUInt32LE(e.byteLength,o),e.copy(a,o+8),o+=8+8*Math.ceil(e.byteLength/8);e.write(a)},$=async(e,t,n)=>{if(t>I)throw Error(`NAR string too long: ${t}`);const r=Buffer.alloc(8);r.writeUInt32LE(t),e.write(r);for await(const t of n)e.write(t);const a=8-t%8;8!==a&&e.write(Buffer.alloc(a))},N=a.YarnVersion?.startsWith("3.")||!1,E={commands:[i,l,g],hooks:{afterAllInstalled:async(e,t)=>{!1!==t.persistProject&&e.configuration.get("enableNixify")&&await(async(e,t)=>{const{configuration:n,cwd:r}=e,{cache:o,report:i}=t,l=await s.xfs.realpathPromise(s.npath.toPortablePath((0,m.tmpdir)()));if(e.cwd.startsWith(l))return void i.reportInfo(0,`Skipping Nixify, because ${e.cwd} appears to be a temporary directory`);const d=n.get("nixExprPath"),f=n.get("yarnPath");let g;if(null===f){let e=(await s.xfs.readFilePromise(process.argv[1])).toString();if(e.startsWith("#!/nix/store/")){const t=e.substring(e.indexOf("\n")+1);e=`#!/usr/bin/env node\n${t}`}const t=a.hashUtils.makeHash(Buffer.from(e));g=["fetchurl {",` url = "https://repo.yarnpkg.com/${a.YarnVersion}/packages/yarnpkg-cli/bin/yarn.js";`,` hash = "${w(t)}";`,"}"].join("\n ")}else f.startsWith(r)?g="./"+s.ppath.relative(s.ppath.dirname(d),f):(g=p(f),i.reportWarning(0,`The Yarn path ${f} is outside the project - it may not be reachable by the Nix build`));const b=n.get("cacheFolder");let I;if(b.startsWith(r))I=p(s.ppath.relative(r,b));else{if(N||!n.get("enableGlobalCache"))throw Error(`The cache folder ${b} is outside the project, this is currently not supported`);I='".yarn/cache"'}const E=new Set;for(const e of n.sources.values())for(const t of e.split(", "))t.startsWith("<")||E.add(t);for(const e of E)s.ppath.resolve(r,e).startsWith(r)||i.reportWarning(0,`The config file ${e} is outside the project - it may not be reachable by the Nix build`);const D="./"+s.ppath.relative(s.ppath.dirname(d),s.ppath.resolve(r,"yarn.lock")),S=new Map,_=new Set(await s.xfs.readdirPromise(o.cwd)),L={unstablePackages:e.conditionalLocators};for(const t of e.storedPackages.values()){const{locatorHash:n}=t,r=e.storedChecksums.get(n),a=N?o.getLocatorPath(t,r||null,L):o.getLocatorPath(t,r||null);if(!a)continue;if(!_.has(s.ppath.basename(a)))continue;const i=r?o.getChecksumFilename(t,r):o.getVersionFilename(t);S.set(i,{pkg:t,checksum:r,cachePath:a})}const O=new Map,A=n.get("individualNixPackaging");let j="",T="";if(A){for(const[e,{pkg:t,checksum:n,cachePath:r}]of S.entries()){const o=a.structUtils.stringifyLocator(t),i=n?n.split("/").pop():await a.hashUtils.checksumFile(r);O.set(o,{cachePath:r,filename:e,hash:w(i)})}j="cacheEntries = {\n";for(const e of[...O.keys()].sort()){const t=O.get(e);j+=`${p(e)} = { ${[`filename = ${p(t.filename)};`,`hash = "${t.hash}";`].join(" ")} };\n`}j+="};"}else{const e=(0,c.createHash)("sha512");P(e,"nix-archive-1","(","type","directory");for(const t of[...S.keys()].sort()){const{cachePath:n}=S.get(t),{size:r}=await s.xfs.statPromise(n);P(e,"entry","(","name",t,"node","(","type","regular","contents"),await $(e,r,s.xfs.createReadStream(n)),P(e,")",")")}P(e,")"),e.end();for await(const t of e)T=w(t)}const C=n.get("isolatedNixBuilds");let R=new Set,F=[],B=[];const H=n.get("nodeLinker"),U=n.get("pnpUnpluggedFolder"),M=(t,n=new Set)=>{const r=a.structUtils.stringifyLocator(t);if(O.has(r)&&n.add(r),a.structUtils.isVirtualLocator(t)){const r=e.storedPackages.get(a.structUtils.devirtualizeLocator(t).locatorHash);if(!r)throw Error("Assertion failed: The locator should have been registered");M(r,n)}if(t.reference.startsWith("patch:")){const r=e.storedPackages.get(y.patchUtils.parseLocator(t).sourceLocator.locatorHash);if(!r)throw Error("Assertion failed: The locator should have been registered");M(r,n)}for(const r of t.dependencies.values()){const t=e.storedResolutions.get(r.descriptorHash);if(!t)throw Error("Assertion failed: The descriptor should have been registered");const a=e.storedPackages.get(t);if(!a)throw Error("Assertion failed: The locator should have been registered");M(a,n)}return n};for(const t of e.storedBuildState.keys()){const n=e.storedPackages.get(t);if(!n)throw Error("Assertion failed: The locator should have been registered");if(!C.includes(n.name))continue;let r;if("pnp"!==H)throw Error(`The nodeLinker ${H} is not supported for isolated Nix builds`);r=s.ppath.relative(e.cwd,s.ppath.join(U,a.structUtils.slugifyLocator(n),a.structUtils.getIdentVendorPath(n)));let o=n;if(a.structUtils.isVirtualLocator(o)){const{locatorHash:t}=a.structUtils.devirtualizeLocator(o),n=e.storedPackages.get(t);if(!n)throw Error("Assertion failed: The locator should have been registered");o=n}const i=a.structUtils.stringifyLocator(o),c=a.structUtils.stringifyLocator(n),l=`isolated.${p(i)}`;if(!R.has(o)){R.add(o);const e=[`pname = ${p(n.name)};`,`version = ${p(n.version)};`,`reference = ${p(o.reference)};`];if(A){const t=[...M(n)].sort().map((e=>`${p(e)}\n`)).join("");t&&e.push(`locators = [\n${t}];`)}const t=`override${V=n.name,V.split(/[^a-zA-Z0-9]+/g).filter((e=>e)).map((e=>{return(t=e).slice(0,1).toUpperCase()+t.slice(1);var t})).join("")}Attrs`;B.push(`${l} = optionalOverride (args.${t} or null) (mkIsolatedBuild { ${e.join(" ")} });`)}0===F.length&&F.push("# Copy in isolated builds."),F.push(`echo 'injecting build for ${n.name}'`,"yarn nixify inject-build \\",` ${p(c)} \\`,` \${${l}} \\`,` ${p(r)}`)}var V;if(F.length>0&&F.push("echo 'running yarn install'"),null==t.mode||0===C.length){const t=e.topLevelWorkspace.manifest.name,o=t?a.structUtils.stringifyIdent(t):"workspace",c=u("# This file is generated by running \"yarn install\" inside your project.\n# Manual changes might be lost - proceed with caution!\n\n{ lib, stdenv, nodejs, git, cacert, fetchurl, writeShellScript, writeShellScriptBin }:\n{ src, overrideAttrs ? null, ... } @ args:\n\nlet\n\n yarnBin = @@YARN_BIN@@;\n\n cacheFolder = @@CACHE_FOLDER@@;\n lockfile = @@LOCKFILE@@;\n\n # Call overrideAttrs on a derivation if a function is provided.\n optionalOverride = fn: drv:\n if fn == null then drv else drv.overrideAttrs fn;\n\n # Simple stub that provides the global yarn command.\n yarn = writeShellScriptBin \"yarn\" ''\n exec '${nodejs}/bin/node' '${yarnBin}' \"$@\"\n '';\n\n # Common attributes between Yarn derivations.\n drvCommon = {\n # Make sure the build uses the right Node.js version everywhere.\n buildInputs = [ nodejs yarn ];\n # All dependencies should already be cached.\n yarn_enable_network = \"0\";\n # Tell node-gyp to use the provided Node.js headers for native code builds.\n npm_config_nodedir = nodejs;\n };\n\n # Comman variables that we set in a Nix build, but not in a Nix shell.\n buildVars = ''\n # Make Yarn produce friendlier logging for automated builds.\n export CI=1\n # Tell node-pre-gyp to never fetch binaries / always build from source.\n export npm_config_build_from_source=true\n '';\n\n#@@ IF COMBINED_DRV\n cacheDrv = stdenv.mkDerivation {\n name = \"yarn-cache\";\n buildInputs = [ yarn git cacert ];\n buildCommand = ''\n cp --reflink=auto --recursive '${src}' ./src\n cd ./src/\n ${buildVars}\n HOME=\"$TMP\" yarn_enable_global_cache=false yarn_cache_folder=\"$out\" \\\n yarn nixify fetch\n rm $out/.gitignore\n '';\n outputHashMode = \"recursive\";\n outputHash = \"@@COMBINED_HASH@@\";\n };\n#@@ ENDIF COMBINED_DRV\n#@@ IF INDIVIDUAL_DRVS\n # Create derivations for fetching dependencies.\n cacheDrvs = let\n in lib.mapAttrs (locator: { filename, hash }: stdenv.mkDerivation {\n name = lib.strings.sanitizeDerivationName locator;\n buildInputs = [ yarn git cacert ];\n buildCommand = ''\n cd '${src}'\n ${buildVars}\n HOME=\"$TMP\" yarn_enable_global_cache=false yarn_cache_folder=\"$TMP\" \\\n yarn nixify fetch ${lib.escapeShellArg locator}\n # Because we change the cache dir, Yarn may generate a different name.\n mv \"$TMP/$(sed 's/-[^-]*\\.[^-]*$//' <<< \"$outputFilename\")\"-* $out\n '';\n outputFilename = filename;\n outputHash = hash;\n }) cacheEntries;\n\n # Create a shell snippet to copy dependencies from a list of derivations.\n mkCacheBuilderForDrvs = drvs:\n writeShellScript \"collect-yarn-cache\" (lib.concatMapStrings (drv: ''\n cp --reflink=auto ${drv} '${drv.outputFilename}'\n '') drvs);\n#@@ ENDIF INDIVIDUAL_DRVS\n\n#@@ IF NEED_ISOLATED_BUILD_SUPPRORT\n#@@ IF INDIVIDUAL_DRVS\n # Create a shell snippet to copy dependencies from a list of locators.\n mkCacheBuilderForLocators = let\n pickCacheDrvs = map (locator: cacheDrvs.${locator});\n in locators:\n mkCacheBuilderForDrvs (pickCacheDrvs locators);\n#@@ ENDIF INDIVIDUAL_DRVS\n\n # Create a derivation that builds a module in isolation.\n mkIsolatedBuild = { pname, version, reference, locators ? [] }: stdenv.mkDerivation (drvCommon // {\n inherit pname version;\n dontUnpack = true;\n\n configurePhase = ''\n ${buildVars}\n unset yarn_enable_nixify # plugin is not present\n '';\n\n buildPhase = ''\n mkdir -p .yarn/cache\n#@@ IF COMBINED_DRV\n cp --reflink=auto --recursive ${cacheDrv}/* .yarn/cache/\n#@@ ENDIF COMBINED_DRV\n#@@ IF INDIVIDUAL_DRVS\n pushd .yarn/cache > /dev/null\n source ${mkCacheBuilderForLocators locators}\n popd > /dev/null\n#@@ ENDIF INDIVIDUAL_DRVS\n\n echo '{ \"dependencies\": { \"${pname}\": \"${reference}\" } }' > package.json\n install -m 0600 ${lockfile} ./yarn.lock\n export yarn_global_folder=\"$TMP\"\n export yarn_enable_global_cache=false\n export yarn_enable_immutable_installs=false\n yarn\n '';\n\n installPhase = ''\n unplugged=( .yarn/unplugged/${pname}-*/node_modules/* )\n if [[ ! -e \"''${unplugged[@]}\" ]]; then\n echo >&2 \"Could not find the unplugged path for ${pname}\"\n exit 1\n fi\n\n mv \"$unplugged\" $out\n '';\n });\n#@@ ENDIF NEED_ISOLATED_BUILD_SUPPRORT\n\n # Main project derivation.\n project = stdenv.mkDerivation (drvCommon // {\n inherit src;\n name = @@PROJECT_NAME@@;\n\n configurePhase = ''\n ${buildVars}\n\n # Copy over the Yarn cache.\n rm -fr '${cacheFolder}'\n mkdir -p '${cacheFolder}'\n#@@ IF COMBINED_DRV\n cp --reflink=auto --recursive ${cacheDrv}/* '${cacheFolder}/'\n#@@ ENDIF COMBINED_DRV\n#@@ IF INDIVIDUAL_DRVS\n pushd '${cacheFolder}' > /dev/null\n source ${mkCacheBuilderForDrvs (lib.attrValues cacheDrvs)}\n popd > /dev/null\n#@@ ENDIF INDIVIDUAL_DRVS\n\n # Yarn may need a writable home directory.\n export yarn_global_folder=\"$TMP\"\n\n # Ensure global cache is disabled. Cache must be part of our output.\n touch .yarnrc.yml\n sed -i -e '/^enableGlobalCache/d' .yarnrc.yml\n echo 'enableGlobalCache: false' >> .yarnrc.yml\n\n # Some node-gyp calls may call out to npm, which could fail due to an\n # read-only home dir.\n export HOME=\"$TMP\"\n\n # running preConfigure after the cache is populated allows for\n # preConfigure to contain substituteInPlace for dependencies as well as the\n # main project. This is necessary for native bindings that maybe have\n # hardcoded values.\n runHook preConfigure\n\n@@ISOLATED_INTEGRATION@@\n\n # Run normal Yarn install to complete dependency installation.\n yarn install --immutable --immutable-cache\n\n runHook postConfigure\n '';\n\n buildPhase = ''\n runHook preBuild\n runHook postBuild\n '';\n\n installPhase = ''\n runHook preInstall\n\n # Move the package contents to the output directory.\n if grep -q '\"workspaces\"' package.json; then\n # We can't use `yarn pack` in a workspace setup, because it only\n # packages the outer workspace.\n mkdir -p \"$out/libexec\"\n mv $PWD \"$out/libexec/$name\"\n else\n # - If the package.json has a `files` field, only files matching those patterns are copied\n # - Otherwise all files are copied.\n yarn pack --out package.tgz\n mkdir -p \"$out/libexec/$name\"\n tar xzf package.tgz --directory \"$out/libexec/$name\" --strip-components=1\n\n cp --reflink=auto .yarnrc* \"$out/libexec/$name\"\n cp --reflink=auto ${lockfile} \"$out/libexec/$name/yarn.lock\"\n cp --reflink=auto --recursive .yarn \"$out/libexec/$name\"\n\n # Copy the Yarn linker output into the package.\n#@@ IF USES_PNP_LINKER\n cp --reflink=auto .pnp.* \"$out/libexec/$name\"\n#@@ ENDIF USES_PNP_LINKER\n#@@ IF USES_NM_LINKER\n cp --reflink=auto --recursive node_modules \"$out/libexec/$name\"\n#@@ ENDIF USES_NM_LINKER\n fi\n\n cd \"$out/libexec/$name\"\n\n # Invoke a plugin internal command to setup binaries.\n mkdir -p \"$out/bin\"\n yarn nixify install-bin $out/bin\n\n#@@ IF USES_NM_LINKER\n # A package with node_modules doesn't need the cache\n yarn cache clean\n#@@ ENDIF USES_NM_LINKER\n\n runHook postInstall\n '';\n\n passthru = {\n inherit nodejs;\n yarn-freestanding = yarn;\n yarn = writeShellScriptBin \"yarn\" ''\n exec '${yarn}/bin/yarn' --cwd '${overriddenProject}/libexec/${overriddenProject.name}' \"$@\"\n '';\n };\n });\n\n overriddenProject = optionalOverride overrideAttrs project;\n\n@@CACHE_ENTRIES@@\n@@ISOLATED@@\nin overriddenProject\n",{PROJECT_NAME:p(o),YARN_BIN:g,LOCKFILE:D,INDIVIDUAL_DRVS:A,COMBINED_DRV:!A,COMBINED_HASH:T,CACHE_FOLDER:I,CACHE_ENTRIES:j,ISOLATED:B.join("\n"),ISOLATED_INTEGRATION:h(" ",F.join("\n")),NEED_ISOLATED_BUILD_SUPPRORT:F.length>0,USES_PNP_LINKER:"pnp"===n.get("nodeLinker"),USES_NM_LINKER:"node-modules"===n.get("nodeLinker")}).replace(/\n\n\n+/g,"\n\n");if(await s.xfs.mkdirpPromise(s.ppath.dirname(d)),await s.xfs.writeFilePromise(d,c),n.get("generateDefaultNix")){const e=s.ppath.join(r,"default.nix"),t=s.ppath.join(r,"flake.nix");s.xfs.existsSync(e)||s.xfs.existsSync(t)||(await s.xfs.writeFilePromise(e,"# This is a minimal `default.nix` by yarn-plugin-nixify. You can customize it\n# as needed, it will not be overwritten by the plugin.\n\n{ pkgs ? import { } }:\n\npkgs.callPackage ./yarn-project.nix { } { src = ./.; }\n"),i.reportInfo(0,"A minimal default.nix was created. You may want to customize it."))}}n.get("enableNixPreload")&&s.xfs.existsSync(s.npath.toPortablePath("/nix/store"))&&await s.xfs.mktempPromise((async t=>{const n=["--add-fixed","sha512"],r=[];if(A)for(const[e,{cachePath:n,hash:a}]of O.entries()){const o=v(e),i=x(o,a);if(!s.xfs.existsSync(i)){const e=s.ppath.join(t,k(a).slice(0,7));await s.xfs.mkdirPromise(e);const i=s.ppath.join(e,o);await s.xfs.copyFilePromise(n,i),r.push(i)}}else{n.unshift("--recursive");const e=x("yarn-cache",T,{recursive:!0});if(!s.xfs.existsSync(e)){const e=s.ppath.join(t,"yarn-cache");await s.xfs.mkdirPromise(e);for(const[t,{cachePath:n}]of S.entries()){const r=s.ppath.join(e,t);await s.xfs.copyFilePromise(n,r)}r.push(e)}}try{const t=r.length;for(;0!==r.length;){const t=r.splice(0,100);await a.execUtils.execvp("nix-store",[...n,...t],{cwd:e.cwd,strict:!0})}0!==t&&i.reportInfo(0,A?`Preloaded ${t} packages into the Nix store`:"Preloaded cache into the Nix store")}catch(e){if("ENOENT"!==e.code)throw e}}))})(e,t)}},configuration:{enableNixify:{description:"If false, disables the Nixify plugin hook that generates Nix expressions",type:a.SettingsType.BOOLEAN,default:!0},nixExprPath:{description:"Path of the file where the project Nix expression will be written to",type:a.SettingsType.ABSOLUTE_PATH,default:"./yarn-project.nix"},generateDefaultNix:{description:"If true, a default.nix will be generated if it does not exist",type:a.SettingsType.BOOLEAN,default:!0},enableNixPreload:{description:"If true, cached packages will be preloaded into the Nix store",type:a.SettingsType.BOOLEAN,default:!0},individualNixPackaging:{description:"If true, generate one Nix derivation per package. If false, use a single derivation for the entire cache folder.",type:a.SettingsType.BOOLEAN,default:!1},isolatedNixBuilds:{description:"Dependencies with a build step that can be built in an isolated derivation",type:a.SettingsType.STRING,default:[],isArray:!0},installNixBinariesForDependencies:{description:"If true, the Nix output 'bin' directory will also contain executables for binaries defined by dependencies",type:a.SettingsType.BOOLEAN,default:!1}}};t=r})(),t}}; \ No newline at end of file diff --git a/.yarnrc.yml b/.yarnrc.yml new file mode 100644 index 0000000..35c498d --- /dev/null +++ b/.yarnrc.yml @@ -0,0 +1,29 @@ +approvedGitRepositories: + - "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/*" + +enableScripts: true + +generateDefaultNix: false + +individualNixPackaging: true + +nodeLinker: node-modules + +npmMinimalAgeGate: 0 + +plugins: + - checksum: 271de9a785321a37c564b8e2a6b5cd689850b20572d5fee8ec0a6b8e7a5d4cfb59e533524af2b4a537e00da12828abd062eaec6978556e3dd9149a020db2591b + path: .yarn/plugins/yarn-plugin-nixify.cjs + spec: "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/yarn-plugin-nixify-patched/raw/commit/4528fdd20b30d869262443b3f044549810e75fb8/dist/yarn-plugin-nixify.js" + +supportedArchitectures: + cpu: + - current + - x64 + - arm64 + libc: + - current + - glibc + os: + - current + - linux diff --git a/descriptor.quixos-package.txtpb b/descriptor.quixos-package.txtpb new file mode 100644 index 0000000..7ec262c --- /dev/null +++ b/descriptor.quixos-package.txtpb @@ -0,0 +1,9 @@ +# Generated from the checked package contract +package_id: "package:project-react-runtime" +package_revision_id: "package:project-react-runtime@1" +runtime_protocol_version: "quixos-capabilities-v1" +exports: { export_id: "export:project-react-runtime:create-component" runtime_symbol: "createComponent" } +exports: { export_id: "export:project-react-runtime:source-get" runtime_symbol: "sourceGet" } +exports: { export_id: "export:project-react-runtime:props-get" runtime_symbol: "propsGet" } +exports: { export_id: "export:project-react-runtime:props-watch" runtime_symbol: "propsWatch" } +exports: { export_id: "export:project-react-runtime:props-watch-stop" runtime_symbol: "propsWatchStop" } diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..cb7bcc4 --- /dev/null +++ b/flake.lock @@ -0,0 +1,80 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1788404924, + "narHash": "sha256-lhEhY8X5EgkQ/eg6IFz4cc8jRuSYSvnxx1al7d1dvZ0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "0968519e14f7aa7d3e9b389682bd74d2b51c8ce8", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "quixosNixHelpers": { + "flake": false, + "locked": { + "lastModified": 1789602549, + "narHash": "sha256-DD66dQ3dzEvG13Zju/4sVSV4pnktSUkJ/Rbr1KkHMdg=", + "ref": "refs/tags/quixos-reachability/e2747066ca7d9d001dcb5dd936e17969ed88fc5f", + "rev": "e2747066ca7d9d001dcb5dd936e17969ed88fc5f", + "revCount": 32, + "type": "git", + "url": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-nix-helpers.git" + }, + "original": { + "ref": "refs/tags/quixos-reachability/e2747066ca7d9d001dcb5dd936e17969ed88fc5f", + "rev": "e2747066ca7d9d001dcb5dd936e17969ed88fc5f", + "type": "git", + "url": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-nix-helpers.git" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "quixosNixHelpers": "quixosNixHelpers" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..2870a18 --- /dev/null +++ b/flake.nix @@ -0,0 +1,38 @@ +{ + description = "Quixos project React component runtime package"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + + quixosNixHelpers = { + url = "git+https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-nix-helpers.git?ref=refs/tags/quixos-reachability/e2747066ca7d9d001dcb5dd936e17969ed88fc5f&rev=e2747066ca7d9d001dcb5dd936e17969ed88fc5f"; + flake = false; + }; + }; + + outputs = + inputs@{ + nixpkgs, + flake-utils, + quixosNixHelpers, + ... + }: + let + quixosHelpers = import "${quixosNixHelpers}/quixos-package-helpers.nix"; + in + quixosHelpers.mkCaminoTsYarnNixifyFlake { + inherit inputs nixpkgs flake-utils; + packageRoot = ./.; + migrationEntrypoint = "dist/migrate.js"; + promptName = "project-react-runtime"; + bundle = { + entry = "src/server.ts"; + browserSources = true; + }; + installServer = { + libexecName = "project-react-runtime"; + descriptorPath = "descriptor.quixos-package.txtpb"; + }; + }; +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..27ace5f --- /dev/null +++ b/package.json @@ -0,0 +1,24 @@ +{ + "name": "@quixos/project-react-runtime", + "version": "0.1.0", + "private": true, + "packageManager": "yarn@4.18.0", + "type": "module", + "bin": { + "server": "dist/server.js" + }, + "scripts": { + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@quixos/camino-package-runtime": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=446fd4e36e9700cf27ce20b472a8d512133e9370", + "react": "^18.3.1" + }, + "devDependencies": { + "@types/node": "^24", + "@types/react": "^18.3.12", + "esbuild": "^0.25.12", + "typescript": "^7.0.2" + } +} diff --git a/package.qx b/package.qx new file mode 100644 index 0000000..cd3259f --- /dev/null +++ b/package.qx @@ -0,0 +1,48 @@ +import interface TagData; +import interface CompletionData; +import interface TaskActions; +import interface TaskData; +import interface ProjectActions; +external atom Task id "atom:task"; +external atom Tag id "atom:tag"; +external atom Completion id "atom:completion"; +import interface Named; +import interface ProjectTasks; +external atom ProjectReactComponent id "atom:project-react-component"; +external atom Project id "atom:project"; +type ProjectProps = record {named: interface-ref; tasks: interface-ref;}; + +package ProjectReactRuntime id "package:project-react-runtime" revision "package:project-react-runtime@1" { + constructor createComponent id "export:project-react-runtime:create-component" constructs ProjectReactComponent : atom-ref; + operation sourceGet id "export:project-react-runtime:source-get" : unit -> string mode call receiver atom ProjectReactComponent; + operation propsGet id "export:project-react-runtime:props-get" : unit -> ProjectProps mode call receiver atom ProjectReactComponent requires { + interface named id "port:project-react:named" : Named; + interface tasks id "port:project-react:tasks" : ProjectTasks; + }; + operation propsWatch id "export:project-react-runtime:props-watch" : unit -> watch-handle mode watch-start emits ProjectProps receiver atom ProjectReactComponent requires { + interface named id "port:project-react:named" : Named; + interface tasks id "port:project-react:tasks" : ProjectTasks; + }; + operation propsWatchStop id "export:project-react-runtime:props-watch-stop" : watch-handle -> unit mode watch-stop receiver atom ProjectReactComponent; + query Tasks id "query:Tasks" root ProjectTasks document "queries/Tasks.graphql" operation "Tasks" { + view Task as TaskData; view Tag as TagData; view Completion as CompletionData; + max rows 100; max depth 8; max result-bytes 1048576; watch; + } + query TaggedTasks id "query:TaggedTasks" root ProjectTasks document "queries/TaggedTasks.graphql" operation "TaggedTasks" { + view Task as TaskData; view Tag as TagData; view Completion as CompletionData; + max rows 100; max depth 8; max result-bytes 1048576; watch; + } + query UntaggedTasks id "query:UntaggedTasks" root ProjectTasks document "queries/UntaggedTasks.graphql" operation "UntaggedTasks" { + view Task as TaskData; view Tag as TagData; view Completion as CompletionData; + max rows 100; max depth 8; max result-bytes 1048576; watch; + } + query Catalog id "query:Catalog" root ProjectTasks document "queries/Catalog.graphql" operation "Catalog" { + view Task as TaskData; view Tag as TagData; view Completion as CompletionData; + max rows 100; max depth 8; max result-bytes 1048576; watch; + } + query Summary id "query:Summary" root ProjectTasks document "queries/Summary.graphql" operation "Summary" { + view Task as TaskData; view Tag as TagData; view Completion as CompletionData; + max rows 100; max depth 8; max result-bytes 1048576; watch; + } + +} diff --git a/queries/Catalog.graphql b/queries/Catalog.graphql new file mode 100644 index 0000000..8e0cb37 --- /dev/null +++ b/queries/Catalog.graphql @@ -0,0 +1 @@ +query Catalog {root {tags(all: 100, orderBy: [{name: ASC}]) {entries {node {_qx {ref} name color}}}}} diff --git a/queries/Summary.graphql b/queries/Summary.graphql new file mode 100644 index 0000000..d540913 --- /dev/null +++ b/queries/Summary.graphql @@ -0,0 +1,8 @@ +query Summary {root {_qx {relations {tasks { + aggregate {count sum {estimatedHours}} + groups(by: {status: true}, first: 10) {entries {group {status} aggregate {count sum {estimatedHours}}}} + filter(where: {status: {eq: "OPEN"}}) {expand {tags { + groups(by: {target: {_qx: {ref: true}, name: true, color: true}}, first: 100, + orderBy: [{count: DESC}]) {entries {group {target {_qx {ref} name color}} aggregate {count sum {source {estimatedHours}}}}} + }}} +}}}}} diff --git a/queries/TaggedTasks.graphql b/queries/TaggedTasks.graphql new file mode 100644 index 0000000..3413b60 --- /dev/null +++ b/queries/TaggedTasks.graphql @@ -0,0 +1,4 @@ +query TaggedTasks($first: Int!, $after: Cursor, $statuses: [String!]!, $tags: [QxRef_TagData!]!) {root {tasks(first: $first, after: $after, where: {status: {in: $statuses}, _qx: {relations: {tags: {some: {_qx: {ref: {in: $tags}}}}}}}, orderBy: [{dueDate: ASC}, {title: ASC}]) {entries { key node {_qx {ref} title status priority dueDate repeatDays estimatedHours + tags(all: 100) {entries {node {_qx {ref} name color}}} + _qx {relations {completions {aggregate {count max {completedAt}}}}} +}} pageInfo {hasNextPage endCursor}}}} diff --git a/queries/Tasks.graphql b/queries/Tasks.graphql new file mode 100644 index 0000000..120d954 --- /dev/null +++ b/queries/Tasks.graphql @@ -0,0 +1,4 @@ +query Tasks($first: Int!, $after: Cursor, $statuses: [String!]!) {root {tasks(first: $first, after: $after, where: {status: {in: $statuses}}, orderBy: [{dueDate: ASC}, {title: ASC}]) {entries { key node {_qx {ref} title status priority dueDate repeatDays estimatedHours + tags(all: 100) {entries {node {_qx {ref} name color}}} + _qx {relations {completions {aggregate {count max {completedAt}}}}} +}} pageInfo {hasNextPage endCursor}}}} diff --git a/queries/UntaggedTasks.graphql b/queries/UntaggedTasks.graphql new file mode 100644 index 0000000..54f6b10 --- /dev/null +++ b/queries/UntaggedTasks.graphql @@ -0,0 +1,4 @@ +query UntaggedTasks($first: Int!, $after: Cursor, $statuses: [String!]!) {root {tasks(first: $first, after: $after, where: {status: {in: $statuses}, _qx: {relations: {tags: {none: {}}}}}, orderBy: [{dueDate: ASC}, {title: ASC}]) {entries { key node {_qx {ref} title status priority dueDate repeatDays estimatedHours + tags(all: 100) {entries {node {_qx {ref} name color}}} + _qx {relations {completions {aggregate {count max {completedAt}}}}} +}} pageInfo {hasNextPage endCursor}}}} diff --git a/quixos.check.json b/quixos.check.json new file mode 100644 index 0000000..8b7926c --- /dev/null +++ b/quixos.check.json @@ -0,0 +1,10 @@ +{ + "backend": "typescript", + "bindingOutput": "src/gen/qx.ts", + "options": { + "react": { + "propsExports": ["propsGet"], + "components": [{ "module": "../project-component.js", "propsExport": "propsGet" }] + } + } +} diff --git a/quixos.lock b/quixos.lock new file mode 100644 index 0000000..2e63bf4 --- /dev/null +++ b/quixos.lock @@ -0,0 +1,34 @@ +quixos-lock version 1 { + quixos source { + repository "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos.git"; + commit "4c88728f144add3457b4273d4b9a04ee53c53be3"; + } + interface Named source { + repository "https://repos.quixos.org/quixos-todo/interface-named.git"; + commit "0000000000000000000000000000000000000010"; + } + interface ProjectTasks source { + repository "https://repos.quixos.org/quixos-todo/interface-project-tasks.git"; + commit "0000000000000000000000000000000000000012"; + } + interface TagData source { + repository "https://repos.quixos.org/quixos-todo/interface-tag-data.git"; + commit "0000000000000000000000000000000000000030"; + } + interface CompletionData source { + repository "https://repos.quixos.org/quixos-todo/interface-completion-data.git"; + commit "0000000000000000000000000000000000000031"; + } + interface TaskData source { + repository "https://repos.quixos.org/quixos-todo/interface-task-data.git"; + commit "0000000000000000000000000000000000000011"; + } + interface TaskActions source { + repository "https://repos.quixos.org/quixos-todo/interface-task-actions.git"; + commit "0000000000000000000000000000000000000014"; + } + interface ProjectActions source { + repository "https://repos.quixos.org/quixos-todo/interface-project-actions.git"; + commit "0000000000000000000000000000000000000013"; + } +} diff --git a/quixos.migrations.json b/quixos.migrations.json new file mode 100644 index 0000000..cf8d17d --- /dev/null +++ b/quixos.migrations.json @@ -0,0 +1,6 @@ +{ + "generatedBy": "qx-scaffold-v1", + "schemaVersion": 1, + "contracts": {}, + "migrations": [] +} diff --git a/quixos.toolchain.json b/quixos.toolchain.json new file mode 100644 index 0000000..dd3c7fa --- /dev/null +++ b/quixos.toolchain.json @@ -0,0 +1,4 @@ +{ + "generatedBy": "qx-scaffold-v1", + "nixifyPluginUrl": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/yarn-plugin-nixify-patched/raw/commit/4528fdd20b30d869262443b3f044549810e75fb8/dist/yarn-plugin-nixify.js" +} diff --git a/src/browser-assets.d.ts b/src/browser-assets.d.ts new file mode 100644 index 0000000..1fe4587 --- /dev/null +++ b/src/browser-assets.d.ts @@ -0,0 +1,5 @@ +declare module "*?browser-source" { + const source: string; + export default source; +} +declare module "*.css"; diff --git a/src/gen/quixos.todo.ProjectReactComponent.react.ts b/src/gen/quixos.todo.ProjectReactComponent.react.ts new file mode 100644 index 0000000..80c90c3 --- /dev/null +++ b/src/gen/quixos.todo.ProjectReactComponent.react.ts @@ -0,0 +1,26 @@ +// @generated by camino-codegen-ts-runtime. Do not edit. +import { + createWebStudioComponent, + type ReactComponentHostProps, + type ObjectRef, +} from "@quixos/web-studio-react-runtime"; + +export type ProjectReactComponentRenderProps = { + "compact"?: boolean; +}; + +export type Empty = { + +}; + +export type ProjectComponentProps = { + forObject: ObjectRef<"atom:project">; +} & ProjectReactComponentRenderProps & ReactComponentHostProps>; + +export const ProjectComponent = createWebStudioComponent< + ObjectRef<"atom:project">, + ProjectReactComponentRenderProps, + Record +>({ + expectedAtomId: "atom:project", +}); diff --git a/src/gen/quixos.todo.TodoReactComponent.react.ts b/src/gen/quixos.todo.TodoReactComponent.react.ts new file mode 100644 index 0000000..316e3b2 --- /dev/null +++ b/src/gen/quixos.todo.TodoReactComponent.react.ts @@ -0,0 +1,29 @@ +// @generated by camino-codegen-ts-runtime. Do not edit. +import { + createWebStudioComponent, + type ReactComponentHostProps, + type ObjectRef, +} from "@quixos/web-studio-react-runtime"; + +export type TodoReactComponentRenderProps = { + "selected"?: boolean; + "compact"?: boolean; +}; + +export type TodoReactComponentAction = { + "type"?: TodoReactComponentActionType; +}; + +export type TodoReactComponentActionType = "TODO_REACT_COMPONENT_ACTION_TYPE_UNSPECIFIED" | "SELECT"; + +export type TodoComponentProps = { + forObject: ObjectRef<"atom:task">; +} & TodoReactComponentRenderProps & ReactComponentHostProps; + +export const TodoComponent = createWebStudioComponent< + ObjectRef<"atom:task">, + TodoReactComponentRenderProps, + TodoReactComponentAction +>({ + expectedAtomId: "atom:task", +}); diff --git a/src/gen/qx.ts b/src/gen/qx.ts new file mode 100644 index 0000000..787c972 --- /dev/null +++ b/src/gen/qx.ts @@ -0,0 +1,1186 @@ +// Generated by quixos-codegen-ts. Do not edit. Binding ABI version 1. +import { defineQxInterfaceContract, bindQxHandler, type QxObjectRef, type QxWatchHandle, type QxHandler, type QxDerived, type QxContextLifecycle, type QxConformer, type QxInterfaceContract, type QxLiveValue, type QxQueryDescriptor, type QxHandlerSpec, type QxMessages } from "@quixos/camino-package-runtime"; + +export const packageRevisionId = "package:project-react-runtime@1"; +declare const appliedType: unique symbol; +type QxApplied = string & {readonly [appliedType]: (value: [Definition, Arguments]) => [Definition, Arguments]}; +export type Contexts = { "createComponent": { "conform": QxConformer; "objectId": QxObjectRef<"atom:atom:project-react-component">; "input": QxObjectRef<"atom:atom:project">; "ports": { } } & QxContextLifecycle<{ "conform": QxConformer; "objectId": QxObjectRef<"atom:atom:project-react-component">; "input": QxObjectRef<"atom:atom:project">; "ports": { } } & {signal?: AbortSignal}>; "propsGet": { "conform": QxConformer; "objectId": QxObjectRef<"atom:atom:project-react-component">; "input": null; "ports": { "named": { "objectId": QxObjectRef<"interface:interface:named@1">; "live": { "name.get": () => Promise; "name.set": (input: string) => Promise }; "name.get": () => Promise; "name.set": (input: string) => Promise; "contract": QxInterfaceContract<{ "objectId": QxObjectRef<"interface:interface:named@1">; "live": { "name.get": () => Promise; "name.set": (input: string) => Promise }; "name.get": () => Promise; "name.set": (input: string) => Promise }> }; "tasks": { "objectId": QxObjectRef<"interface:interface:project-tasks@1">; "live": { "tasks.resolve": () => Promise; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tags.resolve": () => Promise; "tags.connect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "tags.disconnect": (input: QxObjectRef<"atom:atom:tag">) => Promise }; "tasks.resolve": () => Promise>>; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tags.resolve": () => Promise>>; "tags.connect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "tags.disconnect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "contract": QxInterfaceContract<{ "objectId": QxObjectRef<"interface:interface:project-tasks@1">; "live": { "tasks.resolve": () => Promise; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tags.resolve": () => Promise; "tags.connect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "tags.disconnect": (input: QxObjectRef<"atom:atom:tag">) => Promise }; "tasks.resolve": () => Promise>>; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tags.resolve": () => Promise>>; "tags.connect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "tags.disconnect": (input: QxObjectRef<"atom:atom:tag">) => Promise }> } } } & QxContextLifecycle<{ "conform": QxConformer; "objectId": QxObjectRef<"atom:atom:project-react-component">; "input": null; "ports": { "named": { "objectId": QxObjectRef<"interface:interface:named@1">; "live": { "name.get": () => Promise; "name.set": (input: string) => Promise }; "name.get": () => Promise; "name.set": (input: string) => Promise; "contract": QxInterfaceContract<{ "objectId": QxObjectRef<"interface:interface:named@1">; "live": { "name.get": () => Promise; "name.set": (input: string) => Promise }; "name.get": () => Promise; "name.set": (input: string) => Promise }> }; "tasks": { "objectId": QxObjectRef<"interface:interface:project-tasks@1">; "live": { "tasks.resolve": () => Promise; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tags.resolve": () => Promise; "tags.connect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "tags.disconnect": (input: QxObjectRef<"atom:atom:tag">) => Promise }; "tasks.resolve": () => Promise>>; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tags.resolve": () => Promise>>; "tags.connect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "tags.disconnect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "contract": QxInterfaceContract<{ "objectId": QxObjectRef<"interface:interface:project-tasks@1">; "live": { "tasks.resolve": () => Promise; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tags.resolve": () => Promise; "tags.connect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "tags.disconnect": (input: QxObjectRef<"atom:atom:tag">) => Promise }; "tasks.resolve": () => Promise>>; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tags.resolve": () => Promise>>; "tags.connect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "tags.disconnect": (input: QxObjectRef<"atom:atom:tag">) => Promise }> } } } & {signal?: AbortSignal}>; "propsWatch": { "conform": QxConformer; "objectId": QxObjectRef<"atom:atom:project-react-component">; "input": null; "ports": { "named": { "objectId": QxObjectRef<"interface:interface:named@1">; "live": { "name.get": () => Promise; "name.set": (input: string) => Promise }; "name.get": () => Promise; "name.set": (input: string) => Promise; "contract": QxInterfaceContract<{ "objectId": QxObjectRef<"interface:interface:named@1">; "live": { "name.get": () => Promise; "name.set": (input: string) => Promise }; "name.get": () => Promise; "name.set": (input: string) => Promise }> }; "tasks": { "objectId": QxObjectRef<"interface:interface:project-tasks@1">; "live": { "tasks.resolve": () => Promise; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tags.resolve": () => Promise; "tags.connect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "tags.disconnect": (input: QxObjectRef<"atom:atom:tag">) => Promise }; "tasks.resolve": () => Promise>>; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tags.resolve": () => Promise>>; "tags.connect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "tags.disconnect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "contract": QxInterfaceContract<{ "objectId": QxObjectRef<"interface:interface:project-tasks@1">; "live": { "tasks.resolve": () => Promise; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tags.resolve": () => Promise; "tags.connect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "tags.disconnect": (input: QxObjectRef<"atom:atom:tag">) => Promise }; "tasks.resolve": () => Promise>>; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tags.resolve": () => Promise>>; "tags.connect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "tags.disconnect": (input: QxObjectRef<"atom:atom:tag">) => Promise }> } } } & QxContextLifecycle<{ "conform": QxConformer; "objectId": QxObjectRef<"atom:atom:project-react-component">; "input": null; "ports": { "named": { "objectId": QxObjectRef<"interface:interface:named@1">; "live": { "name.get": () => Promise; "name.set": (input: string) => Promise }; "name.get": () => Promise; "name.set": (input: string) => Promise; "contract": QxInterfaceContract<{ "objectId": QxObjectRef<"interface:interface:named@1">; "live": { "name.get": () => Promise; "name.set": (input: string) => Promise }; "name.get": () => Promise; "name.set": (input: string) => Promise }> }; "tasks": { "objectId": QxObjectRef<"interface:interface:project-tasks@1">; "live": { "tasks.resolve": () => Promise; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tags.resolve": () => Promise; "tags.connect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "tags.disconnect": (input: QxObjectRef<"atom:atom:tag">) => Promise }; "tasks.resolve": () => Promise>>; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tags.resolve": () => Promise>>; "tags.connect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "tags.disconnect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "contract": QxInterfaceContract<{ "objectId": QxObjectRef<"interface:interface:project-tasks@1">; "live": { "tasks.resolve": () => Promise; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tags.resolve": () => Promise; "tags.connect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "tags.disconnect": (input: QxObjectRef<"atom:atom:tag">) => Promise }; "tasks.resolve": () => Promise>>; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tags.resolve": () => Promise>>; "tags.connect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "tags.disconnect": (input: QxObjectRef<"atom:atom:tag">) => Promise }> } } } & {signal?: AbortSignal}>; "propsWatchStop": { "conform": QxConformer; "objectId": QxObjectRef<"atom:atom:project-react-component">; "input": QxWatchHandle; "ports": { } } & QxContextLifecycle<{ "conform": QxConformer; "objectId": QxObjectRef<"atom:atom:project-react-component">; "input": QxWatchHandle; "ports": { } } & {signal?: AbortSignal}>; "sourceGet": { "conform": QxConformer; "objectId": QxObjectRef<"atom:atom:project-react-component">; "input": null; "ports": { } } & QxContextLifecycle<{ "conform": QxConformer; "objectId": QxObjectRef<"atom:atom:project-react-component">; "input": null; "ports": { } } & {signal?: AbortSignal}> }; +export type Results = { "createComponent": QxObjectRef<"atom:atom:project-react-component">; "propsGet": { "named": QxObjectRef<"interface:interface:named@1">; "tasks": QxObjectRef<"interface:interface:project-tasks@1"> }; "propsWatch": { "named": QxObjectRef<"interface:interface:named@1">; "tasks": QxObjectRef<"interface:interface:project-tasks@1"> }; "propsWatchStop": null; "sourceGet": string }; +export type Implementation = { "createComponent": QxHandler>; "propsGet": QxHandler; "tasks": QxObjectRef<"interface:interface:project-tasks@1"> }> | QxDerived; "tasks": QxObjectRef<"interface:interface:project-tasks@1"> }>; "propsWatch": QxDerived; "tasks": QxObjectRef<"interface:interface:project-tasks@1"> }>; "propsWatchStop": QxHandler; "sourceGet": QxHandler | QxDerived }; +export type QueryVariables = { "Tasks": { "first": number; "after": (string | null); "statuses": Array }; "TaggedTasks": { "first": number; "after": (string | null); "statuses": Array; "tags": Array> }; "UntaggedTasks": { "first": number; "after": (string | null); "statuses": Array }; "Catalog": { }; "Summary": { } }; +export type QueryResults = { "Tasks": { "root": { "tasks": { "entries": Array<{ "key": string; "node": { "_qx": { "ref": QxObjectRef<"interface:interface:task-data@1">; "relations": { "completions": { "aggregate": { "count": bigint; "max": { "completedAt": (number | null) } } } } }; "title": string; "status": string; "priority": string; "dueDate": string; "repeatDays": number; "estimatedHours": number; "tags": { "entries": Array<{ "node": { "_qx": { "ref": QxObjectRef<"interface:interface:tag-data@1"> }; "name": string; "color": string } }> } } }>; "pageInfo": { "hasNextPage": boolean; "endCursor": (string | null) } } } }; "TaggedTasks": { "root": { "tasks": { "entries": Array<{ "key": string; "node": { "_qx": { "ref": QxObjectRef<"interface:interface:task-data@1">; "relations": { "completions": { "aggregate": { "count": bigint; "max": { "completedAt": (number | null) } } } } }; "title": string; "status": string; "priority": string; "dueDate": string; "repeatDays": number; "estimatedHours": number; "tags": { "entries": Array<{ "node": { "_qx": { "ref": QxObjectRef<"interface:interface:tag-data@1"> }; "name": string; "color": string } }> } } }>; "pageInfo": { "hasNextPage": boolean; "endCursor": (string | null) } } } }; "UntaggedTasks": { "root": { "tasks": { "entries": Array<{ "key": string; "node": { "_qx": { "ref": QxObjectRef<"interface:interface:task-data@1">; "relations": { "completions": { "aggregate": { "count": bigint; "max": { "completedAt": (number | null) } } } } }; "title": string; "status": string; "priority": string; "dueDate": string; "repeatDays": number; "estimatedHours": number; "tags": { "entries": Array<{ "node": { "_qx": { "ref": QxObjectRef<"interface:interface:tag-data@1"> }; "name": string; "color": string } }> } } }>; "pageInfo": { "hasNextPage": boolean; "endCursor": (string | null) } } } }; "Catalog": { "root": { "tags": { "entries": Array<{ "node": { "_qx": { "ref": QxObjectRef<"interface:interface:tag-data@1"> }; "name": string; "color": string } }> } } }; "Summary": { "root": { "_qx": { "relations": { "tasks": { "aggregate": { "count": bigint; "sum": { "estimatedHours": (number | null) } }; "groups": { "entries": Array<{ "group": { "status": string }; "aggregate": { "count": bigint; "sum": { "estimatedHours": (number | null) } } }> }; "filter": { "expand": { "tags": { "groups": { "entries": Array<{ "group": { "target": { "_qx": { "ref": QxObjectRef<"interface:interface:tag-data@1"> }; "name": string; "color": string } }; "aggregate": { "count": bigint; "sum": { "source": { "estimatedHours": (number | null) } } } }> } } } } } } } } } }; +export const queries: { "Tasks": QxQueryDescriptor; "TaggedTasks": QxQueryDescriptor; "UntaggedTasks": QxQueryDescriptor; "Catalog": QxQueryDescriptor; "Summary": QxQueryDescriptor } = { + "Tasks": { + "id": "package:project-react-runtime@1:query:Tasks", + "definitionDigest": "90fb955b4306497b7e779b659b52982cca7d5e5e9a640170b22b8b88beb55071", + "rootInterfaceRevisionId": "interface:project-tasks@1", + "variables": { + "kind": "record", + "fields": { + "first": { + "kind": "scalar", + "name": "int32" + }, + "after": { + "kind": "optional", + "value": { + "kind": "scalar", + "name": "string" + } + }, + "statuses": { + "kind": "list", + "value": { + "kind": "scalar", + "name": "string" + } + } + } + }, + "output": { + "kind": "record", + "fields": { + "root": { + "kind": "record", + "fields": { + "tasks": { + "kind": "record", + "fields": { + "entries": { + "kind": "list", + "value": { + "kind": "record", + "fields": { + "key": { + "kind": "scalar", + "name": "string" + }, + "node": { + "kind": "record", + "fields": { + "_qx": { + "kind": "record", + "fields": { + "ref": { + "kind": "object-ref", + "expectation": { + "kind": "interface", + "interfaceRevisionId": "interface:task-data@1" + } + }, + "relations": { + "kind": "record", + "fields": { + "completions": { + "kind": "record", + "fields": { + "aggregate": { + "kind": "record", + "fields": { + "count": { + "kind": "scalar", + "name": "uint64" + }, + "max": { + "kind": "record", + "fields": { + "completedAt": { + "kind": "optional", + "value": { + "kind": "scalar", + "name": "double" + } + } + } + } + } + } + } + } + } + } + } + }, + "title": { + "kind": "scalar", + "name": "string" + }, + "status": { + "kind": "scalar", + "name": "string" + }, + "priority": { + "kind": "scalar", + "name": "string" + }, + "dueDate": { + "kind": "scalar", + "name": "string" + }, + "repeatDays": { + "kind": "scalar", + "name": "int32" + }, + "estimatedHours": { + "kind": "scalar", + "name": "double" + }, + "tags": { + "kind": "record", + "fields": { + "entries": { + "kind": "list", + "value": { + "kind": "record", + "fields": { + "node": { + "kind": "record", + "fields": { + "_qx": { + "kind": "record", + "fields": { + "ref": { + "kind": "object-ref", + "expectation": { + "kind": "interface", + "interfaceRevisionId": "interface:tag-data@1" + } + } + } + }, + "name": { + "kind": "scalar", + "name": "string" + }, + "color": { + "kind": "scalar", + "name": "string" + } + } + } + } + } + } + } + } + } + } + } + } + }, + "pageInfo": { + "kind": "record", + "fields": { + "hasNextPage": { + "kind": "scalar", + "name": "bool" + }, + "endCursor": { + "kind": "optional", + "value": { + "kind": "scalar", + "name": "string" + } + } + } + } + } + } + } + } + } + }, + "watch": true + }, + "TaggedTasks": { + "id": "package:project-react-runtime@1:query:TaggedTasks", + "definitionDigest": "040521ef951ed94ddd7b74d2cc05bed6eec0095f30dcf5930a1e59585068abcd", + "rootInterfaceRevisionId": "interface:project-tasks@1", + "variables": { + "kind": "record", + "fields": { + "first": { + "kind": "scalar", + "name": "int32" + }, + "after": { + "kind": "optional", + "value": { + "kind": "scalar", + "name": "string" + } + }, + "statuses": { + "kind": "list", + "value": { + "kind": "scalar", + "name": "string" + } + }, + "tags": { + "kind": "list", + "value": { + "kind": "object-ref", + "expectation": { + "kind": "interface", + "interfaceRevisionId": "interface:tag-data@1" + } + } + } + } + }, + "output": { + "kind": "record", + "fields": { + "root": { + "kind": "record", + "fields": { + "tasks": { + "kind": "record", + "fields": { + "entries": { + "kind": "list", + "value": { + "kind": "record", + "fields": { + "key": { + "kind": "scalar", + "name": "string" + }, + "node": { + "kind": "record", + "fields": { + "_qx": { + "kind": "record", + "fields": { + "ref": { + "kind": "object-ref", + "expectation": { + "kind": "interface", + "interfaceRevisionId": "interface:task-data@1" + } + }, + "relations": { + "kind": "record", + "fields": { + "completions": { + "kind": "record", + "fields": { + "aggregate": { + "kind": "record", + "fields": { + "count": { + "kind": "scalar", + "name": "uint64" + }, + "max": { + "kind": "record", + "fields": { + "completedAt": { + "kind": "optional", + "value": { + "kind": "scalar", + "name": "double" + } + } + } + } + } + } + } + } + } + } + } + }, + "title": { + "kind": "scalar", + "name": "string" + }, + "status": { + "kind": "scalar", + "name": "string" + }, + "priority": { + "kind": "scalar", + "name": "string" + }, + "dueDate": { + "kind": "scalar", + "name": "string" + }, + "repeatDays": { + "kind": "scalar", + "name": "int32" + }, + "estimatedHours": { + "kind": "scalar", + "name": "double" + }, + "tags": { + "kind": "record", + "fields": { + "entries": { + "kind": "list", + "value": { + "kind": "record", + "fields": { + "node": { + "kind": "record", + "fields": { + "_qx": { + "kind": "record", + "fields": { + "ref": { + "kind": "object-ref", + "expectation": { + "kind": "interface", + "interfaceRevisionId": "interface:tag-data@1" + } + } + } + }, + "name": { + "kind": "scalar", + "name": "string" + }, + "color": { + "kind": "scalar", + "name": "string" + } + } + } + } + } + } + } + } + } + } + } + } + }, + "pageInfo": { + "kind": "record", + "fields": { + "hasNextPage": { + "kind": "scalar", + "name": "bool" + }, + "endCursor": { + "kind": "optional", + "value": { + "kind": "scalar", + "name": "string" + } + } + } + } + } + } + } + } + } + }, + "watch": true + }, + "UntaggedTasks": { + "id": "package:project-react-runtime@1:query:UntaggedTasks", + "definitionDigest": "e4efe0274b9cb1cd2ea1b32c986f71a8637fa2fb62f9a3c062cd8f08a391ff22", + "rootInterfaceRevisionId": "interface:project-tasks@1", + "variables": { + "kind": "record", + "fields": { + "first": { + "kind": "scalar", + "name": "int32" + }, + "after": { + "kind": "optional", + "value": { + "kind": "scalar", + "name": "string" + } + }, + "statuses": { + "kind": "list", + "value": { + "kind": "scalar", + "name": "string" + } + } + } + }, + "output": { + "kind": "record", + "fields": { + "root": { + "kind": "record", + "fields": { + "tasks": { + "kind": "record", + "fields": { + "entries": { + "kind": "list", + "value": { + "kind": "record", + "fields": { + "key": { + "kind": "scalar", + "name": "string" + }, + "node": { + "kind": "record", + "fields": { + "_qx": { + "kind": "record", + "fields": { + "ref": { + "kind": "object-ref", + "expectation": { + "kind": "interface", + "interfaceRevisionId": "interface:task-data@1" + } + }, + "relations": { + "kind": "record", + "fields": { + "completions": { + "kind": "record", + "fields": { + "aggregate": { + "kind": "record", + "fields": { + "count": { + "kind": "scalar", + "name": "uint64" + }, + "max": { + "kind": "record", + "fields": { + "completedAt": { + "kind": "optional", + "value": { + "kind": "scalar", + "name": "double" + } + } + } + } + } + } + } + } + } + } + } + }, + "title": { + "kind": "scalar", + "name": "string" + }, + "status": { + "kind": "scalar", + "name": "string" + }, + "priority": { + "kind": "scalar", + "name": "string" + }, + "dueDate": { + "kind": "scalar", + "name": "string" + }, + "repeatDays": { + "kind": "scalar", + "name": "int32" + }, + "estimatedHours": { + "kind": "scalar", + "name": "double" + }, + "tags": { + "kind": "record", + "fields": { + "entries": { + "kind": "list", + "value": { + "kind": "record", + "fields": { + "node": { + "kind": "record", + "fields": { + "_qx": { + "kind": "record", + "fields": { + "ref": { + "kind": "object-ref", + "expectation": { + "kind": "interface", + "interfaceRevisionId": "interface:tag-data@1" + } + } + } + }, + "name": { + "kind": "scalar", + "name": "string" + }, + "color": { + "kind": "scalar", + "name": "string" + } + } + } + } + } + } + } + } + } + } + } + } + }, + "pageInfo": { + "kind": "record", + "fields": { + "hasNextPage": { + "kind": "scalar", + "name": "bool" + }, + "endCursor": { + "kind": "optional", + "value": { + "kind": "scalar", + "name": "string" + } + } + } + } + } + } + } + } + } + }, + "watch": true + }, + "Catalog": { + "id": "package:project-react-runtime@1:query:Catalog", + "definitionDigest": "2f195bd0b0fee57cd8e63a054ac7e7049d4eca665b8fbe71e2ef67e50f4be7f8", + "rootInterfaceRevisionId": "interface:project-tasks@1", + "variables": { + "kind": "record", + "fields": {} + }, + "output": { + "kind": "record", + "fields": { + "root": { + "kind": "record", + "fields": { + "tags": { + "kind": "record", + "fields": { + "entries": { + "kind": "list", + "value": { + "kind": "record", + "fields": { + "node": { + "kind": "record", + "fields": { + "_qx": { + "kind": "record", + "fields": { + "ref": { + "kind": "object-ref", + "expectation": { + "kind": "interface", + "interfaceRevisionId": "interface:tag-data@1" + } + } + } + }, + "name": { + "kind": "scalar", + "name": "string" + }, + "color": { + "kind": "scalar", + "name": "string" + } + } + } + } + } + } + } + } + } + } + } + }, + "watch": true + }, + "Summary": { + "id": "package:project-react-runtime@1:query:Summary", + "definitionDigest": "7770ff6b96489b228f7b1cbe0eee77cde67f70ed9004d19f920d6ec58889e361", + "rootInterfaceRevisionId": "interface:project-tasks@1", + "variables": { + "kind": "record", + "fields": {} + }, + "output": { + "kind": "record", + "fields": { + "root": { + "kind": "record", + "fields": { + "_qx": { + "kind": "record", + "fields": { + "relations": { + "kind": "record", + "fields": { + "tasks": { + "kind": "record", + "fields": { + "aggregate": { + "kind": "record", + "fields": { + "count": { + "kind": "scalar", + "name": "uint64" + }, + "sum": { + "kind": "record", + "fields": { + "estimatedHours": { + "kind": "optional", + "value": { + "kind": "scalar", + "name": "double" + } + } + } + } + } + }, + "groups": { + "kind": "record", + "fields": { + "entries": { + "kind": "list", + "value": { + "kind": "record", + "fields": { + "group": { + "kind": "record", + "fields": { + "status": { + "kind": "scalar", + "name": "string" + } + } + }, + "aggregate": { + "kind": "record", + "fields": { + "count": { + "kind": "scalar", + "name": "uint64" + }, + "sum": { + "kind": "record", + "fields": { + "estimatedHours": { + "kind": "optional", + "value": { + "kind": "scalar", + "name": "double" + } + } + } + } + } + } + } + } + } + } + }, + "filter": { + "kind": "record", + "fields": { + "expand": { + "kind": "record", + "fields": { + "tags": { + "kind": "record", + "fields": { + "groups": { + "kind": "record", + "fields": { + "entries": { + "kind": "list", + "value": { + "kind": "record", + "fields": { + "group": { + "kind": "record", + "fields": { + "target": { + "kind": "record", + "fields": { + "_qx": { + "kind": "record", + "fields": { + "ref": { + "kind": "object-ref", + "expectation": { + "kind": "interface", + "interfaceRevisionId": "interface:tag-data@1" + } + } + } + }, + "name": { + "kind": "scalar", + "name": "string" + }, + "color": { + "kind": "scalar", + "name": "string" + } + } + } + } + }, + "aggregate": { + "kind": "record", + "fields": { + "count": { + "kind": "scalar", + "name": "uint64" + }, + "sum": { + "kind": "record", + "fields": { + "source": { + "kind": "record", + "fields": { + "estimatedHours": { + "kind": "optional", + "value": { + "kind": "scalar", + "name": "double" + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "watch": true + } +} as const; +export const contracts = {"interface:named@1": defineQxInterfaceContract<{ "objectId": QxObjectRef<"interface:interface:named@1">; "live": { "name.get": () => Promise; "name.set": (input: string) => Promise }; "name.get": () => Promise; "name.set": (input: string) => Promise; "contract": QxInterfaceContract<{ "objectId": QxObjectRef<"interface:interface:named@1">; "live": { "name.get": () => Promise; "name.set": (input: string) => Promise }; "name.get": () => Promise; "name.set": (input: string) => Promise }> }>("interface:named@1", {"name.get":{"id":"operation:named:name:get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"}},"name.set":{"id":"operation:named:name:set","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"builtin","name":"unit"}}}), +"interface:project-tasks@1": defineQxInterfaceContract<{ "objectId": QxObjectRef<"interface:interface:project-tasks@1">; "live": { "tasks.resolve": () => Promise; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tags.resolve": () => Promise; "tags.connect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "tags.disconnect": (input: QxObjectRef<"atom:atom:tag">) => Promise }; "tasks.resolve": () => Promise>>; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tags.resolve": () => Promise>>; "tags.connect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "tags.disconnect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "contract": QxInterfaceContract<{ "objectId": QxObjectRef<"interface:interface:project-tasks@1">; "live": { "tasks.resolve": () => Promise; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tags.resolve": () => Promise; "tags.connect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "tags.disconnect": (input: QxObjectRef<"atom:atom:tag">) => Promise }; "tasks.resolve": () => Promise>>; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise; "tags.resolve": () => Promise>>; "tags.connect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "tags.disconnect": (input: QxObjectRef<"atom:atom:tag">) => Promise }> }>("interface:project-tasks@1", {"tasks.resolve":{"id":"operation:project-tasks:tasks:resolve","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"list","value":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:task"}}}},"tasks.connect":{"id":"operation:project-tasks:tasks:connect","inputType":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:task"}},"outputType":{"kind":"builtin","name":"unit"}},"tasks.disconnect":{"id":"operation:project-tasks:tasks:disconnect","inputType":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:task"}},"outputType":{"kind":"builtin","name":"unit"}},"tags.resolve":{"id":"tags:resolve","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"list","value":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:tag"}}}},"tags.connect":{"id":"tags:connect","inputType":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:tag"}},"outputType":{"kind":"builtin","name":"unit"}},"tags.disconnect":{"id":"tags:disconnect","inputType":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:tag"}},"outputType":{"kind":"builtin","name":"unit"}}}), +"interface:tag-data@1": defineQxInterfaceContract<{ "objectId": QxObjectRef<"interface:interface:tag-data@1">; "live": { "name.get": () => Promise; "name.set": (input: string) => Promise; "color.get": () => Promise; "color.set": (input: string) => Promise }; "name.get": () => Promise; "name.set": (input: string) => Promise; "color.get": () => Promise; "color.set": (input: string) => Promise; "contract": QxInterfaceContract<{ "objectId": QxObjectRef<"interface:interface:tag-data@1">; "live": { "name.get": () => Promise; "name.set": (input: string) => Promise; "color.get": () => Promise; "color.set": (input: string) => Promise }; "name.get": () => Promise; "name.set": (input: string) => Promise; "color.get": () => Promise; "color.set": (input: string) => Promise }> }>("interface:tag-data@1", {"name.get":{"id":"name:get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"}},"name.set":{"id":"name:set","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"builtin","name":"unit"}},"color.get":{"id":"color:get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"}},"color.set":{"id":"color:set","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"builtin","name":"unit"}}}), +"interface:completion-data@1": defineQxInterfaceContract<{ "objectId": QxObjectRef<"interface:interface:completion-data@1">; "live": { "completedAt.get": () => Promise; "completedAt.set": (input: number) => Promise; "scheduledDate.get": () => Promise; "scheduledDate.set": (input: string) => Promise }; "completedAt.get": () => Promise; "completedAt.set": (input: number) => Promise; "scheduledDate.get": () => Promise; "scheduledDate.set": (input: string) => Promise; "contract": QxInterfaceContract<{ "objectId": QxObjectRef<"interface:interface:completion-data@1">; "live": { "completedAt.get": () => Promise; "completedAt.set": (input: number) => Promise; "scheduledDate.get": () => Promise; "scheduledDate.set": (input: string) => Promise }; "completedAt.get": () => Promise; "completedAt.set": (input: number) => Promise; "scheduledDate.get": () => Promise; "scheduledDate.set": (input: string) => Promise }> }>("interface:completion-data@1", {"completedAt.get":{"id":"completedAt:get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"double"}},"completedAt.set":{"id":"completedAt:set","inputType":{"kind":"scalar","name":"double"},"outputType":{"kind":"builtin","name":"unit"}},"scheduledDate.get":{"id":"scheduledDate:get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"}},"scheduledDate.set":{"id":"scheduledDate:set","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"builtin","name":"unit"}}}), +"interface:task-data@1": defineQxInterfaceContract<{ "objectId": QxObjectRef<"interface:interface:task-data@1">; "live": { "title.get": () => Promise; "title.set": (input: string) => Promise; "status.get": () => Promise; "status.set": (input: string) => Promise; "priority.get": () => Promise; "priority.set": (input: string) => Promise; "notes.get": () => Promise; "notes.set": (input: string) => Promise; "dueDate.get": () => Promise; "dueDate.set": (input: string) => Promise; "energy.get": () => Promise; "energy.set": (input: string) => Promise; "estimatedHours.get": () => Promise; "estimatedHours.set": (input: number) => Promise; "repeatDays.get": () => Promise; "repeatDays.set": (input: number) => Promise; "tags.resolve": () => Promise; "tags.connect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "tags.disconnect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "completions.resolve": () => Promise; "completions.connect": (input: QxObjectRef<"atom:atom:completion">) => Promise; "completions.disconnect": (input: QxObjectRef<"atom:atom:completion">) => Promise }; "title.get": () => Promise; "title.set": (input: string) => Promise; "status.get": () => Promise; "status.set": (input: string) => Promise; "priority.get": () => Promise; "priority.set": (input: string) => Promise; "notes.get": () => Promise; "notes.set": (input: string) => Promise; "dueDate.get": () => Promise; "dueDate.set": (input: string) => Promise; "energy.get": () => Promise; "energy.set": (input: string) => Promise; "estimatedHours.get": () => Promise; "estimatedHours.set": (input: number) => Promise; "repeatDays.get": () => Promise; "repeatDays.set": (input: number) => Promise; "tags.resolve": () => Promise>>; "tags.connect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "tags.disconnect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "completions.resolve": () => Promise>>; "completions.connect": (input: QxObjectRef<"atom:atom:completion">) => Promise; "completions.disconnect": (input: QxObjectRef<"atom:atom:completion">) => Promise; "contract": QxInterfaceContract<{ "objectId": QxObjectRef<"interface:interface:task-data@1">; "live": { "title.get": () => Promise; "title.set": (input: string) => Promise; "status.get": () => Promise; "status.set": (input: string) => Promise; "priority.get": () => Promise; "priority.set": (input: string) => Promise; "notes.get": () => Promise; "notes.set": (input: string) => Promise; "dueDate.get": () => Promise; "dueDate.set": (input: string) => Promise; "energy.get": () => Promise; "energy.set": (input: string) => Promise; "estimatedHours.get": () => Promise; "estimatedHours.set": (input: number) => Promise; "repeatDays.get": () => Promise; "repeatDays.set": (input: number) => Promise; "tags.resolve": () => Promise; "tags.connect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "tags.disconnect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "completions.resolve": () => Promise; "completions.connect": (input: QxObjectRef<"atom:atom:completion">) => Promise; "completions.disconnect": (input: QxObjectRef<"atom:atom:completion">) => Promise }; "title.get": () => Promise; "title.set": (input: string) => Promise; "status.get": () => Promise; "status.set": (input: string) => Promise; "priority.get": () => Promise; "priority.set": (input: string) => Promise; "notes.get": () => Promise; "notes.set": (input: string) => Promise; "dueDate.get": () => Promise; "dueDate.set": (input: string) => Promise; "energy.get": () => Promise; "energy.set": (input: string) => Promise; "estimatedHours.get": () => Promise; "estimatedHours.set": (input: number) => Promise; "repeatDays.get": () => Promise; "repeatDays.set": (input: number) => Promise; "tags.resolve": () => Promise>>; "tags.connect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "tags.disconnect": (input: QxObjectRef<"atom:atom:tag">) => Promise; "completions.resolve": () => Promise>>; "completions.connect": (input: QxObjectRef<"atom:atom:completion">) => Promise; "completions.disconnect": (input: QxObjectRef<"atom:atom:completion">) => Promise }> }>("interface:task-data@1", {"title.get":{"id":"operation:task-data:title:get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"}},"title.set":{"id":"operation:task-data:title:set","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"builtin","name":"unit"}},"status.get":{"id":"operation:task-data:status:get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"}},"status.set":{"id":"operation:task-data:status:set","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"builtin","name":"unit"}},"priority.get":{"id":"operation:task-data:priority:get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"}},"priority.set":{"id":"operation:task-data:priority:set","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"builtin","name":"unit"}},"notes.get":{"id":"operation:task-data:notes:get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"}},"notes.set":{"id":"operation:task-data:notes:set","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"builtin","name":"unit"}},"dueDate.get":{"id":"operation:task-data:due-date:get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"}},"dueDate.set":{"id":"operation:task-data:due-date:set","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"builtin","name":"unit"}},"energy.get":{"id":"operation:task-data:energy:get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"}},"energy.set":{"id":"operation:task-data:energy:set","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"builtin","name":"unit"}},"estimatedHours.get":{"id":"estimatedHours:get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"double"}},"estimatedHours.set":{"id":"estimatedHours:set","inputType":{"kind":"scalar","name":"double"},"outputType":{"kind":"builtin","name":"unit"}},"repeatDays.get":{"id":"repeatDays:get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"int32"}},"repeatDays.set":{"id":"repeatDays:set","inputType":{"kind":"scalar","name":"int32"},"outputType":{"kind":"builtin","name":"unit"}},"tags.resolve":{"id":"tags:resolve","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"list","value":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:tag"}}}},"tags.connect":{"id":"tags:connect","inputType":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:tag"}},"outputType":{"kind":"builtin","name":"unit"}},"tags.disconnect":{"id":"tags:disconnect","inputType":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:tag"}},"outputType":{"kind":"builtin","name":"unit"}},"completions.resolve":{"id":"completions:resolve","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"list","value":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:completion"}}}},"completions.connect":{"id":"completions:connect","inputType":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:completion"}},"outputType":{"kind":"builtin","name":"unit"}},"completions.disconnect":{"id":"completions:disconnect","inputType":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:completion"}},"outputType":{"kind":"builtin","name":"unit"}}}), +"interface:task-actions@1": defineQxInterfaceContract<{ "objectId": QxObjectRef<"interface:interface:task-actions@1">; "live": { "complete.call": () => Promise; "reopen.call": () => Promise; "archive.call": () => Promise }; "complete.call": () => Promise; "reopen.call": () => Promise; "archive.call": () => Promise; "contract": QxInterfaceContract<{ "objectId": QxObjectRef<"interface:interface:task-actions@1">; "live": { "complete.call": () => Promise; "reopen.call": () => Promise; "archive.call": () => Promise }; "complete.call": () => Promise; "reopen.call": () => Promise; "archive.call": () => Promise }> }>("interface:task-actions@1", {"complete.call":{"id":"operation:task-actions:complete","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"}},"reopen.call":{"id":"operation:task-actions:reopen","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"}},"archive.call":{"id":"operation:task-actions:archive","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"}}}), +"interface:project-actions@1": defineQxInterfaceContract<{ "objectId": QxObjectRef<"interface:interface:project-actions@1">; "live": { "addTask.call": (input: string) => Promise; "addTag.call": (input: string) => Promise }; "addTask.call": (input: string) => Promise>; "addTag.call": (input: string) => Promise>; "contract": QxInterfaceContract<{ "objectId": QxObjectRef<"interface:interface:project-actions@1">; "live": { "addTask.call": (input: string) => Promise; "addTag.call": (input: string) => Promise }; "addTask.call": (input: string) => Promise>; "addTag.call": (input: string) => Promise> }> }>("interface:project-actions@1", {"addTask.call":{"id":"operation:project-actions:add-task","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:task"}}},"addTag.call":{"id":"add-tag:call","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:tag"}}}})}; +export const interfaces = {"Named": contracts["interface:named@1"], +"ProjectTasks": contracts["interface:project-tasks@1"], +"TagData": contracts["interface:tag-data@1"], +"CompletionData": contracts["interface:completion-data@1"], +"TaskData": contracts["interface:task-data@1"], +"TaskActions": contracts["interface:task-actions@1"], +"ProjectActions": contracts["interface:project-actions@1"]}; +const messages = { } satisfies QxMessages; +const specs = { + "createComponent": { + "inputType": { + "kind": "object-ref", + "expectation": { + "kind": "atom", + "atomId": "atom:project" + } + }, + "outputType": { + "kind": "object-ref", + "expectation": { + "kind": "atom", + "atomId": "atom:project-react-component" + } + }, + "ports": {} + }, + "propsGet": { + "inputType": { + "kind": "builtin", + "name": "unit" + }, + "outputType": { + "kind": "record", + "fields": { + "named": { + "kind": "object-ref", + "expectation": { + "kind": "interface", + "interfaceRevisionId": "interface:named@1" + } + }, + "tasks": { + "kind": "object-ref", + "expectation": { + "kind": "interface", + "interfaceRevisionId": "interface:project-tasks@1" + } + } + } + }, + "ports": { + "named": { + "kind": "interface", + "id": "port:project-react:named", + "interfaceRevisionId": "interface:named@1", + "operations": { + "name.get": { + "id": "operation:named:name:get", + "inputType": { + "kind": "builtin", + "name": "unit" + }, + "outputType": { + "kind": "scalar", + "name": "string" + } + }, + "name.set": { + "id": "operation:named:name:set", + "inputType": { + "kind": "scalar", + "name": "string" + }, + "outputType": { + "kind": "builtin", + "name": "unit" + } + } + } + }, + "tasks": { + "kind": "interface", + "id": "port:project-react:tasks", + "interfaceRevisionId": "interface:project-tasks@1", + "operations": { + "tasks.resolve": { + "id": "operation:project-tasks:tasks:resolve", + "inputType": { + "kind": "builtin", + "name": "unit" + }, + "outputType": { + "kind": "list", + "value": { + "kind": "object-ref", + "expectation": { + "kind": "atom", + "atomId": "atom:task" + } + } + } + }, + "tasks.connect": { + "id": "operation:project-tasks:tasks:connect", + "inputType": { + "kind": "object-ref", + "expectation": { + "kind": "atom", + "atomId": "atom:task" + } + }, + "outputType": { + "kind": "builtin", + "name": "unit" + } + }, + "tasks.disconnect": { + "id": "operation:project-tasks:tasks:disconnect", + "inputType": { + "kind": "object-ref", + "expectation": { + "kind": "atom", + "atomId": "atom:task" + } + }, + "outputType": { + "kind": "builtin", + "name": "unit" + } + }, + "tags.resolve": { + "id": "tags:resolve", + "inputType": { + "kind": "builtin", + "name": "unit" + }, + "outputType": { + "kind": "list", + "value": { + "kind": "object-ref", + "expectation": { + "kind": "atom", + "atomId": "atom:tag" + } + } + } + }, + "tags.connect": { + "id": "tags:connect", + "inputType": { + "kind": "object-ref", + "expectation": { + "kind": "atom", + "atomId": "atom:tag" + } + }, + "outputType": { + "kind": "builtin", + "name": "unit" + } + }, + "tags.disconnect": { + "id": "tags:disconnect", + "inputType": { + "kind": "object-ref", + "expectation": { + "kind": "atom", + "atomId": "atom:tag" + } + }, + "outputType": { + "kind": "builtin", + "name": "unit" + } + } + } + } + } + }, + "propsWatch": { + "inputType": { + "kind": "builtin", + "name": "unit" + }, + "outputType": { + "kind": "builtin", + "name": "watch-handle" + }, + "eventType": { + "kind": "record", + "fields": { + "named": { + "kind": "object-ref", + "expectation": { + "kind": "interface", + "interfaceRevisionId": "interface:named@1" + } + }, + "tasks": { + "kind": "object-ref", + "expectation": { + "kind": "interface", + "interfaceRevisionId": "interface:project-tasks@1" + } + } + } + }, + "ports": { + "named": { + "kind": "interface", + "id": "port:project-react:named", + "interfaceRevisionId": "interface:named@1", + "operations": { + "name.get": { + "id": "operation:named:name:get", + "inputType": { + "kind": "builtin", + "name": "unit" + }, + "outputType": { + "kind": "scalar", + "name": "string" + } + }, + "name.set": { + "id": "operation:named:name:set", + "inputType": { + "kind": "scalar", + "name": "string" + }, + "outputType": { + "kind": "builtin", + "name": "unit" + } + } + } + }, + "tasks": { + "kind": "interface", + "id": "port:project-react:tasks", + "interfaceRevisionId": "interface:project-tasks@1", + "operations": { + "tasks.resolve": { + "id": "operation:project-tasks:tasks:resolve", + "inputType": { + "kind": "builtin", + "name": "unit" + }, + "outputType": { + "kind": "list", + "value": { + "kind": "object-ref", + "expectation": { + "kind": "atom", + "atomId": "atom:task" + } + } + } + }, + "tasks.connect": { + "id": "operation:project-tasks:tasks:connect", + "inputType": { + "kind": "object-ref", + "expectation": { + "kind": "atom", + "atomId": "atom:task" + } + }, + "outputType": { + "kind": "builtin", + "name": "unit" + } + }, + "tasks.disconnect": { + "id": "operation:project-tasks:tasks:disconnect", + "inputType": { + "kind": "object-ref", + "expectation": { + "kind": "atom", + "atomId": "atom:task" + } + }, + "outputType": { + "kind": "builtin", + "name": "unit" + } + }, + "tags.resolve": { + "id": "tags:resolve", + "inputType": { + "kind": "builtin", + "name": "unit" + }, + "outputType": { + "kind": "list", + "value": { + "kind": "object-ref", + "expectation": { + "kind": "atom", + "atomId": "atom:tag" + } + } + } + }, + "tags.connect": { + "id": "tags:connect", + "inputType": { + "kind": "object-ref", + "expectation": { + "kind": "atom", + "atomId": "atom:tag" + } + }, + "outputType": { + "kind": "builtin", + "name": "unit" + } + }, + "tags.disconnect": { + "id": "tags:disconnect", + "inputType": { + "kind": "object-ref", + "expectation": { + "kind": "atom", + "atomId": "atom:tag" + } + }, + "outputType": { + "kind": "builtin", + "name": "unit" + } + } + } + } + } + }, + "propsWatchStop": { + "inputType": { + "kind": "builtin", + "name": "watch-handle" + }, + "outputType": { + "kind": "builtin", + "name": "unit" + }, + "ports": {} + }, + "sourceGet": { + "inputType": { + "kind": "builtin", + "name": "unit" + }, + "outputType": { + "kind": "scalar", + "name": "string" + }, + "ports": {} + } +} satisfies Record; +export const createRuntime = (implementation: Implementation) => ({ + packageRevisionId, + exports: { + "export:project-react-runtime:create-component": bindQxHandler(specs["createComponent"], implementation["createComponent"], messages), + "export:project-react-runtime:props-get": bindQxHandler(specs["propsGet"], implementation["propsGet"], messages), + "export:project-react-runtime:props-watch": bindQxHandler(specs["propsWatch"], implementation["propsWatch"], messages), + "export:project-react-runtime:props-watch-stop": bindQxHandler(specs["propsWatchStop"], implementation["propsWatchStop"], messages), + "export:project-react-runtime:source-get": bindQxHandler(specs["sourceGet"], implementation["sourceGet"], messages), + }, +}); diff --git a/src/gen/react-props.gen.ts b/src/gen/react-props.gen.ts new file mode 100644 index 0000000..af5538b --- /dev/null +++ b/src/gen/react-props.gen.ts @@ -0,0 +1,31 @@ +// Generated from checked QX contracts. Do not edit. +import {defineReactInterfaceContract} from "@quixos/web-studio-react-runtime"; +import type {ObjectRef, InterfaceReference, ReadableField, WritableField, QueryDescriptor, QueryReference} from "@quixos/web-studio-react-runtime"; +export type Interface0 = InterfaceReference<"interface:named@1", {"name": WritableField}> ; +export type Interface1 = InterfaceReference<"interface:project-tasks@1", {"tasks": ReadableField>>;"tags": ReadableField>>}> ; +export type Interface2 = InterfaceReference<"interface:tag-data@1", {"name": WritableField;"color": WritableField}> ; +export type Interface3 = InterfaceReference<"interface:completion-data@1", {"completedAt": WritableField;"scheduledDate": WritableField}> ; +export type Interface4 = InterfaceReference<"interface:task-data@1", {"title": WritableField;"status": WritableField;"priority": WritableField;"notes": WritableField;"dueDate": WritableField;"energy": WritableField;"estimatedHours": WritableField;"repeatDays": WritableField;"tags": ReadableField>>;"completions": ReadableField>>}> ; +export type Interface5 = InterfaceReference<"interface:task-actions@1", {}> ; +export type Interface6 = InterfaceReference<"interface:project-actions@1", {}> ; +export type ReactResults = {"propsGet": {"named": Interface0;"tasks": Interface1}}; +export type QueryVariables = {"Tasks": {"first": number;"after": (string | null);"statuses": Array};"TaggedTasks": {"first": number;"after": (string | null);"statuses": Array;"tags": Array>};"UntaggedTasks": {"first": number;"after": (string | null);"statuses": Array};"Catalog": {};"Summary": {}}; +export type QueryResults = {"Tasks": {"root": {"tasks": {"entries": Array<{"key": string;"node": {"_qx": {"ref": QueryReference<"interface:task-data@1">;"relations": {"completions": {"aggregate": {"count": bigint;"max": {"completedAt": (number | null)}}}}};"title": string;"status": string;"priority": string;"dueDate": string;"repeatDays": number;"estimatedHours": number;"tags": {"entries": Array<{"node": {"_qx": {"ref": QueryReference<"interface:tag-data@1">};"name": string;"color": string}}>}}}>;"pageInfo": {"hasNextPage": boolean;"endCursor": (string | null)}}}};"TaggedTasks": {"root": {"tasks": {"entries": Array<{"key": string;"node": {"_qx": {"ref": QueryReference<"interface:task-data@1">;"relations": {"completions": {"aggregate": {"count": bigint;"max": {"completedAt": (number | null)}}}}};"title": string;"status": string;"priority": string;"dueDate": string;"repeatDays": number;"estimatedHours": number;"tags": {"entries": Array<{"node": {"_qx": {"ref": QueryReference<"interface:tag-data@1">};"name": string;"color": string}}>}}}>;"pageInfo": {"hasNextPage": boolean;"endCursor": (string | null)}}}};"UntaggedTasks": {"root": {"tasks": {"entries": Array<{"key": string;"node": {"_qx": {"ref": QueryReference<"interface:task-data@1">;"relations": {"completions": {"aggregate": {"count": bigint;"max": {"completedAt": (number | null)}}}}};"title": string;"status": string;"priority": string;"dueDate": string;"repeatDays": number;"estimatedHours": number;"tags": {"entries": Array<{"node": {"_qx": {"ref": QueryReference<"interface:tag-data@1">};"name": string;"color": string}}>}}}>;"pageInfo": {"hasNextPage": boolean;"endCursor": (string | null)}}}};"Catalog": {"root": {"tags": {"entries": Array<{"node": {"_qx": {"ref": QueryReference<"interface:tag-data@1">};"name": string;"color": string}}>}}};"Summary": {"root": {"_qx": {"relations": {"tasks": {"aggregate": {"count": bigint;"sum": {"estimatedHours": (number | null)}};"groups": {"entries": Array<{"group": {"status": string};"aggregate": {"count": bigint;"sum": {"estimatedHours": (number | null)}}}>};"filter": {"expand": {"tags": {"groups": {"entries": Array<{"group": {"target": {"_qx": {"ref": QueryReference<"interface:tag-data@1">};"name": string;"color": string}};"aggregate": {"count": bigint;"sum": {"source": {"estimatedHours": (number | null)}}}}>}}}}}}}}}}; +export const queries: {"Tasks": QueryDescriptor;"TaggedTasks": QueryDescriptor;"UntaggedTasks": QueryDescriptor;"Catalog": QueryDescriptor;"Summary": QueryDescriptor} = {"Tasks":{"id":"package:project-react-runtime@1:query:Tasks","definitionDigest":"90fb955b4306497b7e779b659b52982cca7d5e5e9a640170b22b8b88beb55071","rootInterfaceRevisionId":"interface:project-tasks@1","variables":{"kind":"record","fields":{"first":{"kind":"scalar","name":"int32"},"after":{"kind":"optional","value":{"kind":"scalar","name":"string"}},"statuses":{"kind":"list","value":{"kind":"scalar","name":"string"}}}},"output":{"kind":"record","fields":{"root":{"kind":"record","fields":{"tasks":{"kind":"record","fields":{"entries":{"kind":"list","value":{"kind":"record","fields":{"key":{"kind":"scalar","name":"string"},"node":{"kind":"record","fields":{"_qx":{"kind":"record","fields":{"ref":{"kind":"object-ref","expectation":{"kind":"interface","interfaceRevisionId":"interface:task-data@1"}},"relations":{"kind":"record","fields":{"completions":{"kind":"record","fields":{"aggregate":{"kind":"record","fields":{"count":{"kind":"scalar","name":"uint64"},"max":{"kind":"record","fields":{"completedAt":{"kind":"optional","value":{"kind":"scalar","name":"double"}}}}}}}}}}}},"title":{"kind":"scalar","name":"string"},"status":{"kind":"scalar","name":"string"},"priority":{"kind":"scalar","name":"string"},"dueDate":{"kind":"scalar","name":"string"},"repeatDays":{"kind":"scalar","name":"int32"},"estimatedHours":{"kind":"scalar","name":"double"},"tags":{"kind":"record","fields":{"entries":{"kind":"list","value":{"kind":"record","fields":{"node":{"kind":"record","fields":{"_qx":{"kind":"record","fields":{"ref":{"kind":"object-ref","expectation":{"kind":"interface","interfaceRevisionId":"interface:tag-data@1"}}}},"name":{"kind":"scalar","name":"string"},"color":{"kind":"scalar","name":"string"}}}}}}}}}}}}},"pageInfo":{"kind":"record","fields":{"hasNextPage":{"kind":"scalar","name":"bool"},"endCursor":{"kind":"optional","value":{"kind":"scalar","name":"string"}}}}}}}}}},"watch":true},"TaggedTasks":{"id":"package:project-react-runtime@1:query:TaggedTasks","definitionDigest":"040521ef951ed94ddd7b74d2cc05bed6eec0095f30dcf5930a1e59585068abcd","rootInterfaceRevisionId":"interface:project-tasks@1","variables":{"kind":"record","fields":{"first":{"kind":"scalar","name":"int32"},"after":{"kind":"optional","value":{"kind":"scalar","name":"string"}},"statuses":{"kind":"list","value":{"kind":"scalar","name":"string"}},"tags":{"kind":"list","value":{"kind":"object-ref","expectation":{"kind":"interface","interfaceRevisionId":"interface:tag-data@1"}}}}},"output":{"kind":"record","fields":{"root":{"kind":"record","fields":{"tasks":{"kind":"record","fields":{"entries":{"kind":"list","value":{"kind":"record","fields":{"key":{"kind":"scalar","name":"string"},"node":{"kind":"record","fields":{"_qx":{"kind":"record","fields":{"ref":{"kind":"object-ref","expectation":{"kind":"interface","interfaceRevisionId":"interface:task-data@1"}},"relations":{"kind":"record","fields":{"completions":{"kind":"record","fields":{"aggregate":{"kind":"record","fields":{"count":{"kind":"scalar","name":"uint64"},"max":{"kind":"record","fields":{"completedAt":{"kind":"optional","value":{"kind":"scalar","name":"double"}}}}}}}}}}}},"title":{"kind":"scalar","name":"string"},"status":{"kind":"scalar","name":"string"},"priority":{"kind":"scalar","name":"string"},"dueDate":{"kind":"scalar","name":"string"},"repeatDays":{"kind":"scalar","name":"int32"},"estimatedHours":{"kind":"scalar","name":"double"},"tags":{"kind":"record","fields":{"entries":{"kind":"list","value":{"kind":"record","fields":{"node":{"kind":"record","fields":{"_qx":{"kind":"record","fields":{"ref":{"kind":"object-ref","expectation":{"kind":"interface","interfaceRevisionId":"interface:tag-data@1"}}}},"name":{"kind":"scalar","name":"string"},"color":{"kind":"scalar","name":"string"}}}}}}}}}}}}},"pageInfo":{"kind":"record","fields":{"hasNextPage":{"kind":"scalar","name":"bool"},"endCursor":{"kind":"optional","value":{"kind":"scalar","name":"string"}}}}}}}}}},"watch":true},"UntaggedTasks":{"id":"package:project-react-runtime@1:query:UntaggedTasks","definitionDigest":"e4efe0274b9cb1cd2ea1b32c986f71a8637fa2fb62f9a3c062cd8f08a391ff22","rootInterfaceRevisionId":"interface:project-tasks@1","variables":{"kind":"record","fields":{"first":{"kind":"scalar","name":"int32"},"after":{"kind":"optional","value":{"kind":"scalar","name":"string"}},"statuses":{"kind":"list","value":{"kind":"scalar","name":"string"}}}},"output":{"kind":"record","fields":{"root":{"kind":"record","fields":{"tasks":{"kind":"record","fields":{"entries":{"kind":"list","value":{"kind":"record","fields":{"key":{"kind":"scalar","name":"string"},"node":{"kind":"record","fields":{"_qx":{"kind":"record","fields":{"ref":{"kind":"object-ref","expectation":{"kind":"interface","interfaceRevisionId":"interface:task-data@1"}},"relations":{"kind":"record","fields":{"completions":{"kind":"record","fields":{"aggregate":{"kind":"record","fields":{"count":{"kind":"scalar","name":"uint64"},"max":{"kind":"record","fields":{"completedAt":{"kind":"optional","value":{"kind":"scalar","name":"double"}}}}}}}}}}}},"title":{"kind":"scalar","name":"string"},"status":{"kind":"scalar","name":"string"},"priority":{"kind":"scalar","name":"string"},"dueDate":{"kind":"scalar","name":"string"},"repeatDays":{"kind":"scalar","name":"int32"},"estimatedHours":{"kind":"scalar","name":"double"},"tags":{"kind":"record","fields":{"entries":{"kind":"list","value":{"kind":"record","fields":{"node":{"kind":"record","fields":{"_qx":{"kind":"record","fields":{"ref":{"kind":"object-ref","expectation":{"kind":"interface","interfaceRevisionId":"interface:tag-data@1"}}}},"name":{"kind":"scalar","name":"string"},"color":{"kind":"scalar","name":"string"}}}}}}}}}}}}},"pageInfo":{"kind":"record","fields":{"hasNextPage":{"kind":"scalar","name":"bool"},"endCursor":{"kind":"optional","value":{"kind":"scalar","name":"string"}}}}}}}}}},"watch":true},"Catalog":{"id":"package:project-react-runtime@1:query:Catalog","definitionDigest":"2f195bd0b0fee57cd8e63a054ac7e7049d4eca665b8fbe71e2ef67e50f4be7f8","rootInterfaceRevisionId":"interface:project-tasks@1","variables":{"kind":"record","fields":{}},"output":{"kind":"record","fields":{"root":{"kind":"record","fields":{"tags":{"kind":"record","fields":{"entries":{"kind":"list","value":{"kind":"record","fields":{"node":{"kind":"record","fields":{"_qx":{"kind":"record","fields":{"ref":{"kind":"object-ref","expectation":{"kind":"interface","interfaceRevisionId":"interface:tag-data@1"}}}},"name":{"kind":"scalar","name":"string"},"color":{"kind":"scalar","name":"string"}}}}}}}}}}}},"watch":true},"Summary":{"id":"package:project-react-runtime@1:query:Summary","definitionDigest":"7770ff6b96489b228f7b1cbe0eee77cde67f70ed9004d19f920d6ec58889e361","rootInterfaceRevisionId":"interface:project-tasks@1","variables":{"kind":"record","fields":{}},"output":{"kind":"record","fields":{"root":{"kind":"record","fields":{"_qx":{"kind":"record","fields":{"relations":{"kind":"record","fields":{"tasks":{"kind":"record","fields":{"aggregate":{"kind":"record","fields":{"count":{"kind":"scalar","name":"uint64"},"sum":{"kind":"record","fields":{"estimatedHours":{"kind":"optional","value":{"kind":"scalar","name":"double"}}}}}},"groups":{"kind":"record","fields":{"entries":{"kind":"list","value":{"kind":"record","fields":{"group":{"kind":"record","fields":{"status":{"kind":"scalar","name":"string"}}},"aggregate":{"kind":"record","fields":{"count":{"kind":"scalar","name":"uint64"},"sum":{"kind":"record","fields":{"estimatedHours":{"kind":"optional","value":{"kind":"scalar","name":"double"}}}}}}}}}}},"filter":{"kind":"record","fields":{"expand":{"kind":"record","fields":{"tags":{"kind":"record","fields":{"groups":{"kind":"record","fields":{"entries":{"kind":"list","value":{"kind":"record","fields":{"group":{"kind":"record","fields":{"target":{"kind":"record","fields":{"_qx":{"kind":"record","fields":{"ref":{"kind":"object-ref","expectation":{"kind":"interface","interfaceRevisionId":"interface:tag-data@1"}}}},"name":{"kind":"scalar","name":"string"},"color":{"kind":"scalar","name":"string"}}}}},"aggregate":{"kind":"record","fields":{"count":{"kind":"scalar","name":"uint64"},"sum":{"kind":"record","fields":{"source":{"kind":"record","fields":{"estimatedHours":{"kind":"optional","value":{"kind":"scalar","name":"double"}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"watch":true}}; +const contractsData = [{"interfaceId":"interface:named","revisionId":"interface:named@1","displayName":"Named","source":{"resolver":"git","repository":"https://repos.quixos.org/quixos-todo/interface-named.git","commit":"0000000000000000000000000000000000000010"},"members":[{"kind":"value","id":"member:named:name","displayName":"name","valueType":{"kind":"scalar","name":"string"},"operations":[{"id":"operation:named:name:get","displayName":"get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"},"mode":"call"},{"id":"operation:named:name:set","displayName":"set","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"builtin","name":"unit"},"mode":"call"},{"id":"operation:named:name:watch-start","displayName":"watch-start","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"builtin","name":"watch-handle"},"eventType":{"kind":"scalar","name":"string"},"mode":"watch-start"},{"id":"operation:named:name:watch-stop","displayName":"watch-stop","inputType":{"kind":"builtin","name":"watch-handle"},"outputType":{"kind":"builtin","name":"unit"},"mode":"watch-stop"}]}]},{"interfaceId":"interface:project-tasks","revisionId":"interface:project-tasks@1","displayName":"ProjectTasks","source":{"resolver":"git","repository":"https://repos.quixos.org/quixos-todo/interface-project-tasks.git","commit":"0000000000000000000000000000000000000012"},"members":[{"kind":"relationship","queryRead":{"execution":"native"},"id":"member:project-tasks:tasks","displayName":"tasks","target":{"kind":"atom","atomId":"atom:task"},"cardinality":"many-unique","ordered":true,"operations":[{"id":"operation:project-tasks:tasks:resolve","displayName":"resolve","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"list","value":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:task"}}},"mode":"call"},{"id":"operation:project-tasks:tasks:connect","displayName":"connect","inputType":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:task"}},"outputType":{"kind":"builtin","name":"unit"},"mode":"call"},{"id":"operation:project-tasks:tasks:disconnect","displayName":"disconnect","inputType":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:task"}},"outputType":{"kind":"builtin","name":"unit"},"mode":"call"},{"id":"operation:project-tasks:tasks:watch-start","displayName":"watch-start","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"builtin","name":"watch-handle"},"eventType":{"kind":"list","value":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:task"}}},"mode":"watch-start"},{"id":"operation:project-tasks:tasks:watch-stop","displayName":"watch-stop","inputType":{"kind":"builtin","name":"watch-handle"},"outputType":{"kind":"builtin","name":"unit"},"mode":"watch-stop"}]},{"kind":"relationship","queryRead":{"execution":"native"},"id":"tags","displayName":"tags","target":{"kind":"atom","atomId":"atom:tag"},"cardinality":"many-unique","ordered":false,"operations":[{"id":"tags:resolve","displayName":"resolve","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"list","value":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:tag"}}},"mode":"call"},{"id":"tags:connect","displayName":"connect","inputType":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:tag"}},"outputType":{"kind":"builtin","name":"unit"},"mode":"call"},{"id":"tags:disconnect","displayName":"disconnect","inputType":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:tag"}},"outputType":{"kind":"builtin","name":"unit"},"mode":"call"},{"id":"tags:watch","displayName":"watch-start","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"builtin","name":"watch-handle"},"eventType":{"kind":"list","value":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:tag"}}},"mode":"watch-start"},{"id":"tags:stop","displayName":"watch-stop","inputType":{"kind":"builtin","name":"watch-handle"},"outputType":{"kind":"builtin","name":"unit"},"mode":"watch-stop"}]}]},{"interfaceId":"interface:tag-data","revisionId":"interface:tag-data@1","displayName":"TagData","source":{"resolver":"git","repository":"https://repos.quixos.org/quixos-todo/interface-tag-data.git","commit":"0000000000000000000000000000000000000030"},"members":[{"kind":"value","queryRead":{"execution":"native"},"id":"name","displayName":"name","valueType":{"kind":"scalar","name":"string"},"operations":[{"id":"name:get","displayName":"get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"},"mode":"call"},{"id":"name:set","displayName":"set","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"builtin","name":"unit"},"mode":"call"},{"id":"name:watch","displayName":"watch-start","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"builtin","name":"watch-handle"},"eventType":{"kind":"scalar","name":"string"},"mode":"watch-start"},{"id":"name:stop","displayName":"watch-stop","inputType":{"kind":"builtin","name":"watch-handle"},"outputType":{"kind":"builtin","name":"unit"},"mode":"watch-stop"}]},{"kind":"value","queryRead":{"execution":"native"},"id":"color","displayName":"color","valueType":{"kind":"scalar","name":"string"},"operations":[{"id":"color:get","displayName":"get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"},"mode":"call"},{"id":"color:set","displayName":"set","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"builtin","name":"unit"},"mode":"call"},{"id":"color:watch","displayName":"watch-start","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"builtin","name":"watch-handle"},"eventType":{"kind":"scalar","name":"string"},"mode":"watch-start"},{"id":"color:stop","displayName":"watch-stop","inputType":{"kind":"builtin","name":"watch-handle"},"outputType":{"kind":"builtin","name":"unit"},"mode":"watch-stop"}]}]},{"interfaceId":"interface:completion-data","revisionId":"interface:completion-data@1","displayName":"CompletionData","source":{"resolver":"git","repository":"https://repos.quixos.org/quixos-todo/interface-completion-data.git","commit":"0000000000000000000000000000000000000031"},"members":[{"kind":"value","queryRead":{"execution":"native"},"id":"completedAt","displayName":"completedAt","valueType":{"kind":"scalar","name":"double"},"operations":[{"id":"completedAt:get","displayName":"get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"double"},"mode":"call"},{"id":"completedAt:set","displayName":"set","inputType":{"kind":"scalar","name":"double"},"outputType":{"kind":"builtin","name":"unit"},"mode":"call"},{"id":"completedAt:watch","displayName":"watch-start","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"builtin","name":"watch-handle"},"eventType":{"kind":"scalar","name":"double"},"mode":"watch-start"},{"id":"completedAt:stop","displayName":"watch-stop","inputType":{"kind":"builtin","name":"watch-handle"},"outputType":{"kind":"builtin","name":"unit"},"mode":"watch-stop"}]},{"kind":"value","queryRead":{"execution":"native"},"id":"scheduledDate","displayName":"scheduledDate","valueType":{"kind":"scalar","name":"string"},"operations":[{"id":"scheduledDate:get","displayName":"get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"},"mode":"call"},{"id":"scheduledDate:set","displayName":"set","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"builtin","name":"unit"},"mode":"call"},{"id":"scheduledDate:watch","displayName":"watch-start","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"builtin","name":"watch-handle"},"eventType":{"kind":"scalar","name":"string"},"mode":"watch-start"},{"id":"scheduledDate:stop","displayName":"watch-stop","inputType":{"kind":"builtin","name":"watch-handle"},"outputType":{"kind":"builtin","name":"unit"},"mode":"watch-stop"}]}]},{"interfaceId":"interface:task-data","revisionId":"interface:task-data@1","displayName":"TaskData","source":{"resolver":"git","repository":"https://repos.quixos.org/quixos-todo/interface-task-data.git","commit":"0000000000000000000000000000000000000011"},"members":[{"kind":"value","queryRead":{"execution":"native"},"id":"member:task-data:title","displayName":"title","valueType":{"kind":"scalar","name":"string"},"operations":[{"id":"operation:task-data:title:get","displayName":"get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"},"mode":"call"},{"id":"operation:task-data:title:set","displayName":"set","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"builtin","name":"unit"},"mode":"call"},{"id":"operation:task-data:title:watch-start","displayName":"watch-start","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"builtin","name":"watch-handle"},"eventType":{"kind":"scalar","name":"string"},"mode":"watch-start"},{"id":"operation:task-data:title:watch-stop","displayName":"watch-stop","inputType":{"kind":"builtin","name":"watch-handle"},"outputType":{"kind":"builtin","name":"unit"},"mode":"watch-stop"}]},{"kind":"value","queryRead":{"execution":"native"},"id":"member:task-data:status","displayName":"status","valueType":{"kind":"scalar","name":"string"},"operations":[{"id":"operation:task-data:status:get","displayName":"get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"},"mode":"call"},{"id":"operation:task-data:status:set","displayName":"set","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"builtin","name":"unit"},"mode":"call"},{"id":"operation:task-data:status:watch-start","displayName":"watch-start","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"builtin","name":"watch-handle"},"eventType":{"kind":"scalar","name":"string"},"mode":"watch-start"},{"id":"operation:task-data:status:watch-stop","displayName":"watch-stop","inputType":{"kind":"builtin","name":"watch-handle"},"outputType":{"kind":"builtin","name":"unit"},"mode":"watch-stop"}]},{"kind":"value","queryRead":{"execution":"native"},"id":"member:task-data:priority","displayName":"priority","valueType":{"kind":"scalar","name":"string"},"operations":[{"id":"operation:task-data:priority:get","displayName":"get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"},"mode":"call"},{"id":"operation:task-data:priority:set","displayName":"set","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"builtin","name":"unit"},"mode":"call"},{"id":"operation:task-data:priority:watch-start","displayName":"watch-start","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"builtin","name":"watch-handle"},"eventType":{"kind":"scalar","name":"string"},"mode":"watch-start"},{"id":"operation:task-data:priority:watch-stop","displayName":"watch-stop","inputType":{"kind":"builtin","name":"watch-handle"},"outputType":{"kind":"builtin","name":"unit"},"mode":"watch-stop"}]},{"kind":"value","queryRead":{"execution":"native"},"id":"member:task-data:notes","displayName":"notes","valueType":{"kind":"scalar","name":"string"},"operations":[{"id":"operation:task-data:notes:get","displayName":"get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"},"mode":"call"},{"id":"operation:task-data:notes:set","displayName":"set","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"builtin","name":"unit"},"mode":"call"},{"id":"operation:task-data:notes:watch-start","displayName":"watch-start","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"builtin","name":"watch-handle"},"eventType":{"kind":"scalar","name":"string"},"mode":"watch-start"},{"id":"operation:task-data:notes:watch-stop","displayName":"watch-stop","inputType":{"kind":"builtin","name":"watch-handle"},"outputType":{"kind":"builtin","name":"unit"},"mode":"watch-stop"}]},{"kind":"value","queryRead":{"execution":"native"},"id":"member:task-data:due-date","displayName":"dueDate","valueType":{"kind":"scalar","name":"string"},"operations":[{"id":"operation:task-data:due-date:get","displayName":"get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"},"mode":"call"},{"id":"operation:task-data:due-date:set","displayName":"set","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"builtin","name":"unit"},"mode":"call"},{"id":"operation:task-data:due-date:watch-start","displayName":"watch-start","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"builtin","name":"watch-handle"},"eventType":{"kind":"scalar","name":"string"},"mode":"watch-start"},{"id":"operation:task-data:due-date:watch-stop","displayName":"watch-stop","inputType":{"kind":"builtin","name":"watch-handle"},"outputType":{"kind":"builtin","name":"unit"},"mode":"watch-stop"}]},{"kind":"value","queryRead":{"execution":"native"},"id":"member:task-data:energy","displayName":"energy","valueType":{"kind":"scalar","name":"string"},"operations":[{"id":"operation:task-data:energy:get","displayName":"get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"},"mode":"call"},{"id":"operation:task-data:energy:set","displayName":"set","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"builtin","name":"unit"},"mode":"call"},{"id":"operation:task-data:energy:watch-start","displayName":"watch-start","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"builtin","name":"watch-handle"},"eventType":{"kind":"scalar","name":"string"},"mode":"watch-start"},{"id":"operation:task-data:energy:watch-stop","displayName":"watch-stop","inputType":{"kind":"builtin","name":"watch-handle"},"outputType":{"kind":"builtin","name":"unit"},"mode":"watch-stop"}]},{"kind":"value","queryRead":{"execution":"native"},"id":"estimatedHours","displayName":"estimatedHours","valueType":{"kind":"scalar","name":"double"},"operations":[{"id":"estimatedHours:get","displayName":"get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"double"},"mode":"call"},{"id":"estimatedHours:set","displayName":"set","inputType":{"kind":"scalar","name":"double"},"outputType":{"kind":"builtin","name":"unit"},"mode":"call"},{"id":"estimatedHours:watch","displayName":"watch-start","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"builtin","name":"watch-handle"},"eventType":{"kind":"scalar","name":"double"},"mode":"watch-start"},{"id":"estimatedHours:stop","displayName":"watch-stop","inputType":{"kind":"builtin","name":"watch-handle"},"outputType":{"kind":"builtin","name":"unit"},"mode":"watch-stop"}]},{"kind":"value","queryRead":{"execution":"native"},"id":"repeatDays","displayName":"repeatDays","valueType":{"kind":"scalar","name":"int32"},"operations":[{"id":"repeatDays:get","displayName":"get","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"int32"},"mode":"call"},{"id":"repeatDays:set","displayName":"set","inputType":{"kind":"scalar","name":"int32"},"outputType":{"kind":"builtin","name":"unit"},"mode":"call"},{"id":"repeatDays:watch","displayName":"watch-start","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"builtin","name":"watch-handle"},"eventType":{"kind":"scalar","name":"int32"},"mode":"watch-start"},{"id":"repeatDays:stop","displayName":"watch-stop","inputType":{"kind":"builtin","name":"watch-handle"},"outputType":{"kind":"builtin","name":"unit"},"mode":"watch-stop"}]},{"kind":"relationship","queryRead":{"execution":"native"},"id":"tags","displayName":"tags","target":{"kind":"atom","atomId":"atom:tag"},"cardinality":"many-unique","ordered":false,"operations":[{"id":"tags:resolve","displayName":"resolve","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"list","value":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:tag"}}},"mode":"call"},{"id":"tags:connect","displayName":"connect","inputType":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:tag"}},"outputType":{"kind":"builtin","name":"unit"},"mode":"call"},{"id":"tags:disconnect","displayName":"disconnect","inputType":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:tag"}},"outputType":{"kind":"builtin","name":"unit"},"mode":"call"},{"id":"tags:watch","displayName":"watch-start","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"builtin","name":"watch-handle"},"eventType":{"kind":"list","value":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:tag"}}},"mode":"watch-start"},{"id":"tags:stop","displayName":"watch-stop","inputType":{"kind":"builtin","name":"watch-handle"},"outputType":{"kind":"builtin","name":"unit"},"mode":"watch-stop"}]},{"kind":"relationship","queryRead":{"execution":"native"},"id":"completions","displayName":"completions","target":{"kind":"atom","atomId":"atom:completion"},"cardinality":"many-unique","ordered":false,"operations":[{"id":"completions:resolve","displayName":"resolve","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"list","value":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:completion"}}},"mode":"call"},{"id":"completions:connect","displayName":"connect","inputType":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:completion"}},"outputType":{"kind":"builtin","name":"unit"},"mode":"call"},{"id":"completions:disconnect","displayName":"disconnect","inputType":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:completion"}},"outputType":{"kind":"builtin","name":"unit"},"mode":"call"},{"id":"completions:watch","displayName":"watch-start","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"builtin","name":"watch-handle"},"eventType":{"kind":"list","value":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:completion"}}},"mode":"watch-start"},{"id":"completions:stop","displayName":"watch-stop","inputType":{"kind":"builtin","name":"watch-handle"},"outputType":{"kind":"builtin","name":"unit"},"mode":"watch-stop"}]}]},{"interfaceId":"interface:task-actions","revisionId":"interface:task-actions@1","displayName":"TaskActions","source":{"resolver":"git","repository":"https://repos.quixos.org/quixos-todo/interface-task-actions.git","commit":"0000000000000000000000000000000000000014"},"members":[{"kind":"operation","id":"member:task-actions:complete","displayName":"complete","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"},"operations":[{"id":"operation:task-actions:complete","displayName":"call","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"},"mode":"call"}]},{"kind":"operation","id":"member:task-actions:reopen","displayName":"reopen","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"},"operations":[{"id":"operation:task-actions:reopen","displayName":"call","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"},"mode":"call"}]},{"kind":"operation","id":"member:task-actions:archive","displayName":"archive","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"},"operations":[{"id":"operation:task-actions:archive","displayName":"call","inputType":{"kind":"builtin","name":"unit"},"outputType":{"kind":"scalar","name":"string"},"mode":"call"}]}]},{"interfaceId":"interface:project-actions","revisionId":"interface:project-actions@1","displayName":"ProjectActions","source":{"resolver":"git","repository":"https://repos.quixos.org/quixos-todo/interface-project-actions.git","commit":"0000000000000000000000000000000000000013"},"members":[{"kind":"operation","id":"member:project-actions:add-task","displayName":"addTask","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:task"}},"operations":[{"id":"operation:project-actions:add-task","displayName":"call","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:task"}},"mode":"call"}]},{"kind":"operation","id":"add-tag","displayName":"addTag","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:tag"}},"operations":[{"id":"add-tag:call","displayName":"call","inputType":{"kind":"scalar","name":"string"},"outputType":{"kind":"object-ref","expectation":{"kind":"atom","atomId":"atom:tag"}},"mode":"call"}]}]}]; +export const reactContracts = {"interface:named@1": defineReactInterfaceContract Promise;"name.set": (input: string) => Promise}}>("interface:named@1", contractsData), +"interface:project-tasks@1": defineReactInterfaceContract Promise>>;"tasks.connect": (input: ObjectRef<"atom:task">) => Promise;"tasks.disconnect": (input: ObjectRef<"atom:task">) => Promise;"tags.resolve": () => Promise>>;"tags.connect": (input: ObjectRef<"atom:tag">) => Promise;"tags.disconnect": (input: ObjectRef<"atom:tag">) => Promise}}>("interface:project-tasks@1", contractsData), +"interface:tag-data@1": defineReactInterfaceContract Promise;"name.set": (input: string) => Promise;"color.get": () => Promise;"color.set": (input: string) => Promise}}>("interface:tag-data@1", contractsData), +"interface:completion-data@1": defineReactInterfaceContract Promise;"completedAt.set": (input: number) => Promise;"scheduledDate.get": () => Promise;"scheduledDate.set": (input: string) => Promise}}>("interface:completion-data@1", contractsData), +"interface:task-data@1": defineReactInterfaceContract Promise;"title.set": (input: string) => Promise;"status.get": () => Promise;"status.set": (input: string) => Promise;"priority.get": () => Promise;"priority.set": (input: string) => Promise;"notes.get": () => Promise;"notes.set": (input: string) => Promise;"dueDate.get": () => Promise;"dueDate.set": (input: string) => Promise;"energy.get": () => Promise;"energy.set": (input: string) => Promise;"estimatedHours.get": () => Promise;"estimatedHours.set": (input: number) => Promise;"repeatDays.get": () => Promise;"repeatDays.set": (input: number) => Promise;"tags.resolve": () => Promise>>;"tags.connect": (input: ObjectRef<"atom:tag">) => Promise;"tags.disconnect": (input: ObjectRef<"atom:tag">) => Promise;"completions.resolve": () => Promise>>;"completions.connect": (input: ObjectRef<"atom:completion">) => Promise;"completions.disconnect": (input: ObjectRef<"atom:completion">) => Promise}}>("interface:task-data@1", contractsData), +"interface:task-actions@1": defineReactInterfaceContract Promise;"reopen.call": () => Promise;"archive.call": () => Promise}}>("interface:task-actions@1", contractsData), +"interface:project-actions@1": defineReactInterfaceContract Promise>;"addTag.call": (input: string) => Promise>}}>("interface:project-actions@1", contractsData)}; +export const reactInterfaces = {"Named": reactContracts["interface:named@1"], +"ProjectTasks": reactContracts["interface:project-tasks@1"], +"TagData": reactContracts["interface:tag-data@1"], +"CompletionData": reactContracts["interface:completion-data@1"], +"TaskData": reactContracts["interface:task-data@1"], +"TaskActions": reactContracts["interface:task-actions@1"], +"ProjectActions": reactContracts["interface:project-actions@1"]}; +type CheckedComponent void}) => unknown> = C; +type Component0 = CheckedComponent<"propsGet", typeof import("../project-component.js")["default"]>; diff --git a/src/gen/web-studio-react-runtime.d.ts b/src/gen/web-studio-react-runtime.d.ts new file mode 100644 index 0000000..bcde089 --- /dev/null +++ b/src/gen/web-studio-react-runtime.d.ts @@ -0,0 +1,59 @@ +// Generated by the Quixos React platform contract. Do not edit. +declare module "@quixos/web-studio-react-runtime" { + import type * as React from "react"; + export function useComponentOverlayContainer(): HTMLElement; + export function useComponentStyleRoot(): ShadowRoot; + export type ObjectRef = string & { + readonly $quixosAtom: AtomId; + }; + export type FieldCapability = {objectId: string; interfaceRevisionId: string; getOperationId: string; watchOperationId?: string; setOperationId?: string; inputKind?: "fields" | "value"}; + export type ReadableField = {readonly value?: T; readonly capability: FieldCapability}; + /** set(T) uses the resolved capability: native CRDT fields send incremental edits; + * custom/manual setters receive semantic values. Storage provenance grants no authority. */ + export type WritableField = ReadableField & {readonly $writeType?: (value: T) => T; readonly writable: true; readonly capability: FieldCapability & {setOperationId: string}}; + export type LiveFieldProp = ReadableField; + export type InterfaceReference = {readonly $quixosRef: string; readonly interfaceRevisionId: I; readonly fields: Fields}; + export type ReactInterfaceContract = {readonly interfaceRevisionId: string; readonly $viewType?: (view: View) => View}; + export function defineReactInterfaceContract(interfaceRevisionId: string, interfaces: unknown): ReactInterfaceContract; + export function tryConform(object: string | {readonly $quixosRef: string}, contract: ReactInterfaceContract, options?: {signal?: AbortSignal}): Promise; + export type ConformanceResult = {status: "loading"} | {status: "absent"} | {status: "available"; view: View} | {status: "error"; error: Error}; + export function useTryConform(object: string | {readonly $quixosRef: string}, contract: ReactInterfaceContract): ConformanceResult; + export type QueryValueType = {kind: "builtin" | "scalar"; name: string} | {kind: "record"; fields: Record} | {kind: "optional" | "list"; value: QueryValueType} | {kind: "object-ref"; expectation: {kind: "atom"; atomId: string} | {kind: "interface"; interfaceRevisionId: string}}; + export type QueryReference = {readonly $quixosRef: string; readonly queryContract: Contract}; + export interface QueryDescriptor {readonly id: string; readonly definitionDigest: string; readonly rootInterfaceRevisionId: string; readonly variables: QueryValueType; readonly output: QueryValueType; readonly watch: boolean; readonly $types?: (variables: Variables, result: Result) => [Variables, Result]} + export type QueryPartial = T extends QueryReference ? T : T extends readonly (infer Item)[] ? QueryPartial[] : T extends object ? {[Key in keyof T]?: QueryPartial} : T; + export type QueryFieldState = {path: readonly (string | number)[]; status: "pending" | "error"; error?: string}; + export type QueryState = {refreshing: boolean; fields: QueryFieldState[]; runId?: string; sequence?: bigint; consistency?: string} & ({status: "loading"; data?: undefined; error?: undefined} | {status: "ready"; data: T; error?: undefined} | {status: "partial"; data: QueryPartial; error?: undefined} | {status: "error"; data?: T | QueryPartial; error: Error}); + export function useQuery(descriptor: QueryDescriptor, options: {root: string | {readonly $quixosRef: string}; variables: Variables}): QueryState & {refresh(): void}; + export interface QueryConnection {entries: {key: string; node: Row; cursor?: string | null}[]; pageInfo: {hasNextPage: boolean; endCursor?: string | null}} + export function CollectionView(props: {result: QueryState & {refresh(): void}; connection(data: QueryPartial): QueryPartial> | undefined; renderItem(row: QueryPartial, entryKey: string): React.ReactNode; onCreate?: () => void; onLoadMore?: (cursor: string | null) => void; onReset?: () => void; loadingMore?: boolean; empty?: React.ReactNode; prefetch?: boolean}): React.ReactElement; + export type ReactComponentHostProps = { + onAction?: (action: Action) => void; + fallback?: React.ReactNode; + className?: string; + style?: React.CSSProperties; + /** Optional extra action. The host still displays and reports errors by default. */ + extraErrorAction?: (error: Error) => void; + }; + export type ReactComponentImplementationProps = { + camino: CaminoProps; + render: RenderProps; + dispatch: (action: Action) => void; + }; + export const createWebStudioComponent: < + ForObject extends ObjectRef, RenderProps extends object, Action, + >(config: { expectedAtomId: string }) => (props: { + forObject: ForObject; + } & RenderProps & ReactComponentHostProps) => any; + export const invokeCapability: ( + objectId: string, + interfaceRevisionId: string, + operationId: string, + value?: unknown, + options?: {clientMutationId?: string; signal?: AbortSignal}, + ) => Promise; + export const h: typeof React.createElement; + export function useLiveField(field: ReadableField, options: {write: (value: T) => Promise}): readonly [T, (value: T) => Promise]; + export function useLiveField(field: WritableField): readonly [T, (value: T) => Promise]; + export function useLiveField(field: ReadableField): readonly [T]; +} diff --git a/src/impl/createComponent.ts b/src/impl/createComponent.ts new file mode 100644 index 0000000..28a0997 --- /dev/null +++ b/src/impl/createComponent.ts @@ -0,0 +1,2 @@ +// This adapter keeps the implementation file hand-authored. +export { createComponent as handler } from "../project-react.impl.js"; diff --git a/src/impl/propsGet.ts b/src/impl/propsGet.ts new file mode 100644 index 0000000..6016147 --- /dev/null +++ b/src/impl/propsGet.ts @@ -0,0 +1,2 @@ +// This adapter keeps the implementation file hand-authored. +export { props as handler } from "../project-react.impl.js"; diff --git a/src/impl/propsWatch.ts b/src/impl/propsWatch.ts new file mode 100644 index 0000000..6016147 --- /dev/null +++ b/src/impl/propsWatch.ts @@ -0,0 +1,2 @@ +// This adapter keeps the implementation file hand-authored. +export { props as handler } from "../project-react.impl.js"; diff --git a/src/impl/propsWatchStop.ts b/src/impl/propsWatchStop.ts new file mode 100644 index 0000000..d228216 --- /dev/null +++ b/src/impl/propsWatchStop.ts @@ -0,0 +1,2 @@ +// This adapter keeps the implementation file hand-authored. +export { stopWatch as handler } from "../project-react.impl.js"; diff --git a/src/impl/sourceGet.ts b/src/impl/sourceGet.ts new file mode 100644 index 0000000..15e571c --- /dev/null +++ b/src/impl/sourceGet.ts @@ -0,0 +1,2 @@ +// This adapter keeps the implementation file hand-authored. +export { source as handler } from "../project-react.impl.js"; diff --git a/src/migrate.ts b/src/migrate.ts new file mode 100644 index 0000000..b0ffd10 --- /dev/null +++ b/src/migrate.ts @@ -0,0 +1,3 @@ +// Generated by qx-scaffold-v1 +import { serveMigration } from "@quixos/camino-package-runtime"; +await serveMigration({}); diff --git a/src/project-component.tsx b/src/project-component.tsx new file mode 100644 index 0000000..f0b718a --- /dev/null +++ b/src/project-component.tsx @@ -0,0 +1,358 @@ +import { useState } from "react"; +import { + createWebStudioComponent, + tryConform, + useLiveField, + useQuery, + type ObjectRef, + type QueryState, + type ReactComponentImplementationProps, +} from "@quixos/web-studio-react-runtime"; +import { + queries, + reactInterfaces, + type QueryResults, + type QueryVariables, + type ReactResults, +} from "./gen/react-props.gen.js"; +import "./tracker.css"; + +type Tag = QueryResults["Catalog"]["root"]["tags"]["entries"][number]["node"]; +type TagChoice = { id: string; name: string; color: string }; +const TaskEditor = createWebStudioComponent, { tagChoices: TagChoice[] }, never>({ + expectedAtomId: "atom:task", +}); +type Props = ReactComponentImplementationProps; +type ListProps = { + root: string; + variables: QueryVariables["Tasks"]; + selected: string | null; + select(id: string): void; + next(cursor: string | null): void; + reset(): void; +}; +function Rows({ result, selected, select, next, reset }: ListProps & { result: QueryState }) { + if (result.status === "error") + return ( +
+ {result.error.message} + +
+ ); + if (result.status !== "ready") return

Loading tasks…

; + const page = result.data.root.tasks; + return ( + <> +
+ {page.entries.length === 0 &&

No tasks match this view.

} + {page.entries.map(({ key, node: task }) => ( + + ))} +
+
+ + {page.pageInfo.hasNextPage && } +
+ + ); +} +function AllRows(props: ListProps) { + return ; +} +function UntaggedRows(props: ListProps) { + return ; +} +function TaggedRows(props: ListProps & { tags: Tag["_qx"]["ref"][] }) { + return ( + + ); +} +export default function ProjectComponent({ camino }: Props) { + const [name, setName] = useLiveField(camino.named.fields.name); + const root = camino.tasks.$quixosRef; + const catalog = useQuery(queries.Catalog, { root, variables: {} }); + const summary = useQuery(queries.Summary, { root, variables: {} }); + const [selected, setSelected] = useState(null); + const [status, setStatus] = useState("OPEN"); + const [tagIds, setTagIds] = useState([]); + const [untagged, setUntagged] = useState(false); + const [after, setAfter] = useState(null); + const [newTitle, setNewTitle] = useState(""); + const [newTag, setNewTag] = useState(""); + const [busy, setBusy] = useState(false); + const [error, setError] = useState(""); + const tags = catalog.status === "ready" ? catalog.data.root.tags.entries.map((e) => e.node) : []; + const run = async (action: () => Promise) => { + if (busy) return; + setBusy(true); + setError(""); + try { + await action(); + } catch (e) { + setError(e instanceof Error ? e.message : String(e)); + } finally { + setBusy(false); + } + }; + const actions = async () => { + const view = await tryConform(root, reactInterfaces.ProjectActions); + if (!view) throw new Error("This project no longer supports task actions"); + return view.call; + }; + const addTask = () => + run(async () => { + if (!newTitle.trim()) return; + const task = await (await actions())["addTask.call"](newTitle.trim()); + setNewTitle(""); + setAfter(null); + setStatus("OPEN"); + setTagIds([]); + setUntagged(false); + setSelected(task); + }); + const editTag = (tag: Tag, field: "name" | "color", value: string) => + run(async () => { + if (!value.trim()) throw new Error("A tag needs a name"); + const view = await tryConform(tag._qx.ref, reactInterfaces.TagData); + if (!view) throw new Error("Tag is no longer available"); + await view.call[field === "name" ? "name.set" : "color.set"](value); + }); + const choices = tags.map((tag) => ({ id: tag._qx.ref.$quixosRef, name: tag.name, color: tag.color })); + const totals = summary.status === "ready" ? summary.data.root._qx.relations.tasks : undefined; + const list: ListProps = { + root, + variables: { first: 50, after, statuses: status === "ALL" ? ["OPEN", "DONE", "ARCHIVED"] : [status] }, + selected, + select: setSelected, + next: setAfter, + reset: () => { + setAfter(null); + }, + }; + const activeTags = tags.filter((t) => tagIds.includes(t._qx.ref.$quixosRef)); + return ( +
+
+ { + void setName(e.target.value).catch((err) => setError(String(err))); + }} + /> + {totals ? `${String(totals.aggregate.count)} tasks` : "Task tracker"} +
+ {error && ( +
+ {error} +
+ )} +
{ + e.preventDefault(); + void addTask(); + }} + > + setNewTitle(e.target.value)} + disabled={busy} + /> + +
+ + {tagIds.length > 1 &&

Matching any selected tag

} + {catalog.status === "error" && ( +

+ Tags: {catalog.error.message} +

+ )} +
+
+ {untagged ? ( + + ) : activeTags.length ? ( + t._qx.ref)} /> + ) : ( + + )} +
+
+ {selected ? ( + <> +
+ + Open separately ↗ +
+ {/* The queried relation explicitly targets atom Task; query refs carry its TaskData view. */} + } + tagChoices={choices} + style={{ flex: 1, minHeight: 0, height: "100%" }} + /> + + ) : ( +
Select a task to edit it or view completion history.
+ )} +
+
+
+ Tags & project totals +
+
+

Tags

+ {tags.map((tag) => ( +
+ { + void editTag(tag, "color", e.target.value); + }} + /> + { + if (e.target.value !== tag.name) void editTag(tag, "name", e.target.value); + }} + /> +
+ ))} +
{ + e.preventDefault(); + void run(async () => { + await (await actions())["addTag.call"](newTag); + setNewTag(""); + }); + }} + > + setNewTag(e.target.value)} + /> + +
+
+
+

Project totals

+ {summary.status === "error" &&

{summary.error.message}

} + {totals?.groups.entries.map((row) => ( +

+ {row.group.status.toLowerCase()}: {String(row.aggregate.count)} ·{" "} + {row.aggregate.sum.estimatedHours ?? 0}h estimated +

+ ))} +

Open tasks by tag

+ {totals?.filter.expand.tags.groups.entries.map((row) => ( +

+ + {row.group.target.name}: {String(row.aggregate.count)} · {row.aggregate.sum.source.estimatedHours ?? 0}h +

+ ))} + A task can contribute to more than one tag. Project totals count each task once. +
+
+
+
+ ); +} diff --git a/src/project-react.impl.ts b/src/project-react.impl.ts new file mode 100644 index 0000000..566572b --- /dev/null +++ b/src/project-react.impl.ts @@ -0,0 +1,13 @@ +import componentSource from "./project-component.js?browser-source"; +import type { Contexts, Results } from "./gen/qx.js"; + +export const source = () => componentSource; +export const createComponent = ({ objectId }: Contexts["createComponent"]) => objectId; +export const props = { + kind: "derived" as const, + get: async ({ ports }: Contexts["propsGet"]): Promise => ({ + named: ports.named.objectId, + tasks: ports.tasks.objectId, + }), +}; +export const stopWatch = () => null; diff --git a/src/server.ts b/src/server.ts new file mode 100644 index 0000000..6f3b5f8 --- /dev/null +++ b/src/server.ts @@ -0,0 +1,17 @@ +// Generated by qx-scaffold-v1 +import { servePackageRuntime } from "@quixos/camino-package-runtime"; +import { createRuntime } from "./gen/qx.js"; +import { handler as impl0 } from "./impl/createComponent.js"; +import { handler as impl1 } from "./impl/sourceGet.js"; +import { handler as impl2 } from "./impl/propsGet.js"; +import { handler as impl3 } from "./impl/propsWatch.js"; +import { handler as impl4 } from "./impl/propsWatchStop.js"; +servePackageRuntime( + createRuntime({ + createComponent: impl0, + sourceGet: impl1, + propsGet: impl2, + propsWatch: impl3, + propsWatchStop: impl4, + }), +); diff --git a/src/tracker.css b/src/tracker.css new file mode 100644 index 0000000..c137576 --- /dev/null +++ b/src/tracker.css @@ -0,0 +1,276 @@ +.tt-board { + height: 100%; + min-height: 360px; + min-width: 0; + display: flex; + flex-direction: column; + overflow: hidden; + background: #fcfcf8; + color: #27372d; + font: + 14px/1.45 system-ui, + sans-serif; + container-type: inline-size; +} +.tt-board * { + box-sizing: border-box; +} +.tt-board button, +.tt-board input, +.tt-board select { + font: inherit; + color: inherit; + border: 1px solid #ced8cb; + border-radius: 7px; + background: #fff; + padding: 8px 11px; + min-width: 0; +} +.tt-board button { + cursor: pointer; +} +.tt-board button:hover { + background: #eef3e9; +} +.tt-board button:disabled { + opacity: 0.55; + cursor: wait; +} +.tt-board button[aria-pressed="true"] { + background: #e2eedb; + border-color: #789569; +} +.tt-board :focus-visible { + outline: 2px solid #42765a; + outline-offset: 2px; +} +.tt-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + padding: 18px 20px 8px; +} +.tt-header input { + font-size: 22px; + font-weight: 650; + border-color: transparent; + background: transparent; + flex: 1; +} +.tt-header span, +.tt-row-meta, +.tt-filter-note, +.tt-management small { + color: #647064; + font-size: 12px; +} +.tt-add { + display: flex; + gap: 8px; + padding: 10px 20px; +} +.tt-add input { + flex: 1; +} +.tt-filters { + display: flex; + align-items: center; + gap: 6px; + flex-wrap: wrap; + padding: 8px 20px 14px; + border-bottom: 1px solid #dce2d7; + max-height: 160px; + overflow: auto; +} +.tt-filters button { + font-size: 12px; + padding: 5px 9px; +} +.tt-board i { + display: inline-block; + width: 9px; + height: 9px; + border-radius: 50%; + margin-right: 6px; + flex: none; +} +.tt-filter-note { + margin: 5px 20px; +} +.tt-body { + display: grid; + grid-template-columns: minmax(220px, 2fr) minmax(280px, 3fr); + flex: 1; + min-height: 0; + overflow: hidden; +} +.tt-list { + display: flex; + flex-direction: column; + min-height: 0; + min-width: 0; + border-right: 1px solid #dce2d7; +} +.tt-rows { + overflow: auto; + min-height: 0; + flex: 1; + display: flex; + flex-direction: column; + align-items: stretch; +} +.tt-board .tt-row { + display: flex; + gap: 10px; + text-align: left; + flex: none; + width: 100%; + height: auto; + border: 0; + border-bottom: 1px solid #e4e9df; + border-radius: 0; + padding: 14px 18px; + background: transparent; +} +.tt-board .tt-row.is-selected { + background: #eaf1e4; + box-shadow: inset 3px 0 #557a46; +} +.tt-row-body { + display: flex; + flex-direction: column; + gap: 4px; + min-width: 0; + flex: 1; +} +.tt-row strong { + overflow-wrap: anywhere; + font-size: 14px; + font-weight: 600; +} +.tt-status { + font-size: 20px; + line-height: 1.2; + color: #62804f; +} +.tt-tag-line { + display: flex; + gap: 5px; + flex-wrap: wrap; +} +.tt-tag { + background: #f1f3ed; + border: 1px solid #dce3d4; + border-radius: 4px; + font-size: 11px; + padding: 1px 5px; +} +.tt-page, +.tt-detail-bar { + display: flex; + justify-content: space-between; + gap: 10px; + padding: 8px 12px; + flex: none; + border-top: 1px solid #dce2d7; + font-size: 12px; +} +.tt-detail-bar { + border-top: 0; + border-bottom: 1px solid #dce2d7; + align-items: center; +} +.tt-detail-bar a { + color: #42694b; +} +.tt-detail { + display: flex; + flex-direction: column; + min-height: 0; + min-width: 0; + overflow: auto; + background: #fff; +} +.tt-empty, +.tt-notice { + padding: 24px; + color: #697568; +} +.tt-empty { + margin: auto; + text-align: center; + max-width: 300px; +} +.tt-error { + padding: 10px 20px; + background: #fff1ec; + color: #933d2f; + overflow-wrap: anywhere; +} +.tt-manage { + border-top: 1px solid #dce2d7; + flex: none; + max-height: 40%; + overflow: auto; + background: #f6f8f1; +} +.tt-manage summary { + padding: 10px 20px; + cursor: pointer; +} +.tt-management { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 24px; + padding: 0 20px 18px; +} +.tt-management h3 { + font-size: 14px; +} +.tt-management h4 { + margin-bottom: 5px; +} +.tt-management p { + margin: 5px 0; + font-size: 13px; +} +.tt-management .tt-add { + padding: 10px 0; +} +.tt-tag-edit { + display: flex; + gap: 8px; + margin: 6px 0; +} +.tt-tag-edit input[type="color"] { + width: 40px; + padding: 3px; + height: 35px; +} +.tt-tag-edit input:not([type="color"]) { + flex: 1; +} +@container (max-width:650px) { + .tt-body { + grid-template-columns: 1fr; + } + .tt-body:not(.has-detail) .tt-detail, + .tt-body.has-detail .tt-list { + display: none; + } + .tt-management { + grid-template-columns: 1fr; + } + .tt-header { + padding: 10px; + } + .tt-header span { + display: none; + } + .tt-add, + .tt-filters { + padding-left: 12px; + padding-right: 12px; + } +} diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 0000000..5adb3bc --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "declaration": true, + "sourceMap": true + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..401e49f --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "preserveSymlinks": true, + "resolveJsonModule": true, + "types": ["node"], + "outDir": "dist", + "rootDir": "src", + "jsx": "react-jsx" + }, + "include": ["src/**/*.ts", "src/**/*.tsx"] +} diff --git a/yarn-project.nix b/yarn-project.nix new file mode 100644 index 0000000..bad1881 --- /dev/null +++ b/yarn-project.nix @@ -0,0 +1,180 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +{ lib, stdenv, nodejs, git, cacert, fetchurl, writeShellScript, writeShellScriptBin }: +{ src, overrideAttrs ? null, ... } @ args: + +let + + yarnBin = fetchurl { + url = "https://repo.yarnpkg.com/4.18.0/packages/yarnpkg-cli/bin/yarn.js"; + hash = "sha512-/Lhxb+fNDuzhQf/Bi5IZOp35IEwbqDGJwoiDUiP8C75kr0c7qw1emSen2utcryuwfrJ4fMkzjKBA6hJfKh8vfg=="; + }; + + cacheFolder = ".yarn/cache"; + lockfile = ./yarn.lock; + + # Call overrideAttrs on a derivation if a function is provided. + optionalOverride = fn: drv: + if fn == null then drv else drv.overrideAttrs fn; + + # Simple stub that provides the global yarn command. + yarn = writeShellScriptBin "yarn" '' + exec '${nodejs}/bin/node' '${yarnBin}' "$@" + ''; + + # Common attributes between Yarn derivations. + drvCommon = { + # Make sure the build uses the right Node.js version everywhere. + buildInputs = [ nodejs yarn ]; + # All dependencies should already be cached. + yarn_enable_network = "0"; + # Tell node-gyp to use the provided Node.js headers for native code builds. + npm_config_nodedir = nodejs; + }; + + # Comman variables that we set in a Nix build, but not in a Nix shell. + buildVars = '' + # Make Yarn produce friendlier logging for automated builds. + export CI=1 + # Tell node-pre-gyp to never fetch binaries / always build from source. + export npm_config_build_from_source=true + ''; + + # Create derivations for fetching dependencies. + cacheDrvs = let + in lib.mapAttrs (locator: { filename, hash }: stdenv.mkDerivation { + name = lib.strings.sanitizeDerivationName locator; + buildInputs = [ yarn git cacert ]; + buildCommand = '' + cd '${src}' + ${buildVars} + HOME="$TMP" yarn_enable_global_cache=false yarn_cache_folder="$TMP" \ + yarn nixify fetch ${lib.escapeShellArg locator} + # Because we change the cache dir, Yarn may generate a different name. + mv "$TMP/$(sed 's/-[^-]*\.[^-]*$//' <<< "$outputFilename")"-* $out + ''; + outputFilename = filename; + outputHash = hash; + }) cacheEntries; + + # Create a shell snippet to copy dependencies from a list of derivations. + mkCacheBuilderForDrvs = drvs: + writeShellScript "collect-yarn-cache" (lib.concatMapStrings (drv: '' + cp --reflink=auto ${drv} '${drv.outputFilename}' + '') drvs); + + # Main project derivation. + project = stdenv.mkDerivation (drvCommon // { + inherit src; + name = "@quixos/project-react-runtime"; + + configurePhase = '' + ${buildVars} + + # Copy over the Yarn cache. + rm -fr '${cacheFolder}' + mkdir -p '${cacheFolder}' + pushd '${cacheFolder}' > /dev/null + source ${mkCacheBuilderForDrvs (lib.attrValues cacheDrvs)} + popd > /dev/null + + # Yarn may need a writable home directory. + export yarn_global_folder="$TMP" + + # Ensure global cache is disabled. Cache must be part of our output. + touch .yarnrc.yml + sed -i -e '/^enableGlobalCache/d' .yarnrc.yml + echo 'enableGlobalCache: false' >> .yarnrc.yml + + # Some node-gyp calls may call out to npm, which could fail due to an + # read-only home dir. + export HOME="$TMP" + + # running preConfigure after the cache is populated allows for + # preConfigure to contain substituteInPlace for dependencies as well as the + # main project. This is necessary for native bindings that maybe have + # hardcoded values. + runHook preConfigure + + # Run normal Yarn install to complete dependency installation. + yarn install --immutable --immutable-cache + + runHook postConfigure + ''; + + buildPhase = '' + runHook preBuild + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + # Move the package contents to the output directory. + if grep -q '"workspaces"' package.json; then + # We can't use `yarn pack` in a workspace setup, because it only + # packages the outer workspace. + mkdir -p "$out/libexec" + mv $PWD "$out/libexec/$name" + else + # - If the package.json has a `files` field, only files matching those patterns are copied + # - Otherwise all files are copied. + yarn pack --out package.tgz + mkdir -p "$out/libexec/$name" + tar xzf package.tgz --directory "$out/libexec/$name" --strip-components=1 + + cp --reflink=auto .yarnrc* "$out/libexec/$name" + cp --reflink=auto ${lockfile} "$out/libexec/$name/yarn.lock" + cp --reflink=auto --recursive .yarn "$out/libexec/$name" + + # Copy the Yarn linker output into the package. + cp --reflink=auto --recursive node_modules "$out/libexec/$name" + fi + + cd "$out/libexec/$name" + + # Invoke a plugin internal command to setup binaries. + mkdir -p "$out/bin" + yarn nixify install-bin $out/bin + + # A package with node_modules doesn't need the cache + yarn cache clean + + runHook postInstall + ''; + + passthru = { + inherit nodejs; + yarn-freestanding = yarn; + yarn = writeShellScriptBin "yarn" '' + exec '${yarn}/bin/yarn' --cwd '${overriddenProject}/libexec/${overriddenProject.name}' "$@" + ''; + }; + }); + + overriddenProject = optionalOverride overrideAttrs project; + +cacheEntries = { +"@bufbuild/protobuf@npm:2.12.1" = { filename = "@bufbuild-protobuf-npm-2.12.1-d8afb467b3-2d40cfe4ec.zip"; hash = "sha512-LUDP5Ow7sOPwarLih3HcXcVm6qywVfvok9dWIbBAfQJy1I9ApJCtR97YOe1UFRThr3G7E68CSzrjbvDFbVbdqQ=="; }; +"@connectrpc/connect-node@npm:2.1.2" = { filename = "@connectrpc-connect-node-npm-2.1.2-021434d5d5-ba8b0c9384.zip"; hash = "sha512-uosMk4TDgps3eqeoJtwM1Qpgk1J9LscBRgSRKDYzbqlgSitazqQrEEd/i+RWnknd7WbKD8d/X1sCcDXgKeE+qQ=="; }; +"@connectrpc/connect@npm:2.1.2" = { filename = "@connectrpc-connect-npm-2.1.2-ab34825de3-4e15000890.zip"; hash = "sha512-ThUACJAjt1Lv1E+pQKWuHh+gDhvrxLoM7ScruTWSDYw7hbd0UOZErUQruMqaJ1sMFxNviWuo7/A2F4Ex2wHWFQ=="; }; +"@esbuild/linux-arm64@npm:0.25.12" = { filename = "@esbuild-linux-arm64-npm-0.25.12-a5aaa0e70e-10c0.zip"; hash = "sha512-tm9zhnNR4GZv4A+Sgbt9jdCJ0iGlzvYxGCaxaScbhFH14mX7QWJRYaCvFCZB1dseApmaq6mNwbilL0wJnbB8tw=="; }; +"@esbuild/linux-x64@npm:0.25.12" = { filename = "@esbuild-linux-x64-npm-0.25.12-07c7c22cce-10c0.zip"; hash = "sha512-U2QGT8ZIZN8q2WPSFDC32+sZGKgp49gvnHzIf/vKVR4xIzjcgBbjAIKI+FqfGBmGBWu8eCpS7lR9JDXdUHOFkw=="; }; +"@quixos/camino-package-runtime@https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=446fd4e36e9700cf27ce20b472a8d512133e9370" = { filename = "@quixos-camino-package-runtime-https-84d8fd5109-6d173f9220.zip"; hash = "sha512-bRc/kiD/ODsJqBNX4+RTqdsczILibHLhB+X8MckDCoK+j32c4Hszh87obb1Rwjb5o35aI0fzArQqCwK270zzlw=="; }; +"@types/node@npm:24.13.3" = { filename = "@types-node-npm-24.13.3-b512a0bbeb-a5bc08f49b.zip"; hash = "sha512-pbwI9JuVgdzcqQ4CzXcZejx5mECAdmSULlzVFhpVPU0q6AZPfjKUQQ10jX0Ji1wYSL5/pQwG8pxBk6sWvk5Z6w=="; }; +"@types/prop-types@npm:15.7.15" = { filename = "@types-prop-types-npm-15.7.15-cefe16a1fa-b59aad1ad1.zip"; hash = "sha512-tZqtGtGb8XM89ST9TmGBlsbHaQ9I7nCjJ+tFCkKquOigY/vlnKClcBrr4tktWCKSwPuEXqV0dPahX2mUsOJgsg=="; }; +"@types/react@npm:18.3.31" = { filename = "@types-react-npm-18.3.31-d376eb19a5-44180549dd.zip"; hash = "sha512-RBgFSd0EX1Nuzs0545qs34KOdq3BxKkLEy9FPiPMNwxGSNkQKuQBFy69j9ixl3qQGjniFOU+x3FxsnUUtYjBeQ=="; }; +"@typescript/typescript-linux-arm64@npm:7.0.2" = { filename = "@typescript-typescript-linux-arm64-npm-7.0.2-9cacfc53a0-10c0.zip"; hash = "sha512-s4c7nGT/lQIw6x0IfrL0b3ECy/D0g7UoDLdiIWJoM6EGXk5N/dmXdxUdA8Cr3hV/3nO2BYKTQ6Ai8/zGhiSQ3A=="; }; +"@typescript/typescript-linux-x64@npm:7.0.2" = { filename = "@typescript-typescript-linux-x64-npm-7.0.2-8dd7ff8d24-10c0.zip"; hash = "sha512-k9EUK5CZ3OOPnyslp8SAAonHJpnpPmlaulppI/NmFyCzNs3UN/TLPUkyQia3KIxgbyTzKoXI5L5fl8Uj9bJ7Cg=="; }; +"csstype@npm:3.2.3" = { filename = "csstype-npm-3.2.3-741053244e-cd29c51e70.zip"; hash = "sha512-zSnFHnD6gi8c7NhkGhRFvtcGNpdGnTVjO1FuYP6MG94EsI9sW2AiE2u2abZMY9QXOvVIZFEPu07iMoGAGEGjzg=="; }; +"esbuild@npm:0.25.12" = { filename = "esbuild-npm-0.25.12-352393c4bd-c205357531.zip"; hash = "sha512-wgU1dTFCMiCp3o4ebGUUJCvJsWZudizWfM34/f3D8dC9dvjZODlYuXrUyVPv23tujB+cpZUc0rfFI16HVbNKaw=="; }; +"js-tokens@npm:4.0.0" = { filename = "js-tokens-npm-4.0.0-0ac852e9e2-e248708d37.zip"; hash = "sha512-4khwjTd6oFjqzyA3sH3thHeQ5t6JK7rT2sCrui51nLnxIbAAmaZRlWFrrctuyo0U2XXLPonrHP2mRHVkAsiu7Q=="; }; +"loose-envify@npm:1.4.0" = { filename = "loose-envify-npm-1.4.0-6307b72ccf-655d110220.zip"; hash = "sha512-ZV0RAiCYPBpLnAxnmi6AFtS2f26ce1Q1/1l57Nsg0IE/TewKCGdPy91IRqPwftu1CjaBH9N5MLlKqg2drOsBfg=="; }; +"react@npm:18.3.1" = { filename = "react-npm-18.3.1-af38f3c1ae-283e8c5efc.zip"; hash = "sha512-KD6MXvzzeALJ0c52fzAt1Wndl6cNm7jHvnmnibmQJFHg0WM0sF1zKZsg8EjLw8fSiLu94QtwH6GU4gicI32+ow=="; }; +"typescript@npm:7.0.2" = { filename = "typescript-npm-7.0.2-0bde2bcec5-3dcee51ec8.zip"; hash = "sha512-Pc7lHsjDMkkjJbzb999ItmZodR8SfmIq59QbbHFusZGEQkpF4U93UPUPNAIyOItp5ih4WRVfBqXOLfdvEssxzw=="; }; +"typescript@patch:typescript@npm%3A7.0.2#optional!builtin::version=7.0.2&hash=3bafbf" = { filename = "typescript-patch-4859cbaf66-6b3cdc369c.zip"; hash = "sha512-azzcNpzYKdRuAHNOpkIz7oRBnCglrY/kCJFa3ed6vO1LeiQB9+7VF9VKek9dHBhpdTy5kBjfHCFZx2HZ8zSDpg=="; }; +"undici-types@npm:7.18.2" = { filename = "undici-types-npm-7.18.2-3e6d69d829-85a7918911.zip"; hash = "sha512-haeRiRE6I4lZ16ZHNo5PfFVZw6QE69uPxEiBRc6UJvzYIlKoRKMCeY38Djfm+xeP9IHtA7xMr2NMV1fZ70NSHQ=="; }; +}; + +in overriddenProject diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..521add6 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,678 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 10 + cacheKey: 10c0 + +"@bufbuild/protobuf@npm:^2.12.1": + version: 2.12.1 + resolution: "@bufbuild/protobuf@npm:2.12.1" + checksum: 10c0/2d40cfe4ec3bb0e3f06ab2e28771dc5dc566eaacb055fbe893d75621b0407d0272d48f40a490ad47ded839ed541514e1af71bb13af024b3ae36ef0c56d56dda9 + languageName: node + linkType: hard + +"@connectrpc/connect-node@npm:^2.1.2": + version: 2.1.2 + resolution: "@connectrpc/connect-node@npm:2.1.2" + peerDependencies: + "@bufbuild/protobuf": ^2.7.0 + "@connectrpc/connect": 2.1.2 + checksum: 10c0/ba8b0c9384c3829b377aa7a826dc0cd50a6093527d2ec7014604912836336ea9604a2b5acea42b10477f8be4569e49dded66ca0fc77f5f5b027035e029e13ea9 + languageName: node + linkType: hard + +"@connectrpc/connect@npm:^2.1.2": + version: 2.1.2 + resolution: "@connectrpc/connect@npm:2.1.2" + peerDependencies: + "@bufbuild/protobuf": ^2.7.0 + checksum: 10c0/4e1500089023b752efd44fa940a5ae1e1fa00e1bebc4ba0ced272bb935920d8c3b85b77450e644ad442bb8ca9a275b0c17136f896ba8eff036178131db01d615 + languageName: node + linkType: hard + +"@esbuild/aix-ppc64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/aix-ppc64@npm:0.25.12" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/android-arm64@npm:0.25.12" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/android-arm@npm:0.25.12" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/android-x64@npm:0.25.12" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/darwin-arm64@npm:0.25.12" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/darwin-x64@npm:0.25.12" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/freebsd-arm64@npm:0.25.12" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/freebsd-x64@npm:0.25.12" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-arm64@npm:0.25.12" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-arm@npm:0.25.12" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-ia32@npm:0.25.12" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-loong64@npm:0.25.12" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-mips64el@npm:0.25.12" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-ppc64@npm:0.25.12" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-riscv64@npm:0.25.12" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-s390x@npm:0.25.12" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-x64@npm:0.25.12" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-arm64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/netbsd-arm64@npm:0.25.12" + conditions: os=netbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/netbsd-x64@npm:0.25.12" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-arm64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/openbsd-arm64@npm:0.25.12" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/openbsd-x64@npm:0.25.12" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openharmony-arm64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/openharmony-arm64@npm:0.25.12" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/sunos-x64@npm:0.25.12" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/win32-arm64@npm:0.25.12" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/win32-ia32@npm:0.25.12" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/win32-x64@npm:0.25.12" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@quixos/camino-package-runtime@https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=446fd4e36e9700cf27ce20b472a8d512133e9370": + version: 0.1.0 + resolution: "@quixos/camino-package-runtime@https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=446fd4e36e9700cf27ce20b472a8d512133e9370" + dependencies: + "@bufbuild/protobuf": "npm:^2.12.1" + "@connectrpc/connect": "npm:^2.1.2" + "@connectrpc/connect-node": "npm:^2.1.2" + checksum: 10c0/6d173f9220ff383b09a81357e3e453a9db1ccc82e26c72e107e5fc31c9030a82be8f7d9ce07b3387cee86dbd51c236f9a37e5a2347f302b42a0b02b6ef4cf397 + languageName: node + linkType: hard + +"@quixos/project-react-runtime@workspace:.": + version: 0.0.0-use.local + resolution: "@quixos/project-react-runtime@workspace:." + dependencies: + "@quixos/camino-package-runtime": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=446fd4e36e9700cf27ce20b472a8d512133e9370" + "@types/node": "npm:^24" + "@types/react": "npm:^18.3.12" + esbuild: "npm:^0.25.12" + react: "npm:^18.3.1" + typescript: "npm:^7.0.2" + bin: + server: dist/server.js + languageName: unknown + linkType: soft + +"@types/node@npm:^24": + version: 24.13.3 + resolution: "@types/node@npm:24.13.3" + dependencies: + undici-types: "npm:~7.18.0" + checksum: 10c0/a5bc08f49b9581dcdca90e02cd77197a3c799840807664942e5cd5161a553d4d2ae8064f7e3294410d748d7d098b5c1848be7fa50c06f29c4193ab16be4e59eb + languageName: node + linkType: hard + +"@types/prop-types@npm:*": + version: 15.7.15 + resolution: "@types/prop-types@npm:15.7.15" + checksum: 10c0/b59aad1ad19bf1733cf524fd4e618196c6c7690f48ee70a327eb450a42aab8e8a063fbe59ca0a5701aebe2d92d582292c0fb845ea57474f6a15f6994b0e260b2 + languageName: node + linkType: hard + +"@types/react@npm:^18.3.12": + version: 18.3.31 + resolution: "@types/react@npm:18.3.31" + dependencies: + "@types/prop-types": "npm:*" + csstype: "npm:^3.2.2" + checksum: 10c0/44180549dd045f536ececd39e39aacdf828e76adc1c4a90b132f453e23cc370c4648d9102ae401172ebd8fd8b1977a901a39e214e53ec77171b27514b588c179 + languageName: node + linkType: hard + +"@typescript/typescript-aix-ppc64@npm:7.0.2": + version: 7.0.2 + resolution: "@typescript/typescript-aix-ppc64@npm:7.0.2" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@typescript/typescript-darwin-arm64@npm:7.0.2": + version: 7.0.2 + resolution: "@typescript/typescript-darwin-arm64@npm:7.0.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@typescript/typescript-darwin-x64@npm:7.0.2": + version: 7.0.2 + resolution: "@typescript/typescript-darwin-x64@npm:7.0.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@typescript/typescript-freebsd-arm64@npm:7.0.2": + version: 7.0.2 + resolution: "@typescript/typescript-freebsd-arm64@npm:7.0.2" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@typescript/typescript-freebsd-x64@npm:7.0.2": + version: 7.0.2 + resolution: "@typescript/typescript-freebsd-x64@npm:7.0.2" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@typescript/typescript-linux-arm64@npm:7.0.2": + version: 7.0.2 + resolution: "@typescript/typescript-linux-arm64@npm:7.0.2" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@typescript/typescript-linux-arm@npm:7.0.2": + version: 7.0.2 + resolution: "@typescript/typescript-linux-arm@npm:7.0.2" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@typescript/typescript-linux-loong64@npm:7.0.2": + version: 7.0.2 + resolution: "@typescript/typescript-linux-loong64@npm:7.0.2" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@typescript/typescript-linux-mips64el@npm:7.0.2": + version: 7.0.2 + resolution: "@typescript/typescript-linux-mips64el@npm:7.0.2" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@typescript/typescript-linux-ppc64@npm:7.0.2": + version: 7.0.2 + resolution: "@typescript/typescript-linux-ppc64@npm:7.0.2" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@typescript/typescript-linux-riscv64@npm:7.0.2": + version: 7.0.2 + resolution: "@typescript/typescript-linux-riscv64@npm:7.0.2" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@typescript/typescript-linux-s390x@npm:7.0.2": + version: 7.0.2 + resolution: "@typescript/typescript-linux-s390x@npm:7.0.2" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@typescript/typescript-linux-x64@npm:7.0.2": + version: 7.0.2 + resolution: "@typescript/typescript-linux-x64@npm:7.0.2" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@typescript/typescript-netbsd-arm64@npm:7.0.2": + version: 7.0.2 + resolution: "@typescript/typescript-netbsd-arm64@npm:7.0.2" + conditions: os=netbsd & cpu=arm64 + languageName: node + linkType: hard + +"@typescript/typescript-netbsd-x64@npm:7.0.2": + version: 7.0.2 + resolution: "@typescript/typescript-netbsd-x64@npm:7.0.2" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@typescript/typescript-openbsd-arm64@npm:7.0.2": + version: 7.0.2 + resolution: "@typescript/typescript-openbsd-arm64@npm:7.0.2" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + +"@typescript/typescript-openbsd-x64@npm:7.0.2": + version: 7.0.2 + resolution: "@typescript/typescript-openbsd-x64@npm:7.0.2" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@typescript/typescript-sunos-x64@npm:7.0.2": + version: 7.0.2 + resolution: "@typescript/typescript-sunos-x64@npm:7.0.2" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@typescript/typescript-win32-arm64@npm:7.0.2": + version: 7.0.2 + resolution: "@typescript/typescript-win32-arm64@npm:7.0.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@typescript/typescript-win32-x64@npm:7.0.2": + version: 7.0.2 + resolution: "@typescript/typescript-win32-x64@npm:7.0.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"csstype@npm:^3.2.2": + version: 3.2.3 + resolution: "csstype@npm:3.2.3" + checksum: 10c0/cd29c51e70fa822f1cecd8641a1445bed7063697469d35633b516e60fe8c1bde04b08f6c5b6022136bb669b64c63d4173af54864510fbb4ee23281801841a3ce + languageName: node + linkType: hard + +"esbuild@npm:^0.25.12": + version: 0.25.12 + resolution: "esbuild@npm:0.25.12" + dependencies: + "@esbuild/aix-ppc64": "npm:0.25.12" + "@esbuild/android-arm": "npm:0.25.12" + "@esbuild/android-arm64": "npm:0.25.12" + "@esbuild/android-x64": "npm:0.25.12" + "@esbuild/darwin-arm64": "npm:0.25.12" + "@esbuild/darwin-x64": "npm:0.25.12" + "@esbuild/freebsd-arm64": "npm:0.25.12" + "@esbuild/freebsd-x64": "npm:0.25.12" + "@esbuild/linux-arm": "npm:0.25.12" + "@esbuild/linux-arm64": "npm:0.25.12" + "@esbuild/linux-ia32": "npm:0.25.12" + "@esbuild/linux-loong64": "npm:0.25.12" + "@esbuild/linux-mips64el": "npm:0.25.12" + "@esbuild/linux-ppc64": "npm:0.25.12" + "@esbuild/linux-riscv64": "npm:0.25.12" + "@esbuild/linux-s390x": "npm:0.25.12" + "@esbuild/linux-x64": "npm:0.25.12" + "@esbuild/netbsd-arm64": "npm:0.25.12" + "@esbuild/netbsd-x64": "npm:0.25.12" + "@esbuild/openbsd-arm64": "npm:0.25.12" + "@esbuild/openbsd-x64": "npm:0.25.12" + "@esbuild/openharmony-arm64": "npm:0.25.12" + "@esbuild/sunos-x64": "npm:0.25.12" + "@esbuild/win32-arm64": "npm:0.25.12" + "@esbuild/win32-ia32": "npm:0.25.12" + "@esbuild/win32-x64": "npm:0.25.12" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-arm64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-arm64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/openharmony-arm64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/c205357531423220a9de8e1e6c6514242bc9b1666e762cd67ccdf8fdfdc3f1d0bd76f8d9383958b97ad4c953efdb7b6e8c1f9ca5951cd2b7c5235e8755b34a6b + languageName: node + linkType: hard + +"js-tokens@npm:^3.0.0 || ^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed + languageName: node + linkType: hard + +"loose-envify@npm:^1.1.0": + version: 1.4.0 + resolution: "loose-envify@npm:1.4.0" + dependencies: + js-tokens: "npm:^3.0.0 || ^4.0.0" + bin: + loose-envify: cli.js + checksum: 10c0/655d110220983c1a4b9c0c679a2e8016d4b67f6e9c7b5435ff5979ecdb20d0813f4dec0a08674fcbdd4846a3f07edbb50a36811fd37930b94aaa0d9daceb017e + languageName: node + linkType: hard + +"react@npm:^18.3.1": + version: 18.3.1 + resolution: "react@npm:18.3.1" + dependencies: + loose-envify: "npm:^1.1.0" + checksum: 10c0/283e8c5efcf37802c9d1ce767f302dd569dd97a70d9bb8c7be79a789b9902451e0d16334b05d73299b20f048cbc3c7d288bbbde10b701fa194e2089c237dbea3 + languageName: node + linkType: hard + +"typescript@npm:^7.0.2": + version: 7.0.2 + resolution: "typescript@npm:7.0.2" + dependencies: + "@typescript/typescript-aix-ppc64": "npm:7.0.2" + "@typescript/typescript-darwin-arm64": "npm:7.0.2" + "@typescript/typescript-darwin-x64": "npm:7.0.2" + "@typescript/typescript-freebsd-arm64": "npm:7.0.2" + "@typescript/typescript-freebsd-x64": "npm:7.0.2" + "@typescript/typescript-linux-arm": "npm:7.0.2" + "@typescript/typescript-linux-arm64": "npm:7.0.2" + "@typescript/typescript-linux-loong64": "npm:7.0.2" + "@typescript/typescript-linux-mips64el": "npm:7.0.2" + "@typescript/typescript-linux-ppc64": "npm:7.0.2" + "@typescript/typescript-linux-riscv64": "npm:7.0.2" + "@typescript/typescript-linux-s390x": "npm:7.0.2" + "@typescript/typescript-linux-x64": "npm:7.0.2" + "@typescript/typescript-netbsd-arm64": "npm:7.0.2" + "@typescript/typescript-netbsd-x64": "npm:7.0.2" + "@typescript/typescript-openbsd-arm64": "npm:7.0.2" + "@typescript/typescript-openbsd-x64": "npm:7.0.2" + "@typescript/typescript-sunos-x64": "npm:7.0.2" + "@typescript/typescript-win32-arm64": "npm:7.0.2" + "@typescript/typescript-win32-x64": "npm:7.0.2" + dependenciesMeta: + "@typescript/typescript-aix-ppc64": + optional: true + "@typescript/typescript-darwin-arm64": + optional: true + "@typescript/typescript-darwin-x64": + optional: true + "@typescript/typescript-freebsd-arm64": + optional: true + "@typescript/typescript-freebsd-x64": + optional: true + "@typescript/typescript-linux-arm": + optional: true + "@typescript/typescript-linux-arm64": + optional: true + "@typescript/typescript-linux-loong64": + optional: true + "@typescript/typescript-linux-mips64el": + optional: true + "@typescript/typescript-linux-ppc64": + optional: true + "@typescript/typescript-linux-riscv64": + optional: true + "@typescript/typescript-linux-s390x": + optional: true + "@typescript/typescript-linux-x64": + optional: true + "@typescript/typescript-netbsd-arm64": + optional: true + "@typescript/typescript-netbsd-x64": + optional: true + "@typescript/typescript-openbsd-arm64": + optional: true + "@typescript/typescript-openbsd-x64": + optional: true + "@typescript/typescript-sunos-x64": + optional: true + "@typescript/typescript-win32-arm64": + optional: true + "@typescript/typescript-win32-x64": + optional: true + bin: + tsc: bin/tsc + checksum: 10c0/3dcee51ec8c332492325bcdbf7df48b66668751f127e622ae7d41b6c716eb19184424a45e14f7750f50f340232388b69e6287859155f06a5ce2df76f12cb31cf + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A^7.0.2#optional!builtin": + version: 7.0.2 + resolution: "typescript@patch:typescript@npm%3A7.0.2#optional!builtin::version=7.0.2&hash=3bafbf" + dependencies: + "@typescript/typescript-aix-ppc64": "npm:7.0.2" + "@typescript/typescript-darwin-arm64": "npm:7.0.2" + "@typescript/typescript-darwin-x64": "npm:7.0.2" + "@typescript/typescript-freebsd-arm64": "npm:7.0.2" + "@typescript/typescript-freebsd-x64": "npm:7.0.2" + "@typescript/typescript-linux-arm": "npm:7.0.2" + "@typescript/typescript-linux-arm64": "npm:7.0.2" + "@typescript/typescript-linux-loong64": "npm:7.0.2" + "@typescript/typescript-linux-mips64el": "npm:7.0.2" + "@typescript/typescript-linux-ppc64": "npm:7.0.2" + "@typescript/typescript-linux-riscv64": "npm:7.0.2" + "@typescript/typescript-linux-s390x": "npm:7.0.2" + "@typescript/typescript-linux-x64": "npm:7.0.2" + "@typescript/typescript-netbsd-arm64": "npm:7.0.2" + "@typescript/typescript-netbsd-x64": "npm:7.0.2" + "@typescript/typescript-openbsd-arm64": "npm:7.0.2" + "@typescript/typescript-openbsd-x64": "npm:7.0.2" + "@typescript/typescript-sunos-x64": "npm:7.0.2" + "@typescript/typescript-win32-arm64": "npm:7.0.2" + "@typescript/typescript-win32-x64": "npm:7.0.2" + dependenciesMeta: + "@typescript/typescript-aix-ppc64": + optional: true + "@typescript/typescript-darwin-arm64": + optional: true + "@typescript/typescript-darwin-x64": + optional: true + "@typescript/typescript-freebsd-arm64": + optional: true + "@typescript/typescript-freebsd-x64": + optional: true + "@typescript/typescript-linux-arm": + optional: true + "@typescript/typescript-linux-arm64": + optional: true + "@typescript/typescript-linux-loong64": + optional: true + "@typescript/typescript-linux-mips64el": + optional: true + "@typescript/typescript-linux-ppc64": + optional: true + "@typescript/typescript-linux-riscv64": + optional: true + "@typescript/typescript-linux-s390x": + optional: true + "@typescript/typescript-linux-x64": + optional: true + "@typescript/typescript-netbsd-arm64": + optional: true + "@typescript/typescript-netbsd-x64": + optional: true + "@typescript/typescript-openbsd-arm64": + optional: true + "@typescript/typescript-openbsd-x64": + optional: true + "@typescript/typescript-sunos-x64": + optional: true + "@typescript/typescript-win32-arm64": + optional: true + "@typescript/typescript-win32-x64": + optional: true + bin: + tsc: bin/tsc + checksum: 10c0/6b3cdc369cd829d46e00734ea64233ee84419c2825ad8fe408915adde77abced4b7a2401f7eed517d54a7a4f5d1c1869753cb99018df1c2159c761d9f33483a6 + languageName: node + linkType: hard + +"undici-types@npm:~7.18.0": + version: 7.18.2 + resolution: "undici-types@npm:7.18.2" + checksum: 10c0/85a79189113a238959d7a647368e4f7c5559c3a404ebdb8fc4488145ce9426fcd82252a844a302798dfc0e37e6fb178ff481ed03bc4caf634c5757d9ef43521d + languageName: node + linkType: hard