@base44-preview/cli 0.0.55-pr.546.2cca7dc → 0.0.56-pr.547.00da3ae

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
@@ -120878,7 +120878,7 @@ function parse42(toml, { maxDepth = 1000, integersAsBigInt } = {}) {
120878
120878
  }
120879
120879
  return res;
120880
120880
  }
120881
- async function readFile2(file2) {
120881
+ async function readFile3(file2) {
120882
120882
  if (isUrlString(file2)) {
120883
120883
  file2 = new URL(file2);
120884
120884
  }
@@ -134672,7 +134672,7 @@ ${codeblock}`, options8);
134672
134672
  "\\": "\\"
134673
134673
  };
134674
134674
  KEY_PART_RE = /^[a-zA-Z0-9-_]+[ \t]*$/;
134675
- read_file_default = readFile2;
134675
+ read_file_default = readFile3;
134676
134676
  loadConfigFromPackageJson = process.versions.bun ? async function loadConfigFromBunPackageJson(file2) {
134677
134677
  const { prettier } = await readBunPackageJson(file2);
134678
134678
  return prettier;
@@ -138269,11 +138269,11 @@ var require_prettier = __commonJS((exports, module) => {
138269
138269
  var require_formatter = __commonJS((exports) => {
138270
138270
  var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P9, generator) {
138271
138271
  function adopt(value) {
138272
- return value instanceof P9 ? value : new P9(function(resolve10) {
138273
- resolve10(value);
138272
+ return value instanceof P9 ? value : new P9(function(resolve12) {
138273
+ resolve12(value);
138274
138274
  });
138275
138275
  }
138276
- return new (P9 || (P9 = Promise))(function(resolve10, reject) {
138276
+ return new (P9 || (P9 = Promise))(function(resolve12, reject) {
138277
138277
  function fulfilled(value) {
138278
138278
  try {
138279
138279
  step(generator.next(value));
@@ -138289,7 +138289,7 @@ var require_formatter = __commonJS((exports) => {
138289
138289
  }
138290
138290
  }
138291
138291
  function step(result) {
138292
- result.done ? resolve10(result.value) : adopt(result.value).then(fulfilled, rejected);
138292
+ result.done ? resolve12(result.value) : adopt(result.value).then(fulfilled, rejected);
138293
138293
  }
138294
138294
  step((generator = generator.apply(thisArg, _arguments || [])).next());
138295
138295
  });
@@ -142942,7 +142942,7 @@ var require_url = __commonJS((exports) => {
142942
142942
  };
142943
142943
  Object.defineProperty(exports, "__esModule", { value: true });
142944
142944
  exports.parse = undefined;
142945
- exports.resolve = resolve10;
142945
+ exports.resolve = resolve12;
142946
142946
  exports.cwd = cwd;
142947
142947
  exports.getProtocol = getProtocol;
142948
142948
  exports.getExtension = getExtension;
@@ -142970,7 +142970,7 @@ var require_url = __commonJS((exports) => {
142970
142970
  var urlDecodePatterns = [/%23/g, "#", /%24/g, "$", /%26/g, "&", /%2C/g, ",", /%40/g, "@"];
142971
142971
  var parse11 = (u4) => new URL(u4);
142972
142972
  exports.parse = parse11;
142973
- function resolve10(from, to5) {
142973
+ function resolve12(from, to5) {
142974
142974
  const fromUrl = new URL((0, convert_path_to_posix_1.default)(from), "https://aaa.nonexistanturl.com");
142975
142975
  const resolvedUrl = new URL((0, convert_path_to_posix_1.default)(to5), fromUrl);
142976
142976
  const endSpaces = to5.match(/(\s*)$/)?.[1] || "";
@@ -143106,7 +143106,7 @@ var require_url = __commonJS((exports) => {
143106
143106
  }
143107
143107
  function relative4(from, to5) {
143108
143108
  if (!isFileSystemPath(from) || !isFileSystemPath(to5)) {
143109
- return resolve10(from, to5);
143109
+ return resolve12(from, to5);
143110
143110
  }
143111
143111
  const fromDir = path_1.default.dirname(stripHash(from));
143112
143112
  const toPath4 = stripHash(to5);
@@ -143782,7 +143782,7 @@ var require_plugins = __commonJS((exports) => {
143782
143782
  let plugin;
143783
143783
  let lastError;
143784
143784
  let index = 0;
143785
- return new Promise((resolve10, reject) => {
143785
+ return new Promise((resolve12, reject) => {
143786
143786
  runNextPlugin();
143787
143787
  function runNextPlugin() {
143788
143788
  plugin = plugins[index++];
@@ -143810,7 +143810,7 @@ var require_plugins = __commonJS((exports) => {
143810
143810
  }
143811
143811
  }
143812
143812
  function onSuccess(result) {
143813
- resolve10({
143813
+ resolve12({
143814
143814
  plugin,
143815
143815
  result
143816
143816
  });
@@ -143907,7 +143907,7 @@ var require_parse7 = __commonJS((exports) => {
143907
143907
  extension: url3.getExtension(path18)
143908
143908
  };
143909
143909
  try {
143910
- const resolver = await readFile3(file2, options8, $refs);
143910
+ const resolver = await readFile4(file2, options8, $refs);
143911
143911
  $ref.pathType = resolver.plugin.name;
143912
143912
  file2.data = resolver.result;
143913
143913
  const parser2 = await parseFile(file2, options8, $refs);
@@ -143920,7 +143920,7 @@ var require_parse7 = __commonJS((exports) => {
143920
143920
  throw err;
143921
143921
  }
143922
143922
  }
143923
- async function readFile3(file2, options8, $refs) {
143923
+ async function readFile4(file2, options8, $refs) {
143924
143924
  let resolvers = plugins.all(options8.resolve);
143925
143925
  resolvers = plugins.filter(resolvers, "canRead", file2);
143926
143926
  plugins.sort(resolvers);
@@ -145143,11 +145143,11 @@ var require_lib3 = __commonJS((exports) => {
145143
145143
  var require_resolver = __commonJS((exports) => {
145144
145144
  var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P9, generator) {
145145
145145
  function adopt(value) {
145146
- return value instanceof P9 ? value : new P9(function(resolve10) {
145147
- resolve10(value);
145146
+ return value instanceof P9 ? value : new P9(function(resolve12) {
145147
+ resolve12(value);
145148
145148
  });
145149
145149
  }
145150
- return new (P9 || (P9 = Promise))(function(resolve10, reject) {
145150
+ return new (P9 || (P9 = Promise))(function(resolve12, reject) {
145151
145151
  function fulfilled(value) {
145152
145152
  try {
145153
145153
  step(generator.next(value));
@@ -145163,7 +145163,7 @@ var require_resolver = __commonJS((exports) => {
145163
145163
  }
145164
145164
  }
145165
145165
  function step(result) {
145166
- result.done ? resolve10(result.value) : adopt(result.value).then(fulfilled, rejected);
145166
+ result.done ? resolve12(result.value) : adopt(result.value).then(fulfilled, rejected);
145167
145167
  }
145168
145168
  step((generator = generator.apply(thisArg, _arguments || [])).next());
145169
145169
  });
@@ -145284,11 +145284,11 @@ var require_optionValidator = __commonJS((exports) => {
145284
145284
  var require_src3 = __commonJS((exports) => {
145285
145285
  var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P9, generator) {
145286
145286
  function adopt(value) {
145287
- return value instanceof P9 ? value : new P9(function(resolve10) {
145288
- resolve10(value);
145287
+ return value instanceof P9 ? value : new P9(function(resolve12) {
145288
+ resolve12(value);
145289
145289
  });
145290
145290
  }
145291
- return new (P9 || (P9 = Promise))(function(resolve10, reject) {
145291
+ return new (P9 || (P9 = Promise))(function(resolve12, reject) {
145292
145292
  function fulfilled(value) {
145293
145293
  try {
145294
145294
  step(generator.next(value));
@@ -145304,7 +145304,7 @@ var require_src3 = __commonJS((exports) => {
145304
145304
  }
145305
145305
  }
145306
145306
  function step(result) {
145307
- result.done ? resolve10(result.value) : adopt(result.value).then(fulfilled, rejected);
145307
+ result.done ? resolve12(result.value) : adopt(result.value).then(fulfilled, rejected);
145308
145308
  }
145309
145309
  step((generator = generator.apply(thisArg, _arguments || [])).next());
145310
145310
  });
@@ -150819,11 +150819,11 @@ var require_raw_body = __commonJS((exports, module) => {
150819
150819
  if (done) {
150820
150820
  return readStream(stream, encoding, length, limit, wrap(done));
150821
150821
  }
150822
- return new Promise(function executor(resolve10, reject) {
150822
+ return new Promise(function executor(resolve12, reject) {
150823
150823
  readStream(stream, encoding, length, limit, function onRead2(err, buf) {
150824
150824
  if (err)
150825
150825
  return reject(err);
150826
- resolve10(buf);
150826
+ resolve12(buf);
150827
150827
  });
150828
150828
  });
150829
150829
  }
@@ -163948,7 +163948,7 @@ var require_view = __commonJS((exports, module) => {
163948
163948
  var basename6 = path18.basename;
163949
163949
  var extname2 = path18.extname;
163950
163950
  var join25 = path18.join;
163951
- var resolve10 = path18.resolve;
163951
+ var resolve12 = path18.resolve;
163952
163952
  module.exports = View;
163953
163953
  function View(name2, options8) {
163954
163954
  var opts = options8 || {};
@@ -163982,7 +163982,7 @@ var require_view = __commonJS((exports, module) => {
163982
163982
  debug('lookup "%s"', name2);
163983
163983
  for (var i5 = 0;i5 < roots.length && !path19; i5++) {
163984
163984
  var root2 = roots[i5];
163985
- var loc = resolve10(root2, name2);
163985
+ var loc = resolve12(root2, name2);
163986
163986
  var dir = dirname19(loc);
163987
163987
  var file2 = basename6(loc);
163988
163988
  path19 = this.resolve(dir, file2);
@@ -164007,7 +164007,7 @@ var require_view = __commonJS((exports, module) => {
164007
164007
  });
164008
164008
  sync = false;
164009
164009
  };
164010
- View.prototype.resolve = function resolve11(dir, file2) {
164010
+ View.prototype.resolve = function resolve13(dir, file2) {
164011
164011
  var ext = this.ext;
164012
164012
  var path19 = join25(dir, file2);
164013
164013
  var stat2 = tryStat(path19);
@@ -166166,7 +166166,7 @@ var require_application = __commonJS((exports, module) => {
166166
166166
  var compileETag = require_utils10().compileETag;
166167
166167
  var compileQueryParser = require_utils10().compileQueryParser;
166168
166168
  var compileTrust = require_utils10().compileTrust;
166169
- var resolve10 = __require("node:path").resolve;
166169
+ var resolve12 = __require("node:path").resolve;
166170
166170
  var once9 = require_once();
166171
166171
  var Router = require_router();
166172
166172
  var slice = Array.prototype.slice;
@@ -166220,7 +166220,7 @@ var require_application = __commonJS((exports, module) => {
166220
166220
  this.mountpath = "/";
166221
166221
  this.locals.settings = this.settings;
166222
166222
  this.set("view", View);
166223
- this.set("views", resolve10("views"));
166223
+ this.set("views", resolve12("views"));
166224
166224
  this.set("jsonp callback name", "callback");
166225
166225
  if (env3 === "production") {
166226
166226
  this.enable("view cache");
@@ -167711,7 +167711,7 @@ var require_send = __commonJS((exports, module) => {
167711
167711
  var extname2 = path18.extname;
167712
167712
  var join25 = path18.join;
167713
167713
  var normalize2 = path18.normalize;
167714
- var resolve10 = path18.resolve;
167714
+ var resolve12 = path18.resolve;
167715
167715
  var sep = path18.sep;
167716
167716
  var BYTES_RANGE_REGEXP = /^ *bytes=/;
167717
167717
  var MAX_MAXAGE = 60 * 60 * 24 * 365 * 1000;
@@ -167740,7 +167740,7 @@ var require_send = __commonJS((exports, module) => {
167740
167740
  this._maxage = opts.maxAge || opts.maxage;
167741
167741
  this._maxage = typeof this._maxage === "string" ? ms8(this._maxage) : Number(this._maxage);
167742
167742
  this._maxage = !isNaN(this._maxage) ? Math.min(Math.max(0, this._maxage), MAX_MAXAGE) : 0;
167743
- this._root = opts.root ? resolve10(opts.root) : null;
167743
+ this._root = opts.root ? resolve12(opts.root) : null;
167744
167744
  }
167745
167745
  util2.inherits(SendStream, Stream2);
167746
167746
  SendStream.prototype.error = function error48(status, err) {
@@ -167889,7 +167889,7 @@ var require_send = __commonJS((exports, module) => {
167889
167889
  return res;
167890
167890
  }
167891
167891
  parts = normalize2(path19).split(sep);
167892
- path19 = resolve10(path19);
167892
+ path19 = resolve12(path19);
167893
167893
  }
167894
167894
  if (containsDotFile(parts)) {
167895
167895
  debug('%s dotfile "%s"', this._dotfiles, path19);
@@ -168217,7 +168217,7 @@ var require_response = __commonJS((exports, module) => {
168217
168217
  var cookie = require_cookie();
168218
168218
  var send = require_send();
168219
168219
  var extname2 = path18.extname;
168220
- var resolve10 = path18.resolve;
168220
+ var resolve12 = path18.resolve;
168221
168221
  var vary = require_vary();
168222
168222
  var { Buffer: Buffer7 } = __require("node:buffer");
168223
168223
  var res = Object.create(http.ServerResponse.prototype);
@@ -168426,7 +168426,7 @@ var require_response = __commonJS((exports, module) => {
168426
168426
  }
168427
168427
  opts = Object.create(opts);
168428
168428
  opts.headers = headers;
168429
- var fullPath = !opts.root ? resolve10(path19) : path19;
168429
+ var fullPath = !opts.root ? resolve12(path19) : path19;
168430
168430
  return this.sendFile(fullPath, opts, done);
168431
168431
  };
168432
168432
  res.contentType = res.type = function contentType(type) {
@@ -168687,7 +168687,7 @@ var require_serve_static = __commonJS((exports, module) => {
168687
168687
  var encodeUrl = require_encodeurl();
168688
168688
  var escapeHtml = require_escape_html();
168689
168689
  var parseUrl = require_parseurl();
168690
- var resolve10 = __require("path").resolve;
168690
+ var resolve12 = __require("path").resolve;
168691
168691
  var send = require_send();
168692
168692
  var url3 = __require("url");
168693
168693
  module.exports = serveStatic;
@@ -168706,7 +168706,7 @@ var require_serve_static = __commonJS((exports, module) => {
168706
168706
  throw new TypeError("option setHeaders must be function");
168707
168707
  }
168708
168708
  opts.maxage = opts.maxage || opts.maxAge || 0;
168709
- opts.root = resolve10(root2);
168709
+ opts.root = resolve12(root2);
168710
168710
  var onDirectory = redirect ? createRedirectDirectoryListener() : createNotFoundDirectoryListener();
168711
168711
  return function serveStatic2(req, res, next) {
168712
168712
  if (req.method !== "GET" && req.method !== "HEAD") {
@@ -172080,8 +172080,8 @@ var require_executor = __commonJS((exports, module) => {
172080
172080
  }
172081
172081
  resetBuffer() {
172082
172082
  this.buffer = new Waterfall;
172083
- this.buffer.chain(new Promise((resolve10) => {
172084
- this._triggerBuffer = resolve10;
172083
+ this.buffer.chain(new Promise((resolve12) => {
172084
+ this._triggerBuffer = resolve12;
172085
172085
  }));
172086
172086
  if (this.ready)
172087
172087
  this._triggerBuffer();
@@ -173101,7 +173101,7 @@ var require_storage = __commonJS((exports, module) => {
173101
173101
  throw e8;
173102
173102
  }
173103
173103
  };
173104
- var writeFileLinesAsync = (filename, lines, mode = DEFAULT_FILE_MODE) => new Promise((resolve10, reject) => {
173104
+ var writeFileLinesAsync = (filename, lines, mode = DEFAULT_FILE_MODE) => new Promise((resolve12, reject) => {
173105
173105
  try {
173106
173106
  const stream = writeFileStream(filename, { mode });
173107
173107
  const readable2 = Readable6.from(lines);
@@ -173118,7 +173118,7 @@ var require_storage = __commonJS((exports, module) => {
173118
173118
  if (err)
173119
173119
  reject(err);
173120
173120
  else
173121
- resolve10();
173121
+ resolve12();
173122
173122
  });
173123
173123
  });
173124
173124
  readable2.on("error", (err) => {
@@ -173289,7 +173289,7 @@ var require_persistence = __commonJS((exports, module) => {
173289
173289
  return { data: tdata, indexes };
173290
173290
  }
173291
173291
  treatRawStreamAsync(rawStream) {
173292
- return new Promise((resolve10, reject) => {
173292
+ return new Promise((resolve12, reject) => {
173293
173293
  const dataById = {};
173294
173294
  const indexes = {};
173295
173295
  let corruptItems = 0;
@@ -173332,7 +173332,7 @@ var require_persistence = __commonJS((exports, module) => {
173332
173332
  }
173333
173333
  }
173334
173334
  const data = Object.values(dataById);
173335
- resolve10({ data, indexes });
173335
+ resolve12({ data, indexes });
173336
173336
  });
173337
173337
  lineStream.on("error", function(err) {
173338
173338
  reject(err, null);
@@ -198943,13 +198943,13 @@ var require_broadcast_operator = __commonJS((exports) => {
198943
198943
  return true;
198944
198944
  }
198945
198945
  emitWithAck(ev2, ...args) {
198946
- return new Promise((resolve10, reject) => {
198946
+ return new Promise((resolve12, reject) => {
198947
198947
  args.push((err, responses) => {
198948
198948
  if (err) {
198949
198949
  err.responses = responses;
198950
198950
  return reject(err);
198951
198951
  } else {
198952
- return resolve10(responses);
198952
+ return resolve12(responses);
198953
198953
  }
198954
198954
  });
198955
198955
  this.emit(ev2, ...args);
@@ -199137,12 +199137,12 @@ var require_socket2 = __commonJS((exports) => {
199137
199137
  }
199138
199138
  emitWithAck(ev2, ...args) {
199139
199139
  const withErr = this.flags.timeout !== undefined;
199140
- return new Promise((resolve10, reject) => {
199140
+ return new Promise((resolve12, reject) => {
199141
199141
  args.push((arg1, arg2) => {
199142
199142
  if (withErr) {
199143
- return arg1 ? reject(arg1) : resolve10(arg2);
199143
+ return arg1 ? reject(arg1) : resolve12(arg2);
199144
199144
  } else {
199145
- return resolve10(arg1);
199145
+ return resolve12(arg1);
199146
199146
  }
199147
199147
  });
199148
199148
  this.emit(ev2, ...args);
@@ -199597,13 +199597,13 @@ var require_namespace = __commonJS((exports) => {
199597
199597
  return true;
199598
199598
  }
199599
199599
  serverSideEmitWithAck(ev2, ...args) {
199600
- return new Promise((resolve10, reject) => {
199600
+ return new Promise((resolve12, reject) => {
199601
199601
  args.push((err, responses) => {
199602
199602
  if (err) {
199603
199603
  err.responses = responses;
199604
199604
  return reject(err);
199605
199605
  } else {
199606
- return resolve10(responses);
199606
+ return resolve12(responses);
199607
199607
  }
199608
199608
  });
199609
199609
  this.serverSideEmit(ev2, ...args);
@@ -200287,7 +200287,7 @@ var require_cluster_adapter = __commonJS((exports) => {
200287
200287
  return localSockets;
200288
200288
  }
200289
200289
  const requestId = randomId();
200290
- return new Promise((resolve10, reject) => {
200290
+ return new Promise((resolve12, reject) => {
200291
200291
  const timeout3 = setTimeout(() => {
200292
200292
  const storedRequest2 = this.requests.get(requestId);
200293
200293
  if (storedRequest2) {
@@ -200297,7 +200297,7 @@ var require_cluster_adapter = __commonJS((exports) => {
200297
200297
  }, opts.flags.timeout || DEFAULT_TIMEOUT);
200298
200298
  const storedRequest = {
200299
200299
  type: MessageType.FETCH_SOCKETS,
200300
- resolve: resolve10,
200300
+ resolve: resolve12,
200301
200301
  timeout: timeout3,
200302
200302
  current: 0,
200303
200303
  expected: expectedResponseCount,
@@ -200507,7 +200507,7 @@ var require_cluster_adapter = __commonJS((exports) => {
200507
200507
  return localSockets;
200508
200508
  }
200509
200509
  const requestId = randomId();
200510
- return new Promise((resolve10, reject) => {
200510
+ return new Promise((resolve12, reject) => {
200511
200511
  const timeout3 = setTimeout(() => {
200512
200512
  const storedRequest2 = this.customRequests.get(requestId);
200513
200513
  if (storedRequest2) {
@@ -200517,7 +200517,7 @@ var require_cluster_adapter = __commonJS((exports) => {
200517
200517
  }, opts.flags.timeout || DEFAULT_TIMEOUT);
200518
200518
  const storedRequest = {
200519
200519
  type: MessageType.FETCH_SOCKETS,
200520
- resolve: resolve10,
200520
+ resolve: resolve12,
200521
200521
  timeout: timeout3,
200522
200522
  missingUids: new Set([...this.nodesMap.keys()]),
200523
200523
  responses: localSockets
@@ -201246,13 +201246,13 @@ var require_dist4 = __commonJS((exports, module) => {
201246
201246
  this.engine.close();
201247
201247
  (0, uws_1.restoreAdapter)();
201248
201248
  if (this.httpServer) {
201249
- return new Promise((resolve10) => {
201249
+ return new Promise((resolve12) => {
201250
201250
  this.httpServer.close((err) => {
201251
201251
  fn9 && fn9(err);
201252
201252
  if (err) {
201253
201253
  debug("server was not running");
201254
201254
  }
201255
- resolve10();
201255
+ resolve12();
201256
201256
  });
201257
201257
  });
201258
201258
  } else {
@@ -215914,14 +215914,14 @@ var require_async_iterator = __commonJS((exports, module) => {
215914
215914
  };
215915
215915
  }
215916
215916
  function readAndResolve(iter) {
215917
- var resolve10 = iter[kLastResolve];
215918
- if (resolve10 !== null) {
215917
+ var resolve12 = iter[kLastResolve];
215918
+ if (resolve12 !== null) {
215919
215919
  var data = iter[kStream].read();
215920
215920
  if (data !== null) {
215921
215921
  iter[kLastPromise] = null;
215922
215922
  iter[kLastResolve] = null;
215923
215923
  iter[kLastReject] = null;
215924
- resolve10(createIterResult(data, false));
215924
+ resolve12(createIterResult(data, false));
215925
215925
  }
215926
215926
  }
215927
215927
  }
@@ -215929,13 +215929,13 @@ var require_async_iterator = __commonJS((exports, module) => {
215929
215929
  process.nextTick(readAndResolve, iter);
215930
215930
  }
215931
215931
  function wrapForNext(lastPromise, iter) {
215932
- return function(resolve10, reject) {
215932
+ return function(resolve12, reject) {
215933
215933
  lastPromise.then(function() {
215934
215934
  if (iter[kEnded]) {
215935
- resolve10(createIterResult(undefined, true));
215935
+ resolve12(createIterResult(undefined, true));
215936
215936
  return;
215937
215937
  }
215938
- iter[kHandlePromise](resolve10, reject);
215938
+ iter[kHandlePromise](resolve12, reject);
215939
215939
  }, reject);
215940
215940
  };
215941
215941
  }
@@ -215954,12 +215954,12 @@ var require_async_iterator = __commonJS((exports, module) => {
215954
215954
  return Promise.resolve(createIterResult(undefined, true));
215955
215955
  }
215956
215956
  if (this[kStream].destroyed) {
215957
- return new Promise(function(resolve10, reject) {
215957
+ return new Promise(function(resolve12, reject) {
215958
215958
  process.nextTick(function() {
215959
215959
  if (_this[kError]) {
215960
215960
  reject(_this[kError]);
215961
215961
  } else {
215962
- resolve10(createIterResult(undefined, true));
215962
+ resolve12(createIterResult(undefined, true));
215963
215963
  }
215964
215964
  });
215965
215965
  });
@@ -215982,13 +215982,13 @@ var require_async_iterator = __commonJS((exports, module) => {
215982
215982
  return this;
215983
215983
  }), _defineProperty(_Object$setPrototypeO, "return", function _return() {
215984
215984
  var _this2 = this;
215985
- return new Promise(function(resolve10, reject) {
215985
+ return new Promise(function(resolve12, reject) {
215986
215986
  _this2[kStream].destroy(null, function(err) {
215987
215987
  if (err) {
215988
215988
  reject(err);
215989
215989
  return;
215990
215990
  }
215991
- resolve10(createIterResult(undefined, true));
215991
+ resolve12(createIterResult(undefined, true));
215992
215992
  });
215993
215993
  });
215994
215994
  }), _Object$setPrototypeO), AsyncIteratorPrototype);
@@ -216010,15 +216010,15 @@ var require_async_iterator = __commonJS((exports, module) => {
216010
216010
  value: stream._readableState.endEmitted,
216011
216011
  writable: true
216012
216012
  }), _defineProperty(_Object$create, kHandlePromise, {
216013
- value: function value(resolve10, reject) {
216013
+ value: function value(resolve12, reject) {
216014
216014
  var data = iterator[kStream].read();
216015
216015
  if (data) {
216016
216016
  iterator[kLastPromise] = null;
216017
216017
  iterator[kLastResolve] = null;
216018
216018
  iterator[kLastReject] = null;
216019
- resolve10(createIterResult(data, false));
216019
+ resolve12(createIterResult(data, false));
216020
216020
  } else {
216021
- iterator[kLastResolve] = resolve10;
216021
+ iterator[kLastResolve] = resolve12;
216022
216022
  iterator[kLastReject] = reject;
216023
216023
  }
216024
216024
  },
@@ -216037,12 +216037,12 @@ var require_async_iterator = __commonJS((exports, module) => {
216037
216037
  iterator[kError] = err;
216038
216038
  return;
216039
216039
  }
216040
- var resolve10 = iterator[kLastResolve];
216041
- if (resolve10 !== null) {
216040
+ var resolve12 = iterator[kLastResolve];
216041
+ if (resolve12 !== null) {
216042
216042
  iterator[kLastPromise] = null;
216043
216043
  iterator[kLastResolve] = null;
216044
216044
  iterator[kLastReject] = null;
216045
- resolve10(createIterResult(undefined, true));
216045
+ resolve12(createIterResult(undefined, true));
216046
216046
  }
216047
216047
  iterator[kEnded] = true;
216048
216048
  });
@@ -216054,7 +216054,7 @@ var require_async_iterator = __commonJS((exports, module) => {
216054
216054
 
216055
216055
  // ../../node_modules/readable-stream/lib/internal/streams/from.js
216056
216056
  var require_from = __commonJS((exports, module) => {
216057
- function asyncGeneratorStep(gen, resolve10, reject, _next, _throw, key2, arg) {
216057
+ function asyncGeneratorStep(gen, resolve12, reject, _next, _throw, key2, arg) {
216058
216058
  try {
216059
216059
  var info = gen[key2](arg);
216060
216060
  var value = info.value;
@@ -216063,7 +216063,7 @@ var require_from = __commonJS((exports, module) => {
216063
216063
  return;
216064
216064
  }
216065
216065
  if (info.done) {
216066
- resolve10(value);
216066
+ resolve12(value);
216067
216067
  } else {
216068
216068
  Promise.resolve(value).then(_next, _throw);
216069
216069
  }
@@ -216071,13 +216071,13 @@ var require_from = __commonJS((exports, module) => {
216071
216071
  function _asyncToGenerator(fn9) {
216072
216072
  return function() {
216073
216073
  var self2 = this, args = arguments;
216074
- return new Promise(function(resolve10, reject) {
216074
+ return new Promise(function(resolve12, reject) {
216075
216075
  var gen = fn9.apply(self2, args);
216076
216076
  function _next(value) {
216077
- asyncGeneratorStep(gen, resolve10, reject, _next, _throw, "next", value);
216077
+ asyncGeneratorStep(gen, resolve12, reject, _next, _throw, "next", value);
216078
216078
  }
216079
216079
  function _throw(err) {
216080
- asyncGeneratorStep(gen, resolve10, reject, _next, _throw, "throw", err);
216080
+ asyncGeneratorStep(gen, resolve12, reject, _next, _throw, "throw", err);
216081
216081
  }
216082
216082
  _next(undefined);
216083
216083
  });
@@ -234018,7 +234018,7 @@ function normalizeBase44Env() {
234018
234018
  loadProjectEnvFiles();
234019
234019
 
234020
234020
  // src/cli/index.ts
234021
- import { dirname as dirname23, join as join29 } from "node:path";
234021
+ import { dirname as dirname23, join as join28 } from "node:path";
234022
234022
  import { fileURLToPath as fileURLToPath6 } from "node:url";
234023
234023
 
234024
234024
  // ../../node_modules/@clack/core/dist/index.mjs
@@ -243891,7 +243891,7 @@ import { join as join11 } from "node:path";
243891
243891
  // package.json
243892
243892
  var package_default = {
243893
243893
  name: "base44",
243894
- version: "0.0.55",
243894
+ version: "0.0.56",
243895
243895
  description: "Base44 CLI - Unified interface for managing Base44 applications",
243896
243896
  type: "module",
243897
243897
  bin: {
@@ -244260,6 +244260,11 @@ function getAppClient() {
244260
244260
  prefixUrl: new URL(`/api/apps/${id}/`, getBase44ApiUrl()).href
244261
244261
  });
244262
244262
  }
244263
+ function getSandboxClient(appId) {
244264
+ return base44Client.extend({
244265
+ prefixUrl: new URL(`/api/apps/${appId}/sandbox-bridge/`, getBase44ApiUrl()).href
244266
+ });
244267
+ }
244263
244268
  // src/core/clients/oauth-client.ts
244264
244269
  import { randomUUID as randomUUID3 } from "node:crypto";
244265
244270
  var oauthClient = distribution_default.create({
@@ -244280,7 +244285,7 @@ async function generateDeviceCode() {
244280
244285
  const response = await oauthClient.post("oauth/device/code", {
244281
244286
  json: {
244282
244287
  client_id: AUTH_CLIENT_ID,
244283
- scope: "apps:read apps:write"
244288
+ scope: "apps:read apps:write sandbox:write"
244284
244289
  },
244285
244290
  throwHttpErrors: false
244286
244291
  });
@@ -251108,7 +251113,8 @@ class Base44Command extends Command {
251108
251113
  }
251109
251114
  action(fn) {
251110
251115
  return super.action(async (...args) => {
251111
- const quiet = this.context.isNonInteractive;
251116
+ const jsonMode = this.context.jsonMode;
251117
+ const quiet = this.context.isNonInteractive || jsonMode;
251112
251118
  if (!quiet) {
251113
251119
  await showCommandStart(this._commandOptions.fullBanner);
251114
251120
  }
@@ -251126,7 +251132,8 @@ class Base44Command extends Command {
251126
251132
  await showCommandEnd(result, upgradeCheckPromise, this.context.distribution);
251127
251133
  } else {
251128
251134
  if (result.outroMessage) {
251129
- process.stdout.write(`${result.outroMessage}
251135
+ const statusStream = jsonMode ? process.stderr : process.stdout;
251136
+ statusStream.write(`${result.outroMessage}
251130
251137
  `);
251131
251138
  }
251132
251139
  if (result.stdout) {
@@ -251195,7 +251202,7 @@ function createSimpleRunTask(log) {
251195
251202
  };
251196
251203
  }
251197
251204
  // src/cli/utils/stdin.ts
251198
- async function readStdin(flagName = "--stdin") {
251205
+ async function readStdin(flagName = "--stdin", options = {}) {
251199
251206
  if (process.stdin.isTTY) {
251200
251207
  throw new InvalidInputError(`${flagName} requires piped input (e.g., echo <value> | base44 ...)`);
251201
251208
  }
@@ -251203,7 +251210,8 @@ async function readStdin(flagName = "--stdin") {
251203
251210
  for await (const chunk of process.stdin) {
251204
251211
  chunks.push(chunk);
251205
251212
  }
251206
- return Buffer.concat(chunks).toString("utf-8").trim();
251213
+ const text = Buffer.concat(chunks).toString("utf-8");
251214
+ return options.trim === false ? text : text.trim();
251207
251215
  }
251208
251216
 
251209
251217
  // src/cli/utils/secret-input.ts
@@ -251829,73 +251837,6 @@ function getWhoamiCommand() {
251829
251837
  return new Base44Command("whoami", { requireAppContext: false }).description("Display current authenticated user").action(whoami);
251830
251838
  }
251831
251839
 
251832
- // src/cli/commands/connectors/list-available.ts
251833
- async function listAvailableAction({
251834
- log,
251835
- runTask: runTask2
251836
- }) {
251837
- const { integrations } = await runTask2("Fetching available integrations from Base44", async () => {
251838
- return await listAvailableIntegrations();
251839
- }, {
251840
- successMessage: "Available integrations fetched successfully",
251841
- errorMessage: "Failed to fetch available integrations"
251842
- });
251843
- if (integrations.length === 0) {
251844
- return { outroMessage: "No available integrations found." };
251845
- }
251846
- for (const { displayName, ...rest } of integrations) {
251847
- const yaml2 = formatYaml(rest);
251848
- const pad = " ".repeat(YAML_INDENT);
251849
- log.info(`${displayName}
251850
- ${pad}${yaml2.replace(/\n/g, `
251851
- ${pad}`)}`);
251852
- }
251853
- return {
251854
- outroMessage: `Found ${integrations.length} available integrations.`
251855
- };
251856
- }
251857
- function getConnectorsListAvailableCommand() {
251858
- return new Base44Command("list-available").description("List all available integration types").action(listAvailableAction);
251859
- }
251860
-
251861
- // src/cli/commands/connectors/pull.ts
251862
- import { dirname as dirname15, join as join19 } from "node:path";
251863
- async function pullConnectorsAction({
251864
- log,
251865
- runTask: runTask2
251866
- }) {
251867
- const { project: project2 } = await readProjectConfig();
251868
- const configDir = dirname15(project2.configPath);
251869
- const connectorsDir = join19(configDir, project2.connectorsDir);
251870
- const remoteConnectors = await runTask2("Fetching connectors from Base44", async () => {
251871
- return await pullAllConnectors();
251872
- }, {
251873
- successMessage: "Connectors fetched successfully",
251874
- errorMessage: "Failed to fetch connectors"
251875
- });
251876
- const { written, deleted } = await runTask2("Syncing connector files", async () => {
251877
- return await writeConnectors(connectorsDir, remoteConnectors);
251878
- }, {
251879
- successMessage: "Connector files synced successfully",
251880
- errorMessage: "Failed to sync connector files"
251881
- });
251882
- if (written.length > 0) {
251883
- log.success(`Written: ${written.join(", ")}`);
251884
- }
251885
- if (deleted.length > 0) {
251886
- log.warn(`Deleted: ${deleted.join(", ")}`);
251887
- }
251888
- if (written.length === 0 && deleted.length === 0) {
251889
- log.info("All connectors are already up to date");
251890
- }
251891
- return {
251892
- outroMessage: `Pulled ${remoteConnectors.length} connectors to ${connectorsDir}`
251893
- };
251894
- }
251895
- function getConnectorsPullCommand() {
251896
- return new Base44Command("pull").description("Pull connectors from Base44 to local files (replaces all local connector configs)").action(pullConnectorsAction);
251897
- }
251898
-
251899
251840
  // ../../node_modules/open/index.js
251900
251841
  import process20 from "node:process";
251901
251842
  import path16 from "node:path";
@@ -252586,7 +252527,165 @@ async function promptOAuthFlows(pending, log, options) {
252586
252527
  return outcomes;
252587
252528
  }
252588
252529
 
252530
+ // src/cli/commands/connectors/initiate.ts
252531
+ function parseIntegrationType(value) {
252532
+ const result = IntegrationTypeSchema.safeParse(value);
252533
+ if (!result.success) {
252534
+ throw new InvalidInputError("A valid --integration-type is required (e.g. googlecalendar, gmail, slack).");
252535
+ }
252536
+ return result.data;
252537
+ }
252538
+ function parseScopes(scopes) {
252539
+ return (scopes ?? []).flatMap((s) => s.split(",")).map((s) => s.trim()).filter(Boolean);
252540
+ }
252541
+ async function initiateAction(ctx, options) {
252542
+ const { log, runTask: runTask2, isNonInteractive, jsonMode } = ctx;
252543
+ const integrationType = parseIntegrationType(options.integrationType);
252544
+ const scopes = parseScopes(options.scopes);
252545
+ const response = await runTask2(`Initiating ${integrationType} connector`, () => setConnector(integrationType, scopes), {
252546
+ successMessage: `Connector ${integrationType} initialized`,
252547
+ errorMessage: `Failed to initialize ${integrationType}`
252548
+ });
252549
+ if (response.error) {
252550
+ const detail = response.error === "different_user" && response.otherUserEmail ? ` (already authorized by ${response.otherUserEmail})` : response.errorMessage ? ` (${response.errorMessage})` : "";
252551
+ throw new InvalidInputError(`Could not initiate ${integrationType}: ${response.error}${detail}`);
252552
+ }
252553
+ if (jsonMode) {
252554
+ return {
252555
+ outroMessage: response.alreadyAuthorized ? `${integrationType} already authorized` : `${integrationType} initialized`,
252556
+ stdout: `${JSON.stringify({
252557
+ integrationType,
252558
+ alreadyAuthorized: response.alreadyAuthorized,
252559
+ redirectUrl: response.redirectUrl,
252560
+ connectionId: response.connectionId
252561
+ }, null, 2)}
252562
+ `
252563
+ };
252564
+ }
252565
+ if (response.alreadyAuthorized || !response.redirectUrl) {
252566
+ return {
252567
+ outroMessage: `${integrationType} is already authorized. Run 'base44 connectors pull' to fetch its config.`
252568
+ };
252569
+ }
252570
+ log.info(`Authorize ${integrationType} here: ${theme.colors.links(response.redirectUrl)}`);
252571
+ const pending = {
252572
+ type: integrationType,
252573
+ action: "needs_oauth",
252574
+ redirectUrl: response.redirectUrl,
252575
+ connectionId: response.connectionId ?? undefined
252576
+ };
252577
+ const outcomes = await promptOAuthFlows([pending], log, {
252578
+ skipPrompt: isNonInteractive
252579
+ });
252580
+ if (outcomes.get(integrationType) === "ACTIVE") {
252581
+ return {
252582
+ outroMessage: `${integrationType} authorized. Run 'base44 connectors pull' to fetch its config.`
252583
+ };
252584
+ }
252585
+ return {
252586
+ outroMessage: `${integrationType} initialized. Open the link above to finish authorizing, then run 'base44 connectors pull'.`
252587
+ };
252588
+ }
252589
+ function getConnectorsInitiateCommand() {
252590
+ return new Base44Command("initiate").description("Initialize a connector on an app and start its OAuth flow (works with --app-id, no local project required)").requiredOption("--integration-type <type>", "Integration type to initiate (e.g. googlecalendar, gmail, slack)").option("--scopes <scopes...>", "OAuth scopes to request (space- or comma-separated)").addHelpText("after", `
252591
+ Examples:
252592
+ $ base44 connectors initiate --app-id app_123 --integration-type googlecalendar --scopes https://www.googleapis.com/auth/calendar
252593
+ $ base44 connectors initiate --integration-type gmail --scopes scope.a,scope.b`).action(initiateAction);
252594
+ }
252595
+
252596
+ // src/cli/commands/connectors/list-available.ts
252597
+ async function listAvailableAction({
252598
+ log,
252599
+ runTask: runTask2,
252600
+ jsonMode
252601
+ }) {
252602
+ const { integrations } = await runTask2("Fetching available integrations from Base44", async () => {
252603
+ return await listAvailableIntegrations();
252604
+ }, {
252605
+ successMessage: "Available integrations fetched successfully",
252606
+ errorMessage: "Failed to fetch available integrations"
252607
+ });
252608
+ if (jsonMode) {
252609
+ return {
252610
+ outroMessage: `Found ${integrations.length} available integrations.`,
252611
+ stdout: `${JSON.stringify({ integrations }, null, 2)}
252612
+ `
252613
+ };
252614
+ }
252615
+ if (integrations.length === 0) {
252616
+ return { outroMessage: "No available integrations found." };
252617
+ }
252618
+ for (const { displayName, ...rest } of integrations) {
252619
+ const yaml2 = formatYaml(rest);
252620
+ const pad = " ".repeat(YAML_INDENT);
252621
+ log.info(`${displayName}
252622
+ ${pad}${yaml2.replace(/\n/g, `
252623
+ ${pad}`)}`);
252624
+ }
252625
+ return {
252626
+ outroMessage: `Found ${integrations.length} available integrations.`
252627
+ };
252628
+ }
252629
+ function getConnectorsListAvailableCommand() {
252630
+ return new Base44Command("list-available").description("List all available integration types").action(listAvailableAction);
252631
+ }
252632
+
252633
+ // src/cli/commands/connectors/pull.ts
252634
+ import { dirname as dirname15, join as join19, resolve as resolve5 } from "node:path";
252635
+ async function resolveConnectorsDir(options) {
252636
+ if (!getAppContext().projectRoot) {
252637
+ return resolve5(options.dir ?? "connectors");
252638
+ }
252639
+ const { project: project2 } = await readProjectConfig();
252640
+ return join19(dirname15(project2.configPath), project2.connectorsDir);
252641
+ }
252642
+ async function pullConnectorsAction({ log, runTask: runTask2, jsonMode }, options) {
252643
+ const connectorsDir = await resolveConnectorsDir(options);
252644
+ const remoteConnectors = await runTask2("Fetching connectors from Base44", async () => {
252645
+ return await pullAllConnectors();
252646
+ }, {
252647
+ successMessage: "Connectors fetched successfully",
252648
+ errorMessage: "Failed to fetch connectors"
252649
+ });
252650
+ const { written, deleted } = await runTask2("Syncing connector files", async () => {
252651
+ return await writeConnectors(connectorsDir, remoteConnectors);
252652
+ }, {
252653
+ successMessage: "Connector files synced successfully",
252654
+ errorMessage: "Failed to sync connector files"
252655
+ });
252656
+ if (jsonMode) {
252657
+ return {
252658
+ outroMessage: `Pulled ${remoteConnectors.length} connectors to ${connectorsDir}`,
252659
+ stdout: `${JSON.stringify({ connectorsDir, pulled: remoteConnectors.length, written, deleted }, null, 2)}
252660
+ `
252661
+ };
252662
+ }
252663
+ if (written.length > 0) {
252664
+ log.success(`Written: ${written.join(", ")}`);
252665
+ }
252666
+ if (deleted.length > 0) {
252667
+ log.warn(`Deleted: ${deleted.join(", ")}`);
252668
+ }
252669
+ if (written.length === 0 && deleted.length === 0) {
252670
+ log.info("All connectors are already up to date");
252671
+ }
252672
+ return {
252673
+ outroMessage: `Pulled ${remoteConnectors.length} connectors to ${connectorsDir}`
252674
+ };
252675
+ }
252676
+ function getConnectorsPullCommand() {
252677
+ return new Base44Command("pull").description("Pull connectors from Base44 to local files (replaces all local connector configs)").option("--dir <path>", "Directory to write connector files to (default: ./connectors when using --app-id)").action(pullConnectorsAction);
252678
+ }
252679
+
252589
252680
  // src/cli/commands/connectors/push.ts
252681
+ import { resolve as resolve6 } from "node:path";
252682
+ async function readConnectorsToPush(options) {
252683
+ if (!getAppContext().projectRoot) {
252684
+ return readAllConnectors(resolve6(options.dir ?? "connectors"));
252685
+ }
252686
+ const { connectors } = await readProjectConfig();
252687
+ return connectors;
252688
+ }
252590
252689
  function printSummary(results, oauthOutcomes, log) {
252591
252690
  const synced = [];
252592
252691
  const added = [];
@@ -252649,17 +252748,15 @@ function printSummary(results, oauthOutcomes, log) {
252649
252748
  log.error(`Failed: ${r.type} - ${r.error}`);
252650
252749
  }
252651
252750
  }
252652
- async function pushConnectorsAction({
252653
- isNonInteractive,
252654
- log,
252655
- runTask: runTask2
252656
- }) {
252657
- const { connectors } = await readProjectConfig();
252658
- if (connectors.length === 0) {
252659
- log.info("No local connectors found - checking for remote connectors to remove");
252660
- } else {
252661
- const connectorNames = connectors.map((c3) => c3.type).join(", ");
252662
- log.info(`Found ${connectors.length} connectors to push: ${connectorNames}`);
252751
+ async function pushConnectorsAction({ isNonInteractive, log, runTask: runTask2, jsonMode }, options) {
252752
+ const connectors = await readConnectorsToPush(options);
252753
+ if (!jsonMode) {
252754
+ if (connectors.length === 0) {
252755
+ log.info("No local connectors found - checking for remote connectors to remove");
252756
+ } else {
252757
+ const connectorNames = connectors.map((c3) => c3.type).join(", ");
252758
+ log.info(`Found ${connectors.length} connectors to push: ${connectorNames}`);
252759
+ }
252663
252760
  }
252664
252761
  const { results } = await runTask2("Pushing connectors to Base44", async () => {
252665
252762
  return await pushConnectors(connectors);
@@ -252673,16 +252770,23 @@ async function pushConnectorsAction({
252673
252770
  if (needsOAuth.length > 0 && !allAuthorized) {
252674
252771
  outroMessage = isNonInteractive ? "Skipped OAuth in non-interactive mode. Run 'base44 connectors push' locally or open the links above to authorize." : "Some connectors still require authorization. Run 'base44 connectors push' or open the links above to authorize.";
252675
252772
  }
252773
+ if (jsonMode) {
252774
+ return {
252775
+ outroMessage,
252776
+ stdout: `${JSON.stringify({ results, oauth: Object.fromEntries(oauthOutcomes) }, null, 2)}
252777
+ `
252778
+ };
252779
+ }
252676
252780
  printSummary(results, oauthOutcomes, log);
252677
252781
  return { outroMessage };
252678
252782
  }
252679
252783
  function getConnectorsPushCommand() {
252680
- return new Base44Command("push").description("Push local connectors to Base44 (overwrites connectors on Base44)").action(pushConnectorsAction);
252784
+ return new Base44Command("push").description("Push local connectors to Base44 (overwrites connectors on Base44)").option("--dir <path>", "Directory to read connector files from (default: ./connectors when using --app-id)").action(pushConnectorsAction);
252681
252785
  }
252682
252786
 
252683
252787
  // src/cli/commands/connectors/index.ts
252684
252788
  function getConnectorsCommand() {
252685
- return new Command("connectors").description("Manage project connectors (OAuth integrations)").addCommand(getConnectorsListAvailableCommand()).addCommand(getConnectorsPullCommand()).addCommand(getConnectorsPushCommand());
252789
+ return new Command("connectors").description("Manage project connectors (OAuth integrations)").addCommand(getConnectorsListAvailableCommand()).addCommand(getConnectorsInitiateCommand()).addCommand(getConnectorsPullCommand()).addCommand(getConnectorsPushCommand());
252686
252790
  }
252687
252791
 
252688
252792
  // src/cli/commands/dashboard/open.ts
@@ -252989,7 +253093,7 @@ function getFunctionsCommand() {
252989
253093
  }
252990
253094
 
252991
253095
  // src/cli/commands/project/create.ts
252992
- import { basename as basename4, resolve as resolve5 } from "node:path";
253096
+ import { basename as basename4, resolve as resolve7 } from "node:path";
252993
253097
  var import_kebabCase = __toESM(require_kebabCase(), 1);
252994
253098
 
252995
253099
  // src/cli/commands/project/scaffold-shared.ts
@@ -253143,7 +253247,7 @@ async function createInteractive(options, ctx) {
253143
253247
  }, ctx);
253144
253248
  }
253145
253249
  async function createNonInteractive(options, ctx) {
253146
- ctx.log.info(`Creating a new project at ${resolve5(options.path)}`);
253250
+ ctx.log.info(`Creating a new project at ${resolve7(options.path)}`);
253147
253251
  const template2 = await getTemplateById(options.template ?? DEFAULT_TEMPLATE_ID);
253148
253252
  return await executeCreate({
253149
253253
  template: template2,
@@ -253165,7 +253269,7 @@ async function executeCreate({
253165
253269
  }, ctx) {
253166
253270
  const { log, runTask: runTask2 } = ctx;
253167
253271
  const name2 = rawName.trim();
253168
- const resolvedPath = resolve5(projectPath);
253272
+ const resolvedPath = resolve7(projectPath);
253169
253273
  const { projectId } = await runTask2("Setting up your project...", async () => {
253170
253274
  return await createProjectFiles({
253171
253275
  name: name2,
@@ -253606,7 +253710,7 @@ function getLogsCommand() {
253606
253710
  }
253607
253711
 
253608
253712
  // src/cli/commands/project/scaffold.ts
253609
- import { basename as basename5, resolve as resolve6 } from "node:path";
253713
+ import { basename as basename5, resolve as resolve8 } from "node:path";
253610
253714
  function resolveAppId(options) {
253611
253715
  const appId = options.appId;
253612
253716
  if (!appId) {
@@ -253622,7 +253726,7 @@ function resolveAppId(options) {
253622
253726
  async function scaffoldAction(ctx, name2, options, command2) {
253623
253727
  const { log, runTask: runTask2 } = ctx;
253624
253728
  const appId = resolveAppId(command2.optsWithGlobals());
253625
- const resolvedPath = resolve6("./");
253729
+ const resolvedPath = resolve8("./");
253626
253730
  const projectName = (name2 ?? basename5(resolvedPath)).trim();
253627
253731
  const template2 = await getTemplateById("backend-only");
253628
253732
  log.info(`Scaffolding project at ${resolvedPath}`);
@@ -253659,6 +253763,316 @@ Examples:
253659
253763
  $ base44 scaffold my-app --app-id app_123 Scaffolds the current dir, named "my-app"`).action(scaffoldAction);
253660
253764
  }
253661
253765
 
253766
+ // src/core/resources/sandbox/schema.ts
253767
+ var FileErrorSchema = exports_external.object({
253768
+ code: exports_external.string(),
253769
+ message: exports_external.string()
253770
+ });
253771
+ var ReadFileEntrySchema = exports_external.object({
253772
+ path: exports_external.string(),
253773
+ content: exports_external.string().optional(),
253774
+ start_line: exports_external.number().optional(),
253775
+ end_line: exports_external.number().optional(),
253776
+ total_lines: exports_external.number().optional(),
253777
+ truncated: exports_external.boolean().optional(),
253778
+ error: FileErrorSchema.optional()
253779
+ }).transform((data) => ({
253780
+ path: data.path,
253781
+ content: data.content,
253782
+ startLine: data.start_line,
253783
+ endLine: data.end_line,
253784
+ totalLines: data.total_lines,
253785
+ truncated: data.truncated,
253786
+ error: data.error
253787
+ }));
253788
+ var ReadFileResponseSchema = exports_external.object({
253789
+ files: exports_external.array(ReadFileEntrySchema)
253790
+ });
253791
+ var WriteFileResponseSchema = exports_external.object({
253792
+ path: exports_external.string(),
253793
+ bytes_written: exports_external.number(),
253794
+ created: exports_external.boolean(),
253795
+ overwritten: exports_external.boolean()
253796
+ }).transform((data) => ({
253797
+ path: data.path,
253798
+ bytesWritten: data.bytes_written,
253799
+ created: data.created,
253800
+ overwritten: data.overwritten
253801
+ }));
253802
+ var EditFileResponseSchema = exports_external.object({
253803
+ path: exports_external.string(),
253804
+ diff: exports_external.string(),
253805
+ applied: exports_external.boolean()
253806
+ });
253807
+ var GrepMatchSchema = exports_external.object({
253808
+ path: exports_external.string().nullable(),
253809
+ line: exports_external.number().nullable(),
253810
+ text: exports_external.string()
253811
+ });
253812
+ var GrepResponseSchema = exports_external.object({
253813
+ matches: exports_external.array(GrepMatchSchema),
253814
+ truncated: exports_external.boolean(),
253815
+ returned_matches: exports_external.number()
253816
+ }).transform((data) => ({
253817
+ matches: data.matches,
253818
+ truncated: data.truncated,
253819
+ returnedMatches: data.returned_matches
253820
+ }));
253821
+ var DirectoryEntrySchema = exports_external.object({
253822
+ name: exports_external.string(),
253823
+ path: exports_external.string(),
253824
+ type: exports_external.enum(["file", "directory"]),
253825
+ size: exports_external.number().optional()
253826
+ });
253827
+ var ListDirectoryResponseSchema = exports_external.object({
253828
+ entries: exports_external.array(DirectoryEntrySchema),
253829
+ truncated: exports_external.boolean()
253830
+ });
253831
+ var RunCommandResponseSchema = exports_external.object({
253832
+ stdout: exports_external.string(),
253833
+ stderr: exports_external.string(),
253834
+ exit_code: exports_external.number(),
253835
+ truncated: exports_external.boolean(),
253836
+ duration_ms: exports_external.number()
253837
+ }).transform((data) => ({
253838
+ stdout: data.stdout,
253839
+ stderr: data.stderr,
253840
+ exitCode: data.exit_code,
253841
+ truncated: data.truncated,
253842
+ durationMs: data.duration_ms
253843
+ }));
253844
+ var ReleaseResponseSchema = exports_external.object({
253845
+ app_id: exports_external.string(),
253846
+ released: exports_external.boolean()
253847
+ }).transform((data) => ({
253848
+ appId: data.app_id,
253849
+ released: data.released
253850
+ }));
253851
+
253852
+ // src/core/resources/sandbox/api.ts
253853
+ function isMissingSandboxScope(error48) {
253854
+ if (error48.statusCode !== 401 && error48.statusCode !== 403) {
253855
+ return false;
253856
+ }
253857
+ const text = `${error48.message} ${JSON.stringify(error48.responseBody ?? "")}`;
253858
+ return /sandbox:write/i.test(text) || /granting sandbox access/i.test(text);
253859
+ }
253860
+ function withSandboxAuthHint(error48) {
253861
+ if (!isMissingSandboxScope(error48)) {
253862
+ return error48;
253863
+ }
253864
+ return new ApiError(error48.message, {
253865
+ statusCode: error48.statusCode,
253866
+ requestUrl: error48.requestUrl,
253867
+ requestMethod: error48.requestMethod,
253868
+ requestBody: error48.requestBody,
253869
+ responseBody: error48.responseBody,
253870
+ requestId: error48.requestId,
253871
+ details: error48.details,
253872
+ hints: [
253873
+ ...error48.hints,
253874
+ {
253875
+ message: "Run 'base44 login' again to grant sandbox access (the sandbox:write scope is only granted at login).",
253876
+ command: "base44 login"
253877
+ }
253878
+ ],
253879
+ cause: error48
253880
+ });
253881
+ }
253882
+ async function callTool(appId, tool, payload, schema10, context, timeout2 = 60000) {
253883
+ const client = getSandboxClient(appId);
253884
+ let response;
253885
+ try {
253886
+ response = await client.post(tool, { json: payload, timeout: timeout2 });
253887
+ } catch (error48) {
253888
+ throw withSandboxAuthHint(await ApiError.fromHttpError(error48, context));
253889
+ }
253890
+ const result = schema10.safeParse(await response.json());
253891
+ if (!result.success) {
253892
+ throw new SchemaValidationError("Invalid response from server", result.error);
253893
+ }
253894
+ return result.data;
253895
+ }
253896
+ function listDirectory(appId, params) {
253897
+ return callTool(appId, "list_directory", { ...params }, ListDirectoryResponseSchema, "listing directory");
253898
+ }
253899
+ function readFile2(appId, params) {
253900
+ return callTool(appId, "read_file", { ...params }, ReadFileResponseSchema, "reading file");
253901
+ }
253902
+ function writeFile2(appId, params) {
253903
+ return callTool(appId, "write_file", { ...params }, WriteFileResponseSchema, `writing file "${params.path}"`);
253904
+ }
253905
+ function editFile(appId, params) {
253906
+ return callTool(appId, "edit_file", { ...params }, EditFileResponseSchema, `editing file "${params.path}"`);
253907
+ }
253908
+ function grep(appId, params) {
253909
+ return callTool(appId, "grep", { ...params }, GrepResponseSchema, "searching files");
253910
+ }
253911
+ function runCommand(appId, params) {
253912
+ return callTool(appId, "run_command", { ...params }, RunCommandResponseSchema, "running command", false);
253913
+ }
253914
+ function releaseSession(appId) {
253915
+ return callTool(appId, "release", {}, ReleaseResponseSchema, "releasing sandbox session");
253916
+ }
253917
+
253918
+ // src/cli/commands/sandbox/shared.ts
253919
+ async function resolveFlagOrStdin(flagValue, flagName) {
253920
+ if (flagValue !== undefined) {
253921
+ return flagValue;
253922
+ }
253923
+ if (process.stdin.isTTY) {
253924
+ throw new InvalidInputError(`Provide ${flagName} or pipe the value via stdin (e.g. echo <value> | base44 sandbox ...).`);
253925
+ }
253926
+ return readStdin(flagName, { trim: false });
253927
+ }
253928
+ function toJsonStdout(result) {
253929
+ return `${JSON.stringify(result, null, 2)}
253930
+ `;
253931
+ }
253932
+ function parsePositiveInt(value, flagName) {
253933
+ if (value === undefined) {
253934
+ return;
253935
+ }
253936
+ const n2 = Number.parseInt(value, 10);
253937
+ if (!Number.isInteger(n2) || n2 < 1) {
253938
+ throw new InvalidInputError(`${flagName} must be a positive integer.`);
253939
+ }
253940
+ return n2;
253941
+ }
253942
+
253943
+ // src/cli/commands/sandbox/edit-file.ts
253944
+ var EditsInputSchema = exports_external.array(exports_external.object({
253945
+ old_text: exports_external.string().min(1),
253946
+ new_text: exports_external.string(),
253947
+ replace_all: exports_external.boolean().optional()
253948
+ })).min(1);
253949
+ function parseEdits(raw2) {
253950
+ let parsed;
253951
+ try {
253952
+ parsed = JSON.parse(raw2);
253953
+ } catch {
253954
+ throw new InvalidInputError("--edits-json must be valid JSON (an array of { old_text, new_text, replace_all? }).");
253955
+ }
253956
+ const result = EditsInputSchema.safeParse(parsed);
253957
+ if (!result.success) {
253958
+ throw new InvalidInputError("Invalid edits: expected a non-empty array of { old_text (non-empty string), new_text (string), replace_all? (boolean) }.");
253959
+ }
253960
+ return result.data;
253961
+ }
253962
+ async function editFileAction({ runTask: runTask2 }, path17, options) {
253963
+ const { id: appId } = getAppContext();
253964
+ const raw2 = await resolveFlagOrStdin(options.editsJson, "--edits-json");
253965
+ const edits = parseEdits(raw2);
253966
+ const result = await runTask2(options.dryRun ? "Previewing edit" : "Editing file", () => editFile(appId, { path: path17, edits, dry_run: options.dryRun }));
253967
+ return {
253968
+ outroMessage: options.dryRun ? "Previewed edit" : "Edited file",
253969
+ stdout: toJsonStdout(result)
253970
+ };
253971
+ }
253972
+ function getSandboxEditFileCommand() {
253973
+ return new Base44Command("edit-file").description("Apply exact old→new string edits to a file in the sandbox").argument("<path>", "File path relative to the app root").option("--edits-json <json>", "JSON array of edits (if omitted, read from stdin)").option("--dry-run", "Return the unified diff without writing").addHelpText("after", `
253974
+ Each edit is { "old_text": "...", "new_text": "...", "replace_all"?: true }.
253975
+
253976
+ Examples:
253977
+ $ echo '[{"old_text":"foo","new_text":"bar"}]' | base44 sandbox edit-file src/x.ts
253978
+ $ base44 sandbox edit-file src/x.ts --dry-run --edits-json '[{"old_text":"a","new_text":"b","replace_all":true}]'`).action(editFileAction);
253979
+ }
253980
+
253981
+ // src/cli/commands/sandbox/grep.ts
253982
+ async function grepAction({ runTask: runTask2 }, pattern, options) {
253983
+ const { id: appId } = getAppContext();
253984
+ const maxResults = parsePositiveInt(options.maxResults, "--max-results");
253985
+ const result = await runTask2("Searching files", () => grep(appId, {
253986
+ pattern,
253987
+ path: options.path,
253988
+ is_regex: options.regex,
253989
+ case_sensitive: options.caseSensitive,
253990
+ glob: options.glob,
253991
+ max_results: maxResults
253992
+ }));
253993
+ return { outroMessage: "Searched files", stdout: toJsonStdout(result) };
253994
+ }
253995
+ function getSandboxGrepCommand() {
253996
+ return new Base44Command("grep").description("Search files for a pattern in an app's remote sandbox").argument("<pattern>", "Search pattern").option("--path <path>", "Subtree to search, relative to the app root").option("--no-regex", "Treat the pattern as a literal string, not a regex").option("--case-sensitive", "Case-sensitive match").option("--glob <glob>", 'File glob filter, e.g. "*.tsx"').option("--max-results <n>", "Maximum number of match lines to return").action(grepAction);
253997
+ }
253998
+
253999
+ // src/cli/commands/sandbox/list-directory.ts
254000
+ async function listDirectoryAction({ runTask: runTask2 }, path17, options) {
254001
+ const { id: appId } = getAppContext();
254002
+ const maxDepth = parsePositiveInt(options.maxDepth, "--max-depth");
254003
+ const result = await runTask2("Listing directory", () => listDirectory(appId, {
254004
+ path: path17,
254005
+ recursive: options.recursive,
254006
+ max_depth: maxDepth,
254007
+ include_hidden: options.includeHidden
254008
+ }));
254009
+ return { outroMessage: "Listed directory", stdout: toJsonStdout(result) };
254010
+ }
254011
+ function getSandboxListDirectoryCommand() {
254012
+ return new Base44Command("list-directory").description("List directory entries in an app's remote sandbox").argument("[path]", "Directory relative to the app root (default: app root)").option("--recursive", "List nested entries").option("--max-depth <n>", "Max depth when recursive (1-10, default 3)").option("--include-hidden", "Include dotfiles").action(listDirectoryAction);
254013
+ }
254014
+
254015
+ // src/cli/commands/sandbox/read-file.ts
254016
+ async function readFileAction({ runTask: runTask2 }, paths, options) {
254017
+ const { id: appId } = getAppContext();
254018
+ const offset = parsePositiveInt(options.offset, "--offset");
254019
+ const limit = parsePositiveInt(options.limit, "--limit");
254020
+ const result = await runTask2("Reading file", () => readFile2(appId, { paths, offset, limit }));
254021
+ return { outroMessage: "Read file", stdout: toJsonStdout(result) };
254022
+ }
254023
+ function getSandboxReadFileCommand() {
254024
+ return new Base44Command("read-file").description("Read file contents from an app's remote sandbox").argument("<paths...>", "One or more file paths relative to the app root").option("--offset <n>", "1-based start line").option("--limit <n>", "Max lines to return from offset").action(readFileAction);
254025
+ }
254026
+
254027
+ // src/cli/commands/sandbox/release.ts
254028
+ async function releaseAction({
254029
+ runTask: runTask2
254030
+ }) {
254031
+ const { id: appId } = getAppContext();
254032
+ const result = await runTask2("Releasing sandbox session", () => releaseSession(appId));
254033
+ return {
254034
+ outroMessage: "Released sandbox session",
254035
+ stdout: toJsonStdout(result)
254036
+ };
254037
+ }
254038
+ function getSandboxReleaseCommand() {
254039
+ return new Base44Command("release").description("Release the external-agent session so the in-app builder can resume").action(releaseAction);
254040
+ }
254041
+
254042
+ // src/cli/commands/sandbox/run-command.ts
254043
+ async function runCommandAction({ runTask: runTask2 }, commandParts, options) {
254044
+ const { id: appId } = getAppContext();
254045
+ const timeoutMs = parsePositiveInt(options.timeoutMs, "--timeout-ms");
254046
+ const command2 = commandParts.join(" ");
254047
+ const result = await runTask2("Running command", () => runCommand(appId, { command: command2, cwd: options.cwd, timeout_ms: timeoutMs }));
254048
+ return { outroMessage: "Ran command", stdout: toJsonStdout(result) };
254049
+ }
254050
+ function getSandboxRunCommandCommand() {
254051
+ return new Base44Command("run-command").description("Run a shell command in an app's remote sandbox").argument("<command...>", "Shell command to execute (quote to keep as one)").option("--cwd <path>", "Working directory relative to the app root").option("--timeout-ms <n>", "Timeout in milliseconds (default 120000, max 600000)").addHelpText("after", `
254052
+ Examples:
254053
+ $ base44 sandbox run-command "npm test"
254054
+ $ base44 sandbox run-command ls -la --cwd src`).action(runCommandAction);
254055
+ }
254056
+
254057
+ // src/cli/commands/sandbox/write-file.ts
254058
+ async function writeFileAction({ runTask: runTask2 }, path17, options) {
254059
+ const { id: appId } = getAppContext();
254060
+ const content = await resolveFlagOrStdin(options.content, "--content");
254061
+ const result = await runTask2("Writing file", () => writeFile2(appId, { path: path17, content, overwrite: options.overwrite }));
254062
+ return { outroMessage: "Wrote file", stdout: toJsonStdout(result) };
254063
+ }
254064
+ function getSandboxWriteFileCommand() {
254065
+ return new Base44Command("write-file").description("Create or overwrite a file in an app's remote sandbox").argument("<path>", "File path relative to the app root").option("--content <content>", "File content (if omitted, read from stdin)").option("--overwrite", "Overwrite the file if it already exists").addHelpText("after", `
254066
+ Examples:
254067
+ $ echo "hello" | base44 sandbox write-file notes.txt
254068
+ $ base44 sandbox write-file notes.txt --content "hello" --overwrite`).action(writeFileAction);
254069
+ }
254070
+
254071
+ // src/cli/commands/sandbox/index.ts
254072
+ function getSandboxCommand() {
254073
+ return new Command("sandbox").description("Develop an app remotely via its server-side sandbox").addCommand(getSandboxListDirectoryCommand()).addCommand(getSandboxReadFileCommand()).addCommand(getSandboxWriteFileCommand()).addCommand(getSandboxEditFileCommand()).addCommand(getSandboxGrepCommand()).addCommand(getSandboxRunCommandCommand()).addCommand(getSandboxReleaseCommand());
254074
+ }
254075
+
253662
254076
  // src/cli/commands/secrets/delete.ts
253663
254077
  async function deleteSecretAction({ runTask: runTask2 }, key) {
253664
254078
  await runTask2(`Deleting secret "${key}"`, async () => {
@@ -253702,7 +254116,7 @@ function getSecretsListCommand() {
253702
254116
  }
253703
254117
 
253704
254118
  // src/cli/commands/secrets/set.ts
253705
- import { resolve as resolve7 } from "node:path";
254119
+ import { resolve as resolve9 } from "node:path";
253706
254120
  function parseEntries(entries) {
253707
254121
  const secrets = {};
253708
254122
  for (const entry of entries) {
@@ -253733,7 +254147,7 @@ async function setSecretsAction({ log, runTask: runTask2 }, entries, options) {
253733
254147
  validateInput(entries, options);
253734
254148
  let secrets;
253735
254149
  if (options.envFile) {
253736
- secrets = await parseEnvFile(resolve7(options.envFile));
254150
+ secrets = await parseEnvFile(resolve9(options.envFile));
253737
254151
  if (Object.keys(secrets).length === 0) {
253738
254152
  throw new InvalidInputError("The env file contains no valid KEY=VALUE entries.");
253739
254153
  }
@@ -253762,7 +254176,7 @@ function getSecretsCommand() {
253762
254176
  }
253763
254177
 
253764
254178
  // src/cli/commands/site/deploy.ts
253765
- import { resolve as resolve8 } from "node:path";
254179
+ import { resolve as resolve10 } from "node:path";
253766
254180
  async function deployAction2({ isNonInteractive, runTask: runTask2 }, options) {
253767
254181
  if (isNonInteractive && !options.yes) {
253768
254182
  throw new InvalidInputError("--yes is required in non-interactive mode");
@@ -253777,7 +254191,7 @@ async function deployAction2({ isNonInteractive, runTask: runTask2 }, options) {
253777
254191
  ]
253778
254192
  });
253779
254193
  }
253780
- const outputDir = resolve8(project2.root, project2.site.outputDirectory);
254194
+ const outputDir = resolve10(project2.root, project2.site.outputDirectory);
253781
254195
  if (!options.yes) {
253782
254196
  const shouldDeploy = await Re({
253783
254197
  message: `Deploy site from ${project2.site.outputDirectory}?`
@@ -253953,10 +254367,6 @@ function getTypesCommand() {
253953
254367
  return new Command("types").description("Manage TypeScript type generation").addCommand(getTypesGenerateCommand());
253954
254368
  }
253955
254369
 
253956
- // src/cli/commands/dev.ts
253957
- import { join as join28 } from "node:path";
253958
- import process21 from "node:process";
253959
-
253960
254370
  // src/cli/dev/dev-server/main.ts
253961
254371
  var import_cors = __toESM(require_lib4(), 1);
253962
254372
  var import_express6 = __toESM(require_express(), 1);
@@ -253987,14 +254397,14 @@ var getLocalHosts = () => {
253987
254397
  }
253988
254398
  return results;
253989
254399
  };
253990
- var checkAvailablePort = (options8) => new Promise((resolve10, reject) => {
254400
+ var checkAvailablePort = (options8) => new Promise((resolve12, reject) => {
253991
254401
  const server = net.createServer();
253992
254402
  server.unref();
253993
254403
  server.on("error", reject);
253994
254404
  server.listen(options8, () => {
253995
254405
  const { port } = server.address();
253996
254406
  server.close(() => {
253997
- resolve10(port);
254407
+ resolve12(port);
253998
254408
  });
253999
254409
  });
254000
254410
  });
@@ -254112,12 +254522,11 @@ var stringify = (item) => {
254112
254522
  return String(item);
254113
254523
  }
254114
254524
  };
254115
- function createDevLogger() {
254525
+ function createDevLogger(label2, labelColor = theme.styles.dim) {
254526
+ const prefix = label2 ? `${labelColor(`[${label2}]`)} ` : "";
254116
254527
  const print = (type, ...args) => {
254117
254528
  const colorize = colorByType[type];
254118
- console[type](...args.map((item) => {
254119
- return colorize(stringify(item));
254120
- }));
254529
+ console[type](prefix + args.map((item) => colorize(stringify(item))).join(" "));
254121
254530
  };
254122
254531
  return {
254123
254532
  log: (...args) => print("log", ...args),
@@ -254254,7 +254663,7 @@ class FunctionManager {
254254
254663
  });
254255
254664
  }
254256
254665
  waitForReady(name2, runningFunc) {
254257
- return new Promise((resolve10, reject) => {
254666
+ return new Promise((resolve12, reject) => {
254258
254667
  runningFunc.process.on("exit", (code2) => {
254259
254668
  if (!runningFunc.ready) {
254260
254669
  clearTimeout(timeout3);
@@ -254277,7 +254686,7 @@ class FunctionManager {
254277
254686
  runningFunc.ready = true;
254278
254687
  clearTimeout(timeout3);
254279
254688
  runningFunc.process.stdout?.off("data", onData);
254280
- resolve10(runningFunc.port);
254689
+ resolve12(runningFunc.port);
254281
254690
  }
254282
254691
  };
254283
254692
  runningFunc.process.stdout?.on("data", onData);
@@ -255484,6 +255893,109 @@ function createCustomIntegrationRoutes(remoteProxy, logger2) {
255484
255893
  return router;
255485
255894
  }
255486
255895
 
255896
+ // src/cli/dev/dev-server/serve-runner.ts
255897
+ import { spawn as spawn3 } from "node:child_process";
255898
+ import process21 from "node:process";
255899
+
255900
+ class ServeRunner {
255901
+ command;
255902
+ cwd;
255903
+ env;
255904
+ logger;
255905
+ child;
255906
+ stopping = false;
255907
+ stopPromise;
255908
+ exitListeners = [];
255909
+ constructor(options8) {
255910
+ this.command = options8.command;
255911
+ this.cwd = options8.cwd;
255912
+ this.env = options8.env;
255913
+ this.logger = options8.logger;
255914
+ }
255915
+ start() {
255916
+ if (this.child) {
255917
+ return;
255918
+ }
255919
+ const stdin2 = process21.platform === "win32" ? "ignore" : "inherit";
255920
+ const child = spawn3(this.command, {
255921
+ cwd: this.cwd,
255922
+ shell: true,
255923
+ detached: process21.platform !== "win32",
255924
+ env: { ...process21.env, ...this.env },
255925
+ stdio: [stdin2, "pipe", "pipe"],
255926
+ windowsHide: true
255927
+ });
255928
+ this.child = child;
255929
+ this.setupHandlers(child);
255930
+ }
255931
+ onExit(listener) {
255932
+ this.exitListeners.push(listener);
255933
+ }
255934
+ async stop() {
255935
+ if (this.stopPromise) {
255936
+ return this.stopPromise;
255937
+ }
255938
+ this.stopPromise = this.stopChild();
255939
+ return this.stopPromise;
255940
+ }
255941
+ async stopChild() {
255942
+ const child = this.child;
255943
+ if (!child || child.exitCode !== null) {
255944
+ return;
255945
+ }
255946
+ this.stopping = true;
255947
+ const exited = new Promise((resolve12) => child.once("exit", () => resolve12()));
255948
+ if (process21.platform === "win32" && child.pid) {
255949
+ const taskkill = spawn3("taskkill", ["/pid", String(child.pid), "/T", "/F"], {
255950
+ stdio: "ignore",
255951
+ windowsHide: true
255952
+ });
255953
+ await new Promise((resolve12) => {
255954
+ taskkill.once("exit", () => resolve12());
255955
+ taskkill.once("error", () => resolve12());
255956
+ });
255957
+ } else if (child.pid) {
255958
+ try {
255959
+ process21.kill(-child.pid, "SIGTERM");
255960
+ } catch {
255961
+ child.kill();
255962
+ }
255963
+ }
255964
+ await exited;
255965
+ }
255966
+ setupHandlers(child) {
255967
+ child.stdout?.on("data", (data) => this.emitLines(data, "log"));
255968
+ child.stderr?.on("data", (data) => this.emitLines(data, "error"));
255969
+ child.on("error", (error48) => {
255970
+ this.logger.error("Frontend dev server failed to start:", error48);
255971
+ this.notifyExit(null);
255972
+ });
255973
+ child.on("exit", (code2) => {
255974
+ if (this.stopping) {
255975
+ return;
255976
+ }
255977
+ this.logger.error(`Frontend dev server exited with code ${code2}`);
255978
+ this.notifyExit(code2);
255979
+ });
255980
+ }
255981
+ notifyExit(code2) {
255982
+ for (const listener of this.exitListeners) {
255983
+ listener(code2);
255984
+ }
255985
+ }
255986
+ emitLines(data, type) {
255987
+ const lines = data.toString().trimEnd().split(`
255988
+ `);
255989
+ for (const line3 of lines) {
255990
+ if (type === "error") {
255991
+ this.logger.error(line3);
255992
+ } else {
255993
+ this.logger.log(line3);
255994
+ }
255995
+ }
255996
+ }
255997
+ }
255998
+
255487
255999
  // src/cli/dev/dev-server/watcher.ts
255488
256000
  import { EventEmitter as EventEmitter4 } from "node:events";
255489
256001
  import { relative as relative6 } from "node:path";
@@ -256334,7 +256846,7 @@ class NodeFsHandler {
256334
256846
  this._addToNodeFs(path19, initialAdd, wh2, depth + 1);
256335
256847
  }
256336
256848
  }).on(EV.ERROR, this._boundHandleError);
256337
- return new Promise((resolve11, reject) => {
256849
+ return new Promise((resolve13, reject) => {
256338
256850
  if (!stream)
256339
256851
  return reject();
256340
256852
  stream.once(STR_END, () => {
@@ -256343,7 +256855,7 @@ class NodeFsHandler {
256343
256855
  return;
256344
256856
  }
256345
256857
  const wasThrottled = throttler ? throttler.clear() : false;
256346
- resolve11(undefined);
256858
+ resolve13(undefined);
256347
256859
  previous.getChildren().filter((item) => {
256348
256860
  return item !== directory && !current.has(item);
256349
256861
  }).forEach((item) => {
@@ -257189,7 +257701,7 @@ async function createDevServer(options8) {
257189
257701
  port: process.env.IS_TEST === "true" ? undefined : DEFAULT_PORT
257190
257702
  });
257191
257703
  const baseUrl = `http://localhost:${port}`;
257192
- const { functions, entities, project: project2 } = await options8.loadResources();
257704
+ const { functions, entities, project: project2, siteUrl } = await options8.loadResources();
257193
257705
  const app = import_express6.default();
257194
257706
  const remoteProxy = import_http_proxy_middleware2.createProxyMiddleware({
257195
257707
  target: BASE44_APP_URL,
@@ -257207,17 +257719,17 @@ async function createDevServer(options8) {
257207
257719
  }
257208
257720
  next();
257209
257721
  });
257210
- const devLogger = createDevLogger();
257722
+ const devLogger = createDevLogger("backend", theme.styles.info);
257211
257723
  const functionManager = new FunctionManager(functions, devLogger, options8.denoWrapperPath);
257212
257724
  const functionRoutes = createFunctionRouter(functionManager, devLogger);
257213
257725
  app.use("/api/apps/:appId/functions", functionRoutes);
257214
257726
  if (functionManager.getFunctionNames().length > 0) {
257215
- options8.log.info(`Loaded functions: ${functionManager.getFunctionNames().join(", ")}`);
257727
+ devLogger.log(`Loaded functions: ${functionManager.getFunctionNames().join(", ")}`);
257216
257728
  }
257217
257729
  const db2 = new Database;
257218
257730
  await db2.load(entities);
257219
257731
  if (db2.getCollectionNames().length > 0) {
257220
- options8.log.info(`Loaded entities: ${db2.getCollectionNames().join(", ")}`);
257732
+ devLogger.log(`Loaded entities: ${db2.getCollectionNames().join(", ")}`);
257221
257733
  }
257222
257734
  let emitEntityEvent = () => {};
257223
257735
  const entityRoutes = await createEntityRoutes(db2, devLogger, (...args) => emitEntityEvent(...args));
@@ -257249,12 +257761,18 @@ async function createDevServer(options8) {
257249
257761
  const customIntegrationRoutes = createCustomIntegrationRoutes(remoteProxy, devLogger);
257250
257762
  app.use("/api/apps/:appId/integrations/custom", customIntegrationRoutes);
257251
257763
  app.use((req, res, next) => {
257764
+ if (siteUrl && (req.path === "/login" || req.path.startsWith("/login/"))) {
257765
+ const targetUrl = new URL(req.originalUrl, siteUrl);
257766
+ devLogger.warn(`"${req.originalUrl}" requires hosted login, redirecting to ${targetUrl.toString()}`);
257767
+ res.redirect(targetUrl.toString());
257768
+ return;
257769
+ }
257252
257770
  if (!req.originalUrl.endsWith("analytics/track/batch")) {
257253
257771
  devLogger.warn(`"${req.originalUrl}" is not supported in local development, passing call to production`);
257254
257772
  }
257255
257773
  remoteProxy(req, res, next);
257256
257774
  });
257257
- const server = await new Promise((resolve12, reject) => {
257775
+ const server = await new Promise((resolve14, reject) => {
257258
257776
  const s5 = app.listen(port, "127.0.0.1", (err) => {
257259
257777
  if (err) {
257260
257778
  if ("code" in err && err.code === "EADDRINUSE") {
@@ -257263,7 +257781,7 @@ async function createDevServer(options8) {
257263
257781
  reject(err);
257264
257782
  }
257265
257783
  } else {
257266
- resolve12(s5);
257784
+ resolve14(s5);
257267
257785
  }
257268
257786
  });
257269
257787
  });
@@ -257305,59 +257823,101 @@ async function createDevServer(options8) {
257305
257823
  }
257306
257824
  });
257307
257825
  await base44ConfigWatcher.start();
257308
- const shutdown = async () => {
257826
+ const serveCommand = project2.site?.serveCommand;
257827
+ let serveRunner;
257828
+ if (options8.appId && serveCommand) {
257829
+ serveRunner = new ServeRunner({
257830
+ command: serveCommand,
257831
+ cwd: project2.root,
257832
+ env: {
257833
+ VITE_BASE44_APP_ID: options8.appId,
257834
+ VITE_BASE44_APP_BASE_URL: baseUrl
257835
+ },
257836
+ logger: createDevLogger("frontend", theme.colors.base44Orange)
257837
+ });
257838
+ }
257839
+ const handleShutdownError = (error48) => {
257840
+ const errorMessage = error48 instanceof Error ? error48.message : String(error48);
257841
+ devLogger.error(`Failed to shut down dev server: ${errorMessage}`);
257842
+ };
257843
+ const closeServerIfRunning = async () => {
257844
+ if (!server.listening) {
257845
+ return;
257846
+ }
257847
+ await new Promise((resolve14, reject) => {
257848
+ server.close((error48) => {
257849
+ if (error48) {
257850
+ reject(error48);
257851
+ return;
257852
+ }
257853
+ resolve14();
257854
+ });
257855
+ });
257856
+ };
257857
+ const runShutdown = async () => {
257309
257858
  base44ConfigWatcher.close();
257310
- io6.close();
257859
+ await io6.close();
257311
257860
  await functionManager.stopAll();
257312
- server.close();
257861
+ await serveRunner?.stop();
257862
+ await closeServerIfRunning();
257863
+ };
257864
+ let shutdownPromise;
257865
+ const shutdown = () => {
257866
+ shutdownPromise ??= runShutdown().catch(handleShutdownError);
257867
+ return shutdownPromise;
257313
257868
  };
257314
257869
  process.on("SIGINT", shutdown);
257315
257870
  process.on("SIGTERM", shutdown);
257316
- return { port, server };
257871
+ serveRunner?.onExit(() => {
257872
+ shutdown().finally(() => process.exit(1));
257873
+ });
257874
+ if (serveRunner) {
257875
+ devLogger.log(`Backend running on ${baseUrl}`);
257876
+ serveRunner.start();
257877
+ }
257878
+ return { port, server, isServingFrontend: serveRunner !== undefined };
257317
257879
  }
257318
257880
 
257319
257881
  // src/cli/commands/dev.ts
257320
257882
  function localServerUrl(port) {
257321
257883
  return `http://localhost:${port}`;
257322
257884
  }
257323
- async function writeEnvLocalIfMissing(projectRoot, port, log) {
257324
- const envLocalPath = join28(projectRoot, ".env.local");
257325
- if (await pathExists(envLocalPath)) {
257326
- return;
257885
+ function validateDevOptions(command2) {
257886
+ const { appId } = command2.optsWithGlobals();
257887
+ if (appId !== undefined) {
257888
+ command2.error(`base44 dev cannot be used with --app-id or ${BASE44_APP_ID_ENV_VAR}.`);
257327
257889
  }
257328
- const { id: appId } = await initAppContext();
257329
- await writeFile(envLocalPath, `VITE_BASE44_APP_ID=${appId}
257330
- VITE_BASE44_APP_BASE_URL=${localServerUrl(port)}
257331
- `);
257332
- log.info("Created .env.local with app ID and dev server URL");
257333
257890
  }
257334
- async function devAction({ log }, options8) {
257891
+ async function devAction(ctx, options8) {
257892
+ const { log, app } = ctx;
257893
+ if (!app?.projectRoot) {
257894
+ throw new ConfigInvalidError("base44 dev requires a linked local project. Run it from a project with base44/.app.jsonc.");
257895
+ }
257335
257896
  const port = options8.port ? Number(options8.port) : undefined;
257336
- let projectRoot;
257337
- const { port: resolvedPort } = await createDevServer({
257897
+ const appId = app.id;
257898
+ const siteUrlPromise = getSiteUrl().catch(() => {
257899
+ return;
257900
+ });
257901
+ const { port: resolvedPort, isServingFrontend } = await createDevServer({
257338
257902
  log,
257339
257903
  port,
257340
- cwd: process21.cwd(),
257904
+ appId,
257341
257905
  denoWrapperPath: getDenoWrapperPath(),
257342
257906
  loadResources: async () => {
257343
257907
  const { functions, entities, project: project2 } = await readProjectConfig();
257344
- projectRoot = project2.root;
257345
- return { functions, entities, project: project2 };
257908
+ const siteUrl = await siteUrlPromise;
257909
+ return { functions, entities, project: project2, siteUrl };
257346
257910
  }
257347
257911
  });
257348
- if (projectRoot) {
257349
- await writeEnvLocalIfMissing(projectRoot, resolvedPort, log);
257350
- }
257351
- return {
257352
- outroMessage: `Dev server is available at ${theme.colors.links(localServerUrl(resolvedPort))}`
257353
- };
257912
+ const outroMessage = isServingFrontend ? "Open your app using the frontend dev server URL" : `Dev server is available at ${theme.colors.links(localServerUrl(resolvedPort))}`;
257913
+ return { outroMessage };
257354
257914
  }
257355
257915
  function getDevCommand() {
257356
- return new Base44Command("dev").description("Start the development server").option("-p, --port <number>", "Port for the development server").action(devAction);
257916
+ return new Base44Command("dev").description("Start the development server").option("-p, --port <number>", "Port for the development server").hook("preAction", validateDevOptions).action(devAction);
257357
257917
  }
257358
257918
 
257359
257919
  // src/core/exec/run-script.ts
257360
- import { spawn as spawn3 } from "node:child_process";
257920
+ import { spawn as spawn4 } from "node:child_process";
257361
257921
  import { copyFileSync, writeFileSync as writeFileSync2 } from "node:fs";
257362
257922
  async function runScript(options8) {
257363
257923
  const { appId, code: code2 } = options8;
@@ -257376,7 +257936,7 @@ async function runScript(options8) {
257376
257936
  copyFileSync(getExecWrapperPath(), tempWrapper.path);
257377
257937
  try {
257378
257938
  const exitCode = await new Promise((resolvePromise) => {
257379
- const child = spawn3("deno", ["run", "--allow-all", "--node-modules-dir=auto", tempWrapper.path], {
257939
+ const child = spawn4("deno", ["run", "--allow-all", "--node-modules-dir=auto", tempWrapper.path], {
257380
257940
  env: {
257381
257941
  ...process.env,
257382
257942
  SCRIPT_PATH: scriptPath,
@@ -257399,13 +257959,13 @@ async function runScript(options8) {
257399
257959
  }
257400
257960
  // src/cli/commands/exec.ts
257401
257961
  function readStdin2() {
257402
- return new Promise((resolve12, reject) => {
257962
+ return new Promise((resolve14, reject) => {
257403
257963
  let data = "";
257404
257964
  process.stdin.setEncoding("utf-8");
257405
257965
  process.stdin.on("data", (chunk) => {
257406
257966
  data += chunk;
257407
257967
  });
257408
- process.stdin.on("end", () => resolve12(data));
257968
+ process.stdin.on("end", () => resolve14(data));
257409
257969
  process.stdin.on("error", reject);
257410
257970
  });
257411
257971
  }
@@ -257447,7 +258007,7 @@ Examples:
257447
258007
  }
257448
258008
 
257449
258009
  // src/cli/commands/project/eject.ts
257450
- import { resolve as resolve12 } from "node:path";
258010
+ import { resolve as resolve14 } from "node:path";
257451
258011
  var import_kebabCase2 = __toESM(require_kebabCase(), 1);
257452
258012
  async function eject(ctx, options8, command2) {
257453
258013
  const { log, runTask: runTask2, isNonInteractive } = ctx;
@@ -257511,7 +258071,7 @@ async function eject(ctx, options8, command2) {
257511
258071
  Ne("Operation cancelled.");
257512
258072
  throw new CLIExitError(0);
257513
258073
  }
257514
- const resolvedPath = resolve12(selectedPath);
258074
+ const resolvedPath = resolve14(selectedPath);
257515
258075
  await runTask2("Downloading your project's code...", async (updateMessage) => {
257516
258076
  await createProjectFilesForExistingProject({
257517
258077
  projectId,
@@ -257558,7 +258118,7 @@ function getEjectCommand() {
257558
258118
  // src/cli/program.ts
257559
258119
  function createProgram(context) {
257560
258120
  const program2 = new Command;
257561
- program2.name("base44").description("Base44 CLI - Unified interface for managing Base44 applications").version(package_default.version).addOption(new Option("--app-id <id>", "Base44 app ID to use").env(BASE44_APP_ID_ENV_VAR));
258121
+ program2.name("base44").description("Base44 CLI - Unified interface for managing Base44 applications").version(package_default.version).addOption(new Option("--app-id <id>", "Base44 app ID to use").env(BASE44_APP_ID_ENV_VAR)).addOption(new Option("--json", "Output machine-readable JSON to stdout (status/logs go to stderr)"));
257562
258122
  program2.configureHelp({
257563
258123
  sortSubcommands: true
257564
258124
  });
@@ -257581,11 +258141,12 @@ function createProgram(context) {
257581
258141
  program2.addCommand(getConnectorsCommand());
257582
258142
  program2.addCommand(getFunctionsCommand());
257583
258143
  program2.addCommand(getSecretsCommand());
258144
+ program2.addCommand(getSandboxCommand());
257584
258145
  program2.addCommand(getAuthCommand());
257585
258146
  program2.addCommand(getSiteCommand());
257586
258147
  program2.addCommand(getTypesCommand());
257587
258148
  program2.addCommand(getExecCommand());
257588
- program2.addCommand(getDevCommand(), { hidden: true });
258149
+ program2.addCommand(getDevCommand());
257589
258150
  program2.addCommand(getLogsCommand());
257590
258151
  return program2;
257591
258152
  }
@@ -259882,14 +260443,14 @@ async function addSourceContext(frames) {
259882
260443
  return frames;
259883
260444
  }
259884
260445
  function getContextLinesFromFile(path19, ranges, output) {
259885
- return new Promise((resolve13) => {
260446
+ return new Promise((resolve15) => {
259886
260447
  const stream = createReadStream2(path19);
259887
260448
  const lineReaded = createInterface2({
259888
260449
  input: stream
259889
260450
  });
259890
260451
  function destroyStreamAndResolve() {
259891
260452
  stream.destroy();
259892
- resolve13();
260453
+ resolve15();
259893
260454
  }
259894
260455
  let lineNumber = 0;
259895
260456
  let currentRangeIndex = 0;
@@ -261001,15 +261562,15 @@ class PostHogBackendClient extends PostHogCoreStateless {
261001
261562
  return true;
261002
261563
  if (this.featureFlagsPoller === undefined)
261003
261564
  return false;
261004
- return new Promise((resolve13) => {
261565
+ return new Promise((resolve15) => {
261005
261566
  const timeout3 = setTimeout(() => {
261006
261567
  cleanup();
261007
- resolve13(false);
261568
+ resolve15(false);
261008
261569
  }, timeoutMs);
261009
261570
  const cleanup = this._events.on("localEvaluationFlagsLoaded", (count2) => {
261010
261571
  clearTimeout(timeout3);
261011
261572
  cleanup();
261012
- resolve13(count2 > 0);
261573
+ resolve15(count2 > 0);
261013
261574
  });
261014
261575
  });
261015
261576
  }
@@ -261795,15 +262356,17 @@ function addCommandInfoToErrorReporter(program2, errorReporter) {
261795
262356
  // src/cli/index.ts
261796
262357
  var __dirname4 = dirname23(fileURLToPath6(import.meta.url));
261797
262358
  async function runCLI(options8) {
261798
- ensureNpmAssets(join29(__dirname4, "../assets"));
262359
+ ensureNpmAssets(join28(__dirname4, "../assets"));
261799
262360
  const errorReporter = new ErrorReporter;
261800
262361
  errorReporter.registerProcessErrorHandlers();
261801
- const isNonInteractive = !process.stdin.isTTY || !process.stdout.isTTY;
262362
+ const jsonMode = process.argv.includes("--json");
262363
+ const isNonInteractive = !process.stdin.isTTY || !process.stdout.isTTY || jsonMode;
261802
262364
  const log = isNonInteractive ? new SimpleLogger : new ClackLogger;
261803
262365
  const runTask2 = isNonInteractive ? createSimpleRunTask(log) : createInteractiveRunTask();
261804
262366
  const context = {
261805
262367
  errorReporter,
261806
262368
  isNonInteractive,
262369
+ jsonMode,
261807
262370
  distribution: options8?.distribution ?? "npm",
261808
262371
  log,
261809
262372
  runTask: runTask2
@@ -261832,4 +262395,4 @@ export {
261832
262395
  CLIExitError
261833
262396
  };
261834
262397
 
261835
- //# debugId=01B7F20ACA5BBEAF64756E2164756E21
262398
+ //# debugId=64D861C59DC9E6B364756E2164756E21