diff --git a/packages/app/src/cli/services/generate/extension.ts b/packages/app/src/cli/services/generate/extension.ts index e3eb59c322..4a153a1f43 100644 --- a/packages/app/src/cli/services/generate/extension.ts +++ b/packages/app/src/cli/services/generate/extension.ts @@ -10,9 +10,9 @@ import { addNPMDependenciesIfNeeded, addResolutionOrOverride, DependencyVersion, - getProdDependencies, installNPMDependenciesRecursively, PackageManager, + readAndParsePackageJson, } from '@shopify/cli-kit/node/node-package-manager' import {hyphenate} from '@shopify/cli-kit/common/string' import {recursiveLiquidTemplateCopy} from '@shopify/cli-kit/node/liquid' @@ -324,3 +324,8 @@ async function addResolutionOrOverrideIfNeeded(directory: string, extensionFlavo await addResolutionOrOverride(directory, {'@types/react': versions.reactTypes}) } } + +async function getProdDependencies(packageJsonPath: string): Promise { + const packageJsonContent = await readAndParsePackageJson(packageJsonPath) + return Object.entries(packageJsonContent?.dependencies ?? {}).map(([name, version]) => ({name, version})) +} diff --git a/packages/cli-kit/src/public/node/node-package-manager.test.ts b/packages/cli-kit/src/public/node/node-package-manager.test.ts index 0d333e3200..923e3f2f65 100644 --- a/packages/cli-kit/src/public/node/node-package-manager.test.ts +++ b/packages/cli-kit/src/public/node/node-package-manager.test.ts @@ -16,9 +16,6 @@ import { installNPMDependenciesRecursively, addNPMDependencies, DependencyVersion, - getDevDependencies, - getProdDependencies, - getPeerDependencies, } from './node-package-manager.js' import {exec} from './system.js' import {inTemporaryDirectory, mkdir, touchFile, writeFile} from './fs.js' @@ -226,14 +223,13 @@ describe('usesWorkspaces', () => { }) describe('getDependencies', () => { - test('returns dev, production and peer dependencies', async () => { + test('returns dev and production dependencies', async () => { await inTemporaryDirectory(async (tmpDir) => { // Given const packageJsonPath = joinPath(tmpDir, 'package.json') const packageJson = { dependencies: {prod: '1.2.3'}, devDependencies: {dev: '4.5.6'}, - peerDependencies: {peer: '7.8.9'}, } await writeFile(packageJsonPath, JSON.stringify(packageJson)) @@ -243,16 +239,15 @@ describe('getDependencies', () => { // Then expect(got.prod).toEqual('1.2.3') expect(got.dev).toEqual('4.5.6') - expect(got.peer).toEqual('7.8.9') }) }) - test('returns production dependencies when other types do not exist', async () => { + test('returns dev dependencies when production dependencies do not exist', async () => { await inTemporaryDirectory(async (tmpDir) => { // Given const packageJsonPath = joinPath(tmpDir, 'package.json') const packageJson = { - dependencies: {prod: '1.2.3'}, + devDependencies: {dev: '4.5.6'}, } await writeFile(packageJsonPath, JSON.stringify(packageJson)) @@ -260,134 +255,34 @@ describe('getDependencies', () => { const got = await getDependencies(packageJsonPath) // Then - expect(got.prod).toEqual('1.2.3') - }) - }) - - test('throws an error if the package.json file does not exist', async () => { - await inTemporaryDirectory(async (tmpDir) => { - // Given - const packageJsonPath = joinPath(tmpDir, 'package.json') - - // When - await expect(getDependencies(packageJsonPath)).rejects.toEqual(PackageJsonNotFoundError(pathNormalize(tmpDir))) - }) - }) -}) - -describe('getProdDependencies', () => { - test('returns prod dependencies', async () => { - await inTemporaryDirectory(async (tmpDir) => { - // Given - const packageJsonPath = joinPath(tmpDir, 'package.json') - const packageJson = { - dependencies: {prod: '1.2.3'}, - devDependencies: {dev1: '4.5.6', dev2: '7.8.9'}, - } - await writeFile(packageJsonPath, JSON.stringify(packageJson)) - - // When - const got = await getProdDependencies(packageJsonPath) - - // Then - expect(got).toEqual([{name: 'prod', version: '1.2.3'}]) - }) - }) - - test('returns an empty array when there are no dependencies', async () => { - await inTemporaryDirectory(async (tmpDir) => { - // Given - const packageJsonPath = joinPath(tmpDir, 'package.json') - const packageJson = { - devDependencies: {dev1: '4.5.6', dev2: '7.8.9'}, - } - await writeFile(packageJsonPath, JSON.stringify(packageJson)) - - // When - const got = await getProdDependencies(packageJsonPath) - - // Then - expect(got).toEqual([]) - }) - }) -}) - -describe('getDevDependencies', () => { - test('returns dev dependencies', async () => { - await inTemporaryDirectory(async (tmpDir) => { - // Given - const packageJsonPath = joinPath(tmpDir, 'package.json') - const packageJson = { - dependencies: {prod: '1.2.3'}, - devDependencies: {dev1: '4.5.6', dev2: '7.8.9'}, - } - await writeFile(packageJsonPath, JSON.stringify(packageJson)) - - // When - const got = await getDevDependencies(packageJsonPath) - - // Then - expect(got).toEqual([ - {name: 'dev1', version: '4.5.6'}, - {name: 'dev2', version: '7.8.9'}, - ]) - }) - }) - - test('returns an empty array when there are no dependencies', async () => { - await inTemporaryDirectory(async (tmpDir) => { - // Given - const packageJsonPath = joinPath(tmpDir, 'package.json') - const packageJson = { - dependencies: {prod: '1.2.3'}, - } - await writeFile(packageJsonPath, JSON.stringify(packageJson)) - - // When - const got = await getDevDependencies(packageJsonPath) - - // Then - expect(got).toEqual([]) + expect(got.dev).toEqual('4.5.6') }) }) -}) -describe('getPeerDependencies', () => { - test('returns dev dependencies', async () => { + test('returns production dependencies when dev dependencies do not exist', async () => { await inTemporaryDirectory(async (tmpDir) => { // Given const packageJsonPath = joinPath(tmpDir, 'package.json') const packageJson = { dependencies: {prod: '1.2.3'}, - peerDependencies: {peer1: '4.5.6', peer2: '7.8.9'}, } await writeFile(packageJsonPath, JSON.stringify(packageJson)) // When - const got = await getPeerDependencies(packageJsonPath) + const got = await getDependencies(packageJsonPath) // Then - expect(got).toEqual([ - {name: 'peer1', version: '4.5.6'}, - {name: 'peer2', version: '7.8.9'}, - ]) + expect(got.prod).toEqual('1.2.3') }) }) - test('returns an empty array when there are no dependencies', async () => { + test('throws an error if the package.json file does not exist', async () => { await inTemporaryDirectory(async (tmpDir) => { // Given const packageJsonPath = joinPath(tmpDir, 'package.json') - const packageJson = { - dependencies: {prod: '1.2.3'}, - } - await writeFile(packageJsonPath, JSON.stringify(packageJson)) // When - const got = await getPeerDependencies(packageJsonPath) - - // Then - expect(got).toEqual([]) + await expect(getDependencies(packageJsonPath)).rejects.toEqual(PackageJsonNotFoundError(pathNormalize(tmpDir))) }) }) }) diff --git a/packages/cli-kit/src/public/node/node-package-manager.ts b/packages/cli-kit/src/public/node/node-package-manager.ts index 3c50065da9..a63e559fb6 100644 --- a/packages/cli-kit/src/public/node/node-package-manager.ts +++ b/packages/cli-kit/src/public/node/node-package-manager.ts @@ -187,7 +187,7 @@ export async function getPackageName(packageJsonPath: string): Promise { - const packageJsonContent = await readAndParsePackageJson(packageJsonPath) - return Object.entries(packageJsonContent.dependencies ?? {}).map(([name, version]) => ({name, version})) -} - -/** - * Returns the list of dev dependencies of a package.json - * @param packageJsonPath - Path to the package.json file - * @returns A promise that resolves with the list of dependencies. - */ -export async function getDevDependencies(packageJsonPath: string): Promise { - const packageJsonContent = await readAndParsePackageJson(packageJsonPath) - return Object.entries(packageJsonContent.devDependencies ?? {}).map(([name, version]) => ({name, version})) -} - -/** - * Returns the list of peer dependencies of a package.json - * @param packageJsonPath - Path to the package.json file - * @returns A promise that resolves with the list of dependencies. - */ -export async function getPeerDependencies(packageJsonPath: string): Promise { - const packageJsonContent = await readAndParsePackageJson(packageJsonPath) - return Object.entries(packageJsonContent.peerDependencies ?? {}).map(([name, version]) => ({name, version})) + return {...dependencies, ...devDependencies} } /** @@ -298,11 +267,6 @@ export interface PackageJson { */ devDependencies?: {[key: string]: string} - /** - * The peerDependencies attribute of the package.json - */ - peerDependencies?: {[key: string]: string} - /** * The optional oclif settings attribute of the package.json */ @@ -421,7 +385,8 @@ ${outputToken.json(options)} throw PackageJsonNotFoundError(options.directory) } const existingDependencies = Object.keys(await getDependencies(packageJsonPath)) - const dependenciesToAdd = dependencies.filter((dep) => { + let dependenciesToAdd = dependencies + dependenciesToAdd = dependencies.filter((dep) => { return !existingDependencies.includes(dep.name) }) if (dependenciesToAdd.length === 0) { @@ -434,6 +399,7 @@ export async function addNPMDependencies( dependencies: DependencyVersion[], options: AddNPMDependenciesIfNeededOptions, ): Promise { + let args: string[] const dependenciesWithVersion = dependencies.map((dep) => { return dep.version ? `${dep.name}@${dep.version}` : dep.name }) @@ -548,7 +514,6 @@ function argumentsToAddDependenciesWithPNPM(dependencies: string[], type: Depend command.push('--save-prod') break } - return command }