gitverse-release 3.4.0 → 3.6.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/dist/index.js CHANGED
@@ -18,12 +18,52 @@ var __toESM = (mod, isNodeMode, target) => {
18
18
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
19
19
 
20
20
  // src/index.ts
21
- import { resolve as resolve2 } from "node:path";
21
+ import { resolve as resolve4 } from "node:path";
22
22
 
23
23
  // src/config.ts
24
- import { readFile } from "node:fs/promises";
24
+ import { access, readFile, writeFile } from "node:fs/promises";
25
25
  import { resolve } from "node:path";
26
+ import { parse as parseJsonc } from "jsonc-parser";
27
+ var DEFAULT_CONFIG_FILE_NAME = ".gitversereleaserc.jsonc";
28
+ var CONFIG_FILE_NAMES = [".gitversereleaserc.jsonc", ".gitversereleaserc.json"];
29
+ async function fileExists(path) {
30
+ try {
31
+ await access(path);
32
+ return true;
33
+ } catch {
34
+ return false;
35
+ }
36
+ }
37
+ async function findConfigFile(directory) {
38
+ for (const fileName of CONFIG_FILE_NAMES) {
39
+ const fullPath = resolve(directory, fileName);
40
+ if (await fileExists(fullPath)) {
41
+ return fullPath;
42
+ }
43
+ }
44
+ return null;
45
+ }
46
+ var DEFAULT_BINARY_PLATFORMS = [
47
+ "linux-x64",
48
+ "linux-arm64",
49
+ "darwin-x64",
50
+ "darwin-arm64",
51
+ "win32-x64"
52
+ ];
53
+ var DEFAULT_BINARIES_CONFIG = {
54
+ continueOnError: false,
55
+ distDir: "./dist",
56
+ enabled: false,
57
+ mainPackage: "./package.json",
58
+ name: "",
59
+ outDir: "./npm",
60
+ platforms: DEFAULT_BINARY_PLATFORMS,
61
+ publishCommand: "npm publish --access public",
62
+ retryAttempts: 3,
63
+ scope: ""
64
+ };
26
65
  var DEFAULT_CONFIG = {
66
+ binaries: DEFAULT_BINARIES_CONFIG,
27
67
  changelog: {
28
68
  showAuthor: true,
29
69
  showHash: true,
@@ -87,11 +127,18 @@ var DEFAULT_CONFIG = {
87
127
  }
88
128
  };
89
129
  async function loadConfig(configPath) {
90
- const path = configPath || ".gitversereleaserc.json";
91
- const fullPath = resolve(process.cwd(), path);
130
+ let fullPath;
131
+ if (configPath) {
132
+ fullPath = resolve(process.cwd(), configPath);
133
+ } else {
134
+ fullPath = await findConfigFile(process.cwd());
135
+ }
136
+ if (!fullPath) {
137
+ return DEFAULT_CONFIG;
138
+ }
92
139
  try {
93
140
  const content = await readFile(fullPath, "utf-8");
94
- const userConfig = JSON.parse(content);
141
+ const userConfig = parseJsonc(content);
95
142
  return mergeConfig(DEFAULT_CONFIG, userConfig);
96
143
  } catch (error) {
97
144
  if (error instanceof Error && "code" in error && error.code === "ENOENT") {
@@ -102,6 +149,10 @@ async function loadConfig(configPath) {
102
149
  }
103
150
  function mergeConfig(defaults, user) {
104
151
  return {
152
+ binaries: {
153
+ ...defaults.binaries,
154
+ ...user.binaries
155
+ },
105
156
  changelog: {
106
157
  ...defaults.changelog,
107
158
  ...user.changelog,
@@ -146,163 +197,157 @@ function validateConfig(config) {
146
197
  }
147
198
  }
148
199
  }
149
-
150
- // ../sdk/dist/api/organizations.js
151
- class k {
152
- client;
153
- constructor(b) {
154
- this.client = b;
155
- }
156
- async checkMembership(b, h, j) {
157
- try {
158
- return await this.client.get(`/orgs/${b}/members/${h}`, j), true;
159
- } catch (d) {
160
- if (d instanceof Error && d.message.includes("404"))
161
- return false;
162
- throw d;
163
- }
164
- }
165
- }
166
-
167
- // ../sdk/dist/api/commits.js
168
- class j {
169
- client;
170
- constructor(b) {
171
- this.client = b;
172
- }
173
- list(b, d, f) {
174
- return this.client.get(`/repos/${b}/${d}/commits`, f);
175
- }
176
- get(b, d, f, g) {
177
- return this.client.get(`/repos/${b}/${d}/commits/${f}`, g);
178
- }
179
- create(b, d, f, g) {
180
- return this.client.post(`/repos/${b}/${d}/git/commits`, f, g);
181
- }
182
- }
183
-
184
- // ../sdk/dist/api/actions.js
185
- class x {
186
- client;
187
- constructor(b) {
188
- this.client = b;
189
- }
190
- listOrgRunners(b, h) {
191
- return this.client.get(`/orgs/${b}/actions/runners`, h);
192
- }
193
- createOrgRegistrationToken(b, h) {
194
- return this.client.post(`/orgs/${b}/actions/runners/registration-token`, {}, h);
195
- }
196
- getOrgRunner(b, h, j2) {
197
- return this.client.get(`/orgs/${b}/actions/runners/${h}`, j2);
198
- }
199
- deleteOrgRunner(b, h, j2) {
200
- return this.client.delete(`/orgs/${b}/actions/runners/${h}`, undefined, j2);
201
- }
202
- listRepoRunners(b, h, j2) {
203
- return this.client.get(`/repos/${b}/${h}/actions/runners`, j2);
204
- }
205
- createRepoRegistrationToken(b, h, j2) {
206
- return this.client.post(`/repos/${b}/${h}/actions/runners/registration-token`, {}, j2);
207
- }
208
- getRepoRunner(b, h, j2, q) {
209
- return this.client.get(`/repos/${b}/${h}/actions/runners/${j2}`, q);
210
- }
211
- deleteRepoRunner(b, h, j2, q) {
212
- return this.client.delete(`/repos/${b}/${h}/actions/runners/${j2}`, undefined, q);
213
- }
214
- listOrgSecrets(b, h) {
215
- return this.client.get(`/orgs/${b}/actions/secrets`, h);
216
- }
217
- getOrgSecret(b, h, j2) {
218
- return this.client.get(`/orgs/${b}/actions/secrets/${h}`, j2);
219
- }
220
- createOrUpdateOrgSecret(b, h, j2, q) {
221
- return this.client.put(`/orgs/${b}/actions/secrets/${h}`, j2, q);
222
- }
223
- deleteOrgSecret(b, h, j2) {
224
- return this.client.delete(`/orgs/${b}/actions/secrets/${h}`, undefined, j2);
225
- }
226
- listRepoSecrets(b, h, j2) {
227
- return this.client.get(`/repos/${b}/${h}/actions/secrets`, j2);
228
- }
229
- getRepoSecret(b, h, j2, q) {
230
- return this.client.get(`/repos/${b}/${h}/actions/secrets/${j2}`, q);
231
- }
232
- createOrUpdateRepoSecret(b, h, j2, q, v) {
233
- return this.client.put(`/repos/${b}/${h}/actions/secrets/${j2}`, q, v);
234
- }
235
- deleteRepoSecret(b, h, j2, q) {
236
- return this.client.delete(`/repos/${b}/${h}/actions/secrets/${j2}`, undefined, q);
237
- }
238
- listOrgVariables(b, h) {
239
- return this.client.get(`/orgs/${b}/actions/variables`, h);
240
- }
241
- createOrgVariable(b, h, j2) {
242
- return this.client.post(`/orgs/${b}/actions/variables`, h, j2);
243
- }
244
- getOrgVariable(b, h, j2) {
245
- return this.client.get(`/orgs/${b}/actions/variables/${h}`, j2);
246
- }
247
- deleteOrgVariable(b, h, j2) {
248
- return this.client.delete(`/orgs/${b}/actions/variables/${h}`, undefined, j2);
249
- }
250
- updateOrgVariable(b, h, j2, q) {
251
- return this.client.patch(`/orgs/${b}/actions/variables/${h}`, j2, q);
252
- }
253
- listRepoVariables(b, h, j2) {
254
- return this.client.get(`/repos/${b}/${h}/actions/variables`, j2);
255
- }
256
- createRepoVariable(b, h, j2, q) {
257
- return this.client.post(`/repos/${b}/${h}/actions/variables`, j2, q);
258
- }
259
- getRepoVariable(b, h, j2, q) {
260
- return this.client.get(`/repos/${b}/${h}/actions/variables/${j2}`, q);
261
- }
262
- deleteRepoVariable(b, h, j2, q) {
263
- return this.client.delete(`/repos/${b}/${h}/actions/variables/${j2}`, undefined, q);
200
+ var SAFE_NAME_REGEX = /^[a-zA-Z0-9_.-]+$/;
201
+ var SAFE_SCOPE_REGEX = /^@?[a-zA-Z0-9_-]+$/;
202
+ function validateBinariesConfig(config) {
203
+ if (!config.enabled) {
204
+ return;
264
205
  }
265
- updateRepoVariable(b, h, j2, q, v) {
266
- return this.client.patch(`/repos/${b}/${h}/actions/variables/${j2}`, q, v);
206
+ if (!config.scope) {
207
+ throw new Error("Binaries config: scope is required when enabled");
267
208
  }
268
- listArtifacts(b, h, j2) {
269
- return this.client.get(`/repos/${b}/${h}/actions/artifacts`, j2);
209
+ if (!SAFE_SCOPE_REGEX.test(config.scope)) {
210
+ throw new Error(`Binaries config: scope "${config.scope}" contains invalid characters. ` + "Only letters, numbers, underscore, hyphen are allowed.");
270
211
  }
271
- getArtifact(b, h, j2, q) {
272
- return this.client.get(`/repos/${b}/${h}/actions/artifacts/${j2}`, q);
212
+ if (!config.name) {
213
+ throw new Error("Binaries config: name is required when enabled");
273
214
  }
274
- deleteArtifact(b, h, j2, q) {
275
- return this.client.delete(`/repos/${b}/${h}/actions/artifacts/${j2}`, undefined, q);
215
+ if (!SAFE_NAME_REGEX.test(config.name)) {
216
+ throw new Error(`Binaries config: name "${config.name}" contains invalid characters. ` + "Only letters, numbers, underscore, hyphen, dot are allowed.");
276
217
  }
277
- downloadArtifact(b, h, j2, q) {
278
- return this.client.get(`/repos/${b}/${h}/actions/artifacts/${j2}/zip`, q);
218
+ if (!config.platforms || config.platforms.length === 0) {
219
+ throw new Error("Binaries config: at least one platform is required");
279
220
  }
280
- downloadArtifactRaw(b, h, j2, q) {
281
- return this.client.get(`/repos/${b}/${h}/actions/artifacts/${j2}/zip/raw`, q);
221
+ const validPlatforms = [
222
+ "linux-x64",
223
+ "linux-arm64",
224
+ "darwin-x64",
225
+ "darwin-arm64",
226
+ "win32-x64",
227
+ "win32-arm64"
228
+ ];
229
+ for (const platform of config.platforms) {
230
+ if (!validPlatforms.includes(platform)) {
231
+ throw new Error(`Binaries config: invalid platform "${platform}". Valid: ${validPlatforms.join(", ")}`);
232
+ }
282
233
  }
283
- getWorkflowDispatchInputs(b, h, j2, q) {
284
- return this.client.get(`/repos/${b}/${h}/actions/workflows/${j2}/dispatches`, q);
234
+ if (config.retryAttempts < 1 || config.retryAttempts > 10) {
235
+ throw new Error("Binaries config: retryAttempts must be between 1 and 10");
236
+ }
237
+ }
238
+ function configExists() {
239
+ return findConfigFile(process.cwd());
240
+ }
241
+ function generateConfigContent(options = {}) {
242
+ const lines = [];
243
+ lines.push("{");
244
+ lines.push(" // JSON Schema для автодополнения и валидации в IDE");
245
+ lines.push(' "$schema": "node_modules/gitverse-release/schema.json",');
246
+ lines.push("");
247
+ lines.push(" // Настройки генерации CHANGELOG");
248
+ lines.push(' "changelog": {');
249
+ lines.push(' "showAuthor": true,');
250
+ lines.push(' "showHash": true,');
251
+ lines.push(' "types": {');
252
+ lines.push(' "feat": "✨ Features",');
253
+ lines.push(' "fix": "\uD83D\uDC1B Bug Fixes",');
254
+ lines.push(' "docs": "\uD83D\uDCDD Documentation",');
255
+ lines.push(' "style": "\uD83D\uDC84 Styles",');
256
+ lines.push(' "refactor": "♻️ Refactoring",');
257
+ lines.push(' "perf": "⚡ Performance",');
258
+ lines.push(' "test": "✅ Tests",');
259
+ lines.push(' "build": "\uD83C\uDFD7️ Build System",');
260
+ lines.push(' "ci": "\uD83D\uDC77 CI/CD",');
261
+ lines.push(' "chore": "\uD83D\uDD27 Chores",');
262
+ lines.push(' "revert": "⏪ Reverts"');
263
+ lines.push(" }");
264
+ lines.push(" },");
265
+ lines.push("");
266
+ const scopes = options.scopes ?? ["deps", "ci", "docs"];
267
+ lines.push(" // Настройки генерации commitlint конфига");
268
+ lines.push(' "commitlint": {');
269
+ lines.push(` "scopes": ${JSON.stringify(scopes)},`);
270
+ lines.push(' "scopeRequired": false,');
271
+ lines.push(' "headerMaxLength": 100');
272
+ lines.push(" },");
273
+ lines.push("");
274
+ lines.push(" // Настройки Git операций");
275
+ lines.push(' "git": {');
276
+ lines.push(' "commitChanges": true,');
277
+ lines.push(' "commitMessage": "chore(release): v{{version}} [skip ci]",');
278
+ lines.push(' "push": true,');
279
+ lines.push(' "tagMessage": "v{{version}}"');
280
+ lines.push(' // beforeCommit: "bun run format" // Раскомментируйте для форматирования перед коммитом');
281
+ lines.push(" },");
282
+ lines.push("");
283
+ lines.push(" // Настройки GitVerse Release API");
284
+ lines.push(" // Требует переменную окружения GITVERSE_TOKEN");
285
+ lines.push(' "gitverse": {');
286
+ lines.push(' "enabled": true,');
287
+ lines.push(' "checkExisting": true,');
288
+ lines.push(' "failOnError": true');
289
+ lines.push(" },");
290
+ lines.push("");
291
+ lines.push(" // Настройки монорепо");
292
+ lines.push(' "monorepo": {');
293
+ lines.push(` "enabled": ${options.monorepo ?? false}`);
294
+ if (options.monorepo) {
295
+ lines.pop();
296
+ lines.push(` "enabled": true,`);
297
+ lines.push(' "packages": [');
298
+ lines.push(" // Пример конфигурации пакета:");
299
+ lines.push(" // {");
300
+ lines.push(' // "name": "sdk",');
301
+ lines.push(' // "path": "packages/sdk",');
302
+ lines.push(' // "packageName": "my-sdk",');
303
+ lines.push(' // "tagPrefix": "v"');
304
+ lines.push(" // }");
305
+ lines.push(" ]");
306
+ }
307
+ lines.push(" },");
308
+ lines.push("");
309
+ lines.push(" // Настройки версионирования");
310
+ lines.push(' "versioning": {');
311
+ lines.push(' "tagPrefix": "v",');
312
+ lines.push(' "prereleasePrefix": "beta"');
313
+ lines.push(" }");
314
+ lines.push("}");
315
+ return lines.join(`
316
+ `);
317
+ }
318
+ async function initConfig(options = {}) {
319
+ const existingConfig = await configExists();
320
+ if (existingConfig) {
321
+ throw new Error(`Config file already exists: ${existingConfig}`);
285
322
  }
286
- dispatchWorkflow(b, h, j2, q, v) {
287
- return this.client.post(`/repos/${b}/${h}/actions/workflows/${j2}/dispatches`, q, v);
323
+ const content = generateConfigContent(options);
324
+ const filePath = resolve(process.cwd(), DEFAULT_CONFIG_FILE_NAME);
325
+ if (options.dryRun) {
326
+ console.log(`
327
+ \uD83D\uDD0D Dry-run mode - Would create: ${filePath}
328
+ `);
329
+ console.log(content);
330
+ return filePath;
288
331
  }
332
+ await writeFile(filePath, content, "utf-8");
333
+ return filePath;
289
334
  }
290
335
 
291
336
  // ../sdk/dist/errors.js
292
- class j2 extends Error {
337
+ class j extends Error {
293
338
  status;
294
339
  metadata;
295
340
  constructor(b, f, h) {
296
341
  super(f);
297
- this.name = "GitVerseApiError", this.status = b, this.metadata = h, Object.setPrototypeOf(this, j2.prototype);
342
+ this.name = "GitVerseApiError", this.status = b, this.metadata = h, Object.setPrototypeOf(this, j.prototype);
298
343
  }
299
344
  }
300
345
 
301
- class k2 extends j2 {
346
+ class k extends j {
302
347
  rateLimit;
303
348
  constructor(b, f, h) {
304
349
  super(429, b, h);
305
- this.name = "RateLimitError", this.rateLimit = f, Object.setPrototypeOf(this, k2.prototype);
350
+ this.name = "RateLimitError", this.rateLimit = f, Object.setPrototypeOf(this, k.prototype);
306
351
  }
307
352
  getRetryAfterSeconds() {
308
353
  return this.rateLimit.retryAfter;
@@ -327,411 +372,746 @@ class q {
327
372
  }
328
373
  }
329
374
 
330
- // ../sdk/dist/api/stars.js
331
- class k3 {
332
- client;
333
- constructor(b) {
334
- this.client = b;
335
- }
336
- list(b) {
337
- return this.client.get("/user/starred", b);
338
- }
339
- async add(b, c, f) {
340
- await this.client.put(`/user/starred/${b}/${c}`, undefined, f);
341
- }
342
- async check(b, c, f) {
343
- try {
344
- return await this.client.get(`/user/starred/${b}/${c}`, f), true;
345
- } catch (h) {
346
- if (h instanceof j2 && h.status === 404)
347
- return false;
348
- throw h;
349
- }
350
- }
351
- async remove(b, c, f) {
352
- await this.client.delete(`/user/starred/${b}/${c}`, undefined, f);
353
- }
354
- }
375
+ // ../sdk/dist/client.js
376
+ var Z = { DELETE: "DELETE", GET: "GET", PATCH: "PATCH", POST: "POST", PUT: "PUT" };
355
377
 
356
- // ../sdk/dist/api/issues.js
357
- class B {
358
- client;
359
- constructor(c) {
360
- this.client = c;
361
- }
362
- list(c, h, f, j3) {
363
- let k4 = new URLSearchParams;
364
- if (f)
365
- k4.append("state", f);
366
- let z = k4.toString(), A = `/repos/${c}/${h}/issues${z ? `?${z}` : ""}`;
367
- return this.client.get(A, j3);
368
- }
369
- get(c, h, f, j3) {
370
- return this.client.get(`/repos/${c}/${h}/issues/${f}`, j3);
371
- }
372
- getComment(c, h, f, j3) {
373
- return this.client.get(`/repos/${c}/${h}/issues/comments/${f}`, j3);
374
- }
375
- getComments(c, h, f, j3) {
376
- return this.client.get(`/repos/${c}/${h}/issues/${f}/comments`, j3);
377
- }
378
- getLabels(c, h, f, j3) {
379
- return this.client.get(`/repos/${c}/${h}/issues/${f}/labels`, j3);
378
+ class v {
379
+ baseUrl;
380
+ token;
381
+ apiVersion;
382
+ onApiVersionWarning;
383
+ constructor(j2 = {}) {
384
+ this.baseUrl = j2.baseUrl || "https://api.gitverse.ru", this.token = j2.token, this.apiVersion = j2.apiVersion || "1";
380
385
  }
381
- getTimeline(c, h, f, j3) {
382
- return this.client.get(`/repos/${c}/${h}/issues/${f}/timeline`, j3);
386
+ setToken(j2) {
387
+ this.token = j2;
383
388
  }
384
- }
385
-
386
- // ../sdk/dist/api/branches.js
387
- class g {
388
- client;
389
- constructor(b) {
390
- this.client = b;
389
+ extractRateLimitInfo(j2) {
390
+ let x = j2.get("GitVerse-RateLimit-Limit"), q2 = j2.get("GitVerse-RateLimit-User-Remaining") || j2.get("GitVerse-RateLimit-Remaining"), z = j2.get("GitVerse-RateLimit-Retry-After"), F = j2.get("Gitverse-Ratelimit-Reset");
391
+ if (!(x && z))
392
+ return;
393
+ let U = Number.parseInt(z, 10), J = F ? Number.parseInt(F, 10) : Math.floor(Date.now() / 1000) + U, K = q2 ? Number.parseInt(q2, 10) : 0;
394
+ return { limit: Number.parseInt(x, 10), remaining: K, reset: J, retryAfter: U };
391
395
  }
392
- list(b, d, f) {
393
- return this.client.get(`/repos/${b}/${d}/branches`, f);
396
+ extractApiVersionInfo(j2) {
397
+ let x = j2.get("Gitverse-Api-Version"), q2 = j2.get("Gitverse-Api-Latest-Version"), z = j2.get("Gitverse-Api-Deprecation") === "true", F = j2.get("Gitverse-Api-Decommissioning");
398
+ if (!(x && q2))
399
+ return;
400
+ return { decommissioning: F || undefined, deprecated: z, latestVersion: q2, version: x };
394
401
  }
395
- }
396
-
397
- // ../sdk/dist/utils.js
398
- var z = /^([a-z][a-z0-9+.-]*:\/\/[^/]+)\/([a-z][a-z0-9+.-]*:\/\/.+)$/i;
399
- function E(j3) {
400
- if (!j3)
401
- return j3;
402
- let k4 = j3.match(z);
403
- if (k4?.[1] && k4?.[2]) {
404
- let q2 = k4[1], v = k4[2];
405
- if (v.startsWith(q2))
406
- return v;
407
- }
408
- return j3;
409
- }
410
- function J(j3) {
411
- let k4 = ["clone_url", "html_url", "url", "git_url", "mirror_url"], q2 = { ...j3 };
412
- for (let v of k4)
413
- if (typeof q2[v] === "string")
414
- q2[v] = E(q2[v]);
415
- return q2;
416
- }
417
-
418
- // ../sdk/dist/api/repositories.js
419
- class A {
420
- client;
421
- constructor(g2) {
422
- this.client = g2;
402
+ extractMetadata(j2) {
403
+ let x = this.extractRateLimitInfo(j2), q2 = this.extractApiVersionInfo(j2);
404
+ if (q2?.deprecated && this.onApiVersionWarning) {
405
+ let z = new q(q2.version, q2.latestVersion, q2.decommissioning);
406
+ this.onApiVersionWarning(z);
407
+ }
408
+ return { apiVersion: q2, rateLimit: x };
423
409
  }
424
- async get(g2, k4, j3) {
425
- let q2 = await this.client.get(`/repos/${g2}/${k4}`, j3);
426
- return J(q2);
410
+ async request(j2, x, q2, z) {
411
+ let F = j2.startsWith("/") ? j2.slice(1) : j2, U = `${this.baseUrl}/${F}`, J = new Headers;
412
+ if (J.set("Content-Type", "application/json"), J.set("Accept", `application/vnd.gitverse.object+json; version=${this.apiVersion}`), this.token)
413
+ J.set("Authorization", `Bearer ${this.token}`);
414
+ let K = { body: q2 ? JSON.stringify(q2) : undefined, headers: J, method: x, signal: z?.signal }, C = await fetch(U, K), X = this.extractMetadata(C.headers), Y;
415
+ try {
416
+ Y = await C.json();
417
+ } catch {
418
+ Y = undefined;
419
+ }
420
+ if (!C.ok) {
421
+ let S = Y?.message || C.statusText;
422
+ if (C.status === 429 && X.rateLimit)
423
+ throw new k(S || "Превышен лимит запросов. Попробуйте позже.", X.rateLimit, X);
424
+ throw new j(C.status, S, X);
425
+ }
426
+ return Y;
427
427
  }
428
- delete(g2, k4, j3) {
429
- return this.client.delete(`/repos/${g2}/${k4}`, undefined, j3);
428
+ get(j2, x) {
429
+ return this.request(j2, Z.GET, undefined, x);
430
430
  }
431
- async update(g2, k4, j3, q2) {
432
- let z2 = await this.client.patch(`/repos/${g2}/${k4}`, j3, q2);
433
- return J(z2);
431
+ post(j2, x, q2) {
432
+ return this.request(j2, Z.POST, x, q2);
434
433
  }
435
- compare(g2, k4, j3, q2) {
436
- return this.client.get(`/repos/${g2}/${k4}/compare/${j3}`, q2);
434
+ put(j2, x, q2) {
435
+ return this.request(j2, Z.PUT, x, q2);
437
436
  }
438
- getLanguages(g2, k4, j3) {
439
- return this.client.get(`/repos/${g2}/${k4}/languages`, j3);
437
+ delete(j2, x, q2) {
438
+ return this.request(j2, Z.DELETE, x, q2);
440
439
  }
441
- async listForAuthenticatedUser(g2) {
442
- return (await this.client.get("/user/repos", g2)).map((j3) => J(j3));
440
+ patch(j2, x, q2) {
441
+ return this.request(j2, Z.PATCH, x, q2);
443
442
  }
444
- async create(g2, k4) {
445
- let j3 = await this.client.post("/user/repos", g2, k4);
446
- return J(j3);
443
+ async uploadFile(j2, x, q2, z, F) {
444
+ let U = j2.startsWith("/") ? j2.slice(1) : j2, J = `${this.baseUrl}/${U}`, K = new Headers;
445
+ if (K.set("Accept", `application/vnd.gitverse.object+json; version=${this.apiVersion}`), this.token)
446
+ K.set("Authorization", `Bearer ${this.token}`);
447
+ let C = new FormData, X = q2 instanceof ArrayBuffer ? new Blob([q2]) : q2;
448
+ C.append(x, X, z);
449
+ let Y = { body: C, headers: K, method: Z.POST, signal: F?.signal }, Q = await fetch(J, Y), S = this.extractMetadata(Q.headers), _;
450
+ try {
451
+ _ = await Q.json();
452
+ } catch {
453
+ _ = undefined;
454
+ }
455
+ if (!Q.ok) {
456
+ let W = _?.message || Q.statusText;
457
+ if (Q.status === 429 && S.rateLimit)
458
+ throw new k(W || "Превышен лимит запросов. Попробуйте позже.", S.rateLimit, S);
459
+ throw new j(Q.status, W, S);
460
+ }
461
+ return _;
447
462
  }
448
463
  }
449
464
 
450
- // ../sdk/dist/api/collaborators.js
451
- class j3 {
465
+ // ../sdk/dist/api/issues.js
466
+ class E {
452
467
  client;
453
- constructor(d) {
454
- this.client = d;
455
- }
456
- list(d, f, g2) {
457
- return this.client.get(`/repos/${d}/${f}/collaborators`, g2);
458
- }
459
- add(d, f, g2, h) {
460
- return this.client.put(`/repos/${d}/${f}/collaborators/${g2}`, {}, h);
468
+ constructor(k2) {
469
+ this.client = k2;
470
+ }
471
+ list(k2, A, b, f) {
472
+ let j2 = new URLSearchParams;
473
+ if (b?.state !== undefined)
474
+ j2.append("state", b.state);
475
+ if (b?.q !== undefined)
476
+ j2.append("q", b.q);
477
+ if (b?.labels !== undefined)
478
+ j2.append("labels", b.labels);
479
+ if (b?.milestones !== undefined)
480
+ j2.append("milestones", b.milestones);
481
+ if (b?.created_by !== undefined)
482
+ j2.append("created_by", b.created_by);
483
+ if (b?.assigned_by !== undefined)
484
+ j2.append("assigned_by", b.assigned_by);
485
+ if (b?.mentioned_by !== undefined)
486
+ j2.append("mentioned_by", b.mentioned_by);
487
+ if (b?.type !== undefined)
488
+ j2.append("type", b.type);
489
+ if (b?.since !== undefined)
490
+ j2.append("since", b.since);
491
+ if (b?.before !== undefined)
492
+ j2.append("before", b.before);
493
+ if (b?.page !== undefined)
494
+ j2.append("page", String(b.page));
495
+ if (b?.per_page !== undefined)
496
+ j2.append("per_page", String(b.per_page));
497
+ let z = j2.toString(), B = `/repos/${k2}/${A}/issues${z ? `?${z}` : ""}`;
498
+ return this.client.get(B, f);
499
+ }
500
+ getComment(k2, A, b, f) {
501
+ return this.client.get(`/repos/${k2}/${A}/issues/comments/${b}`, f);
502
+ }
503
+ get(k2, A, b, f) {
504
+ return this.client.get(`/repos/${k2}/${A}/issues/${b}`, f);
505
+ }
506
+ listComments(k2, A, b, f, j2) {
507
+ let z = new URLSearchParams;
508
+ if (f?.since !== undefined)
509
+ z.append("since", f.since);
510
+ if (f?.before !== undefined)
511
+ z.append("before", f.before);
512
+ let B = z.toString(), D = `/repos/${k2}/${A}/issues/${b}/comments${B ? `?${B}` : ""}`;
513
+ return this.client.get(D, j2);
514
+ }
515
+ listLabels(k2, A, b, f) {
516
+ return this.client.get(`/repos/${k2}/${A}/issues/${b}/labels`, f);
517
+ }
518
+ listTimeline(k2, A, b, f, j2) {
519
+ let z = new URLSearchParams;
520
+ if (f?.page !== undefined)
521
+ z.append("page", String(f.page));
522
+ if (f?.per_page !== undefined)
523
+ z.append("per_page", String(f.per_page));
524
+ if (f?.since !== undefined)
525
+ z.append("since", f.since);
526
+ if (f?.before !== undefined)
527
+ z.append("before", f.before);
528
+ let B = z.toString(), D = `/repos/${k2}/${A}/issues/${b}/timeline${B ? `?${B}` : ""}`;
529
+ return this.client.get(D, j2);
461
530
  }
462
531
  }
463
532
 
464
- // ../sdk/dist/api/contents.js
465
- class k4 {
533
+ // ../sdk/dist/api/emails.js
534
+ class x {
466
535
  client;
467
536
  constructor(b) {
468
537
  this.client = b;
469
538
  }
470
- get(b, d, f, g2) {
471
- return this.client.get(`/repos/${b}/${d}/contents/${f}`, g2);
472
- }
473
- createFile(b, d, f, g2, j4) {
474
- return this.client.put(`/repos/${b}/${d}/contents/${f}`, g2, j4);
539
+ list(b, f) {
540
+ let j2 = new URLSearchParams;
541
+ if (b?.page !== undefined)
542
+ j2.append("page", String(b.page));
543
+ if (b?.per_page !== undefined)
544
+ j2.append("per_page", String(b.per_page));
545
+ let k2 = j2.toString(), w = `/user/emails${k2 ? `?${k2}` : ""}`;
546
+ return this.client.get(w, f);
475
547
  }
476
- updateFile(b, d, f, g2, j4) {
477
- return this.client.put(`/repos/${b}/${d}/contents/${f}`, g2, j4);
548
+ create(b, f) {
549
+ return this.client.post("/user/emails", b, f);
478
550
  }
479
- deleteFile(b, d, f, g2, j4) {
480
- return this.client.delete(`/repos/${b}/${d}/contents/${f}`, g2, j4);
551
+ delete(b, f) {
552
+ return this.client.delete("/user/emails", b, f);
481
553
  }
482
554
  }
483
555
 
484
- // ../sdk/dist/api/teams.js
485
- class k5 {
556
+ // ../sdk/dist/api/repositories.js
557
+ class E2 {
486
558
  client;
487
- constructor(b) {
488
- this.client = b;
489
- }
490
- list(b, d) {
491
- return this.client.get(`/orgs/${b}/teams`, d);
492
- }
493
- getInvitations(b, d, f) {
494
- return this.client.get(`/orgs/${b}/teams/${d}/invitations`, f);
495
- }
496
- getMembers(b, d, f) {
497
- return this.client.get(`/orgs/${b}/teams/${d}/members`, f);
498
- }
499
- addRepository(b, d, f, h, j4) {
500
- return this.client.put(`/orgs/${b}/teams/${d}/repos/${f}/${h}`, {}, j4);
559
+ constructor(k2) {
560
+ this.client = k2;
561
+ }
562
+ get(k2, x2, j2) {
563
+ return this.client.get(`/repos/${k2}/${x2}`, j2);
564
+ }
565
+ update(k2, x2, j2, v2) {
566
+ return this.client.patch(`/repos/${k2}/${x2}`, j2, v2);
567
+ }
568
+ delete(k2, x2, j2) {
569
+ return this.client.delete(`/repos/${k2}/${x2}`, undefined, j2);
570
+ }
571
+ listRepoSecrets(k2, x2, j2, v2) {
572
+ let z = new URLSearchParams;
573
+ if (j2?.per_page !== undefined)
574
+ z.append("per_page", j2.per_page);
575
+ if (j2?.page !== undefined)
576
+ z.append("page", j2.page);
577
+ let A = z.toString(), B = `/repos/${k2}/${x2}/actions/secrets${A ? `?${A}` : ""}`;
578
+ return this.client.get(B, v2);
579
+ }
580
+ getRepoSecret(k2, x2, j2, v2) {
581
+ return this.client.get(`/repos/${k2}/${x2}/actions/secrets/${j2}`, v2);
582
+ }
583
+ createOrUpdateRepoSecret(k2, x2, j2, v2, z) {
584
+ let A = new URLSearchParams;
585
+ if (v2?.encrypted_value !== undefined)
586
+ A.append("encrypted_value", v2.encrypted_value);
587
+ let B = A.toString(), D = `/repos/${k2}/${x2}/actions/secrets/${j2}${B ? `?${B}` : ""}`;
588
+ return this.client.put(D, z);
589
+ }
590
+ deleteRepoSecret(k2, x2, j2, v2) {
591
+ return this.client.delete(`/repos/${k2}/${x2}/actions/secrets/${j2}`, undefined, v2);
592
+ }
593
+ listBranches(k2, x2, j2, v2) {
594
+ let z = new URLSearchParams;
595
+ if (j2?.page !== undefined)
596
+ z.append("page", String(j2.page));
597
+ if (j2?.per_page !== undefined)
598
+ z.append("per_page", String(j2.per_page));
599
+ if (j2?.q !== undefined)
600
+ z.append("q", j2.q);
601
+ let A = z.toString(), B = `/repos/${k2}/${x2}/branches${A ? `?${A}` : ""}`;
602
+ return this.client.get(B, v2);
603
+ }
604
+ listCollaborators(k2, x2, j2, v2) {
605
+ let z = new URLSearchParams;
606
+ if (j2?.affiliation !== undefined)
607
+ z.append("affiliation", j2.affiliation);
608
+ if (j2?.permission !== undefined)
609
+ z.append("permission", j2.permission);
610
+ if (j2?.page !== undefined)
611
+ z.append("page", String(j2.page));
612
+ if (j2?.per_page !== undefined)
613
+ z.append("per_page", String(j2.per_page));
614
+ let A = z.toString(), B = `/repos/${k2}/${x2}/collaborators${A ? `?${A}` : ""}`;
615
+ return this.client.get(B, v2);
616
+ }
617
+ addCollaborator(k2, x2, j2, v2, z) {
618
+ return this.client.put(`/repos/${k2}/${x2}/collaborators/${j2}`, v2, z);
619
+ }
620
+ listCommits(k2, x2, j2, v2) {
621
+ let z = new URLSearchParams;
622
+ if (j2?.page !== undefined)
623
+ z.append("page", String(j2.page));
624
+ if (j2?.per_page !== undefined)
625
+ z.append("per_page", String(j2.per_page));
626
+ if (j2?.sha !== undefined)
627
+ z.append("sha", j2.sha);
628
+ if (j2?.path !== undefined)
629
+ z.append("path", j2.path);
630
+ if (j2?.not !== undefined)
631
+ z.append("not", j2.not);
632
+ if (j2?.author !== undefined)
633
+ z.append("author", j2.author);
634
+ if (j2?.committer !== undefined)
635
+ z.append("committer", j2.committer);
636
+ if (j2?.since !== undefined)
637
+ z.append("since", j2.since);
638
+ if (j2?.until !== undefined)
639
+ z.append("until", j2.until);
640
+ let A = z.toString(), B = `/repos/${k2}/${x2}/commits${A ? `?${A}` : ""}`;
641
+ return this.client.get(B, v2);
642
+ }
643
+ getCommit(k2, x2, j2, v2) {
644
+ return this.client.get(`/repos/${k2}/${x2}/commits/${j2}`, v2);
645
+ }
646
+ compareCommits(k2, x2, j2, v2, z) {
647
+ let A = new URLSearchParams;
648
+ if (v2?.page !== undefined)
649
+ A.append("page", String(v2.page));
650
+ if (v2?.per_page !== undefined)
651
+ A.append("per_page", String(v2.per_page));
652
+ let B = A.toString(), D = `/repos/${k2}/${x2}/compare/${j2}${B ? `?${B}` : ""}`;
653
+ return this.client.get(D, z);
654
+ }
655
+ getContent(k2, x2, j2, v2, z) {
656
+ let A = new URLSearchParams;
657
+ if (v2?.ref !== undefined)
658
+ A.append("ref", v2.ref);
659
+ if (v2?.scope !== undefined)
660
+ A.append("scope", v2.scope);
661
+ let B = A.toString(), D = `/repos/${k2}/${x2}/contents/${j2}${B ? `?${B}` : ""}`;
662
+ return this.client.get(D, z);
663
+ }
664
+ createOrUpdateFile(k2, x2, j2, v2, z) {
665
+ return this.client.put(`/repos/${k2}/${x2}/contents/${j2}`, v2, z);
666
+ }
667
+ deleteFile(k2, x2, j2, v2, z) {
668
+ return this.client.delete(`/repos/${k2}/${x2}/contents/${j2}`, v2, z);
669
+ }
670
+ createFork(k2, x2, j2, v2) {
671
+ return this.client.post(`/repos/${k2}/${x2}/forks`, j2, v2);
672
+ }
673
+ createCommit(k2, x2, j2, v2) {
674
+ return this.client.post(`/repos/${k2}/${x2}/git/commits`, j2, v2);
675
+ }
676
+ createRef(k2, x2, j2, v2) {
677
+ return this.client.post(`/repos/${k2}/${x2}/git/refs`, j2, v2);
678
+ }
679
+ createTree(k2, x2, j2, v2) {
680
+ return this.client.post(`/repos/${k2}/${x2}/git/trees`, j2, v2);
681
+ }
682
+ getTree(k2, x2, j2, v2, z) {
683
+ let A = new URLSearchParams;
684
+ if (v2?.page !== undefined)
685
+ A.append("page", String(v2.page));
686
+ if (v2?.per_page !== undefined)
687
+ A.append("per_page", String(v2.per_page));
688
+ if (v2?.recursive !== undefined)
689
+ A.append("recursive", String(v2.recursive));
690
+ let B = A.toString(), D = `/repos/${k2}/${x2}/git/trees/${j2}${B ? `?${B}` : ""}`;
691
+ return this.client.get(D, z);
692
+ }
693
+ listLanguages(k2, x2, j2) {
694
+ return this.client.get(`/repos/${k2}/${x2}/languages`, j2);
695
+ }
696
+ listPulls(k2, x2, j2, v2) {
697
+ let z = new URLSearchParams;
698
+ if (j2?.state !== undefined)
699
+ z.append("state", j2.state);
700
+ if (j2?.head !== undefined)
701
+ z.append("head", j2.head);
702
+ if (j2?.base !== undefined)
703
+ z.append("base", j2.base);
704
+ if (j2?.sort !== undefined)
705
+ z.append("sort", j2.sort);
706
+ if (j2?.direction !== undefined)
707
+ z.append("direction", j2.direction);
708
+ if (j2?.page !== undefined)
709
+ z.append("page", String(j2.page));
710
+ if (j2?.per_page !== undefined)
711
+ z.append("per_page", String(j2.per_page));
712
+ let A = z.toString(), B = `/repos/${k2}/${x2}/pulls${A ? `?${A}` : ""}`;
713
+ return this.client.get(B, v2);
714
+ }
715
+ getPull(k2, x2, j2, v2) {
716
+ return this.client.get(`/repos/${k2}/${x2}/pulls/${j2}`, v2);
717
+ }
718
+ updatePull(k2, x2, j2, v2, z) {
719
+ return this.client.patch(`/repos/${k2}/${x2}/pulls/${j2}`, v2, z);
720
+ }
721
+ listForAuthenticatedUser(k2, x2) {
722
+ let j2 = new URLSearchParams;
723
+ if (k2?.page !== undefined)
724
+ j2.append("page", String(k2.page));
725
+ if (k2?.per_page !== undefined)
726
+ j2.append("per_page", String(k2.per_page));
727
+ let v2 = j2.toString(), z = `/user/repos${v2 ? `?${v2}` : ""}`;
728
+ return this.client.get(z, x2);
729
+ }
730
+ createForAuthenticatedUser(k2, x2) {
731
+ return this.client.post("/user/repos", k2, x2);
501
732
  }
502
733
  }
503
734
 
504
- // ../sdk/dist/api/git.js
505
- class j4 {
735
+ // ../sdk/dist/api/teams.js
736
+ class E3 {
506
737
  client;
507
- constructor(b) {
508
- this.client = b;
509
- }
510
- createRef(b, d, f, g2) {
511
- return this.client.post(`/repos/${b}/${d}/git/refs`, f, g2);
512
- }
513
- createTree(b, d, f, g2) {
514
- return this.client.post(`/repos/${b}/${d}/git/trees`, f, g2);
515
- }
516
- getTree(b, d, f, g2) {
517
- return this.client.get(`/repos/${b}/${d}/git/trees/${f}`, g2);
738
+ constructor(x2) {
739
+ this.client = x2;
740
+ }
741
+ list(x2, b, j2) {
742
+ let B = new URLSearchParams;
743
+ if (b?.page !== undefined)
744
+ B.append("page", String(b.page));
745
+ if (b?.per_page !== undefined)
746
+ B.append("per_page", String(b.per_page));
747
+ let k2 = B.toString(), C = `/orgs/${x2}/teams${k2 ? `?${k2}` : ""}`;
748
+ return this.client.get(C, j2);
749
+ }
750
+ listMembers(x2, b, j2, B) {
751
+ let k2 = new URLSearchParams;
752
+ if (j2?.page !== undefined)
753
+ k2.append("page", String(j2.page));
754
+ if (j2?.per_page !== undefined)
755
+ k2.append("per_page", String(j2.per_page));
756
+ let C = k2.toString(), D = `/orgs/${x2}/teams/${b}/members${C ? `?${C}` : ""}`;
757
+ return this.client.get(D, B);
758
+ }
759
+ updateRepo(x2, b, j2, B, k2, C) {
760
+ return this.client.put(`/orgs/${x2}/teams/${b}/repos/${j2}/${B}`, k2, C);
518
761
  }
519
762
  }
520
763
 
521
764
  // ../sdk/dist/api/releases.js
522
- class q2 {
765
+ class G {
523
766
  client;
524
- constructor(b) {
525
- this.client = b;
526
- }
527
- list(b, f, h) {
528
- return this.client.get(`/repos/${b}/${f}/releases`, h);
529
- }
530
- create(b, f, h, j5) {
531
- return this.client.post(`/repos/${b}/${f}/releases`, h, j5);
767
+ constructor(k2) {
768
+ this.client = k2;
769
+ }
770
+ list(k2, A, b, j2) {
771
+ let B = new URLSearchParams;
772
+ if (b?.page !== undefined)
773
+ B.append("page", String(b.page));
774
+ if (b?.per_page !== undefined)
775
+ B.append("per_page", String(b.per_page));
776
+ if (b?.draft !== undefined)
777
+ B.append("draft", String(b.draft));
778
+ if (b?.pre_release !== undefined)
779
+ B.append("pre_release", String(b.pre_release));
780
+ let C = B.toString(), E4 = `/repos/${k2}/${A}/releases${C ? `?${C}` : ""}`;
781
+ return this.client.get(E4, j2);
782
+ }
783
+ create(k2, A, b, j2) {
784
+ return this.client.post(`/repos/${k2}/${A}/releases`, b, j2);
785
+ }
786
+ getByTag(k2, A, b, j2) {
787
+ return this.client.get(`/repos/${k2}/${A}/releases/tags/${b}`, j2);
788
+ }
789
+ deleteByTag(k2, A, b, j2) {
790
+ return this.client.delete(`/repos/${k2}/${A}/releases/tags/${b}`, undefined, j2);
791
+ }
792
+ get(k2, A, b, j2) {
793
+ return this.client.get(`/repos/${k2}/${A}/releases/${b}`, j2);
794
+ }
795
+ update(k2, A, b, j2, B) {
796
+ return this.client.patch(`/repos/${k2}/${A}/releases/${b}`, j2, B);
797
+ }
798
+ delete(k2, A, b, j2) {
799
+ return this.client.delete(`/repos/${k2}/${A}/releases/${b}`, undefined, j2);
800
+ }
801
+ listAssets(k2, A, b, j2, B) {
802
+ let C = new URLSearchParams;
803
+ if (j2?.page !== undefined)
804
+ C.append("page", String(j2.page));
805
+ if (j2?.per_page !== undefined)
806
+ C.append("per_page", String(j2.per_page));
807
+ let E4 = C.toString(), F = `/repos/${k2}/${A}/releases/${b}/assets${E4 ? `?${E4}` : ""}`;
808
+ return this.client.get(F, B);
809
+ }
810
+ uploadAsset(k2, A, b, j2, B) {
811
+ let C = new URLSearchParams;
812
+ if (j2?.name !== undefined)
813
+ C.append("name", j2.name);
814
+ let E4 = C.toString(), F = `/repos/${k2}/${A}/releases/${b}/assets${E4 ? `?${E4}` : ""}`;
815
+ return this.client.post(F, B);
816
+ }
817
+ deleteAsset(k2, A, b, j2, B) {
818
+ return this.client.delete(`/repos/${k2}/${A}/releases/${b}/assets/${j2}`, undefined, B);
532
819
  }
533
- getByTag(b, f, h, j5) {
534
- return this.client.get(`/repos/${b}/${f}/releases/tags/${h}`, j5);
535
- }
536
- deleteByTag(b, f, h, j5) {
537
- return this.client.delete(`/repos/${b}/${f}/releases/tags/${h}`, undefined, j5);
538
- }
539
- get(b, f, h, j5) {
540
- return this.client.get(`/repos/${b}/${f}/releases/${h}`, j5);
820
+ }
821
+
822
+ // ../sdk/dist/api/pulls.js
823
+ class I {
824
+ client;
825
+ constructor(k2) {
826
+ this.client = k2;
541
827
  }
542
- delete(b, f, h, j5) {
543
- return this.client.delete(`/repos/${b}/${f}/releases/${h}`, undefined, j5);
828
+ create(k2, v2, z, j2) {
829
+ return this.client.post(`/repos/${k2}/${v2}/pulls`, z, j2);
544
830
  }
545
- update(b, f, h, j5, k6) {
546
- return this.client.patch(`/repos/${b}/${f}/releases/${h}`, j5, k6);
831
+ listCommits(k2, v2, z, j2, D) {
832
+ let C = new URLSearchParams;
833
+ if (j2?.page !== undefined)
834
+ C.append("page", String(j2.page));
835
+ if (j2?.per_page !== undefined)
836
+ C.append("per_page", String(j2.per_page));
837
+ let F = C.toString(), G2 = `/repos/${k2}/${v2}/pulls/${z}/commits${F ? `?${F}` : ""}`;
838
+ return this.client.get(G2, D);
547
839
  }
548
- getAssets(b, f, h, j5) {
549
- return this.client.get(`/repos/${b}/${f}/releases/${h}/assets`, j5);
840
+ listFiles(k2, v2, z, j2, D) {
841
+ let C = new URLSearchParams;
842
+ if (j2?.page !== undefined)
843
+ C.append("page", String(j2.page));
844
+ if (j2?.per_page !== undefined)
845
+ C.append("per_page", String(j2.per_page));
846
+ let F = C.toString(), G2 = `/repos/${k2}/${v2}/pulls/${z}/files${F ? `?${F}` : ""}`;
847
+ return this.client.get(G2, D);
550
848
  }
551
- uploadAsset(b, f, h, j5, k6) {
552
- return this.client.post(`/repos/${b}/${f}/releases/${h}/assets`, j5, k6);
849
+ isMerged(k2, v2, z, j2) {
850
+ return this.client.get(`/repos/${k2}/${v2}/pulls/${z}/merge`, j2);
553
851
  }
554
- deleteAsset(b, f, h, j5, k6) {
555
- return this.client.delete(`/repos/${b}/${f}/releases/${h}/assets/${j5}`, undefined, k6);
852
+ updateBranch(k2, v2, z, j2, D) {
853
+ return this.client.put(`/repos/${k2}/${v2}/pulls/${z}/update-branch`, j2, D);
556
854
  }
557
855
  }
558
856
 
559
- // ../sdk/dist/api/pulls.js
560
- class y {
857
+ // ../sdk/dist/api/organizations.js
858
+ class F {
561
859
  client;
562
- constructor(d) {
563
- this.client = d;
564
- }
565
- create(d, f, g2, j5) {
566
- return this.client.post(`/repos/${d}/${f}/pulls`, g2, j5);
567
- }
568
- get(d, f, g2, j5) {
569
- return this.client.get(`/repos/${d}/${f}/pulls/${g2}`, j5);
860
+ constructor(w) {
861
+ this.client = w;
570
862
  }
571
- list(d, f, g2, j5) {
572
- let x2 = new URLSearchParams(Object.entries(g2 ?? {})), q3 = new URL(`/repos/${d}/${f}/pulls`, "http://localhost");
573
- return q3.search = x2.toString(), this.client.get(q3.href.replace("http://localhost", ""), j5);
863
+ listOrgSecrets(w, j2, x2) {
864
+ let A = new URLSearchParams;
865
+ if (j2?.per_page !== undefined)
866
+ A.append("per_page", j2.per_page);
867
+ if (j2?.page !== undefined)
868
+ A.append("page", j2.page);
869
+ let B = A.toString(), D = `/orgs/${w}/actions/secrets${B ? `?${B}` : ""}`;
870
+ return this.client.get(D, x2);
574
871
  }
575
- update(d, f, g2, j5, k6) {
576
- return this.client.patch(`/repos/${d}/${f}/pulls/${g2}`, j5, k6);
872
+ getOrgSecret(w, j2, x2) {
873
+ return this.client.get(`/orgs/${w}/actions/secrets/${j2}`, x2);
577
874
  }
578
- getFiles(d, f, g2, j5) {
579
- return this.client.get(`/repos/${d}/${f}/pulls/${g2}/files`, j5);
875
+ createOrUpdateOrgSecret(w, j2, x2, A) {
876
+ let B = new URLSearchParams;
877
+ if (x2?.encrypted_value !== undefined)
878
+ B.append("encrypted_value", x2.encrypted_value);
879
+ let D = B.toString(), E4 = `/orgs/${w}/actions/secrets/${j2}${D ? `?${D}` : ""}`;
880
+ return this.client.put(E4, A);
580
881
  }
581
- updateBranch(d, f, g2, j5) {
582
- return this.client.put(`/repos/${d}/${f}/pulls/${g2}/update-branch`, {}, j5);
882
+ deleteOrgSecret(w, j2, x2) {
883
+ return this.client.delete(`/orgs/${w}/actions/secrets/${j2}`, undefined, x2);
583
884
  }
584
- getCommits(d, f, g2, j5) {
585
- return this.client.get(`/repos/${d}/${f}/pulls/${g2}/commits`, j5);
586
- }
587
- async checkIfMerged(d, f, g2, j5) {
588
- try {
589
- return await this.client.get(`/repos/${d}/${f}/pulls/${g2}/merge`, j5), true;
590
- } catch (k6) {
591
- if (k6 instanceof j2 && k6.status === 404)
592
- return false;
593
- throw k6;
594
- }
885
+ isMember(w, j2, x2) {
886
+ return this.client.get(`/orgs/${w}/members/${j2}`, x2);
595
887
  }
596
888
  }
597
889
 
598
- // ../sdk/dist/api/forks.js
599
- class q3 {
890
+ // ../sdk/dist/api/actions.js
891
+ class F2 {
600
892
  client;
601
- constructor(b) {
602
- this.client = b;
603
- }
604
- async create(b, g2, h, j5) {
605
- let k6 = await this.client.post(`/repos/${b}/${g2}/forks`, h, j5);
606
- return J(k6);
893
+ constructor(x2) {
894
+ this.client = x2;
895
+ }
896
+ listOrgRunners(x2, j2, b) {
897
+ let z = new URLSearchParams;
898
+ if (j2?.page !== undefined)
899
+ z.append("page", String(j2.page));
900
+ if (j2?.per_page !== undefined)
901
+ z.append("per_page", String(j2.per_page));
902
+ let A = z.toString(), B = `/orgs/${x2}/actions/runners${A ? `?${A}` : ""}`;
903
+ return this.client.get(B, b);
904
+ }
905
+ createOrgRunnerRegistrationToken(x2, j2) {
906
+ return this.client.post(`/orgs/${x2}/actions/runners/registration-token`, j2);
907
+ }
908
+ getOrgRunner(x2, j2, b) {
909
+ return this.client.get(`/orgs/${x2}/actions/runners/${j2}`, b);
910
+ }
911
+ deleteOrgRunner(x2, j2, b) {
912
+ return this.client.delete(`/orgs/${x2}/actions/runners/${j2}`, undefined, b);
913
+ }
914
+ listOrgVariables(x2, j2, b) {
915
+ let z = new URLSearchParams;
916
+ if (j2?.per_page !== undefined)
917
+ z.append("per_page", String(j2.per_page));
918
+ if (j2?.page !== undefined)
919
+ z.append("page", String(j2.page));
920
+ let A = z.toString(), B = `/orgs/${x2}/actions/variables${A ? `?${A}` : ""}`;
921
+ return this.client.get(B, b);
922
+ }
923
+ createOrgVariable(x2, j2, b) {
924
+ return this.client.post(`/orgs/${x2}/actions/variables`, j2, b);
925
+ }
926
+ getOrgVariable(x2, j2, b) {
927
+ return this.client.get(`/orgs/${x2}/actions/variables/${j2}`, b);
928
+ }
929
+ updateOrgVariable(x2, j2, b, z) {
930
+ return this.client.patch(`/orgs/${x2}/actions/variables/${j2}`, b, z);
931
+ }
932
+ deleteOrgVariable(x2, j2, b) {
933
+ return this.client.delete(`/orgs/${x2}/actions/variables/${j2}`, undefined, b);
934
+ }
935
+ listArtifacts(x2, j2, b, z) {
936
+ let A = new URLSearchParams;
937
+ if (b?.page !== undefined)
938
+ A.append("page", String(b.page));
939
+ if (b?.per_page !== undefined)
940
+ A.append("per_page", String(b.per_page));
941
+ if (b?.name !== undefined)
942
+ A.append("name", b.name);
943
+ let B = A.toString(), C = `/repos/${x2}/${j2}/actions/artifacts${B ? `?${B}` : ""}`;
944
+ return this.client.get(C, z);
945
+ }
946
+ getArtifact(x2, j2, b, z) {
947
+ return this.client.get(`/repos/${x2}/${j2}/actions/artifacts/${b}`, z);
948
+ }
949
+ deleteArtifact(x2, j2, b, z) {
950
+ return this.client.delete(`/repos/${x2}/${j2}/actions/artifacts/${b}`, undefined, z);
951
+ }
952
+ downloadArtifact(x2, j2, b, z) {
953
+ return this.client.get(`/repos/${x2}/${j2}/actions/artifacts/${b}/zip`, z);
954
+ }
955
+ downloadArtifactRaw(x2, j2, b, z) {
956
+ return this.client.get(`/repos/${x2}/${j2}/actions/artifacts/${b}/zip/raw`, z);
957
+ }
958
+ createActionLink(x2, j2, b, z) {
959
+ return this.client.post(`/repos/${x2}/${j2}/actions/links`, b, z);
960
+ }
961
+ listRepoRunners(x2, j2, b, z) {
962
+ let A = new URLSearchParams;
963
+ if (b?.page !== undefined)
964
+ A.append("page", String(b.page));
965
+ if (b?.per_page !== undefined)
966
+ A.append("per_page", String(b.per_page));
967
+ let B = A.toString(), C = `/repos/${x2}/${j2}/actions/runners${B ? `?${B}` : ""}`;
968
+ return this.client.get(C, z);
969
+ }
970
+ createRepoRunnerRegistrationToken(x2, j2, b) {
971
+ return this.client.post(`/repos/${x2}/${j2}/actions/runners/registration-token`, b);
972
+ }
973
+ getRepoRunner(x2, j2, b, z) {
974
+ return this.client.get(`/repos/${x2}/${j2}/actions/runners/${b}`, z);
975
+ }
976
+ deleteRepoRunner(x2, j2, b, z) {
977
+ return this.client.delete(`/repos/${x2}/${j2}/actions/runners/${b}`, undefined, z);
978
+ }
979
+ listRepoVariables(x2, j2, b, z) {
980
+ let A = new URLSearchParams;
981
+ if (b?.per_page !== undefined)
982
+ A.append("per_page", String(b.per_page));
983
+ if (b?.page !== undefined)
984
+ A.append("page", String(b.page));
985
+ let B = A.toString(), C = `/repos/${x2}/${j2}/actions/variables${B ? `?${B}` : ""}`;
986
+ return this.client.get(C, z);
987
+ }
988
+ createRepoVariable(x2, j2, b, z) {
989
+ return this.client.post(`/repos/${x2}/${j2}/actions/variables`, b, z);
990
+ }
991
+ getRepoVariable(x2, j2, b, z) {
992
+ return this.client.get(`/repos/${x2}/${j2}/actions/variables/${b}`, z);
993
+ }
994
+ updateRepoVariable(x2, j2, b, z, A) {
995
+ return this.client.patch(`/repos/${x2}/${j2}/actions/variables/${b}`, z, A);
996
+ }
997
+ deleteRepoVariable(x2, j2, b, z) {
998
+ return this.client.delete(`/repos/${x2}/${j2}/actions/variables/${b}`, undefined, z);
999
+ }
1000
+ getWorkflowDispatchInputs(x2, j2, b, z, A) {
1001
+ let B = new URLSearchParams;
1002
+ if (z?.branch !== undefined)
1003
+ B.append("branch", z.branch);
1004
+ if (z?.tag !== undefined)
1005
+ B.append("tag", z.tag);
1006
+ let C = B.toString(), D = `/repos/${x2}/${j2}/actions/workflows/${b}/dispatches${C ? `?${C}` : ""}`;
1007
+ return this.client.get(D, A);
1008
+ }
1009
+ dispatchWorkflow(x2, j2, b, z, A, B) {
1010
+ let C = new URLSearchParams;
1011
+ if (A?.branch !== undefined)
1012
+ C.append("branch", A.branch);
1013
+ if (A?.tag !== undefined)
1014
+ C.append("tag", A.tag);
1015
+ let D = C.toString(), E4 = `/repos/${x2}/${j2}/actions/workflows/${b}/dispatches${D ? `?${D}` : ""}`;
1016
+ return this.client.post(E4, z, B);
607
1017
  }
608
1018
  }
609
1019
 
610
- // ../sdk/dist/client.js
611
- var J2 = { DELETE: "DELETE", GET: "GET", PATCH: "PATCH", POST: "POST", PUT: "PUT" };
612
-
613
- class $ {
614
- baseUrl;
615
- token;
616
- apiVersion;
617
- onApiVersionWarning;
618
- constructor(j5 = {}) {
619
- this.baseUrl = j5.baseUrl || "https://api.gitverse.ru", this.token = j5.token, this.apiVersion = j5.apiVersion || "1";
620
- }
621
- setToken(j5) {
622
- this.token = j5;
623
- }
624
- extractRateLimitInfo(j5) {
625
- let x2 = j5.get("GitVerse-RateLimit-Limit"), q4 = j5.get("GitVerse-RateLimit-User-Remaining") || j5.get("GitVerse-RateLimit-Remaining"), z2 = j5.get("GitVerse-RateLimit-Retry-After"), B2 = j5.get("Gitverse-Ratelimit-Reset");
626
- if (!(x2 && z2))
627
- return;
628
- let K = Number.parseInt(z2, 10), D = B2 ? Number.parseInt(B2, 10) : Math.floor(Date.now() / 1000) + K, U = q4 ? Number.parseInt(q4, 10) : 0;
629
- return { limit: Number.parseInt(x2, 10), remaining: U, reset: D, retryAfter: K };
630
- }
631
- extractApiVersionInfo(j5) {
632
- let x2 = j5.get("Gitverse-Api-Version"), q4 = j5.get("Gitverse-Api-Latest-Version"), z2 = j5.get("Gitverse-Api-Deprecation") === "true", B2 = j5.get("Gitverse-Api-Decommissioning");
633
- if (!(x2 && q4))
634
- return;
635
- return { decommissioning: B2 || undefined, deprecated: z2, latestVersion: q4, version: x2 };
636
- }
637
- extractMetadata(j5) {
638
- let x2 = this.extractRateLimitInfo(j5), q4 = this.extractApiVersionInfo(j5);
639
- if (q4?.deprecated && this.onApiVersionWarning) {
640
- let z2 = new q(q4.version, q4.latestVersion, q4.decommissioning);
641
- this.onApiVersionWarning(z2);
642
- }
643
- return { apiVersion: q4, rateLimit: x2 };
644
- }
645
- async request(j5, x2, q4, z2) {
646
- let B2 = j5.startsWith("/") ? j5.slice(1) : j5, K = `${this.baseUrl}/${B2}`, D = new Headers;
647
- if (D.set("Content-Type", "application/json"), D.set("Accept", `application/vnd.gitverse.object+json; version=${this.apiVersion}`), this.token)
648
- D.set("Authorization", `Bearer ${this.token}`);
649
- let U = { body: q4 ? JSON.stringify(q4) : undefined, headers: D, method: x2, signal: z2?.signal }, F = await fetch(K, U), Q = this.extractMetadata(F.headers), S;
650
- try {
651
- S = await F.json();
652
- } catch {
653
- S = undefined;
654
- }
655
- if (!F.ok) {
656
- let X = S?.message || F.statusText;
657
- if (F.status === 429 && Q.rateLimit)
658
- throw new k2(X || "Превышен лимит запросов. Попробуйте позже.", Q.rateLimit, Q);
659
- throw new j2(F.status, X, Q);
660
- }
661
- return S;
662
- }
663
- get(j5, x2) {
664
- return this.request(j5, J2.GET, undefined, x2);
1020
+ // ../sdk/dist/api/stars.js
1021
+ class A {
1022
+ client;
1023
+ constructor(b) {
1024
+ this.client = b;
665
1025
  }
666
- post(j5, x2, q4) {
667
- return this.request(j5, J2.POST, x2, q4);
1026
+ list(b, k2) {
1027
+ let j2 = new URLSearchParams;
1028
+ if (b?.page !== undefined)
1029
+ j2.append("page", String(b.page));
1030
+ if (b?.per_page !== undefined)
1031
+ j2.append("per_page", String(b.per_page));
1032
+ if (b?.sort !== undefined)
1033
+ j2.append("sort", b.sort);
1034
+ if (b?.direction !== undefined)
1035
+ j2.append("direction", b.direction);
1036
+ let x2 = j2.toString(), z = `/user/starred${x2 ? `?${x2}` : ""}`;
1037
+ return this.client.get(z, k2);
668
1038
  }
669
- put(j5, x2, q4) {
670
- return this.request(j5, J2.PUT, x2, q4);
1039
+ isStarred(b, k2, j2) {
1040
+ return this.client.get(`/user/starred/${b}/${k2}`, j2);
671
1041
  }
672
- delete(j5, x2, q4) {
673
- return this.request(j5, J2.DELETE, x2, q4);
1042
+ star(b, k2, j2) {
1043
+ return this.client.put(`/user/starred/${b}/${k2}`, j2);
674
1044
  }
675
- patch(j5, x2, q4) {
676
- return this.request(j5, J2.PATCH, x2, q4);
1045
+ unstar(b, k2, j2) {
1046
+ return this.client.delete(`/user/starred/${b}/${k2}`, undefined, j2);
677
1047
  }
678
1048
  }
679
1049
 
680
1050
  // ../sdk/dist/api/users.js
681
- class f {
1051
+ class z {
682
1052
  client;
683
- constructor(b) {
684
- this.client = b;
685
- }
686
- getCurrent(b) {
687
- return this.client.get("/user", b);
688
- }
689
- getByUsername(b, d) {
690
- return this.client.get(`/users/${b}`, d);
1053
+ constructor(j2) {
1054
+ this.client = j2;
1055
+ }
1056
+ list(j2, v2) {
1057
+ let k2 = new URLSearchParams;
1058
+ if (j2?.q !== undefined)
1059
+ k2.append("q", j2.q);
1060
+ if (j2?.sort !== undefined)
1061
+ k2.append("sort", j2.sort);
1062
+ if (j2?.order !== undefined)
1063
+ k2.append("order", j2.order);
1064
+ if (j2?.page !== undefined)
1065
+ k2.append("page", String(j2.page));
1066
+ if (j2?.per_page !== undefined)
1067
+ k2.append("per_page", String(j2.per_page));
1068
+ let w = k2.toString(), x2 = `/search/users${w ? `?${w}` : ""}`;
1069
+ return this.client.get(x2, v2);
1070
+ }
1071
+ getAuthenticated(j2) {
1072
+ return this.client.get("/user", j2);
1073
+ }
1074
+ get(j2, v2) {
1075
+ return this.client.get(`/user/${j2}`, v2);
1076
+ }
1077
+ getByUsername(j2, v2) {
1078
+ return this.client.get(`/users/${j2}`, v2);
691
1079
  }
692
1080
  }
693
1081
 
694
- // ../sdk/dist/api/emails.js
695
- class d {
1082
+ // ../sdk/dist/api/pages.js
1083
+ class A2 {
696
1084
  client;
697
1085
  constructor(b) {
698
1086
  this.client = b;
699
1087
  }
700
- list(b) {
701
- return this.client.get("/user/emails", b);
702
- }
703
- add(b, c) {
704
- return this.client.post("/user/emails", b, c);
1088
+ createDeployment(b, j2, k2, v2) {
1089
+ return this.client.post(`/repos/${b}/${j2}/pages/deployments`, k2, v2);
705
1090
  }
706
- remove(b, c) {
707
- return this.client.delete("/user/emails", b, c);
1091
+ getDeploymentStatus(b, j2, k2, v2) {
1092
+ return this.client.get(`/repos/${b}/${j2}/pages/deployments/${k2}`, v2);
708
1093
  }
709
1094
  }
710
1095
 
711
1096
  // ../sdk/dist/index.js
712
- class Z {
1097
+ class K {
713
1098
  client;
714
- users;
1099
+ actions;
1100
+ orgs;
1101
+ teams;
715
1102
  repos;
716
- contents;
1103
+ issues;
1104
+ pages;
717
1105
  pulls;
718
- forks;
1106
+ releases;
1107
+ users;
719
1108
  emails;
720
- issues;
721
1109
  stars;
722
- branches;
723
- commits;
724
- collaborators;
725
- organizations;
726
- teams;
727
- releases;
728
- git;
729
- actions;
730
- constructor(d2 = {}) {
731
- this.client = new $(d2), this.users = new f(this.client), this.repos = new A(this.client), this.contents = new k4(this.client), this.pulls = new y(this.client), this.forks = new q3(this.client), this.emails = new d(this.client), this.issues = new B(this.client), this.stars = new k3(this.client), this.branches = new g(this.client), this.commits = new j(this.client), this.collaborators = new j3(this.client), this.organizations = new k(this.client), this.teams = new k5(this.client), this.releases = new q2(this.client), this.git = new j4(this.client), this.actions = new x(this.client);
1110
+ constructor(b = {}) {
1111
+ this.client = new v(b), this.actions = new F2(this.client), this.orgs = new F(this.client), this.teams = new E3(this.client), this.repos = new E2(this.client), this.issues = new E(this.client), this.pages = new A2(this.client), this.pulls = new I(this.client), this.releases = new G(this.client), this.users = new z(this.client), this.emails = new x(this.client), this.stars = new A(this.client);
732
1112
  }
733
- setToken(d2) {
734
- return this.client.setToken(d2), this;
1113
+ setToken(b) {
1114
+ return this.client.setToken(b), this;
735
1115
  }
736
1116
  }
737
1117
 
@@ -741,7 +1121,7 @@ class GitVerseReleaseClient {
741
1121
  repoInfo;
742
1122
  retryFn;
743
1123
  constructor(token, repoInfo, retryFn) {
744
- this.client = new Z({ token });
1124
+ this.client = new K({ token });
745
1125
  this.repoInfo = repoInfo;
746
1126
  this.retryFn = retryFn;
747
1127
  }
@@ -789,7 +1169,7 @@ function createGitVerseClient(repoInfo, retryFn) {
789
1169
  }
790
1170
 
791
1171
  // src/utils/changelog.ts
792
- import { readFile as readFile2, writeFile } from "node:fs/promises";
1172
+ import { readFile as readFile2, writeFile as writeFile2 } from "node:fs/promises";
793
1173
 
794
1174
  // src/utils/parser.ts
795
1175
  var COMMIT_REGEX = /^(?<type>\w+)(?:\((?<scope>[^)]+)\))?(?<breaking>!)?: (?<subject>.+)$/;
@@ -951,7 +1331,7 @@ All notable changes to this project will be documented in this file.
951
1331
  insertIndex = lines.length;
952
1332
  }
953
1333
  lines.splice(insertIndex, 0, newEntry);
954
- await writeFile(changelogPath, lines.join(`
1334
+ await writeFile2(changelogPath, lines.join(`
955
1335
  `));
956
1336
  }
957
1337
  function generateReleaseNotes(commits, config, repoUrl, packageName) {
@@ -1011,7 +1391,8 @@ async function runBeforeCommitHook(command) {
1011
1391
  }
1012
1392
  var GITVERSE_URL_REGEX_1 = /gitverse\.ru[:/]([^/]+)\/([^/.]+)(\.git)?$/;
1013
1393
  var GITVERSE_URL_REGEX_2 = /gitverse\.ru\/([^/]+)\/([^/.]+)(\.git)?$/;
1014
- async function git(command) {
1394
+ var GITVERSE_URL_REGEX_3 = /gitverse\.ru:\d+\/([^/]+)\/([^/.]+)(\.git)?$/;
1395
+ async function gitCommand(command) {
1015
1396
  const { stdout } = await execAsync(`git ${command}`);
1016
1397
  return stdout.trim();
1017
1398
  }
@@ -1032,14 +1413,14 @@ async function getRepoInfo() {
1032
1413
  };
1033
1414
  }
1034
1415
  }
1035
- const url = await git("remote get-url origin");
1036
- const match = url.match(GITVERSE_URL_REGEX_1) || url.match(GITVERSE_URL_REGEX_2);
1416
+ const url = await gitCommand("remote get-url origin");
1417
+ const match = url.match(GITVERSE_URL_REGEX_1) || url.match(GITVERSE_URL_REGEX_2) || url.match(GITVERSE_URL_REGEX_3);
1037
1418
  if (!(match?.[1] && match[2])) {
1038
1419
  throw new Error(`Unable to parse GitVerse repository from URL: ${url}`);
1039
1420
  }
1040
1421
  const owner = match[1];
1041
1422
  const repo = match[2];
1042
- const branch = await git("branch --show-current");
1423
+ const branch = await gitCommand("branch --show-current");
1043
1424
  return {
1044
1425
  branch,
1045
1426
  fullName: `${owner}/${repo}`,
@@ -1050,7 +1431,7 @@ async function getRepoInfo() {
1050
1431
  }
1051
1432
  async function getLatestTag(prefix) {
1052
1433
  try {
1053
- const tags = await git(`tag --sort=-v:refname --list "${prefix}*"`);
1434
+ const tags = await gitCommand(`tag --sort=-v:refname --list "${prefix}*"`);
1054
1435
  const tagList = tags.split(`
1055
1436
  `).filter((tag) => tag.length > 0);
1056
1437
  return tagList.length > 0 ? tagList[0] ?? null : null;
@@ -1068,7 +1449,7 @@ async function getCommitsSinceTag(tagPrefix, path) {
1068
1449
  }
1069
1450
  const format = "%H%n%h%n%an%n%ae%n%ai%n%B%n==END==";
1070
1451
  const pathFilter = path ? `-- ${path}` : "";
1071
- const log = await git(`log ${range} --format="${format}" ${pathFilter}`);
1452
+ const log = await gitCommand(`log ${range} --format="${format}" ${pathFilter}`);
1072
1453
  const commits = log.split(`
1073
1454
  ==END==`).map((commit) => commit.trim()).filter((commit) => commit.length > 0 && commit !== "==END==");
1074
1455
  return commits;
@@ -1102,33 +1483,33 @@ async function getPackageInfo(packagePath) {
1102
1483
  };
1103
1484
  }
1104
1485
  async function updatePackageVersion(packagePath, newVersion) {
1105
- const { readFile: readFile3, writeFile: writeFile2 } = await import("node:fs/promises");
1486
+ const { readFile: readFile3, writeFile: writeFile3 } = await import("node:fs/promises");
1106
1487
  const { resolve: resolve2 } = await import("node:path");
1107
1488
  const pkgJsonPath = resolve2(packagePath, "package.json");
1108
1489
  const content = await readFile3(pkgJsonPath, "utf-8");
1109
1490
  const pkgJson = JSON.parse(content);
1110
1491
  pkgJson.version = newVersion;
1111
- await writeFile2(pkgJsonPath, `${JSON.stringify(pkgJson, null, 2)}
1492
+ await writeFile3(pkgJsonPath, `${JSON.stringify(pkgJson, null, 2)}
1112
1493
  `);
1113
1494
  }
1114
1495
  async function createCommit(message, files) {
1115
1496
  for (const file of files) {
1116
- await git(`add "${file}"`);
1497
+ await gitCommand(`add "${file}"`);
1117
1498
  }
1118
- await git(`commit -m "${message}"`);
1499
+ await gitCommand(`commit -m "${message}"`);
1119
1500
  }
1120
1501
  async function createTag(tag, message) {
1121
- await git(`tag -a "${tag}" -m "${message}"`);
1502
+ await gitCommand(`tag -a "${tag}" -m "${message}"`);
1122
1503
  }
1123
1504
  async function pushChanges(tag) {
1124
- await git("push");
1505
+ await gitCommand("push");
1125
1506
  if (tag) {
1126
- await git(`push origin "${tag}"`);
1507
+ await gitCommand(`push origin "${tag}"`);
1127
1508
  }
1128
1509
  }
1129
1510
  async function isWorkingTreeClean() {
1130
1511
  try {
1131
- const status = await git("status --porcelain");
1512
+ const status = await gitCommand("status --porcelain");
1132
1513
  if (status.length === 0) {
1133
1514
  return true;
1134
1515
  }
@@ -1155,10 +1536,14 @@ async function isWorkingTreeClean() {
1155
1536
  }
1156
1537
  async function tagExists(tag) {
1157
1538
  try {
1158
- await git(`rev-parse "${tag}"`);
1539
+ await gitCommand(`rev-parse "${tag}"`);
1159
1540
  return true;
1160
- } catch {
1161
- return false;
1541
+ } catch (error) {
1542
+ const errorMessage = error instanceof Error ? error.message.toLowerCase() : String(error).toLowerCase();
1543
+ if (errorMessage.includes("not a valid object name") || errorMessage.includes("unknown revision")) {
1544
+ return false;
1545
+ }
1546
+ throw new Error(`Failed to check tag "${tag}": ${error instanceof Error ? error.message : String(error)}`);
1162
1547
  }
1163
1548
  }
1164
1549
 
@@ -1231,8 +1616,8 @@ function createRetryFunction(config) {
1231
1616
  var VERSION_REGEX = /^(\d+)\.(\d+)\.(\d+)(?:-(.+))?$/;
1232
1617
  var PRERELEASE_INCREMENT_REGEX = /^(.+)\.(\d+)$/;
1233
1618
  function parseVersion(version) {
1234
- const v = version.startsWith("v") ? version.slice(1) : version;
1235
- const match = v.match(VERSION_REGEX);
1619
+ const v2 = version.startsWith("v") ? version.slice(1) : version;
1620
+ const match = v2.match(VERSION_REGEX);
1236
1621
  if (!(match?.[1] && match[2] && match[3])) {
1237
1622
  throw new Error(`Invalid version format: ${version}`);
1238
1623
  }
@@ -1360,6 +1745,683 @@ function compareVersions(a, b) {
1360
1745
  return 0;
1361
1746
  }
1362
1747
 
1748
+ // src/binaries.ts
1749
+ import { mkdir as mkdir2, writeFile as writeFile5 } from "node:fs/promises";
1750
+ import { dirname, join as join3 } from "node:path";
1751
+
1752
+ // src/utils/binary-package-generator.ts
1753
+ import { copyFile, mkdir, writeFile as writeFile3 } from "node:fs/promises";
1754
+ import { join as join2 } from "node:path";
1755
+
1756
+ // src/utils/binary-platforms.ts
1757
+ import { access as access2 } from "node:fs/promises";
1758
+ import { join, resolve as resolve2 } from "node:path";
1759
+ var PLATFORM_MAPPINGS = {
1760
+ "darwin-arm64": { cpu: "arm64", extension: "", os: "darwin" },
1761
+ "darwin-x64": { cpu: "x64", extension: "", os: "darwin" },
1762
+ "linux-arm64": { cpu: "arm64", extension: "", os: "linux" },
1763
+ "linux-x64": { cpu: "x64", extension: "", os: "linux" },
1764
+ "win32-arm64": { cpu: "arm64", extension: ".exe", os: "win32" },
1765
+ "win32-x64": { cpu: "x64", extension: ".exe", os: "win32" }
1766
+ };
1767
+ var ALL_PLATFORMS = Object.keys(PLATFORM_MAPPINGS);
1768
+ function isValidPlatform(value) {
1769
+ return value in PLATFORM_MAPPINGS;
1770
+ }
1771
+ function parsePlatforms(value) {
1772
+ const platforms = value.split(",").map((p) => p.trim());
1773
+ const result = [];
1774
+ for (const platform of platforms) {
1775
+ if (!isValidPlatform(platform)) {
1776
+ throw new Error(`Invalid platform: ${platform}. Valid platforms: ${ALL_PLATFORMS.join(", ")}`);
1777
+ }
1778
+ result.push(platform);
1779
+ }
1780
+ return result;
1781
+ }
1782
+ function getBinaryPath(distDir, name, platform) {
1783
+ const mapping = PLATFORM_MAPPINGS[platform];
1784
+ const binaryName = `${name}${mapping.extension}`;
1785
+ const platformDir = `${name}-${platform}`;
1786
+ return resolve2(distDir, platformDir, binaryName);
1787
+ }
1788
+ function getPlatformDir(distDir, name, platform) {
1789
+ const platformDir = `${name}-${platform}`;
1790
+ return resolve2(distDir, platformDir);
1791
+ }
1792
+ async function validateBinaryExists(distDir, name, platform) {
1793
+ const binaryPath = getBinaryPath(distDir, name, platform);
1794
+ try {
1795
+ await access2(binaryPath);
1796
+ return true;
1797
+ } catch (error) {
1798
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") {
1799
+ return false;
1800
+ }
1801
+ throw new Error(`Failed to check binary at ${binaryPath}: ${error instanceof Error ? error.message : String(error)}`);
1802
+ }
1803
+ }
1804
+ async function validateAllBinaries(distDir, name, platforms) {
1805
+ const missing = [];
1806
+ for (const platform of platforms) {
1807
+ const exists = await validateBinaryExists(distDir, name, platform);
1808
+ if (!exists) {
1809
+ missing.push(platform);
1810
+ }
1811
+ }
1812
+ return missing;
1813
+ }
1814
+ function getPackageName(scope, name, platform) {
1815
+ const cleanScope = scope.startsWith("@") ? scope : `@${scope}`;
1816
+ return `${cleanScope}/${name}-${platform}`;
1817
+ }
1818
+ function getPackageOutputPath(outDir, scope, name, platform) {
1819
+ const cleanScope = scope.startsWith("@") ? scope.slice(1) : scope;
1820
+ return join(outDir, `@${cleanScope}`, `${name}-${platform}`);
1821
+ }
1822
+ function expandPlaceholders(template, values) {
1823
+ let result = template;
1824
+ if (values.packageDir !== undefined) {
1825
+ result = result.replace(/\{\{packageDir\}\}/g, values.packageDir);
1826
+ }
1827
+ if (values.version !== undefined) {
1828
+ result = result.replace(/\{\{version\}\}/g, values.version);
1829
+ }
1830
+ if (values.platform !== undefined) {
1831
+ result = result.replace(/\{\{platform\}\}/g, values.platform);
1832
+ }
1833
+ if (values.scope !== undefined) {
1834
+ result = result.replace(/\{\{scope\}\}/g, values.scope);
1835
+ }
1836
+ if (values.name !== undefined) {
1837
+ result = result.replace(/\{\{name\}\}/g, values.name);
1838
+ }
1839
+ return result;
1840
+ }
1841
+ function platformToNodeValues(platform) {
1842
+ const parts = platform.split("-");
1843
+ return { arch: parts[1] ?? "", platform: parts[0] ?? "" };
1844
+ }
1845
+
1846
+ // src/utils/binary-package-generator.ts
1847
+ function generatePlatformPackageJson(config, platform, version) {
1848
+ const mapping = PLATFORM_MAPPINGS[platform];
1849
+ const packageName = getPackageName(config.scope, config.name, platform);
1850
+ const binName = config.binName ?? config.name;
1851
+ const binaryFileName = `${binName}${mapping.extension}`;
1852
+ const pkg = {
1853
+ bin: {
1854
+ [binName]: `bin/${binaryFileName}`
1855
+ },
1856
+ cpu: [mapping.cpu],
1857
+ description: `${config.name} binary for ${platform}`,
1858
+ files: ["bin"],
1859
+ license: "MIT",
1860
+ name: packageName,
1861
+ os: [mapping.os],
1862
+ preferUnplugged: true,
1863
+ version
1864
+ };
1865
+ return JSON.stringify(pkg, null, 2);
1866
+ }
1867
+ function generatePlatformReadme(config, platform, version) {
1868
+ const packageName = getPackageName(config.scope, config.name, platform);
1869
+ const mapping = PLATFORM_MAPPINGS[platform];
1870
+ const mainPackageName = `${config.scope.startsWith("@") ? config.scope : `@${config.scope}`}/${config.name}`;
1871
+ return `# ${packageName}
1872
+
1873
+ Platform-specific binary for \`${config.name}\` (${mapping.os} ${mapping.cpu}).
1874
+
1875
+ ## Installation
1876
+
1877
+ This package is not meant to be installed directly. Install the main package instead:
1878
+
1879
+ \`\`\`bash
1880
+ npm install ${mainPackageName}
1881
+ \`\`\`
1882
+
1883
+ The main package will automatically install the correct platform-specific binary as an optional dependency.
1884
+
1885
+ ## Version
1886
+
1887
+ ${version}
1888
+ `;
1889
+ }
1890
+ async function generatePlatformPackage(config, platform, version, dryRun = false) {
1891
+ const packageName = getPackageName(config.scope, config.name, platform);
1892
+ const packageDir = getPackageOutputPath(config.outDir, config.scope, config.name, platform);
1893
+ const binName = config.binName ?? config.name;
1894
+ const mapping = PLATFORM_MAPPINGS[platform];
1895
+ const baseResult = {
1896
+ packageDir,
1897
+ packageName,
1898
+ platform
1899
+ };
1900
+ try {
1901
+ const binaryExists = await validateBinaryExists(config.distDir, config.name, platform);
1902
+ if (!binaryExists) {
1903
+ const expectedPath = getBinaryPath(config.distDir, config.name, platform);
1904
+ return { ...baseResult, error: `Binary not found: ${expectedPath}`, success: false };
1905
+ }
1906
+ if (dryRun) {
1907
+ return { ...baseResult, success: true };
1908
+ }
1909
+ const binDir = join2(packageDir, "bin");
1910
+ await mkdir(binDir, { recursive: true });
1911
+ const packageJson = generatePlatformPackageJson(config, platform, version);
1912
+ await writeFile3(join2(packageDir, "package.json"), packageJson);
1913
+ const readme = generatePlatformReadme(config, platform, version);
1914
+ await writeFile3(join2(packageDir, "README.md"), readme);
1915
+ const sourceBinaryPath = getBinaryPath(config.distDir, config.name, platform);
1916
+ const binaryFileName = `${binName}${mapping.extension}`;
1917
+ const targetBinaryPath = join2(binDir, binaryFileName);
1918
+ await copyFile(sourceBinaryPath, targetBinaryPath);
1919
+ return { ...baseResult, success: true };
1920
+ } catch (error) {
1921
+ const errorMessage = error instanceof Error ? error.message : String(error);
1922
+ console.error(`❌ Failed to generate package ${packageName} for ${platform}: ${errorMessage}`);
1923
+ return { ...baseResult, error: `Failed to generate ${packageName}: ${errorMessage}`, success: false };
1924
+ }
1925
+ }
1926
+ async function generateAllPlatformPackages(config, version, platforms, dryRun = false) {
1927
+ const targetPlatforms = platforms ?? config.platforms;
1928
+ const results = [];
1929
+ for (const platform of targetPlatforms) {
1930
+ const result = await generatePlatformPackage(config, platform, version, dryRun);
1931
+ results.push(result);
1932
+ }
1933
+ return results;
1934
+ }
1935
+ function printGenerationDryRun(config, version, platforms) {
1936
+ console.log(`
1937
+ \uD83D\uDCE6 Binary Distribution:`);
1938
+ console.log(` Scope: ${config.scope}`);
1939
+ console.log(` Name: ${config.name}`);
1940
+ console.log(` Version: ${version}`);
1941
+ console.log(` Platforms: ${platforms.join(", ")}`);
1942
+ console.log(`
1943
+ \uD83D\uDCC1 Packages to generate:`);
1944
+ for (const platform of platforms) {
1945
+ const packageDir = getPackageOutputPath(config.outDir, config.scope, config.name, platform);
1946
+ console.log(` ${packageDir}/`);
1947
+ }
1948
+ }
1949
+
1950
+ // src/utils/binary-publisher.ts
1951
+ import { exec as exec2 } from "node:child_process";
1952
+ import { promisify as promisify2 } from "node:util";
1953
+ var execAsync2 = promisify2(exec2);
1954
+ function sleep2(ms) {
1955
+ return new Promise((resolve3) => setTimeout(resolve3, ms));
1956
+ }
1957
+ function calculateDelay2(attempt, initialDelay = 2000, maxDelay = 30000) {
1958
+ const delay = initialDelay * 2 ** attempt;
1959
+ return Math.min(delay, maxDelay);
1960
+ }
1961
+ function isRetriableError2(error) {
1962
+ if (!(error instanceof Error)) {
1963
+ return false;
1964
+ }
1965
+ const message = error.message.toLowerCase();
1966
+ if (message.includes("network") || message.includes("timeout") || message.includes("econnreset")) {
1967
+ return true;
1968
+ }
1969
+ if (message.includes("503") || message.includes("429") || message.includes("rate")) {
1970
+ return true;
1971
+ }
1972
+ if (message.includes("registry") || message.includes("etarget")) {
1973
+ return true;
1974
+ }
1975
+ return false;
1976
+ }
1977
+ async function publishPlatformPackage(config, platform, version, dryRun = false) {
1978
+ const packageName = getPackageName(config.scope, config.name, platform);
1979
+ const packageDir = getPackageOutputPath(config.outDir, config.scope, config.name, platform);
1980
+ const baseResult = {
1981
+ packageName,
1982
+ platform
1983
+ };
1984
+ const publishCommand = expandPlaceholders(config.publishCommand, {
1985
+ name: config.name,
1986
+ packageDir,
1987
+ platform,
1988
+ scope: config.scope,
1989
+ version
1990
+ });
1991
+ if (dryRun) {
1992
+ return { ...baseResult, attempts: 1, success: true };
1993
+ }
1994
+ let lastError;
1995
+ let attempts = 0;
1996
+ for (let attempt = 0;attempt < config.retryAttempts; attempt++) {
1997
+ attempts = attempt + 1;
1998
+ try {
1999
+ await execAsync2(publishCommand, {
2000
+ cwd: packageDir,
2001
+ env: process.env
2002
+ });
2003
+ return { ...baseResult, attempts, success: true };
2004
+ } catch (error) {
2005
+ lastError = error instanceof Error ? error : new Error(String(error));
2006
+ const canRetry = isRetriableError2(error);
2007
+ if (attempt === config.retryAttempts - 1 || !canRetry) {
2008
+ break;
2009
+ }
2010
+ const delay = calculateDelay2(attempt);
2011
+ console.warn(`⚠️ Publish failed for ${packageName} (attempt ${attempt + 1}/${config.retryAttempts})`);
2012
+ console.warn(` ${lastError.message}`);
2013
+ console.warn(` Retrying in ${delay}ms...`);
2014
+ await sleep2(delay);
2015
+ }
2016
+ }
2017
+ return {
2018
+ ...baseResult,
2019
+ attempts,
2020
+ error: lastError?.message ?? "Unknown error",
2021
+ success: false
2022
+ };
2023
+ }
2024
+ async function publishAllPlatformPackages(config, version, generatedPackages, dryRun = false, verbose = false) {
2025
+ const results = [];
2026
+ const successfulPackages = generatedPackages.filter((p) => p.success);
2027
+ if (successfulPackages.length === 0) {
2028
+ return results;
2029
+ }
2030
+ const batchSize = 3;
2031
+ for (let i = 0;i < successfulPackages.length; i += batchSize) {
2032
+ const batch = successfulPackages.slice(i, i + batchSize);
2033
+ const batchPromises = batch.map(async (pkg) => {
2034
+ if (verbose) {
2035
+ console.log(`\uD83D\uDCE4 Publishing ${pkg.packageName}...`);
2036
+ }
2037
+ const result = await publishPlatformPackage(config, pkg.platform, version, dryRun);
2038
+ if (result.success) {
2039
+ if (verbose) {
2040
+ console.log(`✅ Published ${pkg.packageName}`);
2041
+ }
2042
+ } else {
2043
+ console.error(`❌ Failed to publish ${pkg.packageName}: ${result.error}`);
2044
+ }
2045
+ return result;
2046
+ });
2047
+ const batchResults = await Promise.all(batchPromises);
2048
+ results.push(...batchResults);
2049
+ if (i + batchSize < successfulPackages.length) {
2050
+ await sleep2(500);
2051
+ }
2052
+ }
2053
+ return results;
2054
+ }
2055
+ function printPublishDryRun(config, generatedPackages) {
2056
+ const successfulPackages = generatedPackages.filter((p) => p.success);
2057
+ console.log(`
2058
+ \uD83D\uDE80 Packages to publish:`);
2059
+ for (const pkg of successfulPackages) {
2060
+ console.log(` ${pkg.packageName} (${pkg.packageDir})`);
2061
+ }
2062
+ console.log(`
2063
+ \uD83D\uDCE4 Publish command: ${config.publishCommand}`);
2064
+ }
2065
+ function printPublishSummary(results, _config) {
2066
+ const successful = results.filter((r) => r.success);
2067
+ const failed = results.filter((r) => !r.success);
2068
+ console.log(`
2069
+ \uD83D\uDCCA Publish Summary:`);
2070
+ console.log(` Total: ${results.length}`);
2071
+ console.log(` Successful: ${successful.length}`);
2072
+ console.log(` Failed: ${failed.length}`);
2073
+ if (failed.length > 0) {
2074
+ console.log(`
2075
+ ❌ Failed packages:`);
2076
+ for (const result of failed) {
2077
+ console.log(` ${result.packageName}: ${result.error}`);
2078
+ }
2079
+ }
2080
+ }
2081
+
2082
+ // src/utils/binary-wrapper-generator.ts
2083
+ import { readFile as readFile3, writeFile as writeFile4 } from "node:fs/promises";
2084
+ import { resolve as resolve3 } from "node:path";
2085
+ function generateBinaryWrapper(config) {
2086
+ const binName = config.binName ?? config.name;
2087
+ const scope = config.scope.startsWith("@") ? config.scope : `@${config.scope}`;
2088
+ const platformEntries = config.platforms.map((platform) => {
2089
+ const packageName = getPackageName(config.scope, config.name, platform);
2090
+ const parts = platform.split("-");
2091
+ return ` "${parts[0]}-${parts[1]}": "${packageName}"`;
2092
+ });
2093
+ return `#!/usr/bin/env node
2094
+ "use strict";
2095
+
2096
+ const { platform, arch } = process;
2097
+ const { execFileSync } = require("child_process");
2098
+ const { join } = require("path");
2099
+
2100
+ const PLATFORMS = {
2101
+ ${platformEntries.join(`,
2102
+ `)}
2103
+ };
2104
+
2105
+ const platformKey = \`\${platform}-\${arch}\`;
2106
+ const pkg = PLATFORMS[platformKey];
2107
+
2108
+ if (!pkg) {
2109
+ console.error(\`Unsupported platform: \${platformKey}\`);
2110
+ console.error(\`Supported platforms: \${Object.keys(PLATFORMS).join(", ")}\`);
2111
+ process.exit(1);
2112
+ }
2113
+
2114
+ let binPath;
2115
+ try {
2116
+ // Try to resolve the platform-specific package
2117
+ const pkgPath = require.resolve(\`\${pkg}/package.json\`);
2118
+ const pkgDir = join(pkgPath, "..");
2119
+ const pkgJson = require(pkgPath);
2120
+ const binEntry = pkgJson.bin && pkgJson.bin["${binName}"];
2121
+
2122
+ if (!binEntry) {
2123
+ throw new Error(\`Binary entry not found in \${pkg}\`);
2124
+ }
2125
+
2126
+ binPath = join(pkgDir, binEntry);
2127
+ } catch (resolveError) {
2128
+ console.error(\`Failed to find binary package: \${pkg}\`);
2129
+ console.error(\`Please install it: npm install \${pkg}\`);
2130
+ console.error(\`Or reinstall the main package: npm install ${scope}/${config.name}\`);
2131
+ process.exit(1);
2132
+ }
2133
+
2134
+ try {
2135
+ const result = execFileSync(binPath, process.argv.slice(2), {
2136
+ stdio: "inherit",
2137
+ env: process.env
2138
+ });
2139
+ } catch (error) {
2140
+ // execFileSync throws on non-zero exit codes, pass through the exit code
2141
+ if (error.status !== undefined) {
2142
+ process.exit(error.status);
2143
+ }
2144
+ throw error;
2145
+ }
2146
+ `;
2147
+ }
2148
+ function generateOptionalDependencies(config, version, platforms) {
2149
+ const targetPlatforms = platforms ?? config.platforms;
2150
+ const deps = {};
2151
+ for (const platform of targetPlatforms) {
2152
+ const packageName = getPackageName(config.scope, config.name, platform);
2153
+ deps[packageName] = version;
2154
+ }
2155
+ return deps;
2156
+ }
2157
+ function generateMainPackageUpdates(config, version, platforms) {
2158
+ const binName = config.binName ?? config.name;
2159
+ return {
2160
+ bin: {
2161
+ [binName]: `bin/${binName}.js`
2162
+ },
2163
+ optionalDependencies: generateOptionalDependencies(config, version, platforms)
2164
+ };
2165
+ }
2166
+ async function updateMainPackageJson(packagePath, config, version, platforms, dryRun = false) {
2167
+ const fullPath = resolve3(packagePath);
2168
+ const content = await readFile3(fullPath, "utf-8");
2169
+ let pkg;
2170
+ try {
2171
+ pkg = JSON.parse(content);
2172
+ } catch (parseError) {
2173
+ throw new Error(`Failed to parse ${fullPath}: ${parseError instanceof Error ? parseError.message : "Invalid JSON"}`);
2174
+ }
2175
+ const updates = generateMainPackageUpdates(config, version, platforms);
2176
+ pkg.optionalDependencies = {
2177
+ ...pkg.optionalDependencies || {},
2178
+ ...updates.optionalDependencies
2179
+ };
2180
+ if (updates.bin) {
2181
+ pkg.bin = {
2182
+ ...pkg.bin || {},
2183
+ ...updates.bin
2184
+ };
2185
+ }
2186
+ if (dryRun) {
2187
+ return;
2188
+ }
2189
+ await writeFile4(fullPath, `${JSON.stringify(pkg, null, 2)}
2190
+ `);
2191
+ }
2192
+ function printMainPackageUpdatesDryRun(config, version, platforms) {
2193
+ const updates = generateMainPackageUpdates(config, version, platforms);
2194
+ console.log(`
2195
+ \uD83D\uDCDD Main package updates:`);
2196
+ console.log(" optionalDependencies:");
2197
+ for (const [name, ver] of Object.entries(updates.optionalDependencies)) {
2198
+ console.log(` "${name}": "${ver}"`);
2199
+ }
2200
+ if (updates.bin) {
2201
+ console.log(" bin:");
2202
+ for (const [name, path] of Object.entries(updates.bin)) {
2203
+ console.log(` "${name}": "${path}"`);
2204
+ }
2205
+ }
2206
+ }
2207
+
2208
+ // src/binaries.ts
2209
+ async function generateBinaryPackages(options = {}) {
2210
+ const result = {
2211
+ errors: [],
2212
+ packages: [],
2213
+ published: [],
2214
+ success: false,
2215
+ version: "",
2216
+ warnings: []
2217
+ };
2218
+ try {
2219
+ const config = await loadConfig(options.config);
2220
+ if (!config.binaries?.enabled) {
2221
+ result.errors.push("Binary distribution is not enabled in config");
2222
+ return result;
2223
+ }
2224
+ validateBinariesConfig(config.binaries);
2225
+ const binariesConfig = config.binaries;
2226
+ const version = options.version ?? await getCurrentVersion(".");
2227
+ result.version = version;
2228
+ const platforms = options.platforms ?? binariesConfig.platforms;
2229
+ const missingBinaries = await validateAllBinaries(binariesConfig.distDir, binariesConfig.name, platforms);
2230
+ if (missingBinaries.length > 0) {
2231
+ for (const platform of missingBinaries) {
2232
+ console.warn(`⚠️ Binary not found for platform: ${platform}`);
2233
+ result.warnings.push(`Binary not found for platform: ${platform}`);
2234
+ }
2235
+ if (missingBinaries.length === platforms.length) {
2236
+ result.errors.push("No binaries found for any platform");
2237
+ return result;
2238
+ }
2239
+ const availableCount = platforms.length - missingBinaries.length;
2240
+ console.warn(`
2241
+ ⚠️ Only ${availableCount} of ${platforms.length} platforms will be processed`);
2242
+ console.warn(` Missing: ${missingBinaries.join(", ")}`);
2243
+ console.warn(` Use --platforms flag to explicitly specify which platforms to publish
2244
+ `);
2245
+ }
2246
+ const availablePlatforms = platforms.filter((p) => !missingBinaries.includes(p));
2247
+ if (options.dryRun) {
2248
+ console.log(`
2249
+ \uD83D\uDD0D DRY RUN MODE
2250
+ `);
2251
+ printGenerationDryRun(binariesConfig, version, availablePlatforms);
2252
+ printMainPackageUpdatesDryRun(binariesConfig, version, availablePlatforms);
2253
+ result.packages = availablePlatforms.map((platform) => ({
2254
+ packageDir: "",
2255
+ packageName: "",
2256
+ platform,
2257
+ success: true
2258
+ }));
2259
+ result.success = true;
2260
+ return result;
2261
+ }
2262
+ console.log(`
2263
+ \uD83D\uDCE6 Generating binary packages...
2264
+ `);
2265
+ result.packages = await generateAllPlatformPackages(binariesConfig, version, availablePlatforms, false);
2266
+ const successfulPackages = result.packages.filter((p) => p.success);
2267
+ const failedPackages = result.packages.filter((p) => !p.success);
2268
+ console.log(`✅ Generated ${successfulPackages.length} packages`);
2269
+ if (failedPackages.length > 0) {
2270
+ for (const pkg of failedPackages) {
2271
+ result.warnings.push(`Failed to generate package for ${pkg.platform}: ${pkg.error}`);
2272
+ console.warn(`⚠️ Failed: ${pkg.platform} - ${pkg.error}`);
2273
+ }
2274
+ }
2275
+ if (!options.skipMainPackage) {
2276
+ const wrapperScript = generateBinaryWrapper(binariesConfig);
2277
+ const binDir = join3(dirname(binariesConfig.mainPackage), "bin");
2278
+ const binName = binariesConfig.binName ?? binariesConfig.name;
2279
+ await mkdir2(binDir, { recursive: true });
2280
+ await writeFile5(join3(binDir, `${binName}.js`), wrapperScript);
2281
+ console.log(`✅ Generated wrapper: bin/${binName}.js`);
2282
+ }
2283
+ result.success = successfulPackages.length > 0;
2284
+ } catch (error) {
2285
+ result.errors.push(error instanceof Error ? error.message : String(error));
2286
+ console.error(`
2287
+ ❌ Generation failed:`);
2288
+ console.error(error);
2289
+ }
2290
+ return result;
2291
+ }
2292
+ async function publishBinaries(options = {}) {
2293
+ const result = {
2294
+ errors: [],
2295
+ packages: [],
2296
+ published: [],
2297
+ success: false,
2298
+ version: "",
2299
+ warnings: []
2300
+ };
2301
+ try {
2302
+ const config = await loadConfig(options.config);
2303
+ if (!config.binaries?.enabled) {
2304
+ result.errors.push("Binary distribution is not enabled in config");
2305
+ return result;
2306
+ }
2307
+ validateBinariesConfig(config.binaries);
2308
+ const binariesConfig = config.binaries;
2309
+ const version = options.version ?? await getCurrentVersion(".");
2310
+ result.version = version;
2311
+ const platforms = options.platforms ?? binariesConfig.platforms;
2312
+ const missingBinaries = await validateAllBinaries(binariesConfig.distDir, binariesConfig.name, platforms);
2313
+ if (missingBinaries.length > 0) {
2314
+ for (const platform of missingBinaries) {
2315
+ console.warn(`⚠️ Binary not found for platform: ${platform}`);
2316
+ result.warnings.push(`Binary not found for platform: ${platform}`);
2317
+ }
2318
+ if (missingBinaries.length === platforms.length) {
2319
+ result.errors.push("No binaries found for any platform");
2320
+ return result;
2321
+ }
2322
+ const availableCount = platforms.length - missingBinaries.length;
2323
+ console.warn(`
2324
+ ⚠️ Only ${availableCount} of ${platforms.length} platforms will be processed`);
2325
+ console.warn(` Missing: ${missingBinaries.join(", ")}`);
2326
+ console.warn(` Use --platforms flag to explicitly specify which platforms to publish
2327
+ `);
2328
+ }
2329
+ const availablePlatforms = platforms.filter((p) => !missingBinaries.includes(p));
2330
+ if (options.dryRun) {
2331
+ console.log(`
2332
+ \uD83D\uDD0D DRY RUN MODE
2333
+ `);
2334
+ printGenerationDryRun(binariesConfig, version, availablePlatforms);
2335
+ const dryRunPackages = availablePlatforms.map((platform) => ({
2336
+ packageDir: "",
2337
+ packageName: "",
2338
+ platform,
2339
+ success: true
2340
+ }));
2341
+ printPublishDryRun(binariesConfig, dryRunPackages);
2342
+ printMainPackageUpdatesDryRun(binariesConfig, version, availablePlatforms);
2343
+ result.packages = dryRunPackages;
2344
+ result.success = true;
2345
+ return result;
2346
+ }
2347
+ console.log(`
2348
+ \uD83D\uDCE6 Generating binary packages...
2349
+ `);
2350
+ result.packages = await generateAllPlatformPackages(binariesConfig, version, availablePlatforms, false);
2351
+ const successfulPackages = result.packages.filter((p) => p.success);
2352
+ const failedPackages = result.packages.filter((p) => !p.success);
2353
+ console.log(`✅ Generated ${successfulPackages.length} packages`);
2354
+ if (failedPackages.length > 0) {
2355
+ for (const pkg of failedPackages) {
2356
+ result.warnings.push(`Failed to generate package for ${pkg.platform}: ${pkg.error}`);
2357
+ console.warn(`⚠️ Failed: ${pkg.platform} - ${pkg.error}`);
2358
+ }
2359
+ if (!binariesConfig.continueOnError && failedPackages.length > 0) {
2360
+ result.errors.push("Some packages failed to generate");
2361
+ return result;
2362
+ }
2363
+ }
2364
+ if (successfulPackages.length === 0) {
2365
+ result.errors.push("No packages generated successfully");
2366
+ return result;
2367
+ }
2368
+ if (options.generateOnly) {
2369
+ if (!options.skipMainPackage) {
2370
+ const wrapperScript = generateBinaryWrapper(binariesConfig);
2371
+ const binDir = join3(dirname(binariesConfig.mainPackage), "bin");
2372
+ const binName = binariesConfig.binName ?? binariesConfig.name;
2373
+ await mkdir2(binDir, { recursive: true });
2374
+ await writeFile5(join3(binDir, `${binName}.js`), wrapperScript);
2375
+ console.log(`✅ Generated wrapper: bin/${binName}.js`);
2376
+ }
2377
+ result.success = true;
2378
+ return result;
2379
+ }
2380
+ console.log(`
2381
+ \uD83D\uDE80 Publishing platform packages...
2382
+ `);
2383
+ result.published = await publishAllPlatformPackages(binariesConfig, version, result.packages, false, options.verbose);
2384
+ const successfulPublishes = result.published.filter((p) => p.success);
2385
+ const failedPublishes = result.published.filter((p) => !p.success);
2386
+ printPublishSummary(result.published, binariesConfig);
2387
+ if (failedPublishes.length > 0) {
2388
+ for (const pub of failedPublishes) {
2389
+ result.warnings.push(`Failed to publish ${pub.packageName}: ${pub.error}`);
2390
+ }
2391
+ if (!binariesConfig.continueOnError) {
2392
+ result.errors.push("Some packages failed to publish");
2393
+ return result;
2394
+ }
2395
+ }
2396
+ if (!options.skipMainPackage) {
2397
+ console.log(`
2398
+ \uD83D\uDCDD Updating main package.json...
2399
+ `);
2400
+ const wrapperScript = generateBinaryWrapper(binariesConfig);
2401
+ const binDir = join3(dirname(binariesConfig.mainPackage), "bin");
2402
+ const binName = binariesConfig.binName ?? binariesConfig.name;
2403
+ await mkdir2(binDir, { recursive: true });
2404
+ await writeFile5(join3(binDir, `${binName}.js`), wrapperScript);
2405
+ const publishedPlatforms = successfulPublishes.map((p) => p.platform);
2406
+ await updateMainPackageJson(binariesConfig.mainPackage, binariesConfig, version, publishedPlatforms, false);
2407
+ console.log(`✅ Updated ${binariesConfig.mainPackage}`);
2408
+ console.log(`✅ Generated wrapper: bin/${binName}.js`);
2409
+ }
2410
+ result.success = successfulPublishes.length > 0;
2411
+ if (result.success) {
2412
+ console.log(`
2413
+ ✅ Binary distribution completed successfully!
2414
+ `);
2415
+ }
2416
+ } catch (error) {
2417
+ result.errors.push(error instanceof Error ? error.message : String(error));
2418
+ console.error(`
2419
+ ❌ Binary distribution failed:`);
2420
+ console.error(error);
2421
+ }
2422
+ return result;
2423
+ }
2424
+
1363
2425
  // src/index.ts
1364
2426
  function printDryRunInfo(pkg, currentVersion, versionBump, tag, commits, changelogEntry) {
1365
2427
  console.log(`
@@ -1388,7 +2450,7 @@ function printSuccessInfo(pkg, currentVersion, newVersion, tag, releaseUrl) {
1388
2450
  }
1389
2451
  async function updatePackageFiles(pkg, newVersion, changelogEntry) {
1390
2452
  await updatePackageVersion(pkg.path, newVersion);
1391
- const changelogPath = resolve2(pkg.path, pkg.changelog);
2453
+ const changelogPath = resolve4(pkg.path, pkg.changelog);
1392
2454
  await updateChangelogFile(changelogPath, changelogEntry);
1393
2455
  return changelogPath;
1394
2456
  }
@@ -1441,7 +2503,7 @@ async function performGitOperations(config, options, pkg, newVersion, tag, chang
1441
2503
  }
1442
2504
  }
1443
2505
  const commitMessage = config.git.commitMessage.replace("{{package}}", pkg.name).replace("{{version}}", newVersion);
1444
- await createCommit(commitMessage, [resolve2(pkg.path, "package.json"), changelogPath]);
2506
+ await createCommit(commitMessage, [resolve4(pkg.path, "package.json"), changelogPath]);
1445
2507
  }
1446
2508
  if (!options.noTag) {
1447
2509
  const tagMessage = config.git.tagMessage.replace("{{package}}", pkg.name).replace("{{version}}", newVersion);
@@ -1596,10 +2658,31 @@ async function createReleaseOnly(tag, packageName, configPath) {
1596
2658
  }
1597
2659
  export {
1598
2660
  validateConfig,
2661
+ validateBinaryExists,
2662
+ validateBinariesConfig,
2663
+ validateAllBinaries,
1599
2664
  release,
2665
+ publishBinaries,
2666
+ platformToNodeValues,
2667
+ parsePlatforms,
1600
2668
  loadConfig,
2669
+ isValidPlatform,
2670
+ initConfig,
2671
+ getPlatformDir,
2672
+ getPackageOutputPath,
2673
+ getPackageName,
2674
+ getBinaryPath,
2675
+ generateConfigContent,
2676
+ generateBinaryPackages,
2677
+ expandPlaceholders,
1601
2678
  createReleaseOnly,
1602
- createGitVerseClient
2679
+ createGitVerseClient,
2680
+ configExists,
2681
+ PLATFORM_MAPPINGS,
2682
+ DEFAULT_CONFIG_FILE_NAME,
2683
+ DEFAULT_BINARY_PLATFORMS,
2684
+ DEFAULT_BINARIES_CONFIG,
2685
+ ALL_PLATFORMS
1603
2686
  };
1604
2687
 
1605
- //# debugId=8FCBF5654EF1CAB964756E2164756E21
2688
+ //# debugId=0CEBBBAE18C384F864756E2164756E21