diff --git a/lib/manager/npm/__fixtures__/inputs/workspaces-simple.json b/lib/manager/npm/__fixtures__/inputs/workspaces-simple.json new file mode 100644 index 0000000000000000000000000000000000000000..919fe6cd3d93f4194eacfb41349cb07df4b167b4 --- /dev/null +++ b/lib/manager/npm/__fixtures__/inputs/workspaces-simple.json @@ -0,0 +1,8 @@ +{ + "name": "@a/b", + "version": "0.0.8", + "private": true, + "workspaces": ["packages/*"], + "license": "MIT", + "dependencies": {} +} diff --git a/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap b/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap index c5badfa613f2312584b00cf4af4572d653a3d3e4..cc6a89d49aacda58bc92b039186e9a2faefe5d0d 100644 --- a/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap +++ b/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap @@ -865,6 +865,28 @@ Object { } `; +exports[`manager/npm/extract .extractPackageFile() finds simple yarn workspaces 1`] = ` +Object { + "deps": Array [], + "ignoreNpmrcFile": undefined, + "lernaClient": "npm", + "lernaDir": ".", + "lernaPackages": undefined, + "npmLock": undefined, + "npmrc": undefined, + "packageJsonName": "@a/b", + "packageJsonType": "app", + "packageJsonVersion": "0.0.8", + "pnpmShrinkwrap": undefined, + "skipInstalls": true, + "yarnLock": undefined, + "yarnWorkspacesPackages": Array [ + "packages/*", + ], + "yarnrc": undefined, +} +`; + exports[`manager/npm/extract .extractPackageFile() returns an array of dependencies 1`] = ` Object { "deps": Array [ diff --git a/lib/manager/npm/extract/common.ts b/lib/manager/npm/extract/common.ts index e7300c1d403f2f12b2f388dad6833d5d11091013..b271b010a7695688884f5b278220c13a19805e83 100644 --- a/lib/manager/npm/extract/common.ts +++ b/lib/manager/npm/extract/common.ts @@ -1,9 +1,10 @@ // eslint-disable-next-line import/no-unresolved import { PackageJson } from 'type-fest'; +export type NpmPackageDependeny = PackageJson.Dependency; + export interface NpmPackage extends PackageJson { - workspaces?: any; - renovate?: any; + renovate?: unknown; _from?: any; _args?: any; _id?: any; diff --git a/lib/manager/npm/extract/index.spec.ts b/lib/manager/npm/extract/index.spec.ts index 55fefce35749d3aab05ede1e06a772c61d45222e..9c7648444deb30ee12f01da8a7d43fa343f76b8e 100644 --- a/lib/manager/npm/extract/index.spec.ts +++ b/lib/manager/npm/extract/index.spec.ts @@ -2,13 +2,13 @@ import fs from 'fs'; import path from 'path'; import * as npmExtract from '.'; import { getConfig } from '../../../config/defaults'; -import { platform as _platform } from '../../../platform'; +import { platform as _platform } from '../../../../test/util'; // TODO: fix types -const defaultConfig = getConfig() as any; +const defaultConfig = getConfig(); const platform: any = _platform; -function readFixture(fixture) { +function readFixture(fixture: string) { return fs.readFileSync( path.resolve(__dirname, `../__fixtures__/${fixture}`), 'utf8' @@ -17,6 +17,7 @@ function readFixture(fixture) { const input01Content = readFixture('inputs/01.json'); const workspacesContent = readFixture('inputs/workspaces.json'); +const workspacesSimpleContent = readFixture('inputs/workspaces-simple.json'); const vendorisedContent = readFixture('is-object.json'); const invalidNameContent = readFixture('invalid-name.json'); @@ -167,6 +168,20 @@ describe('manager/npm/extract', () => { ); expect(res).toMatchSnapshot(); }); + it('finds simple yarn workspaces', async () => { + platform.getFile = jest.fn(fileName => { + if (fileName === 'lerna.json') { + return '{}'; + } + return null; + }); + const res = await npmExtract.extractPackageFile( + workspacesSimpleContent, + 'package.json', + defaultConfig + ); + expect(res).toMatchSnapshot(); + }); it('finds complex yarn workspaces', async () => { platform.getFile = jest.fn(fileName => { if (fileName === 'lerna.json') { diff --git a/lib/manager/npm/extract/index.ts b/lib/manager/npm/extract/index.ts index 1bda89750e65c1d007f807d93693a583aa9fb1df..6a239084dd503eebc26b5f8b076e9b6009ebe3aa 100644 --- a/lib/manager/npm/extract/index.ts +++ b/lib/manager/npm/extract/index.ts @@ -2,6 +2,7 @@ import { remove } from 'fs-extra'; import { dirname } from 'path'; import { join } from 'upath'; import validateNpmPackageName from 'validate-npm-package-name'; +import is from '@sindresorhus/is'; import { logger } from '../../../logger'; import { getLockedVersions } from './locked-versions'; @@ -14,7 +15,7 @@ import { PackageDependency, NpmLockFiles, } from '../../common'; -import { NpmPackage } from './common'; +import { NpmPackage, NpmPackageDependeny } from './common'; import { platform } from '../../../platform'; import { CONFIG_VALIDATION } from '../../../constants/error-messages'; import * as nodeVersioning from '../../../versioning/node'; @@ -53,11 +54,11 @@ export async function extractPackageFile( `npm file ${fileName} has name ${JSON.stringify(packageJsonName)}` ); const packageJsonVersion = packageJson.version; - let yarnWorkspacesPackages; - if (packageJson.workspaces && packageJson.workspaces.packages) { - yarnWorkspacesPackages = packageJson.workspaces.packages; - } else { + let yarnWorkspacesPackages: string[]; + if (is.array(packageJson.workspaces)) { yarnWorkspacesPackages = packageJson.workspaces; + } else { + yarnWorkspacesPackages = packageJson.workspaces?.packages; } const packageJsonType = mightBeABrowserLibrary(packageJson) ? 'library' @@ -113,7 +114,7 @@ export async function extractPackageFile( let lernaPackages: string[]; let lernaClient: 'yarn' | 'npm'; let hasFileRefs = false; - let lernaJson; + let lernaJson: { packages: string[]; npmClient: string }; try { lernaJson = JSON.parse( await platform.getFile(join(dirname(fileName), 'lerna.json')) @@ -272,7 +273,7 @@ export async function extractPackageFile( if (packageJson[depType]) { try { for (const [depName, val] of Object.entries( - packageJson[depType] as Record<string, any> + packageJson[depType] as NpmPackageDependeny )) { const dep: PackageDependency = { depType, diff --git a/lib/manager/npm/update.spec.ts b/lib/manager/npm/update.spec.ts index 69febbf05e440cfa0f06023ed0dd01aad5c94866..ed94b554a521dd6344ad74a15e852eb08d8fb730 100644 --- a/lib/manager/npm/update.spec.ts +++ b/lib/manager/npm/update.spec.ts @@ -2,7 +2,7 @@ import fs from 'fs'; import path from 'path'; import * as npmUpdater from './update'; -function readFixture(fixture) { +function readFixture(fixture: string) { return fs.readFileSync( path.resolve(__dirname, `./__fixtures__/${fixture}`), 'utf8' diff --git a/lib/manager/npm/update.ts b/lib/manager/npm/update.ts index 10fac73e1b18ef58f4f7dac19a392320225bfee3..04150ffe55de4986aecc51ef98e4cd51ec454055 100644 --- a/lib/manager/npm/update.ts +++ b/lib/manager/npm/update.ts @@ -16,7 +16,7 @@ export function bumpPackageVersion( { bumpVersion, currentValue }, 'Checking if we should bump package.json version' ); - let newPjVersion; + let newPjVersion: string; try { if (bumpVersion.startsWith('mirror:')) { const mirrorPackage = bumpVersion.replace('mirror:', ''); @@ -131,7 +131,7 @@ export function updateDependency({ return fileContent; } if (parsedContents && parsedContents.resolutions) { - let depKey; + let depKey: string; if (parsedContents.resolutions[depName]) { depKey = depName; } else if (parsedContents.resolutions[`**/${depName}`]) {