@contentrail/editor 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +14 -4
  2. package/dist/admin/collection-query.d.ts +23 -0
  3. package/dist/admin/collection-query.d.ts.map +1 -0
  4. package/dist/admin/collection-query.js +71 -0
  5. package/dist/admin/collection-query.js.map +1 -0
  6. package/dist/admin/mount.d.ts +17 -0
  7. package/dist/admin/mount.d.ts.map +1 -0
  8. package/dist/admin/mount.js +43 -0
  9. package/dist/admin/mount.js.map +1 -0
  10. package/dist/admin/paginate.d.ts +8 -0
  11. package/dist/admin/paginate.d.ts.map +1 -0
  12. package/dist/admin/paginate.js +12 -0
  13. package/dist/admin/paginate.js.map +1 -0
  14. package/dist/admin/vite-plugin.d.ts +30 -0
  15. package/dist/admin/vite-plugin.d.ts.map +1 -0
  16. package/dist/admin/vite-plugin.js +159 -0
  17. package/dist/admin/vite-plugin.js.map +1 -0
  18. package/dist/api/types.d.ts +2 -0
  19. package/dist/api/types.d.ts.map +1 -1
  20. package/dist/fields/defaults.d.ts.map +1 -1
  21. package/dist/fields/defaults.js +22 -2
  22. package/dist/fields/defaults.js.map +1 -1
  23. package/dist/fields/types.d.ts +24 -5
  24. package/dist/fields/types.d.ts.map +1 -1
  25. package/dist/fields/types.js +3 -2
  26. package/dist/fields/types.js.map +1 -1
  27. package/dist/form/FieldControl.js +54 -4
  28. package/dist/form/FieldControl.js.map +1 -1
  29. package/dist/import/coerce.d.ts +11 -0
  30. package/dist/import/coerce.d.ts.map +1 -0
  31. package/dist/import/coerce.js +71 -0
  32. package/dist/import/coerce.js.map +1 -0
  33. package/dist/import/prepare.d.ts +30 -0
  34. package/dist/import/prepare.d.ts.map +1 -0
  35. package/dist/import/prepare.js +106 -0
  36. package/dist/import/prepare.js.map +1 -0
  37. package/dist/import/tabular.d.ts +6 -0
  38. package/dist/import/tabular.d.ts.map +1 -1
  39. package/dist/import/tabular.js +34 -7
  40. package/dist/import/tabular.js.map +1 -1
  41. package/dist/index.d.ts +10 -2
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +9 -2
  44. package/dist/index.js.map +1 -1
  45. package/dist/schema/create-admin-config.d.ts +21 -0
  46. package/dist/schema/create-admin-config.d.ts.map +1 -0
  47. package/dist/schema/create-admin-config.js +50 -0
  48. package/dist/schema/create-admin-config.js.map +1 -0
  49. package/dist/schema/from-zod.d.ts +19 -0
  50. package/dist/schema/from-zod.d.ts.map +1 -0
  51. package/dist/schema/from-zod.js +194 -0
  52. package/dist/schema/from-zod.js.map +1 -0
  53. package/dist/styles.css +103 -7
  54. package/dist/ui/CollectionImportWizard.d.ts +16 -0
  55. package/dist/ui/CollectionImportWizard.d.ts.map +1 -0
  56. package/dist/ui/CollectionImportWizard.js +144 -0
  57. package/dist/ui/CollectionImportWizard.js.map +1 -0
  58. package/dist/ui/EditorApp.d.ts +3 -0
  59. package/dist/ui/EditorApp.d.ts.map +1 -1
  60. package/dist/ui/EditorApp.js +232 -35
  61. package/dist/ui/EditorApp.js.map +1 -1
  62. package/package.json +18 -5
package/README.md CHANGED
@@ -28,10 +28,10 @@ pnpm install
28
28
  pnpm --filter @contentrail/editor build
29
29
  ```
30
30
 
31
- ### From npm (upcoming `0.2.0` after authorized publish)
31
+ ### From npm (`0.2.1`)
32
32
 
33
33
  ```sh
