@commercetools/cli-topic-integration-layer 0.4.0 → 0.5.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 +55 -33
- package/dist/commands/integration-layer/allowlist/add.d.ts +10 -0
- package/dist/commands/integration-layer/allowlist/add.js +41 -0
- package/dist/commands/integration-layer/allowlist/add.js.map +1 -0
- package/dist/commands/integration-layer/allowlist/list.d.ts +6 -0
- package/dist/commands/integration-layer/allowlist/list.js +28 -0
- package/dist/commands/integration-layer/allowlist/list.js.map +1 -0
- package/dist/commands/integration-layer/allowlist/remove.d.ts +13 -0
- package/dist/commands/integration-layer/allowlist/remove.js +56 -0
- package/dist/commands/integration-layer/allowlist/remove.js.map +1 -0
- package/dist/commands/integration-layer/allowlist/set.d.ts +13 -0
- package/dist/commands/integration-layer/allowlist/set.js +52 -0
- package/dist/commands/integration-layer/allowlist/set.js.map +1 -0
- package/dist/commands/integration-layer/explore.js +1 -0
- package/dist/commands/integration-layer/explore.js.map +1 -1
- package/dist/commands/integration-layer/extension/serve.d.ts +1 -1
- package/dist/commands/integration-layer/extension/serve.js +3 -3
- package/dist/commands/integration-layer/extension/serve.js.map +1 -1
- package/dist/commands/integration-layer/init.js +31 -40
- package/dist/commands/integration-layer/init.js.map +1 -1
- package/dist/lib/allowlistPrompt.d.ts +16 -0
- package/dist/lib/allowlistPrompt.js +31 -0
- package/dist/lib/allowlistPrompt.js.map +1 -0
- package/dist/lib/base.d.ts +12 -12
- package/dist/lib/base.js +12 -12
- package/dist/lib/ilClient.d.ts +27 -0
- package/dist/lib/ilClient.js +31 -0
- package/dist/lib/ilClient.js.map +1 -1
- package/dist/lib/tooling/apiExtension.js +1 -2
- package/dist/lib/tooling/apiExtension.js.map +1 -1
- package/dist/lib/tooling/build.js +3 -6
- package/dist/lib/tooling/build.js.map +1 -1
- package/dist/lib/tooling/compose.js +4 -6
- package/dist/lib/tooling/compose.js.map +1 -1
- package/dist/lib/tooling/explorerServer.d.ts +6 -0
- package/dist/lib/tooling/explorerServer.js +4 -0
- package/dist/lib/tooling/explorerServer.js.map +1 -1
- package/dist/lib/tooling/gateway.js +1 -2
- package/dist/lib/tooling/gateway.js.map +1 -1
- package/dist/lib/tooling/loadBundle.js +1 -2
- package/dist/lib/tooling/loadBundle.js.map +1 -1
- package/dist/lib/tooling/session.d.ts +1 -1
- package/dist/lib/tooling/session.js +1 -1
- package/dist/lib/tooling/staticAnalysis.js +5 -8
- package/dist/lib/tooling/staticAnalysis.js.map +1 -1
- package/dist/lib/tooling/validateBundle.js +1 -2
- package/dist/lib/tooling/validateBundle.js.map +1 -1
- package/package.json +1 -1
- package/dist/commands/integration-layer/hello.d.ts +0 -6
- package/dist/commands/integration-layer/hello.js +0 -10
- package/dist/commands/integration-layer/hello.js.map +0 -1
|
@@ -96,71 +96,62 @@ INTEGRATION_LAYER_URL=
|
|
|
96
96
|
`,
|
|
97
97
|
"README.md": `# ${projectName}
|
|
98
98
|
|
|
99
|
-
A monorepo of commercetools
|
|
99
|
+
A monorepo of commercetools Integration Layer extensions, scaffolded by
|
|
100
100
|
\`commercetools integration-layer init\`. Each extension is a workspace member under
|
|
101
101
|
\`extensions/\`; the starter one (\`extensions/hello-world\`) adds a \`hello\` field to
|
|
102
102
|
\`Query\`.
|
|
103
103
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
same merged subgraph locally. Split your code into as many \`extensions/*\` packages as
|
|
109
|
-
makes sense to author — they always ship as one.
|
|
104
|
+
**One project, one bundle.** A Project deploys a single federation subgraph, so the
|
|
105
|
+
root scripts **merge** everything under \`extensions/\` into one artifact — never one per
|
|
106
|
+
package. Split your code into as many \`extensions/*\` packages as makes sense to author;
|
|
107
|
+
they always ship as one.
|
|
110
108
|
|
|
111
|
-
##
|
|
112
|
-
|
|
113
|
-
The \`build\`/\`serve\`/\`validate\`/\`push\` scripts run through the **commercetools CLI**'s
|
|
114
|
-
\`integration-layer\` topic, added by the published
|
|
115
|
-
\`@commercetools/cli-topic-integration-layer\` plugin. Install the CLI globally with
|
|
116
|
-
pnpm, add the plugin, then log in:
|
|
109
|
+
## Setup (once)
|
|
117
110
|
|
|
118
111
|
\`\`\`sh
|
|
119
|
-
#
|
|
120
|
-
#
|
|
121
|
-
# needed. (Install from @dev for now — the \`plugins\` command is only in the CLI's dev
|
|
112
|
+
# The scripts below run through the commercetools CLI's integration-layer topic.
|
|
113
|
+
# (Install from @dev for now — the \`plugins\` command is only in the CLI's dev
|
|
122
114
|
# prerelease; drop @dev once it ships to @latest.)
|
|
123
115
|
pnpm add -g @commercetools/cli@dev
|
|
124
116
|
commercetools plugins install @commercetools/cli-topic-integration-layer
|
|
125
117
|
|
|
126
118
|
# Log in once — mints the manage_project token the authenticated commands reuse
|
|
127
|
-
# (validate/push/status/delete, schema, config) and sets your target project.
|
|
128
119
|
commercetools auth login --project-key <your-project-key>
|
|
129
|
-
\`\`\`
|
|
130
120
|
|
|
131
|
-
|
|
121
|
+
pnpm install
|
|
122
|
+
\`\`\`
|
|
132
123
|
|
|
133
|
-
|
|
134
|
-
integration-layer extension …\` commands.
|
|
124
|
+
## Day to day
|
|
135
125
|
|
|
136
126
|
\`\`\`sh
|
|
137
|
-
pnpm install
|
|
138
|
-
|
|
139
127
|
# From the repo root — these operate on the ONE combined bundle:
|
|
140
|
-
pnpm dev #
|
|
141
|
-
#
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
pnpm validate # compose the combined bundle against the live schema (no upload)
|
|
145
|
-
pnpm push # validate + upload the combined bundle (replaces the project's one)
|
|
128
|
+
pnpm dev # serve the merged subgraph behind a local federated gateway with the
|
|
129
|
+
# Integration Layer, at http://localhost:4000/graphql. Needs a login.
|
|
130
|
+
pnpm validate # compose the combined bundle against your live schema (no upload)
|
|
131
|
+
pnpm push # validate + upload it (replacing the Project's current bundle)
|
|
146
132
|
|
|
147
|
-
# …or
|
|
133
|
+
# …or iterate on one extension in isolation (standalone subgraph, no login needed):
|
|
148
134
|
pnpm --filter @extensions/hello-world dev
|
|
149
135
|
\`\`\`
|
|
150
136
|
|
|
151
|
-
With \`pnpm dev\` running,
|
|
152
|
-
|
|
153
|
-
|
|
137
|
+
With \`pnpm dev\` running, \`/graphql\` is the gateway, \`/_extension\` the raw combined
|
|
138
|
+
subgraph, and \`/composed\` the browsable merged schema.
|
|
139
|
+
|
|
140
|
+
To add an extension, copy \`extensions/hello-world\`, rename it in its \`package.json\`,
|
|
141
|
+
and edit its \`src/extension.ts\` — the root scripts discover it automatically. Two
|
|
142
|
+
extensions can each add fields to \`Query\`; they only clash if they declare the *same*
|
|
143
|
+
field.
|
|
154
144
|
|
|
155
|
-
Optionally copy \`.env.example\` to \`.env\` to override the
|
|
145
|
+
Optionally copy \`.env.example\` to \`.env\` to override the Integration Layer edge URL.
|
|
156
146
|
|
|
157
|
-
##
|
|
147
|
+
## Documentation
|
|
158
148
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
149
|
+
- [Integration Layer documentation](https://docs.commercetools.com/integration-layer) —
|
|
150
|
+
the authoring model: federation concepts, schema patterns, the entity catalog, the
|
|
151
|
+
sandbox, configuration, and publishing.
|
|
152
|
+
- [Extension authoring details](https://github.com/commercetools/integration-layer-extensions/blob/main/docs/authoring.md)
|
|
153
|
+
and the [CLI reference](https://github.com/commercetools/integration-layer-extensions/blob/main/docs/cli.md),
|
|
154
|
+
alongside ready-to-edit templates for each pattern.
|
|
164
155
|
`,
|
|
165
156
|
"extensions/hello-world/package.json": `{
|
|
166
157
|
"name": "@extensions/hello-world",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/integration-layer/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEnD,oFAAoF;AACpF,gFAAgF;AAChF,oFAAoF;AACpF,sFAAsF;AACtF,sFAAsF;AACtF,oFAAoF;AACpF,8DAA8D;AAE9D,6FAA6F;AAC7F,SAAS,cAAc,CAAC,GAAW;IACjC,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;SACrC,WAAW,EAAE;SACb,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;SAC5B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,OAAO,SAAS,IAAI,8BAA8B,CAAC;AACrD,CAAC;AAED,qEAAqE;AACrE,SAAS,aAAa,CAAC,WAAmB;IACxC,OAAO;QACL,cAAc,EAAE;YACR,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;CAqBtC;QACG,qBAAqB,EAAE;;;;;;;;CAQ1B;QACG,oBAAoB,EAAE;;;;;;;;;;;;CAYzB;QACG,kBAAkB,EAAE;;;;;;;;;;;;;;;;;;;;CAoBvB;QACG,YAAY,EAAE;;;CAGjB;QACG,cAAc,EAAE;;;;CAInB;QACG,WAAW,EAAE,KAAK,WAAW
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/integration-layer/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** One-line summary of an allow list for confirmation output. */
|
|
2
|
+
export declare function formatAllowlist(hosts: readonly string[]): string;
|
|
3
|
+
export type AllowlistChangeAction = "set" | "remove";
|
|
4
|
+
/**
|
|
5
|
+
* Show current vs proposed allow lists and ask for confirmation. Skipped when
|
|
6
|
+
* `force` is true. Refuses non-interactive runs without `force`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function confirmAllowlistChange(opts: {
|
|
9
|
+
projectKey: string;
|
|
10
|
+
action: AllowlistChangeAction;
|
|
11
|
+
current: readonly string[];
|
|
12
|
+
next: readonly string[];
|
|
13
|
+
force: boolean;
|
|
14
|
+
log: (line: string) => void;
|
|
15
|
+
abort: (message: string) => never;
|
|
16
|
+
}): Promise<boolean>;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { createInterface } from "node:readline/promises";
|
|
2
|
+
import { stdin, stdout } from "node:process";
|
|
3
|
+
/** One-line summary of an allow list for confirmation output. */
|
|
4
|
+
export function formatAllowlist(hosts) {
|
|
5
|
+
return hosts.length === 0 ? "(none)" : hosts.join(", ");
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Show current vs proposed allow lists and ask for confirmation. Skipped when
|
|
9
|
+
* `force` is true. Refuses non-interactive runs without `force`.
|
|
10
|
+
*/
|
|
11
|
+
export async function confirmAllowlistChange(opts) {
|
|
12
|
+
if (opts.force)
|
|
13
|
+
return true;
|
|
14
|
+
opts.log(`Project '${opts.projectKey}' — allowlist ${opts.action}:`);
|
|
15
|
+
opts.log(` Current: ${formatAllowlist(opts.current)}`);
|
|
16
|
+
opts.log(` After: ${formatAllowlist(opts.next)}`);
|
|
17
|
+
opts.log("");
|
|
18
|
+
if (!stdin.isTTY) {
|
|
19
|
+
opts.abort("Refusing to change the allowlist without a TTY — re-run with --force to skip confirmation.");
|
|
20
|
+
}
|
|
21
|
+
const verb = opts.action === "set" ? "replace the allowlist" : "remove these hosts";
|
|
22
|
+
const rl = createInterface({ input: stdin, output: stdout });
|
|
23
|
+
try {
|
|
24
|
+
const answer = (await rl.question(`Proceed to ${verb}? (y/N) `)).trim().toLowerCase();
|
|
25
|
+
return answer === "y" || answer === "yes";
|
|
26
|
+
}
|
|
27
|
+
finally {
|
|
28
|
+
rl.close();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=allowlistPrompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allowlistPrompt.js","sourceRoot":"","sources":["../../src/lib/allowlistPrompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE7C,iEAAiE;AACjE,MAAM,UAAU,eAAe,CAAC,KAAwB;IACtD,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1D,CAAC;AAID;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAQ5C;IACC,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAE5B,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,UAAU,iBAAiB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACrE,IAAI,CAAC,GAAG,CAAC,cAAc,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC,GAAG,CAAC,cAAc,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEb,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjB,IAAI,CAAC,KAAK,CAAC,4FAA4F,CAAC,CAAC;IAC3G,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,oBAAoB,CAAC;IACpF,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACtF,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK,CAAC;IAC5C,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC"}
|
package/dist/lib/base.d.ts
CHANGED
|
@@ -21,31 +21,31 @@ export interface IlFlagValues {
|
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
23
|
* Derive the integration-layer EXTENSIONS edge base URL from the authenticated
|
|
24
|
-
* principal's commercetools region. The extensions edge
|
|
25
|
-
*
|
|
26
|
-
*
|
|
24
|
+
* principal's commercetools region. The extensions edge serves the CLI's
|
|
25
|
+
* `/<project>/subgraph` + `/<project>/extension/*` routes and follows the same host
|
|
26
|
+
* convention as the commercetools API itself
|
|
27
27
|
* (`<svc>.<region>.commercetools.com`, cf. the auth client's
|
|
28
28
|
* `auth.<region>.commercetools.com`), so a login in region `eu-central-1.aws`
|
|
29
29
|
* resolves to `https://extensions.integration-layer.eu-central-1.aws.commercetools.com`
|
|
30
30
|
* (the production host). `--integration-layer-url` / `INTEGRATION_LAYER_URL` stays
|
|
31
|
-
* the explicit override — e.g. to point at a local edge or a
|
|
32
|
-
*
|
|
31
|
+
* the explicit override — e.g. to point at a local edge, or at a non-production zone
|
|
32
|
+
* that doesn't follow the convention. Returns undefined
|
|
33
33
|
* only when the region is absent, so resolveIlContext then fails loudly.
|
|
34
34
|
*/
|
|
35
35
|
export declare function edgeUrlForRegion(region: string): string | undefined;
|
|
36
36
|
/**
|
|
37
37
|
* The GRAPHQL edge (the integration-router) for a region — where operations are
|
|
38
38
|
* actually served, at `/{project}/graphql`. A distinct host from the extensions
|
|
39
|
-
* edge above: the extensions edge
|
|
40
|
-
*
|
|
41
|
-
* for
|
|
39
|
+
* edge above: the extensions edge serves the manage_project routes, the graphql edge
|
|
40
|
+
* is the router. `--graphql-url` / `IL_GRAPHQL_URL` overrides it
|
|
41
|
+
* for non-production zones, which don't follow the convention.
|
|
42
42
|
*/
|
|
43
43
|
export declare function graphqlEdgeUrlForRegion(region: string): string | undefined;
|
|
44
44
|
/**
|
|
45
|
-
* The IDENTITY edge
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
45
|
+
* The IDENTITY edge for a region — where sessions are minted, at
|
|
46
|
+
* `POST /{project}/session`. Again a distinct host from both of the above: shopper
|
|
47
|
+
* identity, shopper GraphQL, and the machine surface are served on separate
|
|
48
|
+
* ingresses. `--auth-url` / `IL_AUTH_URL` overrides it.
|
|
49
49
|
*/
|
|
50
50
|
export declare function authEdgeUrlForRegion(region: string): string | undefined;
|
|
51
51
|
export declare abstract class IntegrationLayerCommand extends AuthCommand {
|
package/dist/lib/base.js
CHANGED
|
@@ -59,15 +59,15 @@ export async function loadPersistedPrincipal(credentialsFile = CREDENTIALS_FILE)
|
|
|
59
59
|
}
|
|
60
60
|
/**
|
|
61
61
|
* Derive the integration-layer EXTENSIONS edge base URL from the authenticated
|
|
62
|
-
* principal's commercetools region. The extensions edge
|
|
63
|
-
*
|
|
64
|
-
*
|
|
62
|
+
* principal's commercetools region. The extensions edge serves the CLI's
|
|
63
|
+
* `/<project>/subgraph` + `/<project>/extension/*` routes and follows the same host
|
|
64
|
+
* convention as the commercetools API itself
|
|
65
65
|
* (`<svc>.<region>.commercetools.com`, cf. the auth client's
|
|
66
66
|
* `auth.<region>.commercetools.com`), so a login in region `eu-central-1.aws`
|
|
67
67
|
* resolves to `https://extensions.integration-layer.eu-central-1.aws.commercetools.com`
|
|
68
68
|
* (the production host). `--integration-layer-url` / `INTEGRATION_LAYER_URL` stays
|
|
69
|
-
* the explicit override — e.g. to point at a local edge or a
|
|
70
|
-
*
|
|
69
|
+
* the explicit override — e.g. to point at a local edge, or at a non-production zone
|
|
70
|
+
* that doesn't follow the convention. Returns undefined
|
|
71
71
|
* only when the region is absent, so resolveIlContext then fails loudly.
|
|
72
72
|
*/
|
|
73
73
|
export function edgeUrlForRegion(region) {
|
|
@@ -79,9 +79,9 @@ export function edgeUrlForRegion(region) {
|
|
|
79
79
|
/**
|
|
80
80
|
* The GRAPHQL edge (the integration-router) for a region — where operations are
|
|
81
81
|
* actually served, at `/{project}/graphql`. A distinct host from the extensions
|
|
82
|
-
* edge above: the extensions edge
|
|
83
|
-
*
|
|
84
|
-
* for
|
|
82
|
+
* edge above: the extensions edge serves the manage_project routes, the graphql edge
|
|
83
|
+
* is the router. `--graphql-url` / `IL_GRAPHQL_URL` overrides it
|
|
84
|
+
* for non-production zones, which don't follow the convention.
|
|
85
85
|
*/
|
|
86
86
|
export function graphqlEdgeUrlForRegion(region) {
|
|
87
87
|
const trimmed = region.trim();
|
|
@@ -90,10 +90,10 @@ export function graphqlEdgeUrlForRegion(region) {
|
|
|
90
90
|
return `https://graphql.integration-layer.${trimmed}.commercetools.com`;
|
|
91
91
|
}
|
|
92
92
|
/**
|
|
93
|
-
* The IDENTITY edge
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
93
|
+
* The IDENTITY edge for a region — where sessions are minted, at
|
|
94
|
+
* `POST /{project}/session`. Again a distinct host from both of the above: shopper
|
|
95
|
+
* identity, shopper GraphQL, and the machine surface are served on separate
|
|
96
|
+
* ingresses. `--auth-url` / `IL_AUTH_URL` overrides it.
|
|
97
97
|
*/
|
|
98
98
|
export function authEdgeUrlForRegion(region) {
|
|
99
99
|
const trimmed = region.trim();
|
package/dist/lib/ilClient.d.ts
CHANGED
|
@@ -95,6 +95,33 @@ export declare function pushBundle(baseUrl: string, projectKey: string, token: s
|
|
|
95
95
|
export declare function fetchExtensionMeta(baseUrl: string, projectKey: string, token: string): Promise<ExtensionMeta | null>;
|
|
96
96
|
/** Remove the project's extension subgraph from Hive (`DELETE …/extension/subgraph`). */
|
|
97
97
|
export declare function deleteExtensionSubgraph(baseUrl: string, projectKey: string, token: string): Promise<void>;
|
|
98
|
+
/**
|
|
99
|
+
* The project's extension HTTP allowlist: the merchant-tunable `allow` host patterns
|
|
100
|
+
* the extension sandbox's `fetch` may reach, plus the operator `deny` ceiling. A host
|
|
101
|
+
* is permitted iff it matches `allow` AND not `deny`. Patterns are bare hosts —
|
|
102
|
+
* `api.foo.com` or leading-wildcard `*.foo.com` (no scheme, port, or path).
|
|
103
|
+
*
|
|
104
|
+
* `deny` is read-only over HTTP (the operator's veto, edited out-of-band); only
|
|
105
|
+
* `allow` is writable, and only by full replacement (see {@link putAllowlist}).
|
|
106
|
+
*/
|
|
107
|
+
export interface AllowlistView {
|
|
108
|
+
allow: string[];
|
|
109
|
+
deny: string[];
|
|
110
|
+
}
|
|
111
|
+
/** GET the project's extension HTTP allowlist (`GET …/extension/allowlist`). */
|
|
112
|
+
export declare function getAllowlist(baseUrl: string, projectKey: string, token: string): Promise<AllowlistView>;
|
|
113
|
+
/**
|
|
114
|
+
* Replace the merchant `allow` patterns with `patterns` (`PUT …/extension/allowlist`).
|
|
115
|
+
* The route takes a bare JSON array and REPLACES the whole allow list — the add/remove
|
|
116
|
+
* commands read-modify-write around it. The integration layer validates and normalizes
|
|
117
|
+
* (lowercases, de-dupes, rejects schemes/ports/paths/IPs/over-broad patterns) and
|
|
118
|
+
* returns the stored list plus the config's new monotonic version. The `deny` ceiling
|
|
119
|
+
* is untouched (it has no write route).
|
|
120
|
+
*/
|
|
121
|
+
export declare function putAllowlist(baseUrl: string, projectKey: string, token: string, patterns: string[]): Promise<{
|
|
122
|
+
allow: string[];
|
|
123
|
+
version: number;
|
|
124
|
+
}>;
|
|
98
125
|
/** List the project's extension config entries, secret values redacted (`GET …/extension/config`). */
|
|
99
126
|
export declare function listConfig(baseUrl: string, projectKey: string, token: string): Promise<ConfigEntry[]>;
|
|
100
127
|
/**
|
package/dist/lib/ilClient.js
CHANGED
|
@@ -117,6 +117,37 @@ export async function deleteExtensionSubgraph(baseUrl, projectKey, token) {
|
|
|
117
117
|
throw new Error(`DELETE extension/subgraph failed (${res.status}): ${text}`);
|
|
118
118
|
}
|
|
119
119
|
}
|
|
120
|
+
/** GET the project's extension HTTP allowlist (`GET …/extension/allowlist`). */
|
|
121
|
+
export async function getAllowlist(baseUrl, projectKey, token) {
|
|
122
|
+
const url = `${apiRoot(baseUrl, projectKey)}/extension/allowlist`;
|
|
123
|
+
const res = await fetch(url, { headers: { accept: "application/json", ...bearer(token) } });
|
|
124
|
+
const text = await res.text();
|
|
125
|
+
if (!res.ok) {
|
|
126
|
+
throw new Error(`GET extension/allowlist failed (${res.status}): ${text}`);
|
|
127
|
+
}
|
|
128
|
+
return JSON.parse(text);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Replace the merchant `allow` patterns with `patterns` (`PUT …/extension/allowlist`).
|
|
132
|
+
* The route takes a bare JSON array and REPLACES the whole allow list — the add/remove
|
|
133
|
+
* commands read-modify-write around it. The integration layer validates and normalizes
|
|
134
|
+
* (lowercases, de-dupes, rejects schemes/ports/paths/IPs/over-broad patterns) and
|
|
135
|
+
* returns the stored list plus the config's new monotonic version. The `deny` ceiling
|
|
136
|
+
* is untouched (it has no write route).
|
|
137
|
+
*/
|
|
138
|
+
export async function putAllowlist(baseUrl, projectKey, token, patterns) {
|
|
139
|
+
const url = `${apiRoot(baseUrl, projectKey)}/extension/allowlist`;
|
|
140
|
+
const res = await fetch(url, {
|
|
141
|
+
method: "PUT",
|
|
142
|
+
headers: { "Content-Type": "application/json", ...bearer(token) },
|
|
143
|
+
body: JSON.stringify(patterns),
|
|
144
|
+
});
|
|
145
|
+
const text = await res.text();
|
|
146
|
+
if (!res.ok) {
|
|
147
|
+
throw new Error(`PUT extension/allowlist failed (${res.status}): ${text}`);
|
|
148
|
+
}
|
|
149
|
+
return JSON.parse(text);
|
|
150
|
+
}
|
|
120
151
|
/** List the project's extension config entries, secret values redacted (`GET …/extension/config`). */
|
|
121
152
|
export async function listConfig(baseUrl, projectKey, token) {
|
|
122
153
|
const url = `${apiRoot(baseUrl, projectKey)}/extension/config`;
|
package/dist/lib/ilClient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ilClient.js","sourceRoot":"","sources":["../../src/lib/ilClient.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ilClient.js","sourceRoot":"","sources":["../../src/lib/ilClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// Authoring API for commercetools API Extensions.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
// (packages/tooling/src/apiExtension.ts). An API Extension is the commercetools
|
|
3
|
+
// An API Extension is the commercetools
|
|
5
4
|
// platform feature: a synchronous HTTP callback commercetools makes before
|
|
6
5
|
// persisting a cart/order/… create or update, which can approve, modify, or BLOCK
|
|
7
6
|
// the write. This is a DIFFERENT thing from a GraphQL schema extension (typeDefs +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiExtension.js","sourceRoot":"","sources":["../../../src/lib/tooling/apiExtension.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"apiExtension.js","sourceRoot":"","sources":["../../../src/lib/tooling/apiExtension.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,EAAE;AACF,wCAAwC;AACxC,2EAA2E;AAC3E,kFAAkF;AAClF,mFAAmF;AACnF,mFAAmF;AACnF,mCAAmC;AACnC,EAAE;AACF,mFAAmF;AACnF,oFAAoF;AACpF,oFAAoF;AACpF,uCAAuC;AACvC,EAAE;AACF,mFAAmF;AACnF,oFAAoF;AACpF,oFAAoF;AACpF,6EAA6E;AAC7E,iFAAiF;AACjF,oFAAoF;AACpF,+DAA+D;AA+C/D,gGAAgG;AAChG,MAAM,UAAU,kBAAkB,CAAC,UAAkC;IACnE,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,OAAO;IACrB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,KAAK,CAAC,IAAY,EAAE,OAAe;IACjD,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AACzC,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,MAAM,CAAC,OAAkB;IACvC,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
// Bundle an extension source into a single self-contained CommonJS artifact.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// argv/env-driven `buildCommand` wrapper is NOT copied (this plugin's oclif command
|
|
6
|
-
// is the wrapper). esbuild bundles local helper modules inline. The output is
|
|
3
|
+
// A low-level function; the oclif command is the wrapper around it.
|
|
4
|
+
// esbuild bundles local helper modules inline. The output is
|
|
7
5
|
// CommonJS so the runtime can evaluate it as a script and read `module.exports`.
|
|
8
6
|
// `platform: "neutral"` keeps Node built-ins out (an import of one fails the build,
|
|
9
7
|
// not at load time), and `conditions: ["worker"]` steers a bundled SDK to its
|
|
@@ -39,8 +37,7 @@ export async function buildBundle(entry = defaultEntry(), outfile = defaultOutfi
|
|
|
39
37
|
// a resolver — is otherwise unresolvable ("Could not resolve"). Preferring
|
|
40
38
|
// `module` (the fetch-based ESM build, no Node built-ins) then `main` fixes that;
|
|
41
39
|
// packages that DO declare `exports` (e.g. algoliasearch) resolve through it and
|
|
42
|
-
// ignore this.
|
|
43
|
-
// keep the two in sync when it's added there.)
|
|
40
|
+
// ignore this.
|
|
44
41
|
mainFields: ["module", "main"],
|
|
45
42
|
external: HOST_PROVIDED_EXTERNALS,
|
|
46
43
|
metafile: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/lib/tooling/build.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/lib/tooling/build.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,EAAE;AACF,oEAAoE;AACpE,6DAA6D;AAC7D,iFAAiF;AACjF,oFAAoF;AACpF,8EAA8E;AAC9E,sFAAsF;AACtF,gFAAgF;AAChF,oDAAoD;AAEpD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,4EAA4E;AAC5E,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,SAAS,CAAC,CAAC;AAEnD,qFAAqF;AACrF,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;AACpD,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;AACrD,CAAC;AAaD,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgB,YAAY,EAAE,EAC9B,UAAkB,cAAc,EAAE;IAElC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC;QACzB,WAAW,EAAE,CAAC,KAAK,CAAC;QACpB,OAAO;QACP,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,SAAS;QACnB,MAAM,EAAE,QAAQ;QAChB,UAAU,EAAE,CAAC,QAAQ,CAAC;QACtB,gFAAgF;QAChF,kFAAkF;QAClF,kFAAkF;QAClF,2EAA2E;QAC3E,kFAAkF;QAClF,iFAAiF;QACjF,eAAe;QACf,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC9B,QAAQ,EAAE,uBAAuB;QACjC,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,QAAQ;KACnB,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;SACpD,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;SAClD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IACjD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
// Compose the local extension subgraph with the project's live integration-layer
|
|
2
2
|
// subgraph — the same two-subgraph composition the integration layer runs on publish.
|
|
3
3
|
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// in `../ilClient.ts` parameterised by (baseUrl, projectKey, token), and the command
|
|
9
|
-
// layer supplies the token.
|
|
4
|
+
// `composeWithIntegrationLayer` below is the low-level half. Fetching the project's
|
|
5
|
+
// subgraph SDL is a plain authenticated HTTP call, so it lives separately in
|
|
6
|
+
// `../ilClient.ts`, parameterised by (baseUrl, projectKey, token) with the command
|
|
7
|
+
// layer supplying the token.
|
|
10
8
|
import { parse, printSchema } from "graphql";
|
|
11
9
|
import { composeServices } from "@apollo/composition";
|
|
12
10
|
/** The subgraph names the integration layer composes under — matched here so the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../../../src/lib/tooling/compose.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,sFAAsF;AACtF,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../../../src/lib/tooling/compose.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,sFAAsF;AACtF,EAAE;AACF,oFAAoF;AACpF,6EAA6E;AAC7E,mFAAmF;AACnF,6BAA6B;AAE7B,OAAO,EAAE,KAAK,EAAE,WAAW,EAAsB,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD;;mDAEmD;AACnD,MAAM,CAAC,MAAM,yBAAyB,GAAG,mBAAmB,CAAC;AAC7D,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAc9C;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CACzC,mBAA2B,EAC3B,YAAoB,EACpB,IAA2D;IAE3D,IAAI,QAAQ,CAAC;IACb,IAAI,CAAC;QACH,QAAQ,GAAG;YACT,EAAE,IAAI,EAAE,yBAAyB,EAAE,QAAQ,EAAE,KAAK,CAAC,mBAAmB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,mBAAmB,EAAE;YACxG,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE;SACnF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,6BAA8B,GAAa,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;IACxF,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACzC,gFAAgF;IAChF,6EAA6E;IAC7E,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACpE,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC;IAClE,OAAO;QACL,EAAE,EAAE,IAAI;QACR,SAAS;QACT,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC;QAC9B,aAAa,EAAE,MAAM,CAAC,aAAa;KACpC,CAAC;AACJ,CAAC"}
|
|
@@ -6,6 +6,8 @@ export interface GraphQLBody {
|
|
|
6
6
|
variables?: Record<string, unknown>;
|
|
7
7
|
operationName?: string;
|
|
8
8
|
}
|
|
9
|
+
/** Default Hive usage identity when the caller does not override it. */
|
|
10
|
+
export declare const DEFAULT_GRAPHQL_CLIENT_NAME = "commercetools-integration-layer-cli";
|
|
9
11
|
export interface ExplorerServerOptions {
|
|
10
12
|
/** The schema introspection is answered from (docs, autocomplete, validation). */
|
|
11
13
|
schema: GraphQLSchema;
|
|
@@ -13,6 +15,10 @@ export interface ExplorerServerOptions {
|
|
|
13
15
|
endpoint: string;
|
|
14
16
|
/** Session bearer attached to every proxied operation. Never sent to the browser. */
|
|
15
17
|
bearer: string;
|
|
18
|
+
/** Hive `graphql-client-name` on proxied operations (introspection stays local). */
|
|
19
|
+
clientName?: string;
|
|
20
|
+
/** Hive `graphql-client-version` on proxied operations. */
|
|
21
|
+
clientVersion?: string;
|
|
16
22
|
}
|
|
17
23
|
/**
|
|
18
24
|
* Build (but do not listen on) the explorer's server.
|
|
@@ -16,6 +16,8 @@ import { createServer } from "node:http";
|
|
|
16
16
|
import { execute, parse, validate } from "graphql";
|
|
17
17
|
import { EXPLORER_HTML } from "./explorerPage.js";
|
|
18
18
|
import { isIntrospectionRequest } from "./introspectionRequest.js";
|
|
19
|
+
/** Default Hive usage identity when the caller does not override it. */
|
|
20
|
+
export const DEFAULT_GRAPHQL_CLIENT_NAME = "commercetools-integration-layer-cli";
|
|
19
21
|
/**
|
|
20
22
|
* Build (but do not listen on) the explorer's server.
|
|
21
23
|
*
|
|
@@ -110,6 +112,8 @@ async function handle(req, res, opts) {
|
|
|
110
112
|
"content-type": "application/json",
|
|
111
113
|
accept: "application/json",
|
|
112
114
|
authorization: `Bearer ${opts.bearer}`,
|
|
115
|
+
"graphql-client-name": opts.clientName ?? DEFAULT_GRAPHQL_CLIENT_NAME,
|
|
116
|
+
"graphql-client-version": opts.clientVersion ?? "dev",
|
|
113
117
|
},
|
|
114
118
|
body: JSON.stringify(body),
|
|
115
119
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explorerServer.js","sourceRoot":"","sources":["../../../src/lib/tooling/explorerServer.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,EAAE;AACF,kFAAkF;AAClF,EAAE;AACF,sCAAsC;AACtC,oFAAoF;AACpF,kEAAkE;AAClE,iFAAiF;AACjF,EAAE;AACF,iFAAiF;AACjF,0CAA0C;AAC1C,EAAE;AACF,kFAAkF;AAClF,4CAA4C;AAE5C,OAAO,EAAE,YAAY,EAA0D,MAAM,WAAW,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAsB,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"explorerServer.js","sourceRoot":"","sources":["../../../src/lib/tooling/explorerServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,8 +4,7 @@
|
|
|
4
4
|
// resolves `name` from the integration layer and `loyaltyPoints` from the local
|
|
5
5
|
// extension in one request, the production topology in miniature.
|
|
6
6
|
//
|
|
7
|
-
//
|
|
8
|
-
// (packages/tooling/src/gateway.ts). We use Apollo Gateway (the reference Federation
|
|
7
|
+
// We use Apollo Gateway (the reference Federation
|
|
9
8
|
// implementation) because the extension model leans on `@interfaceObject` and only
|
|
10
9
|
// the reference gateway resolves that correctly. Both subgraphs are reached over
|
|
11
10
|
// HTTP, so the extension runs as a genuine subgraph; the integration-layer data
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../../src/lib/tooling/gateway.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,kFAAkF;AAClF,yFAAyF;AACzF,gFAAgF;AAChF,kEAAkE;AAClE,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../../src/lib/tooling/gateway.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,kFAAkF;AAClF,yFAAyF;AACzF,gFAAgF;AAChF,kEAAkE;AAClE,EAAE;AACF,kDAAkD;AAClD,mFAAmF;AACnF,iFAAiF;AACjF,gFAAgF;AAChF,qFAAqF;AACrF,qCAAqC;AAErC,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,mBAA2B,EAC3B,UAAkB;IAElB,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,kBAAkB,CAAC,UAAU,CAAC,UAAU,CAAC;IAChE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;KAClD,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,wCAAwC,GAAG,CAAC,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC;IAC5F,CAAC;IACD,MAAM,KAAK,GAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAwB,CAAC,KAAK,CAAC;IAC7D,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC7D,OAAO,KAAK,CAAC;AACf,CAAC;AASD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAoB;IACpD,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC;QAChC,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAC9B,IAAI,uBAAuB,CAAC;YAC1B,GAAG;YACH,6EAA6E;YAC7E,mEAAmE;YACnE,OAAO,EAAE,UAAU,CAAC,KAAsD;YAC1E,eAAe,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;gBAC/B,2EAA2E;gBAC3E,iEAAiE;gBACjE,IAAI,IAAI,KAAK,yBAAyB,EAAE,CAAC;oBACvC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC;gBACtF,CAAC;YACH,CAAC;SACF,CAAC;KACL,CAAC,CAAC;IACH,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACrB,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
// Load a built extension bundle and return its exported `typeDefs` + `resolvers`,
|
|
2
2
|
// used by the resolver-coherence check and the local dev server.
|
|
3
3
|
//
|
|
4
|
-
//
|
|
5
|
-
// (packages/tooling/src/loadBundle.ts). The bundle is esbuild's single-file
|
|
4
|
+
// The bundle is esbuild's single-file
|
|
6
5
|
// CommonJS artifact, so we evaluate it with the CommonJS calling convention and a
|
|
7
6
|
// `require` that resolves only `graphql` (a second copy would break `instanceof`).
|
|
8
7
|
// It runs as an ordinary module — not a security boundary; the runtime enforces
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadBundle.js","sourceRoot":"","sources":["../../../src/lib/tooling/loadBundle.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,iEAAiE;AACjE,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"loadBundle.js","sourceRoot":"","sources":["../../../src/lib/tooling/loadBundle.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,iEAAiE;AACjE,EAAE;AACF,sCAAsC;AACtC,kFAAkF;AAClF,mFAAmF;AACnF,gFAAgF;AAChF,0DAA0D;AAE1D,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAUvC;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,MAAM,YAAY,GAAiC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACnE,MAAM,WAAW,GAAG,CAAC,EAAU,EAAW,EAAE;QAC1C,IAAI,EAAE,KAAK,SAAS;YAAE,OAAO,EAAE,YAAY,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;IAC9D,CAAC,CAAC;IACF,8EAA8E;IAC9E,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACtE,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC1D,OAAO,YAAY,CAAC,OAAO,CAAC;AAC9B,CAAC"}
|
|
@@ -28,7 +28,7 @@ export interface MintedSession {
|
|
|
28
28
|
/**
|
|
29
29
|
* Mint an integration-layer session bearer at `POST <authUrl>/<project>/session`.
|
|
30
30
|
*
|
|
31
|
-
* `authUrl` is the identity edge
|
|
31
|
+
* `authUrl` is the identity edge, NOT the extensions edge that
|
|
32
32
|
* serves the manage-surface routes — in the deployed topology those are different
|
|
33
33
|
* hosts (`auth.…` vs `extensions.…`), which is why the explorer resolves them
|
|
34
34
|
* separately.
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
/**
|
|
22
22
|
* Mint an integration-layer session bearer at `POST <authUrl>/<project>/session`.
|
|
23
23
|
*
|
|
24
|
-
* `authUrl` is the identity edge
|
|
24
|
+
* `authUrl` is the identity edge, NOT the extensions edge that
|
|
25
25
|
* serves the manage-surface routes — in the deployed topology those are different
|
|
26
26
|
* hosts (`auth.…` vs `extensions.…`), which is why the explorer resolves them
|
|
27
27
|
* separately.
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
// Best-effort static analysis of an extension's source, run by `validate`/`push`.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// then port the change here. The resolver environment provides a restricted set of
|
|
9
|
-
// capabilities, not a full Node runtime, so this flags patterns that won't work there
|
|
10
|
-
// before the bundle is uploaded. It parses the author's own source files to a
|
|
3
|
+
// The list below mirrors the endowments the extensions sandbox actually provides —
|
|
4
|
+
// that runtime is the source of truth, and this list is updated to follow it. The
|
|
5
|
+
// resolver environment offers a restricted set of capabilities, not a full Node
|
|
6
|
+
// runtime, so this flags patterns that won't work there before the bundle is
|
|
7
|
+
// uploaded. It parses the author's own source files to a
|
|
11
8
|
// TypeScript AST (so a mention in a comment or string is never a false positive) and
|
|
12
9
|
// is a lint, not an enforcement boundary — it catches honest mistakes, not deliberate
|
|
13
10
|
// obfuscation. It rejects:
|