@gorgo/medusa-integration 0.0.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.
- package/.medusa/server/src/admin/index.js +2259 -0
- package/.medusa/server/src/admin/index.mjs +2257 -0
- package/.medusa/server/src/api/admin/integrations/[provider_id]/enable/route.d.ts +5 -0
- package/.medusa/server/src/api/admin/integrations/[provider_id]/enable/route.js +17 -0
- package/.medusa/server/src/api/admin/integrations/[provider_id]/route.d.ts +7 -0
- package/.medusa/server/src/api/admin/integrations/[provider_id]/route.js +46 -0
- package/.medusa/server/src/api/admin/integrations/[provider_id]/test-connection/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/integrations/[provider_id]/test-connection/route.js +16 -0
- package/.medusa/server/src/api/admin/integrations/_helpers.d.ts +16 -0
- package/.medusa/server/src/api/admin/integrations/_helpers.js +52 -0
- package/.medusa/server/src/api/admin/integrations/middlewares.d.ts +2 -0
- package/.medusa/server/src/api/admin/integrations/middlewares.js +21 -0
- package/.medusa/server/src/api/admin/integrations/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/integrations/route.js +11 -0
- package/.medusa/server/src/api/admin/integrations/validators.d.ts +11 -0
- package/.medusa/server/src/api/admin/integrations/validators.js +15 -0
- package/.medusa/server/src/api/middlewares.d.ts +2 -0
- package/.medusa/server/src/api/middlewares.js +10 -0
- package/.medusa/server/src/index.d.ts +10 -0
- package/.medusa/server/src/index.js +22 -0
- package/.medusa/server/src/jobs/test-integration-connections.d.ts +16 -0
- package/.medusa/server/src/jobs/test-integration-connections.js +53 -0
- package/.medusa/server/src/modules/integration/descriptor/__tests__/build-zod.unit.spec.d.ts +1 -0
- package/.medusa/server/src/modules/integration/descriptor/__tests__/build-zod.unit.spec.js +64 -0
- package/.medusa/server/src/modules/integration/descriptor/__tests__/define.unit.spec.d.ts +1 -0
- package/.medusa/server/src/modules/integration/descriptor/__tests__/define.unit.spec.js +41 -0
- package/.medusa/server/src/modules/integration/descriptor/__tests__/introspect.unit.spec.d.ts +1 -0
- package/.medusa/server/src/modules/integration/descriptor/__tests__/introspect.unit.spec.js +93 -0
- package/.medusa/server/src/modules/integration/descriptor/__tests__/validate.unit.spec.d.ts +1 -0
- package/.medusa/server/src/modules/integration/descriptor/__tests__/validate.unit.spec.js +64 -0
- package/.medusa/server/src/modules/integration/descriptor/build-zod.d.ts +8 -0
- package/.medusa/server/src/modules/integration/descriptor/build-zod.js +82 -0
- package/.medusa/server/src/modules/integration/descriptor/define.d.ts +74 -0
- package/.medusa/server/src/modules/integration/descriptor/define.js +31 -0
- package/.medusa/server/src/modules/integration/descriptor/index.d.ts +5 -0
- package/.medusa/server/src/modules/integration/descriptor/index.js +22 -0
- package/.medusa/server/src/modules/integration/descriptor/introspect.d.ts +5 -0
- package/.medusa/server/src/modules/integration/descriptor/introspect.js +67 -0
- package/.medusa/server/src/modules/integration/descriptor/meta.d.ts +7 -0
- package/.medusa/server/src/modules/integration/descriptor/meta.js +3 -0
- package/.medusa/server/src/modules/integration/descriptor/option.d.ts +104 -0
- package/.medusa/server/src/modules/integration/descriptor/option.js +3 -0
- package/.medusa/server/src/modules/integration/descriptor/validate.d.ts +29 -0
- package/.medusa/server/src/modules/integration/descriptor/validate.js +69 -0
- package/.medusa/server/src/modules/integration/index.d.ts +22 -0
- package/.medusa/server/src/modules/integration/index.js +15 -0
- package/.medusa/server/src/modules/integration/loaders/index.d.ts +1 -0
- package/.medusa/server/src/modules/integration/loaders/index.js +9 -0
- package/.medusa/server/src/modules/integration/loaders/load-providers.d.ts +5 -0
- package/.medusa/server/src/modules/integration/loaders/load-providers.js +35 -0
- package/.medusa/server/src/modules/integration/migrations/Migration20260610215533.d.ts +5 -0
- package/.medusa/server/src/modules/integration/migrations/Migration20260610215533.js +18 -0
- package/.medusa/server/src/modules/integration/migrations/Migration20260618154037.d.ts +5 -0
- package/.medusa/server/src/modules/integration/migrations/Migration20260618154037.js +27 -0
- package/.medusa/server/src/modules/integration/migrations/Migration20260622120502.d.ts +5 -0
- package/.medusa/server/src/modules/integration/migrations/Migration20260622120502.js +14 -0
- package/.medusa/server/src/modules/integration/migrations/Migration20260701095518.d.ts +5 -0
- package/.medusa/server/src/modules/integration/migrations/Migration20260701095518.js +14 -0
- package/.medusa/server/src/modules/integration/migrations/Migration20260708072033.d.ts +5 -0
- package/.medusa/server/src/modules/integration/migrations/Migration20260708072033.js +14 -0
- package/.medusa/server/src/modules/integration/models/integration.d.ts +13 -0
- package/.medusa/server/src/modules/integration/models/integration.js +27 -0
- package/.medusa/server/src/modules/integration/services/__tests__/crypto.unit.spec.d.ts +1 -0
- package/.medusa/server/src/modules/integration/services/__tests__/crypto.unit.spec.js +33 -0
- package/.medusa/server/src/modules/integration/services/__tests__/integration-provider.unit.spec.d.ts +1 -0
- package/.medusa/server/src/modules/integration/services/__tests__/integration-provider.unit.spec.js +77 -0
- package/.medusa/server/src/modules/integration/services/__tests__/secrets.unit.spec.d.ts +1 -0
- package/.medusa/server/src/modules/integration/services/__tests__/secrets.unit.spec.js +33 -0
- package/.medusa/server/src/modules/integration/services/crypto.d.ts +10 -0
- package/.medusa/server/src/modules/integration/services/crypto.js +41 -0
- package/.medusa/server/src/modules/integration/services/index.d.ts +3 -0
- package/.medusa/server/src/modules/integration/services/index.js +11 -0
- package/.medusa/server/src/modules/integration/services/integration-module.d.ts +113 -0
- package/.medusa/server/src/modules/integration/services/integration-module.js +219 -0
- package/.medusa/server/src/modules/integration/services/integration-provider.d.ts +49 -0
- package/.medusa/server/src/modules/integration/services/integration-provider.js +76 -0
- package/.medusa/server/src/modules/integration/services/secrets.d.ts +11 -0
- package/.medusa/server/src/modules/integration/services/secrets.js +31 -0
- package/.medusa/server/src/modules/integration/types/index.d.ts +13 -0
- package/.medusa/server/src/modules/integration/types/index.js +10 -0
- package/.medusa/server/src/modules/integration/utils/abstract-integration-provider.d.ts +39 -0
- package/.medusa/server/src/modules/integration/utils/abstract-integration-provider.js +42 -0
- package/.medusa/server/src/modules/integration/utils/index.d.ts +1 -0
- package/.medusa/server/src/modules/integration/utils/index.js +6 -0
- package/.medusa/server/src/subscribers/invalidate-options-cache.d.ts +5 -0
- package/.medusa/server/src/subscribers/invalidate-options-cache.js +13 -0
- package/.medusa/server/src/types/bundles.d.ts +1 -0
- package/.medusa/server/src/types/bundles.js +38 -0
- package/.medusa/server/src/types/http/index.d.ts +1 -0
- package/.medusa/server/src/types/http/index.js +18 -0
- package/.medusa/server/src/types/http/integration/admin/entities.d.ts +32 -0
- package/.medusa/server/src/types/http/integration/admin/entities.js +3 -0
- package/.medusa/server/src/types/http/integration/admin/index.d.ts +2 -0
- package/.medusa/server/src/types/http/integration/admin/index.js +19 -0
- package/.medusa/server/src/types/http/integration/admin/responses.d.ts +19 -0
- package/.medusa/server/src/types/http/integration/admin/responses.js +3 -0
- package/.medusa/server/src/types/http/integration/index.d.ts +1 -0
- package/.medusa/server/src/types/http/integration/index.js +18 -0
- package/.medusa/server/src/types/index.d.ts +3 -0
- package/.medusa/server/src/types/index.js +20 -0
- package/.medusa/server/src/types/integration/common.d.ts +70 -0
- package/.medusa/server/src/types/integration/common.js +3 -0
- package/.medusa/server/src/types/integration/index.d.ts +1 -0
- package/.medusa/server/src/types/integration/index.js +18 -0
- package/.medusa/server/src/workflows/integration/index.d.ts +2 -0
- package/.medusa/server/src/workflows/integration/index.js +19 -0
- package/.medusa/server/src/workflows/integration/steps/apply-integration-section.d.ts +22 -0
- package/.medusa/server/src/workflows/integration/steps/apply-integration-section.js +70 -0
- package/.medusa/server/src/workflows/integration/steps/delete-integration-record.d.ts +6 -0
- package/.medusa/server/src/workflows/integration/steps/delete-integration-record.js +16 -0
- package/.medusa/server/src/workflows/integration/steps/emit-integration-event.d.ts +5 -0
- package/.medusa/server/src/workflows/integration/steps/emit-integration-event.js +11 -0
- package/.medusa/server/src/workflows/integration/steps/index.d.ts +6 -0
- package/.medusa/server/src/workflows/integration/steps/index.js +16 -0
- package/.medusa/server/src/workflows/integration/steps/run-test-connection.d.ts +4 -0
- package/.medusa/server/src/workflows/integration/steps/run-test-connection.js +20 -0
- package/.medusa/server/src/workflows/integration/steps/set-integration-enabled.d.ts +19 -0
- package/.medusa/server/src/workflows/integration/steps/set-integration-enabled.js +27 -0
- package/.medusa/server/src/workflows/integration/steps/upsert-integration-record.d.ts +9 -0
- package/.medusa/server/src/workflows/integration/steps/upsert-integration-record.js +18 -0
- package/.medusa/server/src/workflows/integration/workflows/delete-integration.d.ts +7 -0
- package/.medusa/server/src/workflows/integration/workflows/delete-integration.js +18 -0
- package/.medusa/server/src/workflows/integration/workflows/index.d.ts +4 -0
- package/.medusa/server/src/workflows/integration/workflows/index.js +12 -0
- package/.medusa/server/src/workflows/integration/workflows/set-integration-enabled.d.ts +20 -0
- package/.medusa/server/src/workflows/integration/workflows/set-integration-enabled.js +20 -0
- package/.medusa/server/src/workflows/integration/workflows/test-integration-connection.d.ts +5 -0
- package/.medusa/server/src/workflows/integration/workflows/test-integration-connection.js +21 -0
- package/.medusa/server/src/workflows/integration/workflows/upsert-integration.d.ts +8 -0
- package/.medusa/server/src/workflows/integration/workflows/upsert-integration.js +30 -0
- package/LICENSE +21 -0
- package/README.md +46 -0
- package/package.json +79 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const globals_1 = require("@jest/globals");
|
|
4
|
+
const introspect_1 = require("../introspect");
|
|
5
|
+
const define_1 = require("../define");
|
|
6
|
+
const base = (0, define_1.defineIntegration)({
|
|
7
|
+
module: "payment",
|
|
8
|
+
displayName: "demo.name",
|
|
9
|
+
options: {
|
|
10
|
+
login: { type: "string", required: true, minLength: 1, control: "text", label: "demo.fields.login" },
|
|
11
|
+
password: { type: "string", required: true, minLength: 1, secret: true, control: "secret", label: "demo.fields.password" },
|
|
12
|
+
test_mode: { type: "boolean", default: false, control: "switch", label: "demo.fields.test_mode" },
|
|
13
|
+
region: {
|
|
14
|
+
type: "enum",
|
|
15
|
+
values: ["eu", "us"],
|
|
16
|
+
valueLabels: { eu: "demo.region.eu", us: "demo.region.us" },
|
|
17
|
+
control: "select",
|
|
18
|
+
label: "demo.fields.region",
|
|
19
|
+
visibleWhen: { field: "test_mode", equals: true },
|
|
20
|
+
},
|
|
21
|
+
webhooks: { type: "json", default: [], control: "json", label: "demo.fields.webhooks" },
|
|
22
|
+
secretToken: { type: "string", secret: true, label: "demo.fields.secretToken" },
|
|
23
|
+
},
|
|
24
|
+
sections: [
|
|
25
|
+
{ id: "general", title: "demo.sections.general", options: ["login", "password"] },
|
|
26
|
+
{ id: "behavior", title: "demo.sections.behavior", options: ["test_mode", "region", "webhooks"] },
|
|
27
|
+
],
|
|
28
|
+
});
|
|
29
|
+
const descriptor = { ...base, pluginId: "demo", instanceId: null };
|
|
30
|
+
(0, globals_1.describe)("introspect", () => {
|
|
31
|
+
(0, globals_1.it)("groups referenced options by section, omits catalog-only options", () => {
|
|
32
|
+
const ui = (0, introspect_1.introspectDescriptor)(descriptor);
|
|
33
|
+
(0, globals_1.expect)(ui.sections.map((s) => s.id)).toEqual(["general", "behavior"]);
|
|
34
|
+
(0, globals_1.expect)(ui.sections[1].fields.map((f) => f.name)).toEqual(["test_mode", "region", "webhooks"]);
|
|
35
|
+
(0, globals_1.expect)(ui.sections.flatMap((s) => s.fields.map((f) => f.name))).not.toContain("secretToken");
|
|
36
|
+
});
|
|
37
|
+
(0, globals_1.it)("required vs optional derived from the def (default/required, no zod)", () => {
|
|
38
|
+
const ui = (0, introspect_1.introspectDescriptor)(descriptor);
|
|
39
|
+
(0, globals_1.expect)(ui.sections[0].fields.find((f) => f.name === "login").required).toBe(true);
|
|
40
|
+
(0, globals_1.expect)(ui.sections[1].fields.find((f) => f.name === "test_mode").required).toBe(false); // has default
|
|
41
|
+
});
|
|
42
|
+
(0, globals_1.it)("surfaces control, enum options + labels, visibleWhen, json control", () => {
|
|
43
|
+
const ui = (0, introspect_1.introspectDescriptor)(descriptor);
|
|
44
|
+
const region = ui.sections[1].fields.find((f) => f.name === "region");
|
|
45
|
+
(0, globals_1.expect)(region.control).toBe("select");
|
|
46
|
+
(0, globals_1.expect)(region.options).toEqual(["eu", "us"]);
|
|
47
|
+
(0, globals_1.expect)(region.optionLabels).toEqual({ eu: "demo.region.eu", us: "demo.region.us" });
|
|
48
|
+
(0, globals_1.expect)(region.visibleWhen).toEqual({ field: "test_mode", equals: true });
|
|
49
|
+
(0, globals_1.expect)(ui.sections[1].fields.find((f) => f.name === "webhooks").control).toBe("json");
|
|
50
|
+
});
|
|
51
|
+
(0, globals_1.it)("lists every secret option name (including catalog-only)", () => {
|
|
52
|
+
(0, globals_1.expect)((0, introspect_1.secretFieldNames)(descriptor).sort()).toEqual(["password", "secretToken"]);
|
|
53
|
+
});
|
|
54
|
+
(0, globals_1.it)("is JSON-serializable (no functions/zod refs)", () => {
|
|
55
|
+
(0, globals_1.expect)(() => JSON.stringify((0, introspect_1.introspectDescriptor)(descriptor))).not.toThrow();
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
(0, globals_1.describe)("introspect readonly", () => {
|
|
59
|
+
const base = (0, define_1.defineIntegration)({
|
|
60
|
+
module: "payment",
|
|
61
|
+
displayName: "demo.name",
|
|
62
|
+
options: {
|
|
63
|
+
endpoint: {
|
|
64
|
+
type: "url",
|
|
65
|
+
readonly: true,
|
|
66
|
+
default: "https://api.example.com/hook",
|
|
67
|
+
control: "url",
|
|
68
|
+
label: "demo.fields.endpoint",
|
|
69
|
+
},
|
|
70
|
+
apiSecret: {
|
|
71
|
+
type: "string",
|
|
72
|
+
readonly: true,
|
|
73
|
+
secret: true,
|
|
74
|
+
default: "shh",
|
|
75
|
+
label: "demo.fields.apiSecret",
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
sections: [{ id: "s", title: "t", options: ["endpoint", "apiSecret"] }],
|
|
79
|
+
});
|
|
80
|
+
const roDescriptor = { ...base, pluginId: "demo", instanceId: null };
|
|
81
|
+
(0, globals_1.it)("surfaces readonly + readonlyValue (the default) for a non-secret constant", () => {
|
|
82
|
+
const f = (0, introspect_1.introspectDescriptor)(roDescriptor).sections[0].fields.find((x) => x.name === "endpoint");
|
|
83
|
+
(0, globals_1.expect)(f.readonly).toBe(true);
|
|
84
|
+
(0, globals_1.expect)(f.readonlyValue).toBe("https://api.example.com/hook");
|
|
85
|
+
});
|
|
86
|
+
(0, globals_1.it)("never exposes a secret readonly option's default", () => {
|
|
87
|
+
const f = (0, introspect_1.introspectDescriptor)(roDescriptor).sections[0].fields.find((x) => x.name === "apiSecret");
|
|
88
|
+
(0, globals_1.expect)(f.readonly).toBe(true);
|
|
89
|
+
(0, globals_1.expect)(f.secret).toBe(true);
|
|
90
|
+
(0, globals_1.expect)(f.readonlyValue).toBeUndefined();
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50cm9zcGVjdC51bml0LnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9pbnRlZ3JhdGlvbi9kZXNjcmlwdG9yL19fdGVzdHNfXy9pbnRyb3NwZWN0LnVuaXQuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDJDQUFvRDtBQUNwRCw4Q0FBc0U7QUFDdEUsc0NBQTZDO0FBRzdDLE1BQU0sSUFBSSxHQUFHLElBQUEsMEJBQWlCLEVBQUM7SUFDN0IsTUFBTSxFQUFFLFNBQVM7SUFDakIsV0FBVyxFQUFFLFdBQVc7SUFDeEIsT0FBTyxFQUFFO1FBQ1AsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUU7UUFDcEcsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxzQkFBc0IsRUFBRTtRQUMxSCxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUU7UUFDakcsTUFBTSxFQUFFO1lBQ04sSUFBSSxFQUFFLE1BQU07WUFDWixNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO1lBQ3BCLFdBQVcsRUFBRSxFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUU7WUFDM0QsT0FBTyxFQUFFLFFBQVE7WUFDakIsS0FBSyxFQUFFLG9CQUFvQjtZQUMzQixXQUFXLEVBQUUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7U0FDbEQ7UUFDRCxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsc0JBQXNCLEVBQUU7UUFDdkYsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSx5QkFBeUIsRUFBRTtLQUNoRjtJQUNELFFBQVEsRUFBRTtRQUNSLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxFQUFFO1FBQ2pGLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsT0FBTyxFQUFFLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsRUFBRTtLQUNsRztDQUNGLENBQUMsQ0FBQTtBQUNGLE1BQU0sVUFBVSxHQUEwQixFQUFFLEdBQUcsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFBO0FBRXpGLElBQUEsa0JBQVEsRUFBQyxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzFCLElBQUEsWUFBRSxFQUFDLGtFQUFrRSxFQUFFLEdBQUcsRUFBRTtRQUMxRSxNQUFNLEVBQUUsR0FBRyxJQUFBLGlDQUFvQixFQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzNDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUE7UUFDckUsSUFBQSxnQkFBTSxFQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFBO1FBQzdGLElBQUEsZ0JBQU0sRUFBQyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUM5RixDQUFDLENBQUMsQ0FBQTtJQUVGLElBQUEsWUFBRSxFQUFDLHNFQUFzRSxFQUFFLEdBQUcsRUFBRTtRQUM5RSxNQUFNLEVBQUUsR0FBRyxJQUFBLGlDQUFvQixFQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzNDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2xGLElBQUEsZ0JBQU0sRUFBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBLENBQUMsY0FBYztJQUN4RyxDQUFDLENBQUMsQ0FBQTtJQUVGLElBQUEsWUFBRSxFQUFDLG9FQUFvRSxFQUFFLEdBQUcsRUFBRTtRQUM1RSxNQUFNLEVBQUUsR0FBRyxJQUFB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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const globals_1 = require("@jest/globals");
|
|
4
|
+
const define_1 = require("../define");
|
|
5
|
+
const validate_1 = require("../validate");
|
|
6
|
+
const requiredWhenCapture = (v, c) => {
|
|
7
|
+
if (c.options.capture && (v == null || v === ""))
|
|
8
|
+
c.addIssue({ message: "required when capture is on" });
|
|
9
|
+
};
|
|
10
|
+
const base = (0, define_1.defineIntegration)({
|
|
11
|
+
module: "payment",
|
|
12
|
+
displayName: "demo.name",
|
|
13
|
+
options: {
|
|
14
|
+
terminalKey: { type: "string", required: true, minLength: 1, label: "l" },
|
|
15
|
+
password: { type: "string", required: true, minLength: 1, secret: true, label: "l" },
|
|
16
|
+
capture: { type: "boolean", default: true, label: "l" },
|
|
17
|
+
// per-option cross-field rule (references a sibling)
|
|
18
|
+
fallbackKey: { type: "string", label: "l", validate: requiredWhenCapture },
|
|
19
|
+
},
|
|
20
|
+
sections: [
|
|
21
|
+
{ id: "credentials", title: "t", options: ["terminalKey", "password"] },
|
|
22
|
+
{ id: "behavior", title: "t", options: ["capture", "fallbackKey"] },
|
|
23
|
+
],
|
|
24
|
+
// cross-section rule (spans credentials + behavior)
|
|
25
|
+
validate: (full, ctx) => {
|
|
26
|
+
if (full.capture && !full.terminalKey)
|
|
27
|
+
ctx.addIssue({ path: ["terminalKey"], message: "terminalKey required when capture is on" });
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
const descriptor = { ...base, pluginId: "demo", instanceId: null };
|
|
31
|
+
(0, globals_1.describe)("validateOptions", () => {
|
|
32
|
+
(0, globals_1.it)("validates only the submitted ids and applies their defaults", () => {
|
|
33
|
+
const res = (0, validate_1.validateOptions)(descriptor, ["capture"], { capture: undefined });
|
|
34
|
+
(0, globals_1.expect)(res.success).toBe(true);
|
|
35
|
+
if (res.success)
|
|
36
|
+
(0, globals_1.expect)(res.data.capture).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
(0, globals_1.it)("reports zod issues for a submitted id", () => {
|
|
39
|
+
const res = (0, validate_1.validateOptions)(descriptor, ["terminalKey"], { terminalKey: "" });
|
|
40
|
+
(0, globals_1.expect)(res.success).toBe(false);
|
|
41
|
+
if (!res.success)
|
|
42
|
+
(0, globals_1.expect)(res.issues.map((i) => i.path)).toContain("terminalKey");
|
|
43
|
+
});
|
|
44
|
+
(0, globals_1.it)("runs a per-option validate against the merged siblings", () => {
|
|
45
|
+
// fallbackKey blank + capture true → per-option rule fires
|
|
46
|
+
const res = (0, validate_1.validateOptions)(descriptor, ["fallbackKey"], { fallbackKey: "", capture: true });
|
|
47
|
+
(0, globals_1.expect)(res.success).toBe(false);
|
|
48
|
+
if (!res.success)
|
|
49
|
+
(0, globals_1.expect)(res.issues.map((i) => i.path)).toContain("fallbackKey");
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
(0, globals_1.describe)("isDescriptorComplete / collectValidationIssues", () => {
|
|
53
|
+
(0, globals_1.it)("is incomplete when a required field (any option) is missing", () => {
|
|
54
|
+
(0, globals_1.expect)((0, validate_1.isDescriptorComplete)(descriptor, { terminalKey: "t" })).toBe(false); // password + fallbackKey rule
|
|
55
|
+
});
|
|
56
|
+
(0, globals_1.it)("is complete when all required present, defaults fill the rest, and rules pass", () => {
|
|
57
|
+
(0, globals_1.expect)((0, validate_1.isDescriptorComplete)(descriptor, { terminalKey: "t", password: "p", fallbackKey: "f" })).toBe(true);
|
|
58
|
+
});
|
|
59
|
+
(0, globals_1.it)("runs the cross-section validate rule", () => {
|
|
60
|
+
const issues = (0, validate_1.collectValidationIssues)(descriptor, { password: "p", capture: true, fallbackKey: "f" });
|
|
61
|
+
(0, globals_1.expect)(issues.some((i) => i.path === "terminalKey")).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUudW5pdC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvaW50ZWdyYXRpb24vZGVzY3JpcHRvci9fX3Rlc3RzX18vdmFsaWRhdGUudW5pdC5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMkNBQW9EO0FBQ3BELHNDQUE2QztBQUU3QywwQ0FBNEY7QUFFNUYsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQVUsRUFBRSxDQUFNLEVBQUUsRUFBRTtJQUNqRCxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxDQUFDLENBQUE7QUFDMUcsQ0FBQyxDQUFBO0FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBQSwwQkFBaUIsRUFBQztJQUM3QixNQUFNLEVBQUUsU0FBUztJQUNqQixXQUFXLEVBQUUsV0FBVztJQUN4QixPQUFPLEVBQUU7UUFDUCxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO1FBQ3pFLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtRQUNwRixPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtRQUN2RCxxREFBcUQ7UUFDckQsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVB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
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { z } from "@medusajs/deps/zod";
|
|
2
|
+
import type { OptionDef } from "./option";
|
|
3
|
+
/**
|
|
4
|
+
* Build a zod schema for one option from our declarative properties. Presence: an option is
|
|
5
|
+
* OPTIONAL unless `required: true`; a `default` makes it always-present (and satisfies required).
|
|
6
|
+
* `json` is opaque (`z.unknown()`) — its shape is checked by the option's imperative `validate`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function optionToZod(def: OptionDef): z.ZodType;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.optionToZod = optionToZod;
|
|
4
|
+
const zod_1 = require("@medusajs/deps/zod");
|
|
5
|
+
/**
|
|
6
|
+
* Build a zod schema for one option from our declarative properties. Presence: an option is
|
|
7
|
+
* OPTIONAL unless `required: true`; a `default` makes it always-present (and satisfies required).
|
|
8
|
+
* `json` is opaque (`z.unknown()`) — its shape is checked by the option's imperative `validate`.
|
|
9
|
+
*/
|
|
10
|
+
function optionToZod(def) {
|
|
11
|
+
let base;
|
|
12
|
+
switch (def.type) {
|
|
13
|
+
case "string": {
|
|
14
|
+
let s = zod_1.z.string();
|
|
15
|
+
if (def.minLength != null)
|
|
16
|
+
s = s.min(def.minLength);
|
|
17
|
+
if (def.maxLength != null)
|
|
18
|
+
s = s.max(def.maxLength);
|
|
19
|
+
if (def.pattern != null)
|
|
20
|
+
s = s.regex(new RegExp(def.pattern));
|
|
21
|
+
base = s;
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
case "url": {
|
|
25
|
+
// Restrict the scheme when `protocols` is given (e.g. ["https"] → protocol /^(?:https)$/).
|
|
26
|
+
const protocol = def.protocols && def.protocols.length > 0
|
|
27
|
+
? new RegExp(`^(?:${def.protocols.join("|")})$`)
|
|
28
|
+
: undefined;
|
|
29
|
+
base = protocol ? zod_1.z.url({ protocol }) : zod_1.z.url();
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
case "email": {
|
|
33
|
+
base = zod_1.z.email();
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
case "uuid": {
|
|
37
|
+
base = zod_1.z.uuid();
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
case "number": {
|
|
41
|
+
let n = zod_1.z.number();
|
|
42
|
+
if (def.int)
|
|
43
|
+
n = n.int();
|
|
44
|
+
if (def.positive)
|
|
45
|
+
n = n.positive();
|
|
46
|
+
if (def.nonnegative)
|
|
47
|
+
n = n.nonnegative();
|
|
48
|
+
if (def.multipleOf != null)
|
|
49
|
+
n = n.multipleOf(def.multipleOf);
|
|
50
|
+
if (def.min != null)
|
|
51
|
+
n = n.min(def.min);
|
|
52
|
+
if (def.max != null)
|
|
53
|
+
n = n.max(def.max);
|
|
54
|
+
base = n;
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
case "boolean":
|
|
58
|
+
base = zod_1.z.boolean();
|
|
59
|
+
break;
|
|
60
|
+
case "enum":
|
|
61
|
+
base = zod_1.z.enum(def.values);
|
|
62
|
+
break;
|
|
63
|
+
case "json": {
|
|
64
|
+
// Opaque JSON; presence handled here (z.unknown() otherwise accepts undefined).
|
|
65
|
+
if (def.default !== undefined)
|
|
66
|
+
return zod_1.z.unknown().default(def.default);
|
|
67
|
+
if (def.required)
|
|
68
|
+
return zod_1.z.unknown().refine((v) => v !== undefined, { message: "Required" });
|
|
69
|
+
return zod_1.z.unknown().optional();
|
|
70
|
+
}
|
|
71
|
+
default: {
|
|
72
|
+
const _never = def;
|
|
73
|
+
throw new Error(`Unsupported option type: ${JSON.stringify(_never)}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (def.default !== undefined)
|
|
77
|
+
return base.default(def.default);
|
|
78
|
+
if (!def.required)
|
|
79
|
+
return base.optional();
|
|
80
|
+
return base;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtem9kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvaW50ZWdyYXRpb24vZGVzY3JpcHRvci9idWlsZC16b2QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFRQSxrQ0E0REM7QUFwRUQsNENBQXNDO0FBR3RDOzs7O0dBSUc7QUFDSCxTQUFnQixXQUFXLENBQUMsR0FBYztJQUN4QyxJQUFJLElBQWUsQ0FBQTtJQUNuQixRQUFRLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQixLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsR0FBRyxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUE7WUFDbEIsSUFBSSxHQUFHLENBQUMsU0FBUyxJQUFJLElBQUk7Z0JBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQ25ELElBQUksR0FBRyxDQUFDLFNBQVMsSUFBSSxJQUFJO2dCQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUNuRCxJQUFJLEdBQUcsQ0FBQyxPQUFPLElBQUksSUFBSTtnQkFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtZQUM3RCxJQUFJLEdBQUcsQ0FBQyxDQUFBO1lBQ1IsTUFBSztRQUNQLENBQUM7UUFDRCxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDWCwyRkFBMkY7WUFDM0YsTUFBTSxRQUFRLEdBQ1osR0FBRyxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUN2QyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFH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
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { z } from "@medusajs/deps/zod";
|
|
2
|
+
import type { I18nKey } from "./meta";
|
|
3
|
+
import type { OptionDef, Settings } from "./option";
|
|
4
|
+
import type { IntegrationLayouts, ModuleKind, TestConnectionContext, TestConnectionResult } from "../../../types";
|
|
5
|
+
export { z };
|
|
6
|
+
export type { ModuleKind, TestConnectionContext, TestConnectionResult };
|
|
7
|
+
export type { OptionDef, OptionValidateContext, OptionValue, Settings } from "./option";
|
|
8
|
+
/** One configuration section — references options by id from the descriptor's catalog. */
|
|
9
|
+
export type IntegrationSection = {
|
|
10
|
+
id: string;
|
|
11
|
+
/** i18n key for the section title (resolved admin-side). */
|
|
12
|
+
title: I18nKey;
|
|
13
|
+
/** Ordered option ids drawn into this section's auto-generated card/drawer. */
|
|
14
|
+
options: readonly string[];
|
|
15
|
+
/** Which column to render this section in (two-column layout). Defaults to `"main"`. */
|
|
16
|
+
column?: "main" | "side";
|
|
17
|
+
};
|
|
18
|
+
/** Issue raised by the cross-section `validate` rule. */
|
|
19
|
+
export type IntegrationValidateIssue = {
|
|
20
|
+
path?: (string | number)[];
|
|
21
|
+
message: string;
|
|
22
|
+
};
|
|
23
|
+
export type IntegrationValidateContext = {
|
|
24
|
+
addIssue: (issue: IntegrationValidateIssue) => void;
|
|
25
|
+
};
|
|
26
|
+
type DescriptorBase = {
|
|
27
|
+
/** Which Medusa module this integration configures (payment, fulfillment, …). */
|
|
28
|
+
module: ModuleKind;
|
|
29
|
+
optionsVersion?: number;
|
|
30
|
+
displayName: I18nKey;
|
|
31
|
+
description?: I18nKey;
|
|
32
|
+
icon?: string;
|
|
33
|
+
docsUrl?: string;
|
|
34
|
+
supportsMultipleInstances?: boolean;
|
|
35
|
+
preferredLayoutId?: IntegrationLayouts;
|
|
36
|
+
};
|
|
37
|
+
type CrossSectionRules = {
|
|
38
|
+
/**
|
|
39
|
+
* Rules that span MORE THAN ONE section. Evaluated only during full (activation)
|
|
40
|
+
* validation, against the assembled config. Intra-option rules belong on that option's
|
|
41
|
+
* own `validate` so they also run when the option is saved.
|
|
42
|
+
*/
|
|
43
|
+
validate?: (full: Record<string, unknown>, ctx: IntegrationValidateContext) => void;
|
|
44
|
+
};
|
|
45
|
+
/** What `defineIntegration` returns (and what a provider's `getDescriptor()` returns). */
|
|
46
|
+
export type IntegrationDescriptorInput = DescriptorBase & CrossSectionRules & {
|
|
47
|
+
/** Flat catalog: single source of truth for every option (type/validation/UI/secret). */
|
|
48
|
+
options: Record<string, OptionDef>;
|
|
49
|
+
/** Composed from `options` by `defineIntegration` — for `z.infer`, defaults, full validation. */
|
|
50
|
+
optionsSchema: z.ZodType<any>;
|
|
51
|
+
sections: readonly IntegrationSection[];
|
|
52
|
+
};
|
|
53
|
+
export type IntegrationDescriptor = IntegrationDescriptorInput & {
|
|
54
|
+
/** Stamped by the registry from the provider's `static identifier`. */
|
|
55
|
+
pluginId: string;
|
|
56
|
+
/** Stamped from the registration id (null = single/default instance). */
|
|
57
|
+
instanceId?: string | null;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Declare an integration's configuration as a flat option catalog plus sections that
|
|
61
|
+
* reference option ids. The composed `optionsSchema` (for `z.infer` + defaults + full
|
|
62
|
+
* validation) is built automatically:
|
|
63
|
+
*
|
|
64
|
+
* const descriptor = defineIntegration({ module, displayName, options: {...}, sections: [...] })
|
|
65
|
+
* type Settings = z.infer<typeof descriptor.optionsSchema>
|
|
66
|
+
*/
|
|
67
|
+
export declare function defineIntegration<const O extends Record<string, OptionDef>>(input: DescriptorBase & CrossSectionRules & {
|
|
68
|
+
options: O;
|
|
69
|
+
sections: readonly IntegrationSection[];
|
|
70
|
+
}): DescriptorBase & CrossSectionRules & {
|
|
71
|
+
options: O;
|
|
72
|
+
optionsSchema: z.ZodType<Settings<O>>;
|
|
73
|
+
sections: readonly IntegrationSection[];
|
|
74
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.z = void 0;
|
|
4
|
+
exports.defineIntegration = defineIntegration;
|
|
5
|
+
const zod_1 = require("@medusajs/deps/zod");
|
|
6
|
+
Object.defineProperty(exports, "z", { enumerable: true, get: function () { return zod_1.z; } });
|
|
7
|
+
const build_zod_1 = require("./build-zod");
|
|
8
|
+
/**
|
|
9
|
+
* Declare an integration's configuration as a flat option catalog plus sections that
|
|
10
|
+
* reference option ids. The composed `optionsSchema` (for `z.infer` + defaults + full
|
|
11
|
+
* validation) is built automatically:
|
|
12
|
+
*
|
|
13
|
+
* const descriptor = defineIntegration({ module, displayName, options: {...}, sections: [...] })
|
|
14
|
+
* type Settings = z.infer<typeof descriptor.optionsSchema>
|
|
15
|
+
*/
|
|
16
|
+
function defineIntegration(input) {
|
|
17
|
+
// Fail fast: every section option id must exist in the catalog.
|
|
18
|
+
for (const section of input.sections) {
|
|
19
|
+
for (const id of section.options) {
|
|
20
|
+
if (!Object.prototype.hasOwnProperty.call(input.options, id)) {
|
|
21
|
+
throw new Error(`Section "${section.id}" references unknown option "${id}"`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const shape = {};
|
|
26
|
+
for (const [id, def] of Object.entries(input.options))
|
|
27
|
+
shape[id] = (0, build_zod_1.optionToZod)(def);
|
|
28
|
+
const optionsSchema = zod_1.z.object(shape);
|
|
29
|
+
return { ...input, optionsSchema };
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvaW50ZWdyYXRpb24vZGVzY3JpcHRvci9kZWZpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBdUVBLDhDQXFCQztBQTVGRCw0Q0FBc0M7QUFNN0Isa0ZBTkEsT0FBQyxPQU1BO0FBSFYsMkNBQXlDO0FBNER6Qzs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQy9CLEtBQzZFO0lBTzdFLGdFQUFnRTtJQUNoRSxLQUFLLE1BQU0sT0FBTyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNyQyxLQUFLLE1BQU0sRUFBRSxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDN0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLE9BQU8sQ0FBQyxFQUFFLGdDQUFnQyxFQUFFLEdBQUcsQ0FBQyxDQUFBO1lBQzlFLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sS0FBSyxHQUE4QixFQUFFLENBQUE7SUFDM0MsS0FBSyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFBLHVCQUFXLEVBQUMsR0FBRyxDQUFDLENBQUE7SUFDbkYsTUFBTSxhQUFhLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQXNDLENBQUE7SUFDMUUsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLGFBQWEsRUFBRSxDQUFBO0FBQ3BDLENBQUMifQ==
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./define"), exports);
|
|
18
|
+
__exportStar(require("./option"), exports);
|
|
19
|
+
__exportStar(require("./build-zod"), exports);
|
|
20
|
+
__exportStar(require("./introspect"), exports);
|
|
21
|
+
__exportStar(require("./meta"), exports);
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9pbnRlZ3JhdGlvbi9kZXNjcmlwdG9yL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBd0I7QUFDeEIsMkNBQXdCO0FBQ3hCLDhDQUEyQjtBQUMzQiwrQ0FBNEI7QUFDNUIseUNBQXNCIn0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { IntegrationDescriptor } from "./define";
|
|
2
|
+
import type { UiField, UiSection, UiDescriptor } from "../../../types";
|
|
3
|
+
export type { UiField, UiSection, UiDescriptor };
|
|
4
|
+
export declare function secretFieldNames(descriptor: Pick<IntegrationDescriptor, "options">): string[];
|
|
5
|
+
export declare function introspectDescriptor(descriptor: IntegrationDescriptor, hasTestConnection?: boolean): UiDescriptor;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.secretFieldNames = secretFieldNames;
|
|
4
|
+
exports.introspectDescriptor = introspectDescriptor;
|
|
5
|
+
function controlFor(def) {
|
|
6
|
+
if (def.control)
|
|
7
|
+
return def.control;
|
|
8
|
+
switch (def.type) {
|
|
9
|
+
case "boolean": return "switch";
|
|
10
|
+
case "number": return "number";
|
|
11
|
+
case "enum": return "select";
|
|
12
|
+
case "json": return "json";
|
|
13
|
+
case "url": return "url";
|
|
14
|
+
default: return "text";
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function introspectField(name, def) {
|
|
18
|
+
return {
|
|
19
|
+
name,
|
|
20
|
+
control: controlFor(def),
|
|
21
|
+
secret: def.secret === true,
|
|
22
|
+
// UI-required: must be filled by the user (a `default` or an absent `required` → not required).
|
|
23
|
+
required: def.required === true && def.default === undefined,
|
|
24
|
+
label: def.label,
|
|
25
|
+
hint: def.hint,
|
|
26
|
+
placeholder: def.placeholder,
|
|
27
|
+
options: def.type === "enum" ? [...def.values] : undefined,
|
|
28
|
+
optionLabels: def.type === "enum" ? def.valueLabels : undefined,
|
|
29
|
+
visibleWhen: def.visibleWhen,
|
|
30
|
+
readonly: def.readonly,
|
|
31
|
+
// The constant to display; never expose a secret's default to the client.
|
|
32
|
+
readonlyValue: def.readonly && def.secret !== true ? def.default : undefined,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function introspectSection(section, options) {
|
|
36
|
+
return {
|
|
37
|
+
id: section.id,
|
|
38
|
+
title: section.title,
|
|
39
|
+
column: section.column ?? "main",
|
|
40
|
+
// Ignore ids missing from the options catalog (defineIntegration already rejects those at build).
|
|
41
|
+
fields: section.options
|
|
42
|
+
.filter((id) => Object.prototype.hasOwnProperty.call(options, id))
|
|
43
|
+
.map((id) => introspectField(id, options[id])),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function secretFieldNames(descriptor) {
|
|
47
|
+
return Object.entries(descriptor.options)
|
|
48
|
+
.filter(([, def]) => def.secret === true)
|
|
49
|
+
.map(([name]) => name);
|
|
50
|
+
}
|
|
51
|
+
function introspectDescriptor(descriptor, hasTestConnection = false) {
|
|
52
|
+
return {
|
|
53
|
+
module: descriptor.module,
|
|
54
|
+
pluginId: descriptor.pluginId,
|
|
55
|
+
instanceId: descriptor.instanceId ?? null,
|
|
56
|
+
optionsVersion: descriptor.optionsVersion ?? 1,
|
|
57
|
+
displayName: descriptor.displayName,
|
|
58
|
+
description: descriptor.description,
|
|
59
|
+
icon: descriptor.icon,
|
|
60
|
+
docsUrl: descriptor.docsUrl,
|
|
61
|
+
supportsMultipleInstances: descriptor.supportsMultipleInstances ?? false,
|
|
62
|
+
preferredLayoutId: descriptor.preferredLayoutId ?? "core:single-column",
|
|
63
|
+
hasTestConnection,
|
|
64
|
+
sections: descriptor.sections.map((s) => introspectSection(s, descriptor.options)),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50cm9zcGVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2ludGVncmF0aW9uL2Rlc2NyaXB0b3IvaW50cm9zcGVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQW1EQSw0Q0FJQztBQUVELG9EQWtCQztBQW5FRCxTQUFTLFVBQVUsQ0FBQyxHQUFjO0lBQ2hDLElBQUksR0FBRyxDQUFDLE9BQU87UUFBRSxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUE7SUFDbkMsUUFBUSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakIsS0FBSyxTQUFTLENBQUMsQ0FBQyxPQUFPLFFBQVEsQ0FBQTtRQUMvQixLQUFLLFFBQVEsQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUFBO1FBQzlCLEtBQUssTUFBTSxDQUFDLENBQUMsT0FBTyxRQUFRLENBQUE7UUFDNUIsS0FBSyxNQUFNLENBQUMsQ0FBQyxPQUFPLE1BQU0sQ0FBQTtRQUMxQixLQUFLLEtBQUssQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFBO1FBQ3hCLE9BQU8sQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFBO0lBQ3hCLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsSUFBWSxFQUFFLEdBQWM7SUFDbkQsT0FBTztRQUNMLElBQUk7UUFDSixPQUFPLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUN4QixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sS0FBSyxJQUFJO1FBQzNCLGdHQUFnRztRQUNoRyxRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVEsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLE9BQU8sS0FBSyxTQUFTO1FBQzVELEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSztRQUNoQixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7UUFDZCxXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7UUFDNUIsT0FBTyxFQUFFLEdBQUcsQ0FBQyxJQUFJ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
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An i18n key resolved admin-side against the merged i18next resources (`t(key)`). Providers
|
|
3
|
+
* ship the translations from their `src/admin/i18n/index.ts`; missing keys fall back to the
|
|
4
|
+
* key string itself.
|
|
5
|
+
*/
|
|
6
|
+
export type I18nKey = string;
|
|
7
|
+
export type FieldControl = "text" | "secret" | "switch" | "number" | "url" | "select" | "multiselect" | "json";
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2ludGVncmF0aW9uL2Rlc2NyaXB0b3IvbWV0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { I18nKey, FieldControl } from "./meta";
|
|
2
|
+
export type OptionIssue = {
|
|
3
|
+
message: string;
|
|
4
|
+
path?: (string | number)[];
|
|
5
|
+
};
|
|
6
|
+
export type OptionValidateContext = {
|
|
7
|
+
/** The full merged config (this option's siblings) — cast to read specific keys. */
|
|
8
|
+
options: Record<string, unknown>;
|
|
9
|
+
addIssue: (issue: OptionIssue) => void;
|
|
10
|
+
};
|
|
11
|
+
/** Declarative UI-visibility rule, evaluated admin-side against sibling values (JSON-serializable). */
|
|
12
|
+
export type VisibleWhen = {
|
|
13
|
+
field: string;
|
|
14
|
+
equals: string | number | boolean;
|
|
15
|
+
};
|
|
16
|
+
type OptionBase = {
|
|
17
|
+
control?: FieldControl;
|
|
18
|
+
label: I18nKey;
|
|
19
|
+
hint?: I18nKey;
|
|
20
|
+
placeholder?: I18nKey;
|
|
21
|
+
secret?: boolean;
|
|
22
|
+
/** Required = rejects `undefined`. Optional by default; a `default` also implies present. */
|
|
23
|
+
required?: boolean;
|
|
24
|
+
/** Hide this field in the admin unless the rule holds (UI-only; server requiredness lives in `validate`). */
|
|
25
|
+
visibleWhen?: VisibleWhen;
|
|
26
|
+
readonly?: boolean;
|
|
27
|
+
};
|
|
28
|
+
export type StringOption = OptionBase & {
|
|
29
|
+
type: "string";
|
|
30
|
+
default?: string;
|
|
31
|
+
minLength?: number;
|
|
32
|
+
maxLength?: number;
|
|
33
|
+
pattern?: string;
|
|
34
|
+
validate?: (v: string | undefined, c: OptionValidateContext) => void;
|
|
35
|
+
};
|
|
36
|
+
export type UrlOption = OptionBase & {
|
|
37
|
+
type: "url";
|
|
38
|
+
default?: string;
|
|
39
|
+
/** Restrict the URL scheme, e.g. ["https"]. Omit to allow any protocol. */
|
|
40
|
+
protocols?: string[];
|
|
41
|
+
validate?: (v: string | undefined, c: OptionValidateContext) => void;
|
|
42
|
+
};
|
|
43
|
+
export type EmailOption = OptionBase & {
|
|
44
|
+
type: "email";
|
|
45
|
+
default?: string;
|
|
46
|
+
validate?: (v: string | undefined, c: OptionValidateContext) => void;
|
|
47
|
+
};
|
|
48
|
+
export type UuidOption = OptionBase & {
|
|
49
|
+
type: "uuid";
|
|
50
|
+
default?: string;
|
|
51
|
+
validate?: (v: string | undefined, c: OptionValidateContext) => void;
|
|
52
|
+
};
|
|
53
|
+
export type NumberOption = OptionBase & {
|
|
54
|
+
type: "number";
|
|
55
|
+
default?: number;
|
|
56
|
+
min?: number;
|
|
57
|
+
max?: number;
|
|
58
|
+
int?: boolean;
|
|
59
|
+
positive?: boolean;
|
|
60
|
+
nonnegative?: boolean;
|
|
61
|
+
multipleOf?: number;
|
|
62
|
+
validate?: (v: number | undefined, c: OptionValidateContext) => void;
|
|
63
|
+
};
|
|
64
|
+
export type BooleanOption = OptionBase & {
|
|
65
|
+
type: "boolean";
|
|
66
|
+
default?: boolean;
|
|
67
|
+
validate?: (v: boolean | undefined, c: OptionValidateContext) => void;
|
|
68
|
+
};
|
|
69
|
+
export type EnumOption<V extends string = string> = OptionBase & {
|
|
70
|
+
type: "enum";
|
|
71
|
+
values: readonly V[];
|
|
72
|
+
valueLabels?: Partial<Record<V, I18nKey>>;
|
|
73
|
+
default?: V;
|
|
74
|
+
validate?: (v: V | undefined, c: OptionValidateContext) => void;
|
|
75
|
+
};
|
|
76
|
+
export type JsonOption = OptionBase & {
|
|
77
|
+
type: "json";
|
|
78
|
+
default?: unknown;
|
|
79
|
+
validate?: (v: unknown, c: OptionValidateContext) => void;
|
|
80
|
+
};
|
|
81
|
+
export type OptionDef = StringOption | UrlOption | EmailOption | UuidOption | NumberOption | BooleanOption | EnumOption | JsonOption;
|
|
82
|
+
export type OptionValue<D> = D extends {
|
|
83
|
+
type: "enum";
|
|
84
|
+
values: readonly (infer V)[];
|
|
85
|
+
} ? V : D extends {
|
|
86
|
+
type: "boolean";
|
|
87
|
+
} ? boolean : D extends {
|
|
88
|
+
type: "number";
|
|
89
|
+
} ? number : D extends {
|
|
90
|
+
type: "string" | "url" | "email" | "uuid";
|
|
91
|
+
} ? string : D extends {
|
|
92
|
+
type: "json";
|
|
93
|
+
} ? unknown : unknown;
|
|
94
|
+
type Present<D> = D extends {
|
|
95
|
+
default: unknown;
|
|
96
|
+
} ? true : D extends {
|
|
97
|
+
required: true;
|
|
98
|
+
} ? true : false;
|
|
99
|
+
export type Settings<O extends Record<string, OptionDef>> = {
|
|
100
|
+
[K in keyof O as Present<O[K]> extends true ? K : never]-?: OptionValue<O[K]>;
|
|
101
|
+
} & {
|
|
102
|
+
[K in keyof O as Present<O[K]> extends true ? never : K]?: OptionValue<O[K]>;
|
|
103
|
+
};
|
|
104
|
+
export {};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvaW50ZWdyYXRpb24vZGVzY3JpcHRvci9vcHRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
|