@commercetools/cli-topic-integration-layer 0.0.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +64 -0
  3. package/dist/commands/integration-layer/config/get.d.ts +9 -0
  4. package/dist/commands/integration-layer/config/get.js +22 -0
  5. package/dist/commands/integration-layer/config/get.js.map +1 -0
  6. package/dist/commands/integration-layer/config/list.d.ts +6 -0
  7. package/dist/commands/integration-layer/config/list.js +20 -0
  8. package/dist/commands/integration-layer/config/list.js.map +1 -0
  9. package/dist/commands/integration-layer/config/set.d.ts +13 -0
  10. package/dist/commands/integration-layer/config/set.js +29 -0
  11. package/dist/commands/integration-layer/config/set.js.map +1 -0
  12. package/dist/commands/integration-layer/config/unset.d.ts +9 -0
  13. package/dist/commands/integration-layer/config/unset.js +18 -0
  14. package/dist/commands/integration-layer/config/unset.js.map +1 -0
  15. package/dist/commands/integration-layer/extension/build.d.ts +12 -0
  16. package/dist/commands/integration-layer/extension/build.js +40 -0
  17. package/dist/commands/integration-layer/extension/build.js.map +1 -0
  18. package/dist/commands/integration-layer/extension/delete.d.ts +9 -0
  19. package/dist/commands/integration-layer/extension/delete.js +39 -0
  20. package/dist/commands/integration-layer/extension/delete.js.map +1 -0
  21. package/dist/commands/integration-layer/extension/invoke.d.ts +13 -0
  22. package/dist/commands/integration-layer/extension/invoke.js +89 -0
  23. package/dist/commands/integration-layer/extension/invoke.js.map +1 -0
  24. package/dist/commands/integration-layer/extension/push.d.ts +28 -0
  25. package/dist/commands/integration-layer/extension/push.js +217 -0
  26. package/dist/commands/integration-layer/extension/push.js.map +1 -0
  27. package/dist/commands/integration-layer/extension/serve.d.ts +37 -0
  28. package/dist/commands/integration-layer/extension/serve.js +528 -0
  29. package/dist/commands/integration-layer/extension/serve.js.map +1 -0
  30. package/dist/commands/integration-layer/extension/status.d.ts +6 -0
  31. package/dist/commands/integration-layer/extension/status.js +28 -0
  32. package/dist/commands/integration-layer/extension/status.js.map +1 -0
  33. package/dist/commands/integration-layer/extension/validate.d.ts +15 -0
  34. package/dist/commands/integration-layer/extension/validate.js +98 -0
  35. package/dist/commands/integration-layer/extension/validate.js.map +1 -0
  36. package/dist/commands/integration-layer/hello.d.ts +6 -0
  37. package/dist/commands/integration-layer/hello.js +10 -0
  38. package/dist/commands/integration-layer/hello.js.map +1 -0
  39. package/dist/commands/integration-layer/init.d.ts +13 -0
  40. package/dist/commands/integration-layer/init.js +279 -0
  41. package/dist/commands/integration-layer/init.js.map +1 -0
  42. package/dist/commands/integration-layer/schema/fetch.d.ts +9 -0
  43. package/dist/commands/integration-layer/schema/fetch.js +27 -0
  44. package/dist/commands/integration-layer/schema/fetch.js.map +1 -0
  45. package/dist/index.d.ts +1 -0
  46. package/dist/index.js +5 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/lib/awaitBundleState.d.ts +33 -0
  49. package/dist/lib/awaitBundleState.js +77 -0
  50. package/dist/lib/awaitBundleState.js.map +1 -0
  51. package/dist/lib/base.d.ts +50 -0
  52. package/dist/lib/base.js +85 -0
  53. package/dist/lib/base.js.map +1 -0
  54. package/dist/lib/ilClient.d.ts +93 -0
  55. package/dist/lib/ilClient.js +120 -0
  56. package/dist/lib/ilClient.js.map +1 -0
  57. package/dist/lib/sourceRevision.d.ts +39 -0
  58. package/dist/lib/sourceRevision.js +95 -0
  59. package/dist/lib/sourceRevision.js.map +1 -0
  60. package/dist/lib/tooling/apiExtension.d.ts +31 -0
  61. package/dist/lib/tooling/apiExtension.js +39 -0
  62. package/dist/lib/tooling/apiExtension.js.map +1 -0
  63. package/dist/lib/tooling/build.d.ts +18 -0
  64. package/dist/lib/tooling/build.js +54 -0
  65. package/dist/lib/tooling/build.js.map +1 -0
  66. package/dist/lib/tooling/compose.d.ts +28 -0
  67. package/dist/lib/tooling/compose.js +48 -0
  68. package/dist/lib/tooling/compose.js.map +1 -0
  69. package/dist/lib/tooling/extensions.d.ts +77 -0
  70. package/dist/lib/tooling/extensions.js +209 -0
  71. package/dist/lib/tooling/extensions.js.map +1 -0
  72. package/dist/lib/tooling/gateway.d.ts +21 -0
  73. package/dist/lib/tooling/gateway.js +65 -0
  74. package/dist/lib/tooling/gateway.js.map +1 -0
  75. package/dist/lib/tooling/loadBundle.d.ts +10 -0
  76. package/dist/lib/tooling/loadBundle.js +27 -0
  77. package/dist/lib/tooling/loadBundle.js.map +1 -0
  78. package/dist/lib/tooling/staticAnalysis.d.ts +11 -0
  79. package/dist/lib/tooling/staticAnalysis.js +167 -0
  80. package/dist/lib/tooling/staticAnalysis.js.map +1 -0
  81. package/dist/lib/tooling/validateBundle.d.ts +19 -0
  82. package/dist/lib/tooling/validateBundle.js +144 -0
  83. package/dist/lib/tooling/validateBundle.js.map +1 -0
  84. package/package.json +47 -5
@@ -0,0 +1,217 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { basename } from "node:path";
3
+ import { Flags } from "@oclif/core";
4
+ import { defaultEntry, defaultOutfile } from "../../../lib/tooling/build.js";
5
+ import { bundleForFlags } from "../../../lib/tooling/extensions.js";
6
+ import { validateBundle, BundleValidationError } from "../../../lib/tooling/validateBundle.js";
7
+ import { pushBundle, remoteValidate } from "../../../lib/ilClient.js";
8
+ import { awaitBundleState } from "../../../lib/awaitBundleState.js";
9
+ import { resolveSourceRevision } from "../../../lib/sourceRevision.js";
10
+ import { IntegrationLayerCommand } from "../../../lib/base.js";
11
+ // How often to re-read the bundle's status while waiting. The extension re-reads its
12
+ // bundle on its own ~30s poll, so a tighter interval just adds requests without
13
+ // learning anything sooner; 5s keeps the command feeling responsive when the
14
+ // extension happens to be mid-poll already.
15
+ const POLL_INTERVAL_MS = 5000;
16
+ /**
17
+ * Name a build the way its author recognises it: the integration layer's version
18
+ * number AND the source revision it was built from. The number is an internal
19
+ * counter — the commit is the identity. Falls back to the bare version when the
20
+ * push recorded no revision.
21
+ */
22
+ function describeBuild(version, sourceRevision) {
23
+ return sourceRevision
24
+ ? `version ${version} (source revision ${sourceRevision})`
25
+ : `version ${version}`;
26
+ }
27
+ export default class ExtensionPush extends IntegrationLayerCommand {
28
+ static description = "Build + validate (local + remote) + upload the bundle, replacing the project's stored one";
29
+ static examples = [
30
+ "<%= config.bin %> integration-layer extension push",
31
+ "<%= config.bin %> integration-layer extension push --force",
32
+ "<%= config.bin %> integration-layer extension push --all",
33
+ "<%= config.bin %> integration-layer extension push --source-revision r48211",
34
+ "<%= config.bin %> integration-layer extension push --no-source-revision",
35
+ ];
36
+ static flags = {
37
+ entry: Flags.string({ description: "extension entry source file", default: defaultEntry() }),
38
+ out: Flags.string({ description: "bundle output file", default: defaultOutfile() }),
39
+ all: Flags.boolean({
40
+ description: "merge every extension under ./extensions/* into ONE combined bundle and push that single artifact (the deployed shape)",
41
+ default: false,
42
+ }),
43
+ "extensions-dir": Flags.string({
44
+ description: "directory holding the extension packages (used with --all)",
45
+ default: "extensions",
46
+ }),
47
+ force: Flags.boolean({
48
+ char: "f",
49
+ description: "upload despite a failing REMOTE validation (the local check always hard-fails)",
50
+ default: false,
51
+ }),
52
+ // Provenance. The default is auto-detection from the working copy, so a plain
53
+ // `push` records where the build came from with no ceremony; the flag is for a
54
+ // non-git VCS, a CI build id, or anything else the integrator identifies revisions
55
+ // by (the integration layer stores an opaque string).
56
+ "source-revision": Flags.string({
57
+ description: "version-control revision this build came from (default: detected from the git working copy; also settable via EXTENSION_SOURCE_REVISION)",
58
+ env: "EXTENSION_SOURCE_REVISION",
59
+ exclusive: ["no-source-revision"],
60
+ }),
61
+ "no-source-revision": Flags.boolean({
62
+ description: "push without recording any source revision",
63
+ default: false,
64
+ }),
65
+ // A push only STORES the bundle; the extension loads it on its own poll and
66
+ // reports back. Waiting for that verdict is the default because a push that
67
+ // reports success while the bundle can't actually run is the thing worth
68
+ // catching — especially in CI, where this is the difference between a green
69
+ // pipeline and a green pipeline that shipped a broken extension.
70
+ wait: Flags.boolean({
71
+ description: "wait for the extension to load the pushed version and report back (use --no-wait to return as soon as it is stored)",
72
+ default: true,
73
+ allowNo: true,
74
+ }),
75
+ "wait-timeout": Flags.integer({
76
+ description: "seconds to wait for the pushed version to be confirmed before giving up (the push still stands)",
77
+ default: 180,
78
+ }),
79
+ };
80
+ /**
81
+ * Report how the pushed version fared and say whether the command should fail.
82
+ *
83
+ * Only a genuine `failed` verdict is an error. Not being ABLE to find out — an
84
+ * older integration layer, an extension that isn't deployed, a metadata read that
85
+ * errored — is reported honestly and left as a success, because the push itself
86
+ * did land and failing it would break workflows that never had this signal.
87
+ */
88
+ reportOutcome(outcome, version) {
89
+ switch (outcome.kind) {
90
+ case "running":
91
+ this.log(`✓ ${describeBuild(version, outcome.meta.sourceRevision)} is running — the extension loaded it and published its schema`);
92
+ return false;
93
+ case "failed": {
94
+ this.logToStderr(`✗ ${describeBuild(version, outcome.meta.sourceRevision)} could not be loaded and is NOT in use.`);
95
+ if (outcome.meta.reason)
96
+ this.logToStderr(` reason: ${outcome.meta.reason}`);
97
+ const served = outcome.meta.served;
98
+ this.logToStderr(served == null
99
+ ? " no stored version could be loaded, so this project currently has no extension running."
100
+ : ` ${describeBuild(served.version, served.sourceRevision)} is still in use; fix the bundle and push again.`);
101
+ return true;
102
+ }
103
+ case "superseded":
104
+ this.log(`⚠ another push replaced version ${version} with ${describeBuild(outcome.meta.version, outcome.meta.sourceRevision)} while waiting; not reporting on it`);
105
+ return false;
106
+ case "unknown":
107
+ this.log(`⚠ could not confirm version ${version}: ${outcome.reason}`);
108
+ this.log(" the bundle is stored; check the extension panel in the Merchant Center.");
109
+ return false;
110
+ }
111
+ }
112
+ /** True when the remote result should abort the push. */
113
+ reportRemote(result) {
114
+ if (!result.composes) {
115
+ this.logToStderr("✗ extension does not compose with the integration layer supergraph:");
116
+ for (const err of result.compositionErrors)
117
+ this.logToStderr(` - ${err}`);
118
+ }
119
+ else if (result.breakingChanges.length > 0) {
120
+ this.logToStderr("✗ extension introduces breaking changes to the published supergraph:");
121
+ for (const change of result.breakingChanges) {
122
+ this.logToStderr(` - [${change.type}] ${change.description}`);
123
+ }
124
+ }
125
+ else if (!result.comparedToPublished) {
126
+ this.log("✓ composes with the integration layer supergraph (breaking-change check skipped: no published baseline)");
127
+ }
128
+ else {
129
+ this.log("✓ composes with the integration layer supergraph and introduces no breaking changes");
130
+ }
131
+ return result.valid;
132
+ }
133
+ async run() {
134
+ const { flags } = await this.parse(ExtensionPush);
135
+ // Bundle, then VALIDATE before we touch the store. Local check first — it always
136
+ // hard-fails, regardless of --force.
137
+ let outfile;
138
+ let sourceFiles;
139
+ try {
140
+ ({ outfile, sourceFiles } = await bundleForFlags({
141
+ all: flags.all,
142
+ extensionsDir: flags["extensions-dir"],
143
+ entry: flags.entry,
144
+ out: flags.out,
145
+ }));
146
+ }
147
+ catch (err) {
148
+ this.error(err.message);
149
+ }
150
+ let typeDefs;
151
+ try {
152
+ const local = await validateBundle(outfile, sourceFiles);
153
+ typeDefs = local.typeDefs;
154
+ this.log(`✓ validated bundle (resolver roots: ${local.resolverTypes.join(", ") || "none"}; ` +
155
+ `API extensions: ${local.apiExtensionKeys.join(", ") || "none"})`);
156
+ }
157
+ catch (err) {
158
+ if (err instanceof BundleValidationError)
159
+ this.error(err.message);
160
+ throw err;
161
+ }
162
+ const { baseUrl, projectKey, token } = await this.resolveIlContext(flags);
163
+ // Remote check composes the GraphQL subgraph WITH the integration layer + checks
164
+ // for breaking changes. Only applies when the bundle has a subgraph — an
165
+ // API-extensions-only bundle has no SDL, so skip straight to the upload.
166
+ if (typeDefs !== null) {
167
+ const remote = await remoteValidate(baseUrl, projectKey, token, typeDefs);
168
+ const valid = this.reportRemote(remote);
169
+ if (!valid) {
170
+ if (!flags.force) {
171
+ this.error("Aborting push. Re-run with --force to override the remote validation.");
172
+ }
173
+ this.logToStderr("⚠ forcing push despite failing validation (--force).");
174
+ }
175
+ }
176
+ const bundle = await readFile(outfile, "utf8");
177
+ const filename = `${basename(outfile).replace(/\.[^.]+$/, "")}.cjs`;
178
+ // Which of the integrator's revisions this build came from. Reported so the
179
+ // Merchant Center, the connector's log lines and `{ _extensionBundle }` can all
180
+ // name it. Detected from the working copy unless the caller said otherwise; a
181
+ // build outside version control simply reports none (see sourceRevision.ts).
182
+ const sourceRevision = flags["no-source-revision"]
183
+ ? undefined
184
+ : await resolveSourceRevision(flags["source-revision"], process.cwd());
185
+ if (sourceRevision) {
186
+ this.log(`Source revision: ${sourceRevision}`);
187
+ }
188
+ else if (!flags["no-source-revision"]) {
189
+ // Say so rather than staying silent: the operator console and the connector
190
+ // logs will show no revision for this push, and that's worth knowing now.
191
+ this.logToStderr("⚠ no source revision detected (not a git checkout?) — pushing without one. " +
192
+ "Pass --source-revision to record one explicitly.");
193
+ }
194
+ const url = `${baseUrl}/${encodeURIComponent(projectKey)}/extension/bundle`;
195
+ this.log(`Pushing extension bundle (${bundle.length} bytes) → ${url}`);
196
+ const meta = await pushBundle(baseUrl, projectKey, token, bundle, filename, sourceRevision);
197
+ this.log(`✓ stored revision ${meta.version} (${meta.length} bytes, filename ${meta.filename ?? filename})`);
198
+ if (meta.sourceRevision) {
199
+ this.log(` built from ${meta.sourceRevision}`);
200
+ }
201
+ if (!flags.wait) {
202
+ return;
203
+ }
204
+ // Storing it isn't running it. Wait for the extension to actually load this
205
+ // version and say so, and fail the command if it couldn't — otherwise a bundle
206
+ // the sandbox refuses to run exits 0 and looks like a successful push.
207
+ this.log(`Waiting for the extension to load version ${meta.version}…`);
208
+ const outcome = await awaitBundleState(baseUrl, projectKey, token, meta.version, {
209
+ timeoutMs: flags["wait-timeout"] * 1000,
210
+ intervalMs: POLL_INTERVAL_MS,
211
+ });
212
+ if (this.reportOutcome(outcome, meta.version)) {
213
+ this.error("The pushed bundle could not be loaded.");
214
+ }
215
+ }
216
+ }
217
+ //# sourceMappingURL=push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../../../src/commands/integration-layer/extension/push.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { IntegrationLayerCommand } from "../../../lib/base.js";
2
+ export default class ExtensionServe extends IntegrationLayerCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ protected authorized: boolean;
6
+ static flags: {
7
+ port: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
8
+ compose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
+ gateway: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ all: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ "extensions-dir": import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
12
+ };
13
+ run(): Promise<void>;
14
+ /**
15
+ * `--all`: merge every extension under `./extensions/*` into ONE federation subgraph —
16
+ * the single bundle a project deploys — and serve it behind a local federated gateway
17
+ * with the deployed integration layer, exactly the two-subgraph shape the router plans
18
+ * over (core + the combined `extensions` subgraph). Like `--gateway` it reaches the
19
+ * integration layer (fetches its SDL, mints an anonymous session), so it needs a
20
+ * `commercetools auth login`. Watches every extension and hot-reloads: any edit
21
+ * re-merges the combined subgraph, and a schema change recomposes + rebuilds the gateway.
22
+ */
23
+ private runAll;
24
+ /**
25
+ * Start esbuild in watch mode over the current example and feed `onBuild` a freshly
26
+ * loaded subgraph on every (re)build. Resolves once the initial build has produced
27
+ * one (so the caller can start serving); later rebuilds fire `onBuild` again.
28
+ */
29
+ private watchAndBuild;
30
+ /**
31
+ * The generic watcher underneath {@link watchAndBuild}: esbuild-watch `entry`, and on
32
+ * every successful (re)build load the bundle and hand the raw module to `onReload`.
33
+ * `--all` uses this directly (it needs the module's resolvers to merge subgraphs);
34
+ * single-mode wraps it to build one subgraph.
35
+ */
36
+ private watchEntry;
37
+ }