@hozu/cli 0.1.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).
@@ -0,0 +1,6 @@
1
+ import type { AddOutput } from '../contract.ts';
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'];
5
+ export declare function describeAdd(out: AddOutput): string;
6
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,269 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { existsSync } from 'node:fs';
3
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
4
+ import { dirname, join, relative, resolve } from 'node:path';
5
+ import { HozuCliError } from '../errors.js';
6
+ import { accountModel, accountServer, accountViews, model, namesOf, PARTS, server, views, } from './scaffold.js';
7
+ const addImport = (source, line) => {
8
+ const imports = [...source.matchAll(/^import[\s\S]*?from '[^']+'\n/gm)];
9
+ const last = imports.at(-1);
10
+ if (!last)
11
+ return null;
12
+ const at = last.index + last[0].length;
13
+ return source.slice(0, at) + line + source.slice(at);
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
+ };
42
+ const append = (source, pattern, item) => {
43
+ const m = pattern.exec(source);
44
+ if (!m)
45
+ return null;
46
+ const inner = m[1].trim().replace(/,$/, '');
47
+ const replaced = m[0].replace(m[1], inner ? `${inner}, ${item}` : item);
48
+ return source.slice(0, m.index) + replaced + source.slice(m.index + m[0].length);
49
+ };
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
+ ]);
69
+ if (!name || !/^[a-z][a-zA-Z0-9]*$/.test(name))
70
+ throw new HozuCliError('usage', 'Give the feature a lower-case identifier', [
71
+ 'hozu add feature tasks --page /',
72
+ ]);
73
+ if (page !== undefined && !/^\/[\w/-]*$/.test(page))
74
+ throw new HozuCliError('usage', '--page must be a static path such as / or /tasks', [
75
+ 'Routes with params are written by hand: route({ path: "/tasks/:id", params: z.object({ id: z.string() }), search: null })',
76
+ ]);
77
+ const configPath = resolve(cwd, config ?? 'hozu.config.ts');
78
+ const root = dirname(configPath);
79
+ const dir = join(root, 'features', name);
80
+ if (existsSync(dir))
81
+ throw new HozuCliError('usage', `features/${name} already exists`, []);
82
+ const n = namesOf(name);
83
+ const out = { created: [], edited: [], manual: [], declarations: {}, texts: [] };
84
+ await mkdir(dir, { recursive: true });
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));
112
+ }
113
+ const edit = async (file, change, manual) => {
114
+ const path = join(root, file);
115
+ const source = existsSync(path) ? await readFile(path, 'utf8') : null;
116
+ const next = source === null ? null : change(source);
117
+ if (next === null)
118
+ out.manual.push(`${file}: ${manual}`);
119
+ else {
120
+ await writeFile(path, next);
121
+ if (!out.edited.includes(relative(cwd, path)))
122
+ out.edited.push(relative(cwd, path));
123
+ }
124
+ };
125
+ await edit('server.ts', (s) => {
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;
133
+ }, `import { ${n.resolvers} } from './features/${name}/server.ts' and add ...${n.resolvers}(implement) to resolvers(project, (implement) => [...])`);
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('; '));
155
+ await edit(config ?? 'hozu.config.ts', (s) => {
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
+ }
168
+ if (next)
169
+ next = append(next, /features:\s*\[([^\]]*)\]/, n.feature);
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)
179
+ next =
180
+ next.replace(/import \{([^}]*)\} from '\.\/routes\.ts'/, (all, names) => all.replace(names, ` ${[
181
+ ...names
182
+ .split(',')
183
+ .map((x) => x.trim())
184
+ .filter(Boolean),
185
+ ...routeNames,
186
+ ]
187
+ .sort()
188
+ .join(', ')} `)) ?? 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);
200
+ }
201
+ return next?.replace(/\),\s*ui\.page\(/g, '),\n ui.page(') ?? null;
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
+ }
209
+ return out;
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
+ }
255
+ export function describeAdd(out) {
256
+ const lines = [
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',
266
+ ];
267
+ return `${lines.join('\n')}\n`;
268
+ }
269
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
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 { CheckOutput, TypeIssue } from '../contract.ts';
2
+ import type { Loaded } from '../load.ts';
3
+ export declare function typeErrors(output: string, root: string): TypeIssue[];
4
+ export declare function runCheck(loaded: Loaded, cwd: string, updateLock: boolean): Promise<CheckOutput>;
5
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAcxC,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CAcpE;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAsBrG"}
@@ -0,0 +1,55 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { readFileSync } from 'node:fs';
3
+ import { createRequire } from 'node:module';
4
+ import { dirname, join, relative } from 'node:path';
5
+ import { runValidate } from './validate.js';
6
+ function typescriptBin(from) {
7
+ try {
8
+ const require = createRequire(from);
9
+ const manifest = require.resolve('typescript/package.json');
10
+ const bin = JSON.parse(readFileSync(manifest, 'utf8')).bin?.tsc;
11
+ return bin ? join(dirname(manifest), bin) : null;
12
+ }
13
+ catch {
14
+ return null;
15
+ }
16
+ }
17
+ export function typeErrors(output, root) {
18
+ const errors = [];
19
+ for (const line of output.split('\n')) {
20
+ const m = /^(.+?)\((\d+),(\d+)\): error (TS\d+): (.*)$/.exec(line.trim());
21
+ if (m)
22
+ errors.push({
23
+ file: relative(root, join(root, m[1])),
24
+ line: Number(m[2]),
25
+ column: Number(m[3]),
26
+ code: m[4],
27
+ message: m[5],
28
+ });
29
+ }
30
+ return errors;
31
+ }
32
+ export async function runCheck(loaded, cwd, updateLock) {
33
+ const root = dirname(loaded.path);
34
+ const tsc = typescriptBin(loaded.path);
35
+ let types;
36
+ if (!tsc)
37
+ types = { ok: false, skipped: true, errors: [] };
38
+ else {
39
+ const run = spawnSync(process.execPath, [tsc, '--noEmit', '--pretty', 'false', '-p', root], {
40
+ cwd: root,
41
+ encoding: 'utf8',
42
+ });
43
+ const errors = typeErrors(`${run.stdout}\n${run.stderr}`, root);
44
+ types = {
45
+ ok: run.status === 0,
46
+ skipped: false,
47
+ errors: run.status === 0 || errors.length
48
+ ? errors
49
+ : [{ file: '', line: 0, column: 0, code: 'tsc', message: (run.stderr || run.stdout).trim() }],
50
+ };
51
+ }
52
+ const validate = await runValidate(loaded, undefined, cwd, updateLock);
53
+ return { ok: types.ok && validate.ok, types, validate };
54
+ }
55
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.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"}
@@ -0,0 +1,125 @@
1
+ import { relative } from 'node:path';
2
+ import { resolveSource } from '@hozu/core/ir';
3
+ const local = (ref) => ref.slice(ref.indexOf('.') + 1);
4
+ const fieldsOf = (schema) => {
5
+ const props = schema && typeof schema === 'object' ? schema.properties : undefined;
6
+ return props ? Object.keys(props) : [];
7
+ };
8
+ const freshnessText = (f) => ('seconds' in f ? `${f.kind} ${f.seconds}s` : f.kind);
9
+ export function runMap(loaded, cwd) {
10
+ const build = loaded.build(true);
11
+ const { ir } = build;
12
+ const at = (pointer) => {
13
+ const s = resolveSource(build.sources, pointer);
14
+ return s ? `${relative(cwd, s.file)}:${s.line}` : null;
15
+ };
16
+ const routes = Object.entries(ir.routes).map(([id, r]) => {
17
+ const page = ir.pages[id];
18
+ return {
19
+ id,
20
+ path: r.path,
21
+ search: fieldsOf(r.search ?? undefined),
22
+ views: page?.views ?? [],
23
+ head: page?.head.query?.ref ?? null,
24
+ at: at(`/pages/${id}`) ?? at(`/routes/${id}`),
25
+ };
26
+ });
27
+ const features = Object.values(ir.features).map((f) => {
28
+ const base = `/features/${f.id}`;
29
+ const m = f.machine;
30
+ const states = m
31
+ ? Object.entries(m.states).map(([name, s]) => ({
32
+ name,
33
+ initial: name === m.initial,
34
+ final: s.final,
35
+ on: Object.entries(s.on).map(([event, list]) => ({
36
+ event: local(event),
37
+ targets: list.map((t) => t.target),
38
+ })),
39
+ invoke: s.invoke
40
+ ? {
41
+ effect: local(s.invoke.effect),
42
+ done: s.invoke.done.map((t) => t.target),
43
+ failed: Object.fromEntries(Object.entries(s.invoke.failed).map(([e, list]) => [e, list.map((t) => t.target)])),
44
+ }
45
+ : null,
46
+ ignore: s.ignore.map(local),
47
+ after: s.after.map((a) => ({ ms: a.ms, target: a.transition.target })),
48
+ at: at(`${base}/machine/states/${name}/invoke`) ??
49
+ at(`${base}/machine/states/${name}/on/${Object.keys(s.on)[0] ?? ''}/0`) ??
50
+ at(`${base}/machine`),
51
+ }))
52
+ : [];
53
+ return {
54
+ id: f.id,
55
+ queries: Object.entries(f.queries).map(([name, q]) => ({
56
+ name,
57
+ scope: q.scope,
58
+ freshness: freshnessText(q.freshness),
59
+ errors: Object.keys(q.errors),
60
+ tags: q.tags.map((t) => local(t.tag)),
61
+ at: at(`${base}/queries/${name}`),
62
+ })),
63
+ mutations: Object.entries(f.mutations).map(([name, q]) => ({
64
+ name,
65
+ errors: Object.keys(q.errors),
66
+ invalidates: q.invalidates.map((t) => local(t.tag)),
67
+ at: at(`${base}/mutations/${name}`),
68
+ })),
69
+ events: Object.entries(f.events).map(([name, e]) => ({
70
+ name,
71
+ fields: fieldsOf(f.schemas[e.payload]),
72
+ at: at(`${base}/events/${name}`),
73
+ })),
74
+ fns: Object.keys(f.fns),
75
+ context: m ? fieldsOf(f.schemas[m.context]) : [],
76
+ machineAt: m ? at(`${base}/machine`) : null,
77
+ states,
78
+ views: Object.entries(f.views).map(([name, v]) => ({
79
+ name,
80
+ machine: v.machine !== null,
81
+ route: v.route,
82
+ at: at(`${base}/views/${name}`),
83
+ })),
84
+ contracts: Object.keys(f.contracts).length,
85
+ contractsAt: at(`${base}/contracts/${Object.keys(f.contracts)[0] ?? ''}`),
86
+ };
87
+ });
88
+ return { routes, features };
89
+ }
90
+ const where = (s) => (s ? ` ${s}` : '');
91
+ export function describeMap(out) {
92
+ const lines = ['routes'];
93
+ for (const r of out.routes)
94
+ lines.push(` ${r.id} ${r.path}${r.search.length ? `?${r.search.join('&')}` : ''} → ${r.views.map(local).join(', ') || '(no page)'}${r.head ? ` · head ${local(r.head)}` : ''}${where(r.at)}`);
95
+ for (const f of out.features) {
96
+ lines.push(`feature ${f.id}`);
97
+ for (const q of f.queries)
98
+ lines.push(` query ${q.name} ${q.scope} ${q.freshness}${q.errors.length ? ` !${q.errors.join(' !')}` : ''}${q.tags.length ? ` [${q.tags.join(' ')}]` : ''}${where(q.at)}`);
99
+ for (const q of f.mutations)
100
+ lines.push(` mutation ${q.name}${q.errors.length ? ` !${q.errors.join(' !')}` : ''}${q.invalidates.length ? ` ⟳${q.invalidates.join(' ')}` : ''}${where(q.at)}`);
101
+ if (f.events.length)
102
+ lines.push(` events ${f.events.map((e) => `${e.name}{${e.fields.join(',')}}`).join(' ')}`);
103
+ if (f.fns.length)
104
+ lines.push(` fns ${f.fns.join(' ')}`);
105
+ if (f.context.length)
106
+ lines.push(` context ${f.context.join(' ')}${where(f.machineAt)}`);
107
+ for (const s of f.states) {
108
+ const parts = s.on.map((t) => `${t.event}→${t.targets.join('|')}`);
109
+ if (s.invoke)
110
+ parts.push(`invoke ${s.invoke.effect} done→${s.invoke.done.join('|')} ${Object.entries(s.invoke.failed)
111
+ .map(([e, t]) => `${e}→${t.join('|')}`)
112
+ .join(' ')}`);
113
+ for (const a of s.after)
114
+ parts.push(`after ${a.ms}ms→${a.target}`);
115
+ if (s.ignore.length)
116
+ parts.push(`ignore ${s.ignore.join(' ')}`);
117
+ lines.push(` state ${s.name}${s.initial ? '*' : ''}${s.final ? ' (final)' : ''}: ${parts.join('; ')}${where(s.at)}`);
118
+ }
119
+ for (const v of f.views)
120
+ lines.push(` view ${v.name}${v.machine ? ' (machine)' : ''}${v.route ? ` route ${v.route}` : ''}${where(v.at)}`);
121
+ lines.push(` contracts ${f.contracts}${where(f.contractsAt)}`);
122
+ }
123
+ return `${lines.join('\n')}\n`;
124
+ }
125
+ //# sourceMappingURL=map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map.js","sourceRoot":"","sources":["../../src/commands/map.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { RequestElement, RequestOutput } from '../contract.ts';
2
+ import type { Loaded } from '../load.ts';
3
+ interface Form {
4
+ action: string;
5
+ fields: Record<string, string>;
6
+ buttons: string[];
7
+ }
8
+ export declare function formsOf(html: string, at: string): Form[];
9
+ export declare function elementsOf(html: string, selector: string): RequestElement[];
10
+ export interface RequestOptions {
11
+ method: 'GET' | 'POST';
12
+ paths: string[];
13
+ fields: string[];
14
+ next: string[];
15
+ button: string | undefined;
16
+ select: string[];
17
+ forms: boolean;
18
+ session: string | undefined;
19
+ full: boolean;
20
+ }
21
+ export declare function runRequest(loaded: Loaded, options: RequestOptions): Promise<RequestOutput>;
22
+ export declare function describeRequest(out: RequestOutput): string;
23
+ export {};
24
+ //# sourceMappingURL=request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/commands/request.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAe,MAAM,gBAAgB,CAAA;AAEhF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAqCxC,UAAU,IAAI;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,EAAE,CAqCxD;AAiCD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,EAAE,CA+B3E;AAYD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,GAAG,MAAM,CAAA;IACtB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,IAAI,EAAE,OAAO,CAAA;CACd;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAgJhG;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAyB1D"}