@smoothbricks/cli 0.10.3 → 0.10.5
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 +9 -13
- package/dist/bun/preload.d.ts +13 -0
- package/dist/bun/preload.d.ts.map +1 -0
- package/dist/bun/preload.js +12 -0
- package/dist/cli.js +13 -5
- package/dist/generate/index.d.ts.map +1 -1
- package/dist/generate/index.js +0 -6
- package/dist/github-ci/index.d.ts.map +1 -1
- package/dist/github-ci/index.js +52 -16
- package/dist/github-ci/outputs.d.ts.map +1 -1
- package/dist/github-ci/outputs.js +1 -2
- package/dist/lib/cli-package.js +2 -2
- package/dist/lib/json.d.ts +120 -11
- package/dist/lib/json.d.ts.map +1 -1
- package/dist/lib/json.js +319 -29
- package/dist/lib/workspace.d.ts +7 -14
- package/dist/lib/workspace.d.ts.map +1 -1
- package/dist/lib/workspace.js +76 -82
- package/dist/monorepo/ci-workflow.d.ts +2 -0
- package/dist/monorepo/ci-workflow.d.ts.map +1 -1
- package/dist/monorepo/ci-workflow.js +27 -1
- package/dist/monorepo/git-config.js +2 -2
- package/dist/monorepo/index.d.ts +4 -2
- package/dist/monorepo/index.d.ts.map +1 -1
- package/dist/monorepo/index.js +19 -3
- package/dist/monorepo/lockfile.d.ts +14 -1
- package/dist/monorepo/lockfile.d.ts.map +1 -1
- package/dist/monorepo/lockfile.js +33 -21
- package/dist/monorepo/managed-files.d.ts +11 -0
- package/dist/monorepo/managed-files.d.ts.map +1 -1
- package/dist/monorepo/managed-files.js +57 -32
- package/dist/monorepo/package-policy.d.ts.map +1 -1
- package/dist/monorepo/package-policy.js +52 -45
- package/dist/monorepo/packed-manifest.d.ts +5 -2
- package/dist/monorepo/packed-manifest.d.ts.map +1 -1
- package/dist/monorepo/packed-manifest.js +16 -47
- package/dist/monorepo/packed-package.d.ts.map +1 -1
- package/dist/monorepo/packed-package.js +28 -16
- package/dist/monorepo/packs/index.d.ts.map +1 -1
- package/dist/monorepo/packs/index.js +14 -5
- package/dist/monorepo/publish-workflow.js +3 -1
- package/dist/monorepo/runtime.d.ts +15 -0
- package/dist/monorepo/runtime.d.ts.map +1 -1
- package/dist/monorepo/runtime.js +66 -12
- package/dist/monorepo/tool-validation.d.ts +2 -2
- package/dist/monorepo/tool-validation.d.ts.map +1 -1
- package/dist/monorepo/tool-validation.js +141 -38
- package/dist/monorepo/wrangler.d.ts.map +1 -1
- package/dist/monorepo/wrangler.js +13 -13
- package/dist/nx/index.d.ts +9 -7
- package/dist/nx/index.d.ts.map +1 -1
- package/dist/nx/index.js +48 -31
- package/dist/pr/index.d.ts.map +1 -1
- package/dist/pr/index.js +28 -32
- package/dist/release/candidates.d.ts +3 -2
- package/dist/release/candidates.d.ts.map +1 -1
- package/dist/release/candidates.js +4 -5
- package/dist/release/index.d.ts +1 -0
- package/dist/release/index.d.ts.map +1 -1
- package/dist/release/index.js +88 -59
- package/dist/wrangler/prepare-env.d.ts +0 -1
- package/dist/wrangler/prepare-env.d.ts.map +1 -1
- package/dist/wrangler/prepare-env.js +100 -51
- package/dist/wrangler/scaffold.d.ts.map +1 -1
- package/dist/wrangler/scaffold.js +12 -12
- package/managed/raw/envrc +5 -3
- package/managed/raw/git-format-staged.yml +19 -1
- package/managed/raw/patches/ttsc@0.19.3.patch +67 -0
- package/managed/raw/tooling/direnv/github-actions-bootstrap.sh +2 -1
- package/managed/raw/tooling/direnv/merge-newer-pins.sh +3 -3
- package/managed/raw/tooling/direnv/setup-environment.ts +170 -19
- package/managed/raw/tooling/git-hooks/pre-commit.sh +0 -6
- package/managed/templates/github/actions/cache-node-modules/action.yml +5 -2
- package/managed/templates/github/actions/cache-ttsc-plugins/action.yml +19 -0
- package/managed/templates/github/actions/setup-devenv/action.yml +5 -0
- package/managed/templates/github/workflows/managed-files.yml +80 -0
- package/package.json +15 -4
- package/src/bun/preload.ts +12 -0
- package/src/cli.ts +20 -8
- package/src/generate/index.ts +0 -6
- package/src/github-ci/index.ts +49 -18
- package/src/github-ci/outputs.ts +1 -2
- package/src/lib/cli-package.ts +2 -2
- package/src/lib/json.ts +293 -32
- package/src/lib/workspace.ts +88 -100
- package/src/monorepo/__tests__/ci-workflow.test.ts +3 -3
- package/src/monorepo/ci-workflow.ts +27 -1
- package/src/monorepo/git-config.ts +2 -2
- package/src/monorepo/index.ts +19 -3
- package/src/monorepo/lockfile.test.ts +35 -36
- package/src/monorepo/lockfile.ts +49 -24
- package/src/monorepo/managed-files.test.ts +1 -0
- package/src/monorepo/managed-files.ts +62 -38
- package/src/monorepo/package-policy.test.ts +20 -50
- package/src/monorepo/package-policy.ts +76 -59
- package/src/monorepo/packed-manifest.ts +18 -52
- package/src/monorepo/packed-package.ts +43 -22
- package/src/monorepo/packs/index.ts +14 -5
- package/src/monorepo/publish-workflow.ts +3 -1
- package/src/monorepo/runtime.test.ts +42 -3
- package/src/monorepo/runtime.ts +90 -12
- package/src/monorepo/tool-validation.test.ts +38 -16
- package/src/monorepo/tool-validation.ts +149 -41
- package/src/monorepo/wrangler.test.ts +11 -15
- package/src/monorepo/wrangler.ts +15 -15
- package/src/nx/index.test.ts +9 -5
- package/src/nx/index.ts +69 -42
- package/src/pr/index.ts +42 -36
- package/src/release/__tests__/candidates.test.ts +5 -4
- package/src/release/__tests__/trust-publisher.test.ts +7 -0
- package/src/release/candidates.ts +10 -17
- package/src/release/index.ts +110 -73
- package/src/wrangler/prepare-env.ts +75 -54
- package/src/wrangler/scaffold.test.ts +9 -12
- package/src/wrangler/scaffold.ts +13 -13
package/dist/pr/index.js
CHANGED
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
import { mkdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
2
2
|
import { dirname, join } from 'node:path';
|
|
3
|
+
import typia from 'typia';
|
|
3
4
|
import { formatMarkerHits, scanRefChangedForMarkers } from '../lib/conflict-markers.js';
|
|
4
|
-
import {
|
|
5
|
+
import { readJson } from '../lib/json.js';
|
|
5
6
|
import { run, runResult } from '../lib/run.js';
|
|
6
7
|
const defaultShell = {
|
|
7
8
|
runResult: (command, args, cwd) => runResult(command, args, cwd),
|
|
8
9
|
run: (command, args, cwd) => run(command, args, cwd),
|
|
9
10
|
};
|
|
11
|
+
const parseGhPrViewJson = (() => {
|
|
12
|
+
const _io0 = input => "number" === typeof input.number && "string" === typeof input.url && "string" === typeof input.headRefName && "string" === typeof input.baseRefName && (undefined === input.isCrossRepository || "boolean" === typeof input.isCrossRepository);
|
|
13
|
+
const __is = input => "object" === typeof input && null !== input && _io0(input);
|
|
14
|
+
return input => { input = JSON.parse(input); return __is(input) ? input : null; };
|
|
15
|
+
})();
|
|
16
|
+
const isPrResolveStateJson = (() => {
|
|
17
|
+
const _io0 = input => "number" === typeof input.pr && (undefined === input.url || "string" === typeof input.url) && "string" === typeof input.headBranch && "string" === typeof input.baseBranch && "string" === typeof input.remote && (undefined === input.crossRepo || "boolean" === typeof input.crossRepo) && (undefined === input.originalBranch || "string" === typeof input.originalBranch) && (undefined === input.originalSha || "string" === typeof input.originalSha) && (undefined === input.startedAt || "string" === typeof input.startedAt);
|
|
18
|
+
return input => "object" === typeof input && null !== input && _io0(input);
|
|
19
|
+
})();
|
|
10
20
|
/**
|
|
11
21
|
* Agent-first conflict resolution for a GitHub PR.
|
|
12
22
|
*
|
|
@@ -122,23 +132,16 @@ async function prMeta(shell, root, prArg) {
|
|
|
122
132
|
if (result.exitCode !== 0) {
|
|
123
133
|
throw new Error(`Could not resolve PR '${prArg}' via gh: ${result.stderr.trim() || `exit ${result.exitCode}`}`);
|
|
124
134
|
}
|
|
125
|
-
const raw =
|
|
126
|
-
if (!
|
|
135
|
+
const raw = parseGhPrViewJson(result.stdout);
|
|
136
|
+
if (!raw) {
|
|
127
137
|
throw new Error(`gh pr view returned unexpected JSON for '${prArg}'.`);
|
|
128
138
|
}
|
|
129
|
-
const
|
|
130
|
-
if (typeof number !== 'number' ||
|
|
131
|
-
typeof url !== 'string' ||
|
|
132
|
-
typeof headRefName !== 'string' ||
|
|
133
|
-
typeof baseRefName !== 'string') {
|
|
134
|
-
throw new Error(`gh pr view JSON for '${prArg}' is missing expected fields.`);
|
|
135
|
-
}
|
|
136
|
-
const match = /github\.com\/([^/]+\/[^/]+)\/pull\//.exec(url);
|
|
139
|
+
const match = /github\.com\/([^/]+\/[^/]+)\/pull\//.exec(raw.url);
|
|
137
140
|
return {
|
|
138
|
-
number,
|
|
139
|
-
url,
|
|
140
|
-
headBranch: headRefName,
|
|
141
|
-
baseBranch: baseRefName,
|
|
141
|
+
number: raw.number,
|
|
142
|
+
url: raw.url,
|
|
143
|
+
headBranch: raw.headRefName,
|
|
144
|
+
baseBranch: raw.baseRefName,
|
|
142
145
|
crossRepo: raw.isCrossRepository === true,
|
|
143
146
|
nameWithOwner: match ? match[1] : '',
|
|
144
147
|
};
|
|
@@ -225,26 +228,19 @@ function readState(statePath) {
|
|
|
225
228
|
catch {
|
|
226
229
|
return null;
|
|
227
230
|
}
|
|
228
|
-
if (!
|
|
229
|
-
return null;
|
|
230
|
-
}
|
|
231
|
-
const { pr, url, headBranch, baseBranch, remote, crossRepo, originalBranch, originalSha, startedAt } = raw;
|
|
232
|
-
if (typeof pr !== 'number' ||
|
|
233
|
-
typeof headBranch !== 'string' ||
|
|
234
|
-
typeof baseBranch !== 'string' ||
|
|
235
|
-
typeof remote !== 'string') {
|
|
231
|
+
if (!isPrResolveStateJson(raw)) {
|
|
236
232
|
return null;
|
|
237
233
|
}
|
|
238
234
|
return {
|
|
239
|
-
pr,
|
|
240
|
-
url:
|
|
241
|
-
headBranch,
|
|
242
|
-
baseBranch,
|
|
243
|
-
remote,
|
|
244
|
-
crossRepo: crossRepo === true,
|
|
245
|
-
originalBranch:
|
|
246
|
-
originalSha:
|
|
247
|
-
startedAt:
|
|
235
|
+
pr: raw.pr,
|
|
236
|
+
url: raw.url ?? '',
|
|
237
|
+
headBranch: raw.headBranch,
|
|
238
|
+
baseBranch: raw.baseBranch,
|
|
239
|
+
remote: raw.remote,
|
|
240
|
+
crossRepo: raw.crossRepo === true,
|
|
241
|
+
originalBranch: raw.originalBranch ?? '',
|
|
242
|
+
originalSha: raw.originalSha ?? '',
|
|
243
|
+
startedAt: raw.startedAt ?? '',
|
|
248
244
|
};
|
|
249
245
|
}
|
|
250
246
|
function writeState(statePath, state) {
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import type { PackageJson } from '../lib/json.js';
|
|
1
2
|
import type { ReleasePackageInfo } from './core.js';
|
|
2
3
|
export interface AutoReleaseCandidateShell {
|
|
3
4
|
gitRefExists(ref: string): Promise<boolean>;
|
|
4
5
|
latestStableReleaseRef(projectName: string): Promise<string | null>;
|
|
5
6
|
packageChangedFilesSince(ref: string, packagePath: string): Promise<string[]>;
|
|
6
|
-
packageJsonAtRef(ref: string, packagePath: string): Promise<
|
|
7
|
-
currentPackageJson(packagePath: string): Promise<
|
|
7
|
+
packageJsonAtRef(ref: string, packagePath: string): Promise<PackageJson | null>;
|
|
8
|
+
currentPackageJson(packagePath: string): Promise<PackageJson | null>;
|
|
8
9
|
packageBuildInputPatterns(projectName: string, packagePath: string): Promise<string[]>;
|
|
9
10
|
packageHasHistory(packagePath: string): Promise<boolean>;
|
|
10
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"candidates.d.ts","sourceRoot":"","sources":["../../src/release/candidates.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"candidates.d.ts","sourceRoot":"","sources":["../../src/release/candidates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAGpD,MAAM,WAAW,yBAAyB;IACxC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACpE,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9E,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAChF,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACrE,yBAAyB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvF,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1D;AAgCD,wBAAsB,4BAA4B,CAAC,OAAO,SAAS,kBAAkB,EACnF,KAAK,EAAE,yBAAyB,EAChC,QAAQ,EAAE,OAAO,EAAE,GAClB,OAAO,CAAC,OAAO,EAAE,CAAC,CAQpB"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { isRecord } from '../lib/json.js';
|
|
2
1
|
import { releaseTag } from './core.js';
|
|
3
2
|
const releasableManifestKeys = [
|
|
4
3
|
'author',
|
|
@@ -80,7 +79,7 @@ async function packageHasReleasableChangesSince(shell, ref, pkg) {
|
|
|
80
79
|
}
|
|
81
80
|
function releasableManifestChanged(previousManifest, currentManifest) {
|
|
82
81
|
for (const key of releasableManifestKeys) {
|
|
83
|
-
if (!stableJsonEqual(previousManifest
|
|
82
|
+
if (!stableJsonEqual(Reflect.get(previousManifest, key), Reflect.get(currentManifest, key))) {
|
|
84
83
|
return true;
|
|
85
84
|
}
|
|
86
85
|
}
|
|
@@ -159,7 +158,7 @@ function isManifestFilesPath(path, manifest) {
|
|
|
159
158
|
return false;
|
|
160
159
|
}
|
|
161
160
|
for (const entry of files) {
|
|
162
|
-
if (
|
|
161
|
+
if (entry.length === 0 || entry.startsWith('!')) {
|
|
163
162
|
continue;
|
|
164
163
|
}
|
|
165
164
|
if (matchesManifestFilesEntry(path, entry)) {
|
|
@@ -182,10 +181,10 @@ function stableJson(value) {
|
|
|
182
181
|
if (Array.isArray(value)) {
|
|
183
182
|
return value.map(stableJson);
|
|
184
183
|
}
|
|
185
|
-
if (
|
|
184
|
+
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
186
185
|
const normalized = {};
|
|
187
186
|
for (const key of Object.keys(value).sort()) {
|
|
188
|
-
normalized[key] = stableJson(value
|
|
187
|
+
normalized[key] = stableJson(Reflect.get(value, key));
|
|
189
188
|
}
|
|
190
189
|
return normalized;
|
|
191
190
|
}
|
package/dist/release/index.d.ts
CHANGED
|
@@ -77,6 +77,7 @@ export declare function configureTrustedPublishers<Package extends ReleasePackag
|
|
|
77
77
|
export declare function releaseBootstrapNpmPackages(root: string, options: ReleaseBootstrapNpmPackagesOptions): Promise<void>;
|
|
78
78
|
export declare function releaseRetagUnpublished(root: string, options: ReleaseRetagUnpublishedOptions): Promise<void>;
|
|
79
79
|
export declare function printReleaseState(root: string): Promise<void>;
|
|
80
|
+
/** npm trust list/setup requires an authenticated package owner. */
|
|
80
81
|
export declare function npmTrustListAccessDenied(stdout: string, stderr: string): boolean;
|
|
81
82
|
export declare function parseTrustedPublishers(stdout: string, packageName: string): TrustedPublisher[];
|
|
82
83
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/release/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/release/index.ts"],"names":[],"mappings":"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"}
|
package/dist/release/index.js
CHANGED
|
@@ -1,15 +1,18 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
1
2
|
import { appendFile, mkdtemp, rm, writeFile } from 'node:fs/promises';
|
|
2
3
|
import { tmpdir } from 'node:os';
|
|
3
4
|
import { join, resolve } from 'node:path';
|
|
4
5
|
import { createInterface } from 'node:readline/promises';
|
|
5
6
|
import { Writable } from 'node:stream';
|
|
6
7
|
import { $ } from 'bun';
|
|
8
|
+
import typia from 'typia';
|
|
7
9
|
import { githubCiApplyOutputs, githubCiNxRunMany } from '../github-ci/index.js';
|
|
8
10
|
import { assertNoConflictMarkers } from '../lib/conflict-markers.js';
|
|
9
11
|
import { withDevenvEnv } from '../lib/devenv.js';
|
|
10
|
-
import {
|
|
12
|
+
import { parseNxJsonText, parseNxProjectJsonText, parsePackageJsonText, } from '../lib/json.js';
|
|
11
13
|
import { decode, run, runInteractiveStatus, runResult } from '../lib/run.js';
|
|
12
14
|
import { listReleasePackages, readPackageJson, repositoryInfo } from '../lib/workspace.js';
|
|
15
|
+
import { syncBunLockfileVersions } from '../monorepo/lockfile.js';
|
|
13
16
|
import { readPackedPackageJson, validatePackedWorkspaceDependencies } from '../monorepo/packed-manifest.js';
|
|
14
17
|
import { bootstrapNpmPackages, NPM_BOOTSTRAP_DIST_TAG, NPM_BOOTSTRAP_VERSION, } from './bootstrap-npm-packages.js';
|
|
15
18
|
import { autoReleaseCandidatePackages } from './candidates.js';
|
|
@@ -299,6 +302,10 @@ async function listUnpublishedPackages(root, packages) {
|
|
|
299
302
|
async function publishPackedPackage(root, pkg, tag, dryRun) {
|
|
300
303
|
const tempDir = await mkdtemp(join(tmpdir(), 'smoo-publish-'));
|
|
301
304
|
const tarball = join(tempDir, `${safeTarballPrefix(pkg.name)}-${pkg.version}.tgz`);
|
|
305
|
+
// bun pm pack resolves workspace:* from bun.lock. Day-to-day lock keeps -next
|
|
306
|
+
// (install/CI). For publish, temporarily rewrite unpublished -next entries to
|
|
307
|
+
// the last stable tag so the tarball embeds installable versions, then restore.
|
|
308
|
+
syncBunLockfileVersions(root, { mode: 'publish', log: true });
|
|
302
309
|
try {
|
|
303
310
|
console.log(`${pkg.name}@${pkg.version}: packing with bun pm pack`);
|
|
304
311
|
await run('bun', ['pm', 'pack', '--filename', tarball, '--ignore-scripts', '--quiet'], join(root, pkg.path));
|
|
@@ -327,6 +334,7 @@ async function publishPackedPackage(root, pkg, tag, dryRun) {
|
|
|
327
334
|
});
|
|
328
335
|
}
|
|
329
336
|
finally {
|
|
337
|
+
syncBunLockfileVersions(root, { mode: 'install', log: true });
|
|
330
338
|
await rm(tempDir, { recursive: true, force: true });
|
|
331
339
|
}
|
|
332
340
|
}
|
|
@@ -340,7 +348,7 @@ async function publishPlaceholderPackage(root, pkg, env) {
|
|
|
340
348
|
name: pkg.name,
|
|
341
349
|
version: NPM_BOOTSTRAP_VERSION,
|
|
342
350
|
description: `Bootstrap placeholder for ${pkg.name}. Real releases are published by SmoothBricks CI.`,
|
|
343
|
-
license:
|
|
351
|
+
license: pkg.json.license ?? 'UNLICENSED',
|
|
344
352
|
repository: pkg.json.repository,
|
|
345
353
|
publishConfig: { access: 'public' },
|
|
346
354
|
}, null, 2)}\n`);
|
|
@@ -356,7 +364,7 @@ function safeTarballPrefix(name) {
|
|
|
356
364
|
}
|
|
357
365
|
async function assertPackedWorkspaceDependencies(root, tarball, pkg) {
|
|
358
366
|
const manifest = await readPackedPackageJson(root, tarball, pkg.name);
|
|
359
|
-
const failures = validatePackedWorkspaceDependencies(root, pkg, manifest);
|
|
367
|
+
const failures = validatePackedWorkspaceDependencies(root, pkg, manifest, { mode: 'publish' });
|
|
360
368
|
if (failures.length > 0) {
|
|
361
369
|
throw new Error(failures.join('\n'));
|
|
362
370
|
}
|
|
@@ -499,8 +507,7 @@ async function packageVersionAtRef(root, packagePath, ref) {
|
|
|
499
507
|
return null;
|
|
500
508
|
}
|
|
501
509
|
try {
|
|
502
|
-
|
|
503
|
-
return isRecord(parsed) ? stringProperty(parsed, 'version') : null;
|
|
510
|
+
return parsePackageJsonText(decode(result.stdout))?.version ?? null;
|
|
504
511
|
}
|
|
505
512
|
catch {
|
|
506
513
|
return null;
|
|
@@ -927,8 +934,7 @@ async function packageJsonAtRef(root, ref, packagePath) {
|
|
|
927
934
|
return null;
|
|
928
935
|
}
|
|
929
936
|
try {
|
|
930
|
-
|
|
931
|
-
return isRecord(parsed) ? parsed : null;
|
|
937
|
+
return parsePackageJsonText(decode(result.stdout));
|
|
932
938
|
}
|
|
933
939
|
catch {
|
|
934
940
|
return null;
|
|
@@ -939,46 +945,59 @@ async function currentPackageJson(root, packagePath) {
|
|
|
939
945
|
}
|
|
940
946
|
async function packageBuildInputPatterns(root, projectName, _packagePath) {
|
|
941
947
|
const project = await nxProjectJson(root, projectName);
|
|
942
|
-
|
|
943
|
-
return resolveBuildInputPatterns(project, nxJson);
|
|
948
|
+
return resolveBuildInputPatterns(project, readNxJson(join(root, 'nx.json')));
|
|
944
949
|
}
|
|
945
950
|
async function nxProjectJson(root, projectName) {
|
|
946
951
|
const result = await $ `nx show project ${projectName} --json`.cwd(root).quiet();
|
|
947
|
-
const parsed =
|
|
948
|
-
if (!
|
|
952
|
+
const parsed = parseNxProjectJsonText(decode(result.stdout));
|
|
953
|
+
if (!parsed) {
|
|
949
954
|
throw new Error(`Unable to inspect Nx project ${projectName}.`);
|
|
950
955
|
}
|
|
951
956
|
return parsed;
|
|
952
957
|
}
|
|
958
|
+
function readNxJson(path) {
|
|
959
|
+
if (!existsSync(path)) {
|
|
960
|
+
return {};
|
|
961
|
+
}
|
|
962
|
+
try {
|
|
963
|
+
return parseNxJsonText(readFileSync(path, 'utf8')) ?? {};
|
|
964
|
+
}
|
|
965
|
+
catch {
|
|
966
|
+
return {};
|
|
967
|
+
}
|
|
968
|
+
}
|
|
953
969
|
function resolveBuildInputPatterns(project, nxJson) {
|
|
954
|
-
const targets =
|
|
970
|
+
const targets = project.targets;
|
|
955
971
|
if (!targets) {
|
|
956
972
|
return [];
|
|
957
973
|
}
|
|
958
974
|
return normalizeInputPatterns(collectBuildInputs(targets), nxJson);
|
|
959
975
|
}
|
|
960
976
|
function collectBuildInputs(targets) {
|
|
961
|
-
const build =
|
|
977
|
+
const build = targets.build;
|
|
962
978
|
if (!build) {
|
|
963
979
|
return ['production'];
|
|
964
980
|
}
|
|
965
|
-
const directInputs =
|
|
981
|
+
const directInputs = stringInputs(build.inputs);
|
|
966
982
|
if (directInputs.length > 0) {
|
|
967
983
|
return directInputs;
|
|
968
984
|
}
|
|
969
985
|
const inputs = [];
|
|
970
|
-
for (const dependency of
|
|
971
|
-
if (dependency.startsWith('^')) {
|
|
986
|
+
for (const dependency of build.dependsOn ?? []) {
|
|
987
|
+
if (typeof dependency !== 'string' || dependency.startsWith('^')) {
|
|
972
988
|
continue;
|
|
973
989
|
}
|
|
974
990
|
const targetName = dependency.includes(':') ? dependency.split(':')[1] : dependency;
|
|
975
991
|
if (!targetName) {
|
|
976
992
|
continue;
|
|
977
993
|
}
|
|
978
|
-
inputs.push(...
|
|
994
|
+
inputs.push(...stringInputs(targets[targetName]?.inputs));
|
|
979
995
|
}
|
|
980
996
|
return inputs.length > 0 ? inputs : ['production'];
|
|
981
997
|
}
|
|
998
|
+
function stringInputs(inputs) {
|
|
999
|
+
return Array.isArray(inputs) ? inputs.filter((entry) => typeof entry === 'string') : [];
|
|
1000
|
+
}
|
|
982
1001
|
function normalizeInputPatterns(inputs, nxJson) {
|
|
983
1002
|
const patterns = [];
|
|
984
1003
|
const seen = new Set();
|
|
@@ -995,8 +1014,7 @@ function expandInputPattern(input, nxJson, seen) {
|
|
|
995
1014
|
}
|
|
996
1015
|
seen.add(input);
|
|
997
1016
|
if (!input.includes('{')) {
|
|
998
|
-
const
|
|
999
|
-
const namedInput = namedInputs?.[input];
|
|
1017
|
+
const namedInput = nxJson.namedInputs?.[input];
|
|
1000
1018
|
if (Array.isArray(namedInput)) {
|
|
1001
1019
|
return namedInput.flatMap((entry) => (typeof entry === 'string' ? expandInputPattern(entry, nxJson, seen) : []));
|
|
1002
1020
|
}
|
|
@@ -1010,17 +1028,6 @@ function expandInputPattern(input, nxJson, seen) {
|
|
|
1010
1028
|
const packageRelative = rawInput.slice('{projectRoot}/'.length);
|
|
1011
1029
|
return [`${excluded ? '!' : ''}${packageRelative}`];
|
|
1012
1030
|
}
|
|
1013
|
-
function recordProperty(record, key) {
|
|
1014
|
-
if (!record) {
|
|
1015
|
-
return null;
|
|
1016
|
-
}
|
|
1017
|
-
const value = record[key];
|
|
1018
|
-
return isRecord(value) ? value : null;
|
|
1019
|
-
}
|
|
1020
|
-
function stringArrayProperty(record, key) {
|
|
1021
|
-
const value = record?.[key];
|
|
1022
|
-
return Array.isArray(value) ? value.filter((entry) => typeof entry === 'string') : [];
|
|
1023
|
-
}
|
|
1024
1031
|
async function packageHasHistory(root, packagePath) {
|
|
1025
1032
|
const result = await $ `git log --format=%H -- ${packagePath}`.cwd(root).quiet().nothrow();
|
|
1026
1033
|
if (result.exitCode !== 0) {
|
|
@@ -1219,7 +1226,7 @@ async function runLatestNpmTrust(root, npmArgs, env) {
|
|
|
1219
1226
|
if (status === 0) {
|
|
1220
1227
|
return 'configured';
|
|
1221
1228
|
}
|
|
1222
|
-
throw new Error(
|
|
1229
|
+
throw new Error(npmCommandFailedMessage(npmArgs, status));
|
|
1223
1230
|
}
|
|
1224
1231
|
async function listTrustedPublishers(root, pkg) {
|
|
1225
1232
|
const args = ['trust', 'list', pkg.name, '--json'];
|
|
@@ -1227,7 +1234,7 @@ async function listTrustedPublishers(root, pkg) {
|
|
|
1227
1234
|
if (result.exitCode !== 0 && /\bEOTP\b/.test(`${result.stdout}\n${result.stderr}`)) {
|
|
1228
1235
|
const status = await runInteractiveStatus('nix', ['shell', 'nixpkgs#nodejs_latest', '-c', 'npm', ...args], root);
|
|
1229
1236
|
if (status !== 0) {
|
|
1230
|
-
throw new Error(
|
|
1237
|
+
throw new Error(npmCommandFailedMessage(args, status));
|
|
1231
1238
|
}
|
|
1232
1239
|
result = await runResult('nix', ['shell', 'nixpkgs#nodejs_latest', '-c', 'npm', ...args], root);
|
|
1233
1240
|
}
|
|
@@ -1235,12 +1242,42 @@ async function listTrustedPublishers(root, pkg) {
|
|
|
1235
1242
|
return npmTrustAccessDetails(root, pkg.name);
|
|
1236
1243
|
}
|
|
1237
1244
|
if (result.exitCode !== 0) {
|
|
1238
|
-
throw new Error(
|
|
1245
|
+
throw new Error(npmCommandFailedMessage(args, result.exitCode, result.stdout, result.stderr));
|
|
1239
1246
|
}
|
|
1240
1247
|
return parseTrustedPublishers(result.stdout, pkg.name);
|
|
1241
1248
|
}
|
|
1249
|
+
/** npm trust list/setup requires an authenticated package owner. */
|
|
1242
1250
|
export function npmTrustListAccessDenied(stdout, stderr) {
|
|
1243
|
-
|
|
1251
|
+
const output = `${stdout}\n${stderr}`;
|
|
1252
|
+
// E403: authenticated but not an owner. E401 / login-required: no usable session.
|
|
1253
|
+
return (/\bE403\b/.test(output) ||
|
|
1254
|
+
/\bE401\b/.test(output) ||
|
|
1255
|
+
/You must be logged in to publish packages/i.test(output) ||
|
|
1256
|
+
/npm error 401 Unauthorized/i.test(output));
|
|
1257
|
+
}
|
|
1258
|
+
function npmCommandFailedMessage(npmArgs, exitCode, stdout = '', stderr = '') {
|
|
1259
|
+
const command = `nix shell nixpkgs#nodejs_latest -c npm ${npmArgs.join(' ')}`;
|
|
1260
|
+
const detail = npmFailureDetail(stdout, stderr);
|
|
1261
|
+
return detail.length > 0
|
|
1262
|
+
? `${command} failed with exit code ${exitCode}\n${detail}`
|
|
1263
|
+
: `${command} failed with exit code ${exitCode}`;
|
|
1264
|
+
}
|
|
1265
|
+
function npmFailureDetail(stdout, stderr) {
|
|
1266
|
+
const chunks = [stderr.trim(), stdout.trim()].filter((chunk) => chunk.length > 0);
|
|
1267
|
+
if (chunks.length === 0) {
|
|
1268
|
+
return '';
|
|
1269
|
+
}
|
|
1270
|
+
// Prefer the actionable npm error line over notice spam when present.
|
|
1271
|
+
const joined = chunks.join('\n');
|
|
1272
|
+
const errorLines = joined
|
|
1273
|
+
.split('\n')
|
|
1274
|
+
.map((line) => line.trimEnd())
|
|
1275
|
+
.filter((line) => /npm error|error code|401 Unauthorized|403 Forbidden|E401|E403|logged in/i.test(line));
|
|
1276
|
+
if (errorLines.length > 0) {
|
|
1277
|
+
return errorLines.slice(0, 8).join('\n');
|
|
1278
|
+
}
|
|
1279
|
+
// Fall back to a short tail of combined output.
|
|
1280
|
+
return joined.split('\n').slice(-12).join('\n');
|
|
1244
1281
|
}
|
|
1245
1282
|
async function npmTrustAccessDetails(root, packageName) {
|
|
1246
1283
|
const [identityResult, ownersResult] = await Promise.all([
|
|
@@ -1261,34 +1298,26 @@ export function parseTrustedPublishers(stdout, packageName) {
|
|
|
1261
1298
|
if (stdout.trim().length === 0) {
|
|
1262
1299
|
return [];
|
|
1263
1300
|
}
|
|
1264
|
-
|
|
1301
|
+
// createIsParse returns null for non-matching shapes and bare `null`.
|
|
1302
|
+
const parsed = parseTrustedPublisherJson(stdout);
|
|
1265
1303
|
if (parsed === null) {
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
}
|
|
1271
|
-
if (isRecord(parsed)) {
|
|
1272
|
-
return [parseTrustedPublisher(parsed, packageName)];
|
|
1273
|
-
}
|
|
1274
|
-
throw new Error(`${packageName}: npm trust list returned invalid JSON.`);
|
|
1275
|
-
}
|
|
1276
|
-
function parseTrustedPublisher(value, packageName) {
|
|
1277
|
-
if (!isRecord(value)) {
|
|
1278
|
-
throw new Error(`${packageName}: npm trust list returned invalid trusted publisher entry.`);
|
|
1279
|
-
}
|
|
1280
|
-
const id = stringProperty(value, 'id');
|
|
1281
|
-
const type = stringProperty(value, 'type');
|
|
1282
|
-
if (!id || !type) {
|
|
1283
|
-
throw new Error(`${packageName}: npm trust list returned a trusted publisher without id or type.`);
|
|
1304
|
+
if (stdout.trim() === 'null') {
|
|
1305
|
+
return [];
|
|
1306
|
+
}
|
|
1307
|
+
throw new Error(`${packageName}: npm trust list returned invalid trusted publisher JSON.`);
|
|
1284
1308
|
}
|
|
1285
|
-
return {
|
|
1286
|
-
id,
|
|
1287
|
-
type,
|
|
1288
|
-
file:
|
|
1289
|
-
repository:
|
|
1290
|
-
};
|
|
1309
|
+
return (Array.isArray(parsed) ? parsed : [parsed]).map((value) => ({
|
|
1310
|
+
id: value.id,
|
|
1311
|
+
type: value.type,
|
|
1312
|
+
file: value.file,
|
|
1313
|
+
repository: value.repository,
|
|
1314
|
+
}));
|
|
1291
1315
|
}
|
|
1316
|
+
const parseTrustedPublisherJson = (() => {
|
|
1317
|
+
const _io0 = input => "string" === typeof input.id && "string" === typeof input.type && (undefined === input.file || "string" === typeof input.file) && (undefined === input.repository || "string" === typeof input.repository);
|
|
1318
|
+
const __is = input => null !== input && undefined !== input && (Array.isArray(input) && input.every(elem => "object" === typeof elem && null !== elem && _io0(elem)) || "object" === typeof input && null !== input && _io0(input));
|
|
1319
|
+
return input => { input = JSON.parse(input); return __is(input) ? input : null; };
|
|
1320
|
+
})();
|
|
1292
1321
|
async function runLatestNpmPublish(root, npmArgs) {
|
|
1293
1322
|
await runLatestNpm(root, npmArgs, { NODE_AUTH_TOKEN: '', NPM_TOKEN: '' });
|
|
1294
1323
|
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export declare function isRecord(v: unknown): v is Record<string, unknown>;
|
|
2
1
|
/** First `[env.<name>]` (source order; also derived from a nested `[env.<name>.*]`), or null when no env declared. */
|
|
3
2
|
export declare function firstWranglerEnv(toml: string): string | null;
|
|
4
3
|
/** True if the toml declares `[env.<env>]` (or any `[env.<env>.*]` sub-table). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepare-env.d.ts","sourceRoot":"","sources":["../../src/wrangler/prepare-env.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prepare-env.d.ts","sourceRoot":"","sources":["../../src/wrangler/prepare-env.ts"],"names":[],"mappings":"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"}
|