mirror of
https://github.com/renovatebot/renovate.git
synced 2025-01-09 13:36:26 +00:00
Compare commits
18 commits
29c2b6f78c
...
973bf85c8c
Author | SHA1 | Date | |
---|---|---|---|
|
973bf85c8c | ||
|
c04c64f5e7 | ||
|
8a9d54e160 | ||
|
c598c6ffa1 | ||
|
8e37c8f100 | ||
|
e50bc2f9b5 | ||
|
ea5c14f003 | ||
|
c9657a0040 | ||
|
8ba3bd6eee | ||
|
9f23483b4f | ||
|
f40a42dd68 | ||
|
4da6b6daf4 | ||
|
794f042068 | ||
|
17efd68390 | ||
|
591b401368 | ||
|
50b0d82fb5 | ||
|
891256f71a | ||
|
0702e3d85b |
12 changed files with 781 additions and 103 deletions
|
@ -17,6 +17,7 @@ import type {
|
|||
import type { NpmLockFiles, NpmManagerData } from '../types';
|
||||
import { getExtractedConstraints } from './common/dependency';
|
||||
import { extractPackageJson } from './common/package-file';
|
||||
import { extractPnpmWorkspaceFile } from './pnpm';
|
||||
import { postExtract } from './post';
|
||||
import type { NpmPackage } from './types';
|
||||
import { isZeroInstall } from './yarn';
|
||||
|
@ -229,6 +230,17 @@ export async function extractAllPackageFiles(
|
|||
const content = await readLocalFile(packageFile, 'utf8');
|
||||
// istanbul ignore else
|
||||
if (content) {
|
||||
// TODO(fpapado): for PR dicussion, consider this vs. a post hook, where
|
||||
// we look for pnpm-workspace.yaml in the siblings
|
||||
if (packageFile === 'pnpm-workspace.yaml') {
|
||||
const deps = extractPnpmWorkspaceFile(content, packageFile);
|
||||
if (deps) {
|
||||
npmFiles.push({
|
||||
...deps,
|
||||
packageFile,
|
||||
});
|
||||
}
|
||||
} else {
|
||||
const deps = await extractPackageFile(content, packageFile, config);
|
||||
if (deps) {
|
||||
npmFiles.push({
|
||||
|
@ -236,6 +248,7 @@ export async function extractAllPackageFiles(
|
|||
packageFile,
|
||||
});
|
||||
}
|
||||
}
|
||||
} else {
|
||||
logger.debug({ packageFile }, `No content found`);
|
||||
}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import { codeBlock } from 'common-tags';
|
||||
import { Fixtures } from '../../../../../test/fixtures';
|
||||
import { getFixturePath, logger, partial } from '../../../../../test/util';
|
||||
import { GlobalConfig } from '../../../../config/global';
|
||||
|
@ -8,6 +9,7 @@ import type { NpmManagerData } from '../types';
|
|||
import {
|
||||
detectPnpmWorkspaces,
|
||||
extractPnpmFilters,
|
||||
extractPnpmWorkspaceFile,
|
||||
findPnpmWorkspace,
|
||||
getPnpmLock,
|
||||
} from './pnpm';
|
||||
|
@ -270,4 +272,62 @@ describe('modules/manager/npm/extract/pnpm', () => {
|
|||
expect(res.lockedVersionsWithPath).toBeUndefined();
|
||||
});
|
||||
});
|
||||
|
||||
describe('.extractPnpmWorkspaceFile()', () => {
|
||||
it('ignores invalid pnpm-workspace.yaml file', () => {
|
||||
expect(extractPnpmWorkspaceFile('', 'pnpm-workspace.yaml')).toBeNull();
|
||||
});
|
||||
|
||||
it('handles empty catalog entries', () => {
|
||||
expect(
|
||||
extractPnpmWorkspaceFile(
|
||||
codeBlock`
|
||||
catalog:
|
||||
catalogs:
|
||||
`,
|
||||
'pnpm-workspace.yaml',
|
||||
),
|
||||
).toBeNull();
|
||||
});
|
||||
|
||||
it('parses valid pnpm-workspace.yaml file', () => {
|
||||
expect(
|
||||
extractPnpmWorkspaceFile(
|
||||
codeBlock`
|
||||
catalog:
|
||||
react: 18.3.0
|
||||
|
||||
catalogs:
|
||||
react17:
|
||||
react: 17.0.2
|
||||
`,
|
||||
'pnpm-workspace.yaml',
|
||||
),
|
||||
).toMatchObject({
|
||||
deps: [
|
||||
{
|
||||
currentValue: '18.3.0',
|
||||
datasource: 'npm',
|
||||
depName: 'react',
|
||||
depType: 'pnpm.catalog',
|
||||
prettyDepType: 'pnpm.catalog',
|
||||
managerData: {
|
||||
catalogName: 'default',
|
||||
},
|
||||
},
|
||||
{
|
||||
currentValue: '17.0.2',
|
||||
datasource: 'npm',
|
||||
depName: 'react',
|
||||
depType: 'pnpm.catalog',
|
||||
prettyDepType: 'pnpm.catalog',
|
||||
managerData: {
|
||||
catalogName: 'react17',
|
||||
},
|
||||
},
|
||||
],
|
||||
packageFile: 'pnpm-workspace.yaml',
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import is from '@sindresorhus/is';
|
||||
import { findPackages } from 'find-packages';
|
||||
import upath from 'upath';
|
||||
import { z } from 'zod';
|
||||
import { GlobalConfig } from '../../../../config/global';
|
||||
import { logger } from '../../../../logger';
|
||||
import {
|
||||
|
@ -10,10 +11,19 @@ import {
|
|||
readLocalFile,
|
||||
} from '../../../../util/fs';
|
||||
import { parseSingleYaml } from '../../../../util/yaml';
|
||||
import type { PackageFile } from '../../types';
|
||||
import type {
|
||||
PackageDependency,
|
||||
PackageFile,
|
||||
PackageFileContent,
|
||||
} from '../../types';
|
||||
import type { PnpmDependencySchema, PnpmLockFile } from '../post-update/types';
|
||||
import type { NpmManagerData } from '../types';
|
||||
import type { LockFile, PnpmWorkspaceFile } from './types';
|
||||
import { extractDependency, parseDepName } from './common/dependency';
|
||||
import type {
|
||||
LockFile,
|
||||
NpmPackageDependency,
|
||||
PnpmWorkspaceFile,
|
||||
} from './types';
|
||||
|
||||
function isPnpmLockfile(obj: any): obj is PnpmLockFile {
|
||||
return is.plainObject(obj) && 'lockfileVersion' in obj;
|
||||
|
@ -86,8 +96,8 @@ export async function detectPnpmWorkspaces(
|
|||
const packagePathCache = new Map<string, string[] | null>();
|
||||
|
||||
for (const p of packageFiles) {
|
||||
const { packageFile, managerData } = p;
|
||||
const { pnpmShrinkwrap } = managerData as NpmManagerData;
|
||||
const { packageFile, managerData = {} } = p;
|
||||
const { pnpmShrinkwrap } = managerData as Partial<NpmManagerData>;
|
||||
|
||||
// check if pnpmShrinkwrap-file has already been provided
|
||||
if (pnpmShrinkwrap) {
|
||||
|
@ -222,3 +232,108 @@ function getLockedDependencyVersions(
|
|||
|
||||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* A pnpm catalog is either the default catalog (catalog:, catlog:default), or a
|
||||
* named one (under catalogs:)
|
||||
*/
|
||||
type PnpmCatalog = { name: string; dependencies: NpmPackageDependency };
|
||||
|
||||
export function extractPnpmWorkspaceFile(
|
||||
content: string,
|
||||
packageFile: string,
|
||||
): PackageFile | null {
|
||||
logger.trace(`pnpm.extractPnpmWorkspaceFile(${packageFile})`);
|
||||
|
||||
let pnpmCatalogs: Array<PnpmCatalog>;
|
||||
try {
|
||||
pnpmCatalogs = parsePnpmCatalogs(content);
|
||||
} catch {
|
||||
logger.debug({ packageFile }, `Invalid pnpm workspace YAML.`);
|
||||
return null;
|
||||
}
|
||||
|
||||
const extracted = extractPnpmCatalogDeps(pnpmCatalogs);
|
||||
|
||||
if (!extracted) {
|
||||
logger.debug({ packageFile }, 'No dependencies found');
|
||||
return null;
|
||||
}
|
||||
|
||||
logger.debug(extracted, 'Extracted catalog dependencies.');
|
||||
|
||||
return {
|
||||
...extracted,
|
||||
packageFile,
|
||||
};
|
||||
}
|
||||
|
||||
function extractPnpmCatalogDeps(
|
||||
catalogs: Array<PnpmCatalog>,
|
||||
): PackageFileContent<NpmManagerData> | null {
|
||||
const CATALOG_DEPENDENCY = 'pnpm.catalog';
|
||||
|
||||
const deps: PackageDependency[] = [];
|
||||
|
||||
for (const catalog of catalogs) {
|
||||
for (const [key, val] of Object.entries(catalog.dependencies)) {
|
||||
const depName = parseDepName(CATALOG_DEPENDENCY, key);
|
||||
let dep: PackageDependency = {
|
||||
depType: CATALOG_DEPENDENCY,
|
||||
// TODO(fpapado): for PR discussion, consider how users might be able to
|
||||
// match on specific catalogs for their config.
|
||||
//
|
||||
// For example, we could change depType to `pnpm.catalog.${string}`, so
|
||||
// that users can match use `{matchDepTypes: ["pnpm.catalog.default"]}`,
|
||||
// `{matchDepTypes: ["pnpm.catalog.react17"]}` and so on.
|
||||
//
|
||||
// Another option would be to mess with depName/packageName.
|
||||
//
|
||||
// Is there precedence for something similar?
|
||||
depName,
|
||||
managerData: {
|
||||
// We assign the name of the catalog, in order to know which fields to
|
||||
// update later on.
|
||||
catalogName: catalog.name,
|
||||
},
|
||||
};
|
||||
if (depName !== key) {
|
||||
dep.managerData!.key = key;
|
||||
}
|
||||
|
||||
// TODO: fix type #22198
|
||||
dep = {
|
||||
...dep,
|
||||
...extractDependency(CATALOG_DEPENDENCY, depName, val!),
|
||||
prettyDepType: CATALOG_DEPENDENCY,
|
||||
};
|
||||
dep.prettyDepType = CATALOG_DEPENDENCY;
|
||||
deps.push(dep);
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
deps,
|
||||
};
|
||||
}
|
||||
|
||||
export const pnpmCatalogsSchema = z.object({
|
||||
catalog: z.optional(z.record(z.string())),
|
||||
catalogs: z.optional(z.record(z.record(z.string()))),
|
||||
});
|
||||
|
||||
function parsePnpmCatalogs(content: string): Array<PnpmCatalog> {
|
||||
const { catalog: defaultCatalogDeps, catalogs: namedCatalogs } =
|
||||
parseSingleYaml(content, { customSchema: pnpmCatalogsSchema });
|
||||
|
||||
return [
|
||||
{
|
||||
name: 'default',
|
||||
dependencies: defaultCatalogDeps ?? {},
|
||||
},
|
||||
...Object.entries(namedCatalogs ?? {}).map(([name, dependencies]) => ({
|
||||
name,
|
||||
dependencies,
|
||||
})),
|
||||
];
|
||||
}
|
||||
|
|
|
@ -36,6 +36,8 @@ export interface LockFile {
|
|||
|
||||
export interface PnpmWorkspaceFile {
|
||||
packages: string[];
|
||||
catalog?: Partial<Record<string, string>>;
|
||||
catalogs?: Partial<Record<string, Partial<Record<string, string>>>>;
|
||||
}
|
||||
|
||||
export type OverrideDependency = Record<string, RecursiveOverride>;
|
||||
|
|
|
@ -20,7 +20,8 @@ export const url = 'https://docs.npmjs.com';
|
|||
export const categories: Category[] = ['js'];
|
||||
|
||||
export const defaultConfig = {
|
||||
fileMatch: ['(^|/)package\\.json$'],
|
||||
// TODO(fpapado): for PR dicussion, consider this vs. a post hook
|
||||
fileMatch: ['(^|/)package\\.json$', '(^|/)pnpm-workspace\\.yaml$'],
|
||||
digest: {
|
||||
prBodyDefinitions: {
|
||||
Change:
|
||||
|
|
33
lib/modules/manager/npm/update/dependency/common.ts
Normal file
33
lib/modules/manager/npm/update/dependency/common.ts
Normal file
|
@ -0,0 +1,33 @@
|
|||
import { logger } from '../../../../../logger';
|
||||
import type { Upgrade } from '../../../types';
|
||||
|
||||
export function getNewGitValue(upgrade: Upgrade): string | undefined {
|
||||
if (!upgrade.currentRawValue) {
|
||||
return;
|
||||
}
|
||||
if (upgrade.currentDigest) {
|
||||
logger.debug('Updating git digest');
|
||||
return upgrade.currentRawValue.replace(
|
||||
upgrade.currentDigest,
|
||||
// TODO #22198
|
||||
|
||||
upgrade.newDigest!.substring(0, upgrade.currentDigest.length),
|
||||
);
|
||||
} else {
|
||||
logger.debug('Updating git version tag');
|
||||
return upgrade.currentRawValue.replace(
|
||||
upgrade.currentValue,
|
||||
upgrade.newValue,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export function getNewNpmAliasValue(
|
||||
value: string | undefined,
|
||||
upgrade: Upgrade,
|
||||
): string | undefined {
|
||||
if (!upgrade.npmPackageAlias) {
|
||||
return;
|
||||
}
|
||||
return `npm:${upgrade.packageName}@${value}`;
|
||||
}
|
|
@ -11,6 +11,8 @@ import type {
|
|||
RecursiveOverride,
|
||||
} from '../../extract/types';
|
||||
import type { NpmDepType, NpmManagerData } from '../../types';
|
||||
import { getNewGitValue, getNewNpmAliasValue } from './common';
|
||||
import { updatePnpmCatalogDependency } from './pnpm';
|
||||
|
||||
function renameObjKey(
|
||||
oldObj: DependenciesMeta,
|
||||
|
@ -115,29 +117,16 @@ export function updateDependency({
|
|||
fileContent,
|
||||
upgrade,
|
||||
}: UpdateDependencyConfig): string | null {
|
||||
if (upgrade.depType === 'pnpm.catalog') {
|
||||
return updatePnpmCatalogDependency({ fileContent, upgrade });
|
||||
}
|
||||
|
||||
const { depType, managerData } = upgrade;
|
||||
const depName: string = managerData?.key || upgrade.depName;
|
||||
let { newValue } = upgrade;
|
||||
if (upgrade.currentRawValue) {
|
||||
if (upgrade.currentDigest) {
|
||||
logger.debug('Updating package.json git digest');
|
||||
newValue = upgrade.currentRawValue.replace(
|
||||
upgrade.currentDigest,
|
||||
// TODO #22198
|
||||
|
||||
upgrade.newDigest!.substring(0, upgrade.currentDigest.length),
|
||||
);
|
||||
} else {
|
||||
logger.debug('Updating package.json git version tag');
|
||||
newValue = upgrade.currentRawValue.replace(
|
||||
upgrade.currentValue,
|
||||
upgrade.newValue,
|
||||
);
|
||||
}
|
||||
}
|
||||
if (upgrade.npmPackageAlias) {
|
||||
newValue = `npm:${upgrade.packageName}@${newValue}`;
|
||||
}
|
||||
newValue = getNewGitValue(upgrade) ?? newValue;
|
||||
newValue = getNewNpmAliasValue(newValue, upgrade) ?? newValue;
|
||||
|
||||
logger.debug(`npm.updateDependency(): ${depType}.${depName} = ${newValue}`);
|
||||
try {
|
||||
|
|
336
lib/modules/manager/npm/update/dependency/pnpm.spec.ts
Normal file
336
lib/modules/manager/npm/update/dependency/pnpm.spec.ts
Normal file
|
@ -0,0 +1,336 @@
|
|||
import { codeBlock } from 'common-tags';
|
||||
import * as npmUpdater from '../..';
|
||||
|
||||
/**
|
||||
* Per the YAML spec, a document ends with a newline. The 'yaml' library always
|
||||
* uses that when serialising, but `codeBlock` strips the last indentation. This
|
||||
* helper makes assertions simpler.
|
||||
*/
|
||||
function yamlCodeBlock(
|
||||
literals: TemplateStringsArray,
|
||||
...placeholders: any[]
|
||||
): string {
|
||||
return codeBlock(literals, placeholders) + '\n';
|
||||
}
|
||||
|
||||
describe('modules/manager/npm/update/dependency/pnpm', () => {
|
||||
it('handles implicit default catalog dependency', () => {
|
||||
const upgrade = {
|
||||
depType: 'pnpm.catalog',
|
||||
depName: 'react',
|
||||
newValue: '19.0.0',
|
||||
managerData: {
|
||||
catalogName: 'default',
|
||||
},
|
||||
};
|
||||
const pnpmWorkspaceYaml = yamlCodeBlock`
|
||||
packages:
|
||||
- pkg-a
|
||||
|
||||
catalog:
|
||||
react: 18.3.1
|
||||
`;
|
||||
const expected = yamlCodeBlock`
|
||||
packages:
|
||||
- pkg-a
|
||||
|
||||
catalog:
|
||||
react: 19.0.0
|
||||
`;
|
||||
const testContent = npmUpdater.updateDependency({
|
||||
fileContent: pnpmWorkspaceYaml,
|
||||
upgrade,
|
||||
});
|
||||
expect(testContent).toEqual(expected);
|
||||
});
|
||||
|
||||
it('handles explicit default catalog dependency', () => {
|
||||
const upgrade = {
|
||||
depType: 'pnpm.catalog',
|
||||
depName: 'react',
|
||||
newValue: '19.0.0',
|
||||
managerData: {
|
||||
catalogName: 'default',
|
||||
},
|
||||
};
|
||||
const pnpmWorkspaceYaml = yamlCodeBlock`
|
||||
packages:
|
||||
- pkg-a
|
||||
|
||||
catalogs:
|
||||
default:
|
||||
react: 18.3.1
|
||||
`;
|
||||
const expected = yamlCodeBlock`
|
||||
packages:
|
||||
- pkg-a
|
||||
|
||||
catalogs:
|
||||
default:
|
||||
react: 19.0.0
|
||||
`;
|
||||
const testContent = npmUpdater.updateDependency({
|
||||
fileContent: pnpmWorkspaceYaml,
|
||||
upgrade,
|
||||
});
|
||||
expect(testContent).toEqual(expected);
|
||||
});
|
||||
|
||||
it('handles explicit named catalog dependency', () => {
|
||||
const upgrade = {
|
||||
depType: 'pnpm.catalog',
|
||||
depName: 'react',
|
||||
newValue: '19.0.0',
|
||||
managerData: {
|
||||
catalogName: 'react17',
|
||||
},
|
||||
};
|
||||
const pnpmWorkspaceYaml = yamlCodeBlock`
|
||||
packages:
|
||||
- pkg-a
|
||||
|
||||
catalog:
|
||||
react: 18.3.1
|
||||
|
||||
catalogs:
|
||||
react17:
|
||||
react: 17.0.0
|
||||
`;
|
||||
const expected = yamlCodeBlock`
|
||||
packages:
|
||||
- pkg-a
|
||||
|
||||
catalog:
|
||||
react: 18.3.1
|
||||
|
||||
catalogs:
|
||||
react17:
|
||||
react: 19.0.0
|
||||
|
||||
`;
|
||||
const testContent = npmUpdater.updateDependency({
|
||||
fileContent: pnpmWorkspaceYaml,
|
||||
upgrade,
|
||||
});
|
||||
expect(testContent).toEqual(expected);
|
||||
});
|
||||
|
||||
it('replaces package', () => {
|
||||
const upgrade = {
|
||||
depType: 'pnpm.catalog',
|
||||
depName: 'config',
|
||||
newName: 'abc',
|
||||
newValue: '2.0.0',
|
||||
managerData: {
|
||||
catalogName: 'default',
|
||||
},
|
||||
};
|
||||
const pnpmWorkspaceYaml = yamlCodeBlock`
|
||||
packages:
|
||||
- pkg-a
|
||||
|
||||
catalog:
|
||||
config: 1.21.0
|
||||
`;
|
||||
const expected = yamlCodeBlock`
|
||||
packages:
|
||||
- pkg-a
|
||||
|
||||
catalog:
|
||||
abc: 2.0.0
|
||||
`;
|
||||
const testContent = npmUpdater.updateDependency({
|
||||
fileContent: pnpmWorkspaceYaml,
|
||||
upgrade,
|
||||
});
|
||||
expect(testContent).toEqual(expected);
|
||||
});
|
||||
|
||||
it('replaces a github dependency value', () => {
|
||||
const upgrade = {
|
||||
depType: 'pnpm.catalog',
|
||||
depName: 'gulp',
|
||||
currentValue: 'v4.0.0-alpha.2',
|
||||
currentRawValue: 'gulpjs/gulp#v4.0.0-alpha.2',
|
||||
newValue: 'v4.0.0',
|
||||
managerData: {
|
||||
catalogName: 'default',
|
||||
},
|
||||
};
|
||||
const pnpmWorkspaceYaml = yamlCodeBlock`
|
||||
packages:
|
||||
- pkg-a
|
||||
|
||||
catalog:
|
||||
gulp: gulpjs/gulp#v4.0.0-alpha.2
|
||||
`;
|
||||
const expected = yamlCodeBlock`
|
||||
packages:
|
||||
- pkg-a
|
||||
|
||||
catalog:
|
||||
gulp: gulpjs/gulp#v4.0.0
|
||||
`;
|
||||
const testContent = npmUpdater.updateDependency({
|
||||
fileContent: pnpmWorkspaceYaml,
|
||||
upgrade,
|
||||
});
|
||||
expect(testContent).toEqual(expected);
|
||||
});
|
||||
|
||||
it('replaces a npm package alias', () => {
|
||||
const upgrade = {
|
||||
depType: 'pnpm.catalog',
|
||||
depName: 'hapi',
|
||||
npmPackageAlias: true,
|
||||
packageName: '@hapi/hapi',
|
||||
currentValue: '18.3.0',
|
||||
newValue: '18.3.1',
|
||||
managerData: {
|
||||
catalogName: 'default',
|
||||
},
|
||||
};
|
||||
const pnpmWorkspaceYaml = yamlCodeBlock`
|
||||
packages:
|
||||
- pkg-a
|
||||
|
||||
catalog:
|
||||
hapi: npm:@hapi/hapi@18.3.0
|
||||
`;
|
||||
const expected = yamlCodeBlock`
|
||||
packages:
|
||||
- pkg-a
|
||||
|
||||
catalog:
|
||||
hapi: npm:@hapi/hapi@18.3.1
|
||||
`;
|
||||
const testContent = npmUpdater.updateDependency({
|
||||
fileContent: pnpmWorkspaceYaml,
|
||||
upgrade,
|
||||
});
|
||||
expect(testContent).toEqual(expected);
|
||||
});
|
||||
|
||||
it('replaces a github short hash', () => {
|
||||
const upgrade = {
|
||||
depType: 'pnpm.catalog',
|
||||
depName: 'gulp',
|
||||
currentDigest: 'abcdef7',
|
||||
currentRawValue: 'gulpjs/gulp#abcdef7',
|
||||
newDigest: '0000000000111111111122222222223333333333',
|
||||
managerData: {
|
||||
catalogName: 'default',
|
||||
},
|
||||
};
|
||||
const pnpmWorkspaceYaml = yamlCodeBlock`
|
||||
packages:
|
||||
- pkg-a
|
||||
|
||||
catalog:
|
||||
gulp: gulpjs/gulp#abcdef7
|
||||
`;
|
||||
const expected = yamlCodeBlock`
|
||||
packages:
|
||||
- pkg-a
|
||||
|
||||
catalog:
|
||||
gulp: gulpjs/gulp#0000000
|
||||
`;
|
||||
const testContent = npmUpdater.updateDependency({
|
||||
fileContent: pnpmWorkspaceYaml,
|
||||
upgrade,
|
||||
});
|
||||
expect(testContent).toEqual(expected);
|
||||
});
|
||||
|
||||
it('replaces a github fully specified version', () => {
|
||||
const upgrade = {
|
||||
depType: 'pnpm.catalog',
|
||||
depName: 'n',
|
||||
currentValue: 'v1.0.0',
|
||||
currentRawValue: 'git+https://github.com/owner/n#v1.0.0',
|
||||
newValue: 'v1.1.0',
|
||||
managerData: {
|
||||
catalogName: 'default',
|
||||
},
|
||||
};
|
||||
const pnpmWorkspaceYaml = yamlCodeBlock`
|
||||
packages:
|
||||
- pkg-a
|
||||
|
||||
catalog:
|
||||
n: git+https://github.com/owner/n#v1.0.0
|
||||
`;
|
||||
const expected = yamlCodeBlock`
|
||||
packages:
|
||||
- pkg-a
|
||||
|
||||
catalog:
|
||||
n: git+https://github.com/owner/n#v1.1.0
|
||||
`;
|
||||
const testContent = npmUpdater.updateDependency({
|
||||
fileContent: pnpmWorkspaceYaml,
|
||||
upgrade,
|
||||
});
|
||||
expect(testContent).toEqual(expected);
|
||||
});
|
||||
|
||||
it('returns null if the dependency is not present in the target catalog', () => {
|
||||
const upgrade = {
|
||||
depType: 'pnpm.catalog',
|
||||
depName: 'react-not',
|
||||
newValue: '19.0.0',
|
||||
managerData: {
|
||||
catalogName: 'default',
|
||||
},
|
||||
};
|
||||
const pnpmWorkspaceYaml = yamlCodeBlock`
|
||||
packages:
|
||||
- pkg-a
|
||||
|
||||
catalog:
|
||||
react: 18.3.1
|
||||
`;
|
||||
const testContent = npmUpdater.updateDependency({
|
||||
fileContent: pnpmWorkspaceYaml,
|
||||
upgrade,
|
||||
});
|
||||
expect(testContent).toBeNull();
|
||||
});
|
||||
|
||||
it('returns null if catalogs are missing', () => {
|
||||
const upgrade = {
|
||||
depType: 'pnpm.catalog',
|
||||
depName: 'react',
|
||||
newValue: '19.0.0',
|
||||
managerData: {
|
||||
catalogName: 'default',
|
||||
},
|
||||
};
|
||||
const pnpmWorkspaceYaml = yamlCodeBlock`
|
||||
packages:
|
||||
- pkg-a
|
||||
`;
|
||||
const testContent = npmUpdater.updateDependency({
|
||||
fileContent: pnpmWorkspaceYaml,
|
||||
upgrade,
|
||||
});
|
||||
expect(testContent).toBeNull();
|
||||
});
|
||||
|
||||
it('returns null if empty file', () => {
|
||||
const upgrade = {
|
||||
depType: 'pnpm.catalog',
|
||||
depName: 'react',
|
||||
newValue: '19.0.0',
|
||||
managerData: {
|
||||
catalogName: 'default',
|
||||
},
|
||||
};
|
||||
const testContent = npmUpdater.updateDependency({
|
||||
fileContent: null as never,
|
||||
upgrade,
|
||||
});
|
||||
expect(testContent).toBeNull();
|
||||
});
|
||||
});
|
104
lib/modules/manager/npm/update/dependency/pnpm.ts
Normal file
104
lib/modules/manager/npm/update/dependency/pnpm.ts
Normal file
|
@ -0,0 +1,104 @@
|
|||
import is from '@sindresorhus/is';
|
||||
import { stringify } from 'yaml';
|
||||
import { logger } from '../../../../../logger';
|
||||
import { parseSingleYamlDocument } from '../../../../../util/yaml';
|
||||
import type { UpdateDependencyConfig } from '../../../types';
|
||||
import { pnpmCatalogsSchema } from '../../extract/pnpm';
|
||||
import { getNewGitValue, getNewNpmAliasValue } from './common';
|
||||
|
||||
export function updatePnpmCatalogDependency({
|
||||
fileContent,
|
||||
upgrade,
|
||||
}: UpdateDependencyConfig): string | null {
|
||||
const { depType, managerData, depName } = upgrade;
|
||||
|
||||
const catalogName = managerData?.catalogName;
|
||||
|
||||
if (!is.string(catalogName)) {
|
||||
logger.error(
|
||||
'No catalogName was found; this is likely an extraction error.',
|
||||
);
|
||||
return null;
|
||||
}
|
||||
|
||||
let { newValue } = upgrade;
|
||||
|
||||
newValue = getNewGitValue(upgrade) ?? newValue;
|
||||
newValue = getNewNpmAliasValue(newValue, upgrade) ?? newValue;
|
||||
|
||||
logger.debug(
|
||||
`npm.updatePnpmCatalogDependency(): ${depType}:${managerData?.catalogName}.${depName} = ${newValue}`,
|
||||
);
|
||||
|
||||
let document;
|
||||
let parsedContents;
|
||||
|
||||
try {
|
||||
document = parseSingleYamlDocument(fileContent);
|
||||
parsedContents = pnpmCatalogsSchema.parse(document.toJS());
|
||||
} catch (err) {
|
||||
logger.debug({ err }, 'Could not parse pnpm-workspace YAML file.');
|
||||
return null;
|
||||
}
|
||||
|
||||
// In pnpm-workspace.yaml, the default catalog can be either `catalog` or
|
||||
// `catalog.default`, but not both (pnpm throws outright with a config error).
|
||||
// Thus, we must check which entry is being used, to reference it from the
|
||||
// right place.
|
||||
const usesImplicitDefaultCatalog = parsedContents.catalog !== undefined;
|
||||
|
||||
// Save the old version
|
||||
const oldVersion =
|
||||
catalogName === 'default' && usesImplicitDefaultCatalog
|
||||
? parsedContents.catalog?.[depName!]
|
||||
: parsedContents.catalogs?.[catalogName]?.[depName!];
|
||||
|
||||
if (oldVersion === newValue) {
|
||||
logger.trace('Version is already updated');
|
||||
return fileContent;
|
||||
}
|
||||
|
||||
// Update the value
|
||||
const path = getDepPath({
|
||||
depName: depName!,
|
||||
catalogName,
|
||||
usesImplicitDefaultCatalog,
|
||||
});
|
||||
|
||||
if (!document.hasIn(path)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
document.setIn(path, newValue);
|
||||
|
||||
// Update the name, for replacements
|
||||
if (upgrade.newName) {
|
||||
const newPath = getDepPath({
|
||||
depName: upgrade.newName,
|
||||
catalogName,
|
||||
usesImplicitDefaultCatalog,
|
||||
});
|
||||
const oldValue = document.getIn(path);
|
||||
|
||||
document.deleteIn(path);
|
||||
document.setIn(newPath, oldValue);
|
||||
}
|
||||
|
||||
return stringify(document);
|
||||
}
|
||||
|
||||
function getDepPath({
|
||||
catalogName,
|
||||
depName,
|
||||
usesImplicitDefaultCatalog,
|
||||
}: {
|
||||
usesImplicitDefaultCatalog: boolean;
|
||||
catalogName: string;
|
||||
depName: string;
|
||||
}): string[] {
|
||||
if (catalogName === 'default' && usesImplicitDefaultCatalog) {
|
||||
return ['catalog', depName];
|
||||
} else {
|
||||
return ['catalogs', catalogName, depName];
|
||||
}
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
import type {
|
||||
CreateNodeOptions,
|
||||
Document,
|
||||
DocumentOptions,
|
||||
ParseOptions,
|
||||
SchemaOptions,
|
||||
|
@ -20,6 +21,13 @@ interface YamlOptions<
|
|||
removeTemplates?: boolean;
|
||||
}
|
||||
|
||||
interface YamlParseDocumentOptions
|
||||
extends ParseOptions,
|
||||
DocumentOptions,
|
||||
SchemaOptions {
|
||||
removeTemplates?: boolean;
|
||||
}
|
||||
|
||||
interface YamlOptionsMultiple<
|
||||
ResT = unknown,
|
||||
Schema extends ZodType<ResT> = ZodType<ResT>,
|
||||
|
@ -117,6 +125,29 @@ export function parseSingleYaml<ResT = unknown>(
|
|||
content: string,
|
||||
options?: YamlOptions<ResT>,
|
||||
): ResT {
|
||||
const rawDocument = parseSingleYamlDocument(content, options);
|
||||
|
||||
const document = rawDocument.toJS({ maxAliasCount: 10000 });
|
||||
const schema = options?.customSchema;
|
||||
if (!schema) {
|
||||
return document as ResT;
|
||||
}
|
||||
|
||||
return schema.parse(document);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse a YAML string into a Document representation.
|
||||
*
|
||||
* Only a single document is supported.
|
||||
*
|
||||
* @param content
|
||||
* @param options
|
||||
*/
|
||||
export function parseSingleYamlDocument(
|
||||
content: string,
|
||||
options?: YamlParseDocumentOptions,
|
||||
): Document {
|
||||
const massagedContent = massageContent(content, options);
|
||||
const rawDocument = parseDocument(
|
||||
massagedContent,
|
||||
|
@ -127,13 +158,7 @@ export function parseSingleYaml<ResT = unknown>(
|
|||
throw new AggregateError(rawDocument.errors, 'Failed to parse YAML file');
|
||||
}
|
||||
|
||||
const document = rawDocument.toJS({ maxAliasCount: 10000 });
|
||||
const schema = options?.customSchema;
|
||||
if (!schema) {
|
||||
return document as ResT;
|
||||
}
|
||||
|
||||
return schema.parse(document);
|
||||
return rawDocument;
|
||||
}
|
||||
|
||||
export function dump(obj: any, opts?: DumpOptions): string {
|
||||
|
|
|
@ -299,7 +299,7 @@
|
|||
"@types/mdast": "3.0.15",
|
||||
"@types/moo": "0.5.9",
|
||||
"@types/ms": "0.7.34",
|
||||
"@types/node": "20.17.10",
|
||||
"@types/node": "20.17.11",
|
||||
"@types/parse-link-header": "2.0.3",
|
||||
"@types/punycode": "2.1.4",
|
||||
"@types/semver": "7.5.8",
|
||||
|
|
130
pnpm-lock.yaml
130
pnpm-lock.yaml
|
@ -470,8 +470,8 @@ importers:
|
|||
specifier: 0.7.34
|
||||
version: 0.7.34
|
||||
'@types/node':
|
||||
specifier: 20.17.10
|
||||
version: 20.17.10
|
||||
specifier: 20.17.11
|
||||
version: 20.17.11
|
||||
'@types/parse-link-header':
|
||||
specifier: 2.0.3
|
||||
version: 2.0.3
|
||||
|
@ -540,7 +540,7 @@ importers:
|
|||
version: 2.31.0(@typescript-eslint/parser@8.19.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1)
|
||||
eslint-plugin-jest:
|
||||
specifier: 28.10.0
|
||||
version: 28.10.0(@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(jest@29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2)))(typescript@5.7.2)
|
||||
version: 28.10.0(@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(jest@29.7.0(@types/node@20.17.11)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2)))(typescript@5.7.2)
|
||||
eslint-plugin-jest-formatting:
|
||||
specifier: 3.1.0
|
||||
version: 3.1.0(eslint@8.57.1)
|
||||
|
@ -564,16 +564,16 @@ importers:
|
|||
version: 9.1.7
|
||||
jest:
|
||||
specifier: 29.7.0
|
||||
version: 29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2))
|
||||
version: 29.7.0(@types/node@20.17.11)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2))
|
||||
jest-extended:
|
||||
specifier: 4.0.2
|
||||
version: 4.0.2(jest@29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2)))
|
||||
version: 4.0.2(jest@29.7.0(@types/node@20.17.11)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2)))
|
||||
jest-mock:
|
||||
specifier: 29.7.0
|
||||
version: 29.7.0
|
||||
jest-mock-extended:
|
||||
specifier: 3.0.7
|
||||
version: 3.0.7(jest@29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2)))(typescript@5.7.2)
|
||||
version: 3.0.7(jest@29.7.0(@types/node@20.17.11)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2)))(typescript@5.7.2)
|
||||
jest-snapshot:
|
||||
specifier: 29.7.0
|
||||
version: 29.7.0
|
||||
|
@ -609,10 +609,10 @@ importers:
|
|||
version: 3.0.3
|
||||
ts-jest:
|
||||
specifier: 29.2.5
|
||||
version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2)))(typescript@5.7.2)
|
||||
version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.11)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2)))(typescript@5.7.2)
|
||||
ts-node:
|
||||
specifier: 10.9.2
|
||||
version: 10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2)
|
||||
version: 10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2)
|
||||
type-fest:
|
||||
specifier: 4.31.0
|
||||
version: 4.31.0
|
||||
|
@ -2121,8 +2121,8 @@ packages:
|
|||
'@types/ms@0.7.34':
|
||||
resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
|
||||
|
||||
'@types/node@20.17.10':
|
||||
resolution: {integrity: sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==}
|
||||
'@types/node@20.17.11':
|
||||
resolution: {integrity: sha512-Ept5glCK35R8yeyIeYlRIZtX6SLRyqMhOFTgj5SOkMpLTdw3SEHI9fHx60xaUZ+V1aJxQJODE+7/j5ocZydYTg==}
|
||||
|
||||
'@types/normalize-package-data@2.4.4':
|
||||
resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
|
||||
|
@ -7496,27 +7496,27 @@ snapshots:
|
|||
'@jest/console@29.7.0':
|
||||
dependencies:
|
||||
'@jest/types': 29.6.3
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
chalk: 4.1.2
|
||||
jest-message-util: 29.7.0
|
||||
jest-util: 29.7.0
|
||||
slash: 3.0.0
|
||||
|
||||
'@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2))':
|
||||
'@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2))':
|
||||
dependencies:
|
||||
'@jest/console': 29.7.0
|
||||
'@jest/reporters': 29.7.0
|
||||
'@jest/test-result': 29.7.0
|
||||
'@jest/transform': 29.7.0
|
||||
'@jest/types': 29.6.3
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
ansi-escapes: 4.3.2
|
||||
chalk: 4.1.2
|
||||
ci-info: 3.9.0
|
||||
exit: 0.1.2
|
||||
graceful-fs: 4.2.11
|
||||
jest-changed-files: 29.7.0
|
||||
jest-config: 29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2))
|
||||
jest-config: 29.7.0(@types/node@20.17.11)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2))
|
||||
jest-haste-map: 29.7.0
|
||||
jest-message-util: 29.7.0
|
||||
jest-regex-util: 29.6.3
|
||||
|
@ -7541,7 +7541,7 @@ snapshots:
|
|||
dependencies:
|
||||
'@jest/fake-timers': 29.7.0
|
||||
'@jest/types': 29.6.3
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
jest-mock: 29.7.0
|
||||
|
||||
'@jest/expect-utils@29.4.1':
|
||||
|
@ -7563,7 +7563,7 @@ snapshots:
|
|||
dependencies:
|
||||
'@jest/types': 29.6.3
|
||||
'@sinonjs/fake-timers': 10.3.0
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
jest-message-util: 29.7.0
|
||||
jest-mock: 29.7.0
|
||||
jest-util: 29.7.0
|
||||
|
@ -7585,7 +7585,7 @@ snapshots:
|
|||
'@jest/transform': 29.7.0
|
||||
'@jest/types': 29.6.3
|
||||
'@jridgewell/trace-mapping': 0.3.25
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
chalk: 4.1.2
|
||||
collect-v8-coverage: 1.0.2
|
||||
exit: 0.1.2
|
||||
|
@ -7655,7 +7655,7 @@ snapshots:
|
|||
'@jest/schemas': 29.6.3
|
||||
'@types/istanbul-lib-coverage': 2.0.6
|
||||
'@types/istanbul-reports': 3.0.4
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
'@types/yargs': 17.0.33
|
||||
chalk: 4.1.2
|
||||
|
||||
|
@ -8703,7 +8703,7 @@ snapshots:
|
|||
|
||||
'@types/aws4@1.11.6':
|
||||
dependencies:
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
|
||||
'@types/babel__core@7.20.5':
|
||||
dependencies:
|
||||
|
@ -8728,27 +8728,27 @@ snapshots:
|
|||
|
||||
'@types/better-sqlite3@7.6.12':
|
||||
dependencies:
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
|
||||
'@types/breejs__later@4.1.5': {}
|
||||
|
||||
'@types/bunyan@1.8.11':
|
||||
dependencies:
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
|
||||
'@types/bunyan@1.8.9':
|
||||
dependencies:
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
|
||||
'@types/cacache@17.0.2':
|
||||
dependencies:
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
|
||||
'@types/cacheable-request@6.0.3':
|
||||
dependencies:
|
||||
'@types/http-cache-semantics': 4.0.4
|
||||
'@types/keyv': 3.1.4
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
'@types/responselike': 1.0.3
|
||||
|
||||
'@types/callsite@1.0.34': {}
|
||||
|
@ -8779,7 +8779,7 @@ snapshots:
|
|||
'@types/fs-extra@11.0.4':
|
||||
dependencies:
|
||||
'@types/jsonfile': 6.1.4
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
|
||||
'@types/git-url-parse@9.0.3': {}
|
||||
|
||||
|
@ -8789,7 +8789,7 @@ snapshots:
|
|||
|
||||
'@types/graceful-fs@4.1.9':
|
||||
dependencies:
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
|
||||
'@types/http-cache-semantics@4.0.4': {}
|
||||
|
||||
|
@ -8815,13 +8815,13 @@ snapshots:
|
|||
|
||||
'@types/jsonfile@6.1.4':
|
||||
dependencies:
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
|
||||
'@types/katex@0.16.7': {}
|
||||
|
||||
'@types/keyv@3.1.4':
|
||||
dependencies:
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
|
||||
'@types/linkify-it@5.0.0': {}
|
||||
|
||||
|
@ -8840,7 +8840,7 @@ snapshots:
|
|||
|
||||
'@types/marshal@0.5.3':
|
||||
dependencies:
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
|
||||
'@types/mdast@3.0.15':
|
||||
dependencies:
|
||||
|
@ -8856,7 +8856,7 @@ snapshots:
|
|||
|
||||
'@types/ms@0.7.34': {}
|
||||
|
||||
'@types/node@20.17.10':
|
||||
'@types/node@20.17.11':
|
||||
dependencies:
|
||||
undici-types: 6.19.8
|
||||
|
||||
|
@ -8870,7 +8870,7 @@ snapshots:
|
|||
|
||||
'@types/responselike@1.0.3':
|
||||
dependencies:
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
|
||||
'@types/semver-stable@3.0.2': {}
|
||||
|
||||
|
@ -8890,7 +8890,7 @@ snapshots:
|
|||
|
||||
'@types/tar@6.1.13':
|
||||
dependencies:
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
minipass: 4.2.8
|
||||
|
||||
'@types/tmp@0.2.6': {}
|
||||
|
@ -8915,7 +8915,7 @@ snapshots:
|
|||
|
||||
'@types/yauzl@2.10.3':
|
||||
dependencies:
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
optional: true
|
||||
|
||||
'@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)':
|
||||
|
@ -9680,13 +9680,13 @@ snapshots:
|
|||
optionalDependencies:
|
||||
typescript: 5.7.2
|
||||
|
||||
create-jest@29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2)):
|
||||
create-jest@29.7.0(@types/node@20.17.11)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2)):
|
||||
dependencies:
|
||||
'@jest/types': 29.6.3
|
||||
chalk: 4.1.2
|
||||
exit: 0.1.2
|
||||
graceful-fs: 4.2.11
|
||||
jest-config: 29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2))
|
||||
jest-config: 29.7.0(@types/node@20.17.11)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2))
|
||||
jest-util: 29.7.0
|
||||
prompts: 2.4.2
|
||||
transitivePeerDependencies:
|
||||
|
@ -10109,13 +10109,13 @@ snapshots:
|
|||
dependencies:
|
||||
eslint: 8.57.1
|
||||
|
||||
eslint-plugin-jest@28.10.0(@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(jest@29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2)))(typescript@5.7.2):
|
||||
eslint-plugin-jest@28.10.0(@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(jest@29.7.0(@types/node@20.17.11)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2)))(typescript@5.7.2):
|
||||
dependencies:
|
||||
'@typescript-eslint/utils': 8.19.0(eslint@8.57.1)(typescript@5.7.2)
|
||||
eslint: 8.57.1
|
||||
optionalDependencies:
|
||||
'@typescript-eslint/eslint-plugin': 8.19.0(@typescript-eslint/parser@8.19.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)
|
||||
jest: 29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2))
|
||||
jest: 29.7.0(@types/node@20.17.11)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2))
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
- typescript
|
||||
|
@ -11146,7 +11146,7 @@ snapshots:
|
|||
'@jest/expect': 29.7.0
|
||||
'@jest/test-result': 29.7.0
|
||||
'@jest/types': 29.6.3
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
chalk: 4.1.2
|
||||
co: 4.6.0
|
||||
dedent: 1.5.3
|
||||
|
@ -11166,16 +11166,16 @@ snapshots:
|
|||
- babel-plugin-macros
|
||||
- supports-color
|
||||
|
||||
jest-cli@29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2)):
|
||||
jest-cli@29.7.0(@types/node@20.17.11)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2)):
|
||||
dependencies:
|
||||
'@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2))
|
||||
'@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2))
|
||||
'@jest/test-result': 29.7.0
|
||||
'@jest/types': 29.6.3
|
||||
chalk: 4.1.2
|
||||
create-jest: 29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2))
|
||||
create-jest: 29.7.0(@types/node@20.17.11)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2))
|
||||
exit: 0.1.2
|
||||
import-local: 3.2.0
|
||||
jest-config: 29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2))
|
||||
jest-config: 29.7.0(@types/node@20.17.11)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2))
|
||||
jest-util: 29.7.0
|
||||
jest-validate: 29.7.0
|
||||
yargs: 17.7.2
|
||||
|
@ -11185,7 +11185,7 @@ snapshots:
|
|||
- supports-color
|
||||
- ts-node
|
||||
|
||||
jest-config@29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2)):
|
||||
jest-config@29.7.0(@types/node@20.17.11)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2)):
|
||||
dependencies:
|
||||
'@babel/core': 7.26.0
|
||||
'@jest/test-sequencer': 29.7.0
|
||||
|
@ -11210,8 +11210,8 @@ snapshots:
|
|||
slash: 3.0.0
|
||||
strip-json-comments: 3.1.1
|
||||
optionalDependencies:
|
||||
'@types/node': 20.17.10
|
||||
ts-node: 10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2)
|
||||
'@types/node': 20.17.11
|
||||
ts-node: 10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2)
|
||||
transitivePeerDependencies:
|
||||
- babel-plugin-macros
|
||||
- supports-color
|
||||
|
@ -11240,16 +11240,16 @@ snapshots:
|
|||
'@jest/environment': 29.7.0
|
||||
'@jest/fake-timers': 29.7.0
|
||||
'@jest/types': 29.6.3
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
jest-mock: 29.7.0
|
||||
jest-util: 29.7.0
|
||||
|
||||
jest-extended@4.0.2(jest@29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2))):
|
||||
jest-extended@4.0.2(jest@29.7.0(@types/node@20.17.11)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2))):
|
||||
dependencies:
|
||||
jest-diff: 29.7.0
|
||||
jest-get-type: 29.6.3
|
||||
optionalDependencies:
|
||||
jest: 29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2))
|
||||
jest: 29.7.0(@types/node@20.17.11)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2))
|
||||
|
||||
jest-get-type@29.6.3: {}
|
||||
|
||||
|
@ -11257,7 +11257,7 @@ snapshots:
|
|||
dependencies:
|
||||
'@jest/types': 29.6.3
|
||||
'@types/graceful-fs': 4.1.9
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
anymatch: 3.1.3
|
||||
fb-watchman: 2.0.2
|
||||
graceful-fs: 4.2.11
|
||||
|
@ -11300,16 +11300,16 @@ snapshots:
|
|||
slash: 3.0.0
|
||||
stack-utils: 2.0.6
|
||||
|
||||
jest-mock-extended@3.0.7(jest@29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2)))(typescript@5.7.2):
|
||||
jest-mock-extended@3.0.7(jest@29.7.0(@types/node@20.17.11)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2)))(typescript@5.7.2):
|
||||
dependencies:
|
||||
jest: 29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2))
|
||||
jest: 29.7.0(@types/node@20.17.11)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2))
|
||||
ts-essentials: 10.0.4(typescript@5.7.2)
|
||||
typescript: 5.7.2
|
||||
|
||||
jest-mock@29.7.0:
|
||||
dependencies:
|
||||
'@jest/types': 29.6.3
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
jest-util: 29.7.0
|
||||
|
||||
jest-pnp-resolver@1.2.3(jest-resolve@29.7.0):
|
||||
|
@ -11344,7 +11344,7 @@ snapshots:
|
|||
'@jest/test-result': 29.7.0
|
||||
'@jest/transform': 29.7.0
|
||||
'@jest/types': 29.6.3
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
chalk: 4.1.2
|
||||
emittery: 0.13.1
|
||||
graceful-fs: 4.2.11
|
||||
|
@ -11372,7 +11372,7 @@ snapshots:
|
|||
'@jest/test-result': 29.7.0
|
||||
'@jest/transform': 29.7.0
|
||||
'@jest/types': 29.6.3
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
chalk: 4.1.2
|
||||
cjs-module-lexer: 1.4.1
|
||||
collect-v8-coverage: 1.0.2
|
||||
|
@ -11418,7 +11418,7 @@ snapshots:
|
|||
jest-util@29.7.0:
|
||||
dependencies:
|
||||
'@jest/types': 29.6.3
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
chalk: 4.1.2
|
||||
ci-info: 3.9.0
|
||||
graceful-fs: 4.2.11
|
||||
|
@ -11437,7 +11437,7 @@ snapshots:
|
|||
dependencies:
|
||||
'@jest/test-result': 29.7.0
|
||||
'@jest/types': 29.6.3
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
ansi-escapes: 4.3.2
|
||||
chalk: 4.1.2
|
||||
emittery: 0.13.1
|
||||
|
@ -11446,17 +11446,17 @@ snapshots:
|
|||
|
||||
jest-worker@29.7.0:
|
||||
dependencies:
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
jest-util: 29.7.0
|
||||
merge-stream: 2.0.0
|
||||
supports-color: 8.1.1
|
||||
|
||||
jest@29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2)):
|
||||
jest@29.7.0(@types/node@20.17.11)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2)):
|
||||
dependencies:
|
||||
'@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2))
|
||||
'@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2))
|
||||
'@jest/types': 29.6.3
|
||||
import-local: 3.2.0
|
||||
jest-cli: 29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2))
|
||||
jest-cli: 29.7.0(@types/node@20.17.11)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2))
|
||||
transitivePeerDependencies:
|
||||
- '@types/node'
|
||||
- babel-plugin-macros
|
||||
|
@ -12619,7 +12619,7 @@ snapshots:
|
|||
'@protobufjs/path': 1.1.2
|
||||
'@protobufjs/pool': 1.1.0
|
||||
'@protobufjs/utf8': 1.1.0
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
long: 5.2.3
|
||||
|
||||
protocols@2.0.1: {}
|
||||
|
@ -13382,12 +13382,12 @@ snapshots:
|
|||
optionalDependencies:
|
||||
typescript: 5.7.2
|
||||
|
||||
ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2)))(typescript@5.7.2):
|
||||
ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.11)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2)))(typescript@5.7.2):
|
||||
dependencies:
|
||||
bs-logger: 0.2.6
|
||||
ejs: 3.1.10
|
||||
fast-json-stable-stringify: 2.1.0
|
||||
jest: 29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2))
|
||||
jest: 29.7.0(@types/node@20.17.11)(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2))
|
||||
jest-util: 29.7.0
|
||||
json5: 2.2.3
|
||||
lodash.memoize: 4.1.2
|
||||
|
@ -13401,14 +13401,14 @@ snapshots:
|
|||
'@jest/types': 29.6.3
|
||||
babel-jest: 29.7.0(@babel/core@7.26.0)
|
||||
|
||||
ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.10)(typescript@5.7.2):
|
||||
ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.17.11)(typescript@5.7.2):
|
||||
dependencies:
|
||||
'@cspotcode/source-map-support': 0.8.1
|
||||
'@tsconfig/node10': 1.0.11
|
||||
'@tsconfig/node12': 1.0.11
|
||||
'@tsconfig/node14': 1.0.3
|
||||
'@tsconfig/node16': 1.0.4
|
||||
'@types/node': 20.17.10
|
||||
'@types/node': 20.17.11
|
||||
acorn: 8.14.0
|
||||
acorn-walk: 8.3.4
|
||||
arg: 4.1.3
|
||||
|
|
Loading…
Reference in a new issue