commit ffeaf1af20d87c7b6a6065fedaa5c7f685e64490 Author: Quixos Template Publisher Date: Sat Jan 1 00:00:00 2000 +0000 Export template source from 1227e3672a5a24b7331567fc3f431e422e1513c1:quixos-instance/packages/todo-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..95ff0cc --- /dev/null +++ b/.quixos-template-source.json @@ -0,0 +1,4 @@ +{ + "monorepoCommit": "1227e3672a5a24b7331567fc3f431e422e1513c1", + "sourcePath": "quixos-instance/packages/todo-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..6c2b6c9 --- /dev/null +++ b/descriptor.quixos-package.txtpb @@ -0,0 +1,9 @@ +# Generated from the checked package contract +package_id: "package:todo-react-runtime" +package_revision_id: "package:todo-react-runtime@1" +runtime_protocol_version: "quixos-capabilities-v1" +exports: { export_id: "export:todo-react-runtime:create-component" runtime_symbol: "createComponent" } +exports: { export_id: "export:todo-react-runtime:source-get" runtime_symbol: "sourceGet" } +exports: { export_id: "export:todo-react-runtime:props-get" runtime_symbol: "propsGet" } +exports: { export_id: "export:todo-react-runtime:props-watch" runtime_symbol: "propsWatch" } +exports: { export_id: "export:todo-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..0df9c72 --- /dev/null +++ b/flake.nix @@ -0,0 +1,38 @@ +{ + description = "Quixos todo 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 = "todo-react-runtime"; + bundle = { + entry = "src/server.ts"; + browserSources = true; + }; + installServer = { + libexecName = "todo-react-runtime"; + descriptorPath = "descriptor.quixos-package.txtpb"; + }; + }; +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..db45484 --- /dev/null +++ b/package.json @@ -0,0 +1,24 @@ +{ + "name": "@quixos/todo-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=86933aa97f3ea386a4c5cfeb28386fd8d2722075" + }, + "devDependencies": { + "@types/node": "^24", + "@types/react": "^18.3.12", + "esbuild": "^0.25.12", + "react": "^18.3.1", + "typescript": "^7.0.2" + } +} diff --git a/package.qx b/package.qx new file mode 100644 index 0000000..c15255c --- /dev/null +++ b/package.qx @@ -0,0 +1,25 @@ +import interface TagData; +import interface CompletionData; +import interface TaskActions; +external atom Tag id "atom:tag"; +external atom Completion id "atom:completion"; +import interface TaskData; +external atom TaskReactComponent id "atom:task-react-component"; +external atom Task id "atom:task"; +type TaskProps = record {data: interface-ref;}; + +package TodoReactRuntime id "package:todo-react-runtime" revision "package:todo-react-runtime@1" { + constructor createComponent id "export:todo-react-runtime:create-component" constructs TaskReactComponent : atom-ref; + operation sourceGet id "export:todo-react-runtime:source-get" : unit -> string mode call receiver atom TaskReactComponent; + operation propsGet id "export:todo-react-runtime:props-get" : unit -> TaskProps mode call receiver atom TaskReactComponent requires { + interface data id "port:todo-react-runtime:data" : TaskData; + }; + operation propsWatch id "export:todo-react-runtime:props-watch" : unit -> watch-handle mode watch-start emits TaskProps receiver atom TaskReactComponent requires { + interface data id "port:todo-react-runtime:data" : TaskData; + }; + operation propsWatchStop id "export:todo-react-runtime:props-watch-stop" : watch-handle -> unit mode watch-stop receiver atom TaskReactComponent; + query History id "query:History" root TaskData document "queries/History.graphql" operation "History" { + view Tag as TagData; view Completion as CompletionData; + max rows 100; max depth 8; max result-bytes 1048576; watch; + } +} diff --git a/queries/History.graphql b/queries/History.graphql new file mode 100644 index 0000000..0163550 --- /dev/null +++ b/queries/History.graphql @@ -0,0 +1,13 @@ +query History($first: Int!, $after: Cursor) {root { + title @live + status @live + priority @live + notes @live + dueDate @live + energy @live + estimatedHours @live + repeatDays @live + tags(all: 100) {entries {node {_qx {ref} name color}}} + completions(first: $first, after: $after, orderBy: [{completedAt: DESC}]) {entries {key node {completedAt scheduledDate}} pageInfo {hasNextPage endCursor}} + _qx {relations {completions {aggregate {count}}}} +}} diff --git a/quixos.check.json b/quixos.check.json new file mode 100644 index 0000000..4d42900 --- /dev/null +++ b/quixos.check.json @@ -0,0 +1,10 @@ +{ + "backend": "typescript", + "bindingOutput": "src/gen/qx.ts", + "options": { + "react": { + "propsExports": ["propsGet"], + "components": [{ "module": "../todo-component.js", "propsExport": "propsGet" }] + } + } +} diff --git a/quixos.lock b/quixos.lock new file mode 100644 index 0000000..9bf358c --- /dev/null +++ b/quixos.lock @@ -0,0 +1,22 @@ +quixos-lock version 1 { + quixos source { + repository "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos.git"; + commit "1227e3672a5a24b7331567fc3f431e422e1513c1"; + } + interface TaskData source { + repository "https://repos.quixos.org/quixos-todo/interface-task-data.git"; + commit "0000000000000000000000000000000000000011"; + } + 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 TaskActions source { + repository "https://repos.quixos.org/quixos-todo/interface-task-actions.git"; + commit "0000000000000000000000000000000000000014"; + } +} 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.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..18c6e14 --- /dev/null +++ b/src/gen/qx.ts @@ -0,0 +1,835 @@ +// 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:todo-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:task-react-component">; "input": QxObjectRef<"atom:atom:task">; "ports": { } } & QxContextLifecycle<{ "conform": QxConformer; "objectId": QxObjectRef<"atom:atom:task-react-component">; "input": QxObjectRef<"atom:atom:task">; "ports": { } } & {signal?: AbortSignal}>; "propsGet": { "conform": QxConformer; "objectId": QxObjectRef<"atom:atom:task-react-component">; "input": null; "ports": { "data": { "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 }> } } } & QxContextLifecycle<{ "conform": QxConformer; "objectId": QxObjectRef<"atom:atom:task-react-component">; "input": null; "ports": { "data": { "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 }> } } } & {signal?: AbortSignal}>; "propsWatch": { "conform": QxConformer; "objectId": QxObjectRef<"atom:atom:task-react-component">; "input": null; "ports": { "data": { "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 }> } } } & QxContextLifecycle<{ "conform": QxConformer; "objectId": QxObjectRef<"atom:atom:task-react-component">; "input": null; "ports": { "data": { "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 }> } } } & {signal?: AbortSignal}>; "propsWatchStop": { "conform": QxConformer; "objectId": QxObjectRef<"atom:atom:task-react-component">; "input": QxWatchHandle; "ports": { } } & QxContextLifecycle<{ "conform": QxConformer; "objectId": QxObjectRef<"atom:atom:task-react-component">; "input": QxWatchHandle; "ports": { } } & {signal?: AbortSignal}>; "sourceGet": { "conform": QxConformer; "objectId": QxObjectRef<"atom:atom:task-react-component">; "input": null; "ports": { } } & QxContextLifecycle<{ "conform": QxConformer; "objectId": QxObjectRef<"atom:atom:task-react-component">; "input": null; "ports": { } } & {signal?: AbortSignal}> }; +export type Results = { "createComponent": QxObjectRef<"atom:atom:task-react-component">; "propsGet": { "data": QxObjectRef<"interface:interface:task-data@1"> }; "propsWatch": { "data": QxObjectRef<"interface:interface:task-data@1"> }; "propsWatchStop": null; "sourceGet": string }; +export type Implementation = { "createComponent": QxHandler>; "propsGet": QxHandler }> | QxDerived }>; "propsWatch": QxDerived }>; "propsWatchStop": QxHandler; "sourceGet": QxHandler | QxDerived }; +export type QueryVariables = { "History": { "first": number; "after": (string | null) } }; +export type QueryResults = { "History": { "root": { "title": string; "status": string; "priority": string; "notes": string; "dueDate": string; "energy": string; "estimatedHours": number; "repeatDays": number; "tags": { "entries": Array<{ "node": { "_qx": { "ref": QxObjectRef<"interface:interface:tag-data@1"> }; "name": string; "color": string } }> }; "completions": { "entries": Array<{ "key": string; "node": { "completedAt": number; "scheduledDate": string } }>; "pageInfo": { "hasNextPage": boolean; "endCursor": (string | null) } }; "_qx": { "relations": { "completions": { "aggregate": { "count": bigint } } } } } } }; +export const queries: { "History": QxQueryDescriptor } = { + "History": { + "id": "package:todo-react-runtime@1:query:History", + "definitionDigest": "53e9fea6191e828d0f79f9dac61cdd351ff700c26c87d9d97229dc7cdd58815d", + "rootInterfaceRevisionId": "interface:task-data@1", + "variables": { + "kind": "record", + "fields": { + "first": { + "kind": "scalar", + "name": "int32" + }, + "after": { + "kind": "optional", + "value": { + "kind": "scalar", + "name": "string" + } + } + } + }, + "output": { + "kind": "record", + "fields": { + "root": { + "kind": "record", + "fields": { + "title": { + "kind": "scalar", + "name": "string" + }, + "status": { + "kind": "scalar", + "name": "string" + }, + "priority": { + "kind": "scalar", + "name": "string" + }, + "notes": { + "kind": "scalar", + "name": "string" + }, + "dueDate": { + "kind": "scalar", + "name": "string" + }, + "energy": { + "kind": "scalar", + "name": "string" + }, + "estimatedHours": { + "kind": "scalar", + "name": "double" + }, + "repeatDays": { + "kind": "scalar", + "name": "int32" + }, + "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" + } + } + } + } + } + } + } + }, + "completions": { + "kind": "record", + "fields": { + "entries": { + "kind": "list", + "value": { + "kind": "record", + "fields": { + "key": { + "kind": "scalar", + "name": "string" + }, + "node": { + "kind": "record", + "fields": { + "completedAt": { + "kind": "scalar", + "name": "double" + }, + "scheduledDate": { + "kind": "scalar", + "name": "string" + } + } + } + } + } + }, + "pageInfo": { + "kind": "record", + "fields": { + "hasNextPage": { + "kind": "scalar", + "name": "bool" + }, + "endCursor": { + "kind": "optional", + "value": { + "kind": "scalar", + "name": "string" + } + } + } + } + } + }, + "_qx": { + "kind": "record", + "fields": { + "relations": { + "kind": "record", + "fields": { + "completions": { + "kind": "record", + "fields": { + "aggregate": { + "kind": "record", + "fields": { + "count": { + "kind": "scalar", + "name": "uint64" + } + } + } + } + } + } + } + } + } + } + } + } + }, + "watch": true + } +} as const; +export const contracts = {"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: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-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"}}})}; +export const interfaces = {"TaskData": contracts["interface:task-data@1"], +"TagData": contracts["interface:tag-data@1"], +"CompletionData": contracts["interface:completion-data@1"], +"TaskActions": contracts["interface:task-actions@1"]}; +const messages = { } satisfies QxMessages; +const specs = { + "createComponent": { + "inputType": { + "kind": "object-ref", + "expectation": { + "kind": "atom", + "atomId": "atom:task" + } + }, + "outputType": { + "kind": "object-ref", + "expectation": { + "kind": "atom", + "atomId": "atom:task-react-component" + } + }, + "ports": {} + }, + "propsGet": { + "inputType": { + "kind": "builtin", + "name": "unit" + }, + "outputType": { + "kind": "record", + "fields": { + "data": { + "kind": "object-ref", + "expectation": { + "kind": "interface", + "interfaceRevisionId": "interface:task-data@1" + } + } + } + }, + "ports": { + "data": { + "kind": "interface", + "id": "port:todo-react-runtime:data", + "interfaceRevisionId": "interface:task-data@1", + "operations": { + "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" + } + } + } + } + } + }, + "propsWatch": { + "inputType": { + "kind": "builtin", + "name": "unit" + }, + "outputType": { + "kind": "builtin", + "name": "watch-handle" + }, + "eventType": { + "kind": "record", + "fields": { + "data": { + "kind": "object-ref", + "expectation": { + "kind": "interface", + "interfaceRevisionId": "interface:task-data@1" + } + } + } + }, + "ports": { + "data": { + "kind": "interface", + "id": "port:todo-react-runtime:data", + "interfaceRevisionId": "interface:task-data@1", + "operations": { + "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" + } + } + } + } + } + }, + "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:todo-react-runtime:create-component": bindQxHandler(specs["createComponent"], implementation["createComponent"], messages), + "export:todo-react-runtime:props-get": bindQxHandler(specs["propsGet"], implementation["propsGet"], messages), + "export:todo-react-runtime:props-watch": bindQxHandler(specs["propsWatch"], implementation["propsWatch"], messages), + "export:todo-react-runtime:props-watch-stop": bindQxHandler(specs["propsWatchStop"], implementation["propsWatchStop"], messages), + "export:todo-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..9ba8500 --- /dev/null +++ b/src/gen/react-props.gen.ts @@ -0,0 +1,22 @@ +// 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: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 Interface1 = InterfaceReference<"interface:tag-data@1", {"name": WritableField;"color": WritableField}> ; +export type Interface2 = InterfaceReference<"interface:completion-data@1", {"completedAt": WritableField;"scheduledDate": WritableField}> ; +export type Interface3 = InterfaceReference<"interface:task-actions@1", {}> ; +export type ReactResults = {"propsGet": {"data": Interface0}}; +export type QueryVariables = {"History": {"first": number;"after": (string | null)}}; +export type QueryResults = {"History": {"root": {"title": WritableField;"status": WritableField;"priority": WritableField;"notes": WritableField;"dueDate": WritableField;"energy": WritableField;"estimatedHours": WritableField;"repeatDays": WritableField;"tags": {"entries": Array<{"node": {"_qx": {"ref": QueryReference<"interface:tag-data@1">};"name": string;"color": string}}>};"completions": {"entries": Array<{"key": string;"node": {"completedAt": number;"scheduledDate": string}}>;"pageInfo": {"hasNextPage": boolean;"endCursor": (string | null)}};"_qx": {"relations": {"completions": {"aggregate": {"count": bigint}}}}}}}; +export const queries: {"History": QueryDescriptor} = {"History":{"id":"package:todo-react-runtime@1:query:History","definitionDigest":"53e9fea6191e828d0f79f9dac61cdd351ff700c26c87d9d97229dc7cdd58815d","rootInterfaceRevisionId":"interface:task-data@1","variables":{"kind":"record","fields":{"first":{"kind":"scalar","name":"int32"},"after":{"kind":"optional","value":{"kind":"scalar","name":"string"}}}},"output":{"kind":"record","fields":{"root":{"kind":"record","fields":{"title":{"kind":"scalar","name":"string"},"status":{"kind":"scalar","name":"string"},"priority":{"kind":"scalar","name":"string"},"notes":{"kind":"scalar","name":"string"},"dueDate":{"kind":"scalar","name":"string"},"energy":{"kind":"scalar","name":"string"},"estimatedHours":{"kind":"scalar","name":"double"},"repeatDays":{"kind":"scalar","name":"int32"},"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"}}}}}}}},"completions":{"kind":"record","fields":{"entries":{"kind":"list","value":{"kind":"record","fields":{"key":{"kind":"scalar","name":"string"},"node":{"kind":"record","fields":{"completedAt":{"kind":"scalar","name":"double"},"scheduledDate":{"kind":"scalar","name":"string"}}}}}},"pageInfo":{"kind":"record","fields":{"hasNextPage":{"kind":"scalar","name":"bool"},"endCursor":{"kind":"optional","value":{"kind":"scalar","name":"string"}}}}}},"_qx":{"kind":"record","fields":{"relations":{"kind":"record","fields":{"completions":{"kind":"record","fields":{"aggregate":{"kind":"record","fields":{"count":{"kind":"scalar","name":"uint64"}}}}}}}}}}}}},"liveFields":[{"path":["root","title"],"selectionId":"98c92cf6f5df640db1861c0e737d7faf40beffcbd20ccce4f1e0255161dabdc2","interfaceRevisionId":"interface:task-data@1","getOperationId":"operation:task-data:title:get","setOperationId":"operation:task-data:title:set","watchOperationId":"operation:task-data:title:watch-start","inputKind":"value","valueType":{"kind":"scalar","name":"string"},"conditions":[]},{"path":["root","status"],"selectionId":"21fbc0c62103f693a9a2f301b50d4fc1186a44e514c2a0172ce1eca3f104906b","interfaceRevisionId":"interface:task-data@1","getOperationId":"operation:task-data:status:get","setOperationId":"operation:task-data:status:set","watchOperationId":"operation:task-data:status:watch-start","inputKind":"value","valueType":{"kind":"scalar","name":"string"},"conditions":[]},{"path":["root","priority"],"selectionId":"69520bbcbd5b75673b8e4211679f6b830720fe6facb11483da47bd1b8c4b2121","interfaceRevisionId":"interface:task-data@1","getOperationId":"operation:task-data:priority:get","setOperationId":"operation:task-data:priority:set","watchOperationId":"operation:task-data:priority:watch-start","inputKind":"value","valueType":{"kind":"scalar","name":"string"},"conditions":[]},{"path":["root","notes"],"selectionId":"47d49268fb091bc5764c33456890b827bf0645007a47afffb7063eafbcedf41f","interfaceRevisionId":"interface:task-data@1","getOperationId":"operation:task-data:notes:get","setOperationId":"operation:task-data:notes:set","watchOperationId":"operation:task-data:notes:watch-start","inputKind":"value","valueType":{"kind":"scalar","name":"string"},"conditions":[]},{"path":["root","dueDate"],"selectionId":"965d83643e09a8c263865f40ef74a279270ff712a0f9510ccd67438e33e0d65d","interfaceRevisionId":"interface:task-data@1","getOperationId":"operation:task-data:due-date:get","setOperationId":"operation:task-data:due-date:set","watchOperationId":"operation:task-data:due-date:watch-start","inputKind":"value","valueType":{"kind":"scalar","name":"string"},"conditions":[]},{"path":["root","energy"],"selectionId":"2fd3ae88138e1abed9972d37fbcd7d1f6ec84b93cffd1a5698e71f1aa7081302","interfaceRevisionId":"interface:task-data@1","getOperationId":"operation:task-data:energy:get","setOperationId":"operation:task-data:energy:set","watchOperationId":"operation:task-data:energy:watch-start","inputKind":"value","valueType":{"kind":"scalar","name":"string"},"conditions":[]},{"path":["root","estimatedHours"],"selectionId":"40c6d06cc019b60eb1da676eaec8b0a06296f14fa07460ca38895ef1a82c978b","interfaceRevisionId":"interface:task-data@1","getOperationId":"estimatedHours:get","setOperationId":"estimatedHours:set","watchOperationId":"estimatedHours:watch","inputKind":"value","valueType":{"kind":"scalar","name":"double"},"conditions":[]},{"path":["root","repeatDays"],"selectionId":"bbe829b6740809f6f191ceef0fe90ce80baa80913c3105c244ddbae16824b5a0","interfaceRevisionId":"interface:task-data@1","getOperationId":"repeatDays:get","setOperationId":"repeatDays:set","watchOperationId":"repeatDays:watch","inputKind":"value","valueType":{"kind":"scalar","name":"int32"},"conditions":[]}],"watch":true}}; +const contractsData = [{"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: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-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"}]}]}]; +export const reactContracts = {"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: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-actions@1": defineReactInterfaceContract Promise;"reopen.call": () => Promise;"archive.call": () => Promise}}>("interface:task-actions@1", contractsData)}; +export const reactInterfaces = {"TaskData": reactContracts["interface:task-data@1"], +"TagData": reactContracts["interface:tag-data@1"], +"CompletionData": reactContracts["interface:completion-data@1"], +"TaskActions": reactContracts["interface:task-actions@1"]}; +type CheckedComponent void}) => unknown> = C; +type Component0 = CheckedComponent<"propsGet", typeof import("../todo-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..2f44e40 --- /dev/null +++ b/src/gen/web-studio-react-runtime.d.ts @@ -0,0 +1,66 @@ +// 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; + /** Aggregate transport counters only; contains no object identities or values. */ + export function getFieldTransportMetrics(): Partial>>; + 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 type QueryLiveProjection = {path: readonly string[]; selectionId: string; interfaceRevisionId: string; getOperationId: string; setOperationId?: string; watchOperationId?: string; inputKind: "fields" | "value"; valueType: QueryValueType; conditions: {include: boolean; defaultValue?: boolean; value: {kind: "variable"; name: string} | {kind: "literal"; value: unknown}}[]}; + export interface QueryDescriptor {readonly id: string; readonly definitionDigest: string; readonly rootInterfaceRevisionId: string; readonly variables: QueryValueType; readonly output: QueryValueType; readonly watch: boolean; readonly liveFields?: readonly QueryLiveProjection[]; readonly $types?: (variables: Variables, result: Result) => [Variables, Result]} + export type QueryPartial = T extends {readonly $quixosRef: string} | {readonly capability: {readonly getOperationId: string}} ? 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 type LiveFieldState = {refreshing: boolean; stale: boolean; pendingWrites: number; writeError?: Error; refresh(): Promise; discard(): void} & ({status: "loading"; value?: undefined; error?: undefined} | {status: "ready"; value: T; error?: Error} | {status: "error"; value?: undefined; error: Error}); + export type WritableLiveFieldState = LiveFieldState & {set(value: T): Promise; retry(): Promise}; + export function useLiveField(field: ReadableField, options: {id: string; write: (value: T) => Promise}): WritableLiveFieldState; + export function useLiveField(field: WritableField): WritableLiveFieldState; + export function useLiveField(field: ReadableField): LiveFieldState; + export function useSuspenseLiveField(field: WritableField): WritableLiveFieldState & {status: "ready"; value: T}; + export function useSuspenseLiveField(field: ReadableField): LiveFieldState & {status: "ready"; value: T}; +} diff --git a/src/impl/createComponent.ts b/src/impl/createComponent.ts new file mode 100644 index 0000000..4fa8d6e --- /dev/null +++ b/src/impl/createComponent.ts @@ -0,0 +1,2 @@ +// This adapter keeps the implementation file hand-authored. +export { createComponent as handler } from "../todo-react.impl.js"; diff --git a/src/impl/propsGet.ts b/src/impl/propsGet.ts new file mode 100644 index 0000000..a74d7a3 --- /dev/null +++ b/src/impl/propsGet.ts @@ -0,0 +1,2 @@ +// This adapter keeps the implementation file hand-authored. +export { props as handler } from "../todo-react.impl.js"; diff --git a/src/impl/propsWatch.ts b/src/impl/propsWatch.ts new file mode 100644 index 0000000..a74d7a3 --- /dev/null +++ b/src/impl/propsWatch.ts @@ -0,0 +1,2 @@ +// This adapter keeps the implementation file hand-authored. +export { props as handler } from "../todo-react.impl.js"; diff --git a/src/impl/propsWatchStop.ts b/src/impl/propsWatchStop.ts new file mode 100644 index 0000000..7f51392 --- /dev/null +++ b/src/impl/propsWatchStop.ts @@ -0,0 +1,2 @@ +// This adapter keeps the implementation file hand-authored. +export { stopWatch as handler } from "../todo-react.impl.js"; diff --git a/src/impl/sourceGet.ts b/src/impl/sourceGet.ts new file mode 100644 index 0000000..c3a76b9 --- /dev/null +++ b/src/impl/sourceGet.ts @@ -0,0 +1,2 @@ +// This adapter keeps the implementation file hand-authored. +export { source as handler } from "../todo-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/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/task.css b/src/task.css new file mode 100644 index 0000000..2f44e5a --- /dev/null +++ b/src/task.css @@ -0,0 +1,127 @@ +.task-editor { + box-sizing: border-box; + min-width: 0; + height: 100%; + overflow: auto; + padding: 20px; + background: #fff; + color: #27372d; + font: + 14px/1.5 system-ui, + sans-serif; +} +.task-editor * { + box-sizing: border-box; +} +.task-editor label { + display: flex; + flex-direction: column; + gap: 4px; + font-size: 12px; + color: #63715f; +} +.task-editor input, +.task-editor select, +.task-editor textarea, +.task-editor button { + font: inherit; + color: #27372d; + border: 1px solid #d4dccf; + border-radius: 6px; + padding: 8px 10px; + background: #fff; + min-width: 0; +} +.task-editor input, +.task-editor select, +.task-editor textarea { + width: 100%; +} +.task-editor textarea { + resize: vertical; + min-height: 120px; +} +.task-title input { + font-size: 21px; + font-weight: 650; +} +.task-actions { + display: flex; + align-items: center; + gap: 8px; + flex-wrap: wrap; + margin: 12px 0; +} +.task-actions span, +.task-hint { + color: #6c7867; + font-size: 12px; +} +.task-editor button { + cursor: pointer; +} +.task-editor button:hover, +.task-editor button[aria-pressed="true"] { + background: #e9f1e1; +} +.task-editor button:disabled { + opacity: 0.5; + cursor: wait; +} +.task-editor :focus-visible { + outline: 2px solid #42765a; + outline-offset: 2px; +} +.task-fields { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); + gap: 12px; +} +.task-editor h3 { + font-size: 13px; + font-weight: 650; + margin: 20px 0 8px; +} +.task-tags { + display: flex; + gap: 6px; + flex-wrap: wrap; + margin-bottom: 16px; +} +.task-tags button { + padding: 4px 8px; + font-size: 12px; +} +.task-tags i { + display: inline-block; + width: 8px; + height: 8px; + border-radius: 50%; + margin-right: 5px; +} +.task-history { + border-top: 1px solid #e3e8de; + margin-top: 20px; +} +.task-history ol { + list-style: none; + padding: 0; +} +.task-history li { + display: flex; + flex-direction: column; + gap: 3px; + padding: 10px 0; + border-bottom: 1px solid #edf0e8; +} +.task-history li span { + font-size: 12px; + color: #6c7867; +} +.task-error { + background: #fff1ec; + color: #923c2c; + padding: 10px; + margin-bottom: 12px; + overflow-wrap: anywhere; +} diff --git a/src/todo-component.tsx b/src/todo-component.tsx new file mode 100644 index 0000000..117f9b1 --- /dev/null +++ b/src/todo-component.tsx @@ -0,0 +1,257 @@ +import { useState } from "react"; +import { + tryConform, + useLiveField, + useQuery, + type ObjectRef, + type ReactComponentImplementationProps, +} from "@quixos/web-studio-react-runtime"; +import { queries, reactInterfaces, type ReactResults, type QueryResults } from "./gen/react-props.gen.js"; +import "./task.css"; + +type Props = ReactComponentImplementationProps< + ReactResults["propsGet"], + { tagChoices?: { id: string; name: string; color: string }[] }, + never +>; + +export default function TodoComponent({ camino: props, render }: Props) { + const [after, setAfter] = useState(null); + const history = useQuery(queries.History, { root: props.data.$quixosRef, variables: { first: 50, after } }); + if (history.status === "loading") return

Loading task…

; + if (history.status !== "ready") + return ( +
+ {history.status === "error" ? history.error.message : "Loading task fields…"} + +
+ ); + return ( + + ); +} +function Editor({ + camino: props, + render, + history, + data, + after, + setAfter, +}: Pick & { + after: string | null; + history: { status: "ready"; refresh(): void }; + data: QueryResults["History"]["root"]; + setAfter(value: string | null): void; +}) { + const titleField = useLiveField(data.title); + const statusField = useLiveField(data.status); + const priorityField = useLiveField(data.priority); + const notesField = useLiveField(data.notes); + const dueDateField = useLiveField(data.dueDate); + const energyField = useLiveField(data.energy); + const estimatedHoursField = useLiveField(data.estimatedHours); + const repeatDaysField = useLiveField(data.repeatDays); + const title = titleField.value ?? ""; + const setTitle = titleField.set; + const status = statusField.value ?? ""; + const priority = priorityField.value ?? ""; + const setPriority = priorityField.set; + const notes = notesField.value ?? ""; + const setNotes = notesField.set; + const dueDate = dueDateField.value ?? ""; + const setDueDate = dueDateField.set; + const energy = energyField.value ?? ""; + const setEnergy = energyField.set; + const hours = estimatedHoursField.value ?? 0; + const setHours = estimatedHoursField.set; + const repeatDays = repeatDaysField.value ?? 0; + const setRepeatDays = repeatDaysField.set; + const [busy, setBusy] = useState(false); + const [error, setError] = useState(""); + // Live setters retain the platform's optimistic/CRDT behavior; do not drop keystrokes while an action is pending. + const save = (request: Promise) => { + void request.catch((e) => setError(e instanceof Error ? e.message : String(e))); + }; + 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 action = (name: "complete.call" | "reopen.call" | "archive.call") => + run(async () => { + const view = await tryConform(props.data.$quixosRef, reactInterfaces.TaskActions); + if (!view) throw new Error("Task actions are unavailable"); + await view.call[name](); + setAfter(null); + }); + const toggleTag = (id: string, connected: boolean) => + run(async () => { + const view = await tryConform(props.data.$quixosRef, reactInterfaces.TaskData); + if (!view) throw new Error("Task is unavailable"); + // These IDs originate in atom-Tag relations (the project catalog or this task), not user-entered strings. + await view.call[connected ? "tags.disconnect" : "tags.connect"](id as ObjectRef<"atom:tag">); + }); + const assigned = + data?.tags.entries.map((e) => ({ id: e.node._qx.ref.$quixosRef, name: e.node.name, color: e.node.color })) ?? []; + const choices = [...assigned, ...(render.tagChoices ?? []).filter((t) => !assigned.some((a) => a.id === t.id))]; + return ( +
+ {error && ( +
+ {error} +
+ )} + +
+ {status === "OPEN" ? ( + + ) : ( + + )} + {status !== "ARCHIVED" && ( + + )} + {status.toLowerCase()} +
+
+ + + + + +
+

+ {repeatDays > 0 + ? `After completion, stay open and set the next due date ${repeatDays} days later (UTC).` + : "One-off task. Set repeat days above zero to repeat after completion."} +

+
+

Tags

+
+ {choices.map((t) => { + const connected = assigned.some((a) => a.id === t.id); + return ( + + ); + })} +
+ {choices.length === 0 &&

Create and assign tags from the project's tag catalog.

} +
+