@base44-preview/cli 0.1.7-pr.584.aff66d4 → 0.1.7-pr.584.bd4da00

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
@@ -23352,15 +23352,15 @@ var require_windows = __commonJS((exports, module) => {
23352
23352
  }
23353
23353
  return false;
23354
23354
  }
23355
- function checkStat(stat, path11, options) {
23356
- if (!stat.isSymbolicLink() && !stat.isFile()) {
23355
+ function checkStat(stat3, path11, options) {
23356
+ if (!stat3.isSymbolicLink() && !stat3.isFile()) {
23357
23357
  return false;
23358
23358
  }
23359
23359
  return checkPathExt(path11, options);
23360
23360
  }
23361
23361
  function isexe(path11, options, cb) {
23362
- fs14.stat(path11, function(er, stat) {
23363
- cb(er, er ? false : checkStat(stat, path11, options));
23362
+ fs14.stat(path11, function(er, stat3) {
23363
+ cb(er, er ? false : checkStat(stat3, path11, options));
23364
23364
  });
23365
23365
  }
23366
23366
  function sync(path11, options) {
@@ -23374,20 +23374,20 @@ var require_mode = __commonJS((exports, module) => {
23374
23374
  isexe.sync = sync;
23375
23375
  var fs14 = __require("fs");
23376
23376
  function isexe(path11, options, cb) {
23377
- fs14.stat(path11, function(er, stat) {
23378
- cb(er, er ? false : checkStat(stat, options));
23377
+ fs14.stat(path11, function(er, stat3) {
23378
+ cb(er, er ? false : checkStat(stat3, options));
23379
23379
  });
23380
23380
  }
23381
23381
  function sync(path11, options) {
23382
23382
  return checkStat(fs14.statSync(path11), options);
23383
23383
  }
23384
- function checkStat(stat, options) {
23385
- return stat.isFile() && checkMode(stat, options);
23384
+ function checkStat(stat3, options) {
23385
+ return stat3.isFile() && checkMode(stat3, options);
23386
23386
  }
23387
- function checkMode(stat, options) {
23388
- var mod = stat.mode;
23389
- var uid = stat.uid;
23390
- var gid = stat.gid;
23387
+ function checkMode(stat3, options) {
23388
+ var mod = stat3.mode;
23389
+ var uid = stat3.uid;
23390
+ var gid = stat3.gid;
23391
23391
  var myUid = options.uid !== undefined ? options.uid : process.getuid && process.getuid();
23392
23392
  var myGid = options.gid !== undefined ? options.gid : process.getgid && process.getgid();
23393
23393
  var u = parseInt("100", 8);
@@ -23419,12 +23419,12 @@ var require_isexe = __commonJS((exports, module) => {
23419
23419
  if (typeof Promise !== "function") {
23420
23420
  throw new TypeError("callback not provided");
23421
23421
  }
23422
- return new Promise(function(resolve4, reject) {
23422
+ return new Promise(function(resolve5, reject) {
23423
23423
  isexe(path11, options || {}, function(er, is) {
23424
23424
  if (er) {
23425
23425
  reject(er);
23426
23426
  } else {
23427
- resolve4(is);
23427
+ resolve5(is);
23428
23428
  }
23429
23429
  });
23430
23430
  });
@@ -23486,27 +23486,27 @@ var require_which = __commonJS((exports, module) => {
23486
23486
  opt = {};
23487
23487
  const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt);
23488
23488
  const found = [];
23489
- const step = (i) => new Promise((resolve4, reject) => {
23489
+ const step = (i) => new Promise((resolve5, reject) => {
23490
23490
  if (i === pathEnv.length)
23491
- return opt.all && found.length ? resolve4(found) : reject(getNotFoundError(cmd));
23491
+ return opt.all && found.length ? resolve5(found) : reject(getNotFoundError(cmd));
23492
23492
  const ppRaw = pathEnv[i];
23493
23493
  const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw;
23494
23494
  const pCmd = path11.join(pathPart, cmd);
23495
23495
  const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd : pCmd;
23496
- resolve4(subStep(p, i, 0));
23496
+ resolve5(subStep(p, i, 0));
23497
23497
  });
23498
- const subStep = (p, i, ii) => new Promise((resolve4, reject) => {
23498
+ const subStep = (p, i, ii) => new Promise((resolve5, reject) => {
23499
23499
  if (ii === pathExt.length)
23500
- return resolve4(step(i + 1));
23500
+ return resolve5(step(i + 1));
23501
23501
  const ext = pathExt[ii];
23502
23502
  isexe(p + ext, { pathExt: pathExtExe }, (er, is) => {
23503
23503
  if (!er && is) {
23504
23504
  if (opt.all)
23505
23505
  found.push(p + ext);
23506
23506
  else
23507
- return resolve4(p + ext);
23507
+ return resolve5(p + ext);
23508
23508
  }
23509
- return resolve4(subStep(p, i, ii + 1));
23509
+ return resolve5(subStep(p, i, ii + 1));
23510
23510
  });
23511
23511
  });
23512
23512
  return cb ? step(0).then((res) => cb(null, res), cb) : step(0);
@@ -27034,7 +27034,7 @@ var require_lodash8 = __commonJS((exports, module) => {
27034
27034
  }
27035
27035
  return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, undefined2, comparator) : [];
27036
27036
  });
27037
- function join15(array2, separator) {
27037
+ function join18(array2, separator) {
27038
27038
  return array2 == null ? "" : nativeJoin.call(array2, separator);
27039
27039
  }
27040
27040
  function last(array2) {
@@ -28966,7 +28966,7 @@ __p += '`;
28966
28966
  lodash.isUndefined = isUndefined;
28967
28967
  lodash.isWeakMap = isWeakMap;
28968
28968
  lodash.isWeakSet = isWeakSet;
28969
- lodash.join = join15;
28969
+ lodash.join = join18;
28970
28970
  lodash.kebabCase = kebabCase;
28971
28971
  lodash.last = last;
28972
28972
  lodash.lastIndexOf = lastIndexOf;
@@ -31176,7 +31176,7 @@ function cleanDoc(doc2) {
31176
31176
  return mapDoc(doc2, (currentDoc) => cleanDocFn(currentDoc));
31177
31177
  }
31178
31178
  function replaceEndOfLine(doc2, replacement = literalline) {
31179
- return mapDoc(doc2, (currentDoc) => typeof currentDoc === "string" ? join26(replacement, currentDoc.split(`
31179
+ return mapDoc(doc2, (currentDoc) => typeof currentDoc === "string" ? join27(replacement, currentDoc.split(`
31180
31180
  `)) : currentDoc);
31181
31181
  }
31182
31182
  function canBreakFn(doc2) {
@@ -31256,7 +31256,7 @@ function indentIfBreak(contents, options) {
31256
31256
  negate: options.negate
31257
31257
  };
31258
31258
  }
31259
- function join26(separator, docs) {
31259
+ function join27(separator, docs) {
31260
31260
  assertDoc(separator);
31261
31261
  assertDocArray(docs);
31262
31262
  const parts = [];
@@ -31967,7 +31967,7 @@ var init_doc = __esm(() => {
31967
31967
  MODE_FLAT = Symbol("MODE_FLAT");
31968
31968
  DOC_FILL_PRINTED_LENGTH = Symbol("DOC_FILL_PRINTED_LENGTH");
31969
31969
  builders = {
31970
- join: join26,
31970
+ join: join27,
31971
31971
  line,
31972
31972
  softline,
31973
31973
  hardline,
@@ -120896,7 +120896,7 @@ function parse42(toml, { maxDepth = 1000, integersAsBigInt } = {}) {
120896
120896
  }
120897
120897
  return res;
120898
120898
  }
120899
- async function readFile6(file2) {
120899
+ async function readFile7(file2) {
120900
120900
  if (isUrlString(file2)) {
120901
120901
  file2 = new URL(file2);
120902
120902
  }
@@ -134690,7 +134690,7 @@ ${codeblock}`, options8);
134690
134690
  "\\": "\\"
134691
134691
  };
134692
134692
  KEY_PART_RE = /^[a-zA-Z0-9-_]+[ \t]*$/;
134693
- read_file_default = readFile6;
134693
+ read_file_default = readFile7;
134694
134694
  loadConfigFromPackageJson = process.versions.bun ? async function loadConfigFromBunPackageJson(file2) {
134695
134695
  const { prettier } = await readBunPackageJson(file2);
134696
134696
  return prettier;
@@ -136881,7 +136881,7 @@ Expected it to be ${EXPECTED_TYPE_VALUES}.`;
136881
136881
  return mapDoc2(doc2, (currentDoc) => cleanDocFn2(currentDoc));
136882
136882
  }
136883
136883
  function replaceEndOfLine2(doc2, replacement = literalline2) {
136884
- return mapDoc2(doc2, (currentDoc) => typeof currentDoc === "string" ? join28(replacement, currentDoc.split(`
136884
+ return mapDoc2(doc2, (currentDoc) => typeof currentDoc === "string" ? join29(replacement, currentDoc.split(`
136885
136885
  `)) : currentDoc);
136886
136886
  }
136887
136887
  function canBreakFn2(doc2) {
@@ -136967,7 +136967,7 @@ Expected it to be ${EXPECTED_TYPE_VALUES}.`;
136967
136967
  negate: options8.negate
136968
136968
  };
136969
136969
  }
136970
- function join28(separator, docs) {
136970
+ function join29(separator, docs) {
136971
136971
  assertDoc2(separator);
136972
136972
  assertDocArray2(docs);
136973
136973
  const parts = [];
@@ -137632,7 +137632,7 @@ Expected it to be ${EXPECTED_TYPE_VALUES}.`;
137632
137632
  }
137633
137633
  }
137634
137634
  var builders2 = {
137635
- join: join28,
137635
+ join: join29,
137636
137636
  line: line3,
137637
137637
  softline: softline2,
137638
137638
  hardline: hardline4,
@@ -138287,11 +138287,11 @@ var require_prettier = __commonJS((exports, module) => {
138287
138287
  var require_formatter = __commonJS((exports) => {
138288
138288
  var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P9, generator) {
138289
138289
  function adopt(value) {
138290
- return value instanceof P9 ? value : new P9(function(resolve16) {
138291
- resolve16(value);
138290
+ return value instanceof P9 ? value : new P9(function(resolve15) {
138291
+ resolve15(value);
138292
138292
  });
138293
138293
  }
138294
- return new (P9 || (P9 = Promise))(function(resolve16, reject) {
138294
+ return new (P9 || (P9 = Promise))(function(resolve15, reject) {
138295
138295
  function fulfilled(value) {
138296
138296
  try {
138297
138297
  step(generator.next(value));
@@ -138307,7 +138307,7 @@ var require_formatter = __commonJS((exports) => {
138307
138307
  }
138308
138308
  }
138309
138309
  function step(result) {
138310
- result.done ? resolve16(result.value) : adopt(result.value).then(fulfilled, rejected);
138310
+ result.done ? resolve15(result.value) : adopt(result.value).then(fulfilled, rejected);
138311
138311
  }
138312
138312
  step((generator = generator.apply(thisArg, _arguments || [])).next());
138313
138313
  });
@@ -142960,7 +142960,7 @@ var require_url = __commonJS((exports) => {
142960
142960
  };
142961
142961
  Object.defineProperty(exports, "__esModule", { value: true });
142962
142962
  exports.parse = undefined;
142963
- exports.resolve = resolve16;
142963
+ exports.resolve = resolve15;
142964
142964
  exports.cwd = cwd;
142965
142965
  exports.getProtocol = getProtocol;
142966
142966
  exports.getExtension = getExtension;
@@ -142988,7 +142988,7 @@ var require_url = __commonJS((exports) => {
142988
142988
  var urlDecodePatterns = [/%23/g, "#", /%24/g, "$", /%26/g, "&", /%2C/g, ",", /%40/g, "@"];
142989
142989
  var parse11 = (u4) => new URL(u4);
142990
142990
  exports.parse = parse11;
142991
- function resolve16(from, to5) {
142991
+ function resolve15(from, to5) {
142992
142992
  const fromUrl = new URL((0, convert_path_to_posix_1.default)(from), "https://aaa.nonexistanturl.com");
142993
142993
  const resolvedUrl = new URL((0, convert_path_to_posix_1.default)(to5), fromUrl);
142994
142994
  const endSpaces = to5.match(/(\s*)$/)?.[1] || "";
@@ -143124,7 +143124,7 @@ var require_url = __commonJS((exports) => {
143124
143124
  }
143125
143125
  function relative5(from, to5) {
143126
143126
  if (!isFileSystemPath(from) || !isFileSystemPath(to5)) {
143127
- return resolve16(from, to5);
143127
+ return resolve15(from, to5);
143128
143128
  }
143129
143129
  const fromDir = path_1.default.dirname(stripHash(from));
143130
143130
  const toPath4 = stripHash(to5);
@@ -143800,7 +143800,7 @@ var require_plugins = __commonJS((exports) => {
143800
143800
  let plugin;
143801
143801
  let lastError;
143802
143802
  let index = 0;
143803
- return new Promise((resolve16, reject) => {
143803
+ return new Promise((resolve15, reject) => {
143804
143804
  runNextPlugin();
143805
143805
  function runNextPlugin() {
143806
143806
  plugin = plugins[index++];
@@ -143828,7 +143828,7 @@ var require_plugins = __commonJS((exports) => {
143828
143828
  }
143829
143829
  }
143830
143830
  function onSuccess(result) {
143831
- resolve16({
143831
+ resolve15({
143832
143832
  plugin,
143833
143833
  result
143834
143834
  });
@@ -143925,7 +143925,7 @@ var require_parse7 = __commonJS((exports) => {
143925
143925
  extension: url3.getExtension(path18)
143926
143926
  };
143927
143927
  try {
143928
- const resolver = await readFile7(file2, options8, $refs);
143928
+ const resolver = await readFile8(file2, options8, $refs);
143929
143929
  $ref.pathType = resolver.plugin.name;
143930
143930
  file2.data = resolver.result;
143931
143931
  const parser2 = await parseFile(file2, options8, $refs);
@@ -143938,7 +143938,7 @@ var require_parse7 = __commonJS((exports) => {
143938
143938
  throw err;
143939
143939
  }
143940
143940
  }
143941
- async function readFile7(file2, options8, $refs) {
143941
+ async function readFile8(file2, options8, $refs) {
143942
143942
  let resolvers = plugins.all(options8.resolve);
143943
143943
  resolvers = plugins.filter(resolvers, "canRead", file2);
143944
143944
  plugins.sort(resolvers);
@@ -145161,11 +145161,11 @@ var require_lib3 = __commonJS((exports) => {
145161
145161
  var require_resolver = __commonJS((exports) => {
145162
145162
  var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P9, generator) {
145163
145163
  function adopt(value) {
145164
- return value instanceof P9 ? value : new P9(function(resolve16) {
145165
- resolve16(value);
145164
+ return value instanceof P9 ? value : new P9(function(resolve15) {
145165
+ resolve15(value);
145166
145166
  });
145167
145167
  }
145168
- return new (P9 || (P9 = Promise))(function(resolve16, reject) {
145168
+ return new (P9 || (P9 = Promise))(function(resolve15, reject) {
145169
145169
  function fulfilled(value) {
145170
145170
  try {
145171
145171
  step(generator.next(value));
@@ -145181,7 +145181,7 @@ var require_resolver = __commonJS((exports) => {
145181
145181
  }
145182
145182
  }
145183
145183
  function step(result) {
145184
- result.done ? resolve16(result.value) : adopt(result.value).then(fulfilled, rejected);
145184
+ result.done ? resolve15(result.value) : adopt(result.value).then(fulfilled, rejected);
145185
145185
  }
145186
145186
  step((generator = generator.apply(thisArg, _arguments || [])).next());
145187
145187
  });
@@ -145302,11 +145302,11 @@ var require_optionValidator = __commonJS((exports) => {
145302
145302
  var require_src3 = __commonJS((exports) => {
145303
145303
  var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P9, generator) {
145304
145304
  function adopt(value) {
145305
- return value instanceof P9 ? value : new P9(function(resolve16) {
145306
- resolve16(value);
145305
+ return value instanceof P9 ? value : new P9(function(resolve15) {
145306
+ resolve15(value);
145307
145307
  });
145308
145308
  }
145309
- return new (P9 || (P9 = Promise))(function(resolve16, reject) {
145309
+ return new (P9 || (P9 = Promise))(function(resolve15, reject) {
145310
145310
  function fulfilled(value) {
145311
145311
  try {
145312
145312
  step(generator.next(value));
@@ -145322,7 +145322,7 @@ var require_src3 = __commonJS((exports) => {
145322
145322
  }
145323
145323
  }
145324
145324
  function step(result) {
145325
- result.done ? resolve16(result.value) : adopt(result.value).then(fulfilled, rejected);
145325
+ result.done ? resolve15(result.value) : adopt(result.value).then(fulfilled, rejected);
145326
145326
  }
145327
145327
  step((generator = generator.apply(thisArg, _arguments || [])).next());
145328
145328
  });
@@ -150984,11 +150984,11 @@ var require_raw_body = __commonJS((exports, module) => {
150984
150984
  if (done) {
150985
150985
  return readStream(stream, encoding, length, limit, wrap(done));
150986
150986
  }
150987
- return new Promise(function executor(resolve16, reject) {
150987
+ return new Promise(function executor(resolve15, reject) {
150988
150988
  readStream(stream, encoding, length, limit, function onRead2(err, buf) {
150989
150989
  if (err)
150990
150990
  return reject(err);
150991
- resolve16(buf);
150991
+ resolve15(buf);
150992
150992
  });
150993
150993
  });
150994
150994
  }
@@ -164112,8 +164112,8 @@ var require_view = __commonJS((exports, module) => {
164112
164112
  var dirname21 = path18.dirname;
164113
164113
  var basename6 = path18.basename;
164114
164114
  var extname3 = path18.extname;
164115
- var join29 = path18.join;
164116
- var resolve16 = path18.resolve;
164115
+ var join30 = path18.join;
164116
+ var resolve15 = path18.resolve;
164117
164117
  module.exports = View;
164118
164118
  function View(name2, options8) {
164119
164119
  var opts = options8 || {};
@@ -164147,7 +164147,7 @@ var require_view = __commonJS((exports, module) => {
164147
164147
  debug('lookup "%s"', name2);
164148
164148
  for (var i5 = 0;i5 < roots.length && !path19; i5++) {
164149
164149
  var root2 = roots[i5];
164150
- var loc = resolve16(root2, name2);
164150
+ var loc = resolve15(root2, name2);
164151
164151
  var dir = dirname21(loc);
164152
164152
  var file2 = basename6(loc);
164153
164153
  path19 = this.resolve(dir, file2);
@@ -164172,14 +164172,14 @@ var require_view = __commonJS((exports, module) => {
164172
164172
  });
164173
164173
  sync = false;
164174
164174
  };
164175
- View.prototype.resolve = function resolve17(dir, file2) {
164175
+ View.prototype.resolve = function resolve16(dir, file2) {
164176
164176
  var ext = this.ext;
164177
- var path19 = join29(dir, file2);
164177
+ var path19 = join30(dir, file2);
164178
164178
  var stat4 = tryStat(path19);
164179
164179
  if (stat4 && stat4.isFile()) {
164180
164180
  return path19;
164181
164181
  }
164182
- path19 = join29(dir, basename6(file2, ext), "index" + ext);
164182
+ path19 = join30(dir, basename6(file2, ext), "index" + ext);
164183
164183
  stat4 = tryStat(path19);
164184
164184
  if (stat4 && stat4.isFile()) {
164185
164185
  return path19;
@@ -166331,7 +166331,7 @@ var require_application = __commonJS((exports, module) => {
166331
166331
  var compileETag = require_utils10().compileETag;
166332
166332
  var compileQueryParser = require_utils10().compileQueryParser;
166333
166333
  var compileTrust = require_utils10().compileTrust;
166334
- var resolve16 = __require("node:path").resolve;
166334
+ var resolve15 = __require("node:path").resolve;
166335
166335
  var once9 = require_once();
166336
166336
  var Router = require_router();
166337
166337
  var slice = Array.prototype.slice;
@@ -166385,7 +166385,7 @@ var require_application = __commonJS((exports, module) => {
166385
166385
  this.mountpath = "/";
166386
166386
  this.locals.settings = this.settings;
166387
166387
  this.set("view", View);
166388
- this.set("views", resolve16("views"));
166388
+ this.set("views", resolve15("views"));
166389
166389
  this.set("jsonp callback name", "callback");
166390
166390
  if (env4 === "production") {
166391
166391
  this.enable("view cache");
@@ -167874,9 +167874,9 @@ var require_send = __commonJS((exports, module) => {
167874
167874
  var Stream2 = __require("stream");
167875
167875
  var util2 = __require("util");
167876
167876
  var extname3 = path18.extname;
167877
- var join29 = path18.join;
167877
+ var join30 = path18.join;
167878
167878
  var normalize2 = path18.normalize;
167879
- var resolve16 = path18.resolve;
167879
+ var resolve15 = path18.resolve;
167880
167880
  var sep2 = path18.sep;
167881
167881
  var BYTES_RANGE_REGEXP = /^ *bytes=/;
167882
167882
  var MAX_MAXAGE = 60 * 60 * 24 * 365 * 1000;
@@ -167905,7 +167905,7 @@ var require_send = __commonJS((exports, module) => {
167905
167905
  this._maxage = opts.maxAge || opts.maxage;
167906
167906
  this._maxage = typeof this._maxage === "string" ? ms9(this._maxage) : Number(this._maxage);
167907
167907
  this._maxage = !isNaN(this._maxage) ? Math.min(Math.max(0, this._maxage), MAX_MAXAGE) : 0;
167908
- this._root = opts.root ? resolve16(opts.root) : null;
167908
+ this._root = opts.root ? resolve15(opts.root) : null;
167909
167909
  }
167910
167910
  util2.inherits(SendStream, Stream2);
167911
167911
  SendStream.prototype.error = function error48(status, err) {
@@ -168046,7 +168046,7 @@ var require_send = __commonJS((exports, module) => {
168046
168046
  return res;
168047
168047
  }
168048
168048
  parts = path19.split(sep2);
168049
- path19 = normalize2(join29(root2, path19));
168049
+ path19 = normalize2(join30(root2, path19));
168050
168050
  } else {
168051
168051
  if (UP_PATH_REGEXP.test(path19)) {
168052
168052
  debug('malicious path "%s"', path19);
@@ -168054,7 +168054,7 @@ var require_send = __commonJS((exports, module) => {
168054
168054
  return res;
168055
168055
  }
168056
168056
  parts = normalize2(path19).split(sep2);
168057
- path19 = resolve16(path19);
168057
+ path19 = resolve15(path19);
168058
168058
  }
168059
168059
  if (containsDotFile(parts)) {
168060
168060
  debug('%s dotfile "%s"', this._dotfiles, path19);
@@ -168186,7 +168186,7 @@ var require_send = __commonJS((exports, module) => {
168186
168186
  return self2.onStatError(err);
168187
168187
  return self2.error(404);
168188
168188
  }
168189
- var p4 = join29(path19, self2._index[i5]);
168189
+ var p4 = join30(path19, self2._index[i5]);
168190
168190
  debug('stat "%s"', p4);
168191
168191
  fs28.stat(p4, function(err2, stat4) {
168192
168192
  if (err2)
@@ -168382,7 +168382,7 @@ var require_response = __commonJS((exports, module) => {
168382
168382
  var cookie = require_cookie();
168383
168383
  var send = require_send();
168384
168384
  var extname3 = path18.extname;
168385
- var resolve16 = path18.resolve;
168385
+ var resolve15 = path18.resolve;
168386
168386
  var vary = require_vary();
168387
168387
  var { Buffer: Buffer7 } = __require("node:buffer");
168388
168388
  var res = Object.create(http.ServerResponse.prototype);
@@ -168591,7 +168591,7 @@ var require_response = __commonJS((exports, module) => {
168591
168591
  }
168592
168592
  opts = Object.create(opts);
168593
168593
  opts.headers = headers;
168594
- var fullPath = !opts.root ? resolve16(path19) : path19;
168594
+ var fullPath = !opts.root ? resolve15(path19) : path19;
168595
168595
  return this.sendFile(fullPath, opts, done);
168596
168596
  };
168597
168597
  res.contentType = res.type = function contentType(type) {
@@ -168852,7 +168852,7 @@ var require_serve_static = __commonJS((exports, module) => {
168852
168852
  var encodeUrl = require_encodeurl();
168853
168853
  var escapeHtml = require_escape_html();
168854
168854
  var parseUrl = require_parseurl();
168855
- var resolve16 = __require("path").resolve;
168855
+ var resolve15 = __require("path").resolve;
168856
168856
  var send = require_send();
168857
168857
  var url3 = __require("url");
168858
168858
  module.exports = serveStatic;
@@ -168871,7 +168871,7 @@ var require_serve_static = __commonJS((exports, module) => {
168871
168871
  throw new TypeError("option setHeaders must be function");
168872
168872
  }
168873
168873
  opts.maxage = opts.maxage || opts.maxAge || 0;
168874
- opts.root = resolve16(root2);
168874
+ opts.root = resolve15(root2);
168875
168875
  var onDirectory = redirect ? createRedirectDirectoryListener() : createNotFoundDirectoryListener();
168876
168876
  return function serveStatic2(req, res, next) {
168877
168877
  if (req.method !== "GET" && req.method !== "HEAD") {
@@ -172245,8 +172245,8 @@ var require_executor = __commonJS((exports, module) => {
172245
172245
  }
172246
172246
  resetBuffer() {
172247
172247
  this.buffer = new Waterfall;
172248
- this.buffer.chain(new Promise((resolve16) => {
172249
- this._triggerBuffer = resolve16;
172248
+ this.buffer.chain(new Promise((resolve15) => {
172249
+ this._triggerBuffer = resolve15;
172250
172250
  }));
172251
172251
  if (this.ready)
172252
172252
  this._triggerBuffer();
@@ -173266,7 +173266,7 @@ var require_storage = __commonJS((exports, module) => {
173266
173266
  throw e8;
173267
173267
  }
173268
173268
  };
173269
- var writeFileLinesAsync = (filename, lines, mode = DEFAULT_FILE_MODE) => new Promise((resolve16, reject) => {
173269
+ var writeFileLinesAsync = (filename, lines, mode = DEFAULT_FILE_MODE) => new Promise((resolve15, reject) => {
173270
173270
  try {
173271
173271
  const stream = writeFileStream(filename, { mode });
173272
173272
  const readable2 = Readable6.from(lines);
@@ -173283,7 +173283,7 @@ var require_storage = __commonJS((exports, module) => {
173283
173283
  if (err)
173284
173284
  reject(err);
173285
173285
  else
173286
- resolve16();
173286
+ resolve15();
173287
173287
  });
173288
173288
  });
173289
173289
  readable2.on("error", (err) => {
@@ -173454,7 +173454,7 @@ var require_persistence = __commonJS((exports, module) => {
173454
173454
  return { data: tdata, indexes };
173455
173455
  }
173456
173456
  treatRawStreamAsync(rawStream) {
173457
- return new Promise((resolve16, reject) => {
173457
+ return new Promise((resolve15, reject) => {
173458
173458
  const dataById = {};
173459
173459
  const indexes = {};
173460
173460
  let corruptItems = 0;
@@ -173497,7 +173497,7 @@ var require_persistence = __commonJS((exports, module) => {
173497
173497
  }
173498
173498
  }
173499
173499
  const data = Object.values(dataById);
173500
- resolve16({ data, indexes });
173500
+ resolve15({ data, indexes });
173501
173501
  });
173502
173502
  lineStream.on("error", function(err) {
173503
173503
  reject(err, null);
@@ -199108,13 +199108,13 @@ var require_broadcast_operator = __commonJS((exports) => {
199108
199108
  return true;
199109
199109
  }
199110
199110
  emitWithAck(ev2, ...args) {
199111
- return new Promise((resolve16, reject) => {
199111
+ return new Promise((resolve15, reject) => {
199112
199112
  args.push((err, responses) => {
199113
199113
  if (err) {
199114
199114
  err.responses = responses;
199115
199115
  return reject(err);
199116
199116
  } else {
199117
- return resolve16(responses);
199117
+ return resolve15(responses);
199118
199118
  }
199119
199119
  });
199120
199120
  this.emit(ev2, ...args);
@@ -199302,12 +199302,12 @@ var require_socket2 = __commonJS((exports) => {
199302
199302
  }
199303
199303
  emitWithAck(ev2, ...args) {
199304
199304
  const withErr = this.flags.timeout !== undefined;
199305
- return new Promise((resolve16, reject) => {
199305
+ return new Promise((resolve15, reject) => {
199306
199306
  args.push((arg1, arg2) => {
199307
199307
  if (withErr) {
199308
- return arg1 ? reject(arg1) : resolve16(arg2);
199308
+ return arg1 ? reject(arg1) : resolve15(arg2);
199309
199309
  } else {
199310
- return resolve16(arg1);
199310
+ return resolve15(arg1);
199311
199311
  }
199312
199312
  });
199313
199313
  this.emit(ev2, ...args);
@@ -199762,13 +199762,13 @@ var require_namespace = __commonJS((exports) => {
199762
199762
  return true;
199763
199763
  }
199764
199764
  serverSideEmitWithAck(ev2, ...args) {
199765
- return new Promise((resolve16, reject) => {
199765
+ return new Promise((resolve15, reject) => {
199766
199766
  args.push((err, responses) => {
199767
199767
  if (err) {
199768
199768
  err.responses = responses;
199769
199769
  return reject(err);
199770
199770
  } else {
199771
- return resolve16(responses);
199771
+ return resolve15(responses);
199772
199772
  }
199773
199773
  });
199774
199774
  this.serverSideEmit(ev2, ...args);
@@ -203303,7 +203303,7 @@ var require_cluster_adapter = __commonJS((exports) => {
203303
203303
  return localSockets;
203304
203304
  }
203305
203305
  const requestId = randomId();
203306
- return new Promise((resolve16, reject) => {
203306
+ return new Promise((resolve15, reject) => {
203307
203307
  const timeout3 = setTimeout(() => {
203308
203308
  const storedRequest2 = this.requests.get(requestId);
203309
203309
  if (storedRequest2) {
@@ -203313,7 +203313,7 @@ var require_cluster_adapter = __commonJS((exports) => {
203313
203313
  }, opts.flags.timeout || DEFAULT_TIMEOUT);
203314
203314
  const storedRequest = {
203315
203315
  type: MessageType.FETCH_SOCKETS,
203316
- resolve: resolve16,
203316
+ resolve: resolve15,
203317
203317
  timeout: timeout3,
203318
203318
  current: 0,
203319
203319
  expected: expectedResponseCount,
@@ -203523,7 +203523,7 @@ var require_cluster_adapter = __commonJS((exports) => {
203523
203523
  return localSockets;
203524
203524
  }
203525
203525
  const requestId = randomId();
203526
- return new Promise((resolve16, reject) => {
203526
+ return new Promise((resolve15, reject) => {
203527
203527
  const timeout3 = setTimeout(() => {
203528
203528
  const storedRequest2 = this.customRequests.get(requestId);
203529
203529
  if (storedRequest2) {
@@ -203533,7 +203533,7 @@ var require_cluster_adapter = __commonJS((exports) => {
203533
203533
  }, opts.flags.timeout || DEFAULT_TIMEOUT);
203534
203534
  const storedRequest = {
203535
203535
  type: MessageType.FETCH_SOCKETS,
203536
- resolve: resolve16,
203536
+ resolve: resolve15,
203537
203537
  timeout: timeout3,
203538
203538
  missingUids: new Set([...this.nodesMap.keys()]),
203539
203539
  responses: localSockets
@@ -204262,13 +204262,13 @@ var require_dist4 = __commonJS((exports, module) => {
204262
204262
  this.engine.close();
204263
204263
  (0, uws_1.restoreAdapter)();
204264
204264
  if (this.httpServer) {
204265
- return new Promise((resolve16) => {
204265
+ return new Promise((resolve15) => {
204266
204266
  this.httpServer.close((err) => {
204267
204267
  fn9 && fn9(err);
204268
204268
  if (err) {
204269
204269
  debug("server was not running");
204270
204270
  }
204271
- resolve16();
204271
+ resolve15();
204272
204272
  });
204273
204273
  });
204274
204274
  } else {
@@ -217632,7 +217632,7 @@ var require_buffer_list = __commonJS((exports, module) => {
217632
217632
  }
217633
217633
  }, {
217634
217634
  key: "join",
217635
- value: function join31(s5) {
217635
+ value: function join33(s5) {
217636
217636
  if (this.length === 0)
217637
217637
  return "";
217638
217638
  var p4 = this.head;
@@ -218930,14 +218930,14 @@ var require_async_iterator = __commonJS((exports, module) => {
218930
218930
  };
218931
218931
  }
218932
218932
  function readAndResolve(iter) {
218933
- var resolve16 = iter[kLastResolve];
218934
- if (resolve16 !== null) {
218933
+ var resolve15 = iter[kLastResolve];
218934
+ if (resolve15 !== null) {
218935
218935
  var data = iter[kStream].read();
218936
218936
  if (data !== null) {
218937
218937
  iter[kLastPromise] = null;
218938
218938
  iter[kLastResolve] = null;
218939
218939
  iter[kLastReject] = null;
218940
- resolve16(createIterResult(data, false));
218940
+ resolve15(createIterResult(data, false));
218941
218941
  }
218942
218942
  }
218943
218943
  }
@@ -218945,13 +218945,13 @@ var require_async_iterator = __commonJS((exports, module) => {
218945
218945
  process.nextTick(readAndResolve, iter);
218946
218946
  }
218947
218947
  function wrapForNext(lastPromise, iter) {
218948
- return function(resolve16, reject) {
218948
+ return function(resolve15, reject) {
218949
218949
  lastPromise.then(function() {
218950
218950
  if (iter[kEnded]) {
218951
- resolve16(createIterResult(undefined, true));
218951
+ resolve15(createIterResult(undefined, true));
218952
218952
  return;
218953
218953
  }
218954
- iter[kHandlePromise](resolve16, reject);
218954
+ iter[kHandlePromise](resolve15, reject);
218955
218955
  }, reject);
218956
218956
  };
218957
218957
  }
@@ -218970,12 +218970,12 @@ var require_async_iterator = __commonJS((exports, module) => {
218970
218970
  return Promise.resolve(createIterResult(undefined, true));
218971
218971
  }
218972
218972
  if (this[kStream].destroyed) {
218973
- return new Promise(function(resolve16, reject) {
218973
+ return new Promise(function(resolve15, reject) {
218974
218974
  process.nextTick(function() {
218975
218975
  if (_this[kError]) {
218976
218976
  reject(_this[kError]);
218977
218977
  } else {
218978
- resolve16(createIterResult(undefined, true));
218978
+ resolve15(createIterResult(undefined, true));
218979
218979
  }
218980
218980
  });
218981
218981
  });
@@ -218998,13 +218998,13 @@ var require_async_iterator = __commonJS((exports, module) => {
218998
218998
  return this;
218999
218999
  }), _defineProperty(_Object$setPrototypeO, "return", function _return() {
219000
219000
  var _this2 = this;
219001
- return new Promise(function(resolve16, reject) {
219001
+ return new Promise(function(resolve15, reject) {
219002
219002
  _this2[kStream].destroy(null, function(err) {
219003
219003
  if (err) {
219004
219004
  reject(err);
219005
219005
  return;
219006
219006
  }
219007
- resolve16(createIterResult(undefined, true));
219007
+ resolve15(createIterResult(undefined, true));
219008
219008
  });
219009
219009
  });
219010
219010
  }), _Object$setPrototypeO), AsyncIteratorPrototype);
@@ -219026,15 +219026,15 @@ var require_async_iterator = __commonJS((exports, module) => {
219026
219026
  value: stream._readableState.endEmitted,
219027
219027
  writable: true
219028
219028
  }), _defineProperty(_Object$create, kHandlePromise, {
219029
- value: function value(resolve16, reject) {
219029
+ value: function value(resolve15, reject) {
219030
219030
  var data = iterator[kStream].read();
219031
219031
  if (data) {
219032
219032
  iterator[kLastPromise] = null;
219033
219033
  iterator[kLastResolve] = null;
219034
219034
  iterator[kLastReject] = null;
219035
- resolve16(createIterResult(data, false));
219035
+ resolve15(createIterResult(data, false));
219036
219036
  } else {
219037
- iterator[kLastResolve] = resolve16;
219037
+ iterator[kLastResolve] = resolve15;
219038
219038
  iterator[kLastReject] = reject;
219039
219039
  }
219040
219040
  },
@@ -219053,12 +219053,12 @@ var require_async_iterator = __commonJS((exports, module) => {
219053
219053
  iterator[kError] = err;
219054
219054
  return;
219055
219055
  }
219056
- var resolve16 = iterator[kLastResolve];
219057
- if (resolve16 !== null) {
219056
+ var resolve15 = iterator[kLastResolve];
219057
+ if (resolve15 !== null) {
219058
219058
  iterator[kLastPromise] = null;
219059
219059
  iterator[kLastResolve] = null;
219060
219060
  iterator[kLastReject] = null;
219061
- resolve16(createIterResult(undefined, true));
219061
+ resolve15(createIterResult(undefined, true));
219062
219062
  }
219063
219063
  iterator[kEnded] = true;
219064
219064
  });
@@ -219070,7 +219070,7 @@ var require_async_iterator = __commonJS((exports, module) => {
219070
219070
 
219071
219071
  // ../../node_modules/readable-stream/lib/internal/streams/from.js
219072
219072
  var require_from = __commonJS((exports, module) => {
219073
- function asyncGeneratorStep(gen, resolve16, reject, _next, _throw, key2, arg) {
219073
+ function asyncGeneratorStep(gen, resolve15, reject, _next, _throw, key2, arg) {
219074
219074
  try {
219075
219075
  var info = gen[key2](arg);
219076
219076
  var value = info.value;
@@ -219079,7 +219079,7 @@ var require_from = __commonJS((exports, module) => {
219079
219079
  return;
219080
219080
  }
219081
219081
  if (info.done) {
219082
- resolve16(value);
219082
+ resolve15(value);
219083
219083
  } else {
219084
219084
  Promise.resolve(value).then(_next, _throw);
219085
219085
  }
@@ -219087,13 +219087,13 @@ var require_from = __commonJS((exports, module) => {
219087
219087
  function _asyncToGenerator(fn9) {
219088
219088
  return function() {
219089
219089
  var self2 = this, args = arguments;
219090
- return new Promise(function(resolve16, reject) {
219090
+ return new Promise(function(resolve15, reject) {
219091
219091
  var gen = fn9.apply(self2, args);
219092
219092
  function _next(value) {
219093
- asyncGeneratorStep(gen, resolve16, reject, _next, _throw, "next", value);
219093
+ asyncGeneratorStep(gen, resolve15, reject, _next, _throw, "next", value);
219094
219094
  }
219095
219095
  function _throw(err) {
219096
- asyncGeneratorStep(gen, resolve16, reject, _next, _throw, "throw", err);
219096
+ asyncGeneratorStep(gen, resolve15, reject, _next, _throw, "throw", err);
219097
219097
  }
219098
219098
  _next(undefined);
219099
219099
  });
@@ -221220,7 +221220,7 @@ var require_dist5 = __commonJS((exports, module) => {
221220
221220
  determineAgent: () => determineAgent
221221
221221
  });
221222
221222
  module.exports = __toCommonJS2(src_exports);
221223
- var import_promises26 = __require("node:fs/promises");
221223
+ var import_promises27 = __require("node:fs/promises");
221224
221224
  var import_node_fs24 = __require("node:fs");
221225
221225
  var DEVIN_LOCAL_PATH = "/opt/.devin";
221226
221226
  var CURSOR2 = "cursor";
@@ -221278,7 +221278,7 @@ var require_dist5 = __commonJS((exports, module) => {
221278
221278
  return { isAgent: true, agent: { name: REPLIT } };
221279
221279
  }
221280
221280
  try {
221281
- await (0, import_promises26.access)(DEVIN_LOCAL_PATH, import_node_fs24.constants.F_OK);
221281
+ await (0, import_promises27.access)(DEVIN_LOCAL_PATH, import_node_fs24.constants.F_OK);
221282
221282
  return { isAgent: true, agent: { name: DEVIN } };
221283
221283
  } catch (error48) {}
221284
221284
  return { isAgent: false, agent: undefined };
@@ -237049,7 +237049,7 @@ function normalizeBase44Env() {
237049
237049
  loadProjectEnvFiles();
237050
237050
 
237051
237051
  // src/cli/index.ts
237052
- import { dirname as dirname26, join as join36 } from "node:path";
237052
+ import { dirname as dirname26, join as join37 } from "node:path";
237053
237053
  import { fileURLToPath as fileURLToPath6 } from "node:url";
237054
237054
 
237055
237055
  // ../../node_modules/@clack/core/dist/index.mjs
@@ -238257,7 +238257,7 @@ var {
238257
238257
  } = import__.default;
238258
238258
 
238259
238259
  // src/cli/commands/agent-skills/pull.ts
238260
- import { dirname as dirname11, join as join17 } from "node:path";
238260
+ import { dirname as dirname11, join as join18 } from "node:path";
238261
238261
  // ../../node_modules/chalk/source/vendor/ansi-styles/index.js
238262
238262
  var ANSI_BACKGROUND_OFFSET = 10;
238263
238263
  var wrapAnsi16 = (offset = 0) => (code) => `\x1B[${code + offset}m`;
@@ -247439,7 +247439,7 @@ async function createProjectFilesForExistingProject(options) {
247439
247439
  };
247440
247440
  }
247441
247441
  // src/core/project/deploy.ts
247442
- import { resolve as resolve3 } from "node:path";
247442
+ import { resolve as resolve6 } from "node:path";
247443
247443
 
247444
247444
  // src/core/site/api.ts
247445
247445
  async function uploadSite(archivePath) {
@@ -247506,340 +247506,616 @@ async function createArchive(pathToArchive, targetArchivePath) {
247506
247506
  cwd: pathToArchive
247507
247507
  }, ["."]);
247508
247508
  }
247509
- // src/core/project/deploy.ts
247510
- function hasResourcesToDeploy(projectData) {
247511
- const {
247512
- project,
247513
- entities,
247514
- functions,
247515
- agents,
247516
- agentSkills,
247517
- connectors,
247518
- authConfig
247519
- } = projectData;
247520
- const hasSite = Boolean(project.site?.outputDirectory);
247521
- const hasEntities = entities.length > 0;
247522
- const hasFunctions = functions.length > 0;
247523
- const hasAgents = agents.length > 0;
247524
- const hasAgentSkills = agentSkills.length > 0;
247525
- const hasConnectors = connectors.length > 0;
247526
- const hasAuthConfig = authConfig.length > 0;
247527
- const hasVisibility = Boolean(project.visibility);
247528
- return hasEntities || hasFunctions || hasAgents || hasAgentSkills || hasConnectors || hasAuthConfig || hasVisibility || hasSite;
247529
- }
247530
- async function deployAll(projectData, options) {
247531
- const {
247532
- project,
247533
- entities,
247534
- functions,
247535
- agents,
247536
- agentSkills,
247537
- connectors,
247538
- authConfig
247539
- } = projectData;
247540
- await setAppVisibility(project.visibility);
247541
- if (project.visibility) {
247542
- options?.onVisibilitySet?.(project.visibility);
247509
+ // src/core/site/deploy-app.ts
247510
+ import { resolve as resolve5 } from "node:path";
247511
+
247512
+ // src/core/deployments/api.ts
247513
+ import { readFile as readFile2 } from "node:fs/promises";
247514
+
247515
+ // src/core/deployments/schema.ts
247516
+ var GIT_HASH_PATTERN = /^[a-fA-F0-9]{7,64}$/;
247517
+ var CreateDeploymentResponseSchema = exports_external.object({
247518
+ deployment_id: exports_external.string(),
247519
+ asset_uploads: exports_external.discriminatedUnion("type", [
247520
+ exports_external.object({
247521
+ type: exports_external.literal("cf"),
247522
+ url: exports_external.string(),
247523
+ jwt: exports_external.string(),
247524
+ buckets: exports_external.array(exports_external.array(exports_external.string()))
247525
+ }),
247526
+ exports_external.object({
247527
+ type: exports_external.literal("s3"),
247528
+ uploads: exports_external.array(exports_external.object({
247529
+ path: exports_external.string(),
247530
+ content_type: exports_external.string(),
247531
+ content_length: exports_external.number(),
247532
+ url: exports_external.string()
247533
+ }))
247534
+ })
247535
+ ]).nullable().optional()
247536
+ }).transform((data) => ({
247537
+ deploymentId: data.deployment_id,
247538
+ assetUploads: data.asset_uploads == null ? null : data.asset_uploads.type === "cf" ? data.asset_uploads : {
247539
+ type: "s3",
247540
+ uploads: data.asset_uploads.uploads.map((upload) => ({
247541
+ path: upload.path,
247542
+ contentType: upload.content_type,
247543
+ contentLength: upload.content_length,
247544
+ url: upload.url
247545
+ }))
247543
247546
  }
247544
- await entityResource.push(entities);
247545
- await deployFunctionsSequentially(functions, {
247546
- onStart: options?.onFunctionStart,
247547
- onResult: options?.onFunctionResult
247548
- });
247549
- await agentSkillResource.push(agentSkills);
247550
- await agentResource.push(agents);
247551
- await authConfigResource.push(authConfig);
247552
- const skipConnectorSync = connectors.length === 0 && hasWorkspaceApiKeyAuth();
247553
- const connectorResults = skipConnectorSync ? [] : (await pushConnectors(connectors)).results;
247554
- if ((options?.site ?? true) && project.site?.outputDirectory) {
247555
- const outputDir = resolve3(project.root, project.site.outputDirectory);
247556
- const { appUrl } = await deploySite(outputDir);
247557
- return { appUrl, connectorResults };
247547
+ }));
247548
+ var AssetUploadResponseSchema = exports_external.looseObject({
247549
+ result: exports_external.looseObject({ jwt: exports_external.string().nullable().optional() }).nullable().optional()
247550
+ });
247551
+ var FinalizeDeploymentResponseSchema = exports_external.object({
247552
+ deployment_id: exports_external.string()
247553
+ }).transform((data) => ({
247554
+ deploymentId: data.deployment_id
247555
+ }));
247556
+
247557
+ // src/core/deployments/api.ts
247558
+ var MODULE_CONTENT_TYPES = {
247559
+ esm: "application/javascript+module",
247560
+ sourcemap: "application/source-map",
247561
+ wasm: "application/wasm",
247562
+ text: "text/plain",
247563
+ data: "application/octet-stream"
247564
+ };
247565
+ async function createDeployment(request) {
247566
+ const appClient = getAppClient();
247567
+ let response;
247568
+ try {
247569
+ response = await appClient.post("deployments", {
247570
+ json: request,
247571
+ timeout: 120000
247572
+ });
247573
+ } catch (error48) {
247574
+ throw await ApiError.fromHttpError(error48, "creating deployment");
247558
247575
  }
247559
- return { connectorResults };
247560
- }
247561
- // src/core/clients/base44-client.ts
247562
- var retriedRequests = new WeakSet;
247563
- async function captureRequestBody(request, options) {
247564
- if (request.body == null) {
247565
- return;
247576
+ const result = CreateDeploymentResponseSchema.safeParse(await response.json());
247577
+ if (!result.success) {
247578
+ throw new SchemaValidationError("Invalid response from server", result.error);
247566
247579
  }
247567
- try {
247568
- const cloned = request.clone();
247569
- const text = await cloned.text();
247570
- options.context.__requestBody = text;
247571
- } catch {}
247580
+ return result.data;
247572
247581
  }
247573
- async function handleUnauthorized(request, _options, response) {
247574
- if (response.status !== 401) {
247575
- return;
247576
- }
247577
- if (hasWorkspaceApiKeyAuth()) {
247578
- return;
247582
+ async function uploadAssetBucket(target, formData) {
247583
+ const response = await distribution_default.post(target.url, {
247584
+ searchParams: { base64: "true" },
247585
+ headers: { Authorization: `Bearer ${target.jwt}` },
247586
+ body: formData,
247587
+ timeout: 120000,
247588
+ retry: 0
247589
+ });
247590
+ const parsed = AssetUploadResponseSchema.safeParse(await response.json());
247591
+ const jwt3 = parsed.success ? parsed.data.result?.jwt : null;
247592
+ return jwt3 || null;
247593
+ }
247594
+ async function finalizeDeployment(deploymentId, completionJwt, modules) {
247595
+ const formData = new FormData;
247596
+ formData.append("payload", JSON.stringify({ completion_jwt: completionJwt }));
247597
+ for (const module of modules) {
247598
+ const content = await readFile2(module.absolutePath);
247599
+ formData.append(module.name, new File([new Uint8Array(content)], module.name, {
247600
+ type: MODULE_CONTENT_TYPES[module.type]
247601
+ }));
247579
247602
  }
247580
- if (retriedRequests.has(request)) {
247581
- return;
247603
+ return await postFinalize(deploymentId, formData);
247604
+ }
247605
+ async function finalizeStaticDeployment(deploymentId, indexHtml) {
247606
+ const formData = new FormData;
247607
+ formData.append("index.html", new File([indexHtml], "index.html", { type: "text/html" }));
247608
+ return await postFinalize(deploymentId, formData);
247609
+ }
247610
+ async function postFinalize(deploymentId, formData) {
247611
+ const appClient = getAppClient();
247612
+ let response;
247613
+ try {
247614
+ response = await appClient.post(`deployments/${encodeURIComponent(deploymentId)}/finalize`, { body: formData, timeout: 180000 });
247615
+ } catch (error48) {
247616
+ throw await ApiError.fromHttpError(error48, "finalizing deployment");
247582
247617
  }
247583
- const newAccessToken = await refreshAndSaveTokens();
247584
- if (!newAccessToken) {
247585
- return;
247618
+ const result = FinalizeDeploymentResponseSchema.safeParse(await response.json());
247619
+ if (!result.success) {
247620
+ throw new SchemaValidationError("Invalid response from server", result.error);
247586
247621
  }
247587
- retriedRequests.add(request);
247588
- const requestId = request.headers.get("X-Request-ID");
247589
- return distribution_default(request.clone(), {
247590
- headers: {
247591
- ...requestId && { "X-Request-ID": requestId },
247592
- Authorization: `Bearer ${newAccessToken}`
247593
- }
247594
- });
247622
+ return result.data;
247595
247623
  }
247596
- var base44Client = distribution_default.create({
247597
- prefixUrl: getBase44ApiUrl(),
247598
- headers: {
247599
- "User-Agent": "Base44 CLI"
247600
- },
247601
- hooks: {
247602
- beforeRequest: [
247603
- (request) => {
247604
- request.headers.set("X-Request-ID", randomUUID2());
247605
- },
247606
- captureRequestBody,
247607
- async (request) => {
247608
- const workspaceApiKey = getWorkspaceApiKeyFromEnv();
247609
- if (workspaceApiKey && isWorkspaceApiKey(workspaceApiKey)) {
247610
- request.headers.set("api_key", workspaceApiKey);
247611
- return;
247612
- }
247613
- try {
247614
- const auth = await readAuth();
247615
- if (isTokenExpired(auth)) {
247616
- const newAccessToken = await refreshAndSaveTokens();
247617
- if (newAccessToken) {
247618
- request.headers.set("Authorization", `Bearer ${newAccessToken}`);
247619
- return;
247620
- }
247621
- }
247622
- request.headers.set("Authorization", `Bearer ${auth.accessToken}`);
247623
- } catch {}
247624
+ // src/core/deployments/manifest.ts
247625
+ import { createHash } from "node:crypto";
247626
+ import { readdir as readdir2, readFile as readFile3, stat } from "node:fs/promises";
247627
+ import { extname, join as join15 } from "node:path";
247628
+ var MAX_ASSET_SIZE_BYTES = 25 * 1024 * 1024;
247629
+ var MAX_ASSET_COUNT = 1e5;
247630
+ var ASSETS_IGNORE_FILE = ".assetsignore";
247631
+ var ALWAYS_SKIPPED_FILES = new Set([
247632
+ ASSETS_IGNORE_FILE,
247633
+ "wrangler.json",
247634
+ ".dev.vars"
247635
+ ]);
247636
+ var MIME_TYPES = {
247637
+ ".html": "text/html",
247638
+ ".htm": "text/html",
247639
+ ".css": "text/css",
247640
+ ".js": "text/javascript",
247641
+ ".mjs": "text/javascript",
247642
+ ".json": "application/json",
247643
+ ".map": "application/json",
247644
+ ".txt": "text/plain",
247645
+ ".xml": "application/xml",
247646
+ ".svg": "image/svg+xml",
247647
+ ".png": "image/png",
247648
+ ".jpg": "image/jpeg",
247649
+ ".jpeg": "image/jpeg",
247650
+ ".gif": "image/gif",
247651
+ ".webp": "image/webp",
247652
+ ".avif": "image/avif",
247653
+ ".ico": "image/x-icon",
247654
+ ".woff": "font/woff",
247655
+ ".woff2": "font/woff2",
247656
+ ".ttf": "font/ttf",
247657
+ ".otf": "font/otf",
247658
+ ".eot": "application/vnd.ms-fontobject",
247659
+ ".mp3": "audio/mpeg",
247660
+ ".mp4": "video/mp4",
247661
+ ".webm": "video/webm",
247662
+ ".pdf": "application/pdf",
247663
+ ".wasm": "application/wasm",
247664
+ ".webmanifest": "application/manifest+json"
247665
+ };
247666
+ function getAssetContentType(filePath) {
247667
+ return MIME_TYPES[extname(filePath).toLowerCase()] ?? "application/octet-stream";
247668
+ }
247669
+ function hashAsset(appId, content) {
247670
+ return createHash("sha256").update(Buffer.from(appId, "utf8")).update(content).digest("hex").slice(0, 32);
247671
+ }
247672
+ function globToRegExp(glob) {
247673
+ let source = "";
247674
+ for (let i = 0;i < glob.length; i++) {
247675
+ const char = glob[i];
247676
+ if (char === "*") {
247677
+ if (glob[i + 1] === "*") {
247678
+ source += ".*";
247679
+ i++;
247680
+ } else {
247681
+ source += "[^/]*";
247624
247682
  }
247625
- ],
247626
- afterResponse: [handleUnauthorized]
247683
+ } else if (char === "?") {
247684
+ source += "[^/]";
247685
+ } else {
247686
+ source += char.replace(/[.+^${}()|[\]\\]/g, "\\$&");
247687
+ }
247627
247688
  }
247628
- });
247629
- function getAppClient() {
247630
- const { id } = getAppContext();
247631
- return base44Client.extend({
247632
- prefixUrl: new URL(`/api/apps/${id}/`, getBase44ApiUrl()).href
247633
- });
247689
+ return new RegExp(`^${source}$`);
247634
247690
  }
247635
- function getSandboxClient(appId) {
247636
- return base44Client.extend({
247637
- prefixUrl: new URL(`/api/apps/${appId}/sandbox-bridge/`, getBase44ApiUrl()).href
247691
+ function createIgnoreMatcher(lines) {
247692
+ const rules = lines.map((line) => line.trim()).filter((line) => line.length > 0 && !line.startsWith("#")).map((line) => {
247693
+ const isDirOnly = line.endsWith("/");
247694
+ let pattern = isDirOnly ? line.slice(0, -1) : line;
247695
+ const anchored = pattern.includes("/");
247696
+ pattern = pattern.replace(/^\//, "");
247697
+ return { regex: globToRegExp(pattern), anchored, isDirOnly };
247638
247698
  });
247639
- }
247640
- // src/core/clients/oauth-client.ts
247641
- import { randomUUID as randomUUID3 } from "node:crypto";
247642
- var oauthClient = distribution_default.create({
247643
- prefixUrl: getBase44ApiUrl(),
247644
- headers: {
247645
- "User-Agent": "Base44 CLI"
247646
- },
247647
- hooks: {
247648
- beforeRequest: [
247649
- (request) => {
247650
- request.headers.set("X-Request-ID", randomUUID3());
247699
+ return (relativePath, isDirectory2) => {
247700
+ const segments = relativePath.split("/");
247701
+ return rules.some((rule) => {
247702
+ if (rule.anchored) {
247703
+ if (rule.isDirOnly ? isDirectory2 : true) {
247704
+ if (rule.regex.test(relativePath))
247705
+ return true;
247706
+ }
247707
+ return false;
247651
247708
  }
247652
- ]
247709
+ const basename4 = segments[segments.length - 1];
247710
+ if (rule.isDirOnly && !isDirectory2)
247711
+ return false;
247712
+ return rule.regex.test(basename4);
247713
+ });
247714
+ };
247715
+ }
247716
+ async function loadIgnoreMatcher(assetsDir) {
247717
+ const ignorePath = join15(assetsDir, ASSETS_IGNORE_FILE);
247718
+ if (!await pathExists(ignorePath)) {
247719
+ return () => false;
247653
247720
  }
247654
- });
247655
- // src/core/auth/api.ts
247656
- async function generateDeviceCode() {
247657
- const response = await oauthClient.post("oauth/device/code", {
247658
- json: {
247659
- client_id: AUTH_CLIENT_ID,
247660
- scope: "apps:read apps:write sandbox:write"
247661
- },
247662
- throwHttpErrors: false
247663
- });
247664
- if (!response.ok) {
247665
- throw new ApiError(`Failed to generate device code: ${response.status} ${response.statusText}`, { statusCode: response.status });
247721
+ const content = await readTextFile(ignorePath);
247722
+ return createIgnoreMatcher(content.split(/\r?\n/));
247723
+ }
247724
+ async function buildAssetManifest(assetsDir, appId) {
247725
+ const isIgnored = await loadIgnoreMatcher(assetsDir);
247726
+ const manifest = {};
247727
+ const filesByHash = new Map;
247728
+ const relativeFilePaths = await collectFilePaths(assetsDir, "", isIgnored);
247729
+ if (relativeFilePaths.length > MAX_ASSET_COUNT) {
247730
+ throw new InvalidInputError(`Too many static assets: found ${relativeFilePaths.length}, the limit is ${MAX_ASSET_COUNT} files.`);
247666
247731
  }
247667
- const result = DeviceCodeResponseSchema.safeParse(await response.json());
247668
- if (!result.success) {
247669
- throw new SchemaValidationError("Invalid device code response from server", result.error);
247732
+ for (const relativePath of relativeFilePaths.sort()) {
247733
+ const absolutePath = join15(assetsDir, ...relativePath.split("/"));
247734
+ const { size } = await stat(absolutePath);
247735
+ if (size > MAX_ASSET_SIZE_BYTES) {
247736
+ throw new InvalidInputError(`Static asset "${relativePath}" is ${size} bytes, which exceeds the 25 MiB per-file limit.`);
247737
+ }
247738
+ const content = await readFile3(absolutePath);
247739
+ const hash2 = hashAsset(appId, content);
247740
+ manifest[`/${relativePath}`] = { hash: hash2, size };
247741
+ if (!filesByHash.has(hash2)) {
247742
+ filesByHash.set(hash2, {
247743
+ absolutePath,
247744
+ hash: hash2,
247745
+ size,
247746
+ contentType: getAssetContentType(absolutePath)
247747
+ });
247748
+ }
247670
247749
  }
247671
- return result.data;
247750
+ return { manifest, filesByHash };
247672
247751
  }
247673
- async function getTokenFromDeviceCode(deviceCode) {
247674
- const searchParams = new URLSearchParams;
247675
- searchParams.set("grant_type", "urn:ietf:params:oauth:grant-type:device_code");
247676
- searchParams.set("device_code", deviceCode);
247677
- searchParams.set("client_id", AUTH_CLIENT_ID);
247678
- const response = await oauthClient.post("oauth/token", {
247679
- body: searchParams.toString(),
247680
- headers: {
247681
- "Content-Type": "application/x-www-form-urlencoded"
247682
- },
247683
- throwHttpErrors: false
247752
+ async function collectFilePaths(dir, relativeDir, isIgnored) {
247753
+ const entries = await readdir2(dir, { withFileTypes: true });
247754
+ const results = [];
247755
+ for (const entry of entries) {
247756
+ const relativePath = relativeDir ? `${relativeDir}/${entry.name}` : entry.name;
247757
+ if (entry.isDirectory()) {
247758
+ if (isIgnored(relativePath, true))
247759
+ continue;
247760
+ results.push(...await collectFilePaths(join15(dir, entry.name), relativePath, isIgnored));
247761
+ continue;
247762
+ }
247763
+ if (!entry.isFile())
247764
+ continue;
247765
+ if (ALWAYS_SKIPPED_FILES.has(entry.name))
247766
+ continue;
247767
+ if (isIgnored(relativePath, false))
247768
+ continue;
247769
+ results.push(relativePath);
247770
+ }
247771
+ return results;
247772
+ }
247773
+
247774
+ // src/core/deployments/modules.ts
247775
+ import { stat as stat2 } from "node:fs/promises";
247776
+ import { relative as relative3, resolve as resolve3, sep } from "node:path";
247777
+ var MAX_TOTAL_MODULE_BYTES = 40 * 1024 * 1024;
247778
+ var MODULE_IGNORE = ["wrangler.json", ".dev.vars"];
247779
+ var RULE_TYPE_TO_MODULE_TYPE = {
247780
+ ESModule: "esm",
247781
+ CompiledWasm: "wasm",
247782
+ Text: "text",
247783
+ Data: "data"
247784
+ };
247785
+ function toPosix(path11) {
247786
+ return path11.split(sep).join("/");
247787
+ }
247788
+ async function collectModules(config9) {
247789
+ const entryPath = resolve3(config9.configDir, config9.main);
247790
+ if (!await pathExists(entryPath)) {
247791
+ throw new InvalidInputError(`Worker entry module does not exist: ${entryPath} (from "main" in ${config9.configPath})`, {
247792
+ hints: [{ message: "Rebuild the project to regenerate the artifact" }]
247793
+ });
247794
+ }
247795
+ const modulesByName = new Map;
247796
+ const entryName = toPosix(relative3(config9.configDir, entryPath));
247797
+ modulesByName.set(entryName, {
247798
+ name: entryName,
247799
+ absolutePath: entryPath,
247800
+ size: 0,
247801
+ type: "esm"
247684
247802
  });
247685
- const json2 = await response.json();
247686
- if (!response.ok) {
247687
- const errorResult = OAuthErrorSchema.safeParse(json2);
247688
- if (!errorResult.success) {
247689
- throw new SchemaValidationError("Token request failed", errorResult.error);
247803
+ const ignore = [...MODULE_IGNORE];
247804
+ if (config9.assetsDirectory?.startsWith(config9.configDir + sep)) {
247805
+ ignore.push(`${toPosix(relative3(config9.configDir, config9.assetsDirectory))}/**`);
247806
+ }
247807
+ for (const rule of config9.rules) {
247808
+ const type = RULE_TYPE_TO_MODULE_TYPE[rule.type];
247809
+ if (!type) {
247810
+ throw new InvalidInputError(`Unsupported module rule type "${rule.type}" in ${config9.configPath}. Supported: ${Object.keys(RULE_TYPE_TO_MODULE_TYPE).join(", ")}.`);
247690
247811
  }
247691
- const { error: error48, error_description } = errorResult.data;
247692
- if (error48 === "authorization_pending" || error48 === "slow_down") {
247693
- return null;
247812
+ const matches = await globby(rule.globs, {
247813
+ cwd: config9.configDir,
247814
+ onlyFiles: true,
247815
+ dot: true,
247816
+ ignore
247817
+ });
247818
+ for (const match of matches.sort()) {
247819
+ if (!modulesByName.has(match)) {
247820
+ modulesByName.set(match, {
247821
+ name: match,
247822
+ absolutePath: resolve3(config9.configDir, match),
247823
+ size: 0,
247824
+ type
247825
+ });
247826
+ }
247694
247827
  }
247695
- throw new ApiError(error_description ?? `OAuth error: ${error48}`, {
247696
- statusCode: response.status
247828
+ }
247829
+ if (config9.uploadSourceMaps) {
247830
+ const maps = await globby("**/*.map", {
247831
+ cwd: config9.configDir,
247832
+ onlyFiles: true,
247833
+ dot: true,
247834
+ ignore
247697
247835
  });
247836
+ for (const map2 of maps.sort()) {
247837
+ addSourcemap(modulesByName, config9.configDir, map2);
247838
+ }
247839
+ } else {
247840
+ for (const name2 of [...modulesByName.keys()]) {
247841
+ const mapName = `${name2}.map`;
247842
+ if (await pathExists(resolve3(config9.configDir, mapName))) {
247843
+ addSourcemap(modulesByName, config9.configDir, mapName);
247844
+ }
247845
+ }
247698
247846
  }
247699
- const result = TokenResponseSchema.safeParse(json2);
247700
- if (!result.success) {
247701
- throw new SchemaValidationError("Invalid token response from server", result.error);
247847
+ const modules = [...modulesByName.values()];
247848
+ let totalBytes = 0;
247849
+ for (const module of modules) {
247850
+ module.size = (await stat2(module.absolutePath)).size;
247851
+ totalBytes += module.size;
247702
247852
  }
247703
- return result.data;
247853
+ if (totalBytes > MAX_TOTAL_MODULE_BYTES) {
247854
+ throw new InvalidInputError(`Worker modules total ${totalBytes} bytes, which exceeds the 40 MB limit for Base44 full-stack deploys.`);
247855
+ }
247856
+ return modules;
247704
247857
  }
247705
- async function renewAccessToken(refreshToken) {
247706
- const searchParams = new URLSearchParams;
247707
- searchParams.set("grant_type", "refresh_token");
247708
- searchParams.set("refresh_token", refreshToken);
247709
- searchParams.set("client_id", AUTH_CLIENT_ID);
247710
- const response = await oauthClient.post("oauth/token", {
247711
- body: searchParams.toString(),
247712
- headers: {
247713
- "Content-Type": "application/x-www-form-urlencoded"
247714
- },
247715
- throwHttpErrors: false
247858
+ function addSourcemap(modulesByName, configDir, name2) {
247859
+ if (modulesByName.has(name2))
247860
+ return;
247861
+ modulesByName.set(name2, {
247862
+ name: name2,
247863
+ absolutePath: resolve3(configDir, name2),
247864
+ size: 0,
247865
+ type: "sourcemap"
247716
247866
  });
247717
- const json2 = await response.json();
247718
- if (!response.ok) {
247719
- const errorResult = OAuthErrorSchema.safeParse(json2);
247720
- if (!errorResult.success) {
247721
- throw new ApiError(`Token refresh failed: ${response.statusText}`, {
247722
- statusCode: response.status
247723
- });
247867
+ }
247868
+
247869
+ // src/core/deployments/upload.ts
247870
+ import { readFile as readFile4 } from "node:fs/promises";
247871
+ var UPLOAD_CONCURRENCY = 3;
247872
+ var MAX_ATTEMPTS_PER_UPLOAD = 3;
247873
+ var RETRY_BASE_DELAY_MS = 500;
247874
+ var MAX_RATE_LIMIT_WAITS = 10;
247875
+ var RATE_LIMIT_DELAY_MS = 15000;
247876
+ async function uploadAssetBuckets(target, filesByHash, onProgress) {
247877
+ const { buckets } = target;
247878
+ const totalFiles = buckets.reduce((sum, bucket) => sum + bucket.length, 0);
247879
+ let uploadedFiles = 0;
247880
+ let completionJwt = null;
247881
+ let nextBucket = 0;
247882
+ const worker = async () => {
247883
+ while (nextBucket < buckets.length) {
247884
+ const bucket = buckets[nextBucket++];
247885
+ const jwt3 = await uploadBucketWithRetry(target, bucket, filesByHash);
247886
+ if (jwt3) {
247887
+ completionJwt = jwt3;
247888
+ }
247889
+ uploadedFiles += bucket.length;
247890
+ onProgress?.({ uploadedFiles, totalFiles });
247724
247891
  }
247725
- const { error: error48, error_description } = errorResult.data;
247726
- throw new ApiError(error_description ?? `OAuth error: ${error48}`, {
247727
- statusCode: response.status
247728
- });
247729
- }
247730
- const result = TokenResponseSchema.safeParse(json2);
247731
- if (!result.success) {
247732
- throw new SchemaValidationError("Invalid token response from server", result.error);
247892
+ };
247893
+ await Promise.all(Array.from({ length: Math.min(UPLOAD_CONCURRENCY, buckets.length) }, worker));
247894
+ if (!completionJwt) {
247895
+ throw new ApiError("Asset upload finished but the server did not return a completion token.");
247733
247896
  }
247734
- return result.data;
247897
+ return completionJwt;
247735
247898
  }
247736
- async function getUserInfo(accessToken) {
247737
- const response = await oauthClient.get("oauth/userinfo", {
247738
- headers: { Authorization: `Bearer ${accessToken}` }
247739
- });
247740
- if (!response.ok) {
247741
- throw new ApiError(`Failed to fetch user info: ${response.status}`, {
247742
- statusCode: response.status
247743
- });
247899
+ async function uploadBucketWithRetry(target, bucket, filesByHash) {
247900
+ let lastError;
247901
+ let rateLimitWaits = 0;
247902
+ const formData = await buildBucketForm(bucket, filesByHash);
247903
+ for (let attempt = 0;attempt < MAX_ATTEMPTS_PER_UPLOAD; attempt++) {
247904
+ if (attempt > 0) {
247905
+ await sleep3(RETRY_BASE_DELAY_MS * 2 ** (attempt - 1));
247906
+ }
247907
+ try {
247908
+ return await uploadAssetBucket(target, formData);
247909
+ } catch (error48) {
247910
+ if (error48 instanceof HTTPError && error48.response.status === 429 && rateLimitWaits < MAX_RATE_LIMIT_WAITS) {
247911
+ rateLimitWaits++;
247912
+ attempt--;
247913
+ await sleep3(RATE_LIMIT_DELAY_MS);
247914
+ continue;
247915
+ }
247916
+ lastError = error48;
247917
+ }
247744
247918
  }
247745
- const result = UserInfoSchema.safeParse(await response.json());
247746
- if (!result.success) {
247747
- throw new SchemaValidationError("Invalid UserInfo response from server", result.error);
247919
+ if (lastError instanceof HTTPError && (lastError.response.status === 401 || lastError.response.status === 403)) {
247920
+ throw new ApiError("This deploy's upload session has expired — rerun deploy. Already-uploaded assets are skipped on the next attempt.", { statusCode: lastError.response.status, cause: lastError });
247748
247921
  }
247749
- return result.data;
247922
+ throw await ApiError.fromHttpError(lastError, "uploading assets to Cloudflare");
247750
247923
  }
247751
- // src/cli/commands/auth/login-flow.ts
247752
- async function generateAndDisplayDeviceCode(log, runTask) {
247753
- const deviceCodeResponse = await runTask("Generating device code...", async () => {
247754
- return await generateDeviceCode();
247755
- }, {
247756
- successMessage: "Device code generated",
247757
- errorMessage: "Failed to generate device code"
247758
- });
247759
- log.info(`Verification code: ${theme.styles.bold(deviceCodeResponse.userCode)}` + `
247760
- Please confirm this code at: ${deviceCodeResponse.verificationUri}`);
247761
- return deviceCodeResponse;
247924
+ async function buildBucketForm(bucket, filesByHash) {
247925
+ const formData = new FormData;
247926
+ for (const hash2 of bucket) {
247927
+ const file2 = filesByHash.get(hash2);
247928
+ if (!file2) {
247929
+ throw new InternalError(`Server requested upload of unknown asset hash: ${hash2}`);
247930
+ }
247931
+ const content = await readFile4(file2.absolutePath);
247932
+ formData.append(hash2, new File([content.toString("base64")], hash2, { type: file2.contentType }));
247933
+ }
247934
+ return formData;
247762
247935
  }
247763
- async function waitForAuthentication(deviceCode, expiresIn, interval, runTask) {
247764
- let tokenResponse;
247765
- try {
247766
- await runTask("Waiting for authentication...", async () => {
247767
- await pWaitFor(async () => {
247768
- const result = await getTokenFromDeviceCode(deviceCode);
247769
- if (result !== null) {
247770
- tokenResponse = result;
247771
- return true;
247772
- }
247773
- return false;
247774
- }, {
247775
- interval: interval * 1000,
247776
- timeout: expiresIn * 1000
247936
+ async function uploadPresignedAssets(uploads, assets, onProgress) {
247937
+ let uploadedFiles = 0;
247938
+ let nextUpload = 0;
247939
+ const worker = async () => {
247940
+ while (nextUpload < uploads.length) {
247941
+ const upload = uploads[nextUpload++];
247942
+ await uploadPresignedAssetWithRetry(upload, assets);
247943
+ uploadedFiles++;
247944
+ onProgress?.({ uploadedFiles, totalFiles: uploads.length });
247945
+ }
247946
+ };
247947
+ await Promise.all(Array.from({ length: Math.min(UPLOAD_CONCURRENCY, uploads.length) }, worker));
247948
+ }
247949
+ async function uploadPresignedAssetWithRetry(upload, assets) {
247950
+ const entry = assets.manifest[upload.path];
247951
+ const file2 = entry && assets.filesByHash.get(entry.hash);
247952
+ if (!file2) {
247953
+ throw new InternalError(`Server requested upload of unknown asset path: ${upload.path}`);
247954
+ }
247955
+ const content = await readFile4(file2.absolutePath);
247956
+ let lastError;
247957
+ for (let attempt = 0;attempt < MAX_ATTEMPTS_PER_UPLOAD; attempt++) {
247958
+ if (attempt > 0) {
247959
+ await sleep3(RETRY_BASE_DELAY_MS * 2 ** (attempt - 1));
247960
+ }
247961
+ try {
247962
+ await distribution_default.put(upload.url, {
247963
+ body: new Uint8Array(content),
247964
+ headers: { "Content-Type": upload.contentType },
247965
+ timeout: 120000,
247966
+ retry: 0
247777
247967
  });
247778
- }, {
247779
- successMessage: "Authentication completed!",
247780
- errorMessage: "Authentication failed"
247781
- });
247782
- } catch (error48) {
247783
- if (error48 instanceof Error && error48.message.includes("timed out")) {
247784
- throw new AuthExpiredError("Authentication timed out. Please try again.");
247968
+ return;
247969
+ } catch (error48) {
247970
+ lastError = error48;
247785
247971
  }
247786
- throw error48;
247787
247972
  }
247788
- if (tokenResponse === undefined) {
247789
- throw new InternalError("Failed to retrieve authentication token.");
247973
+ throw await ApiError.fromHttpError(lastError, "uploading static assets");
247974
+ }
247975
+ function sleep3(ms) {
247976
+ return new Promise((resolve4) => setTimeout(resolve4, ms));
247977
+ }
247978
+
247979
+ // src/core/deployments/wrangler-config.ts
247980
+ import { dirname as dirname10, join as join16, resolve as resolve4 } from "node:path";
247981
+ var WRANGLER_REDIRECT_PATH = join16(".wrangler", "deploy", "config.json");
247982
+ var RedirectConfigSchema = exports_external.looseObject({
247983
+ configPath: exports_external.string().min(1)
247984
+ });
247985
+ var WranglerConfigSchema = exports_external.looseObject({
247986
+ main: exports_external.string().min(1, "wrangler config is missing a 'main' entry module"),
247987
+ no_bundle: exports_external.boolean().optional(),
247988
+ rules: exports_external.array(exports_external.looseObject({ type: exports_external.string(), globs: exports_external.array(exports_external.string()) })).optional(),
247989
+ assets: exports_external.looseObject({
247990
+ directory: exports_external.string().optional(),
247991
+ html_handling: exports_external.string().optional(),
247992
+ not_found_handling: exports_external.string().optional(),
247993
+ run_worker_first: exports_external.union([exports_external.boolean(), exports_external.array(exports_external.string())]).optional(),
247994
+ headers: exports_external.string().optional(),
247995
+ redirects: exports_external.string().optional()
247996
+ }).optional(),
247997
+ compatibility_date: exports_external.string().optional(),
247998
+ compatibility_flags: exports_external.array(exports_external.string()).optional(),
247999
+ vars: exports_external.record(exports_external.string(), exports_external.unknown()).optional(),
248000
+ upload_source_maps: exports_external.boolean().optional()
248001
+ });
248002
+ async function detectFullStackArtifact(projectRoot) {
248003
+ const redirectPath = join16(projectRoot, WRANGLER_REDIRECT_PATH);
248004
+ return await pathExists(redirectPath) ? redirectPath : null;
248005
+ }
248006
+ async function resolveWranglerConfig(projectRoot) {
248007
+ const redirectPath = await detectFullStackArtifact(projectRoot);
248008
+ if (!redirectPath) {
248009
+ throw new InvalidInputError("No full-stack build artifact found. Expected a .wrangler/deploy/config.json redirect file.", {
248010
+ hints: [{ message: "Run your framework's build command first" }]
248011
+ });
247790
248012
  }
247791
- return tokenResponse;
248013
+ const configPath = await resolveRedirectedConfigPath(redirectPath);
248014
+ const parsed = await readJsonFile(configPath);
248015
+ const result = WranglerConfigSchema.safeParse(parsed);
248016
+ if (!result.success) {
248017
+ throw new ConfigInvalidError(`Invalid wrangler config: ${exports_external.prettifyError(result.error)}`, configPath);
248018
+ }
248019
+ const config9 = result.data;
248020
+ if (config9.no_bundle !== true) {
248021
+ 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).");
248022
+ }
248023
+ const configDir = dirname10(configPath);
248024
+ const assetsDirectory = config9.assets?.directory ? resolve4(configDir, config9.assets.directory) : null;
248025
+ return {
248026
+ configPath,
248027
+ configDir,
248028
+ main: config9.main,
248029
+ assetsDirectory,
248030
+ assetsConfig: config9.assets ? toResolvedAssetsConfig(config9.assets) : null,
248031
+ compatibilityDate: config9.compatibility_date ?? null,
248032
+ compatibilityFlags: config9.compatibility_flags ?? [],
248033
+ vars: config9.vars ?? {},
248034
+ rules: (config9.rules ?? []).map((rule) => ({
248035
+ type: rule.type,
248036
+ globs: rule.globs
248037
+ })),
248038
+ uploadSourceMaps: config9.upload_source_maps ?? false
248039
+ };
247792
248040
  }
247793
- async function saveAuthData(response, userInfo) {
247794
- const expiresAt = Date.now() + response.expiresIn * 1000;
247795
- await writeAuth({
247796
- accessToken: response.accessToken,
247797
- refreshToken: response.refreshToken,
247798
- expiresAt,
247799
- email: userInfo.email,
247800
- name: userInfo.name
247801
- });
248041
+ async function resolveRedirectedConfigPath(redirectPath) {
248042
+ const parsed = await readJsonFile(redirectPath);
248043
+ const result = RedirectConfigSchema.safeParse(parsed);
248044
+ if (!result.success) {
248045
+ throw new ConfigInvalidError(`Invalid deploy redirect file: ${exports_external.prettifyError(result.error)}`, redirectPath);
248046
+ }
248047
+ const configPath = resolve4(dirname10(redirectPath), result.data.configPath);
248048
+ if (!await pathExists(configPath)) {
248049
+ throw new ConfigInvalidError(`Wrangler config referenced by ${redirectPath} does not exist: ${configPath}`, redirectPath, {
248050
+ hints: [{ message: "Rebuild the project to regenerate the artifact" }]
248051
+ });
248052
+ }
248053
+ return configPath;
247802
248054
  }
247803
- async function login({
247804
- log,
247805
- runTask
247806
- }) {
247807
- const deviceCodeResponse = await generateAndDisplayDeviceCode(log, runTask);
247808
- const token = await waitForAuthentication(deviceCodeResponse.deviceCode, deviceCodeResponse.expiresIn, deviceCodeResponse.interval, runTask);
247809
- const userInfo = await getUserInfo(token.accessToken);
247810
- await saveAuthData(token, userInfo);
248055
+ function toResolvedAssetsConfig(assets) {
247811
248056
  return {
247812
- outroMessage: `Successfully logged in as ${theme.styles.bold(userInfo.email)}`
248057
+ htmlHandling: assets.html_handling,
248058
+ notFoundHandling: assets.not_found_handling,
248059
+ runWorkerFirst: assets.run_worker_first,
248060
+ headers: assets.headers,
248061
+ redirects: assets.redirects
247813
248062
  };
247814
248063
  }
247815
248064
 
247816
- // src/cli/utils/command/middleware.ts
247817
- async function ensureAuth(ctx) {
247818
- if (hasWorkspaceApiKeyAuth()) {
247819
- ctx.errorReporter.setContext({
247820
- user: { email: "workspace-api-key", name: "Workspace API key" }
247821
- });
247822
- return;
248065
+ // src/core/deployments/deploy.ts
248066
+ async function deployFullStack(options) {
248067
+ const { projectRoot, gitHash, progress } = options;
248068
+ const config9 = await resolveWranglerConfig(projectRoot);
248069
+ if (!config9.compatibilityFlags.includes("nodejs_compat")) {
248070
+ 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.");
247823
248071
  }
247824
- await seedAuthFromEnv();
247825
- const loggedIn = await isLoggedIn();
247826
- if (!loggedIn) {
247827
- ctx.log.info("You need to login first to continue.");
247828
- await login(ctx);
248072
+ if (config9.vars && Object.keys(config9.vars).length > 0) {
248073
+ progress?.onWarning?.("wrangler 'vars' are not supported and were ignored — a worker's environment comes from the app's secrets (base44 secrets set).");
247829
248074
  }
247830
- try {
247831
- const userInfo = await readAuth();
247832
- ctx.errorReporter.setContext({
247833
- user: { email: userInfo.email, name: userInfo.name }
247834
- });
247835
- } catch {}
248075
+ const modules = await collectModules(config9);
248076
+ let assets = { manifest: {}, filesByHash: new Map };
248077
+ if (config9.assetsDirectory && await pathExists(config9.assetsDirectory)) {
248078
+ assets = await buildAssetManifest(config9.assetsDirectory, getAppContext().id);
248079
+ }
248080
+ const created = await createDeployment({
248081
+ git_hash: gitHash,
248082
+ config: {
248083
+ main: config9.main,
248084
+ compatibility_date: config9.compatibilityDate,
248085
+ compatibility_flags: config9.compatibilityFlags,
248086
+ assets: buildAssetsConfig(config9.assetsConfig, progress)
248087
+ },
248088
+ asset_manifest: assets.manifest
248089
+ });
248090
+ if (created.assetUploads && created.assetUploads.type !== "cf") {
248091
+ throw new ApiError(`The server answered a full-stack deploy with the "${created.assetUploads.type}" upload target.`);
248092
+ }
248093
+ const totalAssets = Object.keys(assets.manifest).length;
248094
+ const newAssets = created.assetUploads ? new Set(created.assetUploads.buckets.flat()).size : 0;
248095
+ progress?.onAssets?.({ totalAssets, newAssets });
248096
+ const completionJwt = created.assetUploads ? await uploadAssetBuckets(created.assetUploads, assets.filesByHash, progress?.onAssetUpload) : null;
248097
+ progress?.onWorker?.({ moduleCount: modules.length });
248098
+ const finalized = await finalizeDeployment(created.deploymentId, completionJwt, modules);
248099
+ return { deploymentId: finalized.deploymentId, gitHash };
247836
248100
  }
247837
- async function ensureAppContext(ctx, options = {}) {
247838
- const appContext = await initAppContext(options);
247839
- ctx.app = appContext;
247840
- ctx.errorReporter.setContext({ appId: appContext.id });
248101
+ function buildAssetsConfig(assetsConfig, progress) {
248102
+ if (!assetsConfig)
248103
+ return null;
248104
+ if (assetsConfig.headers || assetsConfig.redirects) {
248105
+ progress?.onWarning?.("_headers/_redirects files are not supported yet and were ignored for this deploy.");
248106
+ }
248107
+ let runWorkerFirst;
248108
+ if (Array.isArray(assetsConfig.runWorkerFirst)) {
248109
+ progress?.onWarning?.("'run_worker_first' route patterns are not supported yet and were ignored for this deploy.");
248110
+ } else {
248111
+ runWorkerFirst = assetsConfig.runWorkerFirst;
248112
+ }
248113
+ return {
248114
+ html_handling: assetsConfig.htmlHandling,
248115
+ not_found_handling: assetsConfig.notFoundHandling,
248116
+ run_worker_first: runWorkerFirst
248117
+ };
247841
248118
  }
247842
-
247843
248119
  // ../../node_modules/is-plain-obj/index.js
247844
248120
  function isPlainObject2(value) {
247845
248121
  if (typeof value !== "object" || value === null) {
@@ -247937,13 +248213,13 @@ var getJoinLength = (uint8Arrays) => {
247937
248213
  var isTemplateString = (templates) => Array.isArray(templates) && Array.isArray(templates.raw);
247938
248214
  var parseTemplates = (templates, expressions) => {
247939
248215
  let tokens = [];
247940
- for (const [index, template2] of templates.entries()) {
248216
+ for (const [index, template] of templates.entries()) {
247941
248217
  tokens = parseTemplate({
247942
248218
  templates,
247943
248219
  expressions,
247944
248220
  tokens,
247945
248221
  index,
247946
- template: template2
248222
+ template
247947
248223
  });
247948
248224
  }
247949
248225
  if (tokens.length === 0) {
@@ -247952,11 +248228,11 @@ var parseTemplates = (templates, expressions) => {
247952
248228
  const [file2, ...commandArguments] = tokens;
247953
248229
  return [file2, commandArguments, {}];
247954
248230
  };
247955
- var parseTemplate = ({ templates, expressions, tokens, index, template: template2 }) => {
247956
- if (template2 === undefined) {
248231
+ var parseTemplate = ({ templates, expressions, tokens, index, template }) => {
248232
+ if (template === undefined) {
247957
248233
  throw new TypeError(`Invalid backslash sequence: ${templates.raw[index]}`);
247958
248234
  }
247959
- const { nextTokens, leadingWhitespaces, trailingWhitespaces } = splitByWhitespaces(template2, templates.raw[index]);
248235
+ const { nextTokens, leadingWhitespaces, trailingWhitespaces } = splitByWhitespaces(template, templates.raw[index]);
247960
248236
  const newTokens = concatTokens(tokens, nextTokens, leadingWhitespaces);
247961
248237
  if (index === expressions.length) {
247962
248238
  return newTokens;
@@ -247965,18 +248241,18 @@ var parseTemplate = ({ templates, expressions, tokens, index, template: template
247965
248241
  const expressionTokens = Array.isArray(expression) ? expression.map((expression2) => parseExpression(expression2)) : [parseExpression(expression)];
247966
248242
  return concatTokens(newTokens, expressionTokens, trailingWhitespaces);
247967
248243
  };
247968
- var splitByWhitespaces = (template2, rawTemplate) => {
248244
+ var splitByWhitespaces = (template, rawTemplate) => {
247969
248245
  if (rawTemplate.length === 0) {
247970
248246
  return { nextTokens: [], leadingWhitespaces: false, trailingWhitespaces: false };
247971
248247
  }
247972
248248
  const nextTokens = [];
247973
248249
  let templateStart = 0;
247974
248250
  const leadingWhitespaces = DELIMITERS.has(rawTemplate[0]);
247975
- for (let templateIndex = 0, rawIndex = 0;templateIndex < template2.length; templateIndex += 1, rawIndex += 1) {
248251
+ for (let templateIndex = 0, rawIndex = 0;templateIndex < template.length; templateIndex += 1, rawIndex += 1) {
247976
248252
  const rawCharacter = rawTemplate[rawIndex];
247977
248253
  if (DELIMITERS.has(rawCharacter)) {
247978
248254
  if (templateStart !== templateIndex) {
247979
- nextTokens.push(template2.slice(templateStart, templateIndex));
248255
+ nextTokens.push(template.slice(templateStart, templateIndex));
247980
248256
  }
247981
248257
  templateStart = templateIndex + 1;
247982
248258
  } else if (rawCharacter === "\\") {
@@ -247992,9 +248268,9 @@ var splitByWhitespaces = (template2, rawTemplate) => {
247992
248268
  }
247993
248269
  }
247994
248270
  }
247995
- const trailingWhitespaces = templateStart === template2.length;
248271
+ const trailingWhitespaces = templateStart === template.length;
247996
248272
  if (!trailingWhitespaces) {
247997
- nextTokens.push(template2.slice(templateStart));
248273
+ nextTokens.push(template.slice(templateStart));
247998
248274
  }
247999
248275
  return { nextTokens, leadingWhitespaces, trailingWhitespaces };
248000
248276
  };
@@ -249388,8 +249664,8 @@ var disconnect = (anyProcess) => {
249388
249664
  // ../../node_modules/execa/lib/utils/deferred.js
249389
249665
  var createDeferred = () => {
249390
249666
  const methods = {};
249391
- const promise2 = new Promise((resolve4, reject) => {
249392
- Object.assign(methods, { resolve: resolve4, reject });
249667
+ const promise2 = new Promise((resolve5, reject) => {
249668
+ Object.assign(methods, { resolve: resolve5, reject });
249393
249669
  });
249394
249670
  return Object.assign(promise2, methods);
249395
249671
  };
@@ -253753,11 +254029,11 @@ var addConcurrentStream = (concurrentStreams, stream, waitName) => {
253753
254029
  const promises = weakMap.get(stream);
253754
254030
  const promise2 = createDeferred();
253755
254031
  promises.push(promise2);
253756
- const resolve4 = promise2.resolve.bind(promise2);
253757
- return { resolve: resolve4, promises };
254032
+ const resolve5 = promise2.resolve.bind(promise2);
254033
+ return { resolve: resolve5, promises };
253758
254034
  };
253759
- var waitForConcurrentStreams = async ({ resolve: resolve4, promises }, subprocess) => {
253760
- resolve4();
254035
+ var waitForConcurrentStreams = async ({ resolve: resolve5, promises }, subprocess) => {
254036
+ resolve5();
253761
254037
  const [isSubprocessExit] = await Promise.race([
253762
254038
  Promise.allSettled([true, subprocess]),
253763
254039
  Promise.all([false, ...promises])
@@ -254336,6 +254612,441 @@ var {
254336
254612
  getCancelSignal: getCancelSignal2
254337
254613
  } = getIpcExport();
254338
254614
 
254615
+ // src/core/deployments/git-hash.ts
254616
+ async function resolveGitHash(projectRoot, explicit) {
254617
+ const hash2 = explicit ?? await gitHead(projectRoot);
254618
+ if (!hash2 || !GIT_HASH_PATTERN.test(hash2)) {
254619
+ 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.", {
254620
+ hints: [
254621
+ {
254622
+ message: "Run the deploy from a git checkout, or pass the commit explicitly with --git-hash."
254623
+ }
254624
+ ]
254625
+ });
254626
+ }
254627
+ return hash2;
254628
+ }
254629
+ async function gitHead(projectRoot) {
254630
+ try {
254631
+ const { stdout } = await execa("git", ["rev-parse", "HEAD"], {
254632
+ cwd: projectRoot
254633
+ });
254634
+ return stdout.trim();
254635
+ } catch {
254636
+ return null;
254637
+ }
254638
+ }
254639
+ // src/core/deployments/static-site.ts
254640
+ import { readFile as readFile5 } from "node:fs/promises";
254641
+ import { join as join17 } from "node:path";
254642
+ var STATIC_DEPLOYMENTS_ENV = "BASE44_STATIC_DEPLOYMENTS";
254643
+ function staticDeploymentsEnabled(env2 = process.env) {
254644
+ const value = env2[STATIC_DEPLOYMENTS_ENV];
254645
+ return value === "1" || value === "true";
254646
+ }
254647
+ async function deployStaticSite(options) {
254648
+ const { outputDir, gitHash, progress } = options;
254649
+ const assets = await buildAssetManifest(outputDir, getAppContext().id);
254650
+ if (!assets.manifest["/index.html"]) {
254651
+ throw new InvalidInputError(`No index.html found in "${outputDir}" — a static site needs one at the output directory root.`);
254652
+ }
254653
+ const created = await createDeployment({
254654
+ git_hash: gitHash,
254655
+ asset_manifest: assets.manifest
254656
+ });
254657
+ if (created.assetUploads && created.assetUploads.type !== "s3") {
254658
+ throw new ApiError(`The server answered a static-site deploy with the "${created.assetUploads.type}" upload target.`);
254659
+ }
254660
+ const totalAssets = Object.keys(assets.manifest).length;
254661
+ progress?.onAssets?.({
254662
+ totalAssets,
254663
+ newAssets: created.assetUploads?.uploads.length ?? 0
254664
+ });
254665
+ if (created.assetUploads) {
254666
+ await uploadPresignedAssets(created.assetUploads.uploads, assets, progress?.onAssetUpload);
254667
+ }
254668
+ const indexHtml = await readFile5(join17(outputDir, "index.html"));
254669
+ const finalized = await finalizeStaticDeployment(created.deploymentId, new Uint8Array(indexHtml));
254670
+ return { deploymentId: finalized.deploymentId, gitHash };
254671
+ }
254672
+ // src/core/site/deploy-app.ts
254673
+ async function planAppDeploy(target) {
254674
+ if (await detectFullStackArtifact(target.root)) {
254675
+ return { kind: "full-stack" };
254676
+ }
254677
+ const outputDirectory = target.site?.outputDirectory;
254678
+ if (!outputDirectory) {
254679
+ return { kind: "none" };
254680
+ }
254681
+ const outputDir = resolve5(target.root, outputDirectory);
254682
+ return staticDeploymentsEnabled() ? { kind: "static-deployment", outputDir } : { kind: "static", outputDir };
254683
+ }
254684
+ async function detectAppDeployKind(target) {
254685
+ return (await planAppDeploy(target)).kind;
254686
+ }
254687
+ async function deployAppSite(target, options = {}) {
254688
+ const plan = await planAppDeploy(target);
254689
+ switch (plan.kind) {
254690
+ case "full-stack": {
254691
+ const gitHash = await resolveGitHash(target.root, options.gitHash);
254692
+ const { deploymentId } = await deployFullStack({
254693
+ projectRoot: target.root,
254694
+ gitHash,
254695
+ progress: options.progress
254696
+ });
254697
+ return { kind: "full-stack", deploymentId, gitHash };
254698
+ }
254699
+ case "static-deployment": {
254700
+ const gitHash = await resolveGitHash(target.root, options.gitHash);
254701
+ const { deploymentId } = await deployStaticSite({
254702
+ outputDir: plan.outputDir,
254703
+ gitHash,
254704
+ progress: options.progress
254705
+ });
254706
+ return { kind: "static-deployment", deploymentId, gitHash };
254707
+ }
254708
+ case "static": {
254709
+ const { appUrl } = await deploySite(plan.outputDir);
254710
+ return { kind: "static", appUrl };
254711
+ }
254712
+ case "none":
254713
+ return { kind: "none" };
254714
+ }
254715
+ }
254716
+ // src/core/project/deploy.ts
254717
+ function hasResourcesToDeploy(projectData) {
254718
+ const {
254719
+ project,
254720
+ entities,
254721
+ functions,
254722
+ agents,
254723
+ agentSkills,
254724
+ connectors,
254725
+ authConfig
254726
+ } = projectData;
254727
+ const hasSite = Boolean(project.site?.outputDirectory || project.site?.buildCommand);
254728
+ const hasEntities = entities.length > 0;
254729
+ const hasFunctions = functions.length > 0;
254730
+ const hasAgents = agents.length > 0;
254731
+ const hasAgentSkills = agentSkills.length > 0;
254732
+ const hasConnectors = connectors.length > 0;
254733
+ const hasAuthConfig = authConfig.length > 0;
254734
+ const hasVisibility = Boolean(project.visibility);
254735
+ return hasEntities || hasFunctions || hasAgents || hasAgentSkills || hasConnectors || hasAuthConfig || hasVisibility || hasSite;
254736
+ }
254737
+ async function deployAll(projectData, options) {
254738
+ const {
254739
+ project,
254740
+ entities,
254741
+ functions,
254742
+ agents,
254743
+ agentSkills,
254744
+ connectors,
254745
+ authConfig
254746
+ } = projectData;
254747
+ await setAppVisibility(project.visibility);
254748
+ if (project.visibility) {
254749
+ options?.onVisibilitySet?.(project.visibility);
254750
+ }
254751
+ await entityResource.push(entities);
254752
+ await deployFunctionsSequentially(functions, {
254753
+ onStart: options?.onFunctionStart,
254754
+ onResult: options?.onFunctionResult
254755
+ });
254756
+ await agentSkillResource.push(agentSkills);
254757
+ await agentResource.push(agents);
254758
+ await authConfigResource.push(authConfig);
254759
+ const skipConnectorSync = connectors.length === 0 && hasWorkspaceApiKeyAuth();
254760
+ const connectorResults = skipConnectorSync ? [] : (await pushConnectors(connectors)).results;
254761
+ if ((options?.site ?? true) && project.site?.outputDirectory) {
254762
+ const outputDir = resolve6(project.root, project.site.outputDirectory);
254763
+ const { appUrl } = await deploySite(outputDir);
254764
+ return { appUrl, connectorResults };
254765
+ }
254766
+ return { connectorResults };
254767
+ }
254768
+ // src/core/clients/base44-client.ts
254769
+ var retriedRequests = new WeakSet;
254770
+ async function captureRequestBody(request, options) {
254771
+ if (request.body == null) {
254772
+ return;
254773
+ }
254774
+ try {
254775
+ const cloned = request.clone();
254776
+ const text = await cloned.text();
254777
+ options.context.__requestBody = text;
254778
+ } catch {}
254779
+ }
254780
+ async function handleUnauthorized(request, _options, response) {
254781
+ if (response.status !== 401) {
254782
+ return;
254783
+ }
254784
+ if (hasWorkspaceApiKeyAuth()) {
254785
+ return;
254786
+ }
254787
+ if (retriedRequests.has(request)) {
254788
+ return;
254789
+ }
254790
+ const newAccessToken = await refreshAndSaveTokens();
254791
+ if (!newAccessToken) {
254792
+ return;
254793
+ }
254794
+ retriedRequests.add(request);
254795
+ const requestId = request.headers.get("X-Request-ID");
254796
+ return distribution_default(request.clone(), {
254797
+ headers: {
254798
+ ...requestId && { "X-Request-ID": requestId },
254799
+ Authorization: `Bearer ${newAccessToken}`
254800
+ }
254801
+ });
254802
+ }
254803
+ var base44Client = distribution_default.create({
254804
+ prefixUrl: getBase44ApiUrl(),
254805
+ headers: {
254806
+ "User-Agent": "Base44 CLI"
254807
+ },
254808
+ hooks: {
254809
+ beforeRequest: [
254810
+ (request) => {
254811
+ request.headers.set("X-Request-ID", randomUUID2());
254812
+ },
254813
+ captureRequestBody,
254814
+ async (request) => {
254815
+ const workspaceApiKey = getWorkspaceApiKeyFromEnv();
254816
+ if (workspaceApiKey && isWorkspaceApiKey(workspaceApiKey)) {
254817
+ request.headers.set("api_key", workspaceApiKey);
254818
+ return;
254819
+ }
254820
+ try {
254821
+ const auth = await readAuth();
254822
+ if (isTokenExpired(auth)) {
254823
+ const newAccessToken = await refreshAndSaveTokens();
254824
+ if (newAccessToken) {
254825
+ request.headers.set("Authorization", `Bearer ${newAccessToken}`);
254826
+ return;
254827
+ }
254828
+ }
254829
+ request.headers.set("Authorization", `Bearer ${auth.accessToken}`);
254830
+ } catch {}
254831
+ }
254832
+ ],
254833
+ afterResponse: [handleUnauthorized]
254834
+ }
254835
+ });
254836
+ function getAppClient() {
254837
+ const { id } = getAppContext();
254838
+ return base44Client.extend({
254839
+ prefixUrl: new URL(`/api/apps/${id}/`, getBase44ApiUrl()).href
254840
+ });
254841
+ }
254842
+ function getSandboxClient(appId) {
254843
+ return base44Client.extend({
254844
+ prefixUrl: new URL(`/api/apps/${appId}/sandbox-bridge/`, getBase44ApiUrl()).href
254845
+ });
254846
+ }
254847
+ // src/core/clients/oauth-client.ts
254848
+ import { randomUUID as randomUUID3 } from "node:crypto";
254849
+ var oauthClient = distribution_default.create({
254850
+ prefixUrl: getBase44ApiUrl(),
254851
+ headers: {
254852
+ "User-Agent": "Base44 CLI"
254853
+ },
254854
+ hooks: {
254855
+ beforeRequest: [
254856
+ (request) => {
254857
+ request.headers.set("X-Request-ID", randomUUID3());
254858
+ }
254859
+ ]
254860
+ }
254861
+ });
254862
+ // src/core/auth/api.ts
254863
+ async function generateDeviceCode() {
254864
+ const response = await oauthClient.post("oauth/device/code", {
254865
+ json: {
254866
+ client_id: AUTH_CLIENT_ID,
254867
+ scope: "apps:read apps:write sandbox:write"
254868
+ },
254869
+ throwHttpErrors: false
254870
+ });
254871
+ if (!response.ok) {
254872
+ throw new ApiError(`Failed to generate device code: ${response.status} ${response.statusText}`, { statusCode: response.status });
254873
+ }
254874
+ const result = DeviceCodeResponseSchema.safeParse(await response.json());
254875
+ if (!result.success) {
254876
+ throw new SchemaValidationError("Invalid device code response from server", result.error);
254877
+ }
254878
+ return result.data;
254879
+ }
254880
+ async function getTokenFromDeviceCode(deviceCode) {
254881
+ const searchParams = new URLSearchParams;
254882
+ searchParams.set("grant_type", "urn:ietf:params:oauth:grant-type:device_code");
254883
+ searchParams.set("device_code", deviceCode);
254884
+ searchParams.set("client_id", AUTH_CLIENT_ID);
254885
+ const response = await oauthClient.post("oauth/token", {
254886
+ body: searchParams.toString(),
254887
+ headers: {
254888
+ "Content-Type": "application/x-www-form-urlencoded"
254889
+ },
254890
+ throwHttpErrors: false
254891
+ });
254892
+ const json2 = await response.json();
254893
+ if (!response.ok) {
254894
+ const errorResult = OAuthErrorSchema.safeParse(json2);
254895
+ if (!errorResult.success) {
254896
+ throw new SchemaValidationError("Token request failed", errorResult.error);
254897
+ }
254898
+ const { error: error48, error_description } = errorResult.data;
254899
+ if (error48 === "authorization_pending" || error48 === "slow_down") {
254900
+ return null;
254901
+ }
254902
+ throw new ApiError(error_description ?? `OAuth error: ${error48}`, {
254903
+ statusCode: response.status
254904
+ });
254905
+ }
254906
+ const result = TokenResponseSchema.safeParse(json2);
254907
+ if (!result.success) {
254908
+ throw new SchemaValidationError("Invalid token response from server", result.error);
254909
+ }
254910
+ return result.data;
254911
+ }
254912
+ async function renewAccessToken(refreshToken) {
254913
+ const searchParams = new URLSearchParams;
254914
+ searchParams.set("grant_type", "refresh_token");
254915
+ searchParams.set("refresh_token", refreshToken);
254916
+ searchParams.set("client_id", AUTH_CLIENT_ID);
254917
+ const response = await oauthClient.post("oauth/token", {
254918
+ body: searchParams.toString(),
254919
+ headers: {
254920
+ "Content-Type": "application/x-www-form-urlencoded"
254921
+ },
254922
+ throwHttpErrors: false
254923
+ });
254924
+ const json2 = await response.json();
254925
+ if (!response.ok) {
254926
+ const errorResult = OAuthErrorSchema.safeParse(json2);
254927
+ if (!errorResult.success) {
254928
+ throw new ApiError(`Token refresh failed: ${response.statusText}`, {
254929
+ statusCode: response.status
254930
+ });
254931
+ }
254932
+ const { error: error48, error_description } = errorResult.data;
254933
+ throw new ApiError(error_description ?? `OAuth error: ${error48}`, {
254934
+ statusCode: response.status
254935
+ });
254936
+ }
254937
+ const result = TokenResponseSchema.safeParse(json2);
254938
+ if (!result.success) {
254939
+ throw new SchemaValidationError("Invalid token response from server", result.error);
254940
+ }
254941
+ return result.data;
254942
+ }
254943
+ async function getUserInfo(accessToken) {
254944
+ const response = await oauthClient.get("oauth/userinfo", {
254945
+ headers: { Authorization: `Bearer ${accessToken}` }
254946
+ });
254947
+ if (!response.ok) {
254948
+ throw new ApiError(`Failed to fetch user info: ${response.status}`, {
254949
+ statusCode: response.status
254950
+ });
254951
+ }
254952
+ const result = UserInfoSchema.safeParse(await response.json());
254953
+ if (!result.success) {
254954
+ throw new SchemaValidationError("Invalid UserInfo response from server", result.error);
254955
+ }
254956
+ return result.data;
254957
+ }
254958
+ // src/cli/commands/auth/login-flow.ts
254959
+ async function generateAndDisplayDeviceCode(log, runTask) {
254960
+ const deviceCodeResponse = await runTask("Generating device code...", async () => {
254961
+ return await generateDeviceCode();
254962
+ }, {
254963
+ successMessage: "Device code generated",
254964
+ errorMessage: "Failed to generate device code"
254965
+ });
254966
+ log.info(`Verification code: ${theme.styles.bold(deviceCodeResponse.userCode)}` + `
254967
+ Please confirm this code at: ${deviceCodeResponse.verificationUri}`);
254968
+ return deviceCodeResponse;
254969
+ }
254970
+ async function waitForAuthentication(deviceCode, expiresIn, interval, runTask) {
254971
+ let tokenResponse;
254972
+ try {
254973
+ await runTask("Waiting for authentication...", async () => {
254974
+ await pWaitFor(async () => {
254975
+ const result = await getTokenFromDeviceCode(deviceCode);
254976
+ if (result !== null) {
254977
+ tokenResponse = result;
254978
+ return true;
254979
+ }
254980
+ return false;
254981
+ }, {
254982
+ interval: interval * 1000,
254983
+ timeout: expiresIn * 1000
254984
+ });
254985
+ }, {
254986
+ successMessage: "Authentication completed!",
254987
+ errorMessage: "Authentication failed"
254988
+ });
254989
+ } catch (error48) {
254990
+ if (error48 instanceof Error && error48.message.includes("timed out")) {
254991
+ throw new AuthExpiredError("Authentication timed out. Please try again.");
254992
+ }
254993
+ throw error48;
254994
+ }
254995
+ if (tokenResponse === undefined) {
254996
+ throw new InternalError("Failed to retrieve authentication token.");
254997
+ }
254998
+ return tokenResponse;
254999
+ }
255000
+ async function saveAuthData(response, userInfo) {
255001
+ const expiresAt = Date.now() + response.expiresIn * 1000;
255002
+ await writeAuth({
255003
+ accessToken: response.accessToken,
255004
+ refreshToken: response.refreshToken,
255005
+ expiresAt,
255006
+ email: userInfo.email,
255007
+ name: userInfo.name
255008
+ });
255009
+ }
255010
+ async function login({
255011
+ log,
255012
+ runTask
255013
+ }) {
255014
+ const deviceCodeResponse = await generateAndDisplayDeviceCode(log, runTask);
255015
+ const token = await waitForAuthentication(deviceCodeResponse.deviceCode, deviceCodeResponse.expiresIn, deviceCodeResponse.interval, runTask);
255016
+ const userInfo = await getUserInfo(token.accessToken);
255017
+ await saveAuthData(token, userInfo);
255018
+ return {
255019
+ outroMessage: `Successfully logged in as ${theme.styles.bold(userInfo.email)}`
255020
+ };
255021
+ }
255022
+
255023
+ // src/cli/utils/command/middleware.ts
255024
+ async function ensureAuth(ctx) {
255025
+ if (hasWorkspaceApiKeyAuth()) {
255026
+ ctx.errorReporter.setContext({
255027
+ user: { email: "workspace-api-key", name: "Workspace API key" }
255028
+ });
255029
+ return;
255030
+ }
255031
+ await seedAuthFromEnv();
255032
+ const loggedIn = await isLoggedIn();
255033
+ if (!loggedIn) {
255034
+ ctx.log.info("You need to login first to continue.");
255035
+ await login(ctx);
255036
+ }
255037
+ try {
255038
+ const userInfo = await readAuth();
255039
+ ctx.errorReporter.setContext({
255040
+ user: { email: userInfo.email, name: userInfo.name }
255041
+ });
255042
+ } catch {}
255043
+ }
255044
+ async function ensureAppContext(ctx, options = {}) {
255045
+ const appContext = await initAppContext(options);
255046
+ ctx.app = appContext;
255047
+ ctx.errorReporter.setContext({ appId: appContext.id });
255048
+ }
255049
+
254339
255050
  // src/cli/utils/version-check.ts
254340
255051
  async function checkForUpgrade() {
254341
255052
  const testLatestVersion = getTestOverrides()?.latestVersion;
@@ -254714,587 +255425,6 @@ function formatYaml(data, options = {}) {
254714
255425
  const replacer = stripEmpty ? stripEmptyReplacer : undefined;
254715
255426
  return $stringify(data, replacer, { indent: YAML_INDENT }).trimEnd();
254716
255427
  }
254717
- // src/core/deployments/api.ts
254718
- import { readFile as readFile2 } from "node:fs/promises";
254719
-
254720
- // src/core/deployments/schema.ts
254721
- var GIT_HASH_PATTERN = /^[a-fA-F0-9]{7,64}$/;
254722
- var CreateDeploymentResponseSchema = exports_external.object({
254723
- deployment_id: exports_external.string(),
254724
- asset_buckets: exports_external.array(exports_external.array(exports_external.string()))
254725
- }).transform((data) => ({
254726
- deploymentId: data.deployment_id,
254727
- assetBuckets: data.asset_buckets
254728
- }));
254729
- var AssetUploadResponseSchema = exports_external.looseObject({
254730
- result: exports_external.looseObject({ jwt: exports_external.string().nullable().optional() }).nullable().optional()
254731
- });
254732
- var FinalizeDeploymentResponseSchema = exports_external.object({
254733
- deployment_id: exports_external.string()
254734
- }).transform((data) => ({
254735
- deploymentId: data.deployment_id
254736
- }));
254737
-
254738
- // src/core/deployments/api.ts
254739
- var MODULE_CONTENT_TYPES = {
254740
- esm: "application/javascript+module",
254741
- sourcemap: "application/source-map",
254742
- wasm: "application/wasm",
254743
- text: "text/plain",
254744
- data: "application/octet-stream"
254745
- };
254746
- async function createDeployment(request) {
254747
- const appClient = getAppClient();
254748
- let response;
254749
- try {
254750
- response = await appClient.post("deployments", {
254751
- json: request,
254752
- timeout: 120000
254753
- });
254754
- } catch (error48) {
254755
- throw await ApiError.fromHttpError(error48, "creating deployment");
254756
- }
254757
- const result = CreateDeploymentResponseSchema.safeParse(await response.json());
254758
- if (!result.success) {
254759
- throw new SchemaValidationError("Invalid response from server", result.error);
254760
- }
254761
- return result.data;
254762
- }
254763
- async function uploadAssetBucket(deploymentId, formData) {
254764
- const appClient = getAppClient();
254765
- const response = await appClient.post(`deployments/${encodeURIComponent(deploymentId)}/assets`, {
254766
- searchParams: { base64: "true" },
254767
- body: formData,
254768
- timeout: 120000,
254769
- retry: 0
254770
- });
254771
- const parsed = AssetUploadResponseSchema.safeParse(await response.json());
254772
- const jwt3 = parsed.success ? parsed.data.result?.jwt : null;
254773
- return jwt3 || null;
254774
- }
254775
- async function finalizeDeployment(deploymentId, completionJwt, modules) {
254776
- const appClient = getAppClient();
254777
- const formData = new FormData;
254778
- formData.append("payload", JSON.stringify({ completion_jwt: completionJwt }));
254779
- for (const module of modules) {
254780
- const content = await readFile2(module.absolutePath);
254781
- formData.append(module.name, new File([new Uint8Array(content)], module.name, {
254782
- type: MODULE_CONTENT_TYPES[module.type]
254783
- }));
254784
- }
254785
- let response;
254786
- try {
254787
- response = await appClient.post(`deployments/${encodeURIComponent(deploymentId)}/finalize`, { body: formData, timeout: 180000 });
254788
- } catch (error48) {
254789
- throw await ApiError.fromHttpError(error48, "finalizing deployment");
254790
- }
254791
- const result = FinalizeDeploymentResponseSchema.safeParse(await response.json());
254792
- if (!result.success) {
254793
- throw new SchemaValidationError("Invalid response from server", result.error);
254794
- }
254795
- return result.data;
254796
- }
254797
- // src/core/deployments/manifest.ts
254798
- import { createHash } from "node:crypto";
254799
- import { readdir as readdir2, readFile as readFile3, stat } from "node:fs/promises";
254800
- import { extname, join as join15 } from "node:path";
254801
- var MAX_ASSET_SIZE_BYTES = 25 * 1024 * 1024;
254802
- var MAX_ASSET_COUNT = 1e5;
254803
- var ASSETS_IGNORE_FILE = ".assetsignore";
254804
- var ALWAYS_SKIPPED_FILES = new Set([
254805
- ASSETS_IGNORE_FILE,
254806
- "wrangler.json",
254807
- ".dev.vars"
254808
- ]);
254809
- var MIME_TYPES = {
254810
- ".html": "text/html",
254811
- ".htm": "text/html",
254812
- ".css": "text/css",
254813
- ".js": "text/javascript",
254814
- ".mjs": "text/javascript",
254815
- ".json": "application/json",
254816
- ".map": "application/json",
254817
- ".txt": "text/plain",
254818
- ".xml": "application/xml",
254819
- ".svg": "image/svg+xml",
254820
- ".png": "image/png",
254821
- ".jpg": "image/jpeg",
254822
- ".jpeg": "image/jpeg",
254823
- ".gif": "image/gif",
254824
- ".webp": "image/webp",
254825
- ".avif": "image/avif",
254826
- ".ico": "image/x-icon",
254827
- ".woff": "font/woff",
254828
- ".woff2": "font/woff2",
254829
- ".ttf": "font/ttf",
254830
- ".otf": "font/otf",
254831
- ".eot": "application/vnd.ms-fontobject",
254832
- ".mp3": "audio/mpeg",
254833
- ".mp4": "video/mp4",
254834
- ".webm": "video/webm",
254835
- ".pdf": "application/pdf",
254836
- ".wasm": "application/wasm",
254837
- ".webmanifest": "application/manifest+json"
254838
- };
254839
- function getMimeType(filePath) {
254840
- return MIME_TYPES[extname(filePath).toLowerCase()] ?? "application/octet-stream";
254841
- }
254842
- function hashAsset(appId, content) {
254843
- return createHash("sha256").update(Buffer.from(appId, "utf8")).update(content).digest("hex").slice(0, 32);
254844
- }
254845
- function globToRegExp(glob) {
254846
- let source = "";
254847
- for (let i2 = 0;i2 < glob.length; i2++) {
254848
- const char = glob[i2];
254849
- if (char === "*") {
254850
- if (glob[i2 + 1] === "*") {
254851
- source += ".*";
254852
- i2++;
254853
- } else {
254854
- source += "[^/]*";
254855
- }
254856
- } else if (char === "?") {
254857
- source += "[^/]";
254858
- } else {
254859
- source += char.replace(/[.+^${}()|[\]\\]/g, "\\$&");
254860
- }
254861
- }
254862
- return new RegExp(`^${source}$`);
254863
- }
254864
- function createIgnoreMatcher(lines) {
254865
- const rules = lines.map((line) => line.trim()).filter((line) => line.length > 0 && !line.startsWith("#")).map((line) => {
254866
- const isDirOnly = line.endsWith("/");
254867
- let pattern = isDirOnly ? line.slice(0, -1) : line;
254868
- const anchored = pattern.includes("/");
254869
- pattern = pattern.replace(/^\//, "");
254870
- return { regex: globToRegExp(pattern), anchored, isDirOnly };
254871
- });
254872
- return (relativePath, isDirectory2) => {
254873
- const segments = relativePath.split("/");
254874
- return rules.some((rule) => {
254875
- if (rule.anchored) {
254876
- if (rule.isDirOnly ? isDirectory2 : true) {
254877
- if (rule.regex.test(relativePath))
254878
- return true;
254879
- }
254880
- return false;
254881
- }
254882
- const basename4 = segments[segments.length - 1];
254883
- if (rule.isDirOnly && !isDirectory2)
254884
- return false;
254885
- return rule.regex.test(basename4);
254886
- });
254887
- };
254888
- }
254889
- async function loadIgnoreMatcher(assetsDir) {
254890
- const ignorePath = join15(assetsDir, ASSETS_IGNORE_FILE);
254891
- if (!await pathExists(ignorePath)) {
254892
- return () => false;
254893
- }
254894
- const content = await readTextFile(ignorePath);
254895
- return createIgnoreMatcher(content.split(/\r?\n/));
254896
- }
254897
- async function buildAssetManifest(assetsDir, appId) {
254898
- const isIgnored = await loadIgnoreMatcher(assetsDir);
254899
- const manifest = {};
254900
- const filesByHash = new Map;
254901
- const relativeFilePaths = await collectFilePaths(assetsDir, "", isIgnored);
254902
- if (relativeFilePaths.length > MAX_ASSET_COUNT) {
254903
- throw new InvalidInputError(`Too many static assets: found ${relativeFilePaths.length}, the limit is ${MAX_ASSET_COUNT} files.`);
254904
- }
254905
- for (const relativePath of relativeFilePaths.sort()) {
254906
- const absolutePath = join15(assetsDir, ...relativePath.split("/"));
254907
- const { size } = await stat(absolutePath);
254908
- if (size > MAX_ASSET_SIZE_BYTES) {
254909
- throw new InvalidInputError(`Static asset "${relativePath}" is ${size} bytes, which exceeds the 25 MiB per-file limit.`);
254910
- }
254911
- const content = await readFile3(absolutePath);
254912
- const hash2 = hashAsset(appId, content);
254913
- manifest[`/${relativePath}`] = { hash: hash2, size };
254914
- if (!filesByHash.has(hash2)) {
254915
- filesByHash.set(hash2, {
254916
- absolutePath,
254917
- hash: hash2,
254918
- size,
254919
- contentType: getMimeType(absolutePath)
254920
- });
254921
- }
254922
- }
254923
- return { manifest, filesByHash };
254924
- }
254925
- async function collectFilePaths(dir, relativeDir, isIgnored) {
254926
- const entries = await readdir2(dir, { withFileTypes: true });
254927
- const results = [];
254928
- for (const entry of entries) {
254929
- const relativePath = relativeDir ? `${relativeDir}/${entry.name}` : entry.name;
254930
- if (entry.isDirectory()) {
254931
- if (isIgnored(relativePath, true))
254932
- continue;
254933
- results.push(...await collectFilePaths(join15(dir, entry.name), relativePath, isIgnored));
254934
- continue;
254935
- }
254936
- if (!entry.isFile())
254937
- continue;
254938
- if (ALWAYS_SKIPPED_FILES.has(entry.name))
254939
- continue;
254940
- if (isIgnored(relativePath, false))
254941
- continue;
254942
- results.push(relativePath);
254943
- }
254944
- return results;
254945
- }
254946
-
254947
- // src/core/deployments/modules.ts
254948
- import { stat as stat2 } from "node:fs/promises";
254949
- import { relative as relative3, resolve as resolve4, sep } from "node:path";
254950
- var MAX_TOTAL_MODULE_BYTES = 40 * 1024 * 1024;
254951
- var MODULE_IGNORE = ["wrangler.json", ".dev.vars"];
254952
- var RULE_TYPE_TO_MODULE_TYPE = {
254953
- ESModule: "esm",
254954
- CompiledWasm: "wasm",
254955
- Text: "text",
254956
- Data: "data"
254957
- };
254958
- function toPosix(path16) {
254959
- return path16.split(sep).join("/");
254960
- }
254961
- async function collectModules(config12) {
254962
- const entryPath = resolve4(config12.configDir, config12.main);
254963
- if (!await pathExists(entryPath)) {
254964
- throw new InvalidInputError(`Worker entry module does not exist: ${entryPath} (from "main" in ${config12.configPath})`, {
254965
- hints: [{ message: "Rebuild the project to regenerate the artifact" }]
254966
- });
254967
- }
254968
- const modulesByName = new Map;
254969
- const entryName = toPosix(relative3(config12.configDir, entryPath));
254970
- modulesByName.set(entryName, {
254971
- name: entryName,
254972
- absolutePath: entryPath,
254973
- size: 0,
254974
- type: "esm"
254975
- });
254976
- const ignore = [...MODULE_IGNORE];
254977
- if (config12.assetsDirectory?.startsWith(config12.configDir + sep)) {
254978
- ignore.push(`${toPosix(relative3(config12.configDir, config12.assetsDirectory))}/**`);
254979
- }
254980
- for (const rule of config12.rules) {
254981
- const type = RULE_TYPE_TO_MODULE_TYPE[rule.type];
254982
- if (!type) {
254983
- throw new InvalidInputError(`Unsupported module rule type "${rule.type}" in ${config12.configPath}. Supported: ${Object.keys(RULE_TYPE_TO_MODULE_TYPE).join(", ")}.`);
254984
- }
254985
- const matches = await globby(rule.globs, {
254986
- cwd: config12.configDir,
254987
- onlyFiles: true,
254988
- dot: true,
254989
- ignore
254990
- });
254991
- for (const match of matches.sort()) {
254992
- if (!modulesByName.has(match)) {
254993
- modulesByName.set(match, {
254994
- name: match,
254995
- absolutePath: resolve4(config12.configDir, match),
254996
- size: 0,
254997
- type
254998
- });
254999
- }
255000
- }
255001
- }
255002
- if (config12.uploadSourceMaps) {
255003
- const maps = await globby("**/*.map", {
255004
- cwd: config12.configDir,
255005
- onlyFiles: true,
255006
- dot: true,
255007
- ignore
255008
- });
255009
- for (const map2 of maps.sort()) {
255010
- addSourcemap(modulesByName, config12.configDir, map2);
255011
- }
255012
- } else {
255013
- for (const name2 of [...modulesByName.keys()]) {
255014
- const mapName = `${name2}.map`;
255015
- if (await pathExists(resolve4(config12.configDir, mapName))) {
255016
- addSourcemap(modulesByName, config12.configDir, mapName);
255017
- }
255018
- }
255019
- }
255020
- const modules = [...modulesByName.values()];
255021
- let totalBytes = 0;
255022
- for (const module of modules) {
255023
- module.size = (await stat2(module.absolutePath)).size;
255024
- totalBytes += module.size;
255025
- }
255026
- if (totalBytes > MAX_TOTAL_MODULE_BYTES) {
255027
- throw new InvalidInputError(`Worker modules total ${totalBytes} bytes, which exceeds the 40 MB limit for Base44 full-stack deploys.`);
255028
- }
255029
- return modules;
255030
- }
255031
- function addSourcemap(modulesByName, configDir, name2) {
255032
- if (modulesByName.has(name2))
255033
- return;
255034
- modulesByName.set(name2, {
255035
- name: name2,
255036
- absolutePath: resolve4(configDir, name2),
255037
- size: 0,
255038
- type: "sourcemap"
255039
- });
255040
- }
255041
-
255042
- // src/core/deployments/upload.ts
255043
- import { readFile as readFile4 } from "node:fs/promises";
255044
- var BUCKET_CONCURRENCY = 3;
255045
- var MAX_ATTEMPTS_PER_BUCKET = 3;
255046
- var RETRY_BASE_DELAY_MS = 500;
255047
- var MAX_RATE_LIMIT_WAITS = 10;
255048
- var RATE_LIMIT_DELAY_MS = 15000;
255049
- async function uploadAssetBuckets(deploymentId, buckets, filesByHash, onProgress) {
255050
- if (buckets.length === 0) {
255051
- return null;
255052
- }
255053
- const totalFiles = buckets.reduce((sum, bucket) => sum + bucket.length, 0);
255054
- let uploadedFiles = 0;
255055
- let completedBuckets = 0;
255056
- let completionJwt = null;
255057
- let nextBucket = 0;
255058
- const worker = async () => {
255059
- while (nextBucket < buckets.length) {
255060
- const bucket = buckets[nextBucket++];
255061
- const jwt3 = await uploadBucketWithRetry(deploymentId, bucket, filesByHash);
255062
- if (jwt3) {
255063
- completionJwt = jwt3;
255064
- }
255065
- uploadedFiles += bucket.length;
255066
- completedBuckets++;
255067
- onProgress?.({
255068
- uploadedFiles,
255069
- totalFiles,
255070
- completedBuckets,
255071
- totalBuckets: buckets.length
255072
- });
255073
- }
255074
- };
255075
- await Promise.all(Array.from({ length: Math.min(BUCKET_CONCURRENCY, buckets.length) }, worker));
255076
- if (!completionJwt) {
255077
- throw new ApiError("Asset upload finished but the server did not return a completion token.");
255078
- }
255079
- return completionJwt;
255080
- }
255081
- async function uploadBucketWithRetry(deploymentId, bucket, filesByHash) {
255082
- let lastError;
255083
- let rateLimitWaits = 0;
255084
- const formData = await buildBucketForm(bucket, filesByHash);
255085
- for (let attempt = 0;attempt < MAX_ATTEMPTS_PER_BUCKET; attempt++) {
255086
- if (attempt > 0) {
255087
- await sleep3(RETRY_BASE_DELAY_MS * 2 ** (attempt - 1));
255088
- }
255089
- try {
255090
- return await uploadAssetBucket(deploymentId, formData);
255091
- } catch (error48) {
255092
- if (error48 instanceof HTTPError && error48.response.status === 429 && rateLimitWaits < MAX_RATE_LIMIT_WAITS) {
255093
- rateLimitWaits++;
255094
- attempt--;
255095
- await sleep3(RATE_LIMIT_DELAY_MS);
255096
- continue;
255097
- }
255098
- lastError = error48;
255099
- }
255100
- }
255101
- if (lastError instanceof HTTPError && lastError.response.status === 409) {
255102
- throw new ApiError("This deploy's upload session has expired — rerun deploy. Already-uploaded assets are skipped on the next attempt.", { statusCode: 409, cause: lastError });
255103
- }
255104
- throw await ApiError.fromHttpError(lastError, "uploading static assets");
255105
- }
255106
- async function buildBucketForm(bucket, filesByHash) {
255107
- const formData = new FormData;
255108
- for (const hash2 of bucket) {
255109
- const file2 = filesByHash.get(hash2);
255110
- if (!file2) {
255111
- throw new InternalError(`Server requested upload of unknown asset hash: ${hash2}`);
255112
- }
255113
- const content = await readFile4(file2.absolutePath);
255114
- formData.append(hash2, new File([content.toString("base64")], hash2, { type: file2.contentType }));
255115
- }
255116
- return formData;
255117
- }
255118
- function sleep3(ms) {
255119
- return new Promise((resolve5) => setTimeout(resolve5, ms));
255120
- }
255121
-
255122
- // src/core/deployments/wrangler-config.ts
255123
- import { dirname as dirname10, join as join16, resolve as resolve5 } from "node:path";
255124
- var WRANGLER_REDIRECT_PATH = join16(".wrangler", "deploy", "config.json");
255125
- var RedirectConfigSchema = exports_external.looseObject({
255126
- configPath: exports_external.string().min(1)
255127
- });
255128
- var WranglerConfigSchema = exports_external.looseObject({
255129
- main: exports_external.string().min(1, "wrangler config is missing a 'main' entry module"),
255130
- no_bundle: exports_external.boolean().optional(),
255131
- rules: exports_external.array(exports_external.looseObject({ type: exports_external.string(), globs: exports_external.array(exports_external.string()) })).optional(),
255132
- assets: exports_external.looseObject({
255133
- directory: exports_external.string().optional(),
255134
- html_handling: exports_external.string().optional(),
255135
- not_found_handling: exports_external.string().optional(),
255136
- run_worker_first: exports_external.union([exports_external.boolean(), exports_external.array(exports_external.string())]).optional(),
255137
- headers: exports_external.string().optional(),
255138
- redirects: exports_external.string().optional()
255139
- }).optional(),
255140
- compatibility_date: exports_external.string().optional(),
255141
- compatibility_flags: exports_external.array(exports_external.string()).optional(),
255142
- vars: exports_external.record(exports_external.string(), exports_external.unknown()).optional(),
255143
- upload_source_maps: exports_external.boolean().optional()
255144
- });
255145
- async function detectFullStackArtifact(projectRoot) {
255146
- const redirectPath = join16(projectRoot, WRANGLER_REDIRECT_PATH);
255147
- if (await pathExists(redirectPath)) {
255148
- return { source: "redirect", path: redirectPath };
255149
- }
255150
- for (const name2 of ["wrangler.jsonc", "wrangler.json"]) {
255151
- const configPath = join16(projectRoot, name2);
255152
- if (await pathExists(configPath)) {
255153
- return { source: "root-config", path: configPath };
255154
- }
255155
- }
255156
- const tomlPath = join16(projectRoot, "wrangler.toml");
255157
- if (await pathExists(tomlPath)) {
255158
- return { source: "toml", path: tomlPath };
255159
- }
255160
- return null;
255161
- }
255162
- async function resolveWranglerConfig(projectRoot) {
255163
- const artifact = await detectFullStackArtifact(projectRoot);
255164
- if (!artifact) {
255165
- throw new InvalidInputError("No full-stack build artifact found. Expected a .wrangler/deploy/config.json redirect file or a root wrangler.jsonc.", {
255166
- hints: [{ message: "Run your framework's build command first" }]
255167
- });
255168
- }
255169
- if (artifact.source === "toml") {
255170
- throw new InvalidInputError("wrangler.toml is not supported for Base44 full-stack deploys. Convert your config to wrangler.jsonc.");
255171
- }
255172
- const configPath = artifact.source === "redirect" ? await resolveRedirectedConfigPath(artifact.path) : artifact.path;
255173
- const parsed = await readJsonFile(configPath);
255174
- const result = WranglerConfigSchema.safeParse(parsed);
255175
- if (!result.success) {
255176
- throw new ConfigInvalidError(`Invalid wrangler config: ${exports_external.prettifyError(result.error)}`, configPath);
255177
- }
255178
- const config12 = result.data;
255179
- if (config12.no_bundle !== true) {
255180
- 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).");
255181
- }
255182
- const configDir = dirname10(configPath);
255183
- const assetsDirectory = config12.assets?.directory ? resolve5(configDir, config12.assets.directory) : null;
255184
- return {
255185
- configPath,
255186
- configDir,
255187
- main: config12.main,
255188
- assetsDirectory,
255189
- assetsConfig: config12.assets ? toResolvedAssetsConfig(config12.assets) : null,
255190
- compatibilityDate: config12.compatibility_date ?? null,
255191
- compatibilityFlags: config12.compatibility_flags ?? [],
255192
- vars: config12.vars ?? {},
255193
- rules: (config12.rules ?? []).map((rule) => ({
255194
- type: rule.type,
255195
- globs: rule.globs
255196
- })),
255197
- uploadSourceMaps: config12.upload_source_maps ?? false
255198
- };
255199
- }
255200
- async function resolveRedirectedConfigPath(redirectPath) {
255201
- const parsed = await readJsonFile(redirectPath);
255202
- const result = RedirectConfigSchema.safeParse(parsed);
255203
- if (!result.success) {
255204
- throw new ConfigInvalidError(`Invalid deploy redirect file: ${exports_external.prettifyError(result.error)}`, redirectPath);
255205
- }
255206
- const configPath = resolve5(dirname10(redirectPath), result.data.configPath);
255207
- if (!await pathExists(configPath)) {
255208
- throw new ConfigInvalidError(`Wrangler config referenced by ${redirectPath} does not exist: ${configPath}`, redirectPath, {
255209
- hints: [{ message: "Rebuild the project to regenerate the artifact" }]
255210
- });
255211
- }
255212
- return configPath;
255213
- }
255214
- function toResolvedAssetsConfig(assets) {
255215
- return {
255216
- htmlHandling: assets.html_handling,
255217
- notFoundHandling: assets.not_found_handling,
255218
- runWorkerFirst: assets.run_worker_first,
255219
- headers: assets.headers,
255220
- redirects: assets.redirects
255221
- };
255222
- }
255223
-
255224
- // src/core/deployments/deploy.ts
255225
- async function resolveGitHash(projectRoot, explicit) {
255226
- const hash2 = explicit ?? await gitHead(projectRoot);
255227
- if (!hash2 || !GIT_HASH_PATTERN.test(hash2)) {
255228
- throw new InvalidInputError(explicit ? `'${explicit}' is not a git commit hash.` : "Full-stack deployments are addressed by the commit that produced the build, and no git commit was found.", {
255229
- hints: [
255230
- {
255231
- message: "Run the deploy from a git checkout, or pass the commit explicitly with --git-hash."
255232
- }
255233
- ]
255234
- });
255235
- }
255236
- return hash2;
255237
- }
255238
- async function gitHead(projectRoot) {
255239
- try {
255240
- const { stdout } = await execa("git", ["rev-parse", "HEAD"], {
255241
- cwd: projectRoot
255242
- });
255243
- return stdout.trim();
255244
- } catch {
255245
- return null;
255246
- }
255247
- }
255248
- async function deployFullStack(options) {
255249
- const { projectRoot, gitHash, progress } = options;
255250
- const config12 = await resolveWranglerConfig(projectRoot);
255251
- if (!config12.compatibilityFlags.includes("nodejs_compat")) {
255252
- 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.");
255253
- }
255254
- if (config12.vars && Object.keys(config12.vars).length > 0) {
255255
- progress?.onWarning?.("wrangler 'vars' are not supported and were ignored — a worker's environment comes from the app's secrets (base44 secrets set).");
255256
- }
255257
- const modules = await collectModules(config12);
255258
- let assets = { manifest: {}, filesByHash: new Map };
255259
- if (config12.assetsDirectory && await pathExists(config12.assetsDirectory)) {
255260
- assets = await buildAssetManifest(config12.assetsDirectory, getAppContext().id);
255261
- }
255262
- const created = await createDeployment({
255263
- git_hash: gitHash,
255264
- config: {
255265
- main: config12.main,
255266
- compatibility_date: config12.compatibilityDate,
255267
- compatibility_flags: config12.compatibilityFlags,
255268
- assets: buildAssetsConfig(config12.assetsConfig, progress)
255269
- },
255270
- asset_manifest: assets.manifest
255271
- });
255272
- const totalAssets = Object.keys(assets.manifest).length;
255273
- const newAssets = new Set(created.assetBuckets.flat()).size;
255274
- progress?.onAssets?.({ totalAssets, newAssets });
255275
- const completionJwt = await uploadAssetBuckets(created.deploymentId, created.assetBuckets, assets.filesByHash, progress?.onAssetUpload);
255276
- progress?.onWorker?.({ moduleCount: modules.length });
255277
- const finalized = await finalizeDeployment(created.deploymentId, completionJwt, modules);
255278
- return { deploymentId: finalized.deploymentId, gitHash };
255279
- }
255280
- function buildAssetsConfig(assetsConfig, progress) {
255281
- if (!assetsConfig)
255282
- return null;
255283
- if (assetsConfig.headers || assetsConfig.redirects) {
255284
- progress?.onWarning?.("_headers/_redirects files are not supported yet and were ignored for this deploy.");
255285
- }
255286
- let runWorkerFirst;
255287
- if (Array.isArray(assetsConfig.runWorkerFirst)) {
255288
- progress?.onWarning?.("'run_worker_first' route patterns are not supported yet and were ignored for this deploy.");
255289
- } else {
255290
- runWorkerFirst = assetsConfig.runWorkerFirst;
255291
- }
255292
- return {
255293
- html_handling: assetsConfig.htmlHandling,
255294
- not_found_handling: assetsConfig.notFoundHandling,
255295
- run_worker_first: runWorkerFirst
255296
- };
255297
- }
255298
255428
  // src/core/utils/dependencies.ts
255299
255429
  import { spawnSync as spawnSync2 } from "node:child_process";
255300
255430
  function verifyDenoInstalled(context) {
@@ -255383,7 +255513,7 @@ async function pullAction({
255383
255513
  runTask: runTask2
255384
255514
  }) {
255385
255515
  const { project: project2 } = await readProjectConfig();
255386
- const dir = join17(dirname11(project2.configPath), project2.agentSkillsDir);
255516
+ const dir = join18(dirname11(project2.configPath), project2.agentSkillsDir);
255387
255517
  const remote = await runTask2("Fetching agent skills from Base44", () => fetchAgentSkills(), {
255388
255518
  successMessage: "Agent skills fetched successfully",
255389
255519
  errorMessage: "Failed to fetch agent skills"
@@ -255439,14 +255569,14 @@ function getAgentSkillsCommand() {
255439
255569
  }
255440
255570
 
255441
255571
  // src/cli/commands/agents/pull.ts
255442
- import { dirname as dirname12, join as join18 } from "node:path";
255572
+ import { dirname as dirname12, join as join19 } from "node:path";
255443
255573
  async function pullAgentsAction({
255444
255574
  log,
255445
255575
  runTask: runTask2
255446
255576
  }) {
255447
255577
  const { project: project2 } = await readProjectConfig();
255448
255578
  const configDir = dirname12(project2.configPath);
255449
- const agentsDir = join18(configDir, project2.agentsDir);
255579
+ const agentsDir = join19(configDir, project2.agentsDir);
255450
255580
  const remoteAgents = await runTask2("Fetching agents from Base44", async () => {
255451
255581
  return await fetchAgents();
255452
255582
  }, {
@@ -255516,12 +255646,12 @@ function getAgentsCommand() {
255516
255646
  }
255517
255647
 
255518
255648
  // src/cli/commands/auth/password-login.ts
255519
- import { dirname as dirname13, join as join19 } from "node:path";
255649
+ import { dirname as dirname13, join as join20 } from "node:path";
255520
255650
  async function passwordLoginAction({ log, runTask: runTask2 }, action) {
255521
255651
  const shouldEnable = action === "enable";
255522
255652
  const { project: project2 } = await readProjectConfig();
255523
255653
  const configDir = dirname13(project2.configPath);
255524
- const authDir = join19(configDir, project2.authDir);
255654
+ const authDir = join20(configDir, project2.authDir);
255525
255655
  const updated = await runTask2("Updating local auth config", async () => {
255526
255656
  const current = await readAuthConfig(authDir) ?? DEFAULT_AUTH_CONFIG;
255527
255657
  const merged = { ...current, enableUsernamePassword: shouldEnable };
@@ -255541,14 +255671,14 @@ function getPasswordLoginCommand() {
255541
255671
  }
255542
255672
 
255543
255673
  // src/cli/commands/auth/pull.ts
255544
- import { dirname as dirname14, join as join20 } from "node:path";
255674
+ import { dirname as dirname14, join as join21 } from "node:path";
255545
255675
  async function pullAuthAction({
255546
255676
  log,
255547
255677
  runTask: runTask2
255548
255678
  }) {
255549
255679
  const { project: project2 } = await readProjectConfig();
255550
255680
  const configDir = dirname14(project2.configPath);
255551
- const authDir = join20(configDir, project2.authDir);
255681
+ const authDir = join21(configDir, project2.authDir);
255552
255682
  const remoteConfig = await runTask2("Fetching auth config from Base44", async () => {
255553
255683
  return await pullAuthConfig();
255554
255684
  }, {
@@ -255612,7 +255742,7 @@ function getAuthPushCommand() {
255612
255742
  }
255613
255743
 
255614
255744
  // src/cli/commands/auth/social-login.ts
255615
- import { dirname as dirname15, join as join21, resolve as resolve6 } from "node:path";
255745
+ import { dirname as dirname15, join as join22, resolve as resolve7 } from "node:path";
255616
255746
  var PROVIDER_LABELS = {
255617
255747
  google: "Google",
255618
255748
  microsoft: "Microsoft",
@@ -255652,7 +255782,7 @@ async function socialLoginAction({ log, isNonInteractive, runTask: runTask2 }, p
255652
255782
  let clientSecret;
255653
255783
  if (useCustomOAuth && oauth && oauthCli && hasSecretOptions(options)) {
255654
255784
  if (options.envFile) {
255655
- const secrets = await parseEnvFile(resolve6(options.envFile));
255785
+ const secrets = await parseEnvFile(resolve7(options.envFile));
255656
255786
  const value = secrets[oauthCli.envVar];
255657
255787
  if (!value) {
255658
255788
  throw new InvalidInputError(`Key "${oauthCli.envVar}" not found in ${options.envFile}.`);
@@ -255683,7 +255813,7 @@ async function socialLoginAction({ log, isNonInteractive, runTask: runTask2 }, p
255683
255813
  }
255684
255814
  const { project: project2 } = await readProjectConfig();
255685
255815
  const configDir = dirname15(project2.configPath);
255686
- const authDir = join21(configDir, project2.authDir);
255816
+ const authDir = join22(configDir, project2.authDir);
255687
255817
  const { config: updated } = await runTask2("Updating local auth config", async () => updateSocialLoginConfig(authDir, provider, shouldEnable, useCustomOAuth && options.clientId ? { clientId: options.clientId } : undefined));
255688
255818
  if (clientSecret) {
255689
255819
  await runTask2("Saving client secret", async () => pushCustomOAuthSecret(provider, clientSecret));
@@ -255708,7 +255838,7 @@ function getSocialLoginCommand() {
255708
255838
  }
255709
255839
 
255710
255840
  // src/cli/commands/auth/sso.ts
255711
- import { dirname as dirname16, join as join22, resolve as resolve7 } from "node:path";
255841
+ import { dirname as dirname16, join as join23, resolve as resolve8 } from "node:path";
255712
255842
  var SSOConfigFileSchema = exports_external.object({
255713
255843
  provider: exports_external.enum(Object.values(KNOWN_SSO_PROVIDERS)),
255714
255844
  clientId: exports_external.string(),
@@ -255724,7 +255854,7 @@ var SSOConfigFileSchema = exports_external.object({
255724
255854
  ssoName: exports_external.string().optional()
255725
255855
  });
255726
255856
  async function loadSSOConfigFile(filePath) {
255727
- const resolved = resolve7(filePath);
255857
+ const resolved = resolve8(filePath);
255728
255858
  const raw2 = await readJsonFile(resolved);
255729
255859
  const result = SSOConfigFileSchema.safeParse(raw2);
255730
255860
  if (!result.success) {
@@ -255812,7 +255942,7 @@ async function ssoEnableAction({ isNonInteractive, runTask: runTask2 }, options)
255812
255942
  }
255813
255943
  let clientSecret;
255814
255944
  if (merged.envFile && !merged.clientSecret) {
255815
- const secrets2 = await parseEnvFile(resolve7(merged.envFile));
255945
+ const secrets2 = await parseEnvFile(resolve8(merged.envFile));
255816
255946
  const value = secrets2.sso_client_secret;
255817
255947
  if (!value) {
255818
255948
  throw new InvalidInputError(`Key "sso_client_secret" not found in ${merged.envFile}.`);
@@ -255872,7 +256002,7 @@ async function ssoEnableAction({ isNonInteractive, runTask: runTask2 }, options)
255872
256002
  }
255873
256003
  const { project: project2 } = await readProjectConfig();
255874
256004
  const configDir = dirname16(project2.configPath);
255875
- const authDir = join22(configDir, project2.authDir);
256005
+ const authDir = join23(configDir, project2.authDir);
255876
256006
  await runTask2("Updating local auth config", async () => updateSSOConfig(authDir, provider, true));
255877
256007
  await runTask2("Saving SSO credentials", async () => pushSSOSecrets(secrets));
255878
256008
  return {
@@ -255888,7 +256018,7 @@ async function ssoDisableAction({ log, runTask: runTask2 }, options) {
255888
256018
  }
255889
256019
  const { project: project2 } = await readProjectConfig();
255890
256020
  const configDir = dirname16(project2.configPath);
255891
- const authDir = join22(configDir, project2.authDir);
256021
+ const authDir = join23(configDir, project2.authDir);
255892
256022
  const updated = await runTask2("Updating local auth config", async () => updateSSOConfig(authDir, null, false));
255893
256023
  await runTask2("Removing SSO credentials", async () => deleteSSOSecrets());
255894
256024
  if (!hasAnyLoginMethod(updated)) {
@@ -256450,19 +256580,19 @@ var baseOpen = async (options) => {
256450
256580
  }
256451
256581
  const subprocess = childProcess3.spawn(command2, cliArguments, childProcessOptions);
256452
256582
  if (options.wait) {
256453
- return new Promise((resolve8, reject) => {
256583
+ return new Promise((resolve9, reject) => {
256454
256584
  subprocess.once("error", reject);
256455
256585
  subprocess.once("close", (exitCode) => {
256456
256586
  if (!options.allowNonzeroExitCode && exitCode !== 0) {
256457
256587
  reject(new Error(`Exited with code ${exitCode}`));
256458
256588
  return;
256459
256589
  }
256460
- resolve8(subprocess);
256590
+ resolve9(subprocess);
256461
256591
  });
256462
256592
  });
256463
256593
  }
256464
256594
  if (isFallbackAttempt) {
256465
- return new Promise((resolve8, reject) => {
256595
+ return new Promise((resolve9, reject) => {
256466
256596
  subprocess.once("error", reject);
256467
256597
  subprocess.once("spawn", () => {
256468
256598
  subprocess.once("close", (exitCode) => {
@@ -256472,17 +256602,17 @@ var baseOpen = async (options) => {
256472
256602
  return;
256473
256603
  }
256474
256604
  subprocess.unref();
256475
- resolve8(subprocess);
256605
+ resolve9(subprocess);
256476
256606
  });
256477
256607
  });
256478
256608
  });
256479
256609
  }
256480
256610
  subprocess.unref();
256481
- return new Promise((resolve8, reject) => {
256611
+ return new Promise((resolve9, reject) => {
256482
256612
  subprocess.once("error", reject);
256483
256613
  subprocess.once("spawn", () => {
256484
256614
  subprocess.off("error", reject);
256485
- resolve8(subprocess);
256615
+ resolve9(subprocess);
256486
256616
  });
256487
256617
  });
256488
256618
  };
@@ -256745,13 +256875,13 @@ function getConnectorsListAvailableCommand() {
256745
256875
  }
256746
256876
 
256747
256877
  // src/cli/commands/connectors/pull.ts
256748
- import { dirname as dirname17, join as join23, resolve as resolve8 } from "node:path";
256878
+ import { dirname as dirname17, join as join24, resolve as resolve9 } from "node:path";
256749
256879
  async function resolveConnectorsDir(options) {
256750
256880
  if (!getAppContext().projectRoot) {
256751
- return resolve8(options.dir ?? "connectors");
256881
+ return resolve9(options.dir ?? "connectors");
256752
256882
  }
256753
256883
  const { project: project2 } = await readProjectConfig();
256754
- return join23(dirname17(project2.configPath), project2.connectorsDir);
256884
+ return join24(dirname17(project2.configPath), project2.connectorsDir);
256755
256885
  }
256756
256886
  async function pullConnectorsAction({ log, runTask: runTask2, jsonMode }, options) {
256757
256887
  const connectorsDir = await resolveConnectorsDir(options);
@@ -256792,10 +256922,10 @@ function getConnectorsPullCommand() {
256792
256922
  }
256793
256923
 
256794
256924
  // src/cli/commands/connectors/push.ts
256795
- import { resolve as resolve9 } from "node:path";
256925
+ import { resolve as resolve10 } from "node:path";
256796
256926
  async function readConnectorsToPush(options) {
256797
256927
  if (!getAppContext().projectRoot) {
256798
- return readAllConnectors(resolve9(options.dir ?? "connectors"));
256928
+ return readAllConnectors(resolve10(options.dir ?? "connectors"));
256799
256929
  }
256800
256930
  const { connectors } = await readProjectConfig();
256801
256931
  return connectors;
@@ -257159,11 +257289,11 @@ function getListCommand() {
257159
257289
  }
257160
257290
 
257161
257291
  // src/cli/commands/functions/pull.ts
257162
- import { dirname as dirname18, join as join24 } from "node:path";
257292
+ import { dirname as dirname18, join as join25 } from "node:path";
257163
257293
  async function pullFunctionsAction({ log, runTask: runTask2 }, name2) {
257164
257294
  const { project: project2, functions } = await readProjectConfig();
257165
257295
  const configDir = dirname18(project2.configPath);
257166
- const functionsDir = join24(configDir, project2.functionsDir);
257296
+ const functionsDir = join25(configDir, project2.functionsDir);
257167
257297
  const pluginFunctionNames = new Set(functions.filter((fn) => fn.source.type === "plugin").map((fn) => fn.name));
257168
257298
  const remoteFunctions = await runTask2("Fetching functions from Base44", async () => {
257169
257299
  const { functions: functions2 } = await listDeployedFunctions();
@@ -257221,12 +257351,86 @@ function getFunctionsCommand() {
257221
257351
  return new Command("functions").description("Manage backend functions").addCommand(getDeployCommand()).addCommand(getDeleteCommand()).addCommand(getListCommand()).addCommand(getPullCommand());
257222
257352
  }
257223
257353
 
257354
+ // src/cli/commands/project/site-build.ts
257355
+ async function runSiteBuild({ runTask: runTask2 }, { root, buildCommand, appId }) {
257356
+ if (!buildCommand) {
257357
+ throw new ConfigNotFoundError("No site build command found.", {
257358
+ hints: [
257359
+ {
257360
+ message: `Add 'site.buildCommand' to your config.jsonc (e.g., "site": { "buildCommand": "npm run build" })`
257361
+ }
257362
+ ]
257363
+ });
257364
+ }
257365
+ await runTask2("Building site...", () => execa({
257366
+ cwd: root,
257367
+ shell: true,
257368
+ env: { VITE_BASE44_APP_ID: appId }
257369
+ })`${buildCommand}`, {
257370
+ successMessage: "Site built successfully",
257371
+ errorMessage: "Build failed"
257372
+ });
257373
+ }
257374
+ async function maybeBuildBeforeDeploy(ctx, project2, build) {
257375
+ if (!ctx.app) {
257376
+ return;
257377
+ }
257378
+ if (build === true) {
257379
+ await runSiteBuild(ctx, {
257380
+ root: project2.root,
257381
+ buildCommand: project2.site?.buildCommand,
257382
+ appId: ctx.app.id
257383
+ });
257384
+ return;
257385
+ }
257386
+ if (build === false || !project2.site?.outputDirectory) {
257387
+ return;
257388
+ }
257389
+ const shouldBuild = await shouldAskToBuild(ctx.isNonInteractive, project2.site.buildCommand);
257390
+ if (shouldBuild) {
257391
+ await runSiteBuild(ctx, {
257392
+ root: project2.root,
257393
+ buildCommand: project2.site.buildCommand,
257394
+ appId: ctx.app.id
257395
+ });
257396
+ }
257397
+ }
257398
+ async function shouldAskToBuild(isNonInteractive, buildCommand) {
257399
+ if (!buildCommand || isNonInteractive) {
257400
+ return false;
257401
+ }
257402
+ const answer = await Re({
257403
+ message: `Build the site first? (runs '${buildCommand}' with your app id)`
257404
+ });
257405
+ return !Ct(answer) && answer;
257406
+ }
257407
+
257408
+ // src/cli/commands/project/build.ts
257409
+ async function buildAction(ctx) {
257410
+ const { app } = ctx;
257411
+ if (!app?.projectRoot) {
257412
+ throw new ConfigInvalidError("base44 build requires a linked local project. Run it from a project with base44/.app.jsonc.");
257413
+ }
257414
+ const { project: project2 } = await readProjectConfig(app.projectRoot);
257415
+ await runSiteBuild(ctx, {
257416
+ root: project2.root,
257417
+ buildCommand: project2.site?.buildCommand,
257418
+ appId: app.id
257419
+ });
257420
+ return {
257421
+ outroMessage: `Site built with app id ${theme.styles.bold(app.id)}`
257422
+ };
257423
+ }
257424
+ function getBuildCommand() {
257425
+ return new Base44Command("build").description("Build the site with the Base44 app id injected").action(buildAction);
257426
+ }
257427
+
257224
257428
  // src/cli/commands/project/create.ts
257225
- import { basename as basename4, resolve as resolve10 } from "node:path";
257429
+ import { basename as basename4, resolve as resolve11 } from "node:path";
257226
257430
  var import_kebabCase = __toESM(require_kebabCase(), 1);
257227
257431
 
257228
257432
  // src/cli/commands/project/scaffold-shared.ts
257229
- import { join as join25 } from "node:path";
257433
+ import { join as join26 } from "node:path";
257230
257434
  var DEFAULT_TEMPLATE_ID = "backend-only";
257231
257435
  async function getTemplateById(templateId) {
257232
257436
  const templates = await listTemplates();
@@ -257285,7 +257489,7 @@ async function completeProjectSetup({
257285
257489
  updateMessage("Building project...");
257286
257490
  await execa({ cwd: resolvedPath, shell: true })`${buildCommand}`;
257287
257491
  updateMessage("Deploying site...");
257288
- return await deploySite(join25(resolvedPath, outputDirectory));
257492
+ return await deploySite(join26(resolvedPath, outputDirectory));
257289
257493
  }, {
257290
257494
  successMessage: theme.colors.base44Orange("Site deployed successfully"),
257291
257495
  errorMessage: "Failed to deploy site"
@@ -257414,7 +257618,7 @@ async function createInteractive(options, ctx) {
257414
257618
  }, ctx);
257415
257619
  }
257416
257620
  async function createNonInteractive(options, ctx) {
257417
- ctx.log.info(`Creating a new project at ${resolve10(options.path)}`);
257621
+ ctx.log.info(`Creating a new project at ${resolve11(options.path)}`);
257418
257622
  const template2 = await getTemplateById(options.template ?? DEFAULT_TEMPLATE_ID);
257419
257623
  return await executeCreate({
257420
257624
  template: template2,
@@ -257438,7 +257642,7 @@ async function executeCreate({
257438
257642
  }, ctx) {
257439
257643
  const { log, runTask: runTask2 } = ctx;
257440
257644
  const name2 = rawName.trim();
257441
- const resolvedPath = resolve10(projectPath);
257645
+ const resolvedPath = resolve11(projectPath);
257442
257646
  const organizationId = await resolveWorkspaceId(ctx, flagWorkspaceId, isInteractive);
257443
257647
  const { projectId } = await runTask2("Setting up your project...", async () => {
257444
257648
  return await createProjectFiles({
@@ -257488,21 +257692,72 @@ Examples:
257488
257692
  $ base44 create my-app --workspace 507f1f77bcf86cd799439011 Creates a base44 project in the given workspace`).hook("preAction", validateCreateOptions).action(createAction);
257489
257693
  }
257490
257694
 
257695
+ // src/cli/commands/site/run-app-deploy.ts
257696
+ var TASK_LABELS = {
257697
+ "full-stack": {
257698
+ start: "Deploying full-stack app...",
257699
+ success: theme.colors.base44Orange("Full-stack app deployed"),
257700
+ error: "Full-stack deploy failed"
257701
+ },
257702
+ "static-deployment": {
257703
+ start: "Deploying site...",
257704
+ success: "Site deployed",
257705
+ error: "Site deploy failed"
257706
+ },
257707
+ static: {
257708
+ start: "Creating archive and deploying site...",
257709
+ success: "Site deployed successfully",
257710
+ error: "Deployment failed"
257711
+ }
257712
+ };
257713
+ async function runAppSiteDeploy({ runTask: runTask2, log }, target, options = {}) {
257714
+ const kind = await detectAppDeployKind(target);
257715
+ if (kind === "none")
257716
+ return { kind: "none" };
257717
+ const labels = TASK_LABELS[kind];
257718
+ const progressLines = [];
257719
+ const warnings = [];
257720
+ const result = await runTask2(labels.start, async (updateMessage) => await deployAppSite(target, {
257721
+ gitHash: options.gitHash,
257722
+ progress: {
257723
+ onWarning: (message) => {
257724
+ warnings.push(message);
257725
+ },
257726
+ onAssets: ({ totalAssets, newAssets }) => {
257727
+ const line = `Found ${totalAssets} static assets (${newAssets} new)`;
257728
+ progressLines.push(line);
257729
+ updateMessage(line);
257730
+ },
257731
+ onAssetUpload: ({ uploadedFiles, totalFiles }) => {
257732
+ updateMessage(`Uploaded ${uploadedFiles} of ${totalFiles} assets`);
257733
+ },
257734
+ onWorker: ({ moduleCount }) => {
257735
+ updateMessage(`Deploying worker (${moduleCount} modules)…`);
257736
+ }
257737
+ }
257738
+ }), {
257739
+ successMessage: labels.success,
257740
+ errorMessage: labels.error
257741
+ });
257742
+ for (const line of progressLines) {
257743
+ log.message(theme.styles.dim(line));
257744
+ }
257745
+ for (const warning of warnings) {
257746
+ log.warn(warning);
257747
+ }
257748
+ return result;
257749
+ }
257750
+
257491
257751
  // src/cli/commands/project/deploy.ts
257492
- import { resolve as resolve11 } from "node:path";
257493
257752
  async function deployAction(ctx, options = {}) {
257494
257753
  const { isNonInteractive, log } = ctx;
257495
257754
  if (isNonInteractive && !options.yes) {
257496
257755
  throw new InvalidInputError("--yes is required in non-interactive mode");
257497
257756
  }
257498
- if (options.build && options.prebuilt) {
257499
- throw new InvalidInputError("--build and --prebuilt cannot be combined.");
257500
- }
257501
257757
  const projectData = await readProjectConfig(options.projectRoot);
257502
257758
  const { project: project2, entities, functions, agents, connectors, authConfig } = projectData;
257503
- let fullStackArtifact = await detectFullStackArtifact(project2.root);
257504
- const isFullStackCandidate = fullStackArtifact !== null || Boolean(project2.site?.buildCommand);
257505
- if (!hasResourcesToDeploy(projectData) && !isFullStackCandidate) {
257759
+ const plannedSite = await detectAppDeployKind(project2);
257760
+ if (!hasResourcesToDeploy(projectData) && plannedSite === "none") {
257506
257761
  return {
257507
257762
  outroMessage: "No resources found to deploy"
257508
257763
  };
@@ -257526,7 +257781,7 @@ async function deployAction(ctx, options = {}) {
257526
257781
  if (project2.visibility) {
257527
257782
  summaryLines.push(` - Visibility: ${project2.visibility}`);
257528
257783
  }
257529
- if (fullStackArtifact) {
257784
+ if (plannedSite === "full-stack") {
257530
257785
  summaryLines.push(" - Full-stack app");
257531
257786
  } else if (project2.site?.outputDirectory) {
257532
257787
  summaryLines.push(` - Site from ${project2.site.outputDirectory}`);
@@ -257546,6 +257801,7 @@ ${summaryLines.join(`
257546
257801
  ${summaryLines.join(`
257547
257802
  `)}`);
257548
257803
  }
257804
+ await maybeBuildBeforeDeploy(ctx, project2, options.build);
257549
257805
  let functionCompleted = 0;
257550
257806
  const functionTotal = functions.length;
257551
257807
  const result = await deployAll(projectData, {
@@ -257562,16 +257818,9 @@ ${summaryLines.join(`
257562
257818
  formatDeployResult(r, log);
257563
257819
  }
257564
257820
  });
257565
- await buildSiteIfNeeded(ctx, projectData, options, fullStackArtifact);
257566
- fullStackArtifact = await detectFullStackArtifact(project2.root);
257567
- let appUrl;
257568
- let fullStackResult;
257569
- if (fullStackArtifact) {
257570
- fullStackResult = await runFullStackDeploy(ctx, project2.root, options);
257571
- } else if (project2.site?.outputDirectory) {
257572
- const outputDir = resolve11(project2.root, project2.site.outputDirectory);
257573
- ({ appUrl } = await deploySite(outputDir));
257574
- }
257821
+ const siteResult = await runAppSiteDeploy(ctx, project2, {
257822
+ gitHash: options.gitHash
257823
+ });
257575
257824
  const connectorResults = result.connectorResults ?? [];
257576
257825
  await handleOAuthConnectors(connectorResults, isNonInteractive, options, log);
257577
257826
  const stripeResult = connectorResults.find((r) => r.type === "stripe");
@@ -257579,80 +257828,27 @@ ${summaryLines.join(`
257579
257828
  printStripeResult(stripeResult, log);
257580
257829
  }
257581
257830
  log.message(`${theme.styles.header("Dashboard")}: ${theme.colors.links(getDashboardUrl())}`);
257582
- if (appUrl) {
257583
- log.message(`${theme.styles.header("App URL")}: ${theme.colors.links(appUrl)}`);
257831
+ if (siteResult.kind === "static") {
257832
+ log.message(`${theme.styles.header("App URL")}: ${theme.colors.links(siteResult.appUrl)}`);
257584
257833
  }
257585
- if (fullStackResult) {
257586
- printFullStackSummary(fullStackResult, log);
257834
+ const deployment = siteResult.kind === "full-stack" || siteResult.kind === "static-deployment" ? siteResult : undefined;
257835
+ if (deployment) {
257836
+ printDeploymentSummary(deployment, log);
257587
257837
  }
257588
257838
  return {
257589
257839
  outroMessage: "App deployed successfully",
257590
- stdout: ctx.jsonMode && fullStackResult ? `${JSON.stringify({
257591
- deploymentId: fullStackResult.deploymentId,
257592
- gitHash: fullStackResult.gitHash
257840
+ stdout: ctx.jsonMode && deployment ? `${JSON.stringify({
257841
+ deploymentId: deployment.deploymentId,
257842
+ gitHash: deployment.gitHash
257593
257843
  }, null, 2)}
257594
257844
  ` : undefined
257595
257845
  };
257596
257846
  }
257597
- async function buildSiteIfNeeded({ runTask: runTask2 }, { project: project2 }, options, fullStackArtifact) {
257598
- const site2 = project2.site;
257599
- if (!site2?.buildCommand || options.prebuilt)
257600
- return;
257601
- const artifactPresent = fullStackArtifact !== null || (site2.outputDirectory ? await pathExists(resolve11(project2.root, site2.outputDirectory)) : false);
257602
- if (artifactPresent && !options.build)
257603
- return;
257604
- const { installCommand, buildCommand } = site2;
257605
- await runTask2(installCommand ? "Installing dependencies..." : "Building project...", async (updateMessage) => {
257606
- if (installCommand) {
257607
- await execa({ cwd: project2.root, shell: true })`${installCommand}`;
257608
- updateMessage("Building project...");
257609
- }
257610
- await execa({ cwd: project2.root, shell: true })`${buildCommand}`;
257611
- }, {
257612
- successMessage: "Project built successfully",
257613
- errorMessage: "Failed to build project"
257614
- });
257615
- }
257616
- async function runFullStackDeploy({ runTask: runTask2, log }, projectRoot, options) {
257617
- const gitHash = await resolveGitHash(projectRoot, options.gitHash);
257618
- const progressLines = [];
257619
- const warnings = [];
257620
- const deployment = await runTask2("Deploying full-stack app...", async (updateMessage) => await deployFullStack({
257621
- projectRoot,
257622
- gitHash,
257623
- progress: {
257624
- onWarning: (message) => {
257625
- warnings.push(message);
257626
- },
257627
- onAssets: ({ totalAssets, newAssets }) => {
257628
- const line = `Found ${totalAssets} static assets (${newAssets} new)`;
257629
- progressLines.push(line);
257630
- updateMessage(line);
257631
- },
257632
- onAssetUpload: ({ uploadedFiles, totalFiles }) => {
257633
- updateMessage(`Uploaded ${uploadedFiles} of ${totalFiles} assets`);
257634
- },
257635
- onWorker: ({ moduleCount }) => {
257636
- updateMessage(`Deploying worker (${moduleCount} modules)…`);
257637
- }
257638
- }
257639
- }), {
257640
- successMessage: theme.colors.base44Orange("Full-stack app deployed"),
257641
- errorMessage: "Full-stack deploy failed"
257642
- });
257643
- for (const line of progressLines) {
257644
- log.message(theme.styles.dim(line));
257645
- }
257646
- for (const warning of warnings) {
257647
- log.warn(warning);
257648
- }
257649
- return deployment;
257650
- }
257651
- function printFullStackSummary(deployment, log) {
257847
+ function printDeploymentSummary(deployment, log) {
257652
257848
  log.message(`${theme.styles.header("Deployment")}: ${deployment.deploymentId} ${theme.styles.dim(`(commit ${deployment.gitHash.slice(0, 12)})`)}`);
257653
257849
  }
257654
257850
  function getDeployCommand2() {
257655
- return new Base44Command("deploy").description("Deploy all project resources (entities, functions, agents, connectors, and site)").option("-y, --yes", "Skip confirmation prompt").option("--git-hash <hash>", "Commit the full-stack build came from (defaults to the checkout's HEAD)").option("--build", "Run the configured install/build commands before deploying, even when a build artifact already exists").option("--prebuilt", "Skip the build step and deploy the existing artifact").action(deployAction);
257851
+ return new Base44Command("deploy").description("Deploy all project resources (entities, functions, agents, connectors, and site)").option("-y, --yes", "Skip confirmation prompt").option("--git-hash <hash>", "Commit the build came from (defaults to the checkout's HEAD)").option("--build", "Build the site before deploying (skips the prompt)").option("--no-build", "Deploy without building (skips the prompt)").action(deployAction);
257656
257852
  }
257657
257853
  async function handleOAuthConnectors(connectorResults, isNonInteractive, options, log) {
257658
257854
  const needsOAuth = filterPendingOAuth(connectorResults);
@@ -258243,7 +258439,7 @@ async function callTool(appId, tool, payload, schema13, context, timeout2 = 6000
258243
258439
  function listDirectory(appId, params) {
258244
258440
  return callTool(appId, "list_directory", { ...params }, ListDirectoryResponseSchema, "listing directory");
258245
258441
  }
258246
- function readFile5(appId, params) {
258442
+ function readFile6(appId, params) {
258247
258443
  return callTool(appId, "read_file", { ...params }, ReadFileResponseSchema, "reading file");
258248
258444
  }
258249
258445
  function writeFile2(appId, params) {
@@ -258373,7 +258569,7 @@ async function readFileAction({ runTask: runTask2 }, paths, options) {
258373
258569
  const { id: appId } = getAppContext();
258374
258570
  const offset = parsePositiveInt(options.offset, "--offset");
258375
258571
  const limit = parsePositiveInt(options.limit, "--limit");
258376
- const result = await runTask2("Reading file", () => readFile5(appId, { paths, offset, limit }));
258572
+ const result = await runTask2("Reading file", () => readFile6(appId, { paths, offset, limit }));
258377
258573
  return { outroMessage: "Read file", stdout: toJsonStdout(result) };
258378
258574
  }
258379
258575
  function getSandboxReadFileCommand() {
@@ -258517,40 +258713,51 @@ function getSecretsCommand() {
258517
258713
  }
258518
258714
 
258519
258715
  // src/cli/commands/site/deploy.ts
258520
- import { resolve as resolve14 } from "node:path";
258521
- async function deployAction2({ isNonInteractive, runTask: runTask2 }, options) {
258716
+ async function deployAction2(ctx, options) {
258717
+ const { isNonInteractive } = ctx;
258522
258718
  if (isNonInteractive && !options.yes) {
258523
258719
  throw new InvalidInputError("--yes is required in non-interactive mode");
258524
258720
  }
258525
258721
  const { project: project2 } = await readProjectConfig();
258526
- if (!project2.site?.outputDirectory) {
258722
+ const kind = await detectAppDeployKind(project2);
258723
+ if (kind === "none") {
258527
258724
  throw new ConfigNotFoundError("No site configuration found.", {
258528
258725
  hints: [
258529
258726
  {
258530
258727
  message: `Add 'site.outputDirectory' to your config.jsonc (e.g., "site": { "outputDirectory": "dist" })`
258728
+ },
258729
+ {
258730
+ message: "Full-stack apps ship from their build artifact — run your framework's build first"
258531
258731
  }
258532
258732
  ]
258533
258733
  });
258534
258734
  }
258535
- const outputDir = resolve14(project2.root, project2.site.outputDirectory);
258536
258735
  if (!options.yes) {
258537
258736
  const shouldDeploy = await Re({
258538
- message: `Deploy site from ${project2.site.outputDirectory}?`
258737
+ message: kind === "full-stack" ? "Deploy full-stack app?" : `Deploy site from ${project2.site?.outputDirectory}?`
258539
258738
  });
258540
258739
  if (Ct(shouldDeploy) || !shouldDeploy) {
258541
258740
  return { outroMessage: "Deployment cancelled" };
258542
258741
  }
258543
258742
  }
258544
- const result = await runTask2("Creating archive and deploying site...", async () => {
258545
- return await deploySite(outputDir);
258546
- }, {
258547
- successMessage: "Site deployed successfully",
258548
- errorMessage: "Deployment failed"
258743
+ await maybeBuildBeforeDeploy(ctx, project2, options.build);
258744
+ const result = await runAppSiteDeploy(ctx, project2, {
258745
+ gitHash: options.gitHash
258549
258746
  });
258550
- return { outroMessage: `Visit your site at: ${result.appUrl}` };
258747
+ if (result.kind === "full-stack" || result.kind === "static-deployment") {
258748
+ return {
258749
+ outroMessage: `Deployment ${result.deploymentId} (commit ${result.gitHash.slice(0, 12)})`,
258750
+ stdout: ctx.jsonMode ? `${JSON.stringify({ deploymentId: result.deploymentId, gitHash: result.gitHash }, null, 2)}
258751
+ ` : undefined
258752
+ };
258753
+ }
258754
+ if (result.kind === "static") {
258755
+ return { outroMessage: `Visit your site at: ${result.appUrl}` };
258756
+ }
258757
+ return { outroMessage: "Nothing to deploy" };
258551
258758
  }
258552
258759
  function getSiteDeployCommand() {
258553
- return new Base44Command("deploy").description("Deploy built site files to Base44 hosting").option("-y, --yes", "Skip confirmation prompt").action(deployAction2);
258760
+ 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("--git-hash <hash>", "Commit the build came from (defaults to the checkout's HEAD)").option("--build", "Build the site before deploying (skips the prompt)").option("--no-build", "Deploy without building (skips the prompt)").action(deployAction2);
258554
258761
  }
258555
258762
 
258556
258763
  // src/cli/commands/site/open.ts
@@ -258657,10 +258864,10 @@ function toPascalCase(name2) {
258657
258864
  return name2.split(/[-_\s]+/).map((w8) => w8.charAt(0).toUpperCase() + w8.slice(1)).join("");
258658
258865
  }
258659
258866
  // src/core/types/update-project.ts
258660
- import { join as join28 } from "node:path";
258867
+ import { join as join29 } from "node:path";
258661
258868
  var TYPES_INCLUDE_PATH = `${PROJECT_SUBDIR}/${TYPES_OUTPUT_SUBDIR}/*.d.ts`;
258662
258869
  async function updateProjectConfig(projectRoot) {
258663
- const tsconfigPath = join28(projectRoot, "tsconfig.json");
258870
+ const tsconfigPath = join29(projectRoot, "tsconfig.json");
258664
258871
  if (!await pathExists(tsconfigPath)) {
258665
258872
  return false;
258666
258873
  }
@@ -258895,7 +259102,7 @@ function createDevLogger(label2, labelColor = theme.styles.dim) {
258895
259102
  // src/cli/dev/dev-server/main.ts
258896
259103
  var import_cors = __toESM(require_lib4(), 1);
258897
259104
  var import_express6 = __toESM(require_express(), 1);
258898
- import { dirname as dirname24, join as join35 } from "node:path";
259105
+ import { dirname as dirname24, join as join36 } from "node:path";
258899
259106
 
258900
259107
  // ../../node_modules/get-port/index.js
258901
259108
  import net from "node:net";
@@ -258922,14 +259129,14 @@ var getLocalHosts = () => {
258922
259129
  }
258923
259130
  return results;
258924
259131
  };
258925
- var checkAvailablePort = (options8) => new Promise((resolve16, reject) => {
259132
+ var checkAvailablePort = (options8) => new Promise((resolve15, reject) => {
258926
259133
  const server = net.createServer();
258927
259134
  server.unref();
258928
259135
  server.on("error", reject);
258929
259136
  server.listen(options8, () => {
258930
259137
  const { port } = server.address();
258931
259138
  server.close(() => {
258932
- resolve16(port);
259139
+ resolve15(port);
258933
259140
  });
258934
259141
  });
258935
259142
  });
@@ -259030,7 +259237,7 @@ var $setGracefulCleanup = tmp.setGracefulCleanup;
259030
259237
 
259031
259238
  // src/cli/dev/dev-server/function-manager.ts
259032
259239
  import { spawn as spawn2 } from "node:child_process";
259033
- import { dirname as dirname21, join as join29 } from "node:path";
259240
+ import { dirname as dirname21, join as join30 } from "node:path";
259034
259241
  import { pathToFileURL } from "node:url";
259035
259242
 
259036
259243
  // src/cli/dev/dev-server/base-function-manager.ts
@@ -259135,7 +259342,7 @@ class FunctionManager extends BaseFunctionManager {
259135
259342
  }
259136
259343
  spawnFunction(func, port) {
259137
259344
  this.logger.log(`Spawning function "${func.name}" on port ${port}`);
259138
- const importMapPath = join29(dirname21(this.wrapperPath), "import-map.json");
259345
+ const importMapPath = join30(dirname21(this.wrapperPath), "import-map.json");
259139
259346
  const process23 = spawn2("deno", ["run", "--allow-all", "--import-map", importMapPath, this.wrapperPath], {
259140
259347
  env: {
259141
259348
  ...globalThis.process.env,
@@ -259174,7 +259381,7 @@ class FunctionManager extends BaseFunctionManager {
259174
259381
  });
259175
259382
  }
259176
259383
  waitForReady(name2, runningFunc) {
259177
- return new Promise((resolve16, reject) => {
259384
+ return new Promise((resolve15, reject) => {
259178
259385
  runningFunc.process.on("exit", (code2) => {
259179
259386
  if (!runningFunc.ready) {
259180
259387
  clearTimeout(timeout3);
@@ -259197,7 +259404,7 @@ class FunctionManager extends BaseFunctionManager {
259197
259404
  runningFunc.ready = true;
259198
259405
  clearTimeout(timeout3);
259199
259406
  runningFunc.process.stdout?.off("data", onData);
259200
- resolve16(runningFunc.port);
259407
+ resolve15(runningFunc.port);
259201
259408
  }
259202
259409
  };
259203
259410
  runningFunc.process.stdout?.on("data", onData);
@@ -259209,7 +259416,7 @@ class FunctionManager extends BaseFunctionManager {
259209
259416
  import { mkdirSync as mkdirSync2, writeFileSync as writeFileSync2 } from "node:fs";
259210
259417
  import { isBuiltin } from "node:module";
259211
259418
  import { homedir as homedir3 } from "node:os";
259212
- import { join as join30 } from "node:path";
259419
+ import { join as join31 } from "node:path";
259213
259420
  import { pathToFileURL as pathToFileURL6 } from "node:url";
259214
259421
  var depsPromise;
259215
259422
  function loadDeps() {
@@ -259330,9 +259537,9 @@ export default {
259330
259537
  };
259331
259538
  `;
259332
259539
  function ensureBundlerConfig() {
259333
- const dir = join30(homedir3(), ".base44", "function-bundler");
259540
+ const dir = join31(homedir3(), ".base44", "function-bundler");
259334
259541
  mkdirSync2(dir, { recursive: true });
259335
- const configPath = join30(dir, "deno.json");
259542
+ const configPath = join31(dir, "deno.json");
259336
259543
  writeFileSync2(configPath, `${JSON.stringify({ nodeModulesDir: "auto" }, null, 2)}
259337
259544
  `);
259338
259545
  return configPath;
@@ -261631,7 +261838,7 @@ class NodeFsHandler {
261631
261838
  this._addToNodeFs(path19, initialAdd, wh2, depth + 1);
261632
261839
  }
261633
261840
  }).on(EV.ERROR, this._boundHandleError);
261634
- return new Promise((resolve17, reject) => {
261841
+ return new Promise((resolve16, reject) => {
261635
261842
  if (!stream)
261636
261843
  return reject();
261637
261844
  stream.once(STR_END, () => {
@@ -261640,7 +261847,7 @@ class NodeFsHandler {
261640
261847
  return;
261641
261848
  }
261642
261849
  const wasThrottled = throttler ? throttler.clear() : false;
261643
- resolve17(undefined);
261850
+ resolve16(undefined);
261644
261851
  previous.getChildren().filter((item) => {
261645
261852
  return item !== directory && !current.has(item);
261646
261853
  }).forEach((item) => {
@@ -262557,7 +262764,7 @@ async function createDevServer(options8) {
262557
262764
  }
262558
262765
  remoteProxy(req, res, next);
262559
262766
  });
262560
- const server = await new Promise((resolve18, reject) => {
262767
+ const server = await new Promise((resolve17, reject) => {
262561
262768
  const s5 = app.listen(port, "127.0.0.1", (err) => {
262562
262769
  if (err) {
262563
262770
  if ("code" in err && err.code === "EADDRINUSE") {
@@ -262566,7 +262773,7 @@ async function createDevServer(options8) {
262566
262773
  reject(err);
262567
262774
  }
262568
262775
  } else {
262569
- resolve18(s5);
262776
+ resolve17(s5);
262570
262777
  }
262571
262778
  });
262572
262779
  });
@@ -262575,8 +262782,8 @@ async function createDevServer(options8) {
262575
262782
  broadcastEntityEvent(io6, appId, entityName, event);
262576
262783
  };
262577
262784
  const base44ConfigWatcher = new WatchBase44({
262578
- functions: join35(dirname24(project2.configPath), project2.functionsDir),
262579
- entities: join35(dirname24(project2.configPath), project2.entitiesDir)
262785
+ functions: join36(dirname24(project2.configPath), project2.functionsDir),
262786
+ entities: join36(dirname24(project2.configPath), project2.entitiesDir)
262580
262787
  }, devLogger);
262581
262788
  base44ConfigWatcher.on("change", async (name2) => {
262582
262789
  try {
@@ -262616,13 +262823,13 @@ async function createDevServer(options8) {
262616
262823
  if (!server.listening) {
262617
262824
  return;
262618
262825
  }
262619
- await new Promise((resolve18, reject) => {
262826
+ await new Promise((resolve17, reject) => {
262620
262827
  server.close((error48) => {
262621
262828
  if (error48) {
262622
262829
  reject(error48);
262623
262830
  return;
262624
262831
  }
262625
- resolve18();
262832
+ resolve17();
262626
262833
  });
262627
262834
  });
262628
262835
  };
@@ -262693,15 +262900,15 @@ class ServeRunner {
262693
262900
  return;
262694
262901
  }
262695
262902
  this.stopping = true;
262696
- const exited = new Promise((resolve18) => child.once("exit", () => resolve18()));
262903
+ const exited = new Promise((resolve17) => child.once("exit", () => resolve17()));
262697
262904
  if (process23.platform === "win32" && child.pid) {
262698
262905
  const taskkill = spawn3("taskkill", ["/pid", String(child.pid), "/T", "/F"], {
262699
262906
  stdio: "ignore",
262700
262907
  windowsHide: true
262701
262908
  });
262702
- await new Promise((resolve18) => {
262703
- taskkill.once("exit", () => resolve18());
262704
- taskkill.once("error", () => resolve18());
262909
+ await new Promise((resolve17) => {
262910
+ taskkill.once("exit", () => resolve17());
262911
+ taskkill.once("error", () => resolve17());
262705
262912
  });
262706
262913
  } else if (child.pid) {
262707
262914
  try {
@@ -262871,13 +263078,13 @@ async function runScript(options8) {
262871
263078
  }
262872
263079
  // src/cli/commands/exec.ts
262873
263080
  function readStdin2() {
262874
- return new Promise((resolve18, reject) => {
263081
+ return new Promise((resolve17, reject) => {
262875
263082
  let data = "";
262876
263083
  process.stdin.setEncoding("utf-8");
262877
263084
  process.stdin.on("data", (chunk) => {
262878
263085
  data += chunk;
262879
263086
  });
262880
- process.stdin.on("end", () => resolve18(data));
263087
+ process.stdin.on("end", () => resolve17(data));
262881
263088
  process.stdin.on("error", reject);
262882
263089
  });
262883
263090
  }
@@ -262948,7 +263155,7 @@ Examples:
262948
263155
  }
262949
263156
 
262950
263157
  // src/cli/commands/project/eject.ts
262951
- import { resolve as resolve18 } from "node:path";
263158
+ import { resolve as resolve17 } from "node:path";
262952
263159
  var import_kebabCase2 = __toESM(require_kebabCase(), 1);
262953
263160
  async function eject(ctx, options8, command2) {
262954
263161
  const { log, runTask: runTask2, isNonInteractive } = ctx;
@@ -263012,7 +263219,7 @@ async function eject(ctx, options8, command2) {
263012
263219
  Ne("Operation cancelled.");
263013
263220
  throw new CLIExitError(0);
263014
263221
  }
263015
- const resolvedPath = resolve18(selectedPath);
263222
+ const resolvedPath = resolve17(selectedPath);
263016
263223
  await runTask2("Downloading your project's code...", async (updateMessage) => {
263017
263224
  await createProjectFilesForExistingProject({
263018
263225
  projectId,
@@ -263045,7 +263252,11 @@ async function eject(ctx, options8, command2) {
263045
263252
  successMessage: theme.colors.base44Orange("Project built successfully"),
263046
263253
  errorMessage: "Failed to build project"
263047
263254
  });
263048
- await deployAction(ctx, { yes: true, projectRoot: resolvedPath });
263255
+ await deployAction(ctx, {
263256
+ yes: true,
263257
+ build: false,
263258
+ projectRoot: resolvedPath
263259
+ });
263049
263260
  }
263050
263261
  }
263051
263262
  return { outroMessage: "Your new project is set and ready to use" };
@@ -263074,6 +263285,7 @@ function createProgram(context) {
263074
263285
  program2.addCommand(getCreateCommand());
263075
263286
  program2.addCommand(getScaffoldCommand());
263076
263287
  program2.addCommand(getDashboardCommand());
263288
+ program2.addCommand(getBuildCommand());
263077
263289
  program2.addCommand(getDeployCommand2());
263078
263290
  program2.addCommand(getVisibilityCommand());
263079
263291
  program2.addCommand(getLinkCommand());
@@ -265387,14 +265599,14 @@ async function addSourceContext(frames) {
265387
265599
  return frames;
265388
265600
  }
265389
265601
  function getContextLinesFromFile(path19, ranges, output) {
265390
- return new Promise((resolve19) => {
265602
+ return new Promise((resolve18) => {
265391
265603
  const stream = createReadStream2(path19);
265392
265604
  const lineReaded = createInterface2({
265393
265605
  input: stream
265394
265606
  });
265395
265607
  function destroyStreamAndResolve() {
265396
265608
  stream.destroy();
265397
- resolve19();
265609
+ resolve18();
265398
265610
  }
265399
265611
  let lineNumber = 0;
265400
265612
  let currentRangeIndex = 0;
@@ -266506,15 +266718,15 @@ class PostHogBackendClient extends PostHogCoreStateless {
266506
266718
  return true;
266507
266719
  if (this.featureFlagsPoller === undefined)
266508
266720
  return false;
266509
- return new Promise((resolve19) => {
266721
+ return new Promise((resolve18) => {
266510
266722
  const timeout3 = setTimeout(() => {
266511
266723
  cleanup();
266512
- resolve19(false);
266724
+ resolve18(false);
266513
266725
  }, timeoutMs);
266514
266726
  const cleanup = this._events.on("localEvaluationFlagsLoaded", (count2) => {
266515
266727
  clearTimeout(timeout3);
266516
266728
  cleanup();
266517
- resolve19(count2 > 0);
266729
+ resolve18(count2 > 0);
266518
266730
  });
266519
266731
  });
266520
266732
  }
@@ -267300,7 +267512,7 @@ function addCommandInfoToErrorReporter(program2, errorReporter) {
267300
267512
  // src/cli/index.ts
267301
267513
  var __dirname4 = dirname26(fileURLToPath6(import.meta.url));
267302
267514
  async function runCLI(options8) {
267303
- ensureNpmAssets(join36(__dirname4, "../assets"));
267515
+ ensureNpmAssets(join37(__dirname4, "../assets"));
267304
267516
  const errorReporter = new ErrorReporter;
267305
267517
  errorReporter.registerProcessErrorHandlers();
267306
267518
  const jsonMode = process.argv.includes("--json");
@@ -267339,4 +267551,4 @@ export {
267339
267551
  CLIExitError
267340
267552
  };
267341
267553
 
267342
- //# debugId=F8606390894E3DA564756E2164756E21
267554
+ //# debugId=F2B952437C9258C064756E2164756E21