@xylabs/ts-scripts-yarn3 3.15.3 → 3.15.5

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.
Files changed (239) hide show
  1. package/dist/actions/build.cjs.map +1 -1
  2. package/dist/actions/build.mjs.map +1 -1
  3. package/dist/actions/clean-jest.cjs.map +1 -1
  4. package/dist/actions/clean-jest.mjs.map +1 -1
  5. package/dist/actions/clean.cjs.map +1 -1
  6. package/dist/actions/clean.mjs.map +1 -1
  7. package/dist/actions/compile.cjs.map +1 -1
  8. package/dist/actions/compile.mjs.map +1 -1
  9. package/dist/actions/copy-assets.cjs +1 -1
  10. package/dist/actions/copy-assets.cjs.map +1 -1
  11. package/dist/actions/copy-assets.mjs +1 -1
  12. package/dist/actions/copy-assets.mjs.map +1 -1
  13. package/dist/actions/cycle.cjs.map +1 -1
  14. package/dist/actions/cycle.mjs.map +1 -1
  15. package/dist/actions/dead.cjs.map +1 -1
  16. package/dist/actions/dead.mjs.map +1 -1
  17. package/dist/actions/deploy-major.cjs.map +1 -1
  18. package/dist/actions/deploy-major.mjs.map +1 -1
  19. package/dist/actions/deploy-minor.cjs.map +1 -1
  20. package/dist/actions/deploy-minor.mjs.map +1 -1
  21. package/dist/actions/deploy-next.cjs.map +1 -1
  22. package/dist/actions/deploy-next.mjs.map +1 -1
  23. package/dist/actions/deploy.cjs.map +1 -1
  24. package/dist/actions/deploy.mjs.map +1 -1
  25. package/dist/actions/deps.cjs.map +1 -1
  26. package/dist/actions/deps.mjs.map +1 -1
  27. package/dist/actions/dupdeps.cjs +0 -3
  28. package/dist/actions/dupdeps.cjs.map +1 -1
  29. package/dist/actions/dupdeps.mjs +0 -3
  30. package/dist/actions/dupdeps.mjs.map +1 -1
  31. package/dist/actions/fix.cjs.map +1 -1
  32. package/dist/actions/fix.mjs.map +1 -1
  33. package/dist/actions/gen-docs.cjs.map +1 -1
  34. package/dist/actions/gen-docs.mjs.map +1 -1
  35. package/dist/actions/gitignore-gen.cjs.map +1 -1
  36. package/dist/actions/gitignore-gen.mjs.map +1 -1
  37. package/dist/actions/index.cjs +2 -5
  38. package/dist/actions/index.cjs.map +1 -1
  39. package/dist/actions/index.mjs +2 -5
  40. package/dist/actions/index.mjs.map +1 -1
  41. package/dist/actions/license.cjs.map +1 -1
  42. package/dist/actions/license.mjs.map +1 -1
  43. package/dist/actions/lint-clean.cjs.map +1 -1
  44. package/dist/actions/lint-clean.mjs.map +1 -1
  45. package/dist/actions/lint-profile.cjs.map +1 -1
  46. package/dist/actions/lint-profile.mjs.map +1 -1
  47. package/dist/actions/lint.cjs.map +1 -1
  48. package/dist/actions/lint.mjs.map +1 -1
  49. package/dist/actions/npmignore-gen.cjs.map +1 -1
  50. package/dist/actions/npmignore-gen.mjs.map +1 -1
  51. package/dist/actions/package/clean-outputs.cjs.map +1 -1
  52. package/dist/actions/package/clean-outputs.mjs.map +1 -1
  53. package/dist/actions/package/clean-typescript.cjs.map +1 -1
  54. package/dist/actions/package/clean-typescript.mjs.map +1 -1
  55. package/dist/actions/package/clean.cjs.map +1 -1
  56. package/dist/actions/package/clean.mjs.map +1 -1
  57. package/dist/actions/package/compile/XyConfig.cjs.map +1 -1
  58. package/dist/actions/package/compile/buildEntries.cjs.map +1 -1
  59. package/dist/actions/package/compile/buildEntries.mjs.map +1 -1
  60. package/dist/actions/package/compile/compile.cjs.map +1 -1
  61. package/dist/actions/package/compile/compile.mjs.map +1 -1
  62. package/dist/actions/package/compile/copyTypeFiles.cjs.map +1 -1
  63. package/dist/actions/package/compile/copyTypeFiles.mjs.map +1 -1
  64. package/dist/actions/package/compile/index.cjs.map +1 -1
  65. package/dist/actions/package/compile/index.mjs.map +1 -1
  66. package/dist/actions/package/compile/inputs.cjs.map +1 -1
  67. package/dist/actions/package/compile/inputs.mjs.map +1 -1
  68. package/dist/actions/package/compile/packageCompileTsc.cjs.map +1 -1
  69. package/dist/actions/package/compile/packageCompileTsc.mjs.map +1 -1
  70. package/dist/actions/package/compile/packageCompileTscTypes.cjs.map +1 -1
  71. package/dist/actions/package/compile/packageCompileTscTypes.mjs.map +1 -1
  72. package/dist/actions/package/compile/packageCompileTsup.cjs.map +1 -1
  73. package/dist/actions/package/compile/packageCompileTsup.mjs.map +1 -1
  74. package/dist/actions/package/copy-assets.cjs +1 -1
  75. package/dist/actions/package/copy-assets.cjs.map +1 -1
  76. package/dist/actions/package/copy-assets.mjs +1 -1
  77. package/dist/actions/package/copy-assets.mjs.map +1 -1
  78. package/dist/actions/package/deps.cjs.map +1 -1
  79. package/dist/actions/package/deps.mjs.map +1 -1
  80. package/dist/actions/package/index.cjs +1 -1
  81. package/dist/actions/package/index.cjs.map +1 -1
  82. package/dist/actions/package/index.mjs +1 -1
  83. package/dist/actions/package/index.mjs.map +1 -1
  84. package/dist/actions/package/publint.cjs.map +1 -1
  85. package/dist/actions/package/publint.mjs.map +1 -1
  86. package/dist/actions/package/recompile.cjs.map +1 -1
  87. package/dist/actions/package/recompile.mjs.map +1 -1
  88. package/dist/actions/publint.cjs.map +1 -1
  89. package/dist/actions/publint.mjs.map +1 -1
  90. package/dist/actions/rebuild.cjs.map +1 -1
  91. package/dist/actions/rebuild.mjs.map +1 -1
  92. package/dist/actions/recompile.cjs.map +1 -1
  93. package/dist/actions/recompile.mjs.map +1 -1
  94. package/dist/actions/reinstall.cjs.map +1 -1
  95. package/dist/actions/reinstall.mjs.map +1 -1
  96. package/dist/actions/relint.cjs.map +1 -1
  97. package/dist/actions/relint.mjs.map +1 -1
  98. package/dist/actions/retest.cjs.map +1 -1
  99. package/dist/actions/retest.mjs.map +1 -1
  100. package/dist/actions/sonar.cjs.map +1 -1
  101. package/dist/actions/sonar.mjs.map +1 -1
  102. package/dist/actions/statics.cjs +0 -3
  103. package/dist/actions/statics.cjs.map +1 -1
  104. package/dist/actions/statics.mjs +0 -3
  105. package/dist/actions/statics.mjs.map +1 -1
  106. package/dist/actions/test.cjs.map +1 -1
  107. package/dist/actions/test.mjs.map +1 -1
  108. package/dist/actions/up.cjs.map +1 -1
  109. package/dist/actions/up.mjs.map +1 -1
  110. package/dist/actions/updo.cjs.map +1 -1
  111. package/dist/actions/updo.mjs.map +1 -1
  112. package/dist/actions/upplug.cjs.map +1 -1
  113. package/dist/actions/upplug.mjs.map +1 -1
  114. package/dist/actions/upyarn.cjs.map +1 -1
  115. package/dist/actions/upyarn.mjs.map +1 -1
  116. package/dist/actions/yarn3only.cjs.map +1 -1
  117. package/dist/actions/yarn3only.mjs.map +1 -1
  118. package/dist/bin/package/clean-outputs.cjs.map +1 -1
  119. package/dist/bin/package/clean-outputs.mjs.map +1 -1
  120. package/dist/bin/package/clean-typescript.cjs.map +1 -1
  121. package/dist/bin/package/clean-typescript.mjs.map +1 -1
  122. package/dist/bin/package/clean.cjs.map +1 -1
  123. package/dist/bin/package/clean.mjs.map +1 -1
  124. package/dist/bin/package/compile-only.cjs.map +1 -1
  125. package/dist/bin/package/compile-only.mjs.map +1 -1
  126. package/dist/bin/package/compile-tsup.cjs.map +1 -1
  127. package/dist/bin/package/compile-tsup.mjs.map +1 -1
  128. package/dist/bin/package/compile.cjs.map +1 -1
  129. package/dist/bin/package/compile.mjs.map +1 -1
  130. package/dist/bin/package/copy-assets-cjs.cjs +1 -1
  131. package/dist/bin/package/copy-assets-cjs.cjs.map +1 -1
  132. package/dist/bin/package/copy-assets-cjs.mjs +1 -1
  133. package/dist/bin/package/copy-assets-cjs.mjs.map +1 -1
  134. package/dist/bin/package/copy-assets-esm.cjs +1 -1
  135. package/dist/bin/package/copy-assets-esm.cjs.map +1 -1
  136. package/dist/bin/package/copy-assets-esm.mjs +1 -1
  137. package/dist/bin/package/copy-assets-esm.mjs.map +1 -1
  138. package/dist/bin/package/deps.cjs.map +1 -1
  139. package/dist/bin/package/deps.mjs.map +1 -1
  140. package/dist/bin/package/publint.cjs.map +1 -1
  141. package/dist/bin/package/publint.mjs.map +1 -1
  142. package/dist/bin/package/recompile.cjs.map +1 -1
  143. package/dist/bin/package/recompile.mjs.map +1 -1
  144. package/dist/bin/xy-ts.cjs +1 -4
  145. package/dist/bin/xy-ts.cjs.map +1 -1
  146. package/dist/bin/xy-ts.mjs +1 -4
  147. package/dist/bin/xy-ts.mjs.map +1 -1
  148. package/dist/bin/xy.cjs +1 -4
  149. package/dist/bin/xy.cjs.map +1 -1
  150. package/dist/bin/xy.mjs +1 -4
  151. package/dist/bin/xy.mjs.map +1 -1
  152. package/dist/index.cjs +2 -5
  153. package/dist/index.cjs.map +1 -1
  154. package/dist/index.mjs +2 -5
  155. package/dist/index.mjs.map +1 -1
  156. package/dist/lib/dependencies/detectDuplicateDependencies.cjs +0 -3
  157. package/dist/lib/dependencies/detectDuplicateDependencies.cjs.map +1 -1
  158. package/dist/lib/dependencies/detectDuplicateDependencies.mjs +0 -3
  159. package/dist/lib/dependencies/detectDuplicateDependencies.mjs.map +1 -1
  160. package/dist/lib/dependencies/index.cjs +0 -3
  161. package/dist/lib/dependencies/index.cjs.map +1 -1
  162. package/dist/lib/dependencies/index.mjs +0 -3
  163. package/dist/lib/dependencies/index.mjs.map +1 -1
  164. package/dist/lib/generateIgnoreFiles.cjs.map +1 -1
  165. package/dist/lib/generateIgnoreFiles.mjs.map +1 -1
  166. package/dist/lib/index.cjs +0 -3
  167. package/dist/lib/index.cjs.map +1 -1
  168. package/dist/lib/index.mjs +0 -3
  169. package/dist/lib/index.mjs.map +1 -1
  170. package/dist/lib/processEx.cjs.map +1 -1
  171. package/dist/lib/processEx.mjs.map +1 -1
  172. package/dist/lib/runSteps.cjs.map +1 -1
  173. package/dist/lib/runSteps.mjs.map +1 -1
  174. package/dist/lib/runStepsAsync.cjs.map +1 -1
  175. package/dist/lib/runStepsAsync.mjs.map +1 -1
  176. package/dist/lib/runXy.cjs.map +1 -1
  177. package/dist/lib/runXy.mjs.map +1 -1
  178. package/dist/lib/safeExit.cjs.map +1 -1
  179. package/dist/lib/safeExit.mjs.map +1 -1
  180. package/dist/lib/yarn/index.cjs.map +1 -1
  181. package/dist/lib/yarn/index.mjs.map +1 -1
  182. package/dist/lib/yarn/isYarnVersionOrGreater.cjs.map +1 -1
  183. package/dist/lib/yarn/isYarnVersionOrGreater.mjs.map +1 -1
  184. package/dist/xy/index.cjs +1 -4
  185. package/dist/xy/index.cjs.map +1 -1
  186. package/dist/xy/index.mjs +1 -4
  187. package/dist/xy/index.mjs.map +1 -1
  188. package/dist/xy/xy.cjs +1 -4
  189. package/dist/xy/xy.cjs.map +1 -1
  190. package/dist/xy/xy.mjs +1 -4
  191. package/dist/xy/xy.mjs.map +1 -1
  192. package/dist/xy/xyBuildCommands.cjs +1 -1
  193. package/dist/xy/xyBuildCommands.cjs.map +1 -1
  194. package/dist/xy/xyBuildCommands.mjs +1 -1
  195. package/dist/xy/xyBuildCommands.mjs.map +1 -1
  196. package/dist/xy/xyCommonCommands.cjs.map +1 -1
  197. package/dist/xy/xyCommonCommands.mjs.map +1 -1
  198. package/dist/xy/xyDeployCommands.cjs.map +1 -1
  199. package/dist/xy/xyDeployCommands.mjs.map +1 -1
  200. package/dist/xy/xyInstallCommands.cjs +0 -3
  201. package/dist/xy/xyInstallCommands.cjs.map +1 -1
  202. package/dist/xy/xyInstallCommands.mjs +0 -3
  203. package/dist/xy/xyInstallCommands.mjs.map +1 -1
  204. package/dist/xy/xyLintCommands.cjs.map +1 -1
  205. package/dist/xy/xyLintCommands.mjs.map +1 -1
  206. package/package.json +14 -14
  207. package/src/actions/build.ts +1 -1
  208. package/src/actions/copy-assets.ts +2 -2
  209. package/src/actions/cycle.ts +1 -1
  210. package/src/actions/deps.ts +2 -1
  211. package/src/actions/license.ts +2 -2
  212. package/src/actions/lint.ts +1 -1
  213. package/src/actions/package/clean-outputs.ts +1 -1
  214. package/src/actions/package/clean-typescript.ts +1 -1
  215. package/src/actions/package/compile/XyConfig.ts +2 -0
  216. package/src/actions/package/compile/buildEntries.ts +1 -1
  217. package/src/actions/package/compile/copyTypeFiles.ts +4 -4
  218. package/src/actions/package/compile/inputs.ts +4 -4
  219. package/src/actions/package/compile/packageCompileTsc.ts +1 -1
  220. package/src/actions/package/compile/packageCompileTscTypes.ts +1 -1
  221. package/src/actions/package/compile/packageCompileTsup.ts +38 -38
  222. package/src/actions/package/copy-assets.ts +1 -1
  223. package/src/actions/package/deps.ts +5 -5
  224. package/src/actions/package/publint.ts +4 -4
  225. package/src/bin/package/compile-only.ts +1 -1
  226. package/src/bin/package/compile-tsup.ts +1 -1
  227. package/src/bin/package/copy-assets-cjs.ts +1 -1
  228. package/src/bin/package/copy-assets-esm.ts +1 -1
  229. package/src/bin/package/deps.ts +1 -1
  230. package/src/bin/package/publint.ts +1 -1
  231. package/src/bin/package/recompile.ts +1 -1
  232. package/src/lib/dependencies/detectDuplicateDependencies.ts +0 -3
  233. package/src/lib/generateIgnoreFiles.ts +1 -1
  234. package/src/lib/processEx.ts +7 -7
  235. package/src/lib/runSteps.ts +4 -4
  236. package/src/lib/yarn/isYarnVersionOrGreater.ts +1 -1
  237. package/src/xy/xy.ts +1 -1
  238. package/src/xy/xyCommonCommands.ts +1 -1
  239. package/src/xy/xyLintCommands.ts +6 -4
