@x12i/made-easy 0.0.0-stage → 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 +57 -2
- package/dist/analysis.d.ts +19 -0
- package/dist/analysis.d.ts.map +1 -0
- package/dist/analysis.js +90 -0
- package/dist/analysis.js.map +1 -0
- package/dist/build.d.ts +36 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +260 -0
- package/dist/build.js.map +1 -0
- package/dist/contracts/api.d.ts +447 -0
- package/dist/contracts/api.d.ts.map +1 -0
- package/dist/contracts/api.js +152 -0
- package/dist/contracts/api.js.map +1 -0
- package/dist/contracts/blocks.d.ts +221 -0
- package/dist/contracts/blocks.d.ts.map +1 -0
- package/dist/contracts/blocks.js +392 -0
- package/dist/contracts/blocks.js.map +1 -0
- package/dist/contracts/diagnostics.d.ts +111 -0
- package/dist/contracts/diagnostics.d.ts.map +1 -0
- package/dist/contracts/diagnostics.js +122 -0
- package/dist/contracts/diagnostics.js.map +1 -0
- package/dist/contracts/index.d.ts +11 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +11 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/json-schema.d.ts +5 -0
- package/dist/contracts/json-schema.d.ts.map +1 -0
- package/dist/contracts/json-schema.js +41 -0
- package/dist/contracts/json-schema.js.map +1 -0
- package/dist/contracts/recipe.d.ts +535 -0
- package/dist/contracts/recipe.d.ts.map +1 -0
- package/dist/contracts/recipe.js +380 -0
- package/dist/contracts/recipe.js.map +1 -0
- package/dist/contracts/schemas.d.ts +413 -0
- package/dist/contracts/schemas.d.ts.map +1 -0
- package/dist/contracts/schemas.js +205 -0
- package/dist/contracts/schemas.js.map +1 -0
- package/dist/draft.d.ts +157 -0
- package/dist/draft.d.ts.map +1 -0
- package/dist/draft.js +254 -0
- package/dist/draft.js.map +1 -0
- package/dist/emit-assets.d.ts +2 -0
- package/dist/emit-assets.d.ts.map +1 -0
- package/dist/emit-assets.js +27 -0
- package/dist/emit-assets.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown-doc.d.ts +59 -0
- package/dist/markdown-doc.d.ts.map +1 -0
- package/dist/markdown-doc.js +187 -0
- package/dist/markdown-doc.js.map +1 -0
- package/dist/model.d.ts +54 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +244 -0
- package/dist/model.js.map +1 -0
- package/dist/normalize.d.ts +63 -0
- package/dist/normalize.d.ts.map +1 -0
- package/dist/normalize.js +54 -0
- package/dist/normalize.js.map +1 -0
- package/dist/npm.d.ts +24 -0
- package/dist/npm.d.ts.map +1 -0
- package/dist/npm.js +51 -0
- package/dist/npm.js.map +1 -0
- package/dist/render/blocks.d.ts +17 -0
- package/dist/render/blocks.d.ts.map +1 -0
- package/dist/render/blocks.js +384 -0
- package/dist/render/blocks.js.map +1 -0
- package/dist/render/brief.d.ts +77 -0
- package/dist/render/brief.d.ts.map +1 -0
- package/dist/render/brief.js +62 -0
- package/dist/render/brief.js.map +1 -0
- package/dist/render/context.d.ts +43 -0
- package/dist/render/context.d.ts.map +1 -0
- package/dist/render/context.js +88 -0
- package/dist/render/context.js.map +1 -0
- package/dist/render/html.d.ts +19 -0
- package/dist/render/html.d.ts.map +1 -0
- package/dist/render/html.js +178 -0
- package/dist/render/html.js.map +1 -0
- package/dist/render/markdown-out.d.ts +11 -0
- package/dist/render/markdown-out.d.ts.map +1 -0
- package/dist/render/markdown-out.js +121 -0
- package/dist/render/markdown-out.js.map +1 -0
- package/dist/render/pdf.d.ts +23 -0
- package/dist/render/pdf.d.ts.map +1 -0
- package/dist/render/pdf.js +138 -0
- package/dist/render/pdf.js.map +1 -0
- package/dist/render/prose.d.ts +15 -0
- package/dist/render/prose.d.ts.map +1 -0
- package/dist/render/prose.js +110 -0
- package/dist/render/prose.js.map +1 -0
- package/dist/scaffold.d.ts +13 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +393 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/sdk.d.ts +56 -0
- package/dist/sdk.d.ts.map +1 -0
- package/dist/sdk.js +238 -0
- package/dist/sdk.js.map +1 -0
- package/dist/source.d.ts +57 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +289 -0
- package/dist/source.js.map +1 -0
- package/dist/theme/book.d.ts +10 -0
- package/dist/theme/book.d.ts.map +1 -0
- package/dist/theme/book.js +198 -0
- package/dist/theme/book.js.map +1 -0
- package/dist/util.d.ts +14 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +69 -0
- package/dist/util.js.map +1 -0
- package/dist/validate.d.ts +36 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +986 -0
- package/dist/validate.js.map +1 -0
- package/dist/verify.d.ts +35 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +112 -0
- package/dist/verify.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +4 -0
- package/dist/version.js.map +1 -0
- package/dist/yamlfile.d.ts +22 -0
- package/dist/yamlfile.d.ts.map +1 -0
- package/dist/yamlfile.js +129 -0
- package/dist/yamlfile.js.map +1 -0
- package/package.json +64 -4
- package/recipes/index.json +282 -0
- package/recipes/shared-1.0.0.json +456 -0
- package/schemas/artifact.v1.json +36 -0
- package/schemas/assets.v1.json +61 -0
- package/schemas/block.v1.json +27 -0
- package/schemas/blocks/brief.v1.json +20 -0
- package/schemas/blocks/callout.v1.json +25 -0
- package/schemas/blocks/code.v1.json +21 -0
- package/schemas/blocks/decision.v1.json +80 -0
- package/schemas/blocks/evidence-comparison.v1.json +33 -0
- package/schemas/blocks/example.v1.json +52 -0
- package/schemas/blocks/figure.v1.json +22 -0
- package/schemas/blocks/human-action.v1.json +42 -0
- package/schemas/blocks/job-map.v1.json +170 -0
- package/schemas/blocks/pause.v1.json +25 -0
- package/schemas/blocks/reference-profile.v1.json +41 -0
- package/schemas/blocks/review-checklist.v1.json +19 -0
- package/schemas/blocks/table.v1.json +59 -0
- package/schemas/brief.v1.json +157 -0
- package/schemas/build-request.v1.json +173 -0
- package/schemas/build-result.v1.json +171 -0
- package/schemas/checks.v1.json +149 -0
- package/schemas/create-request.v1.json +47 -0
- package/schemas/diagnostic.v1.json +50 -0
- package/schemas/draft-request.v1.json +196 -0
- package/schemas/guide.v1.json +172 -0
- package/schemas/job.v1.json +107 -0
- package/schemas/preview-request.v1.json +153 -0
- package/schemas/preview-result.v1.json +84 -0
- package/schemas/problem.v1.json +78 -0
- package/schemas/recipe-definition.v1.json +673 -0
- package/schemas/source-ref.v1.json +111 -0
- package/schemas/sources.v1.json +158 -0
- package/schemas/validate-request.v1.json +135 -0
- package/schemas/validate-result.v1.json +110 -0
- package/schemas/verification.v1.json +77 -0
- package/themes/book/1.0.0/theme.css +190 -0
- package/themes/book/1.0.0/theme.json +5 -0
package/dist/sdk.js
ADDED
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { dirname, join, resolve } from 'node:path';
|
|
3
|
+
import { parseDocument } from 'yaml';
|
|
4
|
+
import { BuildOptionsSchema, MadeEasyError, SourceRefSchema, summarizeDiagnostics, } from './contracts/index.js';
|
|
5
|
+
import { buildArtifacts, deliverFiles } from './build.js';
|
|
6
|
+
import { readGuide, entriesOf } from './model.js';
|
|
7
|
+
import { toNormalizedGuide } from './normalize.js';
|
|
8
|
+
import { parseMarkdownDoc } from './markdown-doc.js';
|
|
9
|
+
import { buildBriefDocument } from './render/brief.js';
|
|
10
|
+
import { renderPage } from './render/html.js';
|
|
11
|
+
import { renderBriefJson, renderBriefMarkdown, renderTrackMarkdown } from './render/markdown-out.js';
|
|
12
|
+
import { BundleFiles, DEFAULT_LIMITS, directorySource, memorySource, zipSource, checkBundlePath, } from './source.js';
|
|
13
|
+
import { validateModel } from './validate.js';
|
|
14
|
+
import { VERSION } from './version.js';
|
|
15
|
+
import { normalizeText, sha256Digest, slugify } from './util.js';
|
|
16
|
+
export async function resolveInput(input, options = {}) {
|
|
17
|
+
if (typeof input === 'string')
|
|
18
|
+
return directorySource(input);
|
|
19
|
+
if (input instanceof BundleFiles)
|
|
20
|
+
return input;
|
|
21
|
+
if ('list' in input && 'read' in input)
|
|
22
|
+
return input;
|
|
23
|
+
const ref = SourceRefSchema.parse(input);
|
|
24
|
+
switch (ref.kind) {
|
|
25
|
+
case 'path':
|
|
26
|
+
if (options.allowPath === false) {
|
|
27
|
+
throw new MadeEasyError('BUNDLE_PATH_UNSAFE', 'Local path sources are not accepted by this adapter. Send the files inline or reference a stored guide.');
|
|
28
|
+
}
|
|
29
|
+
return directorySource(ref.path);
|
|
30
|
+
case 'files':
|
|
31
|
+
return memorySource(ref.files, 'upload');
|
|
32
|
+
case 'zip':
|
|
33
|
+
return zipSource(Buffer.from(ref.base64, 'base64'), options.limits ?? DEFAULT_LIMITS);
|
|
34
|
+
case 'guide':
|
|
35
|
+
throw new MadeEasyError('SCHEMA_INVALID', 'Stored guide references are resolved by the hosted service, not the SDK.');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** Read and parse a bundle into the normalized model. Never throws for bad bundle content. */
|
|
39
|
+
export async function loadGuide(input, options = {}) {
|
|
40
|
+
try {
|
|
41
|
+
const source = await resolveInput(input, options);
|
|
42
|
+
return await readGuide(source, options.limits ?? DEFAULT_LIMITS);
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
if (e instanceof MadeEasyError)
|
|
46
|
+
throw e;
|
|
47
|
+
const code = e.code === 'BUNDLE_LIMIT_EXCEEDED' ? 'BUNDLE_LIMIT_EXCEEDED' : 'BUNDLE_FILE_MISSING';
|
|
48
|
+
throw new MadeEasyError(code, e.message);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function failureResult(e, make) {
|
|
52
|
+
if (e instanceof MadeEasyError)
|
|
53
|
+
return make(e.diagnostics);
|
|
54
|
+
throw e;
|
|
55
|
+
}
|
|
56
|
+
export async function validateGuide(input, options = {}) {
|
|
57
|
+
const mode = options.mode ?? 'draft';
|
|
58
|
+
try {
|
|
59
|
+
const model = await loadGuide(input, options);
|
|
60
|
+
const r = validateModel(model, { mode, audience: options.audience });
|
|
61
|
+
return {
|
|
62
|
+
ok: r.ok,
|
|
63
|
+
mode,
|
|
64
|
+
guideId: r.guideId,
|
|
65
|
+
revision: r.revision,
|
|
66
|
+
referenceRevision: r.referenceRevision,
|
|
67
|
+
summary: r.summary,
|
|
68
|
+
diagnostics: r.diagnostics,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
return failureResult(e, (diagnostics) => ({ ok: false, mode, summary: summarizeDiagnostics(diagnostics), diagnostics }));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export async function previewGuide(input, request = {}) {
|
|
76
|
+
const track = request.track ?? 'human';
|
|
77
|
+
const format = request.format ?? 'html';
|
|
78
|
+
const mode = request.mode ?? 'draft';
|
|
79
|
+
const mediaType = format === 'html' ? 'text/html' : format === 'markdown' ? 'text/markdown' : 'application/json';
|
|
80
|
+
const empty = (diagnostics, revision) => ({ ok: false, track, format, mediaType, revision, diagnostics });
|
|
81
|
+
let model;
|
|
82
|
+
try {
|
|
83
|
+
model = await loadGuide(input, request);
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
return failureResult(e, (d) => empty(d));
|
|
87
|
+
}
|
|
88
|
+
const report = validateModel(model, { mode, audience: request.audience });
|
|
89
|
+
if (!model.guide || report.diagnostics.some((d) => d.severity === 'error' && ['YAML_PARSE_ERROR', 'BUNDLE_FILE_MISSING'].includes(d.code) && d.path === 'guide.yaml')) {
|
|
90
|
+
return empty(report.diagnostics, report.revision);
|
|
91
|
+
}
|
|
92
|
+
let content;
|
|
93
|
+
if (format === 'json') {
|
|
94
|
+
content = track === 'brief' ? renderBriefJson(model) : `${JSON.stringify(toNormalizedGuide(model), null, 2)}\n`;
|
|
95
|
+
}
|
|
96
|
+
else if (format === 'markdown') {
|
|
97
|
+
content = track === 'brief' ? renderBriefMarkdown(buildBriefDocument(model)) : renderTrackMarkdown(model, track);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const page = track === 'operator' ? 'operator' : 'human';
|
|
101
|
+
const draft = mode === 'draft';
|
|
102
|
+
const assetSrc = (a) => {
|
|
103
|
+
const b = model.files.bytes(a.path);
|
|
104
|
+
return b ? `data:${a.mediaType};base64,${Buffer.from(b).toString('base64')}` : undefined;
|
|
105
|
+
};
|
|
106
|
+
content = renderPage({
|
|
107
|
+
model,
|
|
108
|
+
page,
|
|
109
|
+
version: VERSION,
|
|
110
|
+
standalone: true,
|
|
111
|
+
audience: request.audience,
|
|
112
|
+
draft,
|
|
113
|
+
draftNote: `${report.summary.errors} error(s), ${report.summary.warnings} warning(s).`,
|
|
114
|
+
assetSrc,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
return { ok: report.ok, track, format, mediaType, revision: report.revision, content, diagnostics: report.diagnostics };
|
|
118
|
+
}
|
|
119
|
+
function parseBuildOptions(options) {
|
|
120
|
+
const { mode, formats, paper, audience, zip, allowPartial } = options;
|
|
121
|
+
const picked = Object.fromEntries(Object.entries({ mode, formats, paper, audience, zip, allowPartial }).filter(([, v]) => v !== undefined));
|
|
122
|
+
return BuildOptionsSchema.parse(picked);
|
|
123
|
+
}
|
|
124
|
+
/** Build and keep every output in memory. Used by the hosted service. */
|
|
125
|
+
export async function buildGuideArtifacts(input, options = {}) {
|
|
126
|
+
const parsed = parseBuildOptions(options);
|
|
127
|
+
const model = await loadGuide(input, options);
|
|
128
|
+
const ab = await buildArtifacts(model, { ...parsed, browserPath: options.browserPath, signal: options.signal });
|
|
129
|
+
return { ...ab, guideId: model.guide?.guideId, revision: model.revision, referenceRevision: model.referenceRevision };
|
|
130
|
+
}
|
|
131
|
+
export async function buildGuide(input, options = {}) {
|
|
132
|
+
const parsed = parseBuildOptions(options);
|
|
133
|
+
let ab;
|
|
134
|
+
try {
|
|
135
|
+
ab = await buildGuideArtifacts(input, options);
|
|
136
|
+
}
|
|
137
|
+
catch (e) {
|
|
138
|
+
return failureResult(e, (diagnostics) => ({
|
|
139
|
+
ok: false,
|
|
140
|
+
status: 'failed',
|
|
141
|
+
mode: parsed.mode,
|
|
142
|
+
visibility: 'private',
|
|
143
|
+
complete: false,
|
|
144
|
+
summary: summarizeDiagnostics(diagnostics),
|
|
145
|
+
diagnostics,
|
|
146
|
+
artifacts: [],
|
|
147
|
+
}));
|
|
148
|
+
}
|
|
149
|
+
let diagnostics = ab.diagnostics;
|
|
150
|
+
let ok = ab.ok;
|
|
151
|
+
let status = ab.status;
|
|
152
|
+
if (ab.status !== 'failed' && options.out) {
|
|
153
|
+
const problem = await deliverFiles(options.out, ab.files, options.overwrite === true);
|
|
154
|
+
if (problem) {
|
|
155
|
+
diagnostics = [...diagnostics, problem];
|
|
156
|
+
ok = false;
|
|
157
|
+
status = 'failed';
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
ok,
|
|
162
|
+
status,
|
|
163
|
+
mode: parsed.mode,
|
|
164
|
+
guideId: ab.guideId,
|
|
165
|
+
revision: ab.revision,
|
|
166
|
+
referenceRevision: ab.referenceRevision,
|
|
167
|
+
visibility: ab.visibility,
|
|
168
|
+
complete: status === 'failed' ? false : ab.complete,
|
|
169
|
+
summary: summarizeDiagnostics(diagnostics),
|
|
170
|
+
diagnostics,
|
|
171
|
+
artifacts: status === 'failed' ? [] : ab.artifacts,
|
|
172
|
+
outDir: status !== 'failed' && options.out ? resolve(options.out) : undefined,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/* ------------------------------- bundle files ------------------------------ */
|
|
176
|
+
/** Write a bundle (relative path -> text) to a directory. Refuses unsafe paths; requires overwrite for non-empty targets. */
|
|
177
|
+
export async function writeBundle(files, dir, options = {}) {
|
|
178
|
+
const root = resolve(dir);
|
|
179
|
+
const { readdir } = await import('node:fs/promises');
|
|
180
|
+
const existing = await readdir(root).catch(() => []);
|
|
181
|
+
if (existing.length && !options.overwrite) {
|
|
182
|
+
throw new MadeEasyError('OUTPUT_EXISTS', `${dir} already exists and is not empty. Pass --overwrite to write into it.`);
|
|
183
|
+
}
|
|
184
|
+
const written = [];
|
|
185
|
+
for (const [rel, text] of Object.entries(files)) {
|
|
186
|
+
const check = checkBundlePath(rel);
|
|
187
|
+
if (!check.ok)
|
|
188
|
+
throw new MadeEasyError('BUNDLE_PATH_UNSAFE', `Refusing to write "${rel}": ${check.reason}.`);
|
|
189
|
+
const abs = join(root, ...check.path.split('/'));
|
|
190
|
+
await mkdir(dirname(abs), { recursive: true });
|
|
191
|
+
await writeFile(abs, text);
|
|
192
|
+
written.push(check.path);
|
|
193
|
+
}
|
|
194
|
+
return written.sort();
|
|
195
|
+
}
|
|
196
|
+
/** Record the current digest of every pinned operator-reference entry in brief.yaml (keeps comments). */
|
|
197
|
+
export async function pinGuide(input, options = {}) {
|
|
198
|
+
const model = await loadGuide(input, options);
|
|
199
|
+
const text = model.files.text('brief.yaml');
|
|
200
|
+
if (text === undefined)
|
|
201
|
+
throw new MadeEasyError('BUNDLE_FILE_MISSING', 'brief.yaml is missing.');
|
|
202
|
+
const doc = parseDocument(text);
|
|
203
|
+
const operator = new Map(entriesOf(model, 'operator').map((e) => [e.id, e]));
|
|
204
|
+
const wanted = options.all ? [...operator.keys()] : (model.brief?.operatorReference?.entries ?? []).map((p) => p.id);
|
|
205
|
+
const current = new Map((model.brief?.operatorReference?.entries ?? []).map((p) => [p.id, p.digest]));
|
|
206
|
+
const next = wanted.filter((id) => operator.has(id)).map((id) => ({ id, digest: operator.get(id).digest }));
|
|
207
|
+
doc.setIn(['operatorReference', 'entries'], doc.createNode(next));
|
|
208
|
+
const out = doc.toString({ lineWidth: 0 });
|
|
209
|
+
const entries = next.map((n) => ({ ...n, changed: current.get(n.id) !== n.digest }));
|
|
210
|
+
return { brief: normalizeText(out) === normalizeText(text) ? undefined : out, entries };
|
|
211
|
+
}
|
|
212
|
+
/** Add explicit `{#anchor}` to headings that lack one so links survive heading edits. Returns changed files. */
|
|
213
|
+
export async function stabilizeAnchors(input, options = {}) {
|
|
214
|
+
const model = await loadGuide(input, options);
|
|
215
|
+
const changed = {};
|
|
216
|
+
for (const entry of model.entries) {
|
|
217
|
+
const raw = model.files.text(entry.path);
|
|
218
|
+
if (raw === undefined)
|
|
219
|
+
continue;
|
|
220
|
+
const parsed = parseMarkdownDoc(entry.path, raw);
|
|
221
|
+
const lines = raw.replace(/\r\n?/g, '\n').split('\n');
|
|
222
|
+
let touched = false;
|
|
223
|
+
for (const h of parsed.headings) {
|
|
224
|
+
if (h.explicit)
|
|
225
|
+
continue;
|
|
226
|
+
const i = h.line - 1;
|
|
227
|
+
if (lines[i] !== undefined) {
|
|
228
|
+
lines[i] = `${lines[i].replace(/[ \t]+$/, '')} {#${h.anchor || slugify(h.text)}}`;
|
|
229
|
+
touched = true;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
if (touched)
|
|
233
|
+
changed[entry.path] = lines.join('\n');
|
|
234
|
+
}
|
|
235
|
+
return changed;
|
|
236
|
+
}
|
|
237
|
+
export { sha256Digest };
|
|
238
|
+
//# sourceMappingURL=sdk.js.map
|
package/dist/sdk.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,oBAAoB,GASrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAsB,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,SAAS,EAAmB,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACrG,OAAO,EACL,WAAW,EACX,cAAc,EACd,eAAe,EACf,YAAY,EACZ,SAAS,EACT,eAAe,GAGhB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWjE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAiB,EAAE,UAAuB,EAAE;IAC7E,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,KAAK,YAAY,WAAW;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK;QAAE,OAAO,KAAqB,CAAC;IACrE,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;gBAChC,MAAM,IAAI,aAAa,CAAC,oBAAoB,EAAE,yGAAyG,CAAC,CAAC;YAC3J,CAAC;YACD,OAAO,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,KAAK,OAAO;YACV,OAAO,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC3C,KAAK,KAAK;YACR,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC,CAAC;QACxF,KAAK,OAAO;YACV,MAAM,IAAI,aAAa,CAAC,gBAAgB,EAAE,0EAA0E,CAAC,CAAC;IAC1H,CAAC;AACH,CAAC;AAED,8FAA8F;AAC9F,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAiB,EAAE,UAAuB,EAAE;IAC1E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,MAAM,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,aAAa;YAAE,MAAM,CAAC,CAAC;QACxC,MAAM,IAAI,GAAI,CAAuB,CAAC,IAAI,KAAK,uBAAuB,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,qBAAqB,CAAC;QACzH,MAAM,IAAI,aAAa,CAAC,IAAI,EAAG,CAAW,CAAC,OAAO,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAA0C,CAAU,EAAE,IAA4B;IACtG,IAAI,CAAC,YAAY,aAAa;QAAE,OAAO,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC3D,MAAM,CAAC,CAAC;AACV,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAiB,EAAE,UAAgC,EAAE;IACvF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,aAAa,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrE,OAAO;YACL,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI;YACJ,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,iBAAiB,EAAE,CAAC,CAAC,iBAAiB;YACtC,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,WAAW,EAAE,CAAC,CAAC,WAAW;SAC3B,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,aAAa,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,oBAAoB,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;IAC3H,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAiB,EAAE,UAAiE,EAAE;IACvH,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC;IACvC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC;IACxC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC;IACrC,MAAM,SAAS,GAAG,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,kBAAkB,CAAC;IACjH,MAAM,KAAK,GAAG,CAAC,WAAyB,EAAE,QAAiB,EAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;IAChJ,IAAI,KAAiB,CAAC;IACtB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1E,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,EAAE,CAAC;QACtK,OAAO,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,OAAe,CAAC;IACpB,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IAClH,CAAC;SAAM,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,OAAO,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACnH,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;QACzD,MAAM,KAAK,GAAG,IAAI,KAAK,OAAO,CAAC;QAC/B,MAAM,QAAQ,GAAG,CAAC,CAAsC,EAAE,EAAE;YAC1D,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACpC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,SAAS,WAAW,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3F,CAAC,CAAC;QACF,OAAO,GAAG,UAAU,CAAC;YACnB,KAAK;YACL,IAAI;YACJ,OAAO,EAAE,OAAO;YAChB,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK;YACL,SAAS,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,cAAc,MAAM,CAAC,OAAO,CAAC,QAAQ,cAAc;YACtF,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;AAC1H,CAAC;AAUD,SAAS,iBAAiB,CAAC,OAA0B;IACnD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IACtE,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC;IAC5I,OAAO,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAiB,EAAE,UAA6B,EAAE;IAC1F,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAChH,OAAO,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,EAAE,CAAC;AACxH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAiB,EAAE,UAA6B,EAAE;IACjF,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,EAAmD,CAAC;IACxD,IAAI,CAAC;QACH,EAAE,GAAG,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,aAAa,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YACxC,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,QAAiB;YACzB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,UAAU,EAAE,SAAkB;YAC9B,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,oBAAoB,CAAC,WAAW,CAAC;YAC1C,WAAW;YACX,SAAS,EAAE,EAAE;SACd,CAAC,CAAC,CAAC;IACN,CAAC;IACD,IAAI,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC;IACjC,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IACf,IAAI,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;IACvB,IAAI,EAAE,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC;QACtF,IAAI,OAAO,EAAE,CAAC;YACZ,WAAW,GAAG,CAAC,GAAG,WAAW,EAAE,OAAO,CAAC,CAAC;YACxC,EAAE,GAAG,KAAK,CAAC;YACX,MAAM,GAAG,QAAQ,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO;QACL,EAAE;QACF,MAAM;QACN,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,EAAE,CAAC,OAAO;QACnB,QAAQ,EAAE,EAAE,CAAC,QAAQ;QACrB,iBAAiB,EAAE,EAAE,CAAC,iBAAiB;QACvC,UAAU,EAAE,EAAE,CAAC,UAAU;QACzB,QAAQ,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ;QACnD,OAAO,EAAE,oBAAoB,CAAC,WAAW,CAAC;QAC1C,WAAW;QACX,SAAS,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS;QAClD,MAAM,EAAE,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;KAC9E,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,6HAA6H;AAC7H,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAA6B,EAAE,GAAW,EAAE,UAAmC,EAAE;IACjH,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAc,CAAC,CAAC;IACjE,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAC1C,MAAM,IAAI,aAAa,CAAC,eAAe,EAAE,GAAG,GAAG,sEAAsE,CAAC,CAAC;IACzH,CAAC;IACD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,EAAE;YAAE,MAAM,IAAI,aAAa,CAAC,oBAAoB,EAAE,sBAAsB,GAAG,MAAM,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAC7G,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACjD,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;AACxB,CAAC;AAUD,yGAAyG;AACzG,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAiB,EAAE,UAA2C,EAAE;IAC7F,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5C,IAAI,IAAI,KAAK,SAAS;QAAE,MAAM,IAAI,aAAa,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,CAAC;IACjG,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,iBAAiB,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACrH,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,iBAAiB,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACtG,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7G,GAAG,CAAC,KAAK,CAAC,CAAC,mBAAmB,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACrF,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,KAAK,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;AAC1F,CAAC;AAED,gHAAgH;AAChH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAiB,EAAE,UAAuB,EAAE;IACjF,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,GAAG,KAAK,SAAS;YAAE,SAAS;QAChC,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,CAAC,QAAQ;gBAAE,SAAS;YACzB,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;YACrB,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC3B,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBACnF,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;QACH,CAAC;QACD,IAAI,OAAO;YAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
package/dist/source.d.ts
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { Diagnostic } from './contracts/diagnostics.js';
|
|
2
|
+
import type { FileContent } from './contracts/api.js';
|
|
3
|
+
export interface BundleLimits {
|
|
4
|
+
maxFiles: number;
|
|
5
|
+
maxFileBytes: number;
|
|
6
|
+
maxTotalBytes: number;
|
|
7
|
+
}
|
|
8
|
+
export declare const DEFAULT_LIMITS: BundleLimits;
|
|
9
|
+
export type PathCheck = {
|
|
10
|
+
ok: true;
|
|
11
|
+
path: string;
|
|
12
|
+
} | {
|
|
13
|
+
ok: false;
|
|
14
|
+
reason: string;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Validate and normalise a bundle-relative path. Rejects traversal, absolute and
|
|
18
|
+
* drive-letter paths, backslashes, control characters, alternate data streams and
|
|
19
|
+
* empty segments. Returned paths always use forward slashes.
|
|
20
|
+
*/
|
|
21
|
+
export declare function checkBundlePath(input: string): PathCheck;
|
|
22
|
+
/** Files that belong to a bundle: the five YAML files plus human/, operator/ and assets/. */
|
|
23
|
+
export declare function isBundlePath(path: string): boolean;
|
|
24
|
+
export declare function resolveRelative(fromFile: string, rel: string): string | undefined;
|
|
25
|
+
/** Anything that can enumerate and read bundle files. All sources share one parser. */
|
|
26
|
+
export interface BundleSource {
|
|
27
|
+
/** Human-readable origin, shown in PDFs and manifests (a directory path or label). */
|
|
28
|
+
readonly label: string;
|
|
29
|
+
list(): Promise<string[]>;
|
|
30
|
+
read(path: string): Promise<Uint8Array>;
|
|
31
|
+
}
|
|
32
|
+
/** A label that never leaks absolute local paths: relative to the cwd when inside it, else the folder name. */
|
|
33
|
+
export declare function defaultBundleLabel(root: string): string;
|
|
34
|
+
export declare function directorySource(root: string, label?: string): BundleSource;
|
|
35
|
+
export declare function decodeFileContent(content: FileContent): Uint8Array;
|
|
36
|
+
export declare function memorySource(files: Record<string, string | Uint8Array | FileContent>, label?: string): BundleSource;
|
|
37
|
+
/** Read an uploaded ZIP with bounded extraction and traversal checks. */
|
|
38
|
+
export declare function zipSource(data: Uint8Array | ArrayBuffer | Buffer, limits?: BundleLimits, label?: string): Promise<BundleSource>;
|
|
39
|
+
export declare class BundleFiles {
|
|
40
|
+
readonly label: string;
|
|
41
|
+
private readonly map;
|
|
42
|
+
constructor(label: string, map: Map<string, Uint8Array>);
|
|
43
|
+
has(path: string): boolean;
|
|
44
|
+
bytes(path: string): Uint8Array | undefined;
|
|
45
|
+
text(path: string): string | undefined;
|
|
46
|
+
paths(): string[];
|
|
47
|
+
entries(): [string, Uint8Array][];
|
|
48
|
+
toRecord(): Record<string, string>;
|
|
49
|
+
with(path: string, value: string | Uint8Array | null): BundleFiles;
|
|
50
|
+
}
|
|
51
|
+
export interface LoadedFiles {
|
|
52
|
+
files: BundleFiles;
|
|
53
|
+
diagnostics: Diagnostic[];
|
|
54
|
+
}
|
|
55
|
+
/** Load every file from a source into memory with limits and path safety diagnostics. */
|
|
56
|
+
export declare function loadBundleFiles(source: BundleSource, limits?: BundleLimits): Promise<LoadedFiles>;
|
|
57
|
+
//# sourceMappingURL=source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAKtD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,cAAc,EAAE,YAI5B,CAAC;AAIF,MAAM,MAAM,SAAS,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnF;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAgBxD;AAID,6FAA6F;AAC7F,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAYjF;AAID,uFAAuF;AACvF,MAAM,WAAW,YAAY;IAC3B,sFAAsF;IACtF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACzC;AAID,+GAA+G;AAC/G,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY,CAgC1E;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,CAGlE;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,CAAC,EACxD,KAAK,SAAW,GACf,YAAY,CAqBd;AAED,yEAAyE;AACzE,wBAAsB,SAAS,CAC7B,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,MAAM,EACvC,MAAM,GAAE,YAA6B,EACrC,KAAK,SAAe,GACnB,OAAO,CAAC,YAAY,CAAC,CA+BvB;AAID,qBAAa,WAAW;IAEpB,QAAQ,CAAC,KAAK,EAAE,MAAM;IACtB,OAAO,CAAC,QAAQ,CAAC,GAAG;gBADX,KAAK,EAAE,MAAM,EACL,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;IAE/C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAG1B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAG3C,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAItC,KAAK,IAAI,MAAM,EAAE;IAGjB,OAAO,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE;IAGjC,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAKlC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,WAAW;CAMnE;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,WAAW,CAAC;IACnB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,yFAAyF;AACzF,wBAAsB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,GAAE,YAA6B,GAAG,OAAO,CAAC,WAAW,CAAC,CA0EvH"}
|
package/dist/source.js
ADDED
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { lstat, readdir, readFile } from 'node:fs/promises';
|
|
2
|
+
import { basename, isAbsolute, relative, resolve, sep } from 'node:path';
|
|
3
|
+
import JSZip from 'jszip';
|
|
4
|
+
import { fromBytes, toBytes } from './util.js';
|
|
5
|
+
export const DEFAULT_LIMITS = {
|
|
6
|
+
maxFiles: 2000,
|
|
7
|
+
maxFileBytes: 25 * 1024 * 1024,
|
|
8
|
+
maxTotalBytes: 200 * 1024 * 1024,
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Validate and normalise a bundle-relative path. Rejects traversal, absolute and
|
|
12
|
+
* drive-letter paths, backslashes, control characters, alternate data streams and
|
|
13
|
+
* empty segments. Returned paths always use forward slashes.
|
|
14
|
+
*/
|
|
15
|
+
export function checkBundlePath(input) {
|
|
16
|
+
if (typeof input !== 'string' || input.length === 0)
|
|
17
|
+
return { ok: false, reason: 'path is empty' };
|
|
18
|
+
if (input.length > 240)
|
|
19
|
+
return { ok: false, reason: 'path is longer than 240 characters' };
|
|
20
|
+
// eslint-disable-next-line no-control-regex
|
|
21
|
+
if (/[\u0000-\u001f\u007f]/.test(input))
|
|
22
|
+
return { ok: false, reason: 'path contains control characters' };
|
|
23
|
+
if (input.includes('\\'))
|
|
24
|
+
return { ok: false, reason: 'path uses backslashes; use forward slashes' };
|
|
25
|
+
if (input.startsWith('/') || /^[A-Za-z]:/.test(input))
|
|
26
|
+
return { ok: false, reason: 'path is absolute' };
|
|
27
|
+
if (input.includes(':'))
|
|
28
|
+
return { ok: false, reason: 'path contains ":"' };
|
|
29
|
+
const segments = input.split('/');
|
|
30
|
+
for (const s of segments) {
|
|
31
|
+
if (s === '')
|
|
32
|
+
return { ok: false, reason: 'path has an empty segment' };
|
|
33
|
+
if (s === '.' || s === '..')
|
|
34
|
+
return { ok: false, reason: 'path contains "." or ".." segments' };
|
|
35
|
+
if (/[. ]$/.test(s))
|
|
36
|
+
return { ok: false, reason: 'path segment ends with "." or space' };
|
|
37
|
+
if (/^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i.test(s))
|
|
38
|
+
return { ok: false, reason: 'path segment is a reserved device name on Windows' };
|
|
39
|
+
}
|
|
40
|
+
return { ok: true, path: segments.join('/') };
|
|
41
|
+
}
|
|
42
|
+
const BUNDLE_ROOT_FILES = new Set(['guide.yaml', 'brief.yaml', 'checks.yaml', 'sources.yaml', 'assets.yaml']);
|
|
43
|
+
/** Files that belong to a bundle: the five YAML files plus human/, operator/ and assets/. */
|
|
44
|
+
export function isBundlePath(path) {
|
|
45
|
+
return BUNDLE_ROOT_FILES.has(path) || /^(human|operator|assets)\//.test(path);
|
|
46
|
+
}
|
|
47
|
+
export function resolveRelative(fromFile, rel) {
|
|
48
|
+
const base = fromFile.includes('/') ? fromFile.slice(0, fromFile.lastIndexOf('/')) : '';
|
|
49
|
+
const parts = (base ? base.split('/') : []).concat(rel.split('/'));
|
|
50
|
+
const out = [];
|
|
51
|
+
for (const p of parts) {
|
|
52
|
+
if (p === '' || p === '.')
|
|
53
|
+
continue;
|
|
54
|
+
if (p === '..') {
|
|
55
|
+
if (!out.length)
|
|
56
|
+
return undefined;
|
|
57
|
+
out.pop();
|
|
58
|
+
}
|
|
59
|
+
else
|
|
60
|
+
out.push(p);
|
|
61
|
+
}
|
|
62
|
+
return out.join('/');
|
|
63
|
+
}
|
|
64
|
+
const IGNORED_SEGMENTS = new Set(['.git', 'node_modules', '.DS_Store', 'Thumbs.db']);
|
|
65
|
+
/** A label that never leaks absolute local paths: relative to the cwd when inside it, else the folder name. */
|
|
66
|
+
export function defaultBundleLabel(root) {
|
|
67
|
+
const abs = resolve(root);
|
|
68
|
+
const rel = relative(process.cwd(), abs).replace(/\\/g, '/');
|
|
69
|
+
if (!rel)
|
|
70
|
+
return basename(abs);
|
|
71
|
+
return rel.startsWith('..') || isAbsolute(rel) ? basename(abs) : rel;
|
|
72
|
+
}
|
|
73
|
+
export function directorySource(root, label) {
|
|
74
|
+
const absRoot = resolve(root);
|
|
75
|
+
return {
|
|
76
|
+
label: label ?? defaultBundleLabel(root),
|
|
77
|
+
async list() {
|
|
78
|
+
const out = [];
|
|
79
|
+
async function walk(dir, prefix) {
|
|
80
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
81
|
+
entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
|
|
82
|
+
for (const e of entries) {
|
|
83
|
+
if (IGNORED_SEGMENTS.has(e.name))
|
|
84
|
+
continue;
|
|
85
|
+
const rel = prefix ? `${prefix}/${e.name}` : e.name;
|
|
86
|
+
const abs = resolve(dir, e.name);
|
|
87
|
+
if (e.isSymbolicLink()) {
|
|
88
|
+
out.push(`\u0000symlink:${rel}`);
|
|
89
|
+
}
|
|
90
|
+
else if (e.isDirectory())
|
|
91
|
+
await walk(abs, rel);
|
|
92
|
+
else if (e.isFile())
|
|
93
|
+
out.push(rel);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
await walk(absRoot, '');
|
|
97
|
+
return out;
|
|
98
|
+
},
|
|
99
|
+
async read(path) {
|
|
100
|
+
const check = checkBundlePath(path);
|
|
101
|
+
if (!check.ok)
|
|
102
|
+
throw new Error(`Unsafe bundle path "${path}": ${check.reason}`);
|
|
103
|
+
const abs = resolve(absRoot, check.path);
|
|
104
|
+
if (abs !== absRoot && !abs.startsWith(absRoot + sep))
|
|
105
|
+
throw new Error(`Path escapes the bundle root: ${path}`);
|
|
106
|
+
const st = await lstat(abs);
|
|
107
|
+
if (st.isSymbolicLink())
|
|
108
|
+
throw new Error(`Symbolic links are not allowed: ${path}`);
|
|
109
|
+
return new Uint8Array(await readFile(abs));
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
export function decodeFileContent(content) {
|
|
114
|
+
if (typeof content === 'string')
|
|
115
|
+
return toBytes(content);
|
|
116
|
+
return content.encoding === 'base64' ? new Uint8Array(Buffer.from(content.content, 'base64')) : toBytes(content.content);
|
|
117
|
+
}
|
|
118
|
+
export function memorySource(files, label = 'memory') {
|
|
119
|
+
const map = new Map();
|
|
120
|
+
const names = [];
|
|
121
|
+
for (const [name, value] of Object.entries(files)) {
|
|
122
|
+
names.push(name);
|
|
123
|
+
map.set(name, typeof value === 'string' || value instanceof Uint8Array ? toBytes(value) : decodeFileContent(value));
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
label,
|
|
127
|
+
async list() {
|
|
128
|
+
return [...names].sort();
|
|
129
|
+
},
|
|
130
|
+
async read(path) {
|
|
131
|
+
const v = map.get(path);
|
|
132
|
+
if (!v)
|
|
133
|
+
throw new Error(`File not found: ${path}`);
|
|
134
|
+
return v;
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/** Read an uploaded ZIP with bounded extraction and traversal checks. */
|
|
139
|
+
export async function zipSource(data, limits = DEFAULT_LIMITS, label = 'upload.zip') {
|
|
140
|
+
const zip = await JSZip.loadAsync(data, { checkCRC32: true });
|
|
141
|
+
const entries = Object.values(zip.files).filter((f) => !f.dir);
|
|
142
|
+
if (entries.length > limits.maxFiles) {
|
|
143
|
+
throw Object.assign(new Error(`Archive has ${entries.length} files; the limit is ${limits.maxFiles}.`), {
|
|
144
|
+
code: 'BUNDLE_LIMIT_EXCEEDED',
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
let total = 0;
|
|
148
|
+
const files = {};
|
|
149
|
+
for (const entry of entries.sort((a, b) => (a.name < b.name ? -1 : 1))) {
|
|
150
|
+
// JSZip exposes the declared size internally; verify it before inflating.
|
|
151
|
+
const declared = entry._data?.uncompressedSize;
|
|
152
|
+
if (typeof declared === 'number' && declared > limits.maxFileBytes) {
|
|
153
|
+
throw Object.assign(new Error(`Archive entry ${entry.name} is ${declared} bytes; the limit is ${limits.maxFileBytes}.`), {
|
|
154
|
+
code: 'BUNDLE_LIMIT_EXCEEDED',
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
if (typeof declared === 'number' && total + declared > limits.maxTotalBytes) {
|
|
158
|
+
throw Object.assign(new Error(`Archive exceeds the ${limits.maxTotalBytes}-byte extraction limit.`), {
|
|
159
|
+
code: 'BUNDLE_LIMIT_EXCEEDED',
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
const bytes = await entry.async('uint8array');
|
|
163
|
+
total += bytes.length;
|
|
164
|
+
if (bytes.length > limits.maxFileBytes || total > limits.maxTotalBytes) {
|
|
165
|
+
throw Object.assign(new Error('Archive exceeds extraction limits.'), { code: 'BUNDLE_LIMIT_EXCEEDED' });
|
|
166
|
+
}
|
|
167
|
+
files[entry.name] = bytes;
|
|
168
|
+
}
|
|
169
|
+
return memorySource(files, label);
|
|
170
|
+
}
|
|
171
|
+
/* ------------------------------ loaded files ----------------------------- */
|
|
172
|
+
export class BundleFiles {
|
|
173
|
+
label;
|
|
174
|
+
map;
|
|
175
|
+
constructor(label, map) {
|
|
176
|
+
this.label = label;
|
|
177
|
+
this.map = map;
|
|
178
|
+
}
|
|
179
|
+
has(path) {
|
|
180
|
+
return this.map.has(path);
|
|
181
|
+
}
|
|
182
|
+
bytes(path) {
|
|
183
|
+
return this.map.get(path);
|
|
184
|
+
}
|
|
185
|
+
text(path) {
|
|
186
|
+
const b = this.map.get(path);
|
|
187
|
+
return b ? fromBytes(b) : undefined;
|
|
188
|
+
}
|
|
189
|
+
paths() {
|
|
190
|
+
return [...this.map.keys()].sort();
|
|
191
|
+
}
|
|
192
|
+
entries() {
|
|
193
|
+
return this.paths().map((p) => [p, this.map.get(p)]);
|
|
194
|
+
}
|
|
195
|
+
toRecord() {
|
|
196
|
+
const out = {};
|
|
197
|
+
for (const [p, b] of this.entries())
|
|
198
|
+
out[p] = fromBytes(b);
|
|
199
|
+
return out;
|
|
200
|
+
}
|
|
201
|
+
with(path, value) {
|
|
202
|
+
const next = new Map(this.map);
|
|
203
|
+
if (value === null)
|
|
204
|
+
next.delete(path);
|
|
205
|
+
else
|
|
206
|
+
next.set(path, toBytes(value));
|
|
207
|
+
return new BundleFiles(this.label, next);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/** Load every file from a source into memory with limits and path safety diagnostics. */
|
|
211
|
+
export async function loadBundleFiles(source, limits = DEFAULT_LIMITS) {
|
|
212
|
+
const diagnostics = [];
|
|
213
|
+
const map = new Map();
|
|
214
|
+
let names;
|
|
215
|
+
try {
|
|
216
|
+
names = await source.list();
|
|
217
|
+
}
|
|
218
|
+
catch (e) {
|
|
219
|
+
return {
|
|
220
|
+
files: new BundleFiles(source.label, map),
|
|
221
|
+
diagnostics: [
|
|
222
|
+
{
|
|
223
|
+
code: 'BUNDLE_FILE_MISSING',
|
|
224
|
+
severity: 'error',
|
|
225
|
+
path: '.',
|
|
226
|
+
message: `Cannot read the bundle at ${source.label}: ${e.message}`,
|
|
227
|
+
},
|
|
228
|
+
],
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
if (names.length > limits.maxFiles) {
|
|
232
|
+
diagnostics.push({
|
|
233
|
+
code: 'BUNDLE_LIMIT_EXCEEDED',
|
|
234
|
+
severity: 'error',
|
|
235
|
+
path: '.',
|
|
236
|
+
message: `The bundle has ${names.length} files; the limit is ${limits.maxFiles}.`,
|
|
237
|
+
});
|
|
238
|
+
names = names.slice(0, limits.maxFiles);
|
|
239
|
+
}
|
|
240
|
+
let total = 0;
|
|
241
|
+
for (const name of names) {
|
|
242
|
+
if (name.startsWith('\u0000symlink:')) {
|
|
243
|
+
diagnostics.push({
|
|
244
|
+
code: 'BUNDLE_PATH_UNSAFE',
|
|
245
|
+
severity: 'error',
|
|
246
|
+
path: name.slice('\u0000symlink:'.length),
|
|
247
|
+
message: 'Symbolic links are not allowed in a bundle.',
|
|
248
|
+
});
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
const check = checkBundlePath(name);
|
|
252
|
+
if (!check.ok) {
|
|
253
|
+
diagnostics.push({
|
|
254
|
+
code: 'BUNDLE_PATH_UNSAFE',
|
|
255
|
+
severity: 'error',
|
|
256
|
+
path: name,
|
|
257
|
+
message: `Unsafe path: ${check.reason}.`,
|
|
258
|
+
});
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
// Only bundle content is read; stray files next to a bundle never change its revision.
|
|
262
|
+
if (!isBundlePath(check.path))
|
|
263
|
+
continue;
|
|
264
|
+
try {
|
|
265
|
+
const bytes = await source.read(check.path);
|
|
266
|
+
total += bytes.length;
|
|
267
|
+
if (bytes.length > limits.maxFileBytes || total > limits.maxTotalBytes) {
|
|
268
|
+
diagnostics.push({
|
|
269
|
+
code: 'BUNDLE_LIMIT_EXCEEDED',
|
|
270
|
+
severity: 'error',
|
|
271
|
+
path: check.path,
|
|
272
|
+
message: 'The file exceeds the configured size limits.',
|
|
273
|
+
});
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
map.set(check.path, bytes);
|
|
277
|
+
}
|
|
278
|
+
catch (e) {
|
|
279
|
+
diagnostics.push({
|
|
280
|
+
code: 'BUNDLE_FILE_MISSING',
|
|
281
|
+
severity: 'error',
|
|
282
|
+
path: check.path,
|
|
283
|
+
message: e.message,
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return { files: new BundleFiles(source.label, map), diagnostics };
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"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"}
|