content-query 0.0.2 → 0.2.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 +91 -2
- package/dist/build-DfKd2bpf.d.mts +25 -0
- package/dist/build-Dxz7P1ur.mjs +1439 -0
- package/dist/build.d.mts +2 -0
- package/dist/build.mjs +1 -0
- package/dist/cli.d.mts +1 -0
- package/dist/cli.mjs +97 -0
- package/dist/computed.d.mts +43 -0
- package/dist/computed.mjs +139 -0
- package/dist/content-G69dPPuo.d.mts +109 -0
- package/dist/content-N1gYshjg.mjs +1028 -0
- package/dist/descriptor-D9Th5hzk.d.mts +18 -0
- package/dist/diagnostics-Cu94mZhl.mjs +80 -0
- package/dist/dist-C7_FOzY_.mjs +5405 -0
- package/dist/errors-C2iuBM0G.mjs +72 -0
- package/dist/github-slugger-BMgR_Q0I.mjs +72 -0
- package/dist/glob-Bv0dpvCQ.mjs +159 -0
- package/dist/index.d.mts +78 -0
- package/dist/index.mjs +46 -0
- package/dist/internal/markdown.d.mts +5 -0
- package/dist/internal/markdown.mjs +1 -0
- package/dist/internal.d.mts +54 -0
- package/dist/internal.mjs +89 -0
- package/dist/loaders.d.mts +11 -0
- package/dist/loaders.mjs +86 -0
- package/dist/markdown-CHvBBJNa.mjs +54 -0
- package/dist/next.d.mts +20 -0
- package/dist/next.mjs +142 -0
- package/dist/operators-UqWUhKQJ.mjs +173 -0
- package/dist/query.d.mts +44 -0
- package/dist/query.mjs +1 -0
- package/dist/relational-types-DgK3rLuw.d.mts +278 -0
- package/dist/rolldown-runtime-Bg1v5YCA.mjs +34 -0
- package/dist/runtime.d.mts +3 -0
- package/dist/runtime.mjs +5 -0
- package/dist/schema-C5Str-E8.mjs +20 -0
- package/dist/schema.d.mts +11 -0
- package/dist/schema.mjs +1 -0
- package/dist/server-only-CIJUlyL-.mjs +7 -0
- package/dist/types-C-kdMblM.d.mts +69 -0
- package/dist/types-ChaNhj42.d.mts +143 -0
- package/dist/types-Dh-Sydyw.d.mts +20 -0
- package/dist/validation-D_XdE1pF.mjs +84 -0
- package/dist/values-BbTV4QT-.mjs +901 -0
- package/dist/vite.d.mts +6 -0
- package/dist/vite.mjs +296 -0
- package/package.json +92 -10
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
//#region src/shared/errors.ts
|
|
2
|
+
const contentErrorBrand = Symbol.for("content-query.error");
|
|
3
|
+
/** A contextual library failure; inspect code and diagnostics instead of message text. */
|
|
4
|
+
var ContentError = class extends Error {
|
|
5
|
+
/** Recognizes contextual errors across preparation and separately bundled loader modules. */
|
|
6
|
+
static [Symbol.hasInstance](value) {
|
|
7
|
+
return !!value && typeof value === "object" && value[contentErrorBrand] === true;
|
|
8
|
+
}
|
|
9
|
+
code;
|
|
10
|
+
operation;
|
|
11
|
+
collection;
|
|
12
|
+
id;
|
|
13
|
+
source;
|
|
14
|
+
path;
|
|
15
|
+
issues;
|
|
16
|
+
diagnostics;
|
|
17
|
+
/** Creates one failure or a grouped report preserving individual causes and issues. */
|
|
18
|
+
constructor(options) {
|
|
19
|
+
super(options.message, { cause: options.cause });
|
|
20
|
+
Object.defineProperty(this, contentErrorBrand, { value: true });
|
|
21
|
+
this.name = "ContentError";
|
|
22
|
+
this.code = options.code;
|
|
23
|
+
this.operation = options.operation;
|
|
24
|
+
this.collection = options.collection;
|
|
25
|
+
this.id = options.id;
|
|
26
|
+
this.source = options.source;
|
|
27
|
+
this.path = options.path;
|
|
28
|
+
this.issues = options.issues;
|
|
29
|
+
this.diagnostics = options.diagnostics ?? [{ ...options }];
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
/** Rejects invalid query structure before any execution or payload access. */
|
|
33
|
+
function invalidQuery(message) {
|
|
34
|
+
throw new ContentError({
|
|
35
|
+
code: "invalid-query",
|
|
36
|
+
operation: "query",
|
|
37
|
+
message
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/** Converts an acquisition/processing failure without discarding contextual library errors. */
|
|
41
|
+
function contentError(cause, context) {
|
|
42
|
+
return cause instanceof ContentError ? cause : new ContentError({
|
|
43
|
+
...context,
|
|
44
|
+
cause
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/** Describes a foreign failure for diagnostic text while its original remains the cause. */
|
|
48
|
+
function describeCause(cause) {
|
|
49
|
+
return cause instanceof Error ? cause.message : String(cause);
|
|
50
|
+
}
|
|
51
|
+
/** Groups independent diagnostics under the primary code while preserving every report. */
|
|
52
|
+
function groupDiagnostics(diagnostics) {
|
|
53
|
+
return new ContentError({
|
|
54
|
+
...diagnostics[0],
|
|
55
|
+
diagnostics,
|
|
56
|
+
message: diagnostics.map((diagnostic) => diagnostic.message).join("\n")
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/** Adds missing operation/collection context to each diagnostic, keeping codes and causes. */
|
|
60
|
+
function withContext(cause, context) {
|
|
61
|
+
return groupDiagnostics((cause instanceof ContentError ? cause : new ContentError({
|
|
62
|
+
...context,
|
|
63
|
+
message: `${context.message}: ${describeCause(cause)}`,
|
|
64
|
+
cause
|
|
65
|
+
})).diagnostics.map((diagnostic) => ({
|
|
66
|
+
...diagnostic,
|
|
67
|
+
operation: diagnostic.operation ?? context.operation,
|
|
68
|
+
collection: diagnostic.collection ?? context.collection
|
|
69
|
+
})));
|
|
70
|
+
}
|
|
71
|
+
//#endregion
|
|
72
|
+
export { invalidQuery as a, groupDiagnostics as i, contentError as n, withContext as o, describeCause as r, ContentError as t };
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
//#region ../../node_modules/.pnpm/github-slugger@2.0.0/node_modules/github-slugger/regex.js
|
|
2
|
+
const regex = /[\0-\x1F!-,\.\/:-@\[-\^`\{-\xA9\xAB-\xB4\xB6-\xB9\xBB-\xBF\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0378\u0379\u037E\u0380-\u0385\u0387\u038B\u038D\u03A2\u03F6\u0482\u0530\u0557\u0558\u055A-\u055F\u0589-\u0590\u05BE\u05C0\u05C3\u05C6\u05C8-\u05CF\u05EB-\u05EE\u05F3-\u060F\u061B-\u061F\u066A-\u066D\u06D4\u06DD\u06DE\u06E9\u06FD\u06FE\u0700-\u070F\u074B\u074C\u07B2-\u07BF\u07F6-\u07F9\u07FB\u07FC\u07FE\u07FF\u082E-\u083F\u085C-\u085F\u086B-\u089F\u08B5\u08C8-\u08D2\u08E2\u0964\u0965\u0970\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09F2-\u09FB\u09FD\u09FF\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF0-\u0AF8\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B54\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B70\u0B72-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BF0-\u0BFF\u0C0D\u0C11\u0C29\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B-\u0C5F\u0C64\u0C65\u0C70-\u0C7F\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0CFF\u0D0D\u0D11\u0D45\u0D49\u0D4F-\u0D53\u0D58-\u0D5E\u0D64\u0D65\u0D70-\u0D79\u0D80\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DE5\u0DF0\u0DF1\u0DF4-\u0E00\u0E3B-\u0E3F\u0E4F\u0E5A-\u0E80\u0E83\u0E85\u0E8B\u0EA4\u0EA6\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F01-\u0F17\u0F1A-\u0F1F\u0F2A-\u0F34\u0F36\u0F38\u0F3A-\u0F3D\u0F48\u0F6D-\u0F70\u0F85\u0F98\u0FBD-\u0FC5\u0FC7-\u0FFF\u104A-\u104F\u109E\u109F\u10C6\u10C8-\u10CC\u10CE\u10CF\u10FB\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u1360-\u137F\u1390-\u139F\u13F6\u13F7\u13FE-\u1400\u166D\u166E\u1680\u169B-\u169F\u16EB-\u16ED\u16F9-\u16FF\u170D\u1715-\u171F\u1735-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17D4-\u17D6\u17D8-\u17DB\u17DE\u17DF\u17EA-\u180A\u180E\u180F\u181A-\u181F\u1879-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191F\u192C-\u192F\u193C-\u1945\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DA-\u19FF\u1A1C-\u1A1F\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1AA6\u1AA8-\u1AAF\u1AC1-\u1AFF\u1B4C-\u1B4F\u1B5A-\u1B6A\u1B74-\u1B7F\u1BF4-\u1BFF\u1C38-\u1C3F\u1C4A-\u1C4C\u1C7E\u1C7F\u1C89-\u1C8F\u1CBB\u1CBC\u1CC0-\u1CCF\u1CD3\u1CFB-\u1CFF\u1DFA\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FBD\u1FBF-\u1FC1\u1FC5\u1FCD-\u1FCF\u1FD4\u1FD5\u1FDC-\u1FDF\u1FED-\u1FF1\u1FF5\u1FFD-\u203E\u2041-\u2053\u2055-\u2070\u2072-\u207E\u2080-\u208F\u209D-\u20CF\u20F1-\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F-\u215F\u2189-\u24B5\u24EA-\u2BFF\u2C2F\u2C5F\u2CE5-\u2CEA\u2CF4-\u2CFF\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D70-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E00-\u2E2E\u2E30-\u3004\u3008-\u3020\u3030\u3036\u3037\u303D-\u3040\u3097\u3098\u309B\u309C\u30A0\u30FB\u3100-\u3104\u3130\u318F-\u319F\u31C0-\u31EF\u3200-\u33FF\u4DC0-\u4DFF\u9FFD-\u9FFF\uA48D-\uA4CF\uA4FE\uA4FF\uA60D-\uA60F\uA62C-\uA63F\uA673\uA67E\uA6F2-\uA716\uA720\uA721\uA789\uA78A\uA7C0\uA7C1\uA7CB-\uA7F4\uA828-\uA82B\uA82D-\uA83F\uA874-\uA87F\uA8C6-\uA8CF\uA8DA-\uA8DF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA954-\uA95F\uA97D-\uA97F\uA9C1-\uA9CE\uA9DA-\uA9DF\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A-\uAA5F\uAA77-\uAA79\uAAC3-\uAADA\uAADE\uAADF\uAAF0\uAAF1\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB5B\uAB6A-\uAB6F\uABEB\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uD7FF\uE000-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB29\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBB2-\uFBD2\uFD3E-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFC-\uFDFF\uFE10-\uFE1F\uFE30-\uFE32\uFE35-\uFE4C\uFE50-\uFE6F\uFE75\uFEFD-\uFF0F\uFF1A-\uFF20\uFF3B-\uFF3E\uFF40\uFF5B-\uFF65\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFFF]|\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDD3F\uDD75-\uDDFC\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEE1-\uDEFF\uDF20-\uDF2C\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDF9F\uDFC4-\uDFC7\uDFD0\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56-\uDC5F\uDC77-\uDC7F\uDC9F-\uDCDF\uDCF3\uDCF6-\uDCFF\uDD16-\uDD1F\uDD3A-\uDD7F\uDDB8-\uDDBD\uDDC0-\uDDFF\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE36\uDE37\uDE3B-\uDE3E\uDE40-\uDE5F\uDE7D-\uDE7F\uDE9D-\uDEBF\uDEC8\uDEE7-\uDEFF\uDF36-\uDF3F\uDF56-\uDF5F\uDF73-\uDF7F\uDF92-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCFF\uDD28-\uDD2F\uDD3A-\uDE7F\uDEAA\uDEAD-\uDEAF\uDEB2-\uDEFF\uDF1D-\uDF26\uDF28-\uDF2F\uDF51-\uDFAF\uDFC5-\uDFDF\uDFF7-\uDFFF]|\uD804[\uDC47-\uDC65\uDC70-\uDC7E\uDCBB-\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD40-\uDD43\uDD48-\uDD4F\uDD74\uDD75\uDD77-\uDD7F\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDFF\uDE12\uDE38-\uDE3D\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEA9-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC4B-\uDC4F\uDC5A-\uDC5D\uDC62-\uDC7F\uDCC6\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDC1-\uDDD7\uDDDE-\uDDFF\uDE41-\uDE43\uDE45-\uDE4F\uDE5A-\uDE7F\uDEB9-\uDEBF\uDECA-\uDEFF\uDF1B\uDF1C\uDF2C-\uDF2F\uDF3A-\uDFFF]|\uD806[\uDC3B-\uDC9F\uDCEA-\uDCFE\uDD07\uDD08\uDD0A\uDD0B\uDD14\uDD17\uDD36\uDD39\uDD3A\uDD44-\uDD4F\uDD5A-\uDD9F\uDDA8\uDDA9\uDDD8\uDDD9\uDDE2\uDDE5-\uDDFF\uDE3F-\uDE46\uDE48-\uDE4F\uDE9A-\uDE9C\uDE9E-\uDEBF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC41-\uDC4F\uDC5A-\uDC71\uDC90\uDC91\uDCA8\uDCB7-\uDCFF\uDD07\uDD0A\uDD37-\uDD39\uDD3B\uDD3E\uDD48-\uDD4F\uDD5A-\uDD5F\uDD66\uDD69\uDD8F\uDD92\uDD99-\uDD9F\uDDAA-\uDEDF\uDEF7-\uDFAF\uDFB1-\uDFFF]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80B\uD80E-\uD810\uD812-\uD819\uD824-\uD82B\uD82D\uD82E\uD830-\uD833\uD837\uD839\uD83D\uD83F\uD87B-\uD87D\uD87F\uD885-\uDB3F\uDB41-\uDBFF][\uDC00-\uDFFF]|\uD80D[\uDC2F-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDECF\uDEEE\uDEEF\uDEF5-\uDEFF\uDF37-\uDF3F\uDF44-\uDF4F\uDF5A-\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDE3F\uDE80-\uDEFF\uDF4B-\uDF4E\uDF88-\uDF8E\uDFA0-\uDFDF\uDFE2\uDFE5-\uDFEF\uDFF2-\uDFFF]|\uD821[\uDFF8-\uDFFF]|\uD823[\uDCD6-\uDCFF\uDD09-\uDFFF]|\uD82C[\uDD1F-\uDD4F\uDD53-\uDD63\uDD68-\uDD6F\uDEFC-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A-\uDC9C\uDC9F-\uDFFF]|\uD834[\uDC00-\uDD64\uDD6A-\uDD6C\uDD73-\uDD7A\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDE41\uDE45-\uDFFF]|\uD835[\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3\uDFCC\uDFCD]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85-\uDE9A\uDEA0\uDEB0-\uDFFF]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDCFF\uDD2D-\uDD2F\uDD3E\uDD3F\uDD4A-\uDD4D\uDD4F-\uDEBF\uDEFA-\uDFFF]|\uD83A[\uDCC5-\uDCCF\uDCD7-\uDCFF\uDD4C-\uDD4F\uDD5A-\uDFFF]|\uD83B[\uDC00-\uDDFF\uDE04\uDE20\uDE23\uDE25\uDE26\uDE28\uDE33\uDE38\uDE3A\uDE3C-\uDE41\uDE43-\uDE46\uDE48\uDE4A\uDE4C\uDE50\uDE53\uDE55\uDE56\uDE58\uDE5A\uDE5C\uDE5E\uDE60\uDE63\uDE65\uDE66\uDE6B\uDE73\uDE78\uDE7D\uDE7F\uDE8A\uDE9C-\uDEA0\uDEA4\uDEAA\uDEBC-\uDFFF]|\uD83C[\uDC00-\uDD2F\uDD4A-\uDD4F\uDD6A-\uDD6F\uDD8A-\uDFFF]|\uD83E[\uDC00-\uDFEF\uDFFA-\uDFFF]|\uD869[\uDEDE-\uDEFF]|\uD86D[\uDF35-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDEAF]|\uD87A[\uDFE1-\uDFFF]|\uD87E[\uDE1E-\uDFFF]|\uD884[\uDF4B-\uDFFF]|\uDB40[\uDC00-\uDCFF\uDDF0-\uDFFF]/g;
|
|
3
|
+
//#endregion
|
|
4
|
+
//#region ../../node_modules/.pnpm/github-slugger@2.0.0/node_modules/github-slugger/index.js
|
|
5
|
+
const own = Object.hasOwnProperty;
|
|
6
|
+
/**
|
|
7
|
+
* Slugger.
|
|
8
|
+
*/
|
|
9
|
+
var BananaSlug = class {
|
|
10
|
+
/**
|
|
11
|
+
* Create a new slug class.
|
|
12
|
+
*/
|
|
13
|
+
constructor() {
|
|
14
|
+
/** @type {Record<string, number>} */
|
|
15
|
+
this.occurrences;
|
|
16
|
+
this.reset();
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Generate a unique slug.
|
|
20
|
+
*
|
|
21
|
+
* Tracks previously generated slugs: repeated calls with the same value
|
|
22
|
+
* will result in different slugs.
|
|
23
|
+
* Use the `slug` function to get same slugs.
|
|
24
|
+
*
|
|
25
|
+
* @param {string} value
|
|
26
|
+
* String of text to slugify
|
|
27
|
+
* @param {boolean} [maintainCase=false]
|
|
28
|
+
* Keep the current case, otherwise make all lowercase
|
|
29
|
+
* @return {string}
|
|
30
|
+
* A unique slug string
|
|
31
|
+
*/
|
|
32
|
+
slug(value, maintainCase) {
|
|
33
|
+
const self = this;
|
|
34
|
+
let result = slug(value, maintainCase === true);
|
|
35
|
+
const originalSlug = result;
|
|
36
|
+
while (own.call(self.occurrences, result)) {
|
|
37
|
+
self.occurrences[originalSlug]++;
|
|
38
|
+
result = originalSlug + "-" + self.occurrences[originalSlug];
|
|
39
|
+
}
|
|
40
|
+
self.occurrences[result] = 0;
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Reset - Forget all previous slugs
|
|
45
|
+
*
|
|
46
|
+
* @return void
|
|
47
|
+
*/
|
|
48
|
+
reset() {
|
|
49
|
+
this.occurrences = Object.create(null);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Generate a slug.
|
|
54
|
+
*
|
|
55
|
+
* Does not track previously generated slugs: repeated calls with the same value
|
|
56
|
+
* will result in the exact same slug.
|
|
57
|
+
* Use the `GithubSlugger` class to get unique slugs.
|
|
58
|
+
*
|
|
59
|
+
* @param {string} value
|
|
60
|
+
* String of text to slugify
|
|
61
|
+
* @param {boolean} [maintainCase=false]
|
|
62
|
+
* Keep the current case, otherwise make all lowercase
|
|
63
|
+
* @return {string}
|
|
64
|
+
* A unique slug string
|
|
65
|
+
*/
|
|
66
|
+
function slug(value, maintainCase) {
|
|
67
|
+
if (typeof value !== "string") return "";
|
|
68
|
+
if (!maintainCase) value = value.toLowerCase();
|
|
69
|
+
return value.replace(regex, "").replace(/ /g, "-");
|
|
70
|
+
}
|
|
71
|
+
//#endregion
|
|
72
|
+
export { slug as n, BananaSlug as t };
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { n as normalizeSnapshot, o as builtinPath, s as builtinSymbol } from "./validation-D_XdE1pF.mjs";
|
|
2
|
+
import { i as groupDiagnostics, n as contentError, r as describeCause, t as ContentError } from "./errors-C2iuBM0G.mjs";
|
|
3
|
+
import { n as slug } from "./github-slugger-BMgR_Q0I.mjs";
|
|
4
|
+
import { readFile } from "node:fs/promises";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
7
|
+
import { glob } from "tinyglobby";
|
|
8
|
+
import matter from "gray-matter";
|
|
9
|
+
import { parse } from "yaml";
|
|
10
|
+
import { parse as parse$1 } from "smol-toml";
|
|
11
|
+
//#region src/loaders/populate.ts
|
|
12
|
+
/** Validates a complete built-in source before replacing its collection store. */
|
|
13
|
+
async function populateStore(context, entries) {
|
|
14
|
+
normalizeSnapshot(entries, context.collection);
|
|
15
|
+
const results = await Promise.allSettled(entries.map(async (entry) => ({
|
|
16
|
+
id: entry.id,
|
|
17
|
+
data: await context.parseData({
|
|
18
|
+
id: entry.id,
|
|
19
|
+
data: entry.data,
|
|
20
|
+
filePath: entry.source
|
|
21
|
+
}),
|
|
22
|
+
...entry.body === void 0 ? {} : { body: entry.body },
|
|
23
|
+
...entry.rendered === void 0 ? {} : { rendered: entry.rendered },
|
|
24
|
+
...entry.source === void 0 ? {} : { filePath: entry.source },
|
|
25
|
+
...entry.sourceData === void 0 ? {} : { source: entry.sourceData }
|
|
26
|
+
})));
|
|
27
|
+
const failures = results.flatMap((result) => result.status === "rejected" ? result.reason.diagnostics : []);
|
|
28
|
+
if (failures.length) throw groupDiagnostics(failures);
|
|
29
|
+
context.store.clear();
|
|
30
|
+
for (const result of results) if (result.status === "fulfilled") context.store.set(result.value);
|
|
31
|
+
}
|
|
32
|
+
//#endregion
|
|
33
|
+
//#region src/loaders/parse.ts
|
|
34
|
+
/** Parses one of the built-in data formats without applying collection validation. */
|
|
35
|
+
function parseData(text, filename) {
|
|
36
|
+
switch (path.extname(filename).toLowerCase()) {
|
|
37
|
+
case ".json": return JSON.parse(text);
|
|
38
|
+
case ".yaml":
|
|
39
|
+
case ".yml": return parse(text);
|
|
40
|
+
case ".toml": return parse$1(text);
|
|
41
|
+
default: throw new Error(`Unsupported data extension: ${path.extname(filename)}.`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** Checks the record boundary before identity normalization or Standard Schema validation. */
|
|
45
|
+
function recordData(value) {
|
|
46
|
+
if (!value || typeof value !== "object" || Array.isArray(value) || Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null) throw new Error("Entry metadata must be a record.");
|
|
47
|
+
return value;
|
|
48
|
+
}
|
|
49
|
+
/** Follows Astro's deliberate String(value) normalization for transport identities. */
|
|
50
|
+
function coerceIdentity(value) {
|
|
51
|
+
return String(value);
|
|
52
|
+
}
|
|
53
|
+
//#endregion
|
|
54
|
+
//#region src/loaders/glob.ts
|
|
55
|
+
/** Declares local files with Astro-style IDs and typed, project-relative source paths. */
|
|
56
|
+
function glob$1(options) {
|
|
57
|
+
if (!options || !(typeof options.pattern === "string" || Array.isArray(options.pattern) && options.pattern.every((pattern) => typeof pattern === "string"))) throw new TypeError("glob() requires a string or string[] pattern.");
|
|
58
|
+
const descriptor = {
|
|
59
|
+
kind: "glob",
|
|
60
|
+
options
|
|
61
|
+
};
|
|
62
|
+
return {
|
|
63
|
+
[builtinSymbol]: descriptor,
|
|
64
|
+
name: "content-query/glob",
|
|
65
|
+
async load(context) {
|
|
66
|
+
await populateStore(context, await loadGlob(descriptor, fileURLToPath(context.config.root), context.signal ?? new AbortController().signal));
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/** Captures complete matching Markdown and data sources before deployment. */
|
|
71
|
+
async function loadGlob(descriptor, root, signal) {
|
|
72
|
+
const resolved = builtinPath(descriptor, root);
|
|
73
|
+
const entries = await glob(descriptor.options.pattern, {
|
|
74
|
+
cwd: resolved,
|
|
75
|
+
onlyFiles: true,
|
|
76
|
+
dot: false
|
|
77
|
+
});
|
|
78
|
+
if (entries.length === 0) console.warn(`[content-query] No content matched ${JSON.stringify(descriptor.options.pattern)} in ${resolved}.`);
|
|
79
|
+
const base = pathToFileURL(`${resolved}${path.sep}`);
|
|
80
|
+
entries.sort();
|
|
81
|
+
const results = [];
|
|
82
|
+
let next = 0;
|
|
83
|
+
/** Bounds outstanding reads while retaining source order and every contextual failure. */
|
|
84
|
+
async function loadNext() {
|
|
85
|
+
while (next < entries.length) {
|
|
86
|
+
const index = next++;
|
|
87
|
+
const entry = entries[index];
|
|
88
|
+
signal.throwIfAborted();
|
|
89
|
+
const filename = path.join(resolved, entry);
|
|
90
|
+
try {
|
|
91
|
+
results[index] = {
|
|
92
|
+
status: "fulfilled",
|
|
93
|
+
value: {
|
|
94
|
+
...await loadEntry(descriptor, entry, filename, base, signal),
|
|
95
|
+
sourceData: { filePath: path.relative(root, filename).split(path.sep).join("/") }
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
} catch (cause) {
|
|
99
|
+
results[index] = {
|
|
100
|
+
status: "rejected",
|
|
101
|
+
reason: contentError(cause, {
|
|
102
|
+
code: "source-error",
|
|
103
|
+
source: filename,
|
|
104
|
+
message: `Could not load "${entry}": ${describeCause(cause)}`,
|
|
105
|
+
cause
|
|
106
|
+
})
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
await Promise.all(Array.from({ length: Math.min(entries.length, 64) }, loadNext));
|
|
112
|
+
signal.throwIfAborted();
|
|
113
|
+
const failures = results.flatMap((result) => result.status === "rejected" ? result.reason.diagnostics : []);
|
|
114
|
+
if (failures.length) throw groupDiagnostics(failures);
|
|
115
|
+
return results.map((result) => result.value);
|
|
116
|
+
}
|
|
117
|
+
/** Captures one matched file's metadata and Markdown body from a single read. */
|
|
118
|
+
async function loadEntry(descriptor, entry, filename, base, signal) {
|
|
119
|
+
const text = await readFile(filename, {
|
|
120
|
+
encoding: "utf8",
|
|
121
|
+
signal
|
|
122
|
+
});
|
|
123
|
+
const markdown = path.extname(entry).toLowerCase() === ".md";
|
|
124
|
+
let data;
|
|
125
|
+
let body;
|
|
126
|
+
if (markdown) {
|
|
127
|
+
const frontmatter = matter(text, {
|
|
128
|
+
engines: {
|
|
129
|
+
yaml: (source) => parse(source),
|
|
130
|
+
toml: (source) => parse$1(source)
|
|
131
|
+
},
|
|
132
|
+
...text.startsWith("+++") ? {
|
|
133
|
+
delimiters: "+++",
|
|
134
|
+
language: "toml"
|
|
135
|
+
} : {}
|
|
136
|
+
});
|
|
137
|
+
data = recordData(frontmatter.data);
|
|
138
|
+
body = frontmatter.content.replace(/^(?:[ \t]*\r?\n)+/, "");
|
|
139
|
+
} else data = recordData(parseData(text, filename));
|
|
140
|
+
const defaultId = data.slug ? coerceIdentity(data.slug) : entry.replace(/\\/g, "/").replace(/\.[^.]+$/, "").split("/").map((segment) => slug(segment)).join("/").replace(/\/index$/, "");
|
|
141
|
+
const id = descriptor.options.generateId ? descriptor.options.generateId({
|
|
142
|
+
entry: entry.replace(/\\/g, "/"),
|
|
143
|
+
base,
|
|
144
|
+
data
|
|
145
|
+
}) : defaultId;
|
|
146
|
+
if (typeof id !== "string" || !id) throw new ContentError({
|
|
147
|
+
code: "source-error",
|
|
148
|
+
source: filename,
|
|
149
|
+
message: "generateId must produce a nonempty string."
|
|
150
|
+
});
|
|
151
|
+
return {
|
|
152
|
+
id,
|
|
153
|
+
data,
|
|
154
|
+
...body === void 0 ? {} : { body },
|
|
155
|
+
source: filename
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
//#endregion
|
|
159
|
+
export { populateStore as a, recordData as i, coerceIdentity as n, parseData as r, glob$1 as t };
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { a as Loader, c as LoaderLogger, d as MetaStore, f as RecordLoader, i as FileSource, l as LoaderSource, n as DataStore, o as LoaderConfig, p as MaybePromise, r as FileEntrySource, s as LoaderContext, t as DataEntry, u as LoaderWatcher } from "./types-ChaNhj42.mjs";
|
|
2
|
+
import { n as ContentRenderResult, r as RenderedContent, t as ContentHeading } from "./types-Dh-Sydyw.mjs";
|
|
3
|
+
import { a as ComputedContext, c as Relationship, d as SchemaOutput, i as CollectionRegistry, n as BuiltinPayloads, o as PayloadsOf, r as CollectionDefinition, s as QueryData, t as BuiltinPayloadMarker, u as Schema } from "./types-C-kdMblM.mjs";
|
|
4
|
+
import { n as GlobOptions } from "./descriptor-D9Th5hzk.mjs";
|
|
5
|
+
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
6
|
+
//#region src/collection/source.d.ts
|
|
7
|
+
type CollectionSource = string | ({
|
|
8
|
+
type: "markdown" | "json" | "yaml" | "toml";
|
|
9
|
+
directory: string | URL;
|
|
10
|
+
include?: string | string[];
|
|
11
|
+
} & Pick<GlobOptions, "generateId" | "retainBody" | "deferRender">);
|
|
12
|
+
//#endregion
|
|
13
|
+
//#region src/collection/define.d.ts
|
|
14
|
+
/** Local sources whose entries are data records, without bodies or rendered output. */
|
|
15
|
+
type RecordSource = Extract<CollectionSource, object> & {
|
|
16
|
+
type: "json" | "yaml" | "toml";
|
|
17
|
+
};
|
|
18
|
+
type CollectionFields<SourceSchema extends Schema | undefined, ComputedSchemas extends Record<string, Schema>, Relationships extends Record<string, Relationship>, Source> = {
|
|
19
|
+
schema?: SourceSchema;
|
|
20
|
+
computed?: { [Name in keyof ComputedSchemas]: {
|
|
21
|
+
schema: ComputedSchemas[Name];
|
|
22
|
+
resolve(context: ComputedContext<SchemaOutput<NoInfer<SourceSchema>>, Source>): unknown;
|
|
23
|
+
}; };
|
|
24
|
+
relationships?: Relationships & { [Name in keyof Relationships]: {
|
|
25
|
+
from: keyof (SchemaOutput<NoInfer<SourceSchema>> & {
|
|
26
|
+
id: string;
|
|
27
|
+
} & { [Field in keyof ComputedSchemas]: SchemaOutput<ComputedSchemas[Field]>; }) & string;
|
|
28
|
+
}; };
|
|
29
|
+
};
|
|
30
|
+
type Definition<SourceSchema extends Schema | undefined, ComputedSchemas extends Record<string, Schema>, Relationships extends Record<string, Relationship>, ContentLoader extends Loader> = ({
|
|
31
|
+
source: CollectionSource;
|
|
32
|
+
loader?: never;
|
|
33
|
+
} & CollectionFields<SourceSchema, ComputedSchemas, Relationships, FileSource>) | ({
|
|
34
|
+
loader: ContentLoader;
|
|
35
|
+
source?: never;
|
|
36
|
+
} & CollectionFields<SourceSchema, ComputedSchemas, Relationships, LoaderSource<NoInfer<ContentLoader>>>);
|
|
37
|
+
/** Normalizes either declaration form into a definition with a native loader. */
|
|
38
|
+
declare function collectionOf<SourceSchema extends StandardSchemaV1<unknown, Record<string, unknown>> | undefined, ComputedSchemas extends Record<string, Schema>, Relationships extends Record<string, Relationship>, ContentLoader extends Loader>(definition: Definition<SourceSchema, ComputedSchemas, Relationships, ContentLoader>): {
|
|
39
|
+
loader: ContentLoader | Loader<FileSource>;
|
|
40
|
+
schema: SourceSchema;
|
|
41
|
+
computed: { [Name in keyof ComputedSchemas]: {
|
|
42
|
+
schema: ComputedSchemas[Name];
|
|
43
|
+
resolve(context: ComputedContext<SchemaOutput<NoInfer<SourceSchema>>, FileSource>): unknown;
|
|
44
|
+
}; } | { [Name_1 in keyof ComputedSchemas]: {
|
|
45
|
+
schema: ComputedSchemas[Name_1];
|
|
46
|
+
resolve(context: ComputedContext<SchemaOutput<NoInfer<SourceSchema>>, LoaderSource<NoInfer<ContentLoader>>>): unknown;
|
|
47
|
+
}; };
|
|
48
|
+
relationships: Relationships;
|
|
49
|
+
source: CollectionSource;
|
|
50
|
+
} | {
|
|
51
|
+
loader: ContentLoader | Loader<FileSource>;
|
|
52
|
+
schema: SourceSchema;
|
|
53
|
+
computed: { [Name in keyof ComputedSchemas]: {
|
|
54
|
+
schema: ComputedSchemas[Name];
|
|
55
|
+
resolve(context: ComputedContext<SchemaOutput<NoInfer<SourceSchema>>, FileSource>): unknown;
|
|
56
|
+
}; } | { [Name_1 in keyof ComputedSchemas]: {
|
|
57
|
+
schema: ComputedSchemas[Name_1];
|
|
58
|
+
resolve(context: ComputedContext<SchemaOutput<NoInfer<SourceSchema>>, LoaderSource<NoInfer<ContentLoader>>>): unknown;
|
|
59
|
+
}; };
|
|
60
|
+
relationships: Relationships;
|
|
61
|
+
source?: never;
|
|
62
|
+
};
|
|
63
|
+
type Defined<SourceSchema extends StandardSchemaV1<unknown, Record<string, unknown>> | undefined, ComputedSchemas extends Record<string, Schema>, Relationships extends Record<string, Relationship>, ContentLoader extends Loader> = ReturnType<typeof collectionOf<SourceSchema, ComputedSchemas, Relationships, ContentLoader>>;
|
|
64
|
+
/**
|
|
65
|
+
* Declares fields with inferred schema data and optional loader source metadata, plus relationships.
|
|
66
|
+
* JSON, YAML, and TOML sources carry no built-in `_body` or `_rendered` payloads.
|
|
67
|
+
*/
|
|
68
|
+
export declare function defineCollection<const SourceSchema extends StandardSchemaV1<unknown, Record<string, unknown>> | undefined = undefined, const ComputedSchemas extends Record<string, Schema> = {}, const Relationships extends Record<string, Relationship> = {}>(definition: {
|
|
69
|
+
source: RecordSource;
|
|
70
|
+
loader?: never;
|
|
71
|
+
} & CollectionFields<SourceSchema, ComputedSchemas, Relationships, FileSource>): Defined<SourceSchema, ComputedSchemas, Relationships, Loader> & BuiltinPayloadMarker<false>;
|
|
72
|
+
/**
|
|
73
|
+
* Declares fields with inferred schema data and optional loader source metadata, plus relationships.
|
|
74
|
+
* Record loaders such as `file()` carry no built-in `_body` or `_rendered` payloads.
|
|
75
|
+
*/
|
|
76
|
+
export declare function defineCollection<const SourceSchema extends StandardSchemaV1<unknown, Record<string, unknown>> | undefined = undefined, const ComputedSchemas extends Record<string, Schema> = {}, const Relationships extends Record<string, Relationship> = {}, const ContentLoader extends Loader = Loader>(definition: Definition<SourceSchema, ComputedSchemas, Relationships, ContentLoader>): Defined<SourceSchema, ComputedSchemas, Relationships, ContentLoader> & BuiltinPayloadMarker<[ContentLoader] extends [RecordLoader] ? false : true>;
|
|
77
|
+
//#endregion
|
|
78
|
+
export type { BuiltinPayloads, CollectionDefinition, CollectionRegistry, CollectionSource, ComputedContext, ContentHeading, ContentRenderResult, DataEntry, DataStore, FileEntrySource, FileSource, Loader, LoaderConfig, LoaderContext, LoaderLogger, LoaderSource, LoaderWatcher, MaybePromise, MetaStore, PayloadsOf, QueryData, RecordLoader, Relationship, RenderedContent };
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { t as glob } from "./glob-Bv0dpvCQ.mjs";
|
|
2
|
+
import { t as assertServerOnly } from "./server-only-CIJUlyL-.mjs";
|
|
3
|
+
//#region src/collection/source.ts
|
|
4
|
+
const patterns = {
|
|
5
|
+
markdown: "**/*.md",
|
|
6
|
+
json: "**/*.json",
|
|
7
|
+
yaml: "**/*.{yaml,yml}",
|
|
8
|
+
toml: "**/*.toml"
|
|
9
|
+
};
|
|
10
|
+
/** Normalizes local-source convenience declarations into the existing native glob loader. */
|
|
11
|
+
function sourceLoader(source) {
|
|
12
|
+
const options = typeof source === "string" ? {
|
|
13
|
+
type: "markdown",
|
|
14
|
+
directory: source
|
|
15
|
+
} : source;
|
|
16
|
+
if (!options || !Object.hasOwn(patterns, options.type) || !options.directory || typeof options.directory !== "string" && !(options.directory instanceof URL)) throw new TypeError("source requires a directory and a supported type: markdown, json, yaml, or toml.");
|
|
17
|
+
return glob({
|
|
18
|
+
base: options.directory,
|
|
19
|
+
pattern: options.include ?? patterns[options.type],
|
|
20
|
+
..."generateId" in options ? { generateId: options.generateId } : {},
|
|
21
|
+
..."retainBody" in options ? { retainBody: options.retainBody } : {},
|
|
22
|
+
..."deferRender" in options ? { deferRender: options.deferRender } : {}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
//#region src/collection/define.ts
|
|
27
|
+
/** Normalizes either declaration form into a definition with a native loader. */
|
|
28
|
+
function collectionOf(definition) {
|
|
29
|
+
if (definition.source !== void 0 && definition.loader !== void 0) throw new TypeError("Specify either source or loader, not both.");
|
|
30
|
+
const loader = definition.loader ?? sourceLoader(definition.source);
|
|
31
|
+
return {
|
|
32
|
+
...definition,
|
|
33
|
+
loader,
|
|
34
|
+
schema: definition.schema,
|
|
35
|
+
computed: definition.computed ?? {},
|
|
36
|
+
relationships: definition.relationships ?? {}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function defineCollection(definition) {
|
|
40
|
+
return collectionOf(definition);
|
|
41
|
+
}
|
|
42
|
+
//#endregion
|
|
43
|
+
//#region src/index.ts
|
|
44
|
+
assertServerOnly();
|
|
45
|
+
//#endregion
|
|
46
|
+
export { defineCollection };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { n as ContentRenderResult } from "../types-Dh-Sydyw.mjs";
|
|
2
|
+
//#region src/runtime/markdown.d.ts
|
|
3
|
+
/** Compiles captured Markdown using only library-owned, portable processing code. */
|
|
4
|
+
export declare function renderMarkdown(body: string): Promise<ContentRenderResult>;
|
|
5
|
+
//#endregion
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { t as renderMarkdown } from "../markdown-CHvBBJNa.mjs";
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { n as ContentRenderResult } from "./types-Dh-Sydyw.mjs";
|
|
2
|
+
import { i as CollectionRegistry } from "./types-C-kdMblM.mjs";
|
|
3
|
+
import { a as ContentError, n as createLiveRuntime, r as PreparedRevision, t as Content } from "./content-G69dPPuo.mjs";
|
|
4
|
+
import { v as QueryRegistry } from "./relational-types-DgK3rLuw.mjs";
|
|
5
|
+
//#region src/artifacts/types.d.ts
|
|
6
|
+
type ArtifactManifest = {
|
|
7
|
+
version: number;
|
|
8
|
+
codec: string;
|
|
9
|
+
collections: QueryRegistry;
|
|
10
|
+
};
|
|
11
|
+
type EncodedCollection = {
|
|
12
|
+
records: readonly string[];
|
|
13
|
+
/** Lazy encoded built-in payloads, keyed by entry ID. */
|
|
14
|
+
builtins: Record<string, () => Promise<{
|
|
15
|
+
default: string;
|
|
16
|
+
}>>;
|
|
17
|
+
};
|
|
18
|
+
//#endregion
|
|
19
|
+
//#region src/artifacts/runtime.d.ts
|
|
20
|
+
/** Initializes generated/embedded prepared content. This versioned wiring is internal. */
|
|
21
|
+
export declare function createArtifactRevision(manifest: ArtifactManifest, collections: Record<string, EncodedCollection>, renderMarkdown?: (body: string) => Promise<ContentRenderResult>): PreparedRevision;
|
|
22
|
+
/** Initializes the public generated server export from a complete immutable artifact revision. */
|
|
23
|
+
export declare function createArtifactRuntime<Registry extends CollectionRegistry>(manifest: ArtifactManifest, collections: Record<string, EncodedCollection>, renderMarkdown?: (body: string) => Promise<ContentRenderResult>): Content<Registry>;
|
|
24
|
+
//#endregion
|
|
25
|
+
//#region src/artifacts/payloads.d.ts
|
|
26
|
+
/**
|
|
27
|
+
* Restores gzip/base64 JSON using a synchronous, portable decoder. Generated metadata indexes
|
|
28
|
+
* can initialize without asynchronous module evaluation or runtime-specific compression APIs.
|
|
29
|
+
*
|
|
30
|
+
* @param encoded - The base64 representation of a gzip-compressed JSON document.
|
|
31
|
+
* @returns The original JSON value; malformed input throws to the artifact error boundary.
|
|
32
|
+
*/
|
|
33
|
+
export declare function decodeCompressed<Value>(encoded: string): Value;
|
|
34
|
+
type PayloadChunk = {
|
|
35
|
+
ids: readonly string[];
|
|
36
|
+
load(): Promise<{
|
|
37
|
+
default: string | Record<string, string>;
|
|
38
|
+
}>;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Creates lazy entry loaders from compact chunk descriptors. Each chunk is imported and,
|
|
42
|
+
* when compressed, expanded once on first payload access. Encoded entry graphs retain the
|
|
43
|
+
* ordinary artifact codec; failed imports or decompression can be retried.
|
|
44
|
+
*
|
|
45
|
+
* @param chunks - Entry identities and lazy imports for raw or gzip/base64 payload maps.
|
|
46
|
+
* @returns One encoded-payload loader for each entry, without loading any content yet.
|
|
47
|
+
*/
|
|
48
|
+
export declare function createPayloadLoaders(chunks: readonly PayloadChunk[]): EncodedCollection["builtins"];
|
|
49
|
+
//#endregion
|
|
50
|
+
//#region src/runtime/diagnostics.d.ts
|
|
51
|
+
/** Restores the library error and its causes in a generated or isolated development runtime. */
|
|
52
|
+
export declare function restoreContentError(encoded: string): ContentError;
|
|
53
|
+
//#endregion
|
|
54
|
+
export { createLiveRuntime };
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { t as ContentError } from "./errors-C2iuBM0G.mjs";
|
|
2
|
+
import { r as decode } from "./values-BbTV4QT-.mjs";
|
|
3
|
+
import { i as prepareRelationships, n as createRuntime, t as createLiveRuntime } from "./content-N1gYshjg.mjs";
|
|
4
|
+
import { t as restoreContentError } from "./diagnostics-Cu94mZhl.mjs";
|
|
5
|
+
import { gunzipSync } from "fflate/browser";
|
|
6
|
+
//#region src/artifacts/runtime.ts
|
|
7
|
+
/** Initializes generated/embedded prepared content. This versioned wiring is internal. */
|
|
8
|
+
function createArtifactRevision(manifest, collections, renderMarkdown) {
|
|
9
|
+
try {
|
|
10
|
+
if (manifest.version !== 2 || manifest.codec !== "devalue-6.0.2") throw new Error("Incompatible content artifact or codec version; regenerate content.");
|
|
11
|
+
const revision = {
|
|
12
|
+
registry: manifest.collections,
|
|
13
|
+
collections: Object.create(null),
|
|
14
|
+
relations: /* @__PURE__ */ new Map(),
|
|
15
|
+
active: 0,
|
|
16
|
+
payloadCache: /* @__PURE__ */ new Map(),
|
|
17
|
+
renderCache: /* @__PURE__ */ new Map(),
|
|
18
|
+
renderMarkdown
|
|
19
|
+
};
|
|
20
|
+
for (const [name, descriptor] of Object.entries(manifest.collections)) {
|
|
21
|
+
const encoded = collections[name];
|
|
22
|
+
if (!encoded || !Array.isArray(encoded.records)) throw new Error(`Missing collection artifact "${name}".`);
|
|
23
|
+
const records = encoded.records.map((record) => decode(record));
|
|
24
|
+
if (records.some((record) => !record || typeof record !== "object" || Array.isArray(record) || !Object.hasOwn(record, "id") || typeof record.id !== "string" || !record.id || Object.hasOwn(record, "_adjacent") || Object.hasOwn(record, "_payloads")) || new Set(records.map((record) => record.id)).size !== records.length) throw new Error(`Invalid query records for collection "${name}".`);
|
|
25
|
+
revision.collections[name] = {
|
|
26
|
+
records,
|
|
27
|
+
relationships: descriptor.relationships,
|
|
28
|
+
builtins: new Map(Object.entries(encoded.builtins ?? {}).map(([id, load]) => [id, async () => decode((await load()).default)]))
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const errors = prepareRelationships(revision);
|
|
32
|
+
if (errors.length) throw errors[0];
|
|
33
|
+
return revision;
|
|
34
|
+
} catch (cause) {
|
|
35
|
+
throw new ContentError({
|
|
36
|
+
code: "artifact-error",
|
|
37
|
+
message: "Could not initialize prepared content.",
|
|
38
|
+
cause
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** Initializes the public generated server export from a complete immutable artifact revision. */
|
|
43
|
+
function createArtifactRuntime(manifest, collections, renderMarkdown) {
|
|
44
|
+
return createRuntime({ revision: createArtifactRevision(manifest, collections, renderMarkdown) });
|
|
45
|
+
}
|
|
46
|
+
//#endregion
|
|
47
|
+
//#region src/artifacts/payloads.ts
|
|
48
|
+
/**
|
|
49
|
+
* Restores gzip/base64 JSON using a synchronous, portable decoder. Generated metadata indexes
|
|
50
|
+
* can initialize without asynchronous module evaluation or runtime-specific compression APIs.
|
|
51
|
+
*
|
|
52
|
+
* @param encoded - The base64 representation of a gzip-compressed JSON document.
|
|
53
|
+
* @returns The original JSON value; malformed input throws to the artifact error boundary.
|
|
54
|
+
*/
|
|
55
|
+
function decodeCompressed(encoded) {
|
|
56
|
+
const binary = atob(encoded);
|
|
57
|
+
const bytes = new Uint8Array(binary.length);
|
|
58
|
+
for (let index = 0; index < binary.length; index++) bytes[index] = binary.charCodeAt(index);
|
|
59
|
+
return JSON.parse(new TextDecoder().decode(gunzipSync(bytes)));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Creates lazy entry loaders from compact chunk descriptors. Each chunk is imported and,
|
|
63
|
+
* when compressed, expanded once on first payload access. Encoded entry graphs retain the
|
|
64
|
+
* ordinary artifact codec; failed imports or decompression can be retried.
|
|
65
|
+
*
|
|
66
|
+
* @param chunks - Entry identities and lazy imports for raw or gzip/base64 payload maps.
|
|
67
|
+
* @returns One encoded-payload loader for each entry, without loading any content yet.
|
|
68
|
+
*/
|
|
69
|
+
function createPayloadLoaders(chunks) {
|
|
70
|
+
const loaders = Object.create(null);
|
|
71
|
+
for (const chunk of chunks) {
|
|
72
|
+
let loaded;
|
|
73
|
+
/** Shares one chunk import and decompression across concurrent entry requests. */
|
|
74
|
+
function load() {
|
|
75
|
+
loaded ??= Promise.resolve().then(() => chunk.load()).then((module) => {
|
|
76
|
+
if (typeof module.default !== "string") return module.default;
|
|
77
|
+
return decodeCompressed(module.default);
|
|
78
|
+
}).catch((cause) => {
|
|
79
|
+
loaded = void 0;
|
|
80
|
+
throw cause;
|
|
81
|
+
});
|
|
82
|
+
return loaded;
|
|
83
|
+
}
|
|
84
|
+
for (const id of chunk.ids) loaders[id] = async () => ({ default: (await load())[id] });
|
|
85
|
+
}
|
|
86
|
+
return loaders;
|
|
87
|
+
}
|
|
88
|
+
//#endregion
|
|
89
|
+
export { createArtifactRevision, createArtifactRuntime, createLiveRuntime, createPayloadLoaders, decodeCompressed, restoreContentError };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { a as Loader, c as LoaderLogger, d as MetaStore, f as RecordLoader, i as FileSource, l as LoaderSource, n as DataStore, o as LoaderConfig, r as FileEntrySource, s as LoaderContext, t as DataEntry, u as LoaderWatcher } from "./types-ChaNhj42.mjs";
|
|
2
|
+
import { n as GlobOptions, t as FileOptions } from "./descriptor-D9Th5hzk.mjs";
|
|
3
|
+
//#region src/loaders/file.d.ts
|
|
4
|
+
/** Declares a multi-entry data file with typed source paths and record keys, plus an optional parser. */
|
|
5
|
+
export declare function file(filename: string, options?: FileOptions): RecordLoader<FileEntrySource>;
|
|
6
|
+
//#endregion
|
|
7
|
+
//#region src/loaders/glob.d.ts
|
|
8
|
+
/** Declares local files with Astro-style IDs and typed, project-relative source paths. */
|
|
9
|
+
export declare function glob(options: GlobOptions): Loader<FileSource>;
|
|
10
|
+
//#endregion
|
|
11
|
+
export type { DataEntry, DataStore, FileEntrySource, FileOptions, FileSource, GlobOptions, Loader, LoaderConfig, LoaderContext, LoaderLogger, LoaderSource, LoaderWatcher, MetaStore, RecordLoader };
|