@base44-preview/cli 0.1.16-pr.635.a00a739 → 0.1.16-pr.637.845faaa

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
@@ -119090,7 +119090,7 @@ import path52 from "path";
119090
119090
  import * as path42 from "path";
119091
119091
  import * as fs26 from "fs/promises";
119092
119092
  import * as path22 from "path";
119093
- import process23 from "process";
119093
+ import process22 from "process";
119094
119094
  import * as path32 from "path";
119095
119095
  import process32 from "process";
119096
119096
  import path92 from "path";
@@ -119622,7 +119622,7 @@ function partition2(array2, predicate) {
119622
119622
  return result;
119623
119623
  }
119624
119624
  async function findInDirectory(nameOrNames, { typeCheck, cwd, allowSymlinks = true, filter: filter2 }) {
119625
- const directory = toAbsolutePath(cwd) ?? process23.cwd();
119625
+ const directory = toAbsolutePath(cwd) ?? process22.cwd();
119626
119626
  const names = Array.isArray(nameOrNames) ? nameOrNames : [nameOrNames];
119627
119627
  for (const name of names) {
119628
119628
  const fileOrDirectory = path22.join(directory, name);
@@ -146002,10 +146002,10 @@ __export(exports_supports_color, {
146002
146002
  createSupportsColor: () => createSupportsColor2,
146003
146003
  default: () => supports_color_default2
146004
146004
  });
146005
- import process24 from "node:process";
146005
+ import process21 from "node:process";
146006
146006
  import os9 from "node:os";
146007
146007
  import tty4 from "node:tty";
146008
- function hasFlag2(flag, argv = globalThis.Deno ? globalThis.Deno.args : process24.argv) {
146008
+ function hasFlag2(flag, argv = globalThis.Deno ? globalThis.Deno.args : process21.argv) {
146009
146009
  const prefix = flag.startsWith("-") ? "" : flag.length === 1 ? "-" : "--";
146010
146010
  const position = argv.indexOf(prefix + flag);
146011
146011
  const terminatorPosition = argv.indexOf("--");
@@ -146068,7 +146068,7 @@ function _supportsColor2(haveStream, { streamIsTTY, sniffFlags = true } = {}) {
146068
146068
  if (env3.TERM === "dumb") {
146069
146069
  return min;
146070
146070
  }
146071
- if (process24.platform === "win32") {
146071
+ if (process21.platform === "win32") {
146072
146072
  const osRelease = os9.release().split(".");
146073
146073
  if (Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) {
146074
146074
  return Number(osRelease[2]) >= 14931 ? 3 : 2;
@@ -146130,7 +146130,7 @@ function createSupportsColor2(stream, options = {}) {
146130
146130
  }
146131
146131
  var env3, flagForceColor2, supportsColor2, supports_color_default2;
146132
146132
  var init_supports_color = __esm(() => {
146133
- ({ env: env3 } = process24);
146133
+ ({ env: env3 } = process21);
146134
146134
  if (hasFlag2("no-color") || hasFlag2("no-colors") || hasFlag2("color=false") || hasFlag2("color=never")) {
146135
146135
  flagForceColor2 = 0;
146136
146136
  } else if (hasFlag2("color") || hasFlag2("colors") || hasFlag2("color=true") || hasFlag2("color=always")) {
@@ -228470,6 +228470,17 @@ class DependencyNotFoundError extends UserError {
228470
228470
  });
228471
228471
  }
228472
228472
  }
228473
+ var MAX_RESPONSE_TEXT_CHARS = 500;
228474
+ async function readResponseText(response) {
228475
+ try {
228476
+ const text = (await response.clone().text()).trim();
228477
+ if (!text)
228478
+ return;
228479
+ return text.length > MAX_RESPONSE_TEXT_CHARS ? `${text.slice(0, MAX_RESPONSE_TEXT_CHARS)}…` : text;
228480
+ } catch {
228481
+ return;
228482
+ }
228483
+ }
228473
228484
 
228474
228485
  class ApiError extends SystemError {
228475
228486
  code = "API_ERROR";
@@ -228505,7 +228516,9 @@ class ApiError extends SystemError {
228505
228516
  details = parseErrorDetails(parsedData.extra_data);
228506
228517
  }
228507
228518
  } catch {
228508
- message = error.message;
228519
+ const body = await readResponseText(error.response);
228520
+ responseBody = body;
228521
+ message = body ? `${error.message} — ${body}` : `${error.message} — empty body, content-type ${error.response.headers.get("content-type") ?? "absent"}`;
228509
228522
  }
228510
228523
  const statusCode = ApiError.normalizeStatusCode(error.response.status, responseBody);
228511
228524
  const requestBody = error.options.context?.__requestBody;
@@ -230708,8 +230721,7 @@ var SiteConfigSchema = object({
230708
230721
  buildCommand: string2().default("npm run build"),
230709
230722
  serveCommand: string2().optional(),
230710
230723
  outputDirectory: string2().optional(),
230711
- installCommand: string2().default("npm install"),
230712
- devHostFlag: string2().optional()
230724
+ installCommand: string2().default("npm install")
230713
230725
  });
230714
230726
  var PluginMetadataSchema = object({
230715
230727
  namespace: string2().min(1, "Plugin namespace cannot be empty").regex(/^[a-zA-Z0-9_-]+$/, "Plugin namespace can only contain letters, numbers, underscores, and dashes")
@@ -236546,10 +236558,12 @@ var CreateDeploymentResponseSchema = object({
236546
236558
  url: string2()
236547
236559
  }))
236548
236560
  })
236549
- ]).nullable().optional()
236561
+ ]).nullable().optional(),
236562
+ index_html_staged: boolean2().optional().default(false)
236550
236563
  }).transform((data) => ({
236551
236564
  deploymentId: data.deployment_id,
236552
236565
  sessionId: data.session_id,
236566
+ indexHtmlStaged: data.index_html_staged,
236553
236567
  assetUploads: data.asset_uploads == null ? null : data.asset_uploads.type === "cf" ? data.asset_uploads : {
236554
236568
  type: "s3",
236555
236569
  uploads: data.asset_uploads.uploads.map((upload) => ({
@@ -239512,9 +239526,9 @@ async function createDeployment(request) {
239512
239526
  }
239513
239527
  async function finalizeDeployment(deploymentId, sessionId, payload) {
239514
239528
  const formData = new FormData;
239515
- if ("indexHtml" in payload) {
239529
+ if (payload.kind === "static-inline") {
239516
239530
  formData.append("index.html", new File([payload.indexHtml], "index.html", { type: "text/html" }));
239517
- } else {
239531
+ } else if (payload.kind === "worker") {
239518
239532
  formData.append("payload", JSON.stringify({ completion_jwt: payload.completionJwt }));
239519
239533
  for (const module of payload.modules) {
239520
239534
  const content = await readFile(module.absolutePath);
@@ -240099,17 +240113,20 @@ async function deployToDeployments(options) {
240099
240113
  const worker = await resolveWorkerBuild(projectRoot, progress);
240100
240114
  const assetsDir = worker ? worker.assetsDir : outputDir;
240101
240115
  const assets = assetsDir ? await buildAssetManifest(assetsDir, getAppContext().id) : NO_ASSETS;
240102
- const completion = worker ? { modules: worker.modules } : { indexHtml: await readIndexHtml(assetsDir, assets) };
240116
+ if (!worker) {
240117
+ requireStaticEntryPoint(assetsDir, assets);
240118
+ }
240103
240119
  const created = await createDeployment({
240104
240120
  git_hash: gitHash,
240105
240121
  config: worker?.config,
240106
240122
  asset_manifest: assets.manifest
240107
240123
  });
240108
240124
  const completionJwt = await uploadDeploymentAssets(created.assetUploads, assets, { concurrency, progress });
240109
- if ("modules" in completion) {
240125
+ const completion = worker ? { kind: "worker", modules: worker.modules, completionJwt } : await resolveStaticCompletion(assetsDir, assets, created.indexHtmlStaged);
240126
+ if (completion.kind === "worker") {
240110
240127
  progress?.onWorker?.({ moduleCount: completion.modules.length });
240111
240128
  }
240112
- const finalized = await finalizeDeployment(created.deploymentId, created.sessionId, "modules" in completion ? { ...completion, completionJwt } : completion);
240129
+ const finalized = await finalizeDeployment(created.deploymentId, created.sessionId, completion);
240113
240130
  return { deploymentId: finalized.deploymentId, gitHash };
240114
240131
  }
240115
240132
  async function resolveWorkerBuild(projectRoot, progress) {
@@ -240130,11 +240147,20 @@ async function resolveWorkerBuild(projectRoot, progress) {
240130
240147
  assetsDir
240131
240148
  };
240132
240149
  }
240133
- async function readIndexHtml(assetsDir, assets) {
240150
+ function requireStaticEntryPoint(assetsDir, assets) {
240134
240151
  if (!assetsDir || !assets.manifest["/index.html"]) {
240135
240152
  throw new InvalidInputError(`No index.html found in "${assetsDir ?? "the site output directory"}" — a static site needs one at the output directory root.`);
240136
240153
  }
240137
- return new Uint8Array(await readFile3(join18(assetsDir, "index.html")));
240154
+ return assetsDir;
240155
+ }
240156
+ async function resolveStaticCompletion(assetsDir, assets, indexHtmlStaged) {
240157
+ if (indexHtmlStaged)
240158
+ return { kind: "static-staged" };
240159
+ const dir = requireStaticEntryPoint(assetsDir, assets);
240160
+ return {
240161
+ kind: "static-inline",
240162
+ indexHtml: new Uint8Array(await readFile3(join18(dir, "index.html")))
240163
+ };
240138
240164
  }
240139
240165
  function buildAssetsConfig(assetsConfig, progress) {
240140
240166
  if (!assetsConfig)
@@ -246680,42 +246706,6 @@ async function gitHead(projectRoot) {
246680
246706
  return null;
246681
246707
  }
246682
246708
  }
246683
- // src/core/site/serve-command.ts
246684
- var DEFAULT_SERVE_COMMAND = "npm run dev";
246685
- var DEFAULT_HOST_FLAG = "--host";
246686
- var SCRIPT = "[A-Za-z0-9:_.-]+";
246687
- var PREFIX2 = "[A-Za-z0-9._/-]+";
246688
- var SCRIPT_RUNNERS = [
246689
- {
246690
- pattern: new RegExp(String.raw`^npm(\s+--prefix\s+${PREFIX2})?\s+run\s+${SCRIPT}$`),
246691
- separator: " -- "
246692
- },
246693
- {
246694
- pattern: new RegExp(String.raw`^(?:pnpm|yarn|bun)(\s+run)?\s+${SCRIPT}$`),
246695
- separator: " "
246696
- }
246697
- ];
246698
- function runnerFor(serveCommand) {
246699
- return SCRIPT_RUNNERS.find((runner) => runner.pattern.test(serveCommand));
246700
- }
246701
- function withServeAddress(serveCommand, { host, port, hostFlag }) {
246702
- const command = serveCommand.trim();
246703
- const args = [
246704
- ...host ? [hostFlag ?? DEFAULT_HOST_FLAG, host] : [],
246705
- ...port === undefined ? [] : ["--port", String(port)]
246706
- ];
246707
- if (args.length === 0) {
246708
- return { command, droppedAddress: false };
246709
- }
246710
- const runner = runnerFor(command);
246711
- if (!runner) {
246712
- return { command, droppedAddress: true };
246713
- }
246714
- return {
246715
- command: `${command}${runner.separator}${args.join(" ")}`,
246716
- droppedAddress: false
246717
- };
246718
- }
246719
246709
  // src/core/project/deploy.ts
246720
246710
  function hasResourcesToDeploy(projectData) {
246721
246711
  const {
@@ -249618,7 +249608,7 @@ async function buildAction(ctx) {
249618
249608
  };
249619
249609
  }
249620
249610
  function getBuildCommand() {
249621
- return new Base44Command("build", { requireAuth: false }).description("Build the site with the Base44 app id injected").action(buildAction);
249611
+ return new Base44Command("build").description("Build the site with the Base44 app id injected").action(buildAction);
249622
249612
  }
249623
249613
 
249624
249614
  // src/cli/commands/project/create.ts
@@ -250015,36 +250005,6 @@ function printStripeResult(r, log) {
250015
250005
  log.info(` Connectors dashboard: ${theme.colors.links(getConnectorsUrl())}`);
250016
250006
  }
250017
250007
 
250018
- // src/cli/commands/project/install.ts
250019
- async function installAction({
250020
- runTask
250021
- }) {
250022
- const { project } = await readProjectConfig();
250023
- const installCommand = project.site?.installCommand;
250024
- if (!installCommand) {
250025
- throw new ConfigNotFoundError("No site install command found.", {
250026
- hints: [
250027
- {
250028
- message: `Add a 'site' block to your config.jsonc (e.g., "site": { "installCommand": "npm ci" }). Inside one, installCommand defaults to "npm install".`
250029
- }
250030
- ]
250031
- });
250032
- }
250033
- await runTask("Installing site dependencies...", () => execa({ cwd: project.root, shell: true })`${installCommand}`, {
250034
- successMessage: "Dependencies installed",
250035
- errorMessage: "Install failed"
250036
- });
250037
- return {
250038
- outroMessage: `Installed with ${theme.styles.bold(installCommand)}`
250039
- };
250040
- }
250041
- function getInstallCommand() {
250042
- return new Base44Command("install", {
250043
- requireAuth: false,
250044
- requireAppContext: false
250045
- }).description("Install the site's dependencies with its configured command").action(installAction);
250046
- }
250047
-
250048
250008
  // src/cli/commands/project/app-id-options.ts
250049
250009
  function readExplicitAppId(command) {
250050
250010
  const { appId } = command.optsWithGlobals();
@@ -251124,219 +251084,6 @@ function parseConcurrency(value) {
251124
251084
  return parsed;
251125
251085
  }
251126
251086
 
251127
- // src/cli/dev/createDevLogger.ts
251128
- var colorByType = {
251129
- error: theme.styles.error,
251130
- warn: theme.styles.warn,
251131
- log: (input) => input
251132
- };
251133
- var stringify = (item) => {
251134
- if (typeof item === "string") {
251135
- return item;
251136
- }
251137
- if (item instanceof Error) {
251138
- return item.toString();
251139
- }
251140
- try {
251141
- return JSON.stringify(item, null, 2) ?? String(item);
251142
- } catch {
251143
- return String(item);
251144
- }
251145
- };
251146
- function createDevLogger(label, labelColor = theme.styles.dim) {
251147
- const prefix = label ? `${labelColor(`[${label}]`)} ` : "";
251148
- const print = (type, ...args) => {
251149
- const colorize = colorByType[type];
251150
- console[type](prefix + args.map((item) => colorize(stringify(item))).join(" "));
251151
- };
251152
- return {
251153
- log: (...args) => print("log", ...args),
251154
- error: (msg, err) => {
251155
- print("error", msg);
251156
- if (err) {
251157
- print("error", err);
251158
- }
251159
- },
251160
- warn: (...args) => print("warn", ...args)
251161
- };
251162
- }
251163
-
251164
- // src/cli/dev/dev-server/serve-runner.ts
251165
- import { spawn as spawn2 } from "node:child_process";
251166
- import process21 from "node:process";
251167
-
251168
- class ServeRunner {
251169
- command;
251170
- cwd;
251171
- env;
251172
- logger;
251173
- child;
251174
- stopping = false;
251175
- stopPromise;
251176
- exitListeners = [];
251177
- constructor(options) {
251178
- this.command = options.command;
251179
- this.cwd = options.cwd;
251180
- this.env = options.env;
251181
- this.logger = options.logger;
251182
- }
251183
- start() {
251184
- if (this.child) {
251185
- return;
251186
- }
251187
- const stdin = process21.platform === "win32" ? "ignore" : "inherit";
251188
- const child = spawn2(this.command, {
251189
- cwd: this.cwd,
251190
- shell: true,
251191
- detached: process21.platform !== "win32",
251192
- env: { ...process21.env, ...this.env },
251193
- stdio: [stdin, "pipe", "pipe"],
251194
- windowsHide: true
251195
- });
251196
- this.child = child;
251197
- this.setupHandlers(child);
251198
- }
251199
- onExit(listener) {
251200
- this.exitListeners.push(listener);
251201
- }
251202
- async stop() {
251203
- if (this.stopPromise) {
251204
- return this.stopPromise;
251205
- }
251206
- this.stopPromise = this.stopChild();
251207
- return this.stopPromise;
251208
- }
251209
- async stopChild() {
251210
- const child = this.child;
251211
- if (!child || child.exitCode !== null) {
251212
- return;
251213
- }
251214
- this.stopping = true;
251215
- const exited = new Promise((resolve) => child.once("exit", () => resolve()));
251216
- if (process21.platform === "win32" && child.pid) {
251217
- const taskkill = spawn2("taskkill", ["/pid", String(child.pid), "/T", "/F"], {
251218
- stdio: "ignore",
251219
- windowsHide: true
251220
- });
251221
- await new Promise((resolve) => {
251222
- taskkill.once("exit", () => resolve());
251223
- taskkill.once("error", () => resolve());
251224
- });
251225
- } else if (child.pid) {
251226
- try {
251227
- process21.kill(-child.pid, "SIGTERM");
251228
- } catch {
251229
- child.kill();
251230
- }
251231
- }
251232
- await exited;
251233
- }
251234
- setupHandlers(child) {
251235
- child.stdout?.on("data", (data) => this.emitLines(data, "log"));
251236
- child.stderr?.on("data", (data) => this.emitLines(data, "error"));
251237
- child.on("error", (error) => {
251238
- this.logger.error("Frontend dev server failed to start:", error);
251239
- this.notifyExit(null);
251240
- });
251241
- child.on("exit", (code) => {
251242
- if (this.stopping) {
251243
- return;
251244
- }
251245
- this.logger.error(`Frontend dev server exited with code ${code}`);
251246
- this.notifyExit(code);
251247
- });
251248
- }
251249
- notifyExit(code) {
251250
- for (const listener of this.exitListeners) {
251251
- listener(code);
251252
- }
251253
- }
251254
- emitLines(data, type) {
251255
- const lines = data.toString().trimEnd().split(`
251256
- `);
251257
- for (const line of lines) {
251258
- if (type === "error") {
251259
- this.logger.error(line);
251260
- } else {
251261
- this.logger.log(line);
251262
- }
251263
- }
251264
- }
251265
- }
251266
-
251267
- // src/cli/dev/serve-command-runner.ts
251268
- function createServeCommandRunner({
251269
- serveCommand,
251270
- projectRoot,
251271
- appId,
251272
- appBaseUrl
251273
- }) {
251274
- return new ServeRunner({
251275
- command: serveCommand,
251276
- cwd: projectRoot,
251277
- env: {
251278
- VITE_BASE44_APP_ID: appId,
251279
- ...appBaseUrl ? { VITE_BASE44_APP_BASE_URL: appBaseUrl } : {}
251280
- },
251281
- logger: createDevLogger("frontend", theme.colors.base44Orange)
251282
- });
251283
- }
251284
-
251285
- // src/cli/dev/stop-runner-on-signals.ts
251286
- import process22 from "node:process";
251287
- function stopRunnerOnProcessSignals(runner) {
251288
- const stop = () => void runner.stop();
251289
- process22.on("SIGINT", stop);
251290
- process22.on("SIGTERM", stop);
251291
- }
251292
-
251293
- // src/cli/commands/site/dev.ts
251294
- function parsePort(value) {
251295
- if (!/^\d+$/.test(value)) {
251296
- throw new InvalidArgumentError2("must be a whole number");
251297
- }
251298
- const port = Number(value);
251299
- if (port < 1 || port > 65535) {
251300
- throw new InvalidArgumentError2("must be between 1 and 65535");
251301
- }
251302
- return port;
251303
- }
251304
- async function siteDevAction(ctx, options) {
251305
- const { app } = ctx;
251306
- if (!app?.projectRoot) {
251307
- throw new ConfigInvalidError("base44 site dev requires a linked local project. Run it from a project with base44/.app.jsonc.");
251308
- }
251309
- const { project } = await readProjectConfig(app.projectRoot);
251310
- const site = project.site;
251311
- if (!site) {
251312
- throw new InvalidInputError(`This project has no 'site' block in base44/config.jsonc, so there is no frontend to serve. Add one naming its serveCommand; site dev falls back to "npm run dev".`);
251313
- }
251314
- const serveCommand = site.serveCommand ?? DEFAULT_SERVE_COMMAND;
251315
- const { command, droppedAddress } = withServeAddress(serveCommand, {
251316
- host: options.host,
251317
- port: options.port,
251318
- hostFlag: site.devHostFlag
251319
- });
251320
- if (droppedAddress) {
251321
- throw new InvalidInputError(`serveCommand '${serveCommand}' takes no forwarded arguments, so --host/--port cannot be passed to it. Put the address in serveCommand itself, or use an 'npm run', 'pnpm', 'yarn' or 'bun run' script.`);
251322
- }
251323
- const runner = createServeCommandRunner({
251324
- serveCommand: command,
251325
- projectRoot: project.root,
251326
- appId: app.id,
251327
- appBaseUrl: options.backendUrl
251328
- });
251329
- stopRunnerOnProcessSignals(runner);
251330
- runner.onExit((code) => process.exit(code ?? 1));
251331
- runner.start();
251332
- return {
251333
- outroMessage: options.backendUrl ? `Frontend dev server running '${command}' against ${theme.styles.bold(options.backendUrl)}` : `Frontend dev server running '${command}'`
251334
- };
251335
- }
251336
- function getSiteDevCommand() {
251337
- return new Base44Command("dev", { requireAuth: false }).description("Run the site's dev server against a given backend (no local backend)").option("--backend-url <url>", "Backend the frontend should call, injected as VITE_BASE44_APP_BASE_URL. Omit for a frontend that reaches its backend same-origin.").option("--host <address>", "Address to bind, e.g. 0.0.0.0").option("--port <number>", "Port to bind", parsePort).action(siteDevAction);
251338
- }
251339
-
251340
251087
  // src/cli/commands/site/open.ts
251341
251088
  async function openAction({
251342
251089
  isNonInteractive
@@ -251353,7 +251100,7 @@ function getSiteOpenCommand() {
251353
251100
 
251354
251101
  // src/cli/commands/site/index.ts
251355
251102
  function getSiteCommand() {
251356
- return new Command2("site").description("Manage app site (frontend app)").addCommand(getSiteDeployCommand()).addCommand(getSiteDevCommand()).addCommand(getSiteOpenCommand());
251103
+ return new Command2("site").description("Manage app site (frontend app)").addCommand(getSiteDeployCommand()).addCommand(getSiteOpenCommand());
251357
251104
  }
251358
251105
 
251359
251106
  // src/core/types/generator.ts
@@ -251873,6 +251620,43 @@ function getWorkspaceCommand() {
251873
251620
  return new Command2("workspace").description("List workspaces, inspect one, and move apps between them").addCommand(getWorkspaceListCommand()).addCommand(getWorkspaceGetCommand()).addCommand(getWorkspaceMoveCommand());
251874
251621
  }
251875
251622
 
251623
+ // src/cli/dev/createDevLogger.ts
251624
+ var colorByType = {
251625
+ error: theme.styles.error,
251626
+ warn: theme.styles.warn,
251627
+ log: (input) => input
251628
+ };
251629
+ var stringify = (item) => {
251630
+ if (typeof item === "string") {
251631
+ return item;
251632
+ }
251633
+ if (item instanceof Error) {
251634
+ return item.toString();
251635
+ }
251636
+ try {
251637
+ return JSON.stringify(item, null, 2) ?? String(item);
251638
+ } catch {
251639
+ return String(item);
251640
+ }
251641
+ };
251642
+ function createDevLogger(label, labelColor = theme.styles.dim) {
251643
+ const prefix = label ? `${labelColor(`[${label}]`)} ` : "";
251644
+ const print = (type, ...args) => {
251645
+ const colorize = colorByType[type];
251646
+ console[type](prefix + args.map((item) => colorize(stringify(item))).join(" "));
251647
+ };
251648
+ return {
251649
+ log: (...args) => print("log", ...args),
251650
+ error: (msg, err) => {
251651
+ print("error", msg);
251652
+ if (err) {
251653
+ print("error", err);
251654
+ }
251655
+ },
251656
+ warn: (...args) => print("warn", ...args)
251657
+ };
251658
+ }
251659
+
251876
251660
  // src/cli/dev/dev-server/main.ts
251877
251661
  var import_cors = __toESM(require_lib4(), 1);
251878
251662
  var import_express6 = __toESM(require_express(), 1);
@@ -252005,7 +251789,7 @@ var $dir = async (options) => dirWithOptions(options);
252005
251789
  var $tmpName = promisify11(tmp.tmpName);
252006
251790
 
252007
251791
  // src/cli/dev/dev-server/function-manager.ts
252008
- import { spawn as spawn3 } from "node:child_process";
251792
+ import { spawn as spawn2 } from "node:child_process";
252009
251793
  import { dirname as dirname23, join as join31 } from "node:path";
252010
251794
  import { pathToFileURL } from "node:url";
252011
251795
 
@@ -252103,7 +251887,7 @@ class FunctionManager extends BaseFunctionManager {
252103
251887
  async stopFunction(_name, { process: proc }) {
252104
251888
  const exited = new Promise((r) => proc.once("exit", () => r()));
252105
251889
  if (process.platform === "win32" && proc.pid) {
252106
- spawn3("taskkill", ["/pid", String(proc.pid), "/T", "/F"]);
251890
+ spawn2("taskkill", ["/pid", String(proc.pid), "/T", "/F"]);
252107
251891
  } else {
252108
251892
  proc.kill();
252109
251893
  }
@@ -252112,7 +251896,7 @@ class FunctionManager extends BaseFunctionManager {
252112
251896
  spawnFunction(func, port) {
252113
251897
  this.logger.log(`Spawning function "${func.name}" on port ${port}`);
252114
251898
  const importMapPath = join31(dirname23(this.wrapperPath), "import-map.json");
252115
- const process2 = spawn3("deno", ["run", "--allow-all", "--import-map", importMapPath, this.wrapperPath], {
251899
+ const process2 = spawn2("deno", ["run", "--allow-all", "--import-map", importMapPath, this.wrapperPath], {
252116
251900
  env: {
252117
251901
  ...globalThis.process.env,
252118
251902
  FUNCTION_PATH: pathToFileURL(func.entryPath).href,
@@ -255642,6 +255426,127 @@ async function createDevServer(options) {
255642
255426
  return { port, server, shutdown };
255643
255427
  }
255644
255428
 
255429
+ // src/cli/dev/dev-server/serve-runner.ts
255430
+ import { spawn as spawn3 } from "node:child_process";
255431
+ import process23 from "node:process";
255432
+
255433
+ class ServeRunner {
255434
+ command;
255435
+ cwd;
255436
+ env;
255437
+ logger;
255438
+ child;
255439
+ stopping = false;
255440
+ stopPromise;
255441
+ exitListeners = [];
255442
+ constructor(options) {
255443
+ this.command = options.command;
255444
+ this.cwd = options.cwd;
255445
+ this.env = options.env;
255446
+ this.logger = options.logger;
255447
+ }
255448
+ start() {
255449
+ if (this.child) {
255450
+ return;
255451
+ }
255452
+ const stdin = process23.platform === "win32" ? "ignore" : "inherit";
255453
+ const child = spawn3(this.command, {
255454
+ cwd: this.cwd,
255455
+ shell: true,
255456
+ detached: process23.platform !== "win32",
255457
+ env: { ...process23.env, ...this.env },
255458
+ stdio: [stdin, "pipe", "pipe"],
255459
+ windowsHide: true
255460
+ });
255461
+ this.child = child;
255462
+ this.setupHandlers(child);
255463
+ }
255464
+ onExit(listener) {
255465
+ this.exitListeners.push(listener);
255466
+ }
255467
+ async stop() {
255468
+ if (this.stopPromise) {
255469
+ return this.stopPromise;
255470
+ }
255471
+ this.stopPromise = this.stopChild();
255472
+ return this.stopPromise;
255473
+ }
255474
+ async stopChild() {
255475
+ const child = this.child;
255476
+ if (!child || child.exitCode !== null) {
255477
+ return;
255478
+ }
255479
+ this.stopping = true;
255480
+ const exited = new Promise((resolve) => child.once("exit", () => resolve()));
255481
+ if (process23.platform === "win32" && child.pid) {
255482
+ const taskkill = spawn3("taskkill", ["/pid", String(child.pid), "/T", "/F"], {
255483
+ stdio: "ignore",
255484
+ windowsHide: true
255485
+ });
255486
+ await new Promise((resolve) => {
255487
+ taskkill.once("exit", () => resolve());
255488
+ taskkill.once("error", () => resolve());
255489
+ });
255490
+ } else if (child.pid) {
255491
+ try {
255492
+ process23.kill(-child.pid, "SIGTERM");
255493
+ } catch {
255494
+ child.kill();
255495
+ }
255496
+ }
255497
+ await exited;
255498
+ }
255499
+ setupHandlers(child) {
255500
+ child.stdout?.on("data", (data) => this.emitLines(data, "log"));
255501
+ child.stderr?.on("data", (data) => this.emitLines(data, "error"));
255502
+ child.on("error", (error) => {
255503
+ this.logger.error("Frontend dev server failed to start:", error);
255504
+ this.notifyExit(null);
255505
+ });
255506
+ child.on("exit", (code) => {
255507
+ if (this.stopping) {
255508
+ return;
255509
+ }
255510
+ this.logger.error(`Frontend dev server exited with code ${code}`);
255511
+ this.notifyExit(code);
255512
+ });
255513
+ }
255514
+ notifyExit(code) {
255515
+ for (const listener of this.exitListeners) {
255516
+ listener(code);
255517
+ }
255518
+ }
255519
+ emitLines(data, type) {
255520
+ const lines = data.toString().trimEnd().split(`
255521
+ `);
255522
+ for (const line of lines) {
255523
+ if (type === "error") {
255524
+ this.logger.error(line);
255525
+ } else {
255526
+ this.logger.log(line);
255527
+ }
255528
+ }
255529
+ }
255530
+ }
255531
+
255532
+ // src/cli/dev/serve-command-runner.ts
255533
+ function createServeCommandRunner({
255534
+ serveCommand,
255535
+ projectRoot,
255536
+ appId,
255537
+ appBaseUrl
255538
+ }) {
255539
+ return new ServeRunner({
255540
+ command: serveCommand,
255541
+ cwd: projectRoot,
255542
+ env: {
255543
+ VITE_BASE44_APP_ID: appId,
255544
+ VITE_BASE44_APP_BASE_URL: appBaseUrl
255545
+ },
255546
+ logger: createDevLogger("frontend", theme.colors.base44Orange)
255547
+ });
255548
+ }
255549
+
255645
255550
  // src/cli/commands/dev.ts
255646
255551
  function localServerUrl(port) {
255647
255552
  return `http://localhost:${port}`;
@@ -255667,6 +255572,11 @@ async function resolveConfiguredSite(app) {
255667
255572
  const serveCommand = project.site?.serveCommand;
255668
255573
  return serveCommand ? { serveCommand, projectRoot: project.root } : undefined;
255669
255574
  }
255575
+ function stopRunnerOnProcessSignals(runner) {
255576
+ const stop = () => void runner.stop();
255577
+ process.on("SIGINT", stop);
255578
+ process.on("SIGTERM", stop);
255579
+ }
255670
255580
  function startServeCommand(runner, backend) {
255671
255581
  stopRunnerOnProcessSignals(runner);
255672
255582
  runner.onExit(() => {
@@ -255780,7 +255690,7 @@ function readStdin2() {
255780
255690
  process.stdin.on("error", reject);
255781
255691
  });
255782
255692
  }
255783
- function parsePort2(value) {
255693
+ function parsePort(value) {
255784
255694
  const port = Number(value);
255785
255695
  if (!Number.isInteger(port) || port <= 0 || port > 65535) {
255786
255696
  throw new InvalidInputError(`Invalid --port value: "${value}".`, {
@@ -255817,7 +255727,7 @@ async function execAction({ app, isNonInteractive }, options) {
255817
255727
  if (!code.trim()) {
255818
255728
  throw noInputError;
255819
255729
  }
255820
- const local = options.local ? await resolveLocalTarget(options.port !== undefined ? parsePort2(options.port) : DEFAULT_DEV_SERVER_PORT) : undefined;
255730
+ const local = options.local ? await resolveLocalTarget(options.port !== undefined ? parsePort(options.port) : DEFAULT_DEV_SERVER_PORT) : undefined;
255821
255731
  const { exitCode } = await runScript({
255822
255732
  appId: app.id,
255823
255733
  code,
@@ -255982,7 +255892,6 @@ function createProgram(context) {
255982
255892
  program.addCommand(getCreateCommand());
255983
255893
  program.addCommand(getScaffoldCommand());
255984
255894
  program.addCommand(getDashboardCommand());
255985
- program.addCommand(getInstallCommand());
255986
255895
  program.addCommand(getBuildCommand());
255987
255896
  program.addCommand(getDeployCommand3());
255988
255897
  program.addCommand(getVisibilityCommand());
@@ -260052,4 +259961,4 @@ export {
260052
259961
  runCLI
260053
259962
  };
260054
259963
 
260055
- //# debugId=4E22A7FA1E6E28E764756E2164756E21
259964
+ //# debugId=63C1B06EC5E5944F64756E2164756E21