@hozu/cli 0.2.0 → 0.3.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/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ <img src="https://raw.githubusercontent.com/olevatorr/Hozu/main/docs/assets/logo.png" alt="Hozu logo" width="72">
2
+
1
3
  # @hozu/cli
2
4
 
3
5
  The hozu command: validate, inspect, graph, explain, impact, plan, build and skill (all with --json).
@@ -1,18 +1,6 @@
1
1
  import type { AddOutput } from '../contract.ts';
2
- export declare function namesOf(name: string): {
3
- id: string;
4
- Item: string;
5
- New: string;
6
- list: string;
7
- add: string;
8
- tag: string;
9
- machine: string;
10
- View: string;
11
- feature: string;
12
- resolvers: string;
13
- title: string;
14
- one: string;
15
- };
16
- export declare function runAddFeature(cwd: string, config: string | undefined, name: string | undefined, page: string | undefined): Promise<AddOutput>;
2
+ export declare function runAddFeature(cwd: string, config: string | undefined, name: string | undefined, page: string | undefined, parts?: string | undefined): Promise<AddOutput>;
3
+ export declare function declarationsOf(source: string): Record<string, string[]>;
4
+ export declare function textsOf(source: string, file: string): AddOutput['texts'];
17
5
  export declare function describeAdd(out: AddOutput): string;
18
6
  //# sourceMappingURL=add.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAK/C,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM;;;;;;;;;;;;;EAiBnC;AAiND,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,OAAO,CAAC,SAAS,CAAC,CAyGpB;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,CAQlD"}
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAqD/C,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,KAAK,GAAE,MAAM,GAAG,SAAqB,GACpC,OAAO,CAAC,SAAS,CAAC,CAoMpB;AAYD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CASvE;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAmBxE;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,CAgBlD"}
@@ -1,212 +1,9 @@
1
+ import { randomBytes } from 'node:crypto';
1
2
  import { existsSync } from 'node:fs';
2
3
  import { mkdir, readFile, writeFile } from 'node:fs/promises';
3
4
  import { dirname, join, relative, resolve } from 'node:path';
4
5
  import { HozuCliError } from '../errors.js';
5
- const cap = (s) => s.charAt(0).toUpperCase() + s.slice(1);
6
- export function namesOf(name) {
7
- const one = name.endsWith('s') && name.length > 1 ? name.slice(0, -1) : name;
8
- const many = name.endsWith('s') ? name : `${name}s`;
9
- return {
10
- id: name,
11
- Item: cap(one),
12
- New: `New${cap(one)}`,
13
- list: `list${cap(many)}`,
14
- add: `add${cap(one)}`,
15
- tag: `${name}Tag`,
16
- machine: `${name}Machine`,
17
- View: `${cap(name)}Board`,
18
- feature: name,
19
- resolvers: `${name}Resolvers`,
20
- title: cap(name),
21
- one,
22
- };
23
- }
24
- const model = (n) => `import { event, invoke, machine, mutation, on, op, query, tag } from '@hozu/core'
25
- import { z } from 'zod'
26
-
27
- export const ${n.Item} = z.object({ id: z.string(), title: z.string() })
28
- export const ${n.New} = z.object({
29
- title: z.string().min(2, 'Use at least 2 characters').max(80, 'Use at most 80 characters'),
30
- })
31
-
32
- export const Draft = event({ payload: z.object({ text: z.string() }) })
33
- export const Add = event({ payload: z.object({ title: z.string() }) })
34
-
35
- export const ${n.tag} = tag({ param: null })
36
-
37
- export const ${n.list} = query({
38
- input: z.object({}),
39
- output: z.array(${n.Item}),
40
- scope: 'public',
41
- freshness: 'static',
42
- tags: () => [${n.tag}()],
43
- })
44
-
45
- export const ${n.add} = mutation({
46
- input: ${n.New},
47
- output: ${n.Item},
48
- errors: { Duplicate: z.object({ title: z.string() }) },
49
- invalidates: () => [${n.tag}()],
50
- })
51
-
52
- export const DUPLICATE = 'This ${n.one} already exists'
53
-
54
- export const ${n.machine} = machine({
55
- context: z.object({
56
- draft: z.string(),
57
- error: z.string().nullable(),
58
- fields: z.object({ title: z.string().nullable() }),
59
- }),
60
- initialContext: { draft: '', error: null, fields: { title: null } },
61
- initial: 'idle',
62
- states: ({ ctx }) => ({
63
- idle: {
64
- on: [
65
- on(Draft, { target: 'idle', assign: (e) => [op.set(ctx.draft, e.text)] }),
66
- on(Add, {
67
- target: 'adding',
68
- assign: (e) => [
69
- op.set(ctx.draft, e.title),
70
- op.set(ctx.error, null),
71
- op.set(ctx.fields, { title: null }),
72
- ],
73
- }),
74
- ],
75
- },
76
- adding: {
77
- ignore: [Draft, Add],
78
- invoke: invoke(${n.add}, {
79
- input: { title: ctx.draft },
80
- done: [{ target: 'idle', assign: () => [op.set(ctx.draft, '')] }],
81
- failed: {
82
- Duplicate: [{ target: 'idle', assign: () => [op.set(ctx.error, DUPLICATE)] }],
83
- Invalid: [{ target: 'idle', assign: (e) => [op.set(ctx.fields, e.fields)] }],
84
- Unexpected: [{ target: 'idle', assign: (e) => [op.set(ctx.error, e.message)] }],
85
- },
86
- }),
87
- },
88
- }),
89
- })
90
- `;
91
- const views = (n) => `import { contract, feature, op, ui } from '@hozu/core'
92
- import { Add, ${n.add}, DUPLICATE, Draft, ${n.list}, ${n.machine}, ${n.tag} } from './model.ts'
93
-
94
- export const ${n.View} = ui.view({
95
- machine: ${n.machine},
96
- render: ({ ctx, when }) =>
97
- ui.main({ class: 'mx-auto max-w-xl space-y-6 px-4 py-12' }, [
98
- ui.h1({ class: 'text-3xl font-bold' }, ['${n.title}']),
99
- ui.form({ class: 'flex gap-2', on: { submit: ui.send(Add, { title: ui.dom.form('title') }) } }, [
100
- ui.label({ for: '${n.id}-title', class: 'sr-only' }, ['Title']),
101
- ui.input({
102
- id: '${n.id}-title',
103
- name: 'title',
104
- required: true,
105
- minlength: 2,
106
- maxlength: 80,
107
- value: ctx.draft,
108
- 'aria-invalid': op.neq(ctx.fields.title, null),
109
- 'aria-describedby': '${n.id}-title-error',
110
- class: 'flex-1 rounded border px-3 py-2',
111
- on: { input: ui.send(Draft, { text: ui.dom.value }) },
112
- }),
113
- ui.button({ type: 'submit', class: 'rounded bg-indigo-600 px-4 py-2 text-white' }, ['Add']),
114
- ]),
115
- ui.p({ id: '${n.id}-title-error', class: 'text-sm text-rose-600' }, [ctx.fields.title]),
116
- ui.if(op.neq(ctx.error, null), [ui.p({ role: 'alert', class: 'text-rose-600' }, [ctx.error])], []),
117
- when(['adding'], [ui.p({ class: 'opacity-50', 'aria-busy': 'true' }, ['Adding ', ctx.draft, '…'])]),
118
- ui.query(
119
- ${n.list},
120
- {},
121
- {
122
- ready: (items) =>
123
- ui.ul({ class: 'divide-y rounded border' }, [
124
- ui.each(items, 'id', (item) => ui.li({ class: 'px-4 py-3' }, [item.title])),
125
- ]),
126
- pending: ui.p({}, ['Loading…']),
127
- failed: { Unexpected: () => ui.p({ role: 'alert' }, ['Unavailable']) },
128
- },
129
- ),
130
- ]),
131
- })
132
-
133
- export const typesDraft = contract(${n.machine}, {
134
- given: { state: 'idle' },
135
- when: [{ send: Draft, payload: { text: 'Ship' } }],
136
- expect: { state: 'idle', changes: { draft: 'Ship' } },
137
- })
138
-
139
- export const adds = contract(${n.machine}, {
140
- given: { state: 'idle' },
141
- when: [
142
- { send: Add, payload: { title: 'Ship' } },
143
- { done: ${n.add}, result: { id: 'x1', title: 'Ship' } },
144
- ],
145
- expect: { state: 'idle', effects: [{ effect: ${n.add}, input: { title: 'Ship' } }] },
146
- })
147
-
148
- export const rejectsDuplicate = contract(${n.machine}, {
149
- given: { state: 'adding' },
150
- when: [{ failed: ${n.add}, error: 'Duplicate', data: { title: 'Ship' } }],
151
- expect: { state: 'idle', changes: { error: DUPLICATE } },
152
- })
153
-
154
- export const rejectsInvalid = contract(${n.machine}, {
155
- given: { state: 'adding' },
156
- when: [
157
- {
158
- failed: ${n.add},
159
- error: 'Invalid',
160
- data: { message: 'title: Use at least 2 characters', fields: { title: 'Use at least 2 characters' } },
161
- },
162
- ],
163
- expect: { state: 'idle', changes: { fields: { title: 'Use at least 2 characters' } } },
164
- })
165
-
166
- export const addFails = contract(${n.machine}, {
167
- given: { state: 'adding' },
168
- when: [{ failed: ${n.add}, error: 'Unexpected', data: { message: 'offline' } }],
169
- expect: { state: 'idle', changes: { error: 'offline' } },
170
- })
171
-
172
- export const ${n.feature} = feature({
173
- id: '${n.id}',
174
- intent: { summary: '${n.title}: add one with a title; titles are unique, case-insensitive.' },
175
- declarations: {
176
- Draft,
177
- Add,
178
- ${n.tag},
179
- ${n.list},
180
- ${n.add},
181
- ${n.machine},
182
- ${n.View},
183
- typesDraft,
184
- adds,
185
- rejectsDuplicate,
186
- rejectsInvalid,
187
- addFails,
188
- },
189
- })
190
- `;
191
- const server = (n) => `import type { Implement } from '@hozu/data'
192
- import { ${n.add}, ${n.list} } from './model.ts'
193
-
194
- export function ${n.resolvers}<Session, Env>(implement: Implement<Session, Env>) {
195
- const items: { id: string; title: string }[] = []
196
- let seq = 0
197
- return [
198
- implement(${n.list}, () => items.map((item) => ({ ...item }))),
199
- implement(${n.add}, ({ title }, { fail }) => {
200
- const clean = title.trim()
201
- if (items.some((item) => item.title.toLowerCase() === clean.toLowerCase()))
202
- return fail('Duplicate', { title: clean })
203
- const item = { id: \`${n.one.charAt(0)}\${++seq}\`, title: clean }
204
- items.unshift(item)
205
- return { ...item }
206
- }),
207
- ]
208
- }
209
- `;
6
+ import { accountModel, accountServer, accountViews, model, namesOf, PARTS, server, views, } from './scaffold.js';
210
7
  const addImport = (source, line) => {
211
8
  const imports = [...source.matchAll(/^import[\s\S]*?from '[^']+'\n/gm)];
212
9
  const last = imports.at(-1);
@@ -215,6 +12,33 @@ const addImport = (source, line) => {
215
12
  const at = last.index + last[0].length;
216
13
  return source.slice(0, at) + line + source.slice(at);
217
14
  };
15
+ const callEnd = (source, open) => {
16
+ let depth = 0;
17
+ let quote = null;
18
+ for (let i = open; i < source.length; i++) {
19
+ const c = source[i];
20
+ if (quote) {
21
+ if (c === '\\')
22
+ i++;
23
+ else if (c === quote)
24
+ quote = null;
25
+ }
26
+ else if (c === "'" || c === '"' || c === '`')
27
+ quote = c;
28
+ else if (c === '(')
29
+ depth++;
30
+ else if (c === ')' && --depth === 0)
31
+ return i + 1;
32
+ }
33
+ return -1;
34
+ };
35
+ const replacePage = (source, route, text) => {
36
+ const m = new RegExp(`ui\\.page\\(\\s*${route}\\s*,`).exec(source);
37
+ if (!m)
38
+ return null;
39
+ const end = callEnd(source, m.index + 'ui.page'.length);
40
+ return end < 0 ? null : source.slice(0, m.index) + text + source.slice(end);
41
+ };
218
42
  const append = (source, pattern, item) => {
219
43
  const m = pattern.exec(source);
220
44
  if (!m)
@@ -223,7 +47,25 @@ const append = (source, pattern, item) => {
223
47
  const replaced = m[0].replace(m[1], inner ? `${inner}, ${item}` : item);
224
48
  return source.slice(0, m.index) + replaced + source.slice(m.index + m[0].length);
225
49
  };
226
- export async function runAddFeature(cwd, config, name, page) {
50
+ export async function runAddFeature(cwd, config, name, page, parts = undefined) {
51
+ const asked = (parts ?? '')
52
+ .split(',')
53
+ .map((p) => p.trim())
54
+ .filter(Boolean);
55
+ for (const p of asked)
56
+ if (!PARTS.includes(p))
57
+ throw new HozuCliError('usage', `Unknown --with part "${p}"`, [`--with ${PARTS.join(',')}`]);
58
+ const w = Object.fromEntries(PARTS.map((p) => [p, asked.includes(p)]));
59
+ if (w.filter)
60
+ w.toggle = true;
61
+ if (w.detail && page === undefined)
62
+ throw new HozuCliError('usage', '--with detail needs --page, so the detail page can link back', [
63
+ `hozu add feature ${name ?? 'tasks'} --page / --with detail`,
64
+ ]);
65
+ if (w.auth && page === undefined)
66
+ throw new HozuCliError('usage', '--with auth needs --page, the page that signed-in users land on', [
67
+ `hozu add feature ${name ?? 'notes'} --page / --with auth`,
68
+ ]);
227
69
  if (!name || !/^[a-z][a-zA-Z0-9]*$/.test(name))
228
70
  throw new HozuCliError('usage', 'Give the feature a lower-case identifier', [
229
71
  'hozu add feature tasks --page /',
@@ -238,15 +80,35 @@ export async function runAddFeature(cwd, config, name, page) {
238
80
  if (existsSync(dir))
239
81
  throw new HozuCliError('usage', `features/${name} already exists`, []);
240
82
  const n = namesOf(name);
241
- const out = { created: [], edited: [], manual: [] };
83
+ const out = { created: [], edited: [], manual: [], declarations: {}, texts: [] };
242
84
  await mkdir(dir, { recursive: true });
243
- for (const [file, text] of [
244
- ['model.ts', model(n)],
245
- ['views.ts', views(n)],
246
- ['server.ts', server(n)],
247
- ]) {
248
- await writeFile(join(dir, file), text);
249
- out.created.push(relative(cwd, join(dir, file)));
85
+ const routesPath = join(root, 'routes.ts');
86
+ const routesSource = existsSync(routesPath) ? await readFile(routesPath, 'utf8') : '';
87
+ const existing = page === undefined
88
+ ? null
89
+ : new RegExp(`export const (\\w+) = route\\(\\{\\s*path: '${page.replace(/[/-]/g, '\\$&')}'`).exec(routesSource);
90
+ const pageRoute = page === undefined ? null : (existing?.[1] ?? `${name}Page`);
91
+ const newRoute = page !== undefined && !existing;
92
+ const detailPath = page === undefined ? null : page === '/' ? `/${n.many}/:id` : `${page}/:id`;
93
+ const accountDir = join(root, 'features', 'account');
94
+ const newAccount = w.auth && !existsSync(accountDir);
95
+ const newLogin = newAccount && !/export const login = route\(/.test(routesSource);
96
+ const files = [
97
+ [join(dir, 'model.ts'), model(n, w)],
98
+ [join(dir, 'views.ts'), views(n, w, pageRoute)],
99
+ [join(dir, 'server.ts'), server(n, w)],
100
+ ...(newAccount && pageRoute && page
101
+ ? [
102
+ [join(accountDir, 'model.ts'), accountModel(pageRoute)],
103
+ [join(accountDir, 'views.ts'), accountViews(page)],
104
+ [join(accountDir, 'server.ts'), accountServer()],
105
+ ]
106
+ : []),
107
+ ];
108
+ for (const [path, text] of files) {
109
+ await mkdir(dirname(path), { recursive: true });
110
+ await writeFile(path, text);
111
+ out.created.push(relative(cwd, path));
250
112
  }
251
113
  const edit = async (file, change, manual) => {
252
114
  const path = join(root, file);
@@ -261,55 +123,146 @@ export async function runAddFeature(cwd, config, name, page) {
261
123
  }
262
124
  };
263
125
  await edit('server.ts', (s) => {
264
- const wired = s.replace(/resolvers\(project,\s*\((?:implement)?\)\s*=>\s*\[/, `resolvers(project, (implement) => [\n ...${n.resolvers}(implement),`);
265
- return wired === s
266
- ? null
267
- : addImport(wired, `import { ${n.resolvers} } from './features/${name}/server.ts'\n`);
126
+ const wired = s.replace(/resolvers\(project,\s*\((?:implement)?\)\s*=>\s*\[/, `resolvers(project, (implement) => [\n ${newAccount ? '...accountResolvers(implement),\n ' : ''}...${n.resolvers}(implement),`);
127
+ if (wired === s)
128
+ return null;
129
+ const withFeature = addImport(wired, `import { ${n.resolvers} } from './features/${name}/server.ts'\n`);
130
+ return newAccount && withFeature
131
+ ? addImport(withFeature, `import { accountResolvers } from './features/account/server.ts'\n`)
132
+ : withFeature;
268
133
  }, `import { ${n.resolvers} } from './features/${name}/server.ts' and add ...${n.resolvers}(implement) to resolvers(project, (implement) => [...])`);
269
- let pageRoute = null;
270
- let newRoute = false;
271
- if (page !== undefined) {
272
- const routesPath = join(root, 'routes.ts');
273
- const routes = existsSync(routesPath) ? await readFile(routesPath, 'utf8') : '';
274
- const existing = new RegExp(`export const (\\w+) = route\\(\\{\\s*path: '${page.replace(/[/-]/g, '\\$&')}'`).exec(routes);
275
- pageRoute = existing?.[1] ?? `${name}Page`;
276
- newRoute = !existing;
277
- if (newRoute)
278
- await edit('routes.ts', (s) => `${s.trimEnd()}\nexport const ${pageRoute} = route({ path: '${page}', params: null, search: null })\n`, `export const ${pageRoute} = route({ path: '${page}', params: null, search: null })`);
279
- }
134
+ if (newAccount)
135
+ await edit('serve.ts', (s) => {
136
+ const next = s.replace(/resolvers: createResolvers\(\),/, `resolvers: createResolvers(),\n session: sessionCookie({\n name: 'sid',\n secret: process.env.SESSION_SECRET ?? '${randomBytes(24).toString('hex')}',\n secure: process.env.SESSION_SECURE === 'true',\n }),`);
137
+ return next === s ? null : addImport(next, `import { sessionCookie } from '@hozu/runtime-server'\n`);
138
+ }, "createServer({ ..., session: sessionCookie({ name: 'sid', secret: process.env.SESSION_SECRET, secure: false }) }) with sessionCookie from '@hozu/runtime-server'");
139
+ const newRoutes = [
140
+ ...(newLogin ? [`export const login = route({ path: '/login', params: null, search: null })`] : []),
141
+ ...(newRoute
142
+ ? [`export const ${pageRoute} = route({ path: '${page}', params: null, search: null })`]
143
+ : []),
144
+ ...(w.detail
145
+ ? [
146
+ `export const ${n.detailRoute} = route({ path: '${detailPath}', params: z.object({ id: z.string() }), search: null })`,
147
+ ]
148
+ : []),
149
+ ];
150
+ if (newRoutes.length)
151
+ await edit('routes.ts', (source) => {
152
+ const withZod = w.detail && !/from 'zod'/.test(source) ? addImport(source, `import { z } from 'zod'\n`) : source;
153
+ return withZod === null ? null : `${withZod.trimEnd()}\n${newRoutes.join('\n')}\n`;
154
+ }, newRoutes.join('; '));
280
155
  await edit(config ?? 'hozu.config.ts', (s) => {
281
- let next = addImport(s, `import { ${n.View}, ${n.feature} } from './features/${name}/views.ts'\n`);
156
+ let next = addImport(s, `import { ${[n.View, n.feature, ...(w.detail ? [n.Detail] : [])].sort().join(', ')} } from './features/${name}/views.ts'\n`);
157
+ if (next && w.detail)
158
+ next = addImport(next, `import { ${[n.get, n.list].sort().join(', ')} } from './features/${name}/model.ts'\n`);
159
+ if (next && newAccount) {
160
+ next = addImport(next, `import { me, Session } from './features/account/model.ts'\n`);
161
+ if (next)
162
+ next = addImport(next, `import { AccountBar, account, Login } from './features/account/views.ts'\n`);
163
+ if (next && !/\bsession:/.test(next))
164
+ next = next.replace(/(schema: \w+,\n)/, `$1 session: Session,\n`);
165
+ if (next)
166
+ next = append(next, /features:\s*\[([^\]]*)\]/, 'account');
167
+ }
282
168
  if (next)
283
169
  next = append(next, /features:\s*\[([^\]]*)\]/, n.feature);
284
- if (next && pageRoute && newRoute) {
285
- next = append(next, /routes:\s*\{([^}]*)\}/, pageRoute);
170
+ const routeNames = [
171
+ ...(newLogin ? ['login'] : []),
172
+ ...(newRoute && pageRoute ? [pageRoute] : []),
173
+ ...(w.detail ? [n.detailRoute] : []),
174
+ ];
175
+ for (const r of routeNames)
176
+ if (next)
177
+ next = append(next, /routes:\s*\{([^}]*)\}/, r);
178
+ if (next && routeNames.length)
286
179
  next =
287
- next?.replace(/import \{([^}]*)\} from '\.\/routes\.ts'/, (all, names) => all.replace(names, ` ${[
180
+ next.replace(/import \{([^}]*)\} from '\.\/routes\.ts'/, (all, names) => all.replace(names, ` ${[
288
181
  ...names
289
182
  .split(',')
290
183
  .map((x) => x.trim())
291
184
  .filter(Boolean),
292
- pageRoute,
185
+ ...routeNames,
293
186
  ]
294
187
  .sort()
295
188
  .join(', ')} `)) ?? null;
296
- next =
297
- next?.replace(/pages:\s*\[/, (m) => `${m}\n ui.page(${pageRoute}, { views: [${n.View}], head: { render: () => ({ title: '${n.title}' }) } }),`) ?? null;
298
- }
299
- else if (next && pageRoute) {
300
- const views = new RegExp(`ui\\.page\\(\\s*${pageRoute}\\s*,\\s*\\{\\s*views:\\s*\\[[^\\]]*\\]`);
301
- next = views.test(next) ? next.replace(views, `ui.page(${pageRoute}, { views: [${n.View}]`) : null;
189
+ if (next && w.detail)
190
+ next = next.replace(/pages:\s*\[/, (m) => `${m}\n ui.page(${n.detailRoute}, {\n views: [${n.Detail}],\n head: { query: ${n.get}, input: (params) => ({ id: params.id }), render: (item) => ({ title: item.title }) },\n entries: { query: ${n.list}, input: {}, params: (item) => ({ id: item.id }) },\n }),`);
191
+ if (next && newAccount)
192
+ next = next.replace(/pages:\s*\[/, (m) => `${m}\n ui.page(login, { views: [Login], head: { render: () => ({ title: 'Sign in' }) } }),`);
193
+ if (next && pageRoute) {
194
+ const text = w.auth
195
+ ? `ui.page(${pageRoute}, {\n views: [AccountBar, ${n.View}],\n head: {\n query: me,\n input: () => ({}),\n render: () => ({ title: '${n.title}', noindex: true }),\n redirects: { Unauthorized: login },\n },\n })`
196
+ : `ui.page(${pageRoute}, { views: [${n.View}], head: { render: () => ({ title: '${n.title}' }) } })`;
197
+ next = newRoute
198
+ ? next.replace(/pages:\s*\[/, (m) => `${m}\n ${text},`)
199
+ : replacePage(next, pageRoute, text);
302
200
  }
303
- return next;
201
+ return next?.replace(/\),\s*ui\.page\(/g, '),\n ui.page(') ?? null;
304
202
  }, `import { ${n.View}, ${n.feature} } from './features/${name}/views.ts', add ${n.feature} to features${pageRoute ? ` and ui.page(${pageRoute}, { views: [${n.View}], head: { render: () => ({ title: '${n.title}' }) } }) to pages` : ''}`);
203
+ for (const file of out.created) {
204
+ const source = await readFile(resolve(cwd, file), 'utf8');
205
+ for (const [kind, names] of Object.entries(declarationsOf(source)))
206
+ out.declarations[kind] = [...(out.declarations[kind] ?? []), ...names];
207
+ out.texts.push(...textsOf(source, file));
208
+ }
305
209
  return out;
306
210
  }
211
+ const KINDS = {
212
+ event: 'events',
213
+ query: 'queries',
214
+ mutation: 'mutations',
215
+ fn: 'fns',
216
+ machine: 'machine',
217
+ 'ui.view': 'views',
218
+ contract: 'contracts',
219
+ };
220
+ export function declarationsOf(source) {
221
+ const out = {};
222
+ for (const m of source.matchAll(/^export const (\w+) = (event|query|mutation|fn|machine|ui\.view|contract)\(/gm)) {
223
+ const kind = KINDS[m[2]];
224
+ out[kind] = [...(out[kind] ?? []), m[1]];
225
+ }
226
+ return out;
227
+ }
228
+ export function textsOf(source, file) {
229
+ const texts = [];
230
+ source.split('\n').forEach((line, i) => {
231
+ if (/^\s*((given|when|expect|data|result|input|payload):|\{ (send|done|failed):)/.test(line))
232
+ return;
233
+ const message = /^export const [A-Z_]+ = '([^']+)'$/.exec(line);
234
+ if (message)
235
+ texts.push({ file, line: i + 1, text: message[1] });
236
+ const label = /\blabel: '([^']+)'/.exec(line);
237
+ if (label)
238
+ texts.push({ file, line: i + 1, text: label[1] });
239
+ if (file.endsWith('model.ts'))
240
+ return;
241
+ const scan = line.replace(/when\(\[[^\]]*\]/g, '');
242
+ const found = new Set();
243
+ for (const lead of scan.matchAll(/\[\s*'([^']*)'\s*,/g))
244
+ found.add(lead[1]);
245
+ for (const group of scan.matchAll(/\[([^[\]]*)\]/g))
246
+ for (const lit of group[1].matchAll(/'([^']*)'/g))
247
+ if ((/[A-Za-z…]/.test(lit[1]) && !/^[a-z]+$/.test(lit[1])) || /^(done|open)$/.test(lit[1]))
248
+ found.add(lit[1]);
249
+ for (const text of found)
250
+ if (/[A-Za-z…]/.test(text))
251
+ texts.push({ file, line: i + 1, text });
252
+ });
253
+ return texts;
254
+ }
307
255
  export function describeAdd(out) {
308
256
  const lines = [
309
- ...out.created.map((f) => `created ${f}`),
310
- ...out.edited.map((f) => `edited ${f}`),
311
- ...out.manual.map((m) => `todo ${m}`),
312
- 'next hozu check',
257
+ ...out.created.map((f) => `created ${f}`),
258
+ ...out.edited.map((f) => `edited ${f}`),
259
+ ...out.manual.map((m) => `todo ${m}`),
260
+ ...Object.entries(out.declarations).map(([k, names]) => `${k.padEnd(10)}${names.join(' ')}`),
261
+ ...[...new Map(out.texts.map((t) => [`${t.file}:${t.line}`, []])).keys()].map((at) => `text ${at} ${out.texts
262
+ .filter((t) => `${t.file}:${t.line}` === at)
263
+ .map((t) => JSON.stringify(t.text))
264
+ .join(' ')}`),
265
+ 'next edit the texts above to the spec (no need to print the files; hozu map shows the structure), then hozu check',
313
266
  ];
314
267
  return `${lines.join('\n')}\n`;
315
268
  }
@@ -1 +1 @@
1
- {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { MapOutput } from '../contract.ts';
2
+ import type { Loaded } from '../load.ts';
3
+ export declare function runMap(loaded: Loaded, cwd: string): MapOutput;
4
+ export declare function describeMap(out: MapOutput): string;
5
+ //# sourceMappingURL=map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/commands/map.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,SAAS,EAAY,MAAM,gBAAgB,CAAA;AACrE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAYxC,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAmF7D;AAID,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,CAyClD"}