@pagesmith/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +481 -0
- package/assets/fonts/OFL.txt +7 -0
- package/assets/fonts/jetbrains-mono-variable.woff2 +0 -0
- package/assets/fonts/open-sans-variable.woff2 +0 -0
- package/assets/fonts.css +17 -0
- package/dist/ai/index.d.mts +41 -0
- package/dist/ai/index.d.mts.map +1 -0
- package/dist/ai/index.mjs +414 -0
- package/dist/ai/index.mjs.map +1 -0
- package/dist/assets/index.d.mts +31 -0
- package/dist/assets/index.d.mts.map +1 -0
- package/dist/assets/index.mjs +2 -0
- package/dist/assets-bX08zEJm.mjs +155 -0
- package/dist/assets-bX08zEJm.mjs.map +1 -0
- package/dist/content-config-fHPaFZ7i.d.mts +1128 -0
- package/dist/content-config-fHPaFZ7i.d.mts.map +1 -0
- package/dist/content-layer-B7fQ3im4.mjs +590 -0
- package/dist/content-layer-B7fQ3im4.mjs.map +1 -0
- package/dist/convert-DnuB6SVV.mjs +52 -0
- package/dist/convert-DnuB6SVV.mjs.map +1 -0
- package/dist/create/index.d.mts +20 -0
- package/dist/create/index.d.mts.map +1 -0
- package/dist/create/index.mjs +215 -0
- package/dist/create/index.mjs.map +1 -0
- package/dist/css/index.d.mts +2 -0
- package/dist/css/index.mjs +2 -0
- package/dist/css-ekIt2Fdb.mjs +19 -0
- package/dist/css-ekIt2Fdb.mjs.map +1 -0
- package/dist/heading-Dhvzlay-.d.mts +27 -0
- package/dist/heading-Dhvzlay-.d.mts.map +1 -0
- package/dist/index-BQ6B1-qG.d.mts +41 -0
- package/dist/index-BQ6B1-qG.d.mts.map +1 -0
- package/dist/index-CeNDTM-y.d.mts +7 -0
- package/dist/index-CeNDTM-y.d.mts.map +1 -0
- package/dist/index-DpRBzO8Q.d.mts +15 -0
- package/dist/index-DpRBzO8Q.d.mts.map +1 -0
- package/dist/index-sFCx17CD.d.mts +59 -0
- package/dist/index-sFCx17CD.d.mts.map +1 -0
- package/dist/index.d.mts +131 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +56 -0
- package/dist/index.mjs.map +1 -0
- package/dist/jsx-runtime/index.d.mts +24 -0
- package/dist/jsx-runtime/index.d.mts.map +1 -0
- package/dist/jsx-runtime/index.mjs +88 -0
- package/dist/jsx-runtime/index.mjs.map +1 -0
- package/dist/loaders/index.d.mts +3 -0
- package/dist/loaders/index.mjs +2 -0
- package/dist/loaders-DyABmDrE.mjs +179 -0
- package/dist/loaders-DyABmDrE.mjs.map +1 -0
- package/dist/markdown/index.d.mts +3 -0
- package/dist/markdown/index.mjs +2 -0
- package/dist/markdown-Cj5X26FL.mjs +95 -0
- package/dist/markdown-Cj5X26FL.mjs.map +1 -0
- package/dist/runtime/index.d.mts +28 -0
- package/dist/runtime/index.d.mts.map +1 -0
- package/dist/runtime/index.mjs +90 -0
- package/dist/runtime/index.mjs.map +1 -0
- package/dist/schemas/index.d.mts +4 -0
- package/dist/schemas/index.mjs +2 -0
- package/dist/schemas-DJS7wOzd.mjs +47 -0
- package/dist/schemas-DJS7wOzd.mjs.map +1 -0
- package/dist/types-DUsjRE7Y.d.mts +28 -0
- package/dist/types-DUsjRE7Y.d.mts.map +1 -0
- package/dist/vite/index.d.mts +9878 -0
- package/dist/vite/index.d.mts.map +1 -0
- package/dist/vite/index.mjs +549 -0
- package/dist/vite/index.mjs.map +1 -0
- package/package.json +136 -0
- package/src/styles/code/inline.css +26 -0
- package/src/styles/content/alerts.css +87 -0
- package/src/styles/content/prose.css +225 -0
- package/src/styles/content/toc.css +87 -0
- package/src/styles/content.css +22 -0
- package/src/styles/foundations/reset.css +49 -0
- package/src/styles/foundations/tokens.css +66 -0
- package/src/styles/layout/grid.css +179 -0
- package/src/styles/layout/sidebar.css +18 -0
- package/src/styles/standalone.css +18 -0
- package/src/styles/viewport.css +20 -0
- package/templates/docs/content/README.md +18 -0
- package/templates/docs/content/guide/README.md +11 -0
- package/templates/docs/content/guide/getting-started/README.md +9 -0
- package/templates/docs/content/reference/README.md +11 -0
- package/templates/docs/pagesmith.config.json5 +15 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-sFCx17CD.d.mts","names":[],"sources":["../src/loaders/json.ts","../src/loaders/jsonc.ts","../src/loaders/errors.ts","../src/loaders/markdown.ts","../src/loaders/toml.ts","../src/loaders/yaml.ts","../src/loaders/index.ts"],"mappings":";;;cAWa,UAAA,YAAsB,MAAA;EACjC,IAAA;EACA,IAAA;EACA,UAAA;EAEA,IAAA,CAAK,QAAA,WAAmB,YAAA;AAAA;;;cCoCb,WAAA,YAAuB,MAAA;EAClC,IAAA;EACA,IAAA;EACA,UAAA;EAEA,IAAA,CAAK,QAAA,WAAmB,YAAA;AAAA;;;cCzDb,WAAA,SAAoB,KAAA;EAAA,SACtB,QAAA;EAAA,SACA,MAAA;EAAA,SACA,IAAA;EAAA,SACA,MAAA;cAEG,OAAA,UAAiB,QAAA,UAAkB,MAAA,UAAgB,IAAA,WAAe,MAAA;AAAA;;;cCOnE,cAAA,YAA0B,MAAA;EACrC,IAAA;EACA,IAAA;EACA,UAAA;EAEA,IAAA,CAAK,QAAA,WAAmB,YAAA;AAAA;;;cCTb,UAAA,YAAsB,MAAA;EACjC,IAAA;EACA,IAAA;EACA,UAAA;EAEA,IAAA,CAAK,QAAA,WAAmB,YAAA;AAAA;;;cCLb,UAAA,YAAsB,MAAA;EACjC,IAAA;EACA,IAAA;EACA,UAAA;EAEA,IAAA,CAAK,QAAA,WAAmB,YAAA;AAAA;;;;iBCMV,aAAA,CAAc,YAAA,EAAc,UAAA,GAAa,MAAA,GAAS,MAAA;;iBAqBlD,sBAAA,CAAuB,MAAA,EAAQ,MAAA"}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { AiArtifact, AiArtifactKind, AiAssistant, AiInstallOptions, AiInstallResult, AiInstallScope, getAiArtifactContent, getAiArtifacts, installAiArtifacts } from "./ai/index.mjs";
|
|
2
|
+
import { t as buildCss } from "./index-CeNDTM-y.mjs";
|
|
3
|
+
import { n as LoaderResult, r as LoaderType, t as Loader } from "./types-DUsjRE7Y.mjs";
|
|
4
|
+
import { a as CollectionMap, c as RawEntry, d as ValidationEntryResult, f as ValidationIssue, i as CollectionDef, l as ContentValidator, n as ContentPlugin, o as InferCollectionData, p as ValidationResult, r as CollectionComputed, s as InferCollectionLoaderKind, t as ContentLayerConfig, u as ValidatorContext } from "./content-config-fHPaFZ7i.mjs";
|
|
5
|
+
import { i as MarkdownConfigSchema, n as HeadingSchema, r as MarkdownConfig, t as Heading } from "./heading-Dhvzlay-.mjs";
|
|
6
|
+
import { Fragment, HtmlString, h } from "./jsx-runtime/index.mjs";
|
|
7
|
+
import { n as processMarkdown, t as MarkdownResult } from "./index-DpRBzO8Q.mjs";
|
|
8
|
+
import { a as ProjectFrontmatter, i as BlogFrontmatterSchema, n as BaseFrontmatterSchema, o as ProjectFrontmatterSchema, r as BlogFrontmatter, t as BaseFrontmatter } from "./index-BQ6B1-qG.mjs";
|
|
9
|
+
import { a as MarkdownLoader, c as JsonLoader, i as TomlLoader, r as YamlLoader, s as JsoncLoader } from "./index-sFCx17CD.mjs";
|
|
10
|
+
import { ZodSchema, z, z as z$1 } from "zod";
|
|
11
|
+
|
|
12
|
+
//#region src/config.d.ts
|
|
13
|
+
/** Define a content layer configuration with type inference. */
|
|
14
|
+
declare function defineConfig(config: ContentLayerConfig): ContentLayerConfig;
|
|
15
|
+
/** Define a collection with Zod schema type inference. */
|
|
16
|
+
declare function defineCollection<const S extends z$1.ZodType, const TComputed extends CollectionComputed = {}, const TLoader extends LoaderType | Loader = LoaderType | Loader>(def: Omit<CollectionDef<S, TComputed, TLoader>, 'computed'> & {
|
|
17
|
+
computed?: TComputed & CollectionComputed;
|
|
18
|
+
}): CollectionDef<S, TComputed, TLoader>;
|
|
19
|
+
/** Define a named collection map with strong literal inference. */
|
|
20
|
+
declare function defineCollections<const TCollections extends CollectionMap>(collections: TCollections): TCollections;
|
|
21
|
+
//#endregion
|
|
22
|
+
//#region src/convert.d.ts
|
|
23
|
+
type ConvertOptions = {
|
|
24
|
+
markdown?: MarkdownConfig;
|
|
25
|
+
};
|
|
26
|
+
type ConvertResult = {
|
|
27
|
+
html: string;
|
|
28
|
+
toc: Heading[];
|
|
29
|
+
frontmatter: Record<string, any>;
|
|
30
|
+
};
|
|
31
|
+
declare function convert(input: string, options?: ConvertOptions): Promise<ConvertResult>;
|
|
32
|
+
//#endregion
|
|
33
|
+
//#region src/entry.d.ts
|
|
34
|
+
type RenderedContent = {
|
|
35
|
+
/** Processed HTML */html: string; /** Extracted headings for TOC */
|
|
36
|
+
headings: Heading[]; /** Estimated read time in minutes */
|
|
37
|
+
readTime: number;
|
|
38
|
+
};
|
|
39
|
+
declare class ContentEntry<T = Record<string, any>> {
|
|
40
|
+
/** URL-friendly identifier */
|
|
41
|
+
readonly slug: string;
|
|
42
|
+
/** Collection this entry belongs to */
|
|
43
|
+
readonly collection: string;
|
|
44
|
+
/** Absolute path to source file */
|
|
45
|
+
readonly filePath: string;
|
|
46
|
+
/** Validated data (frontmatter or parsed data) */
|
|
47
|
+
readonly data: T;
|
|
48
|
+
/** Raw body content (markdown only) */
|
|
49
|
+
readonly rawContent?: string;
|
|
50
|
+
/** Cached render result */
|
|
51
|
+
private _rendered?;
|
|
52
|
+
/** Markdown config for rendering */
|
|
53
|
+
private _markdownConfig;
|
|
54
|
+
constructor(slug: string, collection: string, filePath: string, data: T, rawContent: string | undefined, markdownConfig: MarkdownConfig);
|
|
55
|
+
/** Render the entry content to HTML. Cached after first call. */
|
|
56
|
+
render(options?: {
|
|
57
|
+
force?: boolean;
|
|
58
|
+
}): Promise<RenderedContent>;
|
|
59
|
+
/** Clear cached render result. */
|
|
60
|
+
clearRenderCache(): void;
|
|
61
|
+
}
|
|
62
|
+
//#endregion
|
|
63
|
+
//#region src/validation/code-block-validator.d.ts
|
|
64
|
+
declare const codeBlockValidator: ContentValidator;
|
|
65
|
+
//#endregion
|
|
66
|
+
//#region src/validation/heading-validator.d.ts
|
|
67
|
+
declare const headingValidator: ContentValidator;
|
|
68
|
+
//#endregion
|
|
69
|
+
//#region src/validation/link-validator.d.ts
|
|
70
|
+
declare const linkValidator: ContentValidator;
|
|
71
|
+
//#endregion
|
|
72
|
+
//#region src/validation/runner.d.ts
|
|
73
|
+
/** The built-in validators for markdown content. */
|
|
74
|
+
declare const builtinMarkdownValidators: ContentValidator[];
|
|
75
|
+
/** Run all validators on a single content entry. */
|
|
76
|
+
declare function runValidators(ctx: ValidatorContext, validators: ContentValidator[]): Promise<ValidationIssue[]>;
|
|
77
|
+
//#endregion
|
|
78
|
+
//#region src/content-layer.d.ts
|
|
79
|
+
interface ContentLayer {
|
|
80
|
+
/** Get all entries in a collection. */
|
|
81
|
+
getCollection(name: string): Promise<ContentEntry<any>[]>;
|
|
82
|
+
/** Get a single entry by collection name and slug. */
|
|
83
|
+
getEntry(collection: string, slug: string): Promise<ContentEntry<any> | undefined>;
|
|
84
|
+
/** Convert raw markdown to HTML (no collection, no validation). */
|
|
85
|
+
convert(markdown: string, options?: LayerConvertOptions): Promise<ConvertResult>;
|
|
86
|
+
/** Invalidate a single entry's cache. */
|
|
87
|
+
invalidate(collection: string, slug: string): void;
|
|
88
|
+
/** Invalidate an entire collection's cache. */
|
|
89
|
+
invalidateCollection(collection: string): void;
|
|
90
|
+
/** Invalidate all cached data. */
|
|
91
|
+
invalidateAll(): void;
|
|
92
|
+
/** Validate all entries in a collection (or all collections). */
|
|
93
|
+
validate(collection?: string): Promise<ValidationResult[]>;
|
|
94
|
+
/** Get the names of all configured collections. */
|
|
95
|
+
getCollectionNames(): string[];
|
|
96
|
+
/** Get the definition of a collection. */
|
|
97
|
+
getCollectionDef(name: string): CollectionDef | undefined;
|
|
98
|
+
}
|
|
99
|
+
type LayerConvertOptions = {
|
|
100
|
+
markdown?: MarkdownConfig;
|
|
101
|
+
};
|
|
102
|
+
/** Create a new content layer from a configuration. */
|
|
103
|
+
declare function createContentLayer(config: ContentLayerConfig): ContentLayer;
|
|
104
|
+
//#endregion
|
|
105
|
+
//#region src/frontmatter.d.ts
|
|
106
|
+
type FrontmatterResult = {
|
|
107
|
+
frontmatter: Record<string, any>;
|
|
108
|
+
content: string;
|
|
109
|
+
};
|
|
110
|
+
/** Extract frontmatter from raw markdown using gray-matter. */
|
|
111
|
+
declare function extractFrontmatter(raw: string): FrontmatterResult;
|
|
112
|
+
/** Validate frontmatter against a Zod schema. Returns parsed data or throws. */
|
|
113
|
+
declare function validateFrontmatter<T>(frontmatter: Record<string, any>, schema: ZodSchema<T>): {
|
|
114
|
+
success: true;
|
|
115
|
+
data: T;
|
|
116
|
+
} | {
|
|
117
|
+
success: false;
|
|
118
|
+
errors: string[];
|
|
119
|
+
};
|
|
120
|
+
//#endregion
|
|
121
|
+
//#region src/toc.d.ts
|
|
122
|
+
/**
|
|
123
|
+
* Extract table of contents headings from an HTML string.
|
|
124
|
+
*
|
|
125
|
+
* Regex-based: finds <h[1-6] id="...">text</h[1-6]>, strips inner HTML tags.
|
|
126
|
+
* No dependency on unified — works on any HTML string.
|
|
127
|
+
*/
|
|
128
|
+
declare function extractToc(html: string): Heading[];
|
|
129
|
+
//#endregion
|
|
130
|
+
export { type AiArtifact, type AiArtifactKind, type AiAssistant, type AiInstallOptions, type AiInstallResult, type AiInstallScope, type BaseFrontmatter, BaseFrontmatterSchema, type BlogFrontmatter, BlogFrontmatterSchema, type CollectionComputed, type CollectionDef, type CollectionMap, ContentEntry, type ContentLayer, type ContentLayerConfig, type ContentPlugin, type ContentValidator, type ConvertOptions, type ConvertResult, Fragment, type FrontmatterResult, type Heading, HeadingSchema, HtmlString, type InferCollectionData, type InferCollectionLoaderKind, JsonLoader, JsoncLoader, type LayerConvertOptions, type Loader, type LoaderResult, type LoaderType, type MarkdownConfig, MarkdownConfigSchema, MarkdownLoader, type MarkdownResult, type ProjectFrontmatter, ProjectFrontmatterSchema, type RawEntry, type RenderedContent, TomlLoader, type ValidationEntryResult, type ValidationIssue, type ValidationResult, type ValidatorContext, YamlLoader, buildCss, builtinMarkdownValidators, codeBlockValidator, convert, createContentLayer, defineCollection, defineCollections, defineConfig, extractFrontmatter, extractToc, getAiArtifactContent, getAiArtifacts, h, headingValidator, installAiArtifacts, linkValidator, processMarkdown, runValidators, validateFrontmatter, z };
|
|
131
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/config.ts","../src/convert.ts","../src/entry.ts","../src/validation/code-block-validator.ts","../src/validation/heading-validator.ts","../src/validation/link-validator.ts","../src/validation/runner.ts","../src/content-layer.ts","../src/frontmatter.ts","../src/toc.ts"],"mappings":";;;;;;;;;;;;;iBAagB,YAAA,CAAa,MAAA,EAAQ,kBAAA,GAAqB,kBAAA;AAA1D;AAAA,iBAKgB,gBAAA,iBACE,GAAA,CAAE,OAAA,0BACM,kBAAA,6BACF,UAAA,GAAa,MAAA,GAAS,UAAA,GAAa,MAAA,CAAA,CAEzD,GAAA,EAAK,IAAA,CAAK,aAAA,CAAc,CAAA,EAAG,SAAA,EAAW,OAAA;EACpC,QAAA,GAAW,SAAA,GAAY,kBAAA;AAAA,IAExB,aAAA,CAAc,CAAA,EAAG,SAAA,EAAW,OAAA;;iBAKf,iBAAA,4BAA6C,aAAA,CAAA,CAC3D,WAAA,EAAa,YAAA,GACZ,YAAA;;;KC5BS,cAAA;EACV,QAAA,GAAW,cAAA;AAAA;AAAA,KAGD,aAAA;EACV,IAAA;EACA,GAAA,EAAK,OAAA;EACL,WAAA,EAAa,MAAA;AAAA;AAAA,iBAGO,OAAA,CAAQ,KAAA,UAAe,OAAA,GAAS,cAAA,GAAsB,OAAA,CAAQ,aAAA;;;KCHxE,eAAA;uBAEV,IAAA;EAEA,QAAA,EAAU,OAAA,IFHgB;EEK1B,QAAA;AAAA;AAAA,cAGW,YAAA,KAAiB,MAAA;EFRD;EAAA,SEUlB,IAAA;EFViE;EAAA,SEYjE,UAAA;EFPK;EAAA,SESL,QAAA;EFTqB;EAAA,SEWrB,IAAA,EAAM,CAAA;EFTS;EAAA,SEWf,UAAA;EFV0B;EAAA,QEa3B,SAAA;EFbiD;EAAA,QEejD,eAAA;cAGN,IAAA,UACA,UAAA,UACA,QAAA,UACA,IAAA,EAAM,CAAA,EACN,UAAA,sBACA,cAAA,EAAgB,cAAA;EFrBoB;EEgChC,MAAA,CAAO,OAAA;IAAY,KAAA;EAAA,IAAoB,OAAA,CAAQ,eAAA;EF/B5B;EE0DzB,gBAAA,CAAA;AAAA;;;cCnBW,kBAAA,EAAoB,gBAAA;;;cClBpB,gBAAA,EAAkB,gBAAA;;;cCYlB,aAAA,EAAe,gBAAA;;;;cCxCf,yBAAA,EAA2B,gBAAA;;iBAOlB,aAAA,CACpB,GAAA,EAAK,gBAAA,EACL,UAAA,EAAY,gBAAA,KACX,OAAA,CAAQ,eAAA;;;UCTM,YAAA;EPLoB;EOOnC,aAAA,CAAc,IAAA,WAAe,OAAA,CAAQ,YAAA;EPPmB;EOUxD,QAAA,CAAS,UAAA,UAAoB,IAAA,WAAe,OAAA,CAAQ,YAAA;EPVsB;EOa1E,OAAA,CAAQ,QAAA,UAAkB,OAAA,GAAU,mBAAA,GAAsB,OAAA,CAAQ,aAAA;EPRpC;EOW9B,UAAA,CAAW,UAAA,UAAoB,IAAA;EPVf;EOahB,oBAAA,CAAqB,UAAA;EPXC;EOctB,aAAA;EPd4C;EOiB5C,QAAA,CAAS,UAAA,YAAsB,OAAA,CAAQ,gBAAA;EPff;EOkBxB,kBAAA;EPlBsC;EOqBtC,gBAAA,CAAiB,IAAA,WAAe,aAAA;AAAA;AAAA,KAGtB,mBAAA;EACV,QAAA,GAAW,cAAA;AAAA;;iBA6FG,kBAAA,CAAmB,MAAA,EAAQ,kBAAA,GAAqB,YAAA;;;KClIpD,iBAAA;EACV,WAAA,EAAa,MAAA;EACb,OAAA;AAAA;;iBAIc,kBAAA,CAAmB,GAAA,WAAc,iBAAA;;iBAMjC,mBAAA,GAAA,CACd,WAAA,EAAa,MAAA,eACb,MAAA,EAAQ,SAAA,CAAU,CAAA;EACf,OAAA;EAAe,IAAA,EAAM,CAAA;AAAA;EAAQ,OAAA;EAAgB,MAAA;AAAA;;;;;;;;;iBClBlC,UAAA,CAAW,IAAA,WAAe,OAAA"}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { r as extractToc, t as convert } from "./convert-DnuB6SVV.mjs";
|
|
2
|
+
import { t as processMarkdown } from "./markdown-Cj5X26FL.mjs";
|
|
3
|
+
import { a as headingValidator, c as ContentEntry, i as linkValidator, n as builtinMarkdownValidators, o as codeBlockValidator, r as runValidators, t as createContentLayer } from "./content-layer-B7fQ3im4.mjs";
|
|
4
|
+
import { a as MarkdownLoader, i as TomlLoader, o as JsoncLoader, r as YamlLoader, s as JsonLoader } from "./loaders-DyABmDrE.mjs";
|
|
5
|
+
import { Fragment, HtmlString, h } from "./jsx-runtime/index.mjs";
|
|
6
|
+
import { t as buildCss } from "./css-ekIt2Fdb.mjs";
|
|
7
|
+
import { a as ProjectFrontmatterSchema, i as BlogFrontmatterSchema, n as HeadingSchema, r as BaseFrontmatterSchema, t as MarkdownConfigSchema } from "./schemas-DJS7wOzd.mjs";
|
|
8
|
+
import { getAiArtifactContent, getAiArtifacts, installAiArtifacts } from "./ai/index.mjs";
|
|
9
|
+
import matter from "gray-matter";
|
|
10
|
+
import { parse } from "yaml";
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
//#region src/config.ts
|
|
13
|
+
/** Define a content layer configuration with type inference. */
|
|
14
|
+
function defineConfig(config) {
|
|
15
|
+
return config;
|
|
16
|
+
}
|
|
17
|
+
/** Define a collection with Zod schema type inference. */
|
|
18
|
+
function defineCollection(def) {
|
|
19
|
+
return def;
|
|
20
|
+
}
|
|
21
|
+
/** Define a named collection map with strong literal inference. */
|
|
22
|
+
function defineCollections(collections) {
|
|
23
|
+
return collections;
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
//#region src/frontmatter.ts
|
|
27
|
+
/**
|
|
28
|
+
* Frontmatter extraction and validation.
|
|
29
|
+
*
|
|
30
|
+
* Uses gray-matter to parse YAML frontmatter from markdown,
|
|
31
|
+
* and optionally validates against a Zod schema.
|
|
32
|
+
*/
|
|
33
|
+
/** Extract frontmatter from raw markdown using gray-matter. */
|
|
34
|
+
function extractFrontmatter(raw) {
|
|
35
|
+
const { data, content } = matter(raw, { engines: { yaml: parse } });
|
|
36
|
+
return {
|
|
37
|
+
frontmatter: data,
|
|
38
|
+
content
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/** Validate frontmatter against a Zod schema. Returns parsed data or throws. */
|
|
42
|
+
function validateFrontmatter(frontmatter, schema) {
|
|
43
|
+
const result = schema.safeParse(frontmatter);
|
|
44
|
+
if (result.success) return {
|
|
45
|
+
success: true,
|
|
46
|
+
data: result.data
|
|
47
|
+
};
|
|
48
|
+
return {
|
|
49
|
+
success: false,
|
|
50
|
+
errors: result.error.issues.map((issue) => `${issue.path.join(".")}: ${issue.message}`)
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//#endregion
|
|
54
|
+
export { BaseFrontmatterSchema, BlogFrontmatterSchema, ContentEntry, Fragment, HeadingSchema, HtmlString, JsonLoader, JsoncLoader, MarkdownConfigSchema, MarkdownLoader, ProjectFrontmatterSchema, TomlLoader, YamlLoader, buildCss, builtinMarkdownValidators, codeBlockValidator, convert, createContentLayer, defineCollection, defineCollections, defineConfig, extractFrontmatter, extractToc, getAiArtifactContent, getAiArtifacts, h, headingValidator, installAiArtifacts, linkValidator, processMarkdown, runValidators, validateFrontmatter, z };
|
|
55
|
+
|
|
56
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["parseYaml"],"sources":["../src/config.ts","../src/frontmatter.ts"],"sourcesContent":["/**\n * Configuration helpers.\n *\n * defineConfig() and defineCollection() are type-safe identity functions\n * that provide TypeScript inference for collection schemas.\n */\n\nimport type { z } from 'zod'\nimport type { CollectionComputed, CollectionDef, CollectionMap } from './schemas/collection'\nimport type { Loader, LoaderType } from './loaders/types'\nimport type { ContentLayerConfig } from './schemas/content-config'\n\n/** Define a content layer configuration with type inference. */\nexport function defineConfig(config: ContentLayerConfig): ContentLayerConfig {\n return config\n}\n\n/** Define a collection with Zod schema type inference. */\nexport function defineCollection<\n const S extends z.ZodType,\n const TComputed extends CollectionComputed = {},\n const TLoader extends LoaderType | Loader = LoaderType | Loader,\n>(\n def: Omit<CollectionDef<S, TComputed, TLoader>, 'computed'> & {\n computed?: TComputed & CollectionComputed\n },\n): CollectionDef<S, TComputed, TLoader> {\n return def\n}\n\n/** Define a named collection map with strong literal inference. */\nexport function defineCollections<const TCollections extends CollectionMap>(\n collections: TCollections,\n): TCollections {\n return collections\n}\n","/**\n * Frontmatter extraction and validation.\n *\n * Uses gray-matter to parse YAML frontmatter from markdown,\n * and optionally validates against a Zod schema.\n */\n\nimport matter from 'gray-matter'\nimport { parse as parseYaml } from 'yaml'\nimport type { ZodSchema } from 'zod'\n\nexport type FrontmatterResult = {\n frontmatter: Record<string, any>\n content: string\n}\n\n/** Extract frontmatter from raw markdown using gray-matter. */\nexport function extractFrontmatter(raw: string): FrontmatterResult {\n const { data, content } = matter(raw, { engines: { yaml: parseYaml } })\n return { frontmatter: data, content }\n}\n\n/** Validate frontmatter against a Zod schema. Returns parsed data or throws. */\nexport function validateFrontmatter<T>(\n frontmatter: Record<string, any>,\n schema: ZodSchema<T>,\n): { success: true; data: T } | { success: false; errors: string[] } {\n const result = schema.safeParse(frontmatter)\n if (result.success) {\n return { success: true, data: result.data }\n }\n const errors = result.error.issues.map((issue) => `${issue.path.join('.')}: ${issue.message}`)\n return { success: false, errors }\n}\n"],"mappings":";;;;;;;;;;;;;AAaA,SAAgB,aAAa,QAAgD;AAC3E,QAAO;;;AAIT,SAAgB,iBAKd,KAGsC;AACtC,QAAO;;;AAIT,SAAgB,kBACd,aACc;AACd,QAAO;;;;;;;;;;;ACjBT,SAAgB,mBAAmB,KAAgC;CACjE,MAAM,EAAE,MAAM,YAAY,OAAO,KAAK,EAAE,SAAS,EAAE,MAAMA,OAAW,EAAE,CAAC;AACvE,QAAO;EAAE,aAAa;EAAM;EAAS;;;AAIvC,SAAgB,oBACd,aACA,QACmE;CACnE,MAAM,SAAS,OAAO,UAAU,YAAY;AAC5C,KAAI,OAAO,QACT,QAAO;EAAE,SAAS;EAAM,MAAM,OAAO;EAAM;AAG7C,QAAO;EAAE,SAAS;EAAO,QADV,OAAO,MAAM,OAAO,KAAK,UAAU,GAAG,MAAM,KAAK,KAAK,IAAI,CAAC,IAAI,MAAM,UAAU;EAC7D"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//#region src/jsx-runtime/index.d.ts
|
|
2
|
+
declare class HtmlString {
|
|
3
|
+
value: string;
|
|
4
|
+
constructor(value: string);
|
|
5
|
+
toString(): string;
|
|
6
|
+
}
|
|
7
|
+
declare function h(tag: string | ((props: any) => HtmlString), props: Record<string, unknown> | null, ...children: unknown[]): HtmlString;
|
|
8
|
+
declare function Fragment(props: {
|
|
9
|
+
children?: unknown;
|
|
10
|
+
innerHTML?: string;
|
|
11
|
+
}): HtmlString;
|
|
12
|
+
declare function jsx(tag: string | ((props: any) => HtmlString), props: Record<string, unknown>): HtmlString;
|
|
13
|
+
declare function jsxDEV(tag: string | ((props: any) => HtmlString), props: Record<string, unknown>, _key?: string, _isStaticChildren?: boolean, _source?: unknown, _self?: unknown): HtmlString;
|
|
14
|
+
declare global {
|
|
15
|
+
namespace JSX {
|
|
16
|
+
type Element = HtmlString;
|
|
17
|
+
interface IntrinsicElements {
|
|
18
|
+
[tag: string]: any;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
} //# sourceMappingURL=index.d.ts.map
|
|
22
|
+
//#endregion
|
|
23
|
+
export { Fragment, HtmlString, h, jsx, jsx as jsxs, jsxDEV };
|
|
24
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/jsx-runtime/index.ts"],"mappings":";cA8Ba,UAAA;EACX,KAAA;cACY,KAAA;EAGZ,QAAA,CAAA;AAAA;AAAA,iBAcc,CAAA,CACd,GAAA,aAAgB,KAAA,UAAe,UAAA,GAC/B,KAAA,EAAO,MAAA,6BACJ,QAAA,cACF,UAAA;AAAA,iBAsCa,QAAA,CAAS,KAAA;EAAS,QAAA;EAAoB,SAAA;AAAA,IAAuB,UAAA;AAAA,iBAM7D,GAAA,CACd,GAAA,aAAgB,KAAA,UAAe,UAAA,GAC/B,KAAA,EAAO,MAAA,oBACN,UAAA;AAAA,iBAYa,MAAA,CACd,GAAA,aAAgB,KAAA,UAAe,UAAA,GAC/B,KAAA,EAAO,MAAA,mBACP,IAAA,WACA,iBAAA,YACA,OAAA,YACA,KAAA,aACC,UAAA;AAAA,QAIK,MAAA;EAAA,UACI,GAAA;IAAA,KACH,OAAA,GAAU,UAAA;IAAA,UACL,iBAAA;MAAA,CACP,GAAA;IAAA;EAAA;AAAA"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
//#region src/jsx-runtime/index.ts
|
|
2
|
+
const VOID_ELEMENTS = new Set([
|
|
3
|
+
"area",
|
|
4
|
+
"base",
|
|
5
|
+
"br",
|
|
6
|
+
"col",
|
|
7
|
+
"embed",
|
|
8
|
+
"hr",
|
|
9
|
+
"img",
|
|
10
|
+
"input",
|
|
11
|
+
"link",
|
|
12
|
+
"meta",
|
|
13
|
+
"param",
|
|
14
|
+
"source",
|
|
15
|
+
"track",
|
|
16
|
+
"wbr"
|
|
17
|
+
]);
|
|
18
|
+
const ATTR_MAP = {
|
|
19
|
+
className: "class",
|
|
20
|
+
htmlFor: "for"
|
|
21
|
+
};
|
|
22
|
+
function escapeAttr(s) {
|
|
23
|
+
return s.replace(/&/g, "&").replace(/"/g, """);
|
|
24
|
+
}
|
|
25
|
+
function escapeHtml(s) {
|
|
26
|
+
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
27
|
+
}
|
|
28
|
+
var HtmlString = class {
|
|
29
|
+
value;
|
|
30
|
+
constructor(value) {
|
|
31
|
+
this.value = value;
|
|
32
|
+
}
|
|
33
|
+
toString() {
|
|
34
|
+
return this.value;
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
function renderChild(child) {
|
|
38
|
+
if (child == null || child === false || child === true) return "";
|
|
39
|
+
if (child instanceof HtmlString) return child.value;
|
|
40
|
+
if (Array.isArray(child)) return child.map(renderChild).join("");
|
|
41
|
+
if (typeof child === "number") return String(child);
|
|
42
|
+
if (typeof child === "string") return escapeHtml(child);
|
|
43
|
+
return escapeHtml(String(child));
|
|
44
|
+
}
|
|
45
|
+
function h(tag, props, ...children) {
|
|
46
|
+
const allProps = props ? { ...props } : {};
|
|
47
|
+
if (children.length === 1) allProps.children = children[0];
|
|
48
|
+
else if (children.length > 1) allProps.children = children;
|
|
49
|
+
if (typeof tag === "function") {
|
|
50
|
+
const result = tag(allProps);
|
|
51
|
+
if (result instanceof HtmlString) return result;
|
|
52
|
+
return new HtmlString(renderChild(result));
|
|
53
|
+
}
|
|
54
|
+
const { children: _, innerHTML, ...attrs } = allProps;
|
|
55
|
+
const parts = [];
|
|
56
|
+
for (const [key, val] of Object.entries(attrs)) {
|
|
57
|
+
if (val == null || val === false) continue;
|
|
58
|
+
const name = ATTR_MAP[key] || key;
|
|
59
|
+
if (val === true) {
|
|
60
|
+
parts.push(name);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
parts.push(`${name}="${escapeAttr(String(val))}"`);
|
|
64
|
+
}
|
|
65
|
+
const open = `<${tag}${parts.length ? " " + parts.join(" ") : ""}>`;
|
|
66
|
+
if (VOID_ELEMENTS.has(tag)) return new HtmlString(open);
|
|
67
|
+
if (innerHTML != null) return new HtmlString(`${open}${innerHTML instanceof HtmlString ? innerHTML.value : String(innerHTML)}</${tag}>`);
|
|
68
|
+
return new HtmlString(`${open}${renderChild(allProps.children)}</${tag}>`);
|
|
69
|
+
}
|
|
70
|
+
function Fragment(props) {
|
|
71
|
+
if (props.innerHTML) return new HtmlString(props.innerHTML);
|
|
72
|
+
return new HtmlString(renderChild(props.children));
|
|
73
|
+
}
|
|
74
|
+
function jsx(tag, props) {
|
|
75
|
+
const { children, ...rest } = props;
|
|
76
|
+
if (children != null) {
|
|
77
|
+
if (Array.isArray(children)) return h(tag, rest, ...children);
|
|
78
|
+
return h(tag, rest, children);
|
|
79
|
+
}
|
|
80
|
+
return h(tag, rest);
|
|
81
|
+
}
|
|
82
|
+
function jsxDEV(tag, props, _key, _isStaticChildren, _source, _self) {
|
|
83
|
+
return jsx(tag, props);
|
|
84
|
+
}
|
|
85
|
+
//#endregion
|
|
86
|
+
export { Fragment, HtmlString, h, jsx, jsx as jsxs, jsxDEV };
|
|
87
|
+
|
|
88
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/jsx-runtime/index.ts"],"sourcesContent":["const VOID_ELEMENTS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n])\n\nconst ATTR_MAP: Record<string, string> = {\n className: 'class',\n htmlFor: 'for',\n}\n\nfunction escapeAttr(s: string): string {\n return s.replace(/&/g, '&').replace(/\"/g, '"')\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')\n}\n\nexport class HtmlString {\n value: string\n constructor(value: string) {\n this.value = value\n }\n toString(): string {\n return this.value\n }\n}\n\nfunction renderChild(child: unknown): string {\n if (child == null || child === false || child === true) return ''\n if (child instanceof HtmlString) return child.value\n if (Array.isArray(child)) return child.map(renderChild).join('')\n if (typeof child === 'number') return String(child)\n if (typeof child === 'string') return escapeHtml(child)\n return escapeHtml(String(child as string))\n}\n\nexport function h(\n tag: string | ((props: any) => HtmlString),\n props: Record<string, unknown> | null,\n ...children: unknown[]\n): HtmlString {\n const allProps: Record<string, unknown> = props ? { ...props } : {}\n if (children.length === 1) allProps.children = children[0]\n else if (children.length > 1) allProps.children = children\n\n if (typeof tag === 'function') {\n const result = tag(allProps)\n if (result instanceof HtmlString) return result\n return new HtmlString(renderChild(result))\n }\n\n const { children: _, innerHTML, ...attrs } = allProps\n\n const parts: string[] = []\n for (const [key, val] of Object.entries(attrs)) {\n if (val == null || val === false) continue\n const name = ATTR_MAP[key] || key\n if (val === true) {\n parts.push(name)\n continue\n }\n parts.push(`${name}=\"${escapeAttr(String(val as string | number))}\"`)\n }\n\n const attrStr = parts.length ? ' ' + parts.join(' ') : ''\n const open = `<${tag}${attrStr}>`\n\n if (VOID_ELEMENTS.has(tag)) return new HtmlString(open)\n\n if (innerHTML != null) {\n const raw = innerHTML instanceof HtmlString ? innerHTML.value : String(innerHTML as string)\n return new HtmlString(`${open}${raw}</${tag}>`)\n }\n\n const childHtml = renderChild(allProps.children)\n return new HtmlString(`${open}${childHtml}</${tag}>`)\n}\n\nexport function Fragment(props: { children?: unknown; innerHTML?: string }): HtmlString {\n if (props.innerHTML) return new HtmlString(props.innerHTML)\n return new HtmlString(renderChild(props.children))\n}\n\n// Automatic JSX transform compat — react-jsx mode calls jsx/jsxs instead of h\nexport function jsx(\n tag: string | ((props: any) => HtmlString),\n props: Record<string, unknown>,\n): HtmlString {\n const { children, ...rest } = props\n if (children != null) {\n if (Array.isArray(children)) return h(tag, rest, ...children)\n return h(tag, rest, children)\n }\n return h(tag, rest)\n}\n\nexport { jsx as jsxs }\n\n// Dev mode JSX transform — same as jsx but with extra debug params we ignore\nexport function jsxDEV(\n tag: string | ((props: any) => HtmlString),\n props: Record<string, unknown>,\n _key?: string,\n _isStaticChildren?: boolean,\n _source?: unknown,\n _self?: unknown,\n): HtmlString {\n return jsx(tag, props)\n}\n\ndeclare global {\n namespace JSX {\n type Element = HtmlString\n interface IntrinsicElements {\n [tag: string]: any\n }\n }\n}\n"],"mappings":";AAAA,MAAM,gBAAgB,IAAI,IAAI;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,WAAmC;CACvC,WAAW;CACX,SAAS;CACV;AAED,SAAS,WAAW,GAAmB;AACrC,QAAO,EAAE,QAAQ,MAAM,QAAQ,CAAC,QAAQ,MAAM,SAAS;;AAGzD,SAAS,WAAW,GAAmB;AACrC,QAAO,EAAE,QAAQ,MAAM,QAAQ,CAAC,QAAQ,MAAM,OAAO,CAAC,QAAQ,MAAM,OAAO;;AAG7E,IAAa,aAAb,MAAwB;CACtB;CACA,YAAY,OAAe;AACzB,OAAK,QAAQ;;CAEf,WAAmB;AACjB,SAAO,KAAK;;;AAIhB,SAAS,YAAY,OAAwB;AAC3C,KAAI,SAAS,QAAQ,UAAU,SAAS,UAAU,KAAM,QAAO;AAC/D,KAAI,iBAAiB,WAAY,QAAO,MAAM;AAC9C,KAAI,MAAM,QAAQ,MAAM,CAAE,QAAO,MAAM,IAAI,YAAY,CAAC,KAAK,GAAG;AAChE,KAAI,OAAO,UAAU,SAAU,QAAO,OAAO,MAAM;AACnD,KAAI,OAAO,UAAU,SAAU,QAAO,WAAW,MAAM;AACvD,QAAO,WAAW,OAAO,MAAgB,CAAC;;AAG5C,SAAgB,EACd,KACA,OACA,GAAG,UACS;CACZ,MAAM,WAAoC,QAAQ,EAAE,GAAG,OAAO,GAAG,EAAE;AACnE,KAAI,SAAS,WAAW,EAAG,UAAS,WAAW,SAAS;UAC/C,SAAS,SAAS,EAAG,UAAS,WAAW;AAElD,KAAI,OAAO,QAAQ,YAAY;EAC7B,MAAM,SAAS,IAAI,SAAS;AAC5B,MAAI,kBAAkB,WAAY,QAAO;AACzC,SAAO,IAAI,WAAW,YAAY,OAAO,CAAC;;CAG5C,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,UAAU;CAE7C,MAAM,QAAkB,EAAE;AAC1B,MAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,MAAM,EAAE;AAC9C,MAAI,OAAO,QAAQ,QAAQ,MAAO;EAClC,MAAM,OAAO,SAAS,QAAQ;AAC9B,MAAI,QAAQ,MAAM;AAChB,SAAM,KAAK,KAAK;AAChB;;AAEF,QAAM,KAAK,GAAG,KAAK,IAAI,WAAW,OAAO,IAAuB,CAAC,CAAC,GAAG;;CAIvE,MAAM,OAAO,IAAI,MADD,MAAM,SAAS,MAAM,MAAM,KAAK,IAAI,GAAG,GACxB;AAE/B,KAAI,cAAc,IAAI,IAAI,CAAE,QAAO,IAAI,WAAW,KAAK;AAEvD,KAAI,aAAa,KAEf,QAAO,IAAI,WAAW,GAAG,OADb,qBAAqB,aAAa,UAAU,QAAQ,OAAO,UAAoB,CACvD,IAAI,IAAI,GAAG;AAIjD,QAAO,IAAI,WAAW,GAAG,OADP,YAAY,SAAS,SAAS,CACN,IAAI,IAAI,GAAG;;AAGvD,SAAgB,SAAS,OAA+D;AACtF,KAAI,MAAM,UAAW,QAAO,IAAI,WAAW,MAAM,UAAU;AAC3D,QAAO,IAAI,WAAW,YAAY,MAAM,SAAS,CAAC;;AAIpD,SAAgB,IACd,KACA,OACY;CACZ,MAAM,EAAE,UAAU,GAAG,SAAS;AAC9B,KAAI,YAAY,MAAM;AACpB,MAAI,MAAM,QAAQ,SAAS,CAAE,QAAO,EAAE,KAAK,MAAM,GAAG,SAAS;AAC7D,SAAO,EAAE,KAAK,MAAM,SAAS;;AAE/B,QAAO,EAAE,KAAK,KAAK;;AAMrB,SAAgB,OACd,KACA,OACA,MACA,mBACA,SACA,OACY;AACZ,QAAO,IAAI,KAAK,MAAM"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { n as LoaderResult, r as LoaderType, t as Loader } from "../types-DUsjRE7Y.mjs";
|
|
2
|
+
import { a as MarkdownLoader, c as JsonLoader, i as TomlLoader, n as resolveLoader, o as LoaderError, r as YamlLoader, s as JsoncLoader, t as defaultIncludePatterns } from "../index-sFCx17CD.mjs";
|
|
3
|
+
export { JsonLoader, JsoncLoader, Loader, LoaderError, LoaderResult, LoaderType, MarkdownLoader, TomlLoader, YamlLoader, defaultIncludePatterns, resolveLoader };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { a as MarkdownLoader, c as LoaderError, i as TomlLoader, n as resolveLoader, o as JsoncLoader, r as YamlLoader, s as JsonLoader, t as defaultIncludePatterns } from "../loaders-DyABmDrE.mjs";
|
|
2
|
+
export { JsonLoader, JsoncLoader, LoaderError, MarkdownLoader, TomlLoader, YamlLoader, defaultIncludePatterns, resolveLoader };
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import matter from "gray-matter";
|
|
2
|
+
import { parse } from "yaml";
|
|
3
|
+
import { readFileSync } from "fs";
|
|
4
|
+
import JSON5 from "json5";
|
|
5
|
+
import { parse as parse$1 } from "smol-toml";
|
|
6
|
+
//#region src/loaders/errors.ts
|
|
7
|
+
var LoaderError = class extends Error {
|
|
8
|
+
filePath;
|
|
9
|
+
format;
|
|
10
|
+
line;
|
|
11
|
+
column;
|
|
12
|
+
constructor(message, filePath, format, line, column) {
|
|
13
|
+
super(`${format} parse error in ${filePath}${line ? `:${line}` : ""}: ${message}`);
|
|
14
|
+
this.name = "LoaderError";
|
|
15
|
+
this.filePath = filePath;
|
|
16
|
+
this.format = format;
|
|
17
|
+
this.line = line;
|
|
18
|
+
this.column = column;
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
//#endregion
|
|
22
|
+
//#region src/loaders/json.ts
|
|
23
|
+
/**
|
|
24
|
+
* JSON / JSON5 / JSONC loader.
|
|
25
|
+
*
|
|
26
|
+
* Detects format from file extension and parses accordingly.
|
|
27
|
+
*/
|
|
28
|
+
var JsonLoader = class {
|
|
29
|
+
name = "json";
|
|
30
|
+
kind = "data";
|
|
31
|
+
extensions = [".json", ".json5"];
|
|
32
|
+
load(filePath) {
|
|
33
|
+
const raw = readFileSync(filePath, "utf-8");
|
|
34
|
+
const isJson = filePath.endsWith(".json");
|
|
35
|
+
try {
|
|
36
|
+
return { data: isJson ? JSON.parse(raw) : JSON5.parse(raw) };
|
|
37
|
+
} catch (err) {
|
|
38
|
+
throw new LoaderError(err instanceof Error ? err.message : String(err), filePath, isJson ? "JSON" : "JSON5");
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
//#endregion
|
|
43
|
+
//#region src/loaders/jsonc.ts
|
|
44
|
+
/**
|
|
45
|
+
* JSONC loader — JSON with Comments.
|
|
46
|
+
*
|
|
47
|
+
* Strips single-line (//) and multi-line comments before parsing.
|
|
48
|
+
* Delegates to JSON.parse after stripping (no JSON5 superset features).
|
|
49
|
+
*/
|
|
50
|
+
/** Strip // and block comments, preserving strings. */
|
|
51
|
+
function stripComments(raw) {
|
|
52
|
+
let result = "";
|
|
53
|
+
let i = 0;
|
|
54
|
+
const len = raw.length;
|
|
55
|
+
while (i < len) {
|
|
56
|
+
if (raw[i] === "\"") {
|
|
57
|
+
let end = i + 1;
|
|
58
|
+
while (end < len && raw[end] !== "\"") {
|
|
59
|
+
if (raw[end] === "\\") end++;
|
|
60
|
+
end++;
|
|
61
|
+
}
|
|
62
|
+
result += raw.slice(i, end + 1);
|
|
63
|
+
i = end + 1;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (raw[i] === "/" && raw[i + 1] === "/") {
|
|
67
|
+
i += 2;
|
|
68
|
+
while (i < len && raw[i] !== "\n") i++;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (raw[i] === "/" && raw[i + 1] === "*") {
|
|
72
|
+
i += 2;
|
|
73
|
+
while (i < len && !(raw[i] === "*" && raw[i + 1] === "/")) i++;
|
|
74
|
+
i += 2;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
result += raw[i];
|
|
78
|
+
i++;
|
|
79
|
+
}
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
var JsoncLoader = class {
|
|
83
|
+
name = "jsonc";
|
|
84
|
+
kind = "data";
|
|
85
|
+
extensions = [".jsonc"];
|
|
86
|
+
load(filePath) {
|
|
87
|
+
const raw = readFileSync(filePath, "utf-8");
|
|
88
|
+
try {
|
|
89
|
+
const stripped = stripComments(raw);
|
|
90
|
+
return { data: JSON.parse(stripped) };
|
|
91
|
+
} catch (err) {
|
|
92
|
+
throw new LoaderError(err instanceof Error ? err.message : String(err), filePath, "JSONC");
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
//#endregion
|
|
97
|
+
//#region src/loaders/markdown.ts
|
|
98
|
+
/**
|
|
99
|
+
* Markdown loader.
|
|
100
|
+
*
|
|
101
|
+
* Uses gray-matter to extract YAML frontmatter and body content.
|
|
102
|
+
* Rendering is NOT done here — it's deferred to ContentEntry.render().
|
|
103
|
+
*/
|
|
104
|
+
var MarkdownLoader = class {
|
|
105
|
+
name = "markdown";
|
|
106
|
+
kind = "markdown";
|
|
107
|
+
extensions = [".md"];
|
|
108
|
+
load(filePath) {
|
|
109
|
+
const raw = readFileSync(filePath, "utf-8");
|
|
110
|
+
try {
|
|
111
|
+
const { data, content } = matter(raw, { engines: { yaml: parse } });
|
|
112
|
+
return {
|
|
113
|
+
data,
|
|
114
|
+
content
|
|
115
|
+
};
|
|
116
|
+
} catch (err) {
|
|
117
|
+
throw new LoaderError(err instanceof Error ? err.message : String(err), filePath, "Markdown");
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
//#endregion
|
|
122
|
+
//#region src/loaders/toml.ts
|
|
123
|
+
/**
|
|
124
|
+
* TOML loader.
|
|
125
|
+
*/
|
|
126
|
+
var TomlLoader = class {
|
|
127
|
+
name = "toml";
|
|
128
|
+
kind = "data";
|
|
129
|
+
extensions = [".toml"];
|
|
130
|
+
load(filePath) {
|
|
131
|
+
const raw = readFileSync(filePath, "utf-8");
|
|
132
|
+
try {
|
|
133
|
+
return { data: parse$1(raw) };
|
|
134
|
+
} catch (err) {
|
|
135
|
+
throw new LoaderError(err instanceof Error ? err.message : String(err), filePath, "TOML");
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
//#endregion
|
|
140
|
+
//#region src/loaders/yaml.ts
|
|
141
|
+
/**
|
|
142
|
+
* YAML loader.
|
|
143
|
+
*/
|
|
144
|
+
var YamlLoader = class {
|
|
145
|
+
name = "yaml";
|
|
146
|
+
kind = "data";
|
|
147
|
+
extensions = [".yaml", ".yml"];
|
|
148
|
+
load(filePath) {
|
|
149
|
+
const raw = readFileSync(filePath, "utf-8");
|
|
150
|
+
try {
|
|
151
|
+
return { data: parse(raw) ?? {} };
|
|
152
|
+
} catch (err) {
|
|
153
|
+
throw new LoaderError(err instanceof Error ? err.message : String(err), filePath, "YAML", err != null && typeof err === "object" && "linePos" in err ? err.linePos?.[0]?.line : void 0);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
//#endregion
|
|
158
|
+
//#region src/loaders/index.ts
|
|
159
|
+
/** Resolve a loader type string or custom Loader instance. */
|
|
160
|
+
function resolveLoader(loaderOrType) {
|
|
161
|
+
if (typeof loaderOrType === "object") return loaderOrType;
|
|
162
|
+
switch (loaderOrType) {
|
|
163
|
+
case "markdown": return new MarkdownLoader();
|
|
164
|
+
case "json":
|
|
165
|
+
case "json5": return new JsonLoader();
|
|
166
|
+
case "jsonc": return new JsoncLoader();
|
|
167
|
+
case "yaml": return new YamlLoader();
|
|
168
|
+
case "toml": return new TomlLoader();
|
|
169
|
+
default: throw new Error(`Unknown loader type: ${loaderOrType}`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/** Get default include glob patterns for a loader. */
|
|
173
|
+
function defaultIncludePatterns(loader) {
|
|
174
|
+
return loader.extensions.map((ext) => `**/*${ext}`);
|
|
175
|
+
}
|
|
176
|
+
//#endregion
|
|
177
|
+
export { MarkdownLoader as a, LoaderError as c, TomlLoader as i, resolveLoader as n, JsoncLoader as o, YamlLoader as r, JsonLoader as s, defaultIncludePatterns as t };
|
|
178
|
+
|
|
179
|
+
//# sourceMappingURL=loaders-DyABmDrE.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loaders-DyABmDrE.mjs","names":["parseYaml","parse"],"sources":["../src/loaders/errors.ts","../src/loaders/json.ts","../src/loaders/jsonc.ts","../src/loaders/markdown.ts","../src/loaders/toml.ts","../src/loaders/yaml.ts","../src/loaders/index.ts"],"sourcesContent":["export class LoaderError extends Error {\n readonly filePath: string\n readonly format: string\n readonly line?: number\n readonly column?: number\n\n constructor(message: string, filePath: string, format: string, line?: number, column?: number) {\n super(`${format} parse error in ${filePath}${line ? `:${line}` : ''}: ${message}`)\n this.name = 'LoaderError'\n this.filePath = filePath\n this.format = format\n this.line = line\n this.column = column\n }\n}\n","/**\n * JSON / JSON5 / JSONC loader.\n *\n * Detects format from file extension and parses accordingly.\n */\n\nimport { readFileSync } from 'fs'\nimport JSON5 from 'json5'\nimport { LoaderError } from './errors'\nimport type { Loader, LoaderResult } from './types'\n\nexport class JsonLoader implements Loader {\n name = 'json'\n kind = 'data' as const\n extensions = ['.json', '.json5']\n\n load(filePath: string): LoaderResult {\n const raw = readFileSync(filePath, 'utf-8')\n const isJson = filePath.endsWith('.json')\n\n try {\n const data = isJson ? JSON.parse(raw) : JSON5.parse(raw)\n return { data }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n throw new LoaderError(message, filePath, isJson ? 'JSON' : 'JSON5')\n }\n }\n}\n","/**\n * JSONC loader — JSON with Comments.\n *\n * Strips single-line (//) and multi-line comments before parsing.\n * Delegates to JSON.parse after stripping (no JSON5 superset features).\n */\n\nimport { readFileSync } from 'fs'\nimport { LoaderError } from './errors'\nimport type { Loader, LoaderResult } from './types'\n\n/** Strip // and block comments, preserving strings. */\nfunction stripComments(raw: string): string {\n let result = ''\n let i = 0\n const len = raw.length\n\n while (i < len) {\n // String literal — copy verbatim to preserve contents\n if (raw[i] === '\"') {\n let end = i + 1\n while (end < len && raw[end] !== '\"') {\n if (raw[end] === '\\\\') end++ // skip escaped char\n end++\n }\n result += raw.slice(i, end + 1)\n i = end + 1\n continue\n }\n\n // Single-line comment\n if (raw[i] === '/' && raw[i + 1] === '/') {\n i += 2\n while (i < len && raw[i] !== '\\n') i++\n continue\n }\n\n // Block comment\n if (raw[i] === '/' && raw[i + 1] === '*') {\n i += 2\n while (i < len && !(raw[i] === '*' && raw[i + 1] === '/')) i++\n i += 2 // skip closing */\n continue\n }\n\n result += raw[i]\n i++\n }\n\n return result\n}\n\nexport class JsoncLoader implements Loader {\n name = 'jsonc'\n kind = 'data' as const\n extensions = ['.jsonc']\n\n load(filePath: string): LoaderResult {\n const raw = readFileSync(filePath, 'utf-8')\n try {\n const stripped = stripComments(raw)\n const data = JSON.parse(stripped)\n return { data }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n throw new LoaderError(message, filePath, 'JSONC')\n }\n }\n}\n","/**\n * Markdown loader.\n *\n * Uses gray-matter to extract YAML frontmatter and body content.\n * Rendering is NOT done here — it's deferred to ContentEntry.render().\n */\n\nimport { readFileSync } from 'fs'\nimport matter from 'gray-matter'\nimport { parse as parseYaml } from 'yaml'\nimport { LoaderError } from './errors'\nimport type { Loader, LoaderResult } from './types'\n\nexport class MarkdownLoader implements Loader {\n name = 'markdown'\n kind = 'markdown' as const\n extensions = ['.md']\n\n load(filePath: string): LoaderResult {\n const raw = readFileSync(filePath, 'utf-8')\n try {\n const { data, content } = matter(raw, { engines: { yaml: parseYaml } })\n return { data, content }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n throw new LoaderError(message, filePath, 'Markdown')\n }\n }\n}\n","/**\n * TOML loader.\n */\n\nimport { readFileSync } from 'fs'\nimport { parse } from 'smol-toml'\nimport { LoaderError } from './errors'\nimport type { Loader, LoaderResult } from './types'\n\nexport class TomlLoader implements Loader {\n name = 'toml'\n kind = 'data' as const\n extensions = ['.toml']\n\n load(filePath: string): LoaderResult {\n const raw = readFileSync(filePath, 'utf-8')\n try {\n const data = parse(raw)\n return { data }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n throw new LoaderError(message, filePath, 'TOML')\n }\n }\n}\n","/**\n * YAML loader.\n */\n\nimport { readFileSync } from 'fs'\nimport { parse } from 'yaml'\nimport { LoaderError } from './errors'\nimport type { Loader, LoaderResult } from './types'\n\nexport class YamlLoader implements Loader {\n name = 'yaml'\n kind = 'data' as const\n extensions = ['.yaml', '.yml']\n\n load(filePath: string): LoaderResult {\n const raw = readFileSync(filePath, 'utf-8')\n try {\n const data = parse(raw) ?? {}\n return { data }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n const line =\n err != null && typeof err === 'object' && 'linePos' in err\n ? (err as any).linePos?.[0]?.line\n : undefined\n throw new LoaderError(message, filePath, 'YAML', line)\n }\n }\n}\n","/**\n * Loader registry — resolves loader type strings to Loader instances.\n */\n\nexport { JsonLoader } from './json'\nexport { JsoncLoader } from './jsonc'\nexport { LoaderError } from './errors'\nexport { MarkdownLoader } from './markdown'\nexport { TomlLoader } from './toml'\nexport type { Loader, LoaderResult, LoaderType } from './types'\nexport { YamlLoader } from './yaml'\n\nimport { JsonLoader } from './json'\nimport { JsoncLoader } from './jsonc'\nimport { MarkdownLoader } from './markdown'\nimport { TomlLoader } from './toml'\nimport type { Loader, LoaderType } from './types'\nimport { YamlLoader } from './yaml'\n\n/** Resolve a loader type string or custom Loader instance. */\nexport function resolveLoader(loaderOrType: LoaderType | Loader): Loader {\n if (typeof loaderOrType === 'object') return loaderOrType\n\n switch (loaderOrType) {\n case 'markdown':\n return new MarkdownLoader()\n case 'json':\n case 'json5':\n return new JsonLoader()\n case 'jsonc':\n return new JsoncLoader()\n case 'yaml':\n return new YamlLoader()\n case 'toml':\n return new TomlLoader()\n default:\n throw new Error(`Unknown loader type: ${loaderOrType as string}`)\n }\n}\n\n/** Get default include glob patterns for a loader. */\nexport function defaultIncludePatterns(loader: Loader): string[] {\n return loader.extensions.map((ext) => `**/*${ext}`)\n}\n"],"mappings":"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"}
|