Skip to content

Commit 3cd465b

Browse files
committed
chore(clients): use rollup for dist-cjs
1 parent ff5b376 commit 3cd465b

File tree

3 files changed

+220
-60
lines changed

3 files changed

+220
-60
lines changed

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@
7373
"@fastify/formbody": "^7.4.0",
7474
"@microsoft/api-extractor": "7.52.7",
7575
"@mixer/parallel-prettier": "2.0.3",
76+
"@rollup/plugin-json": "^6.1.0",
77+
"@rollup/plugin-node-resolve": "^16.0.2",
78+
"@rollup/plugin-typescript": "^12.1.4",
7679
"@tsconfig/recommended": "1.0.1",
7780
"@types/fs-extra": "^8.0.1",
7881
"@types/jest": "29.5.11",

scripts/compilation/Inliner.js

Lines changed: 124 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ const fs = require("fs");
22
const path = require("path");
33
const { spawnProcess } = require("./../utils/spawn-process");
44
const walk = require("./../utils/walk");
5-
const esbuild = require("esbuild");
5+
const rollup = require("rollup");
6+
const { nodeResolve } = require("@rollup/plugin-node-resolve");
7+
const typescript = require("@rollup/plugin-typescript");
8+
const json = require("@rollup/plugin-json");
69

710
const root = path.join(__dirname, "..", "..");
811

@@ -143,6 +146,8 @@ module.exports = class Inliner {
143146
}
144147
}
145148

149+
this.variantExternals = [...new Set(this.variantExternals)];
150+
146151
return this;
147152
}
148153

@@ -155,30 +160,67 @@ module.exports = class Inliner {
155160
return this;
156161
}
157162

