@base44-preview/cli 0.1.16-pr.637.845faaa → 0.1.17-pr.626.a210a49

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
@@ -31177,7 +31177,7 @@ function cleanDoc(doc) {
31177
31177
  return mapDoc(doc, (currentDoc) => cleanDocFn(currentDoc));
31178
31178
  }
31179
31179
  function replaceEndOfLine(doc, replacement = literalline) {
31180
- return mapDoc(doc, (currentDoc) => typeof currentDoc === "string" ? join28(replacement, currentDoc.split(`
31180
+ return mapDoc(doc, (currentDoc) => typeof currentDoc === "string" ? join30(replacement, currentDoc.split(`
31181
31181
  `)) : currentDoc);
31182
31182
  }
31183
31183
  function canBreakFn(doc) {
@@ -31257,7 +31257,7 @@ function indentIfBreak(contents, options) {
31257
31257
  negate: options.negate
31258
31258
  };
31259
31259
  }
31260
- function join28(separator, docs) {
31260
+ function join30(separator, docs) {
31261
31261
  assertDoc(separator);
31262
31262
  assertDocArray(docs);
31263
31263
  const parts = [];
@@ -31968,7 +31968,7 @@ var init_doc = __esm(() => {
31968
31968
  MODE_FLAT = Symbol("MODE_FLAT");
31969
31969
  DOC_FILL_PRINTED_LENGTH = Symbol("DOC_FILL_PRINTED_LENGTH");
31970
31970
  builders = {
31971
- join: join28,
31971
+ join: join30,
31972
31972
  line,
31973
31973
  softline,
31974
31974
  hardline,
@@ -228670,6 +228670,20 @@ function isCLIError(error) {
228670
228670
  function isUserError(error) {
228671
228671
  return error instanceof UserError;
228672
228672
  }
228673
+ var STEP = Symbol.for("base44.commandStep");
228674
+ async function tagStep(step, run) {
228675
+ try {
228676
+ return await run();
228677
+ } catch (error) {
228678
+ if (error !== null && typeof error === "object" && !(STEP in error) && Object.isExtensible(error)) {
228679
+ Object.defineProperty(error, STEP, { value: step, enumerable: false });
228680
+ }
228681
+ throw error;
228682
+ }
228683
+ }
228684
+ function stepOf(error) {
228685
+ return error !== null && typeof error === "object" && STEP in error ? error[STEP] : undefined;
228686
+ }
228673
228687
 
228674
228688
  // src/core/utils/fs.ts
228675
228689
  async function pathExists(path) {
@@ -228796,7 +228810,7 @@ function normalizeBase44Env() {
228796
228810
  loadProjectEnvFiles();
228797
228811
 
228798
228812
  // src/cli/index.ts
228799
- import { dirname as dirname28, join as join37 } from "node:path";
228813
+ import { dirname as dirname29, join as join39 } from "node:path";
228800
228814
  import { fileURLToPath as fileURLToPath6 } from "node:url";
228801
228815
 
228802
228816
  // ../../node_modules/@clack/core/dist/index.mjs
@@ -239251,7 +239265,7 @@ import { join as join13 } from "node:path";
239251
239265
  // package.json
239252
239266
  var package_default = {
239253
239267
  name: "base44",
239254
- version: "0.1.16",
239268
+ version: "0.1.17",
239255
239269
  description: "Base44 CLI - Unified interface for managing Base44 applications",
239256
239270
  type: "module",
239257
239271
  bin: {
@@ -239605,91 +239619,8 @@ async function createArchive(pathToArchive, targetArchivePath) {
239605
239619
  import { readFile as readFile3 } from "node:fs/promises";
239606
239620
  import { join as join18 } from "node:path";
239607
239621
 
239608
- // src/core/site/manifest.ts
239609
- import { createHash } from "node:crypto";
239610
- import { createReadStream } from "node:fs";
239611
- import { stat } from "node:fs/promises";
239612
- import { basename as basename5, extname, join as join16 } from "node:path";
239613
- var MAX_ASSET_COUNT = 1e5;
239614
- var ASSETS_IGNORE_FILE = ".assetsignore";
239615
- var ALWAYS_IGNORED = new Set([
239616
- ASSETS_IGNORE_FILE,
239617
- "wrangler.json",
239618
- ".dev.vars"
239619
- ]);
239620
- var MIME_TYPES = {
239621
- ".html": "text/html",
239622
- ".htm": "text/html",
239623
- ".css": "text/css",
239624
- ".js": "text/javascript",
239625
- ".mjs": "text/javascript",
239626
- ".json": "application/json",
239627
- ".map": "application/json",
239628
- ".txt": "text/plain",
239629
- ".xml": "application/xml",
239630
- ".svg": "image/svg+xml",
239631
- ".png": "image/png",
239632
- ".jpg": "image/jpeg",
239633
- ".jpeg": "image/jpeg",
239634
- ".gif": "image/gif",
239635
- ".webp": "image/webp",
239636
- ".avif": "image/avif",
239637
- ".ico": "image/x-icon",
239638
- ".woff": "font/woff",
239639
- ".woff2": "font/woff2",
239640
- ".ttf": "font/ttf",
239641
- ".otf": "font/otf",
239642
- ".eot": "application/vnd.ms-fontobject",
239643
- ".mp3": "audio/mpeg",
239644
- ".mp4": "video/mp4",
239645
- ".webm": "video/webm",
239646
- ".pdf": "application/pdf",
239647
- ".wasm": "application/wasm",
239648
- ".webmanifest": "application/manifest+json"
239649
- };
239650
- function getAssetContentType(filePath) {
239651
- return MIME_TYPES[extname(filePath).toLowerCase()] ?? "application/octet-stream";
239652
- }
239653
- async function hashAssetFile(appId, absolutePath) {
239654
- const hash = createHash("sha256").update(Buffer.from(appId, "utf8"));
239655
- for await (const chunk of createReadStream(absolutePath)) {
239656
- hash.update(chunk);
239657
- }
239658
- return hash.digest("hex").slice(0, 32);
239659
- }
239660
- async function buildAssetManifest(assetsDir, appId) {
239661
- const manifest = {};
239662
- const filesByHash = new Map;
239663
- const found = await globby("**/*", {
239664
- cwd: assetsDir,
239665
- dot: true,
239666
- onlyFiles: true,
239667
- followSymbolicLinks: false,
239668
- ignoreFiles: [ASSETS_IGNORE_FILE]
239669
- });
239670
- const relativeFilePaths = found.filter((path) => !ALWAYS_IGNORED.has(basename5(path)));
239671
- if (relativeFilePaths.length > MAX_ASSET_COUNT) {
239672
- throw new InvalidInputError(`Too many static assets: found ${relativeFilePaths.length}, the limit is ${MAX_ASSET_COUNT} files.`);
239673
- }
239674
- for (const relativePath of relativeFilePaths.sort()) {
239675
- const absolutePath = join16(assetsDir, ...relativePath.split("/"));
239676
- const { size } = await stat(absolutePath);
239677
- const hash = await hashAssetFile(appId, absolutePath);
239678
- manifest[`/${relativePath}`] = { hash, size };
239679
- if (!filesByHash.has(hash)) {
239680
- filesByHash.set(hash, {
239681
- absolutePath,
239682
- hash,
239683
- size,
239684
- contentType: getAssetContentType(absolutePath)
239685
- });
239686
- }
239687
- }
239688
- return { manifest, filesByHash };
239689
- }
239690
-
239691
239622
  // src/core/site/modules.ts
239692
- import { stat as stat2 } from "node:fs/promises";
239623
+ import { stat } from "node:fs/promises";
239693
239624
  import { relative as relative5, resolve as resolve3, sep } from "node:path";
239694
239625
  var MAX_TOTAL_MODULE_BYTES = 40 * 1024 * 1024;
239695
239626
  var MODULE_IGNORE = ["wrangler.json", ".dev.vars"];
@@ -239764,7 +239695,7 @@ async function collectModules(config) {
239764
239695
  const modules = [...modulesByName.values()];
239765
239696
  let totalBytes = 0;
239766
239697
  for (const module of modules) {
239767
- module.size = (await stat2(module.absolutePath)).size;
239698
+ module.size = (await stat(module.absolutePath)).size;
239768
239699
  totalBytes += module.size;
239769
239700
  }
239770
239701
  if (totalBytes > MAX_TOTAL_MODULE_BYTES) {
@@ -239783,8 +239714,104 @@ function addSourcemap(modulesByName, configDir, name) {
239783
239714
  });
239784
239715
  }
239785
239716
 
239786
- // src/core/site/upload.ts
239787
- import { readFile as readFile2 } from "node:fs/promises";
239717
+ // src/core/site/wrangler-config.ts
239718
+ import { dirname as dirname12, join as join16, resolve as resolve4 } from "node:path";
239719
+ var WRANGLER_REDIRECT_PATH = join16(".wrangler", "deploy", "config.json");
239720
+ var RedirectConfigSchema = looseObject({
239721
+ configPath: string2().min(1)
239722
+ });
239723
+ var WranglerConfigSchema = looseObject({
239724
+ main: string2().min(1, "wrangler config is missing a 'main' entry module"),
239725
+ no_bundle: boolean2().optional(),
239726
+ rules: array(looseObject({ type: string2(), globs: array(string2()) })).optional(),
239727
+ assets: looseObject({
239728
+ directory: string2().optional(),
239729
+ html_handling: string2().optional(),
239730
+ not_found_handling: string2().optional(),
239731
+ run_worker_first: union([boolean2(), array(string2())]).optional(),
239732
+ headers: string2().optional(),
239733
+ redirects: string2().optional()
239734
+ }).optional(),
239735
+ compatibility_date: string2().optional(),
239736
+ compatibility_flags: array(string2()).optional(),
239737
+ vars: record(string2(), unknown()).optional(),
239738
+ upload_source_maps: boolean2().optional()
239739
+ });
239740
+ async function detectFullStackArtifact(projectRoot) {
239741
+ const redirectPath = join16(projectRoot, WRANGLER_REDIRECT_PATH);
239742
+ return await pathExists(redirectPath) ? redirectPath : null;
239743
+ }
239744
+ async function resolveWranglerConfig(redirectPath) {
239745
+ const configPath = await resolveRedirectedConfigPath(redirectPath);
239746
+ const parsed = await readJsonFile(configPath);
239747
+ const result = WranglerConfigSchema.safeParse(parsed);
239748
+ if (!result.success) {
239749
+ throw new ConfigInvalidError(`Invalid wrangler config: ${prettifyError(result.error)}`, configPath);
239750
+ }
239751
+ const config = result.data;
239752
+ if (config.no_bundle !== true) {
239753
+ throw new InvalidInputError("This framework's output requires bundling; not yet supported. Base44 only deploys pre-bundled Workers output (no_bundle: true).");
239754
+ }
239755
+ const configDir = dirname12(configPath);
239756
+ const assetsDirectory = config.assets?.directory ? resolve4(configDir, config.assets.directory) : null;
239757
+ return {
239758
+ configPath,
239759
+ configDir,
239760
+ main: config.main,
239761
+ assetsDirectory,
239762
+ assetsConfig: config.assets ? toResolvedAssetsConfig(config.assets) : null,
239763
+ compatibilityDate: config.compatibility_date ?? null,
239764
+ compatibilityFlags: config.compatibility_flags ?? [],
239765
+ rules: (config.rules ?? []).map((rule) => ({
239766
+ type: rule.type,
239767
+ globs: rule.globs
239768
+ })),
239769
+ uploadSourceMaps: config.upload_source_maps ?? false
239770
+ };
239771
+ }
239772
+ async function resolveRedirectedConfigPath(redirectPath) {
239773
+ const parsed = await readJsonFile(redirectPath);
239774
+ const result = RedirectConfigSchema.safeParse(parsed);
239775
+ if (!result.success) {
239776
+ throw new ConfigInvalidError(`Invalid deploy redirect file: ${prettifyError(result.error)}`, redirectPath);
239777
+ }
239778
+ const configPath = resolve4(dirname12(redirectPath), result.data.configPath);
239779
+ if (!await pathExists(configPath)) {
239780
+ throw new ConfigInvalidError(`Wrangler config referenced by ${redirectPath} does not exist: ${configPath}`, redirectPath, {
239781
+ hints: [{ message: "Rebuild the project to regenerate the artifact" }]
239782
+ });
239783
+ }
239784
+ return configPath;
239785
+ }
239786
+ function toResolvedAssetsConfig(assets) {
239787
+ return {
239788
+ htmlHandling: assets.html_handling,
239789
+ notFoundHandling: assets.not_found_handling,
239790
+ runWorkerFirst: assets.run_worker_first,
239791
+ headers: assets.headers,
239792
+ redirects: assets.redirects
239793
+ };
239794
+ }
239795
+
239796
+ // src/core/site/full-stack.ts
239797
+ async function resolveFullStackBuild(projectRoot) {
239798
+ const redirectPath = await detectFullStackArtifact(projectRoot);
239799
+ if (!redirectPath) {
239800
+ return null;
239801
+ }
239802
+ const config = await resolveWranglerConfig(redirectPath);
239803
+ return {
239804
+ config,
239805
+ modules: await collectModules(config),
239806
+ assetsDir: config.assetsDirectory && await pathExists(config.assetsDirectory) ? config.assetsDirectory : null
239807
+ };
239808
+ }
239809
+
239810
+ // src/core/site/manifest.ts
239811
+ import { createHash } from "node:crypto";
239812
+ import { createReadStream } from "node:fs";
239813
+ import { stat as stat2 } from "node:fs/promises";
239814
+ import { basename as basename5, extname, join as join17 } from "node:path";
239788
239815
 
239789
239816
  // ../../node_modules/p-map/index.js
239790
239817
  async function pMap(iterable, mapper, {
@@ -239910,7 +239937,99 @@ async function pMap(iterable, mapper, {
239910
239937
  }
239911
239938
  var pMapSkip = Symbol("skip");
239912
239939
 
239940
+ // src/core/site/manifest.ts
239941
+ var MAX_ASSET_COUNT = 1e5;
239942
+ var ASSETS_IGNORE_FILE = ".assetsignore";
239943
+ var ALWAYS_IGNORED = new Set([
239944
+ ASSETS_IGNORE_FILE,
239945
+ "wrangler.json",
239946
+ ".dev.vars"
239947
+ ]);
239948
+ var MIME_TYPES = {
239949
+ ".html": "text/html",
239950
+ ".htm": "text/html",
239951
+ ".css": "text/css",
239952
+ ".js": "text/javascript",
239953
+ ".mjs": "text/javascript",
239954
+ ".json": "application/json",
239955
+ ".map": "application/json",
239956
+ ".txt": "text/plain",
239957
+ ".xml": "application/xml",
239958
+ ".svg": "image/svg+xml",
239959
+ ".png": "image/png",
239960
+ ".jpg": "image/jpeg",
239961
+ ".jpeg": "image/jpeg",
239962
+ ".gif": "image/gif",
239963
+ ".webp": "image/webp",
239964
+ ".avif": "image/avif",
239965
+ ".ico": "image/x-icon",
239966
+ ".woff": "font/woff",
239967
+ ".woff2": "font/woff2",
239968
+ ".ttf": "font/ttf",
239969
+ ".otf": "font/otf",
239970
+ ".eot": "application/vnd.ms-fontobject",
239971
+ ".mp3": "audio/mpeg",
239972
+ ".mp4": "video/mp4",
239973
+ ".webm": "video/webm",
239974
+ ".pdf": "application/pdf",
239975
+ ".wasm": "application/wasm",
239976
+ ".webmanifest": "application/manifest+json"
239977
+ };
239978
+ function getAssetContentType(filePath) {
239979
+ return MIME_TYPES[extname(filePath).toLowerCase()] ?? "application/octet-stream";
239980
+ }
239981
+ async function walkBuildOutput(outputDir) {
239982
+ const found = await globby("**/*", {
239983
+ cwd: outputDir,
239984
+ dot: true,
239985
+ onlyFiles: true,
239986
+ followSymbolicLinks: false,
239987
+ ignoreFiles: [ASSETS_IGNORE_FILE]
239988
+ });
239989
+ return found.filter((path) => !ALWAYS_IGNORED.has(basename5(path))).sort();
239990
+ }
239991
+ var STAT_CONCURRENCY = 32;
239992
+ async function describeBuildOutput(outputDir) {
239993
+ const relativePaths = await walkBuildOutput(outputDir);
239994
+ return await pMap(relativePaths, async (path) => {
239995
+ const absolutePath = join17(outputDir, ...path.split("/"));
239996
+ return { path, absolutePath, size: (await stat2(absolutePath)).size };
239997
+ }, { concurrency: STAT_CONCURRENCY });
239998
+ }
239999
+ async function hashFileInto(hash, absolutePath) {
240000
+ for await (const chunk of createReadStream(absolutePath)) {
240001
+ hash.update(chunk);
240002
+ }
240003
+ return hash;
240004
+ }
240005
+ async function hashAssetFile(appId, absolutePath) {
240006
+ const hash = await hashFileInto(createHash("sha256").update(Buffer.from(appId, "utf8")), absolutePath);
240007
+ return hash.digest("hex").slice(0, 32);
240008
+ }
240009
+ async function buildAssetManifest(assetsDir, appId) {
240010
+ const manifest = {};
240011
+ const filesByHash = new Map;
240012
+ const files = await describeBuildOutput(assetsDir);
240013
+ if (files.length > MAX_ASSET_COUNT) {
240014
+ throw new InvalidInputError(`Too many static assets: found ${files.length}, the limit is ${MAX_ASSET_COUNT} files.`);
240015
+ }
240016
+ for (const { path: relativePath, absolutePath, size } of files) {
240017
+ const hash = await hashAssetFile(appId, absolutePath);
240018
+ manifest[`/${relativePath}`] = { hash, size };
240019
+ if (!filesByHash.has(hash)) {
240020
+ filesByHash.set(hash, {
240021
+ absolutePath,
240022
+ hash,
240023
+ size,
240024
+ contentType: getAssetContentType(absolutePath)
240025
+ });
240026
+ }
240027
+ }
240028
+ return { manifest, filesByHash };
240029
+ }
240030
+
239913
240031
  // src/core/site/upload.ts
240032
+ import { readFile as readFile2 } from "node:fs/promises";
239914
240033
  var DEFAULT_UPLOAD_CONCURRENCY = 3;
239915
240034
  var MAX_UPLOAD_CONCURRENCY = 50;
239916
240035
  var MAX_UPLOAD_ATTEMPTS = 3;
@@ -240009,11 +240128,17 @@ async function uploadPresignedAsset(upload, assets) {
240009
240128
  if (!file) {
240010
240129
  throw new InternalError(`Server requested upload of unknown asset path: ${upload.path}`);
240011
240130
  }
240012
- const content = await readFile2(file.absolutePath);
240131
+ await putPresigned(upload, file.absolutePath);
240132
+ }
240133
+ async function putPresigned(upload, absolutePath) {
240134
+ const content = await readFile2(absolutePath);
240013
240135
  try {
240014
240136
  await distribution_default.put(upload.url, {
240015
240137
  body: new Uint8Array(content),
240016
- headers: { "Content-Type": upload.contentType },
240138
+ headers: {
240139
+ "Content-Type": upload.contentType,
240140
+ ...upload.checksumSha256 ? { "x-amz-checksum-sha256": upload.checksumSha256 } : {}
240141
+ },
240017
240142
  timeout: 120000,
240018
240143
  retry: UPLOAD_RETRY
240019
240144
  });
@@ -240022,85 +240147,6 @@ async function uploadPresignedAsset(upload, assets) {
240022
240147
  }
240023
240148
  }
240024
240149
 
240025
- // src/core/site/wrangler-config.ts
240026
- import { dirname as dirname12, join as join17, resolve as resolve4 } from "node:path";
240027
- var WRANGLER_REDIRECT_PATH = join17(".wrangler", "deploy", "config.json");
240028
- var RedirectConfigSchema = looseObject({
240029
- configPath: string2().min(1)
240030
- });
240031
- var WranglerConfigSchema = looseObject({
240032
- main: string2().min(1, "wrangler config is missing a 'main' entry module"),
240033
- no_bundle: boolean2().optional(),
240034
- rules: array(looseObject({ type: string2(), globs: array(string2()) })).optional(),
240035
- assets: looseObject({
240036
- directory: string2().optional(),
240037
- html_handling: string2().optional(),
240038
- not_found_handling: string2().optional(),
240039
- run_worker_first: union([boolean2(), array(string2())]).optional(),
240040
- headers: string2().optional(),
240041
- redirects: string2().optional()
240042
- }).optional(),
240043
- compatibility_date: string2().optional(),
240044
- compatibility_flags: array(string2()).optional(),
240045
- vars: record(string2(), unknown()).optional(),
240046
- upload_source_maps: boolean2().optional()
240047
- });
240048
- async function detectFullStackArtifact(projectRoot) {
240049
- const redirectPath = join17(projectRoot, WRANGLER_REDIRECT_PATH);
240050
- return await pathExists(redirectPath) ? redirectPath : null;
240051
- }
240052
- async function resolveWranglerConfig(redirectPath) {
240053
- const configPath = await resolveRedirectedConfigPath(redirectPath);
240054
- const parsed = await readJsonFile(configPath);
240055
- const result = WranglerConfigSchema.safeParse(parsed);
240056
- if (!result.success) {
240057
- throw new ConfigInvalidError(`Invalid wrangler config: ${prettifyError(result.error)}`, configPath);
240058
- }
240059
- const config = result.data;
240060
- if (config.no_bundle !== true) {
240061
- throw new InvalidInputError("This framework's output requires bundling; not yet supported. Base44 only deploys pre-bundled Workers output (no_bundle: true).");
240062
- }
240063
- const configDir = dirname12(configPath);
240064
- const assetsDirectory = config.assets?.directory ? resolve4(configDir, config.assets.directory) : null;
240065
- return {
240066
- configPath,
240067
- configDir,
240068
- main: config.main,
240069
- assetsDirectory,
240070
- assetsConfig: config.assets ? toResolvedAssetsConfig(config.assets) : null,
240071
- compatibilityDate: config.compatibility_date ?? null,
240072
- compatibilityFlags: config.compatibility_flags ?? [],
240073
- rules: (config.rules ?? []).map((rule) => ({
240074
- type: rule.type,
240075
- globs: rule.globs
240076
- })),
240077
- uploadSourceMaps: config.upload_source_maps ?? false
240078
- };
240079
- }
240080
- async function resolveRedirectedConfigPath(redirectPath) {
240081
- const parsed = await readJsonFile(redirectPath);
240082
- const result = RedirectConfigSchema.safeParse(parsed);
240083
- if (!result.success) {
240084
- throw new ConfigInvalidError(`Invalid deploy redirect file: ${prettifyError(result.error)}`, redirectPath);
240085
- }
240086
- const configPath = resolve4(dirname12(redirectPath), result.data.configPath);
240087
- if (!await pathExists(configPath)) {
240088
- throw new ConfigInvalidError(`Wrangler config referenced by ${redirectPath} does not exist: ${configPath}`, redirectPath, {
240089
- hints: [{ message: "Rebuild the project to regenerate the artifact" }]
240090
- });
240091
- }
240092
- return configPath;
240093
- }
240094
- function toResolvedAssetsConfig(assets) {
240095
- return {
240096
- htmlHandling: assets.html_handling,
240097
- notFoundHandling: assets.not_found_handling,
240098
- runWorkerFirst: assets.run_worker_first,
240099
- headers: assets.headers,
240100
- redirects: assets.redirects
240101
- };
240102
- }
240103
-
240104
240150
  // src/core/site/deployment.ts
240105
240151
  var NO_ASSETS = { manifest: {}, filesByHash: new Map };
240106
240152
  var DEPLOYMENTS_API_ENV = "BASE44_DEPLOYMENTS_API";
@@ -240130,12 +240176,11 @@ async function deployToDeployments(options) {
240130
240176
  return { deploymentId: finalized.deploymentId, gitHash };
240131
240177
  }
240132
240178
  async function resolveWorkerBuild(projectRoot, progress) {
240133
- const redirectPath = await detectFullStackArtifact(projectRoot);
240134
- if (!redirectPath) {
240179
+ const built = await resolveFullStackBuild(projectRoot);
240180
+ if (!built) {
240135
240181
  return null;
240136
240182
  }
240137
- const config = await resolveWranglerConfig(redirectPath);
240138
- const assetsDir = config.assetsDirectory && await pathExists(config.assetsDirectory) ? config.assetsDirectory : null;
240183
+ const { config, modules, assetsDir } = built;
240139
240184
  return {
240140
240185
  config: {
240141
240186
  main: config.main,
@@ -240143,7 +240188,7 @@ async function resolveWorkerBuild(projectRoot, progress) {
240143
240188
  compatibility_flags: config.compatibilityFlags,
240144
240189
  assets: buildAssetsConfig(config.assetsConfig, progress)
240145
240190
  },
240146
- modules: await collectModules(config),
240191
+ modules,
240147
240192
  assetsDir
240148
240193
  };
240149
240194
  }
@@ -246696,6 +246741,13 @@ async function resolveGitHash(projectRoot, explicit) {
246696
246741
  }
246697
246742
  return hash;
246698
246743
  }
246744
+ async function resolveProvenanceCommit(projectRoot, explicit) {
246745
+ if (explicit) {
246746
+ return await resolveGitHash(projectRoot, explicit);
246747
+ }
246748
+ const hash = await gitHead(projectRoot);
246749
+ return hash && isGitCommitHash(hash) ? hash : undefined;
246750
+ }
246699
246751
  async function gitHead(projectRoot) {
246700
246752
  try {
246701
246753
  const { stdout } = await execa("git", ["rev-parse", "HEAD"], {
@@ -246784,6 +246836,49 @@ async function deployAll(projectData, options) {
246784
246836
  }
246785
246837
  return { connectorResults };
246786
246838
  }
246839
+ // src/core/project/target.ts
246840
+ import { dirname as dirname13, join as join19, resolve as resolve6 } from "node:path";
246841
+ var DEFAULT_BUILD_COMMAND = "npm run build";
246842
+ var DEFAULT_OUTPUT_DIRECTORY = "dist";
246843
+ async function resolveBuildTarget(projectRoot, overrides = {}) {
246844
+ const project = await readSettingsIfPresent(projectRoot);
246845
+ const root = project?.root ?? projectRoot ?? process.cwd();
246846
+ return {
246847
+ root,
246848
+ configDir: project ? dirname13(project.configPath) : join19(root, PROJECT_SUBDIR),
246849
+ buildCommand: project ? project.site?.buildCommand : DEFAULT_BUILD_COMMAND,
246850
+ outputDir: outputDirectory(project, root, overrides.outputDir),
246851
+ entitiesDir: project?.entitiesDir ?? "entities",
246852
+ agentsDir: project?.agentsDir ?? "agents"
246853
+ };
246854
+ }
246855
+ function outputDirectory(project, root, override) {
246856
+ const configured = override ?? (project ? project.site?.outputDirectory : DEFAULT_OUTPUT_DIRECTORY);
246857
+ return configured ? resolve6(root, configured) : null;
246858
+ }
246859
+ function requireOutputDir(target) {
246860
+ if (target.outputDir === null) {
246861
+ throw new ConfigNotFoundError("No site configuration found.", {
246862
+ hints: [
246863
+ {
246864
+ message: `Add 'site.outputDirectory' to your config.jsonc (e.g., "site": { "outputDirectory": "dist" })`
246865
+ },
246866
+ { message: `Or pass --output-dir <dir>, relative to ${target.root}` }
246867
+ ]
246868
+ });
246869
+ }
246870
+ return target.outputDir;
246871
+ }
246872
+ async function readSettingsIfPresent(projectRoot) {
246873
+ try {
246874
+ return await readProjectSettings(projectRoot);
246875
+ } catch (error) {
246876
+ if (error instanceof ConfigNotFoundError) {
246877
+ return null;
246878
+ }
246879
+ throw error;
246880
+ }
246881
+ }
246787
246882
  // src/core/clients/base44-client.ts
246788
246883
  var retriedRequests = new WeakSet;
246789
246884
  async function captureRequestBody(request, options) {
@@ -247065,6 +247160,12 @@ async function ensureAppContext(ctx, options = {}) {
247065
247160
  ctx.app = appContext;
247066
247161
  ctx.errorReporter.setContext({ appId: appContext.id });
247067
247162
  }
247163
+ function requireApp(ctx) {
247164
+ if (!ctx.app) {
247165
+ throw new InternalError("This command read an app context it never resolved — it is declared with requireAppContext: false.");
247166
+ }
247167
+ return ctx.app;
247168
+ }
247068
247169
 
247069
247170
  // src/cli/utils/version-check.ts
247070
247171
  async function checkForUpgrade() {
@@ -247248,6 +247349,10 @@ function writeJsonError(error) {
247248
247349
  const envelope = {
247249
247350
  error: error instanceof Error ? error.message : String(error)
247250
247351
  };
247352
+ const step = stepOf(error);
247353
+ if (step !== undefined) {
247354
+ envelope.step = step;
247355
+ }
247251
247356
  if (isCLIError(error)) {
247252
247357
  envelope.code = error.code;
247253
247358
  if (error.details.length > 0) {
@@ -247617,7 +247722,7 @@ function getActorsCommand() {
247617
247722
  }
247618
247723
 
247619
247724
  // src/cli/commands/agent-skills/pull.ts
247620
- import { dirname as dirname13, join as join19 } from "node:path";
247725
+ import { dirname as dirname14, join as join20 } from "node:path";
247621
247726
  // src/core/utils/dependencies.ts
247622
247727
  import { spawnSync as spawnSync2 } from "node:child_process";
247623
247728
  function verifyDenoInstalled(context) {
@@ -247706,7 +247811,7 @@ async function pullAction({
247706
247811
  runTask
247707
247812
  }) {
247708
247813
  const { project } = await readProjectConfig();
247709
- const dir = join19(dirname13(project.configPath), project.agentSkillsDir);
247814
+ const dir = join20(dirname14(project.configPath), project.agentSkillsDir);
247710
247815
  const remote = await runTask("Fetching agent skills from Base44", () => fetchAgentSkills(), {
247711
247816
  successMessage: "Agent skills fetched successfully",
247712
247817
  errorMessage: "Failed to fetch agent skills"
@@ -247762,14 +247867,14 @@ function getAgentSkillsCommand() {
247762
247867
  }
247763
247868
 
247764
247869
  // src/cli/commands/agents/pull.ts
247765
- import { dirname as dirname14, join as join20 } from "node:path";
247870
+ import { dirname as dirname15, join as join21 } from "node:path";
247766
247871
  async function pullAgentsAction({
247767
247872
  log,
247768
247873
  runTask
247769
247874
  }) {
247770
247875
  const { project } = await readProjectConfig();
247771
- const configDir = dirname14(project.configPath);
247772
- const agentsDir = join20(configDir, project.agentsDir);
247876
+ const configDir = dirname15(project.configPath);
247877
+ const agentsDir = join21(configDir, project.agentsDir);
247773
247878
  const remoteAgents = await runTask("Fetching agents from Base44", async () => {
247774
247879
  return await fetchAgents();
247775
247880
  }, {
@@ -247839,12 +247944,12 @@ function getAgentsCommand() {
247839
247944
  }
247840
247945
 
247841
247946
  // src/cli/commands/auth/password-login.ts
247842
- import { dirname as dirname15, join as join21 } from "node:path";
247947
+ import { dirname as dirname16, join as join22 } from "node:path";
247843
247948
  async function passwordLoginAction({ log, runTask }, action) {
247844
247949
  const shouldEnable = action === "enable";
247845
247950
  const { project } = await readProjectConfig();
247846
- const configDir = dirname15(project.configPath);
247847
- const authDir = join21(configDir, project.authDir);
247951
+ const configDir = dirname16(project.configPath);
247952
+ const authDir = join22(configDir, project.authDir);
247848
247953
  const updated = await runTask("Updating local auth config", async () => {
247849
247954
  const current = await readAuthConfig(authDir) ?? DEFAULT_AUTH_CONFIG;
247850
247955
  const merged = { ...current, enableUsernamePassword: shouldEnable };
@@ -247864,14 +247969,14 @@ function getPasswordLoginCommand() {
247864
247969
  }
247865
247970
 
247866
247971
  // src/cli/commands/auth/pull.ts
247867
- import { dirname as dirname16, join as join22 } from "node:path";
247972
+ import { dirname as dirname17, join as join23 } from "node:path";
247868
247973
  async function pullAuthAction({
247869
247974
  log,
247870
247975
  runTask
247871
247976
  }) {
247872
247977
  const { project } = await readProjectConfig();
247873
- const configDir = dirname16(project.configPath);
247874
- const authDir = join22(configDir, project.authDir);
247978
+ const configDir = dirname17(project.configPath);
247979
+ const authDir = join23(configDir, project.authDir);
247875
247980
  const remoteConfig = await runTask("Fetching auth config from Base44", async () => {
247876
247981
  return await pullAuthConfig();
247877
247982
  }, {
@@ -247935,7 +248040,7 @@ function getAuthPushCommand() {
247935
248040
  }
247936
248041
 
247937
248042
  // src/cli/commands/auth/social-login.ts
247938
- import { dirname as dirname17, join as join23, resolve as resolve6 } from "node:path";
248043
+ import { dirname as dirname18, join as join24, resolve as resolve7 } from "node:path";
247939
248044
  var PROVIDER_LABELS = {
247940
248045
  google: "Google",
247941
248046
  microsoft: "Microsoft",
@@ -247975,7 +248080,7 @@ async function socialLoginAction({ log, isNonInteractive, runTask }, provider, a
247975
248080
  let clientSecret;
247976
248081
  if (useCustomOAuth && oauth && oauthCli && hasSecretOptions(options)) {
247977
248082
  if (options.envFile) {
247978
- const secrets = await parseEnvFile(resolve6(options.envFile));
248083
+ const secrets = await parseEnvFile(resolve7(options.envFile));
247979
248084
  const value = secrets[oauthCli.envVar];
247980
248085
  if (!value) {
247981
248086
  throw new InvalidInputError(`Key "${oauthCli.envVar}" not found in ${options.envFile}.`);
@@ -248005,8 +248110,8 @@ async function socialLoginAction({ log, isNonInteractive, runTask }, provider, a
248005
248110
  }
248006
248111
  }
248007
248112
  const { project } = await readProjectConfig();
248008
- const configDir = dirname17(project.configPath);
248009
- const authDir = join23(configDir, project.authDir);
248113
+ const configDir = dirname18(project.configPath);
248114
+ const authDir = join24(configDir, project.authDir);
248010
248115
  const { config: updated } = await runTask("Updating local auth config", async () => updateSocialLoginConfig(authDir, provider, shouldEnable, useCustomOAuth && options.clientId ? { clientId: options.clientId } : undefined));
248011
248116
  if (clientSecret) {
248012
248117
  await runTask("Saving client secret", async () => pushCustomOAuthSecret(provider, clientSecret));
@@ -248031,7 +248136,7 @@ function getSocialLoginCommand() {
248031
248136
  }
248032
248137
 
248033
248138
  // src/cli/commands/auth/sso.ts
248034
- import { dirname as dirname18, join as join24, resolve as resolve7 } from "node:path";
248139
+ import { dirname as dirname19, join as join25, resolve as resolve8 } from "node:path";
248035
248140
  var SSOConfigFileSchema = object({
248036
248141
  provider: _enum(Object.values(KNOWN_SSO_PROVIDERS)),
248037
248142
  clientId: string2(),
@@ -248047,7 +248152,7 @@ var SSOConfigFileSchema = object({
248047
248152
  ssoName: string2().optional()
248048
248153
  });
248049
248154
  async function loadSSOConfigFile(filePath) {
248050
- const resolved = resolve7(filePath);
248155
+ const resolved = resolve8(filePath);
248051
248156
  const raw = await readJsonFile(resolved);
248052
248157
  const result = SSOConfigFileSchema.safeParse(raw);
248053
248158
  if (!result.success) {
@@ -248135,7 +248240,7 @@ async function ssoEnableAction({ isNonInteractive, runTask }, options) {
248135
248240
  }
248136
248241
  let clientSecret;
248137
248242
  if (merged.envFile && !merged.clientSecret) {
248138
- const secrets = await parseEnvFile(resolve7(merged.envFile));
248243
+ const secrets = await parseEnvFile(resolve8(merged.envFile));
248139
248244
  const value = secrets.sso_client_secret;
248140
248245
  if (!value) {
248141
248246
  throw new InvalidInputError(`Key "sso_client_secret" not found in ${merged.envFile}.`);
@@ -248194,8 +248299,8 @@ async function ssoEnableAction({ isNonInteractive, runTask }, options) {
248194
248299
  throw error;
248195
248300
  }
248196
248301
  const { project } = await readProjectConfig();
248197
- const configDir = dirname18(project.configPath);
248198
- const authDir = join24(configDir, project.authDir);
248302
+ const configDir = dirname19(project.configPath);
248303
+ const authDir = join25(configDir, project.authDir);
248199
248304
  await runTask("Updating local auth config", async () => updateSSOConfig(authDir, provider, true));
248200
248305
  await runTask("Saving SSO credentials", async () => pushSSOSecrets(secrets));
248201
248306
  return {
@@ -248210,8 +248315,8 @@ async function ssoDisableAction({ log, runTask }, options) {
248210
248315
  throw new InvalidInputError("Configuration options cannot be used with disable. To disable SSO: base44 auth sso disable");
248211
248316
  }
248212
248317
  const { project } = await readProjectConfig();
248213
- const configDir = dirname18(project.configPath);
248214
- const authDir = join24(configDir, project.authDir);
248318
+ const configDir = dirname19(project.configPath);
248319
+ const authDir = join25(configDir, project.authDir);
248215
248320
  const updated = await runTask("Updating local auth config", async () => updateSSOConfig(authDir, null, false));
248216
248321
  await runTask("Removing SSO credentials", async () => deleteSSOSecrets());
248217
248322
  if (!hasAnyLoginMethod(updated)) {
@@ -249093,13 +249198,13 @@ function getConnectorsListAvailableCommand() {
249093
249198
  }
249094
249199
 
249095
249200
  // src/cli/commands/connectors/pull.ts
249096
- import { dirname as dirname19, join as join25, resolve as resolve8 } from "node:path";
249201
+ import { dirname as dirname20, join as join26, resolve as resolve9 } from "node:path";
249097
249202
  async function resolveConnectorsDir(options) {
249098
249203
  if (!getAppContext().projectRoot) {
249099
- return resolve8(options.dir ?? "connectors");
249204
+ return resolve9(options.dir ?? "connectors");
249100
249205
  }
249101
249206
  const { project } = await readProjectConfig();
249102
- return join25(dirname19(project.configPath), project.connectorsDir);
249207
+ return join26(dirname20(project.configPath), project.connectorsDir);
249103
249208
  }
249104
249209
  async function pullConnectorsAction({ log, runTask, jsonMode }, options) {
249105
249210
  const connectorsDir = await resolveConnectorsDir(options);
@@ -249140,10 +249245,10 @@ function getConnectorsPullCommand() {
249140
249245
  }
249141
249246
 
249142
249247
  // src/cli/commands/connectors/push.ts
249143
- import { resolve as resolve9 } from "node:path";
249248
+ import { resolve as resolve10 } from "node:path";
249144
249249
  async function readConnectorsToPush(options) {
249145
249250
  if (!getAppContext().projectRoot) {
249146
- return readAllConnectors(resolve9(options.dir ?? "connectors"));
249251
+ return readAllConnectors(resolve10(options.dir ?? "connectors"));
249147
249252
  }
249148
249253
  const { connectors } = await readProjectConfig();
249149
249254
  return connectors;
@@ -249486,11 +249591,11 @@ function getListCommand() {
249486
249591
  }
249487
249592
 
249488
249593
  // src/cli/commands/functions/pull.ts
249489
- import { dirname as dirname20, join as join26 } from "node:path";
249594
+ import { dirname as dirname21, join as join27 } from "node:path";
249490
249595
  async function pullFunctionsAction({ log, runTask }, name) {
249491
249596
  const { project, functions } = await readProjectConfig();
249492
- const configDir = dirname20(project.configPath);
249493
- const functionsDir = join26(configDir, project.functionsDir);
249597
+ const configDir = dirname21(project.configPath);
249598
+ const functionsDir = join27(configDir, project.functionsDir);
249494
249599
  const pluginFunctionNames = new Set(functions.filter((fn) => fn.source.type === "plugin").map((fn) => fn.name));
249495
249600
  const remoteFunctions = await runTask("Fetching functions from Base44", async () => {
249496
249601
  const { functions } = await listDeployedFunctions();
@@ -249593,14 +249698,11 @@ async function maybeAskToBuild(isNonInteractive, buildCommand) {
249593
249698
 
249594
249699
  // src/cli/commands/project/build.ts
249595
249700
  async function buildAction(ctx) {
249596
- const { app } = ctx;
249597
- if (!app?.projectRoot) {
249598
- throw new ConfigInvalidError("base44 build requires a linked local project. Run it from a project with base44/.app.jsonc.");
249599
- }
249600
- const { project } = await readProjectConfig(app.projectRoot);
249701
+ const app = requireApp(ctx);
249702
+ const target = await resolveBuildTarget(app.projectRoot);
249601
249703
  await runSiteBuild(ctx, {
249602
- root: project.root,
249603
- buildCommand: project.site?.buildCommand,
249704
+ root: target.root,
249705
+ buildCommand: target.buildCommand,
249604
249706
  appId: app.id
249605
249707
  });
249606
249708
  return {
@@ -249608,15 +249710,15 @@ async function buildAction(ctx) {
249608
249710
  };
249609
249711
  }
249610
249712
  function getBuildCommand() {
249611
- return new Base44Command("build").description("Build the site with the Base44 app id injected").action(buildAction);
249713
+ return new Base44Command("build", { requireAuth: false }).description("Build the site with the Base44 app id injected").action(buildAction);
249612
249714
  }
249613
249715
 
249614
249716
  // src/cli/commands/project/create.ts
249615
- import { basename as basename6, resolve as resolve10 } from "node:path";
249717
+ import { basename as basename6, resolve as resolve11 } from "node:path";
249616
249718
  var import_kebabCase = __toESM(require_kebabCase(), 1);
249617
249719
 
249618
249720
  // src/cli/commands/project/scaffold-shared.ts
249619
- import { join as join27 } from "node:path";
249721
+ import { join as join28 } from "node:path";
249620
249722
  var DEFAULT_TEMPLATE_ID = "backend-only";
249621
249723
  async function getTemplateById(templateId) {
249622
249724
  const templates = await listTemplates();
@@ -249679,7 +249781,7 @@ async function completeProjectSetup({
249679
249781
  env: { VITE_BASE44_APP_ID: projectId }
249680
249782
  })`${buildCommand}`;
249681
249783
  updateMessage("Deploying site...");
249682
- return await deploySite(join27(resolvedPath, outputDirectory));
249784
+ return await deploySite(join28(resolvedPath, outputDirectory));
249683
249785
  }, {
249684
249786
  successMessage: theme.colors.base44Orange("Site deployed successfully"),
249685
249787
  errorMessage: "Failed to deploy site"
@@ -249808,7 +249910,7 @@ async function createInteractive(options, ctx) {
249808
249910
  }, ctx);
249809
249911
  }
249810
249912
  async function createNonInteractive(options, ctx) {
249811
- ctx.log.info(`Creating a new project at ${resolve10(options.path)}`);
249913
+ ctx.log.info(`Creating a new project at ${resolve11(options.path)}`);
249812
249914
  const template = await getTemplateById(options.template ?? DEFAULT_TEMPLATE_ID);
249813
249915
  return await executeCreate({
249814
249916
  template,
@@ -249832,7 +249934,7 @@ async function executeCreate({
249832
249934
  }, ctx) {
249833
249935
  const { log, runTask } = ctx;
249834
249936
  const name = rawName.trim();
249835
- const resolvedPath = resolve10(projectPath);
249937
+ const resolvedPath = resolve11(projectPath);
249836
249938
  const organizationId = await resolveWorkspaceId(ctx, flagWorkspaceId, isInteractive);
249837
249939
  const { projectId } = await runTask("Setting up your project...", async () => {
249838
249940
  return await createProjectFiles({
@@ -250473,7 +250575,7 @@ function getLogsCommand() {
250473
250575
  }
250474
250576
 
250475
250577
  // src/cli/commands/project/scaffold.ts
250476
- import { basename as basename7, resolve as resolve11 } from "node:path";
250578
+ import { basename as basename7, resolve as resolve12 } from "node:path";
250477
250579
  function resolveAppId(options) {
250478
250580
  const appId = options.appId;
250479
250581
  if (!appId) {
@@ -250489,7 +250591,7 @@ function resolveAppId(options) {
250489
250591
  async function scaffoldAction(ctx, name, options, command) {
250490
250592
  const { log, runTask } = ctx;
250491
250593
  const appId = resolveAppId(command.optsWithGlobals());
250492
- const resolvedPath = resolve11("./");
250594
+ const resolvedPath = resolve12("./");
250493
250595
  const projectName = (name ?? basename7(resolvedPath)).trim();
250494
250596
  const template = await getTemplateById("backend-only");
250495
250597
  log.info(`Scaffolding project at ${resolvedPath}`);
@@ -250537,6 +250639,315 @@ function getVisibilityCommand() {
250537
250639
  ])).action(setVisibility);
250538
250640
  }
250539
250641
 
250642
+ // src/core/version/schema.ts
250643
+ var DeclareVersionResponseSchema = object({
250644
+ session_id: string2(),
250645
+ uploads: array(object({
250646
+ path: string2(),
250647
+ url: string2(),
250648
+ content_type: string2(),
250649
+ content_length: number2(),
250650
+ checksum_sha256: string2()
250651
+ }))
250652
+ }).transform((data) => ({
250653
+ sessionId: data.session_id,
250654
+ uploads: data.uploads.map((upload) => ({
250655
+ path: upload.path,
250656
+ url: upload.url,
250657
+ contentType: upload.content_type,
250658
+ contentLength: upload.content_length,
250659
+ checksumSha256: upload.checksum_sha256
250660
+ }))
250661
+ }));
250662
+ var CreateVersionResponseSchema = object({
250663
+ version_id: string2(),
250664
+ manifest_hash: string2()
250665
+ }).transform((data) => ({
250666
+ versionId: data.version_id,
250667
+ manifestHash: data.manifest_hash
250668
+ }));
250669
+ var EnvironmentResponseSchema = object({
250670
+ name: string2(),
250671
+ version_id: string2(),
250672
+ manifest_hash: string2(),
250673
+ deployment_id: string2()
250674
+ }).transform((data) => ({
250675
+ name: data.name,
250676
+ versionId: data.version_id,
250677
+ manifestHash: data.manifest_hash,
250678
+ deploymentId: data.deployment_id
250679
+ }));
250680
+
250681
+ // src/core/version/api.ts
250682
+ var DEFAULT_VERSION_UPLOAD_CONCURRENCY = 8;
250683
+ var MAX_VERSION_UPLOAD_CONCURRENCY = 16;
250684
+ function declaredFile({ path, size, digest }) {
250685
+ return { path, size, digest };
250686
+ }
250687
+ function declaredModule(module) {
250688
+ return { ...declaredFile(module), type: module.type };
250689
+ }
250690
+ function declaredServingConfig(config) {
250691
+ const stated = {
250692
+ html_handling: config?.htmlHandling ?? null,
250693
+ not_found_handling: config?.notFoundHandling ?? null,
250694
+ run_worker_first: config?.runWorkerFirst ?? null,
250695
+ headers: config?.headers ?? null,
250696
+ redirects: config?.redirects ?? null
250697
+ };
250698
+ return Object.values(stated).every((v) => v === null) ? null : stated;
250699
+ }
250700
+ async function post(path, json, doing) {
250701
+ try {
250702
+ return await getAppClient().post(path, { json, timeout: 180000 });
250703
+ } catch (error) {
250704
+ throw await ApiError.fromHttpError(error, doing);
250705
+ }
250706
+ }
250707
+ var KEYED_RETRY = {
250708
+ limit: 3,
250709
+ methods: ["patch"],
250710
+ statusCodes: [408, 500, 502, 503, 504],
250711
+ retryOnTimeout: true
250712
+ };
250713
+ async function patch(path, json, doing, retry) {
250714
+ try {
250715
+ return await getAppClient().patch(path, {
250716
+ json,
250717
+ timeout: 180000,
250718
+ ...retry ? { retry } : {}
250719
+ });
250720
+ } catch (error) {
250721
+ throw await ApiError.fromHttpError(error, doing);
250722
+ }
250723
+ }
250724
+ function parse10(schema, body, what) {
250725
+ const result = schema.safeParse(body);
250726
+ if (!result.success) {
250727
+ throw new SchemaValidationError(`Invalid ${what} response from server`, result.error);
250728
+ }
250729
+ return result.data;
250730
+ }
250731
+ async function createVersion(artifacts, options = {}) {
250732
+ const declared = parse10(DeclareVersionResponseSchema, await (await post("versions", {
250733
+ assets: artifacts.assets.map(declaredFile),
250734
+ ...artifacts.siteWorker ? {
250735
+ site_worker: {
250736
+ main: artifacts.siteWorker.main,
250737
+ modules: artifacts.siteWorker.modules.map(declaredModule),
250738
+ compatibility_date: artifacts.siteWorker.compatibilityDate,
250739
+ compatibility_flags: artifacts.siteWorker.compatibilityFlags,
250740
+ serving_config: declaredServingConfig(artifacts.siteWorker.servingConfig)
250741
+ }
250742
+ } : {},
250743
+ entities: artifacts.entities,
250744
+ agents: artifacts.agents,
250745
+ source_commit: options.sourceCommit
250746
+ }, "declaring a version")).json(), "declare");
250747
+ const declaredFiles = [
250748
+ ...artifacts.assets,
250749
+ ...artifacts.siteWorker?.modules ?? []
250750
+ ];
250751
+ options.progress?.onDeclared?.({ fileCount: declaredFiles.length });
250752
+ if (declared.uploads.length !== declaredFiles.length) {
250753
+ throw new InternalError(`Declared ${declaredFiles.length} files but the server signed ${declared.uploads.length} upload URLs.`);
250754
+ }
250755
+ const drifted = declared.uploads.findIndex((upload, index) => upload.path !== declaredFiles[index].path);
250756
+ if (drifted !== -1) {
250757
+ throw new InternalError(`Upload ${drifted} is signed for ${declared.uploads[drifted].path}, but that slot declared ${declaredFiles[drifted].path}.`);
250758
+ }
250759
+ let uploadedFiles = 0;
250760
+ await pMap(declared.uploads, async (upload, index) => {
250761
+ await putPresigned(upload, declaredFiles[index].absolutePath);
250762
+ uploadedFiles++;
250763
+ options.progress?.onUpload?.({
250764
+ uploadedFiles,
250765
+ totalFiles: declared.uploads.length
250766
+ });
250767
+ }, { concurrency: options.concurrency ?? DEFAULT_VERSION_UPLOAD_CONCURRENCY });
250768
+ return parse10(CreateVersionResponseSchema, await (await post(`versions/${encodeURIComponent(declared.sessionId)}/finalize`, {}, "creating a version")).json(), "create version");
250769
+ }
250770
+ async function setEnvironmentVersion(environment, versionId, options = {}) {
250771
+ return parse10(EnvironmentResponseSchema, await (await patch(`environments/${encodeURIComponent(environment)}`, {
250772
+ version_id: versionId,
250773
+ ...options.idempotencyKey ? { idempotency_key: options.idempotencyKey } : {}
250774
+ }, "setting the environment's version", options.idempotencyKey ? KEYED_RETRY : undefined)).json(), "environment");
250775
+ }
250776
+ // src/core/version/artifacts.ts
250777
+ import { createHash as createHash2 } from "node:crypto";
250778
+ import { join as join29, resolve as resolve13 } from "node:path";
250779
+ var MAX_FILE_COUNT = 50000;
250780
+ var HASH_CONCURRENCY = 32;
250781
+ var ENTRY2 = "index.html";
250782
+ async function digestFile(absolutePath) {
250783
+ const hash = await hashFileInto(createHash2("sha256"), absolutePath);
250784
+ return `sha256:${hash.digest("hex")}`;
250785
+ }
250786
+ async function collectBuildOutput(outputDir, options = {}) {
250787
+ const found = await describeBuildOutput(outputDir);
250788
+ if (found.length > MAX_FILE_COUNT) {
250789
+ throw new InvalidInputError(`Too many files: found ${found.length}, the limit is ${MAX_FILE_COUNT}.`);
250790
+ }
250791
+ if (options.entryFile) {
250792
+ if (found.length === 0) {
250793
+ throw new InvalidInputError(`No files found in ${outputDir}. Build the site before creating a version.`, {
250794
+ hints: [
250795
+ { message: "Run 'base44 build' first", command: "base44 build" }
250796
+ ]
250797
+ });
250798
+ }
250799
+ if (!found.some((f) => f.path === options.entryFile)) {
250800
+ throw new InvalidInputError(`${outputDir} has no ${options.entryFile}, so nothing could enter the site.`);
250801
+ }
250802
+ }
250803
+ return await pMap(found, async (file) => ({ ...file, digest: await digestFile(file.absolutePath) }), { concurrency: HASH_CONCURRENCY });
250804
+ }
250805
+ async function describeSiteWorker(built) {
250806
+ const { config, modules } = built;
250807
+ const entry = resolve13(config.configDir, config.main);
250808
+ const main = modules.find((m) => m.absolutePath === entry)?.name;
250809
+ if (!main) {
250810
+ throw new InvalidInputError(`The Worker's entry module ${config.main} is not among the ${modules.length} modules collected from ${config.configDir}.`);
250811
+ }
250812
+ return {
250813
+ main,
250814
+ modules: await pMap(modules, async ({ name, absolutePath, size, type }) => ({
250815
+ path: name,
250816
+ absolutePath,
250817
+ size,
250818
+ digest: await digestFile(absolutePath),
250819
+ type
250820
+ }), { concurrency: HASH_CONCURRENCY }),
250821
+ compatibilityDate: config.compatibilityDate,
250822
+ compatibilityFlags: config.compatibilityFlags,
250823
+ servingConfig: config.assetsConfig
250824
+ };
250825
+ }
250826
+ async function readRawResources(dir) {
250827
+ if (!await pathExists(dir)) {
250828
+ return {};
250829
+ }
250830
+ const files = await globby(`**/*.${CONFIG_FILE_EXTENSION_GLOB}`, {
250831
+ cwd: dir,
250832
+ onlyFiles: true,
250833
+ followSymbolicLinks: false
250834
+ });
250835
+ const payloads = {};
250836
+ for (const relativePath of files.sort()) {
250837
+ const name = relativePath.replace(/\.jsonc?$/, "");
250838
+ payloads[name] = await readJsonFile(join29(dir, ...relativePath.split("/")));
250839
+ }
250840
+ return payloads;
250841
+ }
250842
+ async function collectResources(configDir, dirs) {
250843
+ const [entities, agents] = await Promise.all([
250844
+ readRawResources(join29(configDir, dirs.entitiesDir)),
250845
+ readRawResources(join29(configDir, dirs.agentsDir))
250846
+ ]);
250847
+ return { entities, agents };
250848
+ }
250849
+ async function collectArtifacts(target) {
250850
+ const built = await resolveFullStackBuild(target.root);
250851
+ const siteWorker = built ? await describeSiteWorker(built) : null;
250852
+ return {
250853
+ assets: built ? built.assetsDir ? await collectBuildOutput(built.assetsDir) : [] : await collectBuildOutput(requireOutputDir(target), {
250854
+ entryFile: ENTRY2
250855
+ }),
250856
+ ...siteWorker ? { siteWorker } : {},
250857
+ ...await collectResources(target.configDir, target)
250858
+ };
250859
+ }
250860
+ // src/core/version/gate.ts
250861
+ var VERSIONS_API_ENV = "BASE44_VERSIONS_API";
250862
+ function versionsApiEnabled(env = process.env) {
250863
+ const value = env[VERSIONS_API_ENV];
250864
+ return value === "1" || value === "true";
250865
+ }
250866
+ // src/core/version/publish.ts
250867
+ import { randomUUID as randomUUID4 } from "node:crypto";
250868
+ var DEFAULT_ENVIRONMENT = "production";
250869
+ async function tagStep2(step, run) {
250870
+ return await tagStep(step, run);
250871
+ }
250872
+ async function publishVersion(artifacts, options = {}) {
250873
+ const version = await tagStep2("create_version", () => createVersion(artifacts, {
250874
+ sourceCommit: options.sourceCommit,
250875
+ concurrency: options.concurrency,
250876
+ progress: options.progress
250877
+ }));
250878
+ const environment = await tagStep2("deploy", () => setEnvironmentVersion(options.target ?? DEFAULT_ENVIRONMENT, version.versionId, {
250879
+ idempotencyKey: randomUUID4()
250880
+ }));
250881
+ return {
250882
+ environment: environment.name,
250883
+ versionId: environment.versionId,
250884
+ manifestHash: environment.manifestHash,
250885
+ deploymentId: environment.deploymentId
250886
+ };
250887
+ }
250888
+ // src/cli/commands/versions/options.ts
250889
+ function outputDirOption() {
250890
+ return new Option2("--output-dir <dir>", "Build output directory (defaults to the project's, else dist)");
250891
+ }
250892
+ function targetOption() {
250893
+ return new Option2("--target <name>", "Environment to serve the version at");
250894
+ }
250895
+ function gitHashOption() {
250896
+ return new Option2("--git-hash <hash>", "Commit the build came from (defaults to the checkout's HEAD)").argParser((value) => {
250897
+ if (!isGitCommitHash(value)) {
250898
+ throw new InvalidArgumentError2("Expected a git commit hash (7-64 hex chars).");
250899
+ }
250900
+ return value;
250901
+ });
250902
+ }
250903
+ function concurrencyOption() {
250904
+ return new Option2("--concurrency <n>", "Parallel file uploads").default(DEFAULT_VERSION_UPLOAD_CONCURRENCY).argParser((value) => {
250905
+ const parsed = Number(value);
250906
+ if (!Number.isInteger(parsed) || parsed < 1 || parsed > MAX_VERSION_UPLOAD_CONCURRENCY) {
250907
+ throw new InvalidArgumentError2(`Expected a whole number between 1 and ${MAX_VERSION_UPLOAD_CONCURRENCY}.`);
250908
+ }
250909
+ return parsed;
250910
+ });
250911
+ }
250912
+
250913
+ // src/cli/commands/publish.ts
250914
+ async function publishAction(ctx, options) {
250915
+ const { runTask, log, jsonMode } = ctx;
250916
+ const app = requireApp(ctx);
250917
+ const target = await tagStep2("create_version", () => resolveBuildTarget(app.projectRoot, { outputDir: options.outputDir }));
250918
+ if (options.build !== false) {
250919
+ await tagStep2("build", () => runSiteBuild(ctx, {
250920
+ root: target.root,
250921
+ buildCommand: target.buildCommand,
250922
+ appId: app.id
250923
+ }));
250924
+ }
250925
+ const gitHash = await resolveProvenanceCommit(target.root, options.gitHash);
250926
+ const result = await runTask("Publishing...", async (updateMessage) => {
250927
+ const artifacts = await tagStep2("create_version", () => collectArtifacts(target));
250928
+ return await publishVersion(artifacts, {
250929
+ sourceCommit: gitHash,
250930
+ target: options.target,
250931
+ concurrency: options.concurrency,
250932
+ progress: {
250933
+ onDeclared: ({ fileCount }) => updateMessage(`Uploading ${fileCount} files`),
250934
+ onUpload: ({ uploadedFiles, totalFiles }) => updateMessage(`Uploaded ${uploadedFiles} of ${totalFiles} files`)
250935
+ }
250936
+ });
250937
+ }, { successMessage: "Published", errorMessage: "Publish failed" });
250938
+ if (!jsonMode) {
250939
+ log.message(theme.styles.dim(`version ${result.versionId}`));
250940
+ }
250941
+ return {
250942
+ outroMessage: `${result.environment} now serves ${result.versionId}`,
250943
+ stdout: jsonMode ? `${JSON.stringify(result, null, 2)}
250944
+ ` : undefined
250945
+ };
250946
+ }
250947
+ function getPublishCommand() {
250948
+ return new Base44Command("publish").description("Build the app, record it as a version, and serve that version").option("--no-build", "Publish the existing build output without rebuilding").addOption(outputDirOption()).addOption(targetOption()).addOption(gitHashOption()).addOption(concurrencyOption()).action(publishAction);
250949
+ }
250950
+
250540
250951
  // src/core/resources/sandbox/schema.ts
250541
250952
  var FileErrorSchema = object({
250542
250953
  code: string2(),
@@ -250922,7 +251333,7 @@ function getSecretsListCommand() {
250922
251333
  }
250923
251334
 
250924
251335
  // src/cli/commands/secrets/set.ts
250925
- import { resolve as resolve12 } from "node:path";
251336
+ import { resolve as resolve14 } from "node:path";
250926
251337
  function parseEntries(entries) {
250927
251338
  const secrets = {};
250928
251339
  for (const entry of entries) {
@@ -250953,7 +251364,7 @@ async function setSecretsAction({ log, runTask }, entries, options) {
250953
251364
  validateInput(entries, options);
250954
251365
  let secrets;
250955
251366
  if (options.envFile) {
250956
- secrets = await parseEnvFile(resolve12(options.envFile));
251367
+ secrets = await parseEnvFile(resolve14(options.envFile));
250957
251368
  if (Object.keys(secrets).length === 0) {
250958
251369
  throw new InvalidInputError("The env file contains no valid KEY=VALUE entries.");
250959
251370
  }
@@ -250982,7 +251393,7 @@ function getSecretsCommand() {
250982
251393
  }
250983
251394
 
250984
251395
  // src/cli/commands/site/deploy.ts
250985
- import { resolve as resolve13 } from "node:path";
251396
+ import { resolve as resolve15 } from "node:path";
250986
251397
  async function deployAction2(ctx, options) {
250987
251398
  const { isNonInteractive } = ctx;
250988
251399
  if (isNonInteractive && !options.yes) {
@@ -251060,7 +251471,7 @@ async function deployTarball({ runTask }, project) {
251060
251471
  }
251061
251472
  function siteOutputDir(project) {
251062
251473
  const outputDirectory = project.site?.outputDirectory;
251063
- return outputDirectory ? resolve13(project.root, outputDirectory) : null;
251474
+ return outputDirectory ? resolve15(project.root, outputDirectory) : null;
251064
251475
  }
251065
251476
  function getSiteDeployCommand() {
251066
251477
  const command = new Base44Command("deploy").description("Deploy built site files to Base44 hosting").option("-y, --yes", "Skip confirmation prompt").option("--build", "Build the site before deploying (skips the prompt)").option("--no-build", "Deploy without building (skips the prompt)");
@@ -251192,10 +251603,10 @@ function toPascalCase(name) {
251192
251603
  return name.split(/[-_\s]+/).map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join("");
251193
251604
  }
251194
251605
  // src/core/types/update-project.ts
251195
- import { join as join30 } from "node:path";
251606
+ import { join as join33 } from "node:path";
251196
251607
  var TYPES_INCLUDE_PATH = `${PROJECT_SUBDIR}/${TYPES_OUTPUT_SUBDIR}/*.d.ts`;
251197
251608
  async function updateProjectConfig(projectRoot) {
251198
- const tsconfigPath = join30(projectRoot, "tsconfig.json");
251609
+ const tsconfigPath = join33(projectRoot, "tsconfig.json");
251199
251610
  if (!await pathExists(tsconfigPath)) {
251200
251611
  return false;
251201
251612
  }
@@ -251244,6 +251655,59 @@ function getTypesCommand() {
251244
251655
  return new Command2("types").description("Manage TypeScript type generation").addCommand(getTypesGenerateCommand());
251245
251656
  }
251246
251657
 
251658
+ // src/cli/commands/versions/create.ts
251659
+ async function createAction2(ctx, options) {
251660
+ const { runTask, jsonMode } = ctx;
251661
+ const target = await resolveBuildTarget(requireApp(ctx).projectRoot, {
251662
+ outputDir: options.outputDir
251663
+ });
251664
+ const gitHash = await resolveProvenanceCommit(target.root, options.gitHash);
251665
+ const version = await runTask("Creating version...", async (updateMessage) => await createVersion(await collectArtifacts(target), {
251666
+ sourceCommit: gitHash,
251667
+ concurrency: options.concurrency,
251668
+ progress: {
251669
+ onDeclared: ({ fileCount }) => updateMessage(`Uploading ${fileCount} files`),
251670
+ onUpload: ({ uploadedFiles, totalFiles }) => updateMessage(`Uploaded ${uploadedFiles} of ${totalFiles} files`)
251671
+ }
251672
+ }), {
251673
+ successMessage: "Version created",
251674
+ errorMessage: "Create version failed"
251675
+ });
251676
+ return {
251677
+ outroMessage: `Version ${version.versionId} (${version.manifestHash})`,
251678
+ stdout: jsonMode ? `${JSON.stringify(version, null, 2)}
251679
+ ` : undefined
251680
+ };
251681
+ }
251682
+ function getVersionCreateCommand() {
251683
+ return new Base44Command("create").description("Record the built output as a version, without deploying it").addOption(outputDirOption()).addOption(gitHashOption()).addOption(concurrencyOption()).action(createAction2);
251684
+ }
251685
+
251686
+ // src/cli/commands/versions/deploy.ts
251687
+ import { randomUUID as randomUUID5 } from "node:crypto";
251688
+ async function deployAction3({ runTask, jsonMode }, versionId, options) {
251689
+ const environment = options.target ?? DEFAULT_ENVIRONMENT;
251690
+ const result = await runTask(`Pointing ${environment} at ${versionId}...`, async () => await setEnvironmentVersion(environment, versionId, {
251691
+ idempotencyKey: randomUUID5()
251692
+ }), {
251693
+ successMessage: "Environment updated",
251694
+ errorMessage: "Could not update the environment"
251695
+ });
251696
+ return {
251697
+ outroMessage: `${result.name} now serves ${result.versionId}`,
251698
+ stdout: jsonMode ? `${JSON.stringify(result, null, 2)}
251699
+ ` : undefined
251700
+ };
251701
+ }
251702
+ function getVersionDeployCommand() {
251703
+ return new Base44Command("deploy").description("Point an environment at an already-recorded version (also the rollback)").argument("<version-id>", "The version to serve").addOption(targetOption()).action(deployAction3);
251704
+ }
251705
+
251706
+ // src/cli/commands/versions/index.ts
251707
+ function getVersionsCommand() {
251708
+ return new Command2("versions").description("Record app versions and serve them").addCommand(getVersionCreateCommand()).addCommand(getVersionDeployCommand());
251709
+ }
251710
+
251247
251711
  // src/core/resources/workflow/schema.ts
251248
251712
  var WorkflowRunStatusSchema = _enum([
251249
251713
  "running",
@@ -251660,7 +252124,7 @@ function createDevLogger(label, labelColor = theme.styles.dim) {
251660
252124
  // src/cli/dev/dev-server/main.ts
251661
252125
  var import_cors = __toESM(require_lib4(), 1);
251662
252126
  var import_express6 = __toESM(require_express(), 1);
251663
- import { dirname as dirname26, join as join36 } from "node:path";
252127
+ import { dirname as dirname27, join as join38 } from "node:path";
251664
252128
 
251665
252129
  // ../../node_modules/get-port/index.js
251666
252130
  import net from "node:net";
@@ -251790,7 +252254,7 @@ var $tmpName = promisify11(tmp.tmpName);
251790
252254
 
251791
252255
  // src/cli/dev/dev-server/function-manager.ts
251792
252256
  import { spawn as spawn2 } from "node:child_process";
251793
- import { dirname as dirname23, join as join31 } from "node:path";
252257
+ import { dirname as dirname24, join as join34 } from "node:path";
251794
252258
  import { pathToFileURL } from "node:url";
251795
252259
 
251796
252260
  // src/cli/dev/dev-server/base-function-manager.ts
@@ -251895,7 +252359,7 @@ class FunctionManager extends BaseFunctionManager {
251895
252359
  }
251896
252360
  spawnFunction(func, port) {
251897
252361
  this.logger.log(`Spawning function "${func.name}" on port ${port}`);
251898
- const importMapPath = join31(dirname23(this.wrapperPath), "import-map.json");
252362
+ const importMapPath = join34(dirname24(this.wrapperPath), "import-map.json");
251899
252363
  const process2 = spawn2("deno", ["run", "--allow-all", "--import-map", importMapPath, this.wrapperPath], {
251900
252364
  env: {
251901
252365
  ...globalThis.process.env,
@@ -251969,7 +252433,7 @@ class FunctionManager extends BaseFunctionManager {
251969
252433
  import { mkdirSync as mkdirSync2, writeFileSync as writeFileSync2 } from "node:fs";
251970
252434
  import { isBuiltin } from "node:module";
251971
252435
  import { homedir as homedir3 } from "node:os";
251972
- import { join as join33 } from "node:path";
252436
+ import { join as join35 } from "node:path";
251973
252437
  import { pathToFileURL as pathToFileURL6 } from "node:url";
251974
252438
  var depsPromise;
251975
252439
  function loadDeps() {
@@ -252090,9 +252554,9 @@ export default {
252090
252554
  };
252091
252555
  `;
252092
252556
  function ensureBundlerConfig() {
252093
- const dir = join33(homedir3(), ".base44", "function-bundler");
252557
+ const dir = join35(homedir3(), ".base44", "function-bundler");
252094
252558
  mkdirSync2(dir, { recursive: true });
252095
- const configPath = join33(dir, "deno.json");
252559
+ const configPath = join35(dir, "deno.json");
252096
252560
  writeFileSync2(configPath, `${JSON.stringify({ nodeModulesDir: "auto" }, null, 2)}
252097
252561
  `);
252098
252562
  return configPath;
@@ -253473,11 +253937,11 @@ async function createEntityRoutes(db, logger, broadcast) {
253473
253937
  // src/cli/dev/dev-server/routes/integrations.ts
253474
253938
  var import_express5 = __toESM(require_express(), 1);
253475
253939
  var import_multer = __toESM(require_multer(), 1);
253476
- import { createHash as createHash2, randomUUID as randomUUID4 } from "node:crypto";
253940
+ import { createHash as createHash3, randomUUID as randomUUID6 } from "node:crypto";
253477
253941
  import fs28 from "node:fs";
253478
253942
  import path18 from "node:path";
253479
253943
  function createFileToken(fileUri) {
253480
- return createHash2("sha256").update(fileUri).digest("hex");
253944
+ return createHash3("sha256").update(fileUri).digest("hex");
253481
253945
  }
253482
253946
  function createIntegrationRoutes(mediaFilesDir, baseUrl, remoteProxy, logger) {
253483
253947
  const router = import_express5.Router({ mergeParams: true });
@@ -253490,14 +253954,14 @@ function createIntegrationRoutes(mediaFilesDir, baseUrl, remoteProxy, logger) {
253490
253954
  destination: mediaFilesDir,
253491
253955
  filename: (_req, file, cb) => {
253492
253956
  const ext = path18.extname(file.originalname);
253493
- cb(null, `${randomUUID4()}${ext}`);
253957
+ cb(null, `${randomUUID6()}${ext}`);
253494
253958
  }
253495
253959
  });
253496
253960
  const privateStorage = import_multer.default.diskStorage({
253497
253961
  destination: privateFilesDir,
253498
253962
  filename: (_req, file, cb) => {
253499
253963
  const ext = path18.extname(file.originalname);
253500
- cb(null, `${randomUUID4()}${ext}`);
253964
+ cb(null, `${randomUUID6()}${ext}`);
253501
253965
  }
253502
253966
  });
253503
253967
  const upload = import_multer.default({ storage, limits: { fileSize: MAX_FILE_SIZE } });
@@ -255359,8 +255823,8 @@ async function createDevServer(options) {
255359
255823
  broadcastEntityEvent(io, appId, entityName, event);
255360
255824
  };
255361
255825
  const base44ConfigWatcher = new WatchBase44({
255362
- functions: join36(dirname26(project.configPath), project.functionsDir),
255363
- entities: join36(dirname26(project.configPath), project.entitiesDir)
255826
+ functions: join38(dirname27(project.configPath), project.functionsDir),
255827
+ entities: join38(dirname27(project.configPath), project.entitiesDir)
255364
255828
  }, devLogger);
255365
255829
  base44ConfigWatcher.on("change", async (name) => {
255366
255830
  try {
@@ -255757,7 +256221,7 @@ Examples:
255757
256221
  }
255758
256222
 
255759
256223
  // src/cli/commands/project/eject.ts
255760
- import { resolve as resolve17 } from "node:path";
256224
+ import { resolve as resolve19 } from "node:path";
255761
256225
  var import_kebabCase2 = __toESM(require_kebabCase(), 1);
255762
256226
  async function eject(ctx, options, command) {
255763
256227
  const { log, runTask, isNonInteractive } = ctx;
@@ -255821,7 +256285,7 @@ async function eject(ctx, options, command) {
255821
256285
  Ne("Operation cancelled.");
255822
256286
  throw new CLIExitError(0);
255823
256287
  }
255824
- const resolvedPath = resolve17(selectedPath);
256288
+ const resolvedPath = resolve19(selectedPath);
255825
256289
  await runTask("Downloading your project's code...", async (updateMessage) => {
255826
256290
  await createProjectFilesForExistingProject({
255827
256291
  projectId,
@@ -255910,6 +256374,10 @@ function createProgram(context) {
255910
256374
  program.addCommand(getBranchesCommand());
255911
256375
  program.addCommand(getAuthCommand());
255912
256376
  program.addCommand(getSiteCommand());
256377
+ if (versionsApiEnabled()) {
256378
+ program.addCommand(getPublishCommand());
256379
+ program.addCommand(getVersionsCommand());
256380
+ }
255913
256381
  program.addCommand(getTypesCommand());
255914
256382
  program.addCommand(getExecCommand());
255915
256383
  program.addCommand(getDevCommand());
@@ -255922,7 +256390,7 @@ var import_detect_agent = __toESM(require_dist5(), 1);
255922
256390
  import { release, type } from "node:os";
255923
256391
 
255924
256392
  // ../../node_modules/posthog-node/dist/extensions/error-tracking/modifiers/module.node.mjs
255925
- import { dirname as dirname27, posix, sep as sep2 } from "path";
256393
+ import { dirname as dirname28, posix, sep as sep2 } from "path";
255926
256394
  function createModulerModifier() {
255927
256395
  const getModuleFromFileName = createGetModuleFromFilename();
255928
256396
  return async (frames) => {
@@ -255931,7 +256399,7 @@ function createModulerModifier() {
255931
256399
  return frames;
255932
256400
  };
255933
256401
  }
255934
- function createGetModuleFromFilename(basePath = process.argv[1] ? dirname27(process.argv[1]) : process.cwd(), isWindows = sep2 === "\\") {
256402
+ function createGetModuleFromFilename(basePath = process.argv[1] ? dirname28(process.argv[1]) : process.cwd(), isWindows = sep2 === "\\") {
255935
256403
  const normalizedBase = isWindows ? normalizeWindowsPath2(basePath) : basePath;
255936
256404
  return (filename) => {
255937
256405
  if (!filename)
@@ -259920,9 +260388,9 @@ function addCommandInfoToErrorReporter(program, errorReporter) {
259920
260388
  });
259921
260389
  }
259922
260390
  // src/cli/index.ts
259923
- var __dirname4 = dirname28(fileURLToPath6(import.meta.url));
260391
+ var __dirname4 = dirname29(fileURLToPath6(import.meta.url));
259924
260392
  async function runCLI(options) {
259925
- ensureNpmAssets(join37(__dirname4, "../assets"));
260393
+ ensureNpmAssets(join39(__dirname4, "../assets"));
259926
260394
  const errorReporter = new ErrorReporter;
259927
260395
  errorReporter.registerProcessErrorHandlers();
259928
260396
  const jsonMode = process.argv.includes("--json");
@@ -259961,4 +260429,4 @@ export {
259961
260429
  runCLI
259962
260430
  };
259963
260431
 
259964
- //# debugId=63C1B06EC5E5944F64756E2164756E21
260432
+ //# debugId=53FA3E8A10325F7E64756E2164756E21