usedesign 1.4.1 → 1.4.3
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/checks.js +8 -10
- package/dist/checks.js.map +1 -1
- package/dist/cli.js +60 -16
- package/dist/cli.js.map +1 -1
- package/dist/core.d.ts +38 -0
- package/dist/core.js +270 -39
- package/dist/core.js.map +1 -1
- package/dist/preview.js +6 -7
- package/dist/preview.js.map +1 -1
- package/dist/validate.js +141 -106
- package/dist/validate.js.map +1 -1
- package/package.json +1 -1
package/dist/core.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* tool needs. Nothing here decides anything about a card — the rules live in `validate.ts` and
|
|
4
4
|
* `checks.ts`, so that a change to a rule never hides inside a helper.
|
|
5
5
|
*/
|
|
6
|
-
import { readFileSync, existsSync, readdirSync, statSync } from "node:fs";
|
|
7
|
-
import { dirname, join, resolve, sep } from "node:path";
|
|
6
|
+
import { closeSync, openSync, readFileSync, existsSync, lstatSync, readdirSync, realpathSync, statSync } from "node:fs";
|
|
7
|
+
import { basename, dirname, join, resolve, sep } from "node:path";
|
|
8
8
|
import { parse as parseYaml } from "yaml";
|
|
9
9
|
export class Finding {
|
|
10
10
|
code;
|
|
@@ -42,6 +42,53 @@ export function frontMatter(path) {
|
|
|
42
42
|
const parsed = parseYaml(text.slice(3, end));
|
|
43
43
|
return parsed && typeof parsed === "object" ? parsed : null;
|
|
44
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Why a collected path cannot be opened as a file, or "" when it can (1.4.2). A link that leads
|
|
47
|
+
* nowhere and a file without read permission are entries a listing finds and a reader cannot
|
|
48
|
+
* open. Before, this implementation dropped the first unseen and called the second "front matter
|
|
49
|
+
* is not valid YAML", and the Python prototype stopped on both with a traceback. The words are
|
|
50
|
+
* the same in both implementations.
|
|
51
|
+
*/
|
|
52
|
+
export function whyUnreadable(path) {
|
|
53
|
+
if (!existsSync(path))
|
|
54
|
+
return "it is a link to a path that does not exist";
|
|
55
|
+
if (isDirectory(path))
|
|
56
|
+
return "it is a directory";
|
|
57
|
+
try {
|
|
58
|
+
closeSync(openSync(path, "r"));
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
return causeOf(e);
|
|
62
|
+
}
|
|
63
|
+
return "";
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The cause of a system error, in the words both implementations print (1.4.2). A file another
|
|
67
|
+
* process holds open on Windows is EBUSY here and a permission error in Python, so it is
|
|
68
|
+
* "permission denied" in both.
|
|
69
|
+
*/
|
|
70
|
+
export function causeOf(e) {
|
|
71
|
+
const code = e.code ?? "";
|
|
72
|
+
return ["EACCES", "EPERM", "EBUSY"].includes(code) ? "permission denied" : code || String(e.message);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* The front matter of a document a config's patterns matched (1.4.2). A file nobody can open and
|
|
76
|
+
* front matter that is not valid YAML stop the run with the file's name: no check can pass over a
|
|
77
|
+
* card it did not read. Before, the second stopped it with the parser's words alone.
|
|
78
|
+
*/
|
|
79
|
+
export function readDocument(path) {
|
|
80
|
+
const why = whyUnreadable(path);
|
|
81
|
+
if (why)
|
|
82
|
+
throw new Error(`\`${path}\` cannot be read — ${why}`);
|
|
83
|
+
try {
|
|
84
|
+
return frontMatter(path);
|
|
85
|
+
}
|
|
86
|
+
catch (e) {
|
|
87
|
+
if (e.syscall)
|
|
88
|
+
throw new Error(`\`${path}\` cannot be read — ${causeOf(e)}`);
|
|
89
|
+
throw new Error(`\`${path}\` front matter is not valid YAML — ${String(e.message).split("\n")[0]}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
45
92
|
/**
|
|
46
93
|
* Every key the config may carry. Enforced at load, not merely published in the schema: measured
|
|
47
94
|
* on issue #4 — `cheks:` was accepted silently, the scoping vanished, and the check it was meant
|
|
@@ -65,71 +112,248 @@ export function loadConfig(path) {
|
|
|
65
112
|
}
|
|
66
113
|
return { config, base: dirname(resolve(path)) };
|
|
67
114
|
}
|
|
68
|
-
/**
|
|
115
|
+
/**
|
|
116
|
+
* Translate one glob segment into a regular expression. `*` and `?` do not cross a separator, and
|
|
117
|
+
* `?` is one character — one code point, as in the Python prototype: without the `u` flag it was
|
|
118
|
+
* one UTF-16 unit, and `?.op.md` missed `😀.op.md` (1.4.3).
|
|
119
|
+
*/
|
|
69
120
|
function segmentToRegExp(segment) {
|
|
70
121
|
const escaped = segment.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, "[^/\\\\]*").replace(/\?/g, "[^/\\\\]");
|
|
71
|
-
return new RegExp(`^${escaped}
|
|
122
|
+
return new RegExp(`^${escaped}$`, "u");
|
|
123
|
+
}
|
|
124
|
+
/** Whether `path` leads to a directory, through a link too; false where nothing can be read. */
|
|
125
|
+
function isDirectory(path) {
|
|
126
|
+
try {
|
|
127
|
+
return statSync(path).isDirectory();
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Whether anything stands at `path`, a link that leads nowhere included (1.4.2). Only "does not
|
|
135
|
+
* exist" is absence: an entry the system lists and will not describe — no permission, a link made
|
|
136
|
+
* by another system — goes on to the reader, which names it.
|
|
137
|
+
*/
|
|
138
|
+
function isEntry(path) {
|
|
139
|
+
try {
|
|
140
|
+
lstatSync(path);
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
catch (e) {
|
|
144
|
+
const code = e.code;
|
|
145
|
+
return code !== "ENOENT" && code !== "ENOTDIR";
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* The real path of `path` (1.4.2). For an entry the system will not resolve — a link that leads
|
|
150
|
+
* nowhere, on Windows a file without read permission — the real path of its directory and its own
|
|
151
|
+
* name, so that such an entry reached two ways is still one entry.
|
|
152
|
+
*/
|
|
153
|
+
function realOf(path) {
|
|
154
|
+
try {
|
|
155
|
+
return realpathSync.native(path);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
try {
|
|
159
|
+
return join(realpathSync.native(dirname(path)), basename(path));
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return resolve(path);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* The entries of a directory a pattern walks into (1.4.2). One that cannot be listed stops the run
|
|
168
|
+
* with its name, as a file that cannot be opened does: the cards under it would go unseen.
|
|
169
|
+
*/
|
|
170
|
+
function listing(dir) {
|
|
171
|
+
try {
|
|
172
|
+
return readdirSync(dir, { withFileTypes: true });
|
|
173
|
+
}
|
|
174
|
+
catch (e) {
|
|
175
|
+
throw new Error(`\`${dir}\` cannot be listed — ${causeOf(e)}`);
|
|
176
|
+
}
|
|
72
177
|
}
|
|
73
178
|
/**
|
|
74
179
|
* Expand a glob relative to `base`. Supports `*`, `?` and `**`; enough for `cards:` patterns and
|
|
75
180
|
* small enough to keep the tool dependency-light, which matters for something meant to be run
|
|
76
181
|
* with `npx` inside somebody else's CI.
|
|
182
|
+
*
|
|
183
|
+
* The Python implementation walks with the same algorithm, step for step, so that both collect the
|
|
184
|
+
* same files (1.4.2): links to directories are followed, and a loop of them is walked once; a name
|
|
185
|
+
* that starts with a dot is matched only by a segment that starts with a dot, and `**` passes it
|
|
186
|
+
* over; `[` and `]` are plain characters; letter case counts. Every entry whose name matches is
|
|
187
|
+
* returned, a link that leads nowhere included, so that the reader names it; directories are not.
|
|
77
188
|
*/
|
|
78
189
|
export function expandGlob(base, pattern) {
|
|
190
|
+
return once(expandKeyed(base, pattern));
|
|
191
|
+
}
|
|
192
|
+
/** Every file the patterns match, once however many of them reach it (1.4.3). */
|
|
193
|
+
export function expandGlobs(base, patterns) {
|
|
194
|
+
const keyed = new Map();
|
|
195
|
+
for (const pattern of patterns)
|
|
196
|
+
for (const [path, real] of expandKeyed(base, pattern))
|
|
197
|
+
put(keyed, path, real);
|
|
198
|
+
return once(keyed);
|
|
199
|
+
}
|
|
200
|
+
function put(map, path, value) {
|
|
201
|
+
if (!map.has(path))
|
|
202
|
+
map.set(path, value);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* What a directory listing says an entry is: "dir", "file", or null for a link, which only the
|
|
206
|
+
* system can follow, and for an entry whose type the listing did not give.
|
|
207
|
+
*/
|
|
208
|
+
function kindOf(entry) {
|
|
209
|
+
if (entry.isSymbolicLink())
|
|
210
|
+
return null;
|
|
211
|
+
if (entry.isDirectory())
|
|
212
|
+
return "dir";
|
|
213
|
+
if (entry.isFile() || entry.isFIFO() || entry.isSocket() || entry.isBlockDevice() || entry.isCharacterDevice())
|
|
214
|
+
return "file";
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
/** Whether the walk can go into `path`: a directory, by what is known or by asking. */
|
|
218
|
+
function walkable(path, known) {
|
|
219
|
+
return known === null ? isDirectory(path) : known[0] === "dir";
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Every file `pattern` matches under `base`, with its real path — not yet once per file.
|
|
223
|
+
*
|
|
224
|
+
* What a directory listing told is not asked of the system again (1.4.3): an entry that is not a
|
|
225
|
+
* link is a file or a directory, and its real path is its directory's real path and its name. Only
|
|
226
|
+
* links and the names a pattern spells out are asked. `**` and a wildcard segment after it read
|
|
227
|
+
* each directory once: the segment is matched in the listing `**` walks with. Measured on 24 000
|
|
228
|
+
* files before the change: the listing read twice, and a real path, a type and an existence asked
|
|
229
|
+
* per file. See the Python twin.
|
|
230
|
+
*/
|
|
231
|
+
function expandKeyed(base, pattern) {
|
|
79
232
|
const segments = pattern.split(/[\\/]+/).filter((s) => s.length > 0);
|
|
80
|
-
let current = [resolve(base)];
|
|
81
|
-
for (
|
|
82
|
-
const
|
|
83
|
-
|
|
233
|
+
let current = new Map([[resolve(base), null]]);
|
|
234
|
+
for (let index = 0; index < segments.length; index++) {
|
|
235
|
+
const segment = segments[index];
|
|
236
|
+
let last = index === segments.length - 1;
|
|
237
|
+
const found = new Map();
|
|
84
238
|
if (segment === "**") {
|
|
85
|
-
|
|
86
|
-
|
|
239
|
+
const after = last ? "" : segments[index + 1];
|
|
240
|
+
const fused = after !== "" && after !== "**" && after !== "." && after !== ".." && /[*?]/.test(after);
|
|
241
|
+
const matcher = fused ? segmentToRegExp(after) : null;
|
|
242
|
+
const dotted = after.startsWith(".");
|
|
243
|
+
if (fused)
|
|
244
|
+
last = ++index === segments.length - 1;
|
|
245
|
+
for (const [dir, known] of current) {
|
|
246
|
+
if (!walkable(dir, known))
|
|
247
|
+
continue;
|
|
248
|
+
// Each directory carries its real path and those of the directories above it: a link back
|
|
249
|
+
// to one of them would be walked forever and is walked once. The system is asked for a real
|
|
250
|
+
// path only at the start and at a link; below that, the parent's real path and the name are it.
|
|
251
|
+
const stack = [{ here: dir, real: realOf(dir), above: [] }];
|
|
87
252
|
while (stack.length) {
|
|
88
|
-
const here = stack.pop();
|
|
89
|
-
|
|
90
|
-
if (!
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
253
|
+
const { here, real, above } = stack.pop();
|
|
254
|
+
const looped = above.includes(real);
|
|
255
|
+
if (!fused) {
|
|
256
|
+
put(found, here, ["dir", real]);
|
|
257
|
+
if (looped)
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
for (const entry of listing(here)) {
|
|
261
|
+
const name = entry.name;
|
|
262
|
+
const path = join(here, name);
|
|
263
|
+
const kind = kindOf(entry);
|
|
264
|
+
let linkedDir; // whether a link leads to a directory, asked once
|
|
265
|
+
if (matcher && !(name.startsWith(".") && !dotted) && matcher.test(name)) {
|
|
266
|
+
if (kind === null)
|
|
267
|
+
linkedDir = isDirectory(path);
|
|
268
|
+
if (last || kind === "dir" || linkedDir)
|
|
269
|
+
put(found, path, kind ? [kind, join(real, name)] : null);
|
|
270
|
+
}
|
|
271
|
+
// A directory a link leads back to is matched in, not walked again.
|
|
272
|
+
if (looped || name.startsWith("."))
|
|
273
|
+
continue;
|
|
274
|
+
if (kind === "dir")
|
|
275
|
+
stack.push({ here: path, real: join(real, name), above: [...above, real] });
|
|
276
|
+
// `Dirent.isDirectory()` is false for a link and for a Windows junction (1.4.2).
|
|
277
|
+
else if (kind === null && (linkedDir ?? isDirectory(path)))
|
|
278
|
+
stack.push({ here: path, real: realOf(path), above: [...above, real] });
|
|
279
|
+
// `**` at the end matches files as well (1.4.2): `cards/**` found nothing here.
|
|
280
|
+
else if (last && !fused)
|
|
281
|
+
put(found, path, kind ? [kind, join(real, name)] : null);
|
|
95
282
|
}
|
|
96
283
|
}
|
|
97
284
|
}
|
|
98
285
|
}
|
|
99
286
|
else if (segment === "." || segment === "..") {
|
|
100
|
-
|
|
287
|
+
for (const dir of current.keys())
|
|
288
|
+
put(found, resolve(dir, segment), null);
|
|
101
289
|
}
|
|
102
290
|
else if (!/[*?]/.test(segment)) {
|
|
103
|
-
|
|
291
|
+
for (const dir of current.keys())
|
|
292
|
+
put(found, join(dir, segment), null);
|
|
104
293
|
}
|
|
105
294
|
else {
|
|
106
295
|
const matcher = segmentToRegExp(segment);
|
|
107
|
-
|
|
108
|
-
|
|
296
|
+
const dotted = segment.startsWith(".");
|
|
297
|
+
for (const [dir, known] of current) {
|
|
298
|
+
if (!walkable(dir, known))
|
|
109
299
|
continue;
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
300
|
+
let real = ""; // the directory's real path, asked once and only if a match needs it
|
|
301
|
+
for (const entry of listing(dir)) {
|
|
302
|
+
if ((entry.name.startsWith(".") && !dotted) || !matcher.test(entry.name))
|
|
303
|
+
continue;
|
|
304
|
+
const path = join(dir, entry.name);
|
|
305
|
+
const kind = kindOf(entry);
|
|
306
|
+
if (last || kind === "dir" || (kind === null && isDirectory(path))) {
|
|
307
|
+
if (kind && !real)
|
|
308
|
+
real = realOf(dir);
|
|
309
|
+
put(found, path, kind ? [kind, join(real, entry.name)] : null);
|
|
310
|
+
}
|
|
113
311
|
}
|
|
114
312
|
}
|
|
115
313
|
}
|
|
116
|
-
current =
|
|
314
|
+
current = found;
|
|
315
|
+
}
|
|
316
|
+
const keyed = new Map();
|
|
317
|
+
for (const [path, known] of current) {
|
|
318
|
+
if (known === null) {
|
|
319
|
+
if (isEntry(path) && !isDirectory(path))
|
|
320
|
+
keyed.set(path, realOf(path));
|
|
321
|
+
}
|
|
322
|
+
else if (known[0] === "file")
|
|
323
|
+
keyed.set(path, known[1]);
|
|
117
324
|
}
|
|
118
|
-
return
|
|
325
|
+
return keyed;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Paths in order, each file once however many links or patterns lead to it (1.4.2). A loop of
|
|
329
|
+
* links gave the same card here twice and in Python's glob once per level, and two patterns that
|
|
330
|
+
* reach one card through a link gave it here twice.
|
|
331
|
+
*/
|
|
332
|
+
export function oncePerFile(paths) {
|
|
333
|
+
return once(new Map(paths.map((path) => [path, realOf(path)])));
|
|
334
|
+
}
|
|
335
|
+
/** Paths in order, each real path once — the first path in that order stands for it. */
|
|
336
|
+
export function once(keyed) {
|
|
337
|
+
const seen = new Set();
|
|
338
|
+
const out = [];
|
|
339
|
+
for (const path of [...keyed.keys()].sort()) {
|
|
340
|
+
const key = keyed.get(path);
|
|
341
|
+
if (seen.has(key))
|
|
342
|
+
continue;
|
|
343
|
+
seen.add(key);
|
|
344
|
+
out.push(path);
|
|
345
|
+
}
|
|
346
|
+
return out;
|
|
119
347
|
}
|
|
120
348
|
/** Every card the config points at, as [id, front matter]. */
|
|
121
349
|
export function loadCardFiles(config, base) {
|
|
122
350
|
const findings = [];
|
|
123
|
-
const files =
|
|
124
|
-
|
|
125
|
-
for (const file of expandGlob(base, pattern))
|
|
126
|
-
files.add(file);
|
|
127
|
-
}
|
|
128
|
-
if (files.size === 0)
|
|
351
|
+
const files = expandGlobs(base, config.cards ?? []);
|
|
352
|
+
if (files.length === 0)
|
|
129
353
|
findings.push(new Finding("no_cards_found", "the `cards` patterns matched nothing"));
|
|
130
354
|
const cards = [];
|
|
131
|
-
for (const path of
|
|
132
|
-
const fm =
|
|
355
|
+
for (const path of files) {
|
|
356
|
+
const fm = readDocument(path);
|
|
133
357
|
if (fm)
|
|
134
358
|
cards.push([String(fm["id"] ?? path.split(sep).pop()), fm]);
|
|
135
359
|
}
|
|
@@ -137,16 +361,23 @@ export function loadCardFiles(config, base) {
|
|
|
137
361
|
}
|
|
138
362
|
/** Collect `*.op.md` and `*.contract.md` under the given files or directories. */
|
|
139
363
|
export function collectCards(paths) {
|
|
140
|
-
|
|
364
|
+
return once(collectKeyed(paths));
|
|
365
|
+
}
|
|
366
|
+
/** The cards and contracts under the given files or directories, each with its real path (1.4.3). */
|
|
367
|
+
export function collectKeyed(paths) {
|
|
368
|
+
const keyed = new Map();
|
|
141
369
|
for (const path of paths) {
|
|
142
|
-
if (
|
|
370
|
+
if (isDirectory(path)) {
|
|
143
371
|
// Both document kinds, deliberately: `validate forms/` used to collect nothing and print
|
|
144
372
|
// "0 card(s): 0 error(s)" — a green verdict on a directory it had not read.
|
|
145
|
-
|
|
373
|
+
for (const pattern of ["**/*.op.md", "**/*.contract.md"]) {
|
|
374
|
+
for (const [found, real] of expandKeyed(path, pattern))
|
|
375
|
+
put(keyed, found, real);
|
|
376
|
+
}
|
|
146
377
|
}
|
|
147
378
|
else
|
|
148
|
-
|
|
379
|
+
put(keyed, path, realOf(path));
|
|
149
380
|
}
|
|
150
|
-
return
|
|
381
|
+
return keyed;
|
|
151
382
|
}
|
|
152
383
|
//# sourceMappingURL=core.js.map
|
package/dist/core.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
|
package/dist/preview.js
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
15
15
|
import { join } from "node:path";
|
|
16
|
-
import {
|
|
16
|
+
import { expandGlobs, readDocument } from "./core.js";
|
|
17
17
|
function bodyOf(path) {
|
|
18
18
|
const text = readFileSync(path, "utf8").replace(/^/, "").replace(/\r\n/g, "\n");
|
|
19
19
|
const end = text.indexOf("\n---", 3);
|
|
@@ -21,12 +21,11 @@ function bodyOf(path) {
|
|
|
21
21
|
}
|
|
22
22
|
export function collectPreviewData(config, base) {
|
|
23
23
|
const contracts = [];
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
24
|
+
// Each contract once, however many patterns reach it (1.4.2).
|
|
25
|
+
for (const file of expandGlobs(base, config.forms ?? [])) {
|
|
26
|
+
const fm = readDocument(file);
|
|
27
|
+
if (fm && fm["usedesign_form"] === 1)
|
|
28
|
+
contracts.push({ ...fm, __body: bodyOf(file), __file: file.split(/[\\/]/).pop() });
|
|
30
29
|
}
|
|
31
30
|
let inventory = null;
|
|
32
31
|
let producedBy = "";
|
package/dist/preview.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../src/preview.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAU,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../src/preview.ts"],"names":[],"mappings":"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"}
|