scribe-cms 0.0.16 → 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 +4139 -542
  3. package/dist/cli/index.cjs.map +1 -1
  4. package/dist/cli/index.js +4137 -540
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/index.cjs +1512 -232
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.js +1497 -231
  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 +16 -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 +12 -2
  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 +4806 -281
  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 +4804 -279
  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,85 @@
1
+ import type { ContentTypeRuntime, ScribeConfig, ScribeDocument, ScribeProject } from "../src/core/types.js";
2
+ import type { ValidateIssue } from "../src/validate/validate-project.js";
3
+ import { type BackRefIndex, type FilterFieldMeta } from "./introspect-fields.js";
4
+ import type { DeletionPlan } from "../src/delete/plan.js";
5
+ export interface ValidationBuckets {
6
+ /** `typeId` → `enSlug` → issues touching that entry (any locale). */
7
+ byEntry: Map<string, Map<string, ValidateIssue[]>>;
8
+ /** `typeId` → issues for that type (aggregate). */
9
+ byType: Map<string, ValidateIssue[]>;
10
+ }
11
+ export declare function bucketValidation(issues: ValidateIssue[]): ValidationBuckets;
12
+ /**
13
+ * Error/warning count chips for a bag of issues, wrapped in a CSS-only hover
14
+ * tooltip that lists the individual issues. Empty string when there is nothing
15
+ * error/warning-level to show. Same signature as before, so every call site
16
+ * (sidebar type badges, collection rows, gallery cards, inspector) inherits the
17
+ * tooltip.
18
+ */
19
+ export declare function validationBadge(issues: ValidateIssue[] | undefined): string;
20
+ /** Sidebar aggregate badge (compact) for each type. */
21
+ export declare function typeBadges(buckets: ValidationBuckets): Map<string, string>;
22
+ /** Neutral chip for a type with nothing to translate (bodyless + no translatable fields). */
23
+ export declare function notTranslatableChip(): string;
24
+ /** Neutral chip shown instead of a body section for `body: false` types. */
25
+ export declare function frontmatterOnlyChip(): string;
26
+ export interface ActiveFilters {
27
+ [key: string]: string;
28
+ }
29
+ /** Read active filter values from query params (only for the type's filterable fields). */
30
+ export declare function readFilters(filterFields: FilterFieldMeta[], query: (key: string) => string | undefined): ActiveFilters;
31
+ /** Apply active filters to a document list. Generic per filter kind. */
32
+ export declare function applyFilters(docs: ScribeDocument[], filterFields: FilterFieldMeta[], active: ActiveFilters): ScribeDocument[];
33
+ export interface CollectionContext {
34
+ project: ScribeProject;
35
+ config: ScribeConfig;
36
+ type: ContentTypeRuntime;
37
+ buckets: ValidationBuckets;
38
+ /** Per (type,slug,locale) status dots renderer supplied by the server. */
39
+ statusDots: (typeId: string, enSlug: string) => string;
40
+ }
41
+ export declare function renderCollectionBrowser(ctx: CollectionContext, query: (key: string) => string | undefined): string;
42
+ export interface InspectorContext {
43
+ project: ScribeProject;
44
+ config: ScribeConfig;
45
+ type: ContentTypeRuntime;
46
+ enSlug: string;
47
+ locale: string;
48
+ enDoc: ScribeDocument;
49
+ /** Locale frontmatter (already merged for display) or null when EN / untranslated. */
50
+ localeFrontmatter: Record<string, unknown> | null;
51
+ /** True when the requested locale has no stored translation (EN fallback shown). */
52
+ isFallback: boolean;
53
+ backRefs: BackRefIndex;
54
+ buckets: ValidationBuckets;
55
+ /** Locale tabs HTML from the server (reusing existing status dots). */
56
+ localeTabs: string;
57
+ /** Which body tab to show: raw MDX source (default) or the rendered approximation. */
58
+ bodyView?: "raw" | "preview";
59
+ /** Previous entry in the collection's default order (null at the start). */
60
+ prev?: {
61
+ href: string;
62
+ slug: string;
63
+ } | null;
64
+ /** Next entry in the collection's default order (null at the end). */
65
+ next?: {
66
+ href: string;
67
+ slug: string;
68
+ } | null;
69
+ /** URL of the delete confirmation page for this entry. */
70
+ deleteHref: string;
71
+ }
72
+ export declare function renderEntryInspector(ctx: InspectorContext): string;
73
+ export declare function renderUsedBy(project: ScribeProject, typeId: string, enSlug: string, backRefs: BackRefIndex): string;
74
+ /**
75
+ * Render the delete confirmation page: the full plan in sections with counts.
76
+ * A blocked plan shows the blockers and no confirm button; an executable plan
77
+ * shows a danger confirm button (POST) plus a cancel link back to the inspector.
78
+ */
79
+ export declare function renderDeletionPlanPage(project: ScribeProject, plan: DeletionPlan, options: {
80
+ typeId: string;
81
+ enSlug: string;
82
+ cancelHref: string;
83
+ postHref: string;
84
+ }): string;
85
+ //# sourceMappingURL=content-views.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-views.d.ts","sourceRoot":"","sources":["../../studio/content-views.ts"],"names":[],"mappings":"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"}
@@ -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"}