Skip to content

Commit a4c33c9

Browse files
authored
Fix apphosting/common in build/publish (#254)
* Change monorepo dependencies to `*` * Pin before we publish to the registry * Move `--include-dependencies` into `build.js` * Readability pass
1 parent c5be1f2 commit a4c33c9

File tree

10 files changed

+134
-48
lines changed

10 files changed

+134
-48
lines changed

package-lock.json

Lines changed: 54 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
},
1313
"workspaces": [
1414
"packages/@apphosting/*",
15-
"packages/create-next-on-firebase/*",
15+
"packages/create-next-on-firebase",
1616
"packages/firebase-frameworks"
1717
],
1818
"devDependencies": {

packages/@apphosting/adapter-angular/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
],
4242
"license": "Apache-2.0",
4343
"dependencies": {
44-
"@apphosting/common": "^0.0.2",
44+
"@apphosting/common": "*",
4545
"firebase-functions": "^4.3.1",
4646
"fs-extra": "^11.1.1",
4747
"strip-ansi": "^7.1.0",

packages/@apphosting/adapter-nextjs/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
],
4242
"license": "Apache-2.0",
4343
"dependencies": {
44-
"@apphosting/common": "^0.0.2",
44+
"@apphosting/common": "*",
4545
"fs-extra": "^11.1.1",
4646
"yaml": "^2.3.4"
4747
},

