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.
Files changed (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +91 -2
  3. package/dist/build-DfKd2bpf.d.mts +25 -0
  4. package/dist/build-Dxz7P1ur.mjs +1439 -0
  5. package/dist/build.d.mts +2 -0
  6. package/dist/build.mjs +1 -0
  7. package/dist/cli.d.mts +1 -0
  8. package/dist/cli.mjs +97 -0
  9. package/dist/computed.d.mts +43 -0
  10. package/dist/computed.mjs +139 -0
  11. package/dist/content-G69dPPuo.d.mts +109 -0
  12. package/dist/content-N1gYshjg.mjs +1028 -0
  13. package/dist/descriptor-D9Th5hzk.d.mts +18 -0
  14. package/dist/diagnostics-Cu94mZhl.mjs +80 -0
  15. package/dist/dist-C7_FOzY_.mjs +5405 -0
  16. package/dist/errors-C2iuBM0G.mjs +72 -0
  17. package/dist/github-slugger-BMgR_Q0I.mjs +72 -0
  18. package/dist/glob-Bv0dpvCQ.mjs +159 -0
  19. package/dist/index.d.mts +78 -0
  20. package/dist/index.mjs +46 -0
  21. package/dist/internal/markdown.d.mts +5 -0
  22. package/dist/internal/markdown.mjs +1 -0
  23. package/dist/internal.d.mts +54 -0
  24. package/dist/internal.mjs +89 -0
  25. package/dist/loaders.d.mts +11 -0
  26. package/dist/loaders.mjs +86 -0
  27. package/dist/markdown-CHvBBJNa.mjs +54 -0
  28. package/dist/next.d.mts +20 -0
  29. package/dist/next.mjs +142 -0
  30. package/dist/operators-UqWUhKQJ.mjs +173 -0
  31. package/dist/query.d.mts +44 -0
  32. package/dist/query.mjs +1 -0
  33. package/dist/relational-types-DgK3rLuw.d.mts +278 -0
  34. package/dist/rolldown-runtime-Bg1v5YCA.mjs +34 -0
  35. package/dist/runtime.d.mts +3 -0
  36. package/dist/runtime.mjs +5 -0
  37. package/dist/schema-C5Str-E8.mjs +20 -0
  38. package/dist/schema.d.mts +11 -0
  39. package/dist/schema.mjs +1 -0
  40. package/dist/server-only-CIJUlyL-.mjs +7 -0
  41. package/dist/types-C-kdMblM.d.mts +69 -0
  42. package/dist/types-ChaNhj42.d.mts +143 -0
  43. package/dist/types-Dh-Sydyw.d.mts +20 -0
  44. package/dist/validation-D_XdE1pF.mjs +84 -0
  45. package/dist/values-BbTV4QT-.mjs +901 -0
  46. package/dist/vite.d.mts +6 -0
  47. package/dist/vite.mjs +296 -0
  48. 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 };
@@ -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 };