opacacms 0.2.1 → 0.3.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 (185) hide show
  1. package/README.md +31 -22
  2. package/dist/admin/auth-client.d.ts +39 -39
  3. package/dist/admin/index.d.ts +2 -2
  4. package/dist/admin/index.js +15 -10520
  5. package/dist/admin/plugin-client.d.ts +65 -0
  6. package/dist/admin/react.d.ts +2 -2
  7. package/dist/admin/react.js +34 -4
  8. package/dist/admin/stores/ui.d.ts +19 -4
  9. package/dist/admin/ui/components/PluginSettingsForm.d.ts +2 -2
  10. package/dist/admin/ui/components/custom-alert.d.ts +7 -0
  11. package/dist/admin/ui/components/{DetailSheet.d.ts → detail-sheet.d.ts} +1 -2
  12. package/dist/admin/ui/components/fields/FieldLabel.d.ts +1 -1
  13. package/dist/admin/ui/components/fields/RelationshipField.d.ts +1 -1
  14. package/dist/admin/ui/components/media/AssetManagerModal.d.ts +2 -2
  15. package/dist/admin/ui/components/plugin-iframe.d.ts +7 -0
  16. package/dist/admin/ui/components/ui/accordion.d.ts +17 -7
  17. package/dist/admin/ui/components/ui/alert-dialog.d.ts +16 -12
  18. package/dist/admin/ui/components/ui/button.d.ts +11 -7
  19. package/dist/admin/ui/components/ui/relationship.d.ts +1 -1
  20. package/dist/admin/ui/components/ui/sheet.d.ts +14 -27
  21. package/dist/admin/ui/components/ui/tooltip.d.ts +7 -0
  22. package/dist/admin/ui/components/versions-sheet.d.ts +4 -5
  23. package/dist/admin/ui/views/collection-list-view.d.ts +1 -1
  24. package/dist/admin/ui/views/dashboard-view.d.ts +1 -1
  25. package/dist/admin/ui/views/media-registry-view.d.ts +3 -3
  26. package/dist/admin/ui/views/settings-view.d.ts +2 -2
  27. package/dist/admin/vue.js +27 -4
  28. package/dist/admin/webcomponent.js +66 -16
  29. package/dist/admin.css +1 -1
  30. package/dist/auth/index.d.ts +43 -43
  31. package/dist/{chunk-7y1nbmw6.js → chunk-1bd7fz7n.js} +32 -2
  32. package/dist/chunk-1qm0m8r8.js +413 -0
  33. package/dist/chunk-2k3ysje3.js +31 -0
  34. package/dist/{chunk-jdfw4v3r.js → chunk-3j9zjfmn.js} +95 -30
  35. package/dist/{chunk-byq8g0rd.js → chunk-48ywpd0a.js} +16 -22
  36. package/dist/{chunk-tfnaf41w.js → chunk-5422w4eq.js} +41 -25
  37. package/dist/chunk-56n342hs.js +95 -0
  38. package/dist/chunk-5b8r0v8c.js +47 -0
  39. package/dist/chunk-63yg00vx.js +263 -0
  40. package/dist/{chunk-8sqjbsgt.js → chunk-6bywt602.js} +26 -1
  41. package/dist/{chunk-v9z61v3g.js → chunk-6qs0g65f.js} +43 -3
  42. package/dist/chunk-7rr5p01g.js +581 -0
  43. package/dist/{chunk-2es275xs.js → chunk-941zxavt.js} +867 -322
  44. package/dist/{chunk-51z3x7kq.js → chunk-a3qae86h.js} +1 -1
  45. package/dist/{chunk-3rdhbedb.js → chunk-adq2b75c.js} +2 -2
  46. package/dist/chunk-d0tb1xjw.js +93 -0
  47. package/dist/chunk-d7cgd6vn.js +318 -0
  48. package/dist/{chunk-6d1vdfwa.js → chunk-e0g6gn7n.js} +54 -75
  49. package/dist/chunk-ec4jhybj.js +1137 -0
  50. package/dist/chunk-fatyf6f7.js +221 -0
  51. package/dist/{chunk-526a3gqx.js → chunk-fnsf1dfm.js} +1 -1
  52. package/dist/chunk-g9bxb6h0.js +205 -0
  53. package/dist/chunk-gyaf5kgf.js +10 -0
  54. package/dist/{chunk-9kxpbcb1.js → chunk-h6dhexzr.js} +16 -7
  55. package/dist/{chunk-dykn5hr6.js → chunk-j8js1y0h.js} +31 -74
  56. package/dist/{chunk-t0zg026p.js → chunk-jq1drsen.js} +12 -1
  57. package/dist/{chunk-b3kr8w41.js → chunk-m24yqkeq.js} +38 -26
  58. package/dist/chunk-m5ems3hh.js +410 -0
  59. package/dist/{chunk-8scgdznr.js → chunk-m83ybzf8.js} +15 -18
  60. package/dist/chunk-majsbncm.js +98 -0
  61. package/dist/chunk-mp2gt9yh.js +237 -0
  62. package/dist/chunk-n1twhqmf.js +54 -0
  63. package/dist/{chunk-bygjkgrx.js → chunk-naqcqj8n.js} +57 -80
  64. package/dist/chunk-q5sb5dcr.js +15 -0
  65. package/dist/{chunk-06ks4ggh.js → chunk-qhdsjek6.js} +49 -89
  66. package/dist/{chunk-n133qpsm.js → chunk-qsh2nqz3.js} +50 -81
  67. package/dist/chunk-r0ms5tk1.js +76 -0
  68. package/dist/chunk-rwqwsanx.js +75 -0
  69. package/dist/chunk-sqsfk9p4.js +700 -0
  70. package/dist/{chunk-5gvbp2qa.js → chunk-x7bnzswh.js} +25 -18
  71. package/dist/cli/commands/dev.d.ts +8 -0
  72. package/dist/cli/commands/doctor.d.ts +8 -0
  73. package/dist/cli/commands/generate.d.ts +26 -0
  74. package/dist/cli/commands/init.d.ts +13 -1
  75. package/dist/cli/commands/migrate.d.ts +33 -0
  76. package/dist/cli/commands/plugin.d.ts +13 -0
  77. package/dist/cli/commands/seed.d.ts +21 -0
  78. package/dist/cli/{commands/migrate-commands.d.ts → core/migrations/migrate-logic.d.ts} +2 -2
  79. package/dist/cli/core/migrations/schema-diff-engine.d.ts +12 -0
  80. package/dist/cli/core/migrations/schema-diff.d.ts +11 -0
  81. package/dist/cli/{seeding.d.ts → core/seeding/auto-seed.d.ts} +7 -4
  82. package/dist/cli/core/seeding/seed-logic.d.ts +2 -0
  83. package/dist/cli/index.d.ts +4 -0
  84. package/dist/cli/index.js +6 -170
  85. package/dist/client/RichText.d.ts +5 -0
  86. package/dist/client/rich-text-utils.d.ts +5 -0
  87. package/dist/client.js +3 -2
  88. package/dist/config.d.ts +3 -3
  89. package/dist/db/better-sqlite.d.ts +2 -3
  90. package/dist/db/better-sqlite.js +6 -5
  91. package/dist/db/bun-sqlite.d.ts +2 -3
  92. package/dist/db/bun-sqlite.js +6 -5
  93. package/dist/db/d1.d.ts +13 -7
  94. package/dist/db/d1.js +6 -5
  95. package/dist/db/index.d.ts +2 -2
  96. package/dist/db/index.js +10 -12
  97. package/dist/db/kysely/factory.d.ts +29 -0
  98. package/dist/db/kysely/plugins/audit-logging.d.ts +48 -0
  99. package/dist/db/kysely/plugins/auto-timestamps.d.ts +38 -0
  100. package/dist/db/kysely/plugins/cursor-pagination.d.ts +42 -0
  101. package/dist/db/kysely/plugins/deadlock-handler.d.ts +47 -0
  102. package/dist/db/kysely/plugins/draft-swapper.d.ts +33 -0
  103. package/dist/db/kysely/plugins/field-masking.d.ts +45 -0
  104. package/dist/db/kysely/plugins/fts-normalizer.d.ts +38 -0
  105. package/dist/db/kysely/plugins/i18n-fallback.d.ts +48 -0
  106. package/dist/db/kysely/plugins/id-generation.d.ts +42 -0
  107. package/dist/db/kysely/plugins/index.d.ts +16 -0
  108. package/dist/db/kysely/plugins/json-flattener.d.ts +38 -0
  109. package/dist/db/kysely/plugins/relationship-preloading.d.ts +39 -0
  110. package/dist/db/kysely/plugins/slug-generation.d.ts +37 -0
  111. package/dist/db/kysely/plugins/soft-delete.d.ts +42 -0
  112. package/dist/db/kysely/plugins/tree-resolver.d.ts +39 -0
  113. package/dist/db/kysely/plugins/virtual-field-resolver.d.ts +54 -0
  114. package/dist/db/kysely/plugins/zod-coercion.d.ts +34 -0
  115. package/dist/db/kysely/snapshot/snapshot-manager.d.ts +18 -0
  116. package/dist/db/postgres.d.ts +2 -2
  117. package/dist/db/postgres.js +6 -5
  118. package/dist/db/sqlite.d.ts +2 -3
  119. package/dist/db/sqlite.js +6 -5
  120. package/dist/index.d.ts +3 -0
  121. package/dist/index.js +161 -7
  122. package/dist/runtimes/bun.js +9 -6
  123. package/dist/runtimes/cloudflare-workers.d.ts +3 -1
  124. package/dist/runtimes/cloudflare-workers.js +36 -7
  125. package/dist/runtimes/next.js +8 -5
  126. package/dist/runtimes/node.js +9 -6
  127. package/dist/schema/collection.d.ts +116 -70
  128. package/dist/schema/compiler.d.ts +6 -0
  129. package/dist/schema/global.d.ts +38 -71
  130. package/dist/schema/index.d.ts +5 -4
  131. package/dist/schema/index.js +35 -550
  132. package/dist/schema/zod.d.ts +564 -0
  133. package/dist/server/admin-router.d.ts +1 -1
  134. package/dist/server/collection-router.d.ts +1 -1
  135. package/dist/server/graphql.d.ts +6 -0
  136. package/dist/server/handlers.d.ts +25 -7
  137. package/dist/server/middlewares/auth.d.ts +1 -1
  138. package/dist/server/plugins-loader.d.ts +1 -1
  139. package/dist/server/router.d.ts +2 -2
  140. package/dist/server/routers/admin.d.ts +1 -1
  141. package/dist/server/routers/auth.d.ts +1 -1
  142. package/dist/server/routers/collections.d.ts +4 -1
  143. package/dist/server/routers/plugins.d.ts +2 -2
  144. package/dist/server/setup-middlewares.d.ts +1 -1
  145. package/dist/server/system-router.d.ts +1 -1
  146. package/dist/server.js +11 -6
  147. package/dist/storage/adapters/cloudflare-r2.d.ts +11 -2
  148. package/dist/storage/index.js +5 -5
  149. package/dist/types.d.ts +253 -42
  150. package/dist/utils/context.d.ts +14 -0
  151. package/dist/utils/logger.d.ts +2 -0
  152. package/dist/utils/string.d.ts +10 -0
  153. package/dist/utils/webhooks-engine.d.ts +24 -0
  154. package/dist/validation.d.ts +67 -1
  155. package/dist/validator.d.ts +1 -0
  156. package/package.json +50 -11
  157. package/src/cli/index.ts +117 -0
  158. package/dist/chunk-6qq3ne6b.js +0 -288
  159. package/dist/chunk-6v1fw7q7.js +0 -126
  160. package/dist/chunk-7a9kn0np.js +0 -116
  161. package/dist/chunk-bexcv7xe.js +0 -36
  162. package/dist/chunk-d3ffeqp9.js +0 -87
  163. package/dist/chunk-fj19qccp.js +0 -78
  164. package/dist/chunk-g1jb60xd.js +0 -17
  165. package/dist/chunk-j53pz21t.js +0 -20
  166. package/dist/chunk-mkn49zmy.js +0 -102
  167. package/dist/chunk-r39em4yj.js +0 -29
  168. package/dist/chunk-rsf0tpy1.js +0 -8
  169. package/dist/chunk-srsac177.js +0 -85
  170. package/dist/chunk-twpvxfce.js +0 -64
  171. package/dist/chunk-ywm4t2gm.js +0 -19
  172. package/dist/cli/commands/plugin-sync.d.ts +0 -1
  173. package/dist/cli/commands/seed-command.d.ts +0 -2
  174. package/dist/plugins/ui-bridge.d.ts +0 -12
  175. package/dist/schema/fields/base.d.ts +0 -84
  176. package/dist/schema/fields/index.d.ts +0 -147
  177. package/dist/schema/infer.d.ts +0 -55
  178. /package/dist/admin/ui/components/{ColumnVisibilityToggle.d.ts → column-visibility-toggle.d.ts} +0 -0
  179. /package/dist/admin/ui/components/{DataDetailView.d.ts → data-detail-view.d.ts} +0 -0
  180. /package/dist/cli/{d1-mock.d.ts → core/mocks/d1-mock.d.ts} +0 -0
  181. /package/dist/cli/{r2-mock.d.ts → core/mocks/r2-mock.d.ts} +0 -0
  182. /package/dist/cli/{commands → core/plugins}/plugin-build.d.ts +0 -0
  183. /package/dist/cli/{commands → core/plugins}/plugin-init.d.ts +0 -0
  184. /package/dist/cli/{commands → core/types}/generate-types.d.ts +0 -0
  185. /package/dist/{schema/fields/validation.test.d.ts → cli/seeding.test.d.ts} +0 -0
