@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.
Files changed (133) hide show
  1. package/.medusa/server/src/admin/index.js +2259 -0
  2. package/.medusa/server/src/admin/index.mjs +2257 -0
  3. package/.medusa/server/src/api/admin/integrations/[provider_id]/enable/route.d.ts +5 -0
  4. package/.medusa/server/src/api/admin/integrations/[provider_id]/enable/route.js +17 -0
  5. package/.medusa/server/src/api/admin/integrations/[provider_id]/route.d.ts +7 -0
  6. package/.medusa/server/src/api/admin/integrations/[provider_id]/route.js +46 -0
  7. package/.medusa/server/src/api/admin/integrations/[provider_id]/test-connection/route.d.ts +3 -0
  8. package/.medusa/server/src/api/admin/integrations/[provider_id]/test-connection/route.js +16 -0
  9. package/.medusa/server/src/api/admin/integrations/_helpers.d.ts +16 -0
  10. package/.medusa/server/src/api/admin/integrations/_helpers.js +52 -0
  11. package/.medusa/server/src/api/admin/integrations/middlewares.d.ts +2 -0
  12. package/.medusa/server/src/api/admin/integrations/middlewares.js +21 -0
  13. package/.medusa/server/src/api/admin/integrations/route.d.ts +3 -0
  14. package/.medusa/server/src/api/admin/integrations/route.js +11 -0
  15. package/.medusa/server/src/api/admin/integrations/validators.d.ts +11 -0
  16. package/.medusa/server/src/api/admin/integrations/validators.js +15 -0
  17. package/.medusa/server/src/api/middlewares.d.ts +2 -0
  18. package/.medusa/server/src/api/middlewares.js +10 -0
  19. package/.medusa/server/src/index.d.ts +10 -0
  20. package/.medusa/server/src/index.js +22 -0
  21. package/.medusa/server/src/jobs/test-integration-connections.d.ts +16 -0
  22. package/.medusa/server/src/jobs/test-integration-connections.js +53 -0
  23. package/.medusa/server/src/modules/integration/descriptor/__tests__/build-zod.unit.spec.d.ts +1 -0
  24. package/.medusa/server/src/modules/integration/descriptor/__tests__/build-zod.unit.spec.js +64 -0
  25. package/.medusa/server/src/modules/integration/descriptor/__tests__/define.unit.spec.d.ts +1 -0
  26. package/.medusa/server/src/modules/integration/descriptor/__tests__/define.unit.spec.js +41 -0
  27. package/.medusa/server/src/modules/integration/descriptor/__tests__/introspect.unit.spec.d.ts +1 -0
  28. package/.medusa/server/src/modules/integration/descriptor/__tests__/introspect.unit.spec.js +93 -0
  29. package/.medusa/server/src/modules/integration/descriptor/__tests__/validate.unit.spec.d.ts +1 -0
  30. package/.medusa/server/src/modules/integration/descriptor/__tests__/validate.unit.spec.js +64 -0
  31. package/.medusa/server/src/modules/integration/descriptor/build-zod.d.ts +8 -0
  32. package/.medusa/server/src/modules/integration/descriptor/build-zod.js +82 -0
  33. package/.medusa/server/src/modules/integration/descriptor/define.d.ts +74 -0
  34. package/.medusa/server/src/modules/integration/descriptor/define.js +31 -0
  35. package/.medusa/server/src/modules/integration/descriptor/index.d.ts +5 -0
  36. package/.medusa/server/src/modules/integration/descriptor/index.js +22 -0
  37. package/.medusa/server/src/modules/integration/descriptor/introspect.d.ts +5 -0
  38. package/.medusa/server/src/modules/integration/descriptor/introspect.js +67 -0
  39. package/.medusa/server/src/modules/integration/descriptor/meta.d.ts +7 -0
  40. package/.medusa/server/src/modules/integration/descriptor/meta.js +3 -0
  41. package/.medusa/server/src/modules/integration/descriptor/option.d.ts +104 -0
  42. package/.medusa/server/src/modules/integration/descriptor/option.js +3 -0
  43. package/.medusa/server/src/modules/integration/descriptor/validate.d.ts +29 -0
  44. package/.medusa/server/src/modules/integration/descriptor/validate.js +69 -0
  45. package/.medusa/server/src/modules/integration/index.d.ts +22 -0
  46. package/.medusa/server/src/modules/integration/index.js +15 -0
  47. package/.medusa/server/src/modules/integration/loaders/index.d.ts +1 -0
  48. package/.medusa/server/src/modules/integration/loaders/index.js +9 -0
  49. package/.medusa/server/src/modules/integration/loaders/load-providers.d.ts +5 -0
  50. package/.medusa/server/src/modules/integration/loaders/load-providers.js +35 -0
  51. package/.medusa/server/src/modules/integration/migrations/Migration20260610215533.d.ts +5 -0
  52. package/.medusa/server/src/modules/integration/migrations/Migration20260610215533.js +18 -0
  53. package/.medusa/server/src/modules/integration/migrations/Migration20260618154037.d.ts +5 -0
  54. package/.medusa/server/src/modules/integration/migrations/Migration20260618154037.js +27 -0
  55. package/.medusa/server/src/modules/integration/migrations/Migration20260622120502.d.ts +5 -0
  56. package/.medusa/server/src/modules/integration/migrations/Migration20260622120502.js +14 -0
  57. package/.medusa/server/src/modules/integration/migrations/Migration20260701095518.d.ts +5 -0
  58. package/.medusa/server/src/modules/integration/migrations/Migration20260701095518.js +14 -0
  59. package/.medusa/server/src/modules/integration/migrations/Migration20260708072033.d.ts +5 -0
  60. package/.medusa/server/src/modules/integration/migrations/Migration20260708072033.js +14 -0
  61. package/.medusa/server/src/modules/integration/models/integration.d.ts +13 -0
  62. package/.medusa/server/src/modules/integration/models/integration.js +27 -0
  63. package/.medusa/server/src/modules/integration/services/__tests__/crypto.unit.spec.d.ts +1 -0
  64. package/.medusa/server/src/modules/integration/services/__tests__/crypto.unit.spec.js +33 -0
  65. package/.medusa/server/src/modules/integration/services/__tests__/integration-provider.unit.spec.d.ts +1 -0
  66. package/.medusa/server/src/modules/integration/services/__tests__/integration-provider.unit.spec.js +77 -0
  67. package/.medusa/server/src/modules/integration/services/__tests__/secrets.unit.spec.d.ts +1 -0
  68. package/.medusa/server/src/modules/integration/services/__tests__/secrets.unit.spec.js +33 -0
  69. package/.medusa/server/src/modules/integration/services/crypto.d.ts +10 -0
  70. package/.medusa/server/src/modules/integration/services/crypto.js +41 -0
  71. package/.medusa/server/src/modules/integration/services/index.d.ts +3 -0
  72. package/.medusa/server/src/modules/integration/services/index.js +11 -0
  73. package/.medusa/server/src/modules/integration/services/integration-module.d.ts +113 -0
  74. package/.medusa/server/src/modules/integration/services/integration-module.js +219 -0
  75. package/.medusa/server/src/modules/integration/services/integration-provider.d.ts +49 -0
  76. package/.medusa/server/src/modules/integration/services/integration-provider.js +76 -0
  77. package/.medusa/server/src/modules/integration/services/secrets.d.ts +11 -0
  78. package/.medusa/server/src/modules/integration/services/secrets.js +31 -0
  79. package/.medusa/server/src/modules/integration/types/index.d.ts +13 -0
  80. package/.medusa/server/src/modules/integration/types/index.js +10 -0
  81. package/.medusa/server/src/modules/integration/utils/abstract-integration-provider.d.ts +39 -0
  82. package/.medusa/server/src/modules/integration/utils/abstract-integration-provider.js +42 -0
  83. package/.medusa/server/src/modules/integration/utils/index.d.ts +1 -0
  84. package/.medusa/server/src/modules/integration/utils/index.js +6 -0
  85. package/.medusa/server/src/subscribers/invalidate-options-cache.d.ts +5 -0
  86. package/.medusa/server/src/subscribers/invalidate-options-cache.js +13 -0
  87. package/.medusa/server/src/types/bundles.d.ts +1 -0
  88. package/.medusa/server/src/types/bundles.js +38 -0
  89. package/.medusa/server/src/types/http/index.d.ts +1 -0
  90. package/.medusa/server/src/types/http/index.js +18 -0
  91. package/.medusa/server/src/types/http/integration/admin/entities.d.ts +32 -0
  92. package/.medusa/server/src/types/http/integration/admin/entities.js +3 -0
  93. package/.medusa/server/src/types/http/integration/admin/index.d.ts +2 -0
  94. package/.medusa/server/src/types/http/integration/admin/index.js +19 -0
  95. package/.medusa/server/src/types/http/integration/admin/responses.d.ts +19 -0
  96. package/.medusa/server/src/types/http/integration/admin/responses.js +3 -0
  97. package/.medusa/server/src/types/http/integration/index.d.ts +1 -0
  98. package/.medusa/server/src/types/http/integration/index.js +18 -0
  99. package/.medusa/server/src/types/index.d.ts +3 -0
  100. package/.medusa/server/src/types/index.js +20 -0
  101. package/.medusa/server/src/types/integration/common.d.ts +70 -0
  102. package/.medusa/server/src/types/integration/common.js +3 -0
  103. package/.medusa/server/src/types/integration/index.d.ts +1 -0
  104. package/.medusa/server/src/types/integration/index.js +18 -0
  105. package/.medusa/server/src/workflows/integration/index.d.ts +2 -0
  106. package/.medusa/server/src/workflows/integration/index.js +19 -0
  107. package/.medusa/server/src/workflows/integration/steps/apply-integration-section.d.ts +22 -0
  108. package/.medusa/server/src/workflows/integration/steps/apply-integration-section.js +70 -0
  109. package/.medusa/server/src/workflows/integration/steps/delete-integration-record.d.ts +6 -0
  110. package/.medusa/server/src/workflows/integration/steps/delete-integration-record.js +16 -0
  111. package/.medusa/server/src/workflows/integration/steps/emit-integration-event.d.ts +5 -0
  112. package/.medusa/server/src/workflows/integration/steps/emit-integration-event.js +11 -0
  113. package/.medusa/server/src/workflows/integration/steps/index.d.ts +6 -0
  114. package/.medusa/server/src/workflows/integration/steps/index.js +16 -0
  115. package/.medusa/server/src/workflows/integration/steps/run-test-connection.d.ts +4 -0
  116. package/.medusa/server/src/workflows/integration/steps/run-test-connection.js +20 -0
  117. package/.medusa/server/src/workflows/integration/steps/set-integration-enabled.d.ts +19 -0
  118. package/.medusa/server/src/workflows/integration/steps/set-integration-enabled.js +27 -0
  119. package/.medusa/server/src/workflows/integration/steps/upsert-integration-record.d.ts +9 -0
  120. package/.medusa/server/src/workflows/integration/steps/upsert-integration-record.js +18 -0
  121. package/.medusa/server/src/workflows/integration/workflows/delete-integration.d.ts +7 -0
  122. package/.medusa/server/src/workflows/integration/workflows/delete-integration.js +18 -0
  123. package/.medusa/server/src/workflows/integration/workflows/index.d.ts +4 -0
  124. package/.medusa/server/src/workflows/integration/workflows/index.js +12 -0
  125. package/.medusa/server/src/workflows/integration/workflows/set-integration-enabled.d.ts +20 -0
  126. package/.medusa/server/src/workflows/integration/workflows/set-integration-enabled.js +20 -0
  127. package/.medusa/server/src/workflows/integration/workflows/test-integration-connection.d.ts +5 -0
  128. package/.medusa/server/src/workflows/integration/workflows/test-integration-connection.js +21 -0
  129. package/.medusa/server/src/workflows/integration/workflows/upsert-integration.d.ts +8 -0
  130. package/.medusa/server/src/workflows/integration/workflows/upsert-integration.js +30 -0
  131. package/LICENSE +21 -0
  132. package/README.md +46 -0
  133. 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,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,5 @@
1
+ export * from "./define";
2
+ export * from "./option";
3
+ export * from "./build-zod";
4
+ export * from "./introspect";
5
+ export * from "./meta";
@@ -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