diff --git a/package-lock.json b/package-lock.json index da0c525a..726f9c0b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,7 @@ "name": "root", "workspaces": [ "packages/@apphosting/*", - "packages/create-next-on-firebase/*", + "packages/create-next-on-firebase", "packages/firebase-frameworks" ], "devDependencies": { @@ -12804,6 +12804,10 @@ } } }, + "node_modules/create-next-on-firebase": { + "resolved": "packages/create-next-on-firebase", + "link": true + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -25600,10 +25604,10 @@ } }, "packages/@apphosting/adapter-angular": { - "version": "17.2.7", + "version": "17.2.8", "license": "Apache-2.0", "dependencies": { - "@apphosting/common": "^0.0.2", + "@apphosting/common": "*", "firebase-functions": "^4.3.1", "fs-extra": "^11.1.1", "strip-ansi": "^7.1.0", @@ -25704,10 +25708,10 @@ } }, "packages/@apphosting/adapter-nextjs": { - "version": "14.0.6", + "version": "14.0.7", "license": "Apache-2.0", "dependencies": { - "@apphosting/common": "^0.0.2", + "@apphosting/common": "*", "fs-extra": "^11.1.1", "yaml": "^2.3.4" }, @@ -26115,7 +26119,6 @@ }, "packages/create-next-on-firebase": { "version": "0.2.2", - "extraneous": true, "license": "Apache-2.0", "dependencies": { "@npmcli/promise-spawn": "^7.0.2", @@ -26131,6 +26134,51 @@ "typescript": "*" } }, + "packages/create-next-on-firebase/node_modules/@npmcli/promise-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", + "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", + "license": "ISC", + "dependencies": { + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "packages/create-next-on-firebase/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "packages/create-next-on-firebase/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "packages/create-next-on-firebase/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, "packages/firebase-frameworks": { "version": "0.11.4", "license": "Apache-2.0", diff --git a/package.json b/package.json index daf53e0b..c2c9e676 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ }, "workspaces": [ "packages/@apphosting/*", - "packages/create-next-on-firebase/*", + "packages/create-next-on-firebase", "packages/firebase-frameworks" ], "devDependencies": { diff --git a/packages/@apphosting/adapter-angular/package.json b/packages/@apphosting/adapter-angular/package.json index f24b6948..523171e3 100644 --- a/packages/@apphosting/adapter-angular/package.json +++ b/packages/@apphosting/adapter-angular/package.json @@ -41,7 +41,7 @@ ], "license": "Apache-2.0", "dependencies": { - "@apphosting/common": "^0.0.2", + "@apphosting/common": "*", "firebase-functions": "^4.3.1", "fs-extra": "^11.1.1", "strip-ansi": "^7.1.0", diff --git a/packages/@apphosting/adapter-nextjs/package.json b/packages/@apphosting/adapter-nextjs/package.json index e63f0422..15fcbc09 100644 --- a/packages/@apphosting/adapter-nextjs/package.json +++ b/packages/@apphosting/adapter-nextjs/package.json @@ -41,7 +41,7 @@ ], "license": "Apache-2.0", "dependencies": { - "@apphosting/common": "^0.0.2", + "@apphosting/common": "*", "fs-extra": "^11.1.1", "yaml": "^2.3.4" }, diff --git a/packages/@apphosting/build/package.json b/packages/@apphosting/build/package.json index 1b78f821..db02593b 100644 --- a/packages/@apphosting/build/package.json +++ b/packages/@apphosting/build/package.json @@ -33,11 +33,11 @@ ], "license": "Apache-2.0", "dependencies": { + "@apphosting/discover": "*", "colorette": "^2.0.20", "commander": "^11.1.0", "npm-pick-manifest": "^9.0.0", - "ts-node": "^10.9.1", - "@apphosting/discover": "*" + "ts-node": "^10.9.1" }, "devDependencies": { "@types/commander": "*" diff --git a/packages/@apphosting/discover/package.json b/packages/@apphosting/discover/package.json index 9acaca8e..d1919a06 100644 --- a/packages/@apphosting/discover/package.json +++ b/packages/@apphosting/discover/package.json @@ -39,8 +39,8 @@ "commander": "^11.1.0", "fs-extra": "^11.1.1", "npm-pick-manifest": "^9.0.0", - "ts-node": "^10.9.1", "toml": "^3.0.0", + "ts-node": "^10.9.1", "yaml": "^2.3.4" }, "devDependencies": { diff --git a/scripts/build.js b/scripts/build.js index 18218f20..4367b8fc 100755 --- a/scripts/build.js +++ b/scripts/build.js @@ -1,8 +1,10 @@ #! /usr/bin/env node const { spawn } = require("child_process"); -const { lernaScopeArgs } = require("./github.js"); +const { lernaScopes } = require("./github.js"); -const buildProcess = spawn("lerna", ["run", "build", ...lernaScopeArgs], { stdio: "inherit" }); +const buildProcess = spawn("lerna", ["run", "build", "--include-dependencies", ...lernaScopes], { + stdio: "inherit", +}); buildProcess.on("close", (code) => { process.exit(code); diff --git a/scripts/github.js b/scripts/github.js index be6a142f..b752d9e7 100644 --- a/scripts/github.js +++ b/scripts/github.js @@ -1,7 +1,7 @@ #! /usr/bin/env node const { execSync } = require("child_process"); -const [, packageFromRef, versionFromRef, , prerelease] = +const [, packagePatternFromRef, versionFromRef, , prereleaseFromRef] = /^refs\/tags\/(.+)-v(\d\d*\.\d\d*(\.\d\d*)?(-.+)?)$/.exec(process.env.GITHUB_REF ?? "") ?? []; const since = process.env.GITHUB_ACTION @@ -10,34 +10,41 @@ const since = process.env.GITHUB_ACTION }` : ""; -const lernaList = JSON.parse( - execSync( - `lerna list --json --include-dependencies --include-dependents ${ - packageFromRef ? `--scope='{,*/}${packageFromRef}'` : since - }`, - { stdio: ["ignore", "pipe", "ignore"] }, - ).toString(), -); +const lernaList = JSON.parse(execSync("lerna list --json --loglevel silent")); const ref = process.env.GITHUB_SHA ?? "HEAD"; const shortSHA = execSync(`git rev-parse --short ${ref}`).toString().trim(); -const filteredLernaList = lernaList.filter((lerna) => { - if (lerna.private) return false; - return true; -}); +const scopedLernaList = JSON.parse( + execSync( + `lerna list --json --no-private --toposort --loglevel silent --include-dependents ${ + packagePatternFromRef ? `--scope='{,*/}${packagePatternFromRef}'` : since + }`, + ), +); -if (packageFromRef && filteredLernaList.length === 0) { - throw new Error(`Lerna didn't find ${packageFromRef} in this workspace`); +const packagesFromRef = + packagePatternFromRef && + JSON.parse( + execSync( + `lerna list --json --no-private --loglevel silent --scope='{,*/}${packagePatternFromRef}'`, + ), + ); +if (packagePatternFromRef && packagesFromRef.length !== 1) { + throw new Error(`Tag pattern matched more than one package...`); } +const packageFromRef = packagesFromRef?.[0].name; -const lernaScopeArgs = filteredLernaList.map(({ name }) => ["--scope", name]).flat(); +const lernaScopes = scopedLernaList.map(({ name }) => ["--scope", name]).flat(); module.exports = { - packageFromRef, - versionFromRef, - prerelease: !packageFromRef || !!prerelease, - filteredLernaList, + taggedRelease: packageFromRef && { + name: packageFromRef, + version: versionFromRef, + tag: prereleaseFromRef ? "next" : "latest", + }, + lernaList, + scopedLernaList, shortSHA, - lernaScopeArgs, + lernaScopes, }; diff --git a/scripts/publish.js b/scripts/publish.js index 32b1900a..cbf0fd30 100755 --- a/scripts/publish.js +++ b/scripts/publish.js @@ -2,7 +2,13 @@ const { execSync } = require("child_process"); const { writeFileSync, readFileSync } = require("fs"); const { join } = require("path"); -const { filteredLernaList, versionFromRef, shortSHA, prerelease } = require("./github.js"); +const { + scopedLernaList, + lernaList, + versionFromRef, + shortSHA, + taggedRelease, +} = require("./github.js"); const wombatDressingRoomTokens = new Map([ // ['firebase-frameworks', process.env.FIREBASE_FRAMEWORKS_NPM_TOKEN], @@ -17,21 +23,44 @@ wombatDressingRoomTokens.forEach((token, pkg) => { }); }); -for (const lerna of filteredLernaList) { - if (versionFromRef && versionFromRef.split("-")[0] !== lerna.version) { +const packagesToPublish = scopedLernaList.map((lerna) => { + const isTaggedRelease = lerna.name === taggedRelease?.name; + if (isTaggedRelease && taggedRelease.version.split("-")[0] !== lerna.version) { throw new Error( `Cowardly refusing to publish ${lerna.name}@${versionFromRef} from ${lerna.version}, version needs to be bumped in source.`, ); } - const version = versionFromRef || `${lerna.version}-canary.${shortSHA}`; - const cwd = lerna.location; - const tag = versionFromRef ? (prerelease ? "next" : "latest") : "canary"; - const packageJsonPath = join(lerna.location, "package.json"); - const packageJson = JSON.parse(readFileSync(packageJsonPath).toString()); - packageJson.version = version; - writeFileSync(packageJsonPath, JSON.stringify(packageJson, undefined, 2)); + const newVersion = isTaggedRelease + ? taggedRelease.version + : `${lerna.version}-canary.${shortSHA}`; const registry = wombatDressingRoomTokens.get(lerna.name) ? `https://wombat-dressing-room.appspot.com/${lerna.name}/_ns` : "https://registry.npmjs.org"; - execSync(`npm publish --registry ${registry} --access public --tag ${tag} --provenance`, { cwd }); + const tag = isTaggedRelease ? taggedRelease.tag : "canary"; + const packageJsonPath = join(lerna.location, "package.json"); + const packageJson = JSON.parse(readFileSync(packageJsonPath).toString()); + packageJson.version = newVersion; + packageJson.publishConfig = { tag, registry, provenance: true, access: "public" }; + return packageJson; +}); + +for (const package of packagesToPublish) { + for (const dependencyName in package.dependencies) { + // for/in needs an if to make lint happy + if (dependencyName) { + const lernaDependency = lernaList.find((it) => it.name === dependencyName); + if (lernaDependency) { + const dependencyBeingPublished = packagesToPublish.find((it) => it.name === dependencyName); + const dependencyVersion = dependencyBeingPublished?.version || lernaDependency.version; + const dependencyPrerelease = dependencyVersion.includes("-"); + package.dependencies[dependencyName] = dependencyPrerelease + ? dependencyVersion + : `^${dependencyVersion}`; + } + } + } + const { location } = lernaList.find((it) => it.name === package.name); + const packageJsonPath = join(location, "package.json"); + writeFileSync(packageJsonPath, JSON.stringify(package, undefined, 2)); + execSync(`npm publish`, { cwd: location }); } diff --git a/scripts/test.js b/scripts/test.js index 4aea610a..5e19d0d8 100755 --- a/scripts/test.js +++ b/scripts/test.js @@ -1,8 +1,8 @@ #! /usr/bin/env node const { spawn } = require("child_process"); -const { lernaScopeArgs } = require("./github.js"); +const { lernaScopes } = require("./github.js"); -const testProcess = spawn("lerna", ["run", "test", "--verbose", "--no-bail", ...lernaScopeArgs], { +const testProcess = spawn("lerna", ["run", "test", "--verbose", "--no-bail", ...lernaScopes], { stdio: "inherit", }); testProcess.on("close", (code) => {