packages/@apphosting/build/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@
3333
],
3434
"license": "Apache-2.0",
3535
"dependencies": {
36+
"@apphosting/discover": "*",
3637
"colorette": "^2.0.20",
3738
"commander": "^11.1.0",
3839
"npm-pick-manifest": "^9.0.0",
39-
"ts-node": "^10.9.1",
40-
"@apphosting/discover": "*"
40+
"ts-node": "^10.9.1"
4141
},
4242
"devDependencies": {
4343
"@types/commander": "*"

packages/@apphosting/discover/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@
3939
"commander": "^11.1.0",
4040
"fs-extra": "^11.1.1",
4141
"npm-pick-manifest": "^9.0.0",
42-
"ts-node": "^10.9.1",
4342
"toml": "^3.0.0",
43+
"ts-node": "^10.9.1",
4444
"yaml": "^2.3.4"
4545
},
4646
"devDependencies": {

scripts/build.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
#! /usr/bin/env node
22
const { spawn } = require("child_process");
3-
const { lernaScopeArgs } = require("./github.js");
3+
const { lernaScopes } = require("./github.js");
44

5-
const buildProcess = spawn("lerna", ["run", "build", ...lernaScopeArgs], { stdio: "inherit" });
5+
const buildProcess = spawn("lerna", ["run", "build", "--include-dependencies", ...lernaScopes], {
6+
stdio: "inherit",
7+
});
68

79
buildProcess.on("close", (code) => {
810
process.exit(code);

scripts/github.js

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#! /usr/bin/env node
22
const { execSync } = require("child_process");
33

4-
const [, packageFromRef, versionFromRef, , prerelease] =
4+
const [, packagePatternFromRef, versionFromRef, , prereleaseFromRef] =
55
/^refs\/tags\/(.+)-v(\d\d*\.\d\d*(\.\d\d*)?(-.+)?)$/.exec(process.env.GITHUB_REF ?? "") ?? [];
66

77
const since = process.env.GITHUB_ACTION
@@ -10,34 +10,41 @@ const since = process.env.GITHUB_ACTION
1010
}`
1111
: "";
1212

13-
const lernaList = JSON.parse(
14-
execSync(
15-
`lerna list --json --include-dependencies --include-dependents ${
16-
packageFromRef ? `--scope='{,*/}${packageFromRef}'` : since
17-
}`,
18-
{ stdio: ["ignore", "pipe", "ignore"] },
19-
).toString(),
20-
);
13+
const lernaList = JSON.parse(execSync("lerna list --json --loglevel silent"));
2114

2215
const ref = process.env.GITHUB_SHA ?? "HEAD";
2316
const shortSHA = execSync(`git rev-parse --short ${ref}`).toString().trim();
2417

25-
const filteredLernaList = lernaList.filter((lerna) => {
26-
if (lerna.private) return false;
27-
return true;
28-
});
18+
const scopedLernaList = JSON.parse(
19+
execSync(
20+
`lerna list --json --no-private --toposort --loglevel silent --include-dependents ${
21+
packagePatternFromRef ? `--scope='{,*/}${packagePatternFromRef}'` : since
22+
}`,
23+
),
24+
);
2925

30-
if (packageFromRef && filteredLernaList.length === 0) {
31-
throw new Error(`Lerna didn't find ${packageFromRef} in this workspace`);
26+
const packagesFromRef =
27+
packagePatternFromRef &&
28+
JSON.parse(
29+
execSync(
30+
`lerna list --json --no-private --loglevel silent --scope='{,*/}${packagePatternFromRef}'`,
31+
),
32+
);
33+
if (packagePatternFromRef && packagesFromRef.length !== 1) {
34+
throw new Error(`Tag pattern matched more than one package...`);
3235
}
36+
const packageFromRef = packagesFromRef?.[0].name;
3337

34-
const lernaScopeArgs = filteredLernaList.map(({ name }) => ["--scope", name]).flat();
38+
const lernaScopes = scopedLernaList.map(({ name }) => ["--scope", name]).flat();
3539

3640
module.exports = {
37-
packageFromRef,
38-
versionFromRef,
39-
prerelease: !packageFromRef || !!prerelease,
40-
filteredLernaList,
41+
taggedRelease: packageFromRef && {
42+
name: packageFromRef,
43+
version: versionFromRef,
44+
tag: prereleaseFromRef ? "next" : "latest",
45+
},
46+
lernaList,
47+
scopedLernaList,
4148
shortSHA,
42-
lernaScopeArgs,
49+
lernaScopes,
4350
};

scripts/publish.js

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,13 @@
22
const { execSync } = require("child_process");
33
const { writeFileSync, readFileSync } = require("fs");
44
const { join } = require("path");
5-
const { filteredLernaList, versionFromRef, shortSHA, prerelease } = require("./github.js");
5+
const {
6+
scopedLernaList,
7+
lernaList,
8+
versionFromRef,
9+
shortSHA,
10+
taggedRelease,
11+
} = require("./github.js");
612

713
const wombatDressingRoomTokens = new Map([
814
// ['firebase-frameworks', process.env.FIREBASE_FRAMEWORKS_NPM_TOKEN],
@@ -17,21 +23,44 @@ wombatDressingRoomTokens.forEach((token, pkg) => {
1723
});
1824
});
1925

20-
for (const lerna of filteredLernaList) {
21-
if (versionFromRef && versionFromRef.split("-")[0] !== lerna.version) {
26+
const packagesToPublish = scopedLernaList.map((lerna) => {
27+
const isTaggedRelease = lerna.name === taggedRelease?.name;
28+
if (isTaggedRelease && taggedRelease.version.split("-")[0] !== lerna.version) {
2229
throw new Error(
2330
`Cowardly refusing to publish ${lerna.name}@${versionFromRef} from ${lerna.version}, version needs to be bumped in source.`,
2431
);
2532
}
26-
const version = versionFromRef || `${lerna.version}-canary.${shortSHA}`;
27-
const cwd = lerna.location;
28-
const tag = versionFromRef ? (prerelease ? "next" : "latest") : "canary";
29-
const packageJsonPath = join(lerna.location, "package.json");
30-
const packageJson = JSON.parse(readFileSync(packageJsonPath).toString());
31-
packageJson.version = version;
32-
writeFileSync(packageJsonPath, JSON.stringify(packageJson, undefined, 2));
33+
const newVersion = isTaggedRelease
34+
? taggedRelease.version
35+
: `${lerna.version}-canary.${shortSHA}`;
3336
const registry = wombatDressingRoomTokens.get(lerna.name)
3437
? `https://wombat-dressing-room.appspot.com/${lerna.name}/_ns`
3538
: "https://registry.npmjs.org";
36-
execSync(`npm publish --registry ${registry} --access public --tag ${tag} --provenance`, { cwd });
39+
const tag = isTaggedRelease ? taggedRelease.tag : "canary";
40+
const packageJsonPath = join(lerna.location, "package.json");
41+
const packageJson = JSON.parse(readFileSync(packageJsonPath).toString());
42+
packageJson.version = newVersion;
43+
packageJson.publishConfig = { tag, registry, provenance: true, access: "public" };
44+
return packageJson;
45+
});
46+
47+
for (const package of packagesToPublish) {
48+
for (const dependencyName in package.dependencies) {
49+
// for/in needs an if to make lint happy
50+
if (dependencyName) {
51+
const lernaDependency = lernaList.find((it) => it.name === dependencyName);
52+
if (lernaDependency) {
53+
const dependencyBeingPublished = packagesToPublish.find((it) => it.name === dependencyName);
54+
const dependencyVersion = dependencyBeingPublished?.version || lernaDependency.version;
55+
const dependencyPrerelease = dependencyVersion.includes("-");
56+
package.dependencies[dependencyName] = dependencyPrerelease
57+
? dependencyVersion
58+
: `^${dependencyVersion}`;
59+
}
60+
}
61+
}
62+
const { location } = lernaList.find((it) => it.name === package.name);
63+
const packageJsonPath = join(location, "package.json");
64+
writeFileSync(packageJsonPath, JSON.stringify(package, undefined, 2));
65+
execSync(`npm publish`, { cwd: location });
3766
}

scripts/test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
#! /usr/bin/env node
22
const { spawn } = require("child_process");
3-
const { lernaScopeArgs } = require("./github.js");
3+
const { lernaScopes } = require("./github.js");
44

5-
const testProcess = spawn("lerna", ["run", "test", "--verbose", "--no-bail", ...lernaScopeArgs], {
5+
const testProcess = spawn("lerna", ["run", "test", "--verbose", "--no-bail", ...lernaScopes], {
66
stdio: "inherit",
77
});
88
testProcess.on("close", (code) => {

0 commit comments

Comments
 (0)