canopycms 0.0.62 → 0.0.63
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/dist/ai/index.d.ts +9 -0
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +9 -0
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/to-plain-text.d.ts +57 -0
- package/dist/ai/to-plain-text.d.ts.map +1 -0
- package/dist/ai/to-plain-text.js +255 -0
- package/dist/ai/to-plain-text.js.map +1 -0
- package/dist/ai/transform-components.d.ts.map +1 -1
- package/dist/ai/transform-components.js +70 -5
- package/dist/ai/transform-components.js.map +1 -1
- package/dist/api/comments.d.ts +2 -2
- package/dist/authorization/branch.d.ts +55 -3
- package/dist/authorization/branch.d.ts.map +1 -1
- package/dist/authorization/branch.js +55 -9
- package/dist/authorization/branch.js.map +1 -1
- package/dist/authorization/types.d.ts +1 -1
- package/dist/authorization/types.d.ts.map +1 -1
- package/dist/build-canopy.d.ts +49 -0
- package/dist/build-canopy.d.ts.map +1 -0
- package/dist/build-canopy.js +51 -0
- package/dist/build-canopy.js.map +1 -0
- package/dist/cli/cli.js +78 -26
- package/dist/cli/generate-ai-content.js +77 -25
- package/dist/cli/template-files/canopycms.config.ts.template +18 -1
- package/dist/content-listing.d.ts +110 -5
- package/dist/content-listing.d.ts.map +1 -1
- package/dist/content-listing.js +164 -23
- package/dist/content-listing.js.map +1 -1
- package/dist/content-reader.d.ts +41 -4
- package/dist/content-reader.d.ts.map +1 -1
- package/dist/content-reader.js +17 -4
- package/dist/content-reader.js.map +1 -1
- package/dist/content-store.d.ts +10 -1
- package/dist/content-store.d.ts.map +1 -1
- package/dist/content-store.js.map +1 -1
- package/dist/content-tree.d.ts +31 -2
- package/dist/content-tree.d.ts.map +1 -1
- package/dist/content-tree.js +22 -5
- package/dist/content-tree.js.map +1 -1
- package/dist/context.d.ts +30 -10
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +55 -4
- package/dist/context.js.map +1 -1
- package/dist/entry-schema.d.ts +228 -8
- package/dist/entry-schema.d.ts.map +1 -1
- package/dist/entry-schema.js +124 -0
- package/dist/entry-schema.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +51 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +49 -0
- package/dist/server.js.map +1 -1
- package/dist/services.d.ts +1 -2
- package/dist/services.d.ts.map +1 -1
- package/dist/services.js +2 -6
- package/dist/services.js.map +1 -1
- package/dist/static/index.d.ts +65 -5
- package/dist/static/index.d.ts.map +1 -1
- package/dist/static/index.js +65 -12
- package/dist/static/index.js.map +1 -1
- package/dist/static/seo.d.ts +150 -0
- package/dist/static/seo.d.ts.map +1 -0
- package/dist/static/seo.js +189 -0
- package/dist/static/seo.js.map +1 -0
- package/dist/utils/sanitize-href.d.ts +46 -0
- package/dist/utils/sanitize-href.d.ts.map +1 -1
- package/dist/utils/sanitize-href.js +63 -2
- package/dist/utils/sanitize-href.js.map +1 -1
- package/package.json +1 -1
package/dist/server.js
CHANGED
|
@@ -9,6 +9,16 @@ export * from './build-mode.js';
|
|
|
9
9
|
export * from './context.js';
|
|
10
10
|
export { operatingStrategy } from './operating-mode/index.js';
|
|
11
11
|
export * from './authorization/groups/index.js';
|
|
12
|
+
/**
|
|
13
|
+
* One-call factory for a **build/admin** Canopy context — for standalone
|
|
14
|
+
* scripts that run entirely outside a Next.js request or build phase (index
|
|
15
|
+
* builders, content audits, codegen, ad hoc reports). Reads the filesystem
|
|
16
|
+
* directly as a synthetic admin user and bypasses ALL branch/path ACLs —
|
|
17
|
+
* never use it in request-handling code. See the source JSDoc for the full
|
|
18
|
+
* security note and the `createNextCanopyContext().getCanopyForBuild()`
|
|
19
|
+
* comparison this mirrors.
|
|
20
|
+
*/
|
|
21
|
+
export { createBuildCanopy } from './build-canopy.js';
|
|
12
22
|
/**
|
|
13
23
|
* Resolve a CanopyUser for a request: loads internal groups from the
|
|
14
24
|
* settings workspace (the single source of truth — never a content branch
|
|
@@ -40,6 +50,21 @@ export { createEntrySchemaRegistry } from './entry-schema-registry.js';
|
|
|
40
50
|
* than at request time.
|
|
41
51
|
*/
|
|
42
52
|
export { validateEntrySchemaRegistry } from './entry-schema-registry.js';
|
|
53
|
+
/**
|
|
54
|
+
* Resolve a display title for an entry using the full fallback chain: a
|
|
55
|
+
* schema-marked `isTitle` field, then `data.title`/`data.name`, then an
|
|
56
|
+
* entry-type label, then a humanized slug, then `"Untitled"`. Useful
|
|
57
|
+
* anywhere an entry needs a display title without re-deriving this chain —
|
|
58
|
+
* search-document/index builders in particular, since a search UI needs a
|
|
59
|
+
* title for every result regardless of which field the schema uses.
|
|
60
|
+
*
|
|
61
|
+
* Client-safe (no dependencies beyond `FieldConfig`/`InlineGroupFieldConfig`
|
|
62
|
+
* type imports, which are erased at compile time) — also re-exported from
|
|
63
|
+
* the root `canopycms` entry for that reason. Exported here too because
|
|
64
|
+
* build/admin scripts (the primary reason this was unreachable before) are
|
|
65
|
+
* more likely to `import` from `canopycms/server` than the root entry.
|
|
66
|
+
*/
|
|
67
|
+
export { resolveEntryTitle } from './utils/title-field.js';
|
|
43
68
|
/** Generate a Canopy-format 12-character Base58 content ID. */
|
|
44
69
|
export { generateId } from './id.js';
|
|
45
70
|
/** Returns true if a string is a valid 12-character Base58 Canopy ID. */
|
|
@@ -55,8 +80,25 @@ export { isValidId } from './id.js';
|
|
|
55
80
|
* via `getCanopyForBuild()` rather than the bare function.
|
|
56
81
|
*/
|
|
57
82
|
export { buildContentTree } from './content-tree.js';
|
|
83
|
+
/**
|
|
84
|
+
* `buildContentTree`'s default URL path builder: strips the `{contentRootName}/`
|
|
85
|
+
* prefix, collapses an entry's `index` slug to its parent collection's path, and
|
|
86
|
+
* lowercases the result. Call it from inside a custom `buildPath` to extend the
|
|
87
|
+
* default rather than reimplement it — `buildContentTree`'s `buildPath` option
|
|
88
|
+
* replaces the default outright, it does not compose with it.
|
|
89
|
+
*/
|
|
90
|
+
export { defaultBuildPath } from './content-tree.js';
|
|
58
91
|
/** List all content entries as a flat array. */
|
|
59
92
|
export { listEntries } from './content-listing.js';
|
|
93
|
+
/**
|
|
94
|
+
* Parse a content filename of the form `{type}.{slug}.{id}.{ext}` into its
|
|
95
|
+
* `{ type, slug, id }` parts. `id` must be a valid 12-character Base58 content ID
|
|
96
|
+
* (excludes the ambiguous characters `0`, `O`, `I`, `l`) or the parse fails.
|
|
97
|
+
* Pass `entryTypes` to also require `type` to match a known entry-type name;
|
|
98
|
+
* omit it to parse the filename shape without that check. See the source JSDoc
|
|
99
|
+
* for the full filename grammar.
|
|
100
|
+
*/
|
|
101
|
+
export { parseTypedFilename } from './content-listing.js';
|
|
60
102
|
/**
|
|
61
103
|
* Resolve a canopy entry-link to its URL. Pair with the field-walker variants
|
|
62
104
|
* (`resolveEntryLinksInText`, `resolveEntryLinksInData`) when rendering MDX
|
|
@@ -67,6 +109,13 @@ export { resolveEntryUrl, resolveEntryLinksInText, resolveEntryLinksInData, extr
|
|
|
67
109
|
export { computeEntryUrl } from './utils/entry-url.js';
|
|
68
110
|
/** Collect static paths for `generateStaticParams` / sitemap emission. */
|
|
69
111
|
export { collectStaticPaths } from './static/index.js';
|
|
112
|
+
/** Enumerate routable entries WITH their data — the input to sitemaps, feeds and search indexes. */
|
|
113
|
+
export { collectRoutableEntries } from './static/index.js';
|
|
114
|
+
/**
|
|
115
|
+
* SEO field extraction and URL shaping (framework-agnostic). `isNoindexEntry` is the single
|
|
116
|
+
* predicate behind both `robots: noindex` and sitemap exclusion.
|
|
117
|
+
*/
|
|
118
|
+
export { DEFAULT_SEO_FIELD_NAMES, extractSeoFields, isNoindexEntry, isAbsoluteUrl, withTrailingSlash, resolveSeoUrl, stripTrailingSlashes, } from './static/index.js';
|
|
70
119
|
/**
|
|
71
120
|
* Start a chokidar-backed watcher that detects divergence between the dev
|
|
72
121
|
* working tree and the resolved branch clone. Dev mode only.
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,6EAA6E;AAC7E,6EAA6E;AAC7E,6EAA6E;AAC7E,wCAAwC;AAExC,cAAc,kBAAkB,CAAA;AAChC,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,cAAc,wBAAwB,CAAA;AAEtC;;;;;;;GAOG;AACH,OAAO,EAAE,iBAAiB,EAA8B,MAAM,uBAAuB,CAAA;AACrF,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,wBAAwB,EACxB,aAAa,GACd,MAAM,UAAU,CAAA;AAGjB;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAA;AAEnE;;;;GAIG;AACH,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAA;AAUrE,+DAA+D;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AAEjC,yEAAyE;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAEhC;;;;;;;;;GASG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAUjD,gDAAgD;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAI/C;;;;GAIG;AACH,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,uBAAuB,CAAA;AAI9B,4EAA4E;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD,0EAA0E;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAI7C;;;GAGG;AACH,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAI9D;;;;;;GAMG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEnD;;;;;;;GAOG;AACH,OAAO,EAAE,cAAc,EAAsB,MAAM,eAAe,CAAA;AAKlE;;;;;;GAMG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAIlE;;;;;;GAMG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAEhE;;;;;;GAMG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,6EAA6E;AAC7E,6EAA6E;AAC7E,6EAA6E;AAC7E,wCAAwC;AAExC,cAAc,kBAAkB,CAAA;AAChC,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,cAAc,wBAAwB,CAAA;AAEtC;;;;;;;;GAQG;AACH,OAAO,EAAE,iBAAiB,EAAiC,MAAM,gBAAgB,CAAA;AAEjF;;;;;;;GAOG;AACH,OAAO,EAAE,iBAAiB,EAA8B,MAAM,uBAAuB,CAAA;AACrF,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,wBAAwB,EACxB,aAAa,GACd,MAAM,UAAU,CAAA;AAGjB;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAA;AAEnE;;;;GAIG;AACH,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAA;AAUrE;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEvD,+DAA+D;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AAEjC,yEAAyE;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAEhC;;;;;;;;;GASG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAUjD;;;;;;GAMG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAEjD,gDAAgD;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAI/C;;;;;;;GAOG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAEtD;;;;GAIG;AACH,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,uBAAuB,CAAA;AAI9B,4EAA4E;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD,0EAA0E;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAI7C,oGAAoG;AACpG,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAIjD;;;GAGG;AACH,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,oBAAoB,GACrB,MAAM,UAAU,CAAA;AAYjB;;;GAGG;AACH,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAI9D;;;;;;GAMG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEnD;;;;;;;GAOG;AACH,OAAO,EAAE,cAAc,EAAsB,MAAM,eAAe,CAAA;AAKlE;;;;;;GAMG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAIlE;;;;;;GAMG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAEhE;;;;;;GAMG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA"}
|
package/dist/services.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { CanopyConfig } from './config';
|
|
|
2
2
|
import type { EntrySchemaRegistry } from './schema/types';
|
|
3
3
|
import type { BranchContext } from './types';
|
|
4
4
|
import type { CanopyUser } from './user';
|
|
5
|
-
import {
|
|
5
|
+
import { createCheckBranchAccess, createCheckContentAccess, type ContentAccessChecker } from './authorization';
|
|
6
6
|
import { GitManager } from './git-manager';
|
|
7
7
|
import { BranchRegistry } from './branch-registry';
|
|
8
8
|
import { type GitHubService } from './github-service';
|
|
@@ -25,7 +25,6 @@ export interface CanopyServices {
|
|
|
25
25
|
/** Per-branch schema cache */
|
|
26
26
|
branchSchemaCache: import('./branch-schema-cache').BranchSchemaCache;
|
|
27
27
|
checkBranchAccess: (context: BranchContext, user: CanopyUser) => ReturnType<ReturnType<typeof createCheckBranchAccess>>;
|
|
28
|
-
checkPathAccess: ReturnType<typeof createCheckPathAccess>;
|
|
29
28
|
checkContentAccess: ReturnType<typeof createCheckContentAccess>;
|
|
30
29
|
/**
|
|
31
30
|
* Build a batch content-access checker that loads permissions once and returns
|
package/dist/services.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACxC,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"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"}
|
package/dist/services.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getConfigDefaults } from './config/index.js';
|
|
2
|
-
import {
|
|
2
|
+
import { createCheckBranchAccess, createCheckContentAccess, createContentAccessChecker, loadPathPermissions, } from './authorization/index.js';
|
|
3
3
|
import { GitManager, GitRemoteRefMissingError } from './git-manager.js';
|
|
4
4
|
import { BranchRegistry } from './branch-registry.js';
|
|
5
5
|
import { SettingsWorkspaceManager } from './settings-workspace.js';
|
|
@@ -116,10 +116,7 @@ async function _createCanopyServicesInternal(config, options) {
|
|
|
116
116
|
const bootstrapAdminIds = getBootstrapAdminIds();
|
|
117
117
|
// Create per-branch schema cache (or use provided one for testing)
|
|
118
118
|
const branchSchemaCache = options.branchSchemaCache ?? new BranchSchemaCache(config.mode);
|
|
119
|
-
const checkBranchAccess = createCheckBranchAccess(config.defaultBranchAccess ?? 'deny');
|
|
120
|
-
// Path permissions are loaded dynamically from the settings branch at request time.
|
|
121
|
-
// At the service level, we bind with empty rules for direct path checks.
|
|
122
|
-
const checkPathAccess = createCheckPathAccess([], config.defaultPathAccess ?? 'deny');
|
|
119
|
+
const checkBranchAccess = createCheckBranchAccess(config.defaultBranchAccess ?? 'deny', config);
|
|
123
120
|
// Content access loads permissions dynamically from the settings branch (orphan git branch)
|
|
124
121
|
const getSettingsBranchRoot = options.getSettingsBranchRoot ??
|
|
125
122
|
(async () => {
|
|
@@ -347,7 +344,6 @@ async function _createCanopyServicesInternal(config, options) {
|
|
|
347
344
|
entrySchemaRegistry: options.entrySchemaRegistry ?? {},
|
|
348
345
|
branchSchemaCache,
|
|
349
346
|
checkBranchAccess,
|
|
350
|
-
checkPathAccess,
|
|
351
347
|
checkContentAccess,
|
|
352
348
|
createContentAccessChecker: createContentAccessCheckerBound,
|
|
353
349
|
createGitManagerFor,
|
package/dist/services.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"services.js","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"services.js","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"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"}
|
package/dist/static/index.d.ts
CHANGED
|
@@ -6,10 +6,12 @@ import { type EntryFieldError } from '../validation/entry-validator';
|
|
|
6
6
|
* (no Next.js types) so that any framework adapter — e.g. canopycms-next — can map them to its own
|
|
7
7
|
* static-generation shapes (generateStaticParams, sitemap, metadata).
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* .
|
|
9
|
+
* - `collectStaticPaths` — routable paths only, for `generateStaticParams`.
|
|
10
|
+
* - `collectRoutableEntries` — the same enumeration with each entry's `data` and `updatedAt`
|
|
11
|
+
* carried through, for surfaces that must inspect content (sitemap, feeds, search index).
|
|
12
|
+
* - `./seo` — `extractSeoFields` / `isNoindexEntry` / URL shaping, re-exported below.
|
|
12
13
|
*/
|
|
14
|
+
export { DEFAULT_SEO_FIELD_NAMES, extractSeoFields, isNoindexEntry, isAbsoluteUrl, withTrailingSlash, resolveSeoUrl, stripTrailingSlashes, type SeoFields, type SeoFieldNames, type SeoFieldLocation, type SeoOgType, type SeoTwitterCard, type ExtractSeoFieldsOptions, type ResolveSeoUrlOptions, } from './seo';
|
|
13
15
|
/** A routable content entry, reduced to what static path generation needs. */
|
|
14
16
|
export interface StaticPathEntry {
|
|
15
17
|
/**
|
|
@@ -27,6 +29,26 @@ export interface StaticPathEntry {
|
|
|
27
29
|
/** Entry type name (e.g. 'post', 'doc'). */
|
|
28
30
|
entryType: string;
|
|
29
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* A routable content entry with its content attached — everything `StaticPathEntry` carries,
|
|
34
|
+
* plus the entry `data` and its `updatedAt`.
|
|
35
|
+
*
|
|
36
|
+
* This is what surfaces that must look INSIDE an entry need (sitemap, feeds, index grids),
|
|
37
|
+
* as opposed to `generateStaticParams`, which only needs the path.
|
|
38
|
+
*/
|
|
39
|
+
export interface RoutableEntry<T = Record<string, unknown>> extends StaticPathEntry {
|
|
40
|
+
/** Raw entry data (frontmatter merged with the body field for md/mdx), as `listEntries` returns it. */
|
|
41
|
+
data: T;
|
|
42
|
+
/**
|
|
43
|
+
* Filesystem mtime (ISO 8601) of the entry file.
|
|
44
|
+
*
|
|
45
|
+
* Caveat, and read it before wiring this to a sitemap `<lastmod>`: this is a checkout-time
|
|
46
|
+
* timestamp, not an editorial one. A fresh CI clone (or a fresh branch-clone checkout) resets
|
|
47
|
+
* every file's mtime, so there it says "when this tree was checked out", not "when this content
|
|
48
|
+
* was last edited". Treat it as "changed since the last build" at best.
|
|
49
|
+
*/
|
|
50
|
+
updatedAt?: string;
|
|
51
|
+
}
|
|
30
52
|
export interface CollectStaticPathsOptions {
|
|
31
53
|
/**
|
|
32
54
|
* Scope to a collection logical path (e.g. 'content/posts'). Defaults to the whole content root.
|
|
@@ -36,6 +58,35 @@ export interface CollectStaticPathsOptions {
|
|
|
36
58
|
/** Keep only entries matching this predicate (e.g. drop the root index, or filter by entryType). */
|
|
37
59
|
filter?: (entry: StaticPathEntry) => boolean;
|
|
38
60
|
}
|
|
61
|
+
export interface CollectRoutableEntriesOptions<T = Record<string, unknown>> {
|
|
62
|
+
/**
|
|
63
|
+
* Scope to a collection logical path (e.g. 'content/posts'). Defaults to the whole content root.
|
|
64
|
+
* Skips loading entries outside this scope.
|
|
65
|
+
*/
|
|
66
|
+
rootPath?: string;
|
|
67
|
+
/** Keep only entries matching this predicate. Runs after `data` is attached, so it can read content. */
|
|
68
|
+
filter?: (entry: RoutableEntry<T>) => boolean;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Enumerate routable content entries WITH their data — the input to any surface that must read
|
|
72
|
+
* inside an entry to decide what to publish (sitemap, RSS, search index, index grids).
|
|
73
|
+
*
|
|
74
|
+
* Identical enumeration to `collectStaticPaths` (same single `listEntries` pass, same build-time
|
|
75
|
+
* schema-validity guard); it simply keeps `data` and `updatedAt` instead of discarding them.
|
|
76
|
+
*
|
|
77
|
+
* **Enumerates every entry type by default.** There is no allow-list of "publishable" types, and
|
|
78
|
+
* that is deliberate: a sitemap built from a hand-maintained list of entry types silently omits
|
|
79
|
+
* whichever type nobody remembered to add, and nothing fails. Narrow the result with `filter`
|
|
80
|
+
* when you actually mean to — omission should be a decision, not an oversight.
|
|
81
|
+
*
|
|
82
|
+
* `noindex` is NOT applied here: an entry that must not be advertised must still be built. Apply
|
|
83
|
+
* `isNoindexEntry` at the advertising surface (as `generateContentSitemap` does).
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* const entries = await collectRoutableEntries(await getCanopyForBuild())
|
|
87
|
+
* const published = entries.filter((e) => !isNoindexEntry(e.data))
|
|
88
|
+
*/
|
|
89
|
+
export declare function collectRoutableEntries<T = Record<string, unknown>>(ctx: Pick<CanopyBuildContext, 'listEntries'>, options?: CollectRoutableEntriesOptions<T>): Promise<RoutableEntry<T>[]>;
|
|
39
90
|
/**
|
|
40
91
|
* Enumerate routable content entries as neutral path descriptors for static generation.
|
|
41
92
|
*
|
|
@@ -57,6 +108,15 @@ export interface InvalidBuildEntry {
|
|
|
57
108
|
entryPath: string;
|
|
58
109
|
errors: EntryFieldError[];
|
|
59
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* What the build-time validity scan needs off a listing item. `data` is `unknown` rather than
|
|
113
|
+
* `ListEntriesItem['data']` so a caller that listed with an entry-shape generic (e.g.
|
|
114
|
+
* `collectRoutableEntries<PostContent>`) can still be scanned — the scan re-guards the value
|
|
115
|
+
* anyway, since on-disk data is never trusted.
|
|
116
|
+
*/
|
|
117
|
+
type BuildScanItem = Pick<ListEntriesItem, 'entryPath' | 'schema'> & {
|
|
118
|
+
data: unknown;
|
|
119
|
+
};
|
|
60
120
|
/**
|
|
61
121
|
* Scan listEntries-shaped items for schema-invalid entries.
|
|
62
122
|
*
|
|
@@ -71,7 +131,7 @@ export interface InvalidBuildEntry {
|
|
|
71
131
|
* Items whose `schema` couldn't be resolved (unknown entry type) are skipped here — that's a
|
|
72
132
|
* different failure class, handled elsewhere.
|
|
73
133
|
*/
|
|
74
|
-
export declare function findInvalidEntries(items: readonly
|
|
134
|
+
export declare function findInvalidEntries(items: readonly BuildScanItem[]): InvalidBuildEntry[];
|
|
75
135
|
/**
|
|
76
136
|
* Throw a single, descriptive Error if any item is schema-invalid.
|
|
77
137
|
*
|
|
@@ -79,5 +139,5 @@ export declare function findInvalidEntries(items: readonly Pick<ListEntriesItem,
|
|
|
79
139
|
* disappears from a static build is a worse failure mode than a red build. Lists every
|
|
80
140
|
* offending entry so one build catches every abandoned scaffold, not just the first.
|
|
81
141
|
*/
|
|
82
|
-
export declare function assertBuildEntriesValid(items: readonly
|
|
142
|
+
export declare function assertBuildEntriesValid(items: readonly BuildScanItem[], phaseLabel: string): void;
|
|
83
143
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/static/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAEvF
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/static/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAEvF;;;;;;;;;GASG;AAEH,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,oBAAoB,EACpB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,GAC1B,MAAM,OAAO,CAAA;AAEd,8EAA8E;AAC9E,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,yGAAyG;IACzG,IAAI,EAAE,MAAM,CAAA;IACZ,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAE,SAAQ,eAAe;IACjF,uGAAuG;IACvG,IAAI,EAAE,CAAC,CAAA;IACP;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,oGAAoG;IACpG,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAA;CAC7C;AAED,MAAM,WAAW,6BAA6B,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACxE;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wGAAwG;IACxG,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,OAAO,CAAA;CAC9C;AA6BD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtE,GAAG,EAAE,IAAI,CAAC,kBAAkB,EAAE,aAAa,CAAC,EAC5C,OAAO,GAAE,6BAA6B,CAAC,CAAC,CAAM,GAC7C,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAO7B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,IAAI,CAAC,kBAAkB,EAAE,aAAa,CAAC,EAC5C,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,eAAe,EAAE,CAAC,CAW5B;AAMD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,eAAe,EAAE,CAAA;CAC1B;AAED;;;;;GAKG;AACH,KAAK,aAAa,GAAG,IAAI,CAAC,eAAe,EAAE,WAAW,GAAG,QAAQ,CAAC,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAA;AAkCtF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,GAAG,iBAAiB,EAAE,CAWvF;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAkBjG"}
|
package/dist/static/index.js
CHANGED
|
@@ -1,5 +1,62 @@
|
|
|
1
1
|
import { isBuildMode } from '../build-mode.js';
|
|
2
2
|
import { validateEntryData } from '../validation/entry-validator.js';
|
|
3
|
+
/**
|
|
4
|
+
* Framework-agnostic helpers for static-site generation. These produce neutral data structures
|
|
5
|
+
* (no Next.js types) so that any framework adapter — e.g. canopycms-next — can map them to its own
|
|
6
|
+
* static-generation shapes (generateStaticParams, sitemap, metadata).
|
|
7
|
+
*
|
|
8
|
+
* - `collectStaticPaths` — routable paths only, for `generateStaticParams`.
|
|
9
|
+
* - `collectRoutableEntries` — the same enumeration with each entry's `data` and `updatedAt`
|
|
10
|
+
* carried through, for surfaces that must inspect content (sitemap, feeds, search index).
|
|
11
|
+
* - `./seo` — `extractSeoFields` / `isNoindexEntry` / URL shaping, re-exported below.
|
|
12
|
+
*/
|
|
13
|
+
export { DEFAULT_SEO_FIELD_NAMES, extractSeoFields, isNoindexEntry, isAbsoluteUrl, withTrailingSlash, resolveSeoUrl, stripTrailingSlashes, } from './seo.js';
|
|
14
|
+
/**
|
|
15
|
+
* Shared enumeration behind `collectStaticPaths` and `collectRoutableEntries`.
|
|
16
|
+
*
|
|
17
|
+
* `phaseLabel` only names the phase in the build-guard error, but it is threaded through rather
|
|
18
|
+
* than fixed so the message points at the surface that actually failed.
|
|
19
|
+
*/
|
|
20
|
+
async function enumerateRoutableEntries(ctx, rootPath, phaseLabel) {
|
|
21
|
+
const entries = await ctx.listEntries({ rootPath });
|
|
22
|
+
// Build-time only: `next dev` runs generateStaticParams against the live working tree, where
|
|
23
|
+
// fresh create-scaffolds legitimately exist mid-edit. Only fail the actual production build —
|
|
24
|
+
// an abandoned schema-invalid scaffold shipping into a static build silently drops that page's
|
|
25
|
+
// route (or worse, renders broken), which is worse than a red build.
|
|
26
|
+
if (isBuildMode())
|
|
27
|
+
assertBuildEntriesValid(entries, phaseLabel);
|
|
28
|
+
return entries.map((entry) => ({
|
|
29
|
+
urlPath: entry.urlPath,
|
|
30
|
+
segments: entry.urlPath === '/' ? [] : entry.urlPath.replace(/^\//, '').split('/'),
|
|
31
|
+
slug: entry.slug,
|
|
32
|
+
entryType: entry.entryType,
|
|
33
|
+
data: entry.data,
|
|
34
|
+
...(entry.updatedAt ? { updatedAt: entry.updatedAt } : {}),
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Enumerate routable content entries WITH their data — the input to any surface that must read
|
|
39
|
+
* inside an entry to decide what to publish (sitemap, RSS, search index, index grids).
|
|
40
|
+
*
|
|
41
|
+
* Identical enumeration to `collectStaticPaths` (same single `listEntries` pass, same build-time
|
|
42
|
+
* schema-validity guard); it simply keeps `data` and `updatedAt` instead of discarding them.
|
|
43
|
+
*
|
|
44
|
+
* **Enumerates every entry type by default.** There is no allow-list of "publishable" types, and
|
|
45
|
+
* that is deliberate: a sitemap built from a hand-maintained list of entry types silently omits
|
|
46
|
+
* whichever type nobody remembered to add, and nothing fails. Narrow the result with `filter`
|
|
47
|
+
* when you actually mean to — omission should be a decision, not an oversight.
|
|
48
|
+
*
|
|
49
|
+
* `noindex` is NOT applied here: an entry that must not be advertised must still be built. Apply
|
|
50
|
+
* `isNoindexEntry` at the advertising surface (as `generateContentSitemap` does).
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* const entries = await collectRoutableEntries(await getCanopyForBuild())
|
|
54
|
+
* const published = entries.filter((e) => !isNoindexEntry(e.data))
|
|
55
|
+
*/
|
|
56
|
+
export async function collectRoutableEntries(ctx, options = {}) {
|
|
57
|
+
const entries = await enumerateRoutableEntries(ctx, options.rootPath, 'routable entry enumeration');
|
|
58
|
+
return options.filter ? entries.filter(options.filter) : entries;
|
|
59
|
+
}
|
|
3
60
|
/**
|
|
4
61
|
* Enumerate routable content entries as neutral path descriptors for static generation.
|
|
5
62
|
*
|
|
@@ -14,18 +71,14 @@ import { validateEntryData } from '../validation/entry-validator.js';
|
|
|
14
71
|
* const posts = await collectStaticPaths(await getCanopyForBuild(), { rootPath: 'content/posts' })
|
|
15
72
|
*/
|
|
16
73
|
export async function collectStaticPaths(ctx, options = {}) {
|
|
17
|
-
const entries = await ctx
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
urlPath: entry.urlPath,
|
|
26
|
-
segments: entry.urlPath === '/' ? [] : entry.urlPath.replace(/^\//, '').split('/'),
|
|
27
|
-
slug: entry.slug,
|
|
28
|
-
entryType: entry.entryType,
|
|
74
|
+
const entries = await enumerateRoutableEntries(ctx, options.rootPath, 'static path enumeration');
|
|
75
|
+
// Drop data/updatedAt: generateStaticParams needs paths only, and returning entry content from
|
|
76
|
+
// a path-enumeration helper invites page code to read content from the admin build context.
|
|
77
|
+
const mapped = entries.map(({ urlPath, segments, slug, entryType }) => ({
|
|
78
|
+
urlPath,
|
|
79
|
+
segments,
|
|
80
|
+
slug,
|
|
81
|
+
entryType,
|
|
29
82
|
}));
|
|
30
83
|
return options.filter ? mapped.filter(options.filter) : mapped;
|
|
31
84
|
}
|
package/dist/static/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/static/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,OAAO,EAAE,iBAAiB,EAAwB,MAAM,+BAA+B,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/static/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework-agnostic SEO field extraction and URL shaping.
|
|
3
|
+
*
|
|
4
|
+
* This module is pure: it maps an entry's raw data onto a neutral `SeoFields` shape and
|
|
5
|
+
* resolves URLs. Framework adapters (e.g. canopycms-next's `entryToMetadata`) turn that shape
|
|
6
|
+
* into their own metadata objects; nothing here imports a framework or a node built-in.
|
|
7
|
+
*
|
|
8
|
+
* The field names default to the recommended SEO field group — see `defineSeoFieldGroup` in
|
|
9
|
+
* entry-schema.ts, which builds a schema group from these same names so the schema side and
|
|
10
|
+
* the read side cannot drift.
|
|
11
|
+
*/
|
|
12
|
+
/** og:type values covered by the recommended group. */
|
|
13
|
+
export type SeoOgType = 'website' | 'article' | 'profile';
|
|
14
|
+
/** twitter:card values covered by the recommended group. */
|
|
15
|
+
export type SeoTwitterCard = 'summary' | 'summary_large_image';
|
|
16
|
+
/** The neutral, framework-agnostic SEO shape. */
|
|
17
|
+
export interface SeoFields {
|
|
18
|
+
title?: string;
|
|
19
|
+
description?: string;
|
|
20
|
+
ogImage?: string;
|
|
21
|
+
ogType?: SeoOgType;
|
|
22
|
+
canonical?: string;
|
|
23
|
+
noindex?: boolean;
|
|
24
|
+
twitterCard?: SeoTwitterCard;
|
|
25
|
+
}
|
|
26
|
+
/** Entry field names backing each neutral field. */
|
|
27
|
+
export type SeoFieldNames = Record<keyof SeoFields, string>;
|
|
28
|
+
/**
|
|
29
|
+
* The recommended SEO field names. `defineSeoFieldGroup()` emits a schema group using exactly
|
|
30
|
+
* these names, so an adopter who uses both ends needs no configuration at all.
|
|
31
|
+
*/
|
|
32
|
+
export declare const DEFAULT_SEO_FIELD_NAMES: {
|
|
33
|
+
readonly title: "metaTitle";
|
|
34
|
+
readonly description: "metaDescription";
|
|
35
|
+
readonly ogImage: "ogImage";
|
|
36
|
+
readonly ogType: "ogType";
|
|
37
|
+
readonly canonical: "canonical";
|
|
38
|
+
readonly noindex: "noindex";
|
|
39
|
+
readonly twitterCard: "twitterCard";
|
|
40
|
+
};
|
|
41
|
+
export interface ExtractSeoFieldsOptions {
|
|
42
|
+
/** Per-field name overrides (e.g. `{ title: 'seoTitle' }`). */
|
|
43
|
+
fields?: Partial<SeoFieldNames>;
|
|
44
|
+
/**
|
|
45
|
+
* Read the fields from a nested object under this key instead of from flat entry fields.
|
|
46
|
+
* Pair with `defineSeoFieldGroup({ group: 'seo' })`, which nests the same fields under that
|
|
47
|
+
* key in the content file. Omit for the flat (inline-group) convention, which is the default
|
|
48
|
+
* on both ends.
|
|
49
|
+
*/
|
|
50
|
+
group?: string;
|
|
51
|
+
/** Used when the entry has no meta title (typically the entry's own title/heading). */
|
|
52
|
+
fallbackTitle?: string;
|
|
53
|
+
/** Used when the entry has no meta description. */
|
|
54
|
+
fallbackDescription?: string;
|
|
55
|
+
}
|
|
56
|
+
/** Just the parts of `ExtractSeoFieldsOptions` that locate the fields, with no fallbacks. */
|
|
57
|
+
export type SeoFieldLocation = Pick<ExtractSeoFieldsOptions, 'fields' | 'group'>;
|
|
58
|
+
/**
|
|
59
|
+
* Map an entry's SEO fields onto the neutral shape.
|
|
60
|
+
*
|
|
61
|
+
* Entry data is `unknown` — every read is guarded, unknown enum values are dropped rather than
|
|
62
|
+
* passed through, and non-object data (null, a string, an array) yields an all-undefined result
|
|
63
|
+
* rather than throwing.
|
|
64
|
+
*/
|
|
65
|
+
export declare function extractSeoFields(entryData: unknown, opts?: ExtractSeoFieldsOptions): SeoFields;
|
|
66
|
+
/**
|
|
67
|
+
* THE `noindex` predicate. Every surface that suppresses an entry must route through this one
|
|
68
|
+
* function rather than re-deriving the flag:
|
|
69
|
+
*
|
|
70
|
+
* - the page's own `robots: { index: false }` (canopycms-next's `entryToMetadata`), and
|
|
71
|
+
* - exclusion from the sitemap (canopycms-next's `generateContentSitemap`).
|
|
72
|
+
*
|
|
73
|
+
* Those two shipping from one predicate is the point of shipping them together. Where they were
|
|
74
|
+
* derived separately, a `noindex` entry stayed advertised in one surface while correctly absent
|
|
75
|
+
* from the other, and nothing warned.
|
|
76
|
+
*
|
|
77
|
+
* NOT applied to enumeration: `noindex` means "don't advertise this", not "don't build this".
|
|
78
|
+
* `collectRoutableEntries` and `generateStaticParams` must still emit the entry, so its URL
|
|
79
|
+
* resolves for anyone holding the link.
|
|
80
|
+
*/
|
|
81
|
+
export declare function isNoindexEntry(entryData: unknown, opts?: SeoFieldLocation): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* An off-site URL: either scheme-qualified (`https://…`) or LITERAL protocol-relative
|
|
84
|
+
* (`//cdn…`). Both name a host we don't control, so neither may be rewritten against the site
|
|
85
|
+
* origin — `resolveSeoUrl` passes a `true` result through verbatim.
|
|
86
|
+
*
|
|
87
|
+
* Deliberately narrower than "resolves off-origin": a WHATWG-backslash-equivalent spelling
|
|
88
|
+
* (`/\evil.com`, `\\evil.com`, `\/evil.com` — see `utils/sanitize-href.ts`'s
|
|
89
|
+
* `isImplicitlyOffOrigin`) also resolves off-origin in a browser, but is NOT recognized here as
|
|
90
|
+
* an intentional off-site pointer the way a literal `//cdn…` is. `resolveSeoUrl` handles that
|
|
91
|
+
* case separately, by neutralizing (`neutralizeImplicitOffOrigin`) rather than passing through: a
|
|
92
|
+
* `false` result here isn't a guarantee the value is a safe site-relative path on its own, only
|
|
93
|
+
* that it isn't a *declared* off-site one.
|
|
94
|
+
*/
|
|
95
|
+
export declare function isAbsoluteUrl(url: string): boolean;
|
|
96
|
+
/**
|
|
97
|
+
* Strip trailing slashes without a regex.
|
|
98
|
+
*
|
|
99
|
+
* The obvious `replace(/\/+$/, '')` is a polynomial-ReDoS shape (CodeQL
|
|
100
|
+
* `js/polynomial-redos`, flagged high): on a value that is mostly slashes but does not end in
|
|
101
|
+
* one, the engine retries `\/+` from every position and the match cost is quadratic in the
|
|
102
|
+
* input length. `siteUrl` is adopter-supplied and can reach here from config or an env var, so
|
|
103
|
+
* it counts as uncontrolled. A character scan is linear and needs no reasoning about
|
|
104
|
+
* backtracking.
|
|
105
|
+
*
|
|
106
|
+
* Exported (from `canopycms/server`) so adopter code normalizing its own site-origin env var —
|
|
107
|
+
* e.g. a `SITE_URL` constant built from `NEXT_PUBLIC_SITE_URL` — has a package-provided linear
|
|
108
|
+
* way to do it instead of reaching for the same regex this function replaced.
|
|
109
|
+
*/
|
|
110
|
+
export declare function stripTrailingSlashes(value: string): string;
|
|
111
|
+
/**
|
|
112
|
+
* Append a trailing slash to a site-relative path, matching a site that serves `/contact/`.
|
|
113
|
+
*
|
|
114
|
+
* Leaves the root (`/`) and file-like paths (a last segment containing a dot, e.g.
|
|
115
|
+
* `/blog/rss.xml`) alone, and never doubles an existing slash.
|
|
116
|
+
*
|
|
117
|
+
* A query string and/or fragment (`?page=2`, `#section`) is split off BEFORE the slash decision
|
|
118
|
+
* and placement, then reattached after — so `/blog?page=2` becomes `/blog/?page=2`, never
|
|
119
|
+
* `/blog?page=2/` (a literal trailing slash inside the query string, which is not what "serve
|
|
120
|
+
* with a trailing slash" means and breaks the URL).
|
|
121
|
+
*/
|
|
122
|
+
export declare function withTrailingSlash(path: string): string;
|
|
123
|
+
export interface ResolveSeoUrlOptions {
|
|
124
|
+
/** Site origin (e.g. `https://example.com`). Trailing slashes are stripped. */
|
|
125
|
+
siteUrl?: string;
|
|
126
|
+
/**
|
|
127
|
+
* Emit site-relative paths with a trailing slash. CanopyCMS has no knowledge of your
|
|
128
|
+
* framework's routing config, so this must be stated explicitly — see the note on
|
|
129
|
+
* `generateContentSitemap`.
|
|
130
|
+
*/
|
|
131
|
+
trailingSlash?: boolean;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Resolve a possibly-relative URL for public emission (canonical tag, sitemap URL, OG image).
|
|
135
|
+
*
|
|
136
|
+
* ORDER MATTERS — the absolute check runs FIRST. An absolute or protocol-relative value is a
|
|
137
|
+
* deliberate off-site pointer (syndication, a partner-hosted copy, a CDN image) and passes
|
|
138
|
+
* through verbatim; only a site-relative path gets trailing-slash normalization and the site
|
|
139
|
+
* origin. Normalizing first turns `https://other.org/page` into
|
|
140
|
+
* `<siteUrl>/https://other.org/page/`.
|
|
141
|
+
*
|
|
142
|
+
* With no `siteUrl`, a site-relative path is returned still relative (normalized), which is
|
|
143
|
+
* what you want when the framework resolves relative metadata URLs itself.
|
|
144
|
+
*
|
|
145
|
+
* A NOT-absolute value is also run through `neutralizeImplicitOffOrigin` before normalization,
|
|
146
|
+
* so a WHATWG-backslash-equivalent spelling that `isAbsoluteUrl` correctly declines to call
|
|
147
|
+
* "absolute" (see its doc) can't still be read by a browser as protocol-relative once emitted.
|
|
148
|
+
*/
|
|
149
|
+
export declare function resolveSeoUrl(pathOrUrl: string, opts?: ResolveSeoUrlOptions): string;
|
|
150
|
+
//# sourceMappingURL=seo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seo.d.ts","sourceRoot":"","sources":["../../src/static/seo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,uDAAuD;AACvD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAA;AAEzD,4DAA4D;AAC5D,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,qBAAqB,CAAA;AAE9D,iDAAiD;AACjD,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,WAAW,CAAC,EAAE,cAAc,CAAA;CAC7B;AAED,oDAAoD;AACpD,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,SAAS,EAAE,MAAM,CAAC,CAAA;AAE3D;;;GAGG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;CAQF,CAAA;AAElC,MAAM,WAAW,uBAAuB;IACtC,+DAA+D;IAC/D,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;IAC/B;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,uFAAuF;IACvF,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,mDAAmD;IACnD,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B;AAED,6FAA6F;AAC7F,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,uBAAuB,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAA;AA6ChF;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,OAAO,EAClB,IAAI,GAAE,uBAA4B,GACjC,SAAS,CAcX;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAEvF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI1D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUtD;AAED,MAAM,WAAW,oBAAoB;IACnC,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,oBAAyB,GAAG,MAAM,CAUxF"}
|