@pipelab/plugin-construct 1.0.0-beta.22 → 1.0.0-beta.26

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.mjs CHANGED
@@ -3,9 +3,9 @@ import { createRequire } from "node:module";
3
3
  import { hostname } from "os";
4
4
  import { normalize } from "path";
5
5
  import { formatWithOptions, types } from "util";
6
- import path, { delimiter, dirname, join } from "node:path";
6
+ import path, { delimiter, dirname, join, resolve } from "node:path";
7
7
  import { fileURLToPath } from "node:url";
8
- import { constants, homedir } from "node:os";
8
+ import { constants, homedir, platform } from "node:os";
9
9
  import { appendFileSync, createReadStream, createWriteStream, existsSync, readFileSync, readdirSync, statSync, writeFileSync } from "node:fs";
10
10
  import { chmod, cp, mkdir, readFile, readdir, rename, rm } from "node:fs/promises";
11
11
  import http from "node:http";
@@ -13,7 +13,7 @@ import { webcrypto } from "node:crypto";
13
13
  import { ChildProcess, execFile, spawn, spawnSync } from "node:child_process";
14
14
  import { StringDecoder } from "node:string_decoder";
15
15
  import { aborted, callbackify, debuglog, inspect, promisify, stripVTControlCharacters } from "node:util";
16
- import process$1, { execArgv, execPath, hrtime, platform } from "node:process";
16
+ import process$1, { execArgv, execPath, hrtime, platform as platform$1 } from "node:process";
17
17
  import tty from "node:tty";
18
18
  import { scheduler, setImmediate as setImmediate$1, setTimeout as setTimeout$1 } from "node:timers/promises";
19
19
  import { EventEmitter, addAbortListener, on, once, setMaxListeners } from "node:events";
@@ -45417,6 +45417,17 @@ const DEFAULT_PNPM_VERSION = "10.12.0";
45417
45417
  const metaUrl = typeof import.meta !== "undefined" ? import.meta.url : void 0;
45418
45418
  const _dirname = typeof __dirname !== "undefined" ? __dirname : metaUrl ? dirname(fileURLToPath(metaUrl)) : process.cwd();
45419
45419
  const isDev = process.env.NODE_ENV === "development";
45420
+ const getDefaultUserDataPath = (env) => {
45421
+ const base = (() => {
45422
+ switch (platform()) {
45423
+ case "win32": return process.env.APPDATA || join(homedir(), "AppData", "Roaming");
45424
+ case "darwin": return join(homedir(), "Library", "Application Support");
45425
+ default: return process.env.XDG_CONFIG_HOME || join(homedir(), ".config");
45426
+ }
45427
+ })();
45428
+ const mode = env ?? (isDev ? "dev" : "prod");
45429
+ return join(base, "@pipelab", mode === "dev" ? "app-dev" : mode === "beta" ? "app-beta" : "app");
45430
+ };
45420
45431
  /**
45421
45432
  * Finds the monorepo root by looking for pnpm-workspace.yaml.
45422
45433
  */
@@ -49183,6 +49194,71 @@ var WebSocketServer = class {
49183
49194
  };
49184
49195
  const webSocketServer = new WebSocketServer();
49185
49196
  //#endregion
49197
+ //#region ../../packages/core-node/src/fs-utils.ts
49198
+ var import_slash = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMin(((exports, module) => {
49199
+ module.exports = (path) => {
49200
+ const isExtendedLengthPath = /^\\\\\?\\/.test(path);
49201
+ const hasNonAscii = /[^\u0000-\u0080]+/.test(path);
49202
+ if (isExtendedLengthPath || hasNonAscii) return path;
49203
+ return path.replace(/\\/g, "/");
49204
+ };
49205
+ })))(), 1);
49206
+ function removeTrailingSlash(path) {
49207
+ return path.replace(/[\\/]+$/, "");
49208
+ }
49209
+ removeTrailingSlash((0, import_slash.default)(resolve(homedir()))).toLowerCase();
49210
+ const additionalProtectedPaths = [
49211
+ getDefaultUserDataPath("dev"),
49212
+ getDefaultUserDataPath("beta"),
49213
+ getDefaultUserDataPath("prod"),
49214
+ projectRoot,
49215
+ process.cwd(),
49216
+ "/tmp",
49217
+ "/var/tmp",
49218
+ process.env.TEMP,
49219
+ process.env.TMP,
49220
+ join(homedir(), "AppData"),
49221
+ join(homedir(), "AppData", "Local"),
49222
+ join(homedir(), "AppData", "Roaming"),
49223
+ join(homedir(), "Library"),
49224
+ join(homedir(), "Library", "Application Support"),
49225
+ join(homedir(), ".config"),
49226
+ join(homedir(), ".local"),
49227
+ join(homedir(), ".local", "share"),
49228
+ join(homedir(), ".cache"),
49229
+ join(homedir(), "OneDrive"),
49230
+ join(homedir(), "Dropbox"),
49231
+ join(homedir(), ".ssh"),
49232
+ join(homedir(), ".gnupg"),
49233
+ join(homedir(), ".aws"),
49234
+ join(homedir(), ".docker"),
49235
+ join(homedir(), ".kube"),
49236
+ join(homedir(), ".vscode"),
49237
+ join(homedir(), ".vscode-insiders"),
49238
+ join(homedir(), ".cursor"),
49239
+ join(homedir(), ".npm"),
49240
+ join(homedir(), ".pnpm-state"),
49241
+ join(homedir(), ".yarn"),
49242
+ join(homedir(), ".cargo"),
49243
+ join(homedir(), ".rustup"),
49244
+ join(homedir(), ".m2"),
49245
+ join(homedir(), ".gradle")
49246
+ ].filter((p) => typeof p === "string" && p.length > 0);
49247
+ new Set([
49248
+ join(homedir(), "Downloads"),
49249
+ join(homedir(), "Documents"),
49250
+ join(homedir(), "Desktop"),
49251
+ join(homedir(), "Pictures"),
49252
+ join(homedir(), "Music"),
49253
+ join(homedir(), "Videos"),
49254
+ join(homedir(), "Saved Games"),
49255
+ join(homedir(), "Contacts"),
49256
+ join(homedir(), "Searches"),
49257
+ join(homedir(), "Links"),
49258
+ join(homedir(), "3D Objects"),
49259
+ ...additionalProtectedPaths
49260
+ ].map((p) => removeTrailingSlash((0, import_slash.default)(resolve(p))).toLowerCase()));
49261
+ //#endregion
49186
49262
  //#region ../../node_modules/is-plain-obj/index.js
