@hozu/cli 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/hozu.js +8 -2
- package/dist/commands/app.d.ts.map +1 -1
- package/dist/commands/app.js +11 -3
- package/dist/commands/app.js.map +1 -1
- package/dist/commands/browse.d.ts.map +1 -1
- package/dist/commands/browse.js +4 -2
- package/dist/commands/browse.js.map +1 -1
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +3 -1
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +6 -1
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +10 -1
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/docs.d.ts.map +1 -1
- package/dist/commands/docs.js +8 -6
- package/dist/commands/docs.js.map +1 -1
- package/dist/commands/env-ignore.d.ts +8 -0
- package/dist/commands/env-ignore.d.ts.map +1 -0
- package/dist/commands/env-ignore.js +30 -0
- package/dist/commands/env-ignore.js.map +1 -0
- package/dist/commands/env.d.ts +6 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +77 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +13 -1
- package/dist/commands/serve.js.map +1 -1
- package/dist/contract.d.ts +27 -0
- package/dist/contract.d.ts.map +1 -1
- package/dist/load.d.ts +7 -0
- package/dist/load.d.ts.map +1 -1
- package/dist/load.js +22 -1
- package/dist/load.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +11 -1
- package/dist/main.js.map +1 -1
- package/dist/migrate/steps.d.ts.map +1 -1
- package/dist/migrate/steps.js +17 -0
- package/dist/migrate/steps.js.map +1 -1
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +4 -0
- package/dist/output.js.map +1 -1
- package/package.json +8 -8
- package/schema/check.schema.json +5 -1
- package/schema/env.schema.json +122 -0
- package/schema/inspect.schema.json +38 -1
- package/schema/migrate.schema.json +5 -1
- package/schema/render.schema.json +5 -1
- package/schema/validate.schema.json +5 -1
- package/dist/commands/add-widget.d.ts +0 -5
- package/dist/commands/add-widget.d.ts.map +0 -1
- package/dist/commands/add-widget.js +0 -90
- package/dist/commands/add-widget.js.map +0 -1
|
@@ -303,6 +303,13 @@
|
|
|
303
303
|
}
|
|
304
304
|
],
|
|
305
305
|
"description": "The feature's `fetch.ts` (ADR 0049): implementations of its `'either'` / `'browser'` effects."
|
|
306
|
+
},
|
|
307
|
+
"connect": {
|
|
308
|
+
"type": "array",
|
|
309
|
+
"items": {
|
|
310
|
+
"$ref": "#/definitions/ConnectIR"
|
|
311
|
+
},
|
|
312
|
+
"description": "The origins its browser-run effects call, added to CSP `connect-src` (ADR 0051)."
|
|
306
313
|
}
|
|
307
314
|
},
|
|
308
315
|
"required": [
|
|
@@ -322,7 +329,8 @@
|
|
|
322
329
|
"endpoints",
|
|
323
330
|
"contracts",
|
|
324
331
|
"messages",
|
|
325
|
-
"fetch"
|
|
332
|
+
"fetch",
|
|
333
|
+
"connect"
|
|
326
334
|
],
|
|
327
335
|
"additionalProperties": false
|
|
328
336
|
},
|
|
@@ -1999,6 +2007,35 @@
|
|
|
1999
2007
|
],
|
|
2000
2008
|
"additionalProperties": false
|
|
2001
2009
|
},
|
|
2010
|
+
"ConnectIR": {
|
|
2011
|
+
"anyOf": [
|
|
2012
|
+
{
|
|
2013
|
+
"type": "object",
|
|
2014
|
+
"properties": {
|
|
2015
|
+
"origin": {
|
|
2016
|
+
"type": "string"
|
|
2017
|
+
}
|
|
2018
|
+
},
|
|
2019
|
+
"required": [
|
|
2020
|
+
"origin"
|
|
2021
|
+
],
|
|
2022
|
+
"additionalProperties": false
|
|
2023
|
+
},
|
|
2024
|
+
{
|
|
2025
|
+
"type": "object",
|
|
2026
|
+
"properties": {
|
|
2027
|
+
"env": {
|
|
2028
|
+
"type": "string"
|
|
2029
|
+
}
|
|
2030
|
+
},
|
|
2031
|
+
"required": [
|
|
2032
|
+
"env"
|
|
2033
|
+
],
|
|
2034
|
+
"additionalProperties": false
|
|
2035
|
+
}
|
|
2036
|
+
],
|
|
2037
|
+
"description": "An origin (`https://api.github.com`) or a public env variable holding a URL."
|
|
2038
|
+
},
|
|
2002
2039
|
"InspectComponentOutput": {
|
|
2003
2040
|
"type": "object",
|
|
2004
2041
|
"properties": {
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import type { AddOutput } from '../contract.ts';
|
|
2
|
-
export declare const bundleSpec: (core: string | undefined) => string;
|
|
3
|
-
export declare function runAddWidget(cwd: string, config: string | undefined, feature: string | undefined, name: string | undefined): Promise<AddOutput>;
|
|
4
|
-
export declare function describeAddWidget(out: AddOutput, name: string): string;
|
|
5
|
-
//# sourceMappingURL=add-widget.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"add-widget.d.ts","sourceRoot":"","sources":["../../src/commands/add-widget.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAuB/C,eAAO,MAAM,UAAU,SAAU,MAAM,GAAG,SAAS,WAC2D,CAAA;AAE9G,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,OAAO,CAAC,SAAS,CAAC,CAiFpB;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAOtE"}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import { existsSync } from 'node:fs';
|
|
2
|
-
import { readFile, writeFile } from 'node:fs/promises';
|
|
3
|
-
import { dirname, join, relative, resolve } from 'node:path';
|
|
4
|
-
import { HozuCliError } from '../errors.js';
|
|
5
|
-
import { addImport } from './add.js';
|
|
6
|
-
const declaration = (name, file) => `export const ${name} = ui.widget({
|
|
7
|
-
tag: 'div',
|
|
8
|
-
props: z.object({}),
|
|
9
|
-
events: {},
|
|
10
|
-
client: new URL('./${file}', import.meta.url),
|
|
11
|
-
load: 'visible',
|
|
12
|
-
wraps: false,
|
|
13
|
-
})
|
|
14
|
-
`;
|
|
15
|
-
const client = (name) => `import { implement } from '@hozu/core/widget'
|
|
16
|
-
import type { ${name} } from './widgets.ts'
|
|
17
|
-
|
|
18
|
-
export default implement<typeof ${name}>(({ el }) => {
|
|
19
|
-
el.dataset.ready = ''
|
|
20
|
-
return { destroy: () => el.replaceChildren() }
|
|
21
|
-
})
|
|
22
|
-
`;
|
|
23
|
-
export const bundleSpec = (core) => core === undefined ? 'latest' : core.startsWith('file:') ? core.replace(/hozu-core-/, 'hozu-bundle-') : core;
|
|
24
|
-
export async function runAddWidget(cwd, config, feature, name) {
|
|
25
|
-
if (!feature || !name || !/^[A-Z][A-Za-z0-9]*$/.test(name))
|
|
26
|
-
throw new HozuCliError('usage', 'Give the feature and a PascalCase widget name', [
|
|
27
|
-
'hozu add widget stations StationMap',
|
|
28
|
-
]);
|
|
29
|
-
const root = dirname(resolve(cwd, config ?? 'hozu.config.ts'));
|
|
30
|
-
const dir = join(root, 'features', feature);
|
|
31
|
-
if (!existsSync(dir))
|
|
32
|
-
throw new HozuCliError('usage', `features/${feature} does not exist`, [`hozu add feature ${feature}`]);
|
|
33
|
-
const out = { created: [], edited: [], manual: [], declarations: { widget: [name] }, texts: [] };
|
|
34
|
-
const file = `${name[0].toLowerCase()}${name.slice(1)}.client.ts`;
|
|
35
|
-
const write = async (path, text, created) => {
|
|
36
|
-
await writeFile(path, text);
|
|
37
|
-
(created ? out.created : out.edited).push(relative(cwd, path));
|
|
38
|
-
};
|
|
39
|
-
const widgets = join(dir, 'widgets.ts');
|
|
40
|
-
if (existsSync(join(dir, file)))
|
|
41
|
-
throw new HozuCliError('usage', `features/${feature}/${file} already exists`, []);
|
|
42
|
-
if (existsSync(widgets))
|
|
43
|
-
await write(widgets, `${await readFile(widgets, 'utf8')}\n${declaration(name, file)}`, false);
|
|
44
|
-
else
|
|
45
|
-
await write(widgets, `import { ui } from '@hozu/core'\nimport { z } from 'zod'\n\n${declaration(name, file)}`, true);
|
|
46
|
-
await write(join(dir, file), client(name), true);
|
|
47
|
-
const edit = async (path, change, manual) => {
|
|
48
|
-
const source = existsSync(path) ? await readFile(path, 'utf8') : null;
|
|
49
|
-
const next = source === null ? null : change(source);
|
|
50
|
-
if (next === null)
|
|
51
|
-
out.manual.push(`${relative(cwd, path)}: ${manual}`);
|
|
52
|
-
else if (next !== source)
|
|
53
|
-
await write(path, next, false);
|
|
54
|
-
};
|
|
55
|
-
await edit(join(dir, 'views.ts'), (s) => addImport(s, `import { ${name} } from './widgets.ts'\n`), `import { ${name} } from './widgets.ts'`);
|
|
56
|
-
await edit(join(dir, 'feature.ts'), (s) => {
|
|
57
|
-
if (/import \* as widgets from '\.\/widgets\.ts'/.test(s))
|
|
58
|
-
return s;
|
|
59
|
-
const listed = s.replace(/declarations: \[([^\]]*)\]/, (_, list) => `declarations: [${list}, widgets]`);
|
|
60
|
-
return listed === s ? null : addImport(listed, "import * as widgets from './widgets.ts'\n");
|
|
61
|
-
}, "import * as widgets from './widgets.ts' and add widgets to the feature's declarations list");
|
|
62
|
-
const serve = join(root, 'serve.ts');
|
|
63
|
-
await edit(serve, (s) => {
|
|
64
|
-
if (/bundleWidgets\s*\(/.test(s))
|
|
65
|
-
return s;
|
|
66
|
-
const wired = s.replace(/(create(?:Server|Handler)\(\{\n)(\s*)/, `$1$2widgets: await bundleWidgets(build),\n$2`);
|
|
67
|
-
return wired === s ? null : addImport(wired, "import { bundleWidgets } from '@hozu/bundle'\n");
|
|
68
|
-
}, "pass widgets: await bundleWidgets(build) to createServer (import { bundleWidgets } from '@hozu/bundle')");
|
|
69
|
-
const pkg = join(root, 'package.json');
|
|
70
|
-
await edit(pkg, (s) => {
|
|
71
|
-
const json = JSON.parse(s);
|
|
72
|
-
const deps = json.dependencies ?? {};
|
|
73
|
-
if (deps['@hozu/bundle'])
|
|
74
|
-
return s;
|
|
75
|
-
json.dependencies = Object.fromEntries(Object.entries({ ...deps, '@hozu/bundle': bundleSpec(deps['@hozu/core']) }).sort(([a], [b]) => a.localeCompare(b)));
|
|
76
|
-
return `${JSON.stringify(json, null, 2)}\n`;
|
|
77
|
-
}, 'add @hozu/bundle to dependencies');
|
|
78
|
-
if (out.edited.includes(relative(cwd, pkg)))
|
|
79
|
-
out.manual.push('run npm install (adds @hozu/bundle)');
|
|
80
|
-
return out;
|
|
81
|
-
}
|
|
82
|
-
export function describeAddWidget(out, name) {
|
|
83
|
-
return `${[
|
|
84
|
-
...out.created.map((f) => `created ${f}`),
|
|
85
|
-
...out.edited.map((f) => `edited ${f}`),
|
|
86
|
-
...out.manual.map((m) => `todo ${m}`),
|
|
87
|
-
`next place it in a view: ui.use(${name}, { props: {}, on: {}, class: 'h-64 w-full' }, []); give props in widgets.ts, write the DOM code in the client module (a library's CSS goes in app.css), then hozu check`,
|
|
88
|
-
].join('\n')}\n`;
|
|
89
|
-
}
|
|
90
|
-
//# sourceMappingURL=add-widget.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"add-widget.js","sourceRoot":"","sources":["../../src/commands/add-widget.ts"],"names":[],"mappings":"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"}
|