From 0bced79c5b3db8ff88c4d7c1a062de0b5fe43bc3 Mon Sep 17 00:00:00 2001 From: Chase Coalwell <782571+srchase@users.noreply.github.com> Date: Wed, 16 Aug 2023 15:35:48 -0600 Subject: [PATCH] Remove generated packages from workspace (#877) --- package.json | 6 +-- scripts/build-generated-test-packages.js | 58 ++++++++++++++++++++++++ scripts/utils/spawn-process.js | 18 ++++++++ 3 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 scripts/build-generated-test-packages.js create mode 100644 scripts/utils/spawn-process.js diff --git a/package.json b/package.json index 040847397c6..723c8b70a4a 100644 --- a/package.json +++ b/package.json @@ -8,13 +8,13 @@ "clean": "turbo run clean --force --parallel", "build": "turbo run build", "test": "turbo run test", - "test:integration": "turbo run test:integration", + "test:integration": "yarn build-test-packages && turbo run test:integration", "lint": "turbo run lint", "format": "turbo run format --parallel", "stage-release": "turbo run stage-release", "extract:docs": "mkdir -p api-extractor-packages && turbo run extract:docs", "release": "yarn changeset publish", - "build-test-packages": "./gradlew clean build && yarn && yarn build --filter=weather --filter=weather-ssdk --force --concurrency=2" + "build-test-packages": "./gradlew clean build && node ./scripts/build-generated-test-packages" }, "repository": { "type": "git", @@ -65,8 +65,6 @@ "workspaces": [ "packages/*", "smithy-typescript-ssdk-libs/*", - "smithy-typescript-codegen-test/build/smithyprojections/smithy-typescript-codegen-test/source/typescript-codegen", - "smithy-typescript-codegen-test/build/smithyprojections/smithy-typescript-codegen-test/ssdk-test/typescript-ssdk-codegen", "private/*" ], "packageManager": "yarn@3.4.1" diff --git a/scripts/build-generated-test-packages.js b/scripts/build-generated-test-packages.js new file mode 100644 index 00000000000..3047d1d11c9 --- /dev/null +++ b/scripts/build-generated-test-packages.js @@ -0,0 +1,58 @@ +/** + * + * This script builds the generated weather and weather-ssdk test packages + * and copies them into node_modules for use by integration tests. + */ + +const path = require("node:path"); +const { spawnProcess } = require("./utils/spawn-process"); + +const root = path.join(__dirname, ".."); + +const codegenTestDir = path.join( + root, + "smithy-typescript-codegen-test", + "build", + "smithyprojections", + "smithy-typescript-codegen-test", +); + +const weatherClientDir = path.join( + codegenTestDir, + "source", + "typescript-codegen" +); + +const weatherSsdkDir = path.join( + codegenTestDir, + "ssdk-test", + "typescript-ssdk-codegen" +) + +const nodeModulesDir = path.join(root, "node_modules"); + +const buildAndCopyToNodeModules = async (packageName, codegenDir, nodeModulesDir) => { + // Yarn detects that the generated TypeScript package is nested beneath the + // top-level package.json. Adding an empty lock file allows it to be treated + // as its own package. + await spawnProcess("touch", ["yarn.lock"], { cwd: codegenDir }); + await spawnProcess("yarn", { cwd: codegenDir }); + await spawnProcess("yarn", ["build"], { cwd: codegenDir }); + // After building the package, its packed and copied to node_modules so that + // it can be used in integration tests by other packages within the monorepo. + await spawnProcess("yarn", ["pack"], { cwd: codegenDir }); + await spawnProcess("rm", ["-rf", packageName], { cwd: nodeModulesDir }); + await spawnProcess("mkdir", [packageName], { cwd: nodeModulesDir }); + const targetPackageDir = path.join(nodeModulesDir, packageName); + await spawnProcess("tar", ["-xf", "package.tgz", "-C", targetPackageDir, "--strip-components", "1"], { cwd: codegenDir }); +}; + +(async () => { + try { + await buildAndCopyToNodeModules("weather", weatherClientDir, nodeModulesDir); + await buildAndCopyToNodeModules("weather-ssdk", weatherSsdkDir, nodeModulesDir); + } catch (e) { + console.log(e); + process.exit(1); + } +})(); diff --git a/scripts/utils/spawn-process.js b/scripts/utils/spawn-process.js new file mode 100644 index 00000000000..3be8332fdd3 --- /dev/null +++ b/scripts/utils/spawn-process.js @@ -0,0 +1,18 @@ +// @ts-check +const { spawn } = require("child_process"); + +const spawnProcess = async (command, args = [], options = {}) => { + const childProcess = spawn(command, args, options); + + childProcess.stdout?.pipe(process.stdout); + childProcess.stderr?.pipe(process.stderr); + + return new Promise((resolve, reject) => { + childProcess.on("error", reject); + childProcess.on("exit", (code, signal) => + code === 0 ? resolve(0) : reject(`${command} failed with { code: ${code}, signal: ${signal} }`) + ); + }); +}; + +module.exports = { spawnProcess };