@@ -181,19 +181,16 @@ var detectDuplicateDependencies = /* @__PURE__ */ __name((depsFromPackageJSON, D
181
181
  } catch (e) {
182
182
  console.error(`Error running yarn why: ${e}`);
183
183
  exitCode = 1;
184
- exitCode;
185
184
  continue;
186
185
  }
187
186
  if (output) {
188
187
  exitCode = new DuplicateDetector(output, dependency).detect();
189
- exitCode;
190
188
  } else {
191
189
  console.log(`${dependency} - N/A`);
192
190
  if (depsFromPackageJSON) {
193
191
  exitCode = 1;
194
192
  console.log(`\u{1F6A8} Library ${dependency} was requested in package.json but not found`);
195
193
  }
196
- exitCode;
197
194
  }
198
195
  }
199
196
  return exitCode;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/dependencies/detectDuplicateDependencies.ts","../../../src/lib/processEx.ts","../../../src/lib/withError.ts","../../../src/lib/withErrnoException.ts","../../../src/lib/safeExit.ts","../../../src/lib/dependencies/DuplicateDetector.ts","../../../src/lib/jsonFormatters.ts"],"sourcesContent":["import { execSync } from 'node:child_process'\n\nimport { safeExit } from '../safeExit.ts'\nimport { DuplicateDetector } from './DuplicateDetector.ts'\n\nexport const detectDuplicateDependencies = (depsFromPackageJSON?: string[], DefaultDependencies?: string[]) => {\n let exitCode = 0\n\n const dependencies = depsFromPackageJSON?.length ? depsFromPackageJSON : DefaultDependencies\n\n return safeExit(() => {\n if (dependencies) {\n for (const dependency of dependencies) {\n let output: string\n\n try {\n const cmd = `yarn why ${dependency} --json`\n output = execSync(cmd).toString()\n } catch (e) {\n console.error(`Error running yarn why: ${e}`)\n exitCode = 1\n exitCode\n continue\n }\n\n if (output) {\n exitCode = new DuplicateDetector(output, dependency).detect()\n exitCode\n } else {\n console.log(`${dependency} - N/A`)\n if (depsFromPackageJSON) {\n exitCode = 1\n console.log(`🚨 Library ${dependency} was requested in package.json but not found`)\n }\n exitCode\n }\n }\n return exitCode\n } else {\n console.log('🚨 No dependencies where passed')\n return exitCode\n }\n })\n}\n","import chalk from 'chalk'\n\nimport { withErrnoException } from './withErrnoException.ts'\nimport { withError } from './withError.ts'\n\nexport const processEx = (ex: unknown) => {\n const error = typeof ex === 'string' ? new Error(ex) : ex\n const exitCode =\n withErrnoException(error, (error) => {\n if (error.code === 'ENOENT') {\n console.error(chalk.red(`'${error.path}' not found.`))\n } else {\n console.error(chalk.red(`Errno: ${error.code}`))\n }\n return error.errno ?? -1\n }) ??\n withError(error, (error) => {\n console.error(chalk.red(`${error.name}: ${error.message}`))\n return -1\n }) ??\n (() => {\n console.error(chalk.red(`Unexpected Error: ${JSON.stringify(ex, null, 2)}`))\n return -1\n })()\n //This allows us to use a previously set exit code\n process.exit(process.exitCode ?? exitCode)\n}\n","export const withError = <T extends Error = Error>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ex: any,\n closure: (error: T) => number,\n predicate = (ex: T) => ex.name !== undefined && ex.message !== undefined,\n) => {\n return predicate(ex as T) ? closure(ex as T) : undefined\n}\n","import { withError } from './withError.ts'\n\nexport const withErrnoException = <T extends NodeJS.ErrnoException = NodeJS.ErrnoException>(ex: unknown, closure: (error: T) => number) => {\n return withError<T>(ex, closure, (ex: unknown) => (ex as NodeJS.ErrnoException).errno !== undefined)\n}\n","/** Catch child process a crash and returns the code */\n\nimport { processEx } from './processEx.ts'\n\nconst safeExit = (func: () => number, exitOnFail = true): number => {\n try {\n const result = func()\n if (result && exitOnFail) {\n process.exit(result)\n }\n return result\n } catch (ex) {\n return processEx(ex)\n }\n}\n\nconst safeExitAsync = async (func: () => Promise<number>, exitOnFail = true): Promise<number> => {\n try {\n const result = await func()\n if (result && exitOnFail) {\n process.exit(result)\n }\n return result\n } catch (ex) {\n return processEx(ex)\n }\n}\n\nexport { safeExit, safeExitAsync }\n","import { EOL } from 'node:os'\n\nimport chalk from 'chalk'\nimport { uniq } from 'lodash-es'\n\nimport { multiLineToJSONArray } from '../jsonFormatters.ts'\n\ninterface ChildFields {\n descriptor: string\n locator: string\n}\n\nconst trimVirtualMeta = (value: string): string => {\n const virtualParts = value.split('virtual:')\n if (virtualParts.length > 1) {\n const hashParts = virtualParts[1].split('#')\n return virtualParts[0] + hashParts[1]\n } else {\n return value\n }\n}\n\nconst trimObjectDependencyVirtualMeta = (obj: Record<string, ChildFields>): Record<string, ChildFields> => {\n const resultObj: Record<string, ChildFields> = {}\n for (const [key, value] of Object.entries(obj)) {\n resultObj[trimVirtualMeta(key)] = {\n descriptor: trimVirtualMeta(value.descriptor),\n locator: trimVirtualMeta(value.locator),\n }\n }\n return resultObj\n}\n\nconst trimDependencyVirtualMeta = (dependencies: DependencyEntries): DependencyEntries => {\n return dependencies.map((dependency) => {\n return { children: trimObjectDependencyVirtualMeta(dependency.children), value: trimVirtualMeta(dependency.value) }\n })\n}\n\ninterface DependencyEntry {\n children: Record<string, ChildFields>\n value: string\n}\n\ntype DependencyEntries = DependencyEntry[]\n\ninterface Results {\n currentVersion: string | undefined\n dependency: string\n duplicateVersions: string[]\n}\n\nexport class DuplicateDetector {\n private dependency: string\n private dependencyEntries: DependencyEntries\n\n constructor(output: string, dependency: string) {\n this.dependency = dependency\n this.dependencyEntries = trimDependencyVirtualMeta(multiLineToJSONArray(output))\n }\n\n detect() {\n // eslint-disable-next-line unicorn/no-array-reduce\n const result = this.dependencyEntries.reduce(this.detectReducer, this.resultsFactory(this.dependency))\n if (result.duplicateVersions.length > 0) {\n console.log(chalk.yellow(`${EOL}Duplicates found for: ${this.dependency}`))\n const duplicateVersions = result.duplicateVersions.toString().replaceAll(',', `${EOL} `)\n console.log(chalk.grey(` ${duplicateVersions}`, EOL))\n return 1\n } else {\n console.log(`${this.dependency} - OK`)\n return 0\n }\n }\n\n private detectReducer(acc: Results, entry: DependencyEntry) {\n const version = Object.entries(entry.children).map(([k]) => k)[0]\n\n if (!acc.currentVersion) {\n acc.currentVersion = version\n return acc\n }\n\n if (acc.currentVersion && acc.currentVersion !== version && !version.includes('@virtual:')) {\n // if first duplicate, push the current version as the first duplicate\n if (acc.duplicateVersions.length === 0) {\n acc.duplicateVersions.push(acc.currentVersion)\n }\n acc.duplicateVersions.push(version)\n acc.duplicateVersions = uniq(acc.duplicateVersions)\n }\n return acc\n }\n\n private resultsFactory = (dependency: string): Results => ({ currentVersion: undefined, dependency, duplicateVersions: [] })\n}\n","export const multiLineToJSONArray = (output: string) => {\n const withCommas = output.replaceAll('\\r\\n', '').replaceAll('\\n', ',')\n const cleanCollection = withCommas.slice(0, Math.max(0, withCommas.length - 1))\n const collection = `[${cleanCollection}]`\n return JSON.parse(collection)\n}\n"],"mappings":"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","names":["withError","ex","closure","predicate","name","undefined","message","withErrnoException","ex","closure","withError","errno","undefined","processEx","ex","error","Error","exitCode","withErrnoException","code","console","chalk","red","path","errno","withError","name","message","JSON","stringify","process","exit","safeExit","func","exitOnFail","result","process","exit","ex","processEx","import_chalk","multiLineToJSONArray","output","withCommas","replaceAll","cleanCollection","slice","Math","max","length","collection","JSON","parse","trimVirtualMeta","value","virtualParts","split","length","hashParts","trimObjectDependencyVirtualMeta","obj","resultObj","key","Object","entries","descriptor","locator","trimDependencyVirtualMeta","dependencies","map","dependency","children","DuplicateDetector","dependencyEntries","constructor","output","multiLineToJSONArray","detect","result","reduce","detectReducer","resultsFactory","duplicateVersions","console","log","chalk","yellow","EOL","toString","replaceAll","grey","acc","entry","version","k","currentVersion","includes","push","uniq","undefined","detectDuplicateDependencies","depsFromPackageJSON","DefaultDependencies","exitCode","dependencies","length","safeExit","dependency","output","cmd","execSync","toString","e","console","error","DuplicateDetector","detect","log"]}
1
+ {"version":3,"sources":["../../../src/lib/dependencies/detectDuplicateDependencies.ts","../../../src/lib/processEx.ts","../../../src/lib/withError.ts","../../../src/lib/withErrnoException.ts","../../../src/lib/safeExit.ts","../../../src/lib/dependencies/DuplicateDetector.ts","../../../src/lib/jsonFormatters.ts"],"sourcesContent":["import { execSync } from 'node:child_process'\n\nimport { safeExit } from '../safeExit.ts'\nimport { DuplicateDetector } from './DuplicateDetector.ts'\n\nexport const detectDuplicateDependencies = (depsFromPackageJSON?: string[], DefaultDependencies?: string[]) => {\n let exitCode = 0\n\n const dependencies = depsFromPackageJSON?.length ? depsFromPackageJSON : DefaultDependencies\n\n return safeExit(() => {\n if (dependencies) {\n for (const dependency of dependencies) {\n let output: string\n\n try {\n const cmd = `yarn why ${dependency} --json`\n output = execSync(cmd).toString()\n } catch (e) {\n console.error(`Error running yarn why: ${e}`)\n exitCode = 1\n continue\n }\n\n if (output) {\n exitCode = new DuplicateDetector(output, dependency).detect()\n } else {\n console.log(`${dependency} - N/A`)\n if (depsFromPackageJSON) {\n exitCode = 1\n console.log(`🚨 Library ${dependency} was requested in package.json but not found`)\n }\n }\n }\n return exitCode\n } else {\n console.log('🚨 No dependencies where passed')\n return exitCode\n }\n })\n}\n","import chalk from 'chalk'\n\nimport { withErrnoException } from './withErrnoException.ts'\nimport { withError } from './withError.ts'\n\nexport const processEx = (ex: unknown) => {\n const error = typeof ex === 'string' ? new Error(ex) : ex\n const exitCode\n = withErrnoException(error, (error) => {\n if (error.code === 'ENOENT') {\n console.error(chalk.red(`'${error.path}' not found.`))\n } else {\n console.error(chalk.red(`Errno: ${error.code}`))\n }\n return error.errno ?? -1\n })\n ?? withError(error, (error) => {\n console.error(chalk.red(`${error.name}: ${error.message}`))\n return -1\n })\n ?? (() => {\n console.error(chalk.red(`Unexpected Error: ${JSON.stringify(ex, null, 2)}`))\n return -1\n })()\n // This allows us to use a previously set exit code\n process.exit(process.exitCode ?? exitCode)\n}\n","export const withError = <T extends Error = Error>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ex: any,\n closure: (error: T) => number,\n predicate = (ex: T) => ex.name !== undefined && ex.message !== undefined,\n) => {\n return predicate(ex as T) ? closure(ex as T) : undefined\n}\n","import { withError } from './withError.ts'\n\nexport const withErrnoException = <T extends NodeJS.ErrnoException = NodeJS.ErrnoException>(ex: unknown, closure: (error: T) => number) => {\n return withError<T>(ex, closure, (ex: unknown) => (ex as NodeJS.ErrnoException).errno !== undefined)\n}\n","/** Catch child process a crash and returns the code */\n\nimport { processEx } from './processEx.ts'\n\nconst safeExit = (func: () => number, exitOnFail = true): number => {\n try {\n const result = func()\n if (result && exitOnFail) {\n process.exit(result)\n }\n return result\n } catch (ex) {\n return processEx(ex)\n }\n}\n\nconst safeExitAsync = async (func: () => Promise<number>, exitOnFail = true): Promise<number> => {\n try {\n const result = await func()\n if (result && exitOnFail) {\n process.exit(result)\n }\n return result\n } catch (ex) {\n return processEx(ex)\n }\n}\n\nexport { safeExit, safeExitAsync }\n","import { EOL } from 'node:os'\n\nimport chalk from 'chalk'\nimport { uniq } from 'lodash-es'\n\nimport { multiLineToJSONArray } from '../jsonFormatters.ts'\n\ninterface ChildFields {\n descriptor: string\n locator: string\n}\n\nconst trimVirtualMeta = (value: string): string => {\n const virtualParts = value.split('virtual:')\n if (virtualParts.length > 1) {\n const hashParts = virtualParts[1].split('#')\n return virtualParts[0] + hashParts[1]\n } else {\n return value\n }\n}\n\nconst trimObjectDependencyVirtualMeta = (obj: Record<string, ChildFields>): Record<string, ChildFields> => {\n const resultObj: Record<string, ChildFields> = {}\n for (const [key, value] of Object.entries(obj)) {\n resultObj[trimVirtualMeta(key)] = {\n descriptor: trimVirtualMeta(value.descriptor),\n locator: trimVirtualMeta(value.locator),\n }\n }\n return resultObj\n}\n\nconst trimDependencyVirtualMeta = (dependencies: DependencyEntries): DependencyEntries => {\n return dependencies.map((dependency) => {\n return { children: trimObjectDependencyVirtualMeta(dependency.children), value: trimVirtualMeta(dependency.value) }\n })\n}\n\ninterface DependencyEntry {\n children: Record<string, ChildFields>\n value: string\n}\n\ntype DependencyEntries = DependencyEntry[]\n\ninterface Results {\n currentVersion: string | undefined\n dependency: string\n duplicateVersions: string[]\n}\n\nexport class DuplicateDetector {\n private dependency: string\n private dependencyEntries: DependencyEntries\n\n constructor(output: string, dependency: string) {\n this.dependency = dependency\n this.dependencyEntries = trimDependencyVirtualMeta(multiLineToJSONArray(output))\n }\n\n detect() {\n // eslint-disable-next-line unicorn/no-array-reduce\n const result = this.dependencyEntries.reduce(this.detectReducer, this.resultsFactory(this.dependency))\n if (result.duplicateVersions.length > 0) {\n console.log(chalk.yellow(`${EOL}Duplicates found for: ${this.dependency}`))\n const duplicateVersions = result.duplicateVersions.toString().replaceAll(',', `${EOL} `)\n console.log(chalk.grey(` ${duplicateVersions}`, EOL))\n return 1\n } else {\n console.log(`${this.dependency} - OK`)\n return 0\n }\n }\n\n private detectReducer(acc: Results, entry: DependencyEntry) {\n const version = Object.entries(entry.children).map(([k]) => k)[0]\n\n if (!acc.currentVersion) {\n acc.currentVersion = version\n return acc\n }\n\n if (acc.currentVersion && acc.currentVersion !== version && !version.includes('@virtual:')) {\n // if first duplicate, push the current version as the first duplicate\n if (acc.duplicateVersions.length === 0) {\n acc.duplicateVersions.push(acc.currentVersion)\n }\n acc.duplicateVersions.push(version)\n acc.duplicateVersions = uniq(acc.duplicateVersions)\n }\n return acc\n }\n\n private resultsFactory = (dependency: string): Results => ({ currentVersion: undefined, dependency, duplicateVersions: [] })\n}\n","export const multiLineToJSONArray = (output: string) => {\n const withCommas = output.replaceAll('\\r\\n', '').replaceAll('\\n', ',')\n const cleanCollection = withCommas.slice(0, Math.max(0, withCommas.length - 1))\n const collection = `[${cleanCollection}]`\n return JSON.parse(collection)\n}\n"],"mappings":"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","names":["withError","ex","closure","predicate","name","undefined","message","withErrnoException","ex","closure","withError","errno","undefined","processEx","ex","error","Error","exitCode","withErrnoException","code","console","chalk","red","path","errno","withError","name","message","JSON","stringify","process","exit","safeExit","func","exitOnFail","result","process","exit","ex","processEx","import_chalk","multiLineToJSONArray","output","withCommas","replaceAll","cleanCollection","slice","Math","max","length","collection","JSON","parse","trimVirtualMeta","value","virtualParts","split","length","hashParts","trimObjectDependencyVirtualMeta","obj","resultObj","key","Object","entries","descriptor","locator","trimDependencyVirtualMeta","dependencies","map","dependency","children","DuplicateDetector","dependencyEntries","constructor","output","multiLineToJSONArray","detect","result","reduce","detectReducer","resultsFactory","duplicateVersions","console","log","chalk","yellow","EOL","toString","replaceAll","grey","acc","entry","version","k","currentVersion","includes","push","uniq","undefined","detectDuplicateDependencies","depsFromPackageJSON","DefaultDependencies","exitCode","dependencies","length","safeExit","dependency","output","cmd","execSync","toString","e","console","error","DuplicateDetector","detect","log"]}
@@ -149,19 +149,16 @@ var detectDuplicateDependencies = /* @__PURE__ */ __name((depsFromPackageJSON, D
149
149
  } catch (e) {
150
150
  console.error(`Error running yarn why: ${e}`);
151
151
  exitCode = 1;
152
- exitCode;
153
152
  continue;
154
153
  }
155
154
  if (output) {
156
155
  exitCode = new DuplicateDetector(output, dependency).detect();
157
- exitCode;
158
156
  } else {
159
157
  console.log(`${dependency} - N/A`);
160
158
  if (depsFromPackageJSON) {
161
159
  exitCode = 1;
162
160
  console.log(`\u{1F6A8} Library ${dependency} was requested in package.json but not found`);
163
161
  }
164
- exitCode;
165
162
  }
166
163
  }
167
164
  return exitCode;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/dependencies/detectDuplicateDependencies.ts","../../../src/lib/processEx.ts","../../../src/lib/withError.ts","../../../src/lib/withErrnoException.ts","../../../src/lib/safeExit.ts","../../../src/lib/dependencies/DuplicateDetector.ts","../../../src/lib/jsonFormatters.ts"],"sourcesContent":["import { execSync } from 'node:child_process'\n\nimport { safeExit } from '../safeExit.ts'\nimport { DuplicateDetector } from './DuplicateDetector.ts'\n\nexport const detectDuplicateDependencies = (depsFromPackageJSON?: string[], DefaultDependencies?: string[]) => {\n let exitCode = 0\n\n const dependencies = depsFromPackageJSON?.length ? depsFromPackageJSON : DefaultDependencies\n\n return safeExit(() => {\n if (dependencies) {\n for (const dependency of dependencies) {\n let output: string\n\n try {\n const cmd = `yarn why ${dependency} --json`\n output = execSync(cmd).toString()\n } catch (e) {\n console.error(`Error running yarn why: ${e}`)\n exitCode = 1\n exitCode\n continue\n }\n\n if (output) {\n exitCode = new DuplicateDetector(output, dependency).detect()\n exitCode\n } else {\n console.log(`${dependency} - N/A`)\n if (depsFromPackageJSON) {\n exitCode = 1\n console.log(`🚨 Library ${dependency} was requested in package.json but not found`)\n }\n exitCode\n }\n }\n return exitCode\n } else {\n console.log('🚨 No dependencies where passed')\n return exitCode\n }\n })\n}\n","import chalk from 'chalk'\n\nimport { withErrnoException } from './withErrnoException.ts'\nimport { withError } from './withError.ts'\n\nexport const processEx = (ex: unknown) => {\n const error = typeof ex === 'string' ? new Error(ex) : ex\n const exitCode =\n withErrnoException(error, (error) => {\n if (error.code === 'ENOENT') {\n console.error(chalk.red(`'${error.path}' not found.`))\n } else {\n console.error(chalk.red(`Errno: ${error.code}`))\n }\n return error.errno ?? -1\n }) ??\n withError(error, (error) => {\n console.error(chalk.red(`${error.name}: ${error.message}`))\n return -1\n }) ??\n (() => {\n console.error(chalk.red(`Unexpected Error: ${JSON.stringify(ex, null, 2)}`))\n return -1\n })()\n //This allows us to use a previously set exit code\n process.exit(process.exitCode ?? exitCode)\n}\n","export const withError = <T extends Error = Error>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ex: any,\n closure: (error: T) => number,\n predicate = (ex: T) => ex.name !== undefined && ex.message !== undefined,\n) => {\n return predicate(ex as T) ? closure(ex as T) : undefined\n}\n","import { withError } from './withError.ts'\n\nexport const withErrnoException = <T extends NodeJS.ErrnoException = NodeJS.ErrnoException>(ex: unknown, closure: (error: T) => number) => {\n return withError<T>(ex, closure, (ex: unknown) => (ex as NodeJS.ErrnoException).errno !== undefined)\n}\n","/** Catch child process a crash and returns the code */\n\nimport { processEx } from './processEx.ts'\n\nconst safeExit = (func: () => number, exitOnFail = true): number => {\n try {\n const result = func()\n if (result && exitOnFail) {\n process.exit(result)\n }\n return result\n } catch (ex) {\n return processEx(ex)\n }\n}\n\nconst safeExitAsync = async (func: () => Promise<number>, exitOnFail = true): Promise<number> => {\n try {\n const result = await func()\n if (result && exitOnFail) {\n process.exit(result)\n }\n return result\n } catch (ex) {\n return processEx(ex)\n }\n}\n\nexport { safeExit, safeExitAsync }\n","import { EOL } from 'node:os'\n\nimport chalk from 'chalk'\nimport { uniq } from 'lodash-es'\n\nimport { multiLineToJSONArray } from '../jsonFormatters.ts'\n\ninterface ChildFields {\n descriptor: string\n locator: string\n}\n\nconst trimVirtualMeta = (value: string): string => {\n const virtualParts = value.split('virtual:')\n if (virtualParts.length > 1) {\n const hashParts = virtualParts[1].split('#')\n return virtualParts[0] + hashParts[1]\n } else {\n return value\n }\n}\n\nconst trimObjectDependencyVirtualMeta = (obj: Record<string, ChildFields>): Record<string, ChildFields> => {\n const resultObj: Record<string, ChildFields> = {}\n for (const [key, value] of Object.entries(obj)) {\n resultObj[trimVirtualMeta(key)] = {\n descriptor: trimVirtualMeta(value.descriptor),\n locator: trimVirtualMeta(value.locator),\n }\n }\n return resultObj\n}\n\nconst trimDependencyVirtualMeta = (dependencies: DependencyEntries): DependencyEntries => {\n return dependencies.map((dependency) => {\n return { children: trimObjectDependencyVirtualMeta(dependency.children), value: trimVirtualMeta(dependency.value) }\n })\n}\n\ninterface DependencyEntry {\n children: Record<string, ChildFields>\n value: string\n}\n\ntype DependencyEntries = DependencyEntry[]\n\ninterface Results {\n currentVersion: string | undefined\n dependency: string\n duplicateVersions: string[]\n}\n\nexport class DuplicateDetector {\n private dependency: string\n private dependencyEntries: DependencyEntries\n\n constructor(output: string, dependency: string) {\n this.dependency = dependency\n this.dependencyEntries = trimDependencyVirtualMeta(multiLineToJSONArray(output))\n }\n\n detect() {\n // eslint-disable-next-line unicorn/no-array-reduce\n const result = this.dependencyEntries.reduce(this.detectReducer, this.resultsFactory(this.dependency))\n if (result.duplicateVersions.length > 0) {\n console.log(chalk.yellow(`${EOL}Duplicates found for: ${this.dependency}`))\n const duplicateVersions = result.duplicateVersions.toString().replaceAll(',', `${EOL} `)\n console.log(chalk.grey(` ${duplicateVersions}`, EOL))\n return 1\n } else {\n console.log(`${this.dependency} - OK`)\n return 0\n }\n }\n\n private detectReducer(acc: Results, entry: DependencyEntry) {\n const version = Object.entries(entry.children).map(([k]) => k)[0]\n\n if (!acc.currentVersion) {\n acc.currentVersion = version\n return acc\n }\n\n if (acc.currentVersion && acc.currentVersion !== version && !version.includes('@virtual:')) {\n // if first duplicate, push the current version as the first duplicate\n if (acc.duplicateVersions.length === 0) {\n acc.duplicateVersions.push(acc.currentVersion)\n }\n acc.duplicateVersions.push(version)\n acc.duplicateVersions = uniq(acc.duplicateVersions)\n }\n return acc\n }\n\n private resultsFactory = (dependency: string): Results => ({ currentVersion: undefined, dependency, duplicateVersions: [] })\n}\n","export const multiLineToJSONArray = (output: string) => {\n const withCommas = output.replaceAll('\\r\\n', '').replaceAll('\\n', ',')\n const cleanCollection = withCommas.slice(0, Math.max(0, withCommas.length - 1))\n const collection = `[${cleanCollection}]`\n return JSON.parse(collection)\n}\n"],"mappings":"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","names":["execSync","chalk","withError","ex","closure","predicate","name","undefined","message","withErrnoException","ex","closure","withError","errno","undefined","processEx","ex","error","Error","exitCode","withErrnoException","code","console","chalk","red","path","errno","withError","name","message","JSON","stringify","process","exit","safeExit","func","exitOnFail","result","process","exit","ex","processEx","EOL","chalk","uniq","multiLineToJSONArray","output","withCommas","replaceAll","cleanCollection","slice","Math","max","length","collection","JSON","parse","trimVirtualMeta","value","virtualParts","split","length","hashParts","trimObjectDependencyVirtualMeta","obj","resultObj","key","Object","entries","descriptor","locator","trimDependencyVirtualMeta","dependencies","map","dependency","children","DuplicateDetector","dependencyEntries","constructor","output","multiLineToJSONArray","detect","result","reduce","detectReducer","resultsFactory","duplicateVersions","console","log","chalk","yellow","EOL","toString","replaceAll","grey","acc","entry","version","k","currentVersion","includes","push","uniq","undefined","detectDuplicateDependencies","depsFromPackageJSON","DefaultDependencies","exitCode","dependencies","length","safeExit","dependency","output","cmd","execSync","toString","e","console","error","DuplicateDetector","detect","log"]}
1
+ {"version":3,"sources":["../../../src/lib/dependencies/detectDuplicateDependencies.ts","../../../src/lib/processEx.ts","../../../src/lib/withError.ts","../../../src/lib/withErrnoException.ts","../../../src/lib/safeExit.ts","../../../src/lib/dependencies/DuplicateDetector.ts","../../../src/lib/jsonFormatters.ts"],"sourcesContent":["import { execSync } from 'node:child_process'\n\nimport { safeExit } from '../safeExit.ts'\nimport { DuplicateDetector } from './DuplicateDetector.ts'\n\nexport const detectDuplicateDependencies = (depsFromPackageJSON?: string[], DefaultDependencies?: string[]) => {\n let exitCode = 0\n\n const dependencies = depsFromPackageJSON?.length ? depsFromPackageJSON : DefaultDependencies\n\n return safeExit(() => {\n if (dependencies) {\n for (const dependency of dependencies) {\n let output: string\n\n try {\n const cmd = `yarn why ${dependency} --json`\n output = execSync(cmd).toString()\n } catch (e) {\n console.error(`Error running yarn why: ${e}`)\n exitCode = 1\n continue\n }\n\n if (output) {\n exitCode = new DuplicateDetector(output, dependency).detect()\n } else {\n console.log(`${dependency} - N/A`)\n if (depsFromPackageJSON) {\n exitCode = 1\n console.log(`🚨 Library ${dependency} was requested in package.json but not found`)\n }\n }\n }\n return exitCode\n } else {\n console.log('🚨 No dependencies where passed')\n return exitCode\n }\n })\n}\n","import chalk from 'chalk'\n\nimport { withErrnoException } from './withErrnoException.ts'\nimport { withError } from './withError.ts'\n\nexport const processEx = (ex: unknown) => {\n const error = typeof ex === 'string' ? new Error(ex) : ex\n const exitCode\n = withErrnoException(error, (error) => {\n if (error.code === 'ENOENT') {\n console.error(chalk.red(`'${error.path}' not found.`))\n } else {\n console.error(chalk.red(`Errno: ${error.code}`))\n }\n return error.errno ?? -1\n })\n ?? withError(error, (error) => {\n console.error(chalk.red(`${error.name}: ${error.message}`))\n return -1\n })\n ?? (() => {\n console.error(chalk.red(`Unexpected Error: ${JSON.stringify(ex, null, 2)}`))\n return -1\n })()\n // This allows us to use a previously set exit code\n process.exit(process.exitCode ?? exitCode)\n}\n","export const withError = <T extends Error = Error>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ex: any,\n closure: (error: T) => number,\n predicate = (ex: T) => ex.name !== undefined && ex.message !== undefined,\n) => {\n return predicate(ex as T) ? closure(ex as T) : undefined\n}\n","import { withError } from './withError.ts'\n\nexport const withErrnoException = <T extends NodeJS.ErrnoException = NodeJS.ErrnoException>(ex: unknown, closure: (error: T) => number) => {\n return withError<T>(ex, closure, (ex: unknown) => (ex as NodeJS.ErrnoException).errno !== undefined)\n}\n","/** Catch child process a crash and returns the code */\n\nimport { processEx } from './processEx.ts'\n\nconst safeExit = (func: () => number, exitOnFail = true): number => {\n try {\n const result = func()\n if (result && exitOnFail) {\n process.exit(result)\n }\n return result\n } catch (ex) {\n return processEx(ex)\n }\n}\n\nconst safeExitAsync = async (func: () => Promise<number>, exitOnFail = true): Promise<number> => {\n try {\n const result = await func()\n if (result && exitOnFail) {\n process.exit(result)\n }\n return result\n } catch (ex) {\n return processEx(ex)\n }\n}\n\nexport { safeExit, safeExitAsync }\n","import { EOL } from 'node:os'\n\nimport chalk from 'chalk'\nimport { uniq } from 'lodash-es'\n\nimport { multiLineToJSONArray } from '../jsonFormatters.ts'\n\ninterface ChildFields {\n descriptor: string\n locator: string\n}\n\nconst trimVirtualMeta = (value: string): string => {\n const virtualParts = value.split('virtual:')\n if (virtualParts.length > 1) {\n const hashParts = virtualParts[1].split('#')\n return virtualParts[0] + hashParts[1]\n } else {\n return value\n }\n}\n\nconst trimObjectDependencyVirtualMeta = (obj: Record<string, ChildFields>): Record<string, ChildFields> => {\n const resultObj: Record<string, ChildFields> = {}\n for (const [key, value] of Object.entries(obj)) {\n resultObj[trimVirtualMeta(key)] = {\n descriptor: trimVirtualMeta(value.descriptor),\n locator: trimVirtualMeta(value.locator),\n }\n }\n return resultObj\n}\n\nconst trimDependencyVirtualMeta = (dependencies: DependencyEntries): DependencyEntries => {\n return dependencies.map((dependency) => {\n return { children: trimObjectDependencyVirtualMeta(dependency.children), value: trimVirtualMeta(dependency.value) }\n })\n}\n\ninterface DependencyEntry {\n children: Record<string, ChildFields>\n value: string\n}\n\ntype DependencyEntries = DependencyEntry[]\n\ninterface Results {\n currentVersion: string | undefined\n dependency: string\n duplicateVersions: string[]\n}\n\nexport class DuplicateDetector {\n private dependency: string\n private dependencyEntries: DependencyEntries\n\n constructor(output: string, dependency: string) {\n this.dependency = dependency\n this.dependencyEntries = trimDependencyVirtualMeta(multiLineToJSONArray(output))\n }\n\n detect() {\n // eslint-disable-next-line unicorn/no-array-reduce\n const result = this.dependencyEntries.reduce(this.detectReducer, this.resultsFactory(this.dependency))\n if (result.duplicateVersions.length > 0) {\n console.log(chalk.yellow(`${EOL}Duplicates found for: ${this.dependency}`))\n const duplicateVersions = result.duplicateVersions.toString().replaceAll(',', `${EOL} `)\n console.log(chalk.grey(` ${duplicateVersions}`, EOL))\n return 1\n } else {\n console.log(`${this.dependency} - OK`)\n return 0\n }\n }\n\n private detectReducer(acc: Results, entry: DependencyEntry) {\n const version = Object.entries(entry.children).map(([k]) => k)[0]\n\n if (!acc.currentVersion) {\n acc.currentVersion = version\n return acc\n }\n\n if (acc.currentVersion && acc.currentVersion !== version && !version.includes('@virtual:')) {\n // if first duplicate, push the current version as the first duplicate\n if (acc.duplicateVersions.length === 0) {\n acc.duplicateVersions.push(acc.currentVersion)\n }\n acc.duplicateVersions.push(version)\n acc.duplicateVersions = uniq(acc.duplicateVersions)\n }\n return acc\n }\n\n private resultsFactory = (dependency: string): Results => ({ currentVersion: undefined, dependency, duplicateVersions: [] })\n}\n","export const multiLineToJSONArray = (output: string) => {\n const withCommas = output.replaceAll('\\r\\n', '').replaceAll('\\n', ',')\n const cleanCollection = withCommas.slice(0, Math.max(0, withCommas.length - 1))\n const collection = `[${cleanCollection}]`\n return JSON.parse(collection)\n}\n"],"mappings":"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","names":["execSync","chalk","withError","ex","closure","predicate","name","undefined","message","withErrnoException","ex","closure","withError","errno","undefined","processEx","ex","error","Error","exitCode","withErrnoException","code","console","chalk","red","path","errno","withError","name","message","JSON","stringify","process","exit","safeExit","func","exitOnFail","result","process","exit","ex","processEx","EOL","chalk","uniq","multiLineToJSONArray","output","withCommas","replaceAll","cleanCollection","slice","Math","max","length","collection","JSON","parse","trimVirtualMeta","value","virtualParts","split","length","hashParts","trimObjectDependencyVirtualMeta","obj","resultObj","key","Object","entries","descriptor","locator","trimDependencyVirtualMeta","dependencies","map","dependency","children","DuplicateDetector","dependencyEntries","constructor","output","multiLineToJSONArray","detect","result","reduce","detectReducer","resultsFactory","duplicateVersions","console","log","chalk","yellow","EOL","toString","replaceAll","grey","acc","entry","version","k","currentVersion","includes","push","uniq","undefined","detectDuplicateDependencies","depsFromPackageJSON","DefaultDependencies","exitCode","dependencies","length","safeExit","dependency","output","cmd","execSync","toString","e","console","error","DuplicateDetector","detect","log"]}
@@ -184,19 +184,16 @@ var detectDuplicateDependencies = /* @__PURE__ */ __name((depsFromPackageJSON, D
184
184
  } catch (e) {
185
185
  console.error(`Error running yarn why: ${e}`);
186
186
  exitCode = 1;
187
- exitCode;
188
187
  continue;
189
188
  }
190
189
  if (output) {
191
190
  exitCode = new DuplicateDetector(output, dependency).detect();
192
- exitCode;
193
191
  } else {
194
192
  console.log(`${dependency} - N/A`);
195
193
  if (depsFromPackageJSON) {
196
194
  exitCode = 1;
197
195
  console.log(`\u{1F6A8} Library ${dependency} was requested in package.json but not found`);
198
196
  }
199
- exitCode;
200
197
  }
201
198
  }
202
199
  return exitCode;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/dependencies/index.ts","../../../src/lib/dependencies/detectDuplicateDependencies.ts","../../../src/lib/processEx.ts","../../../src/lib/withError.ts","../../../src/lib/withErrnoException.ts","../../../src/lib/safeExit.ts","../../../src/lib/dependencies/DuplicateDetector.ts","../../../src/lib/jsonFormatters.ts"],"sourcesContent":["export * from './detectDuplicateDependencies.ts'\nexport * from './DuplicateDetector.ts'\n","import { execSync } from 'node:child_process'\n\nimport { safeExit } from '../safeExit.ts'\nimport { DuplicateDetector } from './DuplicateDetector.ts'\n\nexport const detectDuplicateDependencies = (depsFromPackageJSON?: string[], DefaultDependencies?: string[]) => {\n let exitCode = 0\n\n const dependencies = depsFromPackageJSON?.length ? depsFromPackageJSON : DefaultDependencies\n\n return safeExit(() => {\n if (dependencies) {\n for (const dependency of dependencies) {\n let output: string\n\n try {\n const cmd = `yarn why ${dependency} --json`\n output = execSync(cmd).toString()\n } catch (e) {\n console.error(`Error running yarn why: ${e}`)\n exitCode = 1\n exitCode\n continue\n }\n\n if (output) {\n exitCode = new DuplicateDetector(output, dependency).detect()\n exitCode\n } else {\n console.log(`${dependency} - N/A`)\n if (depsFromPackageJSON) {\n exitCode = 1\n console.log(`🚨 Library ${dependency} was requested in package.json but not found`)\n }\n exitCode\n }\n }\n return exitCode\n } else {\n console.log('🚨 No dependencies where passed')\n return exitCode\n }\n })\n}\n","import chalk from 'chalk'\n\nimport { withErrnoException } from './withErrnoException.ts'\nimport { withError } from './withError.ts'\n\nexport const processEx = (ex: unknown) => {\n const error = typeof ex === 'string' ? new Error(ex) : ex\n const exitCode =\n withErrnoException(error, (error) => {\n if (error.code === 'ENOENT') {\n console.error(chalk.red(`'${error.path}' not found.`))\n } else {\n console.error(chalk.red(`Errno: ${error.code}`))\n }\n return error.errno ?? -1\n }) ??\n withError(error, (error) => {\n console.error(chalk.red(`${error.name}: ${error.message}`))\n return -1\n }) ??\n (() => {\n console.error(chalk.red(`Unexpected Error: ${JSON.stringify(ex, null, 2)}`))\n return -1\n })()\n //This allows us to use a previously set exit code\n process.exit(process.exitCode ?? exitCode)\n}\n","export const withError = <T extends Error = Error>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ex: any,\n closure: (error: T) => number,\n predicate = (ex: T) => ex.name !== undefined && ex.message !== undefined,\n) => {\n return predicate(ex as T) ? closure(ex as T) : undefined\n}\n","import { withError } from './withError.ts'\n\nexport const withErrnoException = <T extends NodeJS.ErrnoException = NodeJS.ErrnoException>(ex: unknown, closure: (error: T) => number) => {\n return withError<T>(ex, closure, (ex: unknown) => (ex as NodeJS.ErrnoException).errno !== undefined)\n}\n","/** Catch child process a crash and returns the code */\n\nimport { processEx } from './processEx.ts'\n\nconst safeExit = (func: () => number, exitOnFail = true): number => {\n try {\n const result = func()\n if (result && exitOnFail) {\n process.exit(result)\n }\n return result\n } catch (ex) {\n return processEx(ex)\n }\n}\n\nconst safeExitAsync = async (func: () => Promise<number>, exitOnFail = true): Promise<number> => {\n try {\n const result = await func()\n if (result && exitOnFail) {\n process.exit(result)\n }\n return result\n } catch (ex) {\n return processEx(ex)\n }\n}\n\nexport { safeExit, safeExitAsync }\n","import { EOL } from 'node:os'\n\nimport chalk from 'chalk'\nimport { uniq } from 'lodash-es'\n\nimport { multiLineToJSONArray } from '../jsonFormatters.ts'\n\ninterface ChildFields {\n descriptor: string\n locator: string\n}\n\nconst trimVirtualMeta = (value: string): string => {\n const virtualParts = value.split('virtual:')\n if (virtualParts.length > 1) {\n const hashParts = virtualParts[1].split('#')\n return virtualParts[0] + hashParts[1]\n } else {\n return value\n }\n}\n\nconst trimObjectDependencyVirtualMeta = (obj: Record<string, ChildFields>): Record<string, ChildFields> => {\n const resultObj: Record<string, ChildFields> = {}\n for (const [key, value] of Object.entries(obj)) {\n resultObj[trimVirtualMeta(key)] = {\n descriptor: trimVirtualMeta(value.descriptor),\n locator: trimVirtualMeta(value.locator),\n }\n }\n return resultObj\n}\n\nconst trimDependencyVirtualMeta = (dependencies: DependencyEntries): DependencyEntries => {\n return dependencies.map((dependency) => {\n return { children: trimObjectDependencyVirtualMeta(dependency.children), value: trimVirtualMeta(dependency.value) }\n })\n}\n\ninterface DependencyEntry {\n children: Record<string, ChildFields>\n value: string\n}\n\ntype DependencyEntries = DependencyEntry[]\n\ninterface Results {\n currentVersion: string | undefined\n dependency: string\n duplicateVersions: string[]\n}\n\nexport class DuplicateDetector {\n private dependency: string\n private dependencyEntries: DependencyEntries\n\n constructor(output: string, dependency: string) {\n this.dependency = dependency\n this.dependencyEntries = trimDependencyVirtualMeta(multiLineToJSONArray(output))\n }\n\n detect() {\n // eslint-disable-next-line unicorn/no-array-reduce\n const result = this.dependencyEntries.reduce(this.detectReducer, this.resultsFactory(this.dependency))\n if (result.duplicateVersions.length > 0) {\n console.log(chalk.yellow(`${EOL}Duplicates found for: ${this.dependency}`))\n const duplicateVersions = result.duplicateVersions.toString().replaceAll(',', `${EOL} `)\n console.log(chalk.grey(` ${duplicateVersions}`, EOL))\n return 1\n } else {\n console.log(`${this.dependency} - OK`)\n return 0\n }\n }\n\n private detectReducer(acc: Results, entry: DependencyEntry) {\n const version = Object.entries(entry.children).map(([k]) => k)[0]\n\n if (!acc.currentVersion) {\n acc.currentVersion = version\n return acc\n }\n\n if (acc.currentVersion && acc.currentVersion !== version && !version.includes('@virtual:')) {\n // if first duplicate, push the current version as the first duplicate\n if (acc.duplicateVersions.length === 0) {\n acc.duplicateVersions.push(acc.currentVersion)\n }\n acc.duplicateVersions.push(version)\n acc.duplicateVersions = uniq(acc.duplicateVersions)\n }\n return acc\n }\n\n private resultsFactory = (dependency: string): Results => ({ currentVersion: undefined, dependency, duplicateVersions: [] })\n}\n","export const multiLineToJSONArray = (output: string) => {\n const withCommas = output.replaceAll('\\r\\n', '').replaceAll('\\n', ',')\n const cleanCollection = withCommas.slice(0, Math.max(0, withCommas.length - 1))\n const collection = `[${cleanCollection}]`\n return JSON.parse(collection)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;ACAA,gCAAyB;;;ACAzB,mBAAkB;;;ACAX,IAAMA,YAAY,wBAEvBC,IACAC,SACAC,YAAY,CAACF,QAAUA,IAAGG,SAASC,UAAaJ,IAAGK,YAAYD,WAAS;AAExE,SAAOF,UAAUF,EAAAA,IAAWC,QAAQD,EAAAA,IAAWI;AACjD,GAPyB;;;ACElB,IAAME,qBAAqB,wBAA0DC,IAAaC,YAAAA;AACvG,SAAOC,UAAaF,IAAIC,SAAS,CAACD,QAAiBA,IAA6BG,UAAUC,MAAAA;AAC5F,GAFkC;;;AFG3B,IAAMC,YAAY,wBAACC,OAAAA;AACxB,QAAMC,QAAQ,OAAOD,OAAO,WAAW,IAAIE,MAAMF,EAAAA,IAAMA;AACvD,QAAMG,WACJC,mBAAmBH,OAAO,CAACA,WAAAA;AACzB,QAAIA,OAAMI,SAAS,UAAU;AAC3BC,cAAQL,MAAMM,aAAAA,QAAMC,IAAI,IAAIP,OAAMQ,IAAI,cAAc,CAAA;IACtD,OAAO;AACLH,cAAQL,MAAMM,aAAAA,QAAMC,IAAI,UAAUP,OAAMI,IAAI,EAAE,CAAA;IAChD;AACA,WAAOJ,OAAMS,SAAS;EACxB,CAAA,KACAC,UAAUV,OAAO,CAACA,WAAAA;AAChBK,YAAQL,MAAMM,aAAAA,QAAMC,IAAI,GAAGP,OAAMW,IAAI,KAAKX,OAAMY,OAAO,EAAE,CAAA;AACzD,WAAO;EACT,CAAA,MACC,MAAA;AACCP,YAAQL,MAAMM,aAAAA,QAAMC,IAAI,qBAAqBM,KAAKC,UAAUf,IAAI,MAAM,CAAA,CAAA,EAAI,CAAA;AAC1E,WAAO;EACT,GAAA;AAEFgB,UAAQC,KAAKD,QAAQb,YAAYA,QAAAA;AACnC,GArByB;;;AGDzB,IAAMe,WAAW,wBAACC,MAAoBC,aAAa,SAAI;AACrD,MAAI;AACF,UAAMC,SAASF,KAAAA;AACf,QAAIE,UAAUD,YAAY;AACxBE,cAAQC,KAAKF,MAAAA;IACf;AACA,WAAOA;EACT,SAASG,IAAI;AACX,WAAOC,UAAUD,EAAAA;EACnB;AACF,GAViB;;;ACJjB,qBAAoB;AAEpB,IAAAE,gBAAkB;AAClB,uBAAqB;;;ACHd,IAAMC,uBAAuB,wBAACC,WAAAA;AACnC,QAAMC,aAAaD,OAAOE,WAAW,QAAQ,EAAA,EAAIA,WAAW,MAAM,GAAA;AAClE,QAAMC,kBAAkBF,WAAWG,MAAM,GAAGC,KAAKC,IAAI,GAAGL,WAAWM,SAAS,CAAA,CAAA;AAC5E,QAAMC,aAAa,IAAIL,eAAAA;AACvB,SAAOM,KAAKC,MAAMF,UAAAA;AACpB,GALoC;;;ADYpC,IAAMG,kBAAkB,wBAACC,UAAAA;AACvB,QAAMC,eAAeD,MAAME,MAAM,UAAA;AACjC,MAAID,aAAaE,SAAS,GAAG;AAC3B,UAAMC,YAAYH,aAAa,CAAA,EAAGC,MAAM,GAAA;AACxC,WAAOD,aAAa,CAAA,IAAKG,UAAU,CAAA;EACrC,OAAO;AACL,WAAOJ;EACT;AACF,GARwB;AAUxB,IAAMK,kCAAkC,wBAACC,QAAAA;AACvC,QAAMC,YAAyC,CAAC;AAChD,aAAW,CAACC,KAAKR,KAAAA,KAAUS,OAAOC,QAAQJ,GAAAA,GAAM;AAC9CC,cAAUR,gBAAgBS,GAAAA,CAAAA,IAAQ;MAChCG,YAAYZ,gBAAgBC,MAAMW,UAAU;MAC5CC,SAASb,gBAAgBC,MAAMY,OAAO;IACxC;EACF;AACA,SAAOL;AACT,GATwC;AAWxC,IAAMM,4BAA4B,wBAACC,iBAAAA;AACjC,SAAOA,aAAaC,IAAI,CAACC,eAAAA;AACvB,WAAO;MAAEC,UAAUZ,gCAAgCW,WAAWC,QAAQ;MAAGjB,OAAOD,gBAAgBiB,WAAWhB,KAAK;IAAE;EACpH,CAAA;AACF,GAJkC;AAmB3B,IAAMkB,oBAAN,MAAMA;EApDb,OAoDaA;;;EACHF;EACAG;EAERC,YAAYC,QAAgBL,YAAoB;AAC9C,SAAKA,aAAaA;AAClB,SAAKG,oBAAoBN,0BAA0BS,qBAAqBD,MAAAA,CAAAA;EAC1E;EAEAE,SAAS;AAEP,UAAMC,SAAS,KAAKL,kBAAkBM,OAAO,KAAKC,eAAe,KAAKC,eAAe,KAAKX,UAAU,CAAA;AACpG,QAAIQ,OAAOI,kBAAkBzB,SAAS,GAAG;AACvC0B,cAAQC,IAAIC,cAAAA,QAAMC,OAAO,GAAGC,kBAAAA,yBAA4B,KAAKjB,UAAU,EAAE,CAAA;AACzE,YAAMY,oBAAoBJ,OAAOI,kBAAkBM,SAAQ,EAAGC,WAAW,KAAK,GAAGF,kBAAAA,IAAO;AACxFJ,cAAQC,IAAIC,cAAAA,QAAMK,KAAK,KAAKR,iBAAAA,IAAqBK,kBAAAA,CAAAA;AACjD,aAAO;IACT,OAAO;AACLJ,cAAQC,IAAI,GAAG,KAAKd,UAAU,OAAO;AACrC,aAAO;IACT;EACF;EAEQU,cAAcW,KAAcC,OAAwB;AAC1D,UAAMC,UAAU9B,OAAOC,QAAQ4B,MAAMrB,QAAQ,EAAEF,IAAI,CAAC,CAACyB,CAAAA,MAAOA,CAAAA,EAAG,CAAA;AAE/D,QAAI,CAACH,IAAII,gBAAgB;AACvBJ,UAAII,iBAAiBF;AACrB,aAAOF;IACT;AAEA,QAAIA,IAAII,kBAAkBJ,IAAII,mBAAmBF,WAAW,CAACA,QAAQG,SAAS,WAAA,GAAc;AAE1F,UAAIL,IAAIT,kBAAkBzB,WAAW,GAAG;AACtCkC,YAAIT,kBAAkBe,KAAKN,IAAII,cAAc;MAC/C;AACAJ,UAAIT,kBAAkBe,KAAKJ,OAAAA;AAC3BF,UAAIT,wBAAoBgB,uBAAKP,IAAIT,iBAAiB;IACpD;AACA,WAAOS;EACT;EAEQV,iBAAiB,wBAACX,gBAAiC;IAAEyB,gBAAgBI;IAAW7B;IAAYY,mBAAmB,CAAA;EAAG,IAAjG;AAC3B;;;AL1FO,IAAMkB,8BAA8B,wBAACC,qBAAgCC,wBAAAA;AAC1E,MAAIC,WAAW;AAEf,QAAMC,eAAeH,qBAAqBI,SAASJ,sBAAsBC;AAEzE,SAAOI,SAAS,MAAA;AACd,QAAIF,cAAc;AAChB,iBAAWG,cAAcH,cAAc;AACrC,YAAII;AAEJ,YAAI;AACF,gBAAMC,MAAM,YAAYF,UAAAA;AACxBC,uBAASE,oCAASD,GAAAA,EAAKE,SAAQ;QACjC,SAASC,GAAG;AACVC,kBAAQC,MAAM,2BAA2BF,CAAAA,EAAG;AAC5CT,qBAAW;AACXA;AACA;QACF;AAEA,YAAIK,QAAQ;AACVL,qBAAW,IAAIY,kBAAkBP,QAAQD,UAAAA,EAAYS,OAAM;AAC3Db;QACF,OAAO;AACLU,kBAAQI,IAAI,GAAGV,UAAAA,QAAkB;AACjC,cAAIN,qBAAqB;AACvBE,uBAAW;AACXU,oBAAQI,IAAI,qBAAcV,UAAAA,8CAAwD;UACpF;AACAJ;QACF;MACF;AACA,aAAOA;IACT,OAAO;AACLU,cAAQI,IAAI,wCAAA;AACZ,aAAOd;IACT;EACF,CAAA;AACF,GAtC2C;","names":["withError","ex","closure","predicate","name","undefined","message","withErrnoException","ex","closure","withError","errno","undefined","processEx","ex","error","Error","exitCode","withErrnoException","code","console","chalk","red","path","errno","withError","name","message","JSON","stringify","process","exit","safeExit","func","exitOnFail","result","process","exit","ex","processEx","import_chalk","multiLineToJSONArray","output","withCommas","replaceAll","cleanCollection","slice","Math","max","length","collection","JSON","parse","trimVirtualMeta","value","virtualParts","split","length","hashParts","trimObjectDependencyVirtualMeta","obj","resultObj","key","Object","entries","descriptor","locator","trimDependencyVirtualMeta","dependencies","map","dependency","children","DuplicateDetector","dependencyEntries","constructor","output","multiLineToJSONArray","detect","result","reduce","detectReducer","resultsFactory","duplicateVersions","console","log","chalk","yellow","EOL","toString","replaceAll","grey","acc","entry","version","k","currentVersion","includes","push","uniq","undefined","detectDuplicateDependencies","depsFromPackageJSON","DefaultDependencies","exitCode","dependencies","length","safeExit","dependency","output","cmd","execSync","toString","e","console","error","DuplicateDetector","detect","log"]}
1
+ {"version":3,"sources":["../../../src/lib/dependencies/index.ts","../../../src/lib/dependencies/detectDuplicateDependencies.ts","../../../src/lib/processEx.ts","../../../src/lib/withError.ts","../../../src/lib/withErrnoException.ts","../../../src/lib/safeExit.ts","../../../src/lib/dependencies/DuplicateDetector.ts","../../../src/lib/jsonFormatters.ts"],"sourcesContent":["export * from './detectDuplicateDependencies.ts'\nexport * from './DuplicateDetector.ts'\n","import { execSync } from 'node:child_process'\n\nimport { safeExit } from '../safeExit.ts'\nimport { DuplicateDetector } from './DuplicateDetector.ts'\n\nexport const detectDuplicateDependencies = (depsFromPackageJSON?: string[], DefaultDependencies?: string[]) => {\n let exitCode = 0\n\n const dependencies = depsFromPackageJSON?.length ? depsFromPackageJSON : DefaultDependencies\n\n return safeExit(() => {\n if (dependencies) {\n for (const dependency of dependencies) {\n let output: string\n\n try {\n const cmd = `yarn why ${dependency} --json`\n output = execSync(cmd).toString()\n } catch (e) {\n console.error(`Error running yarn why: ${e}`)\n exitCode = 1\n continue\n }\n\n if (output) {\n exitCode = new DuplicateDetector(output, dependency).detect()\n } else {\n console.log(`${dependency} - N/A`)\n if (depsFromPackageJSON) {\n exitCode = 1\n console.log(`🚨 Library ${dependency} was requested in package.json but not found`)\n }\n }\n }\n return exitCode\n } else {\n console.log('🚨 No dependencies where passed')\n return exitCode\n }\n })\n}\n","import chalk from 'chalk'\n\nimport { withErrnoException } from './withErrnoException.ts'\nimport { withError } from './withError.ts'\n\nexport const processEx = (ex: unknown) => {\n const error = typeof ex === 'string' ? new Error(ex) : ex\n const exitCode\n = withErrnoException(error, (error) => {\n if (error.code === 'ENOENT') {\n console.error(chalk.red(`'${error.path}' not found.`))\n } else {\n console.error(chalk.red(`Errno: ${error.code}`))\n }\n return error.errno ?? -1\n })\n ?? withError(error, (error) => {\n console.error(chalk.red(`${error.name}: ${error.message}`))\n return -1\n })\n ?? (() => {\n console.error(chalk.red(`Unexpected Error: ${JSON.stringify(ex, null, 2)}`))\n return -1\n })()\n // This allows us to use a previously set exit code\n process.exit(process.exitCode ?? exitCode)\n}\n","export const withError = <T extends Error = Error>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ex: any,\n closure: (error: T) => number,\n predicate = (ex: T) => ex.name !== undefined && ex.message !== undefined,\n) => {\n return predicate(ex as T) ? closure(ex as T) : undefined\n}\n","import { withError } from './withError.ts'\n\nexport const withErrnoException = <T extends NodeJS.ErrnoException = NodeJS.ErrnoException>(ex: unknown, closure: (error: T) => number) => {\n return withError<T>(ex, closure, (ex: unknown) => (ex as NodeJS.ErrnoException).errno !== undefined)\n}\n","/** Catch child process a crash and returns the code */\n\nimport { processEx } from './processEx.ts'\n\nconst safeExit = (func: () => number, exitOnFail = true): number => {\n try {\n const result = func()\n if (result && exitOnFail) {\n process.exit(result)\n }\n return result\n } catch (ex) {\n return processEx(ex)\n }\n}\n\nconst safeExitAsync = async (func: () => Promise<number>, exitOnFail = true): Promise<number> => {\n try {\n const result = await func()\n if (result && exitOnFail) {\n process.exit(result)\n }\n return result\n } catch (ex) {\n return processEx(ex)\n }\n}\n\nexport { safeExit, safeExitAsync }\n","import { EOL } from 'node:os'\n\nimport chalk from 'chalk'\nimport { uniq } from 'lodash-es'\n\nimport { multiLineToJSONArray } from '../jsonFormatters.ts'\n\ninterface ChildFields {\n descriptor: string\n locator: string\n}\n\nconst trimVirtualMeta = (value: string): string => {\n const virtualParts = value.split('virtual:')\n if (virtualParts.length > 1) {\n const hashParts = virtualParts[1].split('#')\n return virtualParts[0] + hashParts[1]\n } else {\n return value\n }\n}\n\nconst trimObjectDependencyVirtualMeta = (obj: Record<string, ChildFields>): Record<string, ChildFields> => {\n const resultObj: Record<string, ChildFields> = {}\n for (const [key, value] of Object.entries(obj)) {\n resultObj[trimVirtualMeta(key)] = {\n descriptor: trimVirtualMeta(value.descriptor),\n locator: trimVirtualMeta(value.locator),\n }\n }\n return resultObj\n}\n\nconst trimDependencyVirtualMeta = (dependencies: DependencyEntries): DependencyEntries => {\n return dependencies.map((dependency) => {\n return { children: trimObjectDependencyVirtualMeta(dependency.children), value: trimVirtualMeta(dependency.value) }\n })\n}\n\ninterface DependencyEntry {\n children: Record<string, ChildFields>\n value: string\n}\n\ntype DependencyEntries = DependencyEntry[]\n\ninterface Results {\n currentVersion: string | undefined\n dependency: string\n duplicateVersions: string[]\n}\n\nexport class DuplicateDetector {\n private dependency: string\n private dependencyEntries: DependencyEntries\n\n constructor(output: string, dependency: string) {\n this.dependency = dependency\n this.dependencyEntries = trimDependencyVirtualMeta(multiLineToJSONArray(output))\n }\n\n detect() {\n // eslint-disable-next-line unicorn/no-array-reduce\n const result = this.dependencyEntries.reduce(this.detectReducer, this.resultsFactory(this.dependency))\n if (result.duplicateVersions.length > 0) {\n console.log(chalk.yellow(`${EOL}Duplicates found for: ${this.dependency}`))\n const duplicateVersions = result.duplicateVersions.toString().replaceAll(',', `${EOL} `)\n console.log(chalk.grey(` ${duplicateVersions}`, EOL))\n return 1\n } else {\n console.log(`${this.dependency} - OK`)\n return 0\n }\n }\n\n private detectReducer(acc: Results, entry: DependencyEntry) {\n const version = Object.entries(entry.children).map(([k]) => k)[0]\n\n if (!acc.currentVersion) {\n acc.currentVersion = version\n return acc\n }\n\n if (acc.currentVersion && acc.currentVersion !== version && !version.includes('@virtual:')) {\n // if first duplicate, push the current version as the first duplicate\n if (acc.duplicateVersions.length === 0) {\n acc.duplicateVersions.push(acc.currentVersion)\n }\n acc.duplicateVersions.push(version)\n acc.duplicateVersions = uniq(acc.duplicateVersions)\n }\n return acc\n }\n\n private resultsFactory = (dependency: string): Results => ({ currentVersion: undefined, dependency, duplicateVersions: [] })\n}\n","export const multiLineToJSONArray = (output: string) => {\n const withCommas = output.replaceAll('\\r\\n', '').replaceAll('\\n', ',')\n const cleanCollection = withCommas.slice(0, Math.max(0, withCommas.length - 1))\n const collection = `[${cleanCollection}]`\n return JSON.parse(collection)\n}\n"],"mappings":"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","names":["withError","ex","closure","predicate","name","undefined","message","withErrnoException","ex","closure","withError","errno","undefined","processEx","ex","error","Error","exitCode","withErrnoException","code","console","chalk","red","path","errno","withError","name","message","JSON","stringify","process","exit","safeExit","func","exitOnFail","result","process","exit","ex","processEx","import_chalk","multiLineToJSONArray","output","withCommas","replaceAll","cleanCollection","slice","Math","max","length","collection","JSON","parse","trimVirtualMeta","value","virtualParts","split","length","hashParts","trimObjectDependencyVirtualMeta","obj","resultObj","key","Object","entries","descriptor","locator","trimDependencyVirtualMeta","dependencies","map","dependency","children","DuplicateDetector","dependencyEntries","constructor","output","multiLineToJSONArray","detect","result","reduce","detectReducer","resultsFactory","duplicateVersions","console","log","chalk","yellow","EOL","toString","replaceAll","grey","acc","entry","version","k","currentVersion","includes","push","uniq","undefined","detectDuplicateDependencies","depsFromPackageJSON","DefaultDependencies","exitCode","dependencies","length","safeExit","dependency","output","cmd","execSync","toString","e","console","error","DuplicateDetector","detect","log"]}
@@ -149,19 +149,16 @@ var detectDuplicateDependencies = /* @__PURE__ */ __name((depsFromPackageJSON, D
149
149
  } catch (e) {
150
150
  console.error(`Error running yarn why: ${e}`);
151
151
  exitCode = 1;
152
- exitCode;
153
152
  continue;
154
153
  }
155
154
  if (output) {
156
155
  exitCode = new DuplicateDetector(output, dependency).detect();
157
- exitCode;
158
156
  } else {
159
157
  console.log(`${dependency} - N/A`);
160
158
  if (depsFromPackageJSON) {
161
159
  exitCode = 1;
162
160
  console.log(`\u{1F6A8} Library ${dependency} was requested in package.json but not found`);
163
161
  }
164
- exitCode;
165
162
  }
166
163
  }
167
164
  return exitCode;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/dependencies/detectDuplicateDependencies.ts","../../../src/lib/processEx.ts","../../../src/lib/withError.ts","../../../src/lib/withErrnoException.ts","../../../src/lib/safeExit.ts","../../../src/lib/dependencies/DuplicateDetector.ts","../../../src/lib/jsonFormatters.ts"],"sourcesContent":["import { execSync } from 'node:child_process'\n\nimport { safeExit } from '../safeExit.ts'\nimport { DuplicateDetector } from './DuplicateDetector.ts'\n\nexport const detectDuplicateDependencies = (depsFromPackageJSON?: string[], DefaultDependencies?: string[]) => {\n let exitCode = 0\n\n const dependencies = depsFromPackageJSON?.length ? depsFromPackageJSON : DefaultDependencies\n\n return safeExit(() => {\n if (dependencies) {\n for (const dependency of dependencies) {\n let output: string\n\n try {\n const cmd = `yarn why ${dependency} --json`\n output = execSync(cmd).toString()\n } catch (e) {\n console.error(`Error running yarn why: ${e}`)\n exitCode = 1\n exitCode\n continue\n }\n\n if (output) {\n exitCode = new DuplicateDetector(output, dependency).detect()\n exitCode\n } else {\n console.log(`${dependency} - N/A`)\n if (depsFromPackageJSON) {\n exitCode = 1\n console.log(`🚨 Library ${dependency} was requested in package.json but not found`)\n }\n exitCode\n }\n }\n return exitCode\n } else {\n console.log('🚨 No dependencies where passed')\n return exitCode\n }\n })\n}\n","import chalk from 'chalk'\n\nimport { withErrnoException } from './withErrnoException.ts'\nimport { withError } from './withError.ts'\n\nexport const processEx = (ex: unknown) => {\n const error = typeof ex === 'string' ? new Error(ex) : ex\n const exitCode =\n withErrnoException(error, (error) => {\n if (error.code === 'ENOENT') {\n console.error(chalk.red(`'${error.path}' not found.`))\n } else {\n console.error(chalk.red(`Errno: ${error.code}`))\n }\n return error.errno ?? -1\n }) ??\n withError(error, (error) => {\n console.error(chalk.red(`${error.name}: ${error.message}`))\n return -1\n }) ??\n (() => {\n console.error(chalk.red(`Unexpected Error: ${JSON.stringify(ex, null, 2)}`))\n return -1\n })()\n //This allows us to use a previously set exit code\n process.exit(process.exitCode ?? exitCode)\n}\n","export const withError = <T extends Error = Error>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ex: any,\n closure: (error: T) => number,\n predicate = (ex: T) => ex.name !== undefined && ex.message !== undefined,\n) => {\n return predicate(ex as T) ? closure(ex as T) : undefined\n}\n","import { withError } from './withError.ts'\n\nexport const withErrnoException = <T extends NodeJS.ErrnoException = NodeJS.ErrnoException>(ex: unknown, closure: (error: T) => number) => {\n return withError<T>(ex, closure, (ex: unknown) => (ex as NodeJS.ErrnoException).errno !== undefined)\n}\n","/** Catch child process a crash and returns the code */\n\nimport { processEx } from './processEx.ts'\n\nconst safeExit = (func: () => number, exitOnFail = true): number => {\n try {\n const result = func()\n if (result && exitOnFail) {\n process.exit(result)\n }\n return result\n } catch (ex) {\n return processEx(ex)\n }\n}\n\nconst safeExitAsync = async (func: () => Promise<number>, exitOnFail = true): Promise<number> => {\n try {\n const result = await func()\n if (result && exitOnFail) {\n process.exit(result)\n }\n return result\n } catch (ex) {\n return processEx(ex)\n }\n}\n\nexport { safeExit, safeExitAsync }\n","import { EOL } from 'node:os'\n\nimport chalk from 'chalk'\nimport { uniq } from 'lodash-es'\n\nimport { multiLineToJSONArray } from '../jsonFormatters.ts'\n\ninterface ChildFields {\n descriptor: string\n locator: string\n}\n\nconst trimVirtualMeta = (value: string): string => {\n const virtualParts = value.split('virtual:')\n if (virtualParts.length > 1) {\n const hashParts = virtualParts[1].split('#')\n return virtualParts[0] + hashParts[1]\n } else {\n return value\n }\n}\n\nconst trimObjectDependencyVirtualMeta = (obj: Record<string, ChildFields>): Record<string, ChildFields> => {\n const resultObj: Record<string, ChildFields> = {}\n for (const [key, value] of Object.entries(obj)) {\n resultObj[trimVirtualMeta(key)] = {\n descriptor: trimVirtualMeta(value.descriptor),\n locator: trimVirtualMeta(value.locator),\n }\n }\n return resultObj\n}\n\nconst trimDependencyVirtualMeta = (dependencies: DependencyEntries): DependencyEntries => {\n return dependencies.map((dependency) => {\n return { children: trimObjectDependencyVirtualMeta(dependency.children), value: trimVirtualMeta(dependency.value) }\n })\n}\n\ninterface DependencyEntry {\n children: Record<string, ChildFields>\n value: string\n}\n\ntype DependencyEntries = DependencyEntry[]\n\ninterface Results {\n currentVersion: string | undefined\n dependency: string\n duplicateVersions: string[]\n}\n\nexport class DuplicateDetector {\n private dependency: string\n private dependencyEntries: DependencyEntries\n\n constructor(output: string, dependency: string) {\n this.dependency = dependency\n this.dependencyEntries = trimDependencyVirtualMeta(multiLineToJSONArray(output))\n }\n\n detect() {\n // eslint-disable-next-line unicorn/no-array-reduce\n const result = this.dependencyEntries.reduce(this.detectReducer, this.resultsFactory(this.dependency))\n if (result.duplicateVersions.length > 0) {\n console.log(chalk.yellow(`${EOL}Duplicates found for: ${this.dependency}`))\n const duplicateVersions = result.duplicateVersions.toString().replaceAll(',', `${EOL} `)\n console.log(chalk.grey(` ${duplicateVersions}`, EOL))\n return 1\n } else {\n console.log(`${this.dependency} - OK`)\n return 0\n }\n }\n\n private detectReducer(acc: Results, entry: DependencyEntry) {\n const version = Object.entries(entry.children).map(([k]) => k)[0]\n\n if (!acc.currentVersion) {\n acc.currentVersion = version\n return acc\n }\n\n if (acc.currentVersion && acc.currentVersion !== version && !version.includes('@virtual:')) {\n // if first duplicate, push the current version as the first duplicate\n if (acc.duplicateVersions.length === 0) {\n acc.duplicateVersions.push(acc.currentVersion)\n }\n acc.duplicateVersions.push(version)\n acc.duplicateVersions = uniq(acc.duplicateVersions)\n }\n return acc\n }\n\n private resultsFactory = (dependency: string): Results => ({ currentVersion: undefined, dependency, duplicateVersions: [] })\n}\n","export const multiLineToJSONArray = (output: string) => {\n const withCommas = output.replaceAll('\\r\\n', '').replaceAll('\\n', ',')\n const cleanCollection = withCommas.slice(0, Math.max(0, withCommas.length - 1))\n const collection = `[${cleanCollection}]`\n return JSON.parse(collection)\n}\n"],"mappings":"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","names":["execSync","chalk","withError","ex","closure","predicate","name","undefined","message","withErrnoException","ex","closure","withError","errno","undefined","processEx","ex","error","Error","exitCode","withErrnoException","code","console","chalk","red","path","errno","withError","name","message","JSON","stringify","process","exit","safeExit","func","exitOnFail","result","process","exit","ex","processEx","EOL","chalk","uniq","multiLineToJSONArray","output","withCommas","replaceAll","cleanCollection","slice","Math","max","length","collection","JSON","parse","trimVirtualMeta","value","virtualParts","split","length","hashParts","trimObjectDependencyVirtualMeta","obj","resultObj","key","Object","entries","descriptor","locator","trimDependencyVirtualMeta","dependencies","map","dependency","children","DuplicateDetector","dependencyEntries","constructor","output","multiLineToJSONArray","detect","result","reduce","detectReducer","resultsFactory","duplicateVersions","console","log","chalk","yellow","EOL","toString","replaceAll","grey","acc","entry","version","k","currentVersion","includes","push","uniq","undefined","detectDuplicateDependencies","depsFromPackageJSON","DefaultDependencies","exitCode","dependencies","length","safeExit","dependency","output","cmd","execSync","toString","e","console","error","DuplicateDetector","detect","log"]}
1
+ {"version":3,"sources":["../../../src/lib/dependencies/detectDuplicateDependencies.ts","../../../src/lib/processEx.ts","../../../src/lib/withError.ts","../../../src/lib/withErrnoException.ts","../../../src/lib/safeExit.ts","../../../src/lib/dependencies/DuplicateDetector.ts","../../../src/lib/jsonFormatters.ts"],"sourcesContent":["import { execSync } from 'node:child_process'\n\nimport { safeExit } from '../safeExit.ts'\nimport { DuplicateDetector } from './DuplicateDetector.ts'\n\nexport const detectDuplicateDependencies = (depsFromPackageJSON?: string[], DefaultDependencies?: string[]) => {\n let exitCode = 0\n\n const dependencies = depsFromPackageJSON?.length ? depsFromPackageJSON : DefaultDependencies\n\n return safeExit(() => {\n if (dependencies) {\n for (const dependency of dependencies) {\n let output: string\n\n try {\n const cmd = `yarn why ${dependency} --json`\n output = execSync(cmd).toString()\n } catch (e) {\n console.error(`Error running yarn why: ${e}`)\n exitCode = 1\n continue\n }\n\n if (output) {\n exitCode = new DuplicateDetector(output, dependency).detect()\n } else {\n console.log(`${dependency} - N/A`)\n if (depsFromPackageJSON) {\n exitCode = 1\n console.log(`🚨 Library ${dependency} was requested in package.json but not found`)\n }\n }\n }\n return exitCode\n } else {\n console.log('🚨 No dependencies where passed')\n return exitCode\n }\n })\n}\n","import chalk from 'chalk'\n\nimport { withErrnoException } from './withErrnoException.ts'\nimport { withError } from './withError.ts'\n\nexport const processEx = (ex: unknown) => {\n const error = typeof ex === 'string' ? new Error(ex) : ex\n const exitCode\n = withErrnoException(error, (error) => {\n if (error.code === 'ENOENT') {\n console.error(chalk.red(`'${error.path}' not found.`))\n } else {\n console.error(chalk.red(`Errno: ${error.code}`))\n }\n return error.errno ?? -1\n })\n ?? withError(error, (error) => {\n console.error(chalk.red(`${error.name}: ${error.message}`))\n return -1\n })\n ?? (() => {\n console.error(chalk.red(`Unexpected Error: ${JSON.stringify(ex, null, 2)}`))\n return -1\n })()\n // This allows us to use a previously set exit code\n process.exit(process.exitCode ?? exitCode)\n}\n","export const withError = <T extends Error = Error>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ex: any,\n closure: (error: T) => number,\n predicate = (ex: T) => ex.name !== undefined && ex.message !== undefined,\n) => {\n return predicate(ex as T) ? closure(ex as T) : undefined\n}\n","import { withError } from './withError.ts'\n\nexport const withErrnoException = <T extends NodeJS.ErrnoException = NodeJS.ErrnoException>(ex: unknown, closure: (error: T) => number) => {\n return withError<T>(ex, closure, (ex: unknown) => (ex as NodeJS.ErrnoException).errno !== undefined)\n}\n","/** Catch child process a crash and returns the code */\n\nimport { processEx } from './processEx.ts'\n\nconst safeExit = (func: () => number, exitOnFail = true): number => {\n try {\n const result = func()\n if (result && exitOnFail) {\n process.exit(result)\n }\n return result\n } catch (ex) {\n return processEx(ex)\n }\n}\n\nconst safeExitAsync = async (func: () => Promise<number>, exitOnFail = true): Promise<number> => {\n try {\n const result = await func()\n if (result && exitOnFail) {\n process.exit(result)\n }\n return result\n } catch (ex) {\n return processEx(ex)\n }\n}\n\nexport { safeExit, safeExitAsync }\n","import { EOL } from 'node:os'\n\nimport chalk from 'chalk'\nimport { uniq } from 'lodash-es'\n\nimport { multiLineToJSONArray } from '../jsonFormatters.ts'\n\ninterface ChildFields {\n descriptor: string\n locator: string\n}\n\nconst trimVirtualMeta = (value: string): string => {\n const virtualParts = value.split('virtual:')\n if (virtualParts.length > 1) {\n const hashParts = virtualParts[1].split('#')\n return virtualParts[0] + hashParts[1]\n } else {\n return value\n }\n}\n\nconst trimObjectDependencyVirtualMeta = (obj: Record<string, ChildFields>): Record<string, ChildFields> => {\n const resultObj: Record<string, ChildFields> = {}\n for (const [key, value] of Object.entries(obj)) {\n resultObj[trimVirtualMeta(key)] = {\n descriptor: trimVirtualMeta(value.descriptor),\n locator: trimVirtualMeta(value.locator),\n }\n }\n return resultObj\n}\n\nconst trimDependencyVirtualMeta = (dependencies: DependencyEntries): DependencyEntries => {\n return dependencies.map((dependency) => {\n return { children: trimObjectDependencyVirtualMeta(dependency.children), value: trimVirtualMeta(dependency.value) }\n })\n}\n\ninterface DependencyEntry {\n children: Record<string, ChildFields>\n value: string\n}\n\ntype DependencyEntries = DependencyEntry[]\n\ninterface Results {\n currentVersion: string | undefined\n dependency: string\n duplicateVersions: string[]\n}\n\nexport class DuplicateDetector {\n private dependency: string\n private dependencyEntries: DependencyEntries\n\n constructor(output: string, dependency: string) {\n this.dependency = dependency\n this.dependencyEntries = trimDependencyVirtualMeta(multiLineToJSONArray(output))\n }\n\n detect() {\n // eslint-disable-next-line unicorn/no-array-reduce\n const result = this.dependencyEntries.reduce(this.detectReducer, this.resultsFactory(this.dependency))\n if (result.duplicateVersions.length > 0) {\n console.log(chalk.yellow(`${EOL}Duplicates found for: ${this.dependency}`))\n const duplicateVersions = result.duplicateVersions.toString().replaceAll(',', `${EOL} `)\n console.log(chalk.grey(` ${duplicateVersions}`, EOL))\n return 1\n } else {\n console.log(`${this.dependency} - OK`)\n return 0\n }\n }\n\n private detectReducer(acc: Results, entry: DependencyEntry) {\n const version = Object.entries(entry.children).map(([k]) => k)[0]\n\n if (!acc.currentVersion) {\n acc.currentVersion = version\n return acc\n }\n\n if (acc.currentVersion && acc.currentVersion !== version && !version.includes('@virtual:')) {\n // if first duplicate, push the current version as the first duplicate\n if (acc.duplicateVersions.length === 0) {\n acc.duplicateVersions.push(acc.currentVersion)\n }\n acc.duplicateVersions.push(version)\n acc.duplicateVersions = uniq(acc.duplicateVersions)\n }\n return acc\n }\n\n private resultsFactory = (dependency: string): Results => ({ currentVersion: undefined, dependency, duplicateVersions: [] })\n}\n","export const multiLineToJSONArray = (output: string) => {\n const withCommas = output.replaceAll('\\r\\n', '').replaceAll('\\n', ',')\n const cleanCollection = withCommas.slice(0, Math.max(0, withCommas.length - 1))\n const collection = `[${cleanCollection}]`\n return JSON.parse(collection)\n}\n"],"mappings":"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","names":["execSync","chalk","withError","ex","closure","predicate","name","undefined","message","withErrnoException","ex","closure","withError","errno","undefined","processEx","ex","error","Error","exitCode","withErrnoException","code","console","chalk","red","path","errno","withError","name","message","JSON","stringify","process","exit","safeExit","func","exitOnFail","result","process","exit","ex","processEx","EOL","chalk","uniq","multiLineToJSONArray","output","withCommas","replaceAll","cleanCollection","slice","Math","max","length","collection","JSON","parse","trimVirtualMeta","value","virtualParts","split","length","hashParts","trimObjectDependencyVirtualMeta","obj","resultObj","key","Object","entries","descriptor","locator","trimDependencyVirtualMeta","dependencies","map","dependency","children","DuplicateDetector","dependencyEntries","constructor","output","multiLineToJSONArray","detect","result","reduce","detectReducer","resultsFactory","duplicateVersions","console","log","chalk","yellow","EOL","toString","replaceAll","grey","acc","entry","version","k","currentVersion","includes","push","uniq","undefined","detectDuplicateDependencies","depsFromPackageJSON","DefaultDependencies","exitCode","dependencies","length","safeExit","dependency","output","cmd","execSync","toString","e","console","error","DuplicateDetector","detect","log"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/generateIgnoreFiles.ts","../../src/lib/file/constants.ts","../../src/lib/file/fileLines.ts","../../src/lib/string/empty.ts","../../src/lib/string/union.ts","../../src/lib/file/ReadFileSyncOptions.ts","../../src/lib/yarn/workspace/yarnWorkspaces.ts","../../src/lib/yarn/workspace/yarnWorkspace.ts","../../src/lib/yarn/yarnInitCwd.ts"],"sourcesContent":["import chalk from 'chalk'\n\nimport { readNonEmptyLines, writeLines } from './file/index.ts'\nimport { union } from './string/index.ts'\nimport { INIT_CWD, yarnWorkspace, yarnWorkspaces } from './yarn/index.ts'\n\nconst mergeEntries = (a: string[], b: string[]): string[] => [...union(a, b)].sort()\n\nexport const generateIgnoreFiles = (filename: string, pkg?: string) => {\n console.log(chalk.green(`Generate ${filename} Files`))\n const cwd = INIT_CWD() ?? '.'\n const workspaces = pkg ? [yarnWorkspace(pkg)] : yarnWorkspaces()\n const readEntries = (location: string): string[] => readNonEmptyLines(`${location}/${filename}`)\n const writeEntries = (location: string, entries: string[]) => writeLines(`${location}/${filename}`, entries)\n const results = workspaces.map(({ location, name }) => {\n try {\n writeEntries(location, mergeEntries(readEntries(cwd), readEntries(location)))\n return 0\n } catch (ex) {\n const error = ex as Error\n console.error(`Generate ${filename} Files [${name}] [${error.message}]`)\n return 1\n }\n })\n const succeeded = results.every((result) => result === 0)\n return succeeded ? 0 : 1\n}\n","export const WINDOWS_NEWLINE_REGEX = /\\r\\n/g\nexport const CROSS_PLATFORM_NEWLINE = '\\n'\n","import { existsSync, PathLike, readFileSync, WriteFileOptions, writeFileSync } from 'node:fs'\n\nimport { notEmpty } from '../string/index.ts'\nimport { CROSS_PLATFORM_NEWLINE, WINDOWS_NEWLINE_REGEX } from './constants.ts'\nimport { defaultReadFileSyncOptions, ReadFileSyncOptions } from './ReadFileSyncOptions.ts'\n\nexport const readLines = (uri: PathLike, options: ReadFileSyncOptions = defaultReadFileSyncOptions): string[] =>\n existsSync(uri) ? readFileSync(uri, options).replace(WINDOWS_NEWLINE_REGEX, CROSS_PLATFORM_NEWLINE).split(CROSS_PLATFORM_NEWLINE) : []\n\nexport const readNonEmptyLines = (uri: PathLike, options: ReadFileSyncOptions = defaultReadFileSyncOptions): string[] =>\n readLines(uri, options).filter(notEmpty)\n\nexport const writeLines = (uri: PathLike, lines: string[], options: WriteFileOptions = defaultReadFileSyncOptions) => {\n const existing = existsSync(uri) ? readFileSync(uri, options) : undefined\n const desired = lines.join(CROSS_PLATFORM_NEWLINE)\n // Check if the file is different before writing\n if (existing !== desired) writeFileSync(uri, desired, options)\n}\n","export const empty = (value?: string | undefined): boolean => value?.trim().length === 0\nexport const notEmpty = (value?: string | undefined): boolean => !empty(value)\n","export const union = (a: string[], b: string[]): Set<string> => new Set([...new Set(a), ...new Set(b)])\n","export type ReadFileSyncOptions = BufferEncoding | { encoding: BufferEncoding; flags?: string }\n\nexport const defaultReadFileSyncOptions: ReadFileSyncOptions = { encoding: 'utf8' }\n","import { spawnSync } from 'node:child_process'\n\nimport { Workspace } from './Workspace.ts'\n\nexport const yarnWorkspaces = (): Workspace[] => {\n const result = spawnSync('yarn', ['workspaces', 'list', '--json', '--recursive'], { encoding: 'utf8', shell: true })\n if (result.error) {\n throw result.error\n }\n return (\n result.stdout\n .toString()\n // NOTE: This probably doesn't work on Windows\n // TODO: Replace /r/n with /n first\n .split('\\n')\n .slice(0, -1)\n .map((item) => {\n return JSON.parse(item)\n })\n )\n}\n","import { Workspace } from './Workspace.ts'\nimport { yarnWorkspaces } from './yarnWorkspaces.ts'\n\nexport const yarnWorkspace = (pkg: string): Workspace => {\n const workspace = yarnWorkspaces().find(({ name }) => name === pkg)\n if (!workspace) throw new Error(`Workspace ${pkg} not found`)\n return workspace\n}\n","export const INIT_CWD = () => {\n if (!process.env.INIT_CWD) console.error('Missing INIT_CWD')\n return process.env.INIT_CWD\n}\n"],"mappings":"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","names":["WINDOWS_NEWLINE_REGEX","CROSS_PLATFORM_NEWLINE","empty","value","trim","length","notEmpty","union","a","b","Set","defaultReadFileSyncOptions","encoding","readLines","uri","options","defaultReadFileSyncOptions","existsSync","readFileSync","replace","WINDOWS_NEWLINE_REGEX","CROSS_PLATFORM_NEWLINE","split","readNonEmptyLines","filter","notEmpty","writeLines","lines","existing","undefined","desired","join","writeFileSync","yarnWorkspaces","result","spawnSync","encoding","shell","error","stdout","toString","split","slice","map","item","JSON","parse","yarnWorkspace","pkg","workspace","yarnWorkspaces","find","name","Error","INIT_CWD","process","env","console","error","mergeEntries","a","b","union","sort","generateIgnoreFiles","filename","pkg","console","log","chalk","green","cwd","INIT_CWD","workspaces","yarnWorkspace","yarnWorkspaces","readEntries","location","readNonEmptyLines","writeEntries","entries","writeLines","results","map","name","ex","error","message","succeeded","every","result"]}
1
+ {"version":3,"sources":["../../src/lib/generateIgnoreFiles.ts","../../src/lib/file/constants.ts","../../src/lib/file/fileLines.ts","../../src/lib/string/empty.ts","../../src/lib/string/union.ts","../../src/lib/file/ReadFileSyncOptions.ts","../../src/lib/yarn/workspace/yarnWorkspaces.ts","../../src/lib/yarn/workspace/yarnWorkspace.ts","../../src/lib/yarn/yarnInitCwd.ts"],"sourcesContent":["import chalk from 'chalk'\n\nimport { readNonEmptyLines, writeLines } from './file/index.ts'\nimport { union } from './string/index.ts'\nimport { INIT_CWD, yarnWorkspace, yarnWorkspaces } from './yarn/index.ts'\n\nconst mergeEntries = (a: string[], b: string[]): string[] => [...union(a, b)].sort()\n\nexport const generateIgnoreFiles = (filename: string, pkg?: string) => {\n console.log(chalk.green(`Generate ${filename} Files`))\n const cwd = INIT_CWD() ?? '.'\n const workspaces = pkg ? [yarnWorkspace(pkg)] : yarnWorkspaces()\n const readEntries = (location: string): string[] => readNonEmptyLines(`${location}/${filename}`)\n const writeEntries = (location: string, entries: string[]) => writeLines(`${location}/${filename}`, entries)\n const results = workspaces.map(({ location, name }) => {\n try {\n writeEntries(location, mergeEntries(readEntries(cwd), readEntries(location)))\n return 0\n } catch (ex) {\n const error = ex as Error\n console.error(`Generate ${filename} Files [${name}] [${error.message}]`)\n return 1\n }\n })\n const succeeded = results.every(result => result === 0)\n return succeeded ? 0 : 1\n}\n","export const WINDOWS_NEWLINE_REGEX = /\\r\\n/g\nexport const CROSS_PLATFORM_NEWLINE = '\\n'\n","import { existsSync, PathLike, readFileSync, WriteFileOptions, writeFileSync } from 'node:fs'\n\nimport { notEmpty } from '../string/index.ts'\nimport { CROSS_PLATFORM_NEWLINE, WINDOWS_NEWLINE_REGEX } from './constants.ts'\nimport { defaultReadFileSyncOptions, ReadFileSyncOptions } from './ReadFileSyncOptions.ts'\n\nexport const readLines = (uri: PathLike, options: ReadFileSyncOptions = defaultReadFileSyncOptions): string[] =>\n existsSync(uri) ? readFileSync(uri, options).replace(WINDOWS_NEWLINE_REGEX, CROSS_PLATFORM_NEWLINE).split(CROSS_PLATFORM_NEWLINE) : []\n\nexport const readNonEmptyLines = (uri: PathLike, options: ReadFileSyncOptions = defaultReadFileSyncOptions): string[] =>\n readLines(uri, options).filter(notEmpty)\n\nexport const writeLines = (uri: PathLike, lines: string[], options: WriteFileOptions = defaultReadFileSyncOptions) => {\n const existing = existsSync(uri) ? readFileSync(uri, options) : undefined\n const desired = lines.join(CROSS_PLATFORM_NEWLINE)\n // Check if the file is different before writing\n if (existing !== desired) writeFileSync(uri, desired, options)\n}\n","export const empty = (value?: string | undefined): boolean => value?.trim().length === 0\nexport const notEmpty = (value?: string | undefined): boolean => !empty(value)\n","export const union = (a: string[], b: string[]): Set<string> => new Set([...new Set(a), ...new Set(b)])\n","export type ReadFileSyncOptions = BufferEncoding | { encoding: BufferEncoding; flags?: string }\n\nexport const defaultReadFileSyncOptions: ReadFileSyncOptions = { encoding: 'utf8' }\n","import { spawnSync } from 'node:child_process'\n\nimport { Workspace } from './Workspace.ts'\n\nexport const yarnWorkspaces = (): Workspace[] => {\n const result = spawnSync('yarn', ['workspaces', 'list', '--json', '--recursive'], { encoding: 'utf8', shell: true })\n if (result.error) {\n throw result.error\n }\n return (\n result.stdout\n .toString()\n // NOTE: This probably doesn't work on Windows\n // TODO: Replace /r/n with /n first\n .split('\\n')\n .slice(0, -1)\n .map((item) => {\n return JSON.parse(item)\n })\n )\n}\n","import { Workspace } from './Workspace.ts'\nimport { yarnWorkspaces } from './yarnWorkspaces.ts'\n\nexport const yarnWorkspace = (pkg: string): Workspace => {\n const workspace = yarnWorkspaces().find(({ name }) => name === pkg)\n if (!workspace) throw new Error(`Workspace ${pkg} not found`)\n return workspace\n}\n","export const INIT_CWD = () => {\n if (!process.env.INIT_CWD) console.error('Missing INIT_CWD')\n return process.env.INIT_CWD\n}\n"],"mappings":"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","names":["WINDOWS_NEWLINE_REGEX","CROSS_PLATFORM_NEWLINE","empty","value","trim","length","notEmpty","union","a","b","Set","defaultReadFileSyncOptions","encoding","readLines","uri","options","defaultReadFileSyncOptions","existsSync","readFileSync","replace","WINDOWS_NEWLINE_REGEX","CROSS_PLATFORM_NEWLINE","split","readNonEmptyLines","filter","notEmpty","writeLines","lines","existing","undefined","desired","join","writeFileSync","yarnWorkspaces","result","spawnSync","encoding","shell","error","stdout","toString","split","slice","map","item","JSON","parse","yarnWorkspace","pkg","workspace","yarnWorkspaces","find","name","Error","INIT_CWD","process","env","console","error","mergeEntries","a","b","union","sort","generateIgnoreFiles","filename","pkg","console","log","chalk","green","cwd","INIT_CWD","workspaces","yarnWorkspace","yarnWorkspaces","readEntries","location","readNonEmptyLines","writeEntries","entries","writeLines","results","map","name","ex","error","message","succeeded","every","result"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/generateIgnoreFiles.ts","../../src/lib/file/constants.ts","../../src/lib/file/fileLines.ts","../../src/lib/string/empty.ts","../../src/lib/string/union.ts","../../src/lib/file/ReadFileSyncOptions.ts","../../src/lib/yarn/workspace/yarnWorkspaces.ts","../../src/lib/yarn/workspace/yarnWorkspace.ts","../../src/lib/yarn/yarnInitCwd.ts"],"sourcesContent":["import chalk from 'chalk'\n\nimport { readNonEmptyLines, writeLines } from './file/index.ts'\nimport { union } from './string/index.ts'\nimport { INIT_CWD, yarnWorkspace, yarnWorkspaces } from './yarn/index.ts'\n\nconst mergeEntries = (a: string[], b: string[]): string[] => [...union(a, b)].sort()\n\nexport const generateIgnoreFiles = (filename: string, pkg?: string) => {\n console.log(chalk.green(`Generate ${filename} Files`))\n const cwd = INIT_CWD() ?? '.'\n const workspaces = pkg ? [yarnWorkspace(pkg)] : yarnWorkspaces()\n const readEntries = (location: string): string[] => readNonEmptyLines(`${location}/${filename}`)\n const writeEntries = (location: string, entries: string[]) => writeLines(`${location}/${filename}`, entries)\n const results = workspaces.map(({ location, name }) => {\n try {\n writeEntries(location, mergeEntries(readEntries(cwd), readEntries(location)))\n return 0\n } catch (ex) {\n const error = ex as Error\n console.error(`Generate ${filename} Files [${name}] [${error.message}]`)\n return 1\n }\n })\n const succeeded = results.every((result) => result === 0)\n return succeeded ? 0 : 1\n}\n","export const WINDOWS_NEWLINE_REGEX = /\\r\\n/g\nexport const CROSS_PLATFORM_NEWLINE = '\\n'\n","import { existsSync, PathLike, readFileSync, WriteFileOptions, writeFileSync } from 'node:fs'\n\nimport { notEmpty } from '../string/index.ts'\nimport { CROSS_PLATFORM_NEWLINE, WINDOWS_NEWLINE_REGEX } from './constants.ts'\nimport { defaultReadFileSyncOptions, ReadFileSyncOptions } from './ReadFileSyncOptions.ts'\n\nexport const readLines = (uri: PathLike, options: ReadFileSyncOptions = defaultReadFileSyncOptions): string[] =>\n existsSync(uri) ? readFileSync(uri, options).replace(WINDOWS_NEWLINE_REGEX, CROSS_PLATFORM_NEWLINE).split(CROSS_PLATFORM_NEWLINE) : []\n\nexport const readNonEmptyLines = (uri: PathLike, options: ReadFileSyncOptions = defaultReadFileSyncOptions): string[] =>\n readLines(uri, options).filter(notEmpty)\n\nexport const writeLines = (uri: PathLike, lines: string[], options: WriteFileOptions = defaultReadFileSyncOptions) => {\n const existing = existsSync(uri) ? readFileSync(uri, options) : undefined\n const desired = lines.join(CROSS_PLATFORM_NEWLINE)\n // Check if the file is different before writing\n if (existing !== desired) writeFileSync(uri, desired, options)\n}\n","export const empty = (value?: string | undefined): boolean => value?.trim().length === 0\nexport const notEmpty = (value?: string | undefined): boolean => !empty(value)\n","export const union = (a: string[], b: string[]): Set<string> => new Set([...new Set(a), ...new Set(b)])\n","export type ReadFileSyncOptions = BufferEncoding | { encoding: BufferEncoding; flags?: string }\n\nexport const defaultReadFileSyncOptions: ReadFileSyncOptions = { encoding: 'utf8' }\n","import { spawnSync } from 'node:child_process'\n\nimport { Workspace } from './Workspace.ts'\n\nexport const yarnWorkspaces = (): Workspace[] => {\n const result = spawnSync('yarn', ['workspaces', 'list', '--json', '--recursive'], { encoding: 'utf8', shell: true })\n if (result.error) {\n throw result.error\n }\n return (\n result.stdout\n .toString()\n // NOTE: This probably doesn't work on Windows\n // TODO: Replace /r/n with /n first\n .split('\\n')\n .slice(0, -1)\n .map((item) => {\n return JSON.parse(item)\n })\n )\n}\n","import { Workspace } from './Workspace.ts'\nimport { yarnWorkspaces } from './yarnWorkspaces.ts'\n\nexport const yarnWorkspace = (pkg: string): Workspace => {\n const workspace = yarnWorkspaces().find(({ name }) => name === pkg)\n if (!workspace) throw new Error(`Workspace ${pkg} not found`)\n return workspace\n}\n","export const INIT_CWD = () => {\n if (!process.env.INIT_CWD) console.error('Missing INIT_CWD')\n return process.env.INIT_CWD\n}\n"],"mappings":"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","names":["chalk","WINDOWS_NEWLINE_REGEX","CROSS_PLATFORM_NEWLINE","existsSync","readFileSync","writeFileSync","empty","value","trim","length","notEmpty","union","a","b","Set","defaultReadFileSyncOptions","encoding","readLines","uri","options","defaultReadFileSyncOptions","existsSync","readFileSync","replace","WINDOWS_NEWLINE_REGEX","CROSS_PLATFORM_NEWLINE","split","readNonEmptyLines","filter","notEmpty","writeLines","lines","existing","undefined","desired","join","writeFileSync","spawnSync","yarnWorkspaces","result","spawnSync","encoding","shell","error","stdout","toString","split","slice","map","item","JSON","parse","yarnWorkspace","pkg","workspace","yarnWorkspaces","find","name","Error","INIT_CWD","process","env","console","error","mergeEntries","a","b","union","sort","generateIgnoreFiles","filename","pkg","console","log","chalk","green","cwd","INIT_CWD","workspaces","yarnWorkspace","yarnWorkspaces","readEntries","location","readNonEmptyLines","writeEntries","entries","writeLines","results","map","name","ex","error","message","succeeded","every","result"]}
1
+ {"version":3,"sources":["../../src/lib/generateIgnoreFiles.ts","../../src/lib/file/constants.ts","../../src/lib/file/fileLines.ts","../../src/lib/string/empty.ts","../../src/lib/string/union.ts","../../src/lib/file/ReadFileSyncOptions.ts","../../src/lib/yarn/workspace/yarnWorkspaces.ts","../../src/lib/yarn/workspace/yarnWorkspace.ts","../../src/lib/yarn/yarnInitCwd.ts"],"sourcesContent":["import chalk from 'chalk'\n\nimport { readNonEmptyLines, writeLines } from './file/index.ts'\nimport { union } from './string/index.ts'\nimport { INIT_CWD, yarnWorkspace, yarnWorkspaces } from './yarn/index.ts'\n\nconst mergeEntries = (a: string[], b: string[]): string[] => [...union(a, b)].sort()\n\nexport const generateIgnoreFiles = (filename: string, pkg?: string) => {\n console.log(chalk.green(`Generate ${filename} Files`))\n const cwd = INIT_CWD() ?? '.'\n const workspaces = pkg ? [yarnWorkspace(pkg)] : yarnWorkspaces()\n const readEntries = (location: string): string[] => readNonEmptyLines(`${location}/${filename}`)\n const writeEntries = (location: string, entries: string[]) => writeLines(`${location}/${filename}`, entries)\n const results = workspaces.map(({ location, name }) => {\n try {\n writeEntries(location, mergeEntries(readEntries(cwd), readEntries(location)))\n return 0\n } catch (ex) {\n const error = ex as Error\n console.error(`Generate ${filename} Files [${name}] [${error.message}]`)\n return 1\n }\n })\n const succeeded = results.every(result => result === 0)\n return succeeded ? 0 : 1\n}\n","export const WINDOWS_NEWLINE_REGEX = /\\r\\n/g\nexport const CROSS_PLATFORM_NEWLINE = '\\n'\n","import { existsSync, PathLike, readFileSync, WriteFileOptions, writeFileSync } from 'node:fs'\n\nimport { notEmpty } from '../string/index.ts'\nimport { CROSS_PLATFORM_NEWLINE, WINDOWS_NEWLINE_REGEX } from './constants.ts'\nimport { defaultReadFileSyncOptions, ReadFileSyncOptions } from './ReadFileSyncOptions.ts'\n\nexport const readLines = (uri: PathLike, options: ReadFileSyncOptions = defaultReadFileSyncOptions): string[] =>\n existsSync(uri) ? readFileSync(uri, options).replace(WINDOWS_NEWLINE_REGEX, CROSS_PLATFORM_NEWLINE).split(CROSS_PLATFORM_NEWLINE) : []\n\nexport const readNonEmptyLines = (uri: PathLike, options: ReadFileSyncOptions = defaultReadFileSyncOptions): string[] =>\n readLines(uri, options).filter(notEmpty)\n\nexport const writeLines = (uri: PathLike, lines: string[], options: WriteFileOptions = defaultReadFileSyncOptions) => {\n const existing = existsSync(uri) ? readFileSync(uri, options) : undefined\n const desired = lines.join(CROSS_PLATFORM_NEWLINE)\n // Check if the file is different before writing\n if (existing !== desired) writeFileSync(uri, desired, options)\n}\n","export const empty = (value?: string | undefined): boolean => value?.trim().length === 0\nexport const notEmpty = (value?: string | undefined): boolean => !empty(value)\n","export const union = (a: string[], b: string[]): Set<string> => new Set([...new Set(a), ...new Set(b)])\n","export type ReadFileSyncOptions = BufferEncoding | { encoding: BufferEncoding; flags?: string }\n\nexport const defaultReadFileSyncOptions: ReadFileSyncOptions = { encoding: 'utf8' }\n","import { spawnSync } from 'node:child_process'\n\nimport { Workspace } from './Workspace.ts'\n\nexport const yarnWorkspaces = (): Workspace[] => {\n const result = spawnSync('yarn', ['workspaces', 'list', '--json', '--recursive'], { encoding: 'utf8', shell: true })\n if (result.error) {\n throw result.error\n }\n return (\n result.stdout\n .toString()\n // NOTE: This probably doesn't work on Windows\n // TODO: Replace /r/n with /n first\n .split('\\n')\n .slice(0, -1)\n .map((item) => {\n return JSON.parse(item)\n })\n )\n}\n","import { Workspace } from './Workspace.ts'\nimport { yarnWorkspaces } from './yarnWorkspaces.ts'\n\nexport const yarnWorkspace = (pkg: string): Workspace => {\n const workspace = yarnWorkspaces().find(({ name }) => name === pkg)\n if (!workspace) throw new Error(`Workspace ${pkg} not found`)\n return workspace\n}\n","export const INIT_CWD = () => {\n if (!process.env.INIT_CWD) console.error('Missing INIT_CWD')\n return process.env.INIT_CWD\n}\n"],"mappings":"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","names":["chalk","WINDOWS_NEWLINE_REGEX","CROSS_PLATFORM_NEWLINE","existsSync","readFileSync","writeFileSync","empty","value","trim","length","notEmpty","union","a","b","Set","defaultReadFileSyncOptions","encoding","readLines","uri","options","defaultReadFileSyncOptions","existsSync","readFileSync","replace","WINDOWS_NEWLINE_REGEX","CROSS_PLATFORM_NEWLINE","split","readNonEmptyLines","filter","notEmpty","writeLines","lines","existing","undefined","desired","join","writeFileSync","spawnSync","yarnWorkspaces","result","spawnSync","encoding","shell","error","stdout","toString","split","slice","map","item","JSON","parse","yarnWorkspace","pkg","workspace","yarnWorkspaces","find","name","Error","INIT_CWD","process","env","console","error","mergeEntries","a","b","union","sort","generateIgnoreFiles","filename","pkg","console","log","chalk","green","cwd","INIT_CWD","workspaces","yarnWorkspace","yarnWorkspaces","readEntries","location","readNonEmptyLines","writeEntries","entries","writeLines","results","map","name","ex","error","message","succeeded","every","result"]}
@@ -303,19 +303,16 @@ var detectDuplicateDependencies = /* @__PURE__ */ __name((depsFromPackageJSON, D
303
303
  } catch (e) {
304
304
  console.error(`Error running yarn why: ${e}`);
305
305
  exitCode = 1;
306
- exitCode;
307
306
  continue;
308
307
  }
309
308
  if (output) {
310
309
  exitCode = new DuplicateDetector(output, dependency).detect();
311
- exitCode;
312
310
  } else {
313
311
  console.log(`${dependency} - N/A`);
314
312
  if (depsFromPackageJSON) {
315
313
  exitCode = 1;
316
314
  console.log(`\u{1F6A8} Library ${dependency} was requested in package.json but not found`);
317
315
  }
318
- exitCode;
319
316
  }
320
317
  }
321
318
  return exitCode;