scribe-cms 0.0.17 → 0.0.20

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 (88) hide show
  1. package/README.md +10 -0
  2. package/dist/cli/index.cjs +4013 -555
  3. package/dist/cli/index.cjs.map +1 -1
  4. package/dist/cli/index.js +4011 -553
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/index.cjs +1502 -229
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.js +1487 -228
  9. package/dist/index.js.map +1 -1
  10. package/dist/runtime.cjs +435 -33
  11. package/dist/runtime.cjs.map +1 -1
  12. package/dist/runtime.js +434 -32
  13. package/dist/runtime.js.map +1 -1
  14. package/dist/src/config/resolve-config.d.ts.map +1 -1
  15. package/dist/src/core/builtin-fields.d.ts +10 -1
  16. package/dist/src/core/builtin-fields.d.ts.map +1 -1
  17. package/dist/src/core/field.d.ts +70 -0
  18. package/dist/src/core/field.d.ts.map +1 -1
  19. package/dist/src/core/introspect-schema.d.ts +31 -1
  20. package/dist/src/core/introspect-schema.d.ts.map +1 -1
  21. package/dist/src/core/managed-roots.d.ts +15 -0
  22. package/dist/src/core/managed-roots.d.ts.map +1 -0
  23. package/dist/src/core/types.d.ts +56 -4
  24. package/dist/src/core/types.d.ts.map +1 -1
  25. package/dist/src/create-project.d.ts +11 -1
  26. package/dist/src/create-project.d.ts.map +1 -1
  27. package/dist/src/create-scribe.d.ts.map +1 -1
  28. package/dist/src/delete/execute.d.ts +21 -0
  29. package/dist/src/delete/execute.d.ts.map +1 -0
  30. package/dist/src/delete/plan.d.ts +85 -0
  31. package/dist/src/delete/plan.d.ts.map +1 -0
  32. package/dist/src/delete/render-text.d.ts +7 -0
  33. package/dist/src/delete/render-text.d.ts.map +1 -0
  34. package/dist/src/hash/page-hash.d.ts +9 -0
  35. package/dist/src/hash/page-hash.d.ts.map +1 -1
  36. package/dist/src/index.d.ts +12 -3
  37. package/dist/src/index.d.ts.map +1 -1
  38. package/dist/src/inline/resolve-tokens.d.ts +31 -0
  39. package/dist/src/inline/resolve-tokens.d.ts.map +1 -0
  40. package/dist/src/inline/tokens.d.ts +95 -0
  41. package/dist/src/inline/tokens.d.ts.map +1 -0
  42. package/dist/src/loader/create-loader.d.ts +7 -1
  43. package/dist/src/loader/create-loader.d.ts.map +1 -1
  44. package/dist/src/loader/resolve-assets.d.ts +16 -0
  45. package/dist/src/loader/resolve-assets.d.ts.map +1 -0
  46. package/dist/src/runtime.d.ts +1 -1
  47. package/dist/src/runtime.d.ts.map +1 -1
  48. package/dist/src/storage/translations.d.ts +8 -0
  49. package/dist/src/storage/translations.d.ts.map +1 -1
  50. package/dist/src/translate/resolve-translate-config.d.ts.map +1 -1
  51. package/dist/src/translate/response-schema.d.ts +7 -1
  52. package/dist/src/translate/response-schema.d.ts.map +1 -1
  53. package/dist/src/translate/translate-core.d.ts +6 -0
  54. package/dist/src/translate/translate-core.d.ts.map +1 -1
  55. package/dist/src/translate/validate-translation.d.ts.map +1 -1
  56. package/dist/src/translate/worklist.d.ts +8 -1
  57. package/dist/src/translate/worklist.d.ts.map +1 -1
  58. package/dist/src/validate/validate-assets.d.ts +26 -2
  59. package/dist/src/validate/validate-assets.d.ts.map +1 -1
  60. package/dist/src/validate/validate-inline-tokens.d.ts +10 -0
  61. package/dist/src/validate/validate-inline-tokens.d.ts.map +1 -0
  62. package/dist/src/validate/validate-project.d.ts.map +1 -1
  63. package/dist/src/validate/validate-relations.d.ts +2 -1
  64. package/dist/src/validate/validate-relations.d.ts.map +1 -1
  65. package/dist/studio/asset-serve.d.ts +39 -0
  66. package/dist/studio/asset-serve.d.ts.map +1 -0
  67. package/dist/studio/asset-views.d.ts +4 -0
  68. package/dist/studio/asset-views.d.ts.map +1 -0
  69. package/dist/studio/content-views.d.ts +85 -0
  70. package/dist/studio/content-views.d.ts.map +1 -0
  71. package/dist/studio/introspect-fields.d.ts +111 -0
  72. package/dist/studio/introspect-fields.d.ts.map +1 -0
  73. package/dist/studio/mdx-preview.d.ts +3 -0
  74. package/dist/studio/mdx-preview.d.ts.map +1 -0
  75. package/dist/studio/preview-tokens.d.ts +16 -0
  76. package/dist/studio/preview-tokens.d.ts.map +1 -0
  77. package/dist/studio/search.d.ts +34 -0
  78. package/dist/studio/search.d.ts.map +1 -0
  79. package/dist/studio/server.cjs +4691 -304
  80. package/dist/studio/server.cjs.map +1 -1
  81. package/dist/studio/server.d.ts.map +1 -1
  82. package/dist/studio/server.js +4689 -302
  83. package/dist/studio/server.js.map +1 -1
  84. package/dist/studio/shared.d.ts +20 -0
  85. package/dist/studio/shared.d.ts.map +1 -0
  86. package/dist/studio/studio-cache.d.ts +93 -0
  87. package/dist/studio/studio-cache.d.ts.map +1 -0
  88. package/package.json +2 -2
@@ -0,0 +1,111 @@
1
+ import type { z } from "zod";
2
+ import { type SchemaFieldMeta } from "../src/core/introspect-schema.js";
3
+ import type { ContentTypeRuntime } from "../src/core/types.js";
4
+ /**
5
+ * Studio-only schema introspection: extends the core `SchemaFieldMeta` with the
6
+ * bits the read-only browser needs — enum options and a scalar/filterable
7
+ * classification — none of which the loader/validator require. Kept generic:
8
+ * everything is derived from the zod schema, never from a content-type id.
9
+ */
10
+ export type FilterKind = "enum" | "relation" | "boolean" | "string";
11
+ export interface StudioFieldMeta extends SchemaFieldMeta {
12
+ /** Enum options, when the peeled leaf schema is a `z.enum`. */
13
+ enumOptions?: string[];
14
+ /** True when the peeled leaf schema is a boolean. */
15
+ isBoolean?: boolean;
16
+ /** True when the field is a single-value scalar (string/number/enum/boolean, not array/object). */
17
+ isScalar?: boolean;
18
+ }
19
+ /** Introspect a content schema for the studio: field kinds plus enum/boolean/scalar hints. */
20
+ export declare function introspectStudioFields(schema: z.ZodTypeAny): StudioFieldMeta[];
21
+ export interface FilterFieldMeta {
22
+ /** Dotted field path (top-level only; no `*` segments). */
23
+ key: string;
24
+ kind: FilterKind;
25
+ /** Enum options for `kind === "enum"`. */
26
+ enumOptions?: string[];
27
+ /** Relation target type id for `kind === "relation"`. */
28
+ relationTarget?: string;
29
+ }
30
+ /**
31
+ * Filterable fields for a type's collection browser: top-level enum, relation,
32
+ * boolean and string fields (no nested `*` array fields — those don't map onto a
33
+ * single query param cleanly). Order follows schema declaration order.
34
+ */
35
+ export declare function filterFieldsFor(schema: z.ZodTypeAny): FilterFieldMeta[];
36
+ /**
37
+ * Key fields to preview in the entry table (first few scalar/enum/relation
38
+ * top-level fields, excluding assets which get their own gallery treatment).
39
+ * Generic: picks by kind, never by field name.
40
+ */
41
+ export declare function keyFieldsFor(schema: z.ZodTypeAny, limit?: number): StudioFieldMeta[];
42
+ /** First top-level asset field of a type, if any (the gallery's primary image). */
43
+ export declare function primaryAssetField(schema: z.ZodTypeAny): SchemaFieldMeta | undefined;
44
+ /** Read a frontmatter value at a dotted/`*` path (top-level flat use only). */
45
+ export declare function valueAtPath(frontmatter: Record<string, unknown>, path: string[]): unknown;
46
+ export interface BackRef {
47
+ /** Type id of the referring entry. */
48
+ typeId: string;
49
+ /** EN slug of the referring entry. */
50
+ enSlug: string;
51
+ /** Dotted relation field path on the referring entry. */
52
+ field: string;
53
+ }
54
+ /** `targetTypeId` → `targetEnSlug` → list of entries referencing it. */
55
+ export type BackRefIndex = Map<string, Map<string, BackRef[]>>;
56
+ interface RelationScanInput {
57
+ typeId: string;
58
+ enSlug: string;
59
+ frontmatter: Record<string, unknown>;
60
+ relationFields: SchemaFieldMeta[];
61
+ /** MDX body, scanned for `${{relation:...}}` inline tokens. */
62
+ body?: string;
63
+ }
64
+ /**
65
+ * Build a reverse-reference index over every relation field of every EN entry:
66
+ * "which entries point at (targetType, targetSlug)?". Pure over the provided
67
+ * document snapshots — no filesystem access — so it's unit-testable.
68
+ */
69
+ export declare function buildBackRefIndex(inputs: RelationScanInput[]): BackRefIndex;
70
+ /** Look up entries referencing a target entry via any relation field. */
71
+ export declare function backRefsFor(index: BackRefIndex, targetType: string, targetSlug: string): BackRef[];
72
+ export interface AssetRef {
73
+ typeId: string;
74
+ enSlug: string;
75
+ /** Dotted field path, or `"body"`/`"frontmatter"` for heuristic matches. */
76
+ field: string;
77
+ /** True when the reference comes from a declared `field.asset()` (carries constraints). */
78
+ declared: boolean;
79
+ /** Declared field's `maxKB`, when known. */
80
+ maxKB?: number;
81
+ /** Declared field's allowed `formats`, when known. */
82
+ formats?: string[];
83
+ }
84
+ /** web path (source, unresolved) → list of references. */
85
+ export type AssetRefIndex = Map<string, AssetRef[]>;
86
+ interface AssetScanInput {
87
+ typeId: string;
88
+ enSlug: string;
89
+ /** SOURCE (unresolved) frontmatter — declared asset values are raw web paths. */
90
+ frontmatter: Record<string, unknown>;
91
+ body: string;
92
+ assetFields: SchemaFieldMeta[];
93
+ }
94
+ /**
95
+ * Build the asset reference graph: every declared asset-field value (all types)
96
+ * plus the heuristic `collectImagePaths` over frontmatter + MDX bodies. Keyed by
97
+ * source web path. Pure over the provided snapshots — unit-testable.
98
+ */
99
+ export declare function buildAssetRefIndex(inputs: AssetScanInput[]): AssetRefIndex;
100
+ /**
101
+ * Read EN docs of every type and build both indexes. Uses the *source*
102
+ * (unresolved) frontmatter — the studio builds its own preview URLs and never
103
+ * relies on site-resolved asset URLs. Runtimes here come from `createProject()`
104
+ * WITHOUT `resolveAssets`, so `frontmatter` already holds source values.
105
+ */
106
+ export declare function buildIndexes(types: ContentTypeRuntime[]): {
107
+ backRefs: BackRefIndex;
108
+ assetRefs: AssetRefIndex;
109
+ };
110
+ export {};
111
+ //# sourceMappingURL=introspect-fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspect-fields.d.ts","sourceRoot":"","sources":["../../studio/introspect-fields.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { PreviewToken } from "./preview-tokens.js";
2
+ export declare function renderMdxApprox(markerBody: string, tokens?: PreviewToken[]): string;
3
+ //# sourceMappingURL=mdx-preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mdx-preview.d.ts","sourceRoot":"","sources":["../../studio/mdx-preview.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AA2BxD,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,GAAE,YAAY,EAAO,GAAG,MAAM,CAavF"}
@@ -0,0 +1,16 @@
1
+ import type { InlineToken } from "../src/inline/tokens.js";
2
+ import type { ScribeConfig, ScribeProject } from "../src/core/types.js";
3
+ export interface PreviewToken {
4
+ kind: "static" | "relation" | "asset" | "var";
5
+ raw: string;
6
+ studioUrl?: string;
7
+ label?: string;
8
+ dangling?: boolean;
9
+ value?: string;
10
+ }
11
+ export declare function buildPreviewTokens(tokens: InlineToken[], opts: {
12
+ enFrontmatter: Record<string, unknown>;
13
+ docExists: (typeId: string, enSlug: string) => boolean;
14
+ }): PreviewToken[];
15
+ export declare function makeDocExists(project: ScribeProject, config: ScribeConfig): (typeId: string, enSlug: string) => boolean;
16
+ //# sourceMappingURL=preview-tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-tokens.d.ts","sourceRoot":"","sources":["../../studio/preview-tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGxE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,KAAK,CAAC;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAOD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,WAAW,EAAE,EACrB,IAAI,EAAE;IAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAA;CAAE,GACvG,YAAY,EAAE,CAwBhB;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,YAAY,GACnB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAK7C"}
@@ -0,0 +1,34 @@
1
+ import type { ScribeDocument } from "../src/core/types.js";
2
+ /** Minimal structural view of the project so the search is unit-testable with fakes. */
3
+ interface SearchableType {
4
+ id: string;
5
+ config: {
6
+ label: string;
7
+ };
8
+ list: (locale?: string) => ScribeDocument[];
9
+ }
10
+ interface SearchableProject {
11
+ listTypes: () => SearchableType[];
12
+ }
13
+ export interface SearchHit {
14
+ enSlug: string;
15
+ slug: string;
16
+ /** Where the first match landed: a frontmatter field path, `"slug"`, or `"body"`. */
17
+ field: string;
18
+ /** Escaped snippet (~160 chars) with the first match wrapped in `<mark>`. */
19
+ snippet: string;
20
+ }
21
+ export interface SearchGroup {
22
+ typeId: string;
23
+ label: string;
24
+ /** Up to `MAX_HITS_PER_TYPE` hits. */
25
+ hits: SearchHit[];
26
+ /** Total matching documents in this type (may exceed `hits.length`). */
27
+ total: number;
28
+ }
29
+ /** Run the search across every type's EN documents. Returns only types with at least one hit. */
30
+ export declare function searchProject(project: SearchableProject, rawQuery: string): SearchGroup[];
31
+ /** Render the full search results page body (the sidebar form lives in the layout). */
32
+ export declare function renderSearchPage(project: SearchableProject, rawQuery: string): string;
33
+ export {};
34
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../studio/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAc3D,wFAAwF;AACxF,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1B,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,cAAc,EAAE,CAAC;CAC7C;AACD,UAAU,iBAAiB;IACzB,SAAS,EAAE,MAAM,cAAc,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,qFAAqF;IACrF,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;CACf;AAwDD,iGAAiG;AACjG,wBAAgB,aAAa,CAAC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE,CAgBzF;AAuBD,uFAAuF;AACvF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAarF"}