@@ -1,85 +0,0 @@
1
- import"./chunk-8sqjbsgt.js";
2
-
3
- // src/cli/commands/init.ts
4
- import fs from "node:fs";
5
- import { resolve } from "node:path";
6
- async function initCommand(target, example) {
7
- console.log(`[OpacaCMS] Initializing new project in ./${target}...`);
8
- if (example) {
9
- console.log(`[OpacaCMS] Using example template: ${example}`);
10
- let currentDir = resolve(import.meta.dirname);
11
- let exampleDir = "";
12
- const localExample = resolve(process.cwd(), "examples", example);
13
- if (fs.existsSync(localExample)) {
14
- exampleDir = localExample;
15
- } else {
16
- while (currentDir !== resolve(currentDir, "..")) {
17
- const potential = resolve(currentDir, "examples", example);
18
- if (fs.existsSync(potential)) {
19
- exampleDir = potential;
20
- break;
21
- }
22
- currentDir = resolve(currentDir, "..");
23
- }
24
- }
25
- if (!exampleDir) {
26
- console.error(`[OpacaCMS] Example ${example} not found.`);
27
- process.exit(1);
28
- }
29
- fs.cpSync(exampleDir, resolve(process.cwd(), target), { recursive: true });
30
- console.log(`[OpacaCMS] Copied example ${example} to ${target}!`);
31
- return;
32
- }
33
- console.log(`[OpacaCMS] Generating default boilerplate...`);
34
- fs.mkdirSync(resolve(process.cwd(), target), { recursive: true });
35
- const configCode = `import { defineConfig } from 'opacacms';
36
- import { createSQLiteAdapter } from 'opacacms/db/sqlite';
37
-
38
- export default defineConfig({
39
- appName: "My OpacaCMS App",
40
- db: createSQLiteAdapter('local.db'),
41
- collections: [
42
- {
43
- slug: 'posts',
44
- fields: [
45
- { name: 'title', type: 'text', required: true },
46
- { name: 'content', type: 'text' }
47
- ]
48
- }
49
- ]
50
- });
51
- `;
52
- fs.writeFileSync(resolve(process.cwd(), target, "opacacms.config.ts"), configCode);
53
- const serverCode = `import { Hono } from 'hono';
54
- import { createAPIRouter } from 'opacacms/server';
55
- import config from './opacacms.config';
56
-
57
- const app = new Hono();
58
- app.route('/api', createAPIRouter(config));
59
-
60
- export default app;
61
- `;
62
- fs.writeFileSync(resolve(process.cwd(), target, "index.ts"), serverCode);
63
- const pkgJson = {
64
- name: target,
65
- type: "module",
66
- scripts: {
67
- start: "bun run index.ts",
68
- dev: "bun run --watch index.ts"
69
- },
70
- dependencies: {
71
- opacacms: "latest",
72
- hono: "^4.0.0"
73
- }
74
- };
75
- fs.writeFileSync(resolve(process.cwd(), target, "package.json"), JSON.stringify(pkgJson, null, 2));
76
- console.log(`[OpacaCMS] Project created successfully!`);
77
- console.log(`
78
- cd ${target}`);
79
- console.log(`bun install`);
80
- console.log(`bun run dev
81
- `);
82
- }
83
- export {
84
- initCommand
85
- };
@@ -1,64 +0,0 @@
1
- import {
2
- logger
3
- } from "./chunk-t0zg026p.js";
4
-
5
- // src/cli/commands/plugin-sync.ts
6
- import fs from "node:fs";
7
- import path from "node:path";
8
- async function pluginSyncCommand(projectRoot, watch = false) {
9
- const srcDir = path.resolve(projectRoot, "src");
10
- if (!fs.existsSync(srcDir)) {
11
- logger.error(`No 'src' directory found in ${projectRoot}.`);
12
- process.exit(1);
13
- }
14
- const runSync = () => {
15
- const uiFiles = ["dashboard.tsx", "dashboard.jsx", "ui.tsx", "ui.jsx"];
16
- let uiEntry = "";
17
- for (const file of uiFiles) {
18
- const inSrc = path.join(srcDir, file);
19
- if (fs.existsSync(inSrc)) {
20
- uiEntry = inSrc;
21
- break;
22
- }
23
- }
24
- if (!uiEntry) {
25
- logger.warn("No UI entry found (e.g. dashboard.tsx). Skipping UI sync.");
26
- return;
27
- }
28
- try {
29
- const uiContent = fs.readFileSync(uiEntry, "utf-8");
30
- const transpiler = new Bun.Transpiler({
31
- loader: uiEntry.endsWith(".tsx") ? "tsx" : "jsx",
32
- target: "browser",
33
- inline: true,
34
- minifyWhitespace: true
35
- });
36
- const transpiledUI = transpiler.transformSync(uiContent);
37
- const safeUI = transpiledUI.replace(/\`/g, "\\`").replace(/\$\{/g, "\\${");
38
- const genPath = uiEntry.replace(/\.(tsx|jsx)$/, ".gen.ts");
39
- const baseName = path.parse(uiEntry).name;
40
- const genContent = `// This file is generated by opacacms plugin:sync. Do not edit manually.
41
- export const ${baseName}Source = \`
42
- ${safeUI}
43
- \`;
44
- `;
45
- fs.writeFileSync(genPath, genContent, "utf-8");
46
- logger.success(`Generated: ${path.basename(genPath)}`);
47
- } catch (err) {
48
- logger.error(`Failed to sync UI: ${err.message}`);
49
- }
50
- };
51
- runSync();
52
- if (watch) {
53
- logger.info("Watching for changes in src/...");
54
- fs.watch(srcDir, { recursive: true }, (event, filename) => {
55
- if (filename && (filename.endsWith(".tsx") || filename.endsWith(".jsx")) && !filename.endsWith(".gen.ts")) {
56
- logger.info(`File changed: ${filename}. Syncing...`);
57
- runSync();
58
- }
59
- });
60
- return new Promise(() => {});
61
- }
62
- }
63
-
64
- export { pluginSyncCommand };
@@ -1,19 +0,0 @@
1
- import {
2
- $customSidebarItems,
3
- $isSidebarCollapsed,
4
- $toasts,
5
- clearToast,
6
- notify,
7
- registerSidebarItem,
8
- toggleSidebar
9
- } from "./chunk-8scgdznr.js";
10
- import"./chunk-8sqjbsgt.js";
11
- export {
12
- toggleSidebar,
13
- registerSidebarItem,
14
- notify,
15
- clearToast,
16
- $toasts,
17
- $isSidebarCollapsed,
18
- $customSidebarItems
19
- };
@@ -1 +0,0 @@
1
- export declare function pluginSyncCommand(projectRoot: string, watch?: boolean): Promise<unknown>;
@@ -1,2 +0,0 @@
1
- import type { OpacaConfig } from "../../types";
2
- export declare function seedCommand(opaca: OpacaConfig, count: number, reset: boolean, type: "assets" | "collections"): Promise<void>;
@@ -1,12 +0,0 @@
1
- import type { Context } from 'hono';
2
- /**
3
- * Serves a .ts or .tsx source as a transpiled browser-compatible JavaScript module.
4
- *
5
- * @param c - The Hono context.
6
- * @param options - Options containing either the filePath or the raw source.
7
- */
8
- export declare function servePluginUI(c: Context, options: {
9
- filePath?: string;
10
- source?: string;
11
- loader?: 'tsx' | 'ts';
12
- }): Promise<(Response & import("hono").TypedResponse<"No content provided", 400, "text">) | (Response & import("hono").TypedResponse<string, 200, "body">) | (Response & import("hono").TypedResponse<"Failed to serve plugin UI", 500, "text">)>;
@@ -1,84 +0,0 @@
1
- import type { z } from "zod";
2
- import type { BaseField, FieldAccessConfig } from "../../types";
3
- /**
4
- * The base class for all Fluent API Field Builders.
5
- * Accumulates configuration state linearly.
6
- *
7
- * @template TType The literal string type of the field (e.g., 'text', 'relationship').
8
- * @template TName The literal string name of the field.
9
- * @template TValue The TypeScript literal value type this field produces (e.g., string, number).
10
- */
11
- export declare abstract class FieldBuilder<TType extends string, TName extends string = string, TValue = any, TSubFields extends readonly any[] = any[]> {
12
- readonly type: TType;
13
- readonly name: TName;
14
- readonly __type: TType;
15
- readonly __name: TName;
16
- readonly __value: TValue;
17
- readonly __sub: TSubFields;
18
- protected config: Partial<BaseField & Record<string, any>>;
19
- constructor(type: TType, name: TName);
20
- /**
21
- * Defines a user-friendly label for the Admin UI.
22
- */
23
- label(label: string): this;
24
- /**
25
- * Sets the placeholder text for the input field.
26
- */
27
- placeholder(text: string): this;
28
- /**
29
- * Marks the field as strictly required.
30
- */
31
- required(val?: boolean): this;
32
- /**
33
- * Marks the field as unique within the database table.
34
- */
35
- unique(val?: boolean): this;
36
- /**
37
- * Enables native field-level internationalization.
38
- */
39
- localized(val?: boolean): this;
40
- /**
41
- * Sets a default value for the field.
42
- */
43
- defaultValue(val: TValue): this;
44
- /**
45
- * A custom validation callback function or a Zod schema.
46
- */
47
- validate(val: ((value: unknown) => boolean | string) | z.ZodTypeAny): this;
48
- /**
49
- * Configure granular access control for this specific field.
50
- */
51
- access(config: FieldAccessConfig): this;
52
- /**
53
- * Add a descriptive text below the field in the Admin UI.
54
- */
55
- description(text: string): this;
56
- /**
57
- * Override Admin UI with custom React components.
58
- */
59
- admin(opts: NonNullable<BaseField["admin"]>): this;
60
- /**
61
- * Completely hide the field from the Admin UI and API responses (depending on access).
62
- */
63
- hidden(val?: boolean): this;
64
- /**
65
- * Mark the field as read-only in the Admin UI.
66
- */
67
- readOnly(val?: boolean): this;
68
- /**
69
- * Spreads arbitrary runtime configuration for any non-strongly-typed features.
70
- */
71
- extend(opts: Record<string, any>): this;
72
- /**
73
- * Helper to ensure the `admin` options object is initialized.
74
- */
75
- protected _ensureAdmin(): void;
76
- /**
77
- * Helper to ensure the `options` object is initialized.
78
- */
79
- protected _ensureOptions(): void;
80
- /**
81
- * Compiles the accumulated builder state down into the raw Object structure expected by OpacaCMS.
82
- */
83
- build(): any;
84
- }
@@ -1,147 +0,0 @@
1
- import { FieldBuilder } from "./base";
2
- export declare class TextFieldBuilder<TName extends string> extends FieldBuilder<"text", TName, string> {
3
- constructor(name: TName);
4
- }
5
- export declare class SlugFieldBuilder<TName extends string> extends FieldBuilder<"slug", TName, string> {
6
- constructor(name: TName);
7
- from(sourceField: string): this;
8
- format(fn: (val: string) => string): this;
9
- }
10
- export declare class TextAreaFieldBuilder<TName extends string> extends FieldBuilder<"textarea", TName, string> {
11
- constructor(name: TName);
12
- }
13
- export declare class NumberFieldBuilder<TName extends string> extends FieldBuilder<"number", TName, number> {
14
- constructor(name: TName);
15
- min(val: number): this;
16
- max(val: number): this;
17
- }
18
- export declare class BooleanFieldBuilder<TName extends string> extends FieldBuilder<"boolean", TName, boolean> {
19
- constructor(name: TName);
20
- display(type: "switch" | "toggle" | "checkbox" | "select"): this;
21
- }
22
- export declare class RichTextFieldBuilder<TName extends string> extends FieldBuilder<"richtext", TName, string> {
23
- constructor(name: TName);
24
- mode(mode: "simple" | "notion"): this;
25
- }
26
- export declare class UIFieldBuilder<TName extends string> extends FieldBuilder<"ui", TName, any> {
27
- constructor(name: TName);
28
- }
29
- export declare class RelationshipFieldBuilder<TName extends string> extends FieldBuilder<"relationship", TName, string | string[]> {
30
- constructor(name: TName);
31
- to(collection: string | {
32
- slug: string;
33
- }): this;
34
- single(): this;
35
- many(): this;
36
- displayField(field: string): this;
37
- }
38
- export declare class FileFieldBuilder<TName extends string> extends FieldBuilder<"file", TName, unknown> {
39
- constructor(name: TName);
40
- bucket(bucketName: string): this;
41
- allowedmime_types(types: string[]): this;
42
- maxSize(bytes: number): this;
43
- }
44
- export declare class JSONFieldBuilder<TName extends string> extends FieldBuilder<"json", TName, any> {
45
- constructor(name: TName);
46
- }
47
- export declare class DateFieldBuilder<TName extends string> extends FieldBuilder<"date", TName, string | Date> {
48
- constructor(name: TName);
49
- }
50
- export declare class SelectFieldBuilder<TName extends string> extends FieldBuilder<"select", TName, string> {
51
- constructor(name: TName);
52
- choices(choices: string[] | {
53
- label: string;
54
- value: string;
55
- }[]): this;
56
- }
57
- export declare class RadioFieldBuilder<TName extends string> extends FieldBuilder<"radio", TName, string> {
58
- constructor(name: TName);
59
- choices(choices: string[] | {
60
- label: string;
61
- value: string;
62
- }[]): this;
63
- }
64
- export declare class TabsFieldBuilder<TTabs extends readonly any[] = []> extends FieldBuilder<"tabs", "", unknown, TTabs> {
65
- constructor();
66
- tab<TLabel extends string, TSub extends readonly FieldBuilder<any, any, any, any>[]>(label: TLabel, ...fields: TSub): TabsFieldBuilder<[...TTabs, {
67
- label: TLabel;
68
- fields: TSub;
69
- }]>;
70
- }
71
- export declare class CollapsibleFieldBuilder<TNames extends string = string, TSub extends readonly any[] = any[]> extends FieldBuilder<"collapsible", "", unknown, TSub> {
72
- constructor(fields?: FieldBuilder<any, TNames, any, any>[]);
73
- initiallyCollapsed(val?: boolean): this;
74
- useAsTitle(fieldName: TNames | (string & {})): this;
75
- fields<NewSub extends readonly FieldBuilder<any, any, any>[]>(...fields: NewSub): CollapsibleFieldBuilder<ExtractNames<NewSub>, NewSub>;
76
- }
77
- type ExtractNames<T extends readonly any[]> = T[number]["name"];
78
- export declare class JoinFieldBuilder<TName extends string> extends FieldBuilder<"join", TName, any[]> {
79
- constructor(name: TName);
80
- collection(collectionSlug: string): this;
81
- on(fieldName: string): this;
82
- }
83
- export declare class ArrayFieldBuilder<TName extends string, TSub extends readonly any[] = any[]> extends FieldBuilder<"array", TName, unknown[], TSub> {
84
- constructor(name: TName);
85
- of<NewSub extends readonly FieldBuilder<any, any, any, any>[]>(...fields: NewSub): ArrayFieldBuilder<TName, NewSub>;
86
- }
87
- export declare class GroupFieldBuilder<TName extends string, TNames extends string = string, TSub extends readonly any[] = any[]> extends FieldBuilder<"group", TName, Record<string, any>, TSub> {
88
- constructor(name: TName, fields?: FieldBuilder<any, TNames, any, any>[]);
89
- fields<NewSub extends readonly FieldBuilder<any, any, any, any>[]>(...fields: NewSub): GroupFieldBuilder<TName, ExtractNames<NewSub>, NewSub>;
90
- }
91
- export declare class RowFieldBuilder<TSub extends readonly any[] = any[]> extends FieldBuilder<"row", "", unknown, TSub> {
92
- constructor(fields?: FieldBuilder<any, any, any, any>[]);
93
- fields<NewSub extends readonly FieldBuilder<any, any, any, any>[]>(...fields: NewSub): RowFieldBuilder<NewSub>;
94
- }
95
- export declare class BlockBuilder<TSlug extends string, TNames extends string = string, TSub extends readonly any[] = any[]> {
96
- private config;
97
- constructor(slug: TSlug);
98
- label(label: string): this;
99
- fields<NewSub extends readonly FieldBuilder<any, any, any, any>[]>(...fields: NewSub): BlockBuilder<TSlug, ExtractNames<NewSub>, NewSub>;
100
- build(): Record<string, any>;
101
- }
102
- export declare class VirtualFieldBuilder<TName extends string, TData = any> extends FieldBuilder<"virtual", TName, any> {
103
- constructor(name: TName);
104
- resolve(fn: (args: {
105
- data: TData;
106
- req: any;
107
- user: any;
108
- session: any;
109
- apiKey?: any;
110
- }) => any | Promise<any>): this;
111
- returnType(type: "string" | "number" | "boolean" | "json"): this;
112
- }
113
- export declare class BlocksFieldBuilder<TName extends string, TBlocks extends readonly any[] = any[]> extends FieldBuilder<"blocks", TName, any[], TBlocks> {
114
- constructor(name: TName);
115
- blocks<NewBlocks extends readonly BlockBuilder<any, any, any>[]>(...blocks: NewBlocks): BlocksFieldBuilder<TName, NewBlocks>;
116
- }
117
- /**
118
- * The Field Factory object containing methods to instantiate specific field builders.
119
- */
120
- export declare const Field: {
121
- text: <N extends string>(name: N) => TextFieldBuilder<N>;
122
- slug: <N extends string>(name: N) => SlugFieldBuilder<N>;
123
- textarea: <N extends string>(name: N) => TextAreaFieldBuilder<N>;
124
- number: <N extends string>(name: N) => NumberFieldBuilder<N>;
125
- boolean: <N extends string>(name: N) => BooleanFieldBuilder<N>;
126
- date: <N extends string>(name: N) => DateFieldBuilder<N>;
127
- select: <N extends string>(name: N) => SelectFieldBuilder<N>;
128
- radio: <N extends string>(name: N) => RadioFieldBuilder<N>;
129
- richText: <N extends string>(name: N) => RichTextFieldBuilder<N>;
130
- relationship: <N extends string>(name: N) => RelationshipFieldBuilder<N>;
131
- join: <N extends string>(name: N) => JoinFieldBuilder<N>;
132
- file: <N extends string>(name: N) => FileFieldBuilder<N>;
133
- array: <N extends string>(name: N) => ArrayFieldBuilder<N, any[]>;
134
- group: <N extends string, TSub extends readonly FieldBuilder<any, any, any, any>[]>(name: N, fields?: TSub) => GroupFieldBuilder<N, any, TSub>;
135
- tabs: () => TabsFieldBuilder<[]>;
136
- collapsible: <N extends string, S extends readonly FieldBuilder<any, any, any, any>[]>(fields?: S) => CollapsibleFieldBuilder<ExtractNames<S>, S>;
137
- row: <S extends readonly FieldBuilder<any, any, any, any>[]>(fields?: S) => RowFieldBuilder<S>;
138
- blocks: <N extends string, TSub extends readonly BlockBuilder<any, any, any>[]>(name: N, ...blocks: TSub) => BlocksFieldBuilder<N, TSub>;
139
- block: <N extends string>(slug: N) => BlockBuilder<N, string, any[]>;
140
- /**
141
- * Inject a pure Custom UI Element (Web Component) directly into the Admin Form.
142
- * This field is ignored by the database schema generator and backend validation.
143
- */
144
- ui: <N extends string>(name: N) => UIFieldBuilder<N>;
145
- json: <N extends string>(name: N) => JSONFieldBuilder<N>;
146
- };
147
- export * from "./base";
@@ -1,55 +0,0 @@
1
- import type { FieldBuilder } from "./fields/base";
2
- /**
3
- * Helper to convert a union of types into an intersection.
4
- */
5
- type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
6
- type Flatten<T> = {
7
- [K in keyof T]: T[K];
8
- } & {};
9
- /**
10
- * Extracts the TName and TValue from a single FieldBuilder.
11
- */
12
- export type InferField<T extends FieldBuilder<any, any, any, any>> = T extends FieldBuilder<any, any, infer TValue, any> ? TValue : any;
13
- /**
14
- * Internal helper to distribute over a union of FieldBuilders.
15
- * Matches against the class generics for maximum reliability.
16
- */
17
- type ProcessField<F> = F extends FieldBuilder<"group", infer N, any, infer Sub> ? N extends string ? {
18
- [K in N]: Sub extends readonly any[] ? InferFields<Sub> : unknown;
19
- } : {} : F extends FieldBuilder<"array", infer N, any, infer Sub> ? N extends string ? {
20
- [K in N]: Sub extends readonly any[] ? InferFields<Sub>[] : unknown[];
21
- } : {} : F extends FieldBuilder<"row" | "collapsible", any, any, infer Sub> ? Sub extends readonly any[] ? InferFields<Sub> : {} : F extends FieldBuilder<"tabs", any, any, infer Sub> ? Sub extends readonly any[] ? UnionToIntersection<Sub[number] extends {
22
- fields: infer S;
23
- } ? S extends readonly any[] ? InferFields<S> : {} : {}> : {} : F extends FieldBuilder<any, infer N, infer V, any> ? N extends string ? N extends "" ? {} : {
24
- [K in N]: V;
25
- } : {} : {};
26
- /**
27
- * Magically maps an array of FieldBuilders into a recursive object type representation.
28
- *
29
- * Performance Optimized:
30
- * - Uses ProcessField helper for guaranteed union distribution.
31
- * - UnionToIntersection merges individual field objects into a clean intersection.
32
- */
33
- export type InferFields<T extends readonly any[]> = Flatten<UnionToIntersection<ProcessField<T[number]>>>;
34
- /**
35
- * Access rules with strongly typed hooks.
36
- */
37
- export interface AccessRules<TFields extends Record<string, any>> {
38
- read?: (args: {
39
- user: any;
40
- data?: TFields;
41
- }) => boolean | Promise<boolean>;
42
- create?: (args: {
43
- user: any;
44
- data: TFields;
45
- }) => boolean | Promise<boolean>;
46
- update?: (args: {
47
- user: any;
48
- data: TFields;
49
- }) => boolean | Promise<boolean>;
50
- delete?: (args: {
51
- user: any;
52
- data?: TFields;
53
- }) => boolean | Promise<boolean>;
54
- }
55
- export {};