@pipelab/plugin-construct 1.0.0-beta.27 → 1.0.0-beta.31

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.cjs CHANGED
@@ -89549,7 +89549,7 @@ const runWithLiveLogs = async (command, args, execaOptions, log, hooks, abortSig
89549
89549
  TERM: "xterm-256color",
89550
89550
  FORCE_STDERR_LOGGING: "1"
89551
89551
  },
89552
- cancelSignal: abortSignal
89552
+ cancelSignal: abortSignal ?? execaOptions.cancelSignal
89553
89553
  });
89554
89554
  hooks?.onCreated?.(subprocess);
89555
89555
  subprocess.stdout?.on("data", (data) => {
@@ -151255,6 +151255,17 @@ async function isOnline() {
151255
151255
  lastCheckTime = now;
151256
151256
  return isOnlineCached;
151257
151257
  }
151258
+ function allowPrereleaseInRange(rangeStr) {
151259
+ try {
151260
+ return new import_semver.default.Range(rangeStr).set.map((conj) => conj.map((c) => {
151261
+ const v = c.semver;
151262
+ if (v.prerelease && v.prerelease.length) return c.operator + v.format();
151263
+ return c.operator + v.major + "." + v.minor + "." + v.patch + "-0";
151264
+ }).join(" ")).join(" || ");
151265
+ } catch {
151266
+ return rangeStr;
151267
+ }
151268
+ }
151258
151269
  /**
151259
151270
  * Robust utility to fetch, cache, and resolve an NPM package.
151260
151271
  * Centralized in core-node to avoid circular dependencies.
@@ -151277,6 +151288,7 @@ async function fetchPackage(packageName, versionOrRange, options) {
151277
151288
  const ctx = options.context;
151278
151289
  const baseDir = ctx.getPackagesPath(packageName);
151279
151290
  let resolvedVersion;
151291
+ const includePrerelease = !!(ctx.releaseTag && ctx.releaseTag !== "latest");
151280
151292
  let resolvedVersionOrRange = versionOrRange;
151281
151293
  if (resolvedVersionOrRange === "local") resolvedVersionOrRange = "latest";
151282
151294
  console.log(`[Fetcher] Resolving ${packageName}@${resolvedVersionOrRange || "latest"}...`);
@@ -151284,7 +151296,7 @@ async function fetchPackage(packageName, versionOrRange, options) {
151284
151296
  if (!await isOnline()) {
151285
151297
  console.warn(`[Fetcher] ${packageName}: offline mode detected (${Date.now() - resolveStart}ms), trying local fallback...`);
151286
151298
  const fallbackStart = Date.now();
151287
- const fallbackVersion = await tryLocalFallback(resolvedVersionOrRange, /* @__PURE__ */ new Error("Offline"), baseDir, packageName);
151299
+ const fallbackVersion = await tryLocalFallback(resolvedVersionOrRange, /* @__PURE__ */ new Error("Offline"), baseDir, packageName, includePrerelease);
151288
151300
  if (fallbackVersion) {
151289
151301
  resolvedVersion = fallbackVersion;
151290
151302
  console.log(`[Fetcher] ${packageName}: Resolved to local fallback ${resolvedVersion} (${Date.now() - fallbackStart}ms)`);
@@ -151299,7 +151311,27 @@ async function fetchPackage(packageName, versionOrRange, options) {
151299
151311
  const packument = await packumentPromise;
151300
151312
  const versions = Object.keys(packument.versions);
151301
151313
  const range = resolvedVersionOrRange || "latest";
151302
- let foundVersion = packument["dist-tags"]?.[range] || import_semver.default.maxSatisfying(versions, range);
151314
+ let foundVersion = packument["dist-tags"]?.[range] || import_semver.default.maxSatisfying(versions, range, { includePrerelease });
151315
+ if (!foundVersion && ctx.releaseTag && ctx.releaseTag !== "latest") {
151316
+ const releaseTagVersion = packument["dist-tags"]?.[ctx.releaseTag];
151317
+ if (releaseTagVersion && import_semver.default.valid(releaseTagVersion)) {
151318
+ const rewrittenRangeForCheck = allowPrereleaseInRange(range);
151319
+ if (import_semver.default.satisfies(releaseTagVersion, rewrittenRangeForCheck, { includePrerelease: true })) {
151320
+ console.log(`[Fetcher] Using release tag "${ctx.releaseTag}" (${releaseTagVersion}) for ${packageName}@${range} because it satisfies the range`);
151321
+ foundVersion = releaseTagVersion;
151322
+ }
151323
+ }
151324
+ }
151325
+ if (!foundVersion && includePrerelease) {
151326
+ const rewrittenRange = allowPrereleaseInRange(range);
151327
+ if (rewrittenRange !== range) {
151328
+ const matched = import_semver.default.maxSatisfying(versions, rewrittenRange, { includePrerelease });
151329
+ if (matched) {
151330
+ console.log(`[Fetcher] Resolved ${packageName}@${range} to ${matched} via rewritten range ${rewrittenRange}`);
151331
+ foundVersion = matched;
151332
+ }
151333
+ }
151334
+ }
151303
151335
  if (range === "latest" && ctx.releaseTag && ctx.releaseTag !== "latest") {
151304
151336
  const releaseTagVersion = packument["dist-tags"]?.[ctx.releaseTag];
151305
151337
  if (releaseTagVersion && import_semver.default.valid(releaseTagVersion)) {
@@ -151315,7 +151347,7 @@ async function fetchPackage(packageName, versionOrRange, options) {
151315
151347
  } catch (error) {
151316
151348
  console.warn(`[Fetcher] ${packageName}: remote resolution failed (${Date.now() - resolveStart}ms), trying local fallback...`);
151317
151349
  const fallbackStart = Date.now();
151318
- const fallbackVersion = await tryLocalFallback(resolvedVersionOrRange, error, baseDir, packageName);
151350
+ const fallbackVersion = await tryLocalFallback(resolvedVersionOrRange, error, baseDir, packageName, includePrerelease);
151319
151351
  if (fallbackVersion) {
151320
151352
  resolvedVersion = fallbackVersion;
151321
151353
  console.log(`[Fetcher] ${packageName}: Resolved to local fallback ${resolvedVersion} (${Date.now() - fallbackStart}ms)`);
@@ -151497,35 +151529,24 @@ async function installDependencies(packageDir, packageName, options) {
151497
151529
  console.log(`[Fetcher] ${packageName}: Dependencies already installed, skipping.`);
151498
151530
  return;
151499
151531
  }
151500
- const tempDir = `${packageDir}.tmp-deps-${Math.random().toString(36).slice(2)}`;
151501
- await (0, node_fs_promises.mkdir)(tempDir, { recursive: true });
151502
151532
  try {
151503
- await (0, node_fs_promises.cp)((0, node_path.join)(packageDir, "package.json"), (0, node_path.join)(tempDir, "package.json"));
151504
151533
  console.log(`[Fetcher] ${packageName}: Ensuring dependencies are installed...`);
151505
151534
  const pnpmStart = Date.now();
151506
- const { all } = await runPnpm(tempDir, {
151535
+ const { all } = await runPnpm(packageDir, {
151507
151536
  signal: options.signal,
151508
151537
  context: options.context
151509
151538
  });
151510
151539
  console.log(`[Fetcher] ${packageName}: pnpm install command took ${Date.now() - pnpmStart}ms`);
151511
151540
  if (all) console.log(`[Fetcher] ${packageName}: Installation trace:\n${all}`);
151512
- const tempNodeModules = (0, node_path.join)(tempDir, "node_modules");
151513
- if ((0, node_fs.existsSync)(nodeModulesPath)) await (0, node_fs_promises.rm)(nodeModulesPath, {
151514
- recursive: true,
151515
- force: true
151516
- }).catch(() => {});
151517
- const renameStart = Date.now();
151518
- await (0, node_fs_promises.rename)(tempNodeModules, nodeModulesPath);
151519
- console.log(`[Fetcher] ${packageName}: Dependencies installed successfully (rename took ${Date.now() - renameStart}ms, total installDependencies took ${Date.now() - start}ms).`);
151541
+ console.log(`[Fetcher] ${packageName}: Dependencies installed successfully (total installDependencies took ${Date.now() - start}ms).`);
151520
151542
  } catch (err) {
151521
151543
  console.error(`[Fetcher] ${packageName}: CRITICAL ERROR during dependency installation: ${err.message}`);
151522
151544
  if (err.all) console.error(`[Fetcher] ${packageName}: Error details:\n${err.all}`);
151523
- throw new Error(`Failed to install dependencies for ${packageName}. See logs for details.`);
151524
- } finally {
151525
- await (0, node_fs_promises.rm)(tempDir, {
151545
+ await (0, node_fs_promises.rm)(nodeModulesPath, {
151526
151546
  recursive: true,
151527
151547
  force: true
151528
151548
  }).catch(() => {});
151549
+ throw new Error(`Failed to install dependencies for ${packageName}. See logs for details.`);
151529
151550
  }
151530
151551
  }
151531
151552
  /**
@@ -151581,7 +151602,7 @@ async function crawlMonorepoPackages() {
151581
151602
  }
151582
151603
  return cache;
151583
151604
  }
151584
- async function tryLocalFallback(versionOrRange, _error, baseDir, logPrefix) {
151605
+ async function tryLocalFallback(versionOrRange, _error, baseDir, logPrefix, includePrerelease = false) {
151585
151606
  if (!(0, node_fs.existsSync)(baseDir)) return null;
151586
151607
  try {
151587
151608
  const localVersions = (await (0, node_fs_promises.readdir)(baseDir, { withFileTypes: true })).filter((e) => e.isDirectory() || e.isSymbolicLink()).map((e) => e.name).filter((name) => !!import_semver.default.valid(name));
@@ -151594,7 +151615,7 @@ async function tryLocalFallback(versionOrRange, _error, baseDir, logPrefix) {
151594
151615
  return latestLocal;
151595
151616
  }
151596
151617
  } else {
151597
- const matched = import_semver.default.maxSatisfying(localVersions, range);
151618
+ const matched = import_semver.default.maxSatisfying(localVersions, range, { includePrerelease });
151598
151619
  if (matched) {
151599
151620
  console.info(`[Fetcher] ${logPrefix}: Using locally cached matching version: ${matched} for range ${range}`);
151600
151621
  return matched;
@@ -151662,11 +151683,29 @@ const fileExists = async (path) => {
151662
151683
  };
151663
151684
  //#endregion
151664
151685
  //#region ../plugin-core/src/archive-utils.ts
151665
- const zipFolder = async (from, to, log) => {
151686
+ const zipFolder = async (from, to, log, abortSignal) => {
151687
+ if (abortSignal?.aborted) {
151688
+ const abortError = /* @__PURE__ */ new Error("Aborted");
151689
+ abortError.name = "AbortError";
151690
+ throw abortError;
151691
+ }
151666
151692
  const output = (0, node_fs.createWriteStream)(to);
151667
151693
  const archive = (0, import_archiver.default)("zip", { zlib: { level: 9 } });
151668
- return new Promise(async (resolve, reject) => {
151694
+ return new Promise((resolve, reject) => {
151695
+ const onAbort = () => {
151696
+ try {
151697
+ archive.abort();
151698
+ } catch {}
151699
+ try {
151700
+ output.destroy();
151701
+ } catch {}
151702
+ const abortError = /* @__PURE__ */ new Error("Aborted");
151703
+ abortError.name = "AbortError";
151704
+ reject(abortError);
151705
+ };
151706
+ if (abortSignal) abortSignal.addEventListener("abort", onAbort);
151669
151707
  output.on("close", function() {
151708
+ if (abortSignal) abortSignal.removeEventListener("abort", onAbort);
151670
151709
  log(archive.pointer() + " total bytes");
151671
151710
  log("archiver has been finalized and the output file descriptor has closed.");
151672
151711
  resolve(to);
@@ -151675,11 +151714,15 @@ const zipFolder = async (from, to, log) => {
151675
151714
  log("Data has been drained");
151676
151715
  });
151677
151716
  archive.on("error", function(err) {
151717
+ if (abortSignal) abortSignal.removeEventListener("abort", onAbort);
151678
151718
  reject(err);
151679
151719
  });
151680
151720
  archive.pipe(output);
151681
151721
  archive.directory(from, false);
151682
- await archive.finalize();
151722
+ archive.finalize().catch((err) => {
151723
+ if (abortSignal) abortSignal.removeEventListener("abort", onAbort);
151724
+ reject(err);
151725
+ });
151683
151726
  });
151684
151727
  };
151685
151728
  //#endregion
@@ -151931,10 +151974,11 @@ const sharedParams = {
151931
151974
  const exportc3p = async (file, { cwd, log, inputs, setOutput, paths, abortSignal, context: ctx }) => {
151932
151975
  let browserContext = void 0;
151933
151976
  let browser = void 0;
151934
- abortSignal.addEventListener("abort", () => {
151977
+ const onAbort = () => {
151935
151978
  console.error("aborted");
151936
151979
  browserContext?.close();
151937
- });
151980
+ };
151981
+ abortSignal.addEventListener("abort", onAbort);
151938
151982
  const newInputs = inputs;
151939
151983
  const { thirdparty, node, pnpm } = paths;
151940
151984
  const browserName = "chromium";
@@ -152031,6 +152075,7 @@ const exportc3p = async (file, { cwd, log, inputs, setOutput, paths, abortSignal
152031
152075
  log("error, no result, crashed", e);
152032
152076
  throw new Error("ConstructExport failed: " + e.message);
152033
152077
  } finally {
152078
+ abortSignal.removeEventListener("abort", onAbort);
152034
152079
  if (browserContext) await browserContext.close();
152035
152080
  if (browser) await browser.close();
152036
152081
  }
@@ -152129,9 +152174,10 @@ const exportProjectAction = createAction({
152129
152174
  icon: ""
152130
152175
  });
152131
152176
  const ExportProjectActionRunner = createActionRunner(async (options) => {
152132
- if (!await fileExists(options.inputs.folder)) throw new Error("You must specify a valid construct project folder");
152133
- const outputPath = (0, node_path.join)(options.cwd, "c3_tmp_proj.c3p");
152134
- await exportc3p(await zipFolder(options.inputs.folder, outputPath, options.log), options);
152177
+ const folder = options.inputs.folder;
152178
+ if (!folder) throw new Error("You must specify a valid construct project folder");
152179
+ if (!await fileExists(folder)) throw new Error("You must specify a valid construct project folder");
152180
+ await exportc3p(await zipFolder(folder, (0, node_path.join)(options.cwd, "c3_tmp_proj.c3p"), options.log, options.abortSignal), options);
152135
152181
  });
152136
152182
  //#endregion
152137
152183
  //#region src/index.ts
package/dist/index.mjs CHANGED
@@ -89542,7 +89542,7 @@ const runWithLiveLogs = async (command, args, execaOptions, log, hooks, abortSig
89542
89542
  TERM: "xterm-256color",
89543
89543
  FORCE_STDERR_LOGGING: "1"
89544
89544
  },
89545
- cancelSignal: abortSignal
89545
+ cancelSignal: abortSignal ?? execaOptions.cancelSignal
89546
89546
  });
89547
89547
  hooks?.onCreated?.(subprocess);
89548
89548
  subprocess.stdout?.on("data", (data) => {
@@ -151249,6 +151249,17 @@ async function isOnline() {
151249
151249
  lastCheckTime = now;
151250
151250
  return isOnlineCached;
151251
151251
  }
151252
+ function allowPrereleaseInRange(rangeStr) {
151253
+ try {
151254
+ return new import_semver.default.Range(rangeStr).set.map((conj) => conj.map((c) => {
151255
+ const v = c.semver;
151256
+ if (v.prerelease && v.prerelease.length) return c.operator + v.format();
151257
+ return c.operator + v.major + "." + v.minor + "." + v.patch + "-0";
151258
+ }).join(" ")).join(" || ");
151259
+ } catch {
151260
+ return rangeStr;
151261
+ }
151262
+ }
151252
151263
  /**
151253
151264
  * Robust utility to fetch, cache, and resolve an NPM package.
151254
151265
  * Centralized in core-node to avoid circular dependencies.
@@ -151271,6 +151282,7 @@ async function fetchPackage(packageName, versionOrRange, options) {
151271
151282
  const ctx = options.context;
151272
151283
  const baseDir = ctx.getPackagesPath(packageName);
151273
151284
  let resolvedVersion;
151285
+ const includePrerelease = !!(ctx.releaseTag && ctx.releaseTag !== "latest");
151274
151286
  let resolvedVersionOrRange = versionOrRange;
151275
151287
  if (resolvedVersionOrRange === "local") resolvedVersionOrRange = "latest";
151276
151288
  console.log(`[Fetcher] Resolving ${packageName}@${resolvedVersionOrRange || "latest"}...`);
@@ -151278,7 +151290,7 @@ async function fetchPackage(packageName, versionOrRange, options) {
151278
151290
  if (!await isOnline()) {
151279
151291
  console.warn(`[Fetcher] ${packageName}: offline mode detected (${Date.now() - resolveStart}ms), trying local fallback...`);
151280
151292
  const fallbackStart = Date.now();
151281
- const fallbackVersion = await tryLocalFallback(resolvedVersionOrRange, /* @__PURE__ */ new Error("Offline"), baseDir, packageName);
151293
+ const fallbackVersion = await tryLocalFallback(resolvedVersionOrRange, /* @__PURE__ */ new Error("Offline"), baseDir, packageName, includePrerelease);
151282
151294
  if (fallbackVersion) {
151283
151295
  resolvedVersion = fallbackVersion;
151284
151296
  console.log(`[Fetcher] ${packageName}: Resolved to local fallback ${resolvedVersion} (${Date.now() - fallbackStart}ms)`);
@@ -151293,7 +151305,27 @@ async function fetchPackage(packageName, versionOrRange, options) {
151293
151305
  const packument = await packumentPromise;
151294
151306
  const versions = Object.keys(packument.versions);
151295
151307
  const range = resolvedVersionOrRange || "latest";
151296
- let foundVersion = packument["dist-tags"]?.[range] || import_semver.default.maxSatisfying(versions, range);
151308
+ let foundVersion = packument["dist-tags"]?.[range] || import_semver.default.maxSatisfying(versions, range, { includePrerelease });
151309
+ if (!foundVersion && ctx.releaseTag && ctx.releaseTag !== "latest") {
151310
+ const releaseTagVersion = packument["dist-tags"]?.[ctx.releaseTag];
151311
+ if (releaseTagVersion && import_semver.default.valid(releaseTagVersion)) {
151312
+ const rewrittenRangeForCheck = allowPrereleaseInRange(range);
151313
+ if (import_semver.default.satisfies(releaseTagVersion, rewrittenRangeForCheck, { includePrerelease: true })) {
151314
+ console.log(`[Fetcher] Using release tag "${ctx.releaseTag}" (${releaseTagVersion}) for ${packageName}@${range} because it satisfies the range`);
151315
+ foundVersion = releaseTagVersion;
151316
+ }
151317
+ }
151318
+ }
151319
+ if (!foundVersion && includePrerelease) {
151320
+ const rewrittenRange = allowPrereleaseInRange(range);
151321
+ if (rewrittenRange !== range) {
151322
+ const matched = import_semver.default.maxSatisfying(versions, rewrittenRange, { includePrerelease });
151323
+ if (matched) {
151324
+ console.log(`[Fetcher] Resolved ${packageName}@${range} to ${matched} via rewritten range ${rewrittenRange}`);
151325
+ foundVersion = matched;
151326
+ }
151327
+ }
151328
+ }
151297
151329
  if (range === "latest" && ctx.releaseTag && ctx.releaseTag !== "latest") {
151298
151330
  const releaseTagVersion = packument["dist-tags"]?.[ctx.releaseTag];
151299
151331
  if (releaseTagVersion && import_semver.default.valid(releaseTagVersion)) {
@@ -151309,7 +151341,7 @@ async function fetchPackage(packageName, versionOrRange, options) {
151309
151341
  } catch (error) {
151310
151342
  console.warn(`[Fetcher] ${packageName}: remote resolution failed (${Date.now() - resolveStart}ms), trying local fallback...`);
151311
151343
  const fallbackStart = Date.now();
151312
- const fallbackVersion = await tryLocalFallback(resolvedVersionOrRange, error, baseDir, packageName);
151344
+ const fallbackVersion = await tryLocalFallback(resolvedVersionOrRange, error, baseDir, packageName, includePrerelease);
151313
151345
  if (fallbackVersion) {
151314
151346
  resolvedVersion = fallbackVersion;
151315
151347
  console.log(`[Fetcher] ${packageName}: Resolved to local fallback ${resolvedVersion} (${Date.now() - fallbackStart}ms)`);
@@ -151491,35 +151523,24 @@ async function installDependencies(packageDir, packageName, options) {
151491
151523
  console.log(`[Fetcher] ${packageName}: Dependencies already installed, skipping.`);
151492
151524
  return;
151493
151525
  }
151494
- const tempDir = `${packageDir}.tmp-deps-${Math.random().toString(36).slice(2)}`;
151495
- await mkdir(tempDir, { recursive: true });
151496
151526
  try {
151497
- await cp(join(packageDir, "package.json"), join(tempDir, "package.json"));
151498
151527
  console.log(`[Fetcher] ${packageName}: Ensuring dependencies are installed...`);
151499
151528
  const pnpmStart = Date.now();
151500
- const { all } = await runPnpm(tempDir, {
151529
+ const { all } = await runPnpm(packageDir, {
151501
151530
  signal: options.signal,
151502
151531
  context: options.context
151503
151532
  });
151504
151533
  console.log(`[Fetcher] ${packageName}: pnpm install command took ${Date.now() - pnpmStart}ms`);
151505
151534
  if (all) console.log(`[Fetcher] ${packageName}: Installation trace:\n${all}`);
151506
- const tempNodeModules = join(tempDir, "node_modules");
151507
- if (existsSync(nodeModulesPath)) await rm(nodeModulesPath, {
151508
- recursive: true,
151509
- force: true
151510
- }).catch(() => {});
151511
- const renameStart = Date.now();
151512
- await rename(tempNodeModules, nodeModulesPath);
151513
- console.log(`[Fetcher] ${packageName}: Dependencies installed successfully (rename took ${Date.now() - renameStart}ms, total installDependencies took ${Date.now() - start}ms).`);
151535
+ console.log(`[Fetcher] ${packageName}: Dependencies installed successfully (total installDependencies took ${Date.now() - start}ms).`);
151514
151536
  } catch (err) {
151515
151537
  console.error(`[Fetcher] ${packageName}: CRITICAL ERROR during dependency installation: ${err.message}`);
151516
151538
  if (err.all) console.error(`[Fetcher] ${packageName}: Error details:\n${err.all}`);
151517
- throw new Error(`Failed to install dependencies for ${packageName}. See logs for details.`);
151518
- } finally {
151519
- await rm(tempDir, {
151539
+ await rm(nodeModulesPath, {
151520
151540
  recursive: true,
151521
151541
  force: true
151522
151542
  }).catch(() => {});
151543
+ throw new Error(`Failed to install dependencies for ${packageName}. See logs for details.`);
151523
151544
  }
151524
151545
  }
151525
151546
  /**
@@ -151575,7 +151596,7 @@ async function crawlMonorepoPackages() {
151575
151596
  }
151576
151597
  return cache;
151577
151598
  }
151578
- async function tryLocalFallback(versionOrRange, _error, baseDir, logPrefix) {
151599
+ async function tryLocalFallback(versionOrRange, _error, baseDir, logPrefix, includePrerelease = false) {
151579
151600
  if (!existsSync(baseDir)) return null;
151580
151601
  try {
151581
151602
  const localVersions = (await readdir(baseDir, { withFileTypes: true })).filter((e) => e.isDirectory() || e.isSymbolicLink()).map((e) => e.name).filter((name) => !!import_semver.default.valid(name));
@@ -151588,7 +151609,7 @@ async function tryLocalFallback(versionOrRange, _error, baseDir, logPrefix) {
151588
151609
  return latestLocal;
151589
151610
  }
151590
151611
  } else {
151591
- const matched = import_semver.default.maxSatisfying(localVersions, range);
151612
+ const matched = import_semver.default.maxSatisfying(localVersions, range, { includePrerelease });
151592
151613
  if (matched) {
151593
151614
  console.info(`[Fetcher] ${logPrefix}: Using locally cached matching version: ${matched} for range ${range}`);
151594
151615
  return matched;
@@ -151656,11 +151677,29 @@ const fileExists = async (path) => {
151656
151677
  };
151657
151678
  //#endregion
151658
151679
  //#region ../plugin-core/src/archive-utils.ts
151659
- const zipFolder = async (from, to, log) => {
151680
+ const zipFolder = async (from, to, log, abortSignal) => {
151681
+ if (abortSignal?.aborted) {
151682
+ const abortError = /* @__PURE__ */ new Error("Aborted");
151683
+ abortError.name = "AbortError";
151684
+ throw abortError;
151685
+ }
151660
151686
  const output = createWriteStream(to);
151661
151687
  const archive = (0, import_archiver.default)("zip", { zlib: { level: 9 } });
151662
- return new Promise(async (resolve, reject) => {
151688
+ return new Promise((resolve, reject) => {
151689
+ const onAbort = () => {
151690
+ try {
151691
+ archive.abort();
151692
+ } catch {}
151693
+ try {
151694
+ output.destroy();
151695
+ } catch {}
151696
+ const abortError = /* @__PURE__ */ new Error("Aborted");
151697
+ abortError.name = "AbortError";
151698
+ reject(abortError);
151699
+ };
151700
+ if (abortSignal) abortSignal.addEventListener("abort", onAbort);
151663
151701
  output.on("close", function() {
151702
+ if (abortSignal) abortSignal.removeEventListener("abort", onAbort);
151664
151703
  log(archive.pointer() + " total bytes");
151665
151704
  log("archiver has been finalized and the output file descriptor has closed.");
151666
151705
  resolve(to);
@@ -151669,11 +151708,15 @@ const zipFolder = async (from, to, log) => {
151669
151708
  log("Data has been drained");
151670
151709
  });
151671
151710
  archive.on("error", function(err) {
151711
+ if (abortSignal) abortSignal.removeEventListener("abort", onAbort);
151672
151712
  reject(err);
151673
151713
  });
151674
151714
  archive.pipe(output);
151675
151715
  archive.directory(from, false);
151676
- await archive.finalize();
151716
+ archive.finalize().catch((err) => {
151717
+ if (abortSignal) abortSignal.removeEventListener("abort", onAbort);
151718
+ reject(err);
151719
+ });
151677
151720
  });
151678
151721
  };
151679
151722
  //#endregion
@@ -151925,10 +151968,11 @@ const sharedParams = {
151925
151968
  const exportc3p = async (file, { cwd, log, inputs, setOutput, paths, abortSignal, context: ctx }) => {
151926
151969
  let browserContext = void 0;
151927
151970
  let browser = void 0;
151928
- abortSignal.addEventListener("abort", () => {
151971
+ const onAbort = () => {
151929
151972
  console.error("aborted");
151930
151973
  browserContext?.close();
151931
- });
151974
+ };
151975
+ abortSignal.addEventListener("abort", onAbort);
151932
151976
  const newInputs = inputs;
151933
151977
  const { thirdparty, node, pnpm } = paths;
151934
151978
  const browserName = "chromium";
@@ -152025,6 +152069,7 @@ const exportc3p = async (file, { cwd, log, inputs, setOutput, paths, abortSignal
152025
152069
  log("error, no result, crashed", e);
152026
152070
  throw new Error("ConstructExport failed: " + e.message);
152027
152071
  } finally {
152072
+ abortSignal.removeEventListener("abort", onAbort);
152028
152073
  if (browserContext) await browserContext.close();
152029
152074
  if (browser) await browser.close();
152030
152075
  }
@@ -152123,9 +152168,10 @@ const exportProjectAction = createAction({
152123
152168
  icon: ""
152124
152169
  });
152125
152170
  const ExportProjectActionRunner = createActionRunner(async (options) => {
152126
- if (!await fileExists(options.inputs.folder)) throw new Error("You must specify a valid construct project folder");
152127
- const outputPath = join(options.cwd, "c3_tmp_proj.c3p");
152128
- await exportc3p(await zipFolder(options.inputs.folder, outputPath, options.log), options);
152171
+ const folder = options.inputs.folder;
152172
+ if (!folder) throw new Error("You must specify a valid construct project folder");
152173
+ if (!await fileExists(folder)) throw new Error("You must specify a valid construct project folder");
152174
+ await exportc3p(await zipFolder(folder, join(options.cwd, "c3_tmp_proj.c3p"), options.log, options.abortSignal), options);
152129
152175
  });
152130
152176
  //#endregion
152131
152177
  //#region src/index.ts