34
- pnpm add @contentrail/editor@0.2.0 preact
34
+ pnpm add @contentrail/editor@0.2.1 preact
35
35
  ```
36
36
 
37
37
  Import styles: `import "@contentrail/editor/styles.css"`.
@@ -49,14 +49,24 @@ Schemas validated through `@contentrail/core` require Zod **`^4.6.7`**.
49
49
  | ------------- | -------------------------------------------- |
50
50
  | `text` | Single-line string |
51
51
  | `textarea` | Multiline string |
52
+ | `url` | URL input |
53
+ | `email` | Email input |
54
+ | `date` | Date input |
55
+ | `datetime` | Local datetime input |
52
56
  | `number` | Numeric input |
53
57
  | `boolean` | Checkbox |
54
58
  | `enum` | Select from `options` |
59
+ | `multiselect` | Multi-select from `options` |
60
+ | `tags` | Comma-separated string list |
61
+ | `media` | Public media URL |
62
+ | `relation` | Entry id in another collection |
55
63
  | `object` | Nested field group |
56
64
  | `array` | List of item widgets |
57
65
  | `unsupported` | Non-editable notice (never silent free text) |
58
66
 
59
- Zod remains the server validation source of truth. Editor metadata does not introspect Zod internals.
67
+ Zod remains the server validation source of truth. `fieldsFromZodSchema` maps public Zod `.shape` / `.def.type` (ADR 026). Supply `fields` or `fieldHints` when the default mapping is not good enough.
68
+
69
+ Self-hosted `/admin`: see `docs/ADMIN.md`. Use `createAdminSiteConfig`, `mountAdmin`, or `@contentrail/editor/vite`.
60
70
 
61
71
  ## Minimal usage
62
72
 
@@ -118,4 +128,4 @@ Working copies may use in-memory state and `sessionStorage` for the current tab.
118
128
 
119
129
  ## Example
120
130
 
121
- See `examples/editor-demo` for an offline fake-API walkthrough and notes on pointing at a live Worker.
131
+ See `docs/ADMIN.md` for wiring `/admin` into a static site.
@@ -0,0 +1,23 @@
1
+ export type CollectionSortKey = "id" | "title";
2
+ export type CollectionSortDir = "asc" | "desc";
3
+ export interface CollectionEntry {
4
+ readonly id: string;
5
+ readonly data: Record<string, unknown>;
6
+ }
7
+ export declare function titleOfEntry(data: Record<string, unknown>, titleField: string | undefined, fallback: string): string;
8
+ export declare function queryCollectionEntries(entries: readonly CollectionEntry[], options: {
9
+ readonly filter: string;
10
+ readonly sortKey: CollectionSortKey;
11
+ readonly sortDir: CollectionSortDir;
12
+ readonly titleField?: string;
13
+ readonly page: number;
14
+ readonly pageSize: number;
15
+ }): {
16
+ page: number;
17
+ pageCount: number;
18
+ items: readonly CollectionEntry[];
19
+ filtered: CollectionEntry[];
20
+ };
21
+ export declare function duplicateIds(entries: readonly CollectionEntry[]): Set<string>;
22
+ export declare function entriesToCsv(entries: readonly CollectionEntry[], fieldNames: readonly string[]): string;
23
+ //# sourceMappingURL=collection-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection-query.d.ts","sourceRoot":"","sources":["../../src/admin/collection-query.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,OAAO,CAAC;AAC/C,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,MAAM,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,QAAQ,EAAE,MAAM,GACf,MAAM,CAMR;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,SAAS,eAAe,EAAE,EACnC,OAAO,EAAE;IACP,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;;;;;EA4BF;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAU7E;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,SAAS,eAAe,EAAE,EACnC,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,MAAM,CAWR"}
@@ -0,0 +1,71 @@
1
+ import { paginateItems } from "./paginate.js";
2
+ export function titleOfEntry(data, titleField, fallback) {
3
+ if (titleField === undefined) {
4
+ return fallback;
5
+ }
6
+ const value = data[titleField];
7
+ return typeof value === "string" && value.trim() !== "" ? value : fallback;
8
+ }
9
+ export function queryCollectionEntries(entries, options) {
10
+ const q = options.filter.trim().toLowerCase();
11
+ const filtered = q === ""
12
+ ? [...entries]
13
+ : entries.filter((entry) => {
14
+ const title = titleOfEntry(entry.data, options.titleField, entry.id).toLowerCase();
15
+ return entry.id.toLowerCase().includes(q) || title.includes(q);
16
+ });
17
+ filtered.sort((a, b) => {
18
+ const left = options.sortKey === "id"
19
+ ? a.id
20
+ : titleOfEntry(a.data, options.titleField, a.id);
21
+ const right = options.sortKey === "id"
22
+ ? b.id
23
+ : titleOfEntry(b.data, options.titleField, b.id);
24
+ const compared = left.localeCompare(right);
25
+ return options.sortDir === "asc" ? compared : -compared;
26
+ });
27
+ const page = paginateItems(filtered, options.page, options.pageSize);
28
+ return { filtered, ...page };
29
+ }
30
+ export function duplicateIds(entries) {
31
+ const seen = new Set();
32
+ const duplicates = new Set();
33
+ for (const entry of entries) {
34
+ if (seen.has(entry.id)) {
35
+ duplicates.add(entry.id);
36
+ }
37
+ seen.add(entry.id);
38
+ }
39
+ return duplicates;
40
+ }
41
+ export function entriesToCsv(entries, fieldNames) {
42
+ const headers = ["id", ...fieldNames];
43
+ const lines = [headers.join(",")];
44
+ for (const entry of entries) {
45
+ const cells = [
46
+ csvCell(entry.id),
47
+ ...fieldNames.map((name) => csvCell(stringifyCell(entry.data[name]))),
48
+ ];
49
+ lines.push(cells.join(","));
50
+ }
51
+ return `${lines.join("\n")}\n`;
52
+ }
53
+ function stringifyCell(value) {
54
+ if (value === null || value === undefined) {
55
+ return "";
56
+ }
57
+ if (typeof value === "string") {
58
+ return value;
59
+ }
60
+ if (typeof value === "number" || typeof value === "boolean") {
61
+ return String(value);
62
+ }
63
+ return JSON.stringify(value);
64
+ }
65
+ function csvCell(value) {
66
+ if (/[",\n\r]/.test(value)) {
67
+ return `"${value.replaceAll('"', '""')}"`;
68
+ }
69
+ return value;
70
+ }
71
+ //# sourceMappingURL=collection-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection-query.js","sourceRoot":"","sources":["../../src/admin/collection-query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type ContentRailApiClient } from "../api/client.js";
2
+ import type { EditorSiteConfig } from "../fields/types.js";
3
+ export interface MountAdminOptions {
4
+ readonly target: HTMLElement;
5
+ readonly sites: readonly EditorSiteConfig[];
6
+ readonly api?: ContentRailApiClient;
7
+ readonly apiBaseUrl?: string;
8
+ readonly title?: string;
9
+ readonly pageSize?: number;
10
+ }
11
+ /**
12
+ * Mounts the self-hosted admin UI. Never accepts Git/storage credentials.
13
+ */
14
+ export declare function mountAdmin(options: MountAdminOptions): {
15
+ unmount: () => void;
16
+ };
17
+ //# sourceMappingURL=mount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../../src/admin/mount.tsx"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG3D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC5C,QAAQ,CAAC,GAAG,CAAC,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG;IACtD,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CA+CA"}
@@ -0,0 +1,43 @@
1
+ import { jsx as _jsx } from "preact/jsx-runtime";
2
+ import { render } from "preact";
3
+ import { createContentRailApiClient, } from "../api/client.js";
4
+ import { EditorApp } from "../ui/EditorApp.js";
5
+ /**
6
+ * Mounts the self-hosted admin UI. Never accepts Git/storage credentials.
7
+ */
8
+ export function mountAdmin(options) {
9
+ if (options.sites.length === 0) {
10
+ options.target.innerHTML =
11
+ '<p role="alert">ContentRail admin: no collections are registered.</p>';
12
+ return {
13
+ unmount: () => {
14
+ options.target.replaceChildren();
15
+ },
16
+ };
17
+ }
18
+ const api = options.api ??
19
+ (options.apiBaseUrl !== undefined && options.apiBaseUrl !== ""
20
+ ? createContentRailApiClient({
21
+ baseUrl: options.apiBaseUrl,
22
+ credentials: "include",
23
+ })
24
+ : null);
25
+ if (api === null) {
26
+ options.target.innerHTML =
27
+ '<p role="alert">ContentRail admin is missing apiBaseUrl. Set the public Worker URL (never a GitHub token) in the admin integration options.</p>';
28
+ return {
29
+ unmount: () => {
30
+ options.target.replaceChildren();
31
+ },
32
+ };
33
+ }
34
+ render(_jsx(EditorApp, { api: api, sites: options.sites, title: options.title ?? "Content", ...(options.pageSize !== undefined
35
+ ? { pageSize: options.pageSize }
36
+ : {}) }), options.target);
37
+ return {
38
+ unmount: () => {
39
+ render(null, options.target);
40
+ },
41
+ };
42
+ }
43
+ //# sourceMappingURL=mount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount.js","sourceRoot":"","sources":["../../src/admin/mount.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EACL,0BAA0B,GAE3B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAW/C;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAA0B;IAGnD,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,MAAM,CAAC,SAAS;YACtB,uEAAuE,CAAC;QAC1E,OAAO;YACL,OAAO,EAAE,GAAG,EAAE;gBACZ,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YACnC,CAAC;SACF,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GACP,OAAO,CAAC,GAAG;QACX,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU,KAAK,EAAE;YAC5D,CAAC,CAAC,0BAA0B,CAAC;gBACzB,OAAO,EAAE,OAAO,CAAC,UAAU;gBAC3B,WAAW,EAAE,SAAS;aACvB,CAAC;YACJ,CAAC,CAAC,IAAI,CAAC,CAAC;IAEZ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,SAAS;YACtB,iJAAiJ,CAAC;QACpJ,OAAO;YACL,OAAO,EAAE,GAAG,EAAE;gBACZ,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YACnC,CAAC;SACF,CAAC;IACJ,CAAC;IAED,MAAM,CACJ,KAAC,SAAS,IACR,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,OAAO,CAAC,KAAK,EACpB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS,KAC7B,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS;YACjC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE;YAChC,CAAC,CAAC,EAAE,CAAC,GACP,EACF,OAAO,CAAC,MAAM,CACf,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,GAAG,EAAE;YACZ,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface PaginatedSlice<T> {
2
+ readonly page: number;
3
+ readonly pageCount: number;
4
+ readonly items: readonly T[];
5
+ }
6
+ /** Slice a list so collection screens never render every row at once. */
7
+ export declare function paginateItems<T>(items: readonly T[], page: number, pageSize: number): PaginatedSlice<T>;
8
+ //# sourceMappingURL=paginate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paginate.d.ts","sourceRoot":"","sources":["../../src/admin/paginate.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;CAC9B;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,CAAC,EAC7B,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,cAAc,CAAC,CAAC,CAAC,CASnB"}
@@ -0,0 +1,12 @@
1
+ /** Slice a list so collection screens never render every row at once. */
2
+ export function paginateItems(items, page, pageSize) {
3
+ const size = pageSize < 1 ? 1 : pageSize;
4
+ const pageCount = Math.max(1, Math.ceil(items.length / size));
5
+ const safePage = Math.min(Math.max(0, page), pageCount - 1);
6
+ return {
7
+ page: safePage,
8
+ pageCount,
9
+ items: items.slice(safePage * size, safePage * size + size),
10
+ };
11
+ }
12
+ //# sourceMappingURL=paginate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paginate.js","sourceRoot":"","sources":["../../src/admin/paginate.ts"],"names":[],"mappings":"AAMA,yEAAyE;AACzE,MAAM,UAAU,aAAa,CAC3B,KAAmB,EACnB,IAAY,EACZ,QAAgB;IAEhB,MAAM,IAAI,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;IAC5D,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,SAAS;QACT,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;KAC5D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { ContentCollection } from "@contentrail/core";
2
+ import type { Plugin } from "vite";
3
+ import type { EditorSiteConfig } from "../fields/types.js";
4
+ import { type AdminCollectionInput } from "../schema/create-admin-config.js";
5
+ export interface ContentrailAdminOptions {
6
+ readonly siteId: string;
7
+ readonly label?: string;
8
+ /**
9
+ * Public Worker origin, e.g. `https://cms.example.workers.dev`.
10
+ * Never pass GitHub tokens, Access service tokens, or storage keys.
11
+ */
12
+ readonly apiBaseUrl: string;
13
+ readonly collections: Readonly<Record<string, ContentCollection>>;
14
+ readonly collectionUi?: Readonly<Record<string, Omit<AdminCollectionInput, "collection">>>;
15
+ readonly title?: string;
16
+ readonly pageSize?: number;
17
+ /**
18
+ * When true (default), Vite serves `/admin` HTML and emits `admin/index.html`.
19
+ * Astro sets this to false and injects its own `/admin` page.
20
+ */
21
+ readonly serveRoute?: boolean;
22
+ }
23
+ export declare function assertContentrailAdminOptions(options: ContentrailAdminOptions): void;
24
+ export declare function serializeAdminSite(options: ContentrailAdminOptions): EditorSiteConfig;
25
+ /**
26
+ * Serves a self-hosted admin UI at `/admin` without changing public routes.
27
+ * Requires `@contentrail/editor` and `preact` in the website project.
28
+ */
29
+ export declare function contentrailAdmin(options: ContentrailAdminOptions): Plugin;
30
+ //# sourceMappingURL=vite-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../../src/admin/vite-plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,kCAAkC,CAAC;AAO1C,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAClE,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,CAC9B,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC,CACzD,CAAC;IACF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,uBAAuB,GAC/B,IAAI,CA+BN;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,uBAAuB,GAC/B,gBAAgB,CASlB;AAqCD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,CAqFzE"}
@@ -0,0 +1,159 @@
1
+ import path from "node:path";
2
+ import { createAdminSiteConfig, } from "../schema/create-admin-config.js";
3
+ const ADMIN_ENTRY = "virtual:contentrail-admin-entry";
4
+ const ADMIN_CONFIG = "virtual:contentrail-admin-config";
5
+ const RESOLVED_ENTRY = `\0${ADMIN_ENTRY}`;
6
+ const RESOLVED_CONFIG = `\0${ADMIN_CONFIG}`;
7
+ export function assertContentrailAdminOptions(options) {
8
+ if (options.siteId.trim() === "") {
9
+ throw new Error("contentrailAdmin: siteId is required (Worker site identifier).");
10
+ }
11
+ if (Object.keys(options.collections).length === 0) {
12
+ throw new Error("contentrailAdmin: no collections registered. Pass defineCollection exports in collections.");
13
+ }
14
+ if (options.apiBaseUrl.trim() === "") {
15
+ throw new Error("contentrailAdmin: apiBaseUrl is required. Use the public Worker URL, never a repository token.");
16
+ }
17
+ if (/github_pat_|ghp_|sk-|BEGIN |token=/i.test(options.apiBaseUrl)) {
18
+ throw new Error("contentrailAdmin: apiBaseUrl looks like a secret. Pass only a public HTTPS origin.");
19
+ }
20
+ try {
21
+ const url = new URL(options.apiBaseUrl);
22
+ if (url.protocol !== "https:" && url.protocol !== "http:") {
23
+ throw new Error("unsupported protocol");
24
+ }
25
+ }
26
+ catch {
27
+ throw new Error(`contentrailAdmin: apiBaseUrl is not a valid URL: ${options.apiBaseUrl}`);
28
+ }
29
+ }
30
+ export function serializeAdminSite(options) {
31
+ return createAdminSiteConfig({
32
+ siteId: options.siteId,
33
+ label: options.label ?? options.siteId,
34
+ collections: Object.values(options.collections).map((collection) => ({
35
+ collection,
36
+ ...options.collectionUi?.[collection.name],
37
+ })),
38
+ });
39
+ }
40
+ function adminHtml(scriptSrc) {
41
+ return `<!doctype html>
42
+ <html lang="en">
43
+ <head>
44
+ <meta charset="utf-8" />
45
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
46
+ <meta name="robots" content="noindex" />
47
+ <title>ContentRail Admin</title>
48
+ </head>
49
+ <body>
50
+ <div id="contentrail-admin"></div>
51
+ <script type="module" src="${scriptSrc}"></script>
52
+ </body>
53
+ </html>
54
+ `;
55
+ }
56
+ function mergeInput(previous, root) {
57
+ const admin = { contentrailAdmin: ADMIN_ENTRY };
58
+ if (previous === undefined) {
59
+ return { main: path.resolve(root, "index.html"), ...admin };
60
+ }
61
+ if (typeof previous === "string") {
62
+ return { main: previous, ...admin };
63
+ }
64
+ if (Array.isArray(previous)) {
65
+ const named = {};
66
+ previous.forEach((item, index) => {
67
+ named[`input${index}`] = String(item);
68
+ });
69
+ return { ...named, ...admin };
70
+ }
71
+ return { ...previous, ...admin };
72
+ }
73
+ /**
74
+ * Serves a self-hosted admin UI at `/admin` without changing public routes.
75
+ * Requires `@contentrail/editor` and `preact` in the website project.
76
+ */
77
+ export function contentrailAdmin(options) {
78
+ assertContentrailAdminOptions(options);
79
+ const site = serializeAdminSite(options);
80
+ const serveRoute = options.serveRoute !== false;
81
+ return {
82
+ name: "contentrail-admin",
83
+ config(userConfig) {
84
+ if (!serveRoute) {
85
+ return undefined;
86
+ }
87
+ const root = userConfig.root ?? process.cwd();
88
+ return {
89
+ build: {
90
+ rollupOptions: {
91
+ input: mergeInput(userConfig.build?.rollupOptions?.input, root),
92
+ },
93
+ },
94
+ };
95
+ },
96
+ configureServer(server) {
97
+ if (!serveRoute) {
98
+ return;
99
+ }
100
+ server.middlewares.use((request, response, next) => {
101
+ const url = request.url?.split("?")[0] ?? "";
102
+ if (url !== "/admin" && url !== "/admin/") {
103
+ next();
104
+ return;
105
+ }
106
+ response.setHeader("Content-Type", "text/html; charset=utf-8");
107
+ response.setHeader("X-Robots-Tag", "noindex");
108
+ response.setHeader("Cache-Control", "no-store");
109
+ response.end(adminHtml(`/@id/${ADMIN_ENTRY}`));
110
+ });
111
+ },
112
+ resolveId(id) {
113
+ if (id === ADMIN_ENTRY) {
114
+ return RESOLVED_ENTRY;
115
+ }
116
+ if (id === ADMIN_CONFIG) {
117
+ return RESOLVED_CONFIG;
118
+ }
119
+ return undefined;
120
+ },
121
+ load(id) {
122
+ if (id === RESOLVED_CONFIG) {
123
+ return `export const site = ${JSON.stringify(site)};
124
+ export const apiBaseUrl = ${JSON.stringify(options.apiBaseUrl)};
125
+ export const title = ${JSON.stringify(options.title ?? "Content")};
126
+ export const pageSize = ${JSON.stringify(options.pageSize ?? 25)};
127
+ `;
128
+ }
129
+ if (id === RESOLVED_ENTRY) {
130
+ return `import { mountAdmin } from "@contentrail/editor";
131
+ import "@contentrail/editor/styles.css";
132
+ import { site, apiBaseUrl, title, pageSize } from "${ADMIN_CONFIG}";
133
+ const root = document.getElementById("contentrail-admin");
134
+ if (!(root instanceof HTMLElement)) {
135
+ throw new Error("#contentrail-admin is required");
136
+ }
137
+ mountAdmin({ target: root, sites: [site], apiBaseUrl, title, pageSize });
138
+ `;
139
+ }
140
+ return undefined;
141
+ },
142
+ generateBundle(_output, bundle) {
143
+ if (!serveRoute) {
144
+ return;
145
+ }
146
+ const entry = Object.values(bundle).find((item) => item.type === "chunk" &&
147
+ item.isEntry &&
148
+ item.facadeModuleId === RESOLVED_ENTRY);
149
+ const fileName = entry && entry.type === "chunk" ? entry.fileName : null;
150
+ const scriptSrc = fileName === null ? "/admin.js" : `/${fileName}`;
151
+ this.emitFile({
152
+ type: "asset",
153
+ fileName: "admin/index.html",
154
+ source: adminHtml(scriptSrc),
155
+ });
156
+ },
157
+ };
158
+ }
159
+ //# sourceMappingURL=vite-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../../src/admin/vite-plugin.ts"],"names":[],"mappings":"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"}
@@ -33,6 +33,8 @@ export interface StatusResponse {
33
33
  publicationId: string;
34
34
  createdAt: string;
35
35
  active: boolean;
36
+ entryIds?: readonly string[];
37
+ previousVersion?: string | null;
36
38
  }>;