49187
49263
  function isPlainObject(value) {
49188
49264
  if (typeof value !== "object" || value === null) return false;
@@ -49464,7 +49540,7 @@ const COMMON_ESCAPES = {
49464
49540
  const ASTRAL_START = 65535;
49465
49541
  const quoteString = (escapedArgument) => {
49466
49542
  if (NO_ESCAPE_REGEXP.test(escapedArgument)) return escapedArgument;
49467
- return platform === "win32" ? `"${escapedArgument.replaceAll("\"", "\"\"")}"` : `'${escapedArgument.replaceAll("'", "'\\''")}'`;
49543
+ return platform$1 === "win32" ? `"${escapedArgument.replaceAll("\"", "\"\"")}"` : `'${escapedArgument.replaceAll("'", "'\\''")}'`;
49468
49544
  };
49469
49545
  const NO_ESCAPE_REGEXP = /^[\w./-]+$/;
49470
49546
  //#endregion
@@ -59573,13 +59649,13 @@ var require_opts_arg = /* @__PURE__ */ __commonJSMin(((exports, module) => {
59573
59649
  //#region ../../node_modules/mkdirp/lib/path-arg.js
59574
59650
  var require_path_arg = /* @__PURE__ */ __commonJSMin(((exports, module) => {
59575
59651
  const platform = process.env.__TESTING_MKDIRP_PLATFORM__ || process.platform;
59576
- const { resolve: resolve$12, parse: parse$2 } = __require("path");
59652
+ const { resolve: resolve$13, parse: parse$2 } = __require("path");
59577
59653
  const pathArg = (path) => {
59578
59654
  if (/\0/.test(path)) throw Object.assign(/* @__PURE__ */ new TypeError("path must be a string without null bytes"), {
59579
59655
  path,
59580
59656
  code: "ERR_INVALID_ARG_VALUE"
59581
59657
  });
59582
- path = resolve$12(path);
59658
+ path = resolve$13(path);
59583
59659
  if (platform === "win32") {
59584
59660
  const badWinChars = /[*|"<>?:]/;
59585
59661
  const { root } = parse$2(path);
@@ -62624,7 +62700,7 @@ var require_readdir_glob = /* @__PURE__ */ __commonJSMin(((exports, module) => {
62624
62700
  const fs$19 = __require("fs");
62625
62701
  const { EventEmitter: EventEmitter$1 } = __require("events");
62626
62702
  const { Minimatch } = require_minimatch$1();
62627
- const { resolve: resolve$11 } = __require("path");
62703
+ const { resolve: resolve$12 } = __require("path");
62628
62704
  function readdir(dir, strict) {
62629
62705
  return new Promise((resolve, reject) => {
62630
62706
  fs$19.readdir(dir, { withFileTypes: true }, (err, files) => {
@@ -62733,7 +62809,7 @@ var require_readdir_glob = /* @__PURE__ */ __commonJSMin(((exports, module) => {
62733
62809
  if (this.options.ignore) this.ignoreMatchers = (Array.isArray(this.options.ignore) ? this.options.ignore : [this.options.ignore]).map((ignore) => new Minimatch(ignore, { dot: true }));
62734
62810
  this.skipMatchers = [];
62735
62811
  if (this.options.skip) this.skipMatchers = (Array.isArray(this.options.skip) ? this.options.skip : [this.options.skip]).map((skip) => new Minimatch(skip, { dot: true }));
62736
- this.iterator = explore(resolve$11(cwd || "."), this.options.follow, this.options.stat, this._shouldSkipDirectory.bind(this));
62812
+ this.iterator = explore(resolve$12(cwd || "."), this.options.follow, this.options.stat, this._shouldSkipDirectory.bind(this));
62737
62813
  this.paused = false;
62738
62814
  this.inactive = false;
62739
62815
  this.aborted = false;
@@ -99429,7 +99505,7 @@ var require_sort$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
99429
99505
  //#region ../../node_modules/@npmcli/package-json/lib/index.js
99430
99506
  var require_lib$18 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
99431
99507
  const { readFile: readFile$5, writeFile: writeFile$2 } = __require("node:fs/promises");
99432
- const { resolve: resolve$10 } = __require("node:path");
99508
+ const { resolve: resolve$11 } = __require("node:path");
99433
99509
  const parseJSON = require_lib$30();
99434
99510
  const updateDeps = require_update_dependencies();
99435
99511
  const updateScripts = require_update_scripts();
@@ -99532,7 +99608,7 @@ var require_lib$18 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
99532
99608
  parseErr = err;
99533
99609
  }
99534
99610
  if (parseErr) {
99535
- const indexFile = resolve$10(this.path, "index.js");
99611
+ const indexFile = resolve$11(this.path, "index.js");
99536
99612
  let indexFileContent;
99537
99613
  try {
99538
99614
  indexFileContent = await readFile$5(indexFile, "utf8");
@@ -99577,7 +99653,7 @@ var require_lib$18 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
99577
99653
  return this.#path;
99578
99654
  }
99579
99655
  get filename() {
99580
- if (this.path) return resolve$10(this.path, "package.json");
99656
+ if (this.path) return resolve$11(this.path, "package.json");
99581
99657
  }
99582
99658
  create(path) {
99583
99659
  this.#path = path;
@@ -100700,7 +100776,7 @@ var require_polyfill = /* @__PURE__ */ __commonJSMin(((exports, module) => {
100700
100776
  const { ERR_FS_CP_DIR_TO_NON_DIR, ERR_FS_CP_EEXIST, ERR_FS_CP_EINVAL, ERR_FS_CP_FIFO_PIPE, ERR_FS_CP_NON_DIR_TO_DIR, ERR_FS_CP_SOCKET, ERR_FS_CP_SYMLINK_TO_SUBDIRECTORY, ERR_FS_CP_UNKNOWN, ERR_FS_EISDIR, ERR_INVALID_ARG_TYPE } = require_errors$3();
100701
100777
  const { constants: { errno: { EEXIST, EISDIR, EINVAL, ENOTDIR } } } = __require("os");
100702
100778
  const { chmod: chmod$2, copyFile, lstat: lstat$2, mkdir: mkdir$5, readdir: readdir$5, readlink, stat: stat$4, symlink, unlink, utimes } = __require("fs/promises");
100703
- const { dirname: dirname$6, isAbsolute: isAbsolute$1, join: join$6, parse, resolve: resolve$9, sep: sep$2, toNamespacedPath } = __require("path");
100779
+ const { dirname: dirname$6, isAbsolute: isAbsolute$1, join: join$6, parse, resolve: resolve$10, sep: sep$2, toNamespacedPath } = __require("path");
100704
100780
  const { fileURLToPath: fileURLToPath$1 } = __require("url");
100705
100781
  const defaultOptions = {
100706
100782
  dereference: false,
@@ -100787,8 +100863,8 @@ var require_polyfill = /* @__PURE__ */ __commonJSMin(((exports, module) => {
100787
100863
  );
100788
100864
  }
100789
100865
  async function checkParentPaths(src, srcStat, dest) {
100790
- const srcParent = resolve$9(dirname$6(src));
100791
- const destParent = resolve$9(dirname$6(dest));
100866
+ const srcParent = resolve$10(dirname$6(src));
100867
+ const destParent = resolve$10(dirname$6(dest));
100792
100868
  if (destParent === srcParent || destParent === parse(destParent).root) return;
100793
100869
  let destStat;
100794
100870
  try {
@@ -100807,7 +100883,7 @@ var require_polyfill = /* @__PURE__ */ __commonJSMin(((exports, module) => {
100807
100883
  });
100808
100884
  return checkParentPaths(src, srcStat, destParent);
100809
100885
  }
100810
- const normalizePathToArray = (path) => resolve$9(path).split(sep$2).filter(Boolean);
100886
+ const normalizePathToArray = (path) => resolve$10(path).split(sep$2).filter(Boolean);
100811
100887
  function isSrcSubdir(src, dest) {
100812
100888
  const srcArr = normalizePathToArray(src);
100813
100889
  const destArr = normalizePathToArray(dest);
@@ -100917,7 +100993,7 @@ var require_polyfill = /* @__PURE__ */ __commonJSMin(((exports, module) => {
100917
100993
  }
100918
100994
  async function onLink(destStat, src, dest) {
100919
100995
  let resolvedSrc = await readlink(src);
100920
- if (!isAbsolute$1(resolvedSrc)) resolvedSrc = resolve$9(dirname$6(src), resolvedSrc);
100996
+ if (!isAbsolute$1(resolvedSrc)) resolvedSrc = resolve$10(dirname$6(src), resolvedSrc);
100921
100997
  if (!destStat) return symlink(resolvedSrc, dest);
100922
100998
  let resolvedDest;
100923
100999
  try {
@@ -100928,7 +101004,7 @@ var require_polyfill = /* @__PURE__ */ __commonJSMin(((exports, module) => {
100928
101004
  // istanbul ignore next: should not be possible
100929
101005
  throw err;
100930
101006
  }
100931
- if (!isAbsolute$1(resolvedDest)) resolvedDest = resolve$9(dirname$6(dest), resolvedDest);
101007
+ if (!isAbsolute$1(resolvedDest)) resolvedDest = resolve$10(dirname$6(dest), resolvedDest);
100932
101008
  if (isSrcSubdir(resolvedSrc, resolvedDest)) throw new ERR_FS_CP_EINVAL({
100933
101009
  message: `cannot copy ${resolvedSrc} to a subdirectory of self ${resolvedDest}`,
100934
101010
  path: dest,
@@ -101015,7 +101091,7 @@ var require_readdir_scoped = /* @__PURE__ */ __commonJSMin(((exports, module) =>
101015
101091
  //#endregion
101016
101092
  //#region ../../node_modules/cacache/node_modules/@npmcli/fs/lib/move-file.js
101017
101093
  var require_move_file = /* @__PURE__ */ __commonJSMin(((exports, module) => {
101018
- const { dirname: dirname$5, join: join$3, resolve: resolve$8, relative: relative$1, isAbsolute } = __require("path");
101094
+ const { dirname: dirname$5, join: join$3, resolve: resolve$9, relative: relative$1, isAbsolute } = __require("path");
101019
101095
  const fs$11 = __require("fs/promises");
101020
101096
  const pathExists = async (path) => {
101021
101097
  try {
@@ -101051,10 +101127,10 @@ var require_move_file = /* @__PURE__ */ __commonJSMin(((exports, module) => {
101051
101127
  if (root) {
101052
101128
  await Promise.all(symlinks.map(async ({ source: symSource, destination: symDestination }) => {
101053
101129
  let target = await fs$11.readlink(symSource);
101054
- if (isAbsolute(target)) target = resolve$8(symDestination, relative$1(symSource, target));
101130
+ if (isAbsolute(target)) target = resolve$9(symDestination, relative$1(symSource, target));
101055
101131
  let targetStat = "file";
101056
101132
  try {
101057
- targetStat = await fs$11.stat(resolve$8(dirname$5(symSource), target));
101133
+ targetStat = await fs$11.stat(resolve$9(dirname$5(symSource), target));
101058
101134
  if (targetStat.isDirectory()) targetStat = "junction";
101059
101135
  } catch {}
101060
101136
  await fs$11.symlink(target, symDestination, targetStat);
@@ -106871,7 +106947,7 @@ var require_lib$12 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
106871
106947
  var require_lib$11 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
106872
106948
  const bundled = require_lib$12();
106873
106949
  const { readFile: readFile$2, readdir: readdir$2, stat: stat$2 } = __require("fs/promises");
106874
- const { resolve: resolve$7, basename: basename$3, dirname: dirname$4 } = __require("path");
106950
+ const { resolve: resolve$8, basename: basename$3, dirname: dirname$4 } = __require("path");
106875
106951
  const normalizePackageBin = require_lib$21();
106876
106952
  const readPackage = ({ path, packageJsonCache }) => packageJsonCache.has(path) ? Promise.resolve(packageJsonCache.get(path)) : readFile$2(path).then((json) => {
106877
106953
  const pkg = normalizePackageBin(JSON.parse(json));
@@ -106915,7 +106991,7 @@ var require_lib$11 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
106915
106991
  const nm = /^@.+/.test(scope) ? dirname$4(dir) : dir;
106916
106992
  const binFiles = [];
106917
106993
  Object.keys(pkg.bin).forEach((b) => {
106918
- const base = resolve$7(nm, ".bin", b);
106994
+ const base = resolve$8(nm, ".bin", b);
106919
106995
  binFiles.push(base, base + ".cmd", base + ".ps1");
106920
106996
  });
106921
106997
  (await Promise.all(binFiles.map((b) => stat$2(b).then(() => b).catch(() => null)))).filter((b) => b).forEach((b) => result.add(b));
@@ -106936,7 +107012,7 @@ var require_lib$11 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
106936
107012
  }
106937
107013
  const recursePromises = [];
106938
107014
  for (const entry of dirEntries) {
106939
- const p = resolve$7(path, entry.name);
107015
+ const p = resolve$8(path, entry.name);
106940
107016
  if (entry.isDirectory() === false) {
106941
107017
  result.add(p);
106942
107018
  continue;
@@ -106955,7 +107031,7 @@ var require_lib$11 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
106955
107031
  }
106956
107032
  if (bundleDeps) recursePromises.push(...bundleDeps.map((dep) => {
106957
107033
  return pkgContents({
106958
- path: resolve$7(path, "node_modules", dep),
107034
+ path: resolve$8(path, "node_modules", dep),
106959
107035
  packageJsonCache,
106960
107036
  pkg: true,
106961
107037
  depth,
@@ -106967,7 +107043,7 @@ var require_lib$11 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
106967
107043
  return result;
106968
107044
  };
106969
107045
  module.exports = ({ path, ...opts }) => pkgContents({
106970
- path: resolve$7(path),
107046
+ path: resolve$8(path),
106971
107047
  ...opts,
106972
107048
  pkg: true
106973
107049
  }).then((results) => [...results]);
@@ -110578,18 +110654,18 @@ var require_protected = /* @__PURE__ */ __commonJSMin(((exports, module) => {
110578
110654
  //#endregion
110579
110655
  //#region ../../node_modules/pacote/lib/util/cache-dir.js
110580
110656
  var require_cache_dir = /* @__PURE__ */ __commonJSMin(((exports, module) => {
110581
- const { resolve: resolve$6 } = __require("node:path");
110657
+ const { resolve: resolve$7 } = __require("node:path");
110582
110658
  const { tmpdir, homedir: homedir$1 } = __require("node:os");
110583
110659
  module.exports = (fakePlatform = false) => {
110584
110660
  const temp = tmpdir();
110585
110661
  const uidOrPid = process.getuid ? process.getuid() : process.pid;
110586
- const home = homedir$1() || resolve$6(temp, "npm-" + uidOrPid);
110662
+ const home = homedir$1() || resolve$7(temp, "npm-" + uidOrPid);
110587
110663
  const platform = fakePlatform || process.platform;
110588
110664
  const cacheExtra = platform === "win32" ? "npm-cache" : ".npm";
110589
110665
  const cacheRoot = platform === "win32" && process.env.LOCALAPPDATA || home;
110590
110666
  return {
110591
- cacache: resolve$6(cacheRoot, cacheExtra, "_cacache"),
110592
- tufcache: resolve$6(cacheRoot, cacheExtra, "_tuf")
110667
+ cacache: resolve$7(cacheRoot, cacheExtra, "_cacache"),
110668
+ tufcache: resolve$7(cacheRoot, cacheExtra, "_tuf")
110593
110669
  };
110594
110670
  };
110595
110671
  }));
@@ -112403,7 +112479,7 @@ var require_lib$10 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
112403
112479
  var require_lib$9 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
112404
112480
  const { Walker: IgnoreWalker } = require_lib$10();
112405
112481
  const { lstatSync: lstat$1, readFileSync: readFile$1 } = __require("fs");
112406
- const { basename: basename$2, dirname: dirname$3, extname: extname$1, join: join$2, relative, resolve: resolve$5, sep } = __require("path");
112482
+ const { basename: basename$2, dirname: dirname$3, extname: extname$1, join: join$2, relative, resolve: resolve$6, sep } = __require("path");
112407
112483
  const { log } = require_lib$29();
112408
112484
  const defaultRules = Symbol("npm-packlist.rules.default");
112409
112485
  const strictRules = Symbol("npm-packlist.rules.strict");
@@ -112454,7 +112530,7 @@ var require_lib$9 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
112454
112530
  ...opts,
112455
112531
  includeEmpty: false,
112456
112532
  follow: false,
112457
- path: resolve$5(opts?.path || tree.path).replace(/\\/g, "/"),
112533
+ path: resolve$6(opts?.path || tree.path).replace(/\\/g, "/"),
112458
112534
  ignoreFiles: opts?.ignoreFiles || [
112459
112535
  defaultRules,
112460
112536
  "package.json",
@@ -112655,8 +112731,8 @@ var require_lib$9 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
112655
112731
  var require_set_path = /* @__PURE__ */ __commonJSMin(((exports, module) => {
112656
112732
  init_esm_shims();
112657
112733
  const { log } = require_lib$29();
112658
- const { resolve: resolve$4, dirname: dirname$2, delimiter: delimiter$1 } = __require("path");
112659
- const nodeGypPath = resolve$4(__dirname, "../lib/node-gyp-bin");
112734
+ const { resolve: resolve$5, dirname: dirname$2, delimiter: delimiter$1 } = __require("path");
112735
+ const nodeGypPath = resolve$5(__dirname, "../lib/node-gyp-bin");
112660
112736
  const setPATH = (projectPath, binPaths, env) => {
112661
112737
  const PATH = Object.keys(env).filter((p) => /^path$/i.test(p) && env[p]).map((p) => env[p].split(delimiter$1)).reduce((set, p) => set.concat(p.filter((concatted) => !set.includes(concatted))), []).join(delimiter$1);
112662
112738
  const pathArr = [];
@@ -112671,7 +112747,7 @@ var require_set_path = /* @__PURE__ */ __commonJSMin(((exports, module) => {
112671
112747
  let p = projectPath;
112672
112748
  let pp;
112673
112749
  do {
112674
- pathArr.push(resolve$4(p, "node_modules", ".bin"));
112750
+ pathArr.push(resolve$5(p, "node_modules", ".bin"));
112675
112751
  pp = p;
112676
112752
  p = dirname$2(p);
112677
112753
  } while (p !== pp);
@@ -112686,7 +112762,7 @@ var require_set_path = /* @__PURE__ */ __commonJSMin(((exports, module) => {
112686
112762
  //#region ../../node_modules/@npmcli/run-script/lib/make-spawn-args.js
112687
112763
  var require_make_spawn_args = /* @__PURE__ */ __commonJSMin(((exports, module) => {
112688
112764
  const setPATH = require_set_path();
112689
- const { resolve: resolve$3 } = __require("path");
112765
+ const { resolve: resolve$4 } = __require("path");
112690
112766
  let npm_config_node_gyp;
112691
112767
  const makeSpawnArgs = (options) => {
112692
112768
  const { args, binPaths, cmd, env, event, nodeGyp, path, scriptShell = true, stdio, stdioString } = options;
@@ -112700,7 +112776,7 @@ var require_make_spawn_args = /* @__PURE__ */ __commonJSMin(((exports, module) =
112700
112776
  env: setPATH(path, binPaths, {
112701
112777
  ...process.env,
112702
112778
  ...env,
112703
- npm_package_json: resolve$3(path, "package.json"),
112779
+ npm_package_json: resolve$4(path, "package.json"),
112704
112780
  npm_lifecycle_event: event,
112705
112781
  npm_lifecycle_script: cmd,
112706
112782
  npm_config_node_gyp
@@ -112788,10 +112864,10 @@ var require_signal_manager = /* @__PURE__ */ __commonJSMin(((exports, module) =>
112788
112864
  //#region ../../node_modules/@npmcli/run-script/lib/is-server-package.js
112789
112865
  var require_is_server_package = /* @__PURE__ */ __commonJSMin(((exports, module) => {
112790
112866
  const { stat: stat$1 } = __require("node:fs/promises");
112791
- const { resolve: resolve$2 } = __require("node:path");
112867
+ const { resolve: resolve$3 } = __require("node:path");
112792
112868
  module.exports = async (path) => {
112793
112869
  try {
112794
- return (await stat$1(resolve$2(path, "server.js"))).isFile();
112870
+ return (await stat$1(resolve$3(path, "server.js"))).isFile();
112795
112871
  } catch (er) {
112796
112872
  return false;
112797
112873
  }
@@ -112901,7 +112977,7 @@ var require_run_script = /* @__PURE__ */ __commonJSMin(((exports, module) => {
112901
112977
  //#endregion
112902
112978
  //#region ../../node_modules/pacote/lib/file.js
112903
112979
  var require_file$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
112904
- const { resolve: resolve$1 } = __require("node:path");
112980
+ const { resolve: resolve$2 } = __require("node:path");
112905
112981
  const { stat, chmod: chmod$1 } = __require("node:fs/promises");
112906
112982
  const cacache = require_lib$14();
112907
112983
  const fsm = require_lib$13();
@@ -112927,7 +113003,7 @@ var require_file$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
112927
113003
  #exeBins(pkg, dest) {
112928
113004
  if (!pkg.bin) return Promise.resolve();
112929
113005
  return Promise.all(Object.keys(pkg.bin).map(async (k) => {
112930
- const script = resolve$1(dest, pkg.bin[k]);
113006
+ const script = resolve$2(dest, pkg.bin[k]);
112931
113007
  try {
112932
113008
  const st = await stat(script);
112933
113009
  const mode = st.mode | 73;
@@ -112978,7 +113054,7 @@ var require_tar_create_options = /* @__PURE__ */ __commonJSMin(((exports, module
112978
113054
  //#endregion
112979
113055
  //#region ../../node_modules/pacote/lib/dir.js
112980
113056
  var require_dir = /* @__PURE__ */ __commonJSMin(((exports, module) => {
112981
- const { resolve } = __require("node:path");
113057
+ const { resolve: resolve$1 } = __require("node:path");
112982
113058
  const packlist = require_lib$9();
112983
113059
  const runScript = require_run_script();
112984
113060
  const tar = require_index_min();
@@ -113014,7 +113090,7 @@ var require_dir = /* @__PURE__ */ __commonJSMin(((exports, module) => {
113014
113090
  env: {
113015
113091
  npm_package_resolved: this.resolved,
113016
113092
  npm_package_integrity: this.integrity,
113017
- npm_package_json: resolve(this.resolved, "package.json")
113093
+ npm_package_json: resolve$1(this.resolved, "package.json")
113018
113094
  }
113019
113095
  });
113020
113096
  });
@@ -151601,7 +151677,7 @@ const zipFolder = async (from, to, log) => {
151601
151677
  });
151602
151678
  };
151603
151679
  //#endregion
151604
- //#region src/assets/script.ts
151680
+ //#region src/assets/listeners.ts
151605
151681
  const registerInstallButtonListener = (page, log) => {
151606
151682
  const installBtn = page.locator("#addonConfirmInstallDialog").locator(".okButton");
151607
151683
  installBtn.waitFor({ timeout: 0 }).then(async () => {
@@ -151678,40 +151754,69 @@ const registerNewVersionAvailableListener = (page, log) => {
151678
151754
  log("cancelButton.click() failed", e.message);
151679
151755
  });
151680
151756
  };
151681
- const script = async (page, log, filePath, username, password, version, downloadDir) => {
151682
- let url = "https://editor.construct.net/";
151683
- if (version) url += version;
151684
- log("Navigating to URL", url);
151685
- await page.goto(url);
151686
- log("after navigating");
151687
- registerWelcomeToConstructListener(page, log);
151688
- registerNewVersionAvailableListener(page, log);
151757
+ const registerNotNowListener = (page, log) => {
151689
151758
  const notNowBtn = page.getByText("Not now");
151690
151759
  notNowBtn.waitFor({ timeout: 0 }).then(async () => {
151691
- return notNowBtn.click();
151692
- }).then(() => {
151760
+ await notNowBtn.click();
151693
151761
  log("notNowBtn clicked");
151694
151762
  }).catch(async (e) => {
151695
151763
  if (e.message.includes("Target page, context or browser has been closed")) return;
151696
151764
  log("notNowBtn.click() failed", e.message);
151697
151765
  });
151698
- log("after event");
151699
- await page.waitForTimeout(2e3);
151700
- log("after wait");
151766
+ };
151767
+ //#endregion
151768
+ //#region src/assets/script.ts
151769
+ const script = async (page, log, filePath, username, password, version, downloadDir) => {
151701
151770
  if (username && password) {
151702
- log("Authenticating");
151703
- await page.getByTitle("User account").locator("ui-icon").click();
151704
- await page.getByRole("menuitem", { name: "Log in" }).locator("span").click();
151705
- await page.frameLocator("#loginDialog iframe").getByLabel("Username").fill(username);
151706
- await page.frameLocator("#loginDialog iframe").getByLabel("Password").fill(password);
151707
- const tokenPromise = page.waitForResponse(/https:\/\/account.*\.construct\.net\/login.json/i);
151708
- await page.frameLocator("#loginDialog iframe").getByRole("button", { name: "Log in" }).click();
151709
- if ((await (await tokenPromise).json()).request.status === "error") {
151710
- await page.close();
151711
- throw new Error("Invalid credentials");
151712
- }
151713
- log("Authenticated");
151771
+ log("Directly authenticating via Construct 3 account API...");
151772
+ const formData = new FormData();
151773
+ formData.append("username", username);
151774
+ formData.append("password", password);
151775
+ formData.append("productType", "games");
151776
+ const json = await (await fetch("https://account.construct.net/login.json", {
151777
+ method: "POST",
151778
+ body: formData
151779
+ })).json();
151780
+ if (json.request.status !== "ok") throw new Error(json.request.errorMessage || "Invalid credentials");
151781
+ const { userID, token } = json.response;
151782
+ log("API login successful, injecting credentials into browser context...");
151783
+ await page.goto("https://account.construct.net/");
151784
+ await page.evaluate(async ({ userID, token }) => {
151785
+ return new Promise((resolve, reject) => {
151786
+ const request = indexedDB.open("localforage", 1);
151787
+ request.onerror = () => reject(/* @__PURE__ */ new Error("Failed to open DB"));
151788
+ request.onsuccess = (e) => {
151789
+ const db = e.target.result;
151790
+ try {
151791
+ const putRequest = db.transaction(["keyvaluepairs"], "readwrite").objectStore("keyvaluepairs").put({
151792
+ userID,
151793
+ token
151794
+ }, "login-data");
151795
+ putRequest.onsuccess = () => resolve();
151796
+ putRequest.onerror = () => reject(/* @__PURE__ */ new Error("Failed to put item"));
151797
+ } catch (err) {
151798
+ reject(err);
151799
+ }
151800
+ };
151801
+ request.onupgradeneeded = (e) => {
151802
+ e.target.result.createObjectStore("keyvaluepairs");
151803
+ };
151804
+ });
151805
+ }, {
151806
+ userID,
151807
+ token
151808
+ });
151809
+ log("Credentials injected successfully.");
151714
151810
  }
151811
+ let url = "https://editor.construct.net/";
151812
+ if (version) url += version;
151813
+ log("Navigating to URL", url);
151814
+ await page.goto(url);
151815
+ log("after navigating");
151816
+ registerWelcomeToConstructListener(page, log);
151817
+ registerNewVersionAvailableListener(page, log);
151818
+ registerNotNowListener(page, log);
151819
+ log("after event");
151715
151820
  await page.waitForTimeout(2e3);
151716
151821
  const [fileChooser] = await Promise.all([page.waitForEvent("filechooser"), page.keyboard.press("ControlOrMeta+O")]);
151717
151822
  log("filechooser");
@@ -151724,9 +151829,14 @@ const script = async (page, log, filePath, username, password, version, download
151724
151829
  await progressDialog.waitFor({ timeout: 0 });
151725
151830
  log("Got loading progress dialog");
151726
151831
  const progressInterval = setInterval(async () => {
151727
- const text = await progessBar.getAttribute("value");
151728
- const textAsNumber = parseFloat(text);
151729
- log("progress", `${(Number.isNaN(textAsNumber) ? 0 : textAsNumber) * 100}%`);
151832
+ try {
151833
+ const text = await progessBar.getAttribute("value", { timeout: 100 });
151834
+ if (text === null) return;
151835
+ const textAsNumber = parseFloat(text);
151836
+ log("progress", `${(Number.isNaN(textAsNumber) ? 0 : textAsNumber) * 100}%`);
151837
+ } catch {
151838
+ clearInterval(progressInterval);
151839
+ }
151730
151840
  }, 500);
151731
151841
  registerInstallButtonListener(page, log);
151732
151842
  registerWebglErrorListener(page, log);
@@ -151739,7 +151849,7 @@ const script = async (page, log, filePath, username, password, version, download
151739
151849
  timeout: 0
151740
151850
  });
151741
151851
  log("Got progress dialog to disapear");
151742
- clearTimeout(progressInterval);
151852
+ clearInterval(progressInterval);
151743
151853
  await page.getByRole("button", { name: "Menu" }).click();
151744
151854
  await page.getByRole("menuitem", { name: "Project" }).click();
151745
151855
  await page.getByRole("menuitem", { name: "Export" }).click();
@@ -151764,13 +151874,13 @@ const script = async (page, log, filePath, username, password, version, download
151764
151874
  };
151765
151875
  //#endregion
151766
151876
  //#region src/export-shared.ts
151767
- const platform$1 = process.platform;
151877
+ const platform$2 = process.platform;
151768
151878
  const { LOCALAPPDATA, XDG_CONFIG_HOME } = process.env;
151769
151879
  const isCI = process.env.CI === "true";
151770
151880
  let baseProfile;
151771
- if (platform$1 === "win32") baseProfile = join(LOCALAPPDATA ?? "", "Google", "Chrome", "User Data");
151772
- else if (platform$1 === "linux") baseProfile = join(XDG_CONFIG_HOME ?? "", "google-chrome");
151773
- else if (platform$1 === "darwin") baseProfile = join(homedir(), "Library", "Application Support", "Google", "Chrome");
151881
+ if (platform$2 === "win32") baseProfile = join(LOCALAPPDATA ?? "", "Google", "Chrome", "User Data");
151882
+ else if (platform$2 === "linux") baseProfile = join(XDG_CONFIG_HOME && XDG_CONFIG_HOME.trim() !== "" ? XDG_CONFIG_HOME : join(homedir(), ".config"), "google-chrome");
151883
+ else if (platform$2 === "darwin") baseProfile = join(homedir(), "Library", "Application Support", "Google", "Chrome");
151774
151884
  const sharedParams = {
151775
151885
  username: createStringParam("", {
151776
151886
  label: "Username",
@@ -151861,10 +151971,28 @@ const exportc3p = async (file, { cwd, log, inputs, setOutput, paths, abortSignal
151861
151971
  const headless = newInputs.headless;
151862
151972
  if (newInputs.customProfile) {
151863
151973
  const customProfile = join(cwd, "playwright-profile");
151974
+ log("Setting up Playwright profile from custom Chrome profile...");
151975
+ log(` - Target playwright-profile folder: ${customProfile}`);
151864
151976
  await mkdir(customProfile, { recursive: true });
151865
151977
  const indexedDbPathSource = join(newInputs.customProfile, "Default", "IndexedDB");
151866
151978
  const indexedDbPathDestination = join(customProfile, "Default", "IndexedDB");
151867
- for (const p of ["https_editor.construct.net_0.indexeddb.blob", "https_editor.construct.net_0.indexeddb.leveldb"]) await cp(join(indexedDbPathSource, p), join(indexedDbPathDestination, p), { recursive: true });
151979
+ log(` - Source IndexedDB folder: ${indexedDbPathSource}`);
151980
+ log(` - Destination IndexedDB folder: ${indexedDbPathDestination}`);
151981
+ if (!existsSync(indexedDbPathSource)) log(` [WARNING] Source IndexedDB directory does not exist: "${indexedDbPathSource}". Verify your custom profile path.`);
151982
+ await mkdir(indexedDbPathDestination, { recursive: true });
151983
+ for (const p of ["https_editor.construct.net_0.indexeddb.blob", "https_editor.construct.net_0.indexeddb.leveldb"]) {
151984
+ const from = join(indexedDbPathSource, p);
151985
+ const to = join(indexedDbPathDestination, p);
151986
+ if (existsSync(from)) {
151987
+ log(` - Copying: "${p}" to "${indexedDbPathDestination}"`);
151988
+ try {
151989
+ await cp(from, to, { recursive: true });
151990
+ log(` [OK] Successfully copied "${p}"`);
151991
+ } catch (e) {
151992
+ log(` [ERROR] Failed to copy "${p}":`, e instanceof Error ? `${e.message}\n${e.stack}` : String(e));
151993
+ }
151994
+ } else log(` - Skipping: "${p}" (does not exist in source profile)`);
151995
+ }
151868
151996
  browserContext = await browserInstance.launchPersistentContext(customProfile, {
151869
151997
  headless,
151870
151998
  locale: "en-US",