ts-repo-utils 10.1.7 → 10.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/cmd/assert-repo-is-clean.mjs +1 -1
- package/dist/cmd/assert-repo-is-clean.mjs.map +1 -1
- package/dist/cmd/check-should-run-type-checks.mjs +1 -1
- package/dist/cmd/check-should-run-type-checks.mjs.map +1 -1
- package/dist/cmd/format-diff-from.mjs +1 -1
- package/dist/cmd/format-diff-from.mjs.map +1 -1
- package/dist/cmd/format-uncommitted.mjs +1 -1
- package/dist/cmd/format-uncommitted.mjs.map +1 -1
- package/dist/cmd/gen-index-ts.mjs +1 -1
- package/dist/cmd/gen-index-ts.mjs.map +1 -1
- package/dist/functions/format.d.mts.map +1 -1
- package/dist/functions/format.mjs +10 -9
- package/dist/functions/format.mjs.map +1 -1
- package/dist/functions/glob.d.mts +3 -3
- package/dist/functions/glob.d.mts.map +1 -1
- package/dist/functions/glob.mjs.map +1 -1
- package/dist/functions/workspace-utils/execute-parallel.d.mts.map +1 -1
- package/dist/functions/workspace-utils/execute-parallel.mjs +16 -15
- package/dist/functions/workspace-utils/execute-parallel.mjs.map +1 -1
- package/package.json +15 -15
- package/src/cmd/assert-repo-is-clean.mts +1 -1
- package/src/cmd/check-should-run-type-checks.mts +1 -1
- package/src/cmd/format-diff-from.mts +1 -1
- package/src/cmd/format-uncommitted.mts +1 -1
- package/src/cmd/gen-index-ts.mts +1 -1
- package/src/functions/exec-async.test.mts +7 -4
- package/src/functions/format.mts +14 -12
- package/src/functions/glob.mts +3 -3
- package/src/functions/workspace-utils/execute-parallel.mts +23 -21
package/README.md
CHANGED
|
@@ -778,13 +778,13 @@ console.log(packages.map((pkg) => pkg.name));
|
|
|
778
778
|
**Return Type:**
|
|
779
779
|
|
|
780
780
|
```tsx
|
|
781
|
-
import { type JsonValue } from 'ts-type-forge';
|
|
781
|
+
import { type JsonValue, type ReadonlyRecord } from 'ts-type-forge';
|
|
782
782
|
|
|
783
783
|
type Package = Readonly<{
|
|
784
784
|
name: string;
|
|
785
785
|
path: string;
|
|
786
786
|
packageJson: JsonValue;
|
|
787
|
-
dependencies:
|
|
787
|
+
dependencies: ReadonlyRecord<string, string>;
|
|
788
788
|
}>;
|
|
789
789
|
```
|
|
790
790
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assert-repo-is-clean.mjs","sources":["../../src/cmd/assert-repo-is-clean.mts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as cmd from 'cmd-ts';\nimport { Arr } from 'ts-data-forge';\nimport { assertRepoIsClean } from '../functions/index.mjs';\n\nconst cmdDef = cmd.command({\n name: 'assert-repo-is-clean-cli',\n version: '10.1.
|
|
1
|
+
{"version":3,"file":"assert-repo-is-clean.mjs","sources":["../../src/cmd/assert-repo-is-clean.mts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as cmd from 'cmd-ts';\nimport { Arr } from 'ts-data-forge';\nimport { assertRepoIsClean } from '../functions/index.mjs';\n\nconst cmdDef = cmd.command({\n name: 'assert-repo-is-clean-cli',\n version: '10.1.8',\n args: {\n silent: cmd.flag({\n long: 'silent',\n type: cmd.optional(cmd.boolean),\n description: 'If true, suppresses output messages (default: false)',\n }),\n },\n handler: (args) => {\n main(args).catch((error: unknown) => {\n console.error('An error occurred:', error);\n\n process.exit(1);\n });\n },\n});\n\nconst main = async (args: Readonly<{ silent?: boolean }>): Promise<void> => {\n await assertRepoIsClean({ silent: args.silent });\n};\n\nawait cmd.run(cmdDef, Arr.skip(process.argv, 2));\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAMA,MAAM,MAAA,GAAS,IAAI,OAAA,CAAQ;AAAA,EACzB,IAAA,EAAM,0BAAA;AAAA,EACN,OAAA,EAAS,QAAA;AAAA,EACT,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,IAAI,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAAA,MAC9B,WAAA,EAAa;AAAA,KACd;AAAA,GACH;AAAA,EACA,OAAA,EAAS,CAAC,IAAA,KAAS;AACjB,IAAA,IAAA,CAAK,IAAI,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAmB;AACnC,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AAEzC,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB,CAAC,CAAA;AAAA,EACH;AACF,CAAC,CAAA;AAED,MAAM,IAAA,GAAO,OAAO,IAAA,KAAwD;AAC1E,EAAA,MAAM,iBAAA,CAAkB,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AACjD,CAAA;AAEA,MAAM,GAAA,CAAI,IAAI,MAAA,EAAQ,GAAA,CAAI,KAAK,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-should-run-type-checks.mjs","sources":["../../src/cmd/check-should-run-type-checks.mts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as cmd from 'cmd-ts';\nimport { Arr } from 'ts-data-forge';\nimport { checkShouldRunTypeChecks } from '../functions/index.mjs';\n\nconst cmdDef = cmd.command({\n name: 'check-should-run-type-checks-cli',\n version: '10.1.
|
|
1
|
+
{"version":3,"file":"check-should-run-type-checks.mjs","sources":["../../src/cmd/check-should-run-type-checks.mts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as cmd from 'cmd-ts';\nimport { Arr } from 'ts-data-forge';\nimport { checkShouldRunTypeChecks } from '../functions/index.mjs';\n\nconst cmdDef = cmd.command({\n name: 'check-should-run-type-checks-cli',\n version: '10.1.8',\n args: {\n pathsIgnore: cmd.multioption({\n long: 'paths-ignore',\n type: cmd.optional(cmd.array(cmd.string)),\n description:\n 'Patterns to ignore when checking if type checks should run. Supports exact file matches, directory prefixes (ending with \"/\"), and file extensions (starting with \"**.\")',\n }),\n baseBranch: cmd.option({\n long: 'base-branch',\n type: cmd.optional(cmd.string),\n description:\n 'Base branch to compare against for determining changed files. Defaults to \"origin/main\"',\n }),\n },\n handler: (args) => {\n main(args).catch((error: unknown) => {\n console.error('An error occurred:', error);\n\n process.exit(1);\n });\n },\n});\n\nconst main = async (\n args: Readonly<{\n pathsIgnore?: readonly string[];\n baseBranch?: string;\n }>,\n): Promise<void> => {\n await checkShouldRunTypeChecks({\n pathsIgnore: args.pathsIgnore,\n baseBranch: args.baseBranch,\n });\n};\n\nawait cmd.run(cmdDef, Arr.skip(process.argv, 2));\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAMA,MAAM,MAAA,GAAS,IAAI,OAAA,CAAQ;AAAA,EACzB,IAAA,EAAM,kCAAA;AAAA,EACN,OAAA,EAAS,QAAA;AAAA,EACT,IAAA,EAAM;AAAA,IACJ,WAAA,EAAa,IAAI,WAAA,CAAY;AAAA,MAC3B,IAAA,EAAM,cAAA;AAAA,MACN,MAAM,GAAA,CAAI,QAAA,CAAS,IAAI,KAAA,CAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,MACxC,WAAA,EACE;AAAA,KACH,CAAA;AAAA,IACD,UAAA,EAAY,IAAI,MAAA,CAAO;AAAA,MACrB,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAAA,MAC7B,WAAA,EACE;AAAA,KACH;AAAA,GACH;AAAA,EACA,OAAA,EAAS,CAAC,IAAA,KAAS;AACjB,IAAA,IAAA,CAAK,IAAI,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAmB;AACnC,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AAEzC,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB,CAAC,CAAA;AAAA,EACH;AACF,CAAC,CAAA;AAED,MAAM,IAAA,GAAO,OACX,IAAA,KAIkB;AAClB,EAAA,MAAM,wBAAA,CAAyB;AAAA,IAC7B,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,YAAY,IAAA,CAAK;AAAA,GAClB,CAAA;AACH,CAAA;AAEA,MAAM,GAAA,CAAI,IAAI,MAAA,EAAQ,GAAA,CAAI,KAAK,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-diff-from.mjs","sources":["../../src/cmd/format-diff-from.mts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as cmd from 'cmd-ts';\nimport { Arr, Result } from 'ts-data-forge';\nimport { formatDiffFrom } from '../functions/index.mjs';\n\nconst cmdDef = cmd.command({\n name: 'format-diff-from-cli',\n version: '10.1.
|
|
1
|
+
{"version":3,"file":"format-diff-from.mjs","sources":["../../src/cmd/format-diff-from.mts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as cmd from 'cmd-ts';\nimport { Arr, Result } from 'ts-data-forge';\nimport { formatDiffFrom } from '../functions/index.mjs';\n\nconst cmdDef = cmd.command({\n name: 'format-diff-from-cli',\n version: '10.1.8',\n args: {\n base: cmd.positional({\n type: cmd.string,\n displayName: 'base',\n description: 'Base branch name or commit hash to compare against',\n }),\n excludeUntracked: cmd.flag({\n long: 'exclude-untracked',\n type: cmd.optional(cmd.boolean),\n description:\n 'Exclude untracked files in addition to diff files (default: false)',\n }),\n excludeModified: cmd.flag({\n long: 'exclude-modified',\n type: cmd.optional(cmd.boolean),\n description:\n 'Exclude modified files in addition to diff files (default: false)',\n }),\n excludeStaged: cmd.flag({\n long: 'exclude-staged',\n type: cmd.optional(cmd.boolean),\n description:\n 'Exclude staged files in addition to diff files (default: false)',\n }),\n ignoreUnknown: cmd.flag({\n long: 'ignore-unknown',\n type: cmd.optional(cmd.boolean),\n description: 'Ignore unknown files (default: true)',\n }),\n silent: cmd.flag({\n long: 'silent',\n type: cmd.optional(cmd.boolean),\n description: 'If true, suppresses output messages (default: false)',\n }),\n cwd: cmd.option({\n long: 'cwd',\n type: cmd.optional(cmd.string),\n description:\n 'If provided, only files within this directory are formatted. Relative paths are resolved against the current working directory (process.cwd()), not the git repository root.',\n }),\n },\n handler: (args) => {\n main({\n base: args.base,\n excludeUntracked: args.excludeUntracked ?? false,\n excludeModified: args.excludeModified ?? false,\n excludeStaged: args.excludeStaged ?? false,\n ignoreUnknown: args.ignoreUnknown ?? true,\n silent: args.silent ?? false,\n cwd: args.cwd,\n }).catch((error: unknown) => {\n console.error('An error occurred:', error);\n\n process.exit(1);\n });\n },\n});\n\nconst main = async (\n args: Readonly<{\n base: string;\n excludeUntracked: boolean;\n excludeModified: boolean;\n excludeStaged: boolean;\n ignoreUnknown: boolean;\n silent: boolean;\n cwd: string | undefined;\n }>,\n): Promise<void> => {\n const result = await formatDiffFrom(args.base, {\n includeUntracked: !args.excludeUntracked,\n includeModified: !args.excludeModified,\n includeStaged: !args.excludeStaged,\n ignoreUnknown: args.ignoreUnknown,\n silent: args.silent,\n cwd: args.cwd,\n });\n\n if (Result.isErr(result)) {\n process.exit(1);\n }\n};\n\nawait cmd.run(cmdDef, Arr.skip(process.argv, 2));\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-uncommitted.mjs","sources":["../../src/cmd/format-uncommitted.mts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as cmd from 'cmd-ts';\nimport { Arr, Result } from 'ts-data-forge';\nimport { formatUncommittedFiles } from '../functions/index.mjs';\n\nconst cmdDef = cmd.command({\n name: 'format-uncommitted-cli',\n version: '10.1.
|
|
1
|
+
{"version":3,"file":"format-uncommitted.mjs","sources":["../../src/cmd/format-uncommitted.mts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as cmd from 'cmd-ts';\nimport { Arr, Result } from 'ts-data-forge';\nimport { formatUncommittedFiles } from '../functions/index.mjs';\n\nconst cmdDef = cmd.command({\n name: 'format-uncommitted-cli',\n version: '10.1.8',\n args: {\n excludeUntracked: cmd.flag({\n long: 'exclude-untracked',\n type: cmd.optional(cmd.boolean),\n description:\n 'Exclude untracked files in addition to diff files (default: false)',\n }),\n excludeModified: cmd.flag({\n long: 'exclude-modified',\n type: cmd.optional(cmd.boolean),\n description:\n 'Exclude modified files in addition to diff files (default: false)',\n }),\n excludeStaged: cmd.flag({\n long: 'exclude-staged',\n type: cmd.optional(cmd.boolean),\n description:\n 'Exclude staged files in addition to diff files (default: false)',\n }),\n ignoreUnknown: cmd.flag({\n long: 'ignore-unknown',\n type: cmd.optional(cmd.boolean),\n description: 'Ignore unknown files (default: true)',\n }),\n silent: cmd.flag({\n long: 'silent',\n type: cmd.optional(cmd.boolean),\n description: 'If true, suppresses output messages (default: false)',\n }),\n cwd: cmd.option({\n long: 'cwd',\n type: cmd.optional(cmd.string),\n description:\n 'If provided, only files within this directory are formatted. Relative paths are resolved against the current working directory (process.cwd()), not the git repository root.',\n }),\n },\n handler: (args) => {\n main({\n excludeUntracked: args.excludeUntracked ?? false,\n excludeModified: args.excludeModified ?? false,\n excludeStaged: args.excludeStaged ?? false,\n ignoreUnknown: args.ignoreUnknown ?? true,\n silent: args.silent ?? false,\n cwd: args.cwd,\n }).catch((error: unknown) => {\n console.error('An error occurred:', error);\n\n process.exit(1);\n });\n },\n});\n\nconst main = async (\n args: Readonly<{\n excludeUntracked: boolean;\n excludeModified: boolean;\n excludeStaged: boolean;\n ignoreUnknown: boolean;\n silent: boolean;\n cwd: string | undefined;\n }>,\n): Promise<void> => {\n const result = await formatUncommittedFiles({\n untracked: !args.excludeUntracked,\n modified: !args.excludeModified,\n staged: !args.excludeStaged,\n ignoreUnknown: args.ignoreUnknown,\n silent: args.silent,\n cwd: args.cwd,\n });\n\n if (Result.isErr(result)) {\n process.exit(1);\n }\n};\n\nawait cmd.run(cmdDef, Arr.skip(process.argv, 2));\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gen-index-ts.mjs","sources":["../../src/cmd/gen-index-ts.mts"],"sourcesContent":["#!/usr/bin/env node\n\n/* transformer-ignore convert-to-readonly */\n\nimport * as cmd from 'cmd-ts';\nimport { Arr, expectType } from 'ts-data-forge';\n// eslint-disable-next-line import-x/no-internal-modules, import-x/extensions\nimport { type InputOf, type OutputOf } from 'cmd-ts/dist/esm/from.js';\nimport { type NonEmptyArray } from 'ts-type-forge';\nimport { genIndex } from '../functions/index.mjs';\n\ntype Ext = `.${string}`;\n\nconst extensionType = cmd.extendType(cmd.string, {\n from: (s) => {\n if (!s.startsWith('.')) {\n throw new Error(`ext should start with '.'`);\n }\n\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n return Promise.resolve(s as Ext);\n },\n});\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst nonEmptyArray = <T extends cmd.Type<any, any>>(\n t: T,\n commandName: string,\n): cmd.Type<readonly InputOf<T>[], NonEmptyArray<OutputOf<T>>> =>\n cmd.extendType(\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n cmd.array(t) as cmd.Type<readonly InputOf<T>[], OutputOf<T>[]>,\n {\n from: (arr) => {\n if (Arr.isEmpty(arr)) {\n throw new Error(\n `No value provided for --${commandName}. At least one value is required.`,\n );\n }\n\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n return Promise.resolve(arr as unknown as NonEmptyArray<OutputOf<T>>);\n },\n },\n );\n\nconst cmdDef = cmd.command({\n name: 'gen-index-ts-cli',\n version: '10.1.
|
|
1
|
+
{"version":3,"file":"gen-index-ts.mjs","sources":["../../src/cmd/gen-index-ts.mts"],"sourcesContent":["#!/usr/bin/env node\n\n/* transformer-ignore convert-to-readonly */\n\nimport * as cmd from 'cmd-ts';\nimport { Arr, expectType } from 'ts-data-forge';\n// eslint-disable-next-line import-x/no-internal-modules, import-x/extensions\nimport { type InputOf, type OutputOf } from 'cmd-ts/dist/esm/from.js';\nimport { type NonEmptyArray } from 'ts-type-forge';\nimport { genIndex } from '../functions/index.mjs';\n\ntype Ext = `.${string}`;\n\nconst extensionType = cmd.extendType(cmd.string, {\n from: (s) => {\n if (!s.startsWith('.')) {\n throw new Error(`ext should start with '.'`);\n }\n\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n return Promise.resolve(s as Ext);\n },\n});\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst nonEmptyArray = <T extends cmd.Type<any, any>>(\n t: T,\n commandName: string,\n): cmd.Type<readonly InputOf<T>[], NonEmptyArray<OutputOf<T>>> =>\n cmd.extendType(\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n cmd.array(t) as cmd.Type<readonly InputOf<T>[], OutputOf<T>[]>,\n {\n from: (arr) => {\n if (Arr.isEmpty(arr)) {\n throw new Error(\n `No value provided for --${commandName}. At least one value is required.`,\n );\n }\n\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n return Promise.resolve(arr as unknown as NonEmptyArray<OutputOf<T>>);\n },\n },\n );\n\nconst cmdDef = cmd.command({\n name: 'gen-index-ts-cli',\n version: '10.1.8',\n args: {\n // required args\n targetDirectory: cmd.positional({\n type: cmd.string,\n displayName: 'target-directory',\n description:\n 'Directory where the index file will be generated (Comma-separated list can be used)',\n }),\n\n targetExtensions: cmd.multioption({\n long: 'target-ext',\n type: nonEmptyArray(extensionType, 'target-ext'),\n description: 'File extensions to include in the index file',\n }),\n indexFileExtension: cmd.option({\n long: 'index-ext',\n type: extensionType,\n description: 'Extension of the index file to be generated',\n }),\n exportStatementExtension: cmd.option({\n long: 'export-ext',\n type: cmd.union([\n extensionType,\n cmd.extendType(cmd.string, {\n from: (s) => {\n if (s !== 'none') {\n throw new Error(\n `export-ext should be 'none' or a valid extension`,\n );\n }\n\n return Promise.resolve('none' as const);\n },\n }),\n ]),\n description: 'Extension of the export statements in the index file',\n }),\n\n // optional args\n exclude: cmd.multioption({\n long: 'exclude',\n type: cmd.optional(cmd.array(cmd.string)),\n description:\n 'Glob patterns of files to exclude from the index file (e.g., \"*.d.mts\", \"*.test.mts\")',\n }),\n formatCommand: cmd.option({\n long: 'fmt',\n type: cmd.optional(cmd.string),\n description:\n 'Command to format after generating the index file (e.g., \"npm run fmt\")',\n }),\n silent: cmd.flag({\n long: 'silent',\n type: cmd.optional(cmd.boolean),\n description: 'If true, suppresses output messages (default: false)',\n }),\n minDepth: cmd.option({\n long: 'min-depth',\n type: cmd.optional(cmd.number),\n description: 'Minimum depth to start generating index files (default: 0)',\n }),\n },\n handler: (args) => {\n expectType<typeof args.targetDirectory, string>('=');\n\n expectType<typeof args.targetExtensions, NonEmptyArray<Ext>>('=');\n\n expectType<typeof args.exportStatementExtension, Ext | 'none'>('=');\n\n expectType<typeof args.indexFileExtension, Ext>('=');\n\n expectType<typeof args.exclude, string[] | undefined>('=');\n\n expectType<typeof args.formatCommand, string | undefined>('=');\n\n expectType<typeof args.silent, boolean | undefined>('=');\n\n expectType<typeof args.minDepth, number | undefined>('=');\n\n main(args).catch((error: unknown) => {\n console.error('An error occurred:', error);\n\n process.exit(1);\n });\n },\n});\n\nconst main = async ({\n targetDirectory,\n targetExtensions,\n exportStatementExtension,\n indexFileExtension,\n exclude,\n formatCommand,\n silent,\n minDepth,\n}: Readonly<{\n targetDirectory: string;\n targetExtensions: readonly Ext[];\n exportStatementExtension: Ext | 'none';\n indexFileExtension: Ext;\n exclude?: readonly string[] | undefined;\n formatCommand?: string | undefined;\n silent?: boolean | undefined;\n minDepth?: number | undefined;\n}>): Promise<void> => {\n await genIndex({\n targetDirectory: targetDirectory.includes(',')\n ? targetDirectory.split(',').map((dir) => dir.trim())\n : targetDirectory,\n exportStatementExtension,\n targetExtensions,\n exclude,\n indexFileExtension,\n formatCommand,\n silent,\n minDepth,\n });\n};\n\nawait cmd.run(cmdDef, Arr.skip(process.argv, 2));\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.d.mts","sourceRoot":"","sources":["../../src/functions/format.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAIxD,OAAO,EAA6B,MAAM,EAAE,MAAM,eAAe,CAAC;AAWlE;;;;GAIG;AACH,eAAO,MAAM,WAAW,UACf,SAAS,MAAM,EAAE,YACd,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IACjD,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC,KACD,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,OAAO,EAAE,CAAC,CAoI/C,CAAC;AA+DF;;;;GAIG;AACH,eAAO,MAAM,eAAe,aAChB,MAAM,YACN,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;CAClD,CAAC,KACD,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAmCpC,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,aACvB,QAAQ,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IACjD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC,KACD,OAAO,CACR,MAAM,CACJ,SAAS,EACT,aAAa,GAAG,QAAQ,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,SAAS,OAAO,EAAE,CACnE,CAgEF,CAAC;AA4BF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,cAAc,SACnB,MAAM,YACF,QAAQ,CAAC;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IACjD;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC,KACD,OAAO,CACR,MAAM,CACJ,SAAS,EACP,aAAa,GACb,QAAQ,CAAC;IACP,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC,GACF,SAAS,OAAO,EAAE,CACrB,
|
|
1
|
+
{"version":3,"file":"format.d.mts","sourceRoot":"","sources":["../../src/functions/format.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAIxD,OAAO,EAA6B,MAAM,EAAE,MAAM,eAAe,CAAC;AAWlE;;;;GAIG;AACH,eAAO,MAAM,WAAW,UACf,SAAS,MAAM,EAAE,YACd,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IACjD,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC,KACD,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,OAAO,EAAE,CAAC,CAoI/C,CAAC;AA+DF;;;;GAIG;AACH,eAAO,MAAM,eAAe,aAChB,MAAM,YACN,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;CAClD,CAAC,KACD,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAmCpC,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,aACvB,QAAQ,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IACjD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC,KACD,OAAO,CACR,MAAM,CACJ,SAAS,EACT,aAAa,GAAG,QAAQ,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,SAAS,OAAO,EAAE,CACnE,CAgEF,CAAC;AA4BF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,cAAc,SACnB,MAAM,YACF,QAAQ,CAAC;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IACjD;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC,KACD,OAAO,CACR,MAAM,CACJ,SAAS,EACP,aAAa,GACb,QAAQ,CAAC;IACP,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC,GACF,SAAS,OAAO,EAAE,CACrB,CA2FF,CAAC"}
|
|
@@ -258,17 +258,18 @@ const formatDiffFrom = async (base, options) => {
|
|
|
258
258
|
{ type: "modified", flag: includeModified, fn: getModifiedFiles },
|
|
259
259
|
{ type: "staged", flag: includeStaged, fn: getStagedFiles }
|
|
260
260
|
]) {
|
|
261
|
-
if (flag) {
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
261
|
+
if (!flag) {
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
const filesResult = await fn({ silent });
|
|
265
|
+
if (Result.isErr(filesResult)) {
|
|
266
|
+
if (!silent) {
|
|
267
|
+
console.error(`Error getting ${type} files:`, filesResult.value);
|
|
268
268
|
}
|
|
269
|
-
|
|
270
|
-
mut_allFiles.push(...files);
|
|
269
|
+
return filesResult;
|
|
271
270
|
}
|
|
271
|
+
const files = filesResult.value;
|
|
272
|
+
mut_allFiles.push(...files);
|
|
272
273
|
}
|
|
273
274
|
const allFiles = filterFilesByCwd(Arr.uniq(mut_allFiles), cwd);
|
|
274
275
|
if (!silent) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.mjs","sources":["../../src/functions/format.mts"],"sourcesContent":["import { type ExecException } from 'node:child_process';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as prettier from 'prettier';\nimport { Arr, isNotUndefined, pipe, Result } from 'ts-data-forge';\nimport { pathExists } from './assert-path-exists.mjs';\nimport {\n getDiffFrom,\n getGitRoot,\n getModifiedFiles,\n getStagedFiles,\n getUntrackedFiles,\n} from './diff.mjs';\nimport { glob } from './glob.mjs';\n\n/**\n * Format a list of files using Prettier\n *\n * @param files - Array of file paths to format\n */\nexport const formatFiles = async (\n files: readonly string[],\n options?: Readonly<{\n silent?: boolean;\n ignore?: false | ((filePath: string) => boolean);\n ignoreUnknown?: boolean;\n }>,\n): Promise<Result<undefined, readonly unknown[]>> => {\n const silent = options?.silent ?? false;\n\n const noIgnore = options?.ignore === false;\n\n const conditionalEcho = silent ? () => {} : console.info;\n\n if (Arr.isEmpty(files)) {\n conditionalEcho('No files to format');\n\n return Result.ok(undefined);\n }\n\n conditionalEcho(`Formatting ${files.length} files...`);\n\n // Get git root for display purposes\n const gitRootResult = await getGitRoot({ silent: true });\n\n const gitRoot = Result.isOk(gitRootResult) ? gitRootResult.value : undefined;\n\n // Helper function to get display path (relative to git root if available)\n const getDisplayPath = (filePath: string): string => {\n if (gitRoot === undefined) {\n return filePath;\n }\n\n const relativePath = path.relative(gitRoot, filePath);\n\n return relativePath.startsWith('..') ? filePath : relativePath;\n };\n\n // Format each file\n const results: readonly PromiseSettledResult<Result<undefined, unknown>>[] =\n // NOTE: Using Promise.allSettled to ensure all files are processed even if some fail\n await Promise.allSettled(\n files.map(async (filePath) => {\n try {\n // Check if file exists first\n if (!(await pathExists(filePath))) {\n conditionalEcho(\n `Skipping non-existent file: ${getDisplayPath(filePath)}`,\n );\n\n return Result.ok(undefined);\n }\n\n if (!noIgnore && (options?.ignore ?? defaultIgnoreFn)(filePath)) {\n conditionalEcho(\n `Skipping ignored file: ${getDisplayPath(filePath)}`,\n );\n\n return Result.ok(undefined);\n }\n\n // Check if file is ignored by prettier\n const fileInfo = await prettier.getFileInfo(filePath, {\n ignorePath: '.prettierignore',\n });\n\n if (!noIgnore && fileInfo.ignored) {\n conditionalEcho(\n `Skipping ignored file: ${getDisplayPath(filePath)}`,\n );\n\n return Result.ok(undefined);\n }\n\n if (\n !noIgnore &&\n (options?.ignoreUnknown ?? true) &&\n fileInfo.inferredParser === null\n ) {\n // Silently skip files with no parser\n conditionalEcho(\n `Skipping file (no parser): ${getDisplayPath(filePath)}`,\n );\n\n return Result.ok(undefined);\n }\n\n // Read file content\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n const content = await fs.readFile(filePath, 'utf8');\n\n // Resolve prettier config for this file\n const prettierOptions = await prettier.resolveConfig(filePath);\n\n // Format the content\n const formatted = await prettier.format(content, {\n ...prettierOptions,\n filepath: filePath,\n });\n\n // Only write if content changed\n if (formatted === content) {\n conditionalEcho(`Unchanged: ${getDisplayPath(filePath)}`);\n } else {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n await fs.writeFile(filePath, formatted, 'utf8');\n\n conditionalEcho(`Formatted: ${getDisplayPath(filePath)}`);\n }\n\n return Result.ok(undefined);\n } catch (error) {\n if (!silent) {\n console.error(\n `Error formatting ${getDisplayPath(filePath)}:`,\n error,\n );\n }\n\n return Result.err(error);\n }\n }),\n );\n\n if (results.every((r) => r.status === 'fulfilled')) {\n const fulfilled = results.map((r) => r.value);\n\n if (fulfilled.every(Result.isOk)) {\n return Result.ok(undefined);\n }\n\n return Result.err(fulfilled.filter(Result.isErr).map((r) => r.value));\n }\n\n return Result.err(\n results\n .filter((r) => r.status === 'rejected')\n .map((r): unknown => r.reason),\n );\n};\n\nconst defaultIgnoreFn = (filePath: string): boolean => {\n const filename = path.basename(filePath);\n\n return (\n ignoreFiles.has(filename) ||\n filename.startsWith('.env') ||\n ignoreExtensions.some((ext) => filePath.endsWith(ext)) ||\n pipe(filePath.split(path.sep)).map((pathSegments) =>\n pathSegments.some((segment) => ignoreDirs.includes(segment)),\n ).value\n );\n};\n\nconst ignoreFiles: ReadonlySet<string> = new Set([\n '.DS_Store',\n 'package-lock.json',\n 'yarn.lock',\n 'pnpm-lock.yaml',\n 'LICENSE',\n '.prettierignore',\n '.editorconfig',\n '.gitignore',\n '.npmignore',\n '.envrc',\n '.nvmrc',\n '.npmrc',\n]);\n\nconst ignoreExtensions: readonly `.${string}`[] = [\n '.svg',\n '.png',\n '.jpg',\n '.jpeg',\n '.gif',\n '.bmp',\n '.tiff',\n '.bak',\n '.log',\n '.zip',\n '.tar',\n '.gz',\n '.7z',\n '.mp3',\n '.mp4',\n '.avi',\n '.mkv',\n '.tsbuildinfo',\n] as const;\n\nconst ignoreDirs: readonly string[] = [\n 'node_modules',\n '.git',\n 'dist',\n 'build',\n 'out',\n '.cache',\n '.vscode',\n '.yarn',\n '.wireit',\n] as const;\n\n/**\n * Format files matching the given glob pattern using Prettier\n *\n * @param pathGlob - Glob pattern to match files\n */\nexport const formatFilesGlob = async (\n pathGlob: string,\n options?: Readonly<{\n silent?: boolean;\n ignoreUnknown?: boolean;\n ignore?: false | ((filePath: string) => boolean);\n }>,\n): Promise<Result<undefined, unknown>> => {\n const silent = options?.silent ?? false;\n\n const ignoreUnknown = options?.ignoreUnknown ?? true;\n\n const ignore = options?.ignore;\n\n const conditionalEcho = silent ? () => {} : console.info;\n\n // Find all files matching the glob\n const globResult = await glob(pathGlob, {\n absolute: true,\n ignore: ignore === false ? [] : ['**/node_modules/**', '**/.git/**'],\n dot: true,\n });\n\n if (Result.isErr(globResult)) {\n const error = globResult.value;\n\n if (!silent) {\n console.error('Error in formatFiles:', error);\n }\n\n return Result.err(error);\n }\n\n const files = globResult.value;\n\n if (Arr.isEmpty(files)) {\n conditionalEcho('No files found matching pattern:', pathGlob);\n\n return Result.ok(undefined);\n }\n\n return formatFiles(files, { silent, ignoreUnknown, ignore });\n};\n\n/**\n * Format only files that have been changed (git status)\n *\n * @param options - Options for formatting\n * @param options.cwd - If provided, only files within this directory will be\n * formatted. Relative paths are resolved against `process.cwd()`. Defaults to\n * undefined (no filtering; all changed files in the repository are\n * formatted).\n */\nexport const formatUncommittedFiles = async (\n options?: Readonly<{\n untracked?: boolean;\n modified?: boolean;\n staged?: boolean;\n silent?: boolean;\n ignoreUnknown?: boolean;\n ignore?: false | ((filePath: string) => boolean);\n cwd?: string;\n }>,\n): Promise<\n Result<\n undefined,\n ExecException | Readonly<{ message: string }> | readonly unknown[]\n >\n> => {\n const {\n untracked = true,\n modified = true,\n staged = true,\n silent = false,\n ignoreUnknown = true,\n ignore,\n cwd,\n } = options ?? {};\n\n const mut_files: string[] = [];\n\n if (untracked) {\n const untrackedFilesResult = await getUntrackedFiles({ silent });\n\n if (Result.isErr(untrackedFilesResult)) {\n if (!silent) {\n console.error(\n 'Error getting changed files:',\n untrackedFilesResult.value,\n );\n }\n\n return untrackedFilesResult;\n }\n\n mut_files.push(...untrackedFilesResult.value);\n }\n\n if (modified) {\n const diffFilesResult = await getModifiedFiles({ silent });\n\n if (Result.isErr(diffFilesResult)) {\n if (!silent) {\n console.error('Error getting changed files:', diffFilesResult.value);\n }\n\n return diffFilesResult;\n }\n\n mut_files.push(...diffFilesResult.value);\n }\n\n if (staged) {\n const stagedFilesResult = await getStagedFiles({ silent });\n\n if (Result.isErr(stagedFilesResult)) {\n if (!silent) {\n console.error('Error getting changed files:', stagedFilesResult.value);\n }\n\n return stagedFilesResult;\n }\n\n mut_files.push(...stagedFilesResult.value);\n }\n\n return formatFiles(filterFilesByCwd(Arr.uniq(mut_files), cwd), {\n silent,\n ignoreUnknown,\n ignore,\n });\n};\n\n/**\n * Filter a list of file paths to those inside `cwd`. If `cwd` is undefined,\n * returns the original list unchanged. Relative `cwd` is resolved against\n * `process.cwd()`.\n */\nconst filterFilesByCwd = (\n files: readonly string[],\n cwd: string | undefined,\n): readonly string[] => {\n if (cwd === undefined) {\n return files;\n }\n\n const resolvedCwd = path.resolve(cwd);\n\n const cwdWithSep = resolvedCwd.endsWith(path.sep)\n ? resolvedCwd\n : (`${resolvedCwd}${path.sep}` as const);\n\n return files.filter((file) => {\n const absFile = path.isAbsolute(file) ? file : path.resolve(file);\n\n return absFile === resolvedCwd || absFile.startsWith(cwdWithSep);\n });\n};\n\n/**\n * Format only files that differ from the specified base branch or commit\n *\n * @param base - Base branch name or commit hash to compare against (defaults to\n * 'main')\n * @param options - Options for formatting\n * @param options.includeUntracked - Include untracked files in addition to diff\n * files (default is true)\n * @param options.includeStaged - Include staged files in addition to diff files\n * (default is true)\n * @param options.silent - Silent mode to suppress command output (default is\n * false)\n */\nexport const formatDiffFrom = async (\n base: string,\n options?: Readonly<{\n includeUntracked?: boolean;\n includeModified?: boolean;\n includeStaged?: boolean;\n silent?: boolean;\n ignoreUnknown?: boolean;\n ignore?: false | ((filePath: string) => boolean);\n /**\n * If provided, only files within this directory will be formatted.\n * Relative paths are resolved against `process.cwd()`. Defaults to\n * undefined (no filtering; all changed files in the repository are\n * formatted).\n */\n cwd?: string;\n }>,\n): Promise<\n Result<\n undefined,\n | ExecException\n | Readonly<{\n message: string;\n }>\n | readonly unknown[]\n >\n> => {\n // const silent = options?.silent ?? false;\n const {\n silent = false,\n includeUntracked = true,\n includeModified = true,\n includeStaged = true,\n ignoreUnknown = true,\n ignore,\n cwd,\n } = options ?? {};\n\n const conditionalEcho = silent ? () => {} : console.info;\n\n // Get files that differ from base branch/commit (excluding deleted files)\n const diffFromBaseResult = await getDiffFrom(base, {\n silent,\n });\n\n if (Result.isErr(diffFromBaseResult)) {\n if (!silent) {\n console.error('Error getting changed files:', diffFromBaseResult.value);\n }\n\n return diffFromBaseResult;\n }\n\n const diffFiles = diffFromBaseResult.value;\n\n const mut_allFiles: string[] = diffFiles.slice();\n\n // If includeUntracked is true, also get untracked files\n for (const { type, flag, fn } of [\n { type: 'untracked', flag: includeUntracked, fn: getUntrackedFiles },\n { type: 'modified', flag: includeModified, fn: getModifiedFiles },\n { type: 'staged', flag: includeStaged, fn: getStagedFiles },\n ]) {\n if (flag) {\n // eslint-disable-next-line no-await-in-loop\n const filesResult = await fn({ silent });\n\n if (Result.isErr(filesResult)) {\n if (!silent) {\n console.error(`Error getting ${type} files:`, filesResult.value);\n }\n\n return filesResult;\n }\n\n const files = filesResult.value;\n\n // Combine and deduplicate files\n mut_allFiles.push(...files);\n }\n }\n\n const allFiles = filterFilesByCwd(Arr.uniq(mut_allFiles), cwd);\n\n if (!silent) {\n const includedFileTypes = [\n includeUntracked ? 'untracked files' : undefined,\n includeModified ? 'modified files' : undefined,\n includeStaged ? 'staged files' : undefined,\n ].filter(isNotUndefined);\n\n const message = [\n `Formatting files that differ from ${base}`,\n includedFileTypes\n .map((s, i) =>\n i !== includedFileTypes.length - 1 ? `, ${s}` : ` and ${s}`,\n )\n .join(''),\n ].join('');\n\n conditionalEcho(`${message}:`, allFiles);\n }\n\n if (Arr.isEmpty(allFiles)) {\n conditionalEcho('No files to format');\n\n return Result.ok(undefined);\n }\n\n return formatFiles(allFiles, {\n silent,\n ignoreUnknown,\n ignore,\n });\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"format.mjs","sources":["../../src/functions/format.mts"],"sourcesContent":["import { type ExecException } from 'node:child_process';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as prettier from 'prettier';\nimport { Arr, isNotUndefined, pipe, Result } from 'ts-data-forge';\nimport { pathExists } from './assert-path-exists.mjs';\nimport {\n getDiffFrom,\n getGitRoot,\n getModifiedFiles,\n getStagedFiles,\n getUntrackedFiles,\n} from './diff.mjs';\nimport { glob } from './glob.mjs';\n\n/**\n * Format a list of files using Prettier\n *\n * @param files - Array of file paths to format\n */\nexport const formatFiles = async (\n files: readonly string[],\n options?: Readonly<{\n silent?: boolean;\n ignore?: false | ((filePath: string) => boolean);\n ignoreUnknown?: boolean;\n }>,\n): Promise<Result<undefined, readonly unknown[]>> => {\n const silent = options?.silent ?? false;\n\n const noIgnore = options?.ignore === false;\n\n const conditionalEcho = silent ? () => {} : console.info;\n\n if (Arr.isEmpty(files)) {\n conditionalEcho('No files to format');\n\n return Result.ok(undefined);\n }\n\n conditionalEcho(`Formatting ${files.length} files...`);\n\n // Get git root for display purposes\n const gitRootResult = await getGitRoot({ silent: true });\n\n const gitRoot = Result.isOk(gitRootResult) ? gitRootResult.value : undefined;\n\n // Helper function to get display path (relative to git root if available)\n const getDisplayPath = (filePath: string): string => {\n if (gitRoot === undefined) {\n return filePath;\n }\n\n const relativePath = path.relative(gitRoot, filePath);\n\n return relativePath.startsWith('..') ? filePath : relativePath;\n };\n\n // Format each file\n const results: readonly PromiseSettledResult<Result<undefined, unknown>>[] =\n // NOTE: Using Promise.allSettled to ensure all files are processed even if some fail\n await Promise.allSettled(\n files.map(async (filePath) => {\n try {\n // Check if file exists first\n if (!(await pathExists(filePath))) {\n conditionalEcho(\n `Skipping non-existent file: ${getDisplayPath(filePath)}`,\n );\n\n return Result.ok(undefined);\n }\n\n if (!noIgnore && (options?.ignore ?? defaultIgnoreFn)(filePath)) {\n conditionalEcho(\n `Skipping ignored file: ${getDisplayPath(filePath)}`,\n );\n\n return Result.ok(undefined);\n }\n\n // Check if file is ignored by prettier\n const fileInfo = await prettier.getFileInfo(filePath, {\n ignorePath: '.prettierignore',\n });\n\n if (!noIgnore && fileInfo.ignored) {\n conditionalEcho(\n `Skipping ignored file: ${getDisplayPath(filePath)}`,\n );\n\n return Result.ok(undefined);\n }\n\n if (\n !noIgnore &&\n (options?.ignoreUnknown ?? true) &&\n fileInfo.inferredParser === null\n ) {\n // Silently skip files with no parser\n conditionalEcho(\n `Skipping file (no parser): ${getDisplayPath(filePath)}`,\n );\n\n return Result.ok(undefined);\n }\n\n // Read file content\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n const content = await fs.readFile(filePath, 'utf8');\n\n // Resolve prettier config for this file\n const prettierOptions = await prettier.resolveConfig(filePath);\n\n // Format the content\n const formatted = await prettier.format(content, {\n ...prettierOptions,\n filepath: filePath,\n });\n\n // Only write if content changed\n if (formatted === content) {\n conditionalEcho(`Unchanged: ${getDisplayPath(filePath)}`);\n } else {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n await fs.writeFile(filePath, formatted, 'utf8');\n\n conditionalEcho(`Formatted: ${getDisplayPath(filePath)}`);\n }\n\n return Result.ok(undefined);\n } catch (error) {\n if (!silent) {\n console.error(\n `Error formatting ${getDisplayPath(filePath)}:`,\n error,\n );\n }\n\n return Result.err(error);\n }\n }),\n );\n\n if (results.every((r) => r.status === 'fulfilled')) {\n const fulfilled = results.map((r) => r.value);\n\n if (fulfilled.every(Result.isOk)) {\n return Result.ok(undefined);\n }\n\n return Result.err(fulfilled.filter(Result.isErr).map((r) => r.value));\n }\n\n return Result.err(\n results\n .filter((r) => r.status === 'rejected')\n .map((r): unknown => r.reason),\n );\n};\n\nconst defaultIgnoreFn = (filePath: string): boolean => {\n const filename = path.basename(filePath);\n\n return (\n ignoreFiles.has(filename) ||\n filename.startsWith('.env') ||\n ignoreExtensions.some((ext) => filePath.endsWith(ext)) ||\n pipe(filePath.split(path.sep)).map((pathSegments) =>\n pathSegments.some((segment) => ignoreDirs.includes(segment)),\n ).value\n );\n};\n\nconst ignoreFiles: ReadonlySet<string> = new Set([\n '.DS_Store',\n 'package-lock.json',\n 'yarn.lock',\n 'pnpm-lock.yaml',\n 'LICENSE',\n '.prettierignore',\n '.editorconfig',\n '.gitignore',\n '.npmignore',\n '.envrc',\n '.nvmrc',\n '.npmrc',\n]);\n\nconst ignoreExtensions: readonly `.${string}`[] = [\n '.svg',\n '.png',\n '.jpg',\n '.jpeg',\n '.gif',\n '.bmp',\n '.tiff',\n '.bak',\n '.log',\n '.zip',\n '.tar',\n '.gz',\n '.7z',\n '.mp3',\n '.mp4',\n '.avi',\n '.mkv',\n '.tsbuildinfo',\n] as const;\n\nconst ignoreDirs: readonly string[] = [\n 'node_modules',\n '.git',\n 'dist',\n 'build',\n 'out',\n '.cache',\n '.vscode',\n '.yarn',\n '.wireit',\n] as const;\n\n/**\n * Format files matching the given glob pattern using Prettier\n *\n * @param pathGlob - Glob pattern to match files\n */\nexport const formatFilesGlob = async (\n pathGlob: string,\n options?: Readonly<{\n silent?: boolean;\n ignoreUnknown?: boolean;\n ignore?: false | ((filePath: string) => boolean);\n }>,\n): Promise<Result<undefined, unknown>> => {\n const silent = options?.silent ?? false;\n\n const ignoreUnknown = options?.ignoreUnknown ?? true;\n\n const ignore = options?.ignore;\n\n const conditionalEcho = silent ? () => {} : console.info;\n\n // Find all files matching the glob\n const globResult = await glob(pathGlob, {\n absolute: true,\n ignore: ignore === false ? [] : ['**/node_modules/**', '**/.git/**'],\n dot: true,\n });\n\n if (Result.isErr(globResult)) {\n const error = globResult.value;\n\n if (!silent) {\n console.error('Error in formatFiles:', error);\n }\n\n return Result.err(error);\n }\n\n const files = globResult.value;\n\n if (Arr.isEmpty(files)) {\n conditionalEcho('No files found matching pattern:', pathGlob);\n\n return Result.ok(undefined);\n }\n\n return formatFiles(files, { silent, ignoreUnknown, ignore });\n};\n\n/**\n * Format only files that have been changed (git status)\n *\n * @param options - Options for formatting\n * @param options.cwd - If provided, only files within this directory will be\n * formatted. Relative paths are resolved against `process.cwd()`. Defaults to\n * undefined (no filtering; all changed files in the repository are\n * formatted).\n */\nexport const formatUncommittedFiles = async (\n options?: Readonly<{\n untracked?: boolean;\n modified?: boolean;\n staged?: boolean;\n silent?: boolean;\n ignoreUnknown?: boolean;\n ignore?: false | ((filePath: string) => boolean);\n cwd?: string;\n }>,\n): Promise<\n Result<\n undefined,\n ExecException | Readonly<{ message: string }> | readonly unknown[]\n >\n> => {\n const {\n untracked = true,\n modified = true,\n staged = true,\n silent = false,\n ignoreUnknown = true,\n ignore,\n cwd,\n } = options ?? {};\n\n const mut_files: string[] = [];\n\n if (untracked) {\n const untrackedFilesResult = await getUntrackedFiles({ silent });\n\n if (Result.isErr(untrackedFilesResult)) {\n if (!silent) {\n console.error(\n 'Error getting changed files:',\n untrackedFilesResult.value,\n );\n }\n\n return untrackedFilesResult;\n }\n\n mut_files.push(...untrackedFilesResult.value);\n }\n\n if (modified) {\n const diffFilesResult = await getModifiedFiles({ silent });\n\n if (Result.isErr(diffFilesResult)) {\n if (!silent) {\n console.error('Error getting changed files:', diffFilesResult.value);\n }\n\n return diffFilesResult;\n }\n\n mut_files.push(...diffFilesResult.value);\n }\n\n if (staged) {\n const stagedFilesResult = await getStagedFiles({ silent });\n\n if (Result.isErr(stagedFilesResult)) {\n if (!silent) {\n console.error('Error getting changed files:', stagedFilesResult.value);\n }\n\n return stagedFilesResult;\n }\n\n mut_files.push(...stagedFilesResult.value);\n }\n\n return formatFiles(filterFilesByCwd(Arr.uniq(mut_files), cwd), {\n silent,\n ignoreUnknown,\n ignore,\n });\n};\n\n/**\n * Filter a list of file paths to those inside `cwd`. If `cwd` is undefined,\n * returns the original list unchanged. Relative `cwd` is resolved against\n * `process.cwd()`.\n */\nconst filterFilesByCwd = (\n files: readonly string[],\n cwd: string | undefined,\n): readonly string[] => {\n if (cwd === undefined) {\n return files;\n }\n\n const resolvedCwd = path.resolve(cwd);\n\n const cwdWithSep = resolvedCwd.endsWith(path.sep)\n ? resolvedCwd\n : (`${resolvedCwd}${path.sep}` as const);\n\n return files.filter((file) => {\n const absFile = path.isAbsolute(file) ? file : path.resolve(file);\n\n return absFile === resolvedCwd || absFile.startsWith(cwdWithSep);\n });\n};\n\n/**\n * Format only files that differ from the specified base branch or commit\n *\n * @param base - Base branch name or commit hash to compare against (defaults to\n * 'main')\n * @param options - Options for formatting\n * @param options.includeUntracked - Include untracked files in addition to diff\n * files (default is true)\n * @param options.includeStaged - Include staged files in addition to diff files\n * (default is true)\n * @param options.silent - Silent mode to suppress command output (default is\n * false)\n */\nexport const formatDiffFrom = async (\n base: string,\n options?: Readonly<{\n includeUntracked?: boolean;\n includeModified?: boolean;\n includeStaged?: boolean;\n silent?: boolean;\n ignoreUnknown?: boolean;\n ignore?: false | ((filePath: string) => boolean);\n /**\n * If provided, only files within this directory will be formatted.\n * Relative paths are resolved against `process.cwd()`. Defaults to\n * undefined (no filtering; all changed files in the repository are\n * formatted).\n */\n cwd?: string;\n }>,\n): Promise<\n Result<\n undefined,\n | ExecException\n | Readonly<{\n message: string;\n }>\n | readonly unknown[]\n >\n> => {\n // const silent = options?.silent ?? false;\n const {\n silent = false,\n includeUntracked = true,\n includeModified = true,\n includeStaged = true,\n ignoreUnknown = true,\n ignore,\n cwd,\n } = options ?? {};\n\n const conditionalEcho = silent ? () => {} : console.info;\n\n // Get files that differ from base branch/commit (excluding deleted files)\n const diffFromBaseResult = await getDiffFrom(base, {\n silent,\n });\n\n if (Result.isErr(diffFromBaseResult)) {\n if (!silent) {\n console.error('Error getting changed files:', diffFromBaseResult.value);\n }\n\n return diffFromBaseResult;\n }\n\n const diffFiles = diffFromBaseResult.value;\n\n const mut_allFiles: string[] = diffFiles.slice();\n\n // If includeUntracked is true, also get untracked files\n for (const { type, flag, fn } of [\n { type: 'untracked', flag: includeUntracked, fn: getUntrackedFiles },\n { type: 'modified', flag: includeModified, fn: getModifiedFiles },\n { type: 'staged', flag: includeStaged, fn: getStagedFiles },\n ]) {\n if (!flag) {\n continue;\n }\n\n // eslint-disable-next-line no-await-in-loop\n const filesResult = await fn({ silent });\n\n if (Result.isErr(filesResult)) {\n if (!silent) {\n console.error(`Error getting ${type} files:`, filesResult.value);\n }\n\n return filesResult;\n }\n\n const files = filesResult.value;\n\n // Combine and deduplicate files\n mut_allFiles.push(...files);\n }\n\n const allFiles = filterFilesByCwd(Arr.uniq(mut_allFiles), cwd);\n\n if (!silent) {\n const includedFileTypes = [\n includeUntracked ? 'untracked files' : undefined,\n includeModified ? 'modified files' : undefined,\n includeStaged ? 'staged files' : undefined,\n ].filter(isNotUndefined);\n\n const message = [\n `Formatting files that differ from ${base}`,\n includedFileTypes\n .map((s, i) =>\n i !== includedFileTypes.length - 1 ? `, ${s}` : ` and ${s}`,\n )\n .join(''),\n ].join('');\n\n conditionalEcho(`${message}:`, allFiles);\n }\n\n if (Arr.isEmpty(allFiles)) {\n conditionalEcho('No files to format');\n\n return Result.ok(undefined);\n }\n\n return formatFiles(allFiles, {\n silent,\n ignoreUnknown,\n ignore,\n });\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import type * as fsWalk from '@nodelib/fs.walk';
|
|
2
2
|
import fastGlob from 'fast-glob';
|
|
3
3
|
import { Result } from 'ts-data-forge';
|
|
4
|
-
import { type DeepReadonly } from 'ts-type-forge';
|
|
4
|
+
import { type DeepReadonly, type StrictPick } from 'ts-type-forge';
|
|
5
5
|
type EntryInternal = DeepReadonly<fsWalk.Entry>;
|
|
6
6
|
type PatternInternal = string;
|
|
7
7
|
type OptionsInternal = DeepReadonly<fastGlob.Options>;
|
|
8
8
|
type EntryObjectModePredicate = Readonly<{
|
|
9
|
-
[TKey in keyof
|
|
9
|
+
[TKey in keyof StrictPick<OptionsInternal, 'objectMode'>]-?: true;
|
|
10
10
|
}>;
|
|
11
11
|
type EntryStatsPredicate = Readonly<{
|
|
12
|
-
[TKey in keyof
|
|
12
|
+
[TKey in keyof StrictPick<OptionsInternal, 'stats'>]-?: true;
|
|
13
13
|
}>;
|
|
14
14
|
type EntryObjectPredicate = EntryObjectModePredicate | EntryStatsPredicate;
|
|
15
15
|
export declare function glob(source: PatternInternal | readonly PatternInternal[], options: OptionsInternal & EntryObjectPredicate): Promise<Result<readonly EntryInternal[], unknown>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glob.d.mts","sourceRoot":"","sources":["../../src/functions/glob.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAChD,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,EAAgC,MAAM,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"glob.d.mts","sourceRoot":"","sources":["../../src/functions/glob.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAChD,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,EAAgC,MAAM,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAEnE,KAAK,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAEhD,KAAK,eAAe,GAAG,MAAM,CAAC;AAE9B,KAAK,eAAe,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAEtD,KAAK,wBAAwB,GAAG,QAAQ,CAAC;KACtC,IAAI,IAAI,MAAM,UAAU,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;CAClE,CAAC,CAAC;AAEH,KAAK,mBAAmB,GAAG,QAAQ,CAAC;KACjC,IAAI,IAAI,MAAM,UAAU,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;CAC7D,CAAC,CAAC;AAEH,KAAK,oBAAoB,GAAG,wBAAwB,GAAG,mBAAmB,CAAC;AAE3E,wBAAsB,IAAI,CACxB,MAAM,EAAE,eAAe,GAAG,SAAS,eAAe,EAAE,EACpD,OAAO,EAAE,eAAe,GAAG,oBAAoB,GAC9C,OAAO,CAAC,MAAM,CAAC,SAAS,aAAa,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;AAEtD,wBAAsB,IAAI,CACxB,MAAM,EAAE,eAAe,GAAG,SAAS,eAAe,EAAE,EACpD,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,MAAM,CAAC,SAAS,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glob.mjs","sources":["../../src/functions/glob.mts"],"sourcesContent":["import type * as fsWalk from '@nodelib/fs.walk';\nimport fastGlob from 'fast-glob';\nimport { castDeepMutable, castMutable, Result } from 'ts-data-forge';\nimport { type DeepReadonly } from 'ts-type-forge';\n\ntype EntryInternal = DeepReadonly<fsWalk.Entry>;\n\ntype PatternInternal = string;\n\ntype OptionsInternal = DeepReadonly<fastGlob.Options>;\n\ntype EntryObjectModePredicate = Readonly<{\n [TKey in keyof
|
|
1
|
+
{"version":3,"file":"glob.mjs","sources":["../../src/functions/glob.mts"],"sourcesContent":["import type * as fsWalk from '@nodelib/fs.walk';\nimport fastGlob from 'fast-glob';\nimport { castDeepMutable, castMutable, Result } from 'ts-data-forge';\nimport { type DeepReadonly, type StrictPick } from 'ts-type-forge';\n\ntype EntryInternal = DeepReadonly<fsWalk.Entry>;\n\ntype PatternInternal = string;\n\ntype OptionsInternal = DeepReadonly<fastGlob.Options>;\n\ntype EntryObjectModePredicate = Readonly<{\n [TKey in keyof StrictPick<OptionsInternal, 'objectMode'>]-?: true;\n}>;\n\ntype EntryStatsPredicate = Readonly<{\n [TKey in keyof StrictPick<OptionsInternal, 'stats'>]-?: true;\n}>;\n\ntype EntryObjectPredicate = EntryObjectModePredicate | EntryStatsPredicate;\n\nexport async function glob(\n source: PatternInternal | readonly PatternInternal[],\n options: OptionsInternal & EntryObjectPredicate,\n): Promise<Result<readonly EntryInternal[], unknown>>;\n\nexport async function glob(\n source: PatternInternal | readonly PatternInternal[],\n options?: OptionsInternal,\n): Promise<Result<readonly string[], unknown>>;\n\nexport async function glob(\n source: PatternInternal | readonly PatternInternal[],\n options?: OptionsInternal,\n): Promise<Result<readonly string[] | readonly EntryInternal[], unknown>> {\n try {\n const result = await fastGlob(\n castMutable(source),\n castDeepMutable(options),\n );\n\n return Result.ok(result);\n } catch (error) {\n return Result.err(error);\n }\n}\n"],"names":[],"mappings":";;;AA+BA,eAAsB,IAAA,CACpB,QACA,OAAA,EACwE;AACxE,EAAA,IAAI;AACF,IAAA,MAAM,SAAS,MAAM,QAAA;AAAA,MACnB,YAAY,MAAM,CAAA;AAAA,MAClB,gBAAgB,OAAO;AAAA,KACzB;AAEA,IAAA,OAAO,MAAA,CAAO,GAAG,MAAM,CAAA;AAAA,EACzB,SAAS,KAAA,EAAO;AACd,IAAA,OAAO,MAAA,CAAO,IAAI,KAAK,CAAA;AAAA,EACzB;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute-parallel.d.mts","sourceRoot":"","sources":["../../../src/functions/workspace-utils/execute-parallel.mts"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAI3C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,eAAe,aAChB,SAAS,OAAO,EAAE,cAChB,MAAM,gBACL,MAAM,KAClB,OAAO,CAAC,SAAS,QAAQ,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,EAAE,CAoEnE,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,aAAa,aACd,SAAS,OAAO,EAAE,cAChB,MAAM,gBACL,MAAM,KAClB,OAAO,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"execute-parallel.d.mts","sourceRoot":"","sources":["../../../src/functions/workspace-utils/execute-parallel.mts"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAI3C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,eAAe,aAChB,SAAS,OAAO,EAAE,cAChB,MAAM,gBACL,MAAM,KAClB,OAAO,CAAC,SAAS,QAAQ,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,EAAE,CAoEnE,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,aAAa,aACd,SAAS,OAAO,EAAE,cAChB,MAAM,gBACL,MAAM,KAClB,OAAO,CAAC,IAAI,CA8Dd,CAAC"}
|
|
@@ -61,22 +61,23 @@ Executing ${scriptName} in ${mut_stages.length} stages (fail-fast mode)...
|
|
|
61
61
|
`
|
|
62
62
|
);
|
|
63
63
|
for (const [i, stage] of mut_stages.entries()) {
|
|
64
|
-
if (Arr.isNonEmpty(stage)) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
64
|
+
if (!Arr.isNonEmpty(stage)) {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
console.info(`Stage ${i + 1}: ${stage.map((p) => p.name).join(", ")}`);
|
|
68
|
+
try {
|
|
69
|
+
const results = await executeParallel(stage, scriptName, concurrency);
|
|
70
|
+
console.info(
|
|
71
|
+
`\u2705 Stage ${i + 1} completed successfully (${results.length}/${stage.length} packages)`
|
|
72
|
+
);
|
|
73
|
+
} catch (error) {
|
|
74
|
+
const errorMessage = isError(error) ? error.message : String(error);
|
|
75
|
+
console.error(`
|
|
74
76
|
\u274C Stage ${i + 1} failed (fail-fast):`);
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
77
|
+
console.error(errorMessage);
|
|
78
|
+
throw new Error(`Stage ${i + 1} failed: ${errorMessage}`, {
|
|
79
|
+
cause: error
|
|
80
|
+
});
|
|
80
81
|
}
|
|
81
82
|
}
|
|
82
83
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute-parallel.mjs","sources":["../../../src/functions/workspace-utils/execute-parallel.mts"],"sourcesContent":["/* eslint-disable require-atomic-updates */\nimport { isError } from '@sindresorhus/is';\nimport { spawn } from 'node:child_process';\nimport {\n Arr,\n createPromise,\n hasKey,\n isNotUndefined,\n isRecord,\n pipe,\n Result,\n} from 'ts-data-forge';\nimport { type Package } from './types.mjs';\n\nconst DEBUG = false as boolean;\n\n/**\n * Executes a npm script across multiple packages in parallel with a concurrency\n * limit. Uses fail-fast behavior - stops execution immediately when any package\n * fails.\n *\n * @param packages - Array of Package objects to execute the script in\n * @param scriptName - The name of the npm script to execute\n * @param concurrency - Maximum number of packages to process simultaneously\n * (default: 3)\n * @returns A promise that resolves to an array of execution results, or rejects\n * immediately on first failure\n */\nexport const executeParallel = async (\n packages: readonly Package[],\n scriptName: string,\n concurrency: number = 3,\n): Promise<readonly Readonly<{ code?: number; skipped?: boolean }>[]> => {\n const mut_resultPromises: Promise<\n Readonly<{ code?: number; skipped?: boolean }>\n >[] = [];\n\n const mut_executing = new Set<Promise<unknown>>();\n\n let mut_failed = false as boolean;\n\n for (const pkg of packages) {\n // Stop starting new processes if any has failed\n if (mut_failed) {\n break;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-loop-func\n const promise = executeScript(pkg, scriptName).then((result) => {\n // Check for failure immediately\n if (Result.isErr(result)) {\n mut_failed = true;\n\n throw result.value; // Throw the error to trigger fail-fast\n }\n\n return result.value; // Return the unwrapped value for success\n });\n\n mut_resultPromises.push(promise);\n\n const wrappedPromise = promise\n // eslint-disable-next-line @typescript-eslint/no-loop-func\n .catch((error: unknown) => {\n mut_failed = true;\n\n throw error; // Re-throw to ensure fail-fast propagation\n })\n .finally(() => {\n mut_executing.delete(wrappedPromise);\n\n if (DEBUG) {\n console.debug('executing size', mut_executing.size);\n }\n });\n\n mut_executing.add(wrappedPromise);\n\n if (DEBUG) {\n console.debug('executing size', mut_executing.size);\n }\n\n // If we reach concurrency limit, wait for one to finish\n if (mut_executing.size >= concurrency) {\n try {\n // eslint-disable-next-line no-await-in-loop\n await Promise.race(mut_executing);\n } catch (error) {\n // If any process fails, cancel remaining processes and throw immediately\n // eslint-disable-next-line no-useless-assignment\n mut_failed = true;\n\n throw error;\n }\n }\n }\n\n // Wait for all started processes to complete\n // This will throw immediately if any process fails (fail-fast)\n return Promise.all(mut_resultPromises);\n};\n\n/**\n * Executes a npm script across packages in dependency order stages. Packages\n * are grouped into stages where each stage contains packages whose dependencies\n * have been completed in previous stages. Uses fail-fast behavior - stops\n * execution immediately when any package fails.\n *\n * @param packages - Array of Package objects to execute the script in\n * @param scriptName - The name of the npm script to execute\n * @param concurrency - Maximum number of packages to process simultaneously\n * within each stage (default: 3)\n * @returns A promise that resolves when all stages are complete, or rejects\n * immediately on first failure\n */\nexport const executeStages = async (\n packages: readonly Package[],\n scriptName: string,\n concurrency: number = 3,\n): Promise<void> => {\n const dependencyGraph = buildDependencyGraph(packages);\n\n const sorted = topologicalSortPackages(packages, dependencyGraph);\n\n const mut_stages: (readonly Package[])[] = [];\n\n const mut_completed = new Set<string>();\n\n while (mut_completed.size < sorted.length) {\n const stage = sorted.filter(\n (pkg) =>\n !mut_completed.has(pkg.name) &&\n (dependencyGraph.get(pkg.name) ?? []).every((dep) =>\n mut_completed.has(dep),\n ),\n );\n\n if (Arr.isEmpty(stage)) {\n throw new Error('Circular dependency detected');\n }\n\n mut_stages.push(stage);\n\n for (const pkg of stage) {\n mut_completed.add(pkg.name);\n }\n }\n\n console.info(\n `\\nExecuting ${scriptName} in ${mut_stages.length} stages (fail-fast mode)...\\n`,\n );\n\n for (const [i, stage] of mut_stages.entries()) {\n if (Arr.isNonEmpty(stage)) {\n console.info(`Stage ${i + 1}: ${stage.map((p) => p.name).join(', ')}`);\n\n try {\n // eslint-disable-next-line no-await-in-loop\n const results = await executeParallel(stage, scriptName, concurrency);\n\n // Log successful completion of the stage\n // All results are successful because executeParallel throws on any failure\n console.info(\n `✅ Stage ${i + 1} completed successfully (${results.length}/${stage.length} packages)`,\n );\n } catch (error) {\n // executeParallel will throw immediately on any failure (fail-fast)\n const errorMessage = isError(error) ? error.message : String(error);\n\n console.error(`\\n❌ Stage ${i + 1} failed (fail-fast):`);\n\n console.error(errorMessage);\n\n throw new Error(`Stage ${i + 1} failed: ${errorMessage}`, {\n cause: error,\n });\n }\n }\n }\n};\n\n/**\n * Executes a npm script in a specific package directory.\n *\n * @param pkg - The package object containing path and metadata\n * @param scriptName - The name of the npm script to execute\n * @param options - Configuration options\n * @param options.prefix - Whether to prefix output with package name (default:\n * true)\n * @returns A promise that resolves to execution result with exit code or\n * skipped flag\n */\nconst executeScript = (\n pkg: Package,\n scriptName: string,\n { prefix = true }: Readonly<{ prefix?: boolean }> = {},\n): Promise<Result<Readonly<{ code?: number; skipped?: boolean }>, Error>> =>\n pipe(\n createPromise(\n (\n resolve: (\n value: Readonly<{ code?: number; skipped?: boolean }>,\n ) => void,\n reject: (reason: unknown) => void,\n ) => {\n const packageJsonScripts =\n isRecord(pkg.packageJson) && isRecord(pkg.packageJson['scripts'])\n ? pkg.packageJson['scripts']\n : ({} as const);\n\n const hasScript = hasKey(packageJsonScripts, scriptName);\n\n if (!hasScript) {\n resolve({ skipped: true });\n\n return;\n }\n\n const prefixStr = prefix ? (`[${pkg.name}] ` as const) : '';\n\n const proc = spawn('npm', ['run', scriptName], {\n cwd: pkg.path,\n shell: true,\n stdio: 'pipe',\n });\n\n proc.stdout.on('data', (data: Readonly<Buffer>) => {\n process.stdout.write(prefixStr + data.toString());\n });\n\n proc.stderr.on('data', (data: Readonly<Buffer>) => {\n process.stderr.write(prefixStr + data.toString());\n });\n\n proc.on('close', (code: number | null) => {\n if (DEBUG) {\n console.debug(`${pkg.name} process closed with code: ${code}`);\n }\n\n if (code === 0 || code === null) {\n resolve({ code: code ?? 0 });\n } else {\n reject(new Error(`${pkg.name} exited with code ${code}`));\n }\n });\n\n proc.on('error', reject);\n },\n ),\n ).map((result) =>\n result.then(\n Result.mapErr((err) => {\n const errorMessage: string = isError(err)\n ? err.message\n : isRecord(err) && hasKey(err, 'message')\n ? (err.message?.toString() ?? 'Unknown error message')\n : 'Unknown error';\n\n console.error(`\\nError in ${pkg.name}:`, errorMessage);\n\n return isError(err) ? err : new Error(errorMessage);\n }),\n ),\n ).value;\n\n/**\n * Performs a topological sort on packages based on their dependencies, ensuring\n * dependencies are ordered before their dependents.\n *\n * @param packages - Array of Package objects to sort\n * @returns An array of packages in dependency order (dependencies first)\n */\nconst topologicalSortPackages = (\n packages: readonly Package[],\n dependencyGraph: ReadonlyMap<string, readonly string[]>,\n): readonly Package[] => {\n const mut_visited = new Set<string>();\n\n const mut_result: string[] = [];\n\n const packageMap = new Map(packages.map((p) => [p.name, p]));\n\n const visit = (pkgName: string): void => {\n if (mut_visited.has(pkgName)) return;\n\n mut_visited.add(pkgName);\n\n const deps = dependencyGraph.get(pkgName) ?? [];\n\n for (const dep of deps) {\n visit(dep);\n }\n\n mut_result.push(pkgName);\n };\n\n for (const pkg of packages) {\n visit(pkg.name);\n }\n\n return mut_result\n .map((pkgName) => packageMap.get(pkgName))\n .filter(isNotUndefined);\n};\n\n/**\n * Builds a dependency graph from the given packages, mapping each package name\n * to its internal workspace dependencies.\n *\n * @param packages - Array of Package objects to analyze\n * @returns A readonly map where keys are package names and values are arrays of\n * their dependency package names\n */\nconst buildDependencyGraph = (\n packages: readonly Package[],\n): ReadonlyMap<string, readonly string[]> => {\n const packageMap = new Map(packages.map((p) => [p.name, p]));\n\n const mut_graph = new Map<string, readonly string[]>();\n\n for (const pkg of packages) {\n const deps = Object.keys(pkg.dependencies).filter((depName) =>\n packageMap.has(depName),\n );\n\n mut_graph.set(pkg.name, deps);\n }\n\n return mut_graph;\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"execute-parallel.mjs","sources":["../../../src/functions/workspace-utils/execute-parallel.mts"],"sourcesContent":["/* eslint-disable require-atomic-updates */\nimport { isError } from '@sindresorhus/is';\nimport { spawn } from 'node:child_process';\nimport {\n Arr,\n createPromise,\n hasKey,\n isNotUndefined,\n isRecord,\n pipe,\n Result,\n} from 'ts-data-forge';\nimport { type Package } from './types.mjs';\n\nconst DEBUG = false as boolean;\n\n/**\n * Executes a npm script across multiple packages in parallel with a concurrency\n * limit. Uses fail-fast behavior - stops execution immediately when any package\n * fails.\n *\n * @param packages - Array of Package objects to execute the script in\n * @param scriptName - The name of the npm script to execute\n * @param concurrency - Maximum number of packages to process simultaneously\n * (default: 3)\n * @returns A promise that resolves to an array of execution results, or rejects\n * immediately on first failure\n */\nexport const executeParallel = async (\n packages: readonly Package[],\n scriptName: string,\n concurrency: number = 3,\n): Promise<readonly Readonly<{ code?: number; skipped?: boolean }>[]> => {\n const mut_resultPromises: Promise<\n Readonly<{ code?: number; skipped?: boolean }>\n >[] = [];\n\n const mut_executing = new Set<Promise<unknown>>();\n\n let mut_failed = false as boolean;\n\n for (const pkg of packages) {\n // Stop starting new processes if any has failed\n if (mut_failed) {\n break;\n }\n\n // eslint-disable-next-line no-loop-func\n const promise = executeScript(pkg, scriptName).then((result) => {\n // Check for failure immediately\n if (Result.isErr(result)) {\n mut_failed = true;\n\n throw result.value; // Throw the error to trigger fail-fast\n }\n\n return result.value; // Return the unwrapped value for success\n });\n\n mut_resultPromises.push(promise);\n\n const wrappedPromise = promise\n // eslint-disable-next-line no-loop-func\n .catch((error: unknown) => {\n mut_failed = true;\n\n throw error; // Re-throw to ensure fail-fast propagation\n })\n .finally(() => {\n mut_executing.delete(wrappedPromise);\n\n if (DEBUG) {\n console.debug('executing size', mut_executing.size);\n }\n });\n\n mut_executing.add(wrappedPromise);\n\n if (DEBUG) {\n console.debug('executing size', mut_executing.size);\n }\n\n // If we reach concurrency limit, wait for one to finish\n if (mut_executing.size >= concurrency) {\n try {\n // eslint-disable-next-line no-await-in-loop\n await Promise.race(mut_executing);\n } catch (error) {\n // If any process fails, cancel remaining processes and throw immediately\n // eslint-disable-next-line no-useless-assignment\n mut_failed = true;\n\n throw error;\n }\n }\n }\n\n // Wait for all started processes to complete\n // This will throw immediately if any process fails (fail-fast)\n return Promise.all(mut_resultPromises);\n};\n\n/**\n * Executes a npm script across packages in dependency order stages. Packages\n * are grouped into stages where each stage contains packages whose dependencies\n * have been completed in previous stages. Uses fail-fast behavior - stops\n * execution immediately when any package fails.\n *\n * @param packages - Array of Package objects to execute the script in\n * @param scriptName - The name of the npm script to execute\n * @param concurrency - Maximum number of packages to process simultaneously\n * within each stage (default: 3)\n * @returns A promise that resolves when all stages are complete, or rejects\n * immediately on first failure\n */\nexport const executeStages = async (\n packages: readonly Package[],\n scriptName: string,\n concurrency: number = 3,\n): Promise<void> => {\n const dependencyGraph = buildDependencyGraph(packages);\n\n const sorted = topologicalSortPackages(packages, dependencyGraph);\n\n const mut_stages: (readonly Package[])[] = [];\n\n const mut_completed = new Set<string>();\n\n while (mut_completed.size < sorted.length) {\n const stage = sorted.filter(\n (pkg) =>\n !mut_completed.has(pkg.name) &&\n (dependencyGraph.get(pkg.name) ?? []).every((dep) =>\n mut_completed.has(dep),\n ),\n );\n\n if (Arr.isEmpty(stage)) {\n throw new Error('Circular dependency detected');\n }\n\n mut_stages.push(stage);\n\n for (const pkg of stage) {\n mut_completed.add(pkg.name);\n }\n }\n\n console.info(\n `\\nExecuting ${scriptName} in ${mut_stages.length} stages (fail-fast mode)...\\n`,\n );\n\n for (const [i, stage] of mut_stages.entries()) {\n if (!Arr.isNonEmpty(stage)) {\n continue;\n }\n\n console.info(`Stage ${i + 1}: ${stage.map((p) => p.name).join(', ')}`);\n\n try {\n // eslint-disable-next-line no-await-in-loop\n const results = await executeParallel(stage, scriptName, concurrency);\n\n // Log successful completion of the stage\n // All results are successful because executeParallel throws on any failure\n console.info(\n `✅ Stage ${i + 1} completed successfully (${results.length}/${stage.length} packages)`,\n );\n } catch (error) {\n // executeParallel will throw immediately on any failure (fail-fast)\n const errorMessage = isError(error) ? error.message : String(error);\n\n console.error(`\\n❌ Stage ${i + 1} failed (fail-fast):`);\n\n console.error(errorMessage);\n\n throw new Error(`Stage ${i + 1} failed: ${errorMessage}`, {\n cause: error,\n });\n }\n }\n};\n\n/**\n * Executes a npm script in a specific package directory.\n *\n * @param pkg - The package object containing path and metadata\n * @param scriptName - The name of the npm script to execute\n * @param options - Configuration options\n * @param options.prefix - Whether to prefix output with package name (default:\n * true)\n * @returns A promise that resolves to execution result with exit code or\n * skipped flag\n */\nconst executeScript = (\n pkg: Package,\n scriptName: string,\n { prefix = true }: Readonly<{ prefix?: boolean }> = {},\n): Promise<Result<Readonly<{ code?: number; skipped?: boolean }>, Error>> =>\n pipe(\n createPromise(\n (\n resolve: (\n value: Readonly<{ code?: number; skipped?: boolean }>,\n ) => void,\n reject: (reason: unknown) => void,\n ) => {\n const packageJsonScripts =\n isRecord(pkg.packageJson) && isRecord(pkg.packageJson['scripts'])\n ? pkg.packageJson['scripts']\n : ({} as const);\n\n const hasScript = hasKey(packageJsonScripts, scriptName);\n\n if (!hasScript) {\n resolve({ skipped: true });\n\n return;\n }\n\n const prefixStr = prefix ? (`[${pkg.name}] ` as const) : '';\n\n const proc = spawn('npm', ['run', scriptName], {\n cwd: pkg.path,\n shell: true,\n stdio: 'pipe',\n });\n\n proc.stdout.on('data', (data: Readonly<Buffer>) => {\n process.stdout.write(prefixStr + data.toString());\n });\n\n proc.stderr.on('data', (data: Readonly<Buffer>) => {\n process.stderr.write(prefixStr + data.toString());\n });\n\n proc.on('close', (code: number | null) => {\n if (DEBUG) {\n console.debug(`${pkg.name} process closed with code: ${code}`);\n }\n\n if (code === 0 || code === null) {\n resolve({ code: code ?? 0 });\n } else {\n reject(new Error(`${pkg.name} exited with code ${code}`));\n }\n });\n\n proc.on('error', reject);\n },\n ),\n ).map((result) =>\n result.then(\n Result.mapErr((err) => {\n const errorMessage: string = isError(err)\n ? err.message\n : isRecord(err) && hasKey(err, 'message')\n ? (err.message?.toString() ?? 'Unknown error message')\n : 'Unknown error';\n\n console.error(`\\nError in ${pkg.name}:`, errorMessage);\n\n return isError(err) ? err : new Error(errorMessage);\n }),\n ),\n ).value;\n\n/**\n * Performs a topological sort on packages based on their dependencies, ensuring\n * dependencies are ordered before their dependents.\n *\n * @param packages - Array of Package objects to sort\n * @returns An array of packages in dependency order (dependencies first)\n */\nconst topologicalSortPackages = (\n packages: readonly Package[],\n dependencyGraph: ReadonlyMap<string, readonly string[]>,\n): readonly Package[] => {\n const mut_visited = new Set<string>();\n\n const mut_result: string[] = [];\n\n const packageMap = new Map(packages.map((p) => [p.name, p]));\n\n const visit = (pkgName: string): void => {\n if (mut_visited.has(pkgName)) return;\n\n mut_visited.add(pkgName);\n\n const deps = dependencyGraph.get(pkgName) ?? [];\n\n for (const dep of deps) {\n visit(dep);\n }\n\n mut_result.push(pkgName);\n };\n\n for (const pkg of packages) {\n visit(pkg.name);\n }\n\n return mut_result\n .map((pkgName) => packageMap.get(pkgName))\n .filter(isNotUndefined);\n};\n\n/**\n * Builds a dependency graph from the given packages, mapping each package name\n * to its internal workspace dependencies.\n *\n * @param packages - Array of Package objects to analyze\n * @returns A readonly map where keys are package names and values are arrays of\n * their dependency package names\n */\nconst buildDependencyGraph = (\n packages: readonly Package[],\n): ReadonlyMap<string, readonly string[]> => {\n const packageMap = new Map(packages.map((p) => [p.name, p]));\n\n const mut_graph = new Map<string, readonly string[]>();\n\n for (const pkg of packages) {\n const deps = Object.keys(pkg.dependencies).filter((depName) =>\n packageMap.has(depName),\n );\n\n mut_graph.set(pkg.name, deps);\n }\n\n return mut_graph;\n};\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ts-repo-utils",
|
|
3
|
-
"version": "10.1.
|
|
3
|
+
"version": "10.1.8",
|
|
4
4
|
"private": false,
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript"
|
|
@@ -96,9 +96,9 @@
|
|
|
96
96
|
"cmd-ts": "^0.15.0",
|
|
97
97
|
"fast-glob": "^3.3.3",
|
|
98
98
|
"micromatch": "^4.0.8",
|
|
99
|
-
"ts-data-forge": "^14.
|
|
100
|
-
"ts-type-forge": "^9.1.
|
|
101
|
-
"tsx": "^4.23.
|
|
99
|
+
"ts-data-forge": "^14.1.0",
|
|
100
|
+
"ts-type-forge": "^9.1.3",
|
|
101
|
+
"tsx": "^4.23.4"
|
|
102
102
|
},
|
|
103
103
|
"devDependencies": {
|
|
104
104
|
"@rollup/plugin-replace": "6.0.3",
|
|
@@ -110,7 +110,7 @@
|
|
|
110
110
|
"@semantic-release/github": "12.0.9",
|
|
111
111
|
"@semantic-release/npm": "13.1.5",
|
|
112
112
|
"@semantic-release/release-notes-generator": "14.1.1",
|
|
113
|
-
"@types/node": "26.
|
|
113
|
+
"@types/node": "26.2.0",
|
|
114
114
|
"@vitest/coverage-v8": "4.1.10",
|
|
115
115
|
"@vitest/ui": "4.1.10",
|
|
116
116
|
"conventional-changelog-conventionalcommits": "10.2.1",
|
|
@@ -118,28 +118,28 @@
|
|
|
118
118
|
"dedent": "1.7.2",
|
|
119
119
|
"esbuild": "0.28.1",
|
|
120
120
|
"eslint": "10.8.0",
|
|
121
|
-
"eslint-config-typed": "5.8.
|
|
122
|
-
"eslint-plugin-ts-data-forge": "0.
|
|
123
|
-
"eslint-plugin-ts-fortress": "0.
|
|
124
|
-
"eslint-plugin-ts-type-forge": "0.
|
|
125
|
-
"github-settings-as-code": "2.0
|
|
121
|
+
"eslint-config-typed": "5.8.4",
|
|
122
|
+
"eslint-plugin-ts-data-forge": "0.4.2",
|
|
123
|
+
"eslint-plugin-ts-fortress": "1.0.0",
|
|
124
|
+
"eslint-plugin-ts-type-forge": "0.6.1",
|
|
125
|
+
"github-settings-as-code": "2.1.0",
|
|
126
126
|
"jiti": "2.7.0",
|
|
127
127
|
"markdownlint": "0.41.1",
|
|
128
128
|
"markdownlint-cli2": "0.23.2",
|
|
129
|
-
"npm-run-all2": "9.0.
|
|
129
|
+
"npm-run-all2": "9.0.3",
|
|
130
130
|
"prettier": "3.9.6",
|
|
131
131
|
"prettier-plugin-organize-imports": "4.3.0",
|
|
132
132
|
"prettier-plugin-packagejson": "3.0.2",
|
|
133
|
-
"rollup": "4.62.
|
|
133
|
+
"rollup": "4.62.4",
|
|
134
134
|
"rollup-plugin-esbuild": "6.2.1",
|
|
135
135
|
"semantic-release": "25.0.8",
|
|
136
|
-
"ts-codemod-lib": "2.2.
|
|
137
|
-
"ts-repo-utils": "10.1.
|
|
136
|
+
"ts-codemod-lib": "2.2.4",
|
|
137
|
+
"ts-repo-utils": "10.1.7",
|
|
138
138
|
"typedoc": "0.28.20",
|
|
139
139
|
"typedoc-github-theme": "0.4.0",
|
|
140
140
|
"typescript": "6.0.3",
|
|
141
141
|
"typescript-native": "npm:typescript@7.0.2",
|
|
142
|
-
"vite": "8.
|
|
142
|
+
"vite": "8.2.0",
|
|
143
143
|
"vitest": "4.1.10"
|
|
144
144
|
},
|
|
145
145
|
"peerDependencies": {
|
package/src/cmd/gen-index-ts.mts
CHANGED
|
@@ -349,24 +349,27 @@ describe('exec-async', () => {
|
|
|
349
349
|
// we need to check the type at runtime
|
|
350
350
|
const randomEncoding = Math.random() > 0.5 ? 'utf8' : 'buffer';
|
|
351
351
|
|
|
352
|
+
// NOTE: the two branches look alike but `randomEncoding` is narrowed
|
|
353
|
+
// differently in each, so the results have different types and the
|
|
354
|
+
// declarations must stay inside their branches.
|
|
352
355
|
if (randomEncoding === 'buffer') {
|
|
353
|
-
const
|
|
356
|
+
const _resultBuffer = await $('echo "test"', {
|
|
354
357
|
encoding: randomEncoding,
|
|
355
358
|
silent: true,
|
|
356
359
|
});
|
|
357
360
|
|
|
358
361
|
expectType<
|
|
359
|
-
typeof
|
|
362
|
+
typeof _resultBuffer,
|
|
360
363
|
Result<Readonly<{ stdout: Buffer; stderr: Buffer }>, ExecException>
|
|
361
364
|
>('=');
|
|
362
365
|
} else {
|
|
363
|
-
const
|
|
366
|
+
const _resultUtf8 = await $('echo "test"', {
|
|
364
367
|
encoding: randomEncoding,
|
|
365
368
|
silent: true,
|
|
366
369
|
});
|
|
367
370
|
|
|
368
371
|
expectType<
|
|
369
|
-
typeof
|
|
372
|
+
typeof _resultUtf8,
|
|
370
373
|
Result<Readonly<{ stdout: string; stderr: string }>, ExecException>
|
|
371
374
|
>('=');
|
|
372
375
|
}
|
package/src/functions/format.mts
CHANGED
|
@@ -460,23 +460,25 @@ export const formatDiffFrom = async (
|
|
|
460
460
|
{ type: 'modified', flag: includeModified, fn: getModifiedFiles },
|
|
461
461
|
{ type: 'staged', flag: includeStaged, fn: getStagedFiles },
|
|
462
462
|
]) {
|
|
463
|
-
if (flag) {
|
|
464
|
-
|
|
465
|
-
|
|
463
|
+
if (!flag) {
|
|
464
|
+
continue;
|
|
465
|
+
}
|
|
466
466
|
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
console.error(`Error getting ${type} files:`, filesResult.value);
|
|
470
|
-
}
|
|
467
|
+
// eslint-disable-next-line no-await-in-loop
|
|
468
|
+
const filesResult = await fn({ silent });
|
|
471
469
|
|
|
472
|
-
|
|
470
|
+
if (Result.isErr(filesResult)) {
|
|
471
|
+
if (!silent) {
|
|
472
|
+
console.error(`Error getting ${type} files:`, filesResult.value);
|
|
473
473
|
}
|
|
474
474
|
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
// Combine and deduplicate files
|
|
478
|
-
mut_allFiles.push(...files);
|
|
475
|
+
return filesResult;
|
|
479
476
|
}
|
|
477
|
+
|
|
478
|
+
const files = filesResult.value;
|
|
479
|
+
|
|
480
|
+
// Combine and deduplicate files
|
|
481
|
+
mut_allFiles.push(...files);
|
|
480
482
|
}
|
|
481
483
|
|
|
482
484
|
const allFiles = filterFilesByCwd(Arr.uniq(mut_allFiles), cwd);
|
package/src/functions/glob.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type * as fsWalk from '@nodelib/fs.walk';
|
|
2
2
|
import fastGlob from 'fast-glob';
|
|
3
3
|
import { castDeepMutable, castMutable, Result } from 'ts-data-forge';
|
|
4
|
-
import { type DeepReadonly } from 'ts-type-forge';
|
|
4
|
+
import { type DeepReadonly, type StrictPick } from 'ts-type-forge';
|
|
5
5
|
|
|
6
6
|
type EntryInternal = DeepReadonly<fsWalk.Entry>;
|
|
7
7
|
|
|
@@ -10,11 +10,11 @@ type PatternInternal = string;
|
|
|
10
10
|
type OptionsInternal = DeepReadonly<fastGlob.Options>;
|
|
11
11
|
|
|
12
12
|
type EntryObjectModePredicate = Readonly<{
|
|
13
|
-
[TKey in keyof
|
|
13
|
+
[TKey in keyof StrictPick<OptionsInternal, 'objectMode'>]-?: true;
|
|
14
14
|
}>;
|
|
15
15
|
|
|
16
16
|
type EntryStatsPredicate = Readonly<{
|
|
17
|
-
[TKey in keyof
|
|
17
|
+
[TKey in keyof StrictPick<OptionsInternal, 'stats'>]-?: true;
|
|
18
18
|
}>;
|
|
19
19
|
|
|
20
20
|
type EntryObjectPredicate = EntryObjectModePredicate | EntryStatsPredicate;
|
|
@@ -45,7 +45,7 @@ export const executeParallel = async (
|
|
|
45
45
|
break;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
// eslint-disable-next-line
|
|
48
|
+
// eslint-disable-next-line no-loop-func
|
|
49
49
|
const promise = executeScript(pkg, scriptName).then((result) => {
|
|
50
50
|
// Check for failure immediately
|
|
51
51
|
if (Result.isErr(result)) {
|
|
@@ -60,7 +60,7 @@ export const executeParallel = async (
|
|
|
60
60
|
mut_resultPromises.push(promise);
|
|
61
61
|
|
|
62
62
|
const wrappedPromise = promise
|
|
63
|
-
// eslint-disable-next-line
|
|
63
|
+
// eslint-disable-next-line no-loop-func
|
|
64
64
|
.catch((error: unknown) => {
|
|
65
65
|
mut_failed = true;
|
|
66
66
|
|
|
@@ -151,30 +151,32 @@ export const executeStages = async (
|
|
|
151
151
|
);
|
|
152
152
|
|
|
153
153
|
for (const [i, stage] of mut_stages.entries()) {
|
|
154
|
-
if (Arr.isNonEmpty(stage)) {
|
|
155
|
-
|
|
154
|
+
if (!Arr.isNonEmpty(stage)) {
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
156
157
|
|
|
157
|
-
|
|
158
|
-
// eslint-disable-next-line no-await-in-loop
|
|
159
|
-
const results = await executeParallel(stage, scriptName, concurrency);
|
|
158
|
+
console.info(`Stage ${i + 1}: ${stage.map((p) => p.name).join(', ')}`);
|
|
160
159
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
`✅ Stage ${i + 1} completed successfully (${results.length}/${stage.length} packages)`,
|
|
165
|
-
);
|
|
166
|
-
} catch (error) {
|
|
167
|
-
// executeParallel will throw immediately on any failure (fail-fast)
|
|
168
|
-
const errorMessage = isError(error) ? error.message : String(error);
|
|
160
|
+
try {
|
|
161
|
+
// eslint-disable-next-line no-await-in-loop
|
|
162
|
+
const results = await executeParallel(stage, scriptName, concurrency);
|
|
169
163
|
|
|
170
|
-
|
|
164
|
+
// Log successful completion of the stage
|
|
165
|
+
// All results are successful because executeParallel throws on any failure
|
|
166
|
+
console.info(
|
|
167
|
+
`✅ Stage ${i + 1} completed successfully (${results.length}/${stage.length} packages)`,
|
|
168
|
+
);
|
|
169
|
+
} catch (error) {
|
|
170
|
+
// executeParallel will throw immediately on any failure (fail-fast)
|
|
171
|
+
const errorMessage = isError(error) ? error.message : String(error);
|
|
171
172
|
|
|
172
|
-
|
|
173
|
+
console.error(`\n❌ Stage ${i + 1} failed (fail-fast):`);
|
|
173
174
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
175
|
+
console.error(errorMessage);
|
|
176
|
+
|
|
177
|
+
throw new Error(`Stage ${i + 1} failed: ${errorMessage}`, {
|
|
178
|
+
cause: error,
|
|
179
|
+
});
|
|
178
180
|
}
|
|
179
181
|
}
|
|
180
182
|
};
|