@supatype/plugin-sdk 0.1.0-alpha.9

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.
package/dist/define.js ADDED
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Builder functions for defining Supatype plugins.
3
+ *
4
+ * These are the primary API surface for plugin authors:
5
+ * defineFieldType() — custom field types (e.g., phone, currency)
6
+ * defineComposite() — field bundles (e.g., SEO, address)
7
+ * defineProvider() — service providers (e.g., Stripe, PostHog)
8
+ * defineWidget() — admin panel widgets (e.g., color picker)
9
+ */
10
+ import { PLUGIN_API_VERSION, } from "./types.js";
11
+ // ─── defineFieldType ─────────────────────────────────────────────────────────
12
+ /**
13
+ * Define a custom field type plugin.
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * import { defineFieldType } from '@supatype/plugin-sdk'
18
+ *
19
+ * export default defineFieldType({
20
+ * name: 'phone',
21
+ * pgType: 'TEXT',
22
+ * tsType: 'string',
23
+ * validate(value) {
24
+ * if (typeof value !== 'string') return 'Must be a string'
25
+ * if (!/^\+\d{7,15}$/.test(value)) return 'Invalid phone number (E.164 format required)'
26
+ * return null
27
+ * },
28
+ * widgetPath: './src/PhoneWidget.tsx',
29
+ * filterOperators: ['eq', 'neq', 'in', 'like'],
30
+ * })
31
+ * ```
32
+ */
33
+ export function defineFieldType(definition) {
34
+ return {
35
+ ...definition,
36
+ meta: {
37
+ name: definition.name,
38
+ description: `Custom field type: ${definition.name}`,
39
+ types: ["field"],
40
+ pluginApi: PLUGIN_API_VERSION,
41
+ ...definition.meta,
42
+ },
43
+ __supatype: "field",
44
+ };
45
+ }
46
+ // ─── defineComposite ─────────────────────────────────────────────────────────
47
+ /**
48
+ * Define a composite plugin (field bundle).
49
+ *
50
+ * @example
51
+ * ```ts
52
+ * import { defineComposite } from '@supatype/plugin-sdk'
53
+ *
54
+ * export default defineComposite({
55
+ * name: 'seo',
56
+ * label: 'SEO Meta',
57
+ * fields: [
58
+ * { name: 'meta_title', type: 'text', options: { maxLength: 60 } },
59
+ * { name: 'meta_description', type: 'text', options: { maxLength: 160 } },
60
+ * { name: 'og_image', type: 'text' },
61
+ * { name: 'canonical_url', type: 'text' },
62
+ * { name: 'no_index', type: 'boolean', defaultValue: false },
63
+ * ],
64
+ * adminGroup: { collapsible: true, defaultCollapsed: true },
65
+ * })
66
+ * ```
67
+ */
68
+ export function defineComposite(definition) {
69
+ return {
70
+ ...definition,
71
+ meta: {
72
+ name: definition.name,
73
+ description: `Composite: ${definition.label}`,
74
+ types: ["composite"],
75
+ pluginApi: PLUGIN_API_VERSION,
76
+ ...definition.meta,
77
+ },
78
+ __supatype: "composite",
79
+ };
80
+ }
81
+ // ─── defineProvider ──────────────────────────────────────────────────────────
82
+ /**
83
+ * Define a service provider plugin.
84
+ *
85
+ * @example
86
+ * ```ts
87
+ * import { defineProvider, type CommerceProvider } from '@supatype/plugin-sdk'
88
+ *
89
+ * export default defineProvider<StripeConfig>({
90
+ * name: 'stripe',
91
+ * category: 'commerce',
92
+ * label: 'Stripe',
93
+ * configSchema: {
94
+ * secretKey: { type: 'string', label: 'Secret Key', required: true, secret: true },
95
+ * webhookSecret: { type: 'string', label: 'Webhook Secret', required: true, secret: true },
96
+ * },
97
+ * create(config): CommerceProvider {
98
+ * return new StripeCommerceProvider(config)
99
+ * },
100
+ * })
101
+ * ```
102
+ */
103
+ export function defineProvider(definition) {
104
+ return {
105
+ ...definition,
106
+ meta: {
107
+ name: definition.name,
108
+ description: `${definition.category} provider: ${definition.label}`,
109
+ types: ["provider"],
110
+ pluginApi: PLUGIN_API_VERSION,
111
+ ...definition.meta,
112
+ },
113
+ __supatype: "provider",
114
+ };
115
+ }
116
+ // ─── defineWidget ────────────────────────────────────────────────────────────
117
+ /**
118
+ * Define a standalone widget plugin.
119
+ *
120
+ * @example
121
+ * ```ts
122
+ * import { defineWidget } from '@supatype/plugin-sdk'
123
+ *
124
+ * export default defineWidget({
125
+ * name: 'color-picker',
126
+ * label: 'Colour Picker',
127
+ * compatibleTypes: ['text', 'varchar'],
128
+ * componentPath: './src/ColorPickerWidget.tsx',
129
+ * })
130
+ * ```
131
+ */
132
+ export function defineWidget(definition) {
133
+ return {
134
+ ...definition,
135
+ meta: {
136
+ name: definition.name,
137
+ description: `Widget: ${definition.label}`,
138
+ types: ["widget"],
139
+ pluginApi: PLUGIN_API_VERSION,
140
+ ...definition.meta,
141
+ },
142
+ __supatype: "widget",
143
+ };
144
+ }
145
+ /**
146
+ * Check if a value is a Supatype plugin definition.
147
+ */
148
+ export function isPluginDefinition(value) {
149
+ return typeof value === "object" && value !== null && "__supatype" in value;
150
+ }
151
+ /**
152
+ * Validate plugin API version compatibility.
153
+ */
154
+ export function checkPluginApiVersion(meta) {
155
+ if (!meta)
156
+ return { compatible: true };
157
+ if (meta.pluginApi !== PLUGIN_API_VERSION) {
158
+ return {
159
+ compatible: false,
160
+ message: `Plugin "${meta.name}" targets plugin API v${meta.pluginApi}, but the current version is v${PLUGIN_API_VERSION}. The plugin may not work correctly.`,
161
+ };
162
+ }
163
+ return { compatible: true };
164
+ }
165
+ //# sourceMappingURL=define.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.js","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,kBAAkB,GAMnB,MAAM,YAAY,CAAA;AAEnB,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,eAAe,CAC7B,UAAuC;IAEvC,OAAO;QACL,GAAG,UAAU;QACb,IAAI,EAAE;YACJ,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,WAAW,EAAE,sBAAsB,UAAU,CAAC,IAAI,EAAE;YACpD,KAAK,EAAE,CAAC,OAAO,CAAC;YAChB,SAAS,EAAE,kBAAkB;YAC7B,GAAG,UAAU,CAAC,IAAI;SACnB;QACD,UAAU,EAAE,OAAgB;KAC7B,CAAA;AACH,CAAC;AAED,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,eAAe,CAC7B,UAA+B;IAE/B,OAAO;QACL,GAAG,UAAU;QACb,IAAI,EAAE;YACJ,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,WAAW,EAAE,cAAc,UAAU,CAAC,KAAK,EAAE;YAC7C,KAAK,EAAE,CAAC,WAAW,CAAC;YACpB,SAAS,EAAE,kBAAkB;YAC7B,GAAG,UAAU,CAAC,IAAI;SACnB;QACD,UAAU,EAAE,WAAoB;KACjC,CAAA;AACH,CAAC;AAED,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,cAAc,CAC5B,UAAuC;IAEvC,OAAO;QACL,GAAG,UAAU;QACb,IAAI,EAAE;YACJ,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,WAAW,EAAE,GAAG,UAAU,CAAC,QAAQ,cAAc,UAAU,CAAC,KAAK,EAAE;YACnE,KAAK,EAAE,CAAC,UAAU,CAAC;YACnB,SAAS,EAAE,kBAAkB;YAC7B,GAAG,UAAU,CAAC,IAAI;SACnB;QACD,UAAU,EAAE,UAAmB;KAChC,CAAA;AACH,CAAC;AAED,gFAAgF;AAEhF;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,YAAY,CAC1B,UAA4B;IAE5B,OAAO;QACL,GAAG,UAAU;QACb,IAAI,EAAE;YACJ,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,WAAW,EAAE,WAAW,UAAU,CAAC,KAAK,EAAE;YAC1C,KAAK,EAAE,CAAC,QAAQ,CAAC;YACjB,SAAS,EAAE,kBAAkB;YAC7B,GAAG,UAAU,CAAC,IAAI;SACnB;QACD,UAAU,EAAE,QAAiB;KAC9B,CAAA;AACH,CAAC;AAUD;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,YAAY,IAAI,KAAK,CAAA;AAC7E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAA4B;IAIhE,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAA;IAEtC,IAAI,IAAI,CAAC,SAAS,KAAK,kBAAkB,EAAE,CAAC;QAC1C,OAAO;YACL,UAAU,EAAE,KAAK;YACjB,OAAO,EAAE,WAAW,IAAI,CAAC,IAAI,yBAAyB,IAAI,CAAC,SAAS,iCAAiC,kBAAkB,sCAAsC;SAC9J,CAAA;IACH,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAA;AAC7B,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Plugin documentation generator.
3
+ *
4
+ * Generates Markdown documentation from a plugin's type definitions.
5
+ */
6
+ import type { AnyPluginDefinition } from "./define.js";
7
+ /**
8
+ * Generate Markdown documentation from a plugin definition.
9
+ *
10
+ * The output includes YAML frontmatter with the plugin name, type, and version,
11
+ * followed by type-specific documentation sections.
12
+ */
13
+ export declare function generatePluginDocs(definition: AnyPluginDefinition): string;
14
+ //# sourceMappingURL=docgen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docgen.d.ts","sourceRoot":"","sources":["../src/docgen.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAwHtD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,mBAAmB,GAAG,MAAM,CAiC1E"}
package/dist/docgen.js ADDED
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Plugin documentation generator.
3
+ *
4
+ * Generates Markdown documentation from a plugin's type definitions.
5
+ */
6
+ function escapeMarkdown(text) {
7
+ return text.replace(/[|\\`*_{}[\]()#+\-.!]/g, "\\$&");
8
+ }
9
+ function generateFieldDocs(def) {
10
+ const lines = [];
11
+ lines.push("## Field Type");
12
+ lines.push("");
13
+ lines.push(`| Property | Value |`);
14
+ lines.push(`| --- | --- |`);
15
+ lines.push(`| Name | \`${def.name}\` |`);
16
+ lines.push(`| Postgres Type | \`${def.pgType}\` |`);
17
+ lines.push(`| TypeScript Type | \`${def.tsType}\` |`);
18
+ if (def.validate !== undefined) {
19
+ lines.push(`| Validate | \`${def.validate.toString().slice(0, 80)}\` |`);
20
+ }
21
+ if (def.filterOperators !== undefined) {
22
+ lines.push(`| Filter Operators | ${def.filterOperators.map(o => `\`${o}\``).join(", ")} |`);
23
+ }
24
+ if (def.widgetPath !== undefined) {
25
+ lines.push(`| Widget Path | \`${def.widgetPath}\` |`);
26
+ }
27
+ lines.push("");
28
+ if (def.constraints !== undefined && def.constraints.length > 0) {
29
+ lines.push("### Constraints");
30
+ lines.push("");
31
+ for (const c of def.constraints) {
32
+ lines.push(`- \`${c}\``);
33
+ }
34
+ lines.push("");
35
+ }
36
+ return lines.join("\n");
37
+ }
38
+ function generateCompositeDocs(def) {
39
+ const lines = [];
40
+ lines.push("## Composite");
41
+ lines.push("");
42
+ lines.push(`**Label:** ${escapeMarkdown(def.label)}`);
43
+ lines.push("");
44
+ lines.push("### Fields");
45
+ lines.push("");
46
+ lines.push(`| Name | Type | Required | Default |`);
47
+ lines.push(`| --- | --- | --- | --- |`);
48
+ for (const field of def.fields) {
49
+ const req = field.required === true ? "Yes" : "No";
50
+ const defaultVal = field.defaultValue !== undefined ? `\`${String(field.defaultValue)}\`` : "-";
51
+ lines.push(`| ${field.name} | \`${field.type}\` | ${req} | ${defaultVal} |`);
52
+ }
53
+ lines.push("");
54
+ if (def.adminGroup !== undefined) {
55
+ lines.push("### Admin Group");
56
+ lines.push("");
57
+ if (def.adminGroup.collapsible !== undefined) {
58
+ lines.push(`- Collapsible: ${def.adminGroup.collapsible}`);
59
+ }
60
+ if (def.adminGroup.defaultCollapsed !== undefined) {
61
+ lines.push(`- Default Collapsed: ${def.adminGroup.defaultCollapsed}`);
62
+ }
63
+ lines.push("");
64
+ }
65
+ return lines.join("\n");
66
+ }
67
+ function generateProviderDocs(def) {
68
+ const lines = [];
69
+ lines.push("## Provider");
70
+ lines.push("");
71
+ lines.push(`**Category:** ${def.category}`);
72
+ lines.push("");
73
+ if (def.configSchema && Object.keys(def.configSchema).length > 0) {
74
+ lines.push("### Config Schema");
75
+ lines.push("");
76
+ lines.push(`| Field | Type | Label | Required | Secret |`);
77
+ lines.push(`| --- | --- | --- | --- | --- |`);
78
+ for (const [key, schema] of Object.entries(def.configSchema)) {
79
+ const req = schema.required === true ? "Yes" : "No";
80
+ const secret = schema.secret === true ? "Yes" : "No";
81
+ lines.push(`| ${key} | \`${schema.type}\` | ${escapeMarkdown(schema.label)} | ${req} | ${secret} |`);
82
+ }
83
+ lines.push("");
84
+ }
85
+ return lines.join("\n");
86
+ }
87
+ function generateWidgetDocs(def) {
88
+ const lines = [];
89
+ lines.push("## Widget");
90
+ lines.push("");
91
+ lines.push(`| Property | Value |`);
92
+ lines.push(`| --- | --- |`);
93
+ lines.push(`| Name | \`${def.name}\` |`);
94
+ lines.push(`| Label | ${escapeMarkdown(def.label)} |`);
95
+ lines.push(`| Compatible Types | ${def.compatibleTypes.map(t => `\`${t}\``).join(", ")} |`);
96
+ lines.push(`| Component Path | \`${def.componentPath}\` |`);
97
+ lines.push("");
98
+ return lines.join("\n");
99
+ }
100
+ /**
101
+ * Generate Markdown documentation from a plugin definition.
102
+ *
103
+ * The output includes YAML frontmatter with the plugin name, type, and version,
104
+ * followed by type-specific documentation sections.
105
+ */
106
+ export function generatePluginDocs(definition) {
107
+ const name = definition.name;
108
+ const type = definition.__supatype;
109
+ const version = definition.meta?.pluginApi ?? 1;
110
+ const frontmatter = [
111
+ "---",
112
+ `name: "${name}"`,
113
+ `type: "${type}"`,
114
+ `version: ${version}`,
115
+ "---",
116
+ ].join("\n");
117
+ const header = `# ${name}\n`;
118
+ let body;
119
+ switch (definition.__supatype) {
120
+ case "field":
121
+ body = generateFieldDocs(definition);
122
+ break;
123
+ case "composite":
124
+ body = generateCompositeDocs(definition);
125
+ break;
126
+ case "provider":
127
+ body = generateProviderDocs(definition);
128
+ break;
129
+ case "widget":
130
+ body = generateWidgetDocs(definition);
131
+ break;
132
+ }
133
+ return `${frontmatter}\n\n${header}\n${body}`;
134
+ }
135
+ //# sourceMappingURL=docgen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docgen.js","sourceRoot":"","sources":["../src/docgen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { PLUGIN_API_VERSION, type PluginType, type PluginMeta, type FieldTypeDefinition, type CompositeDefinition, type CompositeFieldDef, type ProviderDefinition, type ProviderCategory, type WidgetDefinition, type WidgetProps, type CommerceProvider, type TrackingProvider, type EmailProvider, type StorageProvider, type AuthProvider, type SSLProvider, } from "./types.js";
2
+ export { defineFieldType, defineComposite, defineProvider, defineWidget, isPluginDefinition, checkPluginApiVersion, type AnyPluginDefinition, } from "./define.js";
3
+ export { generatePluginDocs } from "./docgen.js";
4
+ export { registerPlugin, getRegisteredPlugins, getPluginsByType, getFieldTypePlugin, getProviderPlugin, clearPluginRegistry, isSupatypePlugin, sortByLoadOrder, detectConflicts, validateProviders, getPluginFieldTypeMap, getPluginFieldPgTypeMap, expandPluginComposites, type RegisteredPlugin, type PluginPackageInfo, type PluginConflict, type ProviderValidationResult, type FieldPgTypeInfo, type CompositeExpansion, } from "./loader.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,kBAAkB,EAClB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,WAAW,GACjB,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,eAAe,EACf,eAAe,EACf,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,KAAK,mBAAmB,GACzB,MAAM,aAAa,CAAA;AAGpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAGhD,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EACpB,KAAK,kBAAkB,GACxB,MAAM,aAAa,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ // @supatype/plugin-sdk — Plugin development kit for Supatype extensions
2
+ // Core types
3
+ export { PLUGIN_API_VERSION, } from "./types.js";
4
+ // Builder functions
5
+ export { defineFieldType, defineComposite, defineProvider, defineWidget, isPluginDefinition, checkPluginApiVersion, } from "./define.js";
6
+ // Documentation generator
7
+ export { generatePluginDocs } from "./docgen.js";
8
+ // Plugin loading and registry
9
+ export { registerPlugin, getRegisteredPlugins, getPluginsByType, getFieldTypePlugin, getProviderPlugin, clearPluginRegistry, isSupatypePlugin, sortByLoadOrder, detectConflicts, validateProviders, getPluginFieldTypeMap, getPluginFieldPgTypeMap, expandPluginComposites, } from "./loader.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wEAAwE;AAExE,aAAa;AACb,OAAO,EACL,kBAAkB,GAgBnB,MAAM,YAAY,CAAA;AAEnB,oBAAoB;AACpB,OAAO,EACL,eAAe,EACf,eAAe,EACf,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,GAEtB,MAAM,aAAa,CAAA;AAEpB,0BAA0B;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAEhD,8BAA8B;AAC9B,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,GAOvB,MAAM,aAAa,CAAA"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Plugin discovery and loading utilities.
3
+ *
4
+ * The plugin loader scans node_modules for packages with the `supatype-plugin`
5
+ * keyword or a `supatype` field in package.json, and auto-registers them.
6
+ */
7
+ import { type PluginMeta, type PluginType } from "./types.js";
8
+ import { type AnyPluginDefinition } from "./define.js";
9
+ export interface RegisteredPlugin {
10
+ packageName: string;
11
+ meta: PluginMeta;
12
+ definition: AnyPluginDefinition;
13
+ status: "active" | "inactive" | "incompatible";
14
+ incompatibleReason?: string | undefined;
15
+ }
16
+ /**
17
+ * Register a plugin definition.
18
+ */
19
+ export declare function registerPlugin(packageName: string, definition: AnyPluginDefinition): RegisteredPlugin;
20
+ /**
21
+ * Get all registered plugins.
22
+ */
23
+ export declare function getRegisteredPlugins(): RegisteredPlugin[];
24
+ /**
25
+ * Get plugins by type.
26
+ */
27
+ export declare function getPluginsByType(type: PluginType): RegisteredPlugin[];
28
+ /**
29
+ * Get a specific field type plugin by name.
30
+ */
31
+ export declare function getFieldTypePlugin(name: string): RegisteredPlugin | undefined;
32
+ /**
33
+ * Get a specific provider plugin by category and name.
34
+ */
35
+ export declare function getProviderPlugin(category: string, name: string): RegisteredPlugin | undefined;
36
+ /**
37
+ * Clear the plugin registry (for testing).
38
+ */
39
+ export declare function clearPluginRegistry(): void;
40
+ export interface PluginPackageInfo {
41
+ name: string;
42
+ version: string;
43
+ description: string;
44
+ supatype?: {
45
+ pluginApi?: number | undefined;
46
+ types?: PluginType[] | undefined;
47
+ } | undefined;
48
+ keywords?: string[] | undefined;
49
+ }
50
+ /**
51
+ * Check if a package.json represents a Supatype plugin.
52
+ */
53
+ export declare function isSupatypePlugin(pkg: PluginPackageInfo): boolean;
54
+ /**
55
+ * Sort plugins by load order: providers first, then fields & composites, then widgets.
56
+ */
57
+ export declare function sortByLoadOrder(plugins: RegisteredPlugin[]): RegisteredPlugin[];
58
+ export interface PluginConflict {
59
+ type: PluginType;
60
+ name: string;
61
+ packages: string[];
62
+ message: string;
63
+ }
64
+ /**
65
+ * Detect conflicts between a set of plugin definitions.
66
+ */
67
+ export declare function detectConflicts(plugins: Array<{
68
+ packageName: string;
69
+ definition: AnyPluginDefinition;
70
+ }>): PluginConflict[];
71
+ export interface ProviderValidationResult {
72
+ valid: boolean;
73
+ warnings: string[];
74
+ errors: string[];
75
+ }
76
+ /**
77
+ * Validate configured providers at push time.
78
+ *
79
+ * For each provider:
80
+ * - Checks the definition has a `create()` method
81
+ * - Checks required `configSchema` fields are present in the config
82
+ * - Warns about optional interface methods not implemented
83
+ */
84
+ export declare function validateProviders(configuredProviders: Array<{
85
+ name: string;
86
+ config?: Record<string, unknown> | undefined;
87
+ }>): ProviderValidationResult;
88
+ /**
89
+ * Returns a map of custom field type names to their declared `tsType` values
90
+ * from registered field type plugins. Consumed by the engine's type generator.
91
+ */
92
+ export declare function getPluginFieldTypeMap(): Map<string, string>;
93
+ export interface FieldPgTypeInfo {
94
+ pgType: string;
95
+ constraints?: string[] | undefined;
96
+ }
97
+ /**
98
+ * Returns a map of custom field type names to their Postgres type and optional
99
+ * constraints. Consumed by the engine's migration system.
100
+ */
101
+ export declare function getPluginFieldPgTypeMap(): Map<string, FieldPgTypeInfo>;
102
+ export interface CompositeExpansion {
103
+ fields: Array<{
104
+ name: string;
105
+ pgType: string;
106
+ required: boolean;
107
+ defaultValue?: unknown | undefined;
108
+ }>;
109
+ installSQL?: string | undefined;
110
+ uninstallSQL?: string | undefined;
111
+ }
112
+ /**
113
+ * Expand registered composite plugins into their concrete field definitions
114
+ * with resolved Postgres types.
115
+ *
116
+ * For each composite field, the type is resolved by:
117
+ * 1. Checking registered plugin field types (from getPluginFieldPgTypeMap)
118
+ * 2. Falling back to built-in type mappings
119
+ * 3. Defaulting to TEXT if no match is found
120
+ */
121
+ export declare function expandPluginComposites(): Map<string, CompositeExpansion>;
122
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}