@krantho/schema 0.0.0-stage → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/archetypes.d.ts +39 -0
- package/dist/archetypes.d.ts.map +1 -0
- package/dist/archetypes.js +139 -0
- package/dist/archetypes.js.map +1 -0
- package/dist/collection.d.ts +78 -0
- package/dist/collection.d.ts.map +1 -0
- package/dist/collection.js +65 -0
- package/dist/collection.js.map +1 -0
- package/dist/config.d.ts +27 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +38 -0
- package/dist/config.js.map +1 -0
- package/dist/content-archetypes.d.ts +34 -0
- package/dist/content-archetypes.d.ts.map +1 -0
- package/dist/content-archetypes.js +64 -0
- package/dist/content-archetypes.js.map +1 -0
- package/dist/contract-codegen.d.ts +11 -0
- package/dist/contract-codegen.d.ts.map +1 -0
- package/dist/contract-codegen.js +29 -0
- package/dist/contract-codegen.js.map +1 -0
- package/dist/errors.d.ts +31 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +28 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/metadata-defaults.d.ts +10 -0
- package/dist/metadata-defaults.d.ts.map +1 -0
- package/dist/metadata-defaults.js +73 -0
- package/dist/metadata-defaults.js.map +1 -0
- package/dist/page/define-page.d.ts +21 -0
- package/dist/page/define-page.d.ts.map +1 -0
- package/dist/page/define-page.js +28 -0
- package/dist/page/define-page.js.map +1 -0
- package/dist/page/index.d.ts +4 -0
- package/dist/page/index.d.ts.map +1 -0
- package/dist/page/index.js +3 -0
- package/dist/page/index.js.map +1 -0
- package/dist/page/references.d.ts +24 -0
- package/dist/page/references.d.ts.map +1 -0
- package/dist/page/references.js +29 -0
- package/dist/page/references.js.map +1 -0
- package/dist/page/types.d.ts +50 -0
- package/dist/page/types.d.ts.map +1 -0
- package/dist/page/types.js +10 -0
- package/dist/page/types.js.map +1 -0
- package/dist/portable-schema.d.ts +6 -0
- package/dist/portable-schema.d.ts.map +1 -0
- package/dist/portable-schema.js +30 -0
- package/dist/portable-schema.js.map +1 -0
- package/dist/presets.d.ts +24 -0
- package/dist/presets.d.ts.map +1 -0
- package/dist/presets.js +23 -0
- package/dist/presets.js.map +1 -0
- package/dist/repository-content.d.ts +17 -0
- package/dist/repository-content.d.ts.map +1 -0
- package/dist/repository-content.js +65 -0
- package/dist/repository-content.js.map +1 -0
- package/dist/resolved-contract.d.ts +5 -0
- package/dist/resolved-contract.d.ts.map +1 -0
- package/dist/resolved-contract.js +28 -0
- package/dist/resolved-contract.js.map +1 -0
- package/dist/runtime-schema.d.ts +24 -0
- package/dist/runtime-schema.d.ts.map +1 -0
- package/dist/runtime-schema.js +225 -0
- package/dist/runtime-schema.js.map +1 -0
- package/dist/schema-export.d.ts +13 -0
- package/dist/schema-export.d.ts.map +1 -0
- package/dist/schema-export.js +13 -0
- package/dist/schema-export.js.map +1 -0
- package/dist/validate-content.d.ts +30 -0
- package/dist/validate-content.d.ts.map +1 -0
- package/dist/validate-content.js +90 -0
- package/dist/validate-content.js.map +1 -0
- package/dist/validate-document.d.ts +11 -0
- package/dist/validate-document.d.ts.map +1 -0
- package/dist/validate-document.js +41 -0
- package/dist/validate-document.js.map +1 -0
- package/package.json +41 -3
- package/README.md +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,SAAS,eAAe,EAAE,CAAA;IAClC,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;CACF;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAA;gBAE/B,MAAM,EAAE,SAAS,eAAe,EAAE;CAwB/C"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thrown when content validation fails in strict mode.
|
|
3
|
+
*/
|
|
4
|
+
export class ContentValidationError extends Error {
|
|
5
|
+
errors;
|
|
6
|
+
constructor(errors) {
|
|
7
|
+
// Group by collection/slug
|
|
8
|
+
const grouped = new Map();
|
|
9
|
+
for (const err of errors) {
|
|
10
|
+
const key = `${err.collection}/${err.slug}`;
|
|
11
|
+
const list = grouped.get(key);
|
|
12
|
+
if (list) {
|
|
13
|
+
list.push(err);
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
grouped.set(key, [err]);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const parts = [];
|
|
20
|
+
for (const [key, errs] of grouped) {
|
|
21
|
+
parts.push(`Invalid frontmatter for "${key}":\n${errs.map((e) => ` - "${e.field}": ${e.message}`).join('\n')}`);
|
|
22
|
+
}
|
|
23
|
+
super(parts.join('\n\n'));
|
|
24
|
+
this.name = 'ContentValidationError';
|
|
25
|
+
this.errors = errors;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAyBA;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IACtC,MAAM,CAA4B;IAE3C,YAAY,MAAkC;QAC5C,2BAA2B;QAC3B,MAAM,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAA;QACpD,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,IAAI,EAAE,CAAA;YAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAC7B,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAChB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;YACzB,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CACR,4BAA4B,GAAG,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrG,CAAA;QACH,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QACzB,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAA;QACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export { exportContractAsZod } from './contract-codegen.js';
|
|
2
|
+
export type { DocumentArchetype, MetadataArchetype, MetadataSlot } from './archetypes.js';
|
|
3
|
+
export { assertAuthorProperty, compileContentContract, contentDigest, defineDocumentArchetype, defineMetadataArchetype, documentChecksum, } from './archetypes.js';
|
|
4
|
+
export type { Collection, CollectionConfig } from './collection.js';
|
|
5
|
+
export { defineCollection } from './collection.js';
|
|
6
|
+
export type { ContentConfig, ContentConfigInput } from './config.js';
|
|
7
|
+
export { defineConfig } from './config.js';
|
|
8
|
+
export { blogContent, classificationMetadata, editorialMetadata, publicationMetadata, sharingMetadata, structuredDataMetadata, websiteContent, } from './content-archetypes.js';
|
|
9
|
+
export type { ValidationError, ValidationResult } from './errors.js';
|
|
10
|
+
export { ContentValidationError } from './errors.js';
|
|
11
|
+
export type { AppliedDefaults } from './metadata-defaults.js';
|
|
12
|
+
export { applyMetadataDefaults, retainDefaultProvenance } from './metadata-defaults.js';
|
|
13
|
+
export type { CollectionOptions, CollectionRef, ContentRef, PageDefinition, SectionsRef, SlugRef, } from './page/index.js';
|
|
14
|
+
export { collection, definePage, sections, slug } from './page/index.js';
|
|
15
|
+
export { fromPortableJsonSchema } from './portable-schema.js';
|
|
16
|
+
export type { ParsedRepositoryContent } from './repository-content.js';
|
|
17
|
+
export { parseRepositoryContent } from './repository-content.js';
|
|
18
|
+
export { resolveCollectionContract } from './resolved-contract.js';
|
|
19
|
+
export { exportSchemaAsZod, mergeSchemas, } from './runtime-schema.js';
|
|
20
|
+
export type { CollectionJsonSchema } from './schema-export.js';
|
|
21
|
+
export { collectionToJsonSchema } from './schema-export.js';
|
|
22
|
+
export type { ValidateOptions } from './validate-content.js';
|
|
23
|
+
export { validateAllContent, validateFields } from './validate-content.js';
|
|
24
|
+
export type { DocumentValues } from './validate-document.js';
|
|
25
|
+
export { documentSchema, validateDocument } from './validate-document.js';
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAG3D,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACzF,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,aAAa,EACb,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,iBAAiB,CAAA;AACxB,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,sBAAsB,EACtB,cAAc,GACf,MAAM,yBAAyB,CAAA;AAChC,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACpD,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AACvF,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,UAAU,EACV,cAAc,EACd,WAAW,EACX,OAAO,GACR,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,YAAY,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAElE,OAAO,EACL,iBAAiB,EACjB,YAAY,GACb,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAE9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAE5D,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC1E,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export { exportContractAsZod } from './contract-codegen.js';
|
|
2
|
+
export { assertAuthorProperty, compileContentContract, contentDigest, defineDocumentArchetype, defineMetadataArchetype, documentChecksum, } from './archetypes.js';
|
|
3
|
+
export { defineCollection } from './collection.js';
|
|
4
|
+
export { defineConfig } from './config.js';
|
|
5
|
+
export { blogContent, classificationMetadata, editorialMetadata, publicationMetadata, sharingMetadata, structuredDataMetadata, websiteContent, } from './content-archetypes.js';
|
|
6
|
+
export { ContentValidationError } from './errors.js';
|
|
7
|
+
export { applyMetadataDefaults, retainDefaultProvenance } from './metadata-defaults.js';
|
|
8
|
+
// Page composition
|
|
9
|
+
export { collection, definePage, sections, slug } from './page/index.js';
|
|
10
|
+
export { fromPortableJsonSchema } from './portable-schema.js';
|
|
11
|
+
export { parseRepositoryContent } from './repository-content.js';
|
|
12
|
+
export { resolveCollectionContract } from './resolved-contract.js';
|
|
13
|
+
// Runtime schema — merge code + runtime fields, export as Zod code
|
|
14
|
+
export { exportSchemaAsZod, mergeSchemas, } from './runtime-schema.js';
|
|
15
|
+
// Schema export (JSON Schema)
|
|
16
|
+
export { collectionToJsonSchema } from './schema-export.js';
|
|
17
|
+
// Content validation (Zod-based)
|
|
18
|
+
export { validateAllContent, validateFields } from './validate-content.js';
|
|
19
|
+
export { documentSchema, validateDocument } from './validate-document.js';
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAI3D,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,aAAa,EACb,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAElD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,sBAAsB,EACtB,cAAc,GACf,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAEpD,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AASvF,mBAAmB;AACnB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAE7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAClE,mEAAmE;AACnE,OAAO,EACL,iBAAiB,EACjB,YAAY,GACb,MAAM,qBAAqB,CAAA;AAE5B,8BAA8B;AAC9B,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAE3D,iCAAiC;AACjC,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAE1E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { DefaultProvenance } from '@krantho/persistence';
|
|
2
|
+
export interface AppliedDefaults {
|
|
3
|
+
metadata: Record<string, Record<string, unknown>>;
|
|
4
|
+
paths: string[];
|
|
5
|
+
values: Record<string, unknown>;
|
|
6
|
+
}
|
|
7
|
+
/** Absence is missing; explicit null, empty text, zero and false remain authored choices. */
|
|
8
|
+
export declare function applyMetadataDefaults(current: Record<string, Record<string, unknown>>, defaults: Record<string, Record<string, unknown>>, slots: readonly string[], previous?: readonly DefaultProvenance[]): AppliedDefaults;
|
|
9
|
+
export declare function retainDefaultProvenance(sources: readonly DefaultProvenance[], metadata: Record<string, Record<string, unknown>>): DefaultProvenance[];
|
|
10
|
+
//# sourceMappingURL=metadata-defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata-defaults.d.ts","sourceRoot":"","sources":["../src/metadata-defaults.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAE7D,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACjD,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAChC;AAED,6FAA6F;AAC7F,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAChD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACjD,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,QAAQ,GAAE,SAAS,iBAAiB,EAAO,GAC1C,eAAe,CAoBjB;AA2BD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,SAAS,iBAAiB,EAAE,EACrC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAChD,iBAAiB,EAAE,CAerB"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { canonicalJson } from '@krantho/core';
|
|
2
|
+
/** Absence is missing; explicit null, empty text, zero and false remain authored choices. */
|
|
3
|
+
export function applyMetadataDefaults(current, defaults, slots, previous = []) {
|
|
4
|
+
const metadata = structuredClone(current);
|
|
5
|
+
const result = { metadata, paths: [], values: {} };
|
|
6
|
+
const earlier = Object.assign({}, ...previous.map((source) => source.values));
|
|
7
|
+
for (const slot of slots) {
|
|
8
|
+
const source = defaults[slot];
|
|
9
|
+
if (!source)
|
|
10
|
+
continue;
|
|
11
|
+
if (!Object.hasOwn(metadata, slot) && Object.keys(source).length === 0) {
|
|
12
|
+
const path = `/metadata/${pointerPart(slot)}`;
|
|
13
|
+
result.paths.push(path);
|
|
14
|
+
result.values[path] = {};
|
|
15
|
+
}
|
|
16
|
+
const target = metadata[slot] ?? {};
|
|
17
|
+
metadata[slot] = target;
|
|
18
|
+
fillMissing(target, source, `/metadata/${pointerPart(slot)}`, earlier, result);
|
|
19
|
+
}
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
function fillMissing(target, source, prefix, earlier, result) {
|
|
23
|
+
for (const [key, value] of Object.entries(source)) {
|
|
24
|
+
if (['__proto__', 'prototype', 'constructor'].includes(key))
|
|
25
|
+
throw new Error('Invalid default property');
|
|
26
|
+
const path = `${prefix}/${pointerPart(key)}`;
|
|
27
|
+
const missing = !Object.hasOwn(target, key);
|
|
28
|
+
const stillDefault = Object.hasOwn(earlier, path) && canonicalJson(target[key]) === canonicalJson(earlier[path]);
|
|
29
|
+
if (isRecord(value) && Object.keys(value).length > 0 && (missing || isRecord(target[key]))) {
|
|
30
|
+
if (missing)
|
|
31
|
+
target[key] = {};
|
|
32
|
+
fillMissing(target[key], value, path, earlier, result);
|
|
33
|
+
}
|
|
34
|
+
else if ((missing || stillDefault) && canonicalJson(target[key]) !== canonicalJson(value)) {
|
|
35
|
+
target[key] = structuredClone(value);
|
|
36
|
+
result.paths.push(path);
|
|
37
|
+
result.values[path] = structuredClone(value);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function retainDefaultProvenance(sources, metadata) {
|
|
42
|
+
return sources.flatMap((source) => {
|
|
43
|
+
const paths = source.paths.filter((path) => canonicalJson(valueAt({ metadata }, path)) === canonicalJson(source.values[path]));
|
|
44
|
+
return paths.length
|
|
45
|
+
? [
|
|
46
|
+
{
|
|
47
|
+
...source,
|
|
48
|
+
paths,
|
|
49
|
+
values: Object.fromEntries(paths.map((path) => [path, source.values[path]])),
|
|
50
|
+
},
|
|
51
|
+
]
|
|
52
|
+
: [];
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
function valueAt(root, path) {
|
|
56
|
+
let value = root;
|
|
57
|
+
for (const part of path
|
|
58
|
+
.slice(1)
|
|
59
|
+
.split('/')
|
|
60
|
+
.map((part) => part.replaceAll('~1', '/').replaceAll('~0', '~'))) {
|
|
61
|
+
if (!isRecord(value) || !Object.hasOwn(value, part))
|
|
62
|
+
return undefined;
|
|
63
|
+
value = value[part];
|
|
64
|
+
}
|
|
65
|
+
return value;
|
|
66
|
+
}
|
|
67
|
+
function isRecord(value) {
|
|
68
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
69
|
+
}
|
|
70
|
+
function pointerPart(part) {
|
|
71
|
+
return part.replaceAll('~', '~0').replaceAll('/', '~1');
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=metadata-defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata-defaults.js","sourceRoot":"","sources":["../src/metadata-defaults.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ContentRef, PageDefinition } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Define a page's route and content requirements.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* export const homePage = definePage({
|
|
8
|
+
* route: '/',
|
|
9
|
+
* content: {
|
|
10
|
+
* hero: slug('home'),
|
|
11
|
+
* serviceCards: sections('services', ['strategy', 'advisory']),
|
|
12
|
+
* latestPosts: collection('blog', { status: 'published', limit: 3 }),
|
|
13
|
+
* },
|
|
14
|
+
* })
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export declare function definePage(config: {
|
|
18
|
+
route: string;
|
|
19
|
+
content: Record<string, ContentRef>;
|
|
20
|
+
}): PageDefinition;
|
|
21
|
+
//# sourceMappingURL=define-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-page.d.ts","sourceRoot":"","sources":["../../src/page/define-page.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE5D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;CACpC,GAAG,cAAc,CAajB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Define a page's route and content requirements.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* export const homePage = definePage({
|
|
7
|
+
* route: '/',
|
|
8
|
+
* content: {
|
|
9
|
+
* hero: slug('home'),
|
|
10
|
+
* serviceCards: sections('services', ['strategy', 'advisory']),
|
|
11
|
+
* latestPosts: collection('blog', { status: 'published', limit: 3 }),
|
|
12
|
+
* },
|
|
13
|
+
* })
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export function definePage(config) {
|
|
17
|
+
if (!config.route) {
|
|
18
|
+
throw new Error('Page route is required');
|
|
19
|
+
}
|
|
20
|
+
if (Object.keys(config.content).length === 0) {
|
|
21
|
+
throw new Error(`Page "${config.route}" must have at least one content reference`);
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
route: config.route,
|
|
25
|
+
content: config.content,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=define-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-page.js","sourceRoot":"","sources":["../../src/page/define-page.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,UAAU,CAAC,MAG1B;IACC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;IAC3C,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,SAAS,MAAM,CAAC,KAAK,4CAA4C,CAAC,CAAA;IACpF,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/page/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAC5D,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,UAAU,EACV,cAAc,EACd,WAAW,EACX,OAAO,GACR,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/page/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { CollectionOptions, CollectionRef, SectionsRef, SlugRef } from './types.js';
|
|
2
|
+
/** Reference one document with explicit collection identity and optional locale. */
|
|
3
|
+
export declare function slug(collection: string, name: string, locale?: string): SlugRef;
|
|
4
|
+
/**
|
|
5
|
+
* Reference specific ## heading sections from a content document.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* sections('pages', 'services', ['strategy', 'advisory']) // named sections
|
|
10
|
+
* sections('pages', 'services', '*') // all sections
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export declare function sections(collection: string, slugName: string, names: readonly string[] | '*', locale?: string): SectionsRef;
|
|
14
|
+
/**
|
|
15
|
+
* Reference multiple articles from a named collection.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* collection('blog', { sort: 'date:desc', limit: 3 })
|
|
20
|
+
* collection('blog', { exclude: ':slug' }) // exclude current dynamic slug
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare function collection(name: string, options?: CollectionOptions, locale?: string): CollectionRef;
|
|
24
|
+
//# sourceMappingURL=references.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"references.d.ts","sourceRoot":"","sources":["../../src/page/references.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAExF,oFAAoF;AACpF,wBAAgB,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAE/E;AAED;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CACtB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,GAAG,EAC9B,MAAM,CAAC,EAAE,MAAM,GACd,WAAW,CAEb;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,iBAAsB,EAC/B,MAAM,CAAC,EAAE,MAAM,GACd,aAAa,CAEf"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Reference one document with explicit collection identity and optional locale. */
|
|
2
|
+
export function slug(collection, name, locale) {
|
|
3
|
+
return { type: 'slug', collection, slug: name, locale };
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Reference specific ## heading sections from a content document.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* sections('pages', 'services', ['strategy', 'advisory']) // named sections
|
|
11
|
+
* sections('pages', 'services', '*') // all sections
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export function sections(collection, slugName, names, locale) {
|
|
15
|
+
return { type: 'sections', collection, slug: slugName, names, locale };
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Reference multiple articles from a named collection.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* collection('blog', { sort: 'date:desc', limit: 3 })
|
|
23
|
+
* collection('blog', { exclude: ':slug' }) // exclude current dynamic slug
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export function collection(name, options = {}, locale) {
|
|
27
|
+
return { type: 'collection', collection: name, options, locale };
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=references.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"references.js","sourceRoot":"","sources":["../../src/page/references.ts"],"names":[],"mappings":"AAEA,oFAAoF;AACpF,MAAM,UAAU,IAAI,CAAC,UAAkB,EAAE,IAAY,EAAE,MAAe;IACpE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AACzD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,QAAQ,CACtB,UAAkB,EAClB,QAAgB,EAChB,KAA8B,EAC9B,MAAe;IAEf,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AACxE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CACxB,IAAY,EACZ,UAA6B,EAAE,EAC/B,MAAe;IAEf,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;AAClE,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content reference types for page composition.
|
|
3
|
+
*
|
|
4
|
+
* Three reference types describe what content a page needs:
|
|
5
|
+
* - SlugRef: single document (full frontmatter + body + sections)
|
|
6
|
+
* - SectionsRef: specific ## heading sections from a document
|
|
7
|
+
* - CollectionRef: multiple articles from a named collection
|
|
8
|
+
*/
|
|
9
|
+
/** Reference to a single content document */
|
|
10
|
+
export interface SlugRef {
|
|
11
|
+
readonly collection: string;
|
|
12
|
+
readonly locale?: string | undefined;
|
|
13
|
+
readonly type: 'slug';
|
|
14
|
+
readonly slug: string;
|
|
15
|
+
}
|
|
16
|
+
/** Reference to specific ## sections from a content document */
|
|
17
|
+
export interface SectionsRef {
|
|
18
|
+
readonly collection: string;
|
|
19
|
+
readonly locale?: string | undefined;
|
|
20
|
+
readonly type: 'sections';
|
|
21
|
+
readonly slug: string;
|
|
22
|
+
/** Named sections to extract, or '*' for all sections */
|
|
23
|
+
readonly names: readonly string[] | '*';
|
|
24
|
+
}
|
|
25
|
+
/** Options for collection queries */
|
|
26
|
+
export interface CollectionOptions {
|
|
27
|
+
/** Sort expression, e.g., 'date:desc', 'title:asc' */
|
|
28
|
+
sort?: string | undefined;
|
|
29
|
+
/** Maximum number of results */
|
|
30
|
+
limit?: number | undefined;
|
|
31
|
+
/** Pagination offset */
|
|
32
|
+
offset?: number | undefined;
|
|
33
|
+
/** Slug to exclude — ':slug' resolves to current dynamic slug */
|
|
34
|
+
exclude?: string | undefined;
|
|
35
|
+
}
|
|
36
|
+
/** Reference to multiple articles from a collection */
|
|
37
|
+
export interface CollectionRef {
|
|
38
|
+
readonly locale?: string | undefined;
|
|
39
|
+
readonly type: 'collection';
|
|
40
|
+
readonly collection: string;
|
|
41
|
+
readonly options: CollectionOptions;
|
|
42
|
+
}
|
|
43
|
+
/** Union of all content reference types */
|
|
44
|
+
export type ContentRef = SlugRef | SectionsRef | CollectionRef;
|
|
45
|
+
/** Declares a page's route and content requirements */
|
|
46
|
+
export interface PageDefinition {
|
|
47
|
+
readonly route: string;
|
|
48
|
+
readonly content: Readonly<Record<string, ContentRef>>;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/page/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,6CAA6C;AAC7C,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,gEAAgE;AAChE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACpC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,yDAAyD;IACzD,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,GAAG,CAAA;CACxC;AAED,qCAAqC;AACrC,MAAM,WAAW,iBAAiB;IAChC,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC7B;AAED,uDAAuD;AACvD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACpC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAA;CACpC;AAED,2CAA2C;AAC3C,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,WAAW,GAAG,aAAa,CAAA;AAE9D,uDAAuD;AACvD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;CACvD"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content reference types for page composition.
|
|
3
|
+
*
|
|
4
|
+
* Three reference types describe what content a page needs:
|
|
5
|
+
* - SlugRef: single document (full frontmatter + body + sections)
|
|
6
|
+
* - SectionsRef: specific ## heading sections from a document
|
|
7
|
+
* - CollectionRef: multiple articles from a named collection
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/page/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type ZodObject, type ZodRawShape } from 'zod';
|
|
2
|
+
export declare function fromPortableJsonSchema(definition: Record<string, unknown>): ZodObject<ZodRawShape>;
|
|
3
|
+
export declare function portableJsonSchema(schema: ZodObject<ZodRawShape>): Record<string, unknown>;
|
|
4
|
+
/** Extending an adopted contract preserves the definitions of its existing fields. */
|
|
5
|
+
export declare function retainPortableExtension(original: ZodObject<ZodRawShape>, additions: ZodObject<ZodRawShape>, extended: ZodObject<ZodRawShape>): void;
|
|
6
|
+
//# sourceMappingURL=portable-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-schema.d.ts","sourceRoot":"","sources":["../src/portable-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,KAAK,CAAA;AAMpF,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,SAAS,CAAC,WAAW,CAAC,CAKxB;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE1F;AAED,sFAAsF;AACtF,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,SAAS,CAAC,WAAW,CAAC,EAChC,SAAS,EAAE,SAAS,CAAC,WAAW,CAAC,EACjC,QAAQ,EAAE,SAAS,CAAC,WAAW,CAAC,GAC/B,IAAI,CAYN"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { fromJSONSchema, toJSONSchema } from 'zod';
|
|
2
|
+
// Zod can normalize a JSON Schema format into a different set of checks. Retain
|
|
3
|
+
// the reviewed portable definition so code adoption preserves its exact identity.
|
|
4
|
+
const definitions = new WeakMap();
|
|
5
|
+
export function fromPortableJsonSchema(definition) {
|
|
6
|
+
const schema = fromJSONSchema(definition);
|
|
7
|
+
if (schema.type !== 'object')
|
|
8
|
+
throw new Error('A portable author schema must define an object');
|
|
9
|
+
definitions.set(schema, structuredClone(definition));
|
|
10
|
+
return schema;
|
|
11
|
+
}
|
|
12
|
+
export function portableJsonSchema(schema) {
|
|
13
|
+
return structuredClone(definitions.get(schema) ?? toJSONSchema(schema.strict()));
|
|
14
|
+
}
|
|
15
|
+
/** Extending an adopted contract preserves the definitions of its existing fields. */
|
|
16
|
+
export function retainPortableExtension(original, additions, extended) {
|
|
17
|
+
if (!definitions.has(original))
|
|
18
|
+
return;
|
|
19
|
+
const base = portableJsonSchema(original);
|
|
20
|
+
const extra = portableJsonSchema(additions);
|
|
21
|
+
definitions.set(extended, {
|
|
22
|
+
...base,
|
|
23
|
+
properties: { ...base['properties'], ...extra['properties'] },
|
|
24
|
+
required: [
|
|
25
|
+
...(base['required'] ?? []),
|
|
26
|
+
...(extra['required'] ?? []),
|
|
27
|
+
],
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=portable-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-schema.js","sourceRoot":"","sources":["../src/portable-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAoC,MAAM,KAAK,CAAA;AAEpF,gFAAgF;AAChF,kFAAkF;AAClF,MAAM,WAAW,GAAG,IAAI,OAAO,EAAmD,CAAA;AAElF,MAAM,UAAU,sBAAsB,CACpC,UAAmC;IAEnC,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,CAA2B,CAAA;IACnE,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;IAC/F,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC,CAAA;IACpD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAA8B;IAC/D,OAAO,eAAe,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;AAClF,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,uBAAuB,CACrC,QAAgC,EAChC,SAAiC,EACjC,QAAgC;IAEhC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAM;IACtC,MAAM,IAAI,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAA;IACzC,MAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAA;IAC3C,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE;QACxB,GAAG,IAAI;QACP,UAAU,EAAE,EAAE,GAAI,IAAI,CAAC,YAAY,CAAY,EAAE,GAAI,KAAK,CAAC,YAAY,CAAY,EAAE;QACrF,QAAQ,EAAE;YACR,GAAG,CAAE,IAAI,CAAC,UAAU,CAAc,IAAI,EAAE,CAAC;YACzC,GAAG,CAAE,KAAK,CAAC,UAAU,CAAc,IAAI,EAAE,CAAC;SAC3C;KACF,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** Common fields for any publishable page (status is a system field — not included here) */
|
|
3
|
+
export declare const pageFields: {
|
|
4
|
+
title: z.ZodString;
|
|
5
|
+
description: z.ZodOptional<z.ZodString>;
|
|
6
|
+
};
|
|
7
|
+
/** Fields for articles and blog posts */
|
|
8
|
+
export declare const articleFields: {
|
|
9
|
+
author: z.ZodOptional<z.ZodString>;
|
|
10
|
+
'published-date': z.ZodOptional<z.ZodString>;
|
|
11
|
+
tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
12
|
+
category: z.ZodOptional<z.ZodString>;
|
|
13
|
+
title: z.ZodString;
|
|
14
|
+
description: z.ZodOptional<z.ZodString>;
|
|
15
|
+
};
|
|
16
|
+
/** SEO metadata fields */
|
|
17
|
+
export declare const seoFields: {
|
|
18
|
+
'og-title': z.ZodOptional<z.ZodString>;
|
|
19
|
+
'og-description': z.ZodOptional<z.ZodString>;
|
|
20
|
+
'og-image': z.ZodOptional<z.ZodString>;
|
|
21
|
+
'og-type': z.ZodOptional<z.ZodString>;
|
|
22
|
+
'canonical-url': z.ZodOptional<z.ZodString>;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=presets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,4FAA4F;AAC5F,eAAO,MAAM,UAAU;;;CAGtB,CAAA;AAED,yCAAyC;AACzC,eAAO,MAAM,aAAa;;;;;;;CAMzB,CAAA;AAED,0BAA0B;AAC1B,eAAO,MAAM,SAAS;;;;;;CAMrB,CAAA"}
|
package/dist/presets.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** Common fields for any publishable page (status is a system field — not included here) */
|
|
3
|
+
export const pageFields = {
|
|
4
|
+
title: z.string(),
|
|
5
|
+
description: z.string().optional(),
|
|
6
|
+
};
|
|
7
|
+
/** Fields for articles and blog posts */
|
|
8
|
+
export const articleFields = {
|
|
9
|
+
...pageFields,
|
|
10
|
+
author: z.string().optional(),
|
|
11
|
+
'published-date': z.string().date().optional(),
|
|
12
|
+
tags: z.array(z.string()).default([]),
|
|
13
|
+
category: z.string().optional(),
|
|
14
|
+
};
|
|
15
|
+
/** SEO metadata fields */
|
|
16
|
+
export const seoFields = {
|
|
17
|
+
'og-title': z.string().optional(),
|
|
18
|
+
'og-description': z.string().optional(),
|
|
19
|
+
'og-image': z.string().optional(),
|
|
20
|
+
'og-type': z.string().optional(),
|
|
21
|
+
'canonical-url': z.string().url().optional(),
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,4FAA4F;AAC5F,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAA;AAED,yCAAyC;AACzC,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,GAAG,UAAU;IACb,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;IAC9C,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACrC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAChC,CAAA;AAED,0BAA0B;AAC1B,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACvC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;CAC7C,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type AuthoredMetadata, type ContentContract } from '@krantho/persistence';
|
|
2
|
+
import { type ZodError, type ZodObject, type ZodRawShape } from 'zod';
|
|
3
|
+
import type { Collection } from './collection.js';
|
|
4
|
+
export interface ParsedRepositoryContent extends AuthoredMetadata {
|
|
5
|
+
fields: Record<string, unknown>;
|
|
6
|
+
body: string;
|
|
7
|
+
locale: string | undefined;
|
|
8
|
+
}
|
|
9
|
+
/** File and HTTP transfers share exactly the contract used by the editor. */
|
|
10
|
+
export declare function parseRepositoryContent(collection: Collection, slug: string, data: Record<string, unknown>, body: string, fields?: ZodObject<ZodRawShape>, activeContract?: ContentContract | undefined): {
|
|
11
|
+
success: true;
|
|
12
|
+
data: ParsedRepositoryContent;
|
|
13
|
+
} | {
|
|
14
|
+
success: false;
|
|
15
|
+
error: ZodError;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=repository-content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository-content.d.ts","sourceRoot":"","sources":["../src/repository-content.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EAGrB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAK,MAAM,KAAK,CAAA;AAExE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAGjD,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB;IAC/D,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAC3B;AAeD,6EAA6E;AAC7E,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,SAAS,CAAC,WAAW,CAAqB,EAClD,cAAc,CAAC,EAAE,eAAe,GAAG,SAAS,GAC3C;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,uBAAuB,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,CA8CxF"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { contractReferenceMatches, repositoryFrontmatter, } from '@krantho/persistence';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { compileContentContract, documentChecksum } from './archetypes.js';
|
|
4
|
+
import { validateDocument } from './validate-document.js';
|
|
5
|
+
const provenance = z.array(z
|
|
6
|
+
.object({
|
|
7
|
+
collection: z.string(),
|
|
8
|
+
slug: z.string(),
|
|
9
|
+
locale: z.string(),
|
|
10
|
+
version: z.number().int().positive(),
|
|
11
|
+
paths: z.array(z.string()),
|
|
12
|
+
values: z.record(z.string(), z.json()),
|
|
13
|
+
})
|
|
14
|
+
.strict());
|
|
15
|
+
/** File and HTTP transfers share exactly the contract used by the editor. */
|
|
16
|
+
export function parseRepositoryContent(collection, slug, data, body, fields = collection.schema, activeContract) {
|
|
17
|
+
const envelope = repositoryFrontmatter(data);
|
|
18
|
+
const contract = activeContract ?? compileContentContract(collection.archetype, fields);
|
|
19
|
+
if (!contractReferenceMatches(envelope.contract, contract))
|
|
20
|
+
return invalid(['contract'], 'The file contract differs from the active contract. Review and adopt the active definition explicitly.');
|
|
21
|
+
const id = envelope.identity;
|
|
22
|
+
let locale = typeof data['locale'] === 'string' ? data['locale'] : undefined;
|
|
23
|
+
if (id !== undefined) {
|
|
24
|
+
const identity = z
|
|
25
|
+
.object({
|
|
26
|
+
collection: z.literal(collection.name),
|
|
27
|
+
slug: z.literal(slug),
|
|
28
|
+
locale: z.string().min(2),
|
|
29
|
+
})
|
|
30
|
+
.strict()
|
|
31
|
+
.safeParse(id);
|
|
32
|
+
if (!identity.success)
|
|
33
|
+
return invalid(['identity'], 'The file identity must match its collection and filename');
|
|
34
|
+
if (locale !== undefined && locale !== identity.data.locale)
|
|
35
|
+
return invalid(['locale'], 'Locale must agree with the document identity');
|
|
36
|
+
locale = identity.data.locale;
|
|
37
|
+
}
|
|
38
|
+
const parsed = validateDocument(contract, {
|
|
39
|
+
fields: envelope.fields,
|
|
40
|
+
body,
|
|
41
|
+
metadata: envelope.metadata,
|
|
42
|
+
});
|
|
43
|
+
if (!parsed.success)
|
|
44
|
+
return parsed;
|
|
45
|
+
const defaults = provenance.safeParse(envelope.defaults);
|
|
46
|
+
if (!defaults.success)
|
|
47
|
+
return defaults;
|
|
48
|
+
return {
|
|
49
|
+
success: true,
|
|
50
|
+
data: {
|
|
51
|
+
...parsed.data,
|
|
52
|
+
contract,
|
|
53
|
+
defaults: defaults.data,
|
|
54
|
+
locale,
|
|
55
|
+
repositoryBasis: {
|
|
56
|
+
checksum: documentChecksum({ ...parsed.data, contract, defaults: defaults.data }),
|
|
57
|
+
version: 0,
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function invalid(path, message) {
|
|
63
|
+
return { success: false, error: new z.ZodError([{ code: 'custom', path, message }]) };
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=repository-content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository-content.js","sourceRoot":"","sources":["../src/repository-content.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ContentContract, RuntimeSchemaDefinition } from '@krantho/persistence';
|
|
2
|
+
import type { Collection } from './collection.js';
|
|
3
|
+
/** Runtime additions produce a complete new contract; saved contracts never change. */
|
|
4
|
+
export declare function resolveCollectionContract(collection: Collection, runtime: RuntimeSchemaDefinition | null): ContentContract;
|
|
5
|
+
//# sourceMappingURL=resolved-contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolved-contract.d.ts","sourceRoot":"","sources":["../src/resolved-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAQpF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAIjD,uFAAuF;AACvF,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,uBAAuB,GAAG,IAAI,GACtC,eAAe,CAqBjB"}
|