158-
this.variantExternalsForEsBuild = this.variantExternals.map(
159-
(variant) => "*/" + path.basename(variant).replace(/.js$/, "")
160-
);
163+
const variantExternalsForRollup = this.variantExternals.map((variant) => variant.replace(/.js$/, ""));
164+
165+
const entryPoint = path.join(root, this.subfolder, this.package, "src", "index.ts");
166+
167+
const inputOptions = (externals) => ({
168+
input: entryPoint,
169+
plugins: [
170+
nodeResolve(),
171+
json(),
172+
typescript({
173+
compilerOptions: {
174+
importHelpers: true,
175+
noEmitHelpers: false,
176+
module: "esnext",
177+
target: "es2022",
178+
noCheck: true,
179+
removeComments: true,
180+
},
181+
}),
182+
],
183+
external: (id) => {
184+
const relative = !!id.match(/^\.?\.?\//);
185+
if (!relative) {
186+
this.verbose && console.log("EXTERN (pkg)", id);
187+
return true;
188+
}
161189

162-
const buildOptions = {
163-
platform: this.platform,
164-
target: ["node18"],
165-
bundle: true,
166-
format: "cjs",
167-
mainFields: ["main"],
168-
allowOverwrite: true,
169-
entryPoints: [path.join(root, this.subfolder, this.package, "src", "index.ts")],
170-
supported: {
171-
"dynamic-import": false,
190+
const local = id.includes(`/packages/`) && id.includes(`/dist-es/`);
191+
if (local) {
192+
this.verbose && console.log("EXTERN (local)", id);
193+
return true;
194+
}
195+
196+
if (id === entryPoint) {
197+
this.verbose && console.log("INTERN (entry point)", id);
198+
return false;
199+
}
200+
201+
for (const file of externals) {
202+
const idWithoutExtension = id.replace(/\.ts$/, "");
203+
if (idWithoutExtension.endsWith(path.basename(file))) {
204+
this.verbose && console.log("EXTERN (variant)", id);
205+
return true;
206+
}
207+
}
208+
209+
this.verbose && console.log("INTERN (invariant)", id);
210+
return false;
172211
},
173-
outfile: this.outfile,
174-
keepNames: true,
175-
packages: "external",
176-
external: ["@smithy/*", "@aws-sdk/*", "node_modules/*", ...this.variantExternalsForEsBuild],
212+
});
213+
214+
const outputOptions = {
215+
file: this.outfile,
216+
format: "cjs",
217+
exports: "named",
218+
preserveModules: false,
177219
};
178220

179-
if (!this.hasSubmodules) {
180-
await esbuild.build(buildOptions);
181-
}
221+
const bundle = await rollup.rollup(inputOptions(variantExternalsForRollup));
222+
await bundle.write(outputOptions);
223+
await bundle.close();
182224

183225
if (this.hasSubmodules) {
184226
const submodules = fs.readdirSync(path.join(root, this.subfolder, this.package, "src", "submodules"));
@@ -206,19 +248,39 @@ module.exports = class Inliner {
206248
}
207249
}
208250

209-
await esbuild.build({
210-
...buildOptions,
211-
entryPoints: [path.join(root, this.subfolder, this.package, "src", "submodules", submodule, "index.ts")],
212-
outfile: path.join(root, this.subfolder, this.package, "dist-cjs", "submodules", submodule, "index.js"),
213-
external: [
214-
"@smithy/*",
215-
"@aws-sdk/*",
216-
"node_modules/*",
217-
...this.variantExternals
218-
.filter((variant) => variant.includes(`submodules/${submodule}`))
219-
.map((variant) => "*/" + path.basename(variant).replace(/.js$/, "")),
220-
],
251+
// remove remaining empty directories.
252+
const submoduleFolder = path.join(root, this.subfolder, this.package, "dist-cjs", "submodules", submodule);
253+
function rmdirEmpty(dir) {
254+
for (const entry of fs.readdirSync(dir)) {
255+
const fullPath = path.join(dir, entry);
256+
if (fs.lstatSync(fullPath).isDirectory()) {
257+
if (fs.readdirSync(fullPath).length) {
258+
rmdirEmpty(fullPath);
259+
} else {
260+
fs.rmdirSync(fullPath);
261+
}
262+
}
263+
}
264+
}
265+
rmdirEmpty(submoduleFolder);
266+
267+
const submoduleVariants = variantExternalsForRollup.filter((external) =>
268+
external.includes(`submodules/${submodule}`)
269+
);
270+
271+
const submoduleOptions = inputOptions(submoduleVariants);
272+
273+
const submoduleBundle = await rollup.rollup({
274+
...submoduleOptions,
275+
input: path.join(root, this.subfolder, this.package, "src", "submodules", submodule, "index.ts"),
276+
});
277+
278+
await submoduleBundle.write({
279+
...outputOptions,
280+
file: path.join(root, this.subfolder, this.package, "dist-cjs", "submodules", submodule, "index.js"),
221281
});
282+
283+
await submoduleBundle.close();
222284
}
223285
}
224286

@@ -463,33 +525,37 @@ module.exports = class Inliner {
463525
}
464526

465527
// check ESM compat.
466-
const tmpFileContents = this.canonicalExports
467-
.filter((sym) => !sym.includes(":"))
468-
.map((sym) => `import { ${sym} } from "${this.pkgJson.name}";`)
469-
.join("\n");
528+
const tmpFileContents =
529+
`import assert from "node:assert";
530+
531+
const namingExceptions = [
532+
"paginateOperation" // name for all paginators.
533+
];
534+
` +
535+
this.canonicalExports
536+
.filter((sym) => !sym.includes(":"))
537+
.map((sym) => {
538+
if (
539+
[
540+
"AWSSDKSigV4Signer", // deprecated alias for AwsSdkSigV4Signer
541+
"resolveAWSSDKSigV4Config", // deprecated alias for resolveAwsSdkSigV4Config
542+
"__Client", // base Client in SDK clients
543+
"$Command", // base Command in SDK clients
544+
].includes(sym)
545+
) {
546+
return `import { ${sym} } from "${this.pkgJson.name}";`;
547+
}
548+
return `import { ${sym} } from "${this.pkgJson.name}";
549+
if (typeof ${sym} === "function") {
550+
if (${sym}.name !== "${sym}" && !namingExceptions.includes(${sym}.name)) {
551+
throw new Error(${sym}.name + " does not equal expected ${sym}.")
552+
}
553+
}
554+
`;
555+
})
556+
.join("\n");
470557
fs.writeFileSync(path.join(__dirname, "tmp", this.package + ".mjs"), tmpFileContents, "utf-8");
471558
await spawnProcess("node", [path.join(__dirname, "tmp", this.package + ".mjs")]);
472-
473-
if (this.hasSubmodules) {
474-
const submodules = fs.readdirSync(path.join(root, this.subfolder, this.package, "src", "submodules"));
475-
for (const submodule of submodules) {
476-
const canonicalExports = Object.keys(
477-
require(path.join(root, this.subfolder, this.package, "dist-cjs", "submodules", submodule, "index.js"))
478-
);
479-
const tmpFileContents = canonicalExports
480-
.filter((sym) => !sym.includes(":"))
481-
.map((sym) => `import { ${sym} } from "${this.pkgJson.name}/${submodule}";`)
482-
.join("\n");
483-
const tmpFilePath = path.join(__dirname, "tmp", this.package + "_" + submodule + ".mjs");
484-
fs.writeFileSync(tmpFilePath, tmpFileContents, "utf-8");
485-
await spawnProcess("node", [tmpFilePath]);
486-
fs.rmSync(tmpFilePath);
487-
if (this.verbose) {
488-
console.log("ESM compatibility verified for submodule", submodule);
489-
}
490-
}
491-
}
492-
493559
if (this.verbose) {
494560
console.log("ESM compatibility verified.");
495561
}

yarn.lock

Lines changed: 93 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28332,6 +28332,73 @@ __metadata:
2833228332
languageName: node
2833328333
linkType: hard
2833428334

28335+
"@rollup/plugin-json@npm:^6.1.0":
28336+
version: 6.1.0
28337+
resolution: "@rollup/plugin-json@npm:6.1.0"
28338+
dependencies:
28339+
"@rollup/pluginutils": "npm:^5.1.0"
28340+
peerDependencies:
28341+
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
28342+
peerDependenciesMeta:
28343+
rollup:
28344+
optional: true
28345+
checksum: 10c0/9400c431b5e0cf3088ba2eb2d038809a2b0fb2a84ed004997da85582f48cd64958ed3168893c4f2c8109e38652400ed68282d0c92bf8ec07a3b2ef2e1ceab0b7
28346+
languageName: node
28347+
linkType: hard
28348+
28349+
"@rollup/plugin-node-resolve@npm:^16.0.2":
28350+
version: 16.0.2
28351+
resolution: "@rollup/plugin-node-resolve@npm:16.0.2"
28352+
dependencies:
28353+
"@rollup/pluginutils": "npm:^5.0.1"
28354+
"@types/resolve": "npm:1.20.2"
28355+
deepmerge: "npm:^4.2.2"
28356+
is-module: "npm:^1.0.0"
28357+
resolve: "npm:^1.22.1"
28358+
peerDependencies:
28359+
rollup: ^2.78.0||^3.0.0||^4.0.0
28360+
peerDependenciesMeta:
28361+
rollup:
28362+
optional: true
28363+
checksum: 10c0/483b678a78decddb2597abcaf3b7e92c54c296a7362224ed6791bd7d46a7ee1cc0d652c96dadd0ea3b1f30d0f304b2bf7bb02b6748b6ba2067e7c157b8a8ca70
28364+
languageName: node
28365+
linkType: hard
28366+
28367+
"@rollup/plugin-typescript@npm:^12.1.4":
28368+
version: 12.1.4
28369+
resolution: "@rollup/plugin-typescript@npm:12.1.4"
28370+
dependencies:
28371+
"@rollup/pluginutils": "npm:^5.1.0"
28372+
resolve: "npm:^1.22.1"
28373+
peerDependencies:
28374+
rollup: ^2.14.0||^3.0.0||^4.0.0
28375+
tslib: "*"
28376+
typescript: ">=3.7.0"
28377+
peerDependenciesMeta:
28378+
rollup:
28379+
optional: true
28380+
tslib:
28381+
optional: true
28382+
checksum: 10c0/b5bf7f54794d0b33ae5441c5aa202a95beb7068c206f40102f94997e888756c06c2bfe00517eb74a58771078432f94e8a34e99f5c6dbf89a22b49431b83c4798
28383+
languageName: node
28384+
linkType: hard
28385+
28386+
"@rollup/pluginutils@npm:^5.0.1, @rollup/pluginutils@npm:^5.1.0":
28387+
version: 5.3.0
28388+
resolution: "@rollup/pluginutils@npm:5.3.0"
28389+
dependencies:
28390+
"@types/estree": "npm:^1.0.0"
28391+
estree-walker: "npm:^2.0.2"
28392+
picomatch: "npm:^4.0.2"
28393+
peerDependencies:
28394+
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
28395+
peerDependenciesMeta:
28396+
rollup:
28397+
optional: true
28398+
checksum: 10c0/001834bf62d7cf5bac424d2617c113f7f7d3b2bf3c1778cbcccb72cdc957b68989f8e7747c782c2b911f1dde8257f56f8ac1e779e29e74e638e3f1e2cac2bcd0
28399+
languageName: node
28400+
linkType: hard
28401+
2833528402
"@rollup/rollup-android-arm-eabi@npm:4.46.2":
2833628403
version: 4.46.2
2833728404
resolution: "@rollup/rollup-android-arm-eabi@npm:4.46.2"
@@ -29711,6 +29778,13 @@ __metadata:
2971129778
languageName: node
2971229779
linkType: hard
2971329780

29781+
"@types/resolve@npm:1.20.2":
29782+
version: 1.20.2
29783+
resolution: "@types/resolve@npm:1.20.2"
29784+
checksum: 10c0/c5b7e1770feb5ccfb6802f6ad82a7b0d50874c99331e0c9b259e415e55a38d7a86ad0901c57665d93f75938be2a6a0bc9aa06c9749192cadb2e4512800bbc6e6
29785+
languageName: node
29786+
linkType: hard
29787+
2971429788
"@types/semver@npm:^7.3.12":
2971529789
version: 7.5.8
2971629790
resolution: "@types/semver@npm:7.5.8"
@@ -30917,6 +30991,9 @@ __metadata:
3091730991
"@fastify/formbody": "npm:^7.4.0"
3091830992
"@microsoft/api-extractor": "npm:7.52.7"
3091930993
"@mixer/parallel-prettier": "npm:2.0.3"
30994+
"@rollup/plugin-json": "npm:^6.1.0"
30995+
"@rollup/plugin-node-resolve": "npm:^16.0.2"
30996+
"@rollup/plugin-typescript": "npm:^12.1.4"
3092030997
"@tsconfig/recommended": "npm:1.0.1"
3092130998
"@types/fs-extra": "npm:^8.0.1"
3092230999
"@types/jest": "npm:29.5.11"
@@ -33442,6 +33519,13 @@ __metadata:
3344233519
languageName: node
3344333520
linkType: hard
3344433521

33522+
"estree-walker@npm:^2.0.2":
33523+
version: 2.0.2
33524+
resolution: "estree-walker@npm:2.0.2"
33525+
checksum: 10c0/53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af
33526+
languageName: node
33527+
linkType: hard
33528+
3344533529
"estree-walker@npm:^3.0.3":
3344633530
version: 3.0.3
3344733531
resolution: "estree-walker@npm:3.0.3"
@@ -35190,6 +35274,13 @@ __metadata:
3519035274
languageName: node
3519135275
linkType: hard
3519235276

35277+
"is-module@npm:^1.0.0":
35278+
version: 1.0.0
35279+
resolution: "is-module@npm:1.0.0"
35280+
checksum: 10c0/795a3914bcae7c26a1c23a1e5574c42eac13429625045737bf3e324ce865c0601d61aee7a5afbca1bee8cb300c7d9647e7dc98860c9bdbc3b7fdc51d8ac0bffc
35281+
languageName: node
35282+
linkType: hard
35283+
3519335284
"is-negated-glob@npm:^1.0.0":
3519435285
version: 1.0.0
3519535286
resolution: "is-negated-glob@npm:1.0.0"
@@ -39523,7 +39614,7 @@ __metadata:
3952339614
languageName: node
3952439615
linkType: hard
3952539616

39526-
"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.20.0, resolve@npm:^1.9.0, resolve@npm:~1.22.1, resolve@npm:~1.22.2":
39617+
"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.9.0, resolve@npm:~1.22.1, resolve@npm:~1.22.2":
3952739618
version: 1.22.10
3952839619
resolution: "resolve@npm:1.22.10"
3952939620
dependencies:
@@ -39546,7 +39637,7 @@ __metadata:
3954639637
languageName: node
3954739638
linkType: hard
3954839639

39549-
"resolve@patch:resolve@npm%3A^1.1.6#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.9.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A~1.22.1#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A~1.22.2#optional!builtin<compat/resolve>":
39640+
"resolve@patch:resolve@npm%3A^1.1.6#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.9.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A~1.22.1#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A~1.22.2#optional!builtin<compat/resolve>":
3955039641
version: 1.22.10
3955139642
resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin<compat/resolve>::version=1.22.10&hash=c3c19d"
3955239643
dependencies:

0 commit comments

Comments
 (0)