UNPKG

@storm-software/terraform-tools

Version:

Tools for managing Terraform infrastructure within a Nx workspace.

1,528 lines (1,482 loc) 90.1 kB
import { applyWorkspaceBaseTokens, applyWorkspaceTokens, findWorkspaceRoot, formatLogMessage, getConfig, getStopwatch, getWorkspaceConfig, joinPaths, schemaRegistry, withRunExecutor, workspaceConfigSchema, writeDebug, writeError, writeFatal, writeInfo, writeSuccess, writeTrace, writeWarning } from "./chunk-WYONVDTO.mjs"; import { __dirname, __require } from "./chunk-URGPIQOV.mjs"; // src/generators/init/init.ts import { formatFiles as formatFiles9 } from "@nx/devkit"; // ../workspace-tools/src/utils/cargo.ts import { joinPathFragments, workspaceRoot } from "@nx/devkit"; import { execSync, spawn } from "node:child_process"; import { relative } from "node:path"; var INVALID_CARGO_ARGS = [ "allFeatures", "allTargets", "main", "outputPath", "package", "tsConfig" ]; var buildCargoCommand = (baseCommand, options, context) => { const args = []; if (options.toolchain && options.toolchain !== "stable") { args.push(`+${options.toolchain}`); } args.push(baseCommand); for (const [key, value] of Object.entries(options)) { if (key === "toolchain" || key === "release" || INVALID_CARGO_ARGS.includes(key)) { continue; } if (typeof value === "boolean") { if (value) { args.push(`--${key}`); } } else if (Array.isArray(value)) { for (const item of value) { args.push(`--${key}`, item); } } else { args.push(`--${key}`, String(value)); } } if (context.projectName) { args.push("-p", context.projectName); } if (options.allFeatures && !args.includes("--all-features")) { args.push("--all-features"); } if (options.allTargets && !args.includes("--all-targets")) { args.push("--all-targets"); } if (options.release && !args.includes("--profile")) { args.push("--release"); } if (options.outputPath && !args.includes("--target-dir")) { args.push("--target-dir", options.outputPath); } return args; }; async function cargoCommand(...args) { console.log(`> cargo ${args.join(" ")}`); args.push("--color", "always"); return await Promise.resolve(runProcess("cargo", ...args)); } function cargoCommandSync(args = "", options) { const normalizedOptions = { stdio: options?.stdio ?? "inherit", env: { ...process.env, ...options?.env } }; try { return { output: execSync(`cargo ${args}`, { encoding: "utf8", windowsHide: true, stdio: normalizedOptions.stdio, env: normalizedOptions.env, maxBuffer: 1024 * 1024 * 10 }), success: true }; } catch (e) { return { output: e, success: false }; } } function cargoMetadata() { const output3 = cargoCommandSync("metadata --format-version=1", { stdio: "pipe" }); if (!output3.success) { console.error("Failed to get cargo metadata"); return null; } return JSON.parse(output3.output); } function runProcess(processCmd, ...args) { const metadata = cargoMetadata(); const targetDir = metadata?.target_directory ?? joinPathFragments(workspaceRoot, "dist"); return new Promise((resolve2) => { if (process.env.VERCEL) { return resolve2({ success: true }); } execSync(`${processCmd} ${args.join(" ")}`, { cwd: process.cwd(), env: { ...process.env, RUSTC_WRAPPER: "", CARGO_TARGET_DIR: targetDir, CARGO_BUILD_TARGET_DIR: targetDir }, windowsHide: true, stdio: ["inherit", "inherit", "inherit"] }); resolve2({ success: true }); }); } // ../workspace-tools/src/executors/cargo-build/executor.ts async function cargoBuildExecutor(options, context) { const command = buildCargoCommand("build", options, context); return await cargoCommand(...command); } var executor_default = withRunExecutor( "Cargo - Build", cargoBuildExecutor, { skipReadingConfig: false, hooks: { applyDefaultOptions: (options) => { options.outputPath ??= "dist/{projectRoot}/target"; options.toolchain ??= "stable"; return options; } } } ); // ../workspace-tools/src/executors/cargo-check/executor.ts async function cargoCheckExecutor(options, context) { const command = buildCargoCommand("check", options, context); return await cargoCommand(...command); } var executor_default2 = withRunExecutor( "Cargo - Check", cargoCheckExecutor, { skipReadingConfig: false, hooks: { applyDefaultOptions: (options) => { options.toolchain ??= "stable"; return options; } } } ); // ../workspace-tools/src/executors/cargo-clippy/executor.ts async function cargoClippyExecutor(options, context) { const command = buildCargoCommand("clippy", options, context); return await cargoCommand(...command); } var executor_default3 = withRunExecutor( "Cargo - Clippy", cargoClippyExecutor, { skipReadingConfig: false, hooks: { applyDefaultOptions: (options) => { options.toolchain ??= "stable"; options.fix ??= false; return options; } } } ); // ../workspace-tools/src/executors/cargo-doc/executor.ts async function cargoDocExecutor(options, context) { const opts = { ...options }; opts["no-deps"] = opts.noDeps; delete opts.noDeps; const command = buildCargoCommand("doc", options, context); return await cargoCommand(...command); } var executor_default4 = withRunExecutor( "Cargo - Doc", cargoDocExecutor, { skipReadingConfig: false, hooks: { applyDefaultOptions: (options) => { options.outputPath ??= "dist/{projectRoot}/docs"; options.toolchain ??= "stable"; options.release ??= options.profile ? false : true; options.allFeatures ??= true; options.lib ??= true; options.bins ??= true; options.examples ??= true; options.noDeps ??= false; return options; } } } ); // ../workspace-tools/src/executors/cargo-format/executor.ts async function cargoFormatExecutor(options, context) { const command = buildCargoCommand("fmt", options, context); return await cargoCommand(...command); } var executor_default5 = withRunExecutor( "Cargo - Format", cargoFormatExecutor, { skipReadingConfig: false, hooks: { applyDefaultOptions: (options) => { options.outputPath ??= "dist/{projectRoot}/target"; options.toolchain ??= "stable"; return options; } } } ); // ../workspace-tools/src/executors/cargo-publish/executor.ts import { joinPathFragments as joinPathFragments2 } from "@nx/devkit"; import { execSync as execSync2 } from "node:child_process"; import { readFileSync } from "node:fs"; import https from "node:https"; var LARGE_BUFFER = 1024 * 1e6; // ../esbuild/src/build.ts import * as esbuild from "esbuild"; import { globbySync } from "globby"; // ../build-tools/src/config.ts var DEFAULT_COMPILED_BANNER = `/***************************************** * * \u26A1 Built by Storm Software * *****************************************/ `; var DEFAULT_ENVIRONMENT = "production"; var DEFAULT_ORGANIZATION = "storm-software"; // ../build-tools/src/plugins/swc.ts import { transform } from "@swc/core"; // ../build-tools/src/plugins/ts-resolve.ts import fs from "node:fs"; import { builtinModules } from "node:module"; import path from "node:path"; import _resolve from "resolve"; // ../build-tools/src/plugins/type-definitions.ts import { stripIndents } from "@nx/devkit"; import { relative as relative2 } from "path"; // ../build-tools/src/utilities/copy-assets.ts import { CopyAssetsHandler } from "@nx/js/src/utils/assets/copy-assets-handler"; import { glob } from "glob"; import { readFile, writeFile } from "node:fs/promises"; var copyAssets = async (config, assets, outputPath, projectRoot, sourceRoot, generatePackageJson2 = true, includeSrc = false, banner, footer) => { const pendingAssets = Array.from(assets ?? []); pendingAssets.push({ input: projectRoot, glob: "*.md", output: "." }); pendingAssets.push({ input: ".", glob: "LICENSE", output: "." }); if (generatePackageJson2 === false) { pendingAssets.push({ input: projectRoot, glob: "package.json", output: "." }); } if (includeSrc === true) { pendingAssets.push({ input: sourceRoot, glob: "**/{*.ts,*.tsx,*.js,*.jsx}", output: "src/" }); } writeTrace( `\u{1F4DD} Copying the following assets to the output directory: ${pendingAssets.map((pendingAsset) => typeof pendingAsset === "string" ? ` - ${pendingAsset} -> ${outputPath}` : ` - ${pendingAsset.input}/${pendingAsset.glob} -> ${joinPaths(outputPath, pendingAsset.output)}`).join("\n")}`, config ); const assetHandler = new CopyAssetsHandler({ projectDir: projectRoot, rootDir: config.workspaceRoot, outputDir: outputPath, assets: pendingAssets }); await assetHandler.processAllAssetsOnce(); writeTrace("Completed copying assets to the output directory", config); if (includeSrc === true) { writeDebug( `\u{1F4DD} Adding banner and writing source files: ${joinPaths( outputPath, "src" )}`, config ); const files = await glob([ joinPaths(config.workspaceRoot, outputPath, "src/**/*.ts"), joinPaths(config.workspaceRoot, outputPath, "src/**/*.tsx"), joinPaths(config.workspaceRoot, outputPath, "src/**/*.js"), joinPaths(config.workspaceRoot, outputPath, "src/**/*.jsx") ]); await Promise.allSettled( files.map( async (file) => writeFile( file, `${banner && typeof banner === "string" ? banner.startsWith("//") ? banner : `// ${banner}` : ""} ${await readFile(file, "utf8")} ${footer && typeof footer === "string" ? footer.startsWith("//") ? footer : `// ${footer}` : ""}` ) ) ); } }; // ../build-tools/src/utilities/generate-package-json.ts import { calculateProjectBuildableDependencies } from "@nx/js/src/utils/buildable-libs-utils"; import { Glob } from "glob"; import { existsSync, readFileSync as readFileSync2 } from "node:fs"; import { readFile as readFile2 } from "node:fs/promises"; import { createProjectGraphAsync, readCachedProjectGraph, readProjectsConfigurationFromProjectGraph } from "nx/src/project-graph/project-graph"; var addPackageDependencies = async (workspaceRoot3, projectRoot, projectName, packageJson) => { let projectGraph; try { projectGraph = readCachedProjectGraph(); } catch { await createProjectGraphAsync(); projectGraph = readCachedProjectGraph(); } if (!projectGraph) { throw new Error( "The Build process failed because the project graph is not available. Please run the build command again." ); } const projectDependencies = calculateProjectBuildableDependencies( void 0, projectGraph, workspaceRoot3, projectName, process.env.NX_TASK_TARGET_TARGET || "build", process.env.NX_TASK_TARGET_CONFIGURATION || "production", true ); const localPackages = []; for (const project of projectDependencies.dependencies.filter( (dep) => dep.node.type === "lib" && dep.node.data?.root !== projectRoot && dep.node.data?.root !== workspaceRoot3 )) { const projectNode = project.node; if (projectNode.data.root) { const projectPackageJsonPath = joinPaths( workspaceRoot3, projectNode.data.root, "package.json" ); if (existsSync(projectPackageJsonPath)) { const projectPackageJsonContent = await readFile2( projectPackageJsonPath, "utf8" ); const projectPackageJson = JSON.parse(projectPackageJsonContent); if (projectPackageJson.private !== true) { localPackages.push(projectPackageJson); } } } } if (localPackages.length > 0) { writeTrace( `\u{1F4E6} Adding local packages to package.json: ${localPackages.map((p) => p.name).join(", ")}` ); const projectJsonFile = await readFile2( joinPaths(projectRoot, "project.json"), "utf8" ); const projectJson = JSON.parse(projectJsonFile); const projectName2 = projectJson.name; const projectConfigurations = readProjectsConfigurationFromProjectGraph(projectGraph); if (!projectConfigurations?.projects?.[projectName2]) { throw new Error( "The Build process failed because the project does not have a valid configuration in the project.json file. Check if the file exists in the root of the project." ); } const implicitDependencies = projectConfigurations.projects?.[projectName2].implicitDependencies?.reduce((ret, dep) => { if (projectConfigurations.projects?.[dep]) { const depPackageJsonPath = joinPaths( workspaceRoot3, projectConfigurations.projects[dep].root, "package.json" ); if (existsSync(depPackageJsonPath)) { const depPackageJsonContent = readFileSync2( depPackageJsonPath, "utf8" ); const depPackageJson = JSON.parse(depPackageJsonContent); if (depPackageJson.private !== true && !ret.includes(depPackageJson.name)) { ret.push(depPackageJson.name); } } } return ret; }, []); packageJson.dependencies = localPackages.reduce((ret, localPackage) => { if (!ret[localPackage.name] && !implicitDependencies?.includes(localPackage.name) && packageJson.devDependencies?.[localPackage.name] === void 0) { ret[localPackage.name] = `^${localPackage.version || "0.0.1"}`; } return ret; }, packageJson.dependencies ?? {}); packageJson.devDependencies = localPackages.reduce((ret, localPackage) => { if (!ret[localPackage.name] && implicitDependencies?.includes(localPackage.name) && packageJson.dependencies?.[localPackage.name] === void 0) { ret[localPackage.name] = `^${localPackage.version || "0.0.1"}`; } return ret; }, packageJson.devDependencies ?? {}); } else { writeTrace("\u{1F4E6} No local packages dependencies to add to package.json"); } return packageJson; }; var addWorkspacePackageJsonFields = async (workspaceConfig, projectRoot, sourceRoot, projectName, includeSrc = false, packageJson) => { const workspaceRoot3 = workspaceConfig.workspaceRoot ? workspaceConfig.workspaceRoot : findWorkspaceRoot(); const workspacePackageJsonContent = await readFile2( joinPaths(workspaceRoot3, "package.json"), "utf8" ); const workspacePackageJson = JSON.parse(workspacePackageJsonContent); packageJson.type ??= "module"; packageJson.sideEffects ??= false; if (includeSrc === true) { let distSrc = sourceRoot.replace(projectRoot, ""); if (distSrc.startsWith("/")) { distSrc = distSrc.substring(1); } packageJson.source ??= `${joinPaths(distSrc, "index.ts").replaceAll("\\", "/")}`; } packageJson.files ??= ["dist/**/*"]; if (includeSrc === true && !packageJson.files.includes("src")) { packageJson.files.push("src/**/*"); } packageJson.publishConfig ??= { access: "public" }; packageJson.description ??= workspacePackageJson.description; packageJson.homepage ??= workspacePackageJson.homepage; packageJson.bugs ??= workspacePackageJson.bugs; packageJson.license ??= workspacePackageJson.license; packageJson.keywords ??= workspacePackageJson.keywords; packageJson.funding ??= workspacePackageJson.funding; packageJson.author ??= workspacePackageJson.author; packageJson.maintainers ??= workspacePackageJson.maintainers; if (!packageJson.maintainers && packageJson.author) { packageJson.maintainers = [packageJson.author]; } packageJson.contributors ??= workspacePackageJson.contributors; if (!packageJson.contributors && packageJson.author) { packageJson.contributors = [packageJson.author]; } packageJson.repository ??= workspacePackageJson.repository; packageJson.repository.directory ??= projectRoot ? projectRoot : joinPaths("packages", projectName); return packageJson; }; // ../build-tools/src/utilities/get-entry-points.ts import { glob as glob2 } from "glob"; // ../build-tools/src/utilities/get-env.ts var getEnv = (builder, options) => { return { STORM_BUILD: builder, STORM_ORG: options.orgName || DEFAULT_ORGANIZATION, STORM_NAME: options.name, STORM_MODE: options.mode || DEFAULT_ENVIRONMENT, STORM_PLATFORM: options.platform, STORM_FORMAT: JSON.stringify(options.format), STORM_TARGET: JSON.stringify(options.target), ...options.env }; }; // ../build-tools/src/utilities/read-nx-config.ts import { existsSync as existsSync2 } from "node:fs"; import { readFile as readFile3 } from "node:fs/promises"; // ../build-tools/src/utilities/task-graph.ts import { createTaskGraph, mapTargetDefaultsToDependencies } from "nx/src/tasks-runner/create-task-graph"; // ../esbuild/src/assets.ts async function copyBuildAssets(context) { if (!context.result?.errors.length && context.options.assets?.length) { writeDebug( ` \u{1F4CB} Copying ${context.options.assets.length} asset files to output directory: ${context.outputPath}`, context.workspaceConfig ); const stopwatch = getStopwatch(`${context.options.name} asset copy`); await copyAssets( context.workspaceConfig, context.options.assets ?? [], context.outputPath, context.options.projectRoot, context.sourceRoot, true, false ); stopwatch(); } return context; } // ../esbuild/src/clean.ts import { rm } from "node:fs/promises"; async function cleanDirectories(directory) { await rm(directory, { recursive: true, force: true }); } // ../esbuild/src/context.ts import { createProjectGraphAsync as createProjectGraphAsync2, readProjectsConfigurationFromProjectGraph as readProjectsConfigurationFromProjectGraph2 } from "@nx/devkit"; import defu from "defu"; import { existsSync as existsSync3 } from "node:fs"; import hf from "node:fs/promises"; import { findWorkspaceRoot as findWorkspaceRoot2 } from "nx/src/utils/find-workspace-root"; // ../esbuild/src/config.ts var DEFAULT_BUILD_OPTIONS = { platform: "node", target: "node22", format: "esm", mode: "production", generatePackageJson: true, includeSrc: false, keepNames: true, metafile: false, treeshake: true, splitting: true, shims: false, watch: false, bundle: true, distDir: "dist", loader: { ".aac": "file", ".css": "file", ".eot": "file", ".flac": "file", ".gif": "file", ".jpeg": "file", ".jpg": "file", ".mp3": "file", ".mp4": "file", ".ogg": "file", ".otf": "file", ".png": "file", ".svg": "file", ".ttf": "file", ".wav": "file", ".webm": "file", ".webp": "file", ".woff": "file", ".woff2": "file" }, banner: { js: DEFAULT_COMPILED_BANNER, css: DEFAULT_COMPILED_BANNER } }; // ../esbuild/src/context.ts async function resolveContext(userOptions) { const projectRoot = userOptions.projectRoot; const workspaceRoot3 = findWorkspaceRoot2(projectRoot); if (!workspaceRoot3) { throw new Error("Cannot find Nx workspace root"); } const workspaceConfig = await getWorkspaceConfig(true, { workspaceRoot: workspaceRoot3.dir }); writeDebug(" \u2699\uFE0F Resolving build options", workspaceConfig); const stopwatch = getStopwatch("Build options resolution"); const projectGraph = await createProjectGraphAsync2({ exitOnError: true }); const projectJsonPath = joinPaths( workspaceRoot3.dir, projectRoot, "project.json" ); if (!existsSync3(projectJsonPath)) { throw new Error("Cannot find project.json configuration"); } const projectJsonFile = await hf.readFile(projectJsonPath, "utf8"); const projectJson = JSON.parse(projectJsonFile); const projectName = projectJson.name || userOptions.name; const projectConfigurations = readProjectsConfigurationFromProjectGraph2(projectGraph); if (!projectConfigurations?.projects?.[projectName]) { throw new Error( "The Build process failed because the project does not have a valid configuration in the project.json file. Check if the file exists in the root of the project." ); } const options = defu(userOptions, DEFAULT_BUILD_OPTIONS); options.name ??= projectName; const packageJsonPath = joinPaths( workspaceRoot3.dir, options.projectRoot, "package.json" ); if (!existsSync3(packageJsonPath)) { throw new Error("Cannot find package.json configuration"); } const env = getEnv("esbuild", options); const define = defu(options.define ?? {}, env ?? {}); const resolvedOptions = { ...options, tsconfig: userOptions.tsconfig === null ? void 0 : userOptions.tsconfig ? userOptions.tsconfig : joinPaths(workspaceRoot3.dir, projectRoot, "tsconfig.json"), metafile: userOptions.mode === "development", clean: false, env, define: { STORM_FORMAT: JSON.stringify(options.format), ...Object.keys(define).filter((key) => define[key] !== void 0).reduce((res, key) => { const value = JSON.stringify(define[key]); const safeKey = key.replaceAll("(", "").replaceAll(")", ""); return { ...res, [`process.env.${safeKey}`]: value, [`import.meta.env.${safeKey}`]: value }; }, {}) } }; stopwatch(); const context = { options: resolvedOptions, clean: userOptions.clean !== false, workspaceConfig, projectConfigurations, projectName, projectGraph, sourceRoot: resolvedOptions.sourceRoot || projectJson.sourceRoot || joinPaths(resolvedOptions.projectRoot, "src"), outputPath: resolvedOptions.outputPath || joinPaths( workspaceConfig.workspaceRoot, "dist", resolvedOptions.projectRoot ), minify: resolvedOptions.minify || resolvedOptions.mode === "production" }; context.options.esbuildPlugins = [...context.options.esbuildPlugins ?? []]; if (context.options.verbose) { writeDebug( ` \u2699\uFE0F Build options resolved: ${formatLogMessage(context.options)}`, workspaceConfig ); } return context; } // ../esbuild/src/package-json.ts import { writeJsonFile } from "@nx/devkit"; import { existsSync as existsSync4 } from "node:fs"; import hf2 from "node:fs/promises"; async function generatePackageJson(context) { if (context.options.generatePackageJson !== false && existsSync4(joinPaths(context.options.projectRoot, "package.json"))) { writeDebug(" \u270D\uFE0F Writing package.json file", context.workspaceConfig); const stopwatch = getStopwatch("Write package.json file"); const packageJsonPath = joinPaths( context.options.projectRoot, "project.json" ); if (!existsSync4(packageJsonPath)) { throw new Error("Cannot find package.json configuration"); } const packageJsonFile = await hf2.readFile( joinPaths( context.workspaceConfig.workspaceRoot, context.options.projectRoot, "package.json" ), "utf8" ); let packageJson = JSON.parse(packageJsonFile); if (!packageJson) { throw new Error("Cannot find package.json configuration file"); } packageJson = await addPackageDependencies( context.workspaceConfig.workspaceRoot, context.options.projectRoot, context.projectName, packageJson ); packageJson = await addWorkspacePackageJsonFields( context.workspaceConfig, context.options.projectRoot, context.sourceRoot, context.projectName, false, packageJson ); if (context.options.entry) { packageJson.exports ??= {}; packageJson.exports["./package.json"] ??= "./package.json"; const entryPoints = Array.isArray(context.options.entry) ? context.options.entry : Object.keys(context.options.entry); if (entryPoints.length > 0) { const defaultEntry = entryPoints.includes("index") ? `.${context.options.distDir ? `/${context.options.distDir}` : ""}/index` : `.${context.options.distDir ? `/${context.options.distDir}` : ""}/${entryPoints[0]}`; const isEsm = Array.isArray(context.options.format) ? context.options.format.includes("esm") : context.options.format === "esm"; const isCjs = Array.isArray(context.options.format) ? context.options.format.includes("cjs") : context.options.format === "cjs"; const isDts = context.options.dts || context.options.experimentalDts; packageJson.exports["."] ??= `${defaultEntry}.${isEsm ? "mjs" : isCjs ? "cjs" : "js"}`; for (const entryPoint of entryPoints) { packageJson.exports[`./${entryPoint}`] ??= {}; if (isEsm) { if (isDts) { packageJson.exports[`./${entryPoint}`].import = { types: `./dist/${entryPoint}.d.mts`, default: `./dist/${entryPoint}.mjs` }; } else { packageJson.exports[`./${entryPoint}`].import = `./dist/${entryPoint}.mjs`; } if (isDts) { packageJson.exports[`./${entryPoint}`].default = { types: `./dist/${entryPoint}.d.mts`, default: `./dist/${entryPoint}.mjs` }; } else { packageJson.exports[`./${entryPoint}`].default = `./dist/${entryPoint}.mjs`; } } if (isCjs) { if (isDts) { packageJson.exports[`./${entryPoint}`].require = { types: `./dist/${entryPoint}.d.cts`, default: `./dist/${entryPoint}.cjs` }; } else { packageJson.exports[`./${entryPoint}`].require = `./dist/${entryPoint}.cjs`; } if (!isEsm) { if (isDts) { packageJson.exports[`./${entryPoint}`].default = { types: `./dist/${entryPoint}.d.cts`, default: `./dist/${entryPoint}.cjs` }; } else { packageJson.exports[`./${entryPoint}`].default = `./dist/${entryPoint}.cjs`; } } } if (!isEsm && !isCjs) { if (isDts) { packageJson.exports[`./${entryPoint}`].default = { types: `./dist/${entryPoint}.d.ts`, default: `./dist/${entryPoint}.js` }; } else { packageJson.exports[`./${entryPoint}`].default = `./dist/${entryPoint}.js`; } } } if (isEsm) { packageJson.module = `${defaultEntry}.mjs`; } else { packageJson.main = `${defaultEntry}.cjs`; } if (isDts) { packageJson.types = `${defaultEntry}.d.${isEsm ? "mts" : isCjs ? "cts" : "ts"}`; } packageJson.exports = Object.keys(packageJson.exports).reduce( (ret, key) => { if (key.endsWith("/index") && !ret[key.replace("/index", "")]) { ret[key.replace("/index", "")] = packageJson.exports[key]; } return ret; }, packageJson.exports ); } } await writeJsonFile( joinPaths(context.outputPath, "package.json"), packageJson ); stopwatch(); } return context; } // ../esbuild/src/plugins/deps-check.ts import { builtinModules as builtinModules2 } from "node:module"; import path2 from "node:path"; var unusedIgnore = [ // these are our dev dependencies /@types\/.*?/, /@typescript-eslint.*?/, /eslint.*?/, "esbuild", "husky", "is-ci", "lint-staged", "prettier", "typescript", "ts-node", "ts-jest", "@swc/core", "@swc/jest", "jest", // these are missing 3rd party deps "spdx-exceptions", "spdx-license-ids", // type-only, so it is not detected "ts-toolbelt", // these are indirectly used by build "buffer" ]; var missingIgnore = [".prisma", "@prisma/client", "ts-toolbelt"]; var depsCheckPlugin = (bundle) => ({ name: "storm:deps-check", setup(build3) { const pkgJsonPath = path2.join(process.cwd(), "package.json"); const pkgContents = __require(pkgJsonPath); const regDependencies = Object.keys(pkgContents["dependencies"] ?? {}); const devDependencies = Object.keys(pkgContents["devDependencies"] ?? {}); const peerDependencies = Object.keys(pkgContents["peerDependencies"] ?? {}); const dependencies = [ ...regDependencies, ...bundle ? devDependencies : [] ]; const collectedDependencies = /* @__PURE__ */ new Set(); const onlyPackages = /^[^./](?!:)|^\.[^./]|^\.\.[^/]/; build3.onResolve({ filter: onlyPackages }, (args) => { if (args.importer.includes(process.cwd())) { if (args.path[0] === "@") { const [org, pkg] = args.path.split("/"); collectedDependencies.add(`${org}/${pkg}`); } else { const [pkg] = args.path.split("/"); collectedDependencies.add(pkg); } } return { external: true }; }); build3.onEnd(() => { const unusedDependencies = [...dependencies].filter((dep) => { return !collectedDependencies.has(dep) || builtinModules2.includes(dep); }); const missingDependencies = [...collectedDependencies].filter((dep) => { return !dependencies.includes(dep) && !builtinModules2.includes(dep); }); const filteredUnusedDeps = unusedDependencies.filter((dep) => { return !unusedIgnore.some((pattern) => dep.match(pattern)); }); const filteredMissingDeps = missingDependencies.filter((dep) => { return !missingIgnore.some((pattern) => dep.match(pattern)) && !peerDependencies.includes(dep); }); writeWarning( `Unused Dependencies: ${JSON.stringify(filteredUnusedDeps)}` ); writeError( `Missing Dependencies: ${JSON.stringify(filteredMissingDeps)}` ); if (filteredMissingDeps.length > 0) { throw new Error(`Missing dependencies detected - please install them: ${JSON.stringify(filteredMissingDeps)} `); } }); } }); // ../esbuild/src/tsup.ts import { build as tsup } from "tsup"; async function executeTsup(context) { writeDebug( ` \u{1F680} Running ${context.options.name} build`, context.workspaceConfig ); const stopwatch = getStopwatch(`${context.options.name} build`); await tsup({ ...context.options, outDir: context.options.distDir ? joinPaths(context.outputPath, context.options.distDir) : context.outputPath, workspaceConfig: context.workspaceConfig }); stopwatch(); return context; } // ../esbuild/src/build.ts async function reportResults(context) { if (context.result?.errors.length === 0) { if (context.result.warnings.length > 0) { writeWarning( ` \u{1F6A7} The following warnings occurred during the build: ${context.result.warnings.map((warning) => warning.text).join("\n")}`, context.workspaceConfig ); } writeSuccess( ` \u{1F4E6} The ${context.options.name} build completed successfully`, context.workspaceConfig ); } else if (context.result?.errors && context.result?.errors.length > 0) { writeError( ` \u274C The ${context.options.name} build failed with the following errors: ${context.result.errors.map((error) => error.text).join("\n")}`, context.workspaceConfig ); throw new Error( `The ${context.options.name} build failed with the following errors: ${context.result.errors.map((error) => error.text).join("\n")}` ); } } async function dependencyCheck(options) { if (process.env.DEV === "true") { return void 0; } if (process.env.CI && !process.env.BUILDKITE) { return void 0; } const buildPromise = esbuild.build({ entryPoints: globbySync("**/*.{j,t}s", { // We don't check dependencies in ecosystem tests because tests are isolated from the build. ignore: ["./src/__tests__/**/*", "./tests/e2e/**/*", "./dist/**/*"], gitignore: true }), logLevel: "silent", // there will be errors bundle: true, // we bundle to get everything write: false, // no need to write for analysis outdir: "out", plugins: [depsCheckPlugin(options.bundle)] }); await buildPromise.catch(() => { }); return void 0; } async function cleanOutputPath(context) { if (context.clean !== false && context.outputPath) { writeDebug( ` \u{1F9F9} Cleaning ${context.options.name} output path: ${context.outputPath}`, context.workspaceConfig ); const stopwatch = getStopwatch(`${context.options.name} output clean`); await cleanDirectories(context.outputPath); stopwatch(); } return context; } async function build2(options) { writeDebug(` \u26A1 Executing Storm ESBuild pipeline`); const stopwatch = getStopwatch("ESBuild pipeline"); try { const opts = Array.isArray(options) ? options : [options]; if (opts.length === 0) { throw new Error("No build options were provided"); } const context = await resolveContext(options); await cleanOutputPath(context); await Promise.all([ dependencyCheck(context.options), generatePackageJson(context), copyBuildAssets(context), executeTsup(context) ]); await reportResults(context); writeSuccess(" \u{1F3C1} ESBuild pipeline build completed successfully"); } catch (error) { writeFatal( "Fatal errors that the build process could not recover from have occured. The build process has been terminated." ); throw error; } finally { stopwatch(); } } // ../workspace-tools/src/executors/esbuild/executor.ts async function esbuildExecutorFn(options, context, config) { writeInfo("\u{1F4E6} Running Storm ESBuild executor on the workspace", config); if (!context.projectsConfigurations?.projects || !context.projectName || !context.projectsConfigurations.projects[context.projectName] || !context.projectsConfigurations.projects[context.projectName]?.root) { throw new Error( "The Build process failed because the context is not valid. Please run this command from a workspace." ); } await build2({ ...options, projectRoot: context.projectsConfigurations.projects?.[context.projectName].root, name: context.projectName, sourceRoot: context.projectsConfigurations.projects?.[context.projectName]?.sourceRoot, format: options.format, platform: options.format }); return { success: true }; } var executor_default6 = withRunExecutor( "Storm ESBuild build", esbuildExecutorFn, { skipReadingConfig: false, hooks: { applyDefaultOptions: async (options, config) => { options.entry ??= ["src/index.ts"]; options.outputPath ??= "dist/{projectRoot}"; options.tsconfig ??= "{projectRoot}/tsconfig.json"; return options; } } } ); // ../workspace-tools/src/executors/npm-publish/executor.ts import { execSync as execSync3 } from "node:child_process"; import { readFile as readFile6, writeFile as writeFile4 } from "node:fs/promises"; import { format as format3 } from "prettier"; // ../workspace-tools/src/utils/package-helpers.ts import { joinPathFragments as joinPathFragments3, readJsonFile } from "@nx/devkit"; import { execFileSync } from "child_process"; import { existsSync as existsSync5 } from "node:fs"; import { readFile as readFile4, writeFile as writeFile2 } from "node:fs/promises"; import { dirname, resolve } from "path"; import { format } from "prettier"; // ../workspace-tools/src/utils/project-tags.ts var ProjectTagConstants = { Language: { TAG_ID: "language", TYPESCRIPT: "typescript", RUST: "rust" }, ProjectType: { TAG_ID: "type", LIBRARY: "library", APPLICATION: "application" }, DistStyle: { TAG_ID: "dist-style", NORMAL: "normal", CLEAN: "clean" }, Provider: { TAG_ID: "provider" }, Platform: { TAG_ID: "platform", NODE: "node", BROWSER: "browser", NEUTRAL: "neutral", WORKER: "worker" }, Registry: { TAG_ID: "registry", CARGO: "cargo", NPM: "npm", CONTAINER: "container", CYCLONE: "cyclone" }, Plugin: { TAG_ID: "plugin" } }; var formatProjectTag = (variant, value) => { return `${variant}:${value}`; }; var hasProjectTag = (project, variant) => { project.tags = project.tags ?? []; const prefix = formatProjectTag(variant, ""); return project.tags.some( (tag) => tag.startsWith(prefix) && tag.length > prefix.length ); }; var addProjectTag = (project, variant, value, options = { overwrite: false }) => { project.tags = project.tags ?? []; if (options.overwrite || !hasProjectTag(project, variant)) { project.tags = project.tags.filter( (tag) => !tag.startsWith(formatProjectTag(variant, "")) ); project.tags.push(formatProjectTag(variant, value)); } }; // ../workspace-tools/src/utils/pnpm-deps-update.ts import { createProjectGraphAsync as createProjectGraphAsync3, readCachedProjectGraph as readCachedProjectGraph2 } from "@nx/devkit"; import { existsSync as existsSync6 } from "node:fs"; import { readFile as readFile5, writeFile as writeFile3 } from "node:fs/promises"; import { format as format2 } from "prettier"; import readYamlFile from "read-yaml-file"; // ../workspace-tools/src/executors/npm-publish/executor.ts var LARGE_BUFFER2 = 1024 * 1e6; // ../workspace-tools/src/executors/size-limit/executor.ts import { joinPathFragments as joinPathFragments4 } from "@nx/devkit"; import esBuildPlugin from "@size-limit/esbuild"; import esBuildWhyPlugin from "@size-limit/esbuild-why"; import filePlugin from "@size-limit/file"; import sizeLimit from "size-limit"; async function sizeLimitExecutorFn(options, context, config) { if (!context?.projectName || !context.projectsConfigurations?.projects || !context.projectsConfigurations.projects[context.projectName]) { throw new Error( "The Size-Limit process failed because the context is not valid. Please run this command from a workspace." ); } writeInfo(`\u{1F4CF} Running Size-Limit on ${context.projectName}`, config); sizeLimit([filePlugin, esBuildPlugin, esBuildWhyPlugin], { checks: options.entry ?? context.projectsConfigurations.projects[context.projectName]?.sourceRoot ?? joinPathFragments4( context.projectsConfigurations.projects[context.projectName]?.root ?? "./", "src" ) }).then((result) => { writeInfo( `\u{1F4CF} ${context.projectName} Size-Limit result: ${JSON.stringify(result)}`, config ); }); return { success: true }; } var executor_default7 = withRunExecutor( "Size-Limit Performance Test Executor", sizeLimitExecutorFn, { skipReadingConfig: false, hooks: { applyDefaultOptions: (options) => { return options; } } } ); // ../workspace-tools/src/executors/typia/executor.ts import { removeSync } from "fs-extra"; import { TypiaProgrammer } from "typia/lib/programmers/TypiaProgrammer.js"; async function typiaExecutorFn(options, _, config) { if (options.clean !== false) { writeInfo(`\u{1F9F9} Cleaning output path: ${options.outputPath}`, config); removeSync(options.outputPath); } await Promise.all( options.entry.map((entry) => { writeInfo(`\u{1F680} Running Typia on entry: ${entry}`, config); return TypiaProgrammer.build({ input: entry, output: options.outputPath, project: options.tsconfig }); }) ); return { success: true }; } var executor_default8 = withRunExecutor( "Typia runtime validation generator", typiaExecutorFn, { skipReadingConfig: false, hooks: { applyDefaultOptions: (options) => { options.entry ??= ["{sourceRoot}/index.ts"]; options.outputPath ??= "{sourceRoot}/__generated__/typia"; options.tsconfig ??= "{projectRoot}/tsconfig.json"; options.clean ??= true; return options; } } } ); // ../workspace-tools/src/executors/unbuild/executor.ts import { defu as defu2 } from "defu"; import { createJiti } from "jiti"; async function unbuildExecutorFn(options, context, config) { writeInfo("\u{1F4E6} Running Storm Unbuild executor on the workspace", config); if (!context.projectsConfigurations?.projects || !context.projectName || !context.projectsConfigurations.projects[context.projectName]) { throw new Error( "The Build process failed because the context is not valid. Please run this command from a workspace root directory." ); } if (!context.projectsConfigurations.projects[context.projectName].root) { throw new Error( "The Build process failed because the project root is not valid. Please run this command from a workspace root directory." ); } if (!context.projectsConfigurations.projects[context.projectName].sourceRoot) { throw new Error( "The Build process failed because the project's source root is not valid. Please run this command from a workspace root directory." ); } const jiti = createJiti(config.workspaceRoot, { fsCache: config.skipCache ? false : joinPaths( config.workspaceRoot, config.directories.cache || "node_modules/.cache/storm", "jiti" ), interopDefault: true }); const stormUnbuild = await jiti.import( jiti.esmResolve("@storm-software/unbuild/build") ); await stormUnbuild.build( defu2( { ...options, projectRoot: context.projectsConfigurations.projects[context.projectName].root, projectName: context.projectName, sourceRoot: context.projectsConfigurations.projects[context.projectName].sourceRoot, platform: options.platform }, { stubOptions: { jiti: { fsCache: config.skipCache ? false : joinPaths( config.workspaceRoot, config.directories.cache || "node_modules/.cache/storm", "jiti" ) } }, rollup: { emitCJS: true, watch: false, dts: { respectExternal: true }, esbuild: { target: options.target, format: "esm", platform: options.platform, minify: options.minify ?? !options.debug, sourcemap: options.sourcemap ?? options.debug, treeShaking: options.treeShaking } } } ) ); return { success: true }; } var executor_default9 = withRunExecutor( "TypeScript Unbuild build", unbuildExecutorFn, { skipReadingConfig: false, hooks: { applyDefaultOptions: async (options, config) => { options.debug ??= false; options.treeShaking ??= true; options.buildOnly ??= false; options.platform ??= "neutral"; options.entry ??= ["{sourceRoot}"]; options.tsconfig ??= "{projectRoot}/tsconfig.json"; return options; } } } ); // ../workspace-tools/src/generators/browser-library/generator.ts import { formatFiles as formatFiles2, generateFiles, names as names2, offsetFromRoot as offsetFromRoot2 } from "@nx/devkit"; // ../workspace-tools/src/base/base-generator.ts var withRunGenerator = (name, generatorFn, generatorOptions = { skipReadingConfig: false }) => async (tree, _options) => { const stopwatch = getStopwatch(name); let options = _options; let config; try { writeInfo(`\u26A1 Running the ${name} generator... `, config); const workspaceRoot3 = findWorkspaceRoot(); if (!generatorOptions.skipReadingConfig) { writeDebug( `Loading the Storm Config from environment variables and storm.config.js file... - workspaceRoot: ${workspaceRoot3}`, config ); config = await getConfig(workspaceRoot3); } if (generatorOptions?.hooks?.applyDefaultOptions) { writeDebug("Running the applyDefaultOptions hook...", config); options = await Promise.resolve( generatorOptions.hooks.applyDefaultOptions(options, config) ); writeDebug("Completed the applyDefaultOptions hook", config); } writeTrace( `Generator schema options \u2699\uFE0F ${Object.keys(options ?? {}).map((key) => ` - ${key}=${JSON.stringify(options[key])}`).join("\n")}`, config ); const tokenized = await applyWorkspaceTokens( options, { workspaceRoot: tree.root, config }, applyWorkspaceBaseTokens ); if (generatorOptions?.hooks?.preProcess) { writeDebug("Running the preProcess hook...", config); await Promise.resolve( generatorOptions.hooks.preProcess(tokenized, config) ); writeDebug("Completed the preProcess hook", config); } const result = await Promise.resolve( generatorFn(tree, tokenized, config) ); if (result) { if (result.success === false || result.error && result?.error?.message && typeof result?.error?.message === "string" && result?.error?.name && typeof result?.error?.name === "string") { throw new Error(`The ${name} generator failed to run`, { cause: result?.error }); } else if (result.success && result.data) { return result; } } if (generatorOptions?.hooks?.postProcess) { writeDebug("Running the postProcess hook...", config); await Promise.resolve(generatorOptions.hooks.postProcess(config)); writeDebug("Completed the postProcess hook", config); } return () => { writeSuccess(`Completed running the ${name} generator! `, config); }; } catch (error) { return () => { writeFatal( "A fatal error occurred while running the generator - the process was forced to terminate", config ); writeError( `An exception was thrown in the generator's process - Details: ${error.message} - Stacktrace: ${error.stack}`, config ); }; } finally { stopwatch(); } }; // ../workspace-tools/src/base/typescript-library-generator.ts import { addDependenciesToPackageJson, addProjectConfiguration, ensurePackage, formatFiles, names, offsetFromRoot, readJson, updateJson, writeJson } from "@nx/devkit"; import { determineProjectNameAndRootOptions } from "@nx/devkit/src/generators/project-name-and-root-utils"; import { addTsConfigPath, getRelativePathToRootTsConfig, tsConfigBaseOptions } from "@nx/js"; import jsInitGenerator from "@nx/js/src/generators/init/init"; import setupVerdaccio from "@nx/js/src/generators/setup-verdaccio/generator"; // ../workspace-tools/src/utils/versions.ts var typesNodeVersion = "20.9.0"; var nxVersion = "^18.0.4"; var nodeVersion = "20.11.0"; var pnpmVersion = "8.10.2"; // ../workspace-tools/src/base/typescript-library-generator.ts async function typeScriptLibraryGeneratorFn(tree, options, config) { const normalized = await normalizeOptions(tree, { ...options }); const tasks = []; tasks.push( await jsInitGenerator(tree, { ...normalized, tsConfigName: normalized.rootProject ? "tsconfig.json" : "tsconfig.base.json" }) ); tasks.push( addDependenciesToPackageJson( tree, {}, { "@storm-software/workspace-tools": "latest", "@storm-software/testing-tools": "latest", ...options.devDependencies ?? {} } ) ); if (normalized.publishable) { tasks.push(await setupVerdaccio(tree, { ...normalized, skipFormat: true })); } const projectConfig = { root: normalized.directory, projectType: "library", sourceRoot: joinPaths(normalized.directory ?? "", "src"), targets: { build: { executor: options.buildExecutor, outputs: ["{options.outputPath}"], options: { entry: [joinPaths(normalized.projectRoot, "src", "index.ts")], outputPath: getOutputPath(normalized), tsconfig: joinPaths(normalized.projectRoot, "tsconfig.json"), project: joinPaths(normalized.projectRoot, "package.json"), defaultConfiguration: "production", platform: "neutral", assets: [ { input: normalized.projectRoot, glob: "*.md", output: "/" }, { input: "", glob: "LICENSE", output: "/" } ] }, configurations: { production: { debug: false, verbose: false }, development: { debug: true, verbose: true } } } } }; if (options.platform) { projectConfig.targets.build.options.platform = options.platform === "worker" ? "node" : options.platform; } addProjectTag( projectConfig, ProjectTagConstants.Platform.TAG_ID, options.platform === "node" ? ProjectTagConstants.Platform.NODE : options.platform === "worker" ? ProjectTagConstants.Platform.WORKER : options.platform === "browser" ? ProjectTagConstants.Platform.BROWSER : ProjectTagConstants.Platform.NEUTRAL, { overwrite: false } ); createProjectTsConfigJson(tree, normalized); addProjectConfiguration(tree, normalized.name, projectConfig); let repository = { type: "github", url: config?.repository || `https://github.com/${(typeof config?.organization === "string" ? config?.organization : config?.organization?.name) || "storm-software"}/${config?.namespace || config?.name || "repository"}.git` }; let description = options.description || "A package developed by Storm Software used to create modern, scalable web applications."; if (tree.exists("package.json")) { const packageJson = readJson(tree, "package.json"); if (packageJson?.repository) { repository = packageJson.repository; } if (packageJson?.descriptio