@storm-software/terraform-tools
Version:
Tools for managing Terraform infrastructure within a Nx workspace.
1,528 lines (1,482 loc) • 90.1 kB
JavaScript
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