@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.
Files changed (56) hide show
  1. package/bin/hozu.js +8 -2
  2. package/dist/commands/app.d.ts.map +1 -1
  3. package/dist/commands/app.js +11 -3
  4. package/dist/commands/app.js.map +1 -1
  5. package/dist/commands/browse.d.ts.map +1 -1
  6. package/dist/commands/browse.js +4 -2
  7. package/dist/commands/browse.js.map +1 -1
  8. package/dist/commands/build.d.ts.map +1 -1
  9. package/dist/commands/build.js +3 -1
  10. package/dist/commands/build.js.map +1 -1
  11. package/dist/commands/check.d.ts.map +1 -1
  12. package/dist/commands/check.js +6 -1
  13. package/dist/commands/check.js.map +1 -1
  14. package/dist/commands/dev.d.ts.map +1 -1
  15. package/dist/commands/dev.js +10 -1
  16. package/dist/commands/dev.js.map +1 -1
  17. package/dist/commands/docs.d.ts.map +1 -1
  18. package/dist/commands/docs.js +8 -6
  19. package/dist/commands/docs.js.map +1 -1
  20. package/dist/commands/env-ignore.d.ts +8 -0
  21. package/dist/commands/env-ignore.d.ts.map +1 -0
  22. package/dist/commands/env-ignore.js +30 -0
  23. package/dist/commands/env-ignore.js.map +1 -0
  24. package/dist/commands/env.d.ts +6 -0
  25. package/dist/commands/env.d.ts.map +1 -0
  26. package/dist/commands/env.js +77 -0
  27. package/dist/commands/env.js.map +1 -0
  28. package/dist/commands/serve.d.ts.map +1 -1
  29. package/dist/commands/serve.js +13 -1
  30. package/dist/commands/serve.js.map +1 -1
  31. package/dist/contract.d.ts +27 -0
  32. package/dist/contract.d.ts.map +1 -1
  33. package/dist/load.d.ts +7 -0
  34. package/dist/load.d.ts.map +1 -1
  35. package/dist/load.js +22 -1
  36. package/dist/load.js.map +1 -1
  37. package/dist/main.d.ts.map +1 -1
  38. package/dist/main.js +11 -1
  39. package/dist/main.js.map +1 -1
  40. package/dist/migrate/steps.d.ts.map +1 -1
  41. package/dist/migrate/steps.js +17 -0
  42. package/dist/migrate/steps.js.map +1 -1
  43. package/dist/output.d.ts.map +1 -1
  44. package/dist/output.js +4 -0
  45. package/dist/output.js.map +1 -1
  46. package/package.json +8 -8
  47. package/schema/check.schema.json +5 -1
  48. package/schema/env.schema.json +122 -0
  49. package/schema/inspect.schema.json +38 -1
  50. package/schema/migrate.schema.json +5 -1
  51. package/schema/render.schema.json +5 -1
  52. package/schema/validate.schema.json +5 -1
  53. package/dist/commands/add-widget.d.ts +0 -5
  54. package/dist/commands/add-widget.d.ts.map +0 -1
  55. package/dist/commands/add-widget.js +0 -90
  56. 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": {
@@ -503,7 +503,11 @@
503
503
  "HZ079",
504
504
  "HZ080",
505
505
  "HZ081",
506
- "HZ082"
506
+ "HZ082",
507
+ "HZ083",
508
+ "HZ084",
509
+ "HZ085",
510
+ "HZ086"
507
511
  ]
508
512
  },
509
513
  "Severity": {
@@ -165,7 +165,11 @@
165
165
  "HZ079",
166
166
  "HZ080",
167
167
  "HZ081",
168
- "HZ082"
168
+ "HZ082",
169
+ "HZ083",
170
+ "HZ084",
171
+ "HZ085",
172
+ "HZ086"
169
173
  ]
170
174
  },
171
175
  "Severity": {
@@ -209,7 +209,11 @@
209
209
  "HZ079",
210
210
  "HZ080",
211
211
  "HZ081",
212
- "HZ082"
212
+ "HZ082",
213
+ "HZ083",
214
+ "HZ084",
215
+ "HZ085",
216
+ "HZ086"
213
217
  ]
214
218
  },
215
219
  "Severity": {
@@ -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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"}