@pipelab/plugin-construct 1.0.0-beta.28 → 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)`);
@@ -151570,7 +151602,7 @@ async function crawlMonorepoPackages() {
151570
151602
  }
151571
151603
  return cache;
151572
151604
  }
151573
- async function tryLocalFallback(versionOrRange, _error, baseDir, logPrefix) {
151605
+ async function tryLocalFallback(versionOrRange, _error, baseDir, logPrefix, includePrerelease = false) {
151574
151606
  if (!(0, node_fs.existsSync)(baseDir)) return null;
151575
151607
  try {
151576
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));
@@ -151583,7 +151615,7 @@ async function tryLocalFallback(versionOrRange, _error, baseDir, logPrefix) {
151583
151615
  return latestLocal;
151584
151616
  }
151585
151617
  } else {
151586
- const matched = import_semver.default.maxSatisfying(localVersions, range);
151618
+ const matched = import_semver.default.maxSatisfying(localVersions, range, { includePrerelease });
151587
151619
  if (matched) {
151588
151620
  console.info(`[Fetcher] ${logPrefix}: Using locally cached matching version: ${matched} for range ${range}`);
151589
151621
  return matched;
@@ -151651,11 +151683,29 @@ const fileExists = async (path) => {
151651
151683
  };
151652
151684
  //#endregion
151653
151685
  //#region ../plugin-core/src/archive-utils.ts
151654
- 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
+ }
151655
151692
  const output = (0, node_fs.createWriteStream)(to);
151656
151693
  const archive = (0, import_archiver.default)("zip", { zlib: { level: 9 } });
151657
- 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);
151658
151707
  output.on("close", function() {
151708
+ if (abortSignal) abortSignal.removeEventListener("abort", onAbort);
151659
151709
  log(archive.pointer() + " total bytes");
151660
151710
  log("archiver has been finalized and the output file descriptor has closed.");
151661
151711
  resolve(to);
@@ -151664,11 +151714,15 @@ const zipFolder = async (from, to, log) => {
151664
151714
  log("Data has been drained");
151665
151715
  });
151666
151716
  archive.on("error", function(err) {
151717
+ if (abortSignal) abortSignal.removeEventListener("abort", onAbort);
151667
151718
  reject(err);
151668
151719
  });
151669
151720
  archive.pipe(output);
151670
151721
  archive.directory(from, false);
151671
- await archive.finalize();
151722
+ archive.finalize().catch((err) => {
151723
+ if (abortSignal) abortSignal.removeEventListener("abort", onAbort);
151724
+ reject(err);
151725
+ });
151672
151726
  });
151673
151727
  };
151674
151728
  //#endregion
@@ -151920,10 +151974,11 @@ const sharedParams = {
151920
151974
  const exportc3p = async (file, { cwd, log, inputs, setOutput, paths, abortSignal, context: ctx }) => {
151921
151975
  let browserContext = void 0;
151922
151976
  let browser = void 0;
151923
- abortSignal.addEventListener("abort", () => {
151977
+ const onAbort = () => {
151924
151978
  console.error("aborted");
151925
151979
  browserContext?.close();
151926
- });
151980
+ };
151981
+ abortSignal.addEventListener("abort", onAbort);
151927
151982
  const newInputs = inputs;
151928
151983
  const { thirdparty, node, pnpm } = paths;
151929
151984
  const browserName = "chromium";
@@ -152020,6 +152075,7 @@ const exportc3p = async (file, { cwd, log, inputs, setOutput, paths, abortSignal
152020
152075
  log("error, no result, crashed", e);
152021
152076
  throw new Error("ConstructExport failed: " + e.message);
152022
152077
  } finally {
152078
+ abortSignal.removeEventListener("abort", onAbort);
152023
152079
  if (browserContext) await browserContext.close();
152024
152080
  if (browser) await browser.close();
152025
152081
  }
@@ -152118,9 +152174,10 @@ const exportProjectAction = createAction({
152118
152174
  icon: ""
152119
152175
  });
152120
152176
  const ExportProjectActionRunner = createActionRunner(async (options) => {
152121
- if (!await fileExists(options.inputs.folder)) throw new Error("You must specify a valid construct project folder");
152122
- const outputPath = (0, node_path.join)(options.cwd, "c3_tmp_proj.c3p");
152123
- 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);
152124
152181
  });
152125
152182
  //#endregion
152126
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)`);
@@ -151564,7 +151596,7 @@ async function crawlMonorepoPackages() {
151564
151596
  }
