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.
Files changed (73) hide show
  1. package/dist/ai/index.d.ts +9 -0
  2. package/dist/ai/index.d.ts.map +1 -1
  3. package/dist/ai/index.js +9 -0
  4. package/dist/ai/index.js.map +1 -1
  5. package/dist/ai/to-plain-text.d.ts +57 -0
  6. package/dist/ai/to-plain-text.d.ts.map +1 -0
  7. package/dist/ai/to-plain-text.js +255 -0
  8. package/dist/ai/to-plain-text.js.map +1 -0
  9. package/dist/ai/transform-components.d.ts.map +1 -1
  10. package/dist/ai/transform-components.js +70 -5
  11. package/dist/ai/transform-components.js.map +1 -1
  12. package/dist/api/comments.d.ts +2 -2
  13. package/dist/authorization/branch.d.ts +55 -3
  14. package/dist/authorization/branch.d.ts.map +1 -1
  15. package/dist/authorization/branch.js +55 -9
  16. package/dist/authorization/branch.js.map +1 -1
  17. package/dist/authorization/types.d.ts +1 -1
  18. package/dist/authorization/types.d.ts.map +1 -1
  19. package/dist/build-canopy.d.ts +49 -0
  20. package/dist/build-canopy.d.ts.map +1 -0
  21. package/dist/build-canopy.js +51 -0
  22. package/dist/build-canopy.js.map +1 -0
  23. package/dist/cli/cli.js +78 -26
  24. package/dist/cli/generate-ai-content.js +77 -25
  25. package/dist/cli/template-files/canopycms.config.ts.template +18 -1
  26. package/dist/content-listing.d.ts +110 -5
  27. package/dist/content-listing.d.ts.map +1 -1
  28. package/dist/content-listing.js +164 -23
  29. package/dist/content-listing.js.map +1 -1
  30. package/dist/content-reader.d.ts +41 -4
  31. package/dist/content-reader.d.ts.map +1 -1
  32. package/dist/content-reader.js +17 -4
  33. package/dist/content-reader.js.map +1 -1
  34. package/dist/content-store.d.ts +10 -1
  35. package/dist/content-store.d.ts.map +1 -1
  36. package/dist/content-store.js.map +1 -1
  37. package/dist/content-tree.d.ts +31 -2
  38. package/dist/content-tree.d.ts.map +1 -1
  39. package/dist/content-tree.js +22 -5
  40. package/dist/content-tree.js.map +1 -1
  41. package/dist/context.d.ts +30 -10
  42. package/dist/context.d.ts.map +1 -1
  43. package/dist/context.js +55 -4
  44. package/dist/context.js.map +1 -1
  45. package/dist/entry-schema.d.ts +228 -8
  46. package/dist/entry-schema.d.ts.map +1 -1
  47. package/dist/entry-schema.js +124 -0
  48. package/dist/entry-schema.js.map +1 -1
  49. package/dist/index.d.ts +1 -0
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +7 -0
  52. package/dist/index.js.map +1 -1
  53. package/dist/server.d.ts +51 -0
  54. package/dist/server.d.ts.map +1 -1
  55. package/dist/server.js +49 -0
  56. package/dist/server.js.map +1 -1
  57. package/dist/services.d.ts +1 -2
  58. package/dist/services.d.ts.map +1 -1
  59. package/dist/services.js +2 -6
  60. package/dist/services.js.map +1 -1
  61. package/dist/static/index.d.ts +65 -5
  62. package/dist/static/index.d.ts.map +1 -1
  63. package/dist/static/index.js +65 -12
  64. package/dist/static/index.js.map +1 -1
  65. package/dist/static/seo.d.ts +150 -0
  66. package/dist/static/seo.d.ts.map +1 -0
  67. package/dist/static/seo.js +189 -0
  68. package/dist/static/seo.js.map +1 -0
  69. package/dist/utils/sanitize-href.d.ts +46 -0
  70. package/dist/utils/sanitize-href.d.ts.map +1 -1
  71. package/dist/utils/sanitize-href.js +63 -2
  72. package/dist/utils/sanitize-href.js.map +1 -1
  73. 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.
@@ -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"}
@@ -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 { createCheckPathAccess, createCheckBranchAccess, createCheckContentAccess, type ContentAccessChecker } from './authorization';
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
@@ -1 +1 @@
1
- {"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"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"}
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 { createCheckPathAccess, createCheckBranchAccess, createCheckContentAccess, createContentAccessChecker, loadPathPermissions, } from './authorization/index.js';
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,
@@ -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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"}
@@ -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
- * Sitemap (`collectPublishedEntries`) and SEO metadata (`extractSeoFields`) helpers are tracked as
10
- * follow-up work; see .claude/future-tasks/static-export-sitemap.md and
11
- * .claude/future-tasks/static-export-seo-metadata.md.
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 Pick<ListEntriesItem, 'entryPath' | 'schema' | 'data'>[]): InvalidBuildEntry[];
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 Pick<ListEntriesItem, 'entryPath' | 'schema' | 'data'>[], phaseLabel: string): void;
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;;;;;;;;GAQG;AAEH,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,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;;;;;;;;;;;;GAYG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,IAAI,CAAC,kBAAkB,EAAE,aAAa,CAAC,EAC5C,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,eAAe,EAAE,CAAC,CAc5B;AAMD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,eAAe,EAAE,CAAA;CAC1B;AAkCD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,IAAI,CAAC,eAAe,EAAE,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC,EAAE,GACvE,iBAAiB,EAAE,CAWrB;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,SAAS,IAAI,CAAC,eAAe,EAAE,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC,EAAE,EACxE,UAAU,EAAE,MAAM,GACjB,IAAI,CAkBN"}
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"}
@@ -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.listEntries({ rootPath: options.rootPath });
18
- // Build-time only: `next dev` runs generateStaticParams against the live working tree, where
19
- // fresh create-scaffolds legitimately exist mid-edit. Only fail the actual production build —
20
- // an abandoned schema-invalid scaffold shipping into a static build silently drops that page's
21
- // route (or worse, renders broken), which is worse than a red build.
22
- if (isBuildMode())
23
- assertBuildEntriesValid(entries, 'static path enumeration');
24
- const mapped = entries.map((entry) => ({
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/static/index.ts"],"names":[],"mappings":"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"}
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"}