@hozu/validator 0.1.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 (135) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +15 -0
  3. package/dist/context.d.ts +13 -0
  4. package/dist/context.d.ts.map +1 -0
  5. package/dist/context.js +27 -0
  6. package/dist/context.js.map +1 -0
  7. package/dist/contracts/lock.d.ts +19 -0
  8. package/dist/contracts/lock.d.ts.map +1 -0
  9. package/dist/contracts/lock.js +61 -0
  10. package/dist/contracts/lock.js.map +1 -0
  11. package/dist/contracts/run.d.ts +14 -0
  12. package/dist/contracts/run.d.ts.map +1 -0
  13. package/dist/contracts/run.js +130 -0
  14. package/dist/contracts/run.js.map +1 -0
  15. package/dist/contracts/skeleton.d.ts +4 -0
  16. package/dist/contracts/skeleton.d.ts.map +1 -0
  17. package/dist/contracts/skeleton.js +108 -0
  18. package/dist/contracts/skeleton.js.map +1 -0
  19. package/dist/contracts/verify.d.ts +5 -0
  20. package/dist/contracts/verify.d.ts.map +1 -0
  21. package/dist/contracts/verify.js +58 -0
  22. package/dist/contracts/verify.js.map +1 -0
  23. package/dist/env.d.ts +40 -0
  24. package/dist/env.d.ts.map +1 -0
  25. package/dist/env.js +79 -0
  26. package/dist/env.js.map +1 -0
  27. package/dist/impact.d.ts +27 -0
  28. package/dist/impact.d.ts.map +1 -0
  29. package/dist/impact.js +154 -0
  30. package/dist/impact.js.map +1 -0
  31. package/dist/index.d.ts +22 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +71 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/resolve.d.ts +13 -0
  36. package/dist/resolve.d.ts.map +1 -0
  37. package/dist/resolve.js +58 -0
  38. package/dist/resolve.js.map +1 -0
  39. package/dist/rules/classes.d.ts +3 -0
  40. package/dist/rules/classes.d.ts.map +1 -0
  41. package/dist/rules/classes.js +60 -0
  42. package/dist/rules/classes.js.map +1 -0
  43. package/dist/rules/data.d.ts +4 -0
  44. package/dist/rules/data.d.ts.map +1 -0
  45. package/dist/rules/data.js +34 -0
  46. package/dist/rules/data.js.map +1 -0
  47. package/dist/rules/dom.d.ts +3 -0
  48. package/dist/rules/dom.d.ts.map +1 -0
  49. package/dist/rules/dom.js +104 -0
  50. package/dist/rules/dom.js.map +1 -0
  51. package/dist/rules/errors.d.ts +3 -0
  52. package/dist/rules/errors.d.ts.map +1 -0
  53. package/dist/rules/errors.js +97 -0
  54. package/dist/rules/errors.js.map +1 -0
  55. package/dist/rules/events.d.ts +5 -0
  56. package/dist/rules/events.d.ts.map +1 -0
  57. package/dist/rules/events.js +87 -0
  58. package/dist/rules/events.js.map +1 -0
  59. package/dist/rules/forms.d.ts +3 -0
  60. package/dist/rules/forms.d.ts.map +1 -0
  61. package/dist/rules/forms.js +19 -0
  62. package/dist/rules/forms.js.map +1 -0
  63. package/dist/rules/html.d.ts +3 -0
  64. package/dist/rules/html.d.ts.map +1 -0
  65. package/dist/rules/html.js +55 -0
  66. package/dist/rules/html.js.map +1 -0
  67. package/dist/rules/http.d.ts +3 -0
  68. package/dist/rules/http.d.ts.map +1 -0
  69. package/dist/rules/http.js +71 -0
  70. package/dist/rules/http.js.map +1 -0
  71. package/dist/rules/i18n.d.ts +3 -0
  72. package/dist/rules/i18n.d.ts.map +1 -0
  73. package/dist/rules/i18n.js +201 -0
  74. package/dist/rules/i18n.js.map +1 -0
  75. package/dist/rules/images.d.ts +3 -0
  76. package/dist/rules/images.d.ts.map +1 -0
  77. package/dist/rules/images.js +32 -0
  78. package/dist/rules/images.js.map +1 -0
  79. package/dist/rules/links.d.ts +3 -0
  80. package/dist/rules/links.d.ts.map +1 -0
  81. package/dist/rules/links.js +60 -0
  82. package/dist/rules/links.js.map +1 -0
  83. package/dist/rules/literals.d.ts +3 -0
  84. package/dist/rules/literals.d.ts.map +1 -0
  85. package/dist/rules/literals.js +147 -0
  86. package/dist/rules/literals.js.map +1 -0
  87. package/dist/rules/paths.d.ts +3 -0
  88. package/dist/rules/paths.d.ts.map +1 -0
  89. package/dist/rules/paths.js +177 -0
  90. package/dist/rules/paths.js.map +1 -0
  91. package/dist/rules/pwa.d.ts +3 -0
  92. package/dist/rules/pwa.d.ts.map +1 -0
  93. package/dist/rules/pwa.js +28 -0
  94. package/dist/rules/pwa.js.map +1 -0
  95. package/dist/rules/refs.d.ts +5 -0
  96. package/dist/rules/refs.d.ts.map +1 -0
  97. package/dist/rules/refs.js +128 -0
  98. package/dist/rules/refs.js.map +1 -0
  99. package/dist/rules/rendering.d.ts +3 -0
  100. package/dist/rules/rendering.d.ts.map +1 -0
  101. package/dist/rules/rendering.js +37 -0
  102. package/dist/rules/rendering.js.map +1 -0
  103. package/dist/rules/routes.d.ts +4 -0
  104. package/dist/rules/routes.d.ts.map +1 -0
  105. package/dist/rules/routes.js +108 -0
  106. package/dist/rules/routes.js.map +1 -0
  107. package/dist/rules/states.d.ts +6 -0
  108. package/dist/rules/states.d.ts.map +1 -0
  109. package/dist/rules/states.js +167 -0
  110. package/dist/rules/states.js.map +1 -0
  111. package/dist/rules/text.d.ts +3 -0
  112. package/dist/rules/text.d.ts.map +1 -0
  113. package/dist/rules/text.js +148 -0
  114. package/dist/rules/text.js.map +1 -0
  115. package/dist/rules/widgets.d.ts +3 -0
  116. package/dist/rules/widgets.d.ts.map +1 -0
  117. package/dist/rules/widgets.js +33 -0
  118. package/dist/rules/widgets.js.map +1 -0
  119. package/dist/schema.d.ts +19 -0
  120. package/dist/schema.d.ts.map +1 -0
  121. package/dist/schema.js +142 -0
  122. package/dist/schema.js.map +1 -0
  123. package/dist/sites.d.ts +15 -0
  124. package/dist/sites.d.ts.map +1 -0
  125. package/dist/sites.js +151 -0
  126. package/dist/sites.js.map +1 -0
  127. package/dist/suggest.d.ts +4 -0
  128. package/dist/suggest.d.ts.map +1 -0
  129. package/dist/suggest.js +30 -0
  130. package/dist/suggest.js.map +1 -0
  131. package/dist/walk.d.ts +37 -0
  132. package/dist/walk.d.ts.map +1 -0
  133. package/dist/walk.js +138 -0
  134. package/dist/walk.js.map +1 -0
  135. package/package.json +46 -0
