@gorgo/medusa-integration 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.medusa/server/src/admin/index.js +2259 -0
- package/.medusa/server/src/admin/index.mjs +2257 -0
- package/.medusa/server/src/api/admin/integrations/[provider_id]/enable/route.d.ts +5 -0
- package/.medusa/server/src/api/admin/integrations/[provider_id]/enable/route.js +17 -0
- package/.medusa/server/src/api/admin/integrations/[provider_id]/route.d.ts +7 -0
- package/.medusa/server/src/api/admin/integrations/[provider_id]/route.js +46 -0
- package/.medusa/server/src/api/admin/integrations/[provider_id]/test-connection/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/integrations/[provider_id]/test-connection/route.js +16 -0
- package/.medusa/server/src/api/admin/integrations/_helpers.d.ts +16 -0
- package/.medusa/server/src/api/admin/integrations/_helpers.js +52 -0
- package/.medusa/server/src/api/admin/integrations/middlewares.d.ts +2 -0
- package/.medusa/server/src/api/admin/integrations/middlewares.js +21 -0
- package/.medusa/server/src/api/admin/integrations/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/integrations/route.js +11 -0
- package/.medusa/server/src/api/admin/integrations/validators.d.ts +11 -0
- package/.medusa/server/src/api/admin/integrations/validators.js +15 -0
- package/.medusa/server/src/api/middlewares.d.ts +2 -0
- package/.medusa/server/src/api/middlewares.js +10 -0
- package/.medusa/server/src/index.d.ts +10 -0
- package/.medusa/server/src/index.js +22 -0
- package/.medusa/server/src/jobs/test-integration-connections.d.ts +16 -0
- package/.medusa/server/src/jobs/test-integration-connections.js +53 -0
- package/.medusa/server/src/modules/integration/descriptor/__tests__/build-zod.unit.spec.d.ts +1 -0
- package/.medusa/server/src/modules/integration/descriptor/__tests__/build-zod.unit.spec.js +64 -0
- package/.medusa/server/src/modules/integration/descriptor/__tests__/define.unit.spec.d.ts +1 -0
- package/.medusa/server/src/modules/integration/descriptor/__tests__/define.unit.spec.js +41 -0
- package/.medusa/server/src/modules/integration/descriptor/__tests__/introspect.unit.spec.d.ts +1 -0
- package/.medusa/server/src/modules/integration/descriptor/__tests__/introspect.unit.spec.js +93 -0
- package/.medusa/server/src/modules/integration/descriptor/__tests__/validate.unit.spec.d.ts +1 -0
- package/.medusa/server/src/modules/integration/descriptor/__tests__/validate.unit.spec.js +64 -0
- package/.medusa/server/src/modules/integration/descriptor/build-zod.d.ts +8 -0
- package/.medusa/server/src/modules/integration/descriptor/build-zod.js +82 -0
- package/.medusa/server/src/modules/integration/descriptor/define.d.ts +74 -0
- package/.medusa/server/src/modules/integration/descriptor/define.js +31 -0
- package/.medusa/server/src/modules/integration/descriptor/index.d.ts +5 -0
- package/.medusa/server/src/modules/integration/descriptor/index.js +22 -0
- package/.medusa/server/src/modules/integration/descriptor/introspect.d.ts +5 -0
- package/.medusa/server/src/modules/integration/descriptor/introspect.js +67 -0
- package/.medusa/server/src/modules/integration/descriptor/meta.d.ts +7 -0
- package/.medusa/server/src/modules/integration/descriptor/meta.js +3 -0
- package/.medusa/server/src/modules/integration/descriptor/option.d.ts +104 -0
- package/.medusa/server/src/modules/integration/descriptor/option.js +3 -0
- package/.medusa/server/src/modules/integration/descriptor/validate.d.ts +29 -0
- package/.medusa/server/src/modules/integration/descriptor/validate.js +69 -0
- package/.medusa/server/src/modules/integration/index.d.ts +22 -0
- package/.medusa/server/src/modules/integration/index.js +15 -0
- package/.medusa/server/src/modules/integration/loaders/index.d.ts +1 -0
- package/.medusa/server/src/modules/integration/loaders/index.js +9 -0
- package/.medusa/server/src/modules/integration/loaders/load-providers.d.ts +5 -0
- package/.medusa/server/src/modules/integration/loaders/load-providers.js +35 -0
- package/.medusa/server/src/modules/integration/migrations/Migration20260610215533.d.ts +5 -0
- package/.medusa/server/src/modules/integration/migrations/Migration20260610215533.js +18 -0
- package/.medusa/server/src/modules/integration/migrations/Migration20260618154037.d.ts +5 -0
- package/.medusa/server/src/modules/integration/migrations/Migration20260618154037.js +27 -0
- package/.medusa/server/src/modules/integration/migrations/Migration20260622120502.d.ts +5 -0
- package/.medusa/server/src/modules/integration/migrations/Migration20260622120502.js +14 -0
- package/.medusa/server/src/modules/integration/migrations/Migration20260701095518.d.ts +5 -0
- package/.medusa/server/src/modules/integration/migrations/Migration20260701095518.js +14 -0
- package/.medusa/server/src/modules/integration/migrations/Migration20260708072033.d.ts +5 -0
- package/.medusa/server/src/modules/integration/migrations/Migration20260708072033.js +14 -0
- package/.medusa/server/src/modules/integration/models/integration.d.ts +13 -0
- package/.medusa/server/src/modules/integration/models/integration.js +27 -0
- package/.medusa/server/src/modules/integration/services/__tests__/crypto.unit.spec.d.ts +1 -0
- package/.medusa/server/src/modules/integration/services/__tests__/crypto.unit.spec.js +33 -0
- package/.medusa/server/src/modules/integration/services/__tests__/integration-provider.unit.spec.d.ts +1 -0
- package/.medusa/server/src/modules/integration/services/__tests__/integration-provider.unit.spec.js +77 -0
- package/.medusa/server/src/modules/integration/services/__tests__/secrets.unit.spec.d.ts +1 -0
- package/.medusa/server/src/modules/integration/services/__tests__/secrets.unit.spec.js +33 -0
- package/.medusa/server/src/modules/integration/services/crypto.d.ts +10 -0
- package/.medusa/server/src/modules/integration/services/crypto.js +41 -0
- package/.medusa/server/src/modules/integration/services/index.d.ts +3 -0
- package/.medusa/server/src/modules/integration/services/index.js +11 -0
- package/.medusa/server/src/modules/integration/services/integration-module.d.ts +113 -0
- package/.medusa/server/src/modules/integration/services/integration-module.js +219 -0
- package/.medusa/server/src/modules/integration/services/integration-provider.d.ts +49 -0
- package/.medusa/server/src/modules/integration/services/integration-provider.js +76 -0
- package/.medusa/server/src/modules/integration/services/secrets.d.ts +11 -0
- package/.medusa/server/src/modules/integration/services/secrets.js +31 -0
- package/.medusa/server/src/modules/integration/types/index.d.ts +13 -0
- package/.medusa/server/src/modules/integration/types/index.js +10 -0
- package/.medusa/server/src/modules/integration/utils/abstract-integration-provider.d.ts +39 -0
- package/.medusa/server/src/modules/integration/utils/abstract-integration-provider.js +42 -0
- package/.medusa/server/src/modules/integration/utils/index.d.ts +1 -0
- package/.medusa/server/src/modules/integration/utils/index.js +6 -0
- package/.medusa/server/src/subscribers/invalidate-options-cache.d.ts +5 -0
- package/.medusa/server/src/subscribers/invalidate-options-cache.js +13 -0
- package/.medusa/server/src/types/bundles.d.ts +1 -0
- package/.medusa/server/src/types/bundles.js +38 -0
- package/.medusa/server/src/types/http/index.d.ts +1 -0
- package/.medusa/server/src/types/http/index.js +18 -0
- package/.medusa/server/src/types/http/integration/admin/entities.d.ts +32 -0
- package/.medusa/server/src/types/http/integration/admin/entities.js +3 -0
- package/.medusa/server/src/types/http/integration/admin/index.d.ts +2 -0
- package/.medusa/server/src/types/http/integration/admin/index.js +19 -0
- package/.medusa/server/src/types/http/integration/admin/responses.d.ts +19 -0
- package/.medusa/server/src/types/http/integration/admin/responses.js +3 -0
- package/.medusa/server/src/types/http/integration/index.d.ts +1 -0
- package/.medusa/server/src/types/http/integration/index.js +18 -0
- package/.medusa/server/src/types/index.d.ts +3 -0
- package/.medusa/server/src/types/index.js +20 -0
- package/.medusa/server/src/types/integration/common.d.ts +70 -0
- package/.medusa/server/src/types/integration/common.js +3 -0
- package/.medusa/server/src/types/integration/index.d.ts +1 -0
- package/.medusa/server/src/types/integration/index.js +18 -0
- package/.medusa/server/src/workflows/integration/index.d.ts +2 -0
- package/.medusa/server/src/workflows/integration/index.js +19 -0
- package/.medusa/server/src/workflows/integration/steps/apply-integration-section.d.ts +22 -0
- package/.medusa/server/src/workflows/integration/steps/apply-integration-section.js +70 -0
- package/.medusa/server/src/workflows/integration/steps/delete-integration-record.d.ts +6 -0
- package/.medusa/server/src/workflows/integration/steps/delete-integration-record.js +16 -0
- package/.medusa/server/src/workflows/integration/steps/emit-integration-event.d.ts +5 -0
- package/.medusa/server/src/workflows/integration/steps/emit-integration-event.js +11 -0
- package/.medusa/server/src/workflows/integration/steps/index.d.ts +6 -0
- package/.medusa/server/src/workflows/integration/steps/index.js +16 -0
- package/.medusa/server/src/workflows/integration/steps/run-test-connection.d.ts +4 -0
- package/.medusa/server/src/workflows/integration/steps/run-test-connection.js +20 -0
- package/.medusa/server/src/workflows/integration/steps/set-integration-enabled.d.ts +19 -0
- package/.medusa/server/src/workflows/integration/steps/set-integration-enabled.js +27 -0
- package/.medusa/server/src/workflows/integration/steps/upsert-integration-record.d.ts +9 -0
- package/.medusa/server/src/workflows/integration/steps/upsert-integration-record.js +18 -0
- package/.medusa/server/src/workflows/integration/workflows/delete-integration.d.ts +7 -0
- package/.medusa/server/src/workflows/integration/workflows/delete-integration.js +18 -0
- package/.medusa/server/src/workflows/integration/workflows/index.d.ts +4 -0
- package/.medusa/server/src/workflows/integration/workflows/index.js +12 -0
- package/.medusa/server/src/workflows/integration/workflows/set-integration-enabled.d.ts +20 -0
- package/.medusa/server/src/workflows/integration/workflows/set-integration-enabled.js +20 -0
- package/.medusa/server/src/workflows/integration/workflows/test-integration-connection.d.ts +5 -0
- package/.medusa/server/src/workflows/integration/workflows/test-integration-connection.js +21 -0
- package/.medusa/server/src/workflows/integration/workflows/upsert-integration.d.ts +8 -0
- package/.medusa/server/src/workflows/integration/workflows/upsert-integration.js +30 -0
- package/LICENSE +21 -0
- package/README.md +46 -0
- package/package.json +79 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { IntegrationDescriptor } from "./define";
|
|
2
|
+
export type ValidationIssue = {
|
|
3
|
+
path: string;
|
|
4
|
+
message: string;
|
|
5
|
+
};
|
|
6
|
+
type WithOptions = Pick<IntegrationDescriptor, "options">;
|
|
7
|
+
type FullValidatable = Pick<IntegrationDescriptor, "options" | "optionsSchema" | "validate">;
|
|
8
|
+
/**
|
|
9
|
+
* Validate EXACTLY the submitted option ids against the merged config (submitted values
|
|
10
|
+
* merged over the rest of the stored config, done by the caller). Cross-field `validate`
|
|
11
|
+
* rules can read siblings via `ctx.options`. Built-in sections pass their section's ids;
|
|
12
|
+
* a widget passes whatever option ids it manages. Unknown ids must be filtered by the
|
|
13
|
+
* caller — this function only validates ids that exist in the catalog.
|
|
14
|
+
*/
|
|
15
|
+
export declare function validateOptions(descriptor: WithOptions, ids: readonly string[], merged: Record<string, unknown>): {
|
|
16
|
+
success: true;
|
|
17
|
+
data: Record<string, unknown>;
|
|
18
|
+
} | {
|
|
19
|
+
success: false;
|
|
20
|
+
issues: ValidationIssue[];
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Full (activation) validation of an assembled config: the composed schema (all options,
|
|
24
|
+
* with defaults), every option's cross-field `validate`, and the descriptor's cross-section
|
|
25
|
+
* `validate`. Empty array ⇒ complete.
|
|
26
|
+
*/
|
|
27
|
+
export declare function collectValidationIssues(descriptor: FullValidatable, full: Record<string, unknown>): ValidationIssue[];
|
|
28
|
+
export declare function isDescriptorComplete(descriptor: FullValidatable, full: Record<string, unknown>): boolean;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateOptions = validateOptions;
|
|
4
|
+
exports.collectValidationIssues = collectValidationIssues;
|
|
5
|
+
exports.isDescriptorComplete = isDescriptorComplete;
|
|
6
|
+
const build_zod_1 = require("./build-zod");
|
|
7
|
+
/** Run one option's zod + its cross-field `validate` against the merged config. */
|
|
8
|
+
function validateOne(id, def, merged, push) {
|
|
9
|
+
const res = (0, build_zod_1.optionToZod)(def).safeParse(merged[id]);
|
|
10
|
+
if (!res.success) {
|
|
11
|
+
for (const i of res.error.issues)
|
|
12
|
+
push({ path: [id, ...i.path].join(".") || id, message: i.message });
|
|
13
|
+
return merged[id];
|
|
14
|
+
}
|
|
15
|
+
const value = res.data;
|
|
16
|
+
def.validate?.(value, {
|
|
17
|
+
options: merged,
|
|
18
|
+
addIssue: (issue) => push({ path: (issue.path ?? [id]).join("."), message: issue.message }),
|
|
19
|
+
});
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Validate EXACTLY the submitted option ids against the merged config (submitted values
|
|
24
|
+
* merged over the rest of the stored config, done by the caller). Cross-field `validate`
|
|
25
|
+
* rules can read siblings via `ctx.options`. Built-in sections pass their section's ids;
|
|
26
|
+
* a widget passes whatever option ids it manages. Unknown ids must be filtered by the
|
|
27
|
+
* caller — this function only validates ids that exist in the catalog.
|
|
28
|
+
*/
|
|
29
|
+
function validateOptions(descriptor, ids, merged) {
|
|
30
|
+
const issues = [];
|
|
31
|
+
const data = {};
|
|
32
|
+
for (const id of ids) {
|
|
33
|
+
if (!Object.prototype.hasOwnProperty.call(descriptor.options, id))
|
|
34
|
+
continue;
|
|
35
|
+
const def = descriptor.options[id];
|
|
36
|
+
data[id] = validateOne(id, def, merged, (i) => issues.push(i));
|
|
37
|
+
}
|
|
38
|
+
if (issues.length)
|
|
39
|
+
return { success: false, issues };
|
|
40
|
+
return { success: true, data };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Full (activation) validation of an assembled config: the composed schema (all options,
|
|
44
|
+
* with defaults), every option's cross-field `validate`, and the descriptor's cross-section
|
|
45
|
+
* `validate`. Empty array ⇒ complete.
|
|
46
|
+
*/
|
|
47
|
+
function collectValidationIssues(descriptor, full) {
|
|
48
|
+
const issues = [];
|
|
49
|
+
const parsed = descriptor.optionsSchema.safeParse(full);
|
|
50
|
+
if (!parsed.success) {
|
|
51
|
+
for (const i of parsed.error.issues)
|
|
52
|
+
issues.push({ path: i.path.join("."), message: i.message });
|
|
53
|
+
}
|
|
54
|
+
const merged = (parsed.success ? parsed.data : full) ?? {};
|
|
55
|
+
for (const [id, def] of Object.entries(descriptor.options)) {
|
|
56
|
+
def.validate?.(merged[id], {
|
|
57
|
+
options: merged,
|
|
58
|
+
addIssue: (issue) => issues.push({ path: (issue.path ?? [id]).join("."), message: issue.message }),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
descriptor.validate?.(merged, {
|
|
62
|
+
addIssue: (issue) => issues.push({ path: (issue.path ?? []).join("."), message: issue.message }),
|
|
63
|
+
});
|
|
64
|
+
return issues;
|
|
65
|
+
}
|
|
66
|
+
function isDescriptorComplete(descriptor, full) {
|
|
67
|
+
return collectValidationIssues(descriptor, full).length === 0;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9pbnRlZ3JhdGlvbi9kZXNjcmlwdG9yL3ZhbGlkYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBb0NBLDBDQWdCQztBQU9ELDBEQW9CQztBQUVELG9EQUtDO0FBcEZELDJDQUF5QztBQU96QyxtRkFBbUY7QUFDbkYsU0FBUyxXQUFXLENBQ2xCLEVBQVUsRUFDVixHQUFjLEVBQ2QsTUFBK0IsRUFDL0IsSUFBc0M7SUFFdEMsTUFBTSxHQUFHLEdBQUcsSUFBQSx1QkFBVyxFQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUNsRCxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pCLEtBQUssTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO1FBQ3JHLE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ25CLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFBO0lBQ3RCLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFjLEVBQUU7UUFDN0IsT0FBTyxFQUFFLE1BQU07UUFDZixRQUFRLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxP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
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import IntegrationModuleService from "./services/integration-module";
|
|
2
|
+
export declare const INTEGRATION_MODULE = "integration";
|
|
3
|
+
declare const _default: import("@medusajs/types").ModuleExports<typeof IntegrationModuleService> & {
|
|
4
|
+
linkable: {
|
|
5
|
+
readonly integration: {
|
|
6
|
+
id: {
|
|
7
|
+
serviceName: "integration";
|
|
8
|
+
field: "integration";
|
|
9
|
+
linkable: "integration_id";
|
|
10
|
+
primaryKey: "id";
|
|
11
|
+
};
|
|
12
|
+
toJSON: () => {
|
|
13
|
+
serviceName: "integration";
|
|
14
|
+
field: "integration";
|
|
15
|
+
linkable: "integration_id";
|
|
16
|
+
primaryKey: "id";
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
export default _default;
|
|
22
|
+
export type { IntegrationModuleOptions } from "./types";
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.INTEGRATION_MODULE = void 0;
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
const integration_module_1 = __importDefault(require("./services/integration-module"));
|
|
9
|
+
const loaders_1 = require("./loaders");
|
|
10
|
+
exports.INTEGRATION_MODULE = "integration";
|
|
11
|
+
exports.default = (0, utils_1.Module)(exports.INTEGRATION_MODULE, {
|
|
12
|
+
service: integration_module_1.default,
|
|
13
|
+
loaders: [loaders_1.loadProviders],
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9pbnRlZ3JhdGlvbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxxREFBa0Q7QUFDbEQsdUZBQW9FO0FBQ3BFLHVDQUF5QztBQUU1QixRQUFBLGtCQUFrQixHQUFHLGFBQWEsQ0FBQTtBQUUvQyxrQkFBZSxJQUFBLGNBQU0sRUFBQywwQkFBa0IsRUFBRTtJQUN4QyxPQUFPLEVBQUUsNEJBQXdCO0lBQ2pDLE9BQU8sRUFBRSxDQUFDLHVCQUFhLENBQUM7Q0FDekIsQ0FBQyxDQUFBIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as loadProviders } from "./load-providers";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.loadProviders = void 0;
|
|
7
|
+
var load_providers_1 = require("./load-providers");
|
|
8
|
+
Object.defineProperty(exports, "loadProviders", { enumerable: true, get: function () { return __importDefault(load_providers_1).default; } });
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9pbnRlZ3JhdGlvbi9sb2FkZXJzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQUEyRDtBQUFsRCxnSUFBQSxPQUFPLE9BQWlCIn0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { LoaderOptions, ModuleProvider, ModulesSdkTypes } from "@medusajs/framework/types";
|
|
2
|
+
declare const _default: ({ container, options, }: LoaderOptions<(ModulesSdkTypes.ModuleServiceInitializeOptions | ModulesSdkTypes.ModuleServiceInitializeCustomDataLayerOptions) & {
|
|
3
|
+
providers?: ModuleProvider[];
|
|
4
|
+
}>) => Promise<void>;
|
|
5
|
+
export default _default;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const awilix_1 = require("@medusajs/framework/awilix");
|
|
4
|
+
const modules_sdk_1 = require("@medusajs/framework/modules-sdk");
|
|
5
|
+
const types_1 = require("../types");
|
|
6
|
+
/**
|
|
7
|
+
* Registers each integration-provider class into the module container under
|
|
8
|
+
* `int_<identifier>[_<id>]`, mirroring how the payment/fulfillment modules load
|
|
9
|
+
* their providers. Providers come from the integration plugin's `options.providers`,
|
|
10
|
+
* each entry being `{ resolve, id?, options? }`. Also exposes the resolved module
|
|
11
|
+
* options (encryptionKey, …) under INTEGRATION_OPTIONS_KEY for the module service.
|
|
12
|
+
*/
|
|
13
|
+
const registrationFn = async (klass, container, pluginOptions) => {
|
|
14
|
+
const instanceId = pluginOptions.id ?? null;
|
|
15
|
+
const key = `${types_1.IntegrationProviderRegistrationPrefix}${klass.identifier}${instanceId ? `_${instanceId}` : ""}`;
|
|
16
|
+
container.register({
|
|
17
|
+
// Pass `instanceId` as the 3rd ctor arg so the provider knows which instance it is
|
|
18
|
+
// (see AbstractIntegrationProvider.getInstanceId). The container key encodes the same.
|
|
19
|
+
[key]: (0, awilix_1.asFunction)((cradle) => new klass(cradle, pluginOptions.options, instanceId), {
|
|
20
|
+
lifetime: klass.LIFE_TIME || awilix_1.Lifetime.SINGLETON,
|
|
21
|
+
}),
|
|
22
|
+
});
|
|
23
|
+
container.registerAdd(types_1.IntegrationProviderRegistrationKey, (0, awilix_1.asValue)(key));
|
|
24
|
+
};
|
|
25
|
+
exports.default = async ({ container, options, }) => {
|
|
26
|
+
container.register({
|
|
27
|
+
[types_1.INTEGRATION_OPTIONS_KEY]: (0, awilix_1.asValue)(options ?? {}),
|
|
28
|
+
});
|
|
29
|
+
await (0, modules_sdk_1.moduleProviderLoader)({
|
|
30
|
+
container,
|
|
31
|
+
providers: options?.providers || [],
|
|
32
|
+
registerServiceFn: registrationFn,
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC1wcm92aWRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9pbnRlZ3JhdGlvbi9sb2FkZXJzL2xvYWQtcHJvdmlkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsdURBQTBFO0FBQzFFLGlFQUFzRTtBQU10RSxvQ0FJaUI7QUFFakI7Ozs7OztHQU1HO0FBQ0gsTUFBTSxjQUFjLEdBQUcsS0FBSyxFQUMxQixLQUFVLEVBQ1YsU0FBYyxFQUNkLGFBQWlFLEVBQ2pFLEVBQUU7SUFDRixNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQTtJQUMzQyxNQUFNLEdBQUcsR0FBRyxHQUFHLDZDQUFxQyxHQUFHLEtBQUssQ0FBQyxVQUFVLEdBQ3JFLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFDbEMsRUFBRSxDQUFBO0lBRUYsU0FBUyxDQUFDLFFBQVEsQ0FBQztRQUNqQixtRkFBbUY7UUFDbkYsdUZBQXVGO1FBQ3ZGLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBQSxtQkFBVSxFQUFDLENBQUMsTUFBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsRUFBRTtZQUN2RixRQUFRLEVBQUUsS0FBSyxDQUFDLFNBQVMsSUFBSSxpQkFBUSxDQUFDLFNBQVM7U0FDaEQsQ0FBQztLQUNILENBQUMsQ0FBQTtJQUVGLFNBQVMsQ0FBQyxXQUFXLENBQUMsMENBQWtDLEVBQUUsSUFBQSxnQkFBTyxFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7QUFDekUsQ0FBQyxDQUFBO0FBRUQsa0JBQWUsS0FBSyxFQUFFLEVBQ3BCLFNBQVMsRUFDVCxPQUFPLEdBTVIsRUFBaUIsRUFBRTtJQUNsQixTQUFTLENBQUMsUUFBUSxDQUFDO1FBQ2pCLENBQUMsK0JBQXVCLENBQUMsRUFBRSxJQUFBLGdCQUFPLEVBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztLQUNsRCxDQUFDLENBQUE7SUFFRixNQUFNLElBQUEsa0NBQW9CLEVBQUM7UUFDekIsU0FBUztRQUNULFNBQVMsRUFBRSxPQUFPLEVBQUUsU0FBUyxJQUFJLEVBQUU7UUFDbkMsaUJBQWlCLEVBQUUsY0FBYztLQUNsQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUEifQ==
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Migration20260610215533 = void 0;
|
|
4
|
+
const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
|
|
5
|
+
class Migration20260610215533 extends migrations_1.Migration {
|
|
6
|
+
async up() {
|
|
7
|
+
this.addSql(`alter table if exists "integration" drop constraint if exists "integration_plugin_id_instance_id_unique";`);
|
|
8
|
+
this.addSql(`create table if not exists "integration" ("id" text not null, "plugin_kind" text check ("plugin_kind" in ('payment', 'fulfillment', 'marketplace', 'crm', 'erp', 'pim', 'notification', 'feed', 'tax', 'other')) not null, "plugin_id" text not null, "instance_id" text null, "title" text null, "credentials_ciphertext" text null, "credentials_iv" text null, "settings" jsonb not null default '{}', "schema_version" integer not null default 1, "is_enabled" boolean not null default true, "last_test_at" timestamptz null, "last_test_status" text check ("last_test_status" in ('ok', 'fail', 'skipped')) null, "last_test_message" text null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "integration_pkey" primary key ("id"));`);
|
|
9
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_integration_deleted_at" ON "integration" ("deleted_at") WHERE deleted_at IS NULL;`);
|
|
10
|
+
this.addSql(`CREATE UNIQUE INDEX IF NOT EXISTS "IDX_integration_plugin_id_instance_id_unique" ON "integration" ("plugin_id", "instance_id") WHERE deleted_at IS NULL;`);
|
|
11
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_integration_plugin_kind" ON "integration" ("plugin_kind") WHERE deleted_at IS NULL;`);
|
|
12
|
+
}
|
|
13
|
+
async down() {
|
|
14
|
+
this.addSql(`drop table if exists "integration" cascade;`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.Migration20260610215533 = Migration20260610215533;
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA2MTAyMTU1MzMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9pbnRlZ3JhdGlvbi9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjYwNjEwMjE1NTMzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlFQUFxRTtBQUVyRSxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQywyR0FBMkcsQ0FBQyxDQUFDO1FBQ3pILElBQUksQ0FBQyxNQUFNLENBQUMsOHlCQUE4eUIsQ0FBQyxDQUFDO1FBQzV6QixJQUFJLENBQUMsTUFBTSxDQUFDLG1IQUFtSCxDQUFDLENBQUM7UUFDakksSUFBSSxDQUFDLE1BQU0sQ0FBQywwSkFBMEosQ0FBQyxDQUFDO1FBQ3hLLElBQUksQ0FBQyxNQUFNLENBQUMscUhBQXFILENBQUMsQ0FBQztJQUNySSxDQUFDO0lBRVEsS0FBSyxDQUFDLElBQUk7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO0lBQzdELENBQUM7Q0FFRjtBQWRELDBEQWNDIn0=
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Migration20260618154037 = void 0;
|
|
4
|
+
const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
|
|
5
|
+
class Migration20260618154037 extends migrations_1.Migration {
|
|
6
|
+
async up() {
|
|
7
|
+
this.addSql(`alter table if exists "integration" drop constraint if exists "integration_provider_id_unique";`);
|
|
8
|
+
this.addSql(`drop index if exists "IDX_integration_plugin_id_instance_id_unique";`);
|
|
9
|
+
this.addSql(`drop index if exists "IDX_integration_plugin_kind";`);
|
|
10
|
+
this.addSql(`alter table if exists "integration" drop column if exists "instance_id";`);
|
|
11
|
+
this.addSql(`alter table if exists "integration" rename column "plugin_kind" to "module";`);
|
|
12
|
+
this.addSql(`alter table if exists "integration" rename column "plugin_id" to "provider_id";`);
|
|
13
|
+
this.addSql(`CREATE UNIQUE INDEX IF NOT EXISTS "IDX_integration_provider_id_unique" ON "integration" ("provider_id") WHERE deleted_at IS NULL;`);
|
|
14
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_integration_module" ON "integration" ("module") WHERE deleted_at IS NULL;`);
|
|
15
|
+
}
|
|
16
|
+
async down() {
|
|
17
|
+
this.addSql(`drop index if exists "IDX_integration_provider_id_unique";`);
|
|
18
|
+
this.addSql(`drop index if exists "IDX_integration_module";`);
|
|
19
|
+
this.addSql(`alter table if exists "integration" add column if not exists "instance_id" text null;`);
|
|
20
|
+
this.addSql(`alter table if exists "integration" rename column "module" to "plugin_kind";`);
|
|
21
|
+
this.addSql(`alter table if exists "integration" rename column "provider_id" to "plugin_id";`);
|
|
22
|
+
this.addSql(`CREATE UNIQUE INDEX IF NOT EXISTS "IDX_integration_plugin_id_instance_id_unique" ON "integration" ("plugin_id", "instance_id") WHERE deleted_at IS NULL;`);
|
|
23
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_integration_plugin_kind" ON "integration" ("plugin_kind") WHERE deleted_at IS NULL;`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.Migration20260618154037 = Migration20260618154037;
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA2MTgxNTQwMzcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9pbnRlZ3JhdGlvbi9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjYwNjE4MTU0MDM3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlFQUFxRTtBQUVyRSxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpR0FBaUcsQ0FBQyxDQUFDO1FBQy9HLElBQUksQ0FBQyxNQUFNLENBQUMsc0VBQXNFLENBQUMsQ0FBQztRQUNwRixJQUFJLENBQUMsTUFBTSxDQUFDLHFEQUFxRCxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLE1BQU0sQ0FBQywwRUFBMEUsQ0FBQyxDQUFDO1FBRXhGLElBQUksQ0FBQyxNQUFNLENBQUMsOEVBQThFLENBQUMsQ0FBQztRQUM1RixJQUFJLENBQUMsTUFBTSxDQUFDLGlGQUFpRixDQUFDLENBQUM7UUFDL0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtSUFBbUksQ0FBQyxDQUFDO1FBQ2pKLElBQUksQ0FBQyxNQUFNLENBQUMsMkdBQTJHLENBQUMsQ0FBQztJQUMzSCxDQUFDO0lBRVEsS0FBSyxDQUFDLElBQUk7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxNQUFNLENBQUMsZ0RBQWdELENBQUMsQ0FBQztRQUU5RCxJQUFJLENBQUMsTUFBTSxDQUFDLHVGQUF1RixDQUFDLENBQUM7UUFDckcsSUFBSSxDQUFDLE1BQU0sQ0FBQyw4RUFBOEUsQ0FBQyxDQUFDO1FBQzVGLElBQUksQ0FBQyxNQUFNLENBQUMsaUZBQWlGLENBQUMsQ0FBQztRQUMvRixJQUFJLENBQUMsTUFBTSxDQUFDLDBKQUEwSixDQUFDLENBQUM7UUFDeEssSUFBSSxDQUFDLE1BQU0sQ0FBQyxxSEFBcUgsQ0FBQyxDQUFDO0lBQ3JJLENBQUM7Q0FFRjtBQXpCRCwwREF5QkMifQ==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Migration20260622120502 = void 0;
|
|
4
|
+
const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
|
|
5
|
+
class Migration20260622120502 extends migrations_1.Migration {
|
|
6
|
+
async up() {
|
|
7
|
+
this.addSql(`alter table if exists "integration" rename column "settings" to "options";`);
|
|
8
|
+
}
|
|
9
|
+
async down() {
|
|
10
|
+
this.addSql(`alter table if exists "integration" rename column "options" to "settings";`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.Migration20260622120502 = Migration20260622120502;
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA2MjIxMjA1MDIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9pbnRlZ3JhdGlvbi9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjYwNjIyMTIwNTAyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlFQUFxRTtBQUVyRSxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyw0RUFBNEUsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFFUSxLQUFLLENBQUMsSUFBSTtRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLDRFQUE0RSxDQUFDLENBQUM7SUFDNUYsQ0FBQztDQUVGO0FBVkQsMERBVUMifQ==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Migration20260701095518 = void 0;
|
|
4
|
+
const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
|
|
5
|
+
class Migration20260701095518 extends migrations_1.Migration {
|
|
6
|
+
async up() {
|
|
7
|
+
this.addSql(`alter table if exists "integration" rename column "schema_version" to "options_version";`);
|
|
8
|
+
}
|
|
9
|
+
async down() {
|
|
10
|
+
this.addSql(`alter table if exists "integration" rename column "options_version" to "schema_version";`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.Migration20260701095518 = Migration20260701095518;
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA3MDEwOTU1MTguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9pbnRlZ3JhdGlvbi9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjYwNzAxMDk1NTE4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlFQUFxRTtBQUVyRSxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQywwRkFBMEYsQ0FBQyxDQUFDO0lBQzFHLENBQUM7SUFFUSxLQUFLLENBQUMsSUFBSTtRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLDBGQUEwRixDQUFDLENBQUM7SUFDMUcsQ0FBQztDQUVGO0FBVkQsMERBVUMifQ==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Migration20260708072033 = void 0;
|
|
4
|
+
const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
|
|
5
|
+
class Migration20260708072033 extends migrations_1.Migration {
|
|
6
|
+
async up() {
|
|
7
|
+
this.addSql(`alter table if exists "integration" drop column if exists "credentials_ciphertext", drop column if exists "credentials_iv";`);
|
|
8
|
+
}
|
|
9
|
+
async down() {
|
|
10
|
+
this.addSql(`alter table if exists "integration" add column if not exists "credentials_ciphertext" text null, add column if not exists "credentials_iv" text null;`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.Migration20260708072033 = Migration20260708072033;
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA3MDgwNzIwMzMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9pbnRlZ3JhdGlvbi9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjYwNzA4MDcyMDMzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlFQUFxRTtBQUVyRSxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyw2SEFBNkgsQ0FBQyxDQUFDO0lBQzdJLENBQUM7SUFFUSxLQUFLLENBQUMsSUFBSTtRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLHVKQUF1SixDQUFDLENBQUM7SUFDdkssQ0FBQztDQUVGO0FBVkQsMERBVUMifQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
declare const Integration: import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
|
|
2
|
+
id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
|
|
3
|
+
module: import("@medusajs/framework/utils").EnumProperty<["payment", "fulfillment", "marketplace", "crm", "erp", "pim", "notification", "feed", "tax", "other"]>;
|
|
4
|
+
provider_id: import("@medusajs/framework/utils").TextProperty;
|
|
5
|
+
title: import("@medusajs/framework/utils").NullableModifier<string, import("@medusajs/framework/utils").TextProperty>;
|
|
6
|
+
options: import("@medusajs/framework/utils").JSONProperty;
|
|
7
|
+
options_version: import("@medusajs/framework/utils").NumberProperty;
|
|
8
|
+
is_enabled: import("@medusajs/framework/utils").BooleanProperty;
|
|
9
|
+
last_test_at: import("@medusajs/framework/utils").NullableModifier<Date, import("@medusajs/framework/utils").DateTimeProperty>;
|
|
10
|
+
last_test_status: import("@medusajs/framework/utils").NullableModifier<"ok" | "fail" | "skipped", import("@medusajs/framework/utils").EnumProperty<["ok", "fail", "skipped"]>>;
|
|
11
|
+
last_test_message: import("@medusajs/framework/utils").NullableModifier<string, import("@medusajs/framework/utils").TextProperty>;
|
|
12
|
+
}>, "integration">;
|
|
13
|
+
export default Integration;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
4
|
+
const Integration = utils_1.model.define("integration", {
|
|
5
|
+
id: utils_1.model.id({ prefix: "int" }).primaryKey(),
|
|
6
|
+
// Plugin identity
|
|
7
|
+
module: utils_1.model.enum([
|
|
8
|
+
"payment", "fulfillment", "marketplace", "crm", "erp", "pim",
|
|
9
|
+
"notification", "feed", "tax", "other",
|
|
10
|
+
]),
|
|
11
|
+
provider_id: utils_1.model.text(),
|
|
12
|
+
title: utils_1.model.text().nullable(),
|
|
13
|
+
// Integration options (non-secret settings)
|
|
14
|
+
options: utils_1.model.json().default({}),
|
|
15
|
+
// Metadata
|
|
16
|
+
options_version: utils_1.model.number().default(1),
|
|
17
|
+
is_enabled: utils_1.model.boolean().default(true),
|
|
18
|
+
last_test_at: utils_1.model.dateTime().nullable(),
|
|
19
|
+
last_test_status: utils_1.model.enum(["ok", "fail", "skipped"]).nullable(),
|
|
20
|
+
last_test_message: utils_1.model.text().nullable(),
|
|
21
|
+
})
|
|
22
|
+
.indexes([
|
|
23
|
+
{ on: ["provider_id"], unique: true },
|
|
24
|
+
{ on: ["module"] },
|
|
25
|
+
]);
|
|
26
|
+
exports.default = Integration;
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWdyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9pbnRlZ3JhdGlvbi9tb2RlbHMvaW50ZWdyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxREFBaUQ7QUFFakQsTUFBTSxXQUFXLEdBQUcsYUFBSyxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUU7SUFDOUMsRUFBRSxFQUFFLGFBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUU7SUFFNUMsa0JBQWtCO0lBQ2xCLE1BQU0sRUFBRSxhQUFLLENBQUMsSUFBSSxDQUFDO1FBQ2pCLFNBQVMsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSztRQUM1RCxjQUFjLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPO0tBQ3ZDLENBQUM7SUFDRixXQUFXLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRTtJQUN6QixLQUFLLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUU5Qiw0Q0FBNEM7SUFDNUMsT0FBTyxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO0lBRWpDLFdBQVc7SUFDWCxlQUFlLEVBQUUsYUFBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDMUMsVUFBVSxFQUFFLGFBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ3pDLFlBQVksRUFBRSxhQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3pDLGdCQUFnQixFQUFFLGFBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQ2xFLGlCQUFpQixFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDM0MsQ0FBQztLQUNELE9BQU8sQ0FBQztJQUNQLEVBQUUsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtJQUNyQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFO0NBQ25CLENBQUMsQ0FBQTtBQUVGLGtCQUFlLFdBQVcsQ0FBQSJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const globals_1 = require("@jest/globals");
|
|
4
|
+
const crypto_1 = require("../crypto");
|
|
5
|
+
const key = (0, crypto_1.deriveKey)("any-non-empty-passphrase");
|
|
6
|
+
(0, globals_1.describe)("crypto", () => {
|
|
7
|
+
(0, globals_1.it)("deriveKey returns a 32-byte key for any non-empty passphrase", () => {
|
|
8
|
+
(0, globals_1.expect)((0, crypto_1.deriveKey)("x").length).toBe(32);
|
|
9
|
+
(0, globals_1.expect)((0, crypto_1.deriveKey)("a much longer passphrase 12345").length).toBe(32);
|
|
10
|
+
});
|
|
11
|
+
(0, globals_1.it)("round-trips a string value", () => {
|
|
12
|
+
const blob = (0, crypto_1.encryptValue)("s3cr3t", key);
|
|
13
|
+
(0, globals_1.expect)(typeof blob).toBe("string");
|
|
14
|
+
(0, globals_1.expect)((0, crypto_1.decryptValue)(blob, key)).toBe("s3cr3t");
|
|
15
|
+
});
|
|
16
|
+
(0, globals_1.it)("round-trips a non-string JSON value", () => {
|
|
17
|
+
const blob = (0, crypto_1.encryptValue)({ a: 1, b: ["x"] }, key);
|
|
18
|
+
(0, globals_1.expect)((0, crypto_1.decryptValue)(blob, key)).toEqual({ a: 1, b: ["x"] });
|
|
19
|
+
});
|
|
20
|
+
(0, globals_1.it)("fails to decrypt with a wrong key", () => {
|
|
21
|
+
const blob = (0, crypto_1.encryptValue)("secret", key);
|
|
22
|
+
(0, globals_1.expect)(() => (0, crypto_1.decryptValue)(blob, (0, crypto_1.deriveKey)("different"))).toThrow();
|
|
23
|
+
});
|
|
24
|
+
(0, globals_1.it)("fails to decrypt tampered ciphertext (GCM auth tag)", () => {
|
|
25
|
+
const raw = Buffer.from((0, crypto_1.encryptValue)("secret", key), "base64");
|
|
26
|
+
raw[raw.length - 1] ^= 0x01; // flip a bit in the ciphertext
|
|
27
|
+
(0, globals_1.expect)(() => (0, crypto_1.decryptValue)(raw.toString("base64"), key)).toThrow();
|
|
28
|
+
});
|
|
29
|
+
(0, globals_1.it)("produces a different blob each call (fresh iv)", () => {
|
|
30
|
+
(0, globals_1.expect)((0, crypto_1.encryptValue)("x", key)).not.toEqual((0, crypto_1.encryptValue)("x", key));
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J5cHRvLnVuaXQuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2ludGVncmF0aW9uL3NlcnZpY2VzL19fdGVzdHNfXy9jcnlwdG8udW5pdC5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMkNBQW9EO0FBQ3BELHNDQUFpRTtBQUVqRSxNQUFNLEdBQUcsR0FBRyxJQUFBLGtCQUFTLEVBQUMsMEJBQTBCLENBQUMsQ0FBQTtBQUVqRCxJQUFBLGtCQUFRLEVBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtJQUN0QixJQUFBLFlBQUUsRUFBQyw4REFBOEQsRUFBRSxHQUFHLEVBQUU7UUFDdEUsSUFBQSxnQkFBTSxFQUFDLElBQUEsa0JBQVMsRUFBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDdEMsSUFBQSxnQkFBTSxFQUFDLElBQUEsa0JBQVMsRUFBQyxnQ0FBZ0MsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNyRSxDQUFDLENBQUMsQ0FBQTtJQUVGLElBQUEsWUFBRSxFQUFDLDRCQUE0QixFQUFFLEdBQUcsRUFBRTtRQUNwQyxNQUFNLElBQUksR0FBRyxJQUFBLHFCQUFZLEVBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBQ3hDLElBQUEsZ0JBQU0sRUFBQyxPQUFPLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNsQyxJQUFBLGdCQUFNLEVBQUMsSUFBQSxxQkFBWSxFQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNoRCxDQUFDLENBQUMsQ0FBQTtJQUVGLElBQUEsWUFBRSxFQUFDLHFDQUFxQyxFQUFFLEdBQUcsRUFBRTtRQUM3QyxNQUFNLElBQUksR0FBRyxJQUFBLHFCQUFZLEVBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFDbEQsSUFBQSxnQkFBTSxFQUFDLElBQUEscUJBQVksRUFBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUM3RCxDQUFDLENBQUMsQ0FBQTtJQUVGLElBQUEsWUFBRSxFQUFDLG1DQUFtQyxFQUFFLEdBQUcsRUFBRTtRQUMzQyxNQUFNLElBQUksR0FBRyxJQUFBLHFCQUFZLEVBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBQ3hDLElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLHFCQUFZLEVBQUMsSUFBSSxFQUFFLElBQUEsa0JBQVMsRUFBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDcEUsQ0FBQyxDQUFDLENBQUE7SUFFRixJQUFBLFlBQUUsRUFBQyxxREFBcUQsRUFBRSxHQUFHLEVBQUU7UUFDN0QsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFBLHFCQUFZLEVBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQzlELEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQSxDQUFDLCtCQUErQjtRQUMzRCxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSxxQkFBWSxFQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUNuRSxDQUFDLENBQUMsQ0FBQTtJQUVGLElBQUEsWUFBRSxFQUFDLGdEQUFnRCxFQUFFLEdBQUcsRUFBRTtRQUN4RCxJQUFBLGdCQUFNLEVBQUMsSUFBQSxxQkFBWSxFQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBQSxxQkFBWSxFQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQ3BFLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/.medusa/server/src/modules/integration/services/__tests__/integration-provider.unit.spec.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const globals_1 = require("@jest/globals");
|
|
7
|
+
const integration_provider_1 = __importDefault(require("../integration-provider"));
|
|
8
|
+
// Minimal provider stubs — the registry only needs getIdentifier/getInstanceId/getDescriptor.
|
|
9
|
+
const mkProvider = (identifier, instanceId, withTest = false) => {
|
|
10
|
+
const p = {
|
|
11
|
+
getIdentifier: () => identifier,
|
|
12
|
+
getInstanceId: () => instanceId,
|
|
13
|
+
getDescriptor: () => ({
|
|
14
|
+
module: "payment",
|
|
15
|
+
displayName: `${identifier}.name`,
|
|
16
|
+
options: {},
|
|
17
|
+
sections: [],
|
|
18
|
+
}),
|
|
19
|
+
};
|
|
20
|
+
if (withTest)
|
|
21
|
+
p.testConnection = async () => ({ status: "ok" });
|
|
22
|
+
return p;
|
|
23
|
+
};
|
|
24
|
+
// Mimics the awilix cradle: container keys are `int_<identifier>[_<id>]`.
|
|
25
|
+
const makeRegistry = () => new integration_provider_1.default({
|
|
26
|
+
int_tkassa: mkProvider("tkassa", null),
|
|
27
|
+
int_ozon_acct1: mkProvider("ozon", "acct1", true),
|
|
28
|
+
int_ozon_acct2: mkProvider("ozon", "acct2"),
|
|
29
|
+
// a non-provider cradle entry must be ignored
|
|
30
|
+
integrationModuleOptions: { encryptionKey: "x" },
|
|
31
|
+
});
|
|
32
|
+
(0, globals_1.describe)("IntegrationProviderService (registration identity)", () => {
|
|
33
|
+
(0, globals_1.it)("builds container keys from (pluginId, instanceId)", () => {
|
|
34
|
+
(0, globals_1.expect)(integration_provider_1.default.key("tkassa")).toBe("int_tkassa");
|
|
35
|
+
(0, globals_1.expect)(integration_provider_1.default.key("tkassa", null)).toBe("int_tkassa");
|
|
36
|
+
(0, globals_1.expect)(integration_provider_1.default.key("ozon", "acct1")).toBe("int_ozon_acct1");
|
|
37
|
+
});
|
|
38
|
+
(0, globals_1.it)("lists registrations with derived identity, ignoring non-provider keys", () => {
|
|
39
|
+
const regs = makeRegistry().listRegistrations();
|
|
40
|
+
(0, globals_1.expect)(regs.map((r) => [r.key, r.pluginId, r.instanceId]).sort()).toEqual([
|
|
41
|
+
["int_ozon_acct1", "ozon", "acct1"],
|
|
42
|
+
["int_ozon_acct2", "ozon", "acct2"],
|
|
43
|
+
["int_tkassa", "tkassa", null],
|
|
44
|
+
]);
|
|
45
|
+
});
|
|
46
|
+
(0, globals_1.it)("resolves a provider by key and by (pluginId, instanceId)", () => {
|
|
47
|
+
const reg = makeRegistry();
|
|
48
|
+
(0, globals_1.expect)(reg.retrieveByKey("int_ozon_acct1").getInstanceId()).toBe("acct1");
|
|
49
|
+
(0, globals_1.expect)(reg.retrieveProvider("ozon", "acct2").getInstanceId()).toBe("acct2");
|
|
50
|
+
(0, globals_1.expect)(reg.retrieveProvider("tkassa").getInstanceId()).toBe(null);
|
|
51
|
+
});
|
|
52
|
+
(0, globals_1.it)("reports registration existence exactly", () => {
|
|
53
|
+
const reg = makeRegistry();
|
|
54
|
+
(0, globals_1.expect)(reg.hasProvider("tkassa")).toBe(true);
|
|
55
|
+
(0, globals_1.expect)(reg.hasProvider("tkassa", null)).toBe(true);
|
|
56
|
+
(0, globals_1.expect)(reg.hasProvider("ozon", "acct1")).toBe(true);
|
|
57
|
+
(0, globals_1.expect)(reg.hasProvider("ozon")).toBe(false); // no null-instance ozon
|
|
58
|
+
(0, globals_1.expect)(reg.hasProvider("ozon", "nope")).toBe(false);
|
|
59
|
+
});
|
|
60
|
+
(0, globals_1.it)("maps a key back to its (pluginId, instanceId)", () => {
|
|
61
|
+
(0, globals_1.expect)(makeRegistry().getRegistration("int_ozon_acct2")).toMatchObject({
|
|
62
|
+
pluginId: "ozon",
|
|
63
|
+
instanceId: "acct2",
|
|
64
|
+
});
|
|
65
|
+
(0, globals_1.expect)(makeRegistry().getRegistration("int_unknown")).toBeUndefined();
|
|
66
|
+
});
|
|
67
|
+
(0, globals_1.it)("throws on an unknown key", () => {
|
|
68
|
+
(0, globals_1.expect)(() => makeRegistry().retrieveByKey("int_nope")).toThrow(/Unable to retrieve/);
|
|
69
|
+
});
|
|
70
|
+
(0, globals_1.it)("stamps pluginId + instanceId onto each descriptor", () => {
|
|
71
|
+
const ds = makeRegistry().listDescriptors();
|
|
72
|
+
const ozon1 = ds.find((d) => d.instanceId === "acct1");
|
|
73
|
+
(0, globals_1.expect)(ozon1.pluginId).toBe("ozon");
|
|
74
|
+
(0, globals_1.expect)(ds.find((d) => d.pluginId === "tkassa").instanceId).toBe(null);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWdyYXRpb24tcHJvdmlkZXIudW5pdC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvaW50ZWdyYXRpb24vc2VydmljZXMvX190ZXN0c19fL2ludGVncmF0aW9uLXByb3ZpZGVyLnVuaXQuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDJDQUFvRDtBQUNwRCxtRkFBZ0U7QUFFaEUsOEZBQThGO0FBQzlGLE1BQU0sVUFBVSxHQUFHLENBQUMsVUFBa0IsRUFBRSxVQUF5QixFQUFFLFFBQVEsR0FBRyxLQUFLLEVBQUUsRUFBRTtJQUNyRixNQUFNLENBQUMsR0FBUTtRQUNiLGFBQWEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxVQUFVO1FBQy9CLGFBQWEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxVQUFVO1FBQy9CLGFBQWEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ3BCLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLFdBQVcsRUFBRSxHQUFHLFVBQVUsT0FBTztZQUNqQyxPQUFPLEVBQUUsRUFBRTtZQUNYLFFBQVEsRUFBRSxFQUFFO1NBQ2IsQ0FBQztLQUNILENBQUE7SUFDRCxJQUFJLFFBQVE7UUFBRSxDQUFDLENBQUMsY0FBYyxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQy9ELE9BQU8sQ0FBQyxDQUFBO0FBQ1YsQ0FBQyxDQUFBO0FBRUQsMEVBQTBFO0FBQzFFLE1BQU0sWUFBWSxHQUFHLEdBQUcsRUFBRSxDQUN4QixJQUFJLDhCQUEwQixDQUFDO0lBQzdCLFVBQVUsRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQztJQUN0QyxjQUFjLEVBQUUsVUFBVSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDO0lBQ2pELGNBQWMsRUFBRSxVQUFVLENBQUMsTUFBTSxF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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const globals_1 = require("@jest/globals");
|
|
4
|
+
const crypto_1 = require("../crypto");
|
|
5
|
+
const secrets_1 = require("../secrets");
|
|
6
|
+
const key = (0, crypto_1.deriveKey)("test-passphrase");
|
|
7
|
+
(0, globals_1.describe)("inline secrets", () => {
|
|
8
|
+
(0, globals_1.it)("encrypts only secret keys, leaves others as-is", () => {
|
|
9
|
+
const out = (0, secrets_1.encryptSecretsInline)({ login: "u", password: "p" }, ["password"], key);
|
|
10
|
+
(0, globals_1.expect)(out.login).toBe("u");
|
|
11
|
+
(0, globals_1.expect)(typeof out.password).toBe("string");
|
|
12
|
+
(0, globals_1.expect)(out.password).not.toBe("p");
|
|
13
|
+
});
|
|
14
|
+
(0, globals_1.it)("round-trips through decrypt", () => {
|
|
15
|
+
const enc = (0, secrets_1.encryptSecretsInline)({ login: "u", password: "p" }, ["password"], key);
|
|
16
|
+
(0, globals_1.expect)((0, secrets_1.decryptSecretsInline)(enc, ["password"], key)).toEqual({ login: "u", password: "p" });
|
|
17
|
+
});
|
|
18
|
+
(0, globals_1.it)("leaves non-secret values untouched on decrypt", () => {
|
|
19
|
+
(0, globals_1.expect)((0, secrets_1.decryptSecretsInline)({ login: "u", note: "plain" }, ["password"], key)).toEqual({
|
|
20
|
+
login: "u",
|
|
21
|
+
note: "plain",
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
(0, globals_1.it)("does not encrypt empty/absent secret values", () => {
|
|
25
|
+
(0, globals_1.expect)((0, secrets_1.encryptSecretsInline)({ password: "" }, ["password"], key).password).toBe("");
|
|
26
|
+
});
|
|
27
|
+
(0, globals_1.it)("round-trips a non-string secret value", () => {
|
|
28
|
+
const enc = (0, secrets_1.encryptSecretsInline)({ cfg: { k: 1 } }, ["cfg"], key);
|
|
29
|
+
(0, globals_1.expect)(typeof enc.cfg).toBe("string");
|
|
30
|
+
(0, globals_1.expect)((0, secrets_1.decryptSecretsInline)(enc, ["cfg"], key)).toEqual({ cfg: { k: 1 } });
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjcmV0cy51bml0LnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9pbnRlZ3JhdGlvbi9zZXJ2aWNlcy9fX3Rlc3RzX18vc2VjcmV0cy51bml0LnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwyQ0FBb0Q7QUFDcEQsc0NBQXFDO0FBQ3JDLHdDQUF1RTtBQUV2RSxNQUFNLEdBQUcsR0FBRyxJQUFBLGtCQUFTLEVBQUMsaUJBQWlCLENBQUMsQ0FBQTtBQUV4QyxJQUFBLGtCQUFRLEVBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFO0lBQzlCLElBQUEsWUFBRSxFQUFDLGdEQUFnRCxFQUFFLEdBQUcsRUFBRTtRQUN4RCxNQUFNLEdBQUcsR0FBRyxJQUFBLDhCQUFvQixFQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUNsRixJQUFBLGdCQUFNLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMzQixJQUFBLGdCQUFNLEVBQUMsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzFDLElBQUEsZ0JBQU0sRUFBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNwQyxDQUFDLENBQUMsQ0FBQTtJQUVGLElBQUEsWUFBRSxFQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtRQUNyQyxNQUFNLEdBQUcsR0FBRyxJQUFBLDhCQUFvQixFQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUNsRixJQUFBLGdCQUFNLEVBQUMsSUFBQSw4QkFBb0IsRUFBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUE7SUFDN0YsQ0FBQyxDQUFDLENBQUE7SUFFRixJQUFBLFlBQUUsRUFBQywrQ0FBK0MsRUFBRSxHQUFHLEVBQUU7UUFDdkQsSUFBQSxnQkFBTSxFQUFDLElBQUEsOEJBQW9CLEVBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ3JGLEtBQUssRUFBRSxHQUFHO1lBQ1YsSUFBSSxFQUFFLE9BQU87U0FDZCxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtJQUVGLElBQUEsWUFBRSxFQUFDLDZDQUE2QyxFQUFFLEdBQUcsRUFBRTtRQUNyRCxJQUFBLGdCQUFNLEVBQUMsSUFBQSw4QkFBb0IsRUFBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNyRixDQUFDLENBQUMsQ0FBQTtJQUVGLElBQUEsWUFBRSxFQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRTtRQUMvQyxNQUFNLEdBQUcsR0FBRyxJQUFBLDhCQUFvQixFQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUNqRSxJQUFBLGdCQUFNLEVBQUMsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3JDLElBQUEsZ0JBQU0sRUFBQyxJQUFBLDhCQUFvQixFQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUM1RSxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIn0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Derive a 32-byte AES key from any non-empty passphrase (SHA-256). */
|
|
2
|
+
export declare function deriveKey(passphrase: string): Buffer;
|
|
3
|
+
/**
|
|
4
|
+
* Encrypt one JSON-serializable value. Returns a single base64 string containing
|
|
5
|
+
* `iv ‖ authTag ‖ ciphertext` — the IV is random per call (required for GCM) and folded
|
|
6
|
+
* into the blob, so no separate IV field is stored.
|
|
7
|
+
*/
|
|
8
|
+
export declare function encryptValue(value: unknown, key: Buffer): string;
|
|
9
|
+
/** Inverse of {@link encryptValue}. Throws if the key is wrong or the blob was tampered. */
|
|
10
|
+
export declare function decryptValue(blob: string, key: Buffer): unknown;
|