putitoutthere 0.2.28 → 0.2.30

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.
Files changed (138) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/MIGRATIONS.md +1274 -0
  3. package/README.md +343 -41
  4. package/action.yml +9 -0
  5. package/dist/action.d.ts.map +1 -1
  6. package/dist/action.js +28 -6
  7. package/dist/action.js.map +1 -1
  8. package/dist/cascade.js +14 -7
  9. package/dist/cascade.js.map +1 -1
  10. package/dist/check-crate-size.d.ts +26 -0
  11. package/dist/check-crate-size.d.ts.map +1 -0
  12. package/dist/check-crate-size.js +99 -0
  13. package/dist/check-crate-size.js.map +1 -0
  14. package/dist/check.d.ts.map +1 -1
  15. package/dist/check.js +116 -16
  16. package/dist/check.js.map +1 -1
  17. package/dist/cli.d.ts +17 -4
  18. package/dist/cli.d.ts.map +1 -1
  19. package/dist/cli.js +156 -19
  20. package/dist/cli.js.map +1 -1
  21. package/dist/completeness.js +6 -3
  22. package/dist/completeness.js.map +1 -1
  23. package/dist/config.d.ts +2 -0
  24. package/dist/config.d.ts.map +1 -1
  25. package/dist/config.js +20 -5
  26. package/dist/config.js.map +1 -1
  27. package/dist/ensure-tag.d.ts +17 -0
  28. package/dist/ensure-tag.d.ts.map +1 -0
  29. package/dist/ensure-tag.js +28 -0
  30. package/dist/ensure-tag.js.map +1 -0
  31. package/dist/env.js +6 -3
  32. package/dist/env.js.map +1 -1
  33. package/dist/error-codes.d.ts +89 -0
  34. package/dist/error-codes.d.ts.map +1 -1
  35. package/dist/error-codes.js +102 -0
  36. package/dist/error-codes.js.map +1 -1
  37. package/dist/git.d.ts +5 -0
  38. package/dist/git.d.ts.map +1 -1
  39. package/dist/git.js +19 -6
  40. package/dist/git.js.map +1 -1
  41. package/dist/glob.d.ts +9 -0
  42. package/dist/glob.d.ts.map +1 -1
  43. package/dist/glob.js +29 -1
  44. package/dist/glob.js.map +1 -1
  45. package/dist/handlers/crates.d.ts +15 -0
  46. package/dist/handlers/crates.d.ts.map +1 -1
  47. package/dist/handlers/crates.js +84 -9
  48. package/dist/handlers/crates.js.map +1 -1
  49. package/dist/handlers/npm-platform.d.ts +11 -0
  50. package/dist/handlers/npm-platform.d.ts.map +1 -1
  51. package/dist/handlers/npm-platform.js +91 -8
  52. package/dist/handlers/npm-platform.js.map +1 -1
  53. package/dist/handlers/npm.d.ts.map +1 -1
  54. package/dist/handlers/npm.js +59 -9
  55. package/dist/handlers/npm.js.map +1 -1
  56. package/dist/handlers/pypi.d.ts +0 -6
  57. package/dist/handlers/pypi.d.ts.map +1 -1
  58. package/dist/handlers/pypi.js +28 -10
  59. package/dist/handlers/pypi.js.map +1 -1
  60. package/dist/log.js +16 -8
  61. package/dist/log.js.map +1 -1
  62. package/dist/normalize-artifacts.js +8 -4
  63. package/dist/normalize-artifacts.js.map +1 -1
  64. package/dist/plan.d.ts +8 -0
  65. package/dist/plan.d.ts.map +1 -1
  66. package/dist/plan.js +125 -25
  67. package/dist/plan.js.map +1 -1
  68. package/dist/preflight.d.ts +79 -0
  69. package/dist/preflight.d.ts.map +1 -1
  70. package/dist/preflight.js +715 -33
  71. package/dist/preflight.js.map +1 -1
  72. package/dist/publish.d.ts +7 -0
  73. package/dist/publish.d.ts.map +1 -1
  74. package/dist/publish.js +49 -18
  75. package/dist/publish.js.map +1 -1
  76. package/dist/python-versions.d.ts +40 -0
  77. package/dist/python-versions.d.ts.map +1 -0
  78. package/dist/python-versions.js +142 -0
  79. package/dist/python-versions.js.map +1 -0
  80. package/dist/reconcile-types.d.ts +36 -0
  81. package/dist/reconcile-types.d.ts.map +1 -0
  82. package/dist/reconcile-types.js +9 -0
  83. package/dist/reconcile-types.js.map +1 -0
  84. package/dist/reconcile.d.ts +21 -0
  85. package/dist/reconcile.d.ts.map +1 -0
  86. package/dist/reconcile.js +54 -0
  87. package/dist/reconcile.js.map +1 -0
  88. package/dist/release-packages.d.ts +33 -0
  89. package/dist/release-packages.d.ts.map +1 -0
  90. package/dist/release-packages.js +74 -0
  91. package/dist/release-packages.js.map +1 -0
  92. package/dist/resolve-tag-commit.d.ts +22 -0
  93. package/dist/resolve-tag-commit.d.ts.map +1 -0
  94. package/dist/resolve-tag-commit.js +26 -0
  95. package/dist/resolve-tag-commit.js.map +1 -0
  96. package/dist/retry.js +14 -7
  97. package/dist/retry.js.map +1 -1
  98. package/dist/status-classify.d.ts +17 -0
  99. package/dist/status-classify.d.ts.map +1 -0
  100. package/dist/status-classify.js +37 -0
  101. package/dist/status-classify.js.map +1 -0
  102. package/dist/status-format.d.ts +9 -0
  103. package/dist/status-format.d.ts.map +1 -0
  104. package/dist/status-format.js +19 -0
  105. package/dist/status-format.js.map +1 -0
  106. package/dist/status-types.d.ts +31 -0
  107. package/dist/status-types.d.ts.map +1 -0
  108. package/dist/status-types.js +8 -0
  109. package/dist/status-types.js.map +1 -0
  110. package/dist/status.d.ts +28 -0
  111. package/dist/status.d.ts.map +1 -0
  112. package/dist/status.js +72 -0
  113. package/dist/status.js.map +1 -0
  114. package/dist/tag-template.js +2 -1
  115. package/dist/tag-template.js.map +1 -1
  116. package/dist/trailer.js +16 -9
  117. package/dist/trailer.js.map +1 -1
  118. package/dist/types.d.ts +11 -0
  119. package/dist/types.d.ts.map +1 -1
  120. package/dist/types.js +4 -2
  121. package/dist/types.js.map +1 -1
  122. package/dist/verbose.js +7 -4
  123. package/dist/verbose.js.map +1 -1
  124. package/dist/wheel-abi.d.ts +37 -0
  125. package/dist/wheel-abi.d.ts.map +1 -0
  126. package/dist/wheel-abi.js +118 -0
  127. package/dist/wheel-abi.js.map +1 -0
  128. package/dist/write-crate-version.d.ts +32 -0
  129. package/dist/write-crate-version.d.ts.map +1 -0
  130. package/dist/write-crate-version.js +52 -0
  131. package/dist/write-crate-version.js.map +1 -0
  132. package/dist/write-launcher.d.ts +82 -0
  133. package/dist/write-launcher.d.ts.map +1 -0
  134. package/dist/write-launcher.js +236 -0
  135. package/dist/write-launcher.js.map +1 -0
  136. package/dist/write-version.js +2 -1
  137. package/dist/write-version.js.map +1 -1
  138. package/package.json +4 -2
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Author the npm bundled-cli launcher (`bin/<bin>.js`) at build time.
3
+ *
4
+ * Bundled-CLI consumers used to ship a templated launcher whose only
5
+ * per-consumer inputs are the package name and the configured `targets`
6
+ * list — both of which the engine has at plan time. Issue #299
7
+ * absorbs that template into the engine: the build job invokes
8
+ * `write-launcher` on the main row of every `kind = "npm" && build =
9
+ * "bundled-cli"` package and the launcher is generated in place.
10
+ *
11
+ * Override semantics: existing `bin/<bin>.js` files are never
12
+ * overwritten, and an existing `package.json#bin` field is left as-is.
13
+ * Consumers who need a custom launcher commit it under the same path
14
+ * and the workflow respects it.
15
+ */
16
+ import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
17
+ import { dirname, isAbsolute, join, resolve } from 'node:path';
18
+ import { loadConfig } from './config.js';
19
+ import { normalizeBuild } from './handlers/npm-platform.js';
20
+ /**
21
+ * Generate the launcher source for the given configuration.
22
+ *
23
+ * Exported only so test fixtures can pin the on-the-wire shape; the
24
+ * build path goes through `writeLauncher` / `writeLauncherFromConfig`.
25
+ */
26
+ export function generateLauncherSource(opts) {
27
+ const { npmName, bin, platformNameTemplate, triples } = opts;
28
+ // Resolve every template placeholder except {triple}, which stays as
29
+ // a JS-template substitution. Pre-resolving here keeps the published
30
+ // launcher dependency-free (no runtime read of the platform template).
31
+ const partial = platformNameTemplate
32
+ .replaceAll('{name}', npmName)
33
+ .replaceAll('{scope}', extractScope(npmName))
34
+ .replaceAll('{base}', extractBase(npmName))
35
+ .replaceAll('{mode}', 'bundled-cli');
36
+ const triplesTable = triples
37
+ .map((triple) => {
38
+ const key = nodePlatformKey(triple);
39
+ return ` ${jsString(key)}: ${jsString(triple)},`;
40
+ })
41
+ .join('\n');
42
+ // Backtick template + ${triple} substitution at install time keeps the
43
+ // launcher's branching minimal: one Node platform-key lookup, one
44
+ // require.resolve, one spawnSync. Same shape as the README example
45
+ // bundled-cli consumers wrote by hand before #299.
46
+ return [
47
+ `#!/usr/bin/env node`,
48
+ `// Generated by putitoutthere. Commit your own bin/${bin}.js to override.`,
49
+ `const { spawnSync } = require('node:child_process');`,
50
+ `const { platform, arch } = process;`,
51
+ ``,
52
+ `const triples = {`,
53
+ triplesTable,
54
+ `};`,
55
+ ``,
56
+ `const triple = triples[\`\${platform}-\${arch}\`];`,
57
+ `if (!triple) {`,
58
+ ` console.error(\`${bin}: unsupported platform \${platform}-\${arch}\`);`,
59
+ ` process.exit(1);`,
60
+ `}`,
61
+ ``,
62
+ `const pkg = \`${partial.replaceAll('{triple}', '${triple}')}\`;`,
63
+ `const binary = require.resolve(\`\${pkg}/${bin}\${platform === 'win32' ? '.exe' : ''}\`);`,
64
+ `const result = spawnSync(binary, process.argv.slice(2), { stdio: 'inherit' });`,
65
+ `process.exit(result.status ?? 1);`,
66
+ ``,
67
+ ].join('\n');
68
+ }
69
+ /**
70
+ * Author the launcher + `package.json#bin` entry for a bundled-cli npm
71
+ * package. Idempotent: existing files / fields are left as-is so
72
+ * consumers can override either piece independently.
73
+ *
74
+ * Returns the list of paths that were actually written.
75
+ */
76
+ export function writeLauncher(opts) {
77
+ const written = [];
78
+ const launcherPath = join(opts.pkgDir, 'bin', `${opts.bin}.js`);
79
+ // CodeQL TOCTOU: use `wx` (write-exclusive) rather than `existsSync`
80
+ // precheck so the "absent only" guarantee is atomic. EEXIST means a
81
+ // consumer-authored launcher (or a concurrent write) won this race —
82
+ // exactly the override path we want to respect.
83
+ mkdirSync(dirname(launcherPath), { recursive: true });
84
+ try {
85
+ writeFileSync(launcherPath, generateLauncherSource(opts), { encoding: 'utf8', flag: 'wx' });
86
+ written.push(launcherPath);
87
+ }
88
+ catch (err) {
89
+ if (err.code !== 'EEXIST') {
90
+ throw err;
91
+ }
92
+ }
93
+ const pkgJsonPath = join(opts.pkgDir, 'package.json');
94
+ const raw = readFileSync(pkgJsonPath, 'utf8');
95
+ const parsed = JSON.parse(raw);
96
+ if (parsed['bin'] === undefined) {
97
+ parsed['bin'] = { [opts.bin]: `bin/${opts.bin}.js` };
98
+ const indent = detectIndent(raw);
99
+ const trailing = raw.endsWith('\n') ? '\n' : '';
100
+ writeFileSync(pkgJsonPath, JSON.stringify(parsed, null, indent) + trailing, 'utf8');
101
+ written.push(pkgJsonPath);
102
+ }
103
+ return written;
104
+ }
105
+ /**
106
+ * Config-driven entry point used by the CLI. Loads the config, finds
107
+ * the `[[package]]` entry matching `packagePath`, derives the launcher
108
+ * inputs, and delegates to `writeLauncher`. Non-npm packages and npm
109
+ * packages without a bundled-cli build entry are no-ops — the build
110
+ * job invokes this on every main row and only bundled-cli rows need
111
+ * the launcher.
112
+ */
113
+ export function writeLauncherFromConfig(opts) {
114
+ const cfg = loadConfig(opts.configPath ?? join(opts.cwd, 'putitoutthere.toml'));
115
+ const absPkg = isAbsolute(opts.packagePath)
116
+ ? opts.packagePath
117
+ : resolve(opts.cwd, opts.packagePath);
118
+ const pkg = cfg.packages.find((p) => resolve(opts.cwd, p.path) === absPkg);
119
+ if (!pkg) {
120
+ throw new Error(`write-launcher: no [[package]] entry with path "${opts.packagePath}" in ${opts.configPath ?? join(opts.cwd, 'putitoutthere.toml')}`);
121
+ }
122
+ if (pkg.kind !== 'npm') {
123
+ return [];
124
+ }
125
+ const npmPkg = pkg;
126
+ const buildEntries = normalizeBuild(npmPkg.build);
127
+ const bundledCli = buildEntries.find((e) => e.mode === 'bundled-cli');
128
+ if (!bundledCli) {
129
+ return [];
130
+ }
131
+ // `[package.bundle_cli]` is optional on a bundled-cli npm package — #298
132
+ // kept the table opt-in. When it's declared the reusable workflow
133
+ // cross-compiles the Rust binary and we author the launcher from
134
+ // `bundle_cli.bin`. When it's absent the consumer is on the legacy
135
+ // "bring your own scripts/build.cjs + bin/<bin>.js" path: the
136
+ // cross-compile step already skips them (it gates on `matrix.bundle_cli`),
137
+ // and the engine has no binary name to author a launcher from. No-op so
138
+ // the consumer's committed launcher + package.json#bin stand untouched.
139
+ // The workflow can't make this distinction — the main row this runs on
140
+ // never carries `bundle_cli` (plan.ts attaches it only to per-target
141
+ // bundled-cli rows) — so the gate lives here, where the full config is
142
+ // loaded. Skipping it dereferenced the absent table and crashed every
143
+ // legacy bundled-cli package's main row once #299 moved launcher
144
+ // generation into the engine.
145
+ const bundleCli = npmPkg.bundle_cli;
146
+ if (bundleCli === undefined) {
147
+ return [];
148
+ }
149
+ // bundle_cli present ⇒ `targets` is non-empty (config.ts refinement), so
150
+ // the assertion is sound on this path.
151
+ const targets = npmPkg.targets;
152
+ const triples = targets.map((t) => (typeof t === 'string' ? t : t.triple));
153
+ const npmName = npmPkg.npm ?? npmPkg.name;
154
+ return writeLauncher({
155
+ pkgDir: resolve(opts.cwd, npmPkg.path),
156
+ npmName,
157
+ bin: bundleCli.bin,
158
+ platformNameTemplate: bundledCli.name,
159
+ triples,
160
+ });
161
+ }
162
+ /* ----------------------------- internals ----------------------------- */
163
+ function extractScope(npmName) {
164
+ const m = /^@([^/]+)\/(.+)$/.exec(npmName);
165
+ return m ? m[1] : '';
166
+ }
167
+ function extractBase(npmName) {
168
+ const m = /^@([^/]+)\/(.+)$/.exec(npmName);
169
+ return m ? m[2] : npmName;
170
+ }
171
+ /**
172
+ * Map a target triple (napi-rs short form or Rust target) to the Node
173
+ * `${platform}-${arch}` lookup key used in the generated launcher's
174
+ * `triples` table.
175
+ *
176
+ * Mirrors the TRIPLE_MAP in `src/handlers/npm-platform.ts`, but
177
+ * collapses `os`/`cpu`/`libc` into the `<node-platform>-<node-arch>`
178
+ * key Node exposes at install time. Unmapped triples throw — plan-
179
+ * time guard (`assertTripleSupported`) already rejects them before the
180
+ * matrix runs, so reaching the throw implies map drift between the
181
+ * two files; the vocabulary matches `targetToOsCpu` so the drift is
182
+ * obvious.
183
+ */
184
+ export function nodePlatformKey(triple) {
185
+ const t = triple.toLowerCase();
186
+ // napi-rs short form (`linux-x64-gnu`) already starts with the Node
187
+ // platform + arch; lop off the libc suffix if present.
188
+ for (const [prefix, key] of NAPI_PREFIXES) {
189
+ if (t.startsWith(prefix)) {
190
+ return key;
191
+ }
192
+ }
193
+ // Rust target triples — explicit lookup.
194
+ const rust = RUST_TARGET_KEYS[t];
195
+ if (rust === undefined) {
196
+ throw new Error(`write-launcher: target triple "${triple}" is not mapped to Node platform+arch`);
197
+ }
198
+ return rust;
199
+ }
200
+ const NAPI_PREFIXES = [
201
+ ['linux-x64', 'linux-x64'],
202
+ ['linux-arm64', 'linux-arm64'],
203
+ ['linux-arm-', 'linux-arm'],
204
+ ['darwin-x64', 'darwin-x64'],
205
+ ['darwin-arm64', 'darwin-arm64'],
206
+ ['win32-x64', 'win32-x64'],
207
+ ['win32-arm64', 'win32-arm64'],
208
+ ];
209
+ const RUST_TARGET_KEYS = {
210
+ 'x86_64-unknown-linux-gnu': 'linux-x64',
211
+ 'x86_64-unknown-linux-musl': 'linux-x64',
212
+ 'aarch64-unknown-linux-gnu': 'linux-arm64',
213
+ 'aarch64-unknown-linux-musl': 'linux-arm64',
214
+ 'armv7-unknown-linux-gnueabihf': 'linux-arm',
215
+ 'armv7-unknown-linux-musleabihf': 'linux-arm',
216
+ 'x86_64-apple-darwin': 'darwin-x64',
217
+ 'aarch64-apple-darwin': 'darwin-arm64',
218
+ 'x86_64-pc-windows-msvc': 'win32-x64',
219
+ 'aarch64-pc-windows-msvc': 'win32-arm64',
220
+ };
221
+ function jsString(s) {
222
+ return `'${s.replaceAll('\\', '\\\\').replaceAll("'", "\\'")}'`;
223
+ }
224
+ /** 2 / 4 / tab. Defaults to 2 when undetectable. Mirrors npm.ts. */
225
+ export function detectIndent(source) {
226
+ const m = /^(?<indent>[ \t]+)"/m.exec(source);
227
+ if (!m?.groups?.indent) {
228
+ return 2;
229
+ }
230
+ const indent = m.groups.indent;
231
+ if (indent.includes('\t')) {
232
+ return '\t';
233
+ }
234
+ return indent.length;
235
+ }
236
+ //# sourceMappingURL=write-launcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-launcher.js","sourceRoot":"","sources":["../src/write-launcher.ts"],"names":[],"mappings":"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"}
@@ -83,8 +83,9 @@ export function writeVersionForBuild(pkgDir, version) {
83
83
  throw err;
84
84
  }
85
85
  const cargoUpdated = replaceCargoVersion(cargoOriginal, version);
86
- if (cargoUpdated !== cargoOriginal)
86
+ if (cargoUpdated !== cargoOriginal) {
87
87
  writeFileSync(cargoPath, cargoUpdated, 'utf8');
88
+ }
88
89
  return [cargoPath];
89
90
  }
90
91
  function isDynamicVersion(project) {
@@ -1 +1 @@
1
- {"version":3,"file":"write-version.js","sourceRoot":"","sources":["../src/write-version.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"write-version.js","sourceRoot":"","sources":["../src/write-version.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "putitoutthere",
3
- "version": "0.2.28",
3
+ "version": "0.2.30",
4
4
  "description": "Polyglot release orchestrator for crates.io, PyPI, and npm",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -38,10 +38,12 @@
38
38
  "test:unit": "vitest run",
39
39
  "test:unit:watch": "vitest",
40
40
  "test:unit:coverage": "vitest run --coverage",
41
- "test:integration": "vitest run --config test/integration/vitest.integration.config.ts"
41
+ "test:integration": "vitest run --config test/integration/vitest.integration.config.ts",
42
+ "test:e2e": "pnpm build && vitest run --config test/e2e/vitest.e2e.config.ts"
42
43
  },
43
44
  "devDependencies": {
44
45
  "@eslint/js": "^10.0.1",
46
+ "@stylistic/eslint-plugin": "^5.10.0",
45
47
  "@types/node": "^25.6.0",
46
48
  "@vercel/ncc": "^0.38.0",
47
49
  "@vitest/coverage-v8": "^2.1.0",