@@ -0,0 +1,177 @@
1
+ import { at, resolveAt, } from '@hozu/core/ir';
2
+ import { contextEnv, schemaIn, triggerEnv, valueSchema } from '../env.js';
3
+ import { itemsOf, resolvePath } from '../schema.js';
4
+ import { closest, didYouMean } from '../suggest.js';
5
+ import { featurePointer, transitionsOf, walkView } from '../walk.js';
6
+ function checkPath(ctx, env, base, path, pointer, label) {
7
+ const r = resolvePath(base, path);
8
+ if (r.ok)
9
+ return;
10
+ const guess = closest(r.segment, r.candidates);
11
+ ctx.report('HZ008', env.feature.id, at(pointer, 'path', r.index), `"${r.segment}" does not exist on ${label}${r.index ? `.${path.slice(0, r.index).join('.')}` : ''}.${didYouMean(guess)}`, r.candidates.length ? `Available: ${r.candidates.join(', ')}.` : 'This value has no properties.', {
12
+ summary: guess ? `Use "${guess}"` : 'Reference an existing property',
13
+ snippet: null,
14
+ patch: guess ? [{ op: 'replace', path: resolveAt(at(pointer, 'path', r.index)), value: guess }] : null,
15
+ });
16
+ }
17
+ function checkValue(ctx, env, value, pointer) {
18
+ if ('object' in value) {
19
+ for (const [k, v] of Object.entries(value.object))
20
+ checkValue(ctx, env, v, at(pointer, 'object', k));
21
+ return;
22
+ }
23
+ if ('fn' in value) {
24
+ checkValue(ctx, env, value.arg, at(pointer, 'arg'));
25
+ return;
26
+ }
27
+ if ('test' in value) {
28
+ checkGuard(ctx, env, value.test, at(pointer, 'test'));
29
+ return;
30
+ }
31
+ if ('link' in value) {
32
+ checkValue(ctx, env, value.params, at(pointer, 'params'));
33
+ checkValue(ctx, env, value.search, at(pointer, 'search'));
34
+ return;
35
+ }
36
+ if (!('ref' in value) || value.ref === 'dom')
37
+ return;
38
+ if (value.ref === 'binding') {
39
+ if (value.depth < env.bindings.length)
40
+ checkPath(ctx, env, env.bindings[value.depth], value.path, pointer, 'the binding');
41
+ else
42
+ ctx.report('HZ008', env.feature.id, at(pointer, 'depth'), `Binding ${value.depth} is out of scope`, `Only ${env.bindings.length} each/query bindings enclose this value.`);
43
+ return;
44
+ }
45
+ if (Object.hasOwn(env.sources, value.ref)) {
46
+ checkPath(ctx, env, env.sources[value.ref], value.path, pointer, value.ref);
47
+ return;
48
+ }
49
+ const available = Object.keys(env.sources);
50
+ const alternative = available.find((s) => resolvePath(env.sources[s] ?? null, value.path).ok && env.sources[s] !== undefined);
51
+ ctx.report('HZ008', env.feature.id, at(pointer, 'ref'), `"${value.ref}" is not available here`, `Available sources: ${available.join(', ') || 'none'}.`, {
52
+ summary: alternative ? `Read it from ${alternative}` : 'Use an available source',
53
+ snippet: null,
54
+ patch: alternative
55
+ ? [{ op: 'replace', path: resolveAt(at(pointer, 'ref')), value: alternative }]
56
+ : null,
57
+ });
58
+ }
59
+ function checkGuard(ctx, env, guard, pointer) {
60
+ switch (guard.op) {
61
+ case 'and':
62
+ case 'or':
63
+ guard.args.forEach((g, i) => checkGuard(ctx, env, g, at(pointer, 'args', i)));
64
+ return;
65
+ case 'not':
66
+ checkGuard(ctx, env, guard.arg, at(pointer, 'arg'));
67
+ return;
68
+ case 'fn':
69
+ checkValue(ctx, env, guard.arg, at(pointer, 'arg'));
70
+ return;
71
+ default:
72
+ checkValue(ctx, env, guard.left, at(pointer, 'left'));
73
+ checkValue(ctx, env, guard.right, at(pointer, 'right'));
74
+ }
75
+ }
76
+ function checkAssign(ctx, env, op, pointer) {
77
+ const context = env.sources.context ?? null;
78
+ checkPath(ctx, env, context, op.path, pointer, 'context');
79
+ checkValue(ctx, env, op.value, at(pointer, 'value'));
80
+ if (op.op !== 'removeWhere')
81
+ return;
82
+ const target = resolvePath(context, op.path);
83
+ const item = target.ok ? itemsOf(target.schema) : null;
84
+ const r = resolvePath(item, [op.key]);
85
+ if (!r.ok) {
86
+ const guess = closest(op.key, r.candidates);
87
+ ctx.report('HZ008', env.feature.id, at(pointer, 'key'), `Items of ${op.path.join('.')} have no "${op.key}".${didYouMean(guess)}`, `Available: ${r.candidates.join(', ')}.`, {
88
+ summary: guess ? `Use "${guess}"` : 'Use an existing key',
89
+ snippet: null,
90
+ patch: guess ? [{ op: 'replace', path: resolveAt(at(pointer, 'key')), value: guess }] : null,
91
+ });
92
+ }
93
+ }
94
+ export function paths(ctx) {
95
+ const { ir } = ctx;
96
+ for (const f of Object.values(ir.features)) {
97
+ for (const [sym, q] of Object.entries(f.queries)) {
98
+ const env = { feature: f, sources: { input: schemaIn(f, q.input) }, bindings: [] };
99
+ q.tags.forEach((t, i) => t.param && checkValue(ctx, env, t.param, featurePointer(f.id, 'queries', sym, 'tags', i, 'param')));
100
+ }
101
+ for (const [sym, m] of Object.entries(f.mutations)) {
102
+ const env = { feature: f, sources: { input: schemaIn(f, m.input) }, bindings: [] };
103
+ m.invalidates.forEach((t, i) => t.param &&
104
+ checkValue(ctx, env, t.param, featurePointer(f.id, 'mutations', sym, 'invalidates', i, 'param')));
105
+ }
106
+ if (f.machine) {
107
+ const base = contextEnv(f);
108
+ for (const [state, s] of Object.entries(f.machine.states))
109
+ if (s.invoke)
110
+ checkValue(ctx, base, s.invoke.input, featurePointer(f.id, 'machine', 'states', state, 'invoke', 'input'));
111
+ for (const site of transitionsOf(f)) {
112
+ const env = triggerEnv(ctx, f, site);
113
+ const t = site.transition;
114
+ if (t.guard)
115
+ checkGuard(ctx, env, t.guard, site.at('guard'));
116
+ t.assign.forEach((a, i) => checkAssign(ctx, env, a, site.at('assign', i)));
117
+ if (t.navigate)
118
+ checkValue(ctx, env, t.navigate, site.at('navigate'));
119
+ }
120
+ }
121
+ for (const [vid, view] of Object.entries(f.views))
122
+ walkView(ir, f, vid, view, ({ node, pointer, env }) => {
123
+ switch (node.kind) {
124
+ case 'widget':
125
+ checkValue(ctx, env, node.props, at(pointer, 'props'));
126
+ for (const key of ['toggle', 'vars'])
127
+ for (const [name, v] of Object.entries(node[key]))
128
+ checkValue(ctx, env, v, at(pointer, key, name));
129
+ for (const [event, send] of Object.entries(node.on))
130
+ checkValue(ctx, env, send.payload, at(pointer, 'on', event, 'payload'));
131
+ return;
132
+ case 'el':
133
+ for (const key of ['attrs', 'toggle', 'vars'])
134
+ for (const [name, v] of Object.entries(node[key]))
135
+ checkValue(ctx, env, v, at(pointer, key, name));
136
+ for (const [dom, send] of Object.entries(node.on))
137
+ checkValue(ctx, env, send.payload, at(pointer, 'on', dom, 'payload'));
138
+ return;
139
+ case 'text':
140
+ case 'html':
141
+ checkValue(ctx, env, node.value, at(pointer, 'value'));
142
+ return;
143
+ case 'if':
144
+ checkGuard(ctx, env, node.test, at(pointer, 'test'));
145
+ return;
146
+ case 'global':
147
+ for (const [event, send] of Object.entries(node.on))
148
+ checkValue(ctx, env, send.payload, at(pointer, 'on', event, 'payload'));
149
+ return;
150
+ case 'each': {
151
+ checkValue(ctx, env, node.source, at(pointer, 'source'));
152
+ if (node.key === null)
153
+ return;
154
+ const item = itemsOf(valueSchema(ir, env, node.source));
155
+ const r = resolvePath(item, [node.key]);
156
+ if (!r.ok) {
157
+ const guess = closest(node.key, r.candidates);
158
+ ctx.report('HZ008', f.id, at(pointer, 'key'), `each key "${node.key}" is not a property of the items.${didYouMean(guess)}`, `Available: ${r.candidates.join(', ')}.`, {
159
+ summary: guess ? `Use "${guess}"` : 'Key by an existing property',
160
+ snippet: null,
161
+ patch: guess
162
+ ? [{ op: 'replace', path: resolveAt(at(pointer, 'key')), value: guess }]
163
+ : null,
164
+ });
165
+ }
166
+ return;
167
+ }
168
+ case 'query':
169
+ checkValue(ctx, env, node.input, at(pointer, 'input'));
170
+ return;
171
+ default:
172
+ return;
173
+ }
174
+ });
175
+ }
176
+ }
177
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/rules/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,EAAE,EAIF,SAAS,GAEV,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAE,UAAU,EAAY,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACnF,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAEpE,SAAS,SAAS,CAChB,GAAQ,EACR,GAAQ,EACR,IAAuB,EACvB,IAAuB,EACvB,OAAW,EACX,KAAa;IAEb,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACjC,IAAI,CAAC,CAAC,EAAE;QAAE,OAAM;IAChB,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,UAAU,CAAC,CAAA;IAC9C,GAAG,CAAC,MAAM,CACR,OAAO,EACP,GAAG,CAAC,OAAO,CAAC,EAAE,EACd,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,EAC5B,IAAI,CAAC,CAAC,OAAO,uBAAuB,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,EACxH,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,+BAA+B,EAChG;QACE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,gCAAgC;QACpE,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;KACvG,CACF,CAAA;AACH,CAAC;AAED,SAAS,UAAU,CAAC,GAAQ,EAAE,GAAQ,EAAE,KAAgB,EAAE,OAAW;IACnE,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;QACtB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAA;QACpG,OAAM;IACR,CAAC;IACD,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;QAClB,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;QACnD,OAAM;IACR,CAAC;IACD,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QACpB,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;QACrD,OAAM;IACR,CAAC;IACD,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QACpB,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAA;QACzD,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAA;QACzD,OAAM;IACR,CAAC;IACD,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK;QAAE,OAAM;IACpD,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM;YACnC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAE,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,CAAA;;YAEnF,GAAG,CAAC,MAAM,CACR,OAAO,EACP,GAAG,CAAC,OAAO,CAAC,EAAE,EACd,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EACpB,WAAW,KAAK,CAAC,KAAK,kBAAkB,EACxC,QAAQ,GAAG,CAAC,QAAQ,CAAC,MAAM,0CAA0C,CACtE,CAAA;QACH,OAAM;IACR,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1C,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAE,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;QAC5E,OAAM;IACR,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAgB,CAAA;IACzD,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAChC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,SAAS,CAC1F,CAAA;IACD,GAAG,CAAC,MAAM,CACR,OAAO,EACP,GAAG,CAAC,OAAO,CAAC,EAAE,EACd,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAClB,IAAI,KAAK,CAAC,GAAG,yBAAyB,EACtC,sBAAsB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,EACvD;QACE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,gBAAgB,WAAW,EAAE,CAAC,CAAC,CAAC,yBAAyB;QAChF,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,WAAW;YAChB,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;YAC9E,CAAC,CAAC,IAAI;KACT,CACF,CAAA;AACH,CAAC;AAED,SAAS,UAAU,CAAC,GAAQ,EAAE,GAAQ,EAAE,KAAgB,EAAE,OAAW;IACnE,QAAQ,KAAK,CAAC,EAAE,EAAE,CAAC;QACjB,KAAK,KAAK,CAAC;QACX,KAAK,IAAI;YACP,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YAC7E,OAAM;QACR,KAAK,KAAK;YACR,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;YACnD,OAAM;QACR,KAAK,IAAI;YACP,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;YACnD,OAAM;QACR;YACE,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;YACrD,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;IAC3D,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,GAAQ,EAAE,GAAQ,EAAE,EAAY,EAAE,OAAW;IAChE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAA;IAC3C,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;IACzD,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;IACpD,IAAI,EAAE,CAAC,EAAE,KAAK,aAAa;QAAE,OAAM;IACnC,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACtD,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;IACrC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACV,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,CAAA;QAC3C,GAAG,CAAC,MAAM,CACR,OAAO,EACP,GAAG,CAAC,OAAO,CAAC,EAAE,EACd,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAClB,YAAY,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,GAAG,KAAK,UAAU,CAAC,KAAK,CAAC,EAAE,EACxE,cAAc,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EACxC;YACE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,qBAAqB;YACzD,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;SAC7F,CACF,CAAA;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,GAAQ;IAC5B,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAA;IAClB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YACjD,MAAM,GAAG,GAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;YACvF,CAAC,CAAC,IAAI,CAAC,OAAO,CACZ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,CAAC,CAAC,KAAK,IAAI,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CACrG,CAAA;QACH,CAAC;QACD,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;YACnD,MAAM,GAAG,GAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;YACvF,CAAC,CAAC,WAAW,CAAC,OAAO,CACnB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,CAAC,CAAC,KAAK;gBACP,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CACnG,CAAA;QACH,CAAC;QACD,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;YAC1B,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;gBACvD,IAAI,CAAC,CAAC,MAAM;oBACV,UAAU,CACR,GAAG,EACH,IAAI,EACJ,CAAC,CAAC,MAAM,CAAC,KAAK,EACd,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CACpE,CAAA;YACL,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpC,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;gBACpC,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAA;gBACzB,IAAI,CAAC,CAAC,KAAK;oBAAE,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;gBAC5D,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC1E,IAAI,CAAC,CAAC,QAAQ;oBAAE,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA;YACvE,CAAC;QACH,CAAC;QACD,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;YAC/C,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE;gBACpD,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;oBAClB,KAAK,QAAQ;wBACX,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;wBACtD,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAU;4BAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gCAC/C,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAA;wBACnD,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;4BACjD,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAA;wBACzE,OAAM;oBACR,KAAK,IAAI;wBACP,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAU;4BACpD,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gCAC/C,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAA;wBACnD,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;4BAC/C,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAA;wBACvE,OAAM;oBACR,KAAK,MAAM,CAAC;oBACZ,KAAK,MAAM;wBACT,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;wBACtD,OAAM;oBACR,KAAK,IAAI;wBACP,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;wBACpD,OAAM;oBACR,KAAK,QAAQ;wBACX,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;4BACjD,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAA;wBACzE,OAAM;oBACR,KAAK,MAAM,EAAE,CAAC;wBACZ,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAA;wBACxD,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI;4BAAE,OAAM;wBAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;wBACvD,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;wBACvC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;4BACV,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,CAAA;4BAC7C,GAAG,CAAC,MAAM,CACR,OAAO,EACP,CAAC,CAAC,EAAE,EACJ,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAClB,aAAa,IAAI,CAAC,GAAG,oCAAoC,UAAU,CAAC,KAAK,CAAC,EAAE,EAC5E,cAAc,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EACxC;gCACE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,6BAA6B;gCACjE,OAAO,EAAE,IAAI;gCACb,KAAK,EAAE,KAAK;oCACV,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;oCACxE,CAAC,CAAC,IAAI;6BACT,CACF,CAAA;wBACH,CAAC;wBACD,OAAM;oBACR,CAAC;oBACD,KAAK,OAAO;wBACV,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;wBACtD,OAAM;oBACR;wBACE,OAAM;gBACV,CAAC;YACH,CAAC,CAAC,CAAA;IACN,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Ctx } from '../context.ts';
2
+ export declare function offlinePage(ctx: Ctx): void;
3
+ //# sourceMappingURL=pwa.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pwa.d.ts","sourceRoot":"","sources":["../../src/rules/pwa.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA;AAExC,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,QAsCnC"}
@@ -0,0 +1,28 @@
1
+ import { planRoute } from '@hozu/compiler';
2
+ import { join } from '@hozu/core/ir';
3
+ export function offlinePage(ctx) {
4
+ const offline = ctx.ir.site?.offline;
5
+ if (!offline)
6
+ return;
7
+ const pointer = join('', 'site', 'offline');
8
+ const fix = {
9
+ summary: 'Use a static page without params, or remove site.offline',
10
+ snippet: null,
11
+ patch: [{ op: 'replace', path: pointer, value: null }],
12
+ };
13
+ const route = ctx.ir.routes[offline];
14
+ if (!route) {
15
+ ctx.report('HZ007', null, pointer, 'site.offline is not a registered route', 'Register it in project({ routes }).', fix);
16
+ return;
17
+ }
18
+ const why = route.params !== null
19
+ ? `Offline route "${offline}" has params`
20
+ : !ctx.ir.pages[offline]
21
+ ? `Offline route "${offline}" has no page`
22
+ : !planRoute(ctx.ir, offline).plan.cacheable
23
+ ? `Offline page "${offline}" renders per-request data`
24
+ : null;
25
+ if (why)
26
+ ctx.report('HZ043', null, pointer, why, 'The service worker stores the offline page once, so it must be one static page.', fix);
27
+ }
28
+ //# sourceMappingURL=pwa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pwa.js","sourceRoot":"","sources":["../../src/rules/pwa.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAGpC,MAAM,UAAU,WAAW,CAAC,GAAQ;IAClC,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAA;IACpC,IAAI,CAAC,OAAO;QAAE,OAAM;IACpB,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;IAC3C,MAAM,GAAG,GAAG;QACV,OAAO,EAAE,0DAA0D;QACnE,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,SAAkB,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;KAChE,CAAA;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACpC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,GAAG,CAAC,MAAM,CACR,OAAO,EACP,IAAI,EACJ,OAAO,EACP,wCAAwC,EACxC,qCAAqC,EACrC,GAAG,CACJ,CAAA;QACD,OAAM;IACR,CAAC;IACD,MAAM,GAAG,GACP,KAAK,CAAC,MAAM,KAAK,IAAI;QACnB,CAAC,CAAC,kBAAkB,OAAO,cAAc;QACzC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;YACtB,CAAC,CAAC,kBAAkB,OAAO,eAAe;YAC1C,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS;gBAC1C,CAAC,CAAC,iBAAiB,OAAO,4BAA4B;gBACtD,CAAC,CAAC,IAAI,CAAA;IACd,IAAI,GAAG;QACL,GAAG,CAAC,MAAM,CACR,OAAO,EACP,IAAI,EACJ,OAAO,EACP,GAAG,EACH,iFAAiF,EACjF,GAAG,CACJ,CAAA;AACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Ctx } from '../context.ts';
2
+ export declare function references(ctx: Ctx): void;
3
+ export declare function featureLinks(ctx: Ctx): void;
4
+ export declare function routes(ctx: Ctx): void;
5
+ //# sourceMappingURL=refs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../../src/rules/refs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA;AAsBxC,wBAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,QA0FlC;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,QAoCpC;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,GAAG,QAsB9B"}
@@ -0,0 +1,128 @@
1
+ import { at, parsePointer, resolveAt } from '@hozu/core/ir';
2
+ import { candidatesFor, registriesOf, resolveRef, splitRef } from '../resolve.js';
3
+ import { refSites } from '../sites.js';
4
+ import { closest, didYouMean } from '../suggest.js';
5
+ import { featurePointer, transitionsOf } from '../walk.js';
6
+ const effectKinds = new Set(['query', 'mutation', 'effect']);
7
+ const parent = (p) => {
8
+ const s = resolveAt(p);
9
+ return s.slice(0, s.lastIndexOf('/'));
10
+ };
11
+ function renameKey(pointer, value, ctx) {
12
+ let node = ctx.ir;
13
+ for (const token of parsePointer(resolveAt(pointer)))
14
+ node = node[token];
15
+ return [
16
+ { op: 'add', path: resolveAt(at(parent(pointer), value)), value: node },
17
+ { op: 'remove', path: resolveAt(pointer) },
18
+ ];
19
+ }
20
+ export function references(ctx) {
21
+ for (const site of refSites(ctx.ir)) {
22
+ const { feature: f, pointer, ref, kind } = site;
23
+ if (ref.startsWith('?') || (kind === 'fn' && ref.startsWith('#')))
24
+ continue;
25
+ const resolved = resolveRef(ctx.ir, ref, kind);
26
+ if (!resolved) {
27
+ const guess = closest(ref, candidatesFor(ctx.ir, f, kind));
28
+ const effect = effectKinds.has(kind);
29
+ const fallback = effect && resolveAt(pointer).endsWith('/invoke/effect')
30
+ ? [{ op: 'replace', path: resolveAt(parent(pointer)), value: null }]
31
+ : null;
32
+ ctx.report(effect ? 'HZ003' : 'HZ007', f.id, pointer, `Unknown ${kind} "${ref}".${didYouMean(guess)}`, effect
33
+ ? 'Effects must be declared as a query or mutation in a feature (its own, or an imported feature that exports it).'
34
+ : `No ${registriesOf[kind].join(' or ')} entry named "${splitRef(ref)[1]}" exists in "${splitRef(ref)[0]}".`, {
35
+ summary: guess ? `Use "${guess}"` : `Declare it under ${registriesOf[kind].join(' or ')}`,
36
+ snippet: null,
37
+ patch: guess
38
+ ? site.key
39
+ ? renameKey(pointer, guess, ctx)
40
+ : [{ op: 'replace', path: resolveAt(pointer), value: guess }]
41
+ : fallback,
42
+ });
43
+ continue;
44
+ }
45
+ const owner = resolved.feature;
46
+ if (owner.id === f.id)
47
+ continue;
48
+ if (site.key) {
49
+ ctx.report('HZ006', f.id, pointer, `Machine of "${f.id}" handles "${ref}", an event owned by "${owner.id}"`, 'Events are delivered to the machine of the feature that declares them; this handler can never run.', {
50
+ summary: 'Remove the handler; react through the owning feature instead',
51
+ snippet: null,
52
+ patch: [{ op: 'remove', path: resolveAt(pointer) }],
53
+ });
54
+ continue;
55
+ }
56
+ if (kind === 'widget') {
57
+ ctx.report('HZ006', f.id, pointer, `"${f.id}" uses widget ${ref} owned by "${owner.id}"`, 'Widgets are private to their feature; share them through an exported view.');
58
+ continue;
59
+ }
60
+ const registry = resolved.registry;
61
+ const imported = f.imports.includes(owner.id);
62
+ const exported = owner.exports[registry].includes(resolved.symbol);
63
+ if (imported && exported)
64
+ continue;
65
+ const patch = [];
66
+ if (!imported)
67
+ patch.push({ op: 'add', path: resolveAt(featurePointer(f.id, 'imports', '-')), value: owner.id });
68
+ if (!exported)
69
+ patch.push({
70
+ op: 'add',
71
+ path: resolveAt(featurePointer(owner.id, 'exports', registry, '-')),
72
+ value: resolved.symbol,
73
+ });
74
+ ctx.report('HZ006', f.id, pointer, `"${f.id}" uses ${ref}${exported ? '' : `, which "${owner.id}" does not export`}${imported ? '' : `, without importing "${owner.id}"`}`, 'Features may only use declarations that another feature exports, and only after importing that feature.', {
75
+ summary: [
76
+ !imported && `add ${owner.id} to imports`,
77
+ !exported && `export ${resolved.symbol} from ${owner.id}`,
78
+ ]
79
+ .filter(Boolean)
80
+ .join(' and '),
81
+ snippet: !imported ? `imports: [${owner.id}]` : `exports: { ${registry}: [${resolved.symbol}] }`,
82
+ patch,
83
+ });
84
+ }
85
+ }
86
+ export function featureLinks(ctx) {
87
+ for (const f of Object.values(ctx.ir.features)) {
88
+ f.imports.forEach((id, i) => {
89
+ if (id === '?' || Object.hasOwn(ctx.ir.features, id))
90
+ return;
91
+ const p = featurePointer(f.id, 'imports', i);
92
+ ctx.report('HZ007', f.id, p, `Imported feature "${id}" does not exist`, 'Imports must name features of this project.', {
93
+ summary: 'Remove the import',
94
+ snippet: null,
95
+ patch: [{ op: 'remove', path: resolveAt(p) }],
96
+ });
97
+ });
98
+ for (const [registry, list] of Object.entries(f.exports))
99
+ list.forEach((symbol, i) => {
100
+ if (Object.hasOwn(f[registry], symbol))
101
+ return;
102
+ const p = featurePointer(f.id, 'exports', registry, i);
103
+ ctx.report('HZ007', f.id, p, `Exported ${registry} entry "${symbol}" does not exist`, 'A feature can only export its own declarations.', {
104
+ summary: 'Remove the export',
105
+ snippet: null,
106
+ patch: [{ op: 'remove', path: resolveAt(p) }],
107
+ });
108
+ });
109
+ }
110
+ }
111
+ export function routes(ctx) {
112
+ const names = Object.keys(ctx.ir.routes);
113
+ for (const f of Object.values(ctx.ir.features))
114
+ for (const site of transitionsOf(f)) {
115
+ const link = site.transition.navigate;
116
+ const navigate = link && 'link' in link ? link.link : null;
117
+ if (navigate === null || navigate === '?' || Object.hasOwn(ctx.ir.routes, navigate))
118
+ continue;
119
+ const p = site.at('navigate', 'link');
120
+ const guess = closest(navigate, names);
121
+ ctx.report('HZ007', f.id, p, `Unknown route "${navigate}".${didYouMean(guess)}`, `Routes: ${names.join(', ') || '(none)'}.`, {
122
+ summary: guess ? `Use "${guess}"` : 'Register the route in project({ routes })',
123
+ snippet: null,
124
+ patch: guess ? [{ op: 'replace', path: resolveAt(p), value: guess }] : null,
125
+ });
126
+ }
127
+ }
128
+ //# sourceMappingURL=refs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refs.js","sourceRoot":"","sources":["../../src/rules/refs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Ctx } from '../context.ts';
2
+ export declare function rendering(ctx: Ctx): void;
3
+ //# sourceMappingURL=rendering.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rendering.d.ts","sourceRoot":"","sources":["../../src/rules/rendering.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA;AAExC,wBAAgB,SAAS,CAAC,GAAG,EAAE,GAAG,QA8CjC"}
@@ -0,0 +1,37 @@
1
+ import { planRoute } from '@hozu/compiler';
2
+ import { join } from '@hozu/core/ir';
3
+ export function rendering(ctx) {
4
+ const reported = new Set();
5
+ for (const [route, page] of Object.entries(ctx.ir.pages)) {
6
+ if (!Object.hasOwn(ctx.ir.routes, route))
7
+ ctx.report('HZ007', null, join('', 'pages', route), `Page for unknown route "${route}"`, 'Pages render registered routes.', {
8
+ summary: 'Remove the page',
9
+ snippet: null,
10
+ patch: [{ op: 'remove', path: join('', 'pages', route) }],
11
+ });
12
+ page.views.forEach((ref, i) => {
13
+ const dot = ref.indexOf('.');
14
+ if (ref === '?' || ctx.ir.features[ref.slice(0, dot)]?.views[ref.slice(dot + 1)])
15
+ return;
16
+ ctx.report('HZ007', null, join('', 'pages', route, 'views', i), `Page "${route}" renders unknown view "${ref}"`, 'Pages render views declared in features.', {
17
+ summary: 'Remove the view from the page',
18
+ snippet: null,
19
+ patch: [{ op: 'remove', path: join('', 'pages', route, 'views', i) }],
20
+ });
21
+ });
22
+ for (const issue of planRoute(ctx.ir, route).issues) {
23
+ const key = `${issue.code} ${issue.pointer}`;
24
+ if (reported.has(key))
25
+ continue;
26
+ reported.add(key);
27
+ ctx.report(issue.code, issue.feature, issue.pointer, issue.message, issue.cause, {
28
+ summary: issue.code === 'HZ022'
29
+ ? "Make the query scope: 'user', or key it by data that does not come from the user"
30
+ : 'Decide which is intended: change the data freshness/scope, or change the assertion',
31
+ snippet: null,
32
+ patch: null,
33
+ });
34
+ }
35
+ }
36
+ }
37
+ //# sourceMappingURL=rendering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rendering.js","sourceRoot":"","sources":["../../src/rules/rendering.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAGpC,MAAM,UAAU,SAAS,CAAC,GAAQ;IAChC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;IAClC,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;YACtC,GAAG,CAAC,MAAM,CACR,OAAO,EACP,IAAI,EACJ,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,EACxB,2BAA2B,KAAK,GAAG,EACnC,iCAAiC,EACjC;gBACE,OAAO,EAAE,iBAAiB;gBAC1B,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;aAC1D,CACF,CAAA;QACH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAC5B,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YAC5B,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBAAE,OAAM;YACxF,GAAG,CAAC,MAAM,CACR,OAAO,EACP,IAAI,EACJ,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,EACpC,SAAS,KAAK,2BAA2B,GAAG,GAAG,EAC/C,0CAA0C,EAC1C;gBACE,OAAO,EAAE,+BAA+B;gBACxC,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC;aACtE,CACF,CAAA;QACH,CAAC,CAAC,CAAA;QACF,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;YACpD,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,CAAA;YAC5C,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAQ;YAC/B,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACjB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE;gBAC/E,OAAO,EACL,KAAK,CAAC,IAAI,KAAK,OAAO;oBACpB,CAAC,CAAC,kFAAkF;oBACpF,CAAC,CAAC,oFAAoF;gBAC1F,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,IAAI;aACZ,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Ctx } from '../context.ts';
2
+ export declare function routeParams(ctx: Ctx): void;
3
+ export declare function searchSchemas(ctx: Ctx): void;
4
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/rules/routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA;AAqBxC,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,QA2GnC;AAmBD,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,QA0CrC"}
@@ -0,0 +1,108 @@
1
+ import { anyRef, join, routePattern } from '@hozu/core/ir';
2
+ import { resolveRef } from '../resolve.js';
3
+ const placeholders = (path) => routePattern(path)
4
+ .keys.map((k) => k.name)
5
+ .sort();
6
+ const nullable = (s) => (Array.isArray(s.type) && s.type.includes('null')) ||
7
+ ['anyOf', 'oneOf'].some((k) => Array.isArray(s[k]) && s[k].some((v) => v.type === 'null'));
8
+ const keysOf = (schema) => schema && typeof schema.properties === 'object' && schema.properties
9
+ ? Object.keys(schema.properties).sort()
10
+ : [];
11
+ const readsParams = (v) => anyRef(v, (r) => r.ref === 'params');
12
+ export function routeParams(ctx) {
13
+ const { ir } = ctx;
14
+ for (const [id, route] of Object.entries(ir.routes)) {
15
+ const want = placeholders(route.path);
16
+ const have = keysOf(route.params);
17
+ if (want.join() !== have.join())
18
+ ctx.report('HZ024', null, join('', 'routes', id, 'params'), `Route "${id}" (${route.path}) declares params [${have.join(', ')}] but its path has [${want.join(', ')}]`, 'Every :placeholder must be a params key and every params key must appear in the path.', {
19
+ summary: 'Make the params schema keys match the path placeholders',
20
+ snippet: null,
21
+ patch: null,
22
+ });
23
+ const props = (route.params?.properties ?? {});
24
+ for (const { name, mod } of routePattern(route.path).keys) {
25
+ const p = props[name];
26
+ if (!p)
27
+ continue;
28
+ const many = mod === '+' || mod === '*';
29
+ const wrong = many ? p.type !== 'array' : mod === '?' ? !nullable(p) : p.type === 'array';
30
+ if (!wrong)
31
+ continue;
32
+ const pointer = join('', 'routes', id, 'params', 'properties', name);
33
+ const value = many
34
+ ? { type: 'array', items: { type: 'string' }, ...(mod === '+' ? { minItems: 1 } : {}) }
35
+ : mod === '?'
36
+ ? { anyOf: [p, { type: 'null' }] }
37
+ : { type: 'string' };
38
+ ctx.report('HZ024', null, pointer, `Param "${name}" of ${route.path} is ${many ? 'several segments' : mod === '?' ? 'optional' : 'one segment'}, but its schema does not say so`, ':name is a string, :name? a nullable string, :name+ and :name* an array of strings.', {
39
+ summary: many ? 'z.array(z.string())' : mod === '?' ? 'Add .nullable()' : 'z.string()',
40
+ snippet: null,
41
+ patch: [{ op: 'replace', path: pointer, value }],
42
+ });
43
+ }
44
+ }
45
+ for (const [route, page] of Object.entries(ir.pages)) {
46
+ page.views.forEach((ref, i) => {
47
+ const dot = ref.indexOf('.');
48
+ const view = ir.features[ref.slice(0, dot)]?.views[ref.slice(dot + 1)];
49
+ if (view?.route && view.route !== '?' && view.route !== route)
50
+ ctx.report('HZ024', null, join('', 'pages', route, 'views', i), `View ${ref} is bound to route "${view.route}" but rendered on "${route}"`, 'A view reads the params of the route it is bound to.', {
51
+ summary: `Render it on "${view.route}", or bind it to "${route}"`,
52
+ snippet: null,
53
+ patch: null,
54
+ });
55
+ });
56
+ const h = page.head;
57
+ const params = ir.routes[route]?.params ?? null;
58
+ const values = [h.title, h.description, h.image, h.published, ...(h.query ? [h.query.input] : [])];
59
+ if (!params && values.some(readsParams))
60
+ ctx.report('HZ024', null, join('', 'pages', route, 'head'), `The head of "${route}" reads params, but the route has none`, 'Only parameterized routes have params.', null);
61
+ if (h.query && h.query.ref !== '?' && !resolveRef(ir, h.query.ref, 'query'))
62
+ ctx.report('HZ003', null, join('', 'pages', route, 'head', 'query'), `Unknown query "${h.query.ref}" in page head`, 'Head data comes from a declared query.', null);
63
+ if (params && !page.entries)
64
+ ctx.report('HZ025', null, join('', 'pages', route, 'entries'), `Page "${route}" has params but no entries`, 'Without entries the page is missing from sitemap.xml and from static export; it still renders on request.', {
65
+ summary: 'Enumerate the pages from a query',
66
+ snippet: 'entries: { query: listThings, input: {}, params: (thing) => ({ id: thing.id }) }',
67
+ patch: null,
68
+ });
69
+ if (page.entries && page.entries.query !== '?' && !resolveRef(ir, page.entries.query, 'query'))
70
+ ctx.report('HZ003', null, join('', 'pages', route, 'entries', 'query'), `Unknown query "${page.entries.query}" in page entries`, 'Entries come from a declared query.', null);
71
+ }
72
+ }
73
+ const scalar = (s) => {
74
+ if (Array.isArray(s.enum) || 'const' in s)
75
+ return true;
76
+ for (const k of ['anyOf', 'oneOf'])
77
+ if (Array.isArray(s[k]))
78
+ return s[k].every((v) => v.type === 'null' || scalar(v));
79
+ const types = typeof s.type === 'string' ? [s.type] : Array.isArray(s.type) ? s.type : [];
80
+ return (types.length > 0 && types.every((t) => ['string', 'number', 'integer', 'boolean', 'null'].includes(t)));
81
+ };
82
+ const optional = (s) => 'default' in s ||
83
+ (Array.isArray(s.type) && s.type.includes('null')) ||
84
+ ['anyOf', 'oneOf'].some((k) => Array.isArray(s[k]) && s[k].some((v) => v.type === 'null'));
85
+ export function searchSchemas(ctx) {
86
+ for (const [id, route] of Object.entries(ctx.ir.routes)) {
87
+ const s = route.search;
88
+ if (!s)
89
+ continue;
90
+ const props = (s.properties ?? {});
91
+ if (s.type !== 'object' || !Object.keys(props).length) {
92
+ ctx.report('HZ035', null, join('', 'routes', id, 'search'), `Route "${id}" declares a search schema that is not a flat object`, 'A query string is a flat list of named values.', { summary: 'Use z.object({ key: scalar.default(…) }) or search: null', snippet: null, patch: null });
93
+ continue;
94
+ }
95
+ for (const [key, p] of Object.entries(props)) {
96
+ const pointer = join('', 'routes', id, 'search', 'properties', key);
97
+ if (!scalar(p))
98
+ ctx.report('HZ035', null, pointer, `Search param "${key}" of route "${id}" is not a string, number, boolean or enum`, 'Query string values are single scalars.', { summary: `Make "${key}" a scalar or an enum`, snippet: null, patch: null });
99
+ else if (!optional(p))
100
+ ctx.report('HZ035', null, pointer, `Search param "${key}" of route "${id}" has no default`, 'A URL may omit any search param, so each one needs a default (or null).', {
101
+ summary: `Give "${key}" a default with .default(…), or make it nullable`,
102
+ snippet: `${key}: <schema>.default(…)`,
103
+ patch: [{ op: 'replace', path: pointer, value: { anyOf: [p, { type: 'null' }] } }],
104
+ });
105
+ }
106
+ }
107
+ }
108
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/rules/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Ctx } from '../context.ts';
2
+ export declare function reachability(ctx: Ctx): void;
3
+ export declare function deadEnds(ctx: Ctx): void;
4
+ export declare function stateNames(ctx: Ctx): void;
5
+ export declare function shadowing(ctx: Ctx): void;
6
+ //# sourceMappingURL=states.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"states.d.ts","sourceRoot":"","sources":["../../src/rules/states.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA;AAIxC,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,QAmCpC;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,GAAG,QAkBhC;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,QAyElC;AAOD,wBAAgB,SAAS,CAAC,GAAG,EAAE,GAAG,QAgEjC"}