@commercetools/cli-topic-integration-layer 0.5.1 → 0.7.0
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/README.md +2 -6
- package/dist/commands/integration-layer/allowlist/add.js +3 -3
- package/dist/commands/integration-layer/allowlist/add.js.map +1 -1
- package/dist/commands/integration-layer/allowlist/list.js +2 -2
- package/dist/commands/integration-layer/allowlist/list.js.map +1 -1
- package/dist/commands/integration-layer/allowlist/remove.js +3 -3
- package/dist/commands/integration-layer/allowlist/remove.js.map +1 -1
- package/dist/commands/integration-layer/allowlist/set.js +3 -3
- package/dist/commands/integration-layer/allowlist/set.js.map +1 -1
- package/dist/commands/integration-layer/config/get.js +2 -2
- package/dist/commands/integration-layer/config/get.js.map +1 -1
- package/dist/commands/integration-layer/config/list.js +2 -2
- package/dist/commands/integration-layer/config/list.js.map +1 -1
- package/dist/commands/integration-layer/config/set.js +2 -2
- package/dist/commands/integration-layer/config/set.js.map +1 -1
- package/dist/commands/integration-layer/config/unset.js +2 -2
- package/dist/commands/integration-layer/config/unset.js.map +1 -1
- package/dist/commands/integration-layer/explore.js +5 -5
- package/dist/commands/integration-layer/explore.js.map +1 -1
- package/dist/commands/integration-layer/extension/build.js +4 -1
- package/dist/commands/integration-layer/extension/build.js.map +1 -1
- package/dist/commands/integration-layer/extension/create-api-extension-input.d.ts +12 -0
- package/dist/commands/integration-layer/extension/create-api-extension-input.js +49 -0
- package/dist/commands/integration-layer/extension/create-api-extension-input.js.map +1 -0
- package/dist/commands/integration-layer/extension/delete.js +2 -2
- package/dist/commands/integration-layer/extension/delete.js.map +1 -1
- package/dist/commands/integration-layer/extension/invoke-api-extension.d.ts +19 -0
- package/dist/commands/integration-layer/extension/invoke-api-extension.js +140 -0
- package/dist/commands/integration-layer/extension/invoke-api-extension.js.map +1 -0
- package/dist/commands/integration-layer/extension/push.js +8 -5
- package/dist/commands/integration-layer/extension/push.js.map +1 -1
- package/dist/commands/integration-layer/extension/serve.d.ts +36 -0
- package/dist/commands/integration-layer/extension/serve.js +140 -36
- package/dist/commands/integration-layer/extension/serve.js.map +1 -1
- package/dist/commands/integration-layer/extension/status.js +2 -2
- package/dist/commands/integration-layer/extension/status.js.map +1 -1
- package/dist/commands/integration-layer/extension/validate.js +6 -3
- package/dist/commands/integration-layer/extension/validate.js.map +1 -1
- package/dist/commands/integration-layer/schema/fetch.js +2 -2
- package/dist/commands/integration-layer/schema/fetch.js.map +1 -1
- package/dist/hooks/authentication.d.ts +3 -0
- package/dist/hooks/authentication.js +33 -0
- package/dist/hooks/authentication.js.map +1 -0
- package/dist/lib/auth.d.ts +5 -0
- package/dist/lib/auth.js +41 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/awaitBundleState.d.ts +2 -2
- package/dist/lib/awaitBundleState.js +2 -2
- package/dist/lib/awaitBundleState.js.map +1 -1
- package/dist/lib/base.d.ts +12 -21
- package/dist/lib/base.js +27 -76
- package/dist/lib/base.js.map +1 -1
- package/dist/lib/extensionConfig.d.ts +17 -0
- package/dist/lib/extensionConfig.js +36 -0
- package/dist/lib/extensionConfig.js.map +1 -0
- package/dist/lib/ilClient.d.ts +16 -10
- package/dist/lib/ilClient.js +28 -31
- package/dist/lib/ilClient.js.map +1 -1
- package/dist/lib/loadLocalEnv.d.ts +49 -0
- package/dist/lib/loadLocalEnv.js +112 -0
- package/dist/lib/loadLocalEnv.js.map +1 -0
- package/dist/lib/tooling/compose.js +2 -2
- package/dist/lib/tooling/compose.js.map +1 -1
- package/dist/lib/tooling/extensionInputSampleObj.d.ts +8 -0
- package/dist/lib/tooling/extensionInputSampleObj.js +178 -0
- package/dist/lib/tooling/extensionInputSampleObj.js.map +1 -0
- package/dist/lib/tooling/extensions.d.ts +22 -5
- package/dist/lib/tooling/extensions.js +30 -8
- package/dist/lib/tooling/extensions.js.map +1 -1
- package/dist/lib/tooling/generateExtensionInputSample.d.ts +22 -0
- package/dist/lib/tooling/generateExtensionInputSample.js +36 -0
- package/dist/lib/tooling/generateExtensionInputSample.js.map +1 -0
- package/dist/lib/tooling/sandboxFetch.d.ts +14 -0
- package/dist/lib/tooling/sandboxFetch.js +100 -0
- package/dist/lib/tooling/sandboxFetch.js.map +1 -0
- package/package.json +11 -3
- package/dist/commands/integration-layer/extension/invoke.d.ts +0 -14
- package/dist/commands/integration-layer/extension/invoke.js +0 -94
- package/dist/commands/integration-layer/extension/invoke.js.map +0 -1
|
@@ -7,25 +7,43 @@
|
|
|
7
7
|
// never one-subgraph-per-extension (that's not the deployed shape).
|
|
8
8
|
import { readdir, readFile, stat, writeFile, mkdtemp } from "node:fs/promises";
|
|
9
9
|
import { tmpdir } from "node:os";
|
|
10
|
-
import { join, resolve } from "node:path";
|
|
10
|
+
import { join, relative, resolve } from "node:path";
|
|
11
11
|
import process from "node:process";
|
|
12
12
|
import { buildSubgraphSchema, printSubgraphSchema } from "@apollo/subgraph";
|
|
13
13
|
import { mergeTypeDefs } from "@graphql-tools/merge";
|
|
14
14
|
import { Kind, parse } from "graphql";
|
|
15
15
|
import { buildBundle } from "./build.js";
|
|
16
16
|
import { loadBundleSource } from "./loadBundle.js";
|
|
17
|
+
/** The per-package entry the CLI expects under each `extensions/*` when nothing overrides it. */
|
|
18
|
+
export const DEFAULT_ENTRY_SEGMENT = join("src", "extension.ts");
|
|
17
19
|
/**
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
+
* Reduce an `--entry` flag value to the path *within each* extension package that `--all`
|
|
21
|
+
* should build — the same source name applied uniformly across every discovered folder.
|
|
22
|
+
*
|
|
23
|
+
* The single-extension flag defaults to a cwd-absolute path (`<cwd>/src/extension.ts`),
|
|
24
|
+
* which only makes sense against N packages as its relative tail, so we relativise it to
|
|
25
|
+
* the monorepo root: the default collapses back to `src/extension.ts`, and a caller who
|
|
26
|
+
* passes a repo-relative `--entry` (e.g. `src/main.ts`) round-trips unchanged. Anything
|
|
27
|
+
* that doesn't sit under the root (an absolute path elsewhere) can't name a per-package
|
|
28
|
+
* source, so we fall back to the default rather than emit a `../…` segment.
|
|
29
|
+
*/
|
|
30
|
+
export function entrySegmentFor(root, entry) {
|
|
31
|
+
const segment = relative(root, resolve(root, entry));
|
|
32
|
+
return segment === "" || segment.startsWith("..") ? DEFAULT_ENTRY_SEGMENT : segment;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Discover every extension package under `<root>/<dirName>` that has an entry at
|
|
36
|
+
* `<pkg>/<entrySegment>` (default `src/extension.ts`). Sorted by name for stable,
|
|
37
|
+
* deterministic merge output.
|
|
20
38
|
*/
|
|
21
|
-
export async function discoverExtensions(root, dirName) {
|
|
39
|
+
export async function discoverExtensions(root, dirName, entrySegment = DEFAULT_ENTRY_SEGMENT) {
|
|
22
40
|
const base = join(root, dirName);
|
|
23
41
|
const dirents = await readdir(base, { withFileTypes: true }).catch(() => []);
|
|
24
42
|
const found = [];
|
|
25
43
|
for (const dirent of dirents) {
|
|
26
44
|
if (!dirent.isDirectory())
|
|
27
45
|
continue;
|
|
28
|
-
const entry = join(base, dirent.name,
|
|
46
|
+
const entry = join(base, dirent.name, entrySegment);
|
|
29
47
|
const hasEntry = await stat(entry)
|
|
30
48
|
.then((s) => s.isFile())
|
|
31
49
|
.catch(() => false);
|
|
@@ -187,7 +205,9 @@ export const hooks = Object.assign(
|
|
|
187
205
|
/**
|
|
188
206
|
* The single build step shared by `build`/`validate`/`push`: bundle either the one
|
|
189
207
|
* extension in the cwd (default) or — with `--all` — every extension under
|
|
190
|
-
* `<extensionsDir>/*` merged into the one combined bundle a project deploys.
|
|
208
|
+
* `<extensionsDir>/*` merged into the one combined bundle a project deploys. `--entry`
|
|
209
|
+
* carries over to `--all` as the per-package source segment (see {@link entrySegmentFor}),
|
|
210
|
+
* so a repo with a non-default entry name builds uniformly across every folder. Throws a
|
|
191
211
|
* clean message when `--all` finds nothing to build.
|
|
192
212
|
*/
|
|
193
213
|
export async function bundleForFlags(opts) {
|
|
@@ -195,9 +215,11 @@ export async function bundleForFlags(opts) {
|
|
|
195
215
|
const { outfile, sourceFiles } = await buildBundle(opts.entry, opts.out);
|
|
196
216
|
return { outfile, sourceFiles, describe: opts.entry };
|
|
197
217
|
}
|
|
198
|
-
const
|
|
218
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
219
|
+
const entrySegment = entrySegmentFor(cwd, opts.entry);
|
|
220
|
+
const extensions = await discoverExtensions(cwd, opts.extensionsDir, entrySegment);
|
|
199
221
|
if (extensions.length === 0) {
|
|
200
|
-
throw new Error(`no extensions found under ./${opts.extensionsDir}
|
|
222
|
+
throw new Error(`no extensions found under ./${opts.extensionsDir}/*/${entrySegment} — run --all from the monorepo root`);
|
|
201
223
|
}
|
|
202
224
|
const { outfile, sourceFiles } = await buildCombinedBundle(extensions, opts.out);
|
|
203
225
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../../src/lib/tooling/extensions.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,sFAAsF;AACtF,oFAAoF;AACpF,iDAAiD;AACjD,oFAAoF;AACpF,mFAAmF;AACnF,oEAAoE;AAEpE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../../src/lib/tooling/extensions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ExtensionResourceTypeId } from "@commercetools/platform-sdk";
|
|
2
|
+
import type { ApiExtensionAction } from "./apiExtension.js";
|
|
3
|
+
/** Resource type ids the platform SDK exposes for API Extensions. */
|
|
4
|
+
export declare const EXTENSION_RESOURCE_TYPE_IDS: readonly ExtensionResourceTypeId[];
|
|
5
|
+
export type ExtensionResourceTypeIdValue = (typeof EXTENSION_RESOURCE_TYPE_IDS)[number];
|
|
6
|
+
export interface GenerateExtensionInputSampleOptions {
|
|
7
|
+
action: ApiExtensionAction;
|
|
8
|
+
resourceTypeId: string;
|
|
9
|
+
/** Override the sample resource id (defaults to `sample-<resourceType>-id`). */
|
|
10
|
+
id?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ExtensionInputSample {
|
|
13
|
+
action: ApiExtensionAction;
|
|
14
|
+
resource: {
|
|
15
|
+
typeId: ExtensionResourceTypeId;
|
|
16
|
+
id: string;
|
|
17
|
+
obj: Record<string, unknown>;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export declare function isExtensionResourceTypeId(value: string): value is ExtensionResourceTypeId;
|
|
21
|
+
/** Build a commercetools ExtensionInput sample for local handler testing. */
|
|
22
|
+
export declare function generateExtensionInputSample(options: GenerateExtensionInputSampleOptions): ExtensionInputSample;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ExtensionActionValues, ExtensionResourceTypeIdValues, } from "@commercetools/platform-sdk";
|
|
2
|
+
import { sampleExtensionResourceObj } from "./extensionInputSampleObj.js";
|
|
3
|
+
/** Resource type ids the platform SDK exposes for API Extensions. */
|
|
4
|
+
export const EXTENSION_RESOURCE_TYPE_IDS = Object.freeze(Object.values(ExtensionResourceTypeIdValues).sort());
|
|
5
|
+
const supportedResourceTypes = new Set(EXTENSION_RESOURCE_TYPE_IDS);
|
|
6
|
+
export function isExtensionResourceTypeId(value) {
|
|
7
|
+
return supportedResourceTypes.has(value);
|
|
8
|
+
}
|
|
9
|
+
function sampleId(resourceTypeId, id) {
|
|
10
|
+
return id ?? `sample-${resourceTypeId}-id`;
|
|
11
|
+
}
|
|
12
|
+
/** Build a commercetools ExtensionInput sample for local handler testing. */
|
|
13
|
+
export function generateExtensionInputSample(options) {
|
|
14
|
+
const { action, resourceTypeId } = options;
|
|
15
|
+
if (!isExtensionResourceTypeId(resourceTypeId)) {
|
|
16
|
+
throw new Error(`unsupported resource type '${resourceTypeId}' — supported: ${EXTENSION_RESOURCE_TYPE_IDS.join(", ")}`);
|
|
17
|
+
}
|
|
18
|
+
if (action !== ExtensionActionValues.Create && action !== ExtensionActionValues.Update) {
|
|
19
|
+
throw new Error(`unsupported action '${action}' — supported: ${ExtensionActionValues.Create}, ${ExtensionActionValues.Update}`);
|
|
20
|
+
}
|
|
21
|
+
const id = sampleId(resourceTypeId, options.id);
|
|
22
|
+
const version = action === ExtensionActionValues.Update ? 2 : 1;
|
|
23
|
+
return {
|
|
24
|
+
action,
|
|
25
|
+
resource: {
|
|
26
|
+
typeId: resourceTypeId,
|
|
27
|
+
id,
|
|
28
|
+
obj: sampleExtensionResourceObj(resourceTypeId, {
|
|
29
|
+
resourceTypeId,
|
|
30
|
+
id,
|
|
31
|
+
version,
|
|
32
|
+
}),
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=generateExtensionInputSample.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateExtensionInputSample.js","sourceRoot":"","sources":["../../../src/lib/tooling/generateExtensionInputSample.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EACrB,6BAA6B,GAC9B,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE1E,qEAAqE;AACrE,MAAM,CAAC,MAAM,2BAA2B,GAAG,MAAM,CAAC,MAAM,CACtD,MAAM,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,IAAI,EAAE,CACd,CAAC;AAoBxC,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAS,2BAA2B,CAAC,CAAC;AAE5E,MAAM,UAAU,yBAAyB,CAAC,KAAa;IACrD,OAAO,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,QAAQ,CAAC,cAAsB,EAAE,EAAW;IACnD,OAAO,EAAE,IAAI,UAAU,cAAc,KAAK,CAAC;AAC7C,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,4BAA4B,CAC1C,OAA4C;IAE5C,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;IAC3C,IAAI,CAAC,yBAAyB,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CACb,8BAA8B,cAAc,kBAAkB,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACvG,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,KAAK,qBAAqB,CAAC,MAAM,IAAI,MAAM,KAAK,qBAAqB,CAAC,MAAM,EAAE,CAAC;QACvF,MAAM,IAAI,KAAK,CACb,uBAAuB,MAAM,kBAAkB,qBAAqB,CAAC,MAAM,KAAK,qBAAqB,CAAC,MAAM,EAAE,CAC/G,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,GAAG,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,MAAM,KAAK,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,OAAO;QACL,MAAM;QACN,QAAQ,EAAE;YACR,MAAM,EAAE,cAAc;YACtB,EAAE;YACF,GAAG,EAAE,0BAA0B,CAAC,cAAc,EAAE;gBAC9C,cAAc;gBACd,EAAE;gBACF,OAAO;aACR,CAAC;SACH;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Supplies the current allow patterns, re-read on every sandbox `fetch` call. */
|
|
2
|
+
export type AllowlistProvider = () => readonly string[];
|
|
3
|
+
/**
|
|
4
|
+
* Build the allowlist-gated `fetch` the production sandbox endows. Throws a `TypeError`
|
|
5
|
+
* — like `fetch` on failure — when the destination is not on the allow list.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createSandboxFetch(allowlistProvider: AllowlistProvider): typeof fetch;
|
|
8
|
+
/**
|
|
9
|
+
* Route `globalThis.fetch` through the sandbox wrapper when a resolver runs inside
|
|
10
|
+
* {@link wrapResolverMap}. Returns a restore function for shutdown.
|
|
11
|
+
*/
|
|
12
|
+
export declare function installDelegatingFetch(): () => void;
|
|
13
|
+
/** Wrap every resolver so its `fetch` calls use the allowlist-gated wrapper. */
|
|
14
|
+
export declare function wrapResolverMap(resolvers: object, sandboxFetch: typeof fetch): object;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// Allowlist-gated `fetch` for the local `serve` dev server — the same merchant
|
|
2
|
+
// `allow` list production enforces, plus loopback hosts (localhost/127.0.0.0/8/::1)
|
|
3
|
+
// which are always permitted locally so an extension can reach a service on the
|
|
4
|
+
// dev machine while you iterate (see isLocalhost). Resolvers run through
|
|
5
|
+
// {@link wrapResolverMap} so only extension code sees this wrapper; the gateway
|
|
6
|
+
// and integration-layer client keep the real Node `fetch`.
|
|
7
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
8
|
+
/** Does `hostname` match any allowlist pattern? */
|
|
9
|
+
function hostAllowed(hostname, allowlist) {
|
|
10
|
+
const host = hostname.toLowerCase();
|
|
11
|
+
return allowlist.some((pattern) => {
|
|
12
|
+
if (pattern.startsWith("*.")) {
|
|
13
|
+
const suffix = pattern.slice(2);
|
|
14
|
+
return host === suffix || host.endsWith(`.${suffix}`);
|
|
15
|
+
}
|
|
16
|
+
return host === pattern;
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Loopback hosts served by the developer's own machine. `serve` always permits
|
|
21
|
+
* these regardless of the merchant allow list, so an extension can reach a service
|
|
22
|
+
* running locally (a mock, a companion API) while you iterate. This is a
|
|
23
|
+
* LOCAL-DEV-ONLY affordance: the deployed sandbox enforces only the real allow
|
|
24
|
+
* list, and localhost is never on it — so nothing here loosens production.
|
|
25
|
+
* Covers `localhost` (and any `*.localhost` subdomain), the IPv4 loopback range
|
|
26
|
+
* `127.0.0.0/8`, and IPv6 `::1` (brackets stripped as the WHATWG URL keeps them).
|
|
27
|
+
*/
|
|
28
|
+
function isLocalhost(hostname) {
|
|
29
|
+
const host = hostname.toLowerCase().replace(/^\[|\]$/g, "");
|
|
30
|
+
if (host === "localhost" || host.endsWith(".localhost"))
|
|
31
|
+
return true;
|
|
32
|
+
if (host === "::1")
|
|
33
|
+
return true;
|
|
34
|
+
return /^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(host);
|
|
35
|
+
}
|
|
36
|
+
function requestUrl(input) {
|
|
37
|
+
if (typeof input === "string")
|
|
38
|
+
return input;
|
|
39
|
+
if (input instanceof URL)
|
|
40
|
+
return input.href;
|
|
41
|
+
const url = input.url;
|
|
42
|
+
return typeof url === "string" ? url : String(input);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Build the allowlist-gated `fetch` the production sandbox endows. Throws a `TypeError`
|
|
46
|
+
* — like `fetch` on failure — when the destination is not on the allow list.
|
|
47
|
+
*/
|
|
48
|
+
export function createSandboxFetch(allowlistProvider) {
|
|
49
|
+
const realFetch = globalThis.fetch.bind(globalThis);
|
|
50
|
+
const sandboxFetch = async (input, init) => {
|
|
51
|
+
let parsed;
|
|
52
|
+
try {
|
|
53
|
+
parsed = new URL(requestUrl(input));
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
throw new TypeError(`fetch: invalid URL "${requestUrl(input)}"`);
|
|
57
|
+
}
|
|
58
|
+
if (parsed.protocol !== "https:" && parsed.protocol !== "http:") {
|
|
59
|
+
throw new TypeError(`fetch: unsupported protocol "${parsed.protocol}"`);
|
|
60
|
+
}
|
|
61
|
+
const host = parsed.hostname;
|
|
62
|
+
// Loopback is always reachable locally (see isLocalhost); everything else must
|
|
63
|
+
// be on the merchant allow list, exactly as production enforces.
|
|
64
|
+
if (!isLocalhost(host) && !hostAllowed(host, allowlistProvider())) {
|
|
65
|
+
throw new TypeError(`fetch: host "${host}" is not in the extension HTTP allowlist`);
|
|
66
|
+
}
|
|
67
|
+
return realFetch(input, { ...init, redirect: "manual" });
|
|
68
|
+
};
|
|
69
|
+
return sandboxFetch;
|
|
70
|
+
}
|
|
71
|
+
const sandboxFetchStorage = new AsyncLocalStorage();
|
|
72
|
+
/**
|
|
73
|
+
* Route `globalThis.fetch` through the sandbox wrapper when a resolver runs inside
|
|
74
|
+
* {@link wrapResolverMap}. Returns a restore function for shutdown.
|
|
75
|
+
*/
|
|
76
|
+
export function installDelegatingFetch() {
|
|
77
|
+
const realFetch = globalThis.fetch.bind(globalThis);
|
|
78
|
+
globalThis.fetch = ((input, init) => {
|
|
79
|
+
const fn = sandboxFetchStorage.getStore() ?? realFetch;
|
|
80
|
+
return fn(input, init);
|
|
81
|
+
});
|
|
82
|
+
return () => {
|
|
83
|
+
globalThis.fetch = realFetch;
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/** Wrap every resolver so its `fetch` calls use the allowlist-gated wrapper. */
|
|
87
|
+
export function wrapResolverMap(resolvers, sandboxFetch) {
|
|
88
|
+
const wrap = (value) => {
|
|
89
|
+
if (typeof value === "function") {
|
|
90
|
+
const fn = value;
|
|
91
|
+
return (...args) => sandboxFetchStorage.run(sandboxFetch, () => fn(...args));
|
|
92
|
+
}
|
|
93
|
+
if (value !== null && typeof value === "object") {
|
|
94
|
+
return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, wrap(v)]));
|
|
95
|
+
}
|
|
96
|
+
return value;
|
|
97
|
+
};
|
|
98
|
+
return wrap(resolvers);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=sandboxFetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandboxFetch.js","sourceRoot":"","sources":["../../../src/lib/tooling/sandboxFetch.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@commercetools/cli-topic-integration-layer",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "commercetools CLI plugin: integration-layer topic",
|
|
5
5
|
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/commercetools/commerce-integration-layer-extensions.git",
|
|
9
|
+
"directory": "packages/cli-topic-integration-layer"
|
|
10
|
+
},
|
|
6
11
|
"type": "module",
|
|
7
12
|
"main": "./dist/index.js",
|
|
8
13
|
"files": [
|
|
@@ -16,6 +21,7 @@
|
|
|
16
21
|
},
|
|
17
22
|
"dependencies": {
|
|
18
23
|
"@commercetools/cli-plugin-auth": ">=0.0.6",
|
|
24
|
+
"@commercetools/platform-sdk": "8.25.0",
|
|
19
25
|
"@apollo/composition": "^2.14.1",
|
|
20
26
|
"@apollo/gateway": "^2.14.1",
|
|
21
27
|
"@apollo/subgraph": "^2.14.1",
|
|
@@ -28,7 +34,6 @@
|
|
|
28
34
|
"typescript": "^5.7.2"
|
|
29
35
|
},
|
|
30
36
|
"devDependencies": {
|
|
31
|
-
"@commercetools/platform-sdk": "8.25.0",
|
|
32
37
|
"@oclif/test": "^4.1.12",
|
|
33
38
|
"@types/node": "^22.10.2",
|
|
34
39
|
"rimraf": "^6.0.1",
|
|
@@ -36,7 +41,10 @@
|
|
|
36
41
|
},
|
|
37
42
|
"oclif": {
|
|
38
43
|
"topicSeparator": " ",
|
|
39
|
-
"commands": "./dist/commands"
|
|
44
|
+
"commands": "./dist/commands",
|
|
45
|
+
"hooks": {
|
|
46
|
+
"prerun": "./dist/hooks/authentication"
|
|
47
|
+
}
|
|
40
48
|
},
|
|
41
49
|
"scripts": {
|
|
42
50
|
"clean": "rimraf dist",
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { Command } from "@oclif/core";
|
|
2
|
-
export default class ExtensionInvoke extends Command {
|
|
3
|
-
static description: string;
|
|
4
|
-
static examples: string[];
|
|
5
|
-
static flags: {
|
|
6
|
-
entry: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
-
out: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
-
action: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
-
sku: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
-
quantity: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
-
config: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
-
};
|
|
13
|
-
run(): Promise<void>;
|
|
14
|
-
}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import { readFile } from "node:fs/promises";
|
|
2
|
-
import { Command, Flags } from "@oclif/core";
|
|
3
|
-
import { buildBundle, defaultEntry, defaultOutfile } from "../../../lib/tooling/build.js";
|
|
4
|
-
import { loadBundleSource } from "../../../lib/tooling/loadBundle.js";
|
|
5
|
-
/** A sample commercetools cart callback payload. */
|
|
6
|
-
function sampleCartInput(action, sku, quantity) {
|
|
7
|
-
// A minimal sample callback for local testing. The real payload is the SDK's
|
|
8
|
-
// ExtensionInput (resource: a full Cart Reference); we send just the fields a
|
|
9
|
-
// cart handler reads, cast to the SDK type.
|
|
10
|
-
return {
|
|
11
|
-
action,
|
|
12
|
-
resource: {
|
|
13
|
-
typeId: "cart",
|
|
14
|
-
id: "sample-cart",
|
|
15
|
-
obj: {
|
|
16
|
-
id: "sample-cart",
|
|
17
|
-
lineItems: [{ id: "sample-line-item", quantity, variant: { sku } }],
|
|
18
|
-
},
|
|
19
|
-
},
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
function describeResult(result) {
|
|
23
|
-
if (result && typeof result === "object") {
|
|
24
|
-
if (Array.isArray(result.errors) && result.errors.length > 0) {
|
|
25
|
-
return `BLOCK — ${result.errors.map((e) => `${e.code}: ${e.message}`).join("; ")}`;
|
|
26
|
-
}
|
|
27
|
-
if (Array.isArray(result.actions) && result.actions.length > 0) {
|
|
28
|
-
return `MODIFY — ${JSON.stringify(result.actions)}`;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return "APPROVE";
|
|
32
|
-
}
|
|
33
|
-
export default class ExtensionInvoke extends Command {
|
|
34
|
-
static description = "Fire a sample commercetools cart callback at the bundle's API-Extension handlers";
|
|
35
|
-
static examples = [
|
|
36
|
-
"<%= config.bin %> integration-layer extension invoke",
|
|
37
|
-
"<%= config.bin %> integration-layer extension invoke --action Update --sku BLOCKED-SKU",
|
|
38
|
-
"<%= config.bin %> integration-layer extension invoke --quantity 25 --config MAX_LINE_QUANTITY=10",
|
|
39
|
-
"<%= config.bin %> integration-layer extension invoke --config MAX_QTY=5 --config REGION=eu",
|
|
40
|
-
];
|
|
41
|
-
static flags = {
|
|
42
|
-
entry: Flags.string({ description: "extension entry source file", default: defaultEntry() }),
|
|
43
|
-
out: Flags.string({ description: "bundle output file", default: defaultOutfile() }),
|
|
44
|
-
action: Flags.string({
|
|
45
|
-
description: "the trigger action",
|
|
46
|
-
options: ["Create", "Update"],
|
|
47
|
-
default: "Create",
|
|
48
|
-
}),
|
|
49
|
-
sku: Flags.string({
|
|
50
|
-
description: "SKU on the sample cart's line item",
|
|
51
|
-
default: "BLOCKED-SKU",
|
|
52
|
-
}),
|
|
53
|
-
quantity: Flags.integer({
|
|
54
|
-
description: "quantity on the sample cart's line item",
|
|
55
|
-
default: 1,
|
|
56
|
-
}),
|
|
57
|
-
config: Flags.string({
|
|
58
|
-
description: "a ctx.config entry as KEY=VALUE (repeatable)",
|
|
59
|
-
multiple: true,
|
|
60
|
-
delimiter: ",",
|
|
61
|
-
}),
|
|
62
|
-
};
|
|
63
|
-
async run() {
|
|
64
|
-
const { flags } = await this.parse(ExtensionInvoke);
|
|
65
|
-
const config = {};
|
|
66
|
-
for (const pair of flags.config ?? []) {
|
|
67
|
-
const eq = pair.indexOf("=");
|
|
68
|
-
if (eq > 0)
|
|
69
|
-
config[pair.slice(0, eq)] = pair.slice(eq + 1);
|
|
70
|
-
}
|
|
71
|
-
const { outfile } = await buildBundle(flags.entry, flags.out);
|
|
72
|
-
const mod = loadBundleSource(await readFile(outfile, "utf8"));
|
|
73
|
-
const handlers = Array.isArray(mod.apiExtensions)
|
|
74
|
-
? mod.apiExtensions
|
|
75
|
-
: [];
|
|
76
|
-
if (handlers.length === 0) {
|
|
77
|
-
this.error("this bundle declares no `apiExtensions`.");
|
|
78
|
-
}
|
|
79
|
-
const action = flags.action;
|
|
80
|
-
const input = sampleCartInput(action, flags.sku, flags.quantity);
|
|
81
|
-
const ctx = { now: () => Date.now(), config };
|
|
82
|
-
this.log(`Invoking ${handlers.length} handler(s) with a ${input.action} on cart ` +
|
|
83
|
-
`(line item SKU '${flags.sku}' x${flags.quantity})`);
|
|
84
|
-
for (const h of handlers) {
|
|
85
|
-
if (h.resourceTypeId !== input.resource.typeId || !h.actions.includes(action)) {
|
|
86
|
-
this.log(` · ${h.key}: skipped (does not trigger on cart/${action})`);
|
|
87
|
-
continue;
|
|
88
|
-
}
|
|
89
|
-
const result = await h.handler(input, ctx);
|
|
90
|
-
this.log(` → ${h.key}: ${describeResult(result)}`);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
//# sourceMappingURL=invoke.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../../../src/commands/integration-layer/extension/invoke.ts"],"names":[],"mappings":"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"}
|