content-query 0.0.2 → 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.
Files changed (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +69 -2
  3. package/dist/build-C5ef0kkR.mjs +1401 -0
  4. package/dist/build-DSyoRxkZ.d.mts +24 -0
  5. package/dist/build.d.mts +2 -0
  6. package/dist/build.mjs +2 -0
  7. package/dist/chunk-CJs4Fogs.mjs +34 -0
  8. package/dist/cli.d.mts +1 -0
  9. package/dist/cli.mjs +97 -0
  10. package/dist/computed.d.mts +37 -0
  11. package/dist/computed.mjs +138 -0
  12. package/dist/content-Crag1Uch.d.mts +99 -0
  13. package/dist/content-Dj2fQCJ5.mjs +902 -0
  14. package/dist/descriptor-Xbo9u5eR.d.mts +19 -0
  15. package/dist/diagnostics-Dol6ANtq.mjs +79 -0
  16. package/dist/dist-BQGVLZyl.mjs +5396 -0
  17. package/dist/errors-C8lWyiy2.mjs +72 -0
  18. package/dist/github-slugger-BCAkwEOL.mjs +72 -0
  19. package/dist/glob-DJmebCMM.mjs +159 -0
  20. package/dist/index.d.mts +60 -0
  21. package/dist/index.mjs +43 -0
  22. package/dist/internal/markdown.d.mts +7 -0
  23. package/dist/internal/markdown.mjs +2 -0
  24. package/dist/internal.d.mts +54 -0
  25. package/dist/internal.mjs +89 -0
  26. package/dist/loaders.d.mts +12 -0
  27. package/dist/loaders.mjs +85 -0
  28. package/dist/markdown-CZBL4Ux_.mjs +54 -0
  29. package/dist/next.d.mts +21 -0
  30. package/dist/next.mjs +142 -0
  31. package/dist/operators-BQpLfJlx.mjs +173 -0
  32. package/dist/query.d.mts +45 -0
  33. package/dist/query.mjs +2 -0
  34. package/dist/relational-types-DLniKi5S.d.mts +245 -0
  35. package/dist/runtime.d.mts +3 -0
  36. package/dist/runtime.mjs +6 -0
  37. package/dist/schema-CnCbMosm.mjs +20 -0
  38. package/dist/schema.d.mts +13 -0
  39. package/dist/schema.mjs +2 -0
  40. package/dist/server-only-CIE-FHx0.mjs +7 -0
  41. package/dist/types-BPh2cBPs.d.mts +48 -0
  42. package/dist/types-DcvHRmxO.d.mts +20 -0
  43. package/dist/types-hmDOw87q.d.mts +135 -0
  44. package/dist/validation-BvvjSUFc.mjs +84 -0
  45. package/dist/values-B7lo_2_x.mjs +900 -0
  46. package/dist/vite.d.mts +8 -0
  47. package/dist/vite.mjs +296 -0
  48. package/package.json +90 -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-BvvjSUFc.mjs";
2
+ import { i as groupDiagnostics, n as contentError, r as describeCause, t as ContentError } from "./errors-C8lWyiy2.mjs";
3
+ import { n as slug } from "./github-slugger-BCAkwEOL.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,60 @@
1
+ import { a as Loader, c as LoaderLogger, d as MetaStore, f as MaybePromise, 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-hmDOw87q.mjs";
2
+ import { n as ContentRenderResult, r as RenderedContent, t as ContentHeading } from "./types-DcvHRmxO.mjs";
3
+ import { a as Relationship, c as SchemaOutput, i as QueryData, n as CollectionRegistry, r as ComputedContext, s as Schema, t as CollectionDefinition } from "./types-BPh2cBPs.mjs";
4
+ import { n as GlobOptions } from "./descriptor-Xbo9u5eR.mjs";
5
+ import { StandardSchemaV1 } from "@standard-schema/spec";
6
+
7
+ //#region src/collection/source.d.ts
8
+ type CollectionSource = string | ({
9
+ type: "markdown" | "json" | "yaml" | "toml";
10
+ directory: string | URL;
11
+ include?: string | string[];
12
+ } & Pick<GlobOptions, "generateId" | "retainBody" | "deferRender">);
13
+ //#endregion
14
+ //#region src/collection/define.d.ts
15
+ type CollectionFields<SourceSchema extends Schema | undefined, ComputedSchemas extends Record<string, Schema>, Relationships extends Record<string, Relationship>, Source> = {
16
+ schema?: SourceSchema;
17
+ computed?: { [Name in keyof ComputedSchemas]: {
18
+ schema: ComputedSchemas[Name];
19
+ resolve(context: ComputedContext<SchemaOutput<NoInfer<SourceSchema>>, Source>): unknown;
20
+ } };
21
+ relationships?: Relationships & { [Name in keyof Relationships]: {
22
+ from: keyof (SchemaOutput<NoInfer<SourceSchema>> & {
23
+ id: string;
24
+ } & { [Field in keyof ComputedSchemas]: SchemaOutput<ComputedSchemas[Field]> }) & string;
25
+ } };
26
+ };
27
+ /** Declares fields with inferred schema data and optional loader source metadata, plus relationships. */
28
+ 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: ({
29
+ source: CollectionSource;
30
+ loader?: never;
31
+ } & CollectionFields<SourceSchema, ComputedSchemas, Relationships, FileSource>) | ({
32
+ loader: ContentLoader;
33
+ source?: never;
34
+ } & CollectionFields<SourceSchema, ComputedSchemas, Relationships, LoaderSource<NoInfer<ContentLoader>>>)): {
35
+ loader: ContentLoader | Loader<FileSource>;
36
+ schema: SourceSchema;
37
+ computed: { [Name in keyof ComputedSchemas]: {
38
+ schema: ComputedSchemas[Name];
39
+ resolve(context: ComputedContext<SchemaOutput<NoInfer<SourceSchema>>, FileSource>): unknown;
40
+ } } | { [Name_1 in keyof ComputedSchemas]: {
41
+ schema: ComputedSchemas[Name_1];
42
+ resolve(context: ComputedContext<SchemaOutput<NoInfer<SourceSchema>>, LoaderSource<NoInfer<ContentLoader>>>): unknown;
43
+ } };
44
+ relationships: Relationships;
45
+ source: CollectionSource;
46
+ } | {
47
+ loader: ContentLoader | Loader<FileSource>;
48
+ schema: SourceSchema;
49
+ computed: { [Name in keyof ComputedSchemas]: {
50
+ schema: ComputedSchemas[Name];
51
+ resolve(context: ComputedContext<SchemaOutput<NoInfer<SourceSchema>>, FileSource>): unknown;
52
+ } } | { [Name_1 in keyof ComputedSchemas]: {
53
+ schema: ComputedSchemas[Name_1];
54
+ resolve(context: ComputedContext<SchemaOutput<NoInfer<SourceSchema>>, LoaderSource<NoInfer<ContentLoader>>>): unknown;
55
+ } };
56
+ relationships: Relationships;
57
+ source?: never;
58
+ };
59
+ //#endregion
60
+ export { type CollectionDefinition, type CollectionRegistry, type CollectionSource, type ComputedContext, type ContentHeading, type ContentRenderResult, type DataEntry, type DataStore, type FileEntrySource, type FileSource, type Loader, type LoaderConfig, type LoaderContext, type LoaderLogger, type LoaderSource, type LoaderWatcher, type MaybePromise, type MetaStore, type QueryData, type Relationship, type RenderedContent, defineCollection };
package/dist/index.mjs ADDED
@@ -0,0 +1,43 @@
1
+ import { t as glob } from "./glob-DJmebCMM.mjs";
2
+ import { t as assertServerOnly } from "./server-only-CIE-FHx0.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
+ /** Declares fields with inferred schema data and optional loader source metadata, plus relationships. */
28
+ function defineCollection(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
+ //#endregion
40
+ //#region src/index.ts
41
+ assertServerOnly();
42
+ //#endregion
43
+ export { defineCollection };
@@ -0,0 +1,7 @@
1
+ import { n as ContentRenderResult } from "../types-DcvHRmxO.mjs";
2
+
3
+ //#region src/runtime/markdown.d.ts
4
+ /** Compiles captured Markdown using only library-owned, portable processing code. */
5
+ declare function renderMarkdown(body: string): Promise<ContentRenderResult>;
6
+ //#endregion
7
+ export { renderMarkdown };
@@ -0,0 +1,2 @@
1
+ import { t as renderMarkdown } from "../markdown-CZBL4Ux_.mjs";
2
+ export { renderMarkdown };
@@ -0,0 +1,54 @@
1
+ import { n as ContentRenderResult } from "./types-DcvHRmxO.mjs";
2
+ import { n as CollectionRegistry } from "./types-BPh2cBPs.mjs";
3
+ import { a as ContentError, n as createLiveRuntime, r as PreparedRevision, t as Content } from "./content-Crag1Uch.mjs";
4
+ import { v as QueryRegistry } from "./relational-types-DLniKi5S.mjs";
5
+
6
+ //#region src/artifacts/types.d.ts
7
+ type ArtifactManifest = {
8
+ version: number;
9
+ codec: string;
10
+ collections: QueryRegistry;
11
+ };
12
+ type EncodedCollection = {
13
+ records: readonly string[];
14
+ payloads: 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
+ 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
+ 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
+ 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
+ declare function createPayloadLoaders(chunks: readonly PayloadChunk[]): EncodedCollection["payloads"];
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
+ declare function restoreContentError(encoded: string): ContentError;
53
+ //#endregion
54
+ export { createArtifactRevision, createArtifactRuntime, createLiveRuntime, createPayloadLoaders, decodeCompressed, restoreContentError };
@@ -0,0 +1,89 @@
1
+ import { t as ContentError } from "./errors-C8lWyiy2.mjs";
2
+ import { r as decode } from "./values-B7lo_2_x.mjs";
3
+ import { i as prepareRelationships, n as createRuntime, t as createLiveRuntime } from "./content-Dj2fQCJ5.mjs";
4
+ import { t as restoreContentError } from "./diagnostics-Dol6ANtq.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 !== 1 || 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) || 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
+ payloads: new Map(Object.entries(encoded.payloads).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,12 @@
1
+ import { a as Loader, c as LoaderLogger, d as MetaStore, 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-hmDOw87q.mjs";
2
+ import { n as GlobOptions, t as FileOptions } from "./descriptor-Xbo9u5eR.mjs";
3
+
4
+ //#region src/loaders/file.d.ts
5
+ /** Declares a multi-entry data file with typed source paths and record keys, plus an optional parser. */
6
+ declare function file(filename: string, options?: FileOptions): Loader<FileEntrySource>;
7
+ //#endregion
8
+ //#region src/loaders/glob.d.ts
9
+ /** Declares local files with Astro-style IDs and typed, project-relative source paths. */
10
+ declare function glob(options: GlobOptions): Loader<FileSource>;
11
+ //#endregion
12
+ export { type DataEntry, type DataStore, type FileEntrySource, type FileOptions, type FileSource, type GlobOptions, type Loader, type LoaderConfig, type LoaderContext, type LoaderLogger, type LoaderSource, type LoaderWatcher, type MetaStore, file, glob };