@openge/forge-release-vercel 0.1.0-rc.1 → 0.1.0
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/README.md +43 -6
- package/dist/cli-arguments.js +1 -1
- package/dist/cli-arguments.js.map +1 -1
- package/dist/cli-runner.js +2 -2
- package/dist/cli-runner.js.map +1 -1
- package/dist/contracts.d.ts +58 -6
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js +2 -0
- package/dist/contracts.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/node/config.d.ts.map +1 -1
- package/dist/node/config.js +27 -5
- package/dist/node/config.js.map +1 -1
- package/dist/node/execution.d.ts +4 -1
- package/dist/node/execution.d.ts.map +1 -1
- package/dist/node/execution.js +48 -10
- package/dist/node/execution.js.map +1 -1
- package/dist/node/git-context.d.ts +3 -0
- package/dist/node/git-context.d.ts.map +1 -0
- package/dist/node/git-context.js +9 -0
- package/dist/node/git-context.js.map +1 -0
- package/dist/node/git-stream.d.ts +5 -0
- package/dist/node/git-stream.d.ts.map +1 -0
- package/dist/node/git-stream.js +41 -0
- package/dist/node/git-stream.js.map +1 -0
- package/dist/node/git.js +1 -1
- package/dist/node/git.js.map +1 -1
- package/dist/node/lock.d.ts +7 -1
- package/dist/node/lock.d.ts.map +1 -1
- package/dist/node/lock.js +2 -2
- package/dist/node/lock.js.map +1 -1
- package/dist/node/managed-budget.d.ts +28 -0
- package/dist/node/managed-budget.d.ts.map +1 -0
- package/dist/node/managed-budget.js +131 -0
- package/dist/node/managed-budget.js.map +1 -0
- package/dist/node/managed-checkout.d.ts +5 -0
- package/dist/node/managed-checkout.d.ts.map +1 -0
- package/dist/node/managed-checkout.js +104 -0
- package/dist/node/managed-checkout.js.map +1 -0
- package/dist/node/managed-closure.d.ts +4 -0
- package/dist/node/managed-closure.d.ts.map +1 -0
- package/dist/node/managed-closure.js +10 -0
- package/dist/node/managed-closure.js.map +1 -0
- package/dist/node/managed-io.d.ts +23 -0
- package/dist/node/managed-io.d.ts.map +1 -0
- package/dist/node/managed-io.js +168 -0
- package/dist/node/managed-io.js.map +1 -0
- package/dist/node/managed-paths.d.ts +7 -0
- package/dist/node/managed-paths.d.ts.map +1 -0
- package/dist/node/managed-paths.js +191 -0
- package/dist/node/managed-paths.js.map +1 -0
- package/dist/node/managed-process.d.ts +3 -0
- package/dist/node/managed-process.d.ts.map +1 -0
- package/dist/node/managed-process.js +110 -0
- package/dist/node/managed-process.js.map +1 -0
- package/dist/node/managed-recovery-lock.d.ts +7 -0
- package/dist/node/managed-recovery-lock.d.ts.map +1 -0
- package/dist/node/managed-recovery-lock.js +61 -0
- package/dist/node/managed-recovery-lock.js.map +1 -0
- package/dist/node/managed-recovery.d.ts +13 -0
- package/dist/node/managed-recovery.d.ts.map +1 -0
- package/dist/node/managed-recovery.js +395 -0
- package/dist/node/managed-recovery.js.map +1 -0
- package/dist/node/managed-release.d.ts +3 -0
- package/dist/node/managed-release.d.ts.map +1 -0
- package/dist/node/managed-release.js +102 -0
- package/dist/node/managed-release.js.map +1 -0
- package/dist/node/managed-state.d.ts +7 -0
- package/dist/node/managed-state.d.ts.map +1 -0
- package/dist/node/managed-state.js +110 -0
- package/dist/node/managed-state.js.map +1 -0
- package/dist/node/owned-command-runner.d.ts +3 -0
- package/dist/node/owned-command-runner.d.ts.map +1 -0
- package/dist/node/owned-command-runner.js +10 -0
- package/dist/node/owned-command-runner.js.map +1 -0
- package/dist/node/process-identities.d.ts +5 -0
- package/dist/node/process-identities.d.ts.map +1 -0
- package/dist/node/process-identities.js +23 -0
- package/dist/node/process-identities.js.map +1 -0
- package/dist/node/publication.d.ts +5 -0
- package/dist/node/publication.d.ts.map +1 -0
- package/dist/node/publication.js +57 -0
- package/dist/node/publication.js.map +1 -0
- package/dist/node/release-commands.d.ts +4 -0
- package/dist/node/release-commands.d.ts.map +1 -0
- package/dist/node/release-commands.js +6 -0
- package/dist/node/release-commands.js.map +1 -0
- package/dist/node/release-context.d.ts +128 -0
- package/dist/node/release-context.d.ts.map +1 -0
- package/dist/node/release-context.js +2 -0
- package/dist/node/release-context.js.map +1 -0
- package/dist/node/release.d.ts.map +1 -1
- package/dist/node/release.js +20 -139
- package/dist/node/release.js.map +1 -1
- package/dist/node/source.d.ts +14 -0
- package/dist/node/source.d.ts.map +1 -0
- package/dist/node/source.js +95 -0
- package/dist/node/source.js.map +1 -0
- package/dist/node/workspace-release.d.ts +5 -0
- package/dist/node/workspace-release.d.ts.map +1 -0
- package/dist/node/workspace-release.js +122 -0
- package/dist/node/workspace-release.js.map +1 -0
- package/package.json +5 -4
package/dist/node/release.js
CHANGED
|
@@ -1,151 +1,32 @@
|
|
|
1
|
-
import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
|
|
2
1
|
import { resolve } from 'node:path';
|
|
3
|
-
import {
|
|
2
|
+
import { assertActive, ReleaseError } from './errors.js';
|
|
3
|
+
import { diagnostic, readConfig, runWorkspaceRelease } from './workspace-release.js';
|
|
4
4
|
import { validateReleaseConfig } from './config.js';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { acquireLock } from './lock.js';
|
|
9
|
-
import { createTransport, VercelVerification } from './vercel.js';
|
|
10
|
-
const digest = async (value) => (await calculateBytesIntegrity(new TextEncoder().encode(JSON.stringify(value)))).sha256;
|
|
11
|
-
function diagnostic(error) {
|
|
12
|
-
return error instanceof ReleaseError ? { code: error.code, details: error.details }
|
|
13
|
-
: { code: 'IO_FAILED', details: { reason: redact(error instanceof Error ? error.message : String(error)).slice(0, 1000) } };
|
|
14
|
-
}
|
|
15
|
-
async function readConfig(path) {
|
|
16
|
-
try {
|
|
17
|
-
return validateReleaseConfig(JSON.parse(await readFile(path, 'utf8')));
|
|
18
|
-
}
|
|
19
|
-
catch (error) {
|
|
20
|
-
if (error instanceof ReleaseError)
|
|
21
|
-
throw error;
|
|
22
|
-
throw new ReleaseError('CONFIG_READ', { path });
|
|
23
|
-
}
|
|
24
|
-
}
|
|
5
|
+
import { runManagedRelease } from './managed-release.js';
|
|
6
|
+
import { pathExists } from './managed-io.js';
|
|
7
|
+
import { runManagedReceiptCommand } from './managed-recovery.js';
|
|
25
8
|
export async function runRelease(options) {
|
|
26
9
|
const startedAt = new Date().toISOString();
|
|
27
|
-
const steps = [];
|
|
28
|
-
const effects = { developmentPush: 'not-attempted', releasePush: 'not-attempted' };
|
|
29
|
-
const directory = resolve(options.cwd, '.tmp/forge-vercel-release');
|
|
30
|
-
const reportPath = resolve(directory, 'latest-publish.json');
|
|
31
|
-
let candidateSha, configSha256, result;
|
|
32
|
-
let failure, releaseLock;
|
|
33
10
|
try {
|
|
34
11
|
assertActive(options.signal);
|
|
35
|
-
if (!['check', 'publish', 'status', 'verify', 'login'].includes(options.command)
|
|
36
|
-
|| (options.sha !== undefined && (!['status', 'verify'].includes(options.command) || !/^[a-f0-9]{40}$/u.test(options.sha))))
|
|
12
|
+
if (!['check', 'publish', 'status', 'verify', 'recover', 'login'].includes(options.command)
|
|
13
|
+
|| (options.sha !== undefined && (!['status', 'verify'].includes(options.command) || !/^[a-f0-9]{40}$/u.test(options.sha))))
|
|
37
14
|
throw new ReleaseError('ARGUMENT_INVALID');
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
await
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
await assertRepository(execution, config);
|
|
50
|
-
if (options.command === 'publish')
|
|
51
|
-
releaseLock = await acquireLock(resolve(directory, 'publish.lock'));
|
|
52
|
-
if (options.command === 'publish' || options.command === 'check')
|
|
53
|
-
candidateSha = await assertCandidate(execution, config);
|
|
54
|
-
else {
|
|
55
|
-
candidateSha = options.sha;
|
|
56
|
-
if (!candidateSha) {
|
|
57
|
-
try {
|
|
58
|
-
const previous = record(JSON.parse(await readFile(reportPath, 'utf8')));
|
|
59
|
-
if (typeof previous.candidateSha !== 'string' || !/^[a-f0-9]{40}$/u.test(previous.candidateSha))
|
|
60
|
-
throw new ReleaseError('DEPLOYMENT_SOURCE', { reason: 'INVALID_RECEIPT' });
|
|
61
|
-
if (previous.configSha256 !== configSha256)
|
|
62
|
-
throw new ReleaseError('DEPLOYMENT_SOURCE', { reason: 'CONFIG_CHANGED_USE_SHA' });
|
|
63
|
-
candidateSha = previous.candidateSha;
|
|
64
|
-
}
|
|
65
|
-
catch (error) {
|
|
66
|
-
if (record(error).code !== 'ENOENT')
|
|
67
|
-
throw error;
|
|
68
|
-
candidateSha = await execution.git(['rev-parse', 'HEAD']);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
const verify = new VercelVerification(config, options.transport ?? createTransport(execution), options.signal);
|
|
73
|
-
const assertFrozen = async () => {
|
|
74
|
-
await assertRepository(execution, config);
|
|
75
|
-
await assertCandidate(execution, config, candidateSha);
|
|
76
|
-
const current = options.config === undefined ? await readConfig(path) : validateReleaseConfig(options.config);
|
|
77
|
-
if (await digest(current) !== configSha256)
|
|
78
|
-
throw new ReleaseError('CANDIDATE_CHANGED', { reason: 'CONFIG_CHANGED' });
|
|
79
|
-
};
|
|
80
|
-
if (options.command === 'check' || options.command === 'publish') {
|
|
81
|
-
if (options.command === 'publish') {
|
|
82
|
-
await fetchAndAssertFastForward(execution, config, candidateSha);
|
|
83
|
-
await verify.project();
|
|
84
|
-
}
|
|
85
|
-
for (const [index, check] of config.checks.entries())
|
|
86
|
-
await execution.run(`check:${String(index)}`, check, 'CHECK_FAILED');
|
|
87
|
-
await assertFrozen();
|
|
88
|
-
if (options.command === 'publish') {
|
|
89
|
-
await fetchAndAssertFastForward(execution, config, candidateSha);
|
|
90
|
-
for (const [branch, effect] of [[config.git.developmentBranch, 'developmentPush'], [config.git.releaseBranch, 'releasePush']]) {
|
|
91
|
-
await assertFrozen();
|
|
92
|
-
assertActive(options.signal);
|
|
93
|
-
await verify.project();
|
|
94
|
-
await releaseLock?.assertOwned();
|
|
95
|
-
effects[effect] = 'unknown';
|
|
96
|
-
const output = await execution.git(['push', '--porcelain', config.git.remote, `${candidateSha}:refs/heads/${branch}`]);
|
|
97
|
-
effects[effect] = output.split(/\r?\n/u).some(line => line.startsWith('=') && line.includes(`:refs/heads/${branch}\t`)) ? 'already-current' : 'pushed';
|
|
98
|
-
}
|
|
99
|
-
result = await verify.wait(candidateSha);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
await verify.project();
|
|
104
|
-
result = await verify.find(candidateSha);
|
|
105
|
-
if (!result)
|
|
106
|
-
throw new ReleaseError('DEPLOYMENT_MISSING');
|
|
107
|
-
}
|
|
108
|
-
if (result && ['publish', 'verify'].includes(options.command)) {
|
|
109
|
-
await verify.verify(result);
|
|
110
|
-
const values = { FORGE_RELEASE_SHA: candidateSha, FORGE_RELEASE_URL: config.vercel.productionUrl, FORGE_RELEASE_DEPLOYMENT_ID: result.id };
|
|
111
|
-
for (const [index, check] of config.acceptance.entries())
|
|
112
|
-
await execution.run(`acceptance:${String(index)}`, check, 'ACCEPTANCE_FAILED', values);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
15
|
+
if (options.command === 'login')
|
|
16
|
+
return await runWorkspaceRelease(options);
|
|
17
|
+
const managed = await pathExists(resolve(options.cwd, '.tmp/forge-vercel-release/managed.json'));
|
|
18
|
+
if (['status', 'verify', 'recover'].includes(options.command) && managed)
|
|
19
|
+
return await runManagedReceiptCommand(options);
|
|
20
|
+
const config = options.config === undefined ? await readConfig(resolve(options.cwd, options.configPath ?? 'release.config.json')) : validateReleaseConfig(options.config);
|
|
21
|
+
if (managed && config.source.mode === 'workspace')
|
|
22
|
+
throw new ReleaseError('SOURCE_UNSUPPORTED', { reason: 'MANAGED_ANCHOR_EXISTS' });
|
|
23
|
+
return await (config.source.mode === 'managed-commit'
|
|
24
|
+
? ['status', 'verify', 'recover'].includes(options.command) ? runManagedReceiptCommand(options) : runManagedRelease(options)
|
|
25
|
+
: runWorkspaceRelease(options));
|
|
115
26
|
}
|
|
116
27
|
catch (error) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
const buildReport = () => ({ schemaVersion: 1, command: options.command, ok: failure === undefined,
|
|
120
|
-
startedAt, finishedAt: new Date().toISOString(), steps, effects,
|
|
121
|
-
...(candidateSha === undefined ? {} : { candidateSha }), ...(configSha256 === undefined ? {} : { configSha256 }),
|
|
122
|
-
...(result === undefined ? {} : { deployment: result }), ...(failure === undefined ? {} : { error: failure }),
|
|
123
|
-
...(candidateSha === undefined || options.command !== 'publish' ? {} : {
|
|
124
|
-
recovery: { candidateSha, nextCommand: ['pushed', 'already-current'].includes(effects.releasePush)
|
|
125
|
-
? `forge-vercel-release verify --sha ${candidateSha}` : 'forge-vercel-release publish', reportPath }
|
|
126
|
-
}) });
|
|
127
|
-
try {
|
|
128
|
-
if (releaseLock && candidateSha) {
|
|
129
|
-
await releaseLock.assertOwned();
|
|
130
|
-
await mkdir(directory, { recursive: true });
|
|
131
|
-
const next = resolve(directory, `report-${String(process.pid)}.json`);
|
|
132
|
-
await writeFile(next, `${JSON.stringify(buildReport(), null, 2)}\n`, 'utf8');
|
|
133
|
-
await rename(next, reportPath);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
catch (error) {
|
|
137
|
-
failure ??= diagnostic(error);
|
|
138
|
-
}
|
|
139
|
-
finally {
|
|
140
|
-
if (releaseLock) {
|
|
141
|
-
try {
|
|
142
|
-
await releaseLock.release();
|
|
143
|
-
}
|
|
144
|
-
catch (error) {
|
|
145
|
-
failure = diagnostic(error);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
28
|
+
return { schemaVersion: 2, command: options.command, ok: false, startedAt, finishedAt: new Date().toISOString(), steps: [],
|
|
29
|
+
effects: { developmentPush: 'not-attempted', releasePush: 'not-attempted' }, error: diagnostic(error) };
|
|
148
30
|
}
|
|
149
|
-
return buildReport();
|
|
150
31
|
}
|
|
151
32
|
//# sourceMappingURL=release.js.map
|
package/dist/node/release.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release.js","sourceRoot":"","sources":["../../src/node/release.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"release.js","sourceRoot":"","sources":["../../src/node/release.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ReleaseConfig } from '../contracts.js';
|
|
2
|
+
import type { Execution } from './execution.js';
|
|
3
|
+
import type { FrozenSource } from './release-context.js';
|
|
4
|
+
export declare const configDigest: (config: ReleaseConfig) => Promise<string>;
|
|
5
|
+
export declare function relativeConfigPath(root: string, path: string): string;
|
|
6
|
+
export declare function readCommittedConfig(execution: Execution, sha: string, path: string): Promise<{
|
|
7
|
+
config: ReleaseConfig;
|
|
8
|
+
oid: string;
|
|
9
|
+
bytes: Buffer;
|
|
10
|
+
}>;
|
|
11
|
+
export declare function freezeManagedSource(cwd: string, configPath: string, execution: Execution): Promise<FrozenSource>;
|
|
12
|
+
export declare function assertSourceFrozen(source: FrozenSource, execution: Execution): Promise<void>;
|
|
13
|
+
export declare function inspectCommitTree(source: FrozenSource, execution: Execution): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/node/source.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAMzD,eAAO,MAAM,YAAY,GAAU,QAAQ,aAAa,KAAG,OAAO,CAAC,MAAM,CACiB,CAAC;AAC3F,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMrE;AACD,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAOzJ;AAUD,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAgBtH;AACD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAclG;AACD,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAUjG"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { lstat, readFile, realpath } from 'node:fs/promises';
|
|
2
|
+
import { isAbsolute, relative, resolve } from 'node:path';
|
|
3
|
+
import { calculateBytesIntegrity } from '@openge/forge-artifact-integrity';
|
|
4
|
+
import { ReleaseError } from './errors.js';
|
|
5
|
+
import { assertRepository } from './git.js';
|
|
6
|
+
import { gitBlob, gitRecords } from './git-stream.js';
|
|
7
|
+
import { validateReleaseConfig } from './config.js';
|
|
8
|
+
import { assertNoGitContext } from './git-context.js';
|
|
9
|
+
export const configDigest = async (config) => (await calculateBytesIntegrity(new TextEncoder().encode(JSON.stringify(config)))).sha256;
|
|
10
|
+
export function relativeConfigPath(root, path) {
|
|
11
|
+
const value = relative(root, resolve(root, path)).replaceAll('\\', '/');
|
|
12
|
+
if (!value || isAbsolute(value) || value.split('/').some(part => ['..', '.git'].includes(part.toLowerCase())) || /[\0\r\n]/u.test(value)) {
|
|
13
|
+
throw new ReleaseError('SOURCE_UNSUPPORTED', { reason: 'CONFIG_PATH' });
|
|
14
|
+
}
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
export async function readCommittedConfig(execution, sha, path) {
|
|
18
|
+
const oid = await execution.git(['rev-parse', '--verify', `${sha}:${path}`]).catch(() => { throw new ReleaseError('SOURCE_UNSUPPORTED', { reason: 'CONFIG_NOT_COMMITTED' }); });
|
|
19
|
+
const bytes = await gitBlob(execution, oid);
|
|
20
|
+
let value;
|
|
21
|
+
try {
|
|
22
|
+
value = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(bytes));
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
throw new ReleaseError('CONFIG_READ', { reason: 'COMMITTED_JSON' });
|
|
26
|
+
}
|
|
27
|
+
return { config: validateReleaseConfig(value), oid, bytes };
|
|
28
|
+
}
|
|
29
|
+
async function assertTrackedClean(execution) {
|
|
30
|
+
for (const args of [['diff', '--quiet', '--'], ['diff', '--cached', '--quiet', '--']]) {
|
|
31
|
+
try {
|
|
32
|
+
await execution.git(args);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
if (error instanceof ReleaseError && error.code === 'GIT_FAILED' && error.details.exitCode === 1)
|
|
36
|
+
throw new ReleaseError('GIT_DIRTY');
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export async function freezeManagedSource(cwd, configPath, execution) {
|
|
42
|
+
assertNoGitContext();
|
|
43
|
+
const root = await realpath(cwd), path = relativeConfigPath(root, configPath), absolute = resolve(root, path);
|
|
44
|
+
if (!(await lstat(absolute)).isFile() || await realpath(absolute) !== absolute)
|
|
45
|
+
throw new ReleaseError('SOURCE_UNSUPPORTED', { reason: 'CONFIG_LINK' });
|
|
46
|
+
const sha = await execution.git(['rev-parse', '--verify', 'HEAD']);
|
|
47
|
+
if (!/^[a-f0-9]{40}$/u.test(sha))
|
|
48
|
+
throw new ReleaseError('SOURCE_UNSUPPORTED', { reason: 'OBJECT_FORMAT' });
|
|
49
|
+
const committed = await readCommittedConfig(execution, sha, path);
|
|
50
|
+
if (committed.config.source.mode !== 'managed-commit')
|
|
51
|
+
throw new ReleaseError('SOURCE_UNSUPPORTED');
|
|
52
|
+
if (!(await readFile(absolute)).equals(committed.bytes))
|
|
53
|
+
throw new ReleaseError('GIT_DIRTY', { reason: 'CONFIG_CHANGED' });
|
|
54
|
+
await assertRepository(execution, committed.config);
|
|
55
|
+
if (await execution.git(['branch', '--show-current']) !== committed.config.git.developmentBranch)
|
|
56
|
+
throw new ReleaseError('GIT_BRANCH');
|
|
57
|
+
await assertTrackedClean(execution);
|
|
58
|
+
const source = { root, sha, configPath: path, config: committed.config, configBlobOid: committed.oid,
|
|
59
|
+
configSha256: await configDigest(committed.config), fetchUrl: await execution.git(['config', '--get', `remote.${committed.config.git.remote}.url`]) };
|
|
60
|
+
await assertSourceFrozen(source, execution);
|
|
61
|
+
return source;
|
|
62
|
+
}
|
|
63
|
+
export async function assertSourceFrozen(source, execution) {
|
|
64
|
+
try {
|
|
65
|
+
assertNoGitContext();
|
|
66
|
+
await assertRepository(execution, source.config);
|
|
67
|
+
if (await realpath(execution.cwd) !== source.root || await execution.git(['rev-parse', 'HEAD']) !== source.sha
|
|
68
|
+
|| await execution.git(['branch', '--show-current']) !== source.config.git.developmentBranch
|
|
69
|
+
|| await execution.git(['config', '--get', `remote.${source.config.git.remote}.url`]) !== source.fetchUrl)
|
|
70
|
+
throw new ReleaseError('SOURCE_CHANGED');
|
|
71
|
+
await assertTrackedClean(execution);
|
|
72
|
+
if (await realpath(resolve(source.root, source.configPath)) !== resolve(source.root, source.configPath)
|
|
73
|
+
|| !(await readFile(resolve(source.root, source.configPath))).equals(await gitBlob(execution, source.configBlobOid)))
|
|
74
|
+
throw new ReleaseError('SOURCE_CHANGED');
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
if (error instanceof ReleaseError && error.code === 'CANCELLED')
|
|
78
|
+
throw error;
|
|
79
|
+
throw new ReleaseError('SOURCE_CHANGED');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export async function inspectCommitTree(source, execution) {
|
|
83
|
+
await gitRecords(execution, ['ls-tree', '-rz', '--full-tree', source.sha], entry => {
|
|
84
|
+
const match = /^(100644|100755) blob [a-f0-9]{40}\t([\s\S]+)$/u.exec(entry), path = match?.[2];
|
|
85
|
+
if (!path || path.split('/').some(part => ['.', '..', '.git'].includes(part.toLowerCase()))
|
|
86
|
+
|| (process.platform === 'win32' && (/[<>:"\\|?*]/u.test(path) || [...path].some(character => character.charCodeAt(0) < 32)
|
|
87
|
+
|| path.split('/').some(part => /[. ]$/u.test(part) || /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/iu.test(part)))))
|
|
88
|
+
throw new ReleaseError('SOURCE_UNSUPPORTED', { reason: 'TREE_ENTRY' });
|
|
89
|
+
});
|
|
90
|
+
let lfs = false;
|
|
91
|
+
await execution.streamGit(['grep', '-a', '-l', '-z', '--no-textconv', '-e', '^version https://git-lfs.github.com/spec/v1$', source.sha, '--'], () => { lfs = true; }, [0, 1]);
|
|
92
|
+
if (lfs)
|
|
93
|
+
throw new ReleaseError('SOURCE_UNSUPPORTED', { reason: 'LFS_POINTER' });
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/node/source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ReleaseConfig, ReleaseDiagnostic, ReleaseReport, RunReleaseOptions } from '../contracts.js';
|
|
2
|
+
export declare function diagnostic(error: unknown): ReleaseDiagnostic;
|
|
3
|
+
export declare function readConfig(path: string): Promise<ReleaseConfig>;
|
|
4
|
+
export declare function runWorkspaceRelease(options: RunReleaseOptions): Promise<ReleaseReport>;
|
|
5
|
+
//# sourceMappingURL=workspace-release.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-release.d.ts","sourceRoot":"","sources":["../../src/node/workspace-release.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAqB,iBAAiB,EAAE,aAAa,EAAe,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAS1I,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,CAG5D;AACD,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAGrE;AACD,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CAyE5F"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { calculateBytesIntegrity } from '@openge/forge-artifact-integrity';
|
|
4
|
+
import { validateReleaseConfig } from './config.js';
|
|
5
|
+
import { assertActive, record, redact, ReleaseError } from './errors.js';
|
|
6
|
+
import { Execution, vercelInvocation } from './execution.js';
|
|
7
|
+
import { assertCandidate, assertRepository } from './git.js';
|
|
8
|
+
import { acquireLock } from './lock.js';
|
|
9
|
+
import { publishCandidate } from './publication.js';
|
|
10
|
+
const digest = async (value) => (await calculateBytesIntegrity(new TextEncoder().encode(JSON.stringify(value)))).sha256;
|
|
11
|
+
export function diagnostic(error) {
|
|
12
|
+
return error instanceof ReleaseError ? { code: error.code, details: error.details }
|
|
13
|
+
: { code: 'IO_FAILED', details: { reason: redact(error instanceof Error ? error.message : String(error)).slice(0, 1000) } };
|
|
14
|
+
}
|
|
15
|
+
export async function readConfig(path) {
|
|
16
|
+
try {
|
|
17
|
+
return validateReleaseConfig(JSON.parse(await readFile(path, 'utf8')));
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
if (error instanceof ReleaseError)
|
|
21
|
+
throw error;
|
|
22
|
+
throw new ReleaseError('CONFIG_READ', { path });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export async function runWorkspaceRelease(options) {
|
|
26
|
+
const startedAt = new Date().toISOString();
|
|
27
|
+
const steps = [];
|
|
28
|
+
const effects = { developmentPush: 'not-attempted', releasePush: 'not-attempted' };
|
|
29
|
+
const directory = resolve(options.cwd, '.tmp/forge-vercel-release');
|
|
30
|
+
const reportPath = resolve(directory, 'latest-publish.json');
|
|
31
|
+
let candidateSha, configSha256, result;
|
|
32
|
+
let failure, releaseLock;
|
|
33
|
+
try {
|
|
34
|
+
assertActive(options.signal);
|
|
35
|
+
if (!['check', 'publish', 'status', 'verify', 'recover', 'login'].includes(options.command)
|
|
36
|
+
|| (options.sha !== undefined && (!['status', 'verify'].includes(options.command) || !/^[a-f0-9]{40}$/u.test(options.sha)))) {
|
|
37
|
+
throw new ReleaseError('ARGUMENT_INVALID');
|
|
38
|
+
}
|
|
39
|
+
if (options.command === 'login') {
|
|
40
|
+
const execution = new Execution(options.cwd, { limits: { commandMs: 600_000, deploymentMs: 600_000, pollMs: 5000, requestMs: 30_000, maxOutputBytes: 65_536 } }, options.signal, steps);
|
|
41
|
+
const invocation = vercelInvocation(['login']);
|
|
42
|
+
await execution.run('login', invocation, 'AUTH_REQUIRED', undefined, options.signal, true, options.onLoginOutput);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
const path = resolve(options.cwd, options.configPath ?? 'release.config.json');
|
|
46
|
+
const config = options.config === undefined ? await readConfig(path) : validateReleaseConfig(options.config);
|
|
47
|
+
if (options.command === 'recover')
|
|
48
|
+
throw new ReleaseError('SOURCE_UNSUPPORTED');
|
|
49
|
+
configSha256 = await digest(config);
|
|
50
|
+
const execution = new Execution(options.cwd, config, options.signal, steps);
|
|
51
|
+
await assertRepository(execution, config);
|
|
52
|
+
if (options.command === 'publish')
|
|
53
|
+
releaseLock = await acquireLock(resolve(directory, 'publish.lock'));
|
|
54
|
+
if (options.command === 'publish' || options.command === 'check')
|
|
55
|
+
candidateSha = await assertCandidate(execution, config);
|
|
56
|
+
else {
|
|
57
|
+
candidateSha = options.sha;
|
|
58
|
+
if (!candidateSha) {
|
|
59
|
+
try {
|
|
60
|
+
const previous = record(JSON.parse(await readFile(reportPath, 'utf8')));
|
|
61
|
+
if (typeof previous.candidateSha !== 'string' || !/^[a-f0-9]{40}$/u.test(previous.candidateSha))
|
|
62
|
+
throw new ReleaseError('DEPLOYMENT_SOURCE', { reason: 'INVALID_RECEIPT' });
|
|
63
|
+
if (previous.configSha256 !== configSha256)
|
|
64
|
+
throw new ReleaseError('DEPLOYMENT_SOURCE', { reason: 'CONFIG_CHANGED_USE_SHA' });
|
|
65
|
+
candidateSha = previous.candidateSha;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
if (record(error).code !== 'ENOENT')
|
|
69
|
+
throw error;
|
|
70
|
+
candidateSha = await execution.git(['rev-parse', 'HEAD']);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const assertFrozen = async () => {
|
|
75
|
+
if (!['check', 'publish'].includes(options.command))
|
|
76
|
+
return;
|
|
77
|
+
await assertRepository(execution, config);
|
|
78
|
+
await assertCandidate(execution, config, candidateSha);
|
|
79
|
+
const current = options.config === undefined ? await readConfig(path) : validateReleaseConfig(options.config);
|
|
80
|
+
if (await digest(current) !== configSha256)
|
|
81
|
+
throw new ReleaseError('CANDIDATE_CHANGED', { reason: 'CONFIG_CHANGED' });
|
|
82
|
+
};
|
|
83
|
+
result = await publishCandidate({ execution, config, sha: candidateSha, signal: options.signal, transport: options.transport, effects, assertFrozen,
|
|
84
|
+
mutationGuard: async () => { await assertFrozen(); await releaseLock?.assertOwned(); }, stage: async () => { }, checkpoint: async () => { } }, options.command);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
failure = diagnostic(error);
|
|
89
|
+
}
|
|
90
|
+
const buildReport = () => ({ schemaVersion: 2, command: options.command, ok: failure === undefined,
|
|
91
|
+
startedAt, finishedAt: new Date().toISOString(), steps, effects,
|
|
92
|
+
...(candidateSha === undefined ? {} : { candidateSha }), ...(configSha256 === undefined ? {} : { configSha256 }),
|
|
93
|
+
...(result === undefined ? {} : { deployment: result }), ...(failure === undefined ? {} : { error: failure }),
|
|
94
|
+
...(candidateSha === undefined || options.command !== 'publish' ? {} : {
|
|
95
|
+
recovery: { candidateSha, nextCommand: ['pushed', 'already-current'].includes(effects.releasePush)
|
|
96
|
+
? `forge-vercel-release verify --sha ${candidateSha}` : 'forge-vercel-release publish', reportPath }
|
|
97
|
+
}) });
|
|
98
|
+
try {
|
|
99
|
+
if (releaseLock && candidateSha) {
|
|
100
|
+
await releaseLock.assertOwned();
|
|
101
|
+
await mkdir(directory, { recursive: true });
|
|
102
|
+
const next = resolve(directory, `report-${String(process.pid)}.json`);
|
|
103
|
+
await writeFile(next, `${JSON.stringify(buildReport(), null, 2)}\n`, 'utf8');
|
|
104
|
+
await rename(next, reportPath);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
failure ??= diagnostic(error);
|
|
109
|
+
}
|
|
110
|
+
finally {
|
|
111
|
+
if (releaseLock) {
|
|
112
|
+
try {
|
|
113
|
+
await releaseLock.release();
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
failure = diagnostic(error);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return buildReport();
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=workspace-release.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-release.js","sourceRoot":"","sources":["../../src/node/workspace-release.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openge/forge-release-vercel",
|
|
3
|
-
"version": "0.1.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "Explicit Git integration releases with Vercel production verification",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -46,9 +46,10 @@
|
|
|
46
46
|
"@emnapi/core": "1.11.3",
|
|
47
47
|
"@emnapi/runtime": "1.11.3",
|
|
48
48
|
"vercel": "64.7.0",
|
|
49
|
-
"@openge/forge-
|
|
50
|
-
"@openge/forge-command-runner": "^0.
|
|
51
|
-
"@openge/forge-process-control
|
|
49
|
+
"@openge/forge-process-control-node": "^0.3.0",
|
|
50
|
+
"@openge/forge-command-runner": "^0.2.0",
|
|
51
|
+
"@openge/forge-process-control": "^0.3.0",
|
|
52
|
+
"@openge/forge-artifact-integrity": "^0.1.0"
|
|
52
53
|
},
|
|
53
54
|
"scripts": {
|
|
54
55
|
"build": "tsc -p tsconfig.build.json",
|