@base44-preview/cli 0.1.11-pr.602.9833770 → 0.1.12-pr.584.d15e5fc

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/cli/index.js CHANGED
@@ -23354,15 +23354,15 @@ var require_windows = __commonJS(function(exports, module) {
23354
23354
  }
23355
23355
  return false;
23356
23356
  }
23357
- function checkStat(stat2, path11, options) {
23358
- if (!stat2.isSymbolicLink() && !stat2.isFile()) {
23357
+ function checkStat(stat3, path11, options) {
23358
+ if (!stat3.isSymbolicLink() && !stat3.isFile()) {
23359
23359
  return false;
23360
23360
  }
23361
23361
  return checkPathExt(path11, options);
23362
23362
  }
23363
23363
  function isexe(path11, options, cb) {
23364
- fs14.stat(path11, function(er, stat2) {
23365
- cb(er, er ? false : checkStat(stat2, path11, options));
23364
+ fs14.stat(path11, function(er, stat3) {
23365
+ cb(er, er ? false : checkStat(stat3, path11, options));
23366
23366
  });
23367
23367
  }
23368
23368
  function sync(path11, options) {
@@ -23376,20 +23376,20 @@ var require_mode = __commonJS(function(exports, module) {
23376
23376
  isexe.sync = sync;
23377
23377
  var fs14 = __require("fs");
23378
23378
  function isexe(path11, options, cb) {
23379
- fs14.stat(path11, function(er, stat2) {
23380
- cb(er, er ? false : checkStat(stat2, options));
23379
+ fs14.stat(path11, function(er, stat3) {
23380
+ cb(er, er ? false : checkStat(stat3, options));
23381
23381
  });
23382
23382
  }
23383
23383
  function sync(path11, options) {
23384
23384
  return checkStat(fs14.statSync(path11), options);
23385
23385
  }
23386
- function checkStat(stat2, options) {
23387
- return stat2.isFile() && checkMode(stat2, options);
23386
+ function checkStat(stat3, options) {
23387
+ return stat3.isFile() && checkMode(stat3, options);
23388
23388
  }
23389
- function checkMode(stat2, options) {
23390
- var mod = stat2.mode;
23391
- var uid = stat2.uid;
23392
- var gid = stat2.gid;
23389
+ function checkMode(stat3, options) {
23390
+ var mod = stat3.mode;
23391
+ var uid = stat3.uid;
23392
+ var gid = stat3.gid;
23393
23393
  var myUid = options.uid !== undefined ? options.uid : process.getuid && process.getuid();
23394
23394
  var myGid = options.gid !== undefined ? options.gid : process.getgid && process.getgid();
23395
23395
  var u = parseInt("100", 8);
@@ -23421,12 +23421,12 @@ var require_isexe = __commonJS(function(exports, module) {
23421
23421
  if (typeof Promise !== "function") {
23422
23422
  throw new TypeError("callback not provided");
23423
23423
  }
23424
- return new Promise(function(resolve4, reject) {
23424
+ return new Promise(function(resolve6, reject) {
23425
23425
  isexe(path11, options || {}, function(er, is) {
23426
23426
  if (er) {
23427
23427
  reject(er);
23428
23428
  } else {
23429
- resolve4(is);
23429
+ resolve6(is);
23430
23430
  }
23431
23431
  });
23432
23432
  });
@@ -23488,27 +23488,27 @@ var require_which = __commonJS(function(exports, module) {
23488
23488
  opt = {};
23489
23489
  const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt);
23490
23490
  const found = [];
23491
- const step = (i) => new Promise((resolve4, reject) => {
23491
+ const step = (i) => new Promise((resolve6, reject) => {
23492
23492
  if (i === pathEnv.length)
23493
- return opt.all && found.length ? resolve4(found) : reject(getNotFoundError(cmd));
23493
+ return opt.all && found.length ? resolve6(found) : reject(getNotFoundError(cmd));
23494
23494
  const ppRaw = pathEnv[i];
23495
23495
  const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw;
23496
23496
  const pCmd = path11.join(pathPart, cmd);
23497
23497
  const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd : pCmd;
23498
- resolve4(subStep(p, i, 0));
23498
+ resolve6(subStep(p, i, 0));
23499
23499
  });
23500
- const subStep = (p, i, ii) => new Promise((resolve4, reject) => {
23500
+ const subStep = (p, i, ii) => new Promise((resolve6, reject) => {
23501
23501
  if (ii === pathExt.length)
23502
- return resolve4(step(i + 1));
23502
+ return resolve6(step(i + 1));
23503
23503
  const ext = pathExt[ii];
23504
23504
  isexe(p + ext, { pathExt: pathExtExe }, (er, is) => {
23505
23505
  if (!er && is) {
23506
23506
  if (opt.all)
23507
23507
  found.push(p + ext);
23508
23508
  else
23509
- return resolve4(p + ext);
23509
+ return resolve6(p + ext);
23510
23510
  }
23511
- return resolve4(subStep(p, i, ii + 1));
23511
+ return resolve6(subStep(p, i, ii + 1));
23512
23512
  });
23513
23513
  });
23514
23514
  return cb ? step(0).then((res) => cb(null, res), cb) : step(0);
@@ -27036,7 +27036,7 @@ var require_lodash8 = __commonJS(function(exports, module) {
27036
27036
  }
27037
27037
  return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, undefined2, comparator) : [];
27038
27038
  });
27039
- function join17(array2, separator) {
27039
+ function join18(array2, separator) {
27040
27040
  return array2 == null ? "" : nativeJoin.call(array2, separator);
27041
27041
  }
27042
27042
  function last(array2) {
@@ -28968,7 +28968,7 @@ __p += '`;
28968
28968
  lodash.isUndefined = isUndefined;
28969
28969
  lodash.isWeakMap = isWeakMap;
28970
28970
  lodash.isWeakSet = isWeakSet;
28971
- lodash.join = join17;
28971
+ lodash.join = join18;
28972
28972
  lodash.kebabCase = kebabCase;
28973
28973
  lodash.last = last;
28974
28974
  lodash.lastIndexOf = lastIndexOf;
@@ -31178,7 +31178,7 @@ function cleanDoc(doc2) {
31178
31178
  return mapDoc(doc2, (currentDoc) => cleanDocFn(currentDoc));
31179
31179
  }
31180
31180
  function replaceEndOfLine(doc2, replacement = literalline) {
31181
- return mapDoc(doc2, (currentDoc) => typeof currentDoc === "string" ? join26(replacement, currentDoc.split(`
31181
+ return mapDoc(doc2, (currentDoc) => typeof currentDoc === "string" ? join27(replacement, currentDoc.split(`
31182
31182
  `)) : currentDoc);
31183
31183
  }
31184
31184
  function canBreakFn(doc2) {
@@ -31258,7 +31258,7 @@ function indentIfBreak(contents, options) {
31258
31258
  negate: options.negate
31259
31259
  };
31260
31260
  }
31261
- function join26(separator, docs) {
31261
+ function join27(separator, docs) {
31262
31262
  assertDoc(separator);
31263
31263
  assertDocArray(docs);
31264
31264
  const parts = [];
@@ -31969,7 +31969,7 @@ var init_doc = __esm(() => {
31969
31969
  MODE_FLAT = Symbol("MODE_FLAT");
31970
31970
  DOC_FILL_PRINTED_LENGTH = Symbol("DOC_FILL_PRINTED_LENGTH");
31971
31971
  builders = {
31972
- join: join26,
31972
+ join: join27,
31973
31973
  line,
31974
31974
  softline,
31975
31975
  hardline,
@@ -120387,7 +120387,7 @@ function skipVoid(str, ptr, banNewLines, banComments) {
120387
120387
  ptr++;
120388
120388
  return banComments || c24 !== "#" ? ptr : skipVoid(str, skipComment(str, ptr), banNewLines);
120389
120389
  }
120390
- function skipUntil(str, ptr, sep, end, banNewLines = false) {
120390
+ function skipUntil(str, ptr, sep2, end, banNewLines = false) {
120391
120391
  if (!end) {
120392
120392
  ptr = indexOfNewline(str, ptr);
120393
120393
  return ptr < 0 ? str.length : ptr;
@@ -120396,7 +120396,7 @@ function skipUntil(str, ptr, sep, end, banNewLines = false) {
120396
120396
  let c24 = str[i5];
120397
120397
  if (c24 === "#") {
120398
120398
  i5 = indexOfNewline(str, i5);
120399
- } else if (c24 === sep) {
120399
+ } else if (c24 === sep2) {
120400
120400
  return i5 + 1;
120401
120401
  } else if (c24 === end || banNewLines && (c24 === `
120402
120402
  ` || c24 === "\r" && str[i5 + 1] === `
@@ -121176,7 +121176,7 @@ function getDataProtocolModuleFormat(parsed) {
121176
121176
  const { 1: mime } = /^([^/]+\/[^;,]+)[^,]*?(;base64)?,/.exec(parsed.pathname) || [null, null, null];
121177
121177
  return mimeToFormat(mime);
121178
121178
  }
121179
- function extname(url3) {
121179
+ function extname2(url3) {
121180
121180
  const pathname = url3.pathname;
121181
121181
  let index = pathname.length;
121182
121182
  while (index--) {
@@ -121191,7 +121191,7 @@ function extname(url3) {
121191
121191
  return "";
121192
121192
  }
121193
121193
  function getFileProtocolModuleFormat(url3, _context, ignoreErrors) {
121194
- const value = extname(url3);
121194
+ const value = extname2(url3);
121195
121195
  if (value === ".js") {
121196
121196
  const packageType = getPackageType(url3);
121197
121197
  if (packageType !== "none") {
@@ -123906,14 +123906,14 @@ async function printToDoc(originalText, options8) {
123906
123906
  async function printDocToString2(doc2, options8) {
123907
123907
  return printDocToStringWithoutNormalizeOptions(doc2, await normalize_format_options_default(options8));
123908
123908
  }
123909
- function createParsersAndPrinters(modules) {
123909
+ function createParsersAndPrinters(modules2) {
123910
123910
  const parsers2 = /* @__PURE__ */ Object.create(null);
123911
123911
  const printers2 = /* @__PURE__ */ Object.create(null);
123912
123912
  for (const {
123913
123913
  importPlugin: importPlugin2,
123914
123914
  parsers: parserNames = [],
123915
123915
  printers: printerNames = []
123916
- } of modules) {
123916
+ } of modules2) {
123917
123917
  const loadPlugin2 = async () => {
123918
123918
  const plugin = await importPlugin2();
123919
123919
  Object.assign(parsers2, plugin.parsers);
@@ -136883,7 +136883,7 @@ Expected it to be ${EXPECTED_TYPE_VALUES}.`;
136883
136883
  return mapDoc2(doc2, (currentDoc) => cleanDocFn2(currentDoc));
136884
136884
  }
136885
136885
  function replaceEndOfLine2(doc2, replacement = literalline2) {
136886
- return mapDoc2(doc2, (currentDoc) => typeof currentDoc === "string" ? join28(replacement, currentDoc.split(`
136886
+ return mapDoc2(doc2, (currentDoc) => typeof currentDoc === "string" ? join29(replacement, currentDoc.split(`
136887
136887
  `)) : currentDoc);
136888
136888
  }
136889
136889
  function canBreakFn2(doc2) {
@@ -136969,7 +136969,7 @@ Expected it to be ${EXPECTED_TYPE_VALUES}.`;
136969
136969
  negate: options8.negate
136970
136970
  };
136971
136971
  }
136972
- function join28(separator, docs) {
136972
+ function join29(separator, docs) {
136973
136973
  assertDoc2(separator);
136974
136974
  assertDocArray2(docs);
136975
136975
  const parts = [];
@@ -137634,7 +137634,7 @@ Expected it to be ${EXPECTED_TYPE_VALUES}.`;
137634
137634
  }
137635
137635
  }
137636
137636
  var builders2 = {
137637
- join: join28,
137637
+ join: join29,
137638
137638
  line: line3,
137639
137639
  softline: softline2,
137640
137640
  hardline: hardline4,
@@ -138289,11 +138289,11 @@ var require_prettier = __commonJS(function(exports, module) {
138289
138289
  var require_formatter = __commonJS(function(exports) {
138290
138290
  var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P9, generator) {
138291
138291
  function adopt(value) {
138292
- return value instanceof P9 ? value : new P9(function(resolve13) {
138293
- resolve13(value);
138292
+ return value instanceof P9 ? value : new P9(function(resolve15) {
138293
+ resolve15(value);
138294
138294
  });
138295
138295
  }
138296
- return new (P9 || (P9 = Promise))(function(resolve13, reject) {
138296
+ return new (P9 || (P9 = Promise))(function(resolve15, reject) {
138297
138297
  function fulfilled(value) {
138298
138298
  try {
138299
138299
  step(generator.next(value));
@@ -138309,7 +138309,7 @@ var require_formatter = __commonJS(function(exports) {
138309
138309
  }
138310
138310
  }
138311
138311
  function step(result) {
138312
- result.done ? resolve13(result.value) : adopt(result.value).then(fulfilled, rejected);
138312
+ result.done ? resolve15(result.value) : adopt(result.value).then(fulfilled, rejected);
138313
138313
  }
138314
138314
  step((generator = generator.apply(thisArg, _arguments || [])).next());
138315
138315
  });
@@ -142962,7 +142962,7 @@ var require_url = __commonJS(function(exports) {
142962
142962
  };
142963
142963
  Object.defineProperty(exports, "__esModule", { value: true });
142964
142964
  exports.parse = undefined;
142965
- exports.resolve = resolve13;
142965
+ exports.resolve = resolve15;
142966
142966
  exports.cwd = cwd;
142967
142967
  exports.getProtocol = getProtocol;
142968
142968
  exports.getExtension = getExtension;
@@ -142974,7 +142974,7 @@ var require_url = __commonJS(function(exports) {
142974
142974
  exports.fromFileSystemPath = fromFileSystemPath;
142975
142975
  exports.toFileSystemPath = toFileSystemPath;
142976
142976
  exports.safePointerToPath = safePointerToPath;
142977
- exports.relative = relative4;
142977
+ exports.relative = relative5;
142978
142978
  var convert_path_to_posix_1 = __importDefault(require_convert_path_to_posix());
142979
142979
  var path_1 = __importStar(__require("path"));
142980
142980
  var forwardSlashPattern = /\//g;
@@ -142990,7 +142990,7 @@ var require_url = __commonJS(function(exports) {
142990
142990
  var urlDecodePatterns = [/%23/g, "#", /%24/g, "$", /%26/g, "&", /%2C/g, ",", /%40/g, "@"];
142991
142991
  var parse11 = (u4) => new URL(u4);
142992
142992
  exports.parse = parse11;
142993
- function resolve13(from, to5) {
142993
+ function resolve15(from, to5) {
142994
142994
  const fromUrl = new URL((0, convert_path_to_posix_1.default)(from), "https://aaa.nonexistanturl.com");
142995
142995
  const resolvedUrl = new URL((0, convert_path_to_posix_1.default)(to5), fromUrl);
142996
142996
  const endSpaces = to5.match(/(\s*)$/)?.[1] || "";
@@ -143124,9 +143124,9 @@ var require_url = __commonJS(function(exports) {
143124
143124
  return decodeURIComponent(value).replace(jsonPointerSlash, "/").replace(jsonPointerTilde, "~");
143125
143125
  });
143126
143126
  }
143127
- function relative4(from, to5) {
143127
+ function relative5(from, to5) {
143128
143128
  if (!isFileSystemPath(from) || !isFileSystemPath(to5)) {
143129
- return resolve13(from, to5);
143129
+ return resolve15(from, to5);
143130
143130
  }
143131
143131
  const fromDir = path_1.default.dirname(stripHash(from));
143132
143132
  const toPath4 = stripHash(to5);
@@ -143802,7 +143802,7 @@ var require_plugins = __commonJS(function(exports) {
143802
143802
  let plugin;
143803
143803
  let lastError;
143804
143804
  let index = 0;
143805
- return new Promise((resolve13, reject) => {
143805
+ return new Promise((resolve15, reject) => {
143806
143806
  runNextPlugin();
143807
143807
  function runNextPlugin() {
143808
143808
  plugin = plugins[index++];
@@ -143830,7 +143830,7 @@ var require_plugins = __commonJS(function(exports) {
143830
143830
  }
143831
143831
  }
143832
143832
  function onSuccess(result) {
143833
- resolve13({
143833
+ resolve15({
143834
143834
  plugin,
143835
143835
  result
143836
143836
  });
@@ -145163,11 +145163,11 @@ var require_lib3 = __commonJS(function(exports) {
145163
145163
  var require_resolver = __commonJS(function(exports) {
145164
145164
  var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P9, generator) {
145165
145165
  function adopt(value) {
145166
- return value instanceof P9 ? value : new P9(function(resolve13) {
145167
- resolve13(value);
145166
+ return value instanceof P9 ? value : new P9(function(resolve15) {
145167
+ resolve15(value);
145168
145168
  });
145169
145169
  }
145170
- return new (P9 || (P9 = Promise))(function(resolve13, reject) {
145170
+ return new (P9 || (P9 = Promise))(function(resolve15, reject) {
145171
145171
  function fulfilled(value) {
145172
145172
  try {
145173
145173
  step(generator.next(value));
@@ -145183,7 +145183,7 @@ var require_resolver = __commonJS(function(exports) {
145183
145183
  }
145184
145184
  }
145185
145185
  function step(result) {
145186
- result.done ? resolve13(result.value) : adopt(result.value).then(fulfilled, rejected);
145186
+ result.done ? resolve15(result.value) : adopt(result.value).then(fulfilled, rejected);
145187
145187
  }
145188
145188
  step((generator = generator.apply(thisArg, _arguments || [])).next());
145189
145189
  });
@@ -145304,11 +145304,11 @@ var require_optionValidator = __commonJS(function(exports) {
145304
145304
  var require_src3 = __commonJS(function(exports) {
145305
145305
  var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P9, generator) {
145306
145306
  function adopt(value) {
145307
- return value instanceof P9 ? value : new P9(function(resolve13) {
145308
- resolve13(value);
145307
+ return value instanceof P9 ? value : new P9(function(resolve15) {
145308
+ resolve15(value);
145309
145309
  });
145310
145310
  }
145311
- return new (P9 || (P9 = Promise))(function(resolve13, reject) {
145311
+ return new (P9 || (P9 = Promise))(function(resolve15, reject) {
145312
145312
  function fulfilled(value) {
145313
145313
  try {
145314
145314
  step(generator.next(value));
@@ -145324,7 +145324,7 @@ var require_src3 = __commonJS(function(exports) {
145324
145324
  }
145325
145325
  }
145326
145326
  function step(result) {
145327
- result.done ? resolve13(result.value) : adopt(result.value).then(fulfilled, rejected);
145327
+ result.done ? resolve15(result.value) : adopt(result.value).then(fulfilled, rejected);
145328
145328
  }
145329
145329
  step((generator = generator.apply(thisArg, _arguments || [])).next());
145330
145330
  });
@@ -146453,7 +146453,7 @@ var require_depd = __commonJS(function(exports, module) {
146453
146453
  * Copyright(c) 2014-2018 Douglas Christopher Wilson
146454
146454
  * MIT Licensed
146455
146455
  */
146456
- var relative4 = __require("path").relative;
146456
+ var relative5 = __require("path").relative;
146457
146457
  module.exports = depd;
146458
146458
  var basePath = process.cwd();
146459
146459
  function containsNamespace(str, namespace) {
@@ -146649,7 +146649,7 @@ var require_depd = __commonJS(function(exports, module) {
146649
146649
  return formatted;
146650
146650
  }
146651
146651
  function formatLocation(callSite) {
146652
- return relative4(basePath, callSite[0]) + ":" + callSite[1] + ":" + callSite[2];
146652
+ return relative5(basePath, callSite[0]) + ":" + callSite[1] + ":" + callSite[2];
146653
146653
  }
146654
146654
  function getStack() {
146655
146655
  var limit = Error.stackTraceLimit;
@@ -150645,7 +150645,7 @@ var require_dbcs_data = __commonJS(function(exports, module) {
150645
150645
  // ../../node_modules/iconv-lite/encodings/index.js
150646
150646
  var require_encodings = __commonJS(function(exports, module) {
150647
150647
  var mergeModules = require_merge_exports();
150648
- var modules = [
150648
+ var modules2 = [
150649
150649
  require_internal(),
150650
150650
  require_utf32(),
150651
150651
  require_utf16(),
@@ -150656,8 +150656,8 @@ var require_encodings = __commonJS(function(exports, module) {
150656
150656
  require_dbcs_codec(),
150657
150657
  require_dbcs_data()
150658
150658
  ];
150659
- for (i5 = 0;i5 < modules.length; i5++) {
150660
- module = modules[i5];
150659
+ for (i5 = 0;i5 < modules2.length; i5++) {
150660
+ module = modules2[i5];
150661
150661
  mergeModules(exports, module);
150662
150662
  }
150663
150663
  var module;
@@ -150986,11 +150986,11 @@ var require_raw_body = __commonJS(function(exports, module) {
150986
150986
  if (done) {
150987
150987
  return readStream(stream, encoding, length, limit, wrap(done));
150988
150988
  }
150989
- return new Promise(function executor(resolve13, reject) {
150989
+ return new Promise(function executor(resolve15, reject) {
150990
150990
  readStream(stream, encoding, length, limit, function onRead2(err, buf) {
150991
150991
  if (err)
150992
150992
  return reject(err);
150993
- resolve13(buf);
150993
+ resolve15(buf);
150994
150994
  });
150995
150995
  });
150996
150996
  }
@@ -160794,7 +160794,7 @@ var require_mime_types = __commonJS(function(exports) {
160794
160794
  * MIT Licensed
160795
160795
  */
160796
160796
  var db2 = require_db();
160797
- var extname2 = __require("path").extname;
160797
+ var extname3 = __require("path").extname;
160798
160798
  var mimeScore = require_mimeScore();
160799
160799
  var EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/;
160800
160800
  var TEXT_TYPE_REGEXP = /^text\//i;
@@ -160851,7 +160851,7 @@ var require_mime_types = __commonJS(function(exports) {
160851
160851
  if (!path18 || typeof path18 !== "string") {
160852
160852
  return false;
160853
160853
  }
160854
- var extension2 = extname2("x." + path18).toLowerCase().slice(1);
160854
+ var extension2 = extname3("x." + path18).toLowerCase().slice(1);
160855
160855
  if (!extension2) {
160856
160856
  return false;
160857
160857
  }
@@ -164111,16 +164111,16 @@ var require_view = __commonJS(function(exports, module) {
164111
164111
  var debug = require_src4()("express:view");
164112
164112
  var path18 = __require("node:path");
164113
164113
  var fs28 = __require("node:fs");
164114
- var dirname20 = path18.dirname;
164114
+ var dirname21 = path18.dirname;
164115
164115
  var basename7 = path18.basename;
164116
- var extname2 = path18.extname;
164117
- var join29 = path18.join;
164118
- var resolve13 = path18.resolve;
164116
+ var extname3 = path18.extname;
164117
+ var join30 = path18.join;
164118
+ var resolve15 = path18.resolve;
164119
164119
  module.exports = View;
164120
164120
  function View(name2, options8) {
164121
164121
  var opts = options8 || {};
164122
164122
  this.defaultEngine = opts.defaultEngine;
164123
- this.ext = extname2(name2);
164123
+ this.ext = extname3(name2);
164124
164124
  this.name = name2;
164125
164125
  this.root = opts.root;
164126
164126
  if (!this.ext && !this.defaultEngine) {
@@ -164149,8 +164149,8 @@ var require_view = __commonJS(function(exports, module) {
164149
164149
  debug('lookup "%s"', name2);
164150
164150
  for (var i5 = 0;i5 < roots.length && !path19; i5++) {
164151
164151
  var root2 = roots[i5];
164152
- var loc = resolve13(root2, name2);
164153
- var dir = dirname20(loc);
164152
+ var loc = resolve15(root2, name2);
164153
+ var dir = dirname21(loc);
164154
164154
  var file2 = basename7(loc);
164155
164155
  path19 = this.resolve(dir, file2);
164156
164156
  }
@@ -164174,16 +164174,16 @@ var require_view = __commonJS(function(exports, module) {
164174
164174
  });
164175
164175
  sync = false;
164176
164176
  };
164177
- View.prototype.resolve = function resolve14(dir, file2) {
164177
+ View.prototype.resolve = function resolve16(dir, file2) {
164178
164178
  var ext = this.ext;
164179
- var path19 = join29(dir, file2);
164180
- var stat3 = tryStat(path19);
164181
- if (stat3 && stat3.isFile()) {
164179
+ var path19 = join30(dir, file2);
164180
+ var stat4 = tryStat(path19);
164181
+ if (stat4 && stat4.isFile()) {
164182
164182
  return path19;
164183
164183
  }
164184
- path19 = join29(dir, basename7(file2, ext), "index" + ext);
164185
- stat3 = tryStat(path19);
164186
- if (stat3 && stat3.isFile()) {
164184
+ path19 = join30(dir, basename7(file2, ext), "index" + ext);
164185
+ stat4 = tryStat(path19);
164186
+ if (stat4 && stat4.isFile()) {
164187
164187
  return path19;
164188
164188
  }
164189
164189
  };
@@ -164234,9 +164234,9 @@ var require_etag = __commonJS(function(exports, module) {
164234
164234
  }
164235
164235
  return obj && typeof obj === "object" && "ctime" in obj && toString2.call(obj.ctime) === "[object Date]" && "mtime" in obj && toString2.call(obj.mtime) === "[object Date]" && "ino" in obj && typeof obj.ino === "number" && "size" in obj && typeof obj.size === "number";
164236
164236
  }
164237
- function stattag(stat3) {
164238
- var mtime = stat3.mtime.getTime().toString(16);
164239
- var size = stat3.size.toString(16);
164237
+ function stattag(stat4) {
164238
+ var mtime = stat4.mtime.getTime().toString(16);
164239
+ var size = stat4.size.toString(16);
164240
164240
  return '"' + size + "-" + mtime + '"';
164241
164241
  }
164242
164242
  });
@@ -166333,7 +166333,7 @@ var require_application = __commonJS(function(exports, module) {
166333
166333
  var compileETag = require_utils10().compileETag;
166334
166334
  var compileQueryParser = require_utils10().compileQueryParser;
166335
166335
  var compileTrust = require_utils10().compileTrust;
166336
- var resolve13 = __require("node:path").resolve;
166336
+ var resolve15 = __require("node:path").resolve;
166337
166337
  var once9 = require_once();
166338
166338
  var Router = require_router();
166339
166339
  var slice = Array.prototype.slice;
@@ -166387,7 +166387,7 @@ var require_application = __commonJS(function(exports, module) {
166387
166387
  this.mountpath = "/";
166388
166388
  this.locals.settings = this.settings;
166389
166389
  this.set("view", View);
166390
- this.set("views", resolve13("views"));
166390
+ this.set("views", resolve15("views"));
166391
166391
  this.set("jsonp callback name", "callback");
166392
166392
  if (env4 === "production") {
166393
166393
  this.enable("view cache");
@@ -167875,11 +167875,11 @@ var require_send = __commonJS(function(exports, module) {
167875
167875
  var statuses = require_statuses();
167876
167876
  var Stream2 = __require("stream");
167877
167877
  var util2 = __require("util");
167878
- var extname2 = path18.extname;
167879
- var join29 = path18.join;
167878
+ var extname3 = path18.extname;
167879
+ var join30 = path18.join;
167880
167880
  var normalize2 = path18.normalize;
167881
- var resolve13 = path18.resolve;
167882
- var sep = path18.sep;
167881
+ var resolve15 = path18.resolve;
167882
+ var sep2 = path18.sep;
167883
167883
  var BYTES_RANGE_REGEXP = /^ *bytes=/;
167884
167884
  var MAX_MAXAGE = 60 * 60 * 24 * 365 * 1000;
167885
167885
  var UP_PATH_REGEXP = /(?:^|[\\/])\.\.(?:[\\/]|$)/;
@@ -167907,7 +167907,7 @@ var require_send = __commonJS(function(exports, module) {
167907
167907
  this._maxage = opts.maxAge || opts.maxage;
167908
167908
  this._maxage = typeof this._maxage === "string" ? ms9(this._maxage) : Number(this._maxage);
167909
167909
  this._maxage = !isNaN(this._maxage) ? Math.min(Math.max(0, this._maxage), MAX_MAXAGE) : 0;
167910
- this._root = opts.root ? resolve13(opts.root) : null;
167910
+ this._root = opts.root ? resolve15(opts.root) : null;
167911
167911
  }
167912
167912
  util2.inherits(SendStream, Stream2);
167913
167913
  SendStream.prototype.error = function error48(status, err) {
@@ -168040,23 +168040,23 @@ var require_send = __commonJS(function(exports, module) {
168040
168040
  var parts;
168041
168041
  if (root2 !== null) {
168042
168042
  if (path19) {
168043
- path19 = normalize2("." + sep + path19);
168043
+ path19 = normalize2("." + sep2 + path19);
168044
168044
  }
168045
168045
  if (UP_PATH_REGEXP.test(path19)) {
168046
168046
  debug('malicious path "%s"', path19);
168047
168047
  this.error(403);
168048
168048
  return res;
168049
168049
  }
168050
- parts = path19.split(sep);
168051
- path19 = normalize2(join29(root2, path19));
168050
+ parts = path19.split(sep2);
168051
+ path19 = normalize2(join30(root2, path19));
168052
168052
  } else {
168053
168053
  if (UP_PATH_REGEXP.test(path19)) {
168054
168054
  debug('malicious path "%s"', path19);
168055
168055
  this.error(403);
168056
168056
  return res;
168057
168057
  }
168058
- parts = normalize2(path19).split(sep);
168059
- path19 = resolve13(path19);
168058
+ parts = normalize2(path19).split(sep2);
168059
+ path19 = resolve15(path19);
168060
168060
  }
168061
168061
  if (containsDotFile(parts)) {
168062
168062
  debug('%s dotfile "%s"', this._dotfiles, path19);
@@ -168079,8 +168079,8 @@ var require_send = __commonJS(function(exports, module) {
168079
168079
  this.sendFile(path19);
168080
168080
  return res;
168081
168081
  };
168082
- SendStream.prototype.send = function send2(path19, stat3) {
168083
- var len = stat3.size;
168082
+ SendStream.prototype.send = function send2(path19, stat4) {
168083
+ var len = stat4.size;
168084
168084
  var options8 = this.options;
168085
168085
  var opts = {};
168086
168086
  var res = this.res;
@@ -168092,7 +168092,7 @@ var require_send = __commonJS(function(exports, module) {
168092
168092
  return;
168093
168093
  }
168094
168094
  debug('pipe "%s"', path19);
168095
- this.setHeader(path19, stat3);
168095
+ this.setHeader(path19, stat4);
168096
168096
  this.type(path19);
168097
168097
  if (this.isConditionalGET()) {
168098
168098
  if (this.isPreconditionFailure()) {
@@ -168149,19 +168149,19 @@ var require_send = __commonJS(function(exports, module) {
168149
168149
  var i5 = 0;
168150
168150
  var self2 = this;
168151
168151
  debug('stat "%s"', path19);
168152
- fs28.stat(path19, function onstat(err, stat3) {
168153
- var pathEndsWithSep = path19[path19.length - 1] === sep;
168154
- if (err && err.code === "ENOENT" && !extname2(path19) && !pathEndsWithSep) {
168152
+ fs28.stat(path19, function onstat(err, stat4) {
168153
+ var pathEndsWithSep = path19[path19.length - 1] === sep2;
168154
+ if (err && err.code === "ENOENT" && !extname3(path19) && !pathEndsWithSep) {
168155
168155
  return next(err);
168156
168156
  }
168157
168157
  if (err)
168158
168158
  return self2.onStatError(err);
168159
- if (stat3.isDirectory())
168159
+ if (stat4.isDirectory())
168160
168160
  return self2.redirect(path19);
168161
168161
  if (pathEndsWithSep)
168162
168162
  return self2.error(404);
168163
- self2.emit("file", path19, stat3);
168164
- self2.send(path19, stat3);
168163
+ self2.emit("file", path19, stat4);
168164
+ self2.send(path19, stat4);
168165
168165
  });
168166
168166
  function next(err) {
168167
168167
  if (self2._extensions.length <= i5) {
@@ -168169,13 +168169,13 @@ var require_send = __commonJS(function(exports, module) {
168169
168169
  }
168170
168170
  var p4 = path19 + "." + self2._extensions[i5++];
168171
168171
  debug('stat "%s"', p4);
168172
- fs28.stat(p4, function(err2, stat3) {
168172
+ fs28.stat(p4, function(err2, stat4) {
168173
168173
  if (err2)
168174
168174
  return next(err2);
168175
- if (stat3.isDirectory())
168175
+ if (stat4.isDirectory())
168176
168176
  return next();
168177
- self2.emit("file", p4, stat3);
168178
- self2.send(p4, stat3);
168177
+ self2.emit("file", p4, stat4);
168178
+ self2.send(p4, stat4);
168179
168179
  });
168180
168180
  }
168181
168181
  };
@@ -168188,15 +168188,15 @@ var require_send = __commonJS(function(exports, module) {
168188
168188
  return self2.onStatError(err);
168189
168189
  return self2.error(404);
168190
168190
  }
168191
- var p4 = join29(path19, self2._index[i5]);
168191
+ var p4 = join30(path19, self2._index[i5]);
168192
168192
  debug('stat "%s"', p4);
168193
- fs28.stat(p4, function(err2, stat3) {
168193
+ fs28.stat(p4, function(err2, stat4) {
168194
168194
  if (err2)
168195
168195
  return next(err2);
168196
- if (stat3.isDirectory())
168196
+ if (stat4.isDirectory())
168197
168197
  return next();
168198
- self2.emit("file", p4, stat3);
168199
- self2.send(p4, stat3);
168198
+ self2.emit("file", p4, stat4);
168199
+ self2.send(p4, stat4);
168200
168200
  });
168201
168201
  }
168202
168202
  next();
@@ -168223,14 +168223,14 @@ var require_send = __commonJS(function(exports, module) {
168223
168223
  var res = this.res;
168224
168224
  if (res.getHeader("Content-Type"))
168225
168225
  return;
168226
- var ext = extname2(path19);
168226
+ var ext = extname3(path19);
168227
168227
  var type2 = mime.contentType(ext) || "application/octet-stream";
168228
168228
  debug("content-type %s", type2);
168229
168229
  res.setHeader("Content-Type", type2);
168230
168230
  };
168231
- SendStream.prototype.setHeader = function setHeader(path19, stat3) {
168231
+ SendStream.prototype.setHeader = function setHeader(path19, stat4) {
168232
168232
  var res = this.res;
168233
- this.emit("headers", res, path19, stat3);
168233
+ this.emit("headers", res, path19, stat4);
168234
168234
  if (this._acceptRanges && !res.getHeader("Accept-Ranges")) {
168235
168235
  debug("accept ranges");
168236
168236
  res.setHeader("Accept-Ranges", "bytes");
@@ -168244,12 +168244,12 @@ var require_send = __commonJS(function(exports, module) {
168244
168244
  res.setHeader("Cache-Control", cacheControl);
168245
168245
  }
168246
168246
  if (this._lastModified && !res.getHeader("Last-Modified")) {
168247
- var modified = stat3.mtime.toUTCString();
168247
+ var modified = stat4.mtime.toUTCString();
168248
168248
  debug("modified %s", modified);
168249
168249
  res.setHeader("Last-Modified", modified);
168250
168250
  }
168251
168251
  if (this._etag && !res.getHeader("ETag")) {
168252
- var val = etag(stat3);
168252
+ var val = etag(stat4);
168253
168253
  debug("etag %s", val);
168254
168254
  res.setHeader("ETag", val);
168255
168255
  }
@@ -168383,8 +168383,8 @@ var require_response = __commonJS(function(exports, module) {
168383
168383
  var setCharset = require_utils10().setCharset;
168384
168384
  var cookie = require_cookie();
168385
168385
  var send = require_send();
168386
- var extname2 = path18.extname;
168387
- var resolve13 = path18.resolve;
168386
+ var extname3 = path18.extname;
168387
+ var resolve15 = path18.resolve;
168388
168388
  var vary = require_vary();
168389
168389
  var { Buffer: Buffer7 } = __require("node:buffer");
168390
168390
  var res = Object.create(http.ServerResponse.prototype);
@@ -168593,7 +168593,7 @@ var require_response = __commonJS(function(exports, module) {
168593
168593
  }
168594
168594
  opts = Object.create(opts);
168595
168595
  opts.headers = headers;
168596
- var fullPath = !opts.root ? resolve13(path19) : path19;
168596
+ var fullPath = !opts.root ? resolve15(path19) : path19;
168597
168597
  return this.sendFile(fullPath, opts, done);
168598
168598
  };
168599
168599
  res.contentType = res.type = function contentType(type) {
@@ -168624,7 +168624,7 @@ var require_response = __commonJS(function(exports, module) {
168624
168624
  };
168625
168625
  res.attachment = function attachment(filename) {
168626
168626
  if (filename) {
168627
- this.type(extname2(filename));
168627
+ this.type(extname3(filename));
168628
168628
  }
168629
168629
  this.set("Content-Disposition", contentDisposition(filename));
168630
168630
  return this;
@@ -168854,7 +168854,7 @@ var require_serve_static = __commonJS(function(exports, module) {
168854
168854
  var encodeUrl = require_encodeurl();
168855
168855
  var escapeHtml = require_escape_html();
168856
168856
  var parseUrl = require_parseurl();
168857
- var resolve13 = __require("path").resolve;
168857
+ var resolve15 = __require("path").resolve;
168858
168858
  var send = require_send();
168859
168859
  var url3 = __require("url");
168860
168860
  module.exports = serveStatic;
@@ -168873,7 +168873,7 @@ var require_serve_static = __commonJS(function(exports, module) {
168873
168873
  throw new TypeError("option setHeaders must be function");
168874
168874
  }
168875
168875
  opts.maxage = opts.maxage || opts.maxAge || 0;
168876
- opts.root = resolve13(root2);
168876
+ opts.root = resolve15(root2);
168877
168877
  var onDirectory = redirect ? createRedirectDirectoryListener() : createNotFoundDirectoryListener();
168878
168878
  return function serveStatic2(req, res, next) {
168879
168879
  if (req.method !== "GET" && req.method !== "HEAD") {
@@ -169797,8 +169797,8 @@ var require_follow_redirects = __commonJS(function(exports, module) {
169797
169797
  }
169798
169798
  return parsed;
169799
169799
  }
169800
- function resolveUrl(relative4, base) {
169801
- return useNativeURL ? new URL2(relative4, base) : parseUrl(url3.resolve(base, relative4));
169800
+ function resolveUrl(relative5, base) {
169801
+ return useNativeURL ? new URL2(relative5, base) : parseUrl(url3.resolve(base, relative5));
169802
169802
  }
169803
169803
  function validateUrl(input) {
169804
169804
  if (/^\[/.test(input.hostname) && !/^\[[:0-9a-f]+\]$/i.test(input.hostname)) {
@@ -172247,8 +172247,8 @@ var require_executor = __commonJS(function(exports, module) {
172247
172247
  }
172248
172248
  resetBuffer() {
172249
172249
  this.buffer = new Waterfall;
172250
- this.buffer.chain(new Promise((resolve13) => {
172251
- this._triggerBuffer = resolve13;
172250
+ this.buffer.chain(new Promise((resolve15) => {
172251
+ this._triggerBuffer = resolve15;
172252
172252
  }));
172253
172253
  if (this.ready)
172254
172254
  this._triggerBuffer();
@@ -173268,7 +173268,7 @@ var require_storage = __commonJS(function(exports, module) {
173268
173268
  throw e8;
173269
173269
  }
173270
173270
  };
173271
- var writeFileLinesAsync = (filename, lines, mode = DEFAULT_FILE_MODE) => new Promise((resolve13, reject) => {
173271
+ var writeFileLinesAsync = (filename, lines, mode = DEFAULT_FILE_MODE) => new Promise((resolve15, reject) => {
173272
173272
  try {
173273
173273
  const stream = writeFileStream(filename, { mode });
173274
173274
  const readable2 = Readable6.from(lines);
@@ -173285,7 +173285,7 @@ var require_storage = __commonJS(function(exports, module) {
173285
173285
  if (err)
173286
173286
  reject(err);
173287
173287
  else
173288
- resolve13();
173288
+ resolve15();
173289
173289
  });
173290
173290
  });
173291
173291
  readable2.on("error", (err) => {
@@ -173456,7 +173456,7 @@ var require_persistence = __commonJS(function(exports, module) {
173456
173456
  return { data: tdata, indexes };
173457
173457
  }
173458
173458
  treatRawStreamAsync(rawStream) {
173459
- return new Promise((resolve13, reject) => {
173459
+ return new Promise((resolve15, reject) => {
173460
173460
  const dataById = {};
173461
173461
  const indexes = {};
173462
173462
  let corruptItems = 0;
@@ -173499,7 +173499,7 @@ var require_persistence = __commonJS(function(exports, module) {
173499
173499
  }
173500
173500
  }
173501
173501
  const data = Object.values(dataById);
173502
- resolve13({ data, indexes });
173502
+ resolve15({ data, indexes });
173503
173503
  });
173504
173504
  lineStream.on("error", function(err) {
173505
173505
  reject(err, null);
@@ -183032,7 +183032,7 @@ var require_mime_types2 = __commonJS(function(exports) {
183032
183032
  * MIT Licensed
183033
183033
  */
183034
183034
  var db2 = require_db2();
183035
- var extname2 = __require("path").extname;
183035
+ var extname3 = __require("path").extname;
183036
183036
  var EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/;
183037
183037
  var TEXT_TYPE_REGEXP = /^text\//i;
183038
183038
  exports.charset = charset;
@@ -183087,7 +183087,7 @@ var require_mime_types2 = __commonJS(function(exports) {
183087
183087
  if (!path18 || typeof path18 !== "string") {
183088
183088
  return false;
183089
183089
  }
183090
- var extension2 = extname2("x." + path18).toLowerCase().substr(1);
183090
+ var extension2 = extname3("x." + path18).toLowerCase().substr(1);
183091
183091
  if (!extension2) {
183092
183092
  return false;
183093
183093
  }
@@ -193079,7 +193079,7 @@ var require_mime_types3 = __commonJS(function(exports) {
193079
193079
  * MIT Licensed
193080
193080
  */
193081
193081
  var db2 = require_db3();
193082
- var extname2 = __require("path").extname;
193082
+ var extname3 = __require("path").extname;
193083
193083
  var EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/;
193084
193084
  var TEXT_TYPE_REGEXP = /^text\//i;
193085
193085
  exports.charset = charset;
@@ -193134,7 +193134,7 @@ var require_mime_types3 = __commonJS(function(exports) {
193134
193134
  if (!path18 || typeof path18 !== "string") {
193135
193135
  return false;
193136
193136
  }
193137
- var extension2 = extname2("x." + path18).toLowerCase().substr(1);
193137
+ var extension2 = extname3("x." + path18).toLowerCase().substr(1);
193138
193138
  if (!extension2) {
193139
193139
  return false;
193140
193140
  }
@@ -199110,13 +199110,13 @@ var require_broadcast_operator = __commonJS(function(exports) {
199110
199110
  return true;
199111
199111
  }
199112
199112
  emitWithAck(ev2, ...args) {
199113
- return new Promise((resolve13, reject) => {
199113
+ return new Promise((resolve15, reject) => {
199114
199114
  args.push((err, responses) => {
199115
199115
  if (err) {
199116
199116
  err.responses = responses;
199117
199117
  return reject(err);
199118
199118
  } else {
199119
- return resolve13(responses);
199119
+ return resolve15(responses);
199120
199120
  }
199121
199121
  });
199122
199122
  this.emit(ev2, ...args);
@@ -199304,12 +199304,12 @@ var require_socket2 = __commonJS(function(exports) {
199304
199304
  }
199305
199305
  emitWithAck(ev2, ...args) {
199306
199306
  const withErr = this.flags.timeout !== undefined;
199307
- return new Promise((resolve13, reject) => {
199307
+ return new Promise((resolve15, reject) => {
199308
199308
  args.push((arg1, arg2) => {
199309
199309
  if (withErr) {
199310
- return arg1 ? reject(arg1) : resolve13(arg2);
199310
+ return arg1 ? reject(arg1) : resolve15(arg2);
199311
199311
  } else {
199312
- return resolve13(arg1);
199312
+ return resolve15(arg1);
199313
199313
  }
199314
199314
  });
199315
199315
  this.emit(ev2, ...args);
@@ -199764,13 +199764,13 @@ var require_namespace = __commonJS(function(exports) {
199764
199764
  return true;
199765
199765
  }
199766
199766
  serverSideEmitWithAck(ev2, ...args) {
199767
- return new Promise((resolve13, reject) => {
199767
+ return new Promise((resolve15, reject) => {
199768
199768
  args.push((err, responses) => {
199769
199769
  if (err) {
199770
199770
  err.responses = responses;
199771
199771
  return reject(err);
199772
199772
  } else {
199773
- return resolve13(responses);
199773
+ return resolve15(responses);
199774
199774
  }
199775
199775
  });
199776
199776
  this.serverSideEmit(ev2, ...args);
@@ -203305,7 +203305,7 @@ var require_cluster_adapter = __commonJS(function(exports) {
203305
203305
  return localSockets;
203306
203306
  }
203307
203307
  const requestId = randomId();
203308
- return new Promise((resolve13, reject) => {
203308
+ return new Promise((resolve15, reject) => {
203309
203309
  const timeout3 = setTimeout(() => {
203310
203310
  const storedRequest2 = this.requests.get(requestId);
203311
203311
  if (storedRequest2) {
@@ -203315,7 +203315,7 @@ var require_cluster_adapter = __commonJS(function(exports) {
203315
203315
  }, opts.flags.timeout || DEFAULT_TIMEOUT);
203316
203316
  const storedRequest = {
203317
203317
  type: MessageType.FETCH_SOCKETS,
203318
- resolve: resolve13,
203318
+ resolve: resolve15,
203319
203319
  timeout: timeout3,
203320
203320
  current: 0,
203321
203321
  expected: expectedResponseCount,
@@ -203525,7 +203525,7 @@ var require_cluster_adapter = __commonJS(function(exports) {
203525
203525
  return localSockets;
203526
203526
  }
203527
203527
  const requestId = randomId();
203528
- return new Promise((resolve13, reject) => {
203528
+ return new Promise((resolve15, reject) => {
203529
203529
  const timeout3 = setTimeout(() => {
203530
203530
  const storedRequest2 = this.customRequests.get(requestId);
203531
203531
  if (storedRequest2) {
@@ -203535,7 +203535,7 @@ var require_cluster_adapter = __commonJS(function(exports) {
203535
203535
  }, opts.flags.timeout || DEFAULT_TIMEOUT);
203536
203536
  const storedRequest = {
203537
203537
  type: MessageType.FETCH_SOCKETS,
203538
- resolve: resolve13,
203538
+ resolve: resolve15,
203539
203539
  timeout: timeout3,
203540
203540
  missingUids: new Set([...this.nodesMap.keys()]),
203541
203541
  responses: localSockets
@@ -204264,13 +204264,13 @@ var require_dist4 = __commonJS(function(exports, module) {
204264
204264
  this.engine.close();
204265
204265
  (0, uws_1.restoreAdapter)();
204266
204266
  if (this.httpServer) {
204267
- return new Promise((resolve13) => {
204267
+ return new Promise((resolve15) => {
204268
204268
  this.httpServer.close((err) => {
204269
204269
  fn9 && fn9(err);
204270
204270
  if (err) {
204271
204271
  debug("server was not running");
204272
204272
  }
204273
- resolve13();
204273
+ resolve15();
204274
204274
  });
204275
204275
  });
204276
204276
  } else {
@@ -213006,7 +213006,7 @@ var require_mime_types4 = __commonJS(function(exports) {
213006
213006
  * MIT Licensed
213007
213007
  */
213008
213008
  var db2 = require_db4();
213009
- var extname2 = __require("path").extname;
213009
+ var extname3 = __require("path").extname;
213010
213010
  var EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/;
213011
213011
  var TEXT_TYPE_REGEXP = /^text\//i;
213012
213012
  exports.charset = charset;
@@ -213061,7 +213061,7 @@ var require_mime_types4 = __commonJS(function(exports) {
213061
213061
  if (!path18 || typeof path18 !== "string") {
213062
213062
  return false;
213063
213063
  }
213064
- var extension2 = extname2("x." + path18).toLowerCase().substr(1);
213064
+ var extension2 = extname3("x." + path18).toLowerCase().substr(1);
213065
213065
  if (!extension2) {
213066
213066
  return false;
213067
213067
  }
@@ -217393,8 +217393,8 @@ var require_mkdirp = __commonJS(function(exports, module) {
217393
217393
  });
217394
217394
  break;
217395
217395
  default:
217396
- xfs.stat(p4, function(er22, stat3) {
217397
- if (er22 || !stat3.isDirectory())
217396
+ xfs.stat(p4, function(er22, stat4) {
217397
+ if (er22 || !stat4.isDirectory())
217398
217398
  cb2(er10, made);
217399
217399
  else
217400
217400
  cb2(null, made);
@@ -217425,13 +217425,13 @@ var require_mkdirp = __commonJS(function(exports, module) {
217425
217425
  sync(p4, opts, made);
217426
217426
  break;
217427
217427
  default:
217428
- var stat3;
217428
+ var stat4;
217429
217429
  try {
217430
- stat3 = xfs.statSync(p4);
217430
+ stat4 = xfs.statSync(p4);
217431
217431
  } catch (err1) {
217432
217432
  throw err0;
217433
217433
  }
217434
- if (!stat3.isDirectory())
217434
+ if (!stat4.isDirectory())
217435
217435
  throw err0;
217436
217436
  break;
217437
217437
  }
@@ -217634,7 +217634,7 @@ var require_buffer_list = __commonJS(function(exports, module) {
217634
217634
  }
217635
217635
  }, {
217636
217636
  key: "join",
217637
- value: function join31(s5) {
217637
+ value: function join33(s5) {
217638
217638
  if (this.length === 0)
217639
217639
  return "";
217640
217640
  var p4 = this.head;
@@ -218932,14 +218932,14 @@ var require_async_iterator = __commonJS(function(exports, module) {
218932
218932
  };
218933
218933
  }
218934
218934
  function readAndResolve(iter) {
218935
- var resolve13 = iter[kLastResolve];
218936
- if (resolve13 !== null) {
218935
+ var resolve15 = iter[kLastResolve];
218936
+ if (resolve15 !== null) {
218937
218937
  var data = iter[kStream].read();
218938
218938
  if (data !== null) {
218939
218939
  iter[kLastPromise] = null;
218940
218940
  iter[kLastResolve] = null;
218941
218941
  iter[kLastReject] = null;
218942
- resolve13(createIterResult(data, false));
218942
+ resolve15(createIterResult(data, false));
218943
218943
  }
218944
218944
  }
218945
218945
  }
@@ -218947,13 +218947,13 @@ var require_async_iterator = __commonJS(function(exports, module) {
218947
218947
  process.nextTick(readAndResolve, iter);
218948
218948
  }
218949
218949
  function wrapForNext(lastPromise, iter) {
218950
- return function(resolve13, reject) {
218950
+ return function(resolve15, reject) {
218951
218951
  lastPromise.then(function() {
218952
218952
  if (iter[kEnded]) {
218953
- resolve13(createIterResult(undefined, true));
218953
+ resolve15(createIterResult(undefined, true));
218954
218954
  return;
218955
218955
  }
218956
- iter[kHandlePromise](resolve13, reject);
218956
+ iter[kHandlePromise](resolve15, reject);
218957
218957
  }, reject);
218958
218958
  };
218959
218959
  }
@@ -218972,12 +218972,12 @@ var require_async_iterator = __commonJS(function(exports, module) {
218972
218972
  return Promise.resolve(createIterResult(undefined, true));
218973
218973
  }
218974
218974
  if (this[kStream].destroyed) {
218975
- return new Promise(function(resolve13, reject) {
218975
+ return new Promise(function(resolve15, reject) {
218976
218976
  process.nextTick(function() {
218977
218977
  if (_this[kError]) {
218978
218978
  reject(_this[kError]);
218979
218979
  } else {
218980
- resolve13(createIterResult(undefined, true));
218980
+ resolve15(createIterResult(undefined, true));
218981
218981
  }
218982
218982
  });
218983
218983
  });
@@ -219000,13 +219000,13 @@ var require_async_iterator = __commonJS(function(exports, module) {
219000
219000
  return this;
219001
219001
  }), _defineProperty(_Object$setPrototypeO, "return", function _return() {
219002
219002
  var _this2 = this;
219003
- return new Promise(function(resolve13, reject) {
219003
+ return new Promise(function(resolve15, reject) {
219004
219004
  _this2[kStream].destroy(null, function(err) {
219005
219005
  if (err) {
219006
219006
  reject(err);
219007
219007
  return;
219008
219008
  }
219009
- resolve13(createIterResult(undefined, true));
219009
+ resolve15(createIterResult(undefined, true));
219010
219010
  });
219011
219011
  });
219012
219012
  }), _Object$setPrototypeO), AsyncIteratorPrototype);
@@ -219028,15 +219028,15 @@ var require_async_iterator = __commonJS(function(exports, module) {
219028
219028
  value: stream._readableState.endEmitted,
219029
219029
  writable: true
219030
219030
  }), _defineProperty(_Object$create, kHandlePromise, {
219031
- value: function value(resolve13, reject) {
219031
+ value: function value(resolve15, reject) {
219032
219032
  var data = iterator[kStream].read();
219033
219033
  if (data) {
219034
219034
  iterator[kLastPromise] = null;
219035
219035
  iterator[kLastResolve] = null;
219036
219036
  iterator[kLastReject] = null;
219037
- resolve13(createIterResult(data, false));
219037
+ resolve15(createIterResult(data, false));
219038
219038
  } else {
219039
- iterator[kLastResolve] = resolve13;
219039
+ iterator[kLastResolve] = resolve15;
219040
219040
  iterator[kLastReject] = reject;
219041
219041
  }
219042
219042
  },
@@ -219055,12 +219055,12 @@ var require_async_iterator = __commonJS(function(exports, module) {
219055
219055
  iterator[kError] = err;
219056
219056
  return;
219057
219057
  }
219058
- var resolve13 = iterator[kLastResolve];
219059
- if (resolve13 !== null) {
219058
+ var resolve15 = iterator[kLastResolve];
219059
+ if (resolve15 !== null) {
219060
219060
  iterator[kLastPromise] = null;
219061
219061
  iterator[kLastResolve] = null;
219062
219062
  iterator[kLastReject] = null;
219063
- resolve13(createIterResult(undefined, true));
219063
+ resolve15(createIterResult(undefined, true));
219064
219064
  }
219065
219065
  iterator[kEnded] = true;
219066
219066
  });
@@ -219072,7 +219072,7 @@ var require_async_iterator = __commonJS(function(exports, module) {
219072
219072
 
219073
219073
  // ../../node_modules/readable-stream/lib/internal/streams/from.js
219074
219074
  var require_from = __commonJS(function(exports, module) {
219075
- function asyncGeneratorStep(gen, resolve13, reject, _next, _throw, key2, arg) {
219075
+ function asyncGeneratorStep(gen, resolve15, reject, _next, _throw, key2, arg) {
219076
219076
  try {
219077
219077
  var info = gen[key2](arg);
219078
219078
  var value = info.value;
@@ -219081,7 +219081,7 @@ var require_from = __commonJS(function(exports, module) {
219081
219081
  return;
219082
219082
  }
219083
219083
  if (info.done) {
219084
- resolve13(value);
219084
+ resolve15(value);
219085
219085
  } else {
219086
219086
  Promise.resolve(value).then(_next, _throw);
219087
219087
  }
@@ -219089,13 +219089,13 @@ var require_from = __commonJS(function(exports, module) {
219089
219089
  function _asyncToGenerator(fn9) {
219090
219090
  return function() {
219091
219091
  var self2 = this, args = arguments;
219092
- return new Promise(function(resolve13, reject) {
219092
+ return new Promise(function(resolve15, reject) {
219093
219093
  var gen = fn9.apply(self2, args);
219094
219094
  function _next(value) {
219095
- asyncGeneratorStep(gen, resolve13, reject, _next, _throw, "next", value);
219095
+ asyncGeneratorStep(gen, resolve15, reject, _next, _throw, "next", value);
219096
219096
  }
219097
219097
  function _throw(err) {
219098
- asyncGeneratorStep(gen, resolve13, reject, _next, _throw, "throw", err);
219098
+ asyncGeneratorStep(gen, resolve15, reject, _next, _throw, "throw", err);
219099
219099
  }
219100
219100
  _next(undefined);
219101
219101
  });
@@ -221222,7 +221222,7 @@ var require_dist5 = __commonJS(function(exports, module) {
221222
221222
  determineAgent: () => determineAgent
221223
221223
  });
221224
221224
  module.exports = __toCommonJS2(src_exports);
221225
- var import_promises25 = __require("node:fs/promises");
221225
+ var import_promises26 = __require("node:fs/promises");
221226
221226
  var import_node_fs24 = __require("node:fs");
221227
221227
  var DEVIN_LOCAL_PATH = "/opt/.devin";
221228
221228
  var CURSOR2 = "cursor";
@@ -221280,7 +221280,7 @@ var require_dist5 = __commonJS(function(exports, module) {
221280
221280
  return { isAgent: true, agent: { name: REPLIT } };
221281
221281
  }
221282
221282
  try {
221283
- await (0, import_promises25.access)(DEVIN_LOCAL_PATH, import_node_fs24.constants.F_OK);
221283
+ await (0, import_promises26.access)(DEVIN_LOCAL_PATH, import_node_fs24.constants.F_OK);
221284
221284
  return { isAgent: true, agent: { name: DEVIN } };
221285
221285
  } catch (error48) {}
221286
221286
  return { isAgent: false, agent: undefined };
@@ -237842,7 +237842,7 @@ function normalizeBase44Env() {
237842
237842
  loadProjectEnvFiles();
237843
237843
 
237844
237844
  // src/cli/index.ts
237845
- import { dirname as dirname25, join as join36 } from "node:path";
237845
+ import { dirname as dirname26, join as join37 } from "node:path";
237846
237846
  import { fileURLToPath as fileURLToPath6 } from "node:url";
237847
237847
 
237848
237848
  // ../../node_modules/@clack/core/dist/index.mjs
@@ -238926,7 +238926,7 @@ var {
238926
238926
  } = import__.default;
238927
238927
 
238928
238928
  // src/cli/commands/agent-skills/pull.ts
238929
- import { dirname as dirname10, join as join17 } from "node:path";
238929
+ import { dirname as dirname11, join as join18 } from "node:path";
238930
238930
  // ../../node_modules/chalk/source/vendor/ansi-styles/index.js
238931
238931
  var ANSI_BACKGROUND_OFFSET = 10;
238932
238932
  var wrapAnsi16 = (offset = 0) => (code) => `\x1B[${code + offset}m`;
@@ -245542,19 +245542,27 @@ var PublishedUrlResponseSchema = exports_external.object({
245542
245542
  var CreateDeploymentResponseSchema = exports_external.object({
245543
245543
  deployment_id: exports_external.string(),
245544
245544
  session_id: exports_external.string(),
245545
- asset_uploads: exports_external.object({
245546
- type: exports_external.literal("s3"),
245547
- uploads: exports_external.array(exports_external.object({
245548
- path: exports_external.string(),
245549
- content_type: exports_external.string(),
245550
- content_length: exports_external.number(),
245551
- url: exports_external.string()
245552
- }))
245553
- }).nullable().optional()
245545
+ asset_uploads: exports_external.discriminatedUnion("type", [
245546
+ exports_external.object({
245547
+ type: exports_external.literal("cf"),
245548
+ url: exports_external.string(),
245549
+ jwt: exports_external.string(),
245550
+ buckets: exports_external.array(exports_external.array(exports_external.string()))
245551
+ }),
245552
+ exports_external.object({
245553
+ type: exports_external.literal("s3"),
245554
+ uploads: exports_external.array(exports_external.object({
245555
+ path: exports_external.string(),
245556
+ content_type: exports_external.string(),
245557
+ content_length: exports_external.number(),
245558
+ url: exports_external.string()
245559
+ }))
245560
+ })
245561
+ ]).nullable().optional()
245554
245562
  }).transform((data) => ({
245555
245563
  deploymentId: data.deployment_id,
245556
245564
  sessionId: data.session_id,
245557
- assetUploads: data.asset_uploads == null ? null : {
245565
+ assetUploads: data.asset_uploads == null ? null : data.asset_uploads.type === "cf" ? data.asset_uploads : {
245558
245566
  type: "s3",
245559
245567
  uploads: data.asset_uploads.uploads.map((upload) => ({
245560
245568
  path: upload.path,
@@ -245564,6 +245572,9 @@ var CreateDeploymentResponseSchema = exports_external.object({
245564
245572
  }))
245565
245573
  }
245566
245574
  }));
245575
+ var AssetUploadResponseSchema = exports_external.looseObject({
245576
+ result: exports_external.looseObject({ jwt: exports_external.string().nullable().optional() }).nullable().optional()
245577
+ });
245567
245578
  var FinalizeDeploymentResponseSchema = exports_external.object({
245568
245579
  deployment_id: exports_external.string()
245569
245580
  }).transform((data) => ({
@@ -247927,7 +247938,7 @@ import { join as join12 } from "node:path";
247927
247938
  // package.json
247928
247939
  var package_default = {
247929
247940
  name: "base44",
247930
- version: "0.1.11",
247941
+ version: "0.1.12",
247931
247942
  description: "Base44 CLI - Unified interface for managing Base44 applications",
247932
247943
  type: "module",
247933
247944
  bin: {
@@ -248152,7 +248163,7 @@ async function createProjectFilesForExistingProject(options) {
248152
248163
  };
248153
248164
  }
248154
248165
  // src/core/project/deploy.ts
248155
- import { resolve as resolve3 } from "node:path";
248166
+ import { resolve as resolve6 } from "node:path";
248156
248167
 
248157
248168
  // src/core/site/api.ts
248158
248169
  async function uploadSite(archivePath) {
@@ -248176,6 +248187,13 @@ async function uploadSite(archivePath) {
248176
248187
  }
248177
248188
  return result.data;
248178
248189
  }
248190
+ var MODULE_CONTENT_TYPES = {
248191
+ esm: "application/javascript+module",
248192
+ sourcemap: "application/source-map",
248193
+ wasm: "application/wasm",
248194
+ text: "text/plain",
248195
+ data: "application/octet-stream"
248196
+ };
248179
248197
  async function createDeployment(request) {
248180
248198
  const appClient = getAppClient();
248181
248199
  let response;
@@ -248193,6 +248211,17 @@ async function createDeployment(request) {
248193
248211
  }
248194
248212
  return result.data;
248195
248213
  }
248214
+ async function finalizeDeployment(deploymentId, completionJwt, modules, sessionId) {
248215
+ const formData = new FormData;
248216
+ formData.append("payload", JSON.stringify({ completion_jwt: completionJwt }));
248217
+ for (const module of modules) {
248218
+ const content = await readFile(module.absolutePath);
248219
+ formData.append(module.name, new File([new Uint8Array(content)], module.name, {
248220
+ type: MODULE_CONTENT_TYPES[module.type]
248221
+ }));
248222
+ }
248223
+ return await postFinalize(deploymentId, formData, sessionId);
248224
+ }
248196
248225
  async function finalizeStaticDeployment(deploymentId, indexHtml, sessionId) {
248197
248226
  const formData = new FormData;
248198
248227
  formData.append("index.html", new File([indexHtml], "index.html", { type: "text/html" }));
@@ -248263,10 +248292,17 @@ async function createArchive(pathToArchive, targetArchivePath) {
248263
248292
  cwd: pathToArchive
248264
248293
  }, ["."]);
248265
248294
  }
248295
+ // src/core/site/deploy-app.ts
248296
+ import { resolve as resolve4 } from "node:path";
248297
+
248298
+ // src/core/site/static-site.ts
248299
+ import { readFile as readFile4 } from "node:fs/promises";
248300
+ import { join as join16 } from "node:path";
248301
+
248266
248302
  // src/core/site/manifest.ts
248267
248303
  import { createHash } from "node:crypto";
248268
248304
  import { readFile as readFile2, stat } from "node:fs/promises";
248269
- import { basename as basename4, join as join15 } from "node:path";
248305
+ import { basename as basename4, extname, join as join15 } from "node:path";
248270
248306
  var MAX_ASSET_SIZE_BYTES = 25 * 1024 * 1024;
248271
248307
  var MAX_ASSET_COUNT = 1e5;
248272
248308
  var ASSETS_IGNORE_FILE = ".assetsignore";
@@ -248275,6 +248311,39 @@ var ALWAYS_IGNORED = new Set([
248275
248311
  "wrangler.json",
248276
248312
  ".dev.vars"
248277
248313
  ]);
248314
+ var MIME_TYPES = {
248315
+ ".html": "text/html",
248316
+ ".htm": "text/html",
248317
+ ".css": "text/css",
248318
+ ".js": "text/javascript",
248319
+ ".mjs": "text/javascript",
248320
+ ".json": "application/json",
248321
+ ".map": "application/json",
248322
+ ".txt": "text/plain",
248323
+ ".xml": "application/xml",
248324
+ ".svg": "image/svg+xml",
248325
+ ".png": "image/png",
248326
+ ".jpg": "image/jpeg",
248327
+ ".jpeg": "image/jpeg",
248328
+ ".gif": "image/gif",
248329
+ ".webp": "image/webp",
248330
+ ".avif": "image/avif",
248331
+ ".ico": "image/x-icon",
248332
+ ".woff": "font/woff",
248333
+ ".woff2": "font/woff2",
248334
+ ".ttf": "font/ttf",
248335
+ ".otf": "font/otf",
248336
+ ".eot": "application/vnd.ms-fontobject",
248337
+ ".mp3": "audio/mpeg",
248338
+ ".mp4": "video/mp4",
248339
+ ".webm": "video/webm",
248340
+ ".pdf": "application/pdf",
248341
+ ".wasm": "application/wasm",
248342
+ ".webmanifest": "application/manifest+json"
248343
+ };
248344
+ function getAssetContentType(filePath) {
248345
+ return MIME_TYPES[extname(filePath).toLowerCase()] ?? "application/octet-stream";
248346
+ }
248278
248347
  function hashAsset(appId, content) {
248279
248348
  return createHash("sha256").update(Buffer.from(appId, "utf8")).update(content).digest("hex").slice(0, 32);
248280
248349
  }
@@ -248302,14 +248371,16 @@ async function buildAssetManifest(assetsDir, appId) {
248302
248371
  const hash2 = hashAsset(appId, content);
248303
248372
  manifest[`/${relativePath}`] = { hash: hash2, size };
248304
248373
  if (!filesByHash.has(hash2)) {
248305
- filesByHash.set(hash2, { absolutePath, hash: hash2, size });
248374
+ filesByHash.set(hash2, {
248375
+ absolutePath,
248376
+ hash: hash2,
248377
+ size,
248378
+ contentType: getAssetContentType(absolutePath)
248379
+ });
248306
248380
  }
248307
248381
  }
248308
248382
  return { manifest, filesByHash };
248309
248383
  }
248310
- // src/core/site/static-site.ts
248311
- import { readFile as readFile4 } from "node:fs/promises";
248312
- import { join as join16 } from "node:path";
248313
248384
 
248314
248385
  // src/core/site/upload.ts
248315
248386
  import { readFile as readFile3 } from "node:fs/promises";
@@ -248443,6 +248514,62 @@ var DEFAULT_UPLOAD_CONCURRENCY = 3;
248443
248514
  var MAX_UPLOAD_CONCURRENCY = 50;
248444
248515
  var MAX_UPLOAD_ATTEMPTS = 3;
248445
248516
  var RETRY_BASE_DELAY_MS = 500;
248517
+ var UPLOAD_RETRY = {
248518
+ limit: MAX_UPLOAD_ATTEMPTS - 1,
248519
+ delay: (attempt) => RETRY_BASE_DELAY_MS * 2 ** (attempt - 1)
248520
+ };
248521
+ async function uploadAssetBuckets(target, filesByHash, options = {}) {
248522
+ const { concurrency = DEFAULT_UPLOAD_CONCURRENCY, onProgress } = options;
248523
+ const { buckets } = target;
248524
+ const totalFiles = buckets.reduce((sum, bucket) => sum + bucket.length, 0);
248525
+ let uploadedFiles = 0;
248526
+ let completionJwt = null;
248527
+ await pMap(buckets, async (bucket) => {
248528
+ const jwt3 = await uploadAssetBucket(target, bucket, filesByHash);
248529
+ if (jwt3) {
248530
+ completionJwt = jwt3;
248531
+ }
248532
+ uploadedFiles += bucket.length;
248533
+ onProgress?.({ uploadedFiles, totalFiles });
248534
+ }, { concurrency });
248535
+ if (!completionJwt) {
248536
+ throw new ApiError("Asset upload finished but the server did not return a completion token.");
248537
+ }
248538
+ return completionJwt;
248539
+ }
248540
+ async function uploadAssetBucket(target, bucket, filesByHash) {
248541
+ const formData = await buildBucketForm(bucket, filesByHash);
248542
+ let response;
248543
+ try {
248544
+ response = await distribution_default.post(target.url, {
248545
+ searchParams: { base64: "true" },
248546
+ headers: { Authorization: `Bearer ${target.jwt}` },
248547
+ body: formData,
248548
+ timeout: 120000,
248549
+ retry: { ...UPLOAD_RETRY, methods: ["post"] }
248550
+ });
248551
+ } catch (error48) {
248552
+ if (error48 instanceof HTTPError && (error48.response.status === 401 || error48.response.status === 403)) {
248553
+ throw new ApiError("This deploy's upload session has expired — rerun deploy. Already-uploaded assets are skipped on the next attempt.", { statusCode: error48.response.status, cause: error48 });
248554
+ }
248555
+ throw await ApiError.fromHttpError(error48, "uploading assets to Cloudflare");
248556
+ }
248557
+ const parsed = AssetUploadResponseSchema.safeParse(await response.json());
248558
+ const jwt3 = parsed.success ? parsed.data.result?.jwt : null;
248559
+ return jwt3 || null;
248560
+ }
248561
+ async function buildBucketForm(bucket, filesByHash) {
248562
+ const formData = new FormData;
248563
+ for (const hash2 of bucket) {
248564
+ const file2 = filesByHash.get(hash2);
248565
+ if (!file2) {
248566
+ throw new InternalError(`Server requested upload of unknown asset hash: ${hash2}`);
248567
+ }
248568
+ const content = await readFile3(file2.absolutePath);
248569
+ formData.append(hash2, new File([content.toString("base64")], hash2, { type: file2.contentType }));
248570
+ }
248571
+ return formData;
248572
+ }
248446
248573
  async function uploadPresignedAssets(uploads, assets, options = {}) {
248447
248574
  const { concurrency = DEFAULT_UPLOAD_CONCURRENCY, onProgress } = options;
248448
248575
  let uploadedFiles = 0;
@@ -248464,10 +248591,7 @@ async function uploadPresignedAsset(upload, assets) {
248464
248591
  body: new Uint8Array(content),
248465
248592
  headers: { "Content-Type": upload.contentType },
248466
248593
  timeout: 120000,
248467
- retry: {
248468
- limit: MAX_UPLOAD_ATTEMPTS - 1,
248469
- delay: (attempt) => RETRY_BASE_DELAY_MS * 2 ** (attempt - 1)
248470
- }
248594
+ retry: UPLOAD_RETRY
248471
248595
  });
248472
248596
  } catch (error48) {
248473
248597
  throw await ApiError.fromHttpError(error48, "uploading static assets");
@@ -248475,6 +248599,11 @@ async function uploadPresignedAsset(upload, assets) {
248475
248599
  }
248476
248600
 
248477
248601
  // src/core/site/static-site.ts
248602
+ var STATIC_DEPLOYMENTS_ENV = "BASE44_STATIC_DEPLOYMENTS";
248603
+ function staticDeploymentsEnabled(env2 = process.env) {
248604
+ const value = env2[STATIC_DEPLOYMENTS_ENV];
248605
+ return value === "1" || value === "true";
248606
+ }
248478
248607
  async function deployStaticSite(options) {
248479
248608
  const { outputDir, gitHash, concurrency, progress } = options;
248480
248609
  const assets = await buildAssetManifest(outputDir, getAppContext().id);
@@ -248485,6 +248614,9 @@ async function deployStaticSite(options) {
248485
248614
  git_hash: gitHash,
248486
248615
  asset_manifest: assets.manifest
248487
248616
  });
248617
+ if (created.assetUploads && created.assetUploads.type !== "s3") {
248618
+ throw new ApiError(`The server answered a static-site deploy with the "${created.assetUploads.type}" upload target.`);
248619
+ }
248488
248620
  progress?.onAssets?.({
248489
248621
  totalAssets: Object.keys(assets.manifest).length,
248490
248622
  newAssets: created.assetUploads?.uploads.length ?? 0
@@ -248497,342 +248629,259 @@ async function deployStaticSite(options) {
248497
248629
  }
248498
248630
  const indexHtml = await readFile4(join16(outputDir, "index.html"));
248499
248631
  const finalized = await finalizeStaticDeployment(created.deploymentId, new Uint8Array(indexHtml), created.sessionId);
248500
- return { deploymentId: finalized.deploymentId };
248501
- }
248502
- // src/core/project/deploy.ts
248503
- function hasResourcesToDeploy(projectData) {
248504
- const {
248505
- project,
248506
- entities,
248507
- functions,
248508
- agents,
248509
- agentSkills,
248510
- connectors,
248511
- authConfig
248512
- } = projectData;
248513
- const hasSite = Boolean(project.site?.outputDirectory);
248514
- const hasEntities = entities.length > 0;
248515
- const hasFunctions = functions.length > 0;
248516
- const hasAgents = agents.length > 0;
248517
- const hasAgentSkills = agentSkills.length > 0;
248518
- const hasConnectors = connectors.length > 0;
248519
- const hasAuthConfig = authConfig.length > 0;
248520
- const hasVisibility = Boolean(project.visibility);
248521
- return hasEntities || hasFunctions || hasAgents || hasAgentSkills || hasConnectors || hasAuthConfig || hasVisibility || hasSite;
248522
- }
248523
- async function deployAll(projectData, options) {
248524
- const {
248525
- project,
248526
- entities,
248527
- functions,
248528
- agents,
248529
- agentSkills,
248530
- connectors,
248531
- authConfig
248532
- } = projectData;
248533
- await setAppVisibility(project.visibility);
248534
- if (project.visibility) {
248535
- options?.onVisibilitySet?.(project.visibility);
248632
+ return { deploymentId: finalized.deploymentId, gitHash };
248633
+ }
248634
+
248635
+ // src/core/site/wrangler-config.ts
248636
+ import { dirname as dirname10, join as join17, resolve as resolve3 } from "node:path";
248637
+ var WRANGLER_REDIRECT_PATH = join17(".wrangler", "deploy", "config.json");
248638
+ var RedirectConfigSchema = exports_external.looseObject({
248639
+ configPath: exports_external.string().min(1)
248640
+ });
248641
+ var WranglerConfigSchema = exports_external.looseObject({
248642
+ main: exports_external.string().min(1, "wrangler config is missing a 'main' entry module"),
248643
+ no_bundle: exports_external.boolean().optional(),
248644
+ rules: exports_external.array(exports_external.looseObject({ type: exports_external.string(), globs: exports_external.array(exports_external.string()) })).optional(),
248645
+ assets: exports_external.looseObject({
248646
+ directory: exports_external.string().optional(),
248647
+ html_handling: exports_external.string().optional(),
248648
+ not_found_handling: exports_external.string().optional(),
248649
+ run_worker_first: exports_external.union([exports_external.boolean(), exports_external.array(exports_external.string())]).optional(),
248650
+ headers: exports_external.string().optional(),
248651
+ redirects: exports_external.string().optional()
248652
+ }).optional(),
248653
+ compatibility_date: exports_external.string().optional(),
248654
+ compatibility_flags: exports_external.array(exports_external.string()).optional(),
248655
+ vars: exports_external.record(exports_external.string(), exports_external.unknown()).optional(),
248656
+ upload_source_maps: exports_external.boolean().optional()
248657
+ });
248658
+ async function detectFullStackArtifact(projectRoot) {
248659
+ const redirectPath = join17(projectRoot, WRANGLER_REDIRECT_PATH);
248660
+ return await pathExists(redirectPath) ? redirectPath : null;
248661
+ }
248662
+ async function resolveWranglerConfig(projectRoot) {
248663
+ const redirectPath = await detectFullStackArtifact(projectRoot);
248664
+ if (!redirectPath) {
248665
+ throw new InvalidInputError("No full-stack build artifact found. Expected a .wrangler/deploy/config.json redirect file.", {
248666
+ hints: [{ message: "Run your framework's build command first" }]
248667
+ });
248536
248668
  }
248537
- await entityResource.push(entities);
248538
- await deployFunctionsSequentially(functions, {
248539
- onStart: options?.onFunctionStart,
248540
- onResult: options?.onFunctionResult
248541
- });
248542
- await agentSkillResource.push(agentSkills);
248543
- await agentResource.push(agents);
248544
- await authConfigResource.push(authConfig);
248545
- const skipConnectorSync = connectors.length === 0 && hasWorkspaceApiKeyAuth();
248546
- const connectorResults = skipConnectorSync ? [] : (await pushConnectors(connectors)).results;
248547
- if (project.site?.outputDirectory) {
248548
- const outputDir = resolve3(project.root, project.site.outputDirectory);
248549
- const { appUrl } = await deploySite(outputDir);
248550
- return { appUrl, connectorResults };
248669
+ const configPath = await resolveRedirectedConfigPath(redirectPath);
248670
+ const parsed = await readJsonFile(configPath);
248671
+ const result = WranglerConfigSchema.safeParse(parsed);
248672
+ if (!result.success) {
248673
+ throw new ConfigInvalidError(`Invalid wrangler config: ${exports_external.prettifyError(result.error)}`, configPath);
248551
248674
  }
248552
- return { connectorResults };
248553
- }
248554
- // src/core/clients/base44-client.ts
248555
- var retriedRequests = new WeakSet;
248556
- async function captureRequestBody(request, options) {
248557
- if (request.body == null) {
248558
- return;
248675
+ const config9 = result.data;
248676
+ if (config9.no_bundle !== true) {
248677
+ throw new InvalidInputError("This framework's output requires bundling; not yet supported. Base44 full-stack deploys only support pre-bundled Workers output (no_bundle: true).");
248559
248678
  }
248560
- try {
248561
- const cloned = request.clone();
248562
- const text = await cloned.text();
248563
- options.context.__requestBody = text;
248564
- } catch {}
248679
+ const configDir = dirname10(configPath);
248680
+ const assetsDirectory = config9.assets?.directory ? resolve3(configDir, config9.assets.directory) : null;
248681
+ return {
248682
+ configPath,
248683
+ configDir,
248684
+ main: config9.main,
248685
+ assetsDirectory,
248686
+ assetsConfig: config9.assets ? toResolvedAssetsConfig(config9.assets) : null,
248687
+ compatibilityDate: config9.compatibility_date ?? null,
248688
+ compatibilityFlags: config9.compatibility_flags ?? [],
248689
+ vars: config9.vars ?? {},
248690
+ rules: (config9.rules ?? []).map((rule) => ({
248691
+ type: rule.type,
248692
+ globs: rule.globs
248693
+ })),
248694
+ uploadSourceMaps: config9.upload_source_maps ?? false
248695
+ };
248565
248696
  }
248566
- async function handleUnauthorized(request, _options, response) {
248567
- if (response.status !== 401) {
248568
- return;
248569
- }
248570
- if (hasWorkspaceApiKeyAuth()) {
248571
- return;
248572
- }
248573
- if (retriedRequests.has(request)) {
248574
- return;
248575
- }
248576
- const newAccessToken = await refreshAndSaveTokens();
248577
- if (!newAccessToken) {
248578
- return;
248697
+ async function resolveRedirectedConfigPath(redirectPath) {
248698
+ const parsed = await readJsonFile(redirectPath);
248699
+ const result = RedirectConfigSchema.safeParse(parsed);
248700
+ if (!result.success) {
248701
+ throw new ConfigInvalidError(`Invalid deploy redirect file: ${exports_external.prettifyError(result.error)}`, redirectPath);
248579
248702
  }
248580
- retriedRequests.add(request);
248581
- const requestId = request.headers.get("X-Request-ID");
248582
- return distribution_default(request.clone(), {
248583
- headers: {
248584
- ...requestId && { "X-Request-ID": requestId },
248585
- Authorization: `Bearer ${newAccessToken}`
248586
- }
248587
- });
248588
- }
248589
- var base44Client = distribution_default.create({
248590
- prefixUrl: getBase44ApiUrl(),
248591
- headers: {
248592
- "User-Agent": "Base44 CLI"
248593
- },
248594
- hooks: {
248595
- beforeRequest: [
248596
- (request) => {
248597
- request.headers.set("X-Request-ID", randomUUID2());
248598
- },
248599
- captureRequestBody,
248600
- async (request) => {
248601
- const workspaceApiKey = getWorkspaceApiKeyFromEnv();
248602
- if (workspaceApiKey && isWorkspaceApiKey(workspaceApiKey)) {
248603
- request.headers.set("api_key", workspaceApiKey);
248604
- return;
248605
- }
248606
- try {
248607
- const auth = await readAuth();
248608
- if (isTokenExpired(auth)) {
248609
- const newAccessToken = await refreshAndSaveTokens();
248610
- if (newAccessToken) {
248611
- request.headers.set("Authorization", `Bearer ${newAccessToken}`);
248612
- return;
248613
- }
248614
- }
248615
- request.headers.set("Authorization", `Bearer ${auth.accessToken}`);
248616
- } catch {}
248617
- }
248618
- ],
248619
- afterResponse: [handleUnauthorized]
248703
+ const configPath = resolve3(dirname10(redirectPath), result.data.configPath);
248704
+ if (!await pathExists(configPath)) {
248705
+ throw new ConfigInvalidError(`Wrangler config referenced by ${redirectPath} does not exist: ${configPath}`, redirectPath, {
248706
+ hints: [{ message: "Rebuild the project to regenerate the artifact" }]
248707
+ });
248620
248708
  }
248621
- });
248622
- function getAppClient() {
248623
- const { id } = getAppContext();
248624
- return base44Client.extend({
248625
- prefixUrl: new URL(`/api/apps/${id}/`, getBase44ApiUrl()).href
248626
- });
248709
+ return configPath;
248627
248710
  }
248628
- function getSandboxClient(appId) {
248629
- return base44Client.extend({
248630
- prefixUrl: new URL(`/api/apps/${appId}/sandbox-bridge/`, getBase44ApiUrl()).href
248631
- });
248711
+ function toResolvedAssetsConfig(assets) {
248712
+ return {
248713
+ htmlHandling: assets.html_handling,
248714
+ notFoundHandling: assets.not_found_handling,
248715
+ runWorkerFirst: assets.run_worker_first,
248716
+ headers: assets.headers,
248717
+ redirects: assets.redirects
248718
+ };
248632
248719
  }
248633
- // src/core/clients/oauth-client.ts
248634
- import { randomUUID as randomUUID3 } from "node:crypto";
248635
- var oauthClient = distribution_default.create({
248636
- prefixUrl: getBase44ApiUrl(),
248637
- headers: {
248638
- "User-Agent": "Base44 CLI"
248639
- },
248640
- hooks: {
248641
- beforeRequest: [
248642
- (request) => {
248643
- request.headers.set("X-Request-ID", randomUUID3());
248644
- }
248645
- ]
248646
- }
248647
- });
248648
- // src/core/auth/api.ts
248649
- async function generateDeviceCode() {
248650
- const response = await oauthClient.post("oauth/device/code", {
248651
- json: {
248652
- client_id: AUTH_CLIENT_ID,
248653
- scope: "apps:read apps:write sandbox:write"
248654
- },
248655
- throwHttpErrors: false
248656
- });
248657
- if (!response.ok) {
248658
- throw new ApiError(`Failed to generate device code: ${response.status} ${response.statusText}`, { statusCode: response.status });
248659
- }
248660
- const result = DeviceCodeResponseSchema.safeParse(await response.json());
248661
- if (!result.success) {
248662
- throw new SchemaValidationError("Invalid device code response from server", result.error);
248720
+
248721
+ // src/core/site/deploy-app.ts
248722
+ async function planAppDeploy(target) {
248723
+ if (await detectFullStackArtifact(target.root)) {
248724
+ return { kind: "full-stack" };
248663
248725
  }
248664
- return result.data;
248726
+ const outputDirectory = target.site?.outputDirectory;
248727
+ if (!outputDirectory) {
248728
+ return { kind: "none" };
248729
+ }
248730
+ const outputDir = resolve4(target.root, outputDirectory);
248731
+ return staticDeploymentsEnabled() ? { kind: "static-deployment", outputDir } : { kind: "static", outputDir };
248732
+ }
248733
+ // src/core/site/modules.ts
248734
+ import { stat as stat2 } from "node:fs/promises";
248735
+ import { relative as relative3, resolve as resolve5, sep } from "node:path";
248736
+ var MAX_TOTAL_MODULE_BYTES = 40 * 1024 * 1024;
248737
+ var MODULE_IGNORE = ["wrangler.json", ".dev.vars"];
248738
+ var RULE_TYPE_TO_MODULE_TYPE = {
248739
+ ESModule: "esm",
248740
+ CompiledWasm: "wasm",
248741
+ Text: "text",
248742
+ Data: "data"
248743
+ };
248744
+ function toPosix(path11) {
248745
+ return path11.split(sep).join("/");
248665
248746
  }
248666
- async function getTokenFromDeviceCode(deviceCode) {
248667
- const searchParams = new URLSearchParams;
248668
- searchParams.set("grant_type", "urn:ietf:params:oauth:grant-type:device_code");
248669
- searchParams.set("device_code", deviceCode);
248670
- searchParams.set("client_id", AUTH_CLIENT_ID);
248671
- const response = await oauthClient.post("oauth/token", {
248672
- body: searchParams.toString(),
248673
- headers: {
248674
- "Content-Type": "application/x-www-form-urlencoded"
248675
- },
248676
- throwHttpErrors: false
248677
- });
248678
- const json2 = await response.json();
248679
- if (!response.ok) {
248680
- const errorResult = OAuthErrorSchema.safeParse(json2);
248681
- if (!errorResult.success) {
248682
- throw new SchemaValidationError("Token request failed", errorResult.error);
248683
- }
248684
- const { error: error48, error_description } = errorResult.data;
248685
- if (error48 === "authorization_pending" || error48 === "slow_down") {
248686
- return null;
248687
- }
248688
- throw new ApiError(error_description ?? `OAuth error: ${error48}`, {
248689
- statusCode: response.status
248747
+ async function collectModules(config9) {
248748
+ const entryPath = resolve5(config9.configDir, config9.main);
248749
+ if (!await pathExists(entryPath)) {
248750
+ throw new InvalidInputError(`Worker entry module does not exist: ${entryPath} (from "main" in ${config9.configPath})`, {
248751
+ hints: [{ message: "Rebuild the project to regenerate the artifact" }]
248690
248752
  });
248691
248753
  }
248692
- const result = TokenResponseSchema.safeParse(json2);
248693
- if (!result.success) {
248694
- throw new SchemaValidationError("Invalid token response from server", result.error);
248695
- }
248696
- return result.data;
248697
- }
248698
- async function renewAccessToken(refreshToken) {
248699
- const searchParams = new URLSearchParams;
248700
- searchParams.set("grant_type", "refresh_token");
248701
- searchParams.set("refresh_token", refreshToken);
248702
- searchParams.set("client_id", AUTH_CLIENT_ID);
248703
- const response = await oauthClient.post("oauth/token", {
248704
- body: searchParams.toString(),
248705
- headers: {
248706
- "Content-Type": "application/x-www-form-urlencoded"
248707
- },
248708
- throwHttpErrors: false
248709
- });
248710
- const json2 = await response.json();
248711
- if (!response.ok) {
248712
- const errorResult = OAuthErrorSchema.safeParse(json2);
248713
- if (!errorResult.success) {
248714
- throw new ApiError(`Token refresh failed: ${response.statusText}`, {
248715
- statusCode: response.status
248716
- });
248717
- }
248718
- const { error: error48, error_description } = errorResult.data;
248719
- throw new ApiError(error_description ?? `OAuth error: ${error48}`, {
248720
- statusCode: response.status
248754
+ const modulesByName = new Map;
248755
+ const entryName = toPosix(relative3(config9.configDir, entryPath));
248756
+ modulesByName.set(entryName, {
248757
+ name: entryName,
248758
+ absolutePath: entryPath,
248759
+ size: 0,
248760
+ type: "esm"
248761
+ });
248762
+ const ignore = [...MODULE_IGNORE];
248763
+ if (config9.assetsDirectory?.startsWith(config9.configDir + sep)) {
248764
+ ignore.push(`${toPosix(relative3(config9.configDir, config9.assetsDirectory))}/**`);
248765
+ }
248766
+ for (const rule of config9.rules) {
248767
+ const type = RULE_TYPE_TO_MODULE_TYPE[rule.type];
248768
+ if (!type) {
248769
+ throw new InvalidInputError(`Unsupported module rule type "${rule.type}" in ${config9.configPath}. Supported: ${Object.keys(RULE_TYPE_TO_MODULE_TYPE).join(", ")}.`);
248770
+ }
248771
+ const matches = await globby(rule.globs, {
248772
+ cwd: config9.configDir,
248773
+ onlyFiles: true,
248774
+ dot: true,
248775
+ ignore
248721
248776
  });
248777
+ for (const match of matches.sort()) {
248778
+ if (!modulesByName.has(match)) {
248779
+ modulesByName.set(match, {
248780
+ name: match,
248781
+ absolutePath: resolve5(config9.configDir, match),
248782
+ size: 0,
248783
+ type
248784
+ });
248785
+ }
248786
+ }
248722
248787
  }
248723
- const result = TokenResponseSchema.safeParse(json2);
248724
- if (!result.success) {
248725
- throw new SchemaValidationError("Invalid token response from server", result.error);
248726
- }
248727
- return result.data;
248728
- }
248729
- async function getUserInfo(accessToken) {
248730
- const response = await oauthClient.get("oauth/userinfo", {
248731
- headers: { Authorization: `Bearer ${accessToken}` }
248732
- });
248733
- if (!response.ok) {
248734
- throw new ApiError(`Failed to fetch user info: ${response.status}`, {
248735
- statusCode: response.status
248788
+ if (config9.uploadSourceMaps) {
248789
+ const maps = await globby("**/*.map", {
248790
+ cwd: config9.configDir,
248791
+ onlyFiles: true,
248792
+ dot: true,
248793
+ ignore
248736
248794
  });
248795
+ for (const map2 of maps.sort()) {
248796
+ addSourcemap(modulesByName, config9.configDir, map2);
248797
+ }
248798
+ } else {
248799
+ for (const name2 of [...modulesByName.keys()]) {
248800
+ const mapName = `${name2}.map`;
248801
+ if (await pathExists(resolve5(config9.configDir, mapName))) {
248802
+ addSourcemap(modulesByName, config9.configDir, mapName);
248803
+ }
248804
+ }
248737
248805
  }
248738
- const result = UserInfoSchema.safeParse(await response.json());
248739
- if (!result.success) {
248740
- throw new SchemaValidationError("Invalid UserInfo response from server", result.error);
248806
+ const modules = [...modulesByName.values()];
248807
+ let totalBytes = 0;
248808
+ for (const module of modules) {
248809
+ module.size = (await stat2(module.absolutePath)).size;
248810
+ totalBytes += module.size;
248741
248811
  }
248742
- return result.data;
248812
+ if (totalBytes > MAX_TOTAL_MODULE_BYTES) {
248813
+ throw new InvalidInputError(`Worker modules total ${totalBytes} bytes, which exceeds the 40 MB limit for Base44 full-stack deploys.`);
248814
+ }
248815
+ return modules;
248743
248816
  }
248744
- // src/cli/commands/auth/login-flow.ts
248745
- async function generateAndDisplayDeviceCode(log, runTask) {
248746
- const deviceCodeResponse = await runTask("Generating device code...", async () => {
248747
- return await generateDeviceCode();
248748
- }, {
248749
- successMessage: "Device code generated",
248750
- errorMessage: "Failed to generate device code"
248817
+ function addSourcemap(modulesByName, configDir, name2) {
248818
+ if (modulesByName.has(name2))
248819
+ return;
248820
+ modulesByName.set(name2, {
248821
+ name: name2,
248822
+ absolutePath: resolve5(configDir, name2),
248823
+ size: 0,
248824
+ type: "sourcemap"
248751
248825
  });
248752
- log.info(`Verification code: ${theme.styles.bold(deviceCodeResponse.userCode)}` + `
248753
- Please confirm this code at: ${deviceCodeResponse.verificationUri}`);
248754
- return deviceCodeResponse;
248755
248826
  }
248756
- async function waitForAuthentication(deviceCode, expiresIn, interval, runTask) {
248757
- let tokenResponse;
248758
- try {
248759
- await runTask("Waiting for authentication...", async () => {
248760
- await pWaitFor(async () => {
248761
- const result = await getTokenFromDeviceCode(deviceCode);
248762
- if (result !== null) {
248763
- tokenResponse = result;
248764
- return true;
248765
- }
248766
- return false;
248767
- }, {
248768
- interval: interval * 1000,
248769
- timeout: expiresIn * 1000
248770
- });
248771
- }, {
248772
- successMessage: "Authentication completed!",
248773
- errorMessage: "Authentication failed"
248774
- });
248775
- } catch (error48) {
248776
- if (error48 instanceof Error && error48.message.includes("timed out")) {
248777
- throw new AuthExpiredError("Authentication timed out. Please try again.");
248778
- }
248779
- throw error48;
248827
+
248828
+ // src/core/site/full-stack.ts
248829
+ async function deployFullStack(options) {
248830
+ const { projectRoot, gitHash, concurrency, progress } = options;
248831
+ const config9 = await resolveWranglerConfig(projectRoot);
248832
+ if (!config9.compatibilityFlags.includes("nodejs_compat")) {
248833
+ progress?.onWarning?.("The wrangler config has no 'nodejs_compat' compatibility flag; Node.js built-ins will be unavailable at runtime. Enable it in your framework's Cloudflare adapter settings if your server code needs Node APIs.");
248780
248834
  }
248781
- if (tokenResponse === undefined) {
248782
- throw new InternalError("Failed to retrieve authentication token.");
248835
+ if (config9.vars && Object.keys(config9.vars).length > 0) {
248836
+ progress?.onWarning?.("wrangler 'vars' are not supported and were ignored — a worker's environment comes from the app's secrets (base44 secrets set).");
248783
248837
  }
248784
- return tokenResponse;
248785
- }
248786
- async function saveAuthData(response, userInfo) {
248787
- const expiresAt = Date.now() + response.expiresIn * 1000;
248788
- await writeAuth({
248789
- accessToken: response.accessToken,
248790
- refreshToken: response.refreshToken,
248791
- expiresAt,
248792
- email: userInfo.email,
248793
- name: userInfo.name
248838
+ const modules = await collectModules(config9);
248839
+ let assets = { manifest: {}, filesByHash: new Map };
248840
+ if (config9.assetsDirectory && await pathExists(config9.assetsDirectory)) {
248841
+ assets = await buildAssetManifest(config9.assetsDirectory, getAppContext().id);
248842
+ }
248843
+ const created = await createDeployment({
248844
+ git_hash: gitHash,
248845
+ config: {
248846
+ main: config9.main,
248847
+ compatibility_date: config9.compatibilityDate,
248848
+ compatibility_flags: config9.compatibilityFlags,
248849
+ assets: buildAssetsConfig(config9.assetsConfig, progress)
248850
+ },
248851
+ asset_manifest: assets.manifest
248794
248852
  });
248853
+ if (created.assetUploads && created.assetUploads.type !== "cf") {
248854
+ throw new ApiError(`The server answered a full-stack deploy with the "${created.assetUploads.type}" upload target.`);
248855
+ }
248856
+ const totalAssets = Object.keys(assets.manifest).length;
248857
+ const newAssets = created.assetUploads ? new Set(created.assetUploads.buckets.flat()).size : 0;
248858
+ progress?.onAssets?.({ totalAssets, newAssets });
248859
+ const completionJwt = created.assetUploads ? await uploadAssetBuckets(created.assetUploads, assets.filesByHash, {
248860
+ concurrency,
248861
+ onProgress: progress?.onAssetUpload
248862
+ }) : null;
248863
+ progress?.onWorker?.({ moduleCount: modules.length });
248864
+ const finalized = await finalizeDeployment(created.deploymentId, completionJwt, modules, created.sessionId);
248865
+ return { deploymentId: finalized.deploymentId, gitHash };
248795
248866
  }
248796
- async function login({
248797
- log,
248798
- runTask
248799
- }) {
248800
- const deviceCodeResponse = await generateAndDisplayDeviceCode(log, runTask);
248801
- const token = await waitForAuthentication(deviceCodeResponse.deviceCode, deviceCodeResponse.expiresIn, deviceCodeResponse.interval, runTask);
248802
- const userInfo = await getUserInfo(token.accessToken);
248803
- await saveAuthData(token, userInfo);
248804
- return {
248805
- outroMessage: `Successfully logged in as ${theme.styles.bold(userInfo.email)}`
248806
- };
248807
- }
248808
-
248809
- // src/cli/utils/command/middleware.ts
248810
- async function ensureAuth(ctx) {
248811
- if (hasWorkspaceApiKeyAuth()) {
248812
- ctx.errorReporter.setContext({
248813
- user: { email: "workspace-api-key", name: "Workspace API key" }
248814
- });
248815
- return;
248867
+ function buildAssetsConfig(assetsConfig, progress) {
248868
+ if (!assetsConfig)
248869
+ return null;
248870
+ if (assetsConfig.headers || assetsConfig.redirects) {
248871
+ progress?.onWarning?.("_headers/_redirects files are not supported yet and were ignored for this deploy.");
248816
248872
  }
248817
- await seedAuthFromEnv();
248818
- const loggedIn = await isLoggedIn();
248819
- if (!loggedIn) {
248820
- ctx.log.info("You need to login first to continue.");
248821
- await login(ctx);
248873
+ let runWorkerFirst;
248874
+ if (Array.isArray(assetsConfig.runWorkerFirst)) {
248875
+ progress?.onWarning?.("'run_worker_first' route patterns are not supported yet and were ignored for this deploy.");
248876
+ } else {
248877
+ runWorkerFirst = assetsConfig.runWorkerFirst;
248822
248878
  }
248823
- try {
248824
- const userInfo = await readAuth();
248825
- ctx.errorReporter.setContext({
248826
- user: { email: userInfo.email, name: userInfo.name }
248827
- });
248828
- } catch {}
248829
- }
248830
- async function ensureAppContext(ctx, options = {}) {
248831
- const appContext = await initAppContext(options);
248832
- ctx.app = appContext;
248833
- ctx.errorReporter.setContext({ appId: appContext.id });
248879
+ return {
248880
+ html_handling: assetsConfig.htmlHandling,
248881
+ not_found_handling: assetsConfig.notFoundHandling,
248882
+ run_worker_first: runWorkerFirst
248883
+ };
248834
248884
  }
248835
-
248836
248885
  // ../../node_modules/is-plain-obj/index.js
248837
248886
  function isPlainObject2(value) {
248838
248887
  if (typeof value !== "object" || value === null) {
@@ -248930,13 +248979,13 @@ var getJoinLength = (uint8Arrays) => {
248930
248979
  var isTemplateString = (templates) => Array.isArray(templates) && Array.isArray(templates.raw);
248931
248980
  var parseTemplates = (templates, expressions) => {
248932
248981
  let tokens = [];
248933
- for (const [index, template2] of templates.entries()) {
248982
+ for (const [index, template] of templates.entries()) {
248934
248983
  tokens = parseTemplate({
248935
248984
  templates,
248936
248985
  expressions,
248937
248986
  tokens,
248938
248987
  index,
248939
- template: template2
248988
+ template
248940
248989
  });
248941
248990
  }
248942
248991
  if (tokens.length === 0) {
@@ -248945,11 +248994,11 @@ var parseTemplates = (templates, expressions) => {
248945
248994
  const [file2, ...commandArguments] = tokens;
248946
248995
  return [file2, commandArguments, {}];
248947
248996
  };
248948
- var parseTemplate = ({ templates, expressions, tokens, index, template: template2 }) => {
248949
- if (template2 === undefined) {
248997
+ var parseTemplate = ({ templates, expressions, tokens, index, template }) => {
248998
+ if (template === undefined) {
248950
248999
  throw new TypeError(`Invalid backslash sequence: ${templates.raw[index]}`);
248951
249000
  }
248952
- const { nextTokens, leadingWhitespaces, trailingWhitespaces } = splitByWhitespaces(template2, templates.raw[index]);
249001
+ const { nextTokens, leadingWhitespaces, trailingWhitespaces } = splitByWhitespaces(template, templates.raw[index]);
248953
249002
  const newTokens = concatTokens(tokens, nextTokens, leadingWhitespaces);
248954
249003
  if (index === expressions.length) {
248955
249004
  return newTokens;
@@ -248958,18 +249007,18 @@ var parseTemplate = ({ templates, expressions, tokens, index, template: template
248958
249007
  const expressionTokens = Array.isArray(expression) ? expression.map((expression2) => parseExpression(expression2)) : [parseExpression(expression)];
248959
249008
  return concatTokens(newTokens, expressionTokens, trailingWhitespaces);
248960
249009
  };
248961
- var splitByWhitespaces = (template2, rawTemplate) => {
249010
+ var splitByWhitespaces = (template, rawTemplate) => {
248962
249011
  if (rawTemplate.length === 0) {
248963
249012
  return { nextTokens: [], leadingWhitespaces: false, trailingWhitespaces: false };
248964
249013
  }
248965
249014
  const nextTokens = [];
248966
249015
  let templateStart = 0;
248967
249016
  const leadingWhitespaces = DELIMITERS.has(rawTemplate[0]);
248968
- for (let templateIndex = 0, rawIndex = 0;templateIndex < template2.length; templateIndex += 1, rawIndex += 1) {
249017
+ for (let templateIndex = 0, rawIndex = 0;templateIndex < template.length; templateIndex += 1, rawIndex += 1) {
248969
249018
  const rawCharacter = rawTemplate[rawIndex];
248970
249019
  if (DELIMITERS.has(rawCharacter)) {
248971
249020
  if (templateStart !== templateIndex) {
248972
- nextTokens.push(template2.slice(templateStart, templateIndex));
249021
+ nextTokens.push(template.slice(templateStart, templateIndex));
248973
249022
  }
248974
249023
  templateStart = templateIndex + 1;
248975
249024
  } else if (rawCharacter === "\\") {
@@ -248985,9 +249034,9 @@ var splitByWhitespaces = (template2, rawTemplate) => {
248985
249034
  }
248986
249035
  }
248987
249036
  }
248988
- const trailingWhitespaces = templateStart === template2.length;
249037
+ const trailingWhitespaces = templateStart === template.length;
248989
249038
  if (!trailingWhitespaces) {
248990
- nextTokens.push(template2.slice(templateStart));
249039
+ nextTokens.push(template.slice(templateStart));
248991
249040
  }
248992
249041
  return { nextTokens, leadingWhitespaces, trailingWhitespaces };
248993
249042
  };
@@ -250381,8 +250430,8 @@ var disconnect = (anyProcess) => {
250381
250430
  // ../../node_modules/execa/lib/utils/deferred.js
250382
250431
  var createDeferred = () => {
250383
250432
  const methods = {};
250384
- const promise2 = new Promise((resolve4, reject) => {
250385
- Object.assign(methods, { resolve: resolve4, reject });
250433
+ const promise2 = new Promise((resolve6, reject) => {
250434
+ Object.assign(methods, { resolve: resolve6, reject });
250386
250435
  });
250387
250436
  return Object.assign(promise2, methods);
250388
250437
  };
@@ -254746,11 +254795,11 @@ var addConcurrentStream = (concurrentStreams, stream, waitName) => {
254746
254795
  const promises = weakMap.get(stream);
254747
254796
  const promise2 = createDeferred();
254748
254797
  promises.push(promise2);
254749
- const resolve4 = promise2.resolve.bind(promise2);
254750
- return { resolve: resolve4, promises };
254798
+ const resolve6 = promise2.resolve.bind(promise2);
254799
+ return { resolve: resolve6, promises };
254751
254800
  };
254752
- var waitForConcurrentStreams = async ({ resolve: resolve4, promises }, subprocess) => {
254753
- resolve4();
254801
+ var waitForConcurrentStreams = async ({ resolve: resolve6, promises }, subprocess) => {
254802
+ resolve6();
254754
254803
  const [isSubprocessExit] = await Promise.race([
254755
254804
  Promise.allSettled([true, subprocess]),
254756
254805
  Promise.all([false, ...promises])
@@ -255329,6 +255378,370 @@ var {
255329
255378
  getCancelSignal: getCancelSignal2
255330
255379
  } = getIpcExport();
255331
255380
 
255381
+ // src/core/utils/git.ts
255382
+ var GIT_HASH_PATTERN = /^[a-fA-F0-9]{7,64}$/;
255383
+ function isGitCommitHash(value) {
255384
+ return GIT_HASH_PATTERN.test(value);
255385
+ }
255386
+
255387
+ // src/core/site/git-hash.ts
255388
+ async function resolveGitHash(projectRoot, explicit) {
255389
+ const hash2 = explicit ?? await gitHead(projectRoot);
255390
+ if (!hash2 || !isGitCommitHash(hash2)) {
255391
+ throw new InvalidInputError(explicit ? `'${explicit}' is not a git commit hash.` : "Deployments are addressed by the commit that produced the build, and no git commit was found.", {
255392
+ hints: [
255393
+ {
255394
+ message: "Run the deploy from a git checkout, or pass the commit explicitly with --git-hash."
255395
+ }
255396
+ ]
255397
+ });
255398
+ }
255399
+ return hash2;
255400
+ }
255401
+ async function gitHead(projectRoot) {
255402
+ try {
255403
+ const { stdout } = await execa("git", ["rev-parse", "HEAD"], {
255404
+ cwd: projectRoot
255405
+ });
255406
+ return stdout.trim();
255407
+ } catch {
255408
+ return null;
255409
+ }
255410
+ }
255411
+ // src/core/project/deploy.ts
255412
+ function hasResourcesToDeploy(projectData) {
255413
+ const {
255414
+ project,
255415
+ entities,
255416
+ functions,
255417
+ agents,
255418
+ agentSkills,
255419
+ connectors,
255420
+ authConfig
255421
+ } = projectData;
255422
+ const hasSite = Boolean(project.site?.outputDirectory);
255423
+ const hasEntities = entities.length > 0;
255424
+ const hasFunctions = functions.length > 0;
255425
+ const hasAgents = agents.length > 0;
255426
+ const hasAgentSkills = agentSkills.length > 0;
255427
+ const hasConnectors = connectors.length > 0;
255428
+ const hasAuthConfig = authConfig.length > 0;
255429
+ const hasVisibility = Boolean(project.visibility);
255430
+ return hasEntities || hasFunctions || hasAgents || hasAgentSkills || hasConnectors || hasAuthConfig || hasVisibility || hasSite;
255431
+ }
255432
+ async function deployAll(projectData, options) {
255433
+ const {
255434
+ project,
255435
+ entities,
255436
+ functions,
255437
+ agents,
255438
+ agentSkills,
255439
+ connectors,
255440
+ authConfig
255441
+ } = projectData;
255442
+ await setAppVisibility(project.visibility);
255443
+ if (project.visibility) {
255444
+ options?.onVisibilitySet?.(project.visibility);
255445
+ }
255446
+ await entityResource.push(entities);
255447
+ await deployFunctionsSequentially(functions, {
255448
+ onStart: options?.onFunctionStart,
255449
+ onResult: options?.onFunctionResult
255450
+ });
255451
+ await agentSkillResource.push(agentSkills);
255452
+ await agentResource.push(agents);
255453
+ await authConfigResource.push(authConfig);
255454
+ const skipConnectorSync = connectors.length === 0 && hasWorkspaceApiKeyAuth();
255455
+ const connectorResults = skipConnectorSync ? [] : (await pushConnectors(connectors)).results;
255456
+ if (project.site?.outputDirectory) {
255457
+ const outputDir = resolve6(project.root, project.site.outputDirectory);
255458
+ const { appUrl } = await deploySite(outputDir);
255459
+ return { appUrl, connectorResults };
255460
+ }
255461
+ return { connectorResults };
255462
+ }
255463
+ // src/core/clients/base44-client.ts
255464
+ var retriedRequests = new WeakSet;
255465
+ async function captureRequestBody(request, options) {
255466
+ if (request.body == null) {
255467
+ return;
255468
+ }
255469
+ try {
255470
+ const cloned = request.clone();
255471
+ const text = await cloned.text();
255472
+ options.context.__requestBody = text;
255473
+ } catch {}
255474
+ }
255475
+ async function handleUnauthorized(request, _options, response) {
255476
+ if (response.status !== 401) {
255477
+ return;
255478
+ }
255479
+ if (hasWorkspaceApiKeyAuth()) {
255480
+ return;
255481
+ }
255482
+ if (retriedRequests.has(request)) {
255483
+ return;
255484
+ }
255485
+ const newAccessToken = await refreshAndSaveTokens();
255486
+ if (!newAccessToken) {
255487
+ return;
255488
+ }
255489
+ retriedRequests.add(request);
255490
+ const requestId = request.headers.get("X-Request-ID");
255491
+ return distribution_default(request.clone(), {
255492
+ headers: {
255493
+ ...requestId && { "X-Request-ID": requestId },
255494
+ Authorization: `Bearer ${newAccessToken}`
255495
+ }
255496
+ });
255497
+ }
255498
+ var base44Client = distribution_default.create({
255499
+ prefixUrl: getBase44ApiUrl(),
255500
+ headers: {
255501
+ "User-Agent": "Base44 CLI"
255502
+ },
255503
+ hooks: {
255504
+ beforeRequest: [
255505
+ (request) => {
255506
+ request.headers.set("X-Request-ID", randomUUID2());
255507
+ },
255508
+ captureRequestBody,
255509
+ async (request) => {
255510
+ const workspaceApiKey = getWorkspaceApiKeyFromEnv();
255511
+ if (workspaceApiKey && isWorkspaceApiKey(workspaceApiKey)) {
255512
+ request.headers.set("api_key", workspaceApiKey);
255513
+ return;
255514
+ }
255515
+ try {
255516
+ const auth = await readAuth();
255517
+ if (isTokenExpired(auth)) {
255518
+ const newAccessToken = await refreshAndSaveTokens();
255519
+ if (newAccessToken) {
255520
+ request.headers.set("Authorization", `Bearer ${newAccessToken}`);
255521
+ return;
255522
+ }
255523
+ }
255524
+ request.headers.set("Authorization", `Bearer ${auth.accessToken}`);
255525
+ } catch {}
255526
+ }
255527
+ ],
255528
+ afterResponse: [handleUnauthorized]
255529
+ }
255530
+ });
255531
+ function getAppClient() {
255532
+ const { id } = getAppContext();
255533
+ return base44Client.extend({
255534
+ prefixUrl: new URL(`/api/apps/${id}/`, getBase44ApiUrl()).href
255535
+ });
255536
+ }
255537
+ function getSandboxClient(appId) {
255538
+ return base44Client.extend({
255539
+ prefixUrl: new URL(`/api/apps/${appId}/sandbox-bridge/`, getBase44ApiUrl()).href
255540
+ });
255541
+ }
255542
+ // src/core/clients/oauth-client.ts
255543
+ import { randomUUID as randomUUID3 } from "node:crypto";
255544
+ var oauthClient = distribution_default.create({
255545
+ prefixUrl: getBase44ApiUrl(),
255546
+ headers: {
255547
+ "User-Agent": "Base44 CLI"
255548
+ },
255549
+ hooks: {
255550
+ beforeRequest: [
255551
+ (request) => {
255552
+ request.headers.set("X-Request-ID", randomUUID3());
255553
+ }
255554
+ ]
255555
+ }
255556
+ });
255557
+ // src/core/auth/api.ts
255558
+ async function generateDeviceCode() {
255559
+ const response = await oauthClient.post("oauth/device/code", {
255560
+ json: {
255561
+ client_id: AUTH_CLIENT_ID,
255562
+ scope: "apps:read apps:write sandbox:write"
255563
+ },
255564
+ throwHttpErrors: false
255565
+ });
255566
+ if (!response.ok) {
255567
+ throw new ApiError(`Failed to generate device code: ${response.status} ${response.statusText}`, { statusCode: response.status });
255568
+ }
255569
+ const result = DeviceCodeResponseSchema.safeParse(await response.json());
255570
+ if (!result.success) {
255571
+ throw new SchemaValidationError("Invalid device code response from server", result.error);
255572
+ }
255573
+ return result.data;
255574
+ }
255575
+ async function getTokenFromDeviceCode(deviceCode) {
255576
+ const searchParams = new URLSearchParams;
255577
+ searchParams.set("grant_type", "urn:ietf:params:oauth:grant-type:device_code");
255578
+ searchParams.set("device_code", deviceCode);
255579
+ searchParams.set("client_id", AUTH_CLIENT_ID);
255580
+ const response = await oauthClient.post("oauth/token", {
255581
+ body: searchParams.toString(),
255582
+ headers: {
255583
+ "Content-Type": "application/x-www-form-urlencoded"
255584
+ },
255585
+ throwHttpErrors: false
255586
+ });
255587
+ const json2 = await response.json();
255588
+ if (!response.ok) {
255589
+ const errorResult = OAuthErrorSchema.safeParse(json2);
255590
+ if (!errorResult.success) {
255591
+ throw new SchemaValidationError("Token request failed", errorResult.error);
255592
+ }
255593
+ const { error: error48, error_description } = errorResult.data;
255594
+ if (error48 === "authorization_pending" || error48 === "slow_down") {
255595
+ return null;
255596
+ }
255597
+ throw new ApiError(error_description ?? `OAuth error: ${error48}`, {
255598
+ statusCode: response.status
255599
+ });
255600
+ }
255601
+ const result = TokenResponseSchema.safeParse(json2);
255602
+ if (!result.success) {
255603
+ throw new SchemaValidationError("Invalid token response from server", result.error);
255604
+ }
255605
+ return result.data;
255606
+ }
255607
+ async function renewAccessToken(refreshToken) {
255608
+ const searchParams = new URLSearchParams;
255609
+ searchParams.set("grant_type", "refresh_token");
255610
+ searchParams.set("refresh_token", refreshToken);
255611
+ searchParams.set("client_id", AUTH_CLIENT_ID);
255612
+ const response = await oauthClient.post("oauth/token", {
255613
+ body: searchParams.toString(),
255614
+ headers: {
255615
+ "Content-Type": "application/x-www-form-urlencoded"
255616
+ },
255617
+ throwHttpErrors: false
255618
+ });
255619
+ const json2 = await response.json();
255620
+ if (!response.ok) {
255621
+ const errorResult = OAuthErrorSchema.safeParse(json2);
255622
+ if (!errorResult.success) {
255623
+ throw new ApiError(`Token refresh failed: ${response.statusText}`, {
255624
+ statusCode: response.status
255625
+ });
255626
+ }
255627
+ const { error: error48, error_description } = errorResult.data;
255628
+ throw new ApiError(error_description ?? `OAuth error: ${error48}`, {
255629
+ statusCode: response.status
255630
+ });
255631
+ }
255632
+ const result = TokenResponseSchema.safeParse(json2);
255633
+ if (!result.success) {
255634
+ throw new SchemaValidationError("Invalid token response from server", result.error);
255635
+ }
255636
+ return result.data;
255637
+ }
255638
+ async function getUserInfo(accessToken) {
255639
+ const response = await oauthClient.get("oauth/userinfo", {
255640
+ headers: { Authorization: `Bearer ${accessToken}` }
255641
+ });
255642
+ if (!response.ok) {
255643
+ throw new ApiError(`Failed to fetch user info: ${response.status}`, {
255644
+ statusCode: response.status
255645
+ });
255646
+ }
255647
+ const result = UserInfoSchema.safeParse(await response.json());
255648
+ if (!result.success) {
255649
+ throw new SchemaValidationError("Invalid UserInfo response from server", result.error);
255650
+ }
255651
+ return result.data;
255652
+ }
255653
+ // src/cli/commands/auth/login-flow.ts
255654
+ async function generateAndDisplayDeviceCode(log, runTask) {
255655
+ const deviceCodeResponse = await runTask("Generating device code...", async () => {
255656
+ return await generateDeviceCode();
255657
+ }, {
255658
+ successMessage: "Device code generated",
255659
+ errorMessage: "Failed to generate device code"
255660
+ });
255661
+ log.info(`Verification code: ${theme.styles.bold(deviceCodeResponse.userCode)}` + `
255662
+ Please confirm this code at: ${deviceCodeResponse.verificationUri}`);
255663
+ return deviceCodeResponse;
255664
+ }
255665
+ async function waitForAuthentication(deviceCode, expiresIn, interval, runTask) {
255666
+ let tokenResponse;
255667
+ try {
255668
+ await runTask("Waiting for authentication...", async () => {
255669
+ await pWaitFor(async () => {
255670
+ const result = await getTokenFromDeviceCode(deviceCode);
255671
+ if (result !== null) {
255672
+ tokenResponse = result;
255673
+ return true;
255674
+ }
255675
+ return false;
255676
+ }, {
255677
+ interval: interval * 1000,
255678
+ timeout: expiresIn * 1000
255679
+ });
255680
+ }, {
255681
+ successMessage: "Authentication completed!",
255682
+ errorMessage: "Authentication failed"
255683
+ });
255684
+ } catch (error48) {
255685
+ if (error48 instanceof Error && error48.message.includes("timed out")) {
255686
+ throw new AuthExpiredError("Authentication timed out. Please try again.");
255687
+ }
255688
+ throw error48;
255689
+ }
255690
+ if (tokenResponse === undefined) {
255691
+ throw new InternalError("Failed to retrieve authentication token.");
255692
+ }
255693
+ return tokenResponse;
255694
+ }
255695
+ async function saveAuthData(response, userInfo) {
255696
+ const expiresAt = Date.now() + response.expiresIn * 1000;
255697
+ await writeAuth({
255698
+ accessToken: response.accessToken,
255699
+ refreshToken: response.refreshToken,
255700
+ expiresAt,
255701
+ email: userInfo.email,
255702
+ name: userInfo.name
255703
+ });
255704
+ }
255705
+ async function login({
255706
+ log,
255707
+ runTask
255708
+ }) {
255709
+ const deviceCodeResponse = await generateAndDisplayDeviceCode(log, runTask);
255710
+ const token = await waitForAuthentication(deviceCodeResponse.deviceCode, deviceCodeResponse.expiresIn, deviceCodeResponse.interval, runTask);
255711
+ const userInfo = await getUserInfo(token.accessToken);
255712
+ await saveAuthData(token, userInfo);
255713
+ return {
255714
+ outroMessage: `Successfully logged in as ${theme.styles.bold(userInfo.email)}`
255715
+ };
255716
+ }
255717
+
255718
+ // src/cli/utils/command/middleware.ts
255719
+ async function ensureAuth(ctx) {
255720
+ if (hasWorkspaceApiKeyAuth()) {
255721
+ ctx.errorReporter.setContext({
255722
+ user: { email: "workspace-api-key", name: "Workspace API key" }
255723
+ });
255724
+ return;
255725
+ }
255726
+ await seedAuthFromEnv();
255727
+ const loggedIn = await isLoggedIn();
255728
+ if (!loggedIn) {
255729
+ ctx.log.info("You need to login first to continue.");
255730
+ await login(ctx);
255731
+ }
255732
+ try {
255733
+ const userInfo = await readAuth();
255734
+ ctx.errorReporter.setContext({
255735
+ user: { email: userInfo.email, name: userInfo.name }
255736
+ });
255737
+ } catch {}
255738
+ }
255739
+ async function ensureAppContext(ctx, options = {}) {
255740
+ const appContext = await initAppContext(options);
255741
+ ctx.app = appContext;
255742
+ ctx.errorReporter.setContext({ appId: appContext.id });
255743
+ }
255744
+
255332
255745
  // src/cli/utils/version-check.ts
255333
255746
  async function checkForUpgrade() {
255334
255747
  const testLatestVersion = getTestOverrides()?.latestVersion;
@@ -255741,11 +256154,6 @@ function verifyDenoInstalled(context) {
255741
256154
  });
255742
256155
  }
255743
256156
  }
255744
- // src/core/utils/git.ts
255745
- var GIT_HASH_PATTERN = /^[a-fA-F0-9]{7,64}$/;
255746
- function isGitCommitHash(value) {
255747
- return GIT_HASH_PATTERN.test(value);
255748
- }
255749
256157
  // src/core/workspace/schema.ts
255750
256158
  var WorkspaceSchema = exports_external.object({
255751
256159
  id: exports_external.string(),
@@ -255820,7 +256228,7 @@ async function pullAction({
255820
256228
  runTask: runTask2
255821
256229
  }) {
255822
256230
  const { project: project2 } = await readProjectConfig();
255823
- const dir = join17(dirname10(project2.configPath), project2.agentSkillsDir);
256231
+ const dir = join18(dirname11(project2.configPath), project2.agentSkillsDir);
255824
256232
  const remote = await runTask2("Fetching agent skills from Base44", () => fetchAgentSkills(), {
255825
256233
  successMessage: "Agent skills fetched successfully",
255826
256234
  errorMessage: "Failed to fetch agent skills"
@@ -255876,14 +256284,14 @@ function getAgentSkillsCommand() {
255876
256284
  }
255877
256285
 
255878
256286
  // src/cli/commands/agents/pull.ts
255879
- import { dirname as dirname11, join as join18 } from "node:path";
256287
+ import { dirname as dirname12, join as join19 } from "node:path";
255880
256288
  async function pullAgentsAction({
255881
256289
  log,
255882
256290
  runTask: runTask2
255883
256291
  }) {
255884
256292
  const { project: project2 } = await readProjectConfig();
255885
- const configDir = dirname11(project2.configPath);
255886
- const agentsDir = join18(configDir, project2.agentsDir);
256293
+ const configDir = dirname12(project2.configPath);
256294
+ const agentsDir = join19(configDir, project2.agentsDir);
255887
256295
  const remoteAgents = await runTask2("Fetching agents from Base44", async () => {
255888
256296
  return await fetchAgents();
255889
256297
  }, {
@@ -255953,12 +256361,12 @@ function getAgentsCommand() {
255953
256361
  }
255954
256362
 
255955
256363
  // src/cli/commands/auth/password-login.ts
255956
- import { dirname as dirname12, join as join19 } from "node:path";
256364
+ import { dirname as dirname13, join as join20 } from "node:path";
255957
256365
  async function passwordLoginAction({ log, runTask: runTask2 }, action) {
255958
256366
  const shouldEnable = action === "enable";
255959
256367
  const { project: project2 } = await readProjectConfig();
255960
- const configDir = dirname12(project2.configPath);
255961
- const authDir = join19(configDir, project2.authDir);
256368
+ const configDir = dirname13(project2.configPath);
256369
+ const authDir = join20(configDir, project2.authDir);
255962
256370
  const updated = await runTask2("Updating local auth config", async () => {
255963
256371
  const current = await readAuthConfig(authDir) ?? DEFAULT_AUTH_CONFIG;
255964
256372
  const merged = { ...current, enableUsernamePassword: shouldEnable };
@@ -255978,14 +256386,14 @@ function getPasswordLoginCommand() {
255978
256386
  }
255979
256387
 
255980
256388
  // src/cli/commands/auth/pull.ts
255981
- import { dirname as dirname13, join as join20 } from "node:path";
256389
+ import { dirname as dirname14, join as join21 } from "node:path";
255982
256390
  async function pullAuthAction({
255983
256391
  log,
255984
256392
  runTask: runTask2
255985
256393
  }) {
255986
256394
  const { project: project2 } = await readProjectConfig();
255987
- const configDir = dirname13(project2.configPath);
255988
- const authDir = join20(configDir, project2.authDir);
256395
+ const configDir = dirname14(project2.configPath);
256396
+ const authDir = join21(configDir, project2.authDir);
255989
256397
  const remoteConfig = await runTask2("Fetching auth config from Base44", async () => {
255990
256398
  return await pullAuthConfig();
255991
256399
  }, {
@@ -256049,7 +256457,7 @@ function getAuthPushCommand() {
256049
256457
  }
256050
256458
 
256051
256459
  // src/cli/commands/auth/social-login.ts
256052
- import { dirname as dirname14, join as join21, resolve as resolve4 } from "node:path";
256460
+ import { dirname as dirname15, join as join22, resolve as resolve7 } from "node:path";
256053
256461
  var PROVIDER_LABELS = {
256054
256462
  google: "Google",
256055
256463
  microsoft: "Microsoft",
@@ -256089,7 +256497,7 @@ async function socialLoginAction({ log, isNonInteractive, runTask: runTask2 }, p
256089
256497
  let clientSecret;
256090
256498
  if (useCustomOAuth && oauth && oauthCli && hasSecretOptions(options)) {
256091
256499
  if (options.envFile) {
256092
- const secrets = await parseEnvFile(resolve4(options.envFile));
256500
+ const secrets = await parseEnvFile(resolve7(options.envFile));
256093
256501
  const value = secrets[oauthCli.envVar];
256094
256502
  if (!value) {
256095
256503
  throw new InvalidInputError(`Key "${oauthCli.envVar}" not found in ${options.envFile}.`);
@@ -256119,8 +256527,8 @@ async function socialLoginAction({ log, isNonInteractive, runTask: runTask2 }, p
256119
256527
  }
256120
256528
  }
256121
256529
  const { project: project2 } = await readProjectConfig();
256122
- const configDir = dirname14(project2.configPath);
256123
- const authDir = join21(configDir, project2.authDir);
256530
+ const configDir = dirname15(project2.configPath);
256531
+ const authDir = join22(configDir, project2.authDir);
256124
256532
  const { config: updated } = await runTask2("Updating local auth config", async () => updateSocialLoginConfig(authDir, provider, shouldEnable, useCustomOAuth && options.clientId ? { clientId: options.clientId } : undefined));
256125
256533
  if (clientSecret) {
256126
256534
  await runTask2("Saving client secret", async () => pushCustomOAuthSecret(provider, clientSecret));
@@ -256145,7 +256553,7 @@ function getSocialLoginCommand() {
256145
256553
  }
256146
256554
 
256147
256555
  // src/cli/commands/auth/sso.ts
256148
- import { dirname as dirname15, join as join22, resolve as resolve5 } from "node:path";
256556
+ import { dirname as dirname16, join as join23, resolve as resolve8 } from "node:path";
256149
256557
  var SSOConfigFileSchema = exports_external.object({
256150
256558
  provider: exports_external.enum(Object.values(KNOWN_SSO_PROVIDERS)),
256151
256559
  clientId: exports_external.string(),
@@ -256161,7 +256569,7 @@ var SSOConfigFileSchema = exports_external.object({
256161
256569
  ssoName: exports_external.string().optional()
256162
256570
  });
256163
256571
  async function loadSSOConfigFile(filePath) {
256164
- const resolved = resolve5(filePath);
256572
+ const resolved = resolve8(filePath);
256165
256573
  const raw2 = await readJsonFile(resolved);
256166
256574
  const result = SSOConfigFileSchema.safeParse(raw2);
256167
256575
  if (!result.success) {
@@ -256249,7 +256657,7 @@ async function ssoEnableAction({ isNonInteractive, runTask: runTask2 }, options)
256249
256657
  }
256250
256658
  let clientSecret;
256251
256659
  if (merged.envFile && !merged.clientSecret) {
256252
- const secrets2 = await parseEnvFile(resolve5(merged.envFile));
256660
+ const secrets2 = await parseEnvFile(resolve8(merged.envFile));
256253
256661
  const value = secrets2.sso_client_secret;
256254
256662
  if (!value) {
256255
256663
  throw new InvalidInputError(`Key "sso_client_secret" not found in ${merged.envFile}.`);
@@ -256308,8 +256716,8 @@ async function ssoEnableAction({ isNonInteractive, runTask: runTask2 }, options)
256308
256716
  throw error48;
256309
256717
  }
256310
256718
  const { project: project2 } = await readProjectConfig();
256311
- const configDir = dirname15(project2.configPath);
256312
- const authDir = join22(configDir, project2.authDir);
256719
+ const configDir = dirname16(project2.configPath);
256720
+ const authDir = join23(configDir, project2.authDir);
256313
256721
  await runTask2("Updating local auth config", async () => updateSSOConfig(authDir, provider, true));
256314
256722
  await runTask2("Saving SSO credentials", async () => pushSSOSecrets(secrets));
256315
256723
  return {
@@ -256324,8 +256732,8 @@ async function ssoDisableAction({ log, runTask: runTask2 }, options) {
256324
256732
  throw new InvalidInputError("Configuration options cannot be used with disable. To disable SSO: base44 auth sso disable");
256325
256733
  }
256326
256734
  const { project: project2 } = await readProjectConfig();
256327
- const configDir = dirname15(project2.configPath);
256328
- const authDir = join22(configDir, project2.authDir);
256735
+ const configDir = dirname16(project2.configPath);
256736
+ const authDir = join23(configDir, project2.authDir);
256329
256737
  const updated = await runTask2("Updating local auth config", async () => updateSSOConfig(authDir, null, false));
256330
256738
  await runTask2("Removing SSO credentials", async () => deleteSSOSecrets());
256331
256739
  if (!hasAnyLoginMethod(updated)) {
@@ -256887,19 +257295,19 @@ var baseOpen = async (options) => {
256887
257295
  }
256888
257296
  const subprocess = childProcess3.spawn(command2, cliArguments, childProcessOptions);
256889
257297
  if (options.wait) {
256890
- return new Promise((resolve6, reject) => {
257298
+ return new Promise((resolve9, reject) => {
256891
257299
  subprocess.once("error", reject);
256892
257300
  subprocess.once("close", (exitCode) => {
256893
257301
  if (!options.allowNonzeroExitCode && exitCode !== 0) {
256894
257302
  reject(new Error(`Exited with code ${exitCode}`));
256895
257303
  return;
256896
257304
  }
256897
- resolve6(subprocess);
257305
+ resolve9(subprocess);
256898
257306
  });
256899
257307
  });
256900
257308
  }
256901
257309
  if (isFallbackAttempt) {
256902
- return new Promise((resolve6, reject) => {
257310
+ return new Promise((resolve9, reject) => {
256903
257311
  subprocess.once("error", reject);
256904
257312
  subprocess.once("spawn", () => {
256905
257313
  subprocess.once("close", (exitCode) => {
@@ -256909,17 +257317,17 @@ var baseOpen = async (options) => {
256909
257317
  return;
256910
257318
  }
256911
257319
  subprocess.unref();
256912
- resolve6(subprocess);
257320
+ resolve9(subprocess);
256913
257321
  });
256914
257322
  });
256915
257323
  });
256916
257324
  }
256917
257325
  subprocess.unref();
256918
- return new Promise((resolve6, reject) => {
257326
+ return new Promise((resolve9, reject) => {
256919
257327
  subprocess.once("error", reject);
256920
257328
  subprocess.once("spawn", () => {
256921
257329
  subprocess.off("error", reject);
256922
- resolve6(subprocess);
257330
+ resolve9(subprocess);
256923
257331
  });
256924
257332
  });
256925
257333
  };
@@ -257182,13 +257590,13 @@ function getConnectorsListAvailableCommand() {
257182
257590
  }
257183
257591
 
257184
257592
  // src/cli/commands/connectors/pull.ts
257185
- import { dirname as dirname16, join as join23, resolve as resolve6 } from "node:path";
257593
+ import { dirname as dirname17, join as join24, resolve as resolve9 } from "node:path";
257186
257594
  async function resolveConnectorsDir(options) {
257187
257595
  if (!getAppContext().projectRoot) {
257188
- return resolve6(options.dir ?? "connectors");
257596
+ return resolve9(options.dir ?? "connectors");
257189
257597
  }
257190
257598
  const { project: project2 } = await readProjectConfig();
257191
- return join23(dirname16(project2.configPath), project2.connectorsDir);
257599
+ return join24(dirname17(project2.configPath), project2.connectorsDir);
257192
257600
  }
257193
257601
  async function pullConnectorsAction({ log, runTask: runTask2, jsonMode }, options) {
257194
257602
  const connectorsDir = await resolveConnectorsDir(options);
@@ -257229,10 +257637,10 @@ function getConnectorsPullCommand() {
257229
257637
  }
257230
257638
 
257231
257639
  // src/cli/commands/connectors/push.ts
257232
- import { resolve as resolve7 } from "node:path";
257640
+ import { resolve as resolve10 } from "node:path";
257233
257641
  async function readConnectorsToPush(options) {
257234
257642
  if (!getAppContext().projectRoot) {
257235
- return readAllConnectors(resolve7(options.dir ?? "connectors"));
257643
+ return readAllConnectors(resolve10(options.dir ?? "connectors"));
257236
257644
  }
257237
257645
  const { connectors } = await readProjectConfig();
257238
257646
  return connectors;
@@ -257596,11 +258004,11 @@ function getListCommand() {
257596
258004
  }
257597
258005
 
257598
258006
  // src/cli/commands/functions/pull.ts
257599
- import { dirname as dirname17, join as join24 } from "node:path";
258007
+ import { dirname as dirname18, join as join25 } from "node:path";
257600
258008
  async function pullFunctionsAction({ log, runTask: runTask2 }, name2) {
257601
258009
  const { project: project2, functions } = await readProjectConfig();
257602
- const configDir = dirname17(project2.configPath);
257603
- const functionsDir = join24(configDir, project2.functionsDir);
258010
+ const configDir = dirname18(project2.configPath);
258011
+ const functionsDir = join25(configDir, project2.functionsDir);
257604
258012
  const pluginFunctionNames = new Set(functions.filter((fn) => fn.source.type === "plugin").map((fn) => fn.name));
257605
258013
  const remoteFunctions = await runTask2("Fetching functions from Base44", async () => {
257606
258014
  const { functions: functions2 } = await listDeployedFunctions();
@@ -257733,11 +258141,11 @@ function getBuildCommand() {
257733
258141
  }
257734
258142
 
257735
258143
  // src/cli/commands/project/create.ts
257736
- import { basename as basename5, resolve as resolve8 } from "node:path";
258144
+ import { basename as basename5, resolve as resolve11 } from "node:path";
257737
258145
  var import_kebabCase = __toESM(require_kebabCase(), 1);
257738
258146
 
257739
258147
  // src/cli/commands/project/scaffold-shared.ts
257740
- import { join as join25 } from "node:path";
258148
+ import { join as join26 } from "node:path";
257741
258149
  var DEFAULT_TEMPLATE_ID = "backend-only";
257742
258150
  async function getTemplateById(templateId) {
257743
258151
  const templates = await listTemplates();
@@ -257800,7 +258208,7 @@ async function completeProjectSetup({
257800
258208
  env: { VITE_BASE44_APP_ID: projectId }
257801
258209
  })`${buildCommand}`;
257802
258210
  updateMessage("Deploying site...");
257803
- return await deploySite(join25(resolvedPath, outputDirectory));
258211
+ return await deploySite(join26(resolvedPath, outputDirectory));
257804
258212
  }, {
257805
258213
  successMessage: theme.colors.base44Orange("Site deployed successfully"),
257806
258214
  errorMessage: "Failed to deploy site"
@@ -257929,7 +258337,7 @@ async function createInteractive(options, ctx) {
257929
258337
  }, ctx);
257930
258338
  }
257931
258339
  async function createNonInteractive(options, ctx) {
257932
- ctx.log.info(`Creating a new project at ${resolve8(options.path)}`);
258340
+ ctx.log.info(`Creating a new project at ${resolve11(options.path)}`);
257933
258341
  const template2 = await getTemplateById(options.template ?? DEFAULT_TEMPLATE_ID);
257934
258342
  return await executeCreate({
257935
258343
  template: template2,
@@ -257953,7 +258361,7 @@ async function executeCreate({
257953
258361
  }, ctx) {
257954
258362
  const { log, runTask: runTask2 } = ctx;
257955
258363
  const name2 = rawName.trim();
257956
- const resolvedPath = resolve8(projectPath);
258364
+ const resolvedPath = resolve11(projectPath);
257957
258365
  const organizationId = await resolveWorkspaceId(ctx, flagWorkspaceId, isInteractive);
257958
258366
  const { projectId } = await runTask2("Setting up your project...", async () => {
257959
258367
  return await createProjectFiles({
@@ -258350,7 +258758,7 @@ async function followLogs(functionNames, options, availableFunctionNames, jsonMo
258350
258758
  for (const entry of fresh)
258351
258759
  writeFollowLine(entry, jsonMode);
258352
258760
  first = false;
258353
- await new Promise((resolve9) => setTimeout(resolve9, 2000));
258761
+ await new Promise((resolve12) => setTimeout(resolve12, 2000));
258354
258762
  }
258355
258763
  }
258356
258764
  function formatLogs(entries, env3) {
@@ -258472,7 +258880,7 @@ function getLogsCommand() {
258472
258880
  }
258473
258881
 
258474
258882
  // src/cli/commands/project/scaffold.ts
258475
- import { basename as basename6, resolve as resolve9 } from "node:path";
258883
+ import { basename as basename6, resolve as resolve12 } from "node:path";
258476
258884
  function resolveAppId(options) {
258477
258885
  const appId = options.appId;
258478
258886
  if (!appId) {
@@ -258488,7 +258896,7 @@ function resolveAppId(options) {
258488
258896
  async function scaffoldAction(ctx, name2, options, command2) {
258489
258897
  const { log, runTask: runTask2 } = ctx;
258490
258898
  const appId = resolveAppId(command2.optsWithGlobals());
258491
- const resolvedPath = resolve9("./");
258899
+ const resolvedPath = resolve12("./");
258492
258900
  const projectName = (name2 ?? basename6(resolvedPath)).trim();
258493
258901
  const template2 = await getTemplateById("backend-only");
258494
258902
  log.info(`Scaffolding project at ${resolvedPath}`);
@@ -258885,7 +259293,7 @@ function getSecretsListCommand() {
258885
259293
  }
258886
259294
 
258887
259295
  // src/cli/commands/secrets/set.ts
258888
- import { resolve as resolve10 } from "node:path";
259296
+ import { resolve as resolve13 } from "node:path";
258889
259297
  function parseEntries(entries) {
258890
259298
  const secrets = {};
258891
259299
  for (const entry of entries) {
@@ -258916,7 +259324,7 @@ async function setSecretsAction({ log, runTask: runTask2 }, entries, options) {
258916
259324
  validateInput(entries, options);
258917
259325
  let secrets;
258918
259326
  if (options.envFile) {
258919
- secrets = await parseEnvFile(resolve10(options.envFile));
259327
+ secrets = await parseEnvFile(resolve13(options.envFile));
258920
259328
  if (Object.keys(secrets).length === 0) {
258921
259329
  throw new InvalidInputError("The env file contains no valid KEY=VALUE entries.");
258922
259330
  }
@@ -258945,81 +259353,123 @@ function getSecretsCommand() {
258945
259353
  }
258946
259354
 
258947
259355
  // src/cli/commands/site/deploy.ts
258948
- import { resolve as resolve11 } from "node:path";
258949
259356
  async function deployAction2(ctx, options) {
258950
259357
  const { isNonInteractive } = ctx;
258951
259358
  if (isNonInteractive && !options.yes) {
258952
259359
  throw new InvalidInputError("--yes is required in non-interactive mode");
258953
259360
  }
258954
259361
  const project2 = await readProjectSettings();
258955
- const outputDirectory = project2.site?.outputDirectory;
258956
- if (!outputDirectory) {
259362
+ const planned = await planAppDeploy(project2);
259363
+ if (planned.kind === "none") {
258957
259364
  throw new ConfigNotFoundError("No site configuration found.", {
258958
259365
  hints: [
258959
259366
  {
258960
259367
  message: `Add 'site.outputDirectory' to your config.jsonc (e.g., "site": { "outputDirectory": "dist" })`
259368
+ },
259369
+ {
259370
+ message: "Full-stack apps ship from their build artifact — run your framework's build first"
258961
259371
  }
258962
259372
  ]
258963
259373
  });
258964
259374
  }
258965
259375
  if (!options.yes) {
258966
259376
  const shouldDeploy = await Re({
258967
- message: `Deploy site from ${outputDirectory}?`
259377
+ message: planned.kind === "full-stack" ? "Deploy full-stack app?" : `Deploy site from ${project2.site?.outputDirectory}?`
258968
259378
  });
258969
259379
  if (Ct(shouldDeploy) || !shouldDeploy) {
258970
259380
  return { outroMessage: "Deployment cancelled" };
258971
259381
  }
258972
259382
  }
258973
259383
  await maybeBuildBeforeDeploy(ctx, project2, options.build);
258974
- const outputDir = resolve11(project2.root, outputDirectory);
258975
- const { gitHash, concurrency } = options;
258976
- return gitHash ? await deployToDeploymentsApi(ctx, outputDir, gitHash, concurrency) : await deployTarball(ctx, outputDir);
258977
- }
258978
- async function deployToDeploymentsApi({ runTask: runTask2, log, jsonMode }, outputDir, gitHash, concurrency) {
258979
- const progressLines = [];
258980
- const { deploymentId } = await runTask2("Deploying site...", async (updateMessage) => await deployStaticSite({
259384
+ const plan = await planAppDeploy(project2);
259385
+ switch (plan.kind) {
259386
+ case "full-stack":
259387
+ return await deployFullStackApp(ctx, project2.root, options);
259388
+ case "static-deployment":
259389
+ return await deployToDeploymentsApi(ctx, project2.root, plan.outputDir, options);
259390
+ case "static":
259391
+ return await deployTarball(ctx, plan.outputDir);
259392
+ case "none":
259393
+ return { outroMessage: "Nothing to deploy" };
259394
+ }
259395
+ }
259396
+ async function deployFullStackApp(ctx, projectRoot, options) {
259397
+ const gitHash = await resolveGitHash(projectRoot, options.gitHash);
259398
+ const { deploymentId } = await runDeployTask(ctx, {
259399
+ start: "Deploying full-stack app...",
259400
+ success: theme.colors.base44Orange("Full-stack app deployed"),
259401
+ error: "Full-stack deploy failed"
259402
+ }, async (progress) => await deployFullStack({
259403
+ projectRoot,
259404
+ gitHash,
259405
+ concurrency: options.concurrency,
259406
+ progress
259407
+ }));
259408
+ return deploymentResult(ctx, deploymentId, gitHash);
259409
+ }
259410
+ async function deployToDeploymentsApi(ctx, projectRoot, outputDir, options) {
259411
+ const gitHash = await resolveGitHash(projectRoot, options.gitHash);
259412
+ const { deploymentId } = await runDeployTask(ctx, {
259413
+ start: "Deploying site...",
259414
+ success: "Site deployed",
259415
+ error: "Site deploy failed"
259416
+ }, async (progress) => await deployStaticSite({
258981
259417
  outputDir,
258982
259418
  gitHash,
258983
- concurrency,
258984
- progress: {
258985
- onAssets: ({ totalAssets, newAssets }) => {
258986
- const line = `Found ${totalAssets} static assets (${newAssets} new)`;
258987
- progressLines.push(line);
258988
- updateMessage(line);
258989
- },
258990
- onAssetUpload: ({ uploadedFiles, totalFiles }) => {
258991
- updateMessage(`Uploaded ${uploadedFiles} of ${totalFiles} assets`);
258992
- }
259419
+ concurrency: options.concurrency,
259420
+ progress
259421
+ }));
259422
+ return deploymentResult(ctx, deploymentId, gitHash);
259423
+ }
259424
+ async function deployTarball({ runTask: runTask2 }, outputDir) {
259425
+ const { appUrl } = await runTask2("Creating archive and deploying site...", async () => await deploySite(outputDir), {
259426
+ successMessage: "Site deployed successfully",
259427
+ errorMessage: "Deployment failed"
259428
+ });
259429
+ return { outroMessage: `Visit your site at: ${appUrl}` };
259430
+ }
259431
+ async function runDeployTask({ runTask: runTask2, log }, labels, deploy5) {
259432
+ const progressLines = [];
259433
+ const warnings = [];
259434
+ const result = await runTask2(labels.start, async (updateMessage) => await deploy5({
259435
+ onWarning: (message) => {
259436
+ warnings.push(message);
259437
+ },
259438
+ onAssets: ({ totalAssets, newAssets }) => {
259439
+ const line = `Found ${totalAssets} static assets (${newAssets} new)`;
259440
+ progressLines.push(line);
259441
+ updateMessage(line);
259442
+ },
259443
+ onAssetUpload: ({ uploadedFiles, totalFiles }) => {
259444
+ updateMessage(`Uploaded ${uploadedFiles} of ${totalFiles} assets`);
259445
+ },
259446
+ onWorker: ({ moduleCount }) => {
259447
+ updateMessage(`Deploying worker (${moduleCount} modules)…`);
258993
259448
  }
258994
- }), { successMessage: "Site deployed", errorMessage: "Site deploy failed" });
259449
+ }), { successMessage: labels.success, errorMessage: labels.error });
258995
259450
  for (const line of progressLines) {
258996
259451
  log.message(theme.styles.dim(line));
258997
259452
  }
259453
+ for (const warning of warnings) {
259454
+ log.warn(warning);
259455
+ }
259456
+ return result;
259457
+ }
259458
+ function deploymentResult({ jsonMode }, deploymentId, gitHash) {
258998
259459
  return {
258999
259460
  outroMessage: `Deployment ${deploymentId} (commit ${gitHash.slice(0, 12)})`,
259000
259461
  stdout: jsonMode ? `${JSON.stringify({ deploymentId, gitHash }, null, 2)}
259001
259462
  ` : undefined
259002
259463
  };
259003
259464
  }
259004
- async function deployTarball({ runTask: runTask2 }, outputDir) {
259005
- const { appUrl } = await runTask2("Creating archive and deploying site...", async () => await deploySite(outputDir), {
259006
- successMessage: "Site deployed successfully",
259007
- errorMessage: "Deployment failed"
259008
- });
259009
- return { outroMessage: `Visit your site at: ${appUrl}` };
259010
- }
259011
259465
  function getSiteDeployCommand() {
259012
- const command2 = new Base44Command("deploy").description("Deploy built site files to Base44 hosting").option("-y, --yes", "Skip confirmation prompt").option("--build", "Build the site before deploying (skips the prompt)").option("--no-build", "Deploy without building (skips the prompt)");
259013
- if (staticDeploymentsEnabled()) {
259014
- command2.addOption(new Option("--git-hash <hash>", "Commit the build came from — deploys through the deployments API").argParser((value) => {
259015
- if (!isGitCommitHash(value)) {
259016
- throw new InvalidArgumentError("Expected a git commit hash (7-64 hex chars).");
259017
- }
259018
- return value;
259019
- }));
259020
- command2.addOption(new Option("--concurrency <n>", "Parallel asset uploads").default(DEFAULT_UPLOAD_CONCURRENCY).argParser(parseConcurrency));
259466
+ return new Base44Command("deploy").description("Deploy the built site to Base44 hosting (full-stack apps deploy their Workers build)").option("-y, --yes", "Skip confirmation prompt").option("--build", "Build the site before deploying (skips the prompt)").option("--no-build", "Deploy without building (skips the prompt)").addOption(new Option("--git-hash <hash>", "Commit the build came from (defaults to the checkout's HEAD)").argParser(parseGitHash)).addOption(new Option("--concurrency <n>", "Parallel asset uploads").default(DEFAULT_UPLOAD_CONCURRENCY).argParser(parseConcurrency)).action(deployAction2);
259467
+ }
259468
+ function parseGitHash(value) {
259469
+ if (!isGitCommitHash(value)) {
259470
+ throw new InvalidArgumentError("Expected a git commit hash (7-64 hex chars).");
259021
259471
  }
259022
- return command2.action(deployAction2);
259472
+ return value;
259023
259473
  }
259024
259474
  function parseConcurrency(value) {
259025
259475
  const parsed = Number(value);
@@ -259028,10 +259478,6 @@ function parseConcurrency(value) {
259028
259478
  }
259029
259479
  return parsed;
259030
259480
  }
259031
- function staticDeploymentsEnabled(env3 = process.env) {
259032
- const value = env3.BASE44_STATIC_DEPLOYMENTS;
259033
- return value === "1" || value === "true";
259034
- }
259035
259481
 
259036
259482
  // src/cli/commands/site/open.ts
259037
259483
  async function openAction({
@@ -259137,10 +259583,10 @@ function toPascalCase(name2) {
259137
259583
  return name2.split(/[-_\s]+/).map((w8) => w8.charAt(0).toUpperCase() + w8.slice(1)).join("");
259138
259584
  }
259139
259585
  // src/core/types/update-project.ts
259140
- import { join as join28 } from "node:path";
259586
+ import { join as join29 } from "node:path";
259141
259587
  var TYPES_INCLUDE_PATH = `${PROJECT_SUBDIR}/${TYPES_OUTPUT_SUBDIR}/*.d.ts`;
259142
259588
  async function updateProjectConfig(projectRoot) {
259143
- const tsconfigPath = join28(projectRoot, "tsconfig.json");
259589
+ const tsconfigPath = join29(projectRoot, "tsconfig.json");
259144
259590
  if (!await pathExists(tsconfigPath)) {
259145
259591
  return false;
259146
259592
  }
@@ -259604,7 +260050,7 @@ function createDevLogger(label2, labelColor = theme.styles.dim) {
259604
260050
  // src/cli/dev/dev-server/main.ts
259605
260051
  var import_cors = __toESM(require_lib4(), 1);
259606
260052
  var import_express6 = __toESM(require_express(), 1);
259607
- import { dirname as dirname23, join as join35 } from "node:path";
260053
+ import { dirname as dirname24, join as join36 } from "node:path";
259608
260054
 
259609
260055
  // ../../node_modules/get-port/index.js
259610
260056
  import net from "node:net";
@@ -259631,14 +260077,14 @@ var getLocalHosts = () => {
259631
260077
  }
259632
260078
  return results;
259633
260079
  };
259634
- var checkAvailablePort = (options8) => new Promise((resolve13, reject) => {
260080
+ var checkAvailablePort = (options8) => new Promise((resolve15, reject) => {
259635
260081
  const server = net.createServer();
259636
260082
  server.unref();
259637
260083
  server.on("error", reject);
259638
260084
  server.listen(options8, () => {
259639
260085
  const { port } = server.address();
259640
260086
  server.close(() => {
259641
- resolve13(port);
260087
+ resolve15(port);
259642
260088
  });
259643
260089
  });
259644
260090
  });
@@ -259739,7 +260185,7 @@ var $setGracefulCleanup = tmp.setGracefulCleanup;
259739
260185
 
259740
260186
  // src/cli/dev/dev-server/function-manager.ts
259741
260187
  import { spawn as spawn2 } from "node:child_process";
259742
- import { dirname as dirname20, join as join29 } from "node:path";
260188
+ import { dirname as dirname21, join as join30 } from "node:path";
259743
260189
  import { pathToFileURL } from "node:url";
259744
260190
 
259745
260191
  // src/cli/dev/dev-server/base-function-manager.ts
@@ -259844,7 +260290,7 @@ class FunctionManager extends BaseFunctionManager {
259844
260290
  }
259845
260291
  spawnFunction(func, port) {
259846
260292
  this.logger.log(`Spawning function "${func.name}" on port ${port}`);
259847
- const importMapPath = join29(dirname20(this.wrapperPath), "import-map.json");
260293
+ const importMapPath = join30(dirname21(this.wrapperPath), "import-map.json");
259848
260294
  const process23 = spawn2("deno", ["run", "--allow-all", "--import-map", importMapPath, this.wrapperPath], {
259849
260295
  env: {
259850
260296
  ...globalThis.process.env,
@@ -259883,7 +260329,7 @@ class FunctionManager extends BaseFunctionManager {
259883
260329
  });
259884
260330
  }
259885
260331
  waitForReady(name2, runningFunc) {
259886
- return new Promise((resolve13, reject) => {
260332
+ return new Promise((resolve15, reject) => {
259887
260333
  runningFunc.process.on("exit", (code2) => {
259888
260334
  if (!runningFunc.ready) {
259889
260335
  clearTimeout(timeout3);
@@ -259906,7 +260352,7 @@ class FunctionManager extends BaseFunctionManager {
259906
260352
  runningFunc.ready = true;
259907
260353
  clearTimeout(timeout3);
259908
260354
  runningFunc.process.stdout?.off("data", onData);
259909
- resolve13(runningFunc.port);
260355
+ resolve15(runningFunc.port);
259910
260356
  }
259911
260357
  };
259912
260358
  runningFunc.process.stdout?.on("data", onData);
@@ -259918,7 +260364,7 @@ class FunctionManager extends BaseFunctionManager {
259918
260364
  import { mkdirSync as mkdirSync2, writeFileSync as writeFileSync2 } from "node:fs";
259919
260365
  import { isBuiltin } from "node:module";
259920
260366
  import { homedir as homedir3 } from "node:os";
259921
- import { join as join30 } from "node:path";
260367
+ import { join as join31 } from "node:path";
259922
260368
  import { pathToFileURL as pathToFileURL6 } from "node:url";
259923
260369
  var depsPromise;
259924
260370
  function loadDeps() {
@@ -260039,9 +260485,9 @@ export default {
260039
260485
  };
260040
260486
  `;
260041
260487
  function ensureBundlerConfig() {
260042
- const dir = join30(homedir3(), ".base44", "function-bundler");
260488
+ const dir = join31(homedir3(), ".base44", "function-bundler");
260043
260489
  mkdirSync2(dir, { recursive: true });
260044
- const configPath = join30(dir, "deno.json");
260490
+ const configPath = join31(dir, "deno.json");
260045
260491
  writeFileSync2(configPath, `${JSON.stringify({ nodeModulesDir: "auto" }, null, 2)}
260046
260492
  `);
260047
260493
  return configPath;
@@ -261511,16 +261957,16 @@ function createCustomIntegrationRoutes(remoteProxy, logger2) {
261511
261957
 
261512
261958
  // src/cli/dev/dev-server/watcher.ts
261513
261959
  import { EventEmitter as EventEmitter4 } from "node:events";
261514
- import { relative as relative6 } from "node:path";
261960
+ import { relative as relative7 } from "node:path";
261515
261961
 
261516
261962
  // ../../node_modules/chokidar/index.js
261517
261963
  import { EventEmitter as EventEmitter3 } from "node:events";
261518
261964
  import { stat as statcb, Stats } from "node:fs";
261519
- import { readdir as readdir3, stat as stat5 } from "node:fs/promises";
261965
+ import { readdir as readdir3, stat as stat6 } from "node:fs/promises";
261520
261966
  import * as sp3 from "node:path";
261521
261967
 
261522
261968
  // ../../node_modules/readdirp/index.js
261523
- import { lstat as lstat2, readdir as readdir2, realpath, stat as stat3 } from "node:fs/promises";
261969
+ import { lstat as lstat2, readdir as readdir2, realpath, stat as stat4 } from "node:fs/promises";
261524
261970
  import { join as pjoin, relative as prelative, resolve as presolve, sep as psep } from "node:path";
261525
261971
  import { Readable as Readable6 } from "node:stream";
261526
261972
  var EntryTypes = {
@@ -261602,7 +262048,7 @@ class ReaddirpStream extends Readable6 {
261602
262048
  const { root: root2, type } = opts;
261603
262049
  this._fileFilter = normalizeFilter(opts.fileFilter);
261604
262050
  this._directoryFilter = normalizeFilter(opts.directoryFilter);
261605
- const statMethod = opts.lstat ? lstat2 : stat3;
262051
+ const statMethod = opts.lstat ? lstat2 : stat4;
261606
262052
  if (wantBigintFsStats) {
261607
262053
  this._stat = (path19) => statMethod(path19, { bigint: true });
261608
262054
  } else {
@@ -261755,7 +262201,7 @@ function readdirp(root2, options8 = {}) {
261755
262201
 
261756
262202
  // ../../node_modules/chokidar/handler.js
261757
262203
  import { watch as fs_watch, unwatchFile, watchFile } from "node:fs";
261758
- import { realpath as fsrealpath, lstat as lstat3, open as open2, stat as stat4 } from "node:fs/promises";
262204
+ import { realpath as fsrealpath, lstat as lstat3, open as open2, stat as stat5 } from "node:fs/promises";
261759
262205
  import { type as osType } from "node:os";
261760
262206
  import * as sp2 from "node:path";
261761
262207
  var STR_DATA = "data";
@@ -261781,7 +262227,7 @@ var EVENTS = {
261781
262227
  };
261782
262228
  var EV = EVENTS;
261783
262229
  var THROTTLE_MODE_WATCH = "watch";
261784
- var statMethods = { lstat: lstat3, stat: stat4 };
262230
+ var statMethods = { lstat: lstat3, stat: stat5 };
261785
262231
  var KEY_LISTENERS = "listeners";
261786
262232
  var KEY_ERR = "errHandlers";
261787
262233
  var KEY_RAW = "rawEmitters";
@@ -262241,9 +262687,9 @@ class NodeFsHandler {
262241
262687
  if (this.fsw.closed) {
262242
262688
  return;
262243
262689
  }
262244
- const dirname22 = sp2.dirname(file2);
262690
+ const dirname23 = sp2.dirname(file2);
262245
262691
  const basename8 = sp2.basename(file2);
262246
- const parent = this.fsw._getWatchedDir(dirname22);
262692
+ const parent = this.fsw._getWatchedDir(dirname23);
262247
262693
  let prevStats = stats;
262248
262694
  if (parent.has(basename8))
262249
262695
  return;
@@ -262252,7 +262698,7 @@ class NodeFsHandler {
262252
262698
  return;
262253
262699
  if (!newStats || newStats.mtimeMs === 0) {
262254
262700
  try {
262255
- const newStats2 = await stat4(file2);
262701
+ const newStats2 = await stat5(file2);
262256
262702
  if (this.fsw.closed)
262257
262703
  return;
262258
262704
  const at13 = newStats2.atimeMs;
@@ -262270,7 +262716,7 @@ class NodeFsHandler {
262270
262716
  prevStats = newStats2;
262271
262717
  }
262272
262718
  } catch (error48) {
262273
- this.fsw._remove(dirname22, basename8);
262719
+ this.fsw._remove(dirname23, basename8);
262274
262720
  }
262275
262721
  } else if (parent.has(basename8)) {
262276
262722
  const at13 = newStats.atimeMs;
@@ -262359,7 +262805,7 @@ class NodeFsHandler {
262359
262805
  this._addToNodeFs(path19, initialAdd, wh2, depth + 1);
262360
262806
  }
262361
262807
  }).on(EV.ERROR, this._boundHandleError);
262362
- return new Promise((resolve14, reject) => {
262808
+ return new Promise((resolve16, reject) => {
262363
262809
  if (!stream)
262364
262810
  return reject();
262365
262811
  stream.once(STR_END, () => {
@@ -262368,7 +262814,7 @@ class NodeFsHandler {
262368
262814
  return;
262369
262815
  }
262370
262816
  const wasThrottled = throttler ? throttler.clear() : false;
262371
- resolve14(undefined);
262817
+ resolve16(undefined);
262372
262818
  previous.getChildren().filter((item) => {
262373
262819
  return item !== directory && !current.has(item);
262374
262820
  }).forEach((item) => {
@@ -262493,11 +262939,11 @@ function createPattern(matcher) {
262493
262939
  if (matcher.path === string4)
262494
262940
  return true;
262495
262941
  if (matcher.recursive) {
262496
- const relative6 = sp3.relative(matcher.path, string4);
262497
- if (!relative6) {
262942
+ const relative7 = sp3.relative(matcher.path, string4);
262943
+ if (!relative7) {
262498
262944
  return false;
262499
262945
  }
262500
- return !relative6.startsWith("..") && !sp3.isAbsolute(relative6);
262946
+ return !relative7.startsWith("..") && !sp3.isAbsolute(relative7);
262501
262947
  }
262502
262948
  return false;
262503
262949
  };
@@ -262924,7 +263370,7 @@ class FSWatcher extends EventEmitter3 {
262924
263370
  const fullPath = opts.cwd ? sp3.join(opts.cwd, path19) : path19;
262925
263371
  let stats2;
262926
263372
  try {
262927
- stats2 = await stat5(fullPath);
263373
+ stats2 = await stat6(fullPath);
262928
263374
  } catch (err) {}
262929
263375
  if (!stats2 || this.closed)
262930
263376
  return;
@@ -263028,8 +263474,8 @@ class FSWatcher extends EventEmitter3 {
263028
263474
  }
263029
263475
  return this._userIgnored(path19, stats);
263030
263476
  }
263031
- _isntIgnored(path19, stat6) {
263032
- return !this._isIgnored(path19, stat6);
263477
+ _isntIgnored(path19, stat7) {
263478
+ return !this._isIgnored(path19, stat7);
263033
263479
  }
263034
263480
  _getWatchHelpers(path19) {
263035
263481
  return new WatchHelper(path19, this.options.followSymlinks, this);
@@ -263196,7 +263642,7 @@ class WatchBase44 extends EventEmitter4 {
263196
263642
  ignoreInitial: true
263197
263643
  });
263198
263644
  watcher.on("all", import_debounce.default(async (_event, path19) => {
263199
- this.emit("change", name2, relative6(targetPath, path19));
263645
+ this.emit("change", name2, relative7(targetPath, path19));
263200
263646
  }, WATCH_DEBOUNCE_MS));
263201
263647
  watcher.on("error", (err) => {
263202
263648
  this.logger.error(`Watch handler failed for ${targetPath}`, err);
@@ -263285,7 +263731,7 @@ async function createDevServer(options8) {
263285
263731
  }
263286
263732
  remoteProxy(req, res, next);
263287
263733
  });
263288
- const server = await new Promise((resolve15, reject) => {
263734
+ const server = await new Promise((resolve17, reject) => {
263289
263735
  const s5 = app.listen(port, "127.0.0.1", (err) => {
263290
263736
  if (err) {
263291
263737
  if ("code" in err && err.code === "EADDRINUSE") {
@@ -263294,7 +263740,7 @@ async function createDevServer(options8) {
263294
263740
  reject(err);
263295
263741
  }
263296
263742
  } else {
263297
- resolve15(s5);
263743
+ resolve17(s5);
263298
263744
  }
263299
263745
  });
263300
263746
  });
@@ -263303,8 +263749,8 @@ async function createDevServer(options8) {
263303
263749
  broadcastEntityEvent(io6, appId, entityName, event);
263304
263750
  };
263305
263751
  const base44ConfigWatcher = new WatchBase44({
263306
- functions: join35(dirname23(project2.configPath), project2.functionsDir),
263307
- entities: join35(dirname23(project2.configPath), project2.entitiesDir)
263752
+ functions: join36(dirname24(project2.configPath), project2.functionsDir),
263753
+ entities: join36(dirname24(project2.configPath), project2.entitiesDir)
263308
263754
  }, devLogger);
263309
263755
  base44ConfigWatcher.on("change", async (name2) => {
263310
263756
  try {
@@ -263344,13 +263790,13 @@ async function createDevServer(options8) {
263344
263790
  if (!server.listening) {
263345
263791
  return;
263346
263792
  }
263347
- await new Promise((resolve15, reject) => {
263793
+ await new Promise((resolve17, reject) => {
263348
263794
  server.close((error48) => {
263349
263795
  if (error48) {
263350
263796
  reject(error48);
263351
263797
  return;
263352
263798
  }
263353
- resolve15();
263799
+ resolve17();
263354
263800
  });
263355
263801
  });
263356
263802
  };
@@ -263421,15 +263867,15 @@ class ServeRunner {
263421
263867
  return;
263422
263868
  }
263423
263869
  this.stopping = true;
263424
- const exited = new Promise((resolve15) => child.once("exit", () => resolve15()));
263870
+ const exited = new Promise((resolve17) => child.once("exit", () => resolve17()));
263425
263871
  if (process23.platform === "win32" && child.pid) {
263426
263872
  const taskkill = spawn3("taskkill", ["/pid", String(child.pid), "/T", "/F"], {
263427
263873
  stdio: "ignore",
263428
263874
  windowsHide: true
263429
263875
  });
263430
- await new Promise((resolve15) => {
263431
- taskkill.once("exit", () => resolve15());
263432
- taskkill.once("error", () => resolve15());
263876
+ await new Promise((resolve17) => {
263877
+ taskkill.once("exit", () => resolve17());
263878
+ taskkill.once("error", () => resolve17());
263433
263879
  });
263434
263880
  } else if (child.pid) {
263435
263881
  try {
@@ -263624,13 +264070,13 @@ async function runScript(options8) {
263624
264070
  }
263625
264071
  // src/cli/commands/exec.ts
263626
264072
  function readStdin2() {
263627
- return new Promise((resolve15, reject) => {
264073
+ return new Promise((resolve17, reject) => {
263628
264074
  let data = "";
263629
264075
  process.stdin.setEncoding("utf-8");
263630
264076
  process.stdin.on("data", (chunk) => {
263631
264077
  data += chunk;
263632
264078
  });
263633
- process.stdin.on("end", () => resolve15(data));
264079
+ process.stdin.on("end", () => resolve17(data));
263634
264080
  process.stdin.on("error", reject);
263635
264081
  });
263636
264082
  }
@@ -263701,7 +264147,7 @@ Examples:
263701
264147
  }
263702
264148
 
263703
264149
  // src/cli/commands/project/eject.ts
263704
- import { resolve as resolve15 } from "node:path";
264150
+ import { resolve as resolve17 } from "node:path";
263705
264151
  var import_kebabCase2 = __toESM(require_kebabCase(), 1);
263706
264152
  async function eject(ctx, options8, command2) {
263707
264153
  const { log, runTask: runTask2, isNonInteractive } = ctx;
@@ -263765,7 +264211,7 @@ async function eject(ctx, options8, command2) {
263765
264211
  Ne("Operation cancelled.");
263766
264212
  throw new CLIExitError(0);
263767
264213
  }
263768
- const resolvedPath = resolve15(selectedPath);
264214
+ const resolvedPath = resolve17(selectedPath);
263769
264215
  await runTask2("Downloading your project's code...", async (updateMessage) => {
263770
264216
  await createProjectFilesForExistingProject({
263771
264217
  projectId,
@@ -263859,7 +264305,7 @@ var import_detect_agent = __toESM(require_dist5(), 1);
263859
264305
  import { release, type } from "node:os";
263860
264306
 
263861
264307
  // ../../node_modules/posthog-node/dist/extensions/error-tracking/modifiers/module.node.mjs
263862
- import { dirname as dirname24, posix, sep } from "path";
264308
+ import { dirname as dirname25, posix, sep as sep2 } from "path";
263863
264309
  function createModulerModifier() {
263864
264310
  const getModuleFromFileName = createGetModuleFromFilename();
263865
264311
  return async (frames) => {
@@ -263868,7 +264314,7 @@ function createModulerModifier() {
263868
264314
  return frames;
263869
264315
  };
263870
264316
  }
263871
- function createGetModuleFromFilename(basePath = process.argv[1] ? dirname24(process.argv[1]) : process.cwd(), isWindows5 = sep === "\\") {
264317
+ function createGetModuleFromFilename(basePath = process.argv[1] ? dirname25(process.argv[1]) : process.cwd(), isWindows5 = sep2 === "\\") {
263872
264318
  const normalizedBase = isWindows5 ? normalizeWindowsPath2(basePath) : basePath;
263873
264319
  return (filename) => {
263874
264320
  if (!filename)
@@ -266146,14 +266592,14 @@ async function addSourceContext(frames) {
266146
266592
  return frames;
266147
266593
  }
266148
266594
  function getContextLinesFromFile(path19, ranges, output) {
266149
- return new Promise((resolve16) => {
266595
+ return new Promise((resolve18) => {
266150
266596
  const stream = createReadStream2(path19);
266151
266597
  const lineReaded = createInterface2({
266152
266598
  input: stream
266153
266599
  });
266154
266600
  function destroyStreamAndResolve() {
266155
266601
  stream.destroy();
266156
- resolve16();
266602
+ resolve18();
266157
266603
  }
266158
266604
  let lineNumber = 0;
266159
266605
  let currentRangeIndex = 0;
@@ -267265,15 +267711,15 @@ class PostHogBackendClient extends PostHogCoreStateless {
267265
267711
  return true;
267266
267712
  if (this.featureFlagsPoller === undefined)
267267
267713
  return false;
267268
- return new Promise((resolve16) => {
267714
+ return new Promise((resolve18) => {
267269
267715
  const timeout3 = setTimeout(() => {
267270
267716
  cleanup();
267271
- resolve16(false);
267717
+ resolve18(false);
267272
267718
  }, timeoutMs);
267273
267719
  const cleanup = this._events.on("localEvaluationFlagsLoaded", (count2) => {
267274
267720
  clearTimeout(timeout3);
267275
267721
  cleanup();
267276
- resolve16(count2 > 0);
267722
+ resolve18(count2 > 0);
267277
267723
  });
267278
267724
  });
267279
267725
  }
@@ -268057,9 +268503,9 @@ function addCommandInfoToErrorReporter(program2, errorReporter) {
268057
268503
  });
268058
268504
  }
268059
268505
  // src/cli/index.ts
268060
- var __dirname4 = dirname25(fileURLToPath6(import.meta.url));
268506
+ var __dirname4 = dirname26(fileURLToPath6(import.meta.url));
268061
268507
  async function runCLI(options8) {
268062
- ensureNpmAssets(join36(__dirname4, "../assets"));
268508
+ ensureNpmAssets(join37(__dirname4, "../assets"));
268063
268509
  const errorReporter = new ErrorReporter;
268064
268510
  errorReporter.registerProcessErrorHandlers();
268065
268511
  const jsonMode = process.argv.includes("--json");
@@ -268098,4 +268544,4 @@ export {
268098
268544
  runCLI
268099
268545
  };
268100
268546
 
268101
- //# debugId=A79A364B5E1F19E564756E2164756E21
268547
+ //# debugId=38E334A0515CDEB464756E2164756E21