hatchkit 0.1.42 → 0.1.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adopt.d.ts +77 -0
- package/dist/adopt.d.ts.map +1 -1
- package/dist/adopt.js +395 -157
- package/dist/adopt.js.map +1 -1
- package/dist/deploy/rollback.d.ts.map +1 -1
- package/dist/deploy/rollback.js +9 -0
- package/dist/deploy/rollback.js.map +1 -1
- package/dist/dev-setup.d.ts +106 -0
- package/dist/dev-setup.d.ts.map +1 -0
- package/dist/dev-setup.js +1340 -0
- package/dist/dev-setup.js.map +1 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +6 -0
- package/dist/doctor.js.map +1 -1
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -1
- package/dist/prompts.d.ts +12 -0
- package/dist/prompts.d.ts.map +1 -1
- package/dist/prompts.js +42 -0
- package/dist/prompts.js.map +1 -1
- package/dist/provision/s3-buckets.d.ts.map +1 -1
- package/dist/provision/s3-buckets.js +44 -24
- package/dist/provision/s3-buckets.js.map +1 -1
- package/dist/provision/write-env.d.ts +6 -0
- package/dist/provision/write-env.d.ts.map +1 -1
- package/dist/provision/write-env.js +17 -0
- package/dist/provision/write-env.js.map +1 -1
- package/dist/scaffold/app.d.ts +6 -0
- package/dist/scaffold/app.d.ts.map +1 -1
- package/dist/scaffold/app.js +20 -1
- package/dist/scaffold/app.js.map +1 -1
- package/dist/scaffold/build-pipeline.d.ts +26 -2
- package/dist/scaffold/build-pipeline.d.ts.map +1 -1
- package/dist/scaffold/build-pipeline.js +159 -6
- package/dist/scaffold/build-pipeline.js.map +1 -1
- package/dist/scaffold/manifest.d.ts +12 -0
- package/dist/scaffold/manifest.d.ts.map +1 -1
- package/dist/scaffold/manifest.js +1 -0
- package/dist/scaffold/manifest.js.map +1 -1
- package/dist/scaffold/update.d.ts +20 -1
- package/dist/scaffold/update.d.ts.map +1 -1
- package/dist/scaffold/update.js +126 -54
- package/dist/scaffold/update.js.map +1 -1
- package/dist/templates/build-pipeline/Dockerfile.nextjs-monorepo.hbs +107 -0
- package/dist/templates/build-pipeline/docker-compose.yml.hbs +14 -2
- package/dist/utils/flags.d.ts +5 -0
- package/dist/utils/flags.d.ts.map +1 -1
- package/dist/utils/flags.js +13 -1
- package/dist/utils/flags.js.map +1 -1
- package/dist/utils/run-ledger.d.ts +9 -0
- package/dist/utils/run-ledger.d.ts.map +1 -1
- package/dist/utils/run-ledger.js.map +1 -1
- package/package.json +4 -2
- package/scripts/release-bump.mjs +29 -3
- package/scripts/release-packages.mjs +131 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# syntax=docker/dockerfile:1
|
|
2
|
+
#
|
|
3
|
+
# Next.js + Coolify image for {{name}} (pnpm/yarn workspace monorepo
|
|
4
|
+
# variant). The Next app lives at `{{monorepoPackage}}/` and is built
|
|
5
|
+
# from the workspace root so the lockfile / hoisted node_modules stay
|
|
6
|
+
# coherent with what `pnpm install` produces on the developer's machine.
|
|
7
|
+
#
|
|
8
|
+
# Why a separate template from Dockerfile.nextjs.hbs:
|
|
9
|
+
# - `pnpm install --frozen-lockfile` must run at the WORKSPACE ROOT,
|
|
10
|
+
# not inside the sub-package, or pnpm refuses to resolve the lockfile.
|
|
11
|
+
# - `pnpm --filter <name> build` keys off the package `name` field
|
|
12
|
+
# (not the directory), which is why we pass `packageName` separately
|
|
13
|
+
# from `monorepoPackage`.
|
|
14
|
+
# - `next start` needs WORKDIR to be the sub-package so it can find
|
|
15
|
+
# `.next/` and `next.config.*` where Next.js expects them on disk.
|
|
16
|
+
#
|
|
17
|
+
# dotenvx decrypts the committed encrypted .env.production at TWO points:
|
|
18
|
+
#
|
|
19
|
+
# 1. Build stage — uses the dotenvx_private_key BuildKit secret
|
|
20
|
+
# (passed by the workflow from the GH Actions secret
|
|
21
|
+
# DOTENV_PRIVATE_KEY_PRODUCTION) to decrypt in-memory before
|
|
22
|
+
# running the build. Required so NEXT_PUBLIC_* values get inlined
|
|
23
|
+
# into the static client bundle. The secret is mounted as tmpfs
|
|
24
|
+
# and never lands in `docker history` or any image layer.
|
|
25
|
+
#
|
|
26
|
+
# 2. Runtime CMD — `dotenvx run` reads the same .env.production and
|
|
27
|
+
# decrypts again, this time using DOTENV_PRIVATE_KEY_PRODUCTION
|
|
28
|
+
# from the container env (forwarded by docker-compose.yml from
|
|
29
|
+
# Coolify's app env). This covers server-side values the runtime
|
|
30
|
+
# reads with `process.env.X` — Server Action handlers, route
|
|
31
|
+
# handlers, etc.
|
|
32
|
+
#
|
|
33
|
+
# Image base is bookworm-slim (not alpine) because Next's optional
|
|
34
|
+
# native deps (sharp for image optimisation) ship glibc binaries that
|
|
35
|
+
# don't run on Alpine's musl without a rebuild.
|
|
36
|
+
ARG NODE_VERSION={{nodeMajor}}
|
|
37
|
+
|
|
38
|
+
# ---------------------------------------------------------------------------
|
|
39
|
+
# Build
|
|
40
|
+
# ---------------------------------------------------------------------------
|
|
41
|
+
FROM node:${NODE_VERSION}-bookworm-slim AS build
|
|
42
|
+
WORKDIR /app
|
|
43
|
+
|
|
44
|
+
RUN corepack enable
|
|
45
|
+
|
|
46
|
+
# Bring in the workspace manifests first so `pnpm install` can hit the
|
|
47
|
+
# Docker layer cache when only source files (not deps) change.
|
|
48
|
+
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
|
|
49
|
+
COPY {{monorepoPackage}}/package.json ./{{monorepoPackage}}/package.json
|
|
50
|
+
RUN pnpm install --frozen-lockfile
|
|
51
|
+
|
|
52
|
+
COPY . .
|
|
53
|
+
|
|
54
|
+
# Two separate RUN steps on purpose: BuildKit echoes the entire RUN
|
|
55
|
+
# body into any failure log, so splitting the secret-presence check
|
|
56
|
+
# off means the "secret not supplied" message only surfaces when
|
|
57
|
+
# that's actually what failed — a downstream `next build` error
|
|
58
|
+
# won't drag the misleading echo into its context.
|
|
59
|
+
RUN --mount=type=secret,id=dotenvx_private_key,env=DOTENV_PRIVATE_KEY_PRODUCTION \
|
|
60
|
+
test -n "$DOTENV_PRIVATE_KEY_PRODUCTION" || { \
|
|
61
|
+
echo "ERROR: dotenvx_private_key build secret not supplied. The workflow at .github/workflows/deploy.yml should pass it via 'secrets:' from the GH Actions secret DOTENV_PRIVATE_KEY_PRODUCTION." >&2; \
|
|
62
|
+
exit 1; \
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
# dotenvx decrypts .env.production in memory and re-exports each
|
|
66
|
+
# KEY=VALUE for `pnpm build`. next build sees the plain values and
|
|
67
|
+
# bakes NEXT_PUBLIC_* into the static client bundle. The --filter
|
|
68
|
+
# targets the package by its `name` field, not its directory.
|
|
69
|
+
RUN --mount=type=secret,id=dotenvx_private_key,env=DOTENV_PRIVATE_KEY_PRODUCTION \
|
|
70
|
+
pnpm dlx @dotenvx/dotenvx run -- pnpm --filter {{packageName}} build
|
|
71
|
+
|
|
72
|
+
# ---------------------------------------------------------------------------
|
|
73
|
+
# Runtime — `next start` on PORT={{port}}, WORKDIR'd into the sub-package.
|
|
74
|
+
# ---------------------------------------------------------------------------
|
|
75
|
+
FROM node:${NODE_VERSION}-bookworm-slim AS runtime
|
|
76
|
+
WORKDIR /app
|
|
77
|
+
|
|
78
|
+
ENV NODE_ENV=production
|
|
79
|
+
ENV PORT={{port}}
|
|
80
|
+
|
|
81
|
+
# dotenvx is rarely a direct dep of the Next sub-package; install it
|
|
82
|
+
# globally in the runtime stage so the CMD always finds it.
|
|
83
|
+
RUN npm install -g @dotenvx/dotenvx@latest && npm cache clean --force
|
|
84
|
+
|
|
85
|
+
# Workspace skeleton: pnpm refuses to resolve when the lockfile or
|
|
86
|
+
# workspace manifest is missing, and `next start` walks up looking for
|
|
87
|
+
# `next.config.*` so the sub-package manifest has to be in place too.
|
|
88
|
+
COPY --from=build /app/package.json /app/pnpm-lock.yaml /app/pnpm-workspace.yaml ./
|
|
89
|
+
COPY --from=build /app/node_modules ./node_modules
|
|
90
|
+
COPY --from=build /app/.env.production ./
|
|
91
|
+
COPY --from=build /app/{{monorepoPackage}}/package.json ./{{monorepoPackage}}/package.json
|
|
92
|
+
COPY --from=build /app/{{monorepoPackage}}/next.config.* ./{{monorepoPackage}}/
|
|
93
|
+
COPY --from=build /app/{{monorepoPackage}}/node_modules ./{{monorepoPackage}}/node_modules
|
|
94
|
+
COPY --from=build /app/{{monorepoPackage}}/.next ./{{monorepoPackage}}/.next
|
|
95
|
+
|
|
96
|
+
WORKDIR /app/{{monorepoPackage}}
|
|
97
|
+
|
|
98
|
+
EXPOSE {{port}}
|
|
99
|
+
|
|
100
|
+
HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=5 \
|
|
101
|
+
CMD node -e "require('http').get('http://127.0.0.1:{{port}}/',r=>{process.exit(r.statusCode<400?0:1)}).on('error',()=>process.exit(1))"
|
|
102
|
+
|
|
103
|
+
# dotenvx decrypts /app/.env.production at startup using
|
|
104
|
+
# DOTENV_PRIVATE_KEY_PRODUCTION from the container env (forwarded by
|
|
105
|
+
# Coolify via docker-compose.yml). The -f flag is required because
|
|
106
|
+
# WORKDIR is the sub-package, not the workspace root.
|
|
107
|
+
CMD ["dotenvx", "run", "-f", "/app/.env.production", "--", "./node_modules/.bin/next", "start", "--port", "{{port}}"]
|
|
@@ -8,9 +8,21 @@
|
|
|
8
8
|
services:
|
|
9
9
|
app:
|
|
10
10
|
image: ghcr.io/{{owner}}/{{name}}:latest
|
|
11
|
+
# Force a registry pull on every `docker compose up`. Without this,
|
|
12
|
+
# Compose happily reuses whichever digest the local engine cached the
|
|
13
|
+
# last time it saw the `:latest` tag, so Coolify's redeploy webhook
|
|
14
|
+
# fires after each CI build but the running container keeps serving
|
|
15
|
+
# stale code. `always` makes the floating tag actually float.
|
|
16
|
+
pull_policy: always
|
|
11
17
|
restart: unless-stopped
|
|
12
|
-
ports
|
|
13
|
-
|
|
18
|
+
# Coolify's Traefik reverse-proxy already owns host ports 80/443 and
|
|
19
|
+
# routes to this container via its internal Docker network. Use
|
|
20
|
+
# `expose` (not `ports`) so we declare the container port without
|
|
21
|
+
# trying to bind it on the host — binding the host port collides with
|
|
22
|
+
# Traefik and the deploy fails with
|
|
23
|
+
# "Bind for 0.0.0.0:{{port}} failed: port is already allocated".
|
|
24
|
+
expose:
|
|
25
|
+
- "{{port}}"
|
|
14
26
|
environment:
|
|
15
27
|
- NODE_ENV=production
|
|
16
28
|
# Forwarded from Coolify's app env. dotenvx inside the
|
package/dist/utils/flags.d.ts
CHANGED
|
@@ -13,6 +13,11 @@ export interface ParsedCreateFlags {
|
|
|
13
13
|
forceNoGithub: boolean;
|
|
14
14
|
forceNoDeploy: boolean;
|
|
15
15
|
forceNoInstall: boolean;
|
|
16
|
+
/** --no-local-dev hard-disables the Tailscale dev URL opt-in even when
|
|
17
|
+
* `--local-dev` / a preset would have enabled it. Distinct from the
|
|
18
|
+
* absence of `--local-dev`: a fresh `hatchkit create` without flags
|
|
19
|
+
* still defaults to enabling the integration. */
|
|
20
|
+
forceNoLocalDev: boolean;
|
|
16
21
|
}
|
|
17
22
|
export declare function parseCreateFlags(argv: string[]): ParsedCreateFlags;
|
|
18
23
|
//# sourceMappingURL=flags.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../../src/utils/flags.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAsB,aAAa,EAAE,MAAM,eAAe,CAAC;AAEvE,MAAM,WAAW,iBAAiB;IAChC;uDACmD;IACnD,GAAG,EAAE,OAAO,CAAC;IACb;2DACuD;IACvD,MAAM,EAAE,OAAO,CAAC;IAChB,kEAAkE;IAClE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAChC;6DACyD;IACzD,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../../src/utils/flags.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAsB,aAAa,EAAE,MAAM,eAAe,CAAC;AAEvE,MAAM,WAAW,iBAAiB;IAChC;uDACmD;IACnD,GAAG,EAAE,OAAO,CAAC;IACb;2DACuD;IACvD,MAAM,EAAE,OAAO,CAAC;IAChB,kEAAkE;IAClE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAChC;6DACyD;IACzD,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB;;;sDAGkD;IAClD,eAAe,EAAE,OAAO,CAAC;CAC1B;AAsBD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,iBAAiB,CA2GlE"}
|
package/dist/utils/flags.js
CHANGED
|
@@ -49,6 +49,7 @@ export function parseCreateFlags(argv) {
|
|
|
49
49
|
const forceNoGithub = argv.includes("--no-github");
|
|
50
50
|
const forceNoDeploy = argv.includes("--no-deploy");
|
|
51
51
|
const forceNoInstall = argv.includes("--no-install");
|
|
52
|
+
const forceNoLocalDev = argv.includes("--no-local-dev");
|
|
52
53
|
// Start from --config <path> if present, then layer individual flags on top.
|
|
53
54
|
const presets = {};
|
|
54
55
|
const configPath = get("config");
|
|
@@ -112,12 +113,23 @@ export function parseCreateFlags(argv) {
|
|
|
112
113
|
presets.runDeployment = false;
|
|
113
114
|
if (forceNoInstall)
|
|
114
115
|
presets.installDeps = false;
|
|
116
|
+
if (forceNoLocalDev)
|
|
117
|
+
presets.localDev = undefined;
|
|
118
|
+
// --local-dev=<slug> sets an explicit slug; --local-dev with no value
|
|
119
|
+
// signals "yes, enable, derive slug from project name". The latter
|
|
120
|
+
// arrives as an empty string from `get()` when the flag has no `=`,
|
|
121
|
+
// which we treat the same as "derive". Conflicts with --no-local-dev
|
|
122
|
+
// resolve in favour of --no-local-dev (it's the safer choice).
|
|
123
|
+
const localDevSlug = get("local-dev");
|
|
124
|
+
if (localDevSlug !== undefined && !forceNoLocalDev) {
|
|
125
|
+
presets.localDev = { slug: localDevSlug };
|
|
126
|
+
}
|
|
115
127
|
// Validate that presets-provided values look right before we pass
|
|
116
128
|
// them on (the prompt layer would also catch these, but failing
|
|
117
129
|
// early in non-interactive mode gives a cleaner error).
|
|
118
130
|
if (has("config") && typeof presets.name !== "string" && yes) {
|
|
119
131
|
// fine — may still come from --name flag or default
|
|
120
132
|
}
|
|
121
|
-
return { yes, dryRun, presets, forceNoGithub, forceNoDeploy, forceNoInstall };
|
|
133
|
+
return { yes, dryRun, presets, forceNoGithub, forceNoDeploy, forceNoInstall, forceNoLocalDev };
|
|
122
134
|
}
|
|
123
135
|
//# sourceMappingURL=flags.js.map
|
package/dist/utils/flags.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flags.js","sourceRoot":"","sources":["../../src/utils/flags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"flags.js","sourceRoot":"","sources":["../../src/utils/flags.ts"],"names":[],"mappings":"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"}
|
|
@@ -152,6 +152,15 @@ export type LedgerStep = {
|
|
|
152
152
|
repo: string;
|
|
153
153
|
projectDir: string;
|
|
154
154
|
cname?: string;
|
|
155
|
+
}
|
|
156
|
+
/** Tailscale-served local-dev Caddy fragment dropped at
|
|
157
|
+
* `~/.config/dev/projects/<slug>.caddy`. Recorded only when the
|
|
158
|
+
* project opted into the local-dev integration. Destroy removes the
|
|
159
|
+
* fragment file — host-wide Caddy + tailscale serve stay put (they
|
|
160
|
+
* belong to the user, not this project). */
|
|
161
|
+
| {
|
|
162
|
+
kind: "localDevFragment";
|
|
163
|
+
slug: string;
|
|
155
164
|
};
|
|
156
165
|
export interface LedgerData {
|
|
157
166
|
/** Project slug. Also the filename. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-ledger.d.ts","sourceRoot":"","sources":["../../src/utils/run-ledger.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"run-ledger.d.ts","sourceRoot":"","sources":["../../src/utils/run-ledger.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-ledger.js","sourceRoot":"","sources":["../../src/utils/run-ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"run-ledger.js","sourceRoot":"","sources":["../../src/utils/run-ledger.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hatchkit",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.45",
|
|
4
4
|
"packageManager": "pnpm@10.33.2",
|
|
5
5
|
"description": "Interactive CLI for scaffolding full-stack projects and provisioning observability/email clients",
|
|
6
6
|
"type": "module",
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
"start": "node dist/index.js",
|
|
19
19
|
"test": "tsx test-scaffold.ts",
|
|
20
20
|
"typecheck": "tsc --noEmit",
|
|
21
|
+
"dev:typecheck": "tsc --noEmit --watch --preserveWatchOutput",
|
|
21
22
|
"lint": "biome check src",
|
|
22
23
|
"lint:fix": "biome check --write src",
|
|
23
24
|
"format": "biome format --write src",
|
|
@@ -27,12 +28,13 @@
|
|
|
27
28
|
"release:patch": "node scripts/release-prep.mjs && node scripts/release-bump.mjs patch && pnpm run _release:finish",
|
|
28
29
|
"release:minor": "node scripts/release-prep.mjs && node scripts/release-bump.mjs minor && pnpm run _release:finish",
|
|
29
30
|
"release:major": "node scripts/release-prep.mjs && node scripts/release-bump.mjs major && pnpm run _release:finish",
|
|
30
|
-
"_release:finish": "pnpm run build && pnpm run typecheck && npm publish --access public && git push --follow-tags && npm install -g .",
|
|
31
|
+
"_release:finish": "pnpm run build && pnpm run typecheck && node scripts/release-packages.mjs && npm publish --access public && git push --follow-tags && npm install -g .",
|
|
31
32
|
"prepublishOnly": "pnpm run build"
|
|
32
33
|
},
|
|
33
34
|
"dependencies": {
|
|
34
35
|
"@aws-sdk/client-s3": "^3.700.0",
|
|
35
36
|
"@dotenvx/dotenvx": "^1.61.2",
|
|
37
|
+
"@hatchkit/dev-shared": "workspace:*",
|
|
36
38
|
"@inquirer/core": "^10.3.0",
|
|
37
39
|
"@inquirer/figures": "^1.0.0",
|
|
38
40
|
"@inquirer/prompts": "^7.0.0",
|
package/scripts/release-bump.mjs
CHANGED
|
@@ -54,9 +54,35 @@ pkg.version = next;
|
|
|
54
54
|
writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`, "utf-8");
|
|
55
55
|
console.log(` release-bump: ${current} → ${next}`);
|
|
56
56
|
|
|
57
|
-
//
|
|
58
|
-
//
|
|
59
|
-
|
|
57
|
+
// Bump `@hatchkit/dev-*` workspace packages in lockstep with the CLI.
|
|
58
|
+
// The CLI's runtime references the plugin version range as
|
|
59
|
+
// `^${cliVersion}` (see devPluginNextVersionRange in dev-setup.ts), so
|
|
60
|
+
// every release must guarantee the plugin packages exist on npm at the
|
|
61
|
+
// same version. release-packages.mjs publishes them right after this
|
|
62
|
+
// script bumps + commits the lockstep set.
|
|
63
|
+
const stagedPaths = [join("cli", "package.json")];
|
|
64
|
+
const lockstepPackages = ["dev-shared", "dev-plugin-next", "dev-plugin-vite"];
|
|
65
|
+
for (const name of lockstepPackages) {
|
|
66
|
+
const subPath = join(repoRoot, "packages", name, "package.json");
|
|
67
|
+
let subPkg;
|
|
68
|
+
try {
|
|
69
|
+
subPkg = JSON.parse(readFileSync(subPath, "utf-8"));
|
|
70
|
+
} catch (err) {
|
|
71
|
+
console.error(` release-bump: missing packages/${name}/package.json — ${err.message}`);
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
if (subPkg.version === next) continue;
|
|
75
|
+
subPkg.version = next;
|
|
76
|
+
writeFileSync(subPath, `${JSON.stringify(subPkg, null, 2)}\n`, "utf-8");
|
|
77
|
+
stagedPaths.push(join("packages", name, "package.json"));
|
|
78
|
+
console.log(` release-bump: packages/${name} → ${next}`);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Stage + commit + tag from the repo root so the paths in the commit
|
|
82
|
+
// are repo-relative regardless of where the script was invoked.
|
|
83
|
+
for (const p of stagedPaths) {
|
|
84
|
+
sh(`git add ${JSON.stringify(p)}`, { cwd: repoRoot });
|
|
85
|
+
}
|
|
60
86
|
sh(`git commit -m ${JSON.stringify(`chore: release v${next}`)}`, { cwd: repoRoot });
|
|
61
87
|
sh(`git tag ${JSON.stringify(`v${next}`)}`, { cwd: repoRoot });
|
|
62
88
|
console.log(` release-bump: committed + tagged v${next}`);
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/*
|
|
3
|
+
* release-packages — build + publish the `@hatchkit/dev-*` workspace
|
|
4
|
+
* packages alongside the CLI. Runs BEFORE the CLI itself publishes so
|
|
5
|
+
* that scaffolds generated by the just-published CLI find their plugin
|
|
6
|
+
* dep on the registry.
|
|
7
|
+
*
|
|
8
|
+
* Publish order is topological:
|
|
9
|
+
* 1. @hatchkit/dev-shared (no @hatchkit/* deps)
|
|
10
|
+
* 2. @hatchkit/dev-plugin-next (depends on dev-shared)
|
|
11
|
+
* 3. @hatchkit/dev-plugin-vite (depends on dev-shared)
|
|
12
|
+
*
|
|
13
|
+
* Version sync: every `@hatchkit/dev-*` package matches the CLI's
|
|
14
|
+
* version. release-bump.mjs handles the bump in lockstep, so by the
|
|
15
|
+
* time we get here the package.jsons are already aligned. This script
|
|
16
|
+
* verifies that invariant and refuses to publish if anything drifted
|
|
17
|
+
* (a manual `npm version` in one package would do it).
|
|
18
|
+
*
|
|
19
|
+
* Idempotent w.r.t. already-published versions: each `npm publish`
|
|
20
|
+
* that hits "you cannot publish over the previously published versions"
|
|
21
|
+
* is treated as success (the version already exists on npm — that's
|
|
22
|
+
* what we wanted). Real failures (auth, network) propagate.
|
|
23
|
+
*
|
|
24
|
+
* Skip with RELEASE_SKIP_PACKAGES=1.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import { execSync, spawnSync } from "node:child_process";
|
|
28
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
29
|
+
import { dirname, join } from "node:path";
|
|
30
|
+
import { fileURLToPath } from "node:url";
|
|
31
|
+
|
|
32
|
+
if (process.env.RELEASE_SKIP_PACKAGES === "1") {
|
|
33
|
+
console.log(" release-packages: RELEASE_SKIP_PACKAGES=1 — skipping.");
|
|
34
|
+
process.exit(0);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
38
|
+
const cliDir = join(here, "..");
|
|
39
|
+
const repoRoot = sh("git rev-parse --show-toplevel");
|
|
40
|
+
|
|
41
|
+
const PACKAGES = ["dev-shared", "dev-plugin-next", "dev-plugin-vite"];
|
|
42
|
+
|
|
43
|
+
const cliVersion = readJson(join(cliDir, "package.json")).version;
|
|
44
|
+
if (!cliVersion) {
|
|
45
|
+
console.error(" release-packages: couldn't read cli/package.json version. Aborting.");
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Sanity check: every dev-* package must already be bumped to cliVersion.
|
|
50
|
+
// release-bump.mjs does this; if someone skipped it, fail loud.
|
|
51
|
+
for (const name of PACKAGES) {
|
|
52
|
+
const pkgPath = join(repoRoot, "packages", name, "package.json");
|
|
53
|
+
if (!existsSync(pkgPath)) {
|
|
54
|
+
console.error(` release-packages: missing packages/${name}/package.json — aborting.`);
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
const pkg = readJson(pkgPath);
|
|
58
|
+
if (pkg.version !== cliVersion) {
|
|
59
|
+
console.error(
|
|
60
|
+
` release-packages: packages/${name}/package.json is at ${pkg.version} but CLI is at ${cliVersion}.`,
|
|
61
|
+
);
|
|
62
|
+
console.error(
|
|
63
|
+
" release-bump.mjs should have aligned these. Did you run a release flow out of order?",
|
|
64
|
+
);
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
console.log(` release-packages: aligning @hatchkit/dev-* packages at v${cliVersion}.`);
|
|
70
|
+
|
|
71
|
+
for (const name of PACKAGES) {
|
|
72
|
+
const pkgDir = join(repoRoot, "packages", name);
|
|
73
|
+
console.log(`\n ── packages/${name}`);
|
|
74
|
+
|
|
75
|
+
// Build the workspace package. pnpm honours each package's own build
|
|
76
|
+
// script (tsc → dist).
|
|
77
|
+
shStream("pnpm", ["run", "build"], { cwd: pkgDir });
|
|
78
|
+
|
|
79
|
+
// Publish. pnpm publish from the package dir handles workspace:*
|
|
80
|
+
// dep rewrites (the dev plugins both depend on @hatchkit/dev-shared
|
|
81
|
+
// via workspace:*; pnpm replaces with the matching real version on
|
|
82
|
+
// publish). `--no-git-checks` because release-prep.mjs already
|
|
83
|
+
// confirmed the tree is clean and the commit/tag came from
|
|
84
|
+
// release-bump.mjs.
|
|
85
|
+
const publish = spawnSync(
|
|
86
|
+
"pnpm",
|
|
87
|
+
["publish", "--access", "public", "--no-git-checks"],
|
|
88
|
+
{ cwd: pkgDir, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" },
|
|
89
|
+
);
|
|
90
|
+
process.stdout.write(publish.stdout);
|
|
91
|
+
if (publish.status === 0) continue;
|
|
92
|
+
|
|
93
|
+
// Treat "version already published" as success — the goal is "this
|
|
94
|
+
// version exists on npm", and re-runs of a partially-completed
|
|
95
|
+
// release should be self-healing rather than re-bumping.
|
|
96
|
+
const stderr = publish.stderr ?? "";
|
|
97
|
+
if (
|
|
98
|
+
/You cannot publish over the previously published versions?/i.test(stderr) ||
|
|
99
|
+
/403 Forbidden.*cannot publish over/i.test(stderr)
|
|
100
|
+
) {
|
|
101
|
+
console.log(` release-packages: @hatchkit/${name}@${cliVersion} already on npm — skipping.`);
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
console.error(`\n ✗ release-packages: pnpm publish failed for ${name}.\n`);
|
|
106
|
+
process.stderr.write(stderr);
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
console.log(`\n ✓ release-packages: all @hatchkit/dev-* packages at v${cliVersion} on npm.`);
|
|
111
|
+
|
|
112
|
+
function readJson(path) {
|
|
113
|
+
try {
|
|
114
|
+
return JSON.parse(readFileSync(path, "utf-8"));
|
|
115
|
+
} catch (err) {
|
|
116
|
+
console.error(` release-packages: couldn't read ${path} — ${err.message}`);
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function sh(cmd, opts = {}) {
|
|
122
|
+
return execSync(cmd, { encoding: "utf-8", ...opts }).trim();
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function shStream(bin, args, opts = {}) {
|
|
126
|
+
const res = spawnSync(bin, args, { stdio: "inherit", ...opts });
|
|
127
|
+
if (res.status !== 0) {
|
|
128
|
+
console.error(` release-packages: ${bin} ${args.join(" ")} failed (exit ${res.status}).`);
|
|
129
|
+
process.exit(res.status ?? 1);
|
|
130
|
+
}
|
|
131
|
+
}
|