37
39
  }
38
40
  export interface PublishResponse {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE;QACd,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACxC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAChE;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;QAC/B,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,QAAQ,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;QAC5B,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,MAAM,eAAe,CAAC,CAAC,IACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IACE,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE;QACd,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACxC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAChE;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;QAC/B,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;QAChB,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC7B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACjC,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,QAAQ,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;QAC5B,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,MAAM,eAAe,CAAC,CAAC,IACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IACE,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/fields/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,uDAAuD;AACvD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,eAAe,EAAE,GACjC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMzB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAoBlE;AAED,wBAAgB,UAAU,CACxB,MAAM,EAAE,SAAS,eAAe,EAAE,GACjC,eAAe,EAAE,CAKnB;AAED,kFAAkF;AAClF,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,eAAe,EAAE,EAClC,IAAI,EAAE,OAAO,EACb,IAAI,GAAE,MAAM,EAAO,GAClB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA6C1C"}
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/fields/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,uDAAuD;AACvD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,eAAe,EAAE,GACjC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMzB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAgClE;AAED,wBAAgB,UAAU,CACxB,MAAM,EAAE,SAAS,eAAe,EAAE,GACjC,eAAe,EAAE,CAKnB;AAED,kFAAkF;AAClF,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,eAAe,EAAE,EAClC,IAAI,EAAE,OAAO,EACb,IAAI,GAAE,MAAM,EAAO,GAClB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA6C1C"}
@@ -7,7 +7,14 @@ export function emptyValueForFields(fields) {
7
7
  return result;
8
8
  }
9
9
  export function emptyValueForField(field) {
10
- if (field.widget === "text" || field.widget === "textarea") {
10
+ if (field.widget === "text" ||
11
+ field.widget === "textarea" ||
12
+ field.widget === "url" ||
13
+ field.widget === "email" ||
14
+ field.widget === "date" ||
15
+ field.widget === "datetime" ||
16
+ field.widget === "media" ||
17
+ field.widget === "relation") {
11
18
  return "";
12
19
  }
13
20
  if (field.widget === "number") {
@@ -19,6 +26,9 @@ export function emptyValueForField(field) {
19
26
  if (field.widget === "enum") {
20
27
  return field.options[0]?.value ?? "";
21
28
  }
29
+ if (field.widget === "multiselect" || field.widget === "tags") {
30
+ return [];
31
+ }
22
32
  if (field.widget === "object") {
23
33
  return emptyValueForFields(field.fields);
24
34
  }
@@ -80,12 +90,22 @@ function isEmpty(value, field) {
80
90
  }
81
91
  if ((field.widget === "text" ||
82
92
  field.widget === "textarea" ||
93
+ field.widget === "url" ||
94
+ field.widget === "email" ||
95
+ field.widget === "date" ||
96
+ field.widget === "datetime" ||
97
+ field.widget === "media" ||
98
+ field.widget === "relation" ||
83
99
  field.widget === "enum") &&
84
100
  typeof value === "string" &&
85
101
  value.trim() === "") {
86
102
  return true;
87
103
  }
88
- if (field.widget === "array" && Array.isArray(value) && value.length === 0) {
104
+ if ((field.widget === "array" ||
105
+ field.widget === "tags" ||
106
+ field.widget === "multiselect") &&
107
+ Array.isArray(value) &&
108
+ value.length === 0) {
89
109
  return true;
90
110
  }
91
111
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/fields/defaults.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/fields/defaults.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  /**
2
- * Explicit editor field metadata (ADR 019).
3
- * Complements Zod schemas — does not introspect Zod internals.
2
+ * Editor field metadata (ADR 019 / ADR 026).
3
+ * Complements Zod schemas. Automatic mapping uses public Zod `.shape` / `.def.type`
4
+ * only; unsupported structures become non-editable notices.
4
5
  */
5
- export type EditorWidget = "text" | "textarea" | "number" | "boolean" | "enum" | "object" | "array" | "unsupported";
6
+ export type EditorWidget = "text" | "textarea" | "url" | "email" | "date" | "datetime" | "number" | "boolean" | "enum" | "multiselect" | "tags" | "media" | "relation" | "object" | "array" | "unsupported";
6
7
  export interface EditorFieldBase {
7
8
  readonly name: string;
8
9
  readonly label: string;
@@ -13,7 +14,7 @@ export interface EditorFieldBase {
13
14
  readonly order?: number;
14
15
  }
15
16
  export interface TextFieldSpec extends EditorFieldBase {
16
- readonly widget: "text" | "textarea";
17
+ readonly widget: "text" | "textarea" | "url" | "email" | "date" | "datetime";
17
18
  readonly placeholder?: string;
18
19
  }
19
20
  export interface NumberFieldSpec extends EditorFieldBase {
@@ -32,6 +33,24 @@ export interface EnumFieldSpec extends EditorFieldBase {
32
33
  label: string;
33
34
  }>;
34
35
  }
36
+ export interface MultiSelectFieldSpec extends EditorFieldBase {
37
+ readonly widget: "multiselect";
38
+ readonly options: ReadonlyArray<{
39
+ value: string;
40
+ label: string;
41
+ }>;
42
+ }
43
+ export interface TagsFieldSpec extends EditorFieldBase {
44
+ readonly widget: "tags";
45
+ }
46
+ export interface MediaFieldSpec extends EditorFieldBase {
47
+ readonly widget: "media";
48
+ readonly placeholder?: string;
49
+ }
50
+ export interface RelationFieldSpec extends EditorFieldBase {
51
+ readonly widget: "relation";
52
+ readonly collection: string;
53
+ }
35
54
  export interface ObjectFieldSpec extends EditorFieldBase {
36
55
  readonly widget: "object";
37
56
  readonly fields: readonly EditorFieldSpec[];
@@ -45,7 +64,7 @@ export interface UnsupportedFieldSpec extends EditorFieldBase {
45
64
  readonly widget: "unsupported";
46
65
  readonly reason: string;
47
66
  }
48
- export type EditorFieldSpec = TextFieldSpec | NumberFieldSpec | BooleanFieldSpec | EnumFieldSpec | ObjectFieldSpec | ArrayFieldSpec | UnsupportedFieldSpec;
67
+ export type EditorFieldSpec = TextFieldSpec | NumberFieldSpec | BooleanFieldSpec | EnumFieldSpec | MultiSelectFieldSpec | TagsFieldSpec | MediaFieldSpec | RelationFieldSpec | ObjectFieldSpec | ArrayFieldSpec | UnsupportedFieldSpec;
49
68
  export interface EditorCollectionConfig {
50
69
  readonly name: string;
51
70
  readonly label: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/fields/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,UAAU,GACV,QAAQ,GACR,SAAS,GACT,MAAM,GACN,QAAQ,GACR,OAAO,GACP,aAAa,CAAC;AAElB,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,8CAA8C;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAc,SAAQ,eAAe;IACpD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;IACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;CAC5B;AAED,MAAM,WAAW,aAAc,SAAQ,eAAe;IACpD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnE;AAED,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,cAAe,SAAQ,eAAe;IACrD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;CAChC;AAED,MAAM,WAAW,oBAAqB,SAAQ,eAAe;IAC3D,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,eAAe,GACvB,aAAa,GACb,eAAe,GACf,gBAAgB,GAChB,aAAa,GACb,eAAe,GACf,cAAc,GACd,oBAAoB,CAAC;AAEzB,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,6DAA6D;IAC7D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,SAAS,sBAAsB,EAAE,CAAC;CACzD"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/fields/types.ts"],"names":[],"mappings":"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"}