UNPKG

isolate-package

Version:

Isolate monorepo packages to form a self-contained deployable unit

1 lines 8.34 kB
{"version":3,"file":"isolate-bin.mjs","names":[],"sources":["../src/lib/cli.ts","../src/isolate-bin.ts"],"sourcesContent":["import type { IsolateConfig } from \"./config\";\nimport type { LogLevel } from \"./logger\";\nimport { filterObjectUndefined } from \"./utils/filter-object-undefined\";\n\nconst validLogLevels: readonly LogLevel[] = [\"info\", \"debug\", \"warn\", \"error\"];\n\n/**\n * Check if a boolean flag was explicitly passed on the command line. meow\n * returns `false` for unset boolean flags, making it impossible to distinguish\n * \"not passed\" from \"explicitly set to false\" via `--no-<flag>`.\n */\nexport function wasFlagExplicitlyPassed(\n flagName: string,\n argv: string[],\n shortFlag?: string,\n): boolean {\n const kebab = flagName.replace(/[A-Z]/g, (l) => `-${l.toLowerCase()}`);\n return argv.some(\n (arg) =>\n arg === `--${kebab}` ||\n arg === `--no-${kebab}` ||\n (shortFlag !== undefined && arg === `-${shortFlag}`),\n );\n}\n\n/**\n * Validate a log level string against the allowed values. Returns undefined if\n * the input is undefined, throws if the value is not a valid log level.\n */\nexport function parseLogLevel(value: string | undefined): LogLevel | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!validLogLevels.includes(value as LogLevel)) {\n throw new Error(\n `Invalid log level: \"${value}\". Must be one of: ${validLogLevels.join(\", \")}`,\n );\n }\n\n return value as LogLevel;\n}\n\n/** The parsed flags shape that meow produces for our flag definitions. */\nexport type ParsedFlags = {\n buildDirName: string | undefined;\n includeDevDependencies: boolean | undefined;\n isolateDirName: string | undefined;\n logLevel: string | undefined;\n targetPackagePath: string | undefined;\n tsconfigPath: string | undefined;\n workspacePackages: string[] | undefined;\n workspaceRoot: string | undefined;\n forceNpm: boolean | undefined;\n pickFromScripts: string[] | undefined;\n omitFromScripts: string[] | undefined;\n omitPackageManager: boolean | undefined;\n};\n\n/**\n * Build CLI overrides from parsed meow flags. Only includes values that were\n * actually provided by the user, so they can cleanly override config file\n * values via spread.\n */\nexport function buildCliOverrides(\n flags: ParsedFlags,\n argv: string[],\n): IsolateConfig {\n const logLevel = parseLogLevel(flags.logLevel);\n\n return filterObjectUndefined({\n buildDirName: flags.buildDirName,\n isolateDirName: flags.isolateDirName,\n logLevel,\n targetPackagePath: flags.targetPackagePath,\n tsconfigPath: flags.tsconfigPath,\n workspaceRoot: flags.workspaceRoot,\n workspacePackages: flags.workspacePackages?.length\n ? flags.workspacePackages\n : undefined,\n pickFromScripts: flags.pickFromScripts?.length\n ? flags.pickFromScripts\n : undefined,\n omitFromScripts: flags.omitFromScripts?.length\n ? flags.omitFromScripts\n : undefined,\n ...(wasFlagExplicitlyPassed(\"forceNpm\", argv) && {\n forceNpm: flags.forceNpm,\n }),\n ...(wasFlagExplicitlyPassed(\"includeDevDependencies\", argv, \"d\") && {\n includeDevDependencies: flags.includeDevDependencies,\n }),\n ...(wasFlagExplicitlyPassed(\"omitPackageManager\", argv) && {\n omitPackageManager: flags.omitPackageManager,\n }),\n }) as IsolateConfig;\n}\n","#!/usr/bin/env node\nimport console from \"node:console\";\nimport meow from \"meow\";\nimport { outdent } from \"outdent\";\nimport sourceMaps from \"source-map-support\";\nimport { isolate } from \"./isolate\";\nimport { buildCliOverrides } from \"./lib/cli\";\nimport { loadConfigFromFile } from \"./lib/config\";\n\nsourceMaps.install();\n\nconst cli = meow(\n outdent`\n Isolate a monorepo workspace package into a self-contained directory.\n\n Usage\n $ isolate [options]\n\n Options\n -b, --build-dir-name <name> Build output directory name\n -d, --include-dev-dependencies Include devDependencies in the isolated package\n -o, --isolate-dir-name <name> Name of the isolate output directory (default: isolate)\n -l, --log-level <level> Log level: info, debug, warn, error (default: info)\n -t, --target-package-path <path> Path to the target package\n -c, --tsconfig-path <path> Path to tsconfig.json (default: ./tsconfig.json)\n -w, --workspace-packages <glob> Workspace package globs (repeatable)\n -r, --workspace-root <path> Path to the workspace root (default: ../..)\n --force-npm Force npm lockfile generation\n -p, --pick-from-scripts <name> Scripts to include (repeatable)\n --omit-from-scripts <name> Scripts to exclude (repeatable)\n --omit-package-manager Omit the packageManager field from the manifest\n\n Examples\n $ isolate --log-level debug\n $ isolate --force-npm --workspace-root ../..\n $ isolate --pick-from-scripts build --pick-from-scripts start\n `,\n {\n importMeta: import.meta,\n flags: {\n buildDirName: {\n type: \"string\",\n shortFlag: \"b\",\n },\n includeDevDependencies: {\n type: \"boolean\",\n shortFlag: \"d\",\n },\n isolateDirName: {\n type: \"string\",\n shortFlag: \"o\",\n },\n logLevel: {\n type: \"string\",\n shortFlag: \"l\",\n },\n targetPackagePath: {\n type: \"string\",\n shortFlag: \"t\",\n },\n tsconfigPath: {\n type: \"string\",\n shortFlag: \"c\",\n },\n workspacePackages: {\n type: \"string\",\n shortFlag: \"w\",\n isMultiple: true,\n },\n workspaceRoot: {\n type: \"string\",\n shortFlag: \"r\",\n },\n forceNpm: {\n type: \"boolean\",\n },\n pickFromScripts: {\n type: \"string\",\n shortFlag: \"p\",\n isMultiple: true,\n },\n omitFromScripts: {\n type: \"string\",\n isMultiple: true,\n },\n omitPackageManager: {\n type: \"boolean\",\n },\n },\n },\n);\n\nasync function run() {\n const cliOverrides = buildCliOverrides(cli.flags, process.argv);\n const fileConfig = loadConfigFromFile();\n const mergedConfig = { ...fileConfig, ...cliOverrides };\n await isolate(mergedConfig);\n}\n\nrun().catch((err) => {\n if (err instanceof Error) {\n console.error(err.stack);\n process.exit(1);\n } else {\n console.error(err);\n }\n});\n"],"mappings":";;;;;;;;AAIA,MAAM,iBAAsC;CAAC;CAAQ;CAAS;CAAQ;CAAQ;;;;;;AAO9E,SAAgB,wBACd,UACA,MACA,WACS;CACT,MAAM,QAAQ,SAAS,QAAQ,WAAW,MAAM,IAAI,EAAE,aAAa,GAAG;AACtE,QAAO,KAAK,MACT,QACC,QAAQ,KAAK,WACb,QAAQ,QAAQ,WACf,cAAc,UAAa,QAAQ,IAAI,YAC3C;;;;;;AAOH,SAAgB,cAAc,OAAiD;AAC7E,KAAI,UAAU,OACZ;AAGF,KAAI,CAAC,eAAe,SAAS,MAAkB,CAC7C,OAAM,IAAI,MACR,uBAAuB,MAAM,qBAAqB,eAAe,KAAK,KAAK,GAC5E;AAGH,QAAO;;;;;;;AAwBT,SAAgB,kBACd,OACA,MACe;CACf,MAAM,WAAW,cAAc,MAAM,SAAS;AAE9C,QAAO,sBAAsB;EAC3B,cAAc,MAAM;EACpB,gBAAgB,MAAM;EACtB;EACA,mBAAmB,MAAM;EACzB,cAAc,MAAM;EACpB,eAAe,MAAM;EACrB,mBAAmB,MAAM,mBAAmB,SACxC,MAAM,oBACN;EACJ,iBAAiB,MAAM,iBAAiB,SACpC,MAAM,kBACN;EACJ,iBAAiB,MAAM,iBAAiB,SACpC,MAAM,kBACN;EACJ,GAAI,wBAAwB,YAAY,KAAK,IAAI,EAC/C,UAAU,MAAM,UACjB;EACD,GAAI,wBAAwB,0BAA0B,MAAM,IAAI,IAAI,EAClE,wBAAwB,MAAM,wBAC/B;EACD,GAAI,wBAAwB,sBAAsB,KAAK,IAAI,EACzD,oBAAoB,MAAM,oBAC3B;EACF,CAAC;;;;;ACtFJ,WAAW,SAAS;AAEpB,MAAM,MAAM,KACV,OAAO;;;;;;;;;;;;;;;;;;;;;;;;KAyBP;CACE,YAAY,OAAO;CACnB,OAAO;EACL,cAAc;GACZ,MAAM;GACN,WAAW;GACZ;EACD,wBAAwB;GACtB,MAAM;GACN,WAAW;GACZ;EACD,gBAAgB;GACd,MAAM;GACN,WAAW;GACZ;EACD,UAAU;GACR,MAAM;GACN,WAAW;GACZ;EACD,mBAAmB;GACjB,MAAM;GACN,WAAW;GACZ;EACD,cAAc;GACZ,MAAM;GACN,WAAW;GACZ;EACD,mBAAmB;GACjB,MAAM;GACN,WAAW;GACX,YAAY;GACb;EACD,eAAe;GACb,MAAM;GACN,WAAW;GACZ;EACD,UAAU,EACR,MAAM,WACP;EACD,iBAAiB;GACf,MAAM;GACN,WAAW;GACX,YAAY;GACb;EACD,iBAAiB;GACf,MAAM;GACN,YAAY;GACb;EACD,oBAAoB,EAClB,MAAM,WACP;EACF;CACF,CACF;AAED,eAAe,MAAM;CACnB,MAAM,eAAe,kBAAkB,IAAI,OAAO,QAAQ,KAAK;AAG/D,OAAM,QADe;EAAE,GADJ,oBAAoB;EACD,GAAG;EAAc,CAC5B;;AAG7B,KAAK,CAAC,OAAO,QAAQ;AACnB,KAAI,eAAe,OAAO;AACxB,UAAQ,MAAM,IAAI,MAAM;AACxB,UAAQ,KAAK,EAAE;OAEf,SAAQ,MAAM,IAAI;EAEpB"}