@krantho/seo 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/define-archetype.d.ts +23 -0
- package/dist/archetypes/define-archetype.d.ts.map +1 -0
- package/dist/archetypes/define-archetype.js +51 -0
- package/dist/archetypes/define-archetype.js.map +1 -0
- package/dist/archetypes/index.d.ts +4 -0
- package/dist/archetypes/index.d.ts.map +1 -0
- package/dist/archetypes/index.js +3 -0
- package/dist/archetypes/index.js.map +1 -0
- package/dist/archetypes/presets.d.ts +21 -0
- package/dist/archetypes/presets.d.ts.map +1 -0
- package/dist/archetypes/presets.js +42 -0
- package/dist/archetypes/presets.js.map +1 -0
- package/dist/archetypes/types.d.ts +20 -0
- package/dist/archetypes/types.d.ts.map +1 -0
- package/dist/archetypes/types.js +2 -0
- package/dist/archetypes/types.js.map +1 -0
- package/dist/catalog/auto-mappings.d.ts +39 -0
- package/dist/catalog/auto-mappings.d.ts.map +1 -0
- package/dist/catalog/auto-mappings.js +64 -0
- package/dist/catalog/auto-mappings.js.map +1 -0
- package/dist/catalog/index.d.ts +7 -0
- package/dist/catalog/index.d.ts.map +1 -0
- package/dist/catalog/index.js +4 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/catalog/properties.d.ts +9 -0
- package/dist/catalog/properties.d.ts.map +1 -0
- package/dist/catalog/properties.js +630 -0
- package/dist/catalog/properties.js.map +1 -0
- package/dist/catalog/property-atoms.d.ts +53 -0
- package/dist/catalog/property-atoms.d.ts.map +1 -0
- package/dist/catalog/property-atoms.js +170 -0
- package/dist/catalog/property-atoms.js.map +1 -0
- package/dist/catalog/types.d.ts +53 -0
- package/dist/catalog/types.d.ts.map +1 -0
- package/dist/catalog/types.js +423 -0
- package/dist/catalog/types.js.map +1 -0
- package/dist/create-seo.d.ts +70 -0
- package/dist/create-seo.d.ts.map +1 -0
- package/dist/create-seo.js +137 -0
- package/dist/create-seo.js.map +1 -0
- package/dist/decorators/breadcrumb.d.ts +12 -0
- package/dist/decorators/breadcrumb.d.ts.map +1 -0
- package/dist/decorators/breadcrumb.js +36 -0
- package/dist/decorators/breadcrumb.js.map +1 -0
- package/dist/decorators/index.d.ts +8 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/dist/decorators/index.js +13 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/decorators/nodes.d.ts +12 -0
- package/dist/decorators/nodes.d.ts.map +1 -0
- package/dist/decorators/nodes.js +29 -0
- package/dist/decorators/nodes.js.map +1 -0
- package/dist/decorators/page.d.ts +13 -0
- package/dist/decorators/page.d.ts.map +1 -0
- package/dist/decorators/page.js +68 -0
- package/dist/decorators/page.js.map +1 -0
- package/dist/decorators/registry.d.ts +11 -0
- package/dist/decorators/registry.d.ts.map +1 -0
- package/dist/decorators/registry.js +29 -0
- package/dist/decorators/registry.js.map +1 -0
- package/dist/decorators/sequence.d.ts +8 -0
- package/dist/decorators/sequence.d.ts.map +1 -0
- package/dist/decorators/sequence.js +22 -0
- package/dist/decorators/sequence.js.map +1 -0
- package/dist/decorators/types.d.ts +30 -0
- package/dist/decorators/types.d.ts.map +1 -0
- package/dist/decorators/types.js +2 -0
- package/dist/decorators/types.js.map +1 -0
- package/dist/define-seo.d.ts +21 -0
- package/dist/define-seo.d.ts.map +1 -0
- package/dist/define-seo.js +31 -0
- package/dist/define-seo.js.map +1 -0
- package/dist/graph/build-entity.d.ts +47 -0
- package/dist/graph/build-entity.d.ts.map +1 -0
- package/dist/graph/build-entity.js +69 -0
- package/dist/graph/build-entity.js.map +1 -0
- package/dist/graph/compose-from-config.d.ts +89 -0
- package/dist/graph/compose-from-config.d.ts.map +1 -0
- package/dist/graph/compose-from-config.js +189 -0
- package/dist/graph/compose-from-config.js.map +1 -0
- package/dist/graph/compose-graph.d.ts +40 -0
- package/dist/graph/compose-graph.d.ts.map +1 -0
- package/dist/graph/compose-graph.js +30 -0
- package/dist/graph/compose-graph.js.map +1 -0
- package/dist/graph/effective-config.d.ts +36 -0
- package/dist/graph/effective-config.d.ts.map +1 -0
- package/dist/graph/effective-config.js +84 -0
- package/dist/graph/effective-config.js.map +1 -0
- package/dist/graph/id-conventions.d.ts +47 -0
- package/dist/graph/id-conventions.d.ts.map +1 -0
- package/dist/graph/id-conventions.js +78 -0
- package/dist/graph/id-conventions.js.map +1 -0
- package/dist/graph/index.d.ts +9 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +4 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/resolve-properties.d.ts +36 -0
- package/dist/graph/resolve-properties.d.ts.map +1 -0
- package/dist/graph/resolve-properties.js +141 -0
- package/dist/graph/resolve-properties.js.map +1 -0
- package/dist/graph/resolve-references.d.ts +14 -0
- package/dist/graph/resolve-references.d.ts.map +1 -0
- package/dist/graph/resolve-references.js +49 -0
- package/dist/graph/resolve-references.js.map +1 -0
- package/dist/graph/typed-value.d.ts +7 -0
- package/dist/graph/typed-value.d.ts.map +1 -0
- package/dist/graph/typed-value.js +43 -0
- package/dist/graph/typed-value.js.map +1 -0
- package/dist/graph/types.d.ts +34 -0
- package/dist/graph/types.d.ts.map +1 -0
- package/dist/graph/types.js +2 -0
- package/dist/graph/types.js.map +1 -0
- package/dist/graph/value-scope.d.ts +19 -0
- package/dist/graph/value-scope.d.ts.map +1 -0
- package/dist/graph/value-scope.js +30 -0
- package/dist/graph/value-scope.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/json-ld.d.ts +24 -0
- package/dist/json-ld.d.ts.map +1 -0
- package/dist/json-ld.js +24 -0
- package/dist/json-ld.js.map +1 -0
- package/dist/profiles/bing.d.ts +10 -0
- package/dist/profiles/bing.d.ts.map +1 -0
- package/dist/profiles/bing.js +13 -0
- package/dist/profiles/bing.js.map +1 -0
- package/dist/profiles/check.d.ts +11 -0
- package/dist/profiles/check.d.ts.map +1 -0
- package/dist/profiles/check.js +66 -0
- package/dist/profiles/check.js.map +1 -0
- package/dist/profiles/eligibility.d.ts +26 -0
- package/dist/profiles/eligibility.d.ts.map +1 -0
- package/dist/profiles/eligibility.js +49 -0
- package/dist/profiles/eligibility.js.map +1 -0
- package/dist/profiles/google.d.ts +4 -0
- package/dist/profiles/google.d.ts.map +1 -0
- package/dist/profiles/google.js +387 -0
- package/dist/profiles/google.js.map +1 -0
- package/dist/profiles/index.d.ts +10 -0
- package/dist/profiles/index.d.ts.map +1 -0
- package/dist/profiles/index.js +13 -0
- package/dist/profiles/index.js.map +1 -0
- package/dist/profiles/registry.d.ts +16 -0
- package/dist/profiles/registry.d.ts.map +1 -0
- package/dist/profiles/registry.js +66 -0
- package/dist/profiles/registry.js.map +1 -0
- package/dist/profiles/types.d.ts +29 -0
- package/dist/profiles/types.d.ts.map +1 -0
- package/dist/profiles/types.js +2 -0
- package/dist/profiles/types.js.map +1 -0
- package/dist/seo-graph.d.ts +39 -0
- package/dist/seo-graph.d.ts.map +1 -0
- package/dist/seo-graph.js +34 -0
- package/dist/seo-graph.js.map +1 -0
- package/dist/types/built-in/content.d.ts +12 -0
- package/dist/types/built-in/content.d.ts.map +1 -0
- package/dist/types/built-in/content.js +79 -0
- package/dist/types/built-in/content.js.map +1 -0
- package/dist/types/built-in/events.d.ts +23 -0
- package/dist/types/built-in/events.d.ts.map +1 -0
- package/dist/types/built-in/events.js +93 -0
- package/dist/types/built-in/events.js.map +1 -0
- package/dist/types/built-in/index.d.ts +4 -0
- package/dist/types/built-in/index.d.ts.map +1 -0
- package/dist/types/built-in/index.js +26 -0
- package/dist/types/built-in/index.js.map +1 -0
- package/dist/types/built-in/media.d.ts +21 -0
- package/dist/types/built-in/media.d.ts.map +1 -0
- package/dist/types/built-in/media.js +104 -0
- package/dist/types/built-in/media.js.map +1 -0
- package/dist/types/built-in/site.d.ts +14 -0
- package/dist/types/built-in/site.d.ts.map +1 -0
- package/dist/types/built-in/site.js +35 -0
- package/dist/types/built-in/site.js.map +1 -0
- package/dist/types/context.d.ts +26 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/context.js +44 -0
- package/dist/types/context.js.map +1 -0
- package/dist/types/definition.d.ts +58 -0
- package/dist/types/definition.d.ts.map +1 -0
- package/dist/types/definition.js +2 -0
- package/dist/types/definition.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/registry.d.ts +14 -0
- package/dist/types/registry.d.ts.map +1 -0
- package/dist/types/registry.js +37 -0
- package/dist/types/registry.js.map +1 -0
- package/dist/types/values.d.ts +23 -0
- package/dist/types/values.d.ts.map +1 -0
- package/dist/types/values.js +52 -0
- package/dist/types/values.js.map +1 -0
- package/dist/validate/check-terms.d.ts +15 -0
- package/dist/validate/check-terms.d.ts.map +1 -0
- package/dist/validate/check-terms.js +42 -0
- package/dist/validate/check-terms.js.map +1 -0
- package/dist/validate/check-value.d.ts +19 -0
- package/dist/validate/check-value.d.ts.map +1 -0
- package/dist/validate/check-value.js +77 -0
- package/dist/validate/check-value.js.map +1 -0
- package/dist/validate/graph-nodes.d.ts +22 -0
- package/dist/validate/graph-nodes.d.ts.map +1 -0
- package/dist/validate/graph-nodes.js +50 -0
- package/dist/validate/graph-nodes.js.map +1 -0
- package/dist/validate/index.d.ts +4 -0
- package/dist/validate/index.d.ts.map +1 -0
- package/dist/validate/index.js +2 -0
- package/dist/validate/index.js.map +1 -0
- package/dist/validate/types.d.ts +22 -0
- package/dist/validate/types.d.ts.map +1 -0
- package/dist/validate/types.js +2 -0
- package/dist/validate/types.js.map +1 -0
- package/dist/validate/validate-graph.d.ts +18 -0
- package/dist/validate/validate-graph.d.ts.map +1 -0
- package/dist/validate/validate-graph.js +109 -0
- package/dist/validate/validate-graph.js.map +1 -0
- package/dist/vocabulary/datatypes.d.ts +7 -0
- package/dist/vocabulary/datatypes.d.ts.map +1 -0
- package/dist/vocabulary/datatypes.js +46 -0
- package/dist/vocabulary/datatypes.js.map +1 -0
- package/dist/vocabulary/index.d.ts +5 -0
- package/dist/vocabulary/index.d.ts.map +1 -0
- package/dist/vocabulary/index.js +4 -0
- package/dist/vocabulary/index.js.map +1 -0
- package/dist/vocabulary/schemaorg.generated.d.ts +4 -0
- package/dist/vocabulary/schemaorg.generated.d.ts.map +1 -0
- package/dist/vocabulary/schemaorg.generated.js +3038 -0
- package/dist/vocabulary/schemaorg.generated.js.map +1 -0
- package/dist/vocabulary/types.d.ts +38 -0
- package/dist/vocabulary/types.d.ts.map +1 -0
- package/dist/vocabulary/types.js +2 -0
- package/dist/vocabulary/types.js.map +1 -0
- package/dist/vocabulary/vocabulary.d.ts +28 -0
- package/dist/vocabulary/vocabulary.d.ts.map +1 -0
- package/dist/vocabulary/vocabulary.js +89 -0
- package/dist/vocabulary/vocabulary.js.map +1 -0
- package/package.json +41 -3
- package/README.md +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breadcrumb.d.ts","sourceRoot":"","sources":["../../src/decorators/breadcrumb.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,YAAY,EAAE,CAO3E;AAED;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,SAkBjC,CAAA"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { isA, nodeById, ref } from './nodes.js';
|
|
2
|
+
/** A trail as BreadcrumbList items; the last one may leave out its URL */
|
|
3
|
+
export function breadcrumbItems(trail) {
|
|
4
|
+
return trail.map((step, index) => ({
|
|
5
|
+
'@type': 'ListItem',
|
|
6
|
+
position: index + 1,
|
|
7
|
+
name: step.name,
|
|
8
|
+
...(step.url ? { item: step.url } : {}),
|
|
9
|
+
}));
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* The page's place in the hierarchy: a BreadcrumbList from the trail it
|
|
13
|
+
* renders — a configured BreadcrumbList is built from the same trail — linked
|
|
14
|
+
* from the page node.
|
|
15
|
+
*/
|
|
16
|
+
export const breadcrumbDecorator = {
|
|
17
|
+
id: 'breadcrumb',
|
|
18
|
+
decorate(graph, page) {
|
|
19
|
+
let list = graph.find((node) => isA(node, 'BreadcrumbList'));
|
|
20
|
+
if (!list) {
|
|
21
|
+
if (!page.trail?.length)
|
|
22
|
+
return graph;
|
|
23
|
+
list = {
|
|
24
|
+
'@type': 'BreadcrumbList',
|
|
25
|
+
'@id': `${page.pageId.replace(/#[^#]*$/, '')}#breadcrumb`,
|
|
26
|
+
itemListElement: breadcrumbItems(page.trail),
|
|
27
|
+
};
|
|
28
|
+
graph.push(list);
|
|
29
|
+
}
|
|
30
|
+
const node = nodeById(graph, page.pageId);
|
|
31
|
+
if (node && list['@id'] && node['breadcrumb'] === undefined)
|
|
32
|
+
node['breadcrumb'] = ref(list['@id']);
|
|
33
|
+
return graph;
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=breadcrumb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breadcrumb.js","sourceRoot":"","sources":["../../src/decorators/breadcrumb.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,YAAY,CAAA;AAG/C,0EAA0E;AAC1E,MAAM,UAAU,eAAe,CAAC,KAA2B;IACzD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACjC,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,KAAK,GAAG,CAAC;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,CAAC,CAAC,CAAA;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAc;IAC5C,EAAE,EAAE,YAAY;IAChB,QAAQ,CAAC,KAAK,EAAE,IAAI;QAClB,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAA;QAC5D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM;gBAAE,OAAO,KAAK,CAAA;YACrC,IAAI,GAAG;gBACL,OAAO,EAAE,gBAAgB;gBACzB,KAAK,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,aAAa;gBACzD,eAAe,EAAE,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;aAC7C,CAAA;YACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClB,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACzC,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,SAAS;YACzD,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QACvC,OAAO,KAAK,CAAA;IACd,CAAC;CACF,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { breadcrumbDecorator, breadcrumbItems } from './breadcrumb.js';
|
|
2
|
+
export { pageDecorator, pageTypeFor } from './page.js';
|
|
3
|
+
export { registerDecorator, registeredDecorators } from './registry.js';
|
|
4
|
+
export { sequenceDecorator } from './sequence.js';
|
|
5
|
+
export type { Decorator, PageContext, ResolvedStructure } from './types.js';
|
|
6
|
+
/** krantho's decorators, in the order they run: the page node, then its trail, then its sequence */
|
|
7
|
+
export declare const BUILT_IN_DECORATORS: readonly [import("./types.js").Decorator, import("./types.js").Decorator, import("./types.js").Decorator];
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/decorators/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACtE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACtD,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACjD,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAE3E,oGAAoG;AACpG,eAAO,MAAM,mBAAmB,2GAAmE,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { breadcrumbDecorator } from './breadcrumb.js';
|
|
2
|
+
import { pageDecorator } from './page.js';
|
|
3
|
+
import { registerDecorator } from './registry.js';
|
|
4
|
+
import { sequenceDecorator } from './sequence.js';
|
|
5
|
+
export { breadcrumbDecorator, breadcrumbItems } from './breadcrumb.js';
|
|
6
|
+
export { pageDecorator, pageTypeFor } from './page.js';
|
|
7
|
+
export { registerDecorator, registeredDecorators } from './registry.js';
|
|
8
|
+
export { sequenceDecorator } from './sequence.js';
|
|
9
|
+
/** krantho's decorators, in the order they run: the page node, then its trail, then its sequence */
|
|
10
|
+
export const BUILT_IN_DECORATORS = [pageDecorator, breadcrumbDecorator, sequenceDecorator];
|
|
11
|
+
for (const decorator of BUILT_IN_DECORATORS)
|
|
12
|
+
registerDecorator(decorator);
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/decorators/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEjD,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACtE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACtD,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAGjD,oGAAoG;AACpG,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,aAAa,EAAE,mBAAmB,EAAE,iBAAiB,CAAU,CAAA;AAEnG,KAAK,MAAM,SAAS,IAAI,mBAAmB;IAAE,iBAAiB,CAAC,SAAS,CAAC,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SchemaEntity } from '../graph/types.js';
|
|
2
|
+
/** Whether the node is of the type or one of its subtypes */
|
|
3
|
+
export declare function isA(node: SchemaEntity, type: string): boolean;
|
|
4
|
+
/** The node with the `@id` */
|
|
5
|
+
export declare function nodeById(graph: readonly SchemaEntity[], id: string): SchemaEntity | undefined;
|
|
6
|
+
/** A reference to a node */
|
|
7
|
+
export declare function ref(id: string): {
|
|
8
|
+
'@id': string;
|
|
9
|
+
};
|
|
10
|
+
/** Add a value to a property that may already hold one or several */
|
|
11
|
+
export declare function addValue(node: SchemaEntity, property: string, value: unknown): void;
|
|
12
|
+
//# sourceMappingURL=nodes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../src/decorators/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAUrD,6DAA6D;AAC7D,wBAAgB,GAAG,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,8BAA8B;AAC9B,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAE7F;AAED,4BAA4B;AAC5B,wBAAgB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAEjD;AAED,qEAAqE;AACrE,wBAAgB,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAInF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { isSubtypeOf } from '../vocabulary/index.js';
|
|
2
|
+
/** The node's types, whether `@type` is one or several */
|
|
3
|
+
function typesOf(node) {
|
|
4
|
+
const type = node['@type'];
|
|
5
|
+
if (typeof type === 'string')
|
|
6
|
+
return [type];
|
|
7
|
+
return Array.isArray(type) ? type.filter((t) => typeof t === 'string') : [];
|
|
8
|
+
}
|
|
9
|
+
/** Whether the node is of the type or one of its subtypes */
|
|
10
|
+
export function isA(node, type) {
|
|
11
|
+
return typesOf(node).some((own) => isSubtypeOf(own, type));
|
|
12
|
+
}
|
|
13
|
+
/** The node with the `@id` */
|
|
14
|
+
export function nodeById(graph, id) {
|
|
15
|
+
return graph.find((node) => node['@id'] === id);
|
|
16
|
+
}
|
|
17
|
+
/** A reference to a node */
|
|
18
|
+
export function ref(id) {
|
|
19
|
+
return { '@id': id };
|
|
20
|
+
}
|
|
21
|
+
/** Add a value to a property that may already hold one or several */
|
|
22
|
+
export function addValue(node, property, value) {
|
|
23
|
+
const current = node[property];
|
|
24
|
+
if (current === undefined)
|
|
25
|
+
node[property] = value;
|
|
26
|
+
else
|
|
27
|
+
node[property] = [...(Array.isArray(current) ? current : [current]), value];
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=nodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../src/decorators/nodes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEpD,0DAA0D;AAC1D,SAAS,OAAO,CAAC,IAAkB;IACjC,MAAM,IAAI,GAAY,IAAI,CAAC,OAAO,CAAC,CAAA;IACnC,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3C,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AAC1F,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,GAAG,CAAC,IAAkB,EAAE,IAAY;IAClD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAA;AAC5D,CAAC;AAED,8BAA8B;AAC9B,MAAM,UAAU,QAAQ,CAAC,KAA8B,EAAE,EAAU;IACjE,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA;AACjD,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,GAAG,CAAC,EAAU;IAC5B,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;AACtB,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,QAAQ,CAAC,IAAkB,EAAE,QAAgB,EAAE,KAAc;IAC3E,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC9B,IAAI,OAAO,KAAK,SAAS;QAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAA;;QAC5C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;AAClF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Decorator } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* The Schema.org type of a page of the kind — a named kind, or a current
|
|
4
|
+
* WebPage type — or undefined when the kind names neither
|
|
5
|
+
*/
|
|
6
|
+
export declare function pageTypeFor(kind: string | undefined): string | undefined;
|
|
7
|
+
/**
|
|
8
|
+
* The page node: the page's configured WebPage type, or a node of the type its
|
|
9
|
+
* kind names. It is part of the WebSite, its main entity is what the page is
|
|
10
|
+
* about, and it carries the page's URL, name, image, language and date.
|
|
11
|
+
*/
|
|
12
|
+
export declare const pageDecorator: Decorator;
|
|
13
|
+
//# sourceMappingURL=page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/decorators/page.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAU3C;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAOxE;AAiBD;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,SAmB3B,CAAA"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { isEmpty } from '../types/values.js';
|
|
2
|
+
import { getVocabularyType, isSubtypeOf, lifecycleOf } from '../vocabulary/index.js';
|
|
3
|
+
import { isA, nodeById, ref } from './nodes.js';
|
|
4
|
+
const PAGE_KINDS = {
|
|
5
|
+
item: 'ItemPage',
|
|
6
|
+
collection: 'CollectionPage',
|
|
7
|
+
about: 'AboutPage',
|
|
8
|
+
faq: 'FAQPage',
|
|
9
|
+
profile: 'ProfilePage',
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* The Schema.org type of a page of the kind — a named kind, or a current
|
|
13
|
+
* WebPage type — or undefined when the kind names neither
|
|
14
|
+
*/
|
|
15
|
+
export function pageTypeFor(kind) {
|
|
16
|
+
if (kind === undefined)
|
|
17
|
+
return 'WebPage';
|
|
18
|
+
const named = PAGE_KINDS[kind];
|
|
19
|
+
if (named)
|
|
20
|
+
return named;
|
|
21
|
+
if (!getVocabularyType(kind) || !isSubtypeOf(kind, 'WebPage'))
|
|
22
|
+
return undefined;
|
|
23
|
+
const status = lifecycleOf(kind)?.status;
|
|
24
|
+
return status === 'superseded' || status === 'retired' ? undefined : kind;
|
|
25
|
+
}
|
|
26
|
+
/** An image value as the ImageObject `primaryImageOfPage` takes */
|
|
27
|
+
function imageObject(image) {
|
|
28
|
+
const first = Array.isArray(image) ? image[0] : image;
|
|
29
|
+
if (typeof first === 'string')
|
|
30
|
+
return { '@type': 'ImageObject', url: first };
|
|
31
|
+
if (first && typeof first === 'object' && first['@type'] === 'ImageObject') {
|
|
32
|
+
return first;
|
|
33
|
+
}
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
/** Set the property unless the node already has a value for it */
|
|
37
|
+
function fill(node, property, value) {
|
|
38
|
+
if (isEmpty(node[property]) && !isEmpty(value))
|
|
39
|
+
node[property] = value;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The page node: the page's configured WebPage type, or a node of the type its
|
|
43
|
+
* kind names. It is part of the WebSite, its main entity is what the page is
|
|
44
|
+
* about, and it carries the page's URL, name, image, language and date.
|
|
45
|
+
*/
|
|
46
|
+
export const pageDecorator = {
|
|
47
|
+
id: 'page',
|
|
48
|
+
decorate(graph, page) {
|
|
49
|
+
let node = nodeById(graph, page.pageId);
|
|
50
|
+
if (!node) {
|
|
51
|
+
node = { '@type': pageTypeFor(page.kind) ?? 'WebPage', '@id': page.pageId };
|
|
52
|
+
graph.push(node);
|
|
53
|
+
}
|
|
54
|
+
const website = graph.find((entity) => isA(entity, 'WebSite'));
|
|
55
|
+
const main = page.mainEntityId ? nodeById(graph, page.mainEntityId) : undefined;
|
|
56
|
+
fill(node, 'url', page.url);
|
|
57
|
+
fill(node, 'name', page.title);
|
|
58
|
+
if (website?.['@id'])
|
|
59
|
+
fill(node, 'isPartOf', ref(website['@id']));
|
|
60
|
+
if (main?.['@id'])
|
|
61
|
+
fill(node, 'mainEntity', ref(main['@id']));
|
|
62
|
+
fill(node, 'primaryImageOfPage', imageObject(main?.['image']));
|
|
63
|
+
fill(node, 'dateModified', page.dateModified);
|
|
64
|
+
fill(node, 'inLanguage', page.language);
|
|
65
|
+
return graph;
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/decorators/page.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Decorator } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Register a page-structure decorator. A site registers its own for
|
|
4
|
+
* structures krantho does not know, the same way krantho registers its
|
|
5
|
+
* built-ins; one with the id of a registered decorator replaces it in place.
|
|
6
|
+
* Returns a function that restores the previous registration.
|
|
7
|
+
*/
|
|
8
|
+
export declare function registerDecorator(decorator: Decorator): () => void;
|
|
9
|
+
/** The registered decorators, in the order they run */
|
|
10
|
+
export declare function registeredDecorators(): readonly Decorator[];
|
|
11
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/decorators/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAI3C;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,IAAI,CAWlE;AAED,uDAAuD;AACvD,wBAAgB,oBAAoB,IAAI,SAAS,SAAS,EAAE,CAE3D"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const decorators = [];
|
|
2
|
+
/**
|
|
3
|
+
* Register a page-structure decorator. A site registers its own for
|
|
4
|
+
* structures krantho does not know, the same way krantho registers its
|
|
5
|
+
* built-ins; one with the id of a registered decorator replaces it in place.
|
|
6
|
+
* Returns a function that restores the previous registration.
|
|
7
|
+
*/
|
|
8
|
+
export function registerDecorator(decorator) {
|
|
9
|
+
const index = decorators.findIndex((registered) => registered.id === decorator.id);
|
|
10
|
+
const previous = index >= 0 ? decorators[index] : undefined;
|
|
11
|
+
if (index >= 0)
|
|
12
|
+
decorators[index] = decorator;
|
|
13
|
+
else
|
|
14
|
+
decorators.push(decorator);
|
|
15
|
+
return () => {
|
|
16
|
+
const at = decorators.indexOf(decorator);
|
|
17
|
+
if (at < 0)
|
|
18
|
+
return;
|
|
19
|
+
if (previous)
|
|
20
|
+
decorators[at] = previous;
|
|
21
|
+
else
|
|
22
|
+
decorators.splice(at, 1);
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/** The registered decorators, in the order they run */
|
|
26
|
+
export function registeredDecorators() {
|
|
27
|
+
return [...decorators];
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/decorators/registry.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAgB,EAAE,CAAA;AAElC;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAoB;IACpD,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC,CAAA;IAClF,MAAM,QAAQ,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC3D,IAAI,KAAK,IAAI,CAAC;QAAE,UAAU,CAAC,KAAK,CAAC,GAAG,SAAS,CAAA;;QACxC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC/B,OAAO,GAAG,EAAE;QACV,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QACxC,IAAI,EAAE,GAAG,CAAC;YAAE,OAAM;QAClB,IAAI,QAAQ;YAAE,UAAU,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAA;;YAClC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;IAC/B,CAAC,CAAA;AACH,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,oBAAoB;IAClC,OAAO,CAAC,GAAG,UAAU,CAAC,CAAA;AACxB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Decorator } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* The page's place in an ordered set — a docs area, a series: the set as a
|
|
4
|
+
* CollectionPage the page is part of, and the page's position in it. Order,
|
|
5
|
+
* as opposed to the hierarchy the breadcrumb states.
|
|
6
|
+
*/
|
|
7
|
+
export declare const sequenceDecorator: Decorator;
|
|
8
|
+
//# sourceMappingURL=sequence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequence.d.ts","sourceRoot":"","sources":["../../src/decorators/sequence.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAY/B,CAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { addValue, nodeById, ref } from './nodes.js';
|
|
2
|
+
/**
|
|
3
|
+
* The page's place in an ordered set — a docs area, a series: the set as a
|
|
4
|
+
* CollectionPage the page is part of, and the page's position in it. Order,
|
|
5
|
+
* as opposed to the hierarchy the breadcrumb states.
|
|
6
|
+
*/
|
|
7
|
+
export const sequenceDecorator = {
|
|
8
|
+
id: 'sequence',
|
|
9
|
+
decorate(graph, page) {
|
|
10
|
+
const { sequence } = page;
|
|
11
|
+
const node = nodeById(graph, page.pageId);
|
|
12
|
+
if (!sequence || !node)
|
|
13
|
+
return graph;
|
|
14
|
+
const { name, url } = sequence.partOf;
|
|
15
|
+
if (!nodeById(graph, url))
|
|
16
|
+
graph.push({ '@type': 'CollectionPage', '@id': url, name, url });
|
|
17
|
+
addValue(node, 'isPartOf', ref(url));
|
|
18
|
+
node['position'] = sequence.position;
|
|
19
|
+
return graph;
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=sequence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequence.js","sourceRoot":"","sources":["../../src/decorators/sequence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,YAAY,CAAA;AAGpD;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAc;IAC1C,EAAE,EAAE,UAAU;IACd,QAAQ,CAAC,KAAK,EAAE,IAAI;QAClB,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;QACzB,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACzC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAA;QACpC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAA;QACrC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAA;QAC3F,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;QACpC,IAAI,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAA;QACpC,OAAO,KAAK,CAAA;IACd,CAAC;CACF,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { PageStructure, TrailItem } from '@krantho/core';
|
|
2
|
+
import type { SchemaEntity, SeoGraphConfig } from '../graph/types.js';
|
|
3
|
+
/** The page a graph describes, as the decorators see it */
|
|
4
|
+
export interface PageContext {
|
|
5
|
+
readonly site: SeoGraphConfig;
|
|
6
|
+
readonly path: string;
|
|
7
|
+
/** The page's absolute URL */
|
|
8
|
+
readonly url: string;
|
|
9
|
+
/** The `@id` of the page node: a configured WebPage type of the page, or `<url>/#webpage` */
|
|
10
|
+
readonly pageId: string;
|
|
11
|
+
/** The `@id` of the entity the page is about, when it has one besides the page itself */
|
|
12
|
+
readonly mainEntityId?: string | undefined;
|
|
13
|
+
readonly title?: string | undefined;
|
|
14
|
+
readonly language?: string | undefined;
|
|
15
|
+
readonly dateModified?: string | undefined;
|
|
16
|
+
}
|
|
17
|
+
/** A page's structure with every trail URL absolute and the page itself last */
|
|
18
|
+
export interface ResolvedStructure extends PageStructure {
|
|
19
|
+
readonly trail?: readonly TrailItem[] | undefined;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Turns a fact of the page's structure into graph nodes and edges. Decorators
|
|
23
|
+
* run in registration order after the entities are built and their references
|
|
24
|
+
* resolved; each returns the graph it was given, changed.
|
|
25
|
+
*/
|
|
26
|
+
export interface Decorator {
|
|
27
|
+
readonly id: string;
|
|
28
|
+
decorate(graph: SchemaEntity[], page: PageContext & ResolvedStructure): SchemaEntity[];
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/decorators/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAErE,2DAA2D;AAC3D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,8BAA8B;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,6FAA6F;IAC7F,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,yFAAyF;IACzF,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC3C;AAED,gFAAgF;AAChF,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,CAAA;CAClD;AAED;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,WAAW,GAAG,iBAAiB,GAAG,YAAY,EAAE,CAAA;CACvF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/decorators/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Decorator } from './decorators/index.js';
|
|
2
|
+
import type { ReaderProfile } from './profiles/index.js';
|
|
3
|
+
import type { TypeDefinition } from './types/index.js';
|
|
4
|
+
/** What a site adds to krantho's structured data */
|
|
5
|
+
export interface SeoExtensions {
|
|
6
|
+
/** How the site's own Schema.org types are built, or how a built-in one is built differently */
|
|
7
|
+
readonly types?: readonly TypeDefinition[] | undefined;
|
|
8
|
+
/** Readers besides Google and Bing; activate one with `seo.readers` */
|
|
9
|
+
readonly profiles?: readonly ReaderProfile[] | undefined;
|
|
10
|
+
/** Page structures krantho does not know, decorated after the built-in ones */
|
|
11
|
+
readonly decorators?: readonly Decorator[] | undefined;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Register a site's own types, reader profiles and page-structure decorators,
|
|
15
|
+
* all or none: when one is refused (an unknown or retired type, a rule without
|
|
16
|
+
* a source), the ones registered before it are removed and the error is
|
|
17
|
+
* thrown. Call it once, in a module the server loads before it renders pages.
|
|
18
|
+
* Returns a function that restores what was registered before.
|
|
19
|
+
*/
|
|
20
|
+
export declare function defineSeo(extensions: SeoExtensions): () => void;
|
|
21
|
+
//# sourceMappingURL=define-seo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-seo.d.ts","sourceRoot":"","sources":["../src/define-seo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAEtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAExD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAGtD,oDAAoD;AACpD,MAAM,WAAW,aAAa;IAC5B,gGAAgG;IAChG,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,cAAc,EAAE,GAAG,SAAS,CAAA;IACtD,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,aAAa,EAAE,GAAG,SAAS,CAAA;IACxD,+EAA+E;IAC/E,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,CAAA;CACvD;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,aAAa,GAAG,MAAM,IAAI,CAc/D"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { registerDecorator } from './decorators/index.js';
|
|
2
|
+
import { registerProfile } from './profiles/index.js';
|
|
3
|
+
import { registerType } from './types/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Register a site's own types, reader profiles and page-structure decorators,
|
|
6
|
+
* all or none: when one is refused (an unknown or retired type, a rule without
|
|
7
|
+
* a source), the ones registered before it are removed and the error is
|
|
8
|
+
* thrown. Call it once, in a module the server loads before it renders pages.
|
|
9
|
+
* Returns a function that restores what was registered before.
|
|
10
|
+
*/
|
|
11
|
+
export function defineSeo(extensions) {
|
|
12
|
+
const restores = [];
|
|
13
|
+
const restoreAll = () => {
|
|
14
|
+
for (const restore of restores.reverse())
|
|
15
|
+
restore();
|
|
16
|
+
};
|
|
17
|
+
try {
|
|
18
|
+
for (const type of extensions.types ?? [])
|
|
19
|
+
restores.push(registerType(type));
|
|
20
|
+
for (const profile of extensions.profiles ?? [])
|
|
21
|
+
restores.push(registerProfile(profile));
|
|
22
|
+
for (const decorator of extensions.decorators ?? [])
|
|
23
|
+
restores.push(registerDecorator(decorator));
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
restoreAll();
|
|
27
|
+
throw error;
|
|
28
|
+
}
|
|
29
|
+
return restoreAll;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=define-seo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-seo.js","sourceRoot":"","sources":["../src/define-seo.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAY/C;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,UAAyB;IACjD,MAAM,QAAQ,GAAsB,EAAE,CAAA;IACtC,MAAM,UAAU,GAAG,GAAS,EAAE;QAC5B,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE;YAAE,OAAO,EAAE,CAAA;IACrD,CAAC,CAAA;IACD,IAAI,CAAC;QACH,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,IAAI,EAAE;YAAE,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;QAC5E,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,QAAQ,IAAI,EAAE;YAAE,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAA;QACxF,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,IAAI,EAAE;YAAE,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAA;IAClG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,EAAE,CAAA;QACZ,MAAM,KAAK,CAAA;IACb,CAAC;IACD,OAAO,UAAU,CAAA;AACnB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import '../types/built-in/index.js';
|
|
2
|
+
import type { TrailItem } from '@krantho/core';
|
|
3
|
+
import type { EntityLevel, ReferenceRule, ResolvedProperty, TypeDefinition } from '../types/definition.js';
|
|
4
|
+
import type { ComputedValues } from './resolve-properties.js';
|
|
5
|
+
import type { SchemaEntity, SeoGraphConfig } from './types.js';
|
|
6
|
+
/** What one entity is built from */
|
|
7
|
+
export interface EntityInput {
|
|
8
|
+
readonly type: string;
|
|
9
|
+
readonly level: EntityLevel;
|
|
10
|
+
/** The entity's `@id` as configured; derived from its type when absent */
|
|
11
|
+
readonly id?: string | undefined;
|
|
12
|
+
readonly configured: Readonly<Record<string, unknown>>;
|
|
13
|
+
readonly fields: Readonly<Record<string, unknown>>;
|
|
14
|
+
readonly fieldMappings?: Readonly<Record<string, string>> | undefined;
|
|
15
|
+
readonly computed: ComputedValues;
|
|
16
|
+
readonly site: SeoGraphConfig;
|
|
17
|
+
readonly path: string;
|
|
18
|
+
readonly title?: string | undefined;
|
|
19
|
+
readonly faq?: ReadonlyArray<{
|
|
20
|
+
question: string;
|
|
21
|
+
answer: string;
|
|
22
|
+
}> | undefined;
|
|
23
|
+
readonly trail?: readonly TrailItem[] | undefined;
|
|
24
|
+
}
|
|
25
|
+
/** A built entity with what the composer needs to finish the graph */
|
|
26
|
+
export interface ComposedNode {
|
|
27
|
+
readonly entity: SchemaEntity;
|
|
28
|
+
readonly level: EntityLevel;
|
|
29
|
+
readonly references: Readonly<Record<string, ReferenceRule>>;
|
|
30
|
+
}
|
|
31
|
+
/** Whether a resolved value belongs on the entity the builder made */
|
|
32
|
+
export declare function carries(property: string, resolved: ResolvedProperty, type: string, definition: TypeDefinition | undefined): boolean;
|
|
33
|
+
/** An entity's definition, `@id` and resolved values — what building it starts from */
|
|
34
|
+
export declare function entityInputValues(input: EntityInput): {
|
|
35
|
+
definition: TypeDefinition | undefined;
|
|
36
|
+
id: string;
|
|
37
|
+
values: Map<string, ResolvedProperty>;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Build one entity: resolve its property values, let the type's definition
|
|
41
|
+
* shape it (a typed node with no properties when none is registered), then
|
|
42
|
+
* carry every resolved value the builder left out and the type accepts — so
|
|
43
|
+
* no builder can drop a configured or computed value. A nested node from
|
|
44
|
+
* content gets the type its property names.
|
|
45
|
+
*/
|
|
46
|
+
export declare function buildEntity(input: EntityInput): ComposedNode;
|
|
47
|
+
//# sourceMappingURL=build-entity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-entity.d.ts","sourceRoot":"","sources":["../../src/graph/build-entity.ts"],"names":[],"mappings":"AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,KAAK,EAEV,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,cAAc,EACf,MAAM,wBAAwB,CAAA;AAK/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAG7D,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE9D,oCAAoC;AACpC,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;IAC3B,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACtD,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAClD,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAAA;IACrE,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAA;IACjC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,QAAQ,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,SAAS,CAAA;IAC9E,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,CAAA;CAClD;AAED,sEAAsE;AACtE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;IAC3B,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAA;CAC7D;AAYD,sEAAsE;AACtE,wBAAgB,OAAO,CACrB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,cAAc,GAAG,SAAS,GACrC,OAAO,CAUT;AAED,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG;IACrD,UAAU,EAAE,cAAc,GAAG,SAAS,CAAA;IACtC,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;CACtC,CAIA;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY,CAwB5D"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import '../types/built-in/index.js';
|
|
2
|
+
import { getTypeDefinition } from '../types/registry.js';
|
|
3
|
+
import { isEmpty } from '../types/values.js';
|
|
4
|
+
import { isPropertyOfType, isSubtypeOf } from '../vocabulary/index.js';
|
|
5
|
+
import { businessId, documentId } from './id-conventions.js';
|
|
6
|
+
import { resolveProperties } from './resolve-properties.js';
|
|
7
|
+
import { typedValue } from './typed-value.js';
|
|
8
|
+
/** The `@id` of an entity without a configured one */
|
|
9
|
+
function entityId(input, definition) {
|
|
10
|
+
const { baseUrl } = input.site;
|
|
11
|
+
const path = input.level === 'site' ? '' : input.path;
|
|
12
|
+
if (definition)
|
|
13
|
+
return documentId(baseUrl, definition.scope === 'site' ? '' : path, definition.idFragment);
|
|
14
|
+
if (input.level === 'site' && isSubtypeOf(input.type, 'Organization'))
|
|
15
|
+
return businessId(baseUrl);
|
|
16
|
+
return documentId(baseUrl, path, input.type.toLowerCase());
|
|
17
|
+
}
|
|
18
|
+
/** Whether a resolved value belongs on the entity the builder made */
|
|
19
|
+
export function carries(property, resolved, type, definition) {
|
|
20
|
+
if (resolved.source === 'manual')
|
|
21
|
+
return true;
|
|
22
|
+
if (resolved.source === 'computed' &&
|
|
23
|
+
definition?.computed &&
|
|
24
|
+
!definition.computed.includes(property)) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
return isPropertyOfType(property, type);
|
|
28
|
+
}
|
|
29
|
+
/** An entity's definition, `@id` and resolved values — what building it starts from */
|
|
30
|
+
export function entityInputValues(input) {
|
|
31
|
+
const definition = getTypeDefinition(input.type);
|
|
32
|
+
const id = input.id ?? entityId(input, definition);
|
|
33
|
+
return { definition, id, values: resolveProperties({ ...input, definition }) };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Build one entity: resolve its property values, let the type's definition
|
|
37
|
+
* shape it (a typed node with no properties when none is registered), then
|
|
38
|
+
* carry every resolved value the builder left out and the type accepts — so
|
|
39
|
+
* no builder can drop a configured or computed value. A nested node from
|
|
40
|
+
* content gets the type its property names.
|
|
41
|
+
*/
|
|
42
|
+
export function buildEntity(input) {
|
|
43
|
+
const { definition, id, values } = entityInputValues(input);
|
|
44
|
+
const context = {
|
|
45
|
+
type: input.type,
|
|
46
|
+
id,
|
|
47
|
+
level: input.level,
|
|
48
|
+
site: input.site,
|
|
49
|
+
path: input.level === 'site' ? '/' : input.path,
|
|
50
|
+
values,
|
|
51
|
+
title: input.title,
|
|
52
|
+
faq: input.faq,
|
|
53
|
+
trail: input.trail,
|
|
54
|
+
};
|
|
55
|
+
const entity = definition
|
|
56
|
+
? definition.build(context)
|
|
57
|
+
: { '@type': input.type, '@id': id };
|
|
58
|
+
for (const [property, resolved] of values) {
|
|
59
|
+
if (!isEmpty(entity[property]))
|
|
60
|
+
continue;
|
|
61
|
+
if (!carries(property, resolved, input.type, definition))
|
|
62
|
+
continue;
|
|
63
|
+
// Configured values are carried as set; validation reports what does not conform.
|
|
64
|
+
entity[property] =
|
|
65
|
+
resolved.source === 'manual' ? resolved.value : typedValue(property, resolved.value);
|
|
66
|
+
}
|
|
67
|
+
return { entity, level: input.level, references: definition?.references ?? {} };
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=build-entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-entity.js","sourceRoot":"","sources":["../../src/graph/build-entity.ts"],"names":[],"mappings":"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"}
|