Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6b1708614a | ||
|
|
ec604045df | ||
|
|
7e4c51b815 | ||
|
|
5f9785d6d9 | ||
|
|
8ceff8bb3a | ||
|
|
9bbed0910e |
@@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"monorepoCommit": "99b2868b7e974441744657b35049f5baae4a499b",
|
|
||||||
"sourcePath": "quixos-instance/packages/project-react-runtime"
|
|
||||||
}
|
|
||||||
@@ -1,9 +1,8 @@
|
|||||||
# Generated from the checked package contract
|
|
||||||
package_id: "package:project-react-runtime"
|
package_id: "package:project-react-runtime"
|
||||||
package_revision_id: "package:project-react-runtime@1"
|
package_revision_id: "package:project-react-runtime@1"
|
||||||
runtime_protocol_version: "quixos-capabilities-v1"
|
runtime_protocol_version: "quixos-capabilities-v1"
|
||||||
exports: { export_id: "export:project-react-runtime:create-component" runtime_symbol: "createComponent" }
|
exports: { export_id: "export:project-react-runtime:create-component" runtime_symbol: "createComponent" }
|
||||||
exports: { export_id: "export:project-react-runtime:source-get" runtime_symbol: "sourceGet" }
|
exports: { export_id: "export:project-react-runtime:source-get" runtime_symbol: "source.get" }
|
||||||
exports: { export_id: "export:project-react-runtime:props-get" runtime_symbol: "propsGet" }
|
exports: { export_id: "export:project-react-runtime:props-get" runtime_symbol: "props.get" }
|
||||||
exports: { export_id: "export:project-react-runtime:props-watch" runtime_symbol: "propsWatch" }
|
exports: { export_id: "export:project-react-runtime:props-watch" runtime_symbol: "props.watch" }
|
||||||
exports: { export_id: "export:project-react-runtime:props-watch-stop" runtime_symbol: "propsWatchStop" }
|
exports: { export_id: "export:project-react-runtime:props-watch-stop" runtime_symbol: "props.watchStop" }
|
||||||
|
|||||||
Generated
+7
-7
@@ -37,17 +37,17 @@
|
|||||||
"quixosNixHelpers": {
|
"quixosNixHelpers": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1789602549,
|
"lastModified": 1788543053,
|
||||||
"narHash": "sha256-DD66dQ3dzEvG13Zju/4sVSV4pnktSUkJ/Rbr1KkHMdg=",
|
"narHash": "sha256-3YReATWEVxZinYVi/l3cwOz+oFoZUrwj24kUBQTmUpQ=",
|
||||||
"ref": "refs/tags/quixos-reachability/e2747066ca7d9d001dcb5dd936e17969ed88fc5f",
|
"ref": "refs/tags/quixos-reachability/56bbcd22d17f8c7f120b1e0b5bd1d5a86e91a80a",
|
||||||
"rev": "e2747066ca7d9d001dcb5dd936e17969ed88fc5f",
|
"rev": "56bbcd22d17f8c7f120b1e0b5bd1d5a86e91a80a",
|
||||||
"revCount": 32,
|
"revCount": 8,
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-nix-helpers.git"
|
"url": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-nix-helpers.git"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"ref": "refs/tags/quixos-reachability/e2747066ca7d9d001dcb5dd936e17969ed88fc5f",
|
"ref": "refs/tags/quixos-reachability/56bbcd22d17f8c7f120b1e0b5bd1d5a86e91a80a",
|
||||||
"rev": "e2747066ca7d9d001dcb5dd936e17969ed88fc5f",
|
"rev": "56bbcd22d17f8c7f120b1e0b5bd1d5a86e91a80a",
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-nix-helpers.git"
|
"url": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-nix-helpers.git"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,33 +6,31 @@
|
|||||||
flake-utils.url = "github:numtide/flake-utils";
|
flake-utils.url = "github:numtide/flake-utils";
|
||||||
|
|
||||||
quixosNixHelpers = {
|
quixosNixHelpers = {
|
||||||
url = "git+https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-nix-helpers.git?ref=refs/tags/quixos-reachability/e2747066ca7d9d001dcb5dd936e17969ed88fc5f&rev=e2747066ca7d9d001dcb5dd936e17969ed88fc5f";
|
url = "git+https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-nix-helpers.git?ref=refs/tags/quixos-reachability/56bbcd22d17f8c7f120b1e0b5bd1d5a86e91a80a&rev=56bbcd22d17f8c7f120b1e0b5bd1d5a86e91a80a";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs =
|
outputs = inputs@{ nixpkgs, flake-utils, quixosNixHelpers, ... }:
|
||||||
inputs@{
|
|
||||||
nixpkgs,
|
|
||||||
flake-utils,
|
|
||||||
quixosNixHelpers,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
let
|
let
|
||||||
quixosHelpers = import "${quixosNixHelpers}/quixos-package-helpers.nix";
|
quixosHelpers = import "${quixosNixHelpers}/quixos-package-helpers.nix";
|
||||||
in
|
in
|
||||||
quixosHelpers.mkCaminoTsYarnNixifyFlake {
|
quixosHelpers.mkCaminoTsYarnNixifyFlake {
|
||||||
inherit inputs nixpkgs flake-utils;
|
inherit inputs nixpkgs flake-utils;
|
||||||
packageRoot = ./.;
|
packageRoot = ./.;
|
||||||
migrationEntrypoint = "dist/migrate.js";
|
|
||||||
promptName = "project-react-runtime";
|
promptName = "project-react-runtime";
|
||||||
bundle = {
|
bundle = {
|
||||||
entry = "src/server.ts";
|
entry = "dist/server.js";
|
||||||
browserSources = true;
|
|
||||||
};
|
};
|
||||||
installServer = {
|
installServer = {
|
||||||
libexecName = "project-react-runtime";
|
libexecName = "project-react-runtime";
|
||||||
descriptorPath = "descriptor.quixos-package.txtpb";
|
descriptorPath = "descriptor.quixos-package.txtpb";
|
||||||
|
extraFiles = [
|
||||||
|
{
|
||||||
|
source = "dist/project-component.mjs";
|
||||||
|
target = "project-component.mjs";
|
||||||
|
}
|
||||||
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -8,11 +8,11 @@
|
|||||||
"server": "dist/server.js"
|
"server": "dist/server.js"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "rm -rf dist && tsc -p tsconfig.build.json",
|
"build": "rm -rf dist && tsc -p tsconfig.build.json && node scripts/build-component.mjs",
|
||||||
"typecheck": "tsc --noEmit"
|
"typecheck": "tsc --noEmit"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@quixos/camino-package-runtime": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=cd2b04dc8c2daeea633bf8ecdd31d20fdc41f2ab",
|
"@quixos/camino-package-runtime": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=a998690446ecf647e3af78e369492c1a3663b66d",
|
||||||
"react": "^18.3.1"
|
"react": "^18.3.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
+2
-3
@@ -2,16 +2,15 @@ import interface Named;
|
|||||||
import interface ProjectTasks;
|
import interface ProjectTasks;
|
||||||
external atom ProjectReactComponent id "atom:project-react-component";
|
external atom ProjectReactComponent id "atom:project-react-component";
|
||||||
external atom Project id "atom:project";
|
external atom Project id "atom:project";
|
||||||
type ProjectProps = record {named: interface-ref<Named>; tasks: interface-ref<ProjectTasks>;};
|
|
||||||
|
|
||||||
package ProjectReactRuntime id "package:project-react-runtime" revision "package:project-react-runtime@1" {
|
package ProjectReactRuntime id "package:project-react-runtime" revision "package:project-react-runtime@1" {
|
||||||
constructor createComponent id "export:project-react-runtime:create-component" constructs ProjectReactComponent : atom-ref<Project>;
|
constructor createComponent id "export:project-react-runtime:create-component" constructs ProjectReactComponent : atom-ref<Project>;
|
||||||
operation sourceGet id "export:project-react-runtime:source-get" : unit -> string mode call receiver atom ProjectReactComponent;
|
operation sourceGet id "export:project-react-runtime:source-get" : unit -> string mode call receiver atom ProjectReactComponent;
|
||||||
operation propsGet id "export:project-react-runtime:props-get" : unit -> ProjectProps mode call receiver atom ProjectReactComponent requires {
|
operation propsGet id "export:project-react-runtime:props-get" : unit -> message "org.quixos.web-studio.ReactProps" mode call receiver atom ProjectReactComponent requires {
|
||||||
interface named id "port:project-react:named" : Named;
|
interface named id "port:project-react:named" : Named;
|
||||||
interface tasks id "port:project-react:tasks" : ProjectTasks;
|
interface tasks id "port:project-react:tasks" : ProjectTasks;
|
||||||
};
|
};
|
||||||
operation propsWatch id "export:project-react-runtime:props-watch" : unit -> watch-handle mode watch-start emits ProjectProps receiver atom ProjectReactComponent requires {
|
operation propsWatch id "export:project-react-runtime:props-watch" : unit -> watch-handle mode watch-start emits message "org.quixos.web-studio.ReactProps" receiver atom ProjectReactComponent requires {
|
||||||
interface named id "port:project-react:named" : Named;
|
interface named id "port:project-react:named" : Named;
|
||||||
interface tasks id "port:project-react:tasks" : ProjectTasks;
|
interface tasks id "port:project-react:tasks" : ProjectTasks;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"backend": "typescript",
|
|
||||||
"bindingOutput": "src/gen/qx.ts",
|
|
||||||
"options": {
|
|
||||||
"react": {
|
|
||||||
"propsExports": ["propsGet"],
|
|
||||||
"components": [{ "module": "../project-component.js", "propsExport": "propsGet" }]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+5
-3
@@ -1,14 +1,16 @@
|
|||||||
quixos-lock version 1 {
|
quixos-lock version 1 {
|
||||||
quixos source {
|
quixos source {
|
||||||
repository "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos.git";
|
repository "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos.git";
|
||||||
commit "99b2868b7e974441744657b35049f5baae4a499b";
|
commit "9c3ab572ecfbc83785038c3d9f174516df15d63f";
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Named source {
|
interface Named source {
|
||||||
repository "https://repos.quixos.org/quixos-templates/interface-named.git";
|
repository "https://repos.quixos.org/quixos-templates/interface-named.git";
|
||||||
commit "07765f61c3803fd73253020bfbb40e1fffaf5ec9";
|
commit "14be607ed250f8c3ce1633558573fc1449f6f2a1";
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ProjectTasks source {
|
interface ProjectTasks source {
|
||||||
repository "https://repos.quixos.org/quixos-templates/interface-project-tasks.git";
|
repository "https://repos.quixos.org/quixos-templates/interface-project-tasks.git";
|
||||||
commit "1a7eddbce430f17c5817f83d680d3ffc783a071a";
|
commit "2590966c1f95da08126f1cb830be7dcc6dc715d9";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"generatedBy": "qx-scaffold-v1",
|
|
||||||
"schemaVersion": 1,
|
|
||||||
"contracts": {},
|
|
||||||
"migrations": []
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"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"
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
import { build } from "esbuild";
|
||||||
|
|
||||||
|
const platformModules = new Map([
|
||||||
|
[
|
||||||
|
"@quixos/web-studio-react-runtime",
|
||||||
|
"/__quixos/platform/web-studio-react-runtime/v1.mjs",
|
||||||
|
],
|
||||||
|
["react", "/__quixos/platform/react/v18.mjs"],
|
||||||
|
["react/jsx-runtime", "/__quixos/platform/react-jsx-runtime/v18.mjs"],
|
||||||
|
["react/jsx-dev-runtime", "/__quixos/platform/react-jsx-dev-runtime/v18.mjs"],
|
||||||
|
]);
|
||||||
|
|
||||||
|
await build({
|
||||||
|
entryPoints: ["dist/project-component.js"],
|
||||||
|
outfile: "dist/project-component.mjs",
|
||||||
|
bundle: true,
|
||||||
|
format: "esm",
|
||||||
|
platform: "browser",
|
||||||
|
target: "es2022",
|
||||||
|
sourcemap: true,
|
||||||
|
plugins: [
|
||||||
|
{
|
||||||
|
name: "quixos-platform-modules",
|
||||||
|
setup(buildApi) {
|
||||||
|
buildApi.onResolve({ filter: /.*/ }, (args) => {
|
||||||
|
const platformPath = platformModules.get(args.path);
|
||||||
|
return platformPath
|
||||||
|
? { path: platformPath, external: true }
|
||||||
|
: undefined;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
Vendored
-4
@@ -1,4 +0,0 @@
|
|||||||
declare module "*?browser-source" {
|
|
||||||
const source: string;
|
|
||||||
export default source;
|
|
||||||
}
|
|
||||||
-277
@@ -1,277 +0,0 @@
|
|||||||
// Generated by quixos-codegen-ts. Do not edit. Binding ABI version 1.
|
|
||||||
import { bindQxHandler, type QxObjectRef, type QxWatchHandle, type QxHandler, type QxDerived, type QxContextLifecycle, type QxLiveValue, type QxHandlerSpec, type QxMessages } from "@quixos/camino-package-runtime";
|
|
||||||
|
|
||||||
export const packageRevisionId = "package:project-react-runtime@1";
|
|
||||||
declare const appliedType: unique symbol;
|
|
||||||
type QxApplied<Definition extends string, Arguments extends readonly unknown[]> = string & {readonly [appliedType]: (value: [Definition, Arguments]) => [Definition, Arguments]};
|
|
||||||
export type Contexts = { "createComponent": { "objectId": QxObjectRef<"atom:atom:project-react-component">; "input": QxObjectRef<"atom:atom:project">; "ports": { } } & QxContextLifecycle<{ "objectId": QxObjectRef<"atom:atom:project-react-component">; "input": QxObjectRef<"atom:atom:project">; "ports": { } } & {signal?: AbortSignal}>; "propsGet": { "objectId": QxObjectRef<"atom:atom:project-react-component">; "input": null; "ports": { "named": { "objectId": QxObjectRef<"interface:interface:named@1">; "live": { "name.get": () => Promise<QxLiveValue>; "name.set": (input: string) => Promise<QxLiveValue> }; "name.get": () => Promise<string>; "name.set": (input: string) => Promise<null> }; "tasks": { "objectId": QxObjectRef<"interface:interface:project-tasks@1">; "live": { "tasks.resolve": () => Promise<QxLiveValue>; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise<QxLiveValue>; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise<QxLiveValue> }; "tasks.resolve": () => Promise<Array<QxObjectRef<"atom:atom:task">>>; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise<null>; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise<null> } } } & QxContextLifecycle<{ "objectId": QxObjectRef<"atom:atom:project-react-component">; "input": null; "ports": { "named": { "objectId": QxObjectRef<"interface:interface:named@1">; "live": { "name.get": () => Promise<QxLiveValue>; "name.set": (input: string) => Promise<QxLiveValue> }; "name.get": () => Promise<string>; "name.set": (input: string) => Promise<null> }; "tasks": { "objectId": QxObjectRef<"interface:interface:project-tasks@1">; "live": { "tasks.resolve": () => Promise<QxLiveValue>; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise<QxLiveValue>; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise<QxLiveValue> }; "tasks.resolve": () => Promise<Array<QxObjectRef<"atom:atom:task">>>; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise<null>; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise<null> } } } & {signal?: AbortSignal}>; "propsWatch": { "objectId": QxObjectRef<"atom:atom:project-react-component">; "input": null; "ports": { "named": { "objectId": QxObjectRef<"interface:interface:named@1">; "live": { "name.get": () => Promise<QxLiveValue>; "name.set": (input: string) => Promise<QxLiveValue> }; "name.get": () => Promise<string>; "name.set": (input: string) => Promise<null> }; "tasks": { "objectId": QxObjectRef<"interface:interface:project-tasks@1">; "live": { "tasks.resolve": () => Promise<QxLiveValue>; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise<QxLiveValue>; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise<QxLiveValue> }; "tasks.resolve": () => Promise<Array<QxObjectRef<"atom:atom:task">>>; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise<null>; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise<null> } } } & QxContextLifecycle<{ "objectId": QxObjectRef<"atom:atom:project-react-component">; "input": null; "ports": { "named": { "objectId": QxObjectRef<"interface:interface:named@1">; "live": { "name.get": () => Promise<QxLiveValue>; "name.set": (input: string) => Promise<QxLiveValue> }; "name.get": () => Promise<string>; "name.set": (input: string) => Promise<null> }; "tasks": { "objectId": QxObjectRef<"interface:interface:project-tasks@1">; "live": { "tasks.resolve": () => Promise<QxLiveValue>; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise<QxLiveValue>; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise<QxLiveValue> }; "tasks.resolve": () => Promise<Array<QxObjectRef<"atom:atom:task">>>; "tasks.connect": (input: QxObjectRef<"atom:atom:task">) => Promise<null>; "tasks.disconnect": (input: QxObjectRef<"atom:atom:task">) => Promise<null> } } } & {signal?: AbortSignal}>; "propsWatchStop": { "objectId": QxObjectRef<"atom:atom:project-react-component">; "input": QxWatchHandle; "ports": { } } & QxContextLifecycle<{ "objectId": QxObjectRef<"atom:atom:project-react-component">; "input": QxWatchHandle; "ports": { } } & {signal?: AbortSignal}>; "sourceGet": { "objectId": QxObjectRef<"atom:atom:project-react-component">; "input": null; "ports": { } } & QxContextLifecycle<{ "objectId": QxObjectRef<"atom:atom:project-react-component">; "input": null; "ports": { } } & {signal?: AbortSignal}> };
|
|
||||||
export type Results = { "createComponent": QxObjectRef<"atom:atom:project-react-component">; "propsGet": { "named": QxObjectRef<"interface:interface:named@1">; "tasks": QxObjectRef<"interface:interface:project-tasks@1"> }; "propsWatch": { "named": QxObjectRef<"interface:interface:named@1">; "tasks": QxObjectRef<"interface:interface:project-tasks@1"> }; "propsWatchStop": null; "sourceGet": string };
|
|
||||||
export type Implementation = { "createComponent": QxHandler<Contexts["createComponent"], QxObjectRef<"atom:atom:project-react-component">>; "propsGet": QxHandler<Contexts["propsGet"], { "named": QxObjectRef<"interface:interface:named@1">; "tasks": QxObjectRef<"interface:interface:project-tasks@1"> }> | QxDerived<Contexts["propsGet"], { "named": QxObjectRef<"interface:interface:named@1">; "tasks": QxObjectRef<"interface:interface:project-tasks@1"> }>; "propsWatch": QxDerived<Contexts["propsWatch"], { "named": QxObjectRef<"interface:interface:named@1">; "tasks": QxObjectRef<"interface:interface:project-tasks@1"> }>; "propsWatchStop": QxHandler<Contexts["propsWatchStop"], null>; "sourceGet": QxHandler<Contexts["sourceGet"], string> | QxDerived<Contexts["sourceGet"], string> };
|
|
||||||
const messages = { } satisfies QxMessages;
|
|
||||||
const specs = {
|
|
||||||
"createComponent": {
|
|
||||||
"inputType": {
|
|
||||||
"kind": "object-ref",
|
|
||||||
"expectation": {
|
|
||||||
"kind": "atom",
|
|
||||||
"atomId": "atom:project"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"outputType": {
|
|
||||||
"kind": "object-ref",
|
|
||||||
"expectation": {
|
|
||||||
"kind": "atom",
|
|
||||||
"atomId": "atom:project-react-component"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ports": {}
|
|
||||||
},
|
|
||||||
"propsGet": {
|
|
||||||
"inputType": {
|
|
||||||
"kind": "builtin",
|
|
||||||
"name": "unit"
|
|
||||||
},
|
|
||||||
"outputType": {
|
|
||||||
"kind": "record",
|
|
||||||
"fields": {
|
|
||||||
"named": {
|
|
||||||
"kind": "object-ref",
|
|
||||||
"expectation": {
|
|
||||||
"kind": "interface",
|
|
||||||
"interfaceRevisionId": "interface:named@1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tasks": {
|
|
||||||
"kind": "object-ref",
|
|
||||||
"expectation": {
|
|
||||||
"kind": "interface",
|
|
||||||
"interfaceRevisionId": "interface:project-tasks@1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ports": {
|
|
||||||
"named": {
|
|
||||||
"kind": "interface",
|
|
||||||
"id": "port:project-react:named",
|
|
||||||
"operations": {
|
|
||||||
"name.get": {
|
|
||||||
"id": "operation:named:name:get",
|
|
||||||
"inputType": {
|
|
||||||
"kind": "builtin",
|
|
||||||
"name": "unit"
|
|
||||||
},
|
|
||||||
"outputType": {
|
|
||||||
"kind": "scalar",
|
|
||||||
"name": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"name.set": {
|
|
||||||
"id": "operation:named:name:set",
|
|
||||||
"inputType": {
|
|
||||||
"kind": "scalar",
|
|
||||||
"name": "string"
|
|
||||||
},
|
|
||||||
"outputType": {
|
|
||||||
"kind": "builtin",
|
|
||||||
"name": "unit"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tasks": {
|
|
||||||
"kind": "interface",
|
|
||||||
"id": "port:project-react:tasks",
|
|
||||||
"operations": {
|
|
||||||
"tasks.resolve": {
|
|
||||||
"id": "operation:project-tasks:tasks:resolve",
|
|
||||||
"inputType": {
|
|
||||||
"kind": "builtin",
|
|
||||||
"name": "unit"
|
|
||||||
},
|
|
||||||
"outputType": {
|
|
||||||
"kind": "list",
|
|
||||||
"value": {
|
|
||||||
"kind": "object-ref",
|
|
||||||
"expectation": {
|
|
||||||
"kind": "atom",
|
|
||||||
"atomId": "atom:task"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tasks.connect": {
|
|
||||||
"id": "operation:project-tasks:tasks:connect",
|
|
||||||
"inputType": {
|
|
||||||
"kind": "object-ref",
|
|
||||||
"expectation": {
|
|
||||||
"kind": "atom",
|
|
||||||
"atomId": "atom:task"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"outputType": {
|
|
||||||
"kind": "builtin",
|
|
||||||
"name": "unit"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tasks.disconnect": {
|
|
||||||
"id": "operation:project-tasks:tasks:disconnect",
|
|
||||||
"inputType": {
|
|
||||||
"kind": "object-ref",
|
|
||||||
"expectation": {
|
|
||||||
"kind": "atom",
|
|
||||||
"atomId": "atom:task"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"outputType": {
|
|
||||||
"kind": "builtin",
|
|
||||||
"name": "unit"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"propsWatch": {
|
|
||||||
"inputType": {
|
|
||||||
"kind": "builtin",
|
|
||||||
"name": "unit"
|
|
||||||
},
|
|
||||||
"outputType": {
|
|
||||||
"kind": "builtin",
|
|
||||||
"name": "watch-handle"
|
|
||||||
},
|
|
||||||
"eventType": {
|
|
||||||
"kind": "record",
|
|
||||||
"fields": {
|
|
||||||
"named": {
|
|
||||||
"kind": "object-ref",
|
|
||||||
"expectation": {
|
|
||||||
"kind": "interface",
|
|
||||||
"interfaceRevisionId": "interface:named@1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tasks": {
|
|
||||||
"kind": "object-ref",
|
|
||||||
"expectation": {
|
|
||||||
"kind": "interface",
|
|
||||||
"interfaceRevisionId": "interface:project-tasks@1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ports": {
|
|
||||||
"named": {
|
|
||||||
"kind": "interface",
|
|
||||||
"id": "port:project-react:named",
|
|
||||||
"operations": {
|
|
||||||
"name.get": {
|
|
||||||
"id": "operation:named:name:get",
|
|
||||||
"inputType": {
|
|
||||||
"kind": "builtin",
|
|
||||||
"name": "unit"
|
|
||||||
},
|
|
||||||
"outputType": {
|
|
||||||
"kind": "scalar",
|
|
||||||
"name": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"name.set": {
|
|
||||||
"id": "operation:named:name:set",
|
|
||||||
"inputType": {
|
|
||||||
"kind": "scalar",
|
|
||||||
"name": "string"
|
|
||||||
},
|
|
||||||
"outputType": {
|
|
||||||
"kind": "builtin",
|
|
||||||
"name": "unit"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tasks": {
|
|
||||||
"kind": "interface",
|
|
||||||
"id": "port:project-react:tasks",
|
|
||||||
"operations": {
|
|
||||||
"tasks.resolve": {
|
|
||||||
"id": "operation:project-tasks:tasks:resolve",
|
|
||||||
"inputType": {
|
|
||||||
"kind": "builtin",
|
|
||||||
"name": "unit"
|
|
||||||
},
|
|
||||||
"outputType": {
|
|
||||||
"kind": "list",
|
|
||||||
"value": {
|
|
||||||
"kind": "object-ref",
|
|
||||||
"expectation": {
|
|
||||||
"kind": "atom",
|
|
||||||
"atomId": "atom:task"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tasks.connect": {
|
|
||||||
"id": "operation:project-tasks:tasks:connect",
|
|
||||||
"inputType": {
|
|
||||||
"kind": "object-ref",
|
|
||||||
"expectation": {
|
|
||||||
"kind": "atom",
|
|
||||||
"atomId": "atom:task"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"outputType": {
|
|
||||||
"kind": "builtin",
|
|
||||||
"name": "unit"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tasks.disconnect": {
|
|
||||||
"id": "operation:project-tasks:tasks:disconnect",
|
|
||||||
"inputType": {
|
|
||||||
"kind": "object-ref",
|
|
||||||
"expectation": {
|
|
||||||
"kind": "atom",
|
|
||||||
"atomId": "atom:task"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"outputType": {
|
|
||||||
"kind": "builtin",
|
|
||||||
"name": "unit"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"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<string, QxHandlerSpec>;
|
|
||||||
export const createRuntime = (implementation: Implementation) => ({
|
|
||||||
packageRevisionId,
|
|
||||||
exports: {
|
|
||||||
"export:project-react-runtime:create-component": bindQxHandler(specs["createComponent"], implementation["createComponent"], messages),
|
|
||||||
"export:project-react-runtime:props-get": bindQxHandler(specs["propsGet"], implementation["propsGet"], messages),
|
|
||||||
"export:project-react-runtime:props-watch": bindQxHandler(specs["propsWatch"], implementation["propsWatch"], messages),
|
|
||||||
"export:project-react-runtime:props-watch-stop": bindQxHandler(specs["propsWatchStop"], implementation["propsWatchStop"], messages),
|
|
||||||
"export:project-react-runtime:source-get": bindQxHandler(specs["sourceGet"], implementation["sourceGet"], messages),
|
|
||||||
},
|
|
||||||
});
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
// Generated from checked QX contracts. Do not edit.
|
|
||||||
import type {ObjectRef, InterfaceReference, ReadableField, WritableField} from "@quixos/web-studio-react-runtime";
|
|
||||||
export type Interface0 = InterfaceReference<"interface:named@1", {"name": WritableField<string>}> ;
|
|
||||||
export type Interface1 = InterfaceReference<"interface:project-tasks@1", {"tasks": ReadableField<Array<ObjectRef<"atom:task">>>}> ;
|
|
||||||
export type ReactResults = {"propsGet": {"named": Interface0;"tasks": Interface1}};
|
|
||||||
type CheckedComponent<K extends keyof ReactResults, C extends (props: {camino: ReactResults[K]; render: any; dispatch: (action: any) => void}) => unknown> = C;
|
|
||||||
type Component0 = CheckedComponent<"propsGet", typeof import("../project-component.js")["default"]>;
|
|
||||||
+29
-20
@@ -1,25 +1,28 @@
|
|||||||
// Generated by the Quixos React platform contract. Do not edit.
|
|
||||||
declare module "@quixos/web-studio-react-runtime" {
|
declare module "@quixos/web-studio-react-runtime" {
|
||||||
import type * as React from "react";
|
|
||||||
export function useComponentOverlayContainer(): HTMLElement;
|
|
||||||
export function useComponentStyleRoot(): ShadowRoot;
|
|
||||||
export type ObjectRef<AtomId extends string> = string & {
|
export type ObjectRef<AtomId extends string> = string & {
|
||||||
readonly $quixosAtom: AtomId;
|
readonly $quixosAtom: AtomId;
|
||||||
};
|
};
|
||||||
export type FieldCapability = {objectId: string; interfaceRevisionId: string; getOperationId: string; watchOperationId?: string; setOperationId?: string; inputKind?: "fields" | "value"};
|
export type LiveFieldProp<T> = {
|
||||||
export type ReadableField<T> = {readonly value?: T; readonly capability: FieldCapability};
|
value: T;
|
||||||
/** set(T) uses the resolved capability: native CRDT fields send incremental edits;
|
source: {
|
||||||
* custom/manual setters receive semantic values. Storage provenance grants no authority. */
|
objectId: string;
|
||||||
export type WritableField<T> = ReadableField<T> & {readonly $writeType?: (value: T) => T; readonly writable: true; readonly capability: FieldCapability & {setOperationId: string}};
|
slotId: string;
|
||||||
export type LiveFieldProp<T> = ReadableField<T>;
|
valueType?: string;
|
||||||
export type InterfaceReference<I extends string, Fields> = {readonly $quixosRef: string; readonly interfaceRevisionId: I; readonly fields: Fields};
|
storagePolicy?: string;
|
||||||
|
revision?: string | number | bigint;
|
||||||
|
crdtSnapshot?: {
|
||||||
|
type: string;
|
||||||
|
encoding: string;
|
||||||
|
payload: string;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
export type ReactComponentHostProps<Action> = {
|
export type ReactComponentHostProps<Action> = {
|
||||||
onAction?: (action: Action) => void;
|
onAction?: (action: Action) => void;
|
||||||
fallback?: React.ReactNode;
|
fallback?: unknown;
|
||||||
className?: string;
|
className?: string;
|
||||||
style?: React.CSSProperties;
|
style?: Record<string, string | number | undefined>;
|
||||||
/** Optional extra action. The host still displays and reports errors by default. */
|
onError?: (error: Error) => void;
|
||||||
extraErrorAction?: (error: Error) => void;
|
|
||||||
};
|
};
|
||||||
export type ReactComponentImplementationProps<CaminoProps, RenderProps, Action> = {
|
export type ReactComponentImplementationProps<CaminoProps, RenderProps, Action> = {
|
||||||
camino: CaminoProps;
|
camino: CaminoProps;
|
||||||
@@ -36,10 +39,16 @@ declare module "@quixos/web-studio-react-runtime" {
|
|||||||
interfaceRevisionId: string,
|
interfaceRevisionId: string,
|
||||||
operationId: string,
|
operationId: string,
|
||||||
value?: unknown,
|
value?: unknown,
|
||||||
options?: {clientMutationId?: string; signal?: AbortSignal},
|
|
||||||
) => Promise<Result>;
|
) => Promise<Result>;
|
||||||
export const h: typeof React.createElement;
|
export const h: (...args: any[]) => any;
|
||||||
export function useLiveField<T>(field: ReadableField<T>, options: {write: (value: T) => Promise<void>}): readonly [T, (value: T) => Promise<void>];
|
export const useLiveField: <T>(
|
||||||
export function useLiveField<T>(field: WritableField<T>): readonly [T, (value: T) => Promise<void>];
|
field: LiveFieldProp<T>,
|
||||||
export function useLiveField<T>(field: ReadableField<T>): readonly [T];
|
options?: {
|
||||||
|
reconcileRegister?: (state: {
|
||||||
|
confirmed: T;
|
||||||
|
optimistic: T;
|
||||||
|
pending: boolean;
|
||||||
|
}) => T;
|
||||||
|
},
|
||||||
|
) => [T, (value: T) => void | Promise<void>];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
// This adapter keeps the implementation file hand-authored.
|
|
||||||
export { createComponent as handler } from "../project-react.impl.js";
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
// This adapter keeps the implementation file hand-authored.
|
|
||||||
export { props as handler } from "../project-react.impl.js";
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
// This adapter keeps the implementation file hand-authored.
|
|
||||||
export { props as handler } from "../project-react.impl.js";
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
// This adapter keeps the implementation file hand-authored.
|
|
||||||
export { stopWatch as handler } from "../project-react.impl.js";
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
// This adapter keeps the implementation file hand-authored.
|
|
||||||
export { source as handler } from "../project-react.impl.js";
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Generated by qx-scaffold-v1
|
|
||||||
import { serveMigration } from "@quixos/camino-package-runtime";
|
|
||||||
await serveMigration({});
|
|
||||||
+23
-39
@@ -3,6 +3,8 @@ import {
|
|||||||
h,
|
h,
|
||||||
invokeCapability,
|
invokeCapability,
|
||||||
useLiveField,
|
useLiveField,
|
||||||
|
type LiveFieldProp,
|
||||||
|
type ObjectRef,
|
||||||
type ReactComponentImplementationProps,
|
type ReactComponentImplementationProps,
|
||||||
} from "@quixos/web-studio-react-runtime";
|
} from "@quixos/web-studio-react-runtime";
|
||||||
import {
|
import {
|
||||||
@@ -11,11 +13,14 @@ import {
|
|||||||
type TodoReactComponentAction,
|
type TodoReactComponentAction,
|
||||||
} from "./gen/quixos.todo.TodoReactComponent.react.js";
|
} from "./gen/quixos.todo.TodoReactComponent.react.js";
|
||||||
import type { ProjectReactComponentRenderProps } from "./gen/quixos.todo.ProjectReactComponent.react.js";
|
import type { ProjectReactComponentRenderProps } from "./gen/quixos.todo.ProjectReactComponent.react.js";
|
||||||
import type { ReactResults } from "./gen/react-props.gen.js";
|
|
||||||
|
|
||||||
type TaskRef = TodoComponentProps["forObject"];
|
type TaskRef = TodoComponentProps["forObject"];
|
||||||
|
|
||||||
type ProjectCaminoProps = ReactResults["propsGet"];
|
type ProjectCaminoProps = {
|
||||||
|
project_id: ObjectRef<"atom:project">;
|
||||||
|
name: LiveFieldProp<string>;
|
||||||
|
tasks: TaskRef[];
|
||||||
|
};
|
||||||
|
|
||||||
type ProjectComponentProps = ReactComponentImplementationProps<
|
type ProjectComponentProps = ReactComponentImplementationProps<
|
||||||
ProjectCaminoProps,
|
ProjectCaminoProps,
|
||||||
@@ -34,8 +39,7 @@ const colors = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export default function ProjectComponent({ camino, render }: ProjectComponentProps) {
|
export default function ProjectComponent({ camino, render }: ProjectComponentProps) {
|
||||||
const [name, setName] = useLiveField(camino.named.fields.name);
|
const [name, setName] = useLiveField(camino.name);
|
||||||
const [tasks] = useLiveField(camino.tasks.fields.tasks);
|
|
||||||
const [selectedTask, setSelectedTask] = useState<TaskRef | null>(null);
|
const [selectedTask, setSelectedTask] = useState<TaskRef | null>(null);
|
||||||
const [newTaskTitle, setNewTaskTitle] = useState("");
|
const [newTaskTitle, setNewTaskTitle] = useState("");
|
||||||
const [addingTask, setAddingTask] = useState(false);
|
const [addingTask, setAddingTask] = useState(false);
|
||||||
@@ -49,7 +53,7 @@ export default function ProjectComponent({ camino, render }: ProjectComponentPro
|
|||||||
setAddTaskError("");
|
setAddTaskError("");
|
||||||
try {
|
try {
|
||||||
await invokeCapability(
|
await invokeCapability(
|
||||||
camino.named.$quixosRef,
|
camino.project_id,
|
||||||
"interface:project-actions@1",
|
"interface:project-actions@1",
|
||||||
"operation:project-actions:add-task",
|
"operation:project-actions:add-task",
|
||||||
newTaskTitle,
|
newTaskTitle,
|
||||||
@@ -63,8 +67,7 @@ export default function ProjectComponent({ camino, render }: ProjectComponentPro
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section
|
<section style={{
|
||||||
style={{
|
|
||||||
display: "grid",
|
display: "grid",
|
||||||
gridTemplateRows: "auto auto minmax(0, 1fr)",
|
gridTemplateRows: "auto auto minmax(0, 1fr)",
|
||||||
gap: "12px",
|
gap: "12px",
|
||||||
@@ -74,8 +77,7 @@ export default function ProjectComponent({ camino, render }: ProjectComponentPro
|
|||||||
padding: render.compact ? "11px" : "14px",
|
padding: render.compact ? "11px" : "14px",
|
||||||
color: colors.ink,
|
color: colors.ink,
|
||||||
fontFamily: "Avenir Next, Nunito, ui-sans-serif, system-ui, sans-serif",
|
fontFamily: "Avenir Next, Nunito, ui-sans-serif, system-ui, sans-serif",
|
||||||
}}
|
}}>
|
||||||
>
|
|
||||||
<header style={{ display: "flex", alignItems: "center", justifyContent: "space-between", gap: "12px" }}>
|
<header style={{ display: "flex", alignItems: "center", justifyContent: "space-between", gap: "12px" }}>
|
||||||
<div style={{ display: "grid", gap: "2px", minWidth: 0, flex: 1 }}>
|
<div style={{ display: "grid", gap: "2px", minWidth: 0, flex: 1 }}>
|
||||||
<input
|
<input
|
||||||
@@ -97,8 +99,7 @@ export default function ProjectComponent({ camino, render }: ProjectComponentPro
|
|||||||
/>
|
/>
|
||||||
<span style={{ color: colors.muted, fontSize: "11px" }}>A little clearing for useful things.</span>
|
<span style={{ color: colors.muted, fontSize: "11px" }}>A little clearing for useful things.</span>
|
||||||
</div>
|
</div>
|
||||||
<span
|
<span style={{
|
||||||
style={{
|
|
||||||
flex: "0 0 auto",
|
flex: "0 0 auto",
|
||||||
border: `1px solid ${colors.line}`,
|
border: `1px solid ${colors.line}`,
|
||||||
borderRadius: "8px",
|
borderRadius: "8px",
|
||||||
@@ -107,9 +108,8 @@ export default function ProjectComponent({ camino, render }: ProjectComponentPro
|
|||||||
fontSize: "11px",
|
fontSize: "11px",
|
||||||
fontWeight: 800,
|
fontWeight: 800,
|
||||||
padding: "5px 8px",
|
padding: "5px 8px",
|
||||||
}}
|
}}>
|
||||||
>
|
{camino.tasks.length} {camino.tasks.length === 1 ? "task" : "tasks"}
|
||||||
{tasks.length} {tasks.length === 1 ? "task" : "tasks"}
|
|
||||||
</span>
|
</span>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
@@ -126,13 +126,7 @@ export default function ProjectComponent({ camino, render }: ProjectComponentPro
|
|||||||
onInput={(event) => setNewTaskTitle(event.currentTarget.value)}
|
onInput={(event) => setNewTaskTitle(event.currentTarget.value)}
|
||||||
placeholder="What wants doing?"
|
placeholder="What wants doing?"
|
||||||
disabled={addingTask}
|
disabled={addingTask}
|
||||||
style={{
|
style={{ minWidth: 0, border: `1px solid ${colors.line}`, borderRadius: "9px", background: "#fff", padding: "8px 10px" }}
|
||||||
minWidth: 0,
|
|
||||||
border: `1px solid ${colors.line}`,
|
|
||||||
borderRadius: "9px",
|
|
||||||
background: "#fff",
|
|
||||||
padding: "8px 10px",
|
|
||||||
}}
|
|
||||||
/>
|
/>
|
||||||
<button
|
<button
|
||||||
type="submit"
|
type="submit"
|
||||||
@@ -150,26 +144,19 @@ export default function ProjectComponent({ camino, render }: ProjectComponentPro
|
|||||||
>
|
>
|
||||||
{addingTask ? "Planting…" : "Add task"}
|
{addingTask ? "Planting…" : "Add task"}
|
||||||
</button>
|
</button>
|
||||||
{addTaskError ? (
|
{addTaskError ? <div role="alert" style={{ gridColumn: "1 / -1", color: "#9f4741", fontSize: "11px" }}>{addTaskError}</div> : null}
|
||||||
<div role="alert" style={{ gridColumn: "1 / -1", color: "#9f4741", fontSize: "11px" }}>
|
|
||||||
{addTaskError}
|
|
||||||
</div>
|
|
||||||
) : null}
|
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<div
|
<div style={{
|
||||||
style={{
|
|
||||||
display: "grid",
|
display: "grid",
|
||||||
alignContent: "start",
|
alignContent: "start",
|
||||||
gap: "9px",
|
gap: "9px",
|
||||||
minHeight: 0,
|
minHeight: 0,
|
||||||
overflow: "auto",
|
overflow: "auto",
|
||||||
paddingRight: "3px",
|
paddingRight: "3px",
|
||||||
}}
|
}}>
|
||||||
>
|
{camino.tasks.length === 0 ? (
|
||||||
{tasks.length === 0 ? (
|
<div style={{
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
display: "grid",
|
display: "grid",
|
||||||
placeItems: "center",
|
placeItems: "center",
|
||||||
minHeight: render.compact ? "80px" : "140px",
|
minHeight: render.compact ? "80px" : "140px",
|
||||||
@@ -179,12 +166,10 @@ export default function ProjectComponent({ camino, render }: ProjectComponentPro
|
|||||||
color: colors.muted,
|
color: colors.muted,
|
||||||
fontSize: "12px",
|
fontSize: "12px",
|
||||||
textAlign: "center",
|
textAlign: "center",
|
||||||
}}
|
}}>
|
||||||
>
|
|
||||||
Your project is quiet. Add the first task when it arrives.
|
Your project is quiet. Add the first task when it arrives.
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : camino.tasks.map((task) => (
|
||||||
tasks.map((task) => (
|
|
||||||
<TodoComponent
|
<TodoComponent
|
||||||
key={task}
|
key={task}
|
||||||
forObject={task}
|
forObject={task}
|
||||||
@@ -193,8 +178,7 @@ export default function ProjectComponent({ camino, render }: ProjectComponentPro
|
|||||||
onAction={(action) => handleTaskAction(task, action)}
|
onAction={(action) => handleTaskAction(task, action)}
|
||||||
fallback={<div style={{ color: colors.muted, fontSize: "11px" }}>Waking task…</div>}
|
fallback={<div style={{ color: colors.muted, fontSize: "11px" }}>Waking task…</div>}
|
||||||
/>
|
/>
|
||||||
))
|
))}
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
);
|
);
|
||||||
|
|||||||
+22
-11
@@ -1,13 +1,24 @@
|
|||||||
import componentSource from "./project-component.js?browser-source";
|
import fs from "node:fs/promises";
|
||||||
import type { Contexts, Results } from "./gen/qx.js";
|
import path from "node:path";
|
||||||
|
import { fileURLToPath } from "node:url";
|
||||||
|
import { derived, type RuntimeContext } from "@quixos/camino-package-runtime";
|
||||||
|
|
||||||
|
const dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||||
|
const componentSourcePath = path.join(dirname, "project-component.mjs");
|
||||||
|
|
||||||
|
export const source = async () => await fs.readFile(componentSourcePath, "utf8");
|
||||||
|
|
||||||
|
export const createComponent = (context: RuntimeContext) => context.objectId;
|
||||||
|
|
||||||
|
export const props = derived(async (context: RuntimeContext) => {
|
||||||
|
const named = context.interface("port:project-react:named");
|
||||||
|
const tasks = context.interface("port:project-react:tasks");
|
||||||
|
return {
|
||||||
|
project_id: named.objectId,
|
||||||
|
component_id: context.objectId,
|
||||||
|
name: await named.live("operation:named:name:get"),
|
||||||
|
tasks: await tasks.invoke("operation:project-tasks:tasks:resolve"),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
export const source = () => componentSource;
|
|
||||||
export const createComponent = ({ objectId }: Contexts["createComponent"]) => objectId;
|
|
||||||
export const props = {
|
|
||||||
kind: "derived" as const,
|
|
||||||
get: async ({ ports }: Contexts["propsGet"]): Promise<Results["propsGet"]> => ({
|
|
||||||
named: ports.named.objectId,
|
|
||||||
tasks: ports.tasks.objectId,
|
|
||||||
}),
|
|
||||||
};
|
|
||||||
export const stopWatch = () => null;
|
export const stopWatch = () => null;
|
||||||
|
|||||||
+12
-16
@@ -1,17 +1,13 @@
|
|||||||
// Generated by qx-scaffold-v1
|
|
||||||
import { servePackageRuntime } from "@quixos/camino-package-runtime";
|
import { servePackageRuntime } from "@quixos/camino-package-runtime";
|
||||||
import { createRuntime } from "./gen/qx.js";
|
import { createComponent, props, source, stopWatch } from "./project-react.impl.js";
|
||||||
import { handler as impl0 } from "./impl/createComponent.js";
|
|
||||||
import { handler as impl1 } from "./impl/sourceGet.js";
|
servePackageRuntime({
|
||||||
import { handler as impl2 } from "./impl/propsGet.js";
|
packageRevisionId: "package:project-react-runtime@1",
|
||||||
import { handler as impl3 } from "./impl/propsWatch.js";
|
exports: {
|
||||||
import { handler as impl4 } from "./impl/propsWatchStop.js";
|
"export:project-react-runtime:create-component": createComponent,
|
||||||
servePackageRuntime(
|
"export:project-react-runtime:source-get": source,
|
||||||
createRuntime({
|
"export:project-react-runtime:props-get": props,
|
||||||
createComponent: impl0,
|
"export:project-react-runtime:props-watch": props,
|
||||||
sourceGet: impl1,
|
"export:project-react-runtime:props-watch-stop": stopWatch,
|
||||||
propsGet: impl2,
|
},
|
||||||
propsWatch: impl3,
|
});
|
||||||
propsWatchStop: impl4,
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|||||||
+2
-1
@@ -12,7 +12,8 @@
|
|||||||
"types": ["node"],
|
"types": ["node"],
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"jsx": "react-jsx"
|
"jsx": "react",
|
||||||
|
"jsxFactory": "h"
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts", "src/**/*.tsx"]
|
"include": ["src/**/*.ts", "src/**/*.tsx"]
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -161,7 +161,7 @@ cacheEntries = {
|
|||||||
"@connectrpc/connect@npm:2.1.2" = { filename = "@connectrpc-connect-npm-2.1.2-ab34825de3-4e15000890.zip"; hash = "sha512-ThUACJAjt1Lv1E+pQKWuHh+gDhvrxLoM7ScruTWSDYw7hbd0UOZErUQruMqaJ1sMFxNviWuo7/A2F4Ex2wHWFQ=="; };
|
"@connectrpc/connect@npm:2.1.2" = { filename = "@connectrpc-connect-npm-2.1.2-ab34825de3-4e15000890.zip"; hash = "sha512-ThUACJAjt1Lv1E+pQKWuHh+gDhvrxLoM7ScruTWSDYw7hbd0UOZErUQruMqaJ1sMFxNviWuo7/A2F4Ex2wHWFQ=="; };
|
||||||
"@esbuild/linux-arm64@npm:0.25.12" = { filename = "@esbuild-linux-arm64-npm-0.25.12-a5aaa0e70e-10c0.zip"; hash = "sha512-tm9zhnNR4GZv4A+Sgbt9jdCJ0iGlzvYxGCaxaScbhFH14mX7QWJRYaCvFCZB1dseApmaq6mNwbilL0wJnbB8tw=="; };
|
"@esbuild/linux-arm64@npm:0.25.12" = { filename = "@esbuild-linux-arm64-npm-0.25.12-a5aaa0e70e-10c0.zip"; hash = "sha512-tm9zhnNR4GZv4A+Sgbt9jdCJ0iGlzvYxGCaxaScbhFH14mX7QWJRYaCvFCZB1dseApmaq6mNwbilL0wJnbB8tw=="; };
|
||||||
"@esbuild/linux-x64@npm:0.25.12" = { filename = "@esbuild-linux-x64-npm-0.25.12-07c7c22cce-10c0.zip"; hash = "sha512-U2QGT8ZIZN8q2WPSFDC32+sZGKgp49gvnHzIf/vKVR4xIzjcgBbjAIKI+FqfGBmGBWu8eCpS7lR9JDXdUHOFkw=="; };
|
"@esbuild/linux-x64@npm:0.25.12" = { filename = "@esbuild-linux-x64-npm-0.25.12-07c7c22cce-10c0.zip"; hash = "sha512-U2QGT8ZIZN8q2WPSFDC32+sZGKgp49gvnHzIf/vKVR4xIzjcgBbjAIKI+FqfGBmGBWu8eCpS7lR9JDXdUHOFkw=="; };
|
||||||
"@quixos/camino-package-runtime@https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=cd2b04dc8c2daeea633bf8ecdd31d20fdc41f2ab" = { filename = "@quixos-camino-package-runtime-https-99aa94a9bf-7872db96f5.zip"; hash = "sha512-eHLblvUv7jzGJ45p9j7PY5UsK74OeyZp2Z36rC5ki0BlGUXgCHAzeJ6YvaWov64433kSLJT9NjkocOgUacVvZg=="; };
|
"@quixos/camino-package-runtime@https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=a998690446ecf647e3af78e369492c1a3663b66d" = { filename = "@quixos-camino-package-runtime-https-683bcbf33c-c90d5d5c53.zip"; hash = "sha512-yQ1dXFMR2k+xbkka2rrhsAcrQFZlJAZEYM0hqwGzdV5RJ+fhQEh3BEgoPiL2yxrxulU4zg/jsj8BTBFRp1feyg=="; };
|
||||||
"@types/node@npm:24.13.3" = { filename = "@types-node-npm-24.13.3-b512a0bbeb-a5bc08f49b.zip"; hash = "sha512-pbwI9JuVgdzcqQ4CzXcZejx5mECAdmSULlzVFhpVPU0q6AZPfjKUQQ10jX0Ji1wYSL5/pQwG8pxBk6sWvk5Z6w=="; };
|
"@types/node@npm:24.13.3" = { filename = "@types-node-npm-24.13.3-b512a0bbeb-a5bc08f49b.zip"; hash = "sha512-pbwI9JuVgdzcqQ4CzXcZejx5mECAdmSULlzVFhpVPU0q6AZPfjKUQQ10jX0Ji1wYSL5/pQwG8pxBk6sWvk5Z6w=="; };
|
||||||
"@types/prop-types@npm:15.7.15" = { filename = "@types-prop-types-npm-15.7.15-cefe16a1fa-b59aad1ad1.zip"; hash = "sha512-tZqtGtGb8XM89ST9TmGBlsbHaQ9I7nCjJ+tFCkKquOigY/vlnKClcBrr4tktWCKSwPuEXqV0dPahX2mUsOJgsg=="; };
|
"@types/prop-types@npm:15.7.15" = { filename = "@types-prop-types-npm-15.7.15-cefe16a1fa-b59aad1ad1.zip"; hash = "sha512-tZqtGtGb8XM89ST9TmGBlsbHaQ9I7nCjJ+tFCkKquOigY/vlnKClcBrr4tktWCKSwPuEXqV0dPahX2mUsOJgsg=="; };
|
||||||
"@types/react@npm:18.3.31" = { filename = "@types-react-npm-18.3.31-d376eb19a5-44180549dd.zip"; hash = "sha512-RBgFSd0EX1Nuzs0545qs34KOdq3BxKkLEy9FPiPMNwxGSNkQKuQBFy69j9ixl3qQGjniFOU+x3FxsnUUtYjBeQ=="; };
|
"@types/react@npm:18.3.31" = { filename = "@types-react-npm-18.3.31-d376eb19a5-44180549dd.zip"; hash = "sha512-RBgFSd0EX1Nuzs0545qs34KOdq3BxKkLEy9FPiPMNwxGSNkQKuQBFy69j9ixl3qQGjniFOU+x3FxsnUUtYjBeQ=="; };
|
||||||
|
|||||||
@@ -213,14 +213,14 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@quixos/camino-package-runtime@https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=cd2b04dc8c2daeea633bf8ecdd31d20fdc41f2ab":
|
"@quixos/camino-package-runtime@https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=a998690446ecf647e3af78e369492c1a3663b66d":
|
||||||
version: 0.1.0
|
version: 0.1.0
|
||||||
resolution: "@quixos/camino-package-runtime@https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=cd2b04dc8c2daeea633bf8ecdd31d20fdc41f2ab"
|
resolution: "@quixos/camino-package-runtime@https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=a998690446ecf647e3af78e369492c1a3663b66d"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@bufbuild/protobuf": "npm:^2.12.1"
|
"@bufbuild/protobuf": "npm:^2.12.1"
|
||||||
"@connectrpc/connect": "npm:^2.1.2"
|
"@connectrpc/connect": "npm:^2.1.2"
|
||||||
"@connectrpc/connect-node": "npm:^2.1.2"
|
"@connectrpc/connect-node": "npm:^2.1.2"
|
||||||
checksum: 10c0/7872db96f52fee3cc6278e69f63ecf63952c2bbe0e7b2669d99dfaac2e648b40651945e0087033789e98bda5a8bfae38df79122c94fd36392870e81469c56f66
|
checksum: 10c0/c90d5d5c5311da4fb16e491adabae1b0072b40566524064460cd21ab01b3755e5127e7e14048770448283e22f6cb1af1ba5538ce0fe3b23f014c1151a757deca
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
@@ -228,7 +228,7 @@ __metadata:
|
|||||||
version: 0.0.0-use.local
|
version: 0.0.0-use.local
|
||||||
resolution: "@quixos/project-react-runtime@workspace:."
|
resolution: "@quixos/project-react-runtime@workspace:."
|
||||||
dependencies:
|
dependencies:
|
||||||
"@quixos/camino-package-runtime": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=cd2b04dc8c2daeea633bf8ecdd31d20fdc41f2ab"
|
"@quixos/camino-package-runtime": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=a998690446ecf647e3af78e369492c1a3663b66d"
|
||||||
"@types/node": "npm:^24"
|
"@types/node": "npm:^24"
|
||||||
"@types/react": "npm:^18.3.12"
|
"@types/react": "npm:^18.3.12"
|
||||||
esbuild: "npm:^0.25.12"
|
esbuild: "npm:^0.25.12"
|
||||||
|
|||||||
Reference in New Issue
Block a user