@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.
- package/LICENSE +21 -0
- package/README.md +15 -0
- package/dist/context.d.ts +13 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +27 -0
- package/dist/context.js.map +1 -0
- package/dist/contracts/lock.d.ts +19 -0
- package/dist/contracts/lock.d.ts.map +1 -0
- package/dist/contracts/lock.js +61 -0
- package/dist/contracts/lock.js.map +1 -0
- package/dist/contracts/run.d.ts +14 -0
- package/dist/contracts/run.d.ts.map +1 -0
- package/dist/contracts/run.js +130 -0
- package/dist/contracts/run.js.map +1 -0
- package/dist/contracts/skeleton.d.ts +4 -0
- package/dist/contracts/skeleton.d.ts.map +1 -0
- package/dist/contracts/skeleton.js +108 -0
- package/dist/contracts/skeleton.js.map +1 -0
- package/dist/contracts/verify.d.ts +5 -0
- package/dist/contracts/verify.d.ts.map +1 -0
- package/dist/contracts/verify.js +58 -0
- package/dist/contracts/verify.js.map +1 -0
- package/dist/env.d.ts +40 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +79 -0
- package/dist/env.js.map +1 -0
- package/dist/impact.d.ts +27 -0
- package/dist/impact.d.ts.map +1 -0
- package/dist/impact.js +154 -0
- package/dist/impact.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +71 -0
- package/dist/index.js.map +1 -0
- package/dist/resolve.d.ts +13 -0
- package/dist/resolve.d.ts.map +1 -0
- package/dist/resolve.js +58 -0
- package/dist/resolve.js.map +1 -0
- package/dist/rules/classes.d.ts +3 -0
- package/dist/rules/classes.d.ts.map +1 -0
- package/dist/rules/classes.js +60 -0
- package/dist/rules/classes.js.map +1 -0
- package/dist/rules/data.d.ts +4 -0
- package/dist/rules/data.d.ts.map +1 -0
- package/dist/rules/data.js +34 -0
- package/dist/rules/data.js.map +1 -0
- package/dist/rules/dom.d.ts +3 -0
- package/dist/rules/dom.d.ts.map +1 -0
- package/dist/rules/dom.js +104 -0
- package/dist/rules/dom.js.map +1 -0
- package/dist/rules/errors.d.ts +3 -0
- package/dist/rules/errors.d.ts.map +1 -0
- package/dist/rules/errors.js +97 -0
- package/dist/rules/errors.js.map +1 -0
- package/dist/rules/events.d.ts +5 -0
- package/dist/rules/events.d.ts.map +1 -0
- package/dist/rules/events.js +87 -0
- package/dist/rules/events.js.map +1 -0
- package/dist/rules/forms.d.ts +3 -0
- package/dist/rules/forms.d.ts.map +1 -0
- package/dist/rules/forms.js +19 -0
- package/dist/rules/forms.js.map +1 -0
- package/dist/rules/html.d.ts +3 -0
- package/dist/rules/html.d.ts.map +1 -0
- package/dist/rules/html.js +55 -0
- package/dist/rules/html.js.map +1 -0
- package/dist/rules/http.d.ts +3 -0
- package/dist/rules/http.d.ts.map +1 -0
- package/dist/rules/http.js +71 -0
- package/dist/rules/http.js.map +1 -0
- package/dist/rules/i18n.d.ts +3 -0
- package/dist/rules/i18n.d.ts.map +1 -0
- package/dist/rules/i18n.js +201 -0
- package/dist/rules/i18n.js.map +1 -0
- package/dist/rules/images.d.ts +3 -0
- package/dist/rules/images.d.ts.map +1 -0
- package/dist/rules/images.js +32 -0
- package/dist/rules/images.js.map +1 -0
- package/dist/rules/links.d.ts +3 -0
- package/dist/rules/links.d.ts.map +1 -0
- package/dist/rules/links.js +60 -0
- package/dist/rules/links.js.map +1 -0
- package/dist/rules/literals.d.ts +3 -0
- package/dist/rules/literals.d.ts.map +1 -0
- package/dist/rules/literals.js +147 -0
- package/dist/rules/literals.js.map +1 -0
- package/dist/rules/paths.d.ts +3 -0
- package/dist/rules/paths.d.ts.map +1 -0
- package/dist/rules/paths.js +177 -0
- package/dist/rules/paths.js.map +1 -0
- package/dist/rules/pwa.d.ts +3 -0
- package/dist/rules/pwa.d.ts.map +1 -0
- package/dist/rules/pwa.js +28 -0
- package/dist/rules/pwa.js.map +1 -0
- package/dist/rules/refs.d.ts +5 -0
- package/dist/rules/refs.d.ts.map +1 -0
- package/dist/rules/refs.js +128 -0
- package/dist/rules/refs.js.map +1 -0
- package/dist/rules/rendering.d.ts +3 -0
- package/dist/rules/rendering.d.ts.map +1 -0
- package/dist/rules/rendering.js +37 -0
- package/dist/rules/rendering.js.map +1 -0
- package/dist/rules/routes.d.ts +4 -0
- package/dist/rules/routes.d.ts.map +1 -0
- package/dist/rules/routes.js +108 -0
- package/dist/rules/routes.js.map +1 -0
- package/dist/rules/states.d.ts +6 -0
- package/dist/rules/states.d.ts.map +1 -0
- package/dist/rules/states.js +167 -0
- package/dist/rules/states.js.map +1 -0
- package/dist/rules/text.d.ts +3 -0
- package/dist/rules/text.d.ts.map +1 -0
- package/dist/rules/text.js +148 -0
- package/dist/rules/text.js.map +1 -0
- package/dist/rules/widgets.d.ts +3 -0
- package/dist/rules/widgets.d.ts.map +1 -0
- package/dist/rules/widgets.js +33 -0
- package/dist/rules/widgets.js.map +1 -0
- package/dist/schema.d.ts +19 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +142 -0
- package/dist/schema.js.map +1 -0
- package/dist/sites.d.ts +15 -0
- package/dist/sites.d.ts.map +1 -0
- package/dist/sites.js +151 -0
- package/dist/sites.js.map +1 -0
- package/dist/suggest.d.ts +4 -0
- package/dist/suggest.d.ts.map +1 -0
- package/dist/suggest.js +30 -0
- package/dist/suggest.js.map +1 -0
- package/dist/walk.d.ts +37 -0
- package/dist/walk.d.ts.map +1 -0
- package/dist/walk.js +138 -0
- package/dist/walk.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|