@rushstack/npm-check-fork 0.1.13 → 0.2.0

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 (109) hide show
  1. package/CHANGELOG.json +37 -0
  2. package/CHANGELOG.md +15 -1
  3. package/{lib → lib-commonjs}/GetLatestFromRegistry.js +1 -1
  4. package/lib-commonjs/GetLatestFromRegistry.js.map +1 -0
  5. package/lib-commonjs/tests/GetLatestFromRegistry.test.js.map +1 -0
  6. package/lib-esm/BestGuessHomepage.js +19 -0
  7. package/lib-esm/BestGuessHomepage.js.map +1 -0
  8. package/lib-esm/CreatePackageSummary.js +78 -0
  9. package/lib-esm/CreatePackageSummary.js.map +1 -0
  10. package/lib-esm/FindModulePath.js +21 -0
  11. package/lib-esm/FindModulePath.js.map +1 -0
  12. package/lib-esm/GetLatestFromRegistry.js +71 -0
  13. package/lib-esm/GetLatestFromRegistry.js.map +1 -0
  14. package/lib-esm/NpmCheck.js +23 -0
  15. package/lib-esm/NpmCheck.js.map +1 -0
  16. package/lib-esm/NpmCheckState.js +19 -0
  17. package/lib-esm/NpmCheckState.js.map +1 -0
  18. package/lib-esm/NpmRegistryClient.js +134 -0
  19. package/lib-esm/NpmRegistryClient.js.map +1 -0
  20. package/lib-esm/ReadPackageJson.js +18 -0
  21. package/lib-esm/ReadPackageJson.js.map +1 -0
  22. package/lib-esm/index.js +4 -0
  23. package/lib-esm/index.js.map +1 -0
  24. package/lib-esm/interfaces/INpmCheck.js +6 -0
  25. package/lib-esm/interfaces/INpmCheck.js.map +1 -0
  26. package/lib-esm/interfaces/INpmCheckPackageSummary.js +2 -0
  27. package/lib-esm/interfaces/INpmCheckPackageSummary.js.map +1 -0
  28. package/lib-esm/interfaces/INpmCheckRegistry.js +2 -0
  29. package/lib-esm/interfaces/INpmCheckRegistry.js.map +1 -0
  30. package/lib-esm/tests/BestGuessHomepage.test.js.map +1 -0
  31. package/lib-esm/tests/CreatePackageSummary.test.js.map +1 -0
  32. package/lib-esm/tests/FindModulePath.test.js.map +1 -0
  33. package/lib-esm/tests/GetLatestFromRegistry.test.js.map +1 -0
  34. package/lib-esm/tests/NpmCheck.test.js.map +1 -0
  35. package/lib-esm/tests/NpmCheckState.test.js.map +1 -0
  36. package/lib-esm/tests/NpmRegistryClient.test.js.map +1 -0
  37. package/lib-esm/tests/ReadPackageJson.test.js.map +1 -0
  38. package/package.json +30 -8
  39. package/lib/GetLatestFromRegistry.js.map +0 -1
  40. package/lib/tests/GetLatestFromRegistry.test.js.map +0 -1
  41. /package/{lib → lib-commonjs}/BestGuessHomepage.js +0 -0
  42. /package/{lib → lib-commonjs}/BestGuessHomepage.js.map +0 -0
  43. /package/{lib → lib-commonjs}/CreatePackageSummary.js +0 -0
  44. /package/{lib → lib-commonjs}/CreatePackageSummary.js.map +0 -0
  45. /package/{lib → lib-commonjs}/FindModulePath.js +0 -0
  46. /package/{lib → lib-commonjs}/FindModulePath.js.map +0 -0
  47. /package/{lib → lib-commonjs}/NpmCheck.js +0 -0
  48. /package/{lib → lib-commonjs}/NpmCheck.js.map +0 -0
  49. /package/{lib → lib-commonjs}/NpmCheckState.js +0 -0
  50. /package/{lib → lib-commonjs}/NpmCheckState.js.map +0 -0
  51. /package/{lib → lib-commonjs}/NpmRegistryClient.js +0 -0
  52. /package/{lib → lib-commonjs}/NpmRegistryClient.js.map +0 -0
  53. /package/{lib → lib-commonjs}/ReadPackageJson.js +0 -0
  54. /package/{lib → lib-commonjs}/ReadPackageJson.js.map +0 -0
  55. /package/{lib → lib-commonjs}/index.js +0 -0
  56. /package/{lib → lib-commonjs}/index.js.map +0 -0
  57. /package/{lib → lib-commonjs}/interfaces/INpmCheck.js +0 -0
  58. /package/{lib → lib-commonjs}/interfaces/INpmCheck.js.map +0 -0
  59. /package/{lib → lib-commonjs}/interfaces/INpmCheckPackageSummary.js +0 -0
  60. /package/{lib → lib-commonjs}/interfaces/INpmCheckPackageSummary.js.map +0 -0
  61. /package/{lib → lib-commonjs}/interfaces/INpmCheckRegistry.js +0 -0
  62. /package/{lib → lib-commonjs}/interfaces/INpmCheckRegistry.js.map +0 -0
  63. /package/{lib → lib-commonjs}/tests/BestGuessHomepage.test.js.map +0 -0
  64. /package/{lib → lib-commonjs}/tests/CreatePackageSummary.test.js.map +0 -0
  65. /package/{lib → lib-commonjs}/tests/FindModulePath.test.js.map +0 -0
  66. /package/{lib → lib-commonjs}/tests/NpmCheck.test.js.map +0 -0
  67. /package/{lib → lib-commonjs}/tests/NpmCheckState.test.js.map +0 -0
  68. /package/{lib → lib-commonjs}/tests/NpmRegistryClient.test.js.map +0 -0
  69. /package/{lib → lib-commonjs}/tests/ReadPackageJson.test.js.map +0 -0
  70. /package/{lib → lib-dts}/BestGuessHomepage.d.ts +0 -0
  71. /package/{lib → lib-dts}/BestGuessHomepage.d.ts.map +0 -0
  72. /package/{lib → lib-dts}/CreatePackageSummary.d.ts +0 -0
  73. /package/{lib → lib-dts}/CreatePackageSummary.d.ts.map +0 -0
  74. /package/{lib → lib-dts}/FindModulePath.d.ts +0 -0
  75. /package/{lib → lib-dts}/FindModulePath.d.ts.map +0 -0
  76. /package/{lib → lib-dts}/GetLatestFromRegistry.d.ts +0 -0
  77. /package/{lib → lib-dts}/GetLatestFromRegistry.d.ts.map +0 -0
  78. /package/{lib → lib-dts}/NpmCheck.d.ts +0 -0
  79. /package/{lib → lib-dts}/NpmCheck.d.ts.map +0 -0
  80. /package/{lib → lib-dts}/NpmCheckState.d.ts +0 -0
  81. /package/{lib → lib-dts}/NpmCheckState.d.ts.map +0 -0
  82. /package/{lib → lib-dts}/NpmRegistryClient.d.ts +0 -0
  83. /package/{lib → lib-dts}/NpmRegistryClient.d.ts.map +0 -0
  84. /package/{lib → lib-dts}/ReadPackageJson.d.ts +0 -0
  85. /package/{lib → lib-dts}/ReadPackageJson.d.ts.map +0 -0
  86. /package/{lib → lib-dts}/index.d.ts +0 -0
  87. /package/{lib → lib-dts}/index.d.ts.map +0 -0
  88. /package/{lib → lib-dts}/interfaces/INpmCheck.d.ts +0 -0
  89. /package/{lib → lib-dts}/interfaces/INpmCheck.d.ts.map +0 -0
  90. /package/{lib → lib-dts}/interfaces/INpmCheckPackageSummary.d.ts +0 -0
  91. /package/{lib → lib-dts}/interfaces/INpmCheckPackageSummary.d.ts.map +0 -0
  92. /package/{lib → lib-dts}/interfaces/INpmCheckRegistry.d.ts +0 -0
  93. /package/{lib → lib-dts}/interfaces/INpmCheckRegistry.d.ts.map +0 -0
  94. /package/{lib → lib-dts}/tests/BestGuessHomepage.test.d.ts +0 -0
  95. /package/{lib → lib-dts}/tests/BestGuessHomepage.test.d.ts.map +0 -0
  96. /package/{lib → lib-dts}/tests/CreatePackageSummary.test.d.ts +0 -0
  97. /package/{lib → lib-dts}/tests/CreatePackageSummary.test.d.ts.map +0 -0
  98. /package/{lib → lib-dts}/tests/FindModulePath.test.d.ts +0 -0
  99. /package/{lib → lib-dts}/tests/FindModulePath.test.d.ts.map +0 -0
  100. /package/{lib → lib-dts}/tests/GetLatestFromRegistry.test.d.ts +0 -0
  101. /package/{lib → lib-dts}/tests/GetLatestFromRegistry.test.d.ts.map +0 -0
  102. /package/{lib → lib-dts}/tests/NpmCheck.test.d.ts +0 -0
  103. /package/{lib → lib-dts}/tests/NpmCheck.test.d.ts.map +0 -0
  104. /package/{lib → lib-dts}/tests/NpmCheckState.test.d.ts +0 -0
  105. /package/{lib → lib-dts}/tests/NpmCheckState.test.d.ts.map +0 -0
  106. /package/{lib → lib-dts}/tests/NpmRegistryClient.test.d.ts +0 -0
  107. /package/{lib → lib-dts}/tests/NpmRegistryClient.test.d.ts.map +0 -0
  108. /package/{lib → lib-dts}/tests/ReadPackageJson.test.d.ts +0 -0
  109. /package/{lib → lib-dts}/tests/ReadPackageJson.test.d.ts.map +0 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=INpmCheckRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"INpmCheckRegistry.js","sourceRoot":"","sources":["../../src/interfaces/INpmCheckRegistry.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * The result returned by getNpmInfo for a single package.\n */\nexport interface INpmRegistryInfo {\n latest?: string;\n next?: string;\n versions?: string[];\n homepage?: string;\n error?: string;\n}\n\ninterface INpmCheckRegistryInfoBugs {\n url?: string;\n}\ninterface INpmCheckRepository {\n url?: string;\n}\nexport interface INpmCheckPackageVersion {\n homepage?: string;\n bugs?: INpmCheckRegistryInfoBugs;\n repository?: INpmCheckRepository;\n}\nexport interface INpmCheckRegistryData {\n versions: Record<string, INpmCheckPackageVersion>;\n ['dist-tags']: { latest: string };\n}\n\n/**\n * Metadata for a specific package version from the npm registry.\n *\n * @remarks\n * This interface extends the existing INpmCheckPackageVersion with additional\n * fields that are present in the npm registry response.\n *\n * @see https://github.com/npm/registry/blob/main/docs/responses/package-metadata.md\n */\nexport interface INpmRegistryVersionMetadata extends INpmCheckPackageVersion {\n /** Package name */\n name: string;\n\n /** Version string */\n version: string;\n}\n\n/**\n * Response structure from npm registry API for full metadata.\n *\n * @remarks\n * This interface represents the full response from the npm registry when\n * fetching package metadata. It is structurally compatible with INpmCheckRegistryData\n * to maintain compatibility with existing code like bestGuessHomepage.\n *\n * @see https://github.com/npm/registry/blob/main/docs/responses/package-metadata.md\n */\nexport interface INpmRegistryPackageResponse {\n /** Package name */\n name: string;\n\n /** Distribution tags (latest, next, etc.) */\n 'dist-tags': Record<string, string>;\n\n /** All published versions with their metadata */\n versions: Record<string, INpmRegistryVersionMetadata>;\n\n /** Modification timestamps for each version */\n time?: Record<string, string>;\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BestGuessHomepage.test.js","sourceRoot":"","sources":["../../src/tests/BestGuessHomepage.test.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAE7D,OAAO,iBAAiB,MAAM,sBAAsB,CAAC;AAGrD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,IAAI,GAA0B;YAClC,QAAQ,EAAE;gBACR,MAAM,EAAE;oBACN,QAAQ,EAAE,sBAAsB;iBACjC;aACF;YACD,WAAW,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;SAClC,CAAC;QACF,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,IAAI,GAA0B;YAClC,QAAQ,EAAE;gBACR,MAAM,EAAE;oBACN,IAAI,EAAE,EAAE,GAAG,EAAE,kBAAkB,EAAE;iBAClC;aACF;YACD,WAAW,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;SAClC,CAAC;QACF,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,IAAI,GAA0B;YAClC,QAAQ,EAAE;gBACR,MAAM,EAAE;oBACN,UAAU,EAAE,EAAE,GAAG,EAAE,kBAAkB,EAAE;iBACxC;aACF;YACD,WAAW,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;SAClC,CAAC;QACF,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,IAAI,GAA0B;YAClC,QAAQ,EAAE;gBACR,MAAM,EAAE,EAAE;aACX;YACD,WAAW,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;SAClC,CAAC;QACF,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// Mock gitUrl.parse\njest.mock('giturl', () => ({ parse: (url: string) => url }));\n\nimport bestGuessHomepage from '../BestGuessHomepage';\nimport type { INpmCheckRegistryData } from '../interfaces/INpmCheckRegistry';\n\ndescribe('bestGuessHomepage', () => {\n it('returns false if data is undefined', () => {\n expect(bestGuessHomepage(undefined)).toBe(false);\n });\n\n it('returns homepage if present', () => {\n const data: INpmCheckRegistryData = {\n versions: {\n latest: {\n homepage: 'https://homepage.com'\n }\n },\n 'dist-tags': { latest: 'latest' }\n };\n expect(bestGuessHomepage(data)).toBe('https://homepage.com');\n });\n\n it('returns bugs.url if homepage is missing', () => {\n const data: INpmCheckRegistryData = {\n versions: {\n latest: {\n bugs: { url: 'https://bugs.com' }\n }\n },\n 'dist-tags': { latest: 'latest' }\n };\n expect(bestGuessHomepage(data)).toBe('https://bugs.com');\n });\n\n it('returns repository.url if homepage and bugs.url are missing', () => {\n const data: INpmCheckRegistryData = {\n versions: {\n latest: {\n repository: { url: 'https://repo.com' }\n }\n },\n 'dist-tags': { latest: 'latest' }\n };\n expect(bestGuessHomepage(data)).toBe('https://repo.com');\n });\n\n it('returns false if no homepage, bugs.url, or repository.url', () => {\n const data: INpmCheckRegistryData = {\n versions: {\n latest: {}\n },\n 'dist-tags': { latest: 'latest' }\n };\n expect(bestGuessHomepage(data)).toBe(false);\n });\n});\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreatePackageSummary.test.js","sourceRoot":"","sources":["../../src/tests/CreatePackageSummary.test.ts"],"names":[],"mappings":"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","sourcesContent":["jest.mock('../GetLatestFromRegistry');\njest.mock('../ReadPackageJson');\njest.mock('../FindModulePath');\n\nimport createPackageSummary from '../CreatePackageSummary';\nimport getLatestFromRegistry from '../GetLatestFromRegistry';\nimport readPackageJson from '../ReadPackageJson';\nimport findModulePath from '../FindModulePath';\nimport type { INpmCheckState, INpmCheckPackageJson } from '../interfaces/INpmCheck';\nimport type { INpmRegistryInfo } from '../interfaces/INpmCheckRegistry';\nimport type { INpmCheckPackageSummary } from '../interfaces/INpmCheckPackageSummary';\n\nconst mockGetLatestFromRegistry = getLatestFromRegistry as jest.MockedFunction<typeof getLatestFromRegistry>;\nconst mockReadPackageJson = readPackageJson as jest.MockedFunction<typeof readPackageJson>;\nconst mockFindModulePath = findModulePath as jest.MockedFunction<typeof findModulePath>;\n\ndescribe('createPackageSummary', () => {\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n it('returns false for private package', async () => {\n mockFindModulePath.mockReturnValue('/mock/path/private-pkg');\n mockReadPackageJson.mockReturnValue({\n dependencies: {},\n devDependencies: {},\n private: true\n } as INpmCheckPackageJson);\n const state: INpmCheckState = {\n cwd: process.cwd(),\n cwdPackageJson: { dependencies: {}, devDependencies: {} }\n };\n const result: INpmCheckPackageSummary | boolean = await createPackageSummary('private-pkg', state);\n expect(result).toBe(false);\n });\n\n it('returns false for invalid semver range', async () => {\n mockFindModulePath.mockReturnValue('/mock/path');\n mockReadPackageJson.mockReturnValue({\n dependencies: {},\n devDependencies: {}\n } as INpmCheckPackageJson);\n const state: INpmCheckState = {\n cwd: process.cwd(),\n cwdPackageJson: {\n dependencies: { 'bad-pkg': 'github:foo/bar' },\n devDependencies: {}\n }\n };\n const result: INpmCheckPackageSummary | boolean = await createPackageSummary('bad-pkg', state);\n expect(result).toBe(false);\n });\n\n it('returns summary for valid package', async () => {\n mockFindModulePath.mockReturnValue('/mock/path');\n mockReadPackageJson.mockReturnValue({\n dependencies: {},\n devDependencies: {}\n } as INpmCheckPackageJson);\n mockGetLatestFromRegistry.mockResolvedValue({\n latest: '2.0.0',\n next: '3.0.0',\n versions: ['1.0.0', '2.0.0', '3.0.0'],\n homepage: 'https://homepage.com'\n } as INpmRegistryInfo);\n const state: INpmCheckState = {\n cwd: process.cwd(),\n cwdPackageJson: { dependencies: { 'good-pkg': '1.0.0' }, devDependencies: {} },\n unusedDependencies: ['good-pkg'],\n missingFromPackageJson: {}\n } as INpmCheckState;\n const result: INpmCheckPackageSummary | boolean = await createPackageSummary('good-pkg', state);\n expect(result).toBeTruthy();\n expect(result).toHaveProperty('moduleName', 'good-pkg');\n expect(result).toHaveProperty('homepage', 'https://homepage.com');\n expect(result).toHaveProperty('latest', '2.0.0');\n expect(result).toHaveProperty('installed', '1.0.0');\n });\n});\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FindModulePath.test.js","sourceRoot":"","sources":["../../src/tests/FindModulePath.test.ts"],"names":[],"mappings":"AAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACvB,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,mCAAmC;CACpC,CAAC,CAAC,CAAC;AAEJ,OAAO,cAAc,MAAM,mBAAmB,CAAC;AAE/C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAEtC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI;aACD,KAAK,CAAC,MAAM,EAAE,kBAAkB,CAAC;aACjC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC,yBAAyB,EAAE,iCAAiC,CAAC,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,EAAE;QACZ,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,KAAK,GAAmB,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAoB,CAAC;QACpF,MAAM,MAAM,GAAG,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,KAAK,GAAmB,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAoB,CAAC;QACpF,MAAM,MAAM,GAAG,cAAc,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["jest.mock('path', () => ({\n join: jest.fn((...args) => args.join('/'))\n // Add other path methods as needed\n}));\n\nimport findModulePath from '../FindModulePath';\nimport type { INpmCheckState } from '../interfaces/INpmCheck';\nimport path from 'node:path';\n\nconst Module = require('node:module');\n\ndescribe('findModulePath', () => {\n beforeAll(() => {\n jest\n .spyOn(Module, '_nodeModulePaths')\n .mockImplementation(() => ['/mock/path/node_modules', '/another/mock/path/node_modules']);\n });\n\n afterAll(() => {\n jest.restoreAllMocks();\n });\n\n it('returns found path', () => {\n const state: INpmCheckState = { cwd: '/test/cwd', global: false } as INpmCheckState;\n const result = findModulePath('my-module', state);\n expect(result).toBe(path.join('/test/cwd', 'my-module'));\n });\n\n it('returns first tried path', () => {\n const state: INpmCheckState = { cwd: '/test/cwd', global: false } as INpmCheckState;\n const result = findModulePath('missing-module', state);\n expect(result).toBe(path.join('/test/cwd', 'missing-module'));\n });\n});\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GetLatestFromRegistry.test.js","sourceRoot":"","sources":["../../src/tests/GetLatestFromRegistry.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Mock the NpmRegistryClient before imports\njest.mock('../NpmRegistryClient');\n\nimport type { INpmRegistryInfo, INpmRegistryPackageResponse } from '../interfaces/INpmCheckRegistry';\n\ndescribe('getNpmInfo', () => {\n let getNpmInfo: (packageName: string) => Promise<INpmRegistryInfo>;\n let mockFetchPackageMetadataAsync: jest.Mock;\n\n beforeEach(() => {\n jest.resetModules();\n jest.clearAllMocks();\n\n // Re-require to get fresh module instances\n mockFetchPackageMetadataAsync = jest.fn();\n\n // Set up the mock implementation before importing getNpmInfo\n const mockNpmRegistryClient = jest.requireMock('../NpmRegistryClient');\n mockNpmRegistryClient.NpmRegistryClient.mockImplementation(() => ({\n fetchPackageMetadataAsync: mockFetchPackageMetadataAsync\n }));\n\n // Import the module under test\n const module = jest.requireActual('../GetLatestFromRegistry');\n getNpmInfo = module.default;\n });\n\n it('returns registry info with homepage', async () => {\n const mockData: INpmRegistryPackageResponse = {\n name: 'test-package',\n versions: {\n '1.0.0': {\n name: 'test-package',\n version: '1.0.0',\n homepage: 'https://homepage.com'\n },\n '2.0.0': {\n name: 'test-package',\n version: '2.0.0',\n bugs: { url: 'https://bugs.com' }\n }\n },\n 'dist-tags': { latest: '1.0.0', next: '2.0.0' }\n };\n mockFetchPackageMetadataAsync.mockResolvedValue({ data: mockData });\n\n const result: INpmRegistryInfo = await getNpmInfo('test-package');\n expect(result).toHaveProperty('latest', '1.0.0');\n expect(result).toHaveProperty('next', '2.0.0');\n expect(result).toHaveProperty('versions', ['1.0.0', '2.0.0']);\n expect(result).toHaveProperty('homepage', 'https://homepage.com');\n });\n\n it('returns error if fetch fails', async () => {\n mockFetchPackageMetadataAsync.mockResolvedValue({ error: 'Registry down' });\n\n const result: INpmRegistryInfo = await getNpmInfo('test-package');\n expect(result).toHaveProperty('error');\n expect(result.error).toBe('Registry error Registry down');\n });\n\n it('returns \"\" homepage if not present', async () => {\n const mockData: INpmRegistryPackageResponse = {\n name: 'test-package',\n versions: {\n '1.0.0': {\n name: 'test-package',\n version: '1.0.0'\n },\n '2.0.0': {\n name: 'test-package',\n version: '2.0.0'\n }\n },\n 'dist-tags': { latest: '1.0.0', next: '2.0.0' }\n };\n mockFetchPackageMetadataAsync.mockResolvedValue({ data: mockData });\n\n const result: INpmRegistryInfo = await getNpmInfo('test-package');\n expect(result).toHaveProperty('homepage', '');\n });\n\n it('filters out versions exceeding CRAZY_HIGH_SEMVER threshold', async () => {\n const mockData: INpmRegistryPackageResponse = {\n name: 'test-package',\n versions: {\n '1.0.0': {\n name: 'test-package',\n version: '1.0.0'\n },\n '2.0.0': {\n name: 'test-package',\n version: '2.0.0'\n },\n '9000.0.0': {\n name: 'test-package',\n version: '9000.0.0'\n }\n },\n 'dist-tags': { latest: '2.0.0', next: '2.0.0' }\n };\n mockFetchPackageMetadataAsync.mockResolvedValue({ data: mockData });\n\n const result: INpmRegistryInfo = await getNpmInfo('test-package');\n // Versions exceeding 8000.0.0 should be filtered out\n expect(result.versions).toEqual(['1.0.0', '2.0.0']);\n expect(result.versions).not.toContain('9000.0.0');\n });\n});\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NpmCheck.test.js","sourceRoot":"","sources":["../../src/tests/NpmCheck.test.ts"],"names":[],"mappings":"AAAA,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1C,UAAU,EAAE,IAAI;IAChB,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;CACnC,CAAC,CAAC,CAAC;AAEJ,OAAO,oBAAoB,MAAM,yBAAyB,CAAC;AAC3D,MAAM,wBAAwB,GAAG,oBAAwE,CAAC;AAG1G,OAAO,QAAQ,MAAM,aAAa,CAAC;AAEnC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,wBAAwB,CAAC,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;YACjE,UAAU;YACV,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,EAAE;YACV,SAAS,EAAE,EAAE;YACb,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,EAAE;YACjB,WAAW,EAAE,EAAE;YACf,gBAAgB,EAAE,SAAS;YAC3B,aAAa,EAAE,KAAK;YACpB,cAAc,EAAE,KAAK;YACrB,QAAQ,EAAE,KAAK;YACf,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC,CAAC;QACJ,MAAM,MAAM,GAAmB,MAAM,QAAQ,CAAC;YAC5C,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["jest.mock('../CreatePackageSummary', () => ({\n __esModule: true,\n default: jest.fn(async () => ({}))\n}));\n\nimport createPackageSummary from '../CreatePackageSummary';\nconst mockCreatePackageSummary = createPackageSummary as jest.MockedFunction<typeof createPackageSummary>;\n\nimport type { INpmCheckState } from '../interfaces/INpmCheck';\nimport NpmCheck from '../NpmCheck';\n\ndescribe('NpmCheck', () => {\n it('should mimic rush initial options', async () => {\n mockCreatePackageSummary.mockImplementation(async (moduleName) => ({\n moduleName,\n homepage: '',\n latest: '',\n installed: '',\n notInstalled: true,\n packageWanted: '',\n packageJson: '',\n notInPackageJson: undefined,\n devDependency: false,\n peerDependency: false,\n mismatch: false,\n bump: undefined\n }));\n const result: INpmCheckState = await NpmCheck({\n cwd: process.cwd()\n });\n expect(result.packages).toBeDefined();\n if (result.packages && result.packages.length > 0) {\n expect(result.packages[0]).toHaveProperty('moduleName');\n }\n });\n});\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NpmCheckState.test.js","sourceRoot":"","sources":["../../src/tests/NpmCheckState.test.ts"],"names":[],"mappings":"AACA,OAAO,eAAe,MAAM,kBAAkB,CAAC;AAE/C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,KAAK,GAAmB,MAAM,eAAe,EAAE,CAAC;QACtD,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import type { INpmCheckState } from '../interfaces/INpmCheck';\nimport initializeState from '../NpmCheckState';\n\ndescribe('NpmCheckState', () => {\n it('should create with default options', async () => {\n const state: INpmCheckState = await initializeState();\n expect(state).toBeDefined();\n expect(state.cwd).toBe(process.cwd());\n expect(state.cwdPackageJson).toHaveProperty('name');\n expect(state.cwdPackageJson).toHaveProperty('version');\n });\n});\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NpmRegistryClient.test.js","sourceRoot":"","sources":["../../src/tests/NpmRegistryClient.test.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACxB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAIvB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,iBAAiB,EAAkC,MAAM,sBAAsB,CAAC;AAGzF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,gBAA2B,CAAC;IAChC,IAAI,eAA0B,CAAC;IAE/B,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,yBAAyB;QACzB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAEjD,gBAAgB,GAAG,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QACnD,eAAe,GAAG,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;YAChC,MAAM,OAAO,GAA8B;gBACzC,WAAW,EAAE,6BAA6B;gBAC1C,SAAS,EAAE,cAAc;gBACzB,SAAS,EAAE,KAAK;aACjB,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,OAAO,GAA8B;gBACzC,WAAW,EAAE,+BAA+B;aAC7C,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QAYzC,SAAS,iBAAiB;YAIxB,MAAM,OAAO,GAAG,IAAI,YAAY,EAAkB,CAAC;YACnD,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAmB,CAAC;YAErD,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;YACxB,QAAQ,CAAC,OAAO,GAAG,EAAE,CAAC;YAEtB,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QAC/B,CAAC;QAED,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;YACvC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,iBAAiB,EAAE,CAAC;YAElD,MAAM,QAAQ,GAAgC;gBAC5C,IAAI,EAAE,cAAc;gBACpB,QAAQ,EAAE;oBACR,OAAO,EAAE;wBACP,IAAI,EAAE,cAAc;wBACpB,OAAO,EAAE,OAAO;qBACjB;iBACF;gBACD,WAAW,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;aACjC,CAAC;YAEF,gBAAgB,CAAC,kBAAkB,CACjC,CAAC,OAA6B,EAAE,QAA6C,EAAE,EAAE;gBAC/E,yBAAyB;gBACzB,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBACpD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;oBACpC,MAAM,EAAE,kBAAkB;oBAC1B,iBAAiB,EAAE,eAAe;oBAClC,YAAY,EAAE,MAAM,CAAC,gBAAgB,CAAC,gBAAgB,CAAC;iBACxD,CAAC,CAAC;gBAEH,iCAAiC;gBACjC,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAgC,CAAC,CAAC,CAAC;gBAC/D,OAAO,OAAO,CAAC;YACjB,CAAC,CACF,CAAC;YAEF,MAAM,YAAY,GAAG,MAAM,CAAC,yBAAyB,CAAC,cAAc,CAAC,CAAC;YAEtE,oBAAoB;YACpB,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC;YAC1B,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC;YAC9B,YAAY,CAAC,GAAG,EAAE;gBAChB,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC7D,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;YACvC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,iBAAiB,EAAE,CAAC;YAElD,gBAAgB,CAAC,kBAAkB,CACjC,CAAC,OAA6B,EAAE,QAA6C,EAAE,EAAE;gBAC/E,iDAAiD;gBACjD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;gBAEpD,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAgC,CAAC,CAAC,CAAC;gBAC/D,OAAO,OAAO,CAAC;YACjB,CAAC,CACF,CAAC;YAEF,MAAM,YAAY,GAAG,MAAM,CAAC,yBAAyB,CAAC,qBAAqB,CAAC,CAAC;YAE7E,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC;YAC1B,YAAY,CAAC,GAAG,EAAE;gBAChB,QAAQ,CAAC,IAAI,CACX,MAAM,EACN,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,CAC5F,CAAC;gBACF,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YAEH,MAAM,YAAY,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;YACxC,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,EAAE,WAAW,EAAE,6BAA6B,EAAE,CAAC,CAAC;YACrF,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,iBAAiB,EAAE,CAAC;YAElD,gBAAgB,CAAC,kBAAkB,CACjC,CAAC,OAA6B,EAAE,QAA6C,EAAE,EAAE;gBAC/E,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;gBAErD,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAgC,CAAC,CAAC,CAAC;gBAC/D,OAAO,OAAO,CAAC;YACjB,CAAC,CACF,CAAC;YAEF,MAAM,YAAY,GAAG,MAAM,CAAC,yBAAyB,CAAC,cAAc,CAAC,CAAC;YAEtE,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC;YAC1B,YAAY,CAAC,GAAG,EAAE;gBAChB,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;gBACpG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YAEH,MAAM,YAAY,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;YACvC,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,EAAE,WAAW,EAAE,4BAA4B,EAAE,CAAC,CAAC;YACpF,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,iBAAiB,EAAE,CAAC;YAElD,eAAe,CAAC,kBAAkB,CAChC,CAAC,OAA4B,EAAE,QAA6C,EAAE,EAAE;gBAC9E,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;gBACrD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAE9B,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAgC,CAAC,CAAC,CAAC;gBAC/D,OAAO,OAAO,CAAC;YACjB,CAAC,CACF,CAAC;YAEF,MAAM,YAAY,GAAG,MAAM,CAAC,yBAAyB,CAAC,cAAc,CAAC,CAAC;YAEtE,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC;YAC1B,YAAY,CAAC,GAAG,EAAE;gBAChB,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;gBACpG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YAEH,MAAM,YAAY,CAAC;YACnB,MAAM,CAAC,eAAe,CAAC,CAAC,gBAAgB,EAAE,CAAC;YAC3C,MAAM,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;YACvC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,iBAAiB,EAAE,CAAC;YAElD,MAAM,QAAQ,GAAgC;gBAC5C,IAAI,EAAE,cAAc;gBACpB,QAAQ,EAAE,EAAE;gBACZ,WAAW,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;aACjC,CAAC;YAEF,gBAAgB,CAAC,kBAAkB,CACjC,CAAC,OAA6B,EAAE,QAA6C,EAAE,EAAE;gBAC/E,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAgC,CAAC,CAAC,CAAC;gBAC/D,OAAO,OAAO,CAAC;YACjB,CAAC,CACF,CAAC;YAEF,MAAM,YAAY,GAAG,MAAM,CAAC,yBAAyB,CAAC,cAAc,CAAC,CAAC;YAEtE,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC;YAC1B,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAAC;YAE9C,YAAY,CAAC,GAAG,EAAE;gBAChB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACxE,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;gBAClC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;YACvC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,iBAAiB,EAAE,CAAC;YAElD,MAAM,QAAQ,GAAgC;gBAC5C,IAAI,EAAE,cAAc;gBACpB,QAAQ,EAAE,EAAE;gBACZ,WAAW,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;aACjC,CAAC;YAEF,gBAAgB,CAAC,kBAAkB,CACjC,CAAC,OAA6B,EAAE,QAA6C,EAAE,EAAE;gBAC/E,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAgC,CAAC,CAAC,CAAC;gBAC/D,OAAO,OAAO,CAAC;YACjB,CAAC,CACF,CAAC;YAEF,MAAM,YAAY,GAAG,MAAM,CAAC,yBAAyB,CAAC,cAAc,CAAC,CAAC;YAEtE,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC;YAC1B,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC,GAAG,SAAS,CAAC;YAEjD,YAAY,CAAC,GAAG,EAAE;gBAChB,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC3E,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;gBAClC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;YACvC,MAAM,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;YACvC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,iBAAiB,EAAE,CAAC;YAElD,gBAAgB,CAAC,kBAAkB,CACjC,CAAC,OAA6B,EAAE,QAA6C,EAAE,EAAE;gBAC/E,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAgC,CAAC,CAAC,CAAC;gBAC/D,OAAO,OAAO,CAAC;YACjB,CAAC,CACF,CAAC;YAEF,MAAM,YAAY,GAAG,MAAM,CAAC,yBAAyB,CAAC,qBAAqB,CAAC,CAAC;YAE7E,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC;YAC1B,QAAQ,CAAC,aAAa,GAAG,WAAW,CAAC;YACrC,YAAY,CAAC,GAAG,EAAE;gBAChB,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;gBAChD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,MAAM,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;YACvC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,iBAAiB,EAAE,CAAC;YAElD,gBAAgB,CAAC,kBAAkB,CACjC,CAAC,OAA6B,EAAE,QAA6C,EAAE,EAAE;gBAC/E,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAgC,CAAC,CAAC,CAAC;gBAC/D,OAAO,OAAO,CAAC;YACjB,CAAC,CACF,CAAC;YAEF,MAAM,YAAY,GAAG,MAAM,CAAC,yBAAyB,CAAC,cAAc,CAAC,CAAC;YAEtE,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC;YAC1B,QAAQ,CAAC,aAAa,GAAG,uBAAuB,CAAC;YACjD,YAAY,CAAC,GAAG,EAAE;gBAChB,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC5C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;YACtC,MAAM,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;YACvC,MAAM,EAAE,OAAO,EAAE,GAAG,iBAAiB,EAAE,CAAC;YAExC,gBAAgB,CAAC,kBAAkB,CAAC,GAAG,EAAE;gBACvC,OAAO,OAAO,CAAC;YACjB,CAAC,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,MAAM,CAAC,yBAAyB,CAAC,cAAc,CAAC,CAAC;YAEtE,YAAY,CAAC,GAAG,EAAE;gBAChB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;YAChE,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;YACvC,MAAM,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;YACvC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,iBAAiB,EAAE,CAAC;YAElD,gBAAgB,CAAC,kBAAkB,CACjC,CAAC,OAA6B,EAAE,QAA6C,EAAE,EAAE;gBAC/E,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAgC,CAAC,CAAC,CAAC;gBAC/D,OAAO,OAAO,CAAC;YACjB,CAAC,CACF,CAAC;YAEF,MAAM,YAAY,GAAG,MAAM,CAAC,yBAAyB,CAAC,cAAc,CAAC,CAAC;YAEtE,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC;YAC1B,YAAY,CAAC,GAAG,EAAE;gBAChB,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;YAC/B,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,MAAM,EAAE,OAAO,EAAE,GAAG,iBAAiB,EAAE,CAAC;YAExC,gBAAgB,CAAC,kBAAkB,CAAC,GAAG,EAAE;gBACvC,OAAO,OAAO,CAAC;YACjB,CAAC,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,MAAM,CAAC,yBAAyB,CAAC,cAAc,CAAC,CAAC;YAEtE,YAAY,CAAC,GAAG,EAAE;gBAChB,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAC5D,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;YACzC,MAAM,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;YACvC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,iBAAiB,EAAE,CAAC;YAElD,gBAAgB,CAAC,kBAAkB,CACjC,CAAC,OAA6B,EAAE,QAA6C,EAAE,EAAE;gBAC/E,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAgC,CAAC,CAAC,CAAC;gBAC/D,OAAO,OAAO,CAAC;YACjB,CAAC,CACF,CAAC;YAEF,MAAM,YAAY,GAAG,MAAM,CAAC,yBAAyB,CAAC,cAAc,CAAC,CAAC;YAEtE,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC;YAC1B,YAAY,CAAC,GAAG,EAAE;gBAChB,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBACnD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAC;YACxE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,iBAAiB,EAAE,CAAC;YAElD,gBAAgB,CAAC,kBAAkB,CACjC,CAAC,OAA6B,EAAE,QAA6C,EAAE,EAAE;;gBAC/E,MAAM,CAAC,MAAA,OAAO,CAAC,OAAO,0CAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBAEjE,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAgC,CAAC,CAAC,CAAC;gBAC/D,OAAO,OAAO,CAAC;YACjB,CAAC,CACF,CAAC;YAEF,MAAM,YAAY,GAAG,MAAM,CAAC,yBAAyB,CAAC,cAAc,CAAC,CAAC;YAEtE,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC;YAC1B,YAAY,CAAC,GAAG,EAAE;gBAChB,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;gBACpG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YAEH,MAAM,YAAY,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;YACzC,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,iBAAiB,EAAE,CAAC;YAElD,gBAAgB,CAAC,kBAAkB,CACjC,CAAC,OAA6B,EAAE,QAA6C,EAAE,EAAE;gBAC/E,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEnC,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAgC,CAAC,CAAC,CAAC;gBAC/D,OAAO,OAAO,CAAC;YACjB,CAAC,CACF,CAAC;YAEF,MAAM,YAAY,GAAG,MAAM,CAAC,yBAAyB,CAAC,cAAc,CAAC,CAAC;YAEtE,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC;YAC1B,YAAY,CAAC,GAAG,EAAE;gBAChB,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;gBACpG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YAEH,MAAM,YAAY,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// Mock modules\njest.mock('node:https');\njest.mock('node:http');\n\nimport type * as http from 'node:http';\nimport type * as https from 'node:https';\nimport { EventEmitter } from 'node:events';\nimport * as zlib from 'node:zlib';\n\nimport { NpmRegistryClient, type INpmRegistryClientOptions } from '../NpmRegistryClient';\nimport type { INpmRegistryPackageResponse } from '../interfaces/INpmCheckRegistry';\n\ndescribe('NpmRegistryClient', () => {\n let mockHttpsRequest: jest.Mock;\n let mockHttpRequest: jest.Mock;\n\n beforeEach(() => {\n jest.clearAllMocks();\n\n // Get the mocked modules\n const httpsModule = jest.requireMock('node:https');\n const httpModule = jest.requireMock('node:http');\n\n mockHttpsRequest = httpsModule.request = jest.fn();\n mockHttpRequest = httpModule.request = jest.fn();\n });\n\n describe('constructor', () => {\n it('uses default registry URL when not provided', () => {\n const client = new NpmRegistryClient();\n expect(client).toBeDefined();\n });\n\n it('accepts custom options', () => {\n const options: INpmRegistryClientOptions = {\n registryUrl: 'https://custom.registry.com',\n userAgent: 'custom-agent',\n timeoutMs: 10000\n };\n const client = new NpmRegistryClient(options);\n expect(client).toBeDefined();\n });\n\n it('removes trailing slash from registry URL', () => {\n const options: INpmRegistryClientOptions = {\n registryUrl: 'https://registry.example.com/'\n };\n const client = new NpmRegistryClient(options);\n expect(client).toBeDefined();\n });\n });\n\n describe('fetchPackageMetadataAsync', () => {\n interface IMockRequest extends EventEmitter {\n destroy: jest.Mock;\n end: jest.Mock;\n }\n\n interface IMockResponse extends EventEmitter {\n statusCode?: number;\n statusMessage?: string;\n headers: Record<string, string>;\n }\n\n function createMockRequest(): {\n request: IMockRequest;\n response: IMockResponse;\n } {\n const request = new EventEmitter() as IMockRequest;\n const response = new EventEmitter() as IMockResponse;\n\n request.destroy = jest.fn();\n request.end = jest.fn();\n response.headers = {};\n\n return { request, response };\n }\n\n it('successfully fetches package metadata with https', async () => {\n const client = new NpmRegistryClient();\n const { request, response } = createMockRequest();\n\n const mockData: INpmRegistryPackageResponse = {\n name: 'test-package',\n versions: {\n '1.0.0': {\n name: 'test-package',\n version: '1.0.0'\n }\n },\n 'dist-tags': { latest: '1.0.0' }\n };\n\n mockHttpsRequest.mockImplementation(\n (options: https.RequestOptions, callback: (res: http.IncomingMessage) => void) => {\n // Verify request options\n expect(options.hostname).toBe('registry.npmjs.org');\n expect(options.method).toBe('GET');\n expect(options.headers).toMatchObject({\n Accept: 'application/json',\n 'Accept-Encoding': 'gzip, deflate',\n 'User-Agent': expect.stringContaining('npm-check-fork')\n });\n\n // Trigger callback with response\n setImmediate(() => callback(response as http.IncomingMessage));\n return request;\n }\n );\n\n const fetchPromise = client.fetchPackageMetadataAsync('test-package');\n\n // Simulate response\n response.statusCode = 200;\n response.statusMessage = 'OK';\n setImmediate(() => {\n response.emit('data', Buffer.from(JSON.stringify(mockData)));\n response.emit('end');\n });\n\n const result = await fetchPromise;\n expect(result.data).toEqual(mockData);\n expect(result.error).toBeUndefined();\n });\n\n it('builds correct URL for scoped packages', async () => {\n const client = new NpmRegistryClient();\n const { request, response } = createMockRequest();\n\n mockHttpsRequest.mockImplementation(\n (options: https.RequestOptions, callback: (res: http.IncomingMessage) => void) => {\n // Verify that scoped package name is URL-encoded\n expect(options.path).toBe('/@scope%2Fpackage-name');\n\n setImmediate(() => callback(response as http.IncomingMessage));\n return request;\n }\n );\n\n const fetchPromise = client.fetchPackageMetadataAsync('@scope/package-name');\n\n response.statusCode = 200;\n setImmediate(() => {\n response.emit(\n 'data',\n Buffer.from(JSON.stringify({ name: '@scope/package-name', versions: {}, 'dist-tags': {} }))\n );\n response.emit('end');\n });\n\n await fetchPromise;\n });\n\n it('uses custom registry URL', async () => {\n const client = new NpmRegistryClient({ registryUrl: 'https://custom.registry.com' });\n const { request, response } = createMockRequest();\n\n mockHttpsRequest.mockImplementation(\n (options: https.RequestOptions, callback: (res: http.IncomingMessage) => void) => {\n expect(options.hostname).toBe('custom.registry.com');\n\n setImmediate(() => callback(response as http.IncomingMessage));\n return request;\n }\n );\n\n const fetchPromise = client.fetchPackageMetadataAsync('test-package');\n\n response.statusCode = 200;\n setImmediate(() => {\n response.emit('data', Buffer.from(JSON.stringify({ name: 'test', versions: {}, 'dist-tags': {} })));\n response.emit('end');\n });\n\n await fetchPromise;\n });\n\n it('uses http for http URLs', async () => {\n const client = new NpmRegistryClient({ registryUrl: 'http://custom.registry.com' });\n const { request, response } = createMockRequest();\n\n mockHttpRequest.mockImplementation(\n (options: http.RequestOptions, callback: (res: http.IncomingMessage) => void) => {\n expect(options.hostname).toBe('custom.registry.com');\n expect(options.port).toBe(80);\n\n setImmediate(() => callback(response as http.IncomingMessage));\n return request;\n }\n );\n\n const fetchPromise = client.fetchPackageMetadataAsync('test-package');\n\n response.statusCode = 200;\n setImmediate(() => {\n response.emit('data', Buffer.from(JSON.stringify({ name: 'test', versions: {}, 'dist-tags': {} })));\n response.emit('end');\n });\n\n await fetchPromise;\n expect(mockHttpRequest).toHaveBeenCalled();\n expect(mockHttpsRequest).not.toHaveBeenCalled();\n });\n\n it('handles gzip-encoded responses', async () => {\n const client = new NpmRegistryClient();\n const { request, response } = createMockRequest();\n\n const mockData: INpmRegistryPackageResponse = {\n name: 'test-package',\n versions: {},\n 'dist-tags': { latest: '1.0.0' }\n };\n\n mockHttpsRequest.mockImplementation(\n (options: https.RequestOptions, callback: (res: http.IncomingMessage) => void) => {\n setImmediate(() => callback(response as http.IncomingMessage));\n return request;\n }\n );\n\n const fetchPromise = client.fetchPackageMetadataAsync('test-package');\n\n response.statusCode = 200;\n response.headers['content-encoding'] = 'gzip';\n\n setImmediate(() => {\n const compressed = zlib.gzipSync(Buffer.from(JSON.stringify(mockData)));\n response.emit('data', compressed);\n response.emit('end');\n });\n\n const result = await fetchPromise;\n expect(result.data).toEqual(mockData);\n expect(result.error).toBeUndefined();\n });\n\n it('handles deflate-encoded responses', async () => {\n const client = new NpmRegistryClient();\n const { request, response } = createMockRequest();\n\n const mockData: INpmRegistryPackageResponse = {\n name: 'test-package',\n versions: {},\n 'dist-tags': { latest: '1.0.0' }\n };\n\n mockHttpsRequest.mockImplementation(\n (options: https.RequestOptions, callback: (res: http.IncomingMessage) => void) => {\n setImmediate(() => callback(response as http.IncomingMessage));\n return request;\n }\n );\n\n const fetchPromise = client.fetchPackageMetadataAsync('test-package');\n\n response.statusCode = 200;\n response.headers['content-encoding'] = 'deflate';\n\n setImmediate(() => {\n const compressed = zlib.deflateSync(Buffer.from(JSON.stringify(mockData)));\n response.emit('data', compressed);\n response.emit('end');\n });\n\n const result = await fetchPromise;\n expect(result.data).toEqual(mockData);\n expect(result.error).toBeUndefined();\n });\n\n it('handles 404 status code', async () => {\n const client = new NpmRegistryClient();\n const { request, response } = createMockRequest();\n\n mockHttpsRequest.mockImplementation(\n (options: https.RequestOptions, callback: (res: http.IncomingMessage) => void) => {\n setImmediate(() => callback(response as http.IncomingMessage));\n return request;\n }\n );\n\n const fetchPromise = client.fetchPackageMetadataAsync('nonexistent-package');\n\n response.statusCode = 404;\n response.statusMessage = 'Not Found';\n setImmediate(() => {\n response.emit('data', Buffer.from('Not found'));\n response.emit('end');\n });\n\n const result = await fetchPromise;\n expect(result.data).toBeUndefined();\n expect(result.error).toBe('Package not found');\n });\n\n it('handles non-2xx status codes', async () => {\n const client = new NpmRegistryClient();\n const { request, response } = createMockRequest();\n\n mockHttpsRequest.mockImplementation(\n (options: https.RequestOptions, callback: (res: http.IncomingMessage) => void) => {\n setImmediate(() => callback(response as http.IncomingMessage));\n return request;\n }\n );\n\n const fetchPromise = client.fetchPackageMetadataAsync('test-package');\n\n response.statusCode = 500;\n response.statusMessage = 'Internal Server Error';\n setImmediate(() => {\n response.emit('data', Buffer.from('Error'));\n response.emit('end');\n });\n\n const result = await fetchPromise;\n expect(result.data).toBeUndefined();\n expect(result.error).toBe('HTTP error 500: Internal Server Error');\n });\n\n it('handles network errors', async () => {\n const client = new NpmRegistryClient();\n const { request } = createMockRequest();\n\n mockHttpsRequest.mockImplementation(() => {\n return request;\n });\n\n const fetchPromise = client.fetchPackageMetadataAsync('test-package');\n\n setImmediate(() => {\n request.emit('error', new Error('Network connection failed'));\n });\n\n const result = await fetchPromise;\n expect(result.data).toBeUndefined();\n expect(result.error).toBe('Network error: Network connection failed');\n });\n\n it('handles response errors', async () => {\n const client = new NpmRegistryClient();\n const { request, response } = createMockRequest();\n\n mockHttpsRequest.mockImplementation(\n (options: https.RequestOptions, callback: (res: http.IncomingMessage) => void) => {\n setImmediate(() => callback(response as http.IncomingMessage));\n return request;\n }\n );\n\n const fetchPromise = client.fetchPackageMetadataAsync('test-package');\n\n response.statusCode = 200;\n setImmediate(() => {\n response.emit('error', new Error('Stream error'));\n });\n\n const result = await fetchPromise;\n expect(result.data).toBeUndefined();\n expect(result.error).toBe('Response error: Stream error');\n });\n\n it('handles timeout', async () => {\n const client = new NpmRegistryClient({ timeoutMs: 1000 });\n const { request } = createMockRequest();\n\n mockHttpsRequest.mockImplementation(() => {\n return request;\n });\n\n const fetchPromise = client.fetchPackageMetadataAsync('test-package');\n\n setImmediate(() => {\n request.emit('timeout');\n });\n\n const result = await fetchPromise;\n expect(result.data).toBeUndefined();\n expect(result.error).toBe('Request timed out after 1000ms');\n expect(request.destroy).toHaveBeenCalled();\n });\n\n it('handles JSON parse errors', async () => {\n const client = new NpmRegistryClient();\n const { request, response } = createMockRequest();\n\n mockHttpsRequest.mockImplementation(\n (options: https.RequestOptions, callback: (res: http.IncomingMessage) => void) => {\n setImmediate(() => callback(response as http.IncomingMessage));\n return request;\n }\n );\n\n const fetchPromise = client.fetchPackageMetadataAsync('test-package');\n\n response.statusCode = 200;\n setImmediate(() => {\n response.emit('data', Buffer.from('invalid json'));\n response.emit('end');\n });\n\n const result = await fetchPromise;\n expect(result.data).toBeUndefined();\n expect(result.error).toContain('Failed to parse response');\n });\n\n it('uses custom User-Agent header', async () => {\n const client = new NpmRegistryClient({ userAgent: 'custom-agent/1.0' });\n const { request, response } = createMockRequest();\n\n mockHttpsRequest.mockImplementation(\n (options: https.RequestOptions, callback: (res: http.IncomingMessage) => void) => {\n expect(options.headers?.['User-Agent']).toBe('custom-agent/1.0');\n\n setImmediate(() => callback(response as http.IncomingMessage));\n return request;\n }\n );\n\n const fetchPromise = client.fetchPackageMetadataAsync('test-package');\n\n response.statusCode = 200;\n setImmediate(() => {\n response.emit('data', Buffer.from(JSON.stringify({ name: 'test', versions: {}, 'dist-tags': {} })));\n response.emit('end');\n });\n\n await fetchPromise;\n });\n\n it('uses custom timeout value', async () => {\n const client = new NpmRegistryClient({ timeoutMs: 5000 });\n const { request, response } = createMockRequest();\n\n mockHttpsRequest.mockImplementation(\n (options: https.RequestOptions, callback: (res: http.IncomingMessage) => void) => {\n expect(options.timeout).toBe(5000);\n\n setImmediate(() => callback(response as http.IncomingMessage));\n return request;\n }\n );\n\n const fetchPromise = client.fetchPackageMetadataAsync('test-package');\n\n response.statusCode = 200;\n setImmediate(() => {\n response.emit('data', Buffer.from(JSON.stringify({ name: 'test', versions: {}, 'dist-tags': {} })));\n response.emit('end');\n });\n\n await fetchPromise;\n });\n });\n});\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReadPackageJson.test.js","sourceRoot":"","sources":["../../src/tests/ReadPackageJson.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,eAAe,MAAM,oBAAoB,CAAC;AAGjD,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,QAAQ,GAAW,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;QAClE,MAAM,MAAM,GAAyB,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;QAErE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import path from 'node:path';\n\nimport readPackageJson from '../ReadPackageJson';\nimport type { INpmCheckPackageJson } from '../interfaces/INpmCheck';\n\ndescribe('readPackageJson', () => {\n it('should return valid packageJson if it exists', async () => {\n const fileName: string = path.join(process.cwd(), 'package.json');\n const result: INpmCheckPackageJson = await readPackageJson(fileName);\n\n expect(result).toBeDefined();\n expect(result).toHaveProperty('name');\n });\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rushstack/npm-check-fork",
3
- "version": "0.1.13",
3
+ "version": "0.2.0",
4
4
  "description": "A fork of npm-check.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -8,22 +8,44 @@
8
8
  "directory": "libraries/npm-check-fork"
9
9
  },
10
10
  "homepage": "https://github.com/dylang/npm-check",
11
- "main": "lib/index.js",
12
- "typings": "lib/index.d.ts",
11
+ "main": "./lib-commonjs/index.js",
12
+ "module": "./lib-esm/index.js",
13
+ "types": "./lib-dts/index.d.ts",
14
+ "exports": {
15
+ ".": {
16
+ "types": "./lib-dts/index.d.ts",
17
+ "import": "./lib-esm/index.js",
18
+ "require": "./lib-commonjs/index.js"
19
+ },
20
+ "./lib/*": {
21
+ "types": "./lib-dts/*.d.ts",
22
+ "import": "./lib-esm/*.js",
23
+ "require": "./lib-commonjs/*.js"
24
+ },
25
+ "./package.json": "./package.json"
26
+ },
27
+ "typesVersions": {
28
+ "*": {
29
+ "lib/*": [
30
+ "lib-dts/*"
31
+ ]
32
+ }
33
+ },
13
34
  "license": "MIT",
14
35
  "dependencies": {
15
36
  "giturl": "^2.0.0",
16
- "lodash": "~4.17.15",
37
+ "lodash": "~4.17.23",
17
38
  "semver": "~7.5.4",
18
- "@rushstack/node-core-library": "5.19.1"
39
+ "@rushstack/node-core-library": "5.20.0"
19
40
  },
20
41
  "devDependencies": {
21
- "@types/lodash": "4.14.116",
42
+ "@types/lodash": "4.17.23",
22
43
  "@types/semver": "7.5.0",
23
44
  "eslint": "~9.37.0",
24
- "@rushstack/heft": "1.1.13",
25
- "local-node-rig": "1.0.0"
45
+ "local-node-rig": "1.0.0",
46
+ "@rushstack/heft": "1.2.0"
26
47
  },
48
+ "sideEffects": false,
27
49
  "scripts": {
28
50
  "build": "heft build --clean",
29
51
  "test": "heft test --clean",
@@ -1 +0,0 @@
1
- {"version":3,"file":"GetLatestFromRegistry.js","sourceRoot":"","sources":["../src/GetLatestFromRegistry.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;;;AAoC3D,6BAkCC;AASD,0CAgBC;AA7FD,sDAAyB;AAEzB,oDAAuB;AACvB,oDAA4B;AAE5B,oEAAqD;AAErD,4EAAoD;AACpD,2DAAuF;AAOvF,2DAA2D;AAC3D,IAAI,eAA8C,CAAC;AAEnD;;GAEG;AACH,SAAS,iBAAiB;IACxB,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,eAAe,GAAG,IAAI,qCAAiB,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;;;GAKG;AACY,KAAK,UAAU,UAAU,CAAC,WAAmB;IAC1D,MAAM,MAAM,GAAsB,iBAAiB,EAAE,CAAC;IACtD,MAAM,MAAM,GAA6B,MAAM,MAAM,CAAC,yBAAyB,CAAC,WAAW,CAAC,CAAC;IAE7F,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO;YACL,KAAK,EAAE,kBAAkB,MAAM,CAAC,KAAK,EAAE;SACxC,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAgC,MAAM,CAAC,IAAK,CAAC;IAC1D,MAAM,iBAAiB,GAAW,UAAU,CAAC;IAC7C,MAAM,cAAc,GAAa,IAAA,gBAAC,EAAC,OAAO,CAAC,QAAQ,CAAC;SACjD,IAAI,EAAE;SACN,MAAM,CAAC,gBAAC,CAAC,OAAO,CAAC,gBAAM,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;SAC/C,IAAI,CAAC,gBAAM,CAAC,OAAO,CAAC;SACpB,OAAO,EAAE,CAAC;IAEb,MAAM,MAAM,GAAW,OAAO,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;IACnD,MAAM,IAAI,GAAW,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC;IAC/C,MAAM,mBAAmB,GAAuB,gBAAM,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC;QAC3E,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,gBAAM,CAAC,aAAa,CAAC,cAAc,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;IAEpD,oEAAoE;IACpE,qEAAqE;IACrE,MAAM,YAAY,GAA0B,OAA2C,CAAC;IAExF,OAAO;QACL,MAAM,EAAE,mBAAmB;QAC3B,IAAI,EAAE,IAAI;QACV,QAAQ,EAAE,cAAc;QACxB,QAAQ,EAAE,IAAA,2BAAiB,EAAC,YAAY,CAAC,IAAI,EAAE;KAChD,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,eAAe,CACnC,YAAsB,EACtB,cAAsB,iBAAE,CAAC,IAAI,EAAE,CAAC,MAAM;IAEtC,MAAM,OAAO,GAAkC,IAAI,GAAG,EAAE,CAAC;IAEzD,6FAA6F;IAC7F,MAAM,yBAAK,CAAC,YAAY,CACtB,YAAY,EACZ,KAAK,EAAE,WAAmB,EAAE,EAAE;QAC5B,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1D,CAAC,EACD,EAAE,WAAW,EAAE,CAChB,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport os from 'node:os';\n\nimport _ from 'lodash';\nimport semver from 'semver';\n\nimport { Async } from '@rushstack/node-core-library';\n\nimport bestGuessHomepage from './BestGuessHomepage';\nimport { NpmRegistryClient, type INpmRegistryClientResult } from './NpmRegistryClient';\nimport type {\n INpmRegistryInfo,\n INpmCheckRegistryData,\n INpmRegistryPackageResponse\n} from './interfaces/INpmCheckRegistry';\n\n// Module-level registry client instance (lazy initialized)\nlet _registryClient: NpmRegistryClient | undefined;\n\n/**\n * Gets or creates the shared registry client instance.\n */\nfunction getRegistryClient(): NpmRegistryClient {\n if (!_registryClient) {\n _registryClient = new NpmRegistryClient();\n }\n return _registryClient;\n}\n\n/**\n * Fetches package information from the npm registry.\n *\n * @param packageName - The name of the package to fetch\n * @returns A promise that resolves to the package registry info\n */\nexport default async function getNpmInfo(packageName: string): Promise<INpmRegistryInfo> {\n const client: NpmRegistryClient = getRegistryClient();\n const result: INpmRegistryClientResult = await client.fetchPackageMetadataAsync(packageName);\n\n if (result.error) {\n return {\n error: `Registry error ${result.error}`\n };\n }\n\n const rawData: INpmRegistryPackageResponse = result.data!;\n const CRAZY_HIGH_SEMVER: string = '8000.0.0';\n const sortedVersions: string[] = _(rawData.versions)\n .keys()\n .remove(_.partial(semver.gt, CRAZY_HIGH_SEMVER))\n .sort(semver.compare)\n .valueOf();\n\n const latest: string = rawData['dist-tags'].latest;\n const next: string = rawData['dist-tags'].next;\n const latestStableRelease: string | undefined = semver.satisfies(latest, '*')\n ? latest\n : semver.maxSatisfying(sortedVersions, '*') || '';\n\n // Cast to INpmCheckRegistryData for bestGuessHomepage compatibility\n // INpmRegistryPackageResponse is a superset of INpmCheckRegistryData\n const registryData: INpmCheckRegistryData = rawData as unknown as INpmCheckRegistryData;\n\n return {\n latest: latestStableRelease,\n next: next,\n versions: sortedVersions,\n homepage: bestGuessHomepage(registryData) || ''\n };\n}\n\n/**\n * Fetches package information for multiple packages concurrently.\n *\n * @param packageNames - Array of package names to fetch\n * @param concurrency - Maximum number of concurrent requests (defaults to CPU count)\n * @returns A promise that resolves to a Map of package name to registry info\n */\nexport async function getNpmInfoBatch(\n packageNames: string[],\n concurrency: number = os.cpus().length\n): Promise<Map<string, INpmRegistryInfo>> {\n const results: Map<string, INpmRegistryInfo> = new Map();\n\n // TODO: Refactor createPackageSummary to use this batch function to reduce registry requests\n await Async.forEachAsync(\n packageNames,\n async (packageName: string) => {\n results.set(packageName, await getNpmInfo(packageName));\n },\n { concurrency }\n );\n\n return results;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"GetLatestFromRegistry.test.js","sourceRoot":"","sources":["../../src/tests/GetLatestFromRegistry.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Mock the NpmRegistryClient before imports\njest.mock('../NpmRegistryClient');\n\nimport type { INpmRegistryInfo, INpmRegistryPackageResponse } from '../interfaces/INpmCheckRegistry';\n\ndescribe('getNpmInfo', () => {\n let getNpmInfo: (packageName: string) => Promise<INpmRegistryInfo>;\n let mockFetchPackageMetadataAsync: jest.Mock;\n\n beforeEach(() => {\n jest.resetModules();\n jest.clearAllMocks();\n\n // Re-require to get fresh module instances\n mockFetchPackageMetadataAsync = jest.fn();\n\n // Set up the mock implementation before importing getNpmInfo\n const mockNpmRegistryClient = jest.requireMock('../NpmRegistryClient');\n mockNpmRegistryClient.NpmRegistryClient.mockImplementation(() => ({\n fetchPackageMetadataAsync: mockFetchPackageMetadataAsync\n }));\n\n // Import the module under test\n const module = jest.requireActual('../GetLatestFromRegistry');\n getNpmInfo = module.default;\n });\n\n it('returns registry info with homepage', async () => {\n const mockData: INpmRegistryPackageResponse = {\n name: 'test-package',\n versions: {\n '1.0.0': {\n name: 'test-package',\n version: '1.0.0',\n homepage: 'https://homepage.com'\n },\n '2.0.0': {\n name: 'test-package',\n version: '2.0.0',\n bugs: { url: 'https://bugs.com' }\n }\n },\n 'dist-tags': { latest: '1.0.0', next: '2.0.0' }\n };\n mockFetchPackageMetadataAsync.mockResolvedValue({ data: mockData });\n\n const result: INpmRegistryInfo = await getNpmInfo('test-package');\n expect(result).toHaveProperty('latest', '1.0.0');\n expect(result).toHaveProperty('next', '2.0.0');\n expect(result).toHaveProperty('versions', ['1.0.0', '2.0.0']);\n expect(result).toHaveProperty('homepage', 'https://homepage.com');\n });\n\n it('returns error if fetch fails', async () => {\n mockFetchPackageMetadataAsync.mockResolvedValue({ error: 'Registry down' });\n\n const result: INpmRegistryInfo = await getNpmInfo('test-package');\n expect(result).toHaveProperty('error');\n expect(result.error).toBe('Registry error Registry down');\n });\n\n it('returns \"\" homepage if not present', async () => {\n const mockData: INpmRegistryPackageResponse = {\n name: 'test-package',\n versions: {\n '1.0.0': {\n name: 'test-package',\n version: '1.0.0'\n },\n '2.0.0': {\n name: 'test-package',\n version: '2.0.0'\n }\n },\n 'dist-tags': { latest: '1.0.0', next: '2.0.0' }\n };\n mockFetchPackageMetadataAsync.mockResolvedValue({ data: mockData });\n\n const result: INpmRegistryInfo = await getNpmInfo('test-package');\n expect(result).toHaveProperty('homepage', '');\n });\n});\n"]}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes