@hozu/cli 0.7.0 → 0.8.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 (136) hide show
  1. package/dist/cdp.d.ts.map +1 -1
  2. package/dist/cdp.js +1 -0
  3. package/dist/cdp.js.map +1 -1
  4. package/dist/commands/add-widget.d.ts.map +1 -1
  5. package/dist/commands/add-widget.js +4 -5
  6. package/dist/commands/add-widget.js.map +1 -1
  7. package/dist/commands/add.d.ts.map +1 -1
  8. package/dist/commands/add.js +4 -10
  9. package/dist/commands/add.js.map +1 -1
  10. package/dist/commands/app.d.ts +27 -0
  11. package/dist/commands/app.d.ts.map +1 -0
  12. package/dist/commands/app.js +148 -0
  13. package/dist/commands/app.js.map +1 -0
  14. package/dist/commands/browse-page.d.ts +2 -0
  15. package/dist/commands/browse-page.d.ts.map +1 -0
  16. package/dist/commands/browse-page.js +228 -0
  17. package/dist/commands/browse-page.js.map +1 -0
  18. package/dist/commands/browse-tab.d.ts +80 -0
  19. package/dist/commands/browse-tab.d.ts.map +1 -0
  20. package/dist/commands/browse-tab.js +431 -0
  21. package/dist/commands/browse-tab.js.map +1 -0
  22. package/dist/commands/browse-world.d.ts +36 -0
  23. package/dist/commands/browse-world.d.ts.map +1 -0
  24. package/dist/commands/browse-world.js +108 -0
  25. package/dist/commands/browse-world.js.map +1 -0
  26. package/dist/commands/browse.d.ts +24 -3
  27. package/dist/commands/browse.d.ts.map +1 -1
  28. package/dist/commands/browse.js +341 -407
  29. package/dist/commands/browse.js.map +1 -1
  30. package/dist/commands/check.d.ts +1 -2
  31. package/dist/commands/check.d.ts.map +1 -1
  32. package/dist/commands/check.js +24 -27
  33. package/dist/commands/check.js.map +1 -1
  34. package/dist/commands/map.d.ts +12 -0
  35. package/dist/commands/map.d.ts.map +1 -1
  36. package/dist/commands/map.js +83 -3
  37. package/dist/commands/map.js.map +1 -1
  38. package/dist/commands/migrate-agent.d.ts +12 -0
  39. package/dist/commands/migrate-agent.d.ts.map +1 -0
  40. package/dist/commands/migrate-agent.js +6 -0
  41. package/dist/commands/migrate-agent.js.map +1 -0
  42. package/dist/commands/migrate-app.d.ts +15 -0
  43. package/dist/commands/migrate-app.d.ts.map +1 -0
  44. package/dist/commands/migrate-app.js +334 -0
  45. package/dist/commands/migrate-app.js.map +1 -0
  46. package/dist/commands/migrate-ast.d.ts +63 -0
  47. package/dist/commands/migrate-ast.d.ts.map +1 -0
  48. package/dist/commands/migrate-ast.js +257 -0
  49. package/dist/commands/migrate-ast.js.map +1 -0
  50. package/dist/commands/migrate-forms.d.ts +4 -0
  51. package/dist/commands/migrate-forms.d.ts.map +1 -0
  52. package/dist/commands/migrate-forms.js +120 -0
  53. package/dist/commands/migrate-forms.js.map +1 -0
  54. package/dist/commands/migrate-freshness.d.ts +4 -0
  55. package/dist/commands/migrate-freshness.d.ts.map +1 -0
  56. package/dist/commands/migrate-freshness.js +47 -0
  57. package/dist/commands/migrate-freshness.js.map +1 -0
  58. package/dist/commands/migrate-head.d.ts +8 -0
  59. package/dist/commands/migrate-head.d.ts.map +1 -0
  60. package/dist/commands/migrate-head.js +132 -0
  61. package/dist/commands/migrate-head.js.map +1 -0
  62. package/dist/commands/migrate-links.d.ts +5 -0
  63. package/dist/commands/migrate-links.d.ts.map +1 -0
  64. package/dist/commands/migrate-links.js +55 -0
  65. package/dist/commands/migrate-links.js.map +1 -0
  66. package/dist/commands/migrate-lists.d.ts +9 -0
  67. package/dist/commands/migrate-lists.d.ts.map +1 -0
  68. package/dist/commands/migrate-lists.js +225 -0
  69. package/dist/commands/migrate-lists.js.map +1 -0
  70. package/dist/commands/migrate-normalize.d.ts +27 -0
  71. package/dist/commands/migrate-normalize.d.ts.map +1 -0
  72. package/dist/commands/migrate-normalize.js +252 -0
  73. package/dist/commands/migrate-normalize.js.map +1 -0
  74. package/dist/commands/migrate-ops.d.ts +4 -0
  75. package/dist/commands/migrate-ops.d.ts.map +1 -0
  76. package/dist/commands/migrate-ops.js +192 -0
  77. package/dist/commands/migrate-ops.js.map +1 -0
  78. package/dist/commands/migrate-parts.d.ts +7 -0
  79. package/dist/commands/migrate-parts.d.ts.map +1 -0
  80. package/dist/commands/migrate-parts.js +166 -0
  81. package/dist/commands/migrate-parts.js.map +1 -0
  82. package/dist/commands/migrate-stale.d.ts +24 -0
  83. package/dist/commands/migrate-stale.d.ts.map +1 -0
  84. package/dist/commands/migrate-stale.js +114 -0
  85. package/dist/commands/migrate-stale.js.map +1 -0
  86. package/dist/commands/migrate.d.ts +21 -0
  87. package/dist/commands/migrate.d.ts.map +1 -0
  88. package/dist/commands/migrate.js +358 -0
  89. package/dist/commands/migrate.js.map +1 -0
  90. package/dist/commands/plan.d.ts.map +1 -1
  91. package/dist/commands/plan.js +2 -6
  92. package/dist/commands/plan.js.map +1 -1
  93. package/dist/commands/request.d.ts +13 -16
  94. package/dist/commands/request.d.ts.map +1 -1
  95. package/dist/commands/request.js +140 -161
  96. package/dist/commands/request.js.map +1 -1
  97. package/dist/commands/scaffold.d.ts.map +1 -1
  98. package/dist/commands/scaffold.js +10 -8
  99. package/dist/commands/scaffold.js.map +1 -1
  100. package/dist/commands/seed-lock.d.ts +2 -0
  101. package/dist/commands/seed-lock.d.ts.map +1 -0
  102. package/dist/commands/seed-lock.js +6 -0
  103. package/dist/commands/seed-lock.js.map +1 -0
  104. package/dist/commands/serve.d.ts +6 -0
  105. package/dist/commands/serve.d.ts.map +1 -0
  106. package/dist/commands/serve.js +31 -0
  107. package/dist/commands/serve.js.map +1 -0
  108. package/dist/commands/skill.d.ts.map +1 -1
  109. package/dist/commands/skill.js +1 -2
  110. package/dist/commands/skill.js.map +1 -1
  111. package/dist/commands/validate.d.ts +13 -0
  112. package/dist/commands/validate.d.ts.map +1 -1
  113. package/dist/commands/validate.js +51 -5
  114. package/dist/commands/validate.js.map +1 -1
  115. package/dist/contract.d.ts +124 -7
  116. package/dist/contract.d.ts.map +1 -1
  117. package/dist/main.d.ts +8 -0
  118. package/dist/main.d.ts.map +1 -1
  119. package/dist/main.js +99 -31
  120. package/dist/main.js.map +1 -1
  121. package/dist/output.d.ts.map +1 -1
  122. package/dist/output.js +28 -2
  123. package/dist/output.js.map +1 -1
  124. package/dist/render.d.ts.map +1 -1
  125. package/dist/render.js +5 -1
  126. package/dist/render.js.map +1 -1
  127. package/package.json +7 -7
  128. package/schema/browse.schema.json +180 -0
  129. package/schema/check.schema.json +28 -8
  130. package/schema/inspect.schema.json +114 -3
  131. package/schema/map.schema.json +62 -0
  132. package/schema/migrate.schema.json +649 -0
  133. package/schema/plan.schema.json +8 -22
  134. package/schema/request.schema.json +133 -8
  135. package/schema/skill.schema.json +22 -1
  136. package/schema/validate.schema.json +28 -8
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-head.js","sourceRoot":"","sources":["../../src/commands/migrate-head.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type Rewrite } from './migrate-ast.ts';
2
+ export type SearchDefaults = Map<string, Record<string, unknown>>;
3
+ /** `ui.link(r, p, null)`, `{}` and search fields equal to the route defaults → `ui.link(r, p)` (ADR 0043 G). */
4
+ export declare function migrateLinks(source: string, file: string, byPath?: SearchDefaults): Rewrite;
5
+ //# sourceMappingURL=migrate-links.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-links.d.ts","sourceRoot":"","sources":["../../src/commands/migrate-links.ts"],"names":[],"mappings":"AAAA,OAAO,EAaL,KAAK,OAAO,EAEb,MAAM,kBAAkB,CAAA;AAEzB,MAAM,MAAM,cAAc,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;AAYjE,gHAAgH;AAChH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,cAA0B,GAAG,OAAO,CAoCtG"}
@@ -0,0 +1,55 @@
1
+ import { apply, callOf, declaration, importsFrom, keyName, lineOf, literal, parse, property, walk, } from './migrate-ast.js';
2
+ const foldable = (v, fallback) => v === null || (v !== undefined && typeof v !== 'object' && v === fallback);
3
+ function defaultsOf(file, program, route, byPath) {
4
+ const decl = declaration(file, program, route);
5
+ const path = decl?.init.type === 'CallExpression' ? literal(property(decl.init.arguments[0], 'path')?.value) : null;
6
+ return typeof path?.value === 'string' ? (byPath.get(path.value) ?? null) : null;
7
+ }
8
+ /** `ui.link(r, p, null)`, `{}` and search fields equal to the route defaults → `ui.link(r, p)` (ADR 0043 G). */
9
+ export function migrateLinks(source, file, byPath = new Map()) {
10
+ if (!/\.link\s*\(/.test(source))
11
+ return { code: source, notes: [] };
12
+ const program = parse(source);
13
+ const ui = importsFrom(program, '@hozu/core').get('ui');
14
+ if (!ui)
15
+ return { code: source, notes: [] };
16
+ const edits = [];
17
+ const notes = [];
18
+ walk(program, (n) => {
19
+ if (!callOf(n, ui, 'link') || n.arguments.length < 3)
20
+ return;
21
+ const [route, params, search] = n.arguments;
22
+ const drop = () => edits.push([params.end, search.end, '']);
23
+ if (search.type === 'Literal' && search.value === null)
24
+ return drop();
25
+ if (search.type !== 'ObjectExpression')
26
+ return;
27
+ if (search.properties.length === 0)
28
+ return drop();
29
+ const defaults = defaultsOf(file, program, route, byPath);
30
+ const removed = [];
31
+ for (const p of search.properties) {
32
+ const k = keyName(p);
33
+ const v = literal(p.value);
34
+ if (k && v && foldable(v.value, defaults?.[k]))
35
+ removed.push(p);
36
+ }
37
+ if (!removed.length)
38
+ return;
39
+ if (removed.length === search.properties.length)
40
+ return drop();
41
+ const kept = search.properties
42
+ .filter((p) => !removed.includes(p))
43
+ .map((p) => source.slice(p.start, p.end));
44
+ edits.push([search.start, search.end, `{ ${kept.join(', ')} }`]);
45
+ notes.push({
46
+ file,
47
+ line: lineOf(source, n.start),
48
+ rule: 'link',
49
+ message: `ui.link search: dropped ${removed.map((p) => keyName(p)).join(', ')} (null or the route default)`,
50
+ see: 'views',
51
+ });
52
+ });
53
+ return { code: apply(source, edits), notes };
54
+ }
55
+ //# sourceMappingURL=migrate-links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-links.js","sourceRoot":"","sources":["../../src/commands/migrate-links.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type Node, type Rewrite } from './migrate-ast.ts';
2
+ /** The scaffold's `itemsOf`: `if (!s) return []; const list = store.get(s.user) ?? []; store.set(s.user, list); return list`. */
3
+ export declare function createOnRead(fn: Node): {
4
+ store: string;
5
+ session: string;
6
+ } | null;
7
+ /** Query resolvers only read (ADR 0043 B): split the scaffold's create-on-read helper, print other writes. */
8
+ export declare function migrateLists(source: string, file: string): Rewrite;
9
+ //# sourceMappingURL=migrate-lists.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-lists.d.ts","sourceRoot":"","sources":["../../src/commands/migrate-lists.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,IAAI,EAIT,KAAK,OAAO,EAEb,MAAM,kBAAkB,CAAA;AAkBzB,iIAAiI;AACjI,wBAAgB,YAAY,CAAC,EAAE,EAAE,IAAI,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA4ChF;AAsFD,8GAA8G;AAC9G,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CA4FlE"}
@@ -0,0 +1,225 @@
1
+ import { basename } from 'node:path';
2
+ import { apply, declaration, lineOf, parents, parse, walk, } from './migrate-ast.js';
3
+ const WRITES = new Set(['set', 'push', 'unshift']);
4
+ const member = (n, object, name) => n?.type === 'CallExpression' &&
5
+ n.callee.type === 'MemberExpression' &&
6
+ !n.callee.computed &&
7
+ n.callee.property.name === name &&
8
+ (object === null || (n.callee.object.type === 'Identifier' && n.callee.object.name === object));
9
+ const sessionUser = (n, session) => n?.type === 'MemberExpression' &&
10
+ !n.computed &&
11
+ n.object.type === 'Identifier' &&
12
+ n.object.name === session &&
13
+ n.property.name === 'user';
14
+ /** The scaffold's `itemsOf`: `if (!s) return []; const list = store.get(s.user) ?? []; store.set(s.user, list); return list`. */
15
+ export function createOnRead(fn) {
16
+ if (fn?.type !== 'ArrowFunctionExpression' || fn.params.length !== 1 || fn.body.type !== 'BlockStatement')
17
+ return null;
18
+ const session = fn.params[0].type === 'Identifier' ? fn.params[0].name : null;
19
+ const [guard, get, set, ret, ...rest] = fn.body.body;
20
+ if (!session || rest.length || !ret)
21
+ return null;
22
+ const empty = (s) => s?.type === 'ReturnStatement' && s.argument?.type === 'ArrayExpression' && !s.argument.elements.length;
23
+ if (guard.type !== 'IfStatement' ||
24
+ guard.test.type !== 'UnaryExpression' ||
25
+ guard.test.operator !== '!' ||
26
+ guard.test.argument.name !== session ||
27
+ !(empty(guard.consequent) ||
28
+ (guard.consequent.type === 'BlockStatement' && empty(guard.consequent.body[0]))))
29
+ return null;
30
+ const decl = get.type === 'VariableDeclaration' ? get.declarations[0] : null;
31
+ const init = decl?.init;
32
+ if (!decl ||
33
+ get.declarations.length !== 1 ||
34
+ init?.type !== 'LogicalExpression' ||
35
+ init.operator !== '??' ||
36
+ init.right.type !== 'ArrayExpression' ||
37
+ !member(init.left, null, 'get') ||
38
+ init.left.callee.object.type !== 'Identifier' ||
39
+ !sessionUser(init.left.arguments[0], session))
40
+ return null;
41
+ const store = init.left.callee.object.name;
42
+ const list = decl.id.name;
43
+ const write = set.type === 'ExpressionStatement' ? set.expression : null;
44
+ if (!member(write, store, 'set') ||
45
+ !sessionUser(write.arguments[0], session) ||
46
+ write.arguments[1]?.name !== list ||
47
+ ret.type !== 'ReturnStatement' ||
48
+ ret.argument?.name !== list)
49
+ return null;
50
+ return { store, session };
51
+ }
52
+ const kindOf = (file, program, ref) => {
53
+ const d = declaration(file, program, ref);
54
+ return d?.init.type === 'CallExpression' && d.init.callee.type === 'Identifier' ? d.init.callee.name : null;
55
+ };
56
+ function scopeOf(file, program, source) {
57
+ const functions = new Map();
58
+ const values = new Map();
59
+ walk(program, (n) => {
60
+ if (n.type === 'FunctionDeclaration' && n.id)
61
+ functions.set(n.id.name, n);
62
+ if (n.type === 'VariableDeclarator' && n.id.type === 'Identifier' && n.init)
63
+ (/Function/.test(n.init.type) ? functions : values).set(n.id.name, n.init);
64
+ });
65
+ return { file, source, functions, values, program };
66
+ }
67
+ const where = (mod, n) => `${basename(mod.file)}:${lineOf(mod.source, n.start)}`;
68
+ const isFunction = (n) => /Function/.test(n?.type ?? '');
69
+ const scopes = new WeakMap();
70
+ function imported(ref, mod) {
71
+ const d = declaration(mod.file, mod.program, ref);
72
+ if (!d)
73
+ return null;
74
+ if (!scopes.has(d.program))
75
+ scopes.set(d.program, scopeOf(d.file, d.program, d.source));
76
+ const other = scopes.get(d.program);
77
+ return isFunction(d.init) ? { fn: d.init, mod: other } : { value: d.init, mod: other };
78
+ }
79
+ function functionOf(ref, mod) {
80
+ if (ref.type === 'Identifier' && mod.functions.has(ref.name))
81
+ return { fn: mod.functions.get(ref.name), mod };
82
+ const found = imported(ref, mod);
83
+ return found && 'fn' in found ? found : null;
84
+ }
85
+ function returned(fn) {
86
+ if (fn.body.type === 'ObjectExpression')
87
+ return fn.body;
88
+ if (fn.body.type !== 'BlockStatement')
89
+ return null;
90
+ const ret = fn.body.body.find((s) => s.type === 'ReturnStatement');
91
+ return ret?.argument?.type === 'ObjectExpression' ? ret.argument : null;
92
+ }
93
+ function objectOf(value, mod) {
94
+ if (value.type === 'ObjectExpression')
95
+ return { object: value, mod };
96
+ if (value.type !== 'CallExpression')
97
+ return null;
98
+ const f = functionOf(value.callee, mod);
99
+ const object = f && returned(f.fn);
100
+ return object && f ? { object, mod: f.mod } : null;
101
+ }
102
+ /** The function a call runs: a local or imported function, or a method of an object a factory returns. */
103
+ function callee(c, mod) {
104
+ if (c.type === 'Identifier')
105
+ return functionOf(c, mod);
106
+ if (c.type !== 'MemberExpression' || c.computed || c.object.type !== 'Identifier')
107
+ return null;
108
+ const local = mod.values.get(c.object.name);
109
+ const found = local ? { value: local, mod } : imported(c.object, mod);
110
+ if (!found)
111
+ return imported(c, mod) && functionOf(c, mod);
112
+ if ('fn' in found)
113
+ return null;
114
+ const owner = objectOf(found.value, found.mod);
115
+ const p = owner?.object.properties.find((x) => x.type === 'Property' && (x.key.name ?? x.key.value) === c.property.name);
116
+ if (!owner || !p)
117
+ return null;
118
+ if (isFunction(p.value))
119
+ return { fn: p.value, mod: owner.mod };
120
+ return p.value.type === 'Identifier' ? functionOf(p.value, owner.mod) : null;
121
+ }
122
+ /** Query resolvers only read (ADR 0043 B): split the scaffold's create-on-read helper, print other writes. */
123
+ export function migrateLists(source, file) {
124
+ if (!/\bimplement\s*\(/.test(source))
125
+ return { code: source, notes: [] };
126
+ const program = parse(source);
127
+ const parent = parents(program);
128
+ const notes = [];
129
+ const edits = [];
130
+ const helpers = new Map();
131
+ walk(program, (n) => {
132
+ if (n.type === 'VariableDeclarator' && n.id.type === 'Identifier' && createOnRead(n.init))
133
+ helpers.set(n.id.name, n);
134
+ });
135
+ const implementsOf = (n) => {
136
+ for (let up = parent.get(n); up; up = parent.get(up))
137
+ if (up.type === 'CallExpression' && up.callee.type === 'Identifier' && up.callee.name === 'implement')
138
+ return {
139
+ kind: kindOf(file, program, up.arguments[0]),
140
+ name: source.slice(up.arguments[0].start, up.arguments[0].end),
141
+ };
142
+ return null;
143
+ };
144
+ const taken = new Set();
145
+ walk(program, (n) => n.type === 'Identifier' && taken.add(n.name));
146
+ for (const [name, decl] of helpers) {
147
+ const calls = [];
148
+ walk(program, (n) => {
149
+ if (n.type === 'CallExpression' && n.callee.type === 'Identifier' && n.callee.name === name)
150
+ calls.push({ n, query: implementsOf(n)?.kind === 'query' });
151
+ });
152
+ const reads = calls.filter((c) => c.query).length;
153
+ if (!reads)
154
+ continue;
155
+ const read = taken.has('listOf') ? `${name}Read` : 'listOf';
156
+ const own = taken.has('ownListOf') ? `${name}Own` : 'ownListOf';
157
+ const fn = decl.init;
158
+ const { store, session } = createOnRead(fn);
159
+ const head = source.slice(fn.start, fn.body.start).replace(/\s*=>\s*$/, '');
160
+ const stmt = parent.get(decl);
161
+ const lineStart = source.lastIndexOf('\n', stmt.start) + 1;
162
+ const indent = source.slice(lineStart, stmt.start);
163
+ edits.push([
164
+ stmt.start,
165
+ stmt.end,
166
+ `const ${read} = ${head} => (${session} ? (${store}.get(${session}.user) ?? []) : [])\n${indent}const ${own} = ${source.slice(fn.start, fn.end)}`,
167
+ ]);
168
+ for (const c of calls)
169
+ edits.push([c.n.callee.start, c.n.callee.end, c.query ? read : own]);
170
+ notes.push({
171
+ file,
172
+ line: lineOf(source, stmt.start),
173
+ rule: 'resolvers',
174
+ message: `${name} created the user's list on read: split into ${read} (${reads} query ${reads === 1 ? 'call' : 'calls'}) and ${own} (writes)`,
175
+ see: 'data',
176
+ });
177
+ }
178
+ const here = scopeOf(file, program, source);
179
+ const writes = (body, mod, seen) => {
180
+ const out = [];
181
+ walk(body, (x) => {
182
+ if (x.type !== 'CallExpression')
183
+ return;
184
+ const c = x.callee;
185
+ if (c.type === 'MemberExpression' && !c.computed && WRITES.has(c.property.name)) {
186
+ out.push({ at: x, method: c.property.name, via: null, where: mod === here ? null : where(mod, x) });
187
+ return;
188
+ }
189
+ if (c.type === 'Identifier' && mod === here && helpers.has(c.name))
190
+ return;
191
+ const target = callee(c, mod);
192
+ if (!target || seen.has(target.fn))
193
+ return;
194
+ seen.add(target.fn);
195
+ const via = mod.source.slice(c.start, c.end);
196
+ for (const w of writes(target.fn.body, target.mod, seen))
197
+ out.push(mod === here ? { ...w, at: x, via } : w);
198
+ });
199
+ return out;
200
+ };
201
+ walk(program, (n) => {
202
+ if (n.type !== 'CallExpression' || n.callee.type !== 'Identifier' || n.callee.name !== 'implement')
203
+ return;
204
+ if (kindOf(file, program, n.arguments[0]) !== 'query' || !n.arguments[1])
205
+ return;
206
+ const query = source.slice(n.arguments[0].start, n.arguments[0].end);
207
+ const seen = new Set();
208
+ for (const w of writes(n.arguments[1], here, new Set())) {
209
+ const key = `${w.via}.${w.method}`;
210
+ if (seen.has(key))
211
+ continue;
212
+ seen.add(key);
213
+ notes.push({
214
+ file,
215
+ line: lineOf(source, w.at.start),
216
+ rule: 'resolvers',
217
+ message: `the resolver of query ${query} ${w.via ? `calls ${w.via}, which calls` : 'calls'} .${w.method}()${w.where ? ` (${w.where})` : ''}: query resolvers only read; move the write into a mutation`,
218
+ see: 'data',
219
+ behaviour: true,
220
+ });
221
+ }
222
+ });
223
+ return { code: apply(source, edits), notes };
224
+ }
225
+ //# sourceMappingURL=migrate-lists.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-lists.js","sourceRoot":"","sources":["../../src/commands/migrate-lists.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ type J = any;
2
+ /** One entry per mapping: which 0.7 → 0.8 difference it allows, and the rewrite (or version bump) behind it. */
3
+ export declare const MAPPINGS: {
4
+ readonly irVersion: 'irVersion 1 → 2 (the upgrade)';
5
+ readonly exportsEndpoints: 'exports.endpoints: [] (the upgrade)';
6
+ readonly endpointMode: "endpoint mode: 'json' for a schema output, 'response' for output: 'response' (the upgrade)";
7
+ readonly headFailed: 'head.redirects → head.failed { error: { redirect } } (rewrite head)';
8
+ readonly headFailed404: 'head.failed { error: { status: 404 } } for an unmapped error (rewrite head)';
9
+ readonly freshness: "user-scoped static / revalidate / swr → 'request' (rewrite freshness)";
10
+ readonly linkFolding: 'ui.link search fields null or equal to the route default fold away (rewrite link)';
11
+ readonly incPlus: 'inc → set %plus: ctx.x += v ≡ ctx.x = ctx.x + v (record-time normalisation, op → TS)';
12
+ readonly truthyCall: '%truthy(fnCall) → fnCall (record-time normalisation)';
13
+ readonly andOr: 'nested and / or flatten (record-time normalisation)';
14
+ readonly condGuard: 'a guard-position %cond → and / or / not (record-time normalisation)';
15
+ readonly formRef: "a string form attribute and its form's id → { formRef } (rewrite form)";
16
+ };
17
+ export type Mapping = keyof typeof MAPPINGS;
18
+ export type Counts = Partial<Record<Mapping, number>>;
19
+ /**
20
+ * The 0.7 IR in 0.8 terms (ADR 0043 Migration): what `hozu migrate 0.8` must produce for an unchanged app.
21
+ * Every mapping here is one rewrite's allowed difference; anything else is a behaviour change.
22
+ */
23
+ export declare function normalize07(input: J, into?: Counts): J;
24
+ /** JSON pointers where two IRs differ, capped per call. */
25
+ export declare function differences(a: J, b: J, limit?: number, path?: string, out?: string[]): string[];
26
+ export {};
27
+ //# sourceMappingURL=migrate-normalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-normalize.d.ts","sourceRoot":"","sources":["../../src/commands/migrate-normalize.ts"],"names":[],"mappings":"AAAA,KAAK,CAAC,GAAG,GAAG,CAAA;AAEZ,gHAAgH;AAChH,eAAO,MAAM,QAAQ;aACnB,SAAS,EAAE,+BAA+B;aAC1C,gBAAgB,EAAE,qCAAqC;aACvD,YAAY,EAAE,4FAA4F;aAC1G,UAAU,EAAE,qEAAqE;aACjF,aAAa,EAAE,6EAA6E;aAC5F,SAAS,EAAE,uEAAuE;aAClF,WAAW,EAAE,mFAAmF;aAChG,OAAO,EAAE,sFAAsF;aAC/F,UAAU,EAAE,sDAAsD;aAClE,KAAK,EAAE,qDAAqD;aAC5D,SAAS,EAAE,qEAAqE;aAChF,OAAO,EAAE,wEAAwE;CACzE,CAAA;AACV,MAAM,MAAM,OAAO,GAAG,MAAM,OAAO,QAAQ,CAAA;AAC3C,MAAM,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;AAiJrD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,CAyDtD;AAED,2DAA2D;AAC3D,wBAAgB,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,SAAK,EAAE,IAAI,SAAK,EAAE,GAAG,GAAE,MAAM,EAAO,GAAG,MAAM,EAAE,CAW3F"}
@@ -0,0 +1,252 @@
1
+ /** One entry per mapping: which 0.7 → 0.8 difference it allows, and the rewrite (or version bump) behind it. */
2
+ export const MAPPINGS = {
3
+ irVersion: 'irVersion 1 → 2 (the upgrade)',
4
+ exportsEndpoints: 'exports.endpoints: [] (the upgrade)',
5
+ endpointMode: "endpoint mode: 'json' for a schema output, 'response' for output: 'response' (the upgrade)",
6
+ headFailed: 'head.redirects → head.failed { error: { redirect } } (rewrite head)',
7
+ headFailed404: 'head.failed { error: { status: 404 } } for an unmapped error (rewrite head)',
8
+ freshness: "user-scoped static / revalidate / swr → 'request' (rewrite freshness)",
9
+ linkFolding: 'ui.link search fields null or equal to the route default fold away (rewrite link)',
10
+ incPlus: 'inc → set %plus: ctx.x += v ≡ ctx.x = ctx.x + v (record-time normalisation, op → TS)',
11
+ truthyCall: '%truthy(fnCall) → fnCall (record-time normalisation)',
12
+ andOr: 'nested and / or flatten (record-time normalisation)',
13
+ condGuard: 'a guard-position %cond → and / or / not (record-time normalisation)',
14
+ formRef: "a string form attribute and its form's id → { formRef } (rewrite form)",
15
+ };
16
+ const isObject = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
17
+ const clone = (v) => JSON.parse(JSON.stringify(v));
18
+ const equal = (a, b) => JSON.stringify(a) === JSON.stringify(b);
19
+ function defaultsOf(search) {
20
+ const out = {};
21
+ for (const [k, v] of Object.entries(isObject(search?.properties) ? search.properties : {}))
22
+ if (isObject(v) && 'default' in v)
23
+ out[k] = v.default;
24
+ return out;
25
+ }
26
+ const foldable = (v, fallback) => v === null || (v !== undefined && typeof v !== 'object' && v === fallback);
27
+ function foldSearch(search, defaults) {
28
+ if (isObject(search) && 'literal' in search) {
29
+ const l = search.literal;
30
+ if (!isObject(l))
31
+ return search;
32
+ const kept = Object.entries(l).filter(([k, v]) => !foldable(v, defaults[k]));
33
+ return kept.length ? { literal: Object.fromEntries(kept) } : { literal: null };
34
+ }
35
+ if (isObject(search) && isObject(search.object)) {
36
+ const kept = Object.entries(search.object).filter(([k, v]) => !(isObject(v) && 'literal' in v && foldable(v.literal, defaults[k])));
37
+ return kept.length ? { object: Object.fromEntries(kept) } : { literal: null };
38
+ }
39
+ return search;
40
+ }
41
+ /** A value used as a guard, as the 0.8 recorder's `test` lowers it. */
42
+ function asGuard(v) {
43
+ if (isObject(v) && isObject(v.test) && Object.keys(v).length === 1)
44
+ return v.test;
45
+ if (isObject(v) && typeof v.fn === 'string' && 'arg' in v)
46
+ return { op: 'fn', fn: v.fn, arg: v.arg };
47
+ return { op: 'fn', fn: '%truthy', arg: { object: { v } } };
48
+ }
49
+ let counts = {};
50
+ const count = (m, n = 1) => {
51
+ if (n > 0)
52
+ counts[m] = (counts[m] ?? 0) + n;
53
+ };
54
+ const both = (x, y, op) => ({
55
+ op,
56
+ args: [x, y].flatMap((g) => (g.op === op ? g.args : [g])),
57
+ });
58
+ /** The 0.8 `condGuard` over IR: a guard-position `%cond` → and / or / not. */
59
+ function condGuard(arg) {
60
+ const o = isObject(arg?.object) ? arg.object : null;
61
+ if (!o || !('c' in o) || !('a' in o) || !('b' in o))
62
+ return null;
63
+ const test = guard(asGuard(o.c));
64
+ const not = { op: 'not', arg: test };
65
+ const lit = (v, b) => isObject(v) && 'literal' in v && v.literal === b;
66
+ const tested = test.op === 'fn' && test.fn === '%truthy' ? test.arg?.object?.v : undefined;
67
+ const same = (x) => equal(x, o.c) || (tested !== undefined && equal(x, tested));
68
+ const g = (v) => guard(asGuard(v));
69
+ if (lit(o.a, true) && lit(o.b, false))
70
+ return test;
71
+ if (lit(o.a, false) && lit(o.b, true))
72
+ return not;
73
+ if (same(o.b) || lit(o.b, false))
74
+ return both(test, g(o.a), 'and');
75
+ if (same(o.a) || lit(o.a, true))
76
+ return both(test, g(o.b), 'or');
77
+ if (lit(o.a, false))
78
+ return both(not, g(o.b), 'and');
79
+ if (lit(o.b, true))
80
+ return both(not, g(o.a), 'or');
81
+ return both(both(test, g(o.a), 'and'), both(not, g(o.b), 'and'), 'or');
82
+ }
83
+ function guard(g) {
84
+ if (!isObject(g))
85
+ return g;
86
+ if (g.op === 'and' || g.op === 'or') {
87
+ const args = g.args.map(guard);
88
+ count('andOr', args.filter((a) => a.op === g.op).length);
89
+ return { ...g, args: args.flatMap((a) => (a.op === g.op ? a.args : [a])) };
90
+ }
91
+ if (g.op === 'not')
92
+ return { ...g, arg: guard(g.arg) };
93
+ const cond = (arg) => {
94
+ const out = condGuard(arg);
95
+ if (out)
96
+ count('condGuard');
97
+ return out ?? g;
98
+ };
99
+ if (g.op === 'fn' && g.fn === '%cond')
100
+ return cond(g.arg);
101
+ if (g.op === 'fn' && g.fn === '%truthy') {
102
+ const v = g.arg?.object?.v;
103
+ if (isObject(v) && typeof v.fn === 'string' && 'arg' in v && Object.keys(v).length === 2) {
104
+ if (v.fn === '%cond')
105
+ return cond(v.arg);
106
+ count('truthyCall');
107
+ return { op: 'fn', fn: v.fn, arg: v.arg };
108
+ }
109
+ }
110
+ return g;
111
+ }
112
+ const GUARD_KEYS = new Set(['guard', 'test']);
113
+ const isGuard = (v) => isObject(v) &&
114
+ typeof v.op === 'string' &&
115
+ ['and', 'or', 'not', 'fn', 'eq', 'neq', 'lt', 'lte', 'gt', 'gte'].includes(v.op);
116
+ function walk(v, visit, key = null) {
117
+ const next = visit(v, key);
118
+ if (Array.isArray(next))
119
+ return next.map((x) => walk(x, visit, key));
120
+ if (isObject(next)) {
121
+ const out = {};
122
+ for (const [k, x] of Object.entries(next))
123
+ out[k] = walk(x, visit, k);
124
+ return out;
125
+ }
126
+ return next;
127
+ }
128
+ function forms(feature) {
129
+ const owners = new Map();
130
+ const used = new Set();
131
+ const scan = (v, inEach) => {
132
+ if (Array.isArray(v))
133
+ return v.forEach((x) => scan(x, inEach));
134
+ if (!isObject(v))
135
+ return;
136
+ if (v.kind === 'el' && typeof v.attrs?.id?.literal === 'string' && v.tag === 'form')
137
+ owners.set(v.attrs.id.literal, [...(owners.get(v.attrs.id.literal) ?? []), { node: v, inEach }]);
138
+ if (v.kind === 'el' && typeof v.attrs?.form?.literal === 'string')
139
+ used.add(v.attrs.form.literal);
140
+ for (const [k, x] of Object.entries(v))
141
+ scan(x, inEach || (v.kind === 'each' && k === 'item'));
142
+ };
143
+ scan(feature.views, false);
144
+ const ids = new Map();
145
+ for (const [value, list] of owners)
146
+ if (used.has(value) && list.length === 1 && !list[0].inEach)
147
+ ids.set(value, list[0].node.id);
148
+ if (!ids.size)
149
+ return;
150
+ count('formRef', ids.size);
151
+ const rewrite = (v) => {
152
+ if (Array.isArray(v))
153
+ return v.forEach(rewrite);
154
+ if (!isObject(v))
155
+ return;
156
+ if (v.kind === 'el') {
157
+ const id = v.tag === 'form' ? ids.get(v.attrs?.id?.literal) : undefined;
158
+ if (id && id === v.id) {
159
+ v.attrs.id = { formRef: id };
160
+ v.ref = { formRef: id };
161
+ }
162
+ const to = ids.get(v.attrs?.form?.literal);
163
+ if (to)
164
+ v.attrs.form = { formRef: to };
165
+ }
166
+ for (const x of Object.values(v))
167
+ rewrite(x);
168
+ };
169
+ rewrite(feature.views);
170
+ }
171
+ /**
172
+ * The 0.7 IR in 0.8 terms (ADR 0043 Migration): what `hozu migrate 0.8` must produce for an unchanged app.
173
+ * Every mapping here is one rewrite's allowed difference; anything else is a behaviour change.
174
+ */
175
+ export function normalize07(input, into) {
176
+ counts = into ?? {};
177
+ const ir = clone(input);
178
+ count('irVersion', ir.irVersion === 2 ? 0 : 1);
179
+ ir.irVersion = 2;
180
+ const routes = ir.routes ?? {};
181
+ for (const f of Object.values(ir.features ?? {})) {
182
+ count('exportsEndpoints', f.exports?.endpoints ? 0 : 1);
183
+ f.exports = { ...f.exports, endpoints: f.exports?.endpoints ?? [] };
184
+ for (const e of Object.values(f.endpoints ?? {}))
185
+ if (!e.mode) {
186
+ e.mode = e.output === null ? 'response' : 'json';
187
+ count('endpointMode');
188
+ }
189
+ for (const q of Object.values(f.queries ?? {}))
190
+ if (q.scope === 'user' && ['static', 'revalidate', 'swr'].includes(q.freshness?.kind)) {
191
+ q.freshness = { kind: 'request' };
192
+ count('freshness');
193
+ }
194
+ forms(f);
195
+ }
196
+ for (const page of Object.values(ir.pages ?? {})) {
197
+ const head = page.head;
198
+ if (!head || !('redirects' in head) || 'failed' in head)
199
+ continue;
200
+ const failed = {};
201
+ for (const [k, v] of Object.entries(head.redirects ?? {})) {
202
+ failed[k] = { redirect: v };
203
+ count('headFailed');
204
+ }
205
+ const ref = typeof head.query?.ref === 'string' ? head.query.ref.split('.') : null;
206
+ const errors = ref ? Object.keys(ir.features?.[ref[0]]?.queries?.[ref[1]]?.errors ?? {}) : [];
207
+ for (const e of errors)
208
+ if (!(e in failed)) {
209
+ failed[e] = { status: 404 };
210
+ count('headFailed404');
211
+ }
212
+ delete head.redirects;
213
+ head.failed = failed;
214
+ }
215
+ return walk(ir, (v, key) => {
216
+ if (!isObject(v))
217
+ return v;
218
+ if (typeof v.link === 'string' && 'search' in v && routes[v.link]) {
219
+ const search = foldSearch(v.search, defaultsOf(routes[v.link].search));
220
+ count('linkFolding', equal(search, v.search) ? 0 : 1);
221
+ return { ...v, search };
222
+ }
223
+ if (v.op === 'inc' && Array.isArray(v.path) && 'value' in v) {
224
+ count('incPlus');
225
+ return {
226
+ op: 'set',
227
+ path: v.path,
228
+ value: { fn: '%plus', arg: { object: { a: { ref: 'context', path: v.path }, b: v.value } } },
229
+ };
230
+ }
231
+ if (key !== null && GUARD_KEYS.has(key) && isGuard(v))
232
+ return guard(v);
233
+ return v;
234
+ });
235
+ }
236
+ /** JSON pointers where two IRs differ, capped per call. */
237
+ export function differences(a, b, limit = 50, path = '', out = []) {
238
+ if (out.length >= limit || equal(a, b))
239
+ return out;
240
+ if (!isObject(a) || !isObject(b)) {
241
+ if (Array.isArray(a) && Array.isArray(b) && a.length === b.length)
242
+ for (let i = 0; i < a.length; i++)
243
+ differences(a[i], b[i], limit, `${path}/${i}`, out);
244
+ else
245
+ out.push(path || '/');
246
+ return out;
247
+ }
248
+ for (const k of [...new Set([...Object.keys(a), ...Object.keys(b)])].sort())
249
+ differences(a[k], b[k], limit, `${path}/${k.replaceAll('~', '~0').replaceAll('/', '~1')}`, out);
250
+ return out;
251
+ }
252
+ //# sourceMappingURL=migrate-normalize.js.map