@gorgo/medusa-integration 0.0.3 → 0.0.5
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 +546 -119
- package/.medusa/server/src/admin/index.mjs +549 -122
- package/.medusa/server/src/api/admin/integrations/[provider_id]/route.js +7 -2
- package/.medusa/server/src/api/admin/integrations/__tests__/helpers.unit.spec.d.ts +1 -0
- package/.medusa/server/src/api/admin/integrations/__tests__/helpers.unit.spec.js +30 -0
- package/.medusa/server/src/api/admin/integrations/_helpers.d.ts +3 -3
- package/.medusa/server/src/api/admin/integrations/_helpers.js +8 -8
- package/.medusa/server/src/api/admin/integrations/catalog/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/integrations/catalog/route.js +10 -0
- package/.medusa/server/src/api/admin/integrations/middlewares.js +16 -1
- package/.medusa/server/src/api/admin/integrations/route.js +17 -3
- package/.medusa/server/src/api/admin/integrations/validators.d.ts +7 -0
- package/.medusa/server/src/api/admin/integrations/validators.js +8 -2
- package/.medusa/server/src/index.d.ts +1 -1
- package/.medusa/server/src/jobs/__tests__/test-integration-connections.unit.spec.d.ts +1 -0
- package/.medusa/server/src/jobs/__tests__/test-integration-connections.unit.spec.js +27 -0
- package/.medusa/server/src/jobs/test-integration-connections.d.ts +7 -0
- package/.medusa/server/src/jobs/test-integration-connections.js +21 -8
- package/.medusa/server/src/lib/__tests__/catalog-fallback.unit.spec.d.ts +1 -0
- package/.medusa/server/src/lib/__tests__/catalog-fallback.unit.spec.js +37 -0
- package/.medusa/server/src/lib/__tests__/catalog.unit.spec.d.ts +1 -0
- package/.medusa/server/src/lib/__tests__/catalog.unit.spec.js +71 -0
- package/.medusa/server/src/lib/catalog.d.ts +9 -0
- package/.medusa/server/src/lib/catalog.generated.d.ts +2 -0
- package/.medusa/server/src/lib/catalog.generated.js +88 -0
- package/.medusa/server/src/lib/catalog.js +55 -0
- package/.medusa/server/src/modules/integration/descriptor/__tests__/build-zod.unit.spec.js +43 -1
- package/.medusa/server/src/modules/integration/descriptor/__tests__/define.unit.spec.js +3 -3
- package/.medusa/server/src/modules/integration/descriptor/__tests__/introspect.unit.spec.js +3 -3
- package/.medusa/server/src/modules/integration/descriptor/__tests__/section-write.unit.spec.d.ts +1 -0
- package/.medusa/server/src/modules/integration/descriptor/__tests__/section-write.unit.spec.js +64 -0
- package/.medusa/server/src/modules/integration/descriptor/__tests__/validate.unit.spec.js +28 -2
- package/.medusa/server/src/modules/integration/descriptor/build-zod.js +7 -1
- package/.medusa/server/src/modules/integration/descriptor/define.d.ts +5 -5
- package/.medusa/server/src/modules/integration/descriptor/define.js +1 -1
- package/.medusa/server/src/modules/integration/descriptor/introspect.js +2 -2
- package/.medusa/server/src/modules/integration/descriptor/meta.d.ts +1 -1
- package/.medusa/server/src/modules/integration/descriptor/section-write.d.ts +10 -0
- package/.medusa/server/src/modules/integration/descriptor/section-write.js +24 -0
- package/.medusa/server/src/modules/integration/loaders/__tests__/package-meta.unit.spec.d.ts +1 -0
- package/.medusa/server/src/modules/integration/loaders/__tests__/package-meta.unit.spec.js +63 -0
- package/.medusa/server/src/modules/integration/loaders/load-providers.js +10 -38
- package/.medusa/server/src/modules/integration/loaders/package-meta.d.ts +22 -0
- package/.medusa/server/src/modules/integration/loaders/package-meta.js +45 -0
- package/.medusa/server/src/modules/integration/loaders/resolve-package-meta.d.ts +8 -0
- package/.medusa/server/src/modules/integration/loaders/resolve-package-meta.js +59 -0
- package/.medusa/server/src/modules/integration/migrations/Migration20260720130920.d.ts +5 -0
- package/.medusa/server/src/modules/integration/migrations/Migration20260720130920.js +18 -0
- package/.medusa/server/src/modules/integration/migrations/Migration20260724101525.d.ts +5 -0
- package/.medusa/server/src/modules/integration/migrations/Migration20260724101525.js +16 -0
- package/.medusa/server/src/modules/integration/models/integration.d.ts +9 -5
- package/.medusa/server/src/modules/integration/models/integration.js +3 -3
- package/.medusa/server/src/modules/integration/services/__tests__/integration-module.unit.spec.d.ts +1 -0
- package/.medusa/server/src/modules/integration/services/__tests__/integration-module.unit.spec.js +344 -0
- package/.medusa/server/src/modules/integration/services/__tests__/integration-provider.unit.spec.js +2 -2
- package/.medusa/server/src/modules/integration/services/integration-module.d.ts +48 -11
- package/.medusa/server/src/modules/integration/services/integration-module.js +56 -6
- package/.medusa/server/src/modules/integration/types/index.d.ts +11 -0
- package/.medusa/server/src/modules/integration/types/index.js +4 -2
- package/.medusa/server/src/modules/integration/utils/integration.d.ts +11 -7
- package/.medusa/server/src/modules/integration/utils/integration.js +12 -8
- package/.medusa/server/src/subscribers/__tests__/invalidate-options-cache.unit.spec.d.ts +1 -0
- package/.medusa/server/src/subscribers/__tests__/invalidate-options-cache.unit.spec.js +53 -0
- package/.medusa/server/src/types/http/integration/admin/entities.d.ts +39 -4
- package/.medusa/server/src/types/http/integration/admin/responses.d.ts +17 -2
- package/.medusa/server/src/types/integration/common.d.ts +3 -3
- package/.medusa/server/src/workflows/integration/steps/apply-integration-section.d.ts +1 -1
- package/.medusa/server/src/workflows/integration/steps/apply-integration-section.js +13 -20
- package/.medusa/server/src/workflows/integration/steps/set-integration-enabled.d.ts +1 -1
- package/.medusa/server/src/workflows/integration/steps/upsert-integration-record.d.ts +2 -2
- package/.medusa/server/src/workflows/integration/workflows/set-integration-enabled.d.ts +1 -1
- package/.medusa/server/src/workflows/integration/workflows/upsert-integration.js +2 -2
- package/README.md +41 -2
- package/README.ru.md +85 -0
- package/package.json +7 -3
|
@@ -11,7 +11,12 @@ const GET = async (req, res) => {
|
|
|
11
11
|
const descriptor = svc.getProviderUiDescriptor(provider_id);
|
|
12
12
|
const record = await svc.findByProviderId(provider_id);
|
|
13
13
|
const is_complete = record ? svc.isComplete(record) : false;
|
|
14
|
-
res.json({
|
|
14
|
+
res.json({
|
|
15
|
+
descriptor,
|
|
16
|
+
integration: record ? (0, _helpers_1.maskedView)(record, svc.getSecretKeys(provider_id)) : null,
|
|
17
|
+
is_complete,
|
|
18
|
+
...svc.getPackageMeta(provider_id),
|
|
19
|
+
});
|
|
15
20
|
};
|
|
16
21
|
exports.GET = GET;
|
|
17
22
|
const POST = async (req, res) => {
|
|
@@ -43,4 +48,4 @@ const DELETE = async (req, res) => {
|
|
|
43
48
|
res.json({ id: provider_id, object: "integration", deleted: true });
|
|
44
49
|
};
|
|
45
50
|
exports.DELETE = DELETE;
|
|
46
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2ludGVncmF0aW9ucy9bcHJvdmlkZXJfaWRdL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLG1FQUF3RztBQUN4RywwQ0FBa0U7QUFRbEUsK0ZBQStGO0FBQ3hGLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFDdEIsR0FBK0IsRUFDL0IsR0FBNkMsRUFDN0MsRUFBRTtJQUNGLE1BQU0sR0FBRyxHQUFHLElBQUEsa0JBQU8sRUFBQyxHQUFHLENBQUMsQ0FBQTtJQUN4QixNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQTtJQUMxQyxJQUFBLDBCQUFlLEVBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQ2pDLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUMzRCxNQUFNLE1BQU0sR0FBRyxNQUFNLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUN0RCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQTtJQUMzRCxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ1AsVUFBVTtRQUNWLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUEscUJBQVUsRUFBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1FBQy9FLFdBQVc7UUFDWCxHQUFHLEdBQUcsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO0tBQ25DLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQTtBQWhCWSxRQUFBLEdBQUcsT0FnQmY7QUFFTSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQ3ZCLEdBQTJELEVBQzNELEdBQW1ELEVBQ25ELEVBQUU7SUFDRixNQUFNLEdBQUcsR0FBRyxJQUFBLGtCQUFPLEVBQUMsR0FBRyxDQUFDLENBQUE7SUFDeEIsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUE7SUFDMUMsSUFBQSwwQkFBZSxFQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUVqQyxzRkFBc0Y7SUFDdEYsMEZBQTBGO0lBQzFGLG9GQUFvRjtJQUNwRixpRUFBaUU7SUFDakUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBQSx1Q0FBeUIsRUFBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ2hFLEtBQUssRUFBRTtZQUNMLFdBQVc7WUFDWCxVQUFVLEVBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxVQUFVO1lBQ3hDLEtBQUssRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLEtBQUs7WUFDOUIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxhQUFhLENBQUMsTUFBTTtTQUNqQztLQUNGLENBQUMsQ0FBQTtJQUNGLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxXQUFXLEVBQUUsSUFBQSxxQkFBVSxFQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQy9FLENBQUMsQ0FBQTtBQXJCWSxRQUFBLElBQUksUUFxQmhCO0FBRU0sTUFBTSxNQUFNLEdBQUcsS0FBSyxFQUN6QixHQUErQixFQUMvQixHQUFtRCxFQUNuRCxFQUFFO0lBQ0YsTUFBTSxHQUFHLEdBQUcsSUFBQSxrQkFBTyxFQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3hCLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFBO0lBQzFDLElBQUEsMEJBQWUsRUFBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDakMsTUFBTSxJQUFBLHVDQUF5QixFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDN0MsS0FBSyxFQUFFLEVBQUUsV0FBVyxFQUFFO0tBQ3ZCLENBQUMsQ0FBQTtJQUNGLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7QUFDckUsQ0FBQyxDQUFBO0FBWFksUUFBQSxNQUFNLFVBV2xCIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const globals_1 = require("@jest/globals");
|
|
4
|
+
const _helpers_1 = require("../_helpers");
|
|
5
|
+
const rec = (options) => ({
|
|
6
|
+
id: "int_x",
|
|
7
|
+
provider_id: "int_x",
|
|
8
|
+
category: "payment",
|
|
9
|
+
title: null,
|
|
10
|
+
is_enabled: true,
|
|
11
|
+
last_test_status: null,
|
|
12
|
+
options,
|
|
13
|
+
});
|
|
14
|
+
(0, globals_1.describe)("maskedView", () => {
|
|
15
|
+
(0, globals_1.it)("reports configured secrets per field — only those with a stored value", () => {
|
|
16
|
+
// apiKey has ciphertext, clientSecret is blank → only apiKey counts as configured.
|
|
17
|
+
const v = (0, _helpers_1.maskedView)(rec({ apiKey: "ct", clientSecret: "", terminalKey: "abc" }), ["apiKey", "clientSecret"]);
|
|
18
|
+
(0, globals_1.expect)(v.configured_secrets).toEqual(["apiKey"]);
|
|
19
|
+
});
|
|
20
|
+
(0, globals_1.it)("returns an empty list when no secret is set", () => {
|
|
21
|
+
const v = (0, _helpers_1.maskedView)(rec({ terminalKey: "abc" }), ["apiKey", "clientSecret"]);
|
|
22
|
+
(0, globals_1.expect)(v.configured_secrets).toEqual([]);
|
|
23
|
+
});
|
|
24
|
+
(0, globals_1.it)("never leaks secret ciphertext into values", () => {
|
|
25
|
+
const v = (0, _helpers_1.maskedView)(rec({ apiKey: "ct", terminalKey: "abc" }), ["apiKey"]);
|
|
26
|
+
(0, globals_1.expect)(v.values).toEqual({ terminalKey: "abc" });
|
|
27
|
+
(0, globals_1.expect)(Object.prototype.hasOwnProperty.call(v.values, "apiKey")).toBe(false);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy51bml0LnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2ludGVncmF0aW9ucy9fX3Rlc3RzX18vaGVscGVycy51bml0LnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwyQ0FBb0Q7QUFDcEQsMENBQXdDO0FBRXhDLE1BQU0sR0FBRyxHQUFHLENBQUMsT0FBZ0MsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNqRCxFQUFFLEVBQUUsT0FBTztJQUNYLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFFBQVEsRUFBRSxTQUFTO0lBQ25CLEtBQUssRUFBRSxJQUFJO0lBQ1gsVUFBVSxFQUFFLElBQUk7SUFDaEIsZ0JBQWdCLEVBQUUsSUFBSTtJQUN0QixPQUFPO0NBQ1IsQ0FBQyxDQUFBO0FBRUYsSUFBQSxrQkFBUSxFQUFDLFlBQVksRUFBRSxHQUFHLEVBQUU7SUFDMUIsSUFBQSxZQUFFLEVBQUMsdUVBQXVFLEVBQUUsR0FBRyxFQUFFO1FBQy9FLG1GQUFtRjtRQUNuRixNQUFNLENBQUMsR0FBRyxJQUFBLHFCQUFVLEVBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUE7UUFDN0csSUFBQSxnQkFBTSxFQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7SUFDbEQsQ0FBQyxDQUFDLENBQUE7SUFFRixJQUFBLFlBQUUsRUFBQyw2Q0FBNkMsRUFBRSxHQUFHLEVBQUU7UUFDckQsTUFBTSxDQUFDLEdBQUcsSUFBQSxxQkFBVSxFQUFDLEdBQUcsQ0FBQyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUE7UUFDN0UsSUFBQSxnQkFBTSxFQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUMxQyxDQUFDLENBQUMsQ0FBQTtJQUVGLElBQUEsWUFBRSxFQUFDLDJDQUEyQyxFQUFFLEdBQUcsRUFBRTtRQUNuRCxNQUFNLENBQUMsR0FBRyxJQUFBLHFCQUFVLEVBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDM0UsSUFBQSxnQkFBTSxFQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUNoRCxJQUFBLGdCQUFNLEVBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDOUUsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSJ9
|
|
@@ -9,8 +9,8 @@ export declare function service(req: MedusaRequest): IntegrationModuleService;
|
|
|
9
9
|
export declare function requireProvider(svc: IntegrationModuleService, providerId: string): void;
|
|
10
10
|
/**
|
|
11
11
|
* Build the client-facing view of a record. Secret options live encrypted inside `options`;
|
|
12
|
-
* they are stripped here so ciphertext never reaches the browser. `
|
|
13
|
-
*
|
|
14
|
-
* the non-secret options.
|
|
12
|
+
* they are stripped here so ciphertext never reaches the browser. `configured_secrets` lists
|
|
13
|
+
* the secret keys that currently have a stored value (per field), so the UI can render a
|
|
14
|
+
* "leave blank to keep" hint on exactly those fields. `values` holds only the non-secret options.
|
|
15
15
|
*/
|
|
16
16
|
export declare function maskedView(record: any, secretKeys: string[]): MaskedIntegration;
|
|
@@ -19,19 +19,19 @@ function requireProvider(svc, providerId) {
|
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
21
21
|
* Build the client-facing view of a record. Secret options live encrypted inside `options`;
|
|
22
|
-
* they are stripped here so ciphertext never reaches the browser. `
|
|
23
|
-
*
|
|
24
|
-
* the non-secret options.
|
|
22
|
+
* they are stripped here so ciphertext never reaches the browser. `configured_secrets` lists
|
|
23
|
+
* the secret keys that currently have a stored value (per field), so the UI can render a
|
|
24
|
+
* "leave blank to keep" hint on exactly those fields. `values` holds only the non-secret options.
|
|
25
25
|
*/
|
|
26
26
|
function maskedView(record, secretKeys) {
|
|
27
27
|
const secret = new Set(secretKeys);
|
|
28
28
|
const stored = (record.options ?? {});
|
|
29
29
|
const values = {};
|
|
30
|
-
|
|
30
|
+
const configured_secrets = [];
|
|
31
31
|
for (const [k, v] of Object.entries(stored)) {
|
|
32
32
|
if (secret.has(k)) {
|
|
33
33
|
if (v != null && v !== "")
|
|
34
|
-
|
|
34
|
+
configured_secrets.push(k);
|
|
35
35
|
continue;
|
|
36
36
|
}
|
|
37
37
|
values[k] = v;
|
|
@@ -39,12 +39,12 @@ function maskedView(record, secretKeys) {
|
|
|
39
39
|
return {
|
|
40
40
|
id: record.id,
|
|
41
41
|
provider_id: record.provider_id,
|
|
42
|
-
|
|
42
|
+
category: record.category,
|
|
43
43
|
title: record.title ?? null,
|
|
44
44
|
is_enabled: record.is_enabled,
|
|
45
|
-
|
|
45
|
+
configured_secrets,
|
|
46
46
|
last_test_status: record.last_test_status ?? null,
|
|
47
47
|
values,
|
|
48
48
|
};
|
|
49
49
|
}
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2hlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2ludGVncmF0aW9ucy9faGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQU1BLDBCQUVDO0FBTUQsMENBSUM7QUFRRCxnQ0FzQkM7QUEvQ0QscURBQXVEO0FBQ3ZELDhEQUFpRTtBQUlqRSxTQUFnQixPQUFPLENBQUMsR0FBa0I7SUFDeEMsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQ0FBa0IsQ0FBQyxDQUFBO0FBQzlDLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixlQUFlLENBQUMsR0FBNkIsRUFBRSxVQUFrQjtJQUMvRSxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxtQkFBVyxDQUFDLG1CQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSx3QkFBd0IsVUFBVSxHQUFHLENBQUMsQ0FBQTtJQUMzRixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsVUFBVSxDQUFDLE1BQVcsRUFBRSxVQUFvQjtJQUMxRCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUNsQyxNQUFNLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUE0QixDQUFBO0lBQ2hFLE1BQU0sTUFBTSxHQUE0QixFQUFFLENBQUE7SUFDMUMsTUFBTSxrQkFBa0IsR0FBYSxFQUFFLENBQUE7SUFDdkMsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUM1QyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ3JELFNBQVE7UUFDVixDQUFDO1FBQ0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNmLENBQUM7SUFDRCxPQUFPO1FBQ0wsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFO1FBQ2IsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO1FBQy9CLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtRQUN6QixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJO1FBQzNCLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtRQUM3QixrQkFBa0I7UUFDbEIsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixJQUFJLElBQUk7UUFDakQsTUFBTTtLQUNQLENBQUE7QUFDSCxDQUFDIn0=
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { AuthenticatedMedusaRequest, MedusaResponse } from "@medusajs/framework/http";
|
|
2
|
+
import type { AdminIntegrationCatalogResponse } from "../../../../types";
|
|
3
|
+
export declare const GET: (req: AuthenticatedMedusaRequest, res: MedusaResponse<AdminIntegrationCatalogResponse>) => Promise<void>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = void 0;
|
|
4
|
+
const _helpers_1 = require("../_helpers");
|
|
5
|
+
const GET = async (req, res) => {
|
|
6
|
+
const svc = (0, _helpers_1.service)(req);
|
|
7
|
+
res.json({ integrations: await svc.getCatalog() });
|
|
8
|
+
};
|
|
9
|
+
exports.GET = GET;
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2ludGVncmF0aW9ucy9jYXRhbG9nL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDBDQUFxQztBQUc5QixNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQ3RCLEdBQStCLEVBQy9CLEdBQW9ELEVBQ3BELEVBQUU7SUFDRixNQUFNLEdBQUcsR0FBRyxJQUFBLGtCQUFPLEVBQUMsR0FBRyxDQUFDLENBQUE7SUFDeEIsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLFlBQVksRUFBRSxNQUFNLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUE7QUFDcEQsQ0FBQyxDQUFBO0FBTlksUUFBQSxHQUFHLE9BTWYifQ==
|
|
@@ -4,6 +4,21 @@ exports.adminIntegrationRoutesMiddlewares = void 0;
|
|
|
4
4
|
const http_1 = require("@medusajs/framework/http");
|
|
5
5
|
const validators_1 = require("./validators");
|
|
6
6
|
exports.adminIntegrationRoutesMiddlewares = [
|
|
7
|
+
{
|
|
8
|
+
methods: ["GET"],
|
|
9
|
+
matcher: "/admin/integrations",
|
|
10
|
+
// Minimal queryConfig: this endpoint is an in-memory list, not a remote-query entity —
|
|
11
|
+
// we only need `req.validatedQuery`. `entity`/`defaults` are inert here. `as any` mirrors
|
|
12
|
+
// the existing body-validator cast (zod-4 vs the generic's deep instantiation).
|
|
13
|
+
middlewares: [
|
|
14
|
+
(0, http_1.validateAndTransformQuery)(validators_1.AdminGetIntegrationsParams, {
|
|
15
|
+
entity: "integration",
|
|
16
|
+
isList: true,
|
|
17
|
+
defaults: [],
|
|
18
|
+
defaultLimit: 20,
|
|
19
|
+
}),
|
|
20
|
+
],
|
|
21
|
+
},
|
|
7
22
|
{
|
|
8
23
|
methods: ["POST"],
|
|
9
24
|
matcher: "/admin/integrations/:provider_id",
|
|
@@ -18,4 +33,4 @@ exports.adminIntegrationRoutesMiddlewares = [
|
|
|
18
33
|
middlewares: [(0, http_1.validateAndTransformBody)(validators_1.AdminSetIntegrationEnabled)],
|
|
19
34
|
},
|
|
20
35
|
];
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2ludGVncmF0aW9ucy9taWRkbGV3YXJlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBK0c7QUFDL0csNkNBQTZHO0FBRWhHLFFBQUEsaUNBQWlDLEdBQXNCO0lBQ2xFO1FBQ0UsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQ2hCLE9BQU8sRUFBRSxxQkFBcUI7UUFDOUIsdUZBQXVGO1FBQ3ZGLDBGQUEwRjtRQUMxRixnRkFBZ0Y7UUFDaEYsV0FBVyxFQUFFO1lBQ1gsSUFBQSxnQ0FBeUIsRUFBQyx1Q0FBaUMsRUFBRTtnQkFDM0QsTUFBTSxFQUFFLGFBQWE7Z0JBQ3JCLE1BQU0sRUFBRSxJQUFJO2dCQUNaLFFBQVEsRUFBRSxFQUFFO2dCQUNaLFlBQVksRUFBRSxFQUFFO2FBQ1YsQ0FBQztTQUNWO0tBQ0Y7SUFDRDtRQUNFLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNqQixPQUFPLEVBQUUsa0NBQWtDO1FBQzNDLHNGQUFzRjtRQUN0Rix1RkFBdUY7UUFDdkYsdUZBQXVGO1FBQ3ZGLFdBQVcsRUFBRSxDQUFDLElBQUEsK0JBQXdCLEVBQUMsbUNBQTZCLENBQUMsQ0FBQztLQUN2RTtJQUNEO1FBQ0UsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2pCLE9BQU8sRUFBRSx5Q0FBeUM7UUFDbEQsV0FBVyxFQUFFLENBQUMsSUFBQSwrQkFBd0IsRUFBQyx1Q0FBaUMsQ0FBQyxDQUFDO0tBQzNFO0NBQ0YsQ0FBQSJ9
|
|
@@ -4,8 +4,22 @@ exports.GET = void 0;
|
|
|
4
4
|
const _helpers_1 = require("./_helpers");
|
|
5
5
|
const GET = async (req, res) => {
|
|
6
6
|
const svc = (0, _helpers_1.service)(req);
|
|
7
|
-
const
|
|
8
|
-
|
|
7
|
+
const { q, category, limit, offset } = (req.validatedQuery ?? {});
|
|
8
|
+
const resolvedLimit = limit ?? 20;
|
|
9
|
+
const resolvedOffset = offset ?? 0;
|
|
10
|
+
const { integrations, count, categories } = await svc.listIntegrationsOverview({
|
|
11
|
+
q,
|
|
12
|
+
category,
|
|
13
|
+
limit: resolvedLimit,
|
|
14
|
+
offset: resolvedOffset,
|
|
15
|
+
});
|
|
16
|
+
res.json({
|
|
17
|
+
integrations,
|
|
18
|
+
count,
|
|
19
|
+
limit: resolvedLimit,
|
|
20
|
+
offset: resolvedOffset,
|
|
21
|
+
categories,
|
|
22
|
+
});
|
|
9
23
|
};
|
|
10
24
|
exports.GET = GET;
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2ludGVncmF0aW9ucy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx5Q0FBb0M7QUFJN0IsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUN0QixHQUErQixFQUMvQixHQUFpRCxFQUNqRCxFQUFFO0lBQ0YsTUFBTSxHQUFHLEdBQUcsSUFBQSxrQkFBTyxFQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3hCLE1BQU0sRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFtQyxDQUFBO0lBQ25HLE1BQU0sYUFBYSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUE7SUFDakMsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsQ0FBQTtJQUVsQyxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxNQUFNLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQztRQUM3RSxDQUFDO1FBQ0QsUUFBUTtRQUNSLEtBQUssRUFBRSxhQUFhO1FBQ3BCLE1BQU0sRUFBRSxjQUFjO0tBQ3ZCLENBQUMsQ0FBQTtJQUVGLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDUCxZQUFZO1FBQ1osS0FBSztRQUNMLEtBQUssRUFBRSxhQUFhO1FBQ3BCLE1BQU0sRUFBRSxjQUFjO1FBQ3RCLFVBQVU7S0FDWCxDQUFDLENBQUE7QUFDSixDQUFDLENBQUE7QUF2QlksUUFBQSxHQUFHLE9BdUJmIn0=
|
|
@@ -9,3 +9,10 @@ export type AdminSetIntegrationEnabledType = z.infer<typeof AdminSetIntegrationE
|
|
|
9
9
|
export declare const AdminSetIntegrationEnabled: z.ZodObject<{
|
|
10
10
|
is_enabled: z.ZodBoolean;
|
|
11
11
|
}, z.core.$strip>;
|
|
12
|
+
export type AdminGetIntegrationsParamsType = z.infer<typeof AdminGetIntegrationsParams>;
|
|
13
|
+
export declare const AdminGetIntegrationsParams: z.ZodObject<{
|
|
14
|
+
q: z.ZodOptional<z.ZodString>;
|
|
15
|
+
category: z.ZodOptional<z.ZodString>;
|
|
16
|
+
limit: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
17
|
+
offset: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
18
|
+
}, z.core.$strip>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AdminSetIntegrationEnabled = exports.AdminUpsertIntegration = void 0;
|
|
3
|
+
exports.AdminGetIntegrationsParams = exports.AdminSetIntegrationEnabled = exports.AdminUpsertIntegration = void 0;
|
|
4
4
|
const zod_1 = require("@medusajs/deps/zod");
|
|
5
5
|
exports.AdminUpsertIntegration = zod_1.z.object({
|
|
6
6
|
title: zod_1.z.string().optional(),
|
|
@@ -12,4 +12,10 @@ exports.AdminUpsertIntegration = zod_1.z.object({
|
|
|
12
12
|
exports.AdminSetIntegrationEnabled = zod_1.z.object({
|
|
13
13
|
is_enabled: zod_1.z.boolean(),
|
|
14
14
|
});
|
|
15
|
-
|
|
15
|
+
exports.AdminGetIntegrationsParams = zod_1.z.object({
|
|
16
|
+
q: zod_1.z.string().optional(),
|
|
17
|
+
category: zod_1.z.string().optional(),
|
|
18
|
+
limit: zod_1.z.coerce.number().int().min(1).max(1000).optional(),
|
|
19
|
+
offset: zod_1.z.coerce.number().int().min(0).optional(),
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcGkvYWRtaW4vaW50ZWdyYXRpb25zL3ZhbGlkYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNENBQXNDO0FBR3pCLFFBQUEsc0JBQXNCLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM3QyxLQUFLLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUM1QixvRkFBb0Y7SUFDcEYsd0ZBQXdGO0lBQ3hGLFVBQVUsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ2pDLE1BQU0sRUFBRSxPQUFDLENBQUMsTUFBTSxDQUFDLE9BQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7Q0FDMUMsQ0FBQyxDQUFBO0FBR1csUUFBQSwwQkFBMEIsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2pELFVBQVUsRUFBRSxPQUFDLENBQUMsT0FBTyxFQUFFO0NBQ3hCLENBQUMsQ0FBQTtBQUdXLFFBQUEsMEJBQTBCLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNqRCxDQUFDLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUN4QixRQUFRLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUMvQixLQUFLLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRTtJQUMxRCxNQUFNLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO0NBQ2xELENBQUMsQ0FBQSJ9
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { defineIntegration, z } from "./modules/integration/descriptor/define";
|
|
2
2
|
export { AbstractIntegrationProvider } from "./modules/integration/utils/abstract-integration-provider";
|
|
3
|
-
export type { IntegrationDescriptor, IntegrationDescriptorInput,
|
|
3
|
+
export type { IntegrationDescriptor, IntegrationDescriptorInput, CategoryKind, OptionDef, OptionValidateContext, Settings, TestConnectionContext, TestConnectionResult, } from "./modules/integration/descriptor/define";
|
|
4
4
|
export type { FieldControl, I18nKey } from "./modules/integration/descriptor/meta";
|
|
5
5
|
export { collectValidationIssues, isDescriptorComplete } from "./modules/integration/descriptor/validate";
|
|
6
6
|
export type { IntegrationSectionData } from "./types";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const globals_1 = require("@jest/globals");
|
|
4
|
+
const test_integration_connections_1 = require("../test-integration-connections");
|
|
5
|
+
(0, globals_1.describe)("tallyOutcomes", () => {
|
|
6
|
+
(0, globals_1.it)("counts each status into its own bucket (statuses, not display labels)", () => {
|
|
7
|
+
(0, globals_1.expect)((0, test_integration_connections_1.tallyOutcomes)(["passed", "failed", "passed", "skipped", "errored"])).toEqual({
|
|
8
|
+
passed: 2,
|
|
9
|
+
failed: 1,
|
|
10
|
+
skipped: 1,
|
|
11
|
+
errored: 1,
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
(0, globals_1.it)("returns all-zero buckets for no outcomes", () => {
|
|
15
|
+
(0, globals_1.expect)((0, test_integration_connections_1.tallyOutcomes)([])).toEqual({ passed: 0, failed: 0, skipped: 0, errored: 0 });
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
(0, globals_1.describe)("formatConnectionTestSummary", () => {
|
|
19
|
+
(0, globals_1.it)("maps passed→ok and failed→fail in the summary line", () => {
|
|
20
|
+
const line = (0, test_integration_connections_1.formatConnectionTestSummary)({ passed: 2, failed: 1, skipped: 3, errored: 0 });
|
|
21
|
+
(0, globals_1.expect)(line).toContain("ok: 2");
|
|
22
|
+
(0, globals_1.expect)(line).toContain("fail: 1");
|
|
23
|
+
(0, globals_1.expect)(line).toContain("skipped: 3");
|
|
24
|
+
(0, globals_1.expect)(line).toContain("errored: 0");
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1pbnRlZ3JhdGlvbi1jb25uZWN0aW9ucy51bml0LnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvam9icy9fX3Rlc3RzX18vdGVzdC1pbnRlZ3JhdGlvbi1jb25uZWN0aW9ucy51bml0LnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwyQ0FBb0Q7QUFDcEQsa0ZBQTRGO0FBRTVGLElBQUEsa0JBQVEsRUFBQyxlQUFlLEVBQUUsR0FBRyxFQUFFO0lBQzdCLElBQUEsWUFBRSxFQUFDLHVFQUF1RSxFQUFFLEdBQUcsRUFBRTtRQUMvRSxJQUFBLGdCQUFNLEVBQUMsSUFBQSw0Q0FBYSxFQUFDLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDbEYsTUFBTSxFQUFFLENBQUM7WUFDVCxNQUFNLEVBQUUsQ0FBQztZQUNULE9BQU8sRUFBRSxDQUFDO1lBQ1YsT0FBTyxFQUFFLENBQUM7U0FDWCxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtJQUVGLElBQUEsWUFBRSxFQUFDLDBDQUEwQyxFQUFFLEdBQUcsRUFBRTtRQUNsRCxJQUFBLGdCQUFNLEVBQUMsSUFBQSw0Q0FBYSxFQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDckYsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQTtBQUVGLElBQUEsa0JBQVEsRUFBQyw2QkFBNkIsRUFBRSxHQUFHLEVBQUU7SUFDM0MsSUFBQSxZQUFFLEVBQUMsb0RBQW9ELEVBQUUsR0FBRyxFQUFFO1FBQzVELE1BQU0sSUFBSSxHQUFHLElBQUEsMERBQTJCLEVBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUMxRixJQUFBLGdCQUFNLEVBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQy9CLElBQUEsZ0JBQU0sRUFBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDakMsSUFBQSxnQkFBTSxFQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUNwQyxJQUFBLGdCQUFNLEVBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBQ3RDLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEifQ==
|
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import type { MedusaContainer } from "@medusajs/framework/types";
|
|
2
|
+
/** A per-integration test result: the provider's `passed`/`failed`/`skipped`, or `errored` (threw). */
|
|
3
|
+
export type TestOutcome = "passed" | "failed" | "skipped" | "errored";
|
|
4
|
+
export type OutcomeCounts = Record<TestOutcome, number>;
|
|
5
|
+
/** Tally outcomes into per-status buckets. Buckets are keyed by the status itself — no mapping. */
|
|
6
|
+
export declare function tallyOutcomes(outcomes: Iterable<TestOutcome>): OutcomeCounts;
|
|
7
|
+
/** The end-of-run summary line. `passed`→"ok", `failed`→"fail" for human-readable output. */
|
|
8
|
+
export declare function formatConnectionTestSummary(counts: OutcomeCounts): string;
|
|
2
9
|
/**
|
|
3
10
|
* Daily health check: run the connection test for every configured & enabled integration
|
|
4
11
|
* that exposes one. Each test runs through `testIntegrationConnectionWorkflow`, which
|
|
@@ -1,9 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.config = void 0;
|
|
4
|
+
exports.tallyOutcomes = tallyOutcomes;
|
|
5
|
+
exports.formatConnectionTestSummary = formatConnectionTestSummary;
|
|
4
6
|
exports.default = testIntegrationConnectionsJob;
|
|
5
7
|
const integration_1 = require("../modules/integration");
|
|
6
8
|
const integration_2 = require("../workflows/integration");
|
|
9
|
+
/** Tally outcomes into per-status buckets. Buckets are keyed by the status itself — no mapping. */
|
|
10
|
+
function tallyOutcomes(outcomes) {
|
|
11
|
+
const counts = { passed: 0, failed: 0, skipped: 0, errored: 0 };
|
|
12
|
+
for (const o of outcomes)
|
|
13
|
+
counts[o]++;
|
|
14
|
+
return counts;
|
|
15
|
+
}
|
|
16
|
+
/** The end-of-run summary line. `passed`→"ok", `failed`→"fail" for human-readable output. */
|
|
17
|
+
function formatConnectionTestSummary(counts) {
|
|
18
|
+
return (`[integration] connection-test job done — ok: ${counts.passed}, fail: ${counts.failed}, ` +
|
|
19
|
+
`skipped: ${counts.skipped}, errored: ${counts.errored}`);
|
|
20
|
+
}
|
|
7
21
|
/**
|
|
8
22
|
* Daily health check: run the connection test for every configured & enabled integration
|
|
9
23
|
* that exposes one. Each test runs through `testIntegrationConnectionWorkflow`, which
|
|
@@ -17,20 +31,20 @@ const integration_2 = require("../workflows/integration");
|
|
|
17
31
|
async function testIntegrationConnectionsJob(container) {
|
|
18
32
|
const logger = container.resolve("logger");
|
|
19
33
|
const service = container.resolve(integration_1.INTEGRATION_MODULE);
|
|
20
|
-
const
|
|
21
|
-
const targets =
|
|
34
|
+
const { integrations } = await service.listIntegrationsOverview();
|
|
35
|
+
const targets = integrations.filter((i) => i.is_configured && i.is_enabled && i.has_test_connection);
|
|
22
36
|
if (targets.length === 0) {
|
|
23
37
|
logger.info("[integration] connection-test job: no configured integrations to test");
|
|
24
38
|
return;
|
|
25
39
|
}
|
|
26
40
|
logger.info(`[integration] connection-test job: testing ${targets.length} integration(s)`);
|
|
27
|
-
const
|
|
41
|
+
const outcomes = [];
|
|
28
42
|
for (const target of targets) {
|
|
29
43
|
try {
|
|
30
44
|
const { result } = await (0, integration_2.testIntegrationConnectionWorkflow)(container).run({
|
|
31
45
|
input: { provider_id: target.provider_id },
|
|
32
46
|
});
|
|
33
|
-
|
|
47
|
+
outcomes.push(result.status);
|
|
34
48
|
const line = `[integration] ${target.provider_id} → ${result.status}${result.message ? `: ${result.message}` : ""}`;
|
|
35
49
|
if (result.status === "failed")
|
|
36
50
|
logger.warn(line);
|
|
@@ -38,16 +52,15 @@ async function testIntegrationConnectionsJob(container) {
|
|
|
38
52
|
logger.info(line);
|
|
39
53
|
}
|
|
40
54
|
catch (e) {
|
|
41
|
-
|
|
55
|
+
outcomes.push("errored");
|
|
42
56
|
logger.error(`[integration] ${target.provider_id} test errored: ${e?.message ?? e}`);
|
|
43
57
|
}
|
|
44
58
|
}
|
|
45
|
-
logger.info(
|
|
46
|
-
`skipped: ${counts.skipped}, errored: ${counts.errored}`);
|
|
59
|
+
logger.info(formatConnectionTestSummary(tallyOutcomes(outcomes)));
|
|
47
60
|
}
|
|
48
61
|
exports.config = {
|
|
49
62
|
name: "test-integration-connections-daily",
|
|
50
63
|
// Once a day, off-peak (03:00). Cron: minute hour day-of-month month day-of-week.
|
|
51
64
|
schedule: "0 3 * * *",
|
|
52
65
|
};
|
|
53
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1pbnRlZ3JhdGlvbi1jb25uZWN0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9qb2JzL3Rlc3QtaW50ZWdyYXRpb24tY29ubmVjdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBVUEsc0NBSUM7QUFHRCxrRUFLQztBQVlELGdEQW9DQztBQXJFRCx3REFBMkQ7QUFFM0QsMERBQTRFO0FBTTVFLG1HQUFtRztBQUNuRyxTQUFnQixhQUFhLENBQUMsUUFBK0I7SUFDM0QsTUFBTSxNQUFNLEdBQWtCLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFBO0lBQzlFLEtBQUssTUFBTSxDQUFDLElBQUksUUFBUTtRQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO0lBQ3JDLE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQztBQUVELDZGQUE2RjtBQUM3RixTQUFnQiwyQkFBMkIsQ0FBQyxNQUFxQjtJQUMvRCxPQUFPLENBQ0wsZ0RBQWdELE1BQU0sQ0FBQyxNQUFNLFdBQVcsTUFBTSxDQUFDLE1BQU0sSUFBSTtRQUN6RixZQUFZLE1BQU0sQ0FBQyxPQUFPLGNBQWMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUN6RCxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNZLEtBQUssVUFBVSw2QkFBNkIsQ0FBQyxTQUEwQjtJQUNwRixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFTLFFBQVEsQ0FBQyxDQUFBO0lBQ2xELE1BQU0sT0FBTyxHQUE2QixTQUFTLENBQUMsT0FBTyxDQUFDLGdDQUFrQixDQUFDLENBQUE7SUFFL0UsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0sT0FBTyxDQUFDLHdCQUF3QixFQUFFLENBQUE7SUFDakUsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FDakMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLElBQUksQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsbUJBQW1CLENBQ2hFLENBQUE7SUFFRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsTUFBTSxDQUFDLElBQUksQ0FBQyx1RUFBdUUsQ0FBQyxDQUFBO1FBQ3BGLE9BQU07SUFDUixDQUFDO0lBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyw4Q0FBOEMsT0FBTyxDQUFDLE1BQU0saUJBQWlCLENBQUMsQ0FBQTtJQUUxRixNQUFNLFFBQVEsR0FBa0IsRUFBRSxDQUFBO0lBRWxDLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBQSwrQ0FBaUMsRUFBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ3hFLEtBQUssRUFBRSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFO2FBQzNDLENBQUMsQ0FBQTtZQUNGLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQzVCLE1BQU0sSUFBSSxHQUFHLGlCQUFpQixNQUFNLENBQUMsV0FBVyxNQUFNLE1BQU0sQ0FBQyxNQUFNLEdBQ2pFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUMzQyxFQUFFLENBQUE7WUFDRixJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssUUFBUTtnQkFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBOztnQkFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN4QixDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQ3hCLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLE1BQU0sQ0FBQyxXQUFXLGtCQUFrQixDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDdEYsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDbkUsQ0FBQztBQUVZLFFBQUEsTUFBTSxHQUFHO0lBQ3BCLElBQUksRUFBRSxvQ0FBb0M7SUFDMUMsa0ZBQWtGO0lBQ2xGLFFBQVEsRUFBRSxXQUFXO0NBQ3RCLENBQUEifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const catalog_generated_1 = require("../catalog.generated");
|
|
4
|
+
describe("FALLBACK_CATALOG (generated from integrations.yml)", () => {
|
|
5
|
+
it("contains all five active integrations", () => {
|
|
6
|
+
expect(catalog_generated_1.FALLBACK_CATALOG).toHaveLength(5);
|
|
7
|
+
const ids = catalog_generated_1.FALLBACK_CATALOG.map((c) => c.integrationId).sort();
|
|
8
|
+
expect(ids).toEqual(["1c", "apiship", "robokassa", "tkassa", "yookassa"]);
|
|
9
|
+
});
|
|
10
|
+
it("flattens the 1c entry to the CatalogIntegration shape", () => {
|
|
11
|
+
const oneC = catalog_generated_1.FALLBACK_CATALOG.find((c) => c.integrationId === "1c");
|
|
12
|
+
expect(oneC).toMatchObject({
|
|
13
|
+
slug: "gorgo-medusa-1c",
|
|
14
|
+
npm: "@gorgo/medusa-1c",
|
|
15
|
+
category: "erp",
|
|
16
|
+
author: "gorgo",
|
|
17
|
+
authorLocalized: "Gorgo",
|
|
18
|
+
label: "1C:Enterprise",
|
|
19
|
+
icon: "/api/plugin-icon?slug=gorgo-medusa-1c",
|
|
20
|
+
stars: null,
|
|
21
|
+
downloads: null,
|
|
22
|
+
});
|
|
23
|
+
expect(oneC.configSnippet).toContain("@gorgo/medusa-1c");
|
|
24
|
+
});
|
|
25
|
+
it("every entry is well-formed", () => {
|
|
26
|
+
for (const c of catalog_generated_1.FALLBACK_CATALOG) {
|
|
27
|
+
expect(typeof c.integrationId).toBe("string");
|
|
28
|
+
expect(c.integrationId.length).toBeGreaterThan(0);
|
|
29
|
+
expect(typeof c.label).toBe("string");
|
|
30
|
+
expect(c.label.length).toBeGreaterThan(0);
|
|
31
|
+
expect(c.icon).toBe(`/api/plugin-icon?slug=${c.slug}`);
|
|
32
|
+
expect(c.stars).toBeNull();
|
|
33
|
+
expect(c.downloads).toBeNull();
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0YWxvZy1mYWxsYmFjay51bml0LnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL19fdGVzdHNfXy9jYXRhbG9nLWZhbGxiYWNrLnVuaXQuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDREQUF1RDtBQUV2RCxRQUFRLENBQUMsb0RBQW9ELEVBQUUsR0FBRyxFQUFFO0lBQ2xFLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxHQUFHLEVBQUU7UUFDL0MsTUFBTSxDQUFDLG9DQUFnQixDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3hDLE1BQU0sR0FBRyxHQUFHLG9DQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO1FBQy9ELE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQTtJQUMzRSxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyx1REFBdUQsRUFBRSxHQUFHLEVBQUU7UUFDL0QsTUFBTSxJQUFJLEdBQUcsb0NBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBRSxDQUFBO1FBQ3BFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUM7WUFDekIsSUFBSSxFQUFFLGlCQUFpQjtZQUN2QixHQUFHLEVBQUUsa0JBQWtCO1lBQ3ZCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsTUFBTSxFQUFFLE9BQU87WUFDZixlQUFlLEVBQUUsT0FBTztZQUN4QixLQUFLLEVBQUUsZUFBZTtZQUN0QixJQUFJLEVBQUUsdUNBQXVDO1lBQzdDLEtBQUssRUFBRSxJQUFJO1lBQ1gsU0FBUyxFQUFFLElBQUk7U0FDaEIsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtJQUMxRCxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxHQUFHLEVBQUU7UUFDcEMsS0FBSyxNQUFNLENBQUMsSUFBSSxvQ0FBZ0IsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDN0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2pELE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDckMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ3pDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtZQUN0RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFBO1lBQzFCLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUE7UUFDaEMsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const catalog_1 = require("../catalog");
|
|
4
|
+
const catalog_generated_1 = require("../catalog.generated");
|
|
5
|
+
const remoteItem = {
|
|
6
|
+
integrationId: "remote-only",
|
|
7
|
+
slug: "gorgo-remote",
|
|
8
|
+
npm: "@gorgo/remote",
|
|
9
|
+
category: "payment",
|
|
10
|
+
author: "gorgo",
|
|
11
|
+
authorLocalized: "Gorgo",
|
|
12
|
+
label: "Remote Only",
|
|
13
|
+
shortDescription: "from the api",
|
|
14
|
+
repository: "https://example.com",
|
|
15
|
+
docsUrl: "https://example.com/docs",
|
|
16
|
+
icon: "/api/plugin-icon?slug=gorgo-remote",
|
|
17
|
+
stars: 1,
|
|
18
|
+
downloads: null,
|
|
19
|
+
};
|
|
20
|
+
const okResponse = (integrations) => ({
|
|
21
|
+
ok: true,
|
|
22
|
+
status: 200,
|
|
23
|
+
json: async () => ({ integrations }),
|
|
24
|
+
});
|
|
25
|
+
describe("loadCatalog", () => {
|
|
26
|
+
const realFetch = global.fetch;
|
|
27
|
+
beforeEach(() => (0, catalog_1.resetCatalogCacheForTests)());
|
|
28
|
+
afterEach(() => {
|
|
29
|
+
global.fetch = realFetch;
|
|
30
|
+
jest.restoreAllMocks();
|
|
31
|
+
});
|
|
32
|
+
it("returns the remote catalog on success", async () => {
|
|
33
|
+
global.fetch = jest.fn().mockResolvedValue(okResponse([remoteItem]));
|
|
34
|
+
expect(await (0, catalog_1.loadCatalog)()).toEqual([remoteItem]);
|
|
35
|
+
});
|
|
36
|
+
it("caches within the TTL (no second fetch)", async () => {
|
|
37
|
+
const fetchMock = jest.fn().mockResolvedValue(okResponse([remoteItem]));
|
|
38
|
+
global.fetch = fetchMock;
|
|
39
|
+
await (0, catalog_1.loadCatalog)();
|
|
40
|
+
await (0, catalog_1.loadCatalog)();
|
|
41
|
+
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
42
|
+
});
|
|
43
|
+
it("falls back to FALLBACK_CATALOG when the fetch rejects", async () => {
|
|
44
|
+
global.fetch = jest.fn().mockRejectedValue(new Error("offline"));
|
|
45
|
+
expect(await (0, catalog_1.loadCatalog)()).toBe(catalog_generated_1.FALLBACK_CATALOG);
|
|
46
|
+
});
|
|
47
|
+
it("falls back when the response is not ok", async () => {
|
|
48
|
+
global.fetch = jest
|
|
49
|
+
.fn()
|
|
50
|
+
.mockResolvedValue({ ok: false, status: 500, json: async () => ({}) });
|
|
51
|
+
expect(await (0, catalog_1.loadCatalog)()).toBe(catalog_generated_1.FALLBACK_CATALOG);
|
|
52
|
+
});
|
|
53
|
+
it("falls back when the response shape is invalid", async () => {
|
|
54
|
+
global.fetch = jest.fn().mockResolvedValue(okResponse([{ nope: true }]));
|
|
55
|
+
expect(await (0, catalog_1.loadCatalog)()).toBe(catalog_generated_1.FALLBACK_CATALOG);
|
|
56
|
+
});
|
|
57
|
+
it("serves the last-good cache when a later fetch fails after TTL expiry", async () => {
|
|
58
|
+
const nowSpy = jest.spyOn(Date, "now").mockReturnValue(1_000);
|
|
59
|
+
const fetchMock = jest
|
|
60
|
+
.fn()
|
|
61
|
+
.mockResolvedValueOnce(okResponse([remoteItem]))
|
|
62
|
+
.mockRejectedValue(new Error("offline"));
|
|
63
|
+
global.fetch = fetchMock;
|
|
64
|
+
expect(await (0, catalog_1.loadCatalog)()).toEqual([remoteItem]); // fetch #1 → cached at t=1000
|
|
65
|
+
nowSpy.mockReturnValue(1_000 + 60 * 60 * 1000 + 1); // past the 1h TTL
|
|
66
|
+
const second = await (0, catalog_1.loadCatalog)(); // stale → fetch #2 rejects → last-good, not yml
|
|
67
|
+
expect(second).toEqual([remoteItem]);
|
|
68
|
+
expect(fetchMock).toHaveBeenCalledTimes(2);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0YWxvZy51bml0LnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL19fdGVzdHNfXy9jYXRhbG9nLnVuaXQuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHdDQUFtRTtBQUNuRSw0REFBdUQ7QUFFdkQsTUFBTSxVQUFVLEdBQUc7SUFDakIsYUFBYSxFQUFFLGFBQWE7SUFDNUIsSUFBSSxFQUFFLGNBQWM7SUFDcEIsR0FBRyxFQUFFLGVBQWU7SUFDcEIsUUFBUSxFQUFFLFNBQVM7SUFDbkIsTUFBTSxFQUFFLE9BQU87SUFDZixlQUFlLEVBQUUsT0FBTztJQUN4QixLQUFLLEVBQUUsYUFBYTtJQUNwQixnQkFBZ0IsRUFBRSxjQUFjO0lBQ2hDLFVBQVUsRUFBRSxxQkFBcUI7SUFDakMsT0FBTyxFQUFFLDBCQUEwQjtJQUNuQyxJQUFJLEVBQUUsb0NBQW9DO0lBQzFDLEtBQUssRUFBRSxDQUFDO0lBQ1IsU0FBUyxFQUFFLElBQUk7Q0FDaEIsQ0FBQTtBQUVELE1BQU0sVUFBVSxHQUFHLENBQUMsWUFBbUIsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMzQyxFQUFFLEVBQUUsSUFBSTtJQUNSLE1BQU0sRUFBRSxHQUFHO0lBQ1gsSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQ3JDLENBQUMsQ0FBQTtBQUVGLFFBQVEsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFO0lBQzNCLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUE7SUFDOUIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEsbUNBQXlCLEdBQUUsQ0FBQyxDQUFBO0lBQzdDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixNQUFNLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQTtRQUN4QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUE7SUFDeEIsQ0FBQyxDQUFDLENB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
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CatalogIntegration } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* The Gorgo integration catalog: the live API when reachable (cached ~1h), otherwise the
|
|
4
|
+
* last-good response, otherwise the yml-derived FALLBACK_CATALOG shipped with the plugin.
|
|
5
|
+
* Never throws.
|
|
6
|
+
*/
|
|
7
|
+
export declare function loadCatalog(): Promise<CatalogIntegration[]>;
|
|
8
|
+
/** Test-only: clear the in-memory cache between cases. */
|
|
9
|
+
export declare function resetCatalogCacheForTests(): void;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
// AUTO-GENERATED from src/lib/integrations.yml by scripts/gen-catalog.mjs.
|
|
4
|
+
// Do not edit by hand — run `node scripts/gen-catalog.mjs` to regenerate.
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.FALLBACK_CATALOG = void 0;
|
|
7
|
+
exports.FALLBACK_CATALOG = [
|
|
8
|
+
{
|
|
9
|
+
"integrationId": "1c",
|
|
10
|
+
"slug": "gorgo-medusa-1c",
|
|
11
|
+
"npm": "@gorgo/medusa-1c",
|
|
12
|
+
"category": "erp",
|
|
13
|
+
"author": "gorgo",
|
|
14
|
+
"authorLocalized": "Gorgo",
|
|
15
|
+
"label": "1C:Enterprise",
|
|
16
|
+
"shortDescription": "Data exchange between Medusa and 1C:Enterprise ERP",
|
|
17
|
+
"repository": "https://github.com/gorgojs/medusa-plugins",
|
|
18
|
+
"docsUrl": "https://docs.gorgojs.com/medusa-plugins/1c-enterprise",
|
|
19
|
+
"configSnippet": "// Registered as a module, not an integration provider:\n{\n resolve: \"@gorgo/medusa-1c\",\n}\n",
|
|
20
|
+
"icon": "/api/plugin-icon?slug=gorgo-medusa-1c",
|
|
21
|
+
"stars": null,
|
|
22
|
+
"downloads": null
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"integrationId": "apiship",
|
|
26
|
+
"slug": "gorgo-medusa-fulfillment-apiship",
|
|
27
|
+
"npm": "@gorgo/medusa-fulfillment-apiship",
|
|
28
|
+
"category": "fulfillment",
|
|
29
|
+
"author": "gorgo",
|
|
30
|
+
"authorLocalized": "Gorgo",
|
|
31
|
+
"label": "ApiShip",
|
|
32
|
+
"shortDescription": "Multi-carrier shipping aggregation via ApiShip",
|
|
33
|
+
"repository": "https://github.com/gorgojs/medusa-plugins",
|
|
34
|
+
"docsUrl": "https://docs.gorgojs.com/medusa-plugins/apiship",
|
|
35
|
+
"icon": "/api/plugin-icon?slug=gorgo-medusa-fulfillment-apiship",
|
|
36
|
+
"stars": null,
|
|
37
|
+
"downloads": null
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"integrationId": "robokassa",
|
|
41
|
+
"slug": "gorgo-medusa-payment-robokassa",
|
|
42
|
+
"npm": "@gorgo/medusa-payment-robokassa",
|
|
43
|
+
"category": "payment",
|
|
44
|
+
"author": "gorgo",
|
|
45
|
+
"authorLocalized": "Gorgo",
|
|
46
|
+
"label": "Robokassa",
|
|
47
|
+
"shortDescription": "Accept payments via Robokassa",
|
|
48
|
+
"repository": "https://github.com/gorgojs/medusa-plugins",
|
|
49
|
+
"docsUrl": "https://docs.gorgojs.com/medusa-plugins/robokassa",
|
|
50
|
+
"configSnippet": "{\n resolve: \"@gorgo/medusa-payment-robokassa\",\n options: {\n // credentials & settings are managed in Admin, not here\n },\n}\n",
|
|
51
|
+
"icon": "/api/plugin-icon?slug=gorgo-medusa-payment-robokassa",
|
|
52
|
+
"stars": null,
|
|
53
|
+
"downloads": null
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"integrationId": "tkassa",
|
|
57
|
+
"slug": "gorgo-medusa-payment-tkassa",
|
|
58
|
+
"npm": "@gorgo/medusa-payment-tkassa",
|
|
59
|
+
"category": "payment",
|
|
60
|
+
"author": "gorgo",
|
|
61
|
+
"authorLocalized": "Gorgo",
|
|
62
|
+
"label": "T-Kassa",
|
|
63
|
+
"shortDescription": "Accept payments via T-Kassa by T-Bank",
|
|
64
|
+
"repository": "https://github.com/gorgojs/medusa-plugins",
|
|
65
|
+
"docsUrl": "https://docs.gorgojs.com/medusa-plugins/t-kassa",
|
|
66
|
+
"configSnippet": "{\n resolve: \"@gorgo/medusa-payment-tkassa\",\n options: {\n // credentials & settings are managed in Admin, not here\n },\n}\n",
|
|
67
|
+
"icon": "/api/plugin-icon?slug=gorgo-medusa-payment-tkassa",
|
|
68
|
+
"stars": null,
|
|
69
|
+
"downloads": null
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"integrationId": "yookassa",
|
|
73
|
+
"slug": "gorgo-medusa-payment-yookassa",
|
|
74
|
+
"npm": "@gorgo/medusa-payment-yookassa",
|
|
75
|
+
"category": "payment",
|
|
76
|
+
"author": "gorgo",
|
|
77
|
+
"authorLocalized": "Gorgo",
|
|
78
|
+
"label": "YooKassa",
|
|
79
|
+
"shortDescription": "Accept payments via YooKassa",
|
|
80
|
+
"repository": "https://github.com/gorgojs/medusa-plugins",
|
|
81
|
+
"docsUrl": "https://docs.gorgojs.com/medusa-plugins/yookassa",
|
|
82
|
+
"configSnippet": "{\n resolve: \"@gorgo/medusa-payment-yookassa\",\n options: {\n // credentials & settings are managed in Admin, not here\n },\n}\n",
|
|
83
|
+
"icon": "/api/plugin-icon?slug=gorgo-medusa-payment-yookassa",
|
|
84
|
+
"stars": null,
|
|
85
|
+
"downloads": null
|
|
86
|
+
}
|
|
87
|
+
];
|
|
88
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0YWxvZy5nZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NhdGFsb2cuZ2VuZXJhdGVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvQkFBb0I7QUFDcEIsMkVBQTJFO0FBQzNFLDBFQUEwRTs7O0FBSTdELFFBQUEsZ0JBQWdCLEdBQXlCO0lBQ3BEO1FBQ0UsZUFBZSxFQUFFLElBQUk7UUFDckIsTUFBTSxFQUFFLGlCQUFpQjtRQUN6QixLQUFLLEVBQUUsa0JBQWtCO1FBQ3pCLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLFFBQVEsRUFBRSxPQUFPO1FBQ2pCLGlCQUFpQixFQUFFLE9BQU87UUFDMUIsT0FBTyxFQUFFLGVBQWU7UUFDeEIsa0JBQWtCLEVBQUUsb0RBQW9EO1FBQ3hFLFlBQVksRUFBRSwyQ0FBMkM7UUFDekQsU0FBUyxFQUFFLHVEQUF1RDtRQUNsRSxlQUFlLEVBQUUsbUdBQW1HO1FBQ3BILE1BQU0sRUFBRSx1Q0FBdUM7UUFDL0MsT0FBTyxFQUFFLElBQUk7UUFDYixXQUFXLEVBQUUsSUFBSTtLQUNsQjtJQUNEO1FBQ0UsZUFBZSxFQUFFLFNBQVM7UUFDMUIsTUFBTSxFQUFFLGtDQUFrQztRQUMxQyxLQUFLLEVBQUUsbUNBQW1DO1FBQzFDLFVBQVUsRUFBRSxhQUFhO1FBQ3pCLFFBQVEsRUFBRSxPQUFPO1FBQ2pCLGlCQUFpQixFQUFFLE9BQU87UUFDMUIsT0FBTyxFQUFFLFNBQVM7UUFDbEIsa0JBQWtCLEVBQUUsZ0RBQWdEO1FBQ3BFLFlBQVksRUFBRSwyQ0FBMkM7UUFDekQsU0FBUyxFQUFFLGlEQUFpRDtRQUM1RCxNQUFNLEVBQUUsd0RBQXdEO1FBQ2hFLE9BQU8sRUFBRSxJQUFJO1FBQ2IsV0FBVyxFQUFFLElBQUk7S0FDbEI7SUFDRDtRQUNFLGVBQWUsRUFBRSxXQUFXO1FBQzVCLE1BQU0sRUFBRSxnQ0FBZ0M7UUFDeEMsS0FBSyxFQUFFLGlDQUFpQztRQUN4QyxVQUFVLEVBQUUsU0FBUztRQUNyQixRQUFRLEVBQUUsT0FBTztRQUNqQixpQkFBaUIsRUFBRSxPQUFPO1FBQzFCLE9BQU8sRUFBRSxXQUFXO1FBQ3BCLGtCQUFrQixFQUFFLCtCQUErQjtRQUNuRCxZQUFZLEVBQUUsMkNBQTJDO1FBQ3pELFNBQVMsRUFBRSxtREFBbUQ7UUFDOUQsZUFBZSxFQUFFLDJJQUEySTtRQUM1SixNQUFNLEVBQUUsc0RBQXNEO1FBQzlELE9BQU8sRUFBRSxJQUFJO1FBQ2IsV0FBVyxFQUFFLElBQUk7S0FDbEI7SUFDRDtRQUNFLGVBQWUsRUFBRSxRQUFRO1FBQ3pCLE1BQU0sRUFBRSw2QkFBNkI7UUFDckMsS0FBSyxFQUFFLDhCQUE4QjtRQUNyQyxVQUFVLEVBQUUsU0FBUztRQUNyQixRQUFRLEVBQUUsT0FBTztRQUNqQixpQkFBaUIsRUFBRSxPQUFPO1FBQzFCLE9BQU8sRUFBRSxTQUFTO1FBQ2xCLGtCQUFrQixFQUFFLHVDQUF1QztRQUMzRCxZQUFZLEVBQUUsMkNBQTJDO1FBQ3pELFNBQVMsRUFBRSxpREFBaUQ7UUFDNUQsZUFBZSxFQUFFLHdJQUF3STtRQUN6SixNQUFNLEVBQUUsbURBQW1EO1FBQzNELE9BQU8sRUFBRSxJQUFJO1FBQ2IsV0FBVyxFQUFFLElBQUk7S0FDbEI7SUFDRDtRQUNFLGVBQWUsRUFBRSxVQUFVO1FBQzNCLE1BQU0sRUFBRSwrQkFBK0I7UUFDdkMsS0FBSyxFQUFFLGdDQUFnQztRQUN2QyxVQUFVLEVBQUUsU0FBUztRQUNyQixRQUFRLEVBQUUsT0FBTztRQUNqQixpQkFBaUIsRUFBRSxPQUFPO1FBQzFCLE9BQU8sRUFBRSxVQUFVO1FBQ25CLGtCQUFrQixFQUFFLDhCQUE4QjtRQUNsRCxZQUFZLEVBQUUsMkNBQTJDO1FBQ3pELFNBQVMsRUFBRSxrREFBa0Q7UUFDN0QsZUFBZSxFQUFFLDBJQUEwSTtRQUMzSixNQUFNLEVBQUUscURBQXFEO1FBQzdELE9BQU8sRUFBRSxJQUFJO1FBQ2IsV0FBVyxFQUFFLElBQUk7S0FDbEI7Q0FDRixDQUFBIn0=
|