Export template source from 1227e3672a5a24b7331567fc3f431e422e1513c1:quixos-instance/packages/project-react-runtime

This commit is contained in:
Quixos Template Publisher
2000-01-01 00:00:00 +00:00
commit 14aefcd80e
38 changed files with 3219 additions and 0 deletions
+2
View File
@@ -0,0 +1,2 @@
.yarn/install-state.gz
node_modules
+4
View File
@@ -0,0 +1,4 @@
{
"monorepoCommit": "1227e3672a5a24b7331567fc3f431e422e1513c1",
"sourcePath": "quixos-instance/packages/project-react-runtime"
}
File diff suppressed because one or more lines are too long
+29
View File
@@ -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
+9
View File
@@ -0,0 +1,9 @@
# Generated from the checked package contract
package_id: "package:project-react-runtime"
package_revision_id: "package:project-react-runtime@1"
runtime_protocol_version: "quixos-capabilities-v1"
exports: { export_id: "export:project-react-runtime:create-component" runtime_symbol: "createComponent" }
exports: { export_id: "export:project-react-runtime:source-get" runtime_symbol: "sourceGet" }
exports: { export_id: "export:project-react-runtime:props-get" runtime_symbol: "propsGet" }
exports: { export_id: "export:project-react-runtime:props-watch" runtime_symbol: "propsWatch" }
exports: { export_id: "export:project-react-runtime:props-watch-stop" runtime_symbol: "propsWatchStop" }
Generated
+80
View File
@@ -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
}
+38
View File
@@ -0,0 +1,38 @@
{
description = "Quixos project React component runtime package";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
quixosNixHelpers = {
url = "git+https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-nix-helpers.git?ref=refs/tags/quixos-reachability/e2747066ca7d9d001dcb5dd936e17969ed88fc5f&rev=e2747066ca7d9d001dcb5dd936e17969ed88fc5f";
flake = false;
};
};
outputs =
inputs@{
nixpkgs,
flake-utils,
quixosNixHelpers,
...
}:
let
quixosHelpers = import "${quixosNixHelpers}/quixos-package-helpers.nix";
in
quixosHelpers.mkCaminoTsYarnNixifyFlake {
inherit inputs nixpkgs flake-utils;
packageRoot = ./.;
migrationEntrypoint = "dist/migrate.js";
promptName = "project-react-runtime";
bundle = {
entry = "src/server.ts";
browserSources = true;
};
installServer = {
libexecName = "project-react-runtime";
descriptorPath = "descriptor.quixos-package.txtpb";
};
};
}
+24
View File
@@ -0,0 +1,24 @@
{
"name": "@quixos/project-react-runtime",
"version": "0.1.0",
"private": true,
"packageManager": "yarn@4.18.0",
"type": "module",
"bin": {
"server": "dist/server.js"
},
"scripts": {
"build": "rm -rf dist && tsc -p tsconfig.build.json",
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@quixos/camino-package-runtime": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=86933aa97f3ea386a4c5cfeb28386fd8d2722075",
"react": "^18.3.1"
},
"devDependencies": {
"@types/node": "^24",
"@types/react": "^18.3.12",
"esbuild": "^0.25.12",
"typescript": "^7.0.2"
}
}
+48
View File
@@ -0,0 +1,48 @@
import interface TagData;
import interface CompletionData;
import interface TaskActions;
import interface TaskData;
import interface ProjectActions;
external atom Task id "atom:task";
external atom Tag id "atom:tag";
external atom Completion id "atom:completion";
import interface Named;
import interface ProjectTasks;
external atom ProjectReactComponent id "atom:project-react-component";
external atom Project id "atom:project";
type ProjectProps = record {named: interface-ref<Named>; tasks: interface-ref<ProjectTasks>;};
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>;
operation sourceGet id "export:project-react-runtime:source-get" : unit -> string mode call receiver atom ProjectReactComponent;
operation propsGet id "export:project-react-runtime:props-get" : unit -> ProjectProps mode call receiver atom ProjectReactComponent requires {
interface named id "port:project-react:named" : Named;
interface tasks id "port:project-react:tasks" : ProjectTasks;
};
operation propsWatch id "export:project-react-runtime:props-watch" : unit -> watch-handle mode watch-start emits ProjectProps receiver atom ProjectReactComponent requires {
interface named id "port:project-react:named" : Named;
interface tasks id "port:project-react:tasks" : ProjectTasks;
};
operation propsWatchStop id "export:project-react-runtime:props-watch-stop" : watch-handle -> unit mode watch-stop receiver atom ProjectReactComponent;
query Tasks id "query:Tasks" root ProjectTasks document "queries/Tasks.graphql" operation "Tasks" {
view Task as TaskData; view Tag as TagData; view Completion as CompletionData;
max rows 100; max depth 8; max result-bytes 1048576; watch;
}
query TaggedTasks id "query:TaggedTasks" root ProjectTasks document "queries/TaggedTasks.graphql" operation "TaggedTasks" {
view Task as TaskData; view Tag as TagData; view Completion as CompletionData;
max rows 100; max depth 8; max result-bytes 1048576; watch;
}
query UntaggedTasks id "query:UntaggedTasks" root ProjectTasks document "queries/UntaggedTasks.graphql" operation "UntaggedTasks" {
view Task as TaskData; view Tag as TagData; view Completion as CompletionData;
max rows 100; max depth 8; max result-bytes 1048576; watch;
}
query Catalog id "query:Catalog" root ProjectTasks document "queries/Catalog.graphql" operation "Catalog" {
view Task as TaskData; view Tag as TagData; view Completion as CompletionData;
max rows 100; max depth 8; max result-bytes 1048576; watch;
}
query Summary id "query:Summary" root ProjectTasks document "queries/Summary.graphql" operation "Summary" {
view Task as TaskData; view Tag as TagData; view Completion as CompletionData;
max rows 100; max depth 8; max result-bytes 1048576; watch;
}
}
+1
View File
@@ -0,0 +1 @@
query Catalog {root {tags(all: 100, orderBy: [{name: ASC}]) {entries {node {_qx {ref} name color}}}}}
+8
View File
@@ -0,0 +1,8 @@
query Summary {root {_qx {relations {tasks {
aggregate {count sum {estimatedHours}}
groups(by: {status: true}, first: 10) {entries {group {status} aggregate {count sum {estimatedHours}}}}
filter(where: {status: {eq: "OPEN"}}) {expand {tags {
groups(by: {target: {_qx: {ref: true}, name: true, color: true}}, first: 100,
orderBy: [{count: DESC}]) {entries {group {target {_qx {ref} name color}} aggregate {count sum {source {estimatedHours}}}}}
}}}
}}}}}
+4
View File
@@ -0,0 +1,4 @@
query TaggedTasks($first: Int!, $after: Cursor, $statuses: [String!]!, $tags: [QxRef_TagData!]!) {root {tasks(first: $first, after: $after, where: {status: {in: $statuses}, _qx: {relations: {tags: {some: {_qx: {ref: {in: $tags}}}}}}}, orderBy: [{dueDate: ASC}, {title: ASC}]) {entries { key node {_qx {ref} title @live status priority dueDate repeatDays estimatedHours
tags(all: 100) {entries {node {_qx {ref} name color}}}
_qx {relations {completions {aggregate {count max {completedAt}}}}}
}} pageInfo {hasNextPage endCursor}}}}
+4
View File
@@ -0,0 +1,4 @@
query Tasks($first: Int!, $after: Cursor, $statuses: [String!]!) {root {tasks(first: $first, after: $after, where: {status: {in: $statuses}}, orderBy: [{dueDate: ASC}, {title: ASC}]) {entries { key node {_qx {ref} title @live status priority dueDate repeatDays estimatedHours
tags(all: 100) {entries {node {_qx {ref} name color}}}
_qx {relations {completions {aggregate {count max {completedAt}}}}}
}} pageInfo {hasNextPage endCursor}}}}
+4
View File
@@ -0,0 +1,4 @@
query UntaggedTasks($first: Int!, $after: Cursor, $statuses: [String!]!) {root {tasks(first: $first, after: $after, where: {status: {in: $statuses}, _qx: {relations: {tags: {none: {}}}}}, orderBy: [{dueDate: ASC}, {title: ASC}]) {entries { key node {_qx {ref} title @live status priority dueDate repeatDays estimatedHours
tags(all: 100) {entries {node {_qx {ref} name color}}}
_qx {relations {completions {aggregate {count max {completedAt}}}}}
}} pageInfo {hasNextPage endCursor}}}}
+10
View File
@@ -0,0 +1,10 @@
{
"backend": "typescript",
"bindingOutput": "src/gen/qx.ts",
"options": {
"react": {
"propsExports": ["propsGet"],
"components": [{ "module": "../project-component.js", "propsExport": "propsGet" }]
}
}
}
+34
View File
@@ -0,0 +1,34 @@
quixos-lock version 1 {
quixos source {
repository "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos.git";
commit "1227e3672a5a24b7331567fc3f431e422e1513c1";
}
interface Named source {
repository "https://repos.quixos.org/quixos-todo/interface-named.git";
commit "0000000000000000000000000000000000000010";
}
interface ProjectTasks source {
repository "https://repos.quixos.org/quixos-todo/interface-project-tasks.git";
commit "0000000000000000000000000000000000000012";
}
interface TagData source {
repository "https://repos.quixos.org/quixos-todo/interface-tag-data.git";
commit "0000000000000000000000000000000000000030";
}
interface CompletionData source {
repository "https://repos.quixos.org/quixos-todo/interface-completion-data.git";
commit "0000000000000000000000000000000000000031";
}
interface TaskData source {
repository "https://repos.quixos.org/quixos-todo/interface-task-data.git";
commit "0000000000000000000000000000000000000011";
}
interface TaskActions source {
repository "https://repos.quixos.org/quixos-todo/interface-task-actions.git";
commit "0000000000000000000000000000000000000014";
}
interface ProjectActions source {
repository "https://repos.quixos.org/quixos-todo/interface-project-actions.git";
commit "0000000000000000000000000000000000000013";
}
}
+6
View File
@@ -0,0 +1,6 @@
{
"generatedBy": "qx-scaffold-v1",
"schemaVersion": 1,
"contracts": {},
"migrations": []
}
+4
View File
@@ -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"
}
+5
View File
@@ -0,0 +1,5 @@
declare module "*?browser-source" {
const source: string;
export default source;
}
declare module "*.css";
@@ -0,0 +1,26 @@
// @generated by camino-codegen-ts-runtime. Do not edit.
import {
createWebStudioComponent,
type ReactComponentHostProps,
type ObjectRef,
} from "@quixos/web-studio-react-runtime";
export type ProjectReactComponentRenderProps = {
"compact"?: boolean;
};
export type Empty = {
};
export type ProjectComponentProps = {
forObject: ObjectRef<"atom:project">;
} & ProjectReactComponentRenderProps & ReactComponentHostProps<Record<string, never>>;
export const ProjectComponent = createWebStudioComponent<
ObjectRef<"atom:project">,
ProjectReactComponentRenderProps,
Record<string, never>
>({
expectedAtomId: "atom:project",
});
@@ -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<TodoReactComponentAction>;
export const TodoComponent = createWebStudioComponent<
ObjectRef<"atom:task">,
TodoReactComponentRenderProps,
TodoReactComponentAction
>({
expectedAtomId: "atom:task",
});
+1186
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+66
View File
@@ -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<Record<"get" | "watch" | "register" | "crdt" | "setter", Readonly<{started: number; active: number; completed: number; failed: number; totalMs: number}>>>;
export type ObjectRef<AtomId extends string> = string & {
readonly $quixosAtom: AtomId;
};
export type FieldCapability = {objectId: string; interfaceRevisionId: string; getOperationId: string; watchOperationId?: string; setOperationId?: string; inputKind?: "fields" | "value"};
export type ReadableField<T> = {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<T> = ReadableField<T> & {readonly $writeType?: (value: T) => T; readonly writable: true; readonly capability: FieldCapability & {setOperationId: string}};
export type LiveFieldProp<T> = ReadableField<T>;
export type InterfaceReference<I extends string, Fields> = {readonly $quixosRef: string; readonly interfaceRevisionId: I; readonly fields: Fields};
export type ReactInterfaceContract<View> = {readonly interfaceRevisionId: string; readonly $viewType?: (view: View) => View};
export function defineReactInterfaceContract<View>(interfaceRevisionId: string, interfaces: unknown): ReactInterfaceContract<View>;
export function tryConform<View>(object: string | {readonly $quixosRef: string}, contract: ReactInterfaceContract<View>, options?: {signal?: AbortSignal}): Promise<View | undefined>;
export type ConformanceResult<View> = {status: "loading"} | {status: "absent"} | {status: "available"; view: View} | {status: "error"; error: Error};
export function useTryConform<View>(object: string | {readonly $quixosRef: string}, contract: ReactInterfaceContract<View>): ConformanceResult<View>;
export type QueryValueType = {kind: "builtin" | "scalar"; name: string} | {kind: "record"; fields: Record<string, QueryValueType>} | {kind: "optional" | "list"; value: QueryValueType} | {kind: "object-ref"; expectation: {kind: "atom"; atomId: string} | {kind: "interface"; interfaceRevisionId: string}};
export type QueryReference<Contract extends string = string> = {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<Variables, Result> {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> = T extends {readonly $quixosRef: string} | {readonly capability: {readonly getOperationId: string}} ? T : T extends readonly (infer Item)[] ? QueryPartial<Item>[] : T extends object ? {[Key in keyof T]?: QueryPartial<T[Key]>} : T;
export type QueryFieldState = {path: readonly (string | number)[]; status: "pending" | "error"; error?: string};
export type QueryState<T> = {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<T>; error?: undefined} | {status: "error"; data?: T | QueryPartial<T>; error: Error});
export function useQuery<Variables, Result>(descriptor: QueryDescriptor<Variables, Result>, options: {root: string | {readonly $quixosRef: string}; variables: Variables}): QueryState<Result> & {refresh(): void};
export interface QueryConnection<Row> {entries: {key: string; node: Row; cursor?: string | null}[]; pageInfo: {hasNextPage: boolean; endCursor?: string | null}}
export function CollectionView<Result, Row>(props: {result: QueryState<Result> & {refresh(): void}; connection(data: QueryPartial<Result>): QueryPartial<QueryConnection<Row>> | undefined; renderItem(row: QueryPartial<Row>, 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<Action> = {
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<CaminoProps, RenderProps, Action> = {
camino: CaminoProps;
render: RenderProps;
dispatch: (action: Action) => void;
};
export const createWebStudioComponent: <
ForObject extends ObjectRef<string>, RenderProps extends object, Action,
>(config: { expectedAtomId: string }) => (props: {
forObject: ForObject;
} & RenderProps & ReactComponentHostProps<Action>) => any;
export const invokeCapability: <Result = unknown>(
objectId: string,
interfaceRevisionId: string,
operationId: string,
value?: unknown,
options?: {clientMutationId?: string; signal?: AbortSignal},
) => Promise<Result>;
export const h: typeof React.createElement;
export type LiveFieldState<T> = {refreshing: boolean; stale: boolean; pendingWrites: number; writeError?: Error; refresh(): Promise<void>; discard(): void} & ({status: "loading"; value?: undefined; error?: undefined} | {status: "ready"; value: T; error?: Error} | {status: "error"; value?: undefined; error: Error});
export type WritableLiveFieldState<T> = LiveFieldState<T> & {set(value: T): Promise<void>; retry(): Promise<void>};
export function useLiveField<T>(field: ReadableField<T>, options: {id: string; write: (value: T) => Promise<void>}): WritableLiveFieldState<T>;
export function useLiveField<T>(field: WritableField<T>): WritableLiveFieldState<T>;
export function useLiveField<T>(field: ReadableField<T>): LiveFieldState<T>;
export function useSuspenseLiveField<T>(field: WritableField<T>): WritableLiveFieldState<T> & {status: "ready"; value: T};
export function useSuspenseLiveField<T>(field: ReadableField<T>): LiveFieldState<T> & {status: "ready"; value: T};
}
+2
View File
@@ -0,0 +1,2 @@
// This adapter keeps the implementation file hand-authored.
export { createComponent as handler } from "../project-react.impl.js";
+2
View File
@@ -0,0 +1,2 @@
// This adapter keeps the implementation file hand-authored.
export { props as handler } from "../project-react.impl.js";
+2
View File
@@ -0,0 +1,2 @@
// This adapter keeps the implementation file hand-authored.
export { props as handler } from "../project-react.impl.js";
+2
View File
@@ -0,0 +1,2 @@
// This adapter keeps the implementation file hand-authored.
export { stopWatch as handler } from "../project-react.impl.js";
+2
View File
@@ -0,0 +1,2 @@
// This adapter keeps the implementation file hand-authored.
export { source as handler } from "../project-react.impl.js";
+3
View File
@@ -0,0 +1,3 @@
// Generated by qx-scaffold-v1
import { serveMigration } from "@quixos/camino-package-runtime";
await serveMigration({});
+364
View File
@@ -0,0 +1,364 @@
import { useState } from "react";
import {
createWebStudioComponent,
tryConform,
useLiveField,
useQuery,
type ObjectRef,
type QueryState,
type ReactComponentImplementationProps,
} from "@quixos/web-studio-react-runtime";
import {
queries,
reactInterfaces,
type QueryResults,
type QueryVariables,
type ReactResults,
} from "./gen/react-props.gen.js";
import "./tracker.css";
type Tag = QueryResults["Catalog"]["root"]["tags"]["entries"][number]["node"];
type TagChoice = { id: string; name: string; color: string };
const TaskEditor = createWebStudioComponent<ObjectRef<"atom:task">, { tagChoices: TagChoice[] }, never>({
expectedAtomId: "atom:task",
});
type Props = ReactComponentImplementationProps<ReactResults["propsGet"], { compact?: boolean }, never>;
type ListProps = {
root: string;
variables: QueryVariables["Tasks"];
selected: string | null;
select(id: string): void;
next(cursor: string | null): void;
reset(): void;
};
function TaskTitle({ field }: { field: QueryResults["Tasks"]["root"]["tasks"]["entries"][number]["node"]["title"] }) {
const title = useLiveField(field);
return <strong>{title.value ?? "Loading…"}</strong>;
}
function Rows({ result, selected, select, next, reset }: ListProps & { result: QueryState<QueryResults["Tasks"]> }) {
if (result.status === "error")
return (
<div role="alert" className="tt-notice">
{result.error.message}
<button onClick={reset}>Return to first page</button>
</div>
);
if (result.status !== "ready") return <p className="tt-notice">Loading tasks…</p>;
const page = result.data.root.tasks;
return (
<>
<div className="tt-rows" aria-label="Tasks">
{page.entries.length === 0 && <p className="tt-notice">No tasks match this view.</p>}
{page.entries.map(({ key, node: task }) => (
<button
className={"tt-row" + (selected === task._qx.ref.$quixosRef ? " is-selected" : "")}
aria-pressed={selected === task._qx.ref.$quixosRef}
key={key}
onClick={() => select(task._qx.ref.$quixosRef)}
>
<span className={"tt-status status-" + task.status.toLowerCase()}>
{task.status === "DONE" ? "✓" : task.status === "ARCHIVED" ? "—" : "○"}
</span>
<span className="tt-row-body">
<TaskTitle field={task.title} />
<span className="tt-row-meta">
{task.dueDate || "No due date"}
{task.repeatDays > 0 ? ` · Every ${task.repeatDays}d` : ""}
{task.estimatedHours > 0 ? ` · ${task.estimatedHours}h` : ""}
{task.priority === "HIGH" ? " · High priority" : ""}
</span>
<span className="tt-tag-line">
{task.tags.entries.map(({ node: tag }) => (
<span className="tt-tag" key={tag._qx.ref.$quixosRef}>
<i style={{ background: tag.color }} />
{tag.name}
</span>
))}
</span>
{task._qx.relations.completions.aggregate.count > 0n && (
<span className="tt-row-meta">
{String(task._qx.relations.completions.aggregate.count)} completions
</span>
)}
</span>
</button>
))}
</div>
<div className="tt-page">
<button onClick={reset}>First page</button>
{page.pageInfo.hasNextPage && <button onClick={() => next(page.pageInfo.endCursor)}>Next 50 tasks →</button>}
</div>
</>
);
}
function AllRows(props: ListProps) {
return <Rows {...props} result={useQuery(queries.Tasks, { root: props.root, variables: props.variables })} />;
}
function UntaggedRows(props: ListProps) {
return <Rows {...props} result={useQuery(queries.UntaggedTasks, { root: props.root, variables: props.variables })} />;
}
function TaggedRows(props: ListProps & { tags: Tag["_qx"]["ref"][] }) {
return (
<Rows
{...props}
result={useQuery(queries.TaggedTasks, { root: props.root, variables: { ...props.variables, tags: props.tags } })}
/>
);
}
export default function ProjectComponent({ camino }: Props) {
const nameField = useLiveField(camino.named.fields.name);
const name = nameField.value ?? "";
const setName = nameField.set;
const root = camino.tasks.$quixosRef;
const catalog = useQuery(queries.Catalog, { root, variables: {} });
const summary = useQuery(queries.Summary, { root, variables: {} });
const [selected, setSelected] = useState<string | null>(null);
const [status, setStatus] = useState("OPEN");
const [tagIds, setTagIds] = useState<string[]>([]);
const [untagged, setUntagged] = useState(false);
const [after, setAfter] = useState<string | null>(null);
const [newTitle, setNewTitle] = useState("");
const [newTag, setNewTag] = useState("");
const [busy, setBusy] = useState(false);
const [error, setError] = useState("");
const tags = catalog.status === "ready" ? catalog.data.root.tags.entries.map((e) => e.node) : [];
const run = async (action: () => Promise<unknown>) => {
if (busy) return;
setBusy(true);
setError("");
try {
await action();
} catch (e) {
setError(e instanceof Error ? e.message : String(e));
} finally {
setBusy(false);
}
};
const actions = async () => {
const view = await tryConform(root, reactInterfaces.ProjectActions);
if (!view) throw new Error("This project no longer supports task actions");
return view.call;
};
const addTask = () =>
run(async () => {
if (!newTitle.trim()) return;
const task = await (await actions())["addTask.call"](newTitle.trim());
setNewTitle("");
setAfter(null);
setStatus("OPEN");
setTagIds([]);
setUntagged(false);
setSelected(task);
});
const editTag = (tag: Tag, field: "name" | "color", value: string) =>
run(async () => {
if (!value.trim()) throw new Error("A tag needs a name");
const view = await tryConform(tag._qx.ref, reactInterfaces.TagData);
if (!view) throw new Error("Tag is no longer available");
await view.call[field === "name" ? "name.set" : "color.set"](value);
});
const choices = tags.map((tag) => ({ id: tag._qx.ref.$quixosRef, name: tag.name, color: tag.color }));
const totals = summary.status === "ready" ? summary.data.root._qx.relations.tasks : undefined;
const list: ListProps = {
root,
variables: { first: 50, after, statuses: status === "ALL" ? ["OPEN", "DONE", "ARCHIVED"] : [status] },
selected,
select: setSelected,
next: setAfter,
reset: () => {
setAfter(null);
},
};
const activeTags = tags.filter((t) => tagIds.includes(t._qx.ref.$quixosRef));
return (
<section className="tt-board">
<header className="tt-header">
<input
aria-label="Project name"
value={name}
onChange={(e) => {
void setName(e.target.value).catch((err) => setError(String(err)));
}}
/>
<span>{totals ? `${String(totals.aggregate.count)} tasks` : "Task tracker"}</span>
</header>
{error && (
<div role="alert" className="tt-error">
{error}
</div>
)}
<form
className="tt-add"
onSubmit={(e) => {
e.preventDefault();
void addTask();
}}
>
<input
aria-label="New task title"
placeholder="Add a task"
value={newTitle}
onChange={(e) => setNewTitle(e.target.value)}
disabled={busy}
/>
<button disabled={busy || !newTitle.trim()} type="submit">
Add task
</button>
</form>
<nav className="tt-filters" aria-label="Task filters">
<select
aria-label="Task status"
value={status}
onChange={(e) => {
setStatus(e.target.value);
setAfter(null);
}}
>
<option value="OPEN">Open</option>
<option value="DONE">Done</option>
<option value="ARCHIVED">Archived</option>
<option value="ALL">All statuses</option>
</select>
<button
aria-pressed={!untagged && tagIds.length === 0}
onClick={() => {
setTagIds([]);
setUntagged(false);
setAfter(null);
}}
>
All tags
</button>
<button
aria-pressed={untagged}
onClick={() => {
setTagIds([]);
setUntagged(true);
setAfter(null);
}}
>
Untagged
</button>
{tags.map((tag) => (
<button
key={tag._qx.ref.$quixosRef}
aria-pressed={tagIds.includes(tag._qx.ref.$quixosRef)}
onClick={() => {
setUntagged(false);
setAfter(null);
setTagIds((ids) =>
ids.includes(tag._qx.ref.$quixosRef)
? ids.filter((id) => id !== tag._qx.ref.$quixosRef)
: [...ids, tag._qx.ref.$quixosRef],
);
}}
>
<i style={{ background: tag.color }} />
{tag.name}
</button>
))}
</nav>
{tagIds.length > 1 && <p className="tt-filter-note">Matching any selected tag</p>}
{catalog.status === "error" && (
<p role="alert" className="tt-error">
Tags: {catalog.error.message}
</p>
)}
<main className={"tt-body" + (selected ? " has-detail" : "")}>
<section className="tt-list">
{untagged ? (
<UntaggedRows {...list} />
) : activeTags.length ? (
<TaggedRows {...list} tags={activeTags.map((t) => t._qx.ref)} />
) : (
<AllRows {...list} />
)}
</section>
<section className="tt-detail">
{selected ? (
<>
<div className="tt-detail-bar">
<button onClick={() => setSelected(null)}>← Task list</button>
<a href={`/entity/${encodeURIComponent(selected)}`}>Open separately ↗</a>
</div>
{/* The queried relation explicitly targets atom Task; query refs carry its TaskData view. */}
<TaskEditor
forObject={selected as ObjectRef<"atom:task">}
tagChoices={choices}
style={{ flex: 1, minHeight: 0, height: "100%" }}
/>
</>
) : (
<div className="tt-empty">Select a task to edit it or view completion history.</div>
)}
</section>
</main>
<details className="tt-manage">
<summary>Tags & project totals</summary>
<div className="tt-management">
<section>
<h3>Tags</h3>
{tags.map((tag) => (
<div className="tt-tag-edit" key={tag._qx.ref.$quixosRef}>
<input
aria-label={`Color for ${tag.name}`}
type="color"
value={/^#[0-9a-f]{6}$/i.test(tag.color) ? tag.color : "#557a68"}
disabled={busy}
onChange={(e) => {
void editTag(tag, "color", e.target.value);
}}
/>
<input
aria-label={`Rename ${tag.name}`}
defaultValue={tag.name}
key={tag.name}
disabled={busy}
onBlur={(e) => {
if (e.target.value !== tag.name) void editTag(tag, "name", e.target.value);
}}
/>
</div>
))}
<form
className="tt-add"
onSubmit={(e) => {
e.preventDefault();
void run(async () => {
await (await actions())["addTag.call"](newTag);
setNewTag("");
});
}}
>
<input
aria-label="New tag name"
placeholder="New tag"
value={newTag}
onChange={(e) => setNewTag(e.target.value)}
/>
<button disabled={busy || !newTag.trim()}>Add tag</button>
</form>
</section>
<section>
<h3>Project totals</h3>
{summary.status === "error" && <p role="alert">{summary.error.message}</p>}
{totals?.groups.entries.map((row) => (
<p key={row.group.status}>
{row.group.status.toLowerCase()}: <strong>{String(row.aggregate.count)}</strong> ·{" "}
{row.aggregate.sum.estimatedHours ?? 0}h estimated
</p>
))}
<h4>Open tasks by tag</h4>
{totals?.filter.expand.tags.groups.entries.map((row) => (
<p key={row.group.target._qx.ref.$quixosRef}>
<i style={{ background: row.group.target.color }} />
{row.group.target.name}: {String(row.aggregate.count)} · {row.aggregate.sum.source.estimatedHours ?? 0}h
</p>
))}
<small>A task can contribute to more than one tag. Project totals count each task once.</small>
</section>
</div>
</details>
</section>
);
}
+13
View File
@@ -0,0 +1,13 @@
import componentSource from "./project-component.js?browser-source";
import type { Contexts, Results } from "./gen/qx.js";
export const source = () => componentSource;
export const createComponent = ({ objectId }: Contexts["createComponent"]) => objectId;
export const props = {
kind: "derived" as const,
get: async ({ ports }: Contexts["propsGet"]): Promise<Results["propsGet"]> => ({
named: ports.named.objectId,
tasks: ports.tasks.objectId,
}),
};
export const stopWatch = () => null;
+17
View File
@@ -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,
}),
);
+276
View File
@@ -0,0 +1,276 @@
.tt-board {
height: 100%;
min-height: 360px;
min-width: 0;
display: flex;
flex-direction: column;
overflow: hidden;
background: #fcfcf8;
color: #27372d;
font:
14px/1.45 system-ui,
sans-serif;
container-type: inline-size;
}
.tt-board * {
box-sizing: border-box;
}
.tt-board button,
.tt-board input,
.tt-board select {
font: inherit;
color: inherit;
border: 1px solid #ced8cb;
border-radius: 7px;
background: #fff;
padding: 8px 11px;
min-width: 0;
}
.tt-board button {
cursor: pointer;
}
.tt-board button:hover {
background: #eef3e9;
}
.tt-board button:disabled {
opacity: 0.55;
cursor: wait;
}
.tt-board button[aria-pressed="true"] {
background: #e2eedb;
border-color: #789569;
}
.tt-board :focus-visible {
outline: 2px solid #42765a;
outline-offset: 2px;
}
.tt-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
padding: 18px 20px 8px;
}
.tt-header input {
font-size: 22px;
font-weight: 650;
border-color: transparent;
background: transparent;
flex: 1;
}
.tt-header span,
.tt-row-meta,
.tt-filter-note,
.tt-management small {
color: #647064;
font-size: 12px;
}
.tt-add {
display: flex;
gap: 8px;
padding: 10px 20px;
}
.tt-add input {
flex: 1;
}
.tt-filters {
display: flex;
align-items: center;
gap: 6px;
flex-wrap: wrap;
padding: 8px 20px 14px;
border-bottom: 1px solid #dce2d7;
max-height: 160px;
overflow: auto;
}
.tt-filters button {
font-size: 12px;
padding: 5px 9px;
}
.tt-board i {
display: inline-block;
width: 9px;
height: 9px;
border-radius: 50%;
margin-right: 6px;
flex: none;
}
.tt-filter-note {
margin: 5px 20px;
}
.tt-body {
display: grid;
grid-template-columns: minmax(220px, 2fr) minmax(280px, 3fr);
flex: 1;
min-height: 0;
overflow: hidden;
}
.tt-list {
display: flex;
flex-direction: column;
min-height: 0;
min-width: 0;
border-right: 1px solid #dce2d7;
}
.tt-rows {
overflow: auto;
min-height: 0;
flex: 1;
display: flex;
flex-direction: column;
align-items: stretch;
}
.tt-board .tt-row {
display: flex;
gap: 10px;
text-align: left;
flex: none;
width: 100%;
height: auto;
border: 0;
border-bottom: 1px solid #e4e9df;
border-radius: 0;
padding: 14px 18px;
background: transparent;
}
.tt-board .tt-row.is-selected {
background: #eaf1e4;
box-shadow: inset 3px 0 #557a46;
}
.tt-row-body {
display: flex;
flex-direction: column;
gap: 4px;
min-width: 0;
flex: 1;
}
.tt-row strong {
overflow-wrap: anywhere;
font-size: 14px;
font-weight: 600;
}
.tt-status {
font-size: 20px;
line-height: 1.2;
color: #62804f;
}
.tt-tag-line {
display: flex;
gap: 5px;
flex-wrap: wrap;
}
.tt-tag {
background: #f1f3ed;
border: 1px solid #dce3d4;
border-radius: 4px;
font-size: 11px;
padding: 1px 5px;
}
.tt-page,
.tt-detail-bar {
display: flex;
justify-content: space-between;
gap: 10px;
padding: 8px 12px;
flex: none;
border-top: 1px solid #dce2d7;
font-size: 12px;
}
.tt-detail-bar {
border-top: 0;
border-bottom: 1px solid #dce2d7;
align-items: center;
}
.tt-detail-bar a {
color: #42694b;
}
.tt-detail {
display: flex;
flex-direction: column;
min-height: 0;
min-width: 0;
overflow: auto;
background: #fff;
}
.tt-empty,
.tt-notice {
padding: 24px;
color: #697568;
}
.tt-empty {
margin: auto;
text-align: center;
max-width: 300px;
}
.tt-error {
padding: 10px 20px;
background: #fff1ec;
color: #933d2f;
overflow-wrap: anywhere;
}
.tt-manage {
border-top: 1px solid #dce2d7;
flex: none;
max-height: 40%;
overflow: auto;
background: #f6f8f1;
}
.tt-manage summary {
padding: 10px 20px;
cursor: pointer;
}
.tt-management {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 24px;
padding: 0 20px 18px;
}
.tt-management h3 {
font-size: 14px;
}
.tt-management h4 {
margin-bottom: 5px;
}
.tt-management p {
margin: 5px 0;
font-size: 13px;
}
.tt-management .tt-add {
padding: 10px 0;
}
.tt-tag-edit {
display: flex;
gap: 8px;
margin: 6px 0;
}
.tt-tag-edit input[type="color"] {
width: 40px;
padding: 3px;
height: 35px;
}
.tt-tag-edit input:not([type="color"]) {
flex: 1;
}
@container (max-width:650px) {
.tt-body {
grid-template-columns: 1fr;
}
.tt-body:not(.has-detail) .tt-detail,
.tt-body.has-detail .tt-list {
display: none;
}
.tt-management {
grid-template-columns: 1fr;
}
.tt-header {
padding: 10px;
}
.tt-header span {
display: none;
}
.tt-add,
.tt-filters {
padding-left: 12px;
padding-right: 12px;
}
}
+7
View File
@@ -0,0 +1,7 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"declaration": true,
"sourceMap": true
}
}
+18
View File
@@ -0,0 +1,18 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"preserveSymlinks": true,
"resolveJsonModule": true,
"types": ["node"],
"outDir": "dist",
"rootDir": "src",
"jsx": "react-jsx"
},
"include": ["src/**/*.ts", "src/**/*.tsx"]
}
+180
View File
@@ -0,0 +1,180 @@
# This file is generated by running "yarn install" inside your project.
# Manual changes might be lost - proceed with caution!
{ lib, stdenv, nodejs, git, cacert, fetchurl, writeShellScript, writeShellScriptBin }:
{ src, overrideAttrs ? null, ... } @ args:
let
yarnBin = fetchurl {
url = "https://repo.yarnpkg.com/4.18.0/packages/yarnpkg-cli/bin/yarn.js";
hash = "sha512-/Lhxb+fNDuzhQf/Bi5IZOp35IEwbqDGJwoiDUiP8C75kr0c7qw1emSen2utcryuwfrJ4fMkzjKBA6hJfKh8vfg==";
};
cacheFolder = ".yarn/cache";
lockfile = ./yarn.lock;
# Call overrideAttrs on a derivation if a function is provided.
optionalOverride = fn: drv:
if fn == null then drv else drv.overrideAttrs fn;
# Simple stub that provides the global yarn command.
yarn = writeShellScriptBin "yarn" ''
exec '${nodejs}/bin/node' '${yarnBin}' "$@"
'';
# Common attributes between Yarn derivations.
drvCommon = {
# Make sure the build uses the right Node.js version everywhere.
buildInputs = [ nodejs yarn ];
# All dependencies should already be cached.
yarn_enable_network = "0";
# Tell node-gyp to use the provided Node.js headers for native code builds.
npm_config_nodedir = nodejs;
};
# Comman variables that we set in a Nix build, but not in a Nix shell.
buildVars = ''
# Make Yarn produce friendlier logging for automated builds.
export CI=1
# Tell node-pre-gyp to never fetch binaries / always build from source.
export npm_config_build_from_source=true
'';
# Create derivations for fetching dependencies.
cacheDrvs = let
in lib.mapAttrs (locator: { filename, hash }: stdenv.mkDerivation {
name = lib.strings.sanitizeDerivationName locator;
buildInputs = [ yarn git cacert ];
buildCommand = ''
cd '${src}'
${buildVars}
HOME="$TMP" yarn_enable_global_cache=false yarn_cache_folder="$TMP" \
yarn nixify fetch ${lib.escapeShellArg locator}
# Because we change the cache dir, Yarn may generate a different name.
mv "$TMP/$(sed 's/-[^-]*\.[^-]*$//' <<< "$outputFilename")"-* $out
'';
outputFilename = filename;
outputHash = hash;
}) cacheEntries;
# Create a shell snippet to copy dependencies from a list of derivations.
mkCacheBuilderForDrvs = drvs:
writeShellScript "collect-yarn-cache" (lib.concatMapStrings (drv: ''
cp --reflink=auto ${drv} '${drv.outputFilename}'
'') drvs);
# Main project derivation.
project = stdenv.mkDerivation (drvCommon // {
inherit src;
name = "@quixos/project-react-runtime";
configurePhase = ''
${buildVars}
# Copy over the Yarn cache.
rm -fr '${cacheFolder}'
mkdir -p '${cacheFolder}'
pushd '${cacheFolder}' > /dev/null
source ${mkCacheBuilderForDrvs (lib.attrValues cacheDrvs)}
popd > /dev/null
# Yarn may need a writable home directory.
export yarn_global_folder="$TMP"
# Ensure global cache is disabled. Cache must be part of our output.
touch .yarnrc.yml
sed -i -e '/^enableGlobalCache/d' .yarnrc.yml
echo 'enableGlobalCache: false' >> .yarnrc.yml
# Some node-gyp calls may call out to npm, which could fail due to an
# read-only home dir.
export HOME="$TMP"
# running preConfigure after the cache is populated allows for
# preConfigure to contain substituteInPlace for dependencies as well as the
# main project. This is necessary for native bindings that maybe have
# hardcoded values.
runHook preConfigure
# Run normal Yarn install to complete dependency installation.
yarn install --immutable --immutable-cache
runHook postConfigure
'';
buildPhase = ''
runHook preBuild
runHook postBuild
'';
installPhase = ''
runHook preInstall
# Move the package contents to the output directory.
if grep -q '"workspaces"' package.json; then
# We can't use `yarn pack` in a workspace setup, because it only
# packages the outer workspace.
mkdir -p "$out/libexec"
mv $PWD "$out/libexec/$name"
else
# - If the package.json has a `files` field, only files matching those patterns are copied
# - Otherwise all files are copied.
yarn pack --out package.tgz
mkdir -p "$out/libexec/$name"
tar xzf package.tgz --directory "$out/libexec/$name" --strip-components=1
cp --reflink=auto .yarnrc* "$out/libexec/$name"
cp --reflink=auto ${lockfile} "$out/libexec/$name/yarn.lock"
cp --reflink=auto --recursive .yarn "$out/libexec/$name"
# Copy the Yarn linker output into the package.
cp --reflink=auto --recursive node_modules "$out/libexec/$name"
fi
cd "$out/libexec/$name"
# Invoke a plugin internal command to setup binaries.
mkdir -p "$out/bin"
yarn nixify install-bin $out/bin
# A package with node_modules doesn't need the cache
yarn cache clean
runHook postInstall
'';
passthru = {
inherit nodejs;
yarn-freestanding = yarn;
yarn = writeShellScriptBin "yarn" ''
exec '${yarn}/bin/yarn' --cwd '${overriddenProject}/libexec/${overriddenProject.name}' "$@"
'';
};
});
overriddenProject = optionalOverride overrideAttrs project;
cacheEntries = {
"@bufbuild/protobuf@npm:2.12.1" = { filename = "@bufbuild-protobuf-npm-2.12.1-d8afb467b3-2d40cfe4ec.zip"; hash = "sha512-LUDP5Ow7sOPwarLih3HcXcVm6qywVfvok9dWIbBAfQJy1I9ApJCtR97YOe1UFRThr3G7E68CSzrjbvDFbVbdqQ=="; };
"@connectrpc/connect-node@npm:2.1.2" = { filename = "@connectrpc-connect-node-npm-2.1.2-021434d5d5-ba8b0c9384.zip"; hash = "sha512-uosMk4TDgps3eqeoJtwM1Qpgk1J9LscBRgSRKDYzbqlgSitazqQrEEd/i+RWnknd7WbKD8d/X1sCcDXgKeE+qQ=="; };
"@connectrpc/connect@npm:2.1.2" = { filename = "@connectrpc-connect-npm-2.1.2-ab34825de3-4e15000890.zip"; hash = "sha512-ThUACJAjt1Lv1E+pQKWuHh+gDhvrxLoM7ScruTWSDYw7hbd0UOZErUQruMqaJ1sMFxNviWuo7/A2F4Ex2wHWFQ=="; };
"@esbuild/linux-arm64@npm:0.25.12" = { filename = "@esbuild-linux-arm64-npm-0.25.12-a5aaa0e70e-10c0.zip"; hash = "sha512-tm9zhnNR4GZv4A+Sgbt9jdCJ0iGlzvYxGCaxaScbhFH14mX7QWJRYaCvFCZB1dseApmaq6mNwbilL0wJnbB8tw=="; };
"@esbuild/linux-x64@npm:0.25.12" = { filename = "@esbuild-linux-x64-npm-0.25.12-07c7c22cce-10c0.zip"; hash = "sha512-U2QGT8ZIZN8q2WPSFDC32+sZGKgp49gvnHzIf/vKVR4xIzjcgBbjAIKI+FqfGBmGBWu8eCpS7lR9JDXdUHOFkw=="; };
"@quixos/camino-package-runtime@https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=86933aa97f3ea386a4c5cfeb28386fd8d2722075" = { filename = "@quixos-camino-package-runtime-https-af3a6c1cce-afad508367.zip"; hash = "sha512-r61Qg2cI8jRSzUs4m5vOZl92VMkd/eQB0KedVjGLAkpnhg5dt1FAVptjUOcs746empJUj/HEIau5rq0a+hyRhA=="; };
"@types/node@npm:24.13.3" = { filename = "@types-node-npm-24.13.3-b512a0bbeb-a5bc08f49b.zip"; hash = "sha512-pbwI9JuVgdzcqQ4CzXcZejx5mECAdmSULlzVFhpVPU0q6AZPfjKUQQ10jX0Ji1wYSL5/pQwG8pxBk6sWvk5Z6w=="; };
"@types/prop-types@npm:15.7.15" = { filename = "@types-prop-types-npm-15.7.15-cefe16a1fa-b59aad1ad1.zip"; hash = "sha512-tZqtGtGb8XM89ST9TmGBlsbHaQ9I7nCjJ+tFCkKquOigY/vlnKClcBrr4tktWCKSwPuEXqV0dPahX2mUsOJgsg=="; };
"@types/react@npm:18.3.31" = { filename = "@types-react-npm-18.3.31-d376eb19a5-44180549dd.zip"; hash = "sha512-RBgFSd0EX1Nuzs0545qs34KOdq3BxKkLEy9FPiPMNwxGSNkQKuQBFy69j9ixl3qQGjniFOU+x3FxsnUUtYjBeQ=="; };
"@typescript/typescript-linux-arm64@npm:7.0.2" = { filename = "@typescript-typescript-linux-arm64-npm-7.0.2-9cacfc53a0-10c0.zip"; hash = "sha512-s4c7nGT/lQIw6x0IfrL0b3ECy/D0g7UoDLdiIWJoM6EGXk5N/dmXdxUdA8Cr3hV/3nO2BYKTQ6Ai8/zGhiSQ3A=="; };
"@typescript/typescript-linux-x64@npm:7.0.2" = { filename = "@typescript-typescript-linux-x64-npm-7.0.2-8dd7ff8d24-10c0.zip"; hash = "sha512-k9EUK5CZ3OOPnyslp8SAAonHJpnpPmlaulppI/NmFyCzNs3UN/TLPUkyQia3KIxgbyTzKoXI5L5fl8Uj9bJ7Cg=="; };
"csstype@npm:3.2.3" = { filename = "csstype-npm-3.2.3-741053244e-cd29c51e70.zip"; hash = "sha512-zSnFHnD6gi8c7NhkGhRFvtcGNpdGnTVjO1FuYP6MG94EsI9sW2AiE2u2abZMY9QXOvVIZFEPu07iMoGAGEGjzg=="; };
"esbuild@npm:0.25.12" = { filename = "esbuild-npm-0.25.12-352393c4bd-c205357531.zip"; hash = "sha512-wgU1dTFCMiCp3o4ebGUUJCvJsWZudizWfM34/f3D8dC9dvjZODlYuXrUyVPv23tujB+cpZUc0rfFI16HVbNKaw=="; };
"js-tokens@npm:4.0.0" = { filename = "js-tokens-npm-4.0.0-0ac852e9e2-e248708d37.zip"; hash = "sha512-4khwjTd6oFjqzyA3sH3thHeQ5t6JK7rT2sCrui51nLnxIbAAmaZRlWFrrctuyo0U2XXLPonrHP2mRHVkAsiu7Q=="; };
"loose-envify@npm:1.4.0" = { filename = "loose-envify-npm-1.4.0-6307b72ccf-655d110220.zip"; hash = "sha512-ZV0RAiCYPBpLnAxnmi6AFtS2f26ce1Q1/1l57Nsg0IE/TewKCGdPy91IRqPwftu1CjaBH9N5MLlKqg2drOsBfg=="; };
"react@npm:18.3.1" = { filename = "react-npm-18.3.1-af38f3c1ae-283e8c5efc.zip"; hash = "sha512-KD6MXvzzeALJ0c52fzAt1Wndl6cNm7jHvnmnibmQJFHg0WM0sF1zKZsg8EjLw8fSiLu94QtwH6GU4gicI32+ow=="; };
"typescript@npm:7.0.2" = { filename = "typescript-npm-7.0.2-0bde2bcec5-3dcee51ec8.zip"; hash = "sha512-Pc7lHsjDMkkjJbzb999ItmZodR8SfmIq59QbbHFusZGEQkpF4U93UPUPNAIyOItp5ih4WRVfBqXOLfdvEssxzw=="; };
"typescript@patch:typescript@npm%3A7.0.2#optional!builtin<compat/typescript>::version=7.0.2&hash=3bafbf" = { filename = "typescript-patch-4859cbaf66-6b3cdc369c.zip"; hash = "sha512-azzcNpzYKdRuAHNOpkIz7oRBnCglrY/kCJFa3ed6vO1LeiQB9+7VF9VKek9dHBhpdTy5kBjfHCFZx2HZ8zSDpg=="; };
"undici-types@npm:7.18.2" = { filename = "undici-types-npm-7.18.2-3e6d69d829-85a7918911.zip"; hash = "sha512-haeRiRE6I4lZ16ZHNo5PfFVZw6QE69uPxEiBRc6UJvzYIlKoRKMCeY38Djfm+xeP9IHtA7xMr2NMV1fZ70NSHQ=="; };
};
in overriddenProject
+678
View File
@@ -0,0 +1,678 @@
# This file is generated by running "yarn install" inside your project.
# Manual changes might be lost - proceed with caution!
__metadata:
version: 10
cacheKey: 10c0
"@bufbuild/protobuf@npm:^2.12.1":
version: 2.12.1
resolution: "@bufbuild/protobuf@npm:2.12.1"
checksum: 10c0/2d40cfe4ec3bb0e3f06ab2e28771dc5dc566eaacb055fbe893d75621b0407d0272d48f40a490ad47ded839ed541514e1af71bb13af024b3ae36ef0c56d56dda9
languageName: node
linkType: hard
"@connectrpc/connect-node@npm:^2.1.2":
version: 2.1.2
resolution: "@connectrpc/connect-node@npm:2.1.2"
peerDependencies:
"@bufbuild/protobuf": ^2.7.0
"@connectrpc/connect": 2.1.2
checksum: 10c0/ba8b0c9384c3829b377aa7a826dc0cd50a6093527d2ec7014604912836336ea9604a2b5acea42b10477f8be4569e49dded66ca0fc77f5f5b027035e029e13ea9
languageName: node
linkType: hard
"@connectrpc/connect@npm:^2.1.2":
version: 2.1.2
resolution: "@connectrpc/connect@npm:2.1.2"
peerDependencies:
"@bufbuild/protobuf": ^2.7.0
checksum: 10c0/4e1500089023b752efd44fa940a5ae1e1fa00e1bebc4ba0ced272bb935920d8c3b85b77450e644ad442bb8ca9a275b0c17136f896ba8eff036178131db01d615
languageName: node
linkType: hard
"@esbuild/aix-ppc64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/aix-ppc64@npm:0.25.12"
conditions: os=aix & cpu=ppc64
languageName: node
linkType: hard
"@esbuild/android-arm64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/android-arm64@npm:0.25.12"
conditions: os=android & cpu=arm64
languageName: node
linkType: hard
"@esbuild/android-arm@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/android-arm@npm:0.25.12"
conditions: os=android & cpu=arm
languageName: node
linkType: hard
"@esbuild/android-x64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/android-x64@npm:0.25.12"
conditions: os=android & cpu=x64
languageName: node
linkType: hard
"@esbuild/darwin-arm64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/darwin-arm64@npm:0.25.12"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
"@esbuild/darwin-x64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/darwin-x64@npm:0.25.12"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
"@esbuild/freebsd-arm64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/freebsd-arm64@npm:0.25.12"
conditions: os=freebsd & cpu=arm64
languageName: node
linkType: hard
"@esbuild/freebsd-x64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/freebsd-x64@npm:0.25.12"
conditions: os=freebsd & cpu=x64
languageName: node
linkType: hard
"@esbuild/linux-arm64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/linux-arm64@npm:0.25.12"
conditions: os=linux & cpu=arm64
languageName: node
linkType: hard
"@esbuild/linux-arm@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/linux-arm@npm:0.25.12"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
"@esbuild/linux-ia32@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/linux-ia32@npm:0.25.12"
conditions: os=linux & cpu=ia32
languageName: node
linkType: hard
"@esbuild/linux-loong64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/linux-loong64@npm:0.25.12"
conditions: os=linux & cpu=loong64
languageName: node
linkType: hard
"@esbuild/linux-mips64el@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/linux-mips64el@npm:0.25.12"
conditions: os=linux & cpu=mips64el
languageName: node
linkType: hard
"@esbuild/linux-ppc64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/linux-ppc64@npm:0.25.12"
conditions: os=linux & cpu=ppc64
languageName: node
linkType: hard
"@esbuild/linux-riscv64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/linux-riscv64@npm:0.25.12"
conditions: os=linux & cpu=riscv64
languageName: node
linkType: hard
"@esbuild/linux-s390x@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/linux-s390x@npm:0.25.12"
conditions: os=linux & cpu=s390x
languageName: node
linkType: hard
"@esbuild/linux-x64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/linux-x64@npm:0.25.12"
conditions: os=linux & cpu=x64
languageName: node
linkType: hard
"@esbuild/netbsd-arm64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/netbsd-arm64@npm:0.25.12"
conditions: os=netbsd & cpu=arm64
languageName: node
linkType: hard
"@esbuild/netbsd-x64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/netbsd-x64@npm:0.25.12"
conditions: os=netbsd & cpu=x64
languageName: node
linkType: hard
"@esbuild/openbsd-arm64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/openbsd-arm64@npm:0.25.12"
conditions: os=openbsd & cpu=arm64
languageName: node
linkType: hard
"@esbuild/openbsd-x64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/openbsd-x64@npm:0.25.12"
conditions: os=openbsd & cpu=x64
languageName: node
linkType: hard
"@esbuild/openharmony-arm64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/openharmony-arm64@npm:0.25.12"
conditions: os=openharmony & cpu=arm64
languageName: node
linkType: hard
"@esbuild/sunos-x64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/sunos-x64@npm:0.25.12"
conditions: os=sunos & cpu=x64
languageName: node
linkType: hard
"@esbuild/win32-arm64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/win32-arm64@npm:0.25.12"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
"@esbuild/win32-ia32@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/win32-ia32@npm:0.25.12"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
"@esbuild/win32-x64@npm:0.25.12":
version: 0.25.12
resolution: "@esbuild/win32-x64@npm:0.25.12"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"@quixos/camino-package-runtime@https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=86933aa97f3ea386a4c5cfeb28386fd8d2722075":
version: 0.1.0
resolution: "@quixos/camino-package-runtime@https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=86933aa97f3ea386a4c5cfeb28386fd8d2722075"
dependencies:
"@bufbuild/protobuf": "npm:^2.12.1"
"@connectrpc/connect": "npm:^2.1.2"
"@connectrpc/connect-node": "npm:^2.1.2"
checksum: 10c0/afad50836708f23452cd4b389b9bce665f7654c91dfde401d0a79d56318b024a67860e5db75140569b6350e72cef8e9e9a92548ff1c421abb9aead1afa1c9184
languageName: node
linkType: hard
"@quixos/project-react-runtime@workspace:.":
version: 0.0.0-use.local
resolution: "@quixos/project-react-runtime@workspace:."
dependencies:
"@quixos/camino-package-runtime": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git#commit=86933aa97f3ea386a4c5cfeb28386fd8d2722075"
"@types/node": "npm:^24"
"@types/react": "npm:^18.3.12"
esbuild: "npm:^0.25.12"
react: "npm:^18.3.1"
typescript: "npm:^7.0.2"
bin:
server: dist/server.js
languageName: unknown
linkType: soft
"@types/node@npm:^24":
version: 24.13.3
resolution: "@types/node@npm:24.13.3"
dependencies:
undici-types: "npm:~7.18.0"
checksum: 10c0/a5bc08f49b9581dcdca90e02cd77197a3c799840807664942e5cd5161a553d4d2ae8064f7e3294410d748d7d098b5c1848be7fa50c06f29c4193ab16be4e59eb
languageName: node
linkType: hard
"@types/prop-types@npm:*":
version: 15.7.15
resolution: "@types/prop-types@npm:15.7.15"
checksum: 10c0/b59aad1ad19bf1733cf524fd4e618196c6c7690f48ee70a327eb450a42aab8e8a063fbe59ca0a5701aebe2d92d582292c0fb845ea57474f6a15f6994b0e260b2
languageName: node
linkType: hard
"@types/react@npm:^18.3.12":
version: 18.3.31
resolution: "@types/react@npm:18.3.31"
dependencies:
"@types/prop-types": "npm:*"
csstype: "npm:^3.2.2"
checksum: 10c0/44180549dd045f536ececd39e39aacdf828e76adc1c4a90b132f453e23cc370c4648d9102ae401172ebd8fd8b1977a901a39e214e53ec77171b27514b588c179
languageName: node
linkType: hard
"@typescript/typescript-aix-ppc64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-aix-ppc64@npm:7.0.2"
conditions: os=aix & cpu=ppc64
languageName: node
linkType: hard
"@typescript/typescript-darwin-arm64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-darwin-arm64@npm:7.0.2"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
"@typescript/typescript-darwin-x64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-darwin-x64@npm:7.0.2"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
"@typescript/typescript-freebsd-arm64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-freebsd-arm64@npm:7.0.2"
conditions: os=freebsd & cpu=arm64
languageName: node
linkType: hard
"@typescript/typescript-freebsd-x64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-freebsd-x64@npm:7.0.2"
conditions: os=freebsd & cpu=x64
languageName: node
linkType: hard
"@typescript/typescript-linux-arm64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-linux-arm64@npm:7.0.2"
conditions: os=linux & cpu=arm64
languageName: node
linkType: hard
"@typescript/typescript-linux-arm@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-linux-arm@npm:7.0.2"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
"@typescript/typescript-linux-loong64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-linux-loong64@npm:7.0.2"
conditions: os=linux & cpu=loong64
languageName: node
linkType: hard
"@typescript/typescript-linux-mips64el@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-linux-mips64el@npm:7.0.2"
conditions: os=linux & cpu=mips64el
languageName: node
linkType: hard
"@typescript/typescript-linux-ppc64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-linux-ppc64@npm:7.0.2"
conditions: os=linux & cpu=ppc64
languageName: node
linkType: hard
"@typescript/typescript-linux-riscv64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-linux-riscv64@npm:7.0.2"
conditions: os=linux & cpu=riscv64
languageName: node
linkType: hard
"@typescript/typescript-linux-s390x@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-linux-s390x@npm:7.0.2"
conditions: os=linux & cpu=s390x
languageName: node
linkType: hard
"@typescript/typescript-linux-x64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-linux-x64@npm:7.0.2"
conditions: os=linux & cpu=x64
languageName: node
linkType: hard
"@typescript/typescript-netbsd-arm64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-netbsd-arm64@npm:7.0.2"
conditions: os=netbsd & cpu=arm64
languageName: node
linkType: hard
"@typescript/typescript-netbsd-x64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-netbsd-x64@npm:7.0.2"
conditions: os=netbsd & cpu=x64
languageName: node
linkType: hard
"@typescript/typescript-openbsd-arm64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-openbsd-arm64@npm:7.0.2"
conditions: os=openbsd & cpu=arm64
languageName: node
linkType: hard
"@typescript/typescript-openbsd-x64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-openbsd-x64@npm:7.0.2"
conditions: os=openbsd & cpu=x64
languageName: node
linkType: hard
"@typescript/typescript-sunos-x64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-sunos-x64@npm:7.0.2"
conditions: os=sunos & cpu=x64
languageName: node
linkType: hard
"@typescript/typescript-win32-arm64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-win32-arm64@npm:7.0.2"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
"@typescript/typescript-win32-x64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-win32-x64@npm:7.0.2"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"csstype@npm:^3.2.2":
version: 3.2.3
resolution: "csstype@npm:3.2.3"
checksum: 10c0/cd29c51e70fa822f1cecd8641a1445bed7063697469d35633b516e60fe8c1bde04b08f6c5b6022136bb669b64c63d4173af54864510fbb4ee23281801841a3ce
languageName: node
linkType: hard
"esbuild@npm:^0.25.12":
version: 0.25.12
resolution: "esbuild@npm:0.25.12"
dependencies:
"@esbuild/aix-ppc64": "npm:0.25.12"
"@esbuild/android-arm": "npm:0.25.12"
"@esbuild/android-arm64": "npm:0.25.12"
"@esbuild/android-x64": "npm:0.25.12"
"@esbuild/darwin-arm64": "npm:0.25.12"
"@esbuild/darwin-x64": "npm:0.25.12"
"@esbuild/freebsd-arm64": "npm:0.25.12"
"@esbuild/freebsd-x64": "npm:0.25.12"
"@esbuild/linux-arm": "npm:0.25.12"
"@esbuild/linux-arm64": "npm:0.25.12"
"@esbuild/linux-ia32": "npm:0.25.12"
"@esbuild/linux-loong64": "npm:0.25.12"
"@esbuild/linux-mips64el": "npm:0.25.12"
"@esbuild/linux-ppc64": "npm:0.25.12"
"@esbuild/linux-riscv64": "npm:0.25.12"
"@esbuild/linux-s390x": "npm:0.25.12"
"@esbuild/linux-x64": "npm:0.25.12"
"@esbuild/netbsd-arm64": "npm:0.25.12"
"@esbuild/netbsd-x64": "npm:0.25.12"
"@esbuild/openbsd-arm64": "npm:0.25.12"
"@esbuild/openbsd-x64": "npm:0.25.12"
"@esbuild/openharmony-arm64": "npm:0.25.12"
"@esbuild/sunos-x64": "npm:0.25.12"
"@esbuild/win32-arm64": "npm:0.25.12"
"@esbuild/win32-ia32": "npm:0.25.12"
"@esbuild/win32-x64": "npm:0.25.12"
dependenciesMeta:
"@esbuild/aix-ppc64":
optional: true
"@esbuild/android-arm":
optional: true
"@esbuild/android-arm64":
optional: true
"@esbuild/android-x64":
optional: true
"@esbuild/darwin-arm64":
optional: true
"@esbuild/darwin-x64":
optional: true
"@esbuild/freebsd-arm64":
optional: true
"@esbuild/freebsd-x64":
optional: true
"@esbuild/linux-arm":
optional: true
"@esbuild/linux-arm64":
optional: true
"@esbuild/linux-ia32":
optional: true
"@esbuild/linux-loong64":
optional: true
"@esbuild/linux-mips64el":
optional: true
"@esbuild/linux-ppc64":
optional: true
"@esbuild/linux-riscv64":
optional: true
"@esbuild/linux-s390x":
optional: true
"@esbuild/linux-x64":
optional: true
"@esbuild/netbsd-arm64":
optional: true
"@esbuild/netbsd-x64":
optional: true
"@esbuild/openbsd-arm64":
optional: true
"@esbuild/openbsd-x64":
optional: true
"@esbuild/openharmony-arm64":
optional: true
"@esbuild/sunos-x64":
optional: true
"@esbuild/win32-arm64":
optional: true
"@esbuild/win32-ia32":
optional: true
"@esbuild/win32-x64":
optional: true
bin:
esbuild: bin/esbuild
checksum: 10c0/c205357531423220a9de8e1e6c6514242bc9b1666e762cd67ccdf8fdfdc3f1d0bd76f8d9383958b97ad4c953efdb7b6e8c1f9ca5951cd2b7c5235e8755b34a6b
languageName: node
linkType: hard
"js-tokens@npm:^3.0.0 || ^4.0.0":
version: 4.0.0
resolution: "js-tokens@npm:4.0.0"
checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed
languageName: node
linkType: hard
"loose-envify@npm:^1.1.0":
version: 1.4.0
resolution: "loose-envify@npm:1.4.0"
dependencies:
js-tokens: "npm:^3.0.0 || ^4.0.0"
bin:
loose-envify: cli.js
checksum: 10c0/655d110220983c1a4b9c0c679a2e8016d4b67f6e9c7b5435ff5979ecdb20d0813f4dec0a08674fcbdd4846a3f07edbb50a36811fd37930b94aaa0d9daceb017e
languageName: node
linkType: hard
"react@npm:^18.3.1":
version: 18.3.1
resolution: "react@npm:18.3.1"
dependencies:
loose-envify: "npm:^1.1.0"
checksum: 10c0/283e8c5efcf37802c9d1ce767f302dd569dd97a70d9bb8c7be79a789b9902451e0d16334b05d73299b20f048cbc3c7d288bbbde10b701fa194e2089c237dbea3
languageName: node
linkType: hard
"typescript@npm:^7.0.2":
version: 7.0.2
resolution: "typescript@npm:7.0.2"
dependencies:
"@typescript/typescript-aix-ppc64": "npm:7.0.2"
"@typescript/typescript-darwin-arm64": "npm:7.0.2"
"@typescript/typescript-darwin-x64": "npm:7.0.2"
"@typescript/typescript-freebsd-arm64": "npm:7.0.2"
"@typescript/typescript-freebsd-x64": "npm:7.0.2"
"@typescript/typescript-linux-arm": "npm:7.0.2"
"@typescript/typescript-linux-arm64": "npm:7.0.2"
"@typescript/typescript-linux-loong64": "npm:7.0.2"
"@typescript/typescript-linux-mips64el": "npm:7.0.2"
"@typescript/typescript-linux-ppc64": "npm:7.0.2"
"@typescript/typescript-linux-riscv64": "npm:7.0.2"
"@typescript/typescript-linux-s390x": "npm:7.0.2"
"@typescript/typescript-linux-x64": "npm:7.0.2"
"@typescript/typescript-netbsd-arm64": "npm:7.0.2"
"@typescript/typescript-netbsd-x64": "npm:7.0.2"
"@typescript/typescript-openbsd-arm64": "npm:7.0.2"
"@typescript/typescript-openbsd-x64": "npm:7.0.2"
"@typescript/typescript-sunos-x64": "npm:7.0.2"
"@typescript/typescript-win32-arm64": "npm:7.0.2"
"@typescript/typescript-win32-x64": "npm:7.0.2"
dependenciesMeta:
"@typescript/typescript-aix-ppc64":
optional: true
"@typescript/typescript-darwin-arm64":
optional: true
"@typescript/typescript-darwin-x64":
optional: true
"@typescript/typescript-freebsd-arm64":
optional: true
"@typescript/typescript-freebsd-x64":
optional: true
"@typescript/typescript-linux-arm":
optional: true
"@typescript/typescript-linux-arm64":
optional: true
"@typescript/typescript-linux-loong64":
optional: true
"@typescript/typescript-linux-mips64el":
optional: true
"@typescript/typescript-linux-ppc64":
optional: true
"@typescript/typescript-linux-riscv64":
optional: true
"@typescript/typescript-linux-s390x":
optional: true
"@typescript/typescript-linux-x64":
optional: true
"@typescript/typescript-netbsd-arm64":
optional: true
"@typescript/typescript-netbsd-x64":
optional: true
"@typescript/typescript-openbsd-arm64":
optional: true
"@typescript/typescript-openbsd-x64":
optional: true
"@typescript/typescript-sunos-x64":
optional: true
"@typescript/typescript-win32-arm64":
optional: true
"@typescript/typescript-win32-x64":
optional: true
bin:
tsc: bin/tsc
checksum: 10c0/3dcee51ec8c332492325bcdbf7df48b66668751f127e622ae7d41b6c716eb19184424a45e14f7750f50f340232388b69e6287859155f06a5ce2df76f12cb31cf
languageName: node
linkType: hard
"typescript@patch:typescript@npm%3A^7.0.2#optional!builtin<compat/typescript>":
version: 7.0.2
resolution: "typescript@patch:typescript@npm%3A7.0.2#optional!builtin<compat/typescript>::version=7.0.2&hash=3bafbf"
dependencies:
"@typescript/typescript-aix-ppc64": "npm:7.0.2"
"@typescript/typescript-darwin-arm64": "npm:7.0.2"
"@typescript/typescript-darwin-x64": "npm:7.0.2"
"@typescript/typescript-freebsd-arm64": "npm:7.0.2"
"@typescript/typescript-freebsd-x64": "npm:7.0.2"
"@typescript/typescript-linux-arm": "npm:7.0.2"
"@typescript/typescript-linux-arm64": "npm:7.0.2"
"@typescript/typescript-linux-loong64": "npm:7.0.2"
"@typescript/typescript-linux-mips64el": "npm:7.0.2"
"@typescript/typescript-linux-ppc64": "npm:7.0.2"
"@typescript/typescript-linux-riscv64": "npm:7.0.2"
"@typescript/typescript-linux-s390x": "npm:7.0.2"
"@typescript/typescript-linux-x64": "npm:7.0.2"
"@typescript/typescript-netbsd-arm64": "npm:7.0.2"
"@typescript/typescript-netbsd-x64": "npm:7.0.2"
"@typescript/typescript-openbsd-arm64": "npm:7.0.2"
"@typescript/typescript-openbsd-x64": "npm:7.0.2"
"@typescript/typescript-sunos-x64": "npm:7.0.2"
"@typescript/typescript-win32-arm64": "npm:7.0.2"
"@typescript/typescript-win32-x64": "npm:7.0.2"
dependenciesMeta:
"@typescript/typescript-aix-ppc64":
optional: true
"@typescript/typescript-darwin-arm64":
optional: true
"@typescript/typescript-darwin-x64":
optional: true
"@typescript/typescript-freebsd-arm64":
optional: true
"@typescript/typescript-freebsd-x64":
optional: true
"@typescript/typescript-linux-arm":
optional: true
"@typescript/typescript-linux-arm64":
optional: true
"@typescript/typescript-linux-loong64":
optional: true
"@typescript/typescript-linux-mips64el":
optional: true
"@typescript/typescript-linux-ppc64":
optional: true
"@typescript/typescript-linux-riscv64":
optional: true
"@typescript/typescript-linux-s390x":
optional: true
"@typescript/typescript-linux-x64":
optional: true
"@typescript/typescript-netbsd-arm64":
optional: true
"@typescript/typescript-netbsd-x64":
optional: true
"@typescript/typescript-openbsd-arm64":
optional: true
"@typescript/typescript-openbsd-x64":
optional: true
"@typescript/typescript-sunos-x64":
optional: true
"@typescript/typescript-win32-arm64":
optional: true
"@typescript/typescript-win32-x64":
optional: true
bin:
tsc: bin/tsc
checksum: 10c0/6b3cdc369cd829d46e00734ea64233ee84419c2825ad8fe408915adde77abced4b7a2401f7eed517d54a7a4f5d1c1869753cb99018df1c2159c761d9f33483a6
languageName: node
linkType: hard
"undici-types@npm:~7.18.0":
version: 7.18.2
resolution: "undici-types@npm:7.18.2"
checksum: 10c0/85a79189113a238959d7a647368e4f7c5559c3a404ebdb8fc4488145ce9426fcd82252a844a302798dfc0e37e6fb178ff481ed03bc4caf634c5757d9ef43521d
languageName: node
linkType: hard