Make Camino examples and scaffolds complete Yarn and Nix packages
This commit is contained in:
@@ -3,6 +3,7 @@ import path from "node:path";
|
||||
import { parseQx, walkSyntax } from "./source.js";
|
||||
import type { ScaffoldRecipe } from "./scaffold-recipes.js";
|
||||
import type { StructuralRequest } from "./structural-plan.js";
|
||||
import { componentEntries, nixLiteral } from "./component-nix.js";
|
||||
|
||||
/** Add one ordinary component entry without regenerating existing application code. */
|
||||
export async function scaffoldComponent(
|
||||
@@ -46,12 +47,13 @@ export async function scaffoldComponent(
|
||||
)
|
||||
throw Error("Component requires a unique name and ID");
|
||||
}
|
||||
const filename = "quixos.components.json";
|
||||
const filename = "components.nix";
|
||||
const before = await fs.readFile(path.join(root, prefix, filename), "utf8");
|
||||
const entries: Record<string, { entry: string; export: string }> = JSON.parse(before);
|
||||
const entries = await componentEntries(before);
|
||||
if (!entries || typeof entries !== "object" || Array.isArray(entries) || Object.hasOwn(entries, spec.id))
|
||||
throw Error("Invalid or duplicate component entry");
|
||||
entries[spec.id] = { entry: `src/components/${spec.name}.tsx`, export: spec.name };
|
||||
const insertion = ` ${nixLiteral(spec.id)} = { entry = ${nixLiteral(`src/components/${spec.name}.tsx`)}; export = ${nixLiteral(spec.name)}; };\n`;
|
||||
const after = before.replace(/\n}(\s*)$/, (_match, trailing) => "\n" + insertion + "}" + trailing);
|
||||
const parentID = parent.children.find((node) => node.kind === "stringLiteral")!;
|
||||
return {
|
||||
kind: "package",
|
||||
@@ -69,10 +71,10 @@ export async function scaffoldComponent(
|
||||
},
|
||||
],
|
||||
},
|
||||
{ file: prefix + filename, expected: before, replace: JSON.stringify(entries, null, 2) + "\n" },
|
||||
{ file: prefix + filename, expected: before, replace: after },
|
||||
{
|
||||
file: prefix + `src/components/${spec.name}.tsx`,
|
||||
create: `import type { Components } from "../gen/client.js";\n\n// Add explicit query admission and named interface operations from the generated client.\nexport const ${spec.name}: Components[${JSON.stringify(spec.name)}] = ({subject}) => <p>{subject.object}</p>;\n`,
|
||||
create: `import type { Modules } from "../gen/client.js";\n\n// Add explicit query admission and named interface operations from the generated client.\nexport const ${spec.name}: Modules[${JSON.stringify(spec.name)}] = ({subject}) => <p>{subject.object}</p>;\n`,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user