@cogenta/render 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/dist/astro/integration.d.ts +57 -0
- package/dist/astro/integration.d.ts.map +1 -0
- package/dist/astro/integration.js +72 -0
- package/dist/astro/integration.js.map +1 -0
- package/dist/build/index.d.ts +7 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +7 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/integration.d.ts +25 -0
- package/dist/build/integration.d.ts.map +1 -0
- package/dist/build/integration.js +41 -0
- package/dist/build/integration.js.map +1 -0
- package/dist/build/plan.d.ts +41 -0
- package/dist/build/plan.d.ts.map +1 -0
- package/dist/build/plan.js +48 -0
- package/dist/build/plan.js.map +1 -0
- package/dist/build/refusal.d.ts +14 -0
- package/dist/build/refusal.d.ts.map +1 -0
- package/dist/build/refusal.js +110 -0
- package/dist/build/refusal.js.map +1 -0
- package/dist/build/requirements.d.ts +59 -0
- package/dist/build/requirements.d.ts.map +1 -0
- package/dist/build/requirements.js +74 -0
- package/dist/build/requirements.js.map +1 -0
- package/dist/build/run-build.d.ts +43 -0
- package/dist/build/run-build.d.ts.map +1 -0
- package/dist/build/run-build.js +73 -0
- package/dist/build/run-build.js.map +1 -0
- package/dist/build/targets.d.ts +47 -0
- package/dist/build/targets.d.ts.map +1 -0
- package/dist/build/targets.js +69 -0
- package/dist/build/targets.js.map +1 -0
- package/dist/cache/index.d.ts +7 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +4 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/page-cache.d.ts +64 -0
- package/dist/cache/page-cache.d.ts.map +1 -0
- package/dist/cache/page-cache.js +128 -0
- package/dist/cache/page-cache.js.map +1 -0
- package/dist/cache/recorder.d.ts +49 -0
- package/dist/cache/recorder.d.ts.map +1 -0
- package/dist/cache/recorder.js +77 -0
- package/dist/cache/recorder.js.map +1 -0
- package/dist/cache/tags.d.ts +55 -0
- package/dist/cache/tags.d.ts.map +1 -0
- package/dist/cache/tags.js +62 -0
- package/dist/cache/tags.js.map +1 -0
- package/dist/config.d.ts +48 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +44 -0
- package/dist/config.js.map +1 -0
- package/dist/content/client.d.ts +35 -0
- package/dist/content/client.d.ts.map +1 -0
- package/dist/content/client.js +155 -0
- package/dist/content/client.js.map +1 -0
- package/dist/content/types.d.ts +104 -0
- package/dist/content/types.d.ts.map +1 -0
- package/dist/content/types.js +16 -0
- package/dist/content/types.js.map +1 -0
- package/dist/context/render-context.d.ts +31 -0
- package/dist/context/render-context.d.ts.map +1 -0
- package/dist/context/render-context.js +152 -0
- package/dist/context/render-context.js.map +1 -0
- package/dist/context/types.d.ts +49 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/context/types.js +2 -0
- package/dist/context/types.js.map +1 -0
- package/dist/images/errors.d.ts +20 -0
- package/dist/images/errors.d.ts.map +1 -0
- package/dist/images/errors.js +58 -0
- package/dist/images/errors.js.map +1 -0
- package/dist/images/format.d.ts +18 -0
- package/dist/images/format.d.ts.map +1 -0
- package/dist/images/format.js +34 -0
- package/dist/images/format.js.map +1 -0
- package/dist/images/geometry.d.ts +46 -0
- package/dist/images/geometry.d.ts.map +1 -0
- package/dist/images/geometry.js +127 -0
- package/dist/images/geometry.js.map +1 -0
- package/dist/images/index.d.ts +29 -0
- package/dist/images/index.d.ts.map +1 -0
- package/dist/images/index.js +30 -0
- package/dist/images/index.js.map +1 -0
- package/dist/images/pipeline.d.ts +51 -0
- package/dist/images/pipeline.d.ts.map +1 -0
- package/dist/images/pipeline.js +105 -0
- package/dist/images/pipeline.js.map +1 -0
- package/dist/images/sharp.d.ts +57 -0
- package/dist/images/sharp.d.ts.map +1 -0
- package/dist/images/sharp.js +139 -0
- package/dist/images/sharp.js.map +1 -0
- package/dist/images/srcset.d.ts +33 -0
- package/dist/images/srcset.d.ts.map +1 -0
- package/dist/images/srcset.js +94 -0
- package/dist/images/srcset.js.map +1 -0
- package/dist/images/store.d.ts +32 -0
- package/dist/images/store.d.ts.map +1 -0
- package/dist/images/store.js +54 -0
- package/dist/images/store.js.map +1 -0
- package/dist/images/types.d.ts +128 -0
- package/dist/images/types.d.ts.map +1 -0
- package/dist/images/types.js +22 -0
- package/dist/images/types.js.map +1 -0
- package/dist/images/wasm.d.ts +43 -0
- package/dist/images/wasm.d.ts.map +1 -0
- package/dist/images/wasm.js +128 -0
- package/dist/images/wasm.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/pwa/build.d.ts +39 -0
- package/dist/pwa/build.d.ts.map +1 -0
- package/dist/pwa/build.js +38 -0
- package/dist/pwa/build.js.map +1 -0
- package/dist/pwa/client.d.ts +90 -0
- package/dist/pwa/client.d.ts.map +1 -0
- package/dist/pwa/client.js +76 -0
- package/dist/pwa/client.js.map +1 -0
- package/dist/pwa/index.d.ts +29 -0
- package/dist/pwa/index.d.ts.map +1 -0
- package/dist/pwa/index.js +22 -0
- package/dist/pwa/index.js.map +1 -0
- package/dist/pwa/manifest.d.ts +69 -0
- package/dist/pwa/manifest.d.ts.map +1 -0
- package/dist/pwa/manifest.js +108 -0
- package/dist/pwa/manifest.js.map +1 -0
- package/dist/pwa/offline.d.ts +44 -0
- package/dist/pwa/offline.d.ts.map +1 -0
- package/dist/pwa/offline.js +94 -0
- package/dist/pwa/offline.js.map +1 -0
- package/dist/pwa/service-worker.d.ts +71 -0
- package/dist/pwa/service-worker.d.ts.map +1 -0
- package/dist/pwa/service-worker.js +119 -0
- package/dist/pwa/service-worker.js.map +1 -0
- package/dist/pwa/strategy.d.ts +36 -0
- package/dist/pwa/strategy.d.ts.map +1 -0
- package/dist/pwa/strategy.js +180 -0
- package/dist/pwa/strategy.js.map +1 -0
- package/dist/pwa/sw-runtime.d.ts +109 -0
- package/dist/pwa/sw-runtime.d.ts.map +1 -0
- package/dist/pwa/sw-runtime.js +214 -0
- package/dist/pwa/sw-runtime.js.map +1 -0
- package/dist/pwa/types.d.ts +107 -0
- package/dist/pwa/types.d.ts.map +1 -0
- package/dist/pwa/types.js +18 -0
- package/dist/pwa/types.js.map +1 -0
- package/dist/pwa/version.d.ts +45 -0
- package/dist/pwa/version.d.ts.map +1 -0
- package/dist/pwa/version.js +89 -0
- package/dist/pwa/version.js.map +1 -0
- package/dist/skin/color.d.ts +50 -0
- package/dist/skin/color.d.ts.map +1 -0
- package/dist/skin/color.js +176 -0
- package/dist/skin/color.js.map +1 -0
- package/dist/skin/css.d.ts +19 -0
- package/dist/skin/css.d.ts.map +1 -0
- package/dist/skin/css.js +69 -0
- package/dist/skin/css.js.map +1 -0
- package/dist/skin/errors.d.ts +22 -0
- package/dist/skin/errors.d.ts.map +1 -0
- package/dist/skin/errors.js +59 -0
- package/dist/skin/errors.js.map +1 -0
- package/dist/skin/index.d.ts +15 -0
- package/dist/skin/index.d.ts.map +1 -0
- package/dist/skin/index.js +11 -0
- package/dist/skin/index.js.map +1 -0
- package/dist/skin/sheet.d.ts +42 -0
- package/dist/skin/sheet.d.ts.map +1 -0
- package/dist/skin/sheet.js +36 -0
- package/dist/skin/sheet.js.map +1 -0
- package/dist/skin/tokens.d.ts +90 -0
- package/dist/skin/tokens.d.ts.map +1 -0
- package/dist/skin/tokens.js +56 -0
- package/dist/skin/tokens.js.map +1 -0
- package/dist/skin/validate.d.ts +14 -0
- package/dist/skin/validate.d.ts.map +1 -0
- package/dist/skin/validate.js +272 -0
- package/dist/skin/validate.js.map +1 -0
- package/dist/theme/load-theme.d.ts +37 -0
- package/dist/theme/load-theme.d.ts.map +1 -0
- package/dist/theme/load-theme.js +102 -0
- package/dist/theme/load-theme.js.map +1 -0
- package/dist/theme/manifest.d.ts +48 -0
- package/dist/theme/manifest.d.ts.map +1 -0
- package/dist/theme/manifest.js +36 -0
- package/dist/theme/manifest.js.map +1 -0
- package/dist/theme/verify/forbidden.d.ts +39 -0
- package/dist/theme/verify/forbidden.d.ts.map +1 -0
- package/dist/theme/verify/forbidden.js +107 -0
- package/dist/theme/verify/forbidden.js.map +1 -0
- package/dist/theme/verify/scan-file.d.ts +15 -0
- package/dist/theme/verify/scan-file.d.ts.map +1 -0
- package/dist/theme/verify/scan-file.js +151 -0
- package/dist/theme/verify/scan-file.js.map +1 -0
- package/dist/theme/verify/scanner.d.ts +52 -0
- package/dist/theme/verify/scanner.d.ts.map +1 -0
- package/dist/theme/verify/scanner.js +304 -0
- package/dist/theme/verify/scanner.js.map +1 -0
- package/dist/theme/verify/verify-theme.d.ts +44 -0
- package/dist/theme/verify/verify-theme.d.ts.map +1 -0
- package/dist/theme/verify/verify-theme.js +179 -0
- package/dist/theme/verify/verify-theme.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import { matchForbidden } from './forbidden.js';
|
|
2
|
+
const IDENT_START = /[A-Za-z_$#@]/u;
|
|
3
|
+
const IDENT_PART = /[A-Za-z0-9_$]/u;
|
|
4
|
+
/** Keywords after which a `/` opens a regular expression rather than dividing. */
|
|
5
|
+
const OPERATOR_KEYWORDS = new Set([
|
|
6
|
+
'return',
|
|
7
|
+
'typeof',
|
|
8
|
+
'instanceof',
|
|
9
|
+
'in',
|
|
10
|
+
'of',
|
|
11
|
+
'new',
|
|
12
|
+
'delete',
|
|
13
|
+
'void',
|
|
14
|
+
'throw',
|
|
15
|
+
'case',
|
|
16
|
+
'do',
|
|
17
|
+
'else',
|
|
18
|
+
'yield',
|
|
19
|
+
'await',
|
|
20
|
+
]);
|
|
21
|
+
/**
|
|
22
|
+
* Turns source into the few token kinds the rules below need.
|
|
23
|
+
*
|
|
24
|
+
* Comments are dropped, so a commented-out import is not a refusal. Strings
|
|
25
|
+
* stop at the end of the line unless they are template literals, exactly as
|
|
26
|
+
* JavaScript does — which bounds the damage of any mis-lex to one line.
|
|
27
|
+
*/
|
|
28
|
+
function tokenize(code, startLine, startColumn) {
|
|
29
|
+
const tokens = [];
|
|
30
|
+
const cursor = { index: 0, line: startLine, column: startColumn };
|
|
31
|
+
const advance = (count) => {
|
|
32
|
+
for (let i = 0; i < count && cursor.index < code.length; i += 1) {
|
|
33
|
+
if (code[cursor.index] === '\n') {
|
|
34
|
+
cursor.line += 1;
|
|
35
|
+
cursor.column = 1;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
cursor.column += 1;
|
|
39
|
+
}
|
|
40
|
+
cursor.index += 1;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const previous = () => tokens[tokens.length - 1];
|
|
44
|
+
/** Reads a quoted string, or a template literal including its `${…}` parts. */
|
|
45
|
+
const readString = (quote) => {
|
|
46
|
+
const line = cursor.line;
|
|
47
|
+
const column = cursor.column;
|
|
48
|
+
const template = quote === '`';
|
|
49
|
+
let value = '';
|
|
50
|
+
let interpolated = false;
|
|
51
|
+
advance(1);
|
|
52
|
+
while (cursor.index < code.length) {
|
|
53
|
+
const char = code[cursor.index];
|
|
54
|
+
if (char === undefined)
|
|
55
|
+
break;
|
|
56
|
+
if (char === '\\') {
|
|
57
|
+
value += code[cursor.index + 1] ?? '';
|
|
58
|
+
advance(2);
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (char === quote) {
|
|
62
|
+
advance(1);
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
if (!template && char === '\n')
|
|
66
|
+
break; // unterminated: JavaScript ends it here too
|
|
67
|
+
if (template && char === '$' && code[cursor.index + 1] === '{') {
|
|
68
|
+
// The expression inside is code, so it is tokenised in place; the
|
|
69
|
+
// template itself stops being a readable specifier.
|
|
70
|
+
interpolated = true;
|
|
71
|
+
advance(2);
|
|
72
|
+
let depth = 1;
|
|
73
|
+
while (cursor.index < code.length && depth > 0) {
|
|
74
|
+
const inner = code[cursor.index];
|
|
75
|
+
if (inner === '{')
|
|
76
|
+
depth += 1;
|
|
77
|
+
else if (inner === '}')
|
|
78
|
+
depth -= 1;
|
|
79
|
+
if (depth === 0)
|
|
80
|
+
break;
|
|
81
|
+
const before = tokens.length;
|
|
82
|
+
readToken();
|
|
83
|
+
if (tokens.length === before && cursor.index < code.length)
|
|
84
|
+
advance(1);
|
|
85
|
+
}
|
|
86
|
+
advance(1);
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
value += char;
|
|
90
|
+
advance(1);
|
|
91
|
+
}
|
|
92
|
+
tokens.push({
|
|
93
|
+
kind: interpolated ? 'other' : 'string',
|
|
94
|
+
value,
|
|
95
|
+
line,
|
|
96
|
+
column,
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
const readIdent = () => {
|
|
100
|
+
const line = cursor.line;
|
|
101
|
+
const column = cursor.column;
|
|
102
|
+
let value = '';
|
|
103
|
+
while (cursor.index < code.length) {
|
|
104
|
+
const char = code[cursor.index];
|
|
105
|
+
if (char === undefined || !(value === '' ? IDENT_START : IDENT_PART).test(char))
|
|
106
|
+
break;
|
|
107
|
+
value += char;
|
|
108
|
+
advance(1);
|
|
109
|
+
}
|
|
110
|
+
tokens.push({ kind: 'ident', value, line, column });
|
|
111
|
+
};
|
|
112
|
+
/** True when a `/` here starts a regular expression rather than a division. */
|
|
113
|
+
const regexExpected = () => {
|
|
114
|
+
const prev = previous();
|
|
115
|
+
if (prev === undefined)
|
|
116
|
+
return true;
|
|
117
|
+
if (prev.kind === 'ident')
|
|
118
|
+
return OPERATOR_KEYWORDS.has(prev.value);
|
|
119
|
+
if (prev.kind === 'other')
|
|
120
|
+
return false;
|
|
121
|
+
return !(prev.value === ')' || prev.value === ']' || prev.value === '}');
|
|
122
|
+
};
|
|
123
|
+
const skipRegex = () => {
|
|
124
|
+
advance(1);
|
|
125
|
+
let inClass = false;
|
|
126
|
+
while (cursor.index < code.length) {
|
|
127
|
+
const char = code[cursor.index];
|
|
128
|
+
if (char === undefined || char === '\n')
|
|
129
|
+
break;
|
|
130
|
+
if (char === '\\') {
|
|
131
|
+
advance(2);
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (char === '[')
|
|
135
|
+
inClass = true;
|
|
136
|
+
else if (char === ']')
|
|
137
|
+
inClass = false;
|
|
138
|
+
else if (char === '/' && !inClass) {
|
|
139
|
+
advance(1);
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
advance(1);
|
|
143
|
+
}
|
|
144
|
+
tokens.push({ kind: 'other', value: '/regex/', line: cursor.line, column: cursor.column });
|
|
145
|
+
};
|
|
146
|
+
function readToken() {
|
|
147
|
+
const char = code[cursor.index];
|
|
148
|
+
if (char === undefined)
|
|
149
|
+
return;
|
|
150
|
+
if (char === ' ' || char === '\t' || char === '\r' || char === '\n') {
|
|
151
|
+
advance(1);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
if (char === '/' && code[cursor.index + 1] === '/') {
|
|
155
|
+
while (cursor.index < code.length && code[cursor.index] !== '\n')
|
|
156
|
+
advance(1);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (char === '/' && code[cursor.index + 1] === '*') {
|
|
160
|
+
advance(2);
|
|
161
|
+
while (cursor.index < code.length) {
|
|
162
|
+
if (code[cursor.index] === '*' && code[cursor.index + 1] === '/') {
|
|
163
|
+
advance(2);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
advance(1);
|
|
167
|
+
}
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
if (char === '/') {
|
|
171
|
+
if (regexExpected())
|
|
172
|
+
skipRegex();
|
|
173
|
+
else {
|
|
174
|
+
tokens.push({ kind: 'punct', value: '/', line: cursor.line, column: cursor.column });
|
|
175
|
+
advance(1);
|
|
176
|
+
}
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
if (char === '"' || char === "'" || char === '`') {
|
|
180
|
+
readString(char);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
if (IDENT_START.test(char)) {
|
|
184
|
+
readIdent();
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (char >= '0' && char <= '9') {
|
|
188
|
+
const line = cursor.line;
|
|
189
|
+
const column = cursor.column;
|
|
190
|
+
let value = '';
|
|
191
|
+
while (cursor.index < code.length) {
|
|
192
|
+
const digit = code[cursor.index];
|
|
193
|
+
if (digit === undefined || !/[0-9A-Za-z._]/u.test(digit))
|
|
194
|
+
break;
|
|
195
|
+
value += digit;
|
|
196
|
+
advance(1);
|
|
197
|
+
}
|
|
198
|
+
tokens.push({ kind: 'other', value, line, column });
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
tokens.push({ kind: 'punct', value: char, line: cursor.line, column: cursor.column });
|
|
202
|
+
advance(1);
|
|
203
|
+
}
|
|
204
|
+
while (cursor.index < code.length) {
|
|
205
|
+
const before = cursor.index;
|
|
206
|
+
readToken();
|
|
207
|
+
if (cursor.index === before)
|
|
208
|
+
advance(1);
|
|
209
|
+
}
|
|
210
|
+
return tokens;
|
|
211
|
+
}
|
|
212
|
+
function specifierFinding(token) {
|
|
213
|
+
const match = matchForbidden(token.value);
|
|
214
|
+
if (match === null)
|
|
215
|
+
return null;
|
|
216
|
+
return {
|
|
217
|
+
kind: 'forbidden-import',
|
|
218
|
+
line: token.line,
|
|
219
|
+
column: token.column,
|
|
220
|
+
specifier: token.value,
|
|
221
|
+
resolved: match.specifier,
|
|
222
|
+
forbiddenKind: match.kind,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
/** `createRequire`, `require`, `__require`: every door back to CommonJS. */
|
|
226
|
+
function isRequireLike(value) {
|
|
227
|
+
return value.toLowerCase().includes('require');
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Applies the rules to a token stream.
|
|
231
|
+
*
|
|
232
|
+
* Only strings in module-specifier position are matched against the forbidden
|
|
233
|
+
* list. Checking *every* string literal was the first design and it was wrong:
|
|
234
|
+
* `process`, `net`, `http` and `redis` are ordinary words, and a theme refused
|
|
235
|
+
* because a CSS class is called `process` teaches theme authors that the check
|
|
236
|
+
* is noise.
|
|
237
|
+
*/
|
|
238
|
+
function findingsFrom(tokens) {
|
|
239
|
+
const findings = [];
|
|
240
|
+
const push = (finding) => {
|
|
241
|
+
if (finding !== null)
|
|
242
|
+
findings.push(finding);
|
|
243
|
+
};
|
|
244
|
+
for (let i = 0; i < tokens.length; i += 1) {
|
|
245
|
+
const token = tokens[i];
|
|
246
|
+
if (token === undefined || token.kind !== 'ident')
|
|
247
|
+
continue;
|
|
248
|
+
const next = tokens[i + 1];
|
|
249
|
+
if (next === undefined)
|
|
250
|
+
continue;
|
|
251
|
+
// `import 'x'` and `… from 'x'` — static import, re-export, `import type`.
|
|
252
|
+
if ((token.value === 'import' || token.value === 'from') && next.kind === 'string') {
|
|
253
|
+
push(specifierFinding(next));
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
if (token.value === 'import' && next.kind === 'punct' && next.value === '(') {
|
|
257
|
+
const argument = tokens[i + 2];
|
|
258
|
+
const closing = tokens[i + 3];
|
|
259
|
+
const readable = argument?.kind === 'string' && closing?.kind === 'punct' && closing.value === ')';
|
|
260
|
+
if (readable && argument !== undefined)
|
|
261
|
+
push(specifierFinding(argument));
|
|
262
|
+
else {
|
|
263
|
+
// Refused for being unreadable. This is what closes aliasing: a
|
|
264
|
+
// specifier built from a variable, a concatenation or a template
|
|
265
|
+
// cannot be proven safe, so it is not given the benefit of the doubt.
|
|
266
|
+
findings.push({
|
|
267
|
+
kind: 'unanalysable-import',
|
|
268
|
+
line: token.line,
|
|
269
|
+
column: token.column,
|
|
270
|
+
specifier: null,
|
|
271
|
+
resolved: null,
|
|
272
|
+
forbiddenKind: null,
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
if (next.kind !== 'punct' || next.value !== '(')
|
|
278
|
+
continue;
|
|
279
|
+
const argument = tokens[i + 2];
|
|
280
|
+
if (isRequireLike(token.value)) {
|
|
281
|
+
findings.push({
|
|
282
|
+
kind: 'commonjs-require',
|
|
283
|
+
line: token.line,
|
|
284
|
+
column: token.column,
|
|
285
|
+
specifier: argument?.kind === 'string' ? argument.value : null,
|
|
286
|
+
resolved: null,
|
|
287
|
+
forbiddenKind: null,
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
// A `node:` prefix makes a string a module specifier wherever it appears,
|
|
291
|
+
// with nothing else it could plausibly be. So a call that receives one is
|
|
292
|
+
// loading a module whatever its callee is named, which is what catches the
|
|
293
|
+
// handle a `createRequire` was stored in.
|
|
294
|
+
if (argument?.kind === 'string' && argument.value.startsWith('node:')) {
|
|
295
|
+
push(specifierFinding(argument));
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return findings;
|
|
299
|
+
}
|
|
300
|
+
/** Scans a fragment of TypeScript or JavaScript. */
|
|
301
|
+
export function scanCode(code, options = {}) {
|
|
302
|
+
return findingsFrom(tokenize(code, options.line ?? 1, options.column ?? 1));
|
|
303
|
+
}
|
|
304
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../../src/theme/verify/scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ThemeManifest } from '../manifest.js';
|
|
2
|
+
import type { SourceFinding } from './scanner.js';
|
|
3
|
+
/**
|
|
4
|
+
* The installation check of contract D.
|
|
5
|
+
*
|
|
6
|
+
* Two refusals, and the word the contract uses for both is *refused*, not
|
|
7
|
+
* *warned*: a theme that declares fewer than the twelve blocks would silently
|
|
8
|
+
* drop content on a theme switch, and a theme that reaches for `node:fs` or
|
|
9
|
+
* the database has left the sandbox the two-plane architecture gives it for
|
|
10
|
+
* free (ADR-0004, ADR-0016).
|
|
11
|
+
*
|
|
12
|
+
* This module reads the filesystem, so it belongs to the control plane — the
|
|
13
|
+
* install path — and never to the process that renders pages.
|
|
14
|
+
*/
|
|
15
|
+
export interface FileFinding extends SourceFinding {
|
|
16
|
+
/** Path relative to the theme root, with forward slashes. */
|
|
17
|
+
readonly file: string;
|
|
18
|
+
}
|
|
19
|
+
export interface ThemeInspection {
|
|
20
|
+
readonly ok: boolean;
|
|
21
|
+
/** Vocabulary blocks the manifest does not declare. */
|
|
22
|
+
readonly missingBlocks: readonly string[];
|
|
23
|
+
readonly findings: readonly FileFinding[];
|
|
24
|
+
readonly filesScanned: number;
|
|
25
|
+
}
|
|
26
|
+
export interface VerifyThemeOptions {
|
|
27
|
+
readonly root: string;
|
|
28
|
+
readonly manifest: ThemeManifest;
|
|
29
|
+
/**
|
|
30
|
+
* Blocks the theme must declare. The twelve of the vocabulary by default;
|
|
31
|
+
* a caller passes its own only to check a theme against a future vocabulary.
|
|
32
|
+
*/
|
|
33
|
+
readonly requiredBlocks?: readonly string[];
|
|
34
|
+
}
|
|
35
|
+
/** Collects everything wrong with a theme without deciding what to do about it. */
|
|
36
|
+
export declare function inspectTheme(options: VerifyThemeOptions): Promise<ThemeInspection>;
|
|
37
|
+
/**
|
|
38
|
+
* Runs the installation check and refuses.
|
|
39
|
+
*
|
|
40
|
+
* Returns the inspection when the theme passes, so a caller that wants the
|
|
41
|
+
* file count for a log does not have to run the scan twice.
|
|
42
|
+
*/
|
|
43
|
+
export declare function verifyTheme(options: VerifyThemeOptions): Promise<ThemeInspection>;
|
|
44
|
+
//# sourceMappingURL=verify-theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-theme.d.ts","sourceRoot":"","sources":["../../../src/theme/verify/verify-theme.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAGnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEjD;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,WAAY,SAAQ,aAAa;IAChD,6DAA6D;IAC7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAA;IACpB,uDAAuD;IACvD,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAA;IACzC,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAA;IACzC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAA;IAChC;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC5C;AAED,mFAAmF;AACnF,wBAAsB,YAAY,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,CAAC,CAyBxF;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,CAAC,CA0BvF"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
2
|
+
import { join, relative, sep } from 'node:path';
|
|
3
|
+
import { VOCABULARY_NAMES } from '@cogenta/blocks';
|
|
4
|
+
import { CogentaError } from '@cogenta/core';
|
|
5
|
+
import { describeKind, matchForbidden } from './forbidden.js';
|
|
6
|
+
import { IGNORED_DIRECTORIES, SCANNED_EXTENSIONS, scanSource } from './scan-file.js';
|
|
7
|
+
/** Collects everything wrong with a theme without deciding what to do about it. */
|
|
8
|
+
export async function inspectTheme(options) {
|
|
9
|
+
const required = options.requiredBlocks ?? VOCABULARY_NAMES;
|
|
10
|
+
const declared = new Set(options.manifest.implements);
|
|
11
|
+
const missingBlocks = required.filter((name) => !declared.has(name));
|
|
12
|
+
const findings = [];
|
|
13
|
+
let filesScanned = 0;
|
|
14
|
+
for await (const file of sourceFiles(options.root)) {
|
|
15
|
+
filesScanned += 1;
|
|
16
|
+
const source = await readFile(file, 'utf8');
|
|
17
|
+
const relativePath = relative(options.root, file).split(sep).join('/');
|
|
18
|
+
for (const finding of scanSource(relativePath, source)) {
|
|
19
|
+
findings.push({ ...finding, file: relativePath });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
findings.push(...(await manifestAliasFindings(options.root)));
|
|
23
|
+
return {
|
|
24
|
+
ok: missingBlocks.length === 0 && findings.length === 0,
|
|
25
|
+
missingBlocks,
|
|
26
|
+
findings,
|
|
27
|
+
filesScanned,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Runs the installation check and refuses.
|
|
32
|
+
*
|
|
33
|
+
* Returns the inspection when the theme passes, so a caller that wants the
|
|
34
|
+
* file count for a log does not have to run the scan twice.
|
|
35
|
+
*/
|
|
36
|
+
export async function verifyTheme(options) {
|
|
37
|
+
const inspection = await inspectTheme(options);
|
|
38
|
+
if (inspection.ok)
|
|
39
|
+
return inspection;
|
|
40
|
+
const name = options.manifest.name;
|
|
41
|
+
if (inspection.findings.length > 0) {
|
|
42
|
+
throw new CogentaError({
|
|
43
|
+
code: 'THEME_IMPORT_FORBIDDEN',
|
|
44
|
+
message: `The theme "${name}" is refused: ${describeFindings(inspection.findings)}`,
|
|
45
|
+
hint: 'A theme runs without secrets and without a database connection (R5, ADR-0004). It reads content through `ctx.content`, which is an HTTP client carrying a read-only token. Remove the imports above; there is no flag to allow them.',
|
|
46
|
+
details: {
|
|
47
|
+
theme: name,
|
|
48
|
+
root: options.root,
|
|
49
|
+
findings: inspection.findings,
|
|
50
|
+
missingBlocks: inspection.missingBlocks,
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
throw new CogentaError({
|
|
55
|
+
code: 'THEME_BLOCK_MISSING',
|
|
56
|
+
message: `The theme "${name}" does not implement every block of the vocabulary. Missing: ${inspection.missingBlocks.join(', ')}.`,
|
|
57
|
+
hint: 'Every theme implements the twelve blocks, so that switching theme never drops content. Add a component for each missing block and list it in `implements`.',
|
|
58
|
+
details: { theme: name, root: options.root, missingBlocks: inspection.missingBlocks },
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/** One line per finding, naming the file, the line and the import. */
|
|
62
|
+
function describeFindings(findings) {
|
|
63
|
+
const lines = findings.map((finding) => describeFinding(finding));
|
|
64
|
+
return `\n - ${lines.join('\n - ')}`;
|
|
65
|
+
}
|
|
66
|
+
function describeFinding(finding) {
|
|
67
|
+
const at = `${finding.file}:${finding.line}:${finding.column}`;
|
|
68
|
+
if (finding.kind === 'unanalysable-import') {
|
|
69
|
+
return `${at} calls import() with a specifier that cannot be read statically`;
|
|
70
|
+
}
|
|
71
|
+
if (finding.kind === 'commonjs-require') {
|
|
72
|
+
const on = finding.specifier === null ? '' : ` on "${finding.specifier}"`;
|
|
73
|
+
return `${at} uses a CommonJS \`require\` call${on}, and a theme is ESM only`;
|
|
74
|
+
}
|
|
75
|
+
const also = finding.specifier === finding.resolved ? '' : `, which is ${finding.resolved ?? ''}`;
|
|
76
|
+
const why = describeKind(finding.forbiddenKind ?? 'node-builtin');
|
|
77
|
+
return `${at} imports "${finding.specifier ?? ''}" (${why}${also})`;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The alias route: `package.json` can rename a forbidden module.
|
|
81
|
+
*
|
|
82
|
+
* `"imports": { "#store": "node:fs" }` turns `import '#store'` into a specifier
|
|
83
|
+
* the source scan has no reason to suspect, and a forbidden package listed in
|
|
84
|
+
* `dependencies` is a declaration of intent whatever the sources say.
|
|
85
|
+
*/
|
|
86
|
+
async function manifestAliasFindings(root) {
|
|
87
|
+
let raw;
|
|
88
|
+
try {
|
|
89
|
+
raw = await readFile(join(root, 'package.json'), 'utf8');
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return []; // a theme without a package.json declares no alias either
|
|
93
|
+
}
|
|
94
|
+
let parsed;
|
|
95
|
+
try {
|
|
96
|
+
parsed = JSON.parse(raw);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
if (typeof parsed !== 'object' || parsed === null)
|
|
102
|
+
return [];
|
|
103
|
+
const findings = [];
|
|
104
|
+
const record = parsed;
|
|
105
|
+
const flag = (specifier, note) => {
|
|
106
|
+
const match = matchForbidden(specifier);
|
|
107
|
+
if (match === null)
|
|
108
|
+
return;
|
|
109
|
+
findings.push({
|
|
110
|
+
kind: 'forbidden-import',
|
|
111
|
+
file: 'package.json',
|
|
112
|
+
line: lineOf(raw, specifier),
|
|
113
|
+
column: 1,
|
|
114
|
+
specifier: `${note} → ${specifier}`,
|
|
115
|
+
resolved: match.specifier,
|
|
116
|
+
forbiddenKind: match.kind,
|
|
117
|
+
});
|
|
118
|
+
};
|
|
119
|
+
for (const key of ['dependencies', 'peerDependencies', 'optionalDependencies']) {
|
|
120
|
+
const section = record[key];
|
|
121
|
+
if (typeof section !== 'object' || section === null)
|
|
122
|
+
continue;
|
|
123
|
+
for (const name of Object.keys(section))
|
|
124
|
+
flag(name, key);
|
|
125
|
+
}
|
|
126
|
+
const imports = record.imports;
|
|
127
|
+
if (typeof imports === 'object' && imports !== null) {
|
|
128
|
+
for (const [alias, target] of Object.entries(imports)) {
|
|
129
|
+
for (const value of collectStrings(target))
|
|
130
|
+
flag(value, `imports["${alias}"]`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return findings;
|
|
134
|
+
}
|
|
135
|
+
/** Conditional exports nest, so the targets are gathered rather than assumed flat. */
|
|
136
|
+
function collectStrings(value) {
|
|
137
|
+
if (typeof value === 'string')
|
|
138
|
+
return [value];
|
|
139
|
+
if (Array.isArray(value))
|
|
140
|
+
return value.flatMap((item) => collectStrings(item));
|
|
141
|
+
if (typeof value === 'object' && value !== null) {
|
|
142
|
+
return Object.values(value).flatMap((item) => collectStrings(item));
|
|
143
|
+
}
|
|
144
|
+
return [];
|
|
145
|
+
}
|
|
146
|
+
function lineOf(source, needle) {
|
|
147
|
+
const index = source.indexOf(needle);
|
|
148
|
+
if (index === -1)
|
|
149
|
+
return 1;
|
|
150
|
+
return source.slice(0, index).split('\n').length;
|
|
151
|
+
}
|
|
152
|
+
/** Every source file below `root`, skipping what a bundler would never read. */
|
|
153
|
+
async function* sourceFiles(root) {
|
|
154
|
+
let entries;
|
|
155
|
+
try {
|
|
156
|
+
entries = await readdir(root, { withFileTypes: true, encoding: 'utf8' });
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
throw new CogentaError({
|
|
160
|
+
code: 'THEME_NOT_FOUND',
|
|
161
|
+
message: `The theme directory "${root}" cannot be read.`,
|
|
162
|
+
hint: 'Check the theme root in the configuration, and that the theme package is installed.',
|
|
163
|
+
cause: error,
|
|
164
|
+
details: { root },
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
for (const entry of entries) {
|
|
168
|
+
const path = join(root, entry.name);
|
|
169
|
+
if (entry.isDirectory()) {
|
|
170
|
+
if (IGNORED_DIRECTORIES.includes(entry.name))
|
|
171
|
+
continue;
|
|
172
|
+
yield* sourceFiles(path);
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
if (SCANNED_EXTENSIONS.some((extension) => entry.name.endsWith(extension)))
|
|
176
|
+
yield path;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=verify-theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-theme.js","sourceRoot":"","sources":["../../../src/theme/verify/verify-theme.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cogenta/render",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Astro integration, render context and theme installation checks.",
|
|
5
|
+
"license": "MPL-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"engines": {
|
|
18
|
+
"node": ">=22.11.0"
|
|
19
|
+
},
|
|
20
|
+
"publishConfig": {
|
|
21
|
+
"access": "public",
|
|
22
|
+
"provenance": true
|
|
23
|
+
},
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "git+https://github.com/cogenta-cms/cogenta.git",
|
|
27
|
+
"directory": "packages/render"
|
|
28
|
+
},
|
|
29
|
+
"scripts": {
|
|
30
|
+
"build": "tsc -p tsconfig.json",
|
|
31
|
+
"typecheck": "tsc -p tsconfig.typecheck.json",
|
|
32
|
+
"test": "vitest run --passWithNoTests",
|
|
33
|
+
"test:integration": "vitest run --config vitest.integration.config.ts --passWithNoTests"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@cogenta/blocks": "workspace:*",
|
|
37
|
+
"@cogenta/core": "workspace:*",
|
|
38
|
+
"wasm-vips": "catalog:",
|
|
39
|
+
"zod": "catalog:"
|
|
40
|
+
},
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"astro": "catalog:",
|
|
43
|
+
"sharp": "catalog:"
|
|
44
|
+
},
|
|
45
|
+
"peerDependenciesMeta": {
|
|
46
|
+
"sharp": {
|
|
47
|
+
"optional": true
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"astro": "catalog:",
|
|
52
|
+
"sharp": "catalog:",
|
|
53
|
+
"typescript": "catalog:",
|
|
54
|
+
"vitest": "catalog:"
|
|
55
|
+
}
|
|
56
|
+
}
|