151565
151597
  return cache;
151566
151598
  }
151567
- async function tryLocalFallback(versionOrRange, _error, baseDir, logPrefix) {
151599
+ async function tryLocalFallback(versionOrRange, _error, baseDir, logPrefix, includePrerelease = false) {
151568
151600
  if (!existsSync(baseDir)) return null;
151569
151601
  try {
151570
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));
@@ -151577,7 +151609,7 @@ async function tryLocalFallback(versionOrRange, _error, baseDir, logPrefix) {
151577
151609
  return latestLocal;
151578
151610
  }
151579
151611
  } else {
151580
- const matched = import_semver.default.maxSatisfying(localVersions, range);
151612
+ const matched = import_semver.default.maxSatisfying(localVersions, range, { includePrerelease });
151581
151613
  if (matched) {
151582
151614
  console.info(`[Fetcher] ${logPrefix}: Using locally cached matching version: ${matched} for range ${range}`);
151583
151615
  return matched;
@@ -151645,11 +151677,29 @@ const fileExists = async (path) => {
151645
151677
  };
151646
151678
  //#endregion
151647
151679
  //#region ../plugin-core/src/archive-utils.ts
151648
- 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
+ }
151649
151686
  const output = createWriteStream(to);
151650
151687
  const archive = (0, import_archiver.default)("zip", { zlib: { level: 9 } });
151651
- 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);
151652
151701
  output.on("close", function() {
151702
+ if (abortSignal) abortSignal.removeEventListener("abort", onAbort);
151653
151703
  log(archive.pointer() + " total bytes");
151654
151704
  log("archiver has been finalized and the output file descriptor has closed.");
151655
151705
  resolve(to);
@@ -151658,11 +151708,15 @@ const zipFolder = async (from, to, log) => {
151658
151708
  log("Data has been drained");
151659
151709
  });
151660
151710
  archive.on("error", function(err) {
151711
+ if (abortSignal) abortSignal.removeEventListener("abort", onAbort);
151661
151712
  reject(err);
151662
151713
  });
151663
151714
  archive.pipe(output);
151664
151715
  archive.directory(from, false);
151665
- await archive.finalize();
151716
+ archive.finalize().catch((err) => {
151717
+ if (abortSignal) abortSignal.removeEventListener("abort", onAbort);
151718
+ reject(err);
151719
+ });
151666
151720
  });
151667
151721
  };
151668
151722
  //#endregion
@@ -151914,10 +151968,11 @@ const sharedParams = {
151914
151968
  const exportc3p = async (file, { cwd, log, inputs, setOutput, paths, abortSignal, context: ctx }) => {
151915
151969
  let browserContext = void 0;
151916
151970
  let browser = void 0;
151917
- abortSignal.addEventListener("abort", () => {
151971
+ const onAbort = () => {
151918
151972
  console.error("aborted");
151919
151973
  browserContext?.close();
151920
- });
151974
+ };
151975
+ abortSignal.addEventListener("abort", onAbort);
151921
151976
  const newInputs = inputs;
151922
151977
  const { thirdparty, node, pnpm } = paths;
151923
151978
  const browserName = "chromium";
@@ -152014,6 +152069,7 @@ const exportc3p = async (file, { cwd, log, inputs, setOutput, paths, abortSignal
152014
152069
  log("error, no result, crashed", e);
152015
152070
  throw new Error("ConstructExport failed: " + e.message);
152016
152071
  } finally {
152072
+ abortSignal.removeEventListener("abort", onAbort);
152017
152073
  if (browserContext) await browserContext.close();
152018
152074
  if (browser) await browser.close();
152019
152075
  }
@@ -152112,9 +152168,10 @@ const exportProjectAction = createAction({
152112
152168
  icon: ""
152113
152169
  });
152114
152170
  const ExportProjectActionRunner = createActionRunner(async (options) => {
152115
- if (!await fileExists(options.inputs.folder)) throw new Error("You must specify a valid construct project folder");
152116
- const outputPath = join(options.cwd, "c3_tmp_proj.c3p");
152117
- 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);
152118
152175
  });
152119
152176
  //#endregion
152120
152177
  //#region src/index.ts