Skip to content

Commit

Permalink
feat: Support pnpm for firebase functions (#216)
Browse files Browse the repository at this point in the history
* Update nx-firebase-versions.ts

* Add @google-cloud/functions-framework to plugin workspace

* Add googleCloudFunctionsFramework dependency

* Ensure auto generated dependencies are clean semvers

* Format cleanup

* Add @google-cloud/functions-framework dep if pnpm

* Add e2e tests

* Unit test
  • Loading branch information
simondotm authored Apr 3, 2024
1 parent 45fefbe commit add6a10
Show file tree
Hide file tree
Showing 10 changed files with 299 additions and 11 deletions.
21 changes: 21 additions & 0 deletions e2e/nx-firebase-e2e/tests/test-function.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,16 @@ export function testFunction() {

validateFunctionConfig(functionData, appData)

// check that google-cloud/functions-framework is added to package.json if pnpm being used
const packageJson = readJson(
`${functionData.projectDir}/package.json`,
)
if (detectPackageManager() === 'pnpm') {
expect(packageJson.dependencies['@google-cloud/functions-framework']).toBeDefined()
}else{
expect(packageJson.dependencies['@google-cloud/functions-framework']).not.toBeDefined()
}

// cleanup
await cleanFunctionAsync(functionData)
await cleanAppAsync(appData)
Expand Down Expand Up @@ -117,6 +127,17 @@ export function testFunction() {
),
).not.toThrow()

// check that nx preserves the function `package.json` dependencies in the output `package.json`
const packageJson = readJson(
`dist/${functionData.projectDir}/package.json`,
)
if (detectPackageManager() === 'pnpm') {
expect(packageJson.dependencies['@google-cloud/functions-framework']).toBeDefined()
}else{
expect(packageJson.dependencies['@google-cloud/functions-framework']).not.toBeDefined()
}


// cleanup
await cleanFunctionAsync(functionData)
await cleanAppAsync(appData)
Expand Down
15 changes: 15 additions & 0 deletions e2e/nx-firebase-e2e/tests/test-workspace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
import {
safeRunNxCommandAsync,
} from '../test-utils'
import { detectPackageManager } from '@nx/devkit'

//--------------------------------------------------------------------------------------------------
// Test the workspace setup & init generator
Expand Down Expand Up @@ -48,9 +49,23 @@ export function testWorkspace() {
expect(
packageJson.devDependencies['firebase-functions-test'],
).toBeDefined()

// check that plugin init generator adds @google-cloud/functions-framework if pnpm is being used
if (detectPackageManager() === 'pnpm') {
expect(
packageJson.dependencies['@google-cloud/functions-framework'],
).toBeDefined()
} else {
expect(
packageJson.dependencies['@google-cloud/functions-framework'],
).not.toBeDefined()
}

// test that generator adds dev dependencies to workspace package.json
expect(packageJson.devDependencies['firebase-tools']).toBeDefined()
//SM: Mar'24: our plugin init generator now only add @nx/node
expect(packageJson.devDependencies['@nx/node']).toBeDefined()

})
})
}
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
},
"private": true,
"devDependencies": {
"@google-cloud/functions-framework": "^3.3.0",
"@nx/devkit": "16.8.1",
"@nx/eslint-plugin": "16.8.1",
"@nx/jest": "16.8.1",
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 26 additions & 1 deletion packages/nx-firebase/src/generators/function/lib/create-files.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
import { offsetFromRoot, Tree } from '@nx/devkit'
import {
detectPackageManager,
offsetFromRoot,
Tree,
updateJson,
} from '@nx/devkit'
import { generateFiles, joinPathFragments } from '@nx/devkit'
import type { NormalizedSchema } from '../schema'
import { packageVersions } from '../../../__generated__/nx-firebase-versions'

/**
* Generate the firebase app specific files
Expand Down Expand Up @@ -45,4 +51,23 @@ export function createFiles(host: Tree, options: NormalizedSchema): void {
options.projectRoot,
substitutions,
)

// set dependencies for the firebase function
const firebasePackageDependencies = {}
if (detectPackageManager() === 'pnpm') {
firebasePackageDependencies[
'@google-cloud/functions-framework'
] = `^${packageVersions.googleCloudFunctionsFramework}`
}

if (Object.keys(firebasePackageDependencies).length > 0) {
updateJson(
host,
joinPathFragments(options.projectRoot, 'package.json'),
(json) => {
json.dependencies = firebasePackageDependencies
return json
},
)
}
}
11 changes: 11 additions & 0 deletions packages/nx-firebase/src/generators/init/init.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,17 @@ describe('init generator', () => {
`^${packageVersions.killPort}`,
)

// check that plugin init generator adds @google-cloud/functions-framework if pnpm is being used
if (devkit.detectPackageManager() === 'pnpm') {
expect(
packageJson.dependencies['@google-cloud/functions-framework'],
).toBe(`^${packageVersions.googleCloudFunctionsFramework}`)
} else {
expect(
packageJson.dependencies['@google-cloud/functions-framework'],
).not.toBeDefined()
}

expect(packageJson.dependencies['tslib']).not.toBeDefined()
})

Expand Down
5 changes: 2 additions & 3 deletions packages/nx-firebase/src/generators/init/init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import { addGitIgnore, addNxIgnore } from './lib/add-git-ignore-entry'
import type { InitGeneratorOptions } from './schema'

/**
* `nx g @simondotm/nx-firebase:init`
*
* `nx g @simondotm/nx-firebase:init`
*
* Ensures the necessary firebase packages are installed in the nx workspace
* It also adds `@nx/node` if it is not already installed
*
Expand All @@ -20,4 +20,3 @@ export async function initGenerator(
}

export default initGenerator

23 changes: 20 additions & 3 deletions packages/nx-firebase/src/generators/init/lib/add-dependencies.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import {
readJson,
Tree,
addDependenciesToPackageJson,
detectPackageManager,
logger,
} from '@nx/devkit'
import { workspaceNxVersion } from '../../../utils'
import { packageVersions } from '../../../__generated__/nx-firebase-versions'
Expand All @@ -20,10 +22,12 @@ export function addDependencies(tree: Tree): GeneratorCallback {
function addDependencyIfNotPresent(
packageName: string,
packageVersion: string,
) {
): boolean {
if (!packageJson.dependencies || !packageJson.dependencies[packageName]) {
dependencies[packageName] = packageVersion
return true
}
return false
}
function addDevDependencyIfNotPresent(
packageName: string,
Expand All @@ -34,7 +38,9 @@ export function addDependencies(tree: Tree): GeneratorCallback {
!packageJson.devDependencies[packageName]
) {
devDependencies[packageName] = packageVersion
return true
}
return false
}

// Firebase packages are not managed by the plugin
Expand All @@ -49,8 +55,19 @@ export function addDependencies(tree: Tree): GeneratorCallback {
`^${packageVersions.firebaseFunctions}`,
)

//SM: not convinced we should be adding tslib in this plugin
//addDependencyIfNotPresent('tslib', tsLibVersion)
// if the workspace uses pnpm, we need to add the @google-cloud/functions-framework package
if (detectPackageManager() === 'pnpm') {
if (
addDependencyIfNotPresent(
'@google-cloud/functions-framework',
`^${packageVersions.googleCloudFunctionsFramework}`,
)
) {
logger.info(
`This workspace is using pnpm, adding '@google-cloud/functions-framework' dependency for firebase functions compatibility\nSee https://github.com/firebase/firebase-tools/issues/5911#issuecomment-1730263400\n\n`,
)
}
}

// firebase dev dependencies
addDevDependencyIfNotPresent(
Expand Down
Loading

0 comments on commit add6a10

Please sign in to comment.