@akanjs/cli 2.1.1 → 2.1.2-rc.1

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.
@@ -205,11 +205,13 @@ class HttpClient {
205
205
  class CloudApi {
206
206
  #api;
207
207
  #accessToken = null;
208
- static async fromHost(host) {
208
+ #workspace;
209
+ static async fromHost(workspace, host) {
209
210
  const hostConfig = await GlobalConfig.getHostConfig(host);
210
- return new CloudApi(hostConfig);
211
+ return new CloudApi(workspace, hostConfig);
211
212
  }
212
- constructor(hostConfig) {
213
+ constructor(workspace, hostConfig) {
214
+ this.#workspace = workspace;
213
215
  const host = akanCloudHost;
214
216
  this.#api = new HttpClient(`${host}/api`);
215
217
  this.#accessToken = hostConfig.auth?.accessToken ?? null;
@@ -225,16 +227,18 @@ class CloudApi {
225
227
  const data = await this.#api.post(`/uploadEnv/${devProjectId}`, formData);
226
228
  return data;
227
229
  }
228
- async downloadEnv(devProjectId, localPath) {
230
+ async downloadEnv(devProjectId) {
231
+ const localPath = `${this.#workspace.workspaceRoot}/local/env.tar`;
229
232
  await this.#api.getFile(`/downloadEnv/${devProjectId}`, localPath);
233
+ return localPath;
230
234
  }
231
235
  async getRemoteAuthToken(remoteId) {
232
236
  try {
233
237
  if (this.#accessToken) {
234
238
  if (GlobalConfig.needRefreshToken(this.#accessToken))
235
- return await this.refreshAuthToken();
239
+ return await this.#refreshAuthToken();
236
240
  else
237
- return await this.refreshAuthToken();
241
+ return await this.#refreshAuthToken();
238
242
  }
239
243
  const accessToken = await this.#api.get(`/getRemoteAuthToken/${remoteId}`);
240
244
  this.#accessToken = GlobalConfig.toAccessToken(accessToken);
@@ -246,10 +250,14 @@ class CloudApi {
246
250
  return null;
247
251
  }
248
252
  }
249
- async refreshAuthToken() {
250
- const response = await this.#api.post(`/refreshRemoteAuthToken`, {
251
- refreshToken: this.#accessToken?.refreshToken
252
- });
253
+ async#refreshAuthToken() {
254
+ const refreshToken = this.#accessToken?.refreshToken;
255
+ if (!refreshToken)
256
+ throw new Error("No refresh token");
257
+ return await this.refreshAuthToken(refreshToken);
258
+ }
259
+ async refreshAuthToken(refreshToken) {
260
+ const response = await this.#api.post(`/refreshRemoteAuthToken`, { refreshToken });
253
261
  this.#accessToken = GlobalConfig.toAccessToken(response);
254
262
  this.#api.setHeaders({ Authorization: `Bearer ${this.#accessToken.jwt}` });
255
263
  return this.#accessToken;
@@ -652,12 +660,7 @@ import {
652
660
  spawn as spawn2
653
661
  } from "child_process";
654
662
  import { readFileSync as readFileSync3 } from "fs";
655
- import {
656
- copyFile,
657
- mkdir as mkdir2,
658
- readdir as readDirEntries,
659
- stat as stat2
660
- } from "fs/promises";
663
+ import { copyFile, mkdir as mkdir2, readdir as readDirEntries, stat as stat2 } from "fs/promises";
661
664
  import path7 from "path";
662
665
  import {
663
666
  capitalize,
@@ -709,8 +712,18 @@ var DEFAULT_OPTIMIZE_IMPORTS = [
709
712
  "mui-core",
710
713
  "react-icons/*"
711
714
  ];
712
- var WORKSPACE_BARREL_FACETS = ["ui", "webkit", "common", "client", "server"];
713
- var SSR_RUNTIME_PACKAGES = ["react", "react-dom", "react-server-dom-webpack"];
715
+ var WORKSPACE_BARREL_FACETS = [
716
+ "ui",
717
+ "webkit",
718
+ "common",
719
+ "client",
720
+ "server"
721
+ ];
722
+ var SSR_RUNTIME_PACKAGES = [
723
+ "react",
724
+ "react-dom",
725
+ "react-server-dom-webpack"
726
+ ];
714
727
  var NATIVE_RUNTIME_PACKAGES = ["sharp"];
715
728
  var DEFAULT_BACKEND_RUNTIME_PACKAGES = ["croner"];
716
729
  var DATABASE_MODE_RUNTIME_PACKAGES = {
@@ -770,7 +783,12 @@ class AkanAppConfig {
770
783
  ...libs.flatMap((lib) => WORKSPACE_BARREL_FACETS.map((facet) => `@libs/${lib}/${facet}`)),
771
784
  ...config?.barrelImports ?? []
772
785
  ];
773
- this.optimizeImports = [...new Set([...DEFAULT_OPTIMIZE_IMPORTS, ...config?.optimizeImports ?? []])];
786
+ this.optimizeImports = [
787
+ ...new Set([
788
+ ...DEFAULT_OPTIMIZE_IMPORTS,
789
+ ...config?.optimizeImports ?? []
790
+ ])
791
+ ];
774
792
  this.images = mergeImageConfig(config?.images);
775
793
  this.i18n = resolveAkanI18nConfig(config?.i18n);
776
794
  process.env.AKAN_PUBLIC_DEFAULT_LOCALE = this.i18n.defaultLocale;
@@ -881,7 +899,13 @@ class AkanAppConfig {
881
899
  }
882
900
  #makeDockerContent(docker) {
883
901
  if (docker.content)
884
- return { content: docker.content, image: {}, preRuns: [], postRuns: [], command: [] };
902
+ return {
903
+ content: docker.content,
904
+ image: {},
905
+ preRuns: [],
906
+ postRuns: [],
907
+ command: []
908
+ };
885
909
  const preRunScripts = this.#getDockerRunScripts(docker.preRuns ?? []);
886
910
  const postRunScripts = this.#getDockerRunScripts(docker.postRuns ?? []);
887
911
  const imageScript = docker.image ? this.#getDockerImageScript(docker.image, "oven/bun:1-slim") : "FROM oven/bun:1-slim";
@@ -912,7 +936,13 @@ ENV AKAN_PUBLIC_LOCALES=${this.i18n.locales.join(",")}
912
936
  ENV AKAN_PUBLIC_OPERATION_MODE=cloud
913
937
 
914
938
  CMD [${command.map((c) => `"${c}"`).join(",")}]`;
915
- return { content, image: imageScript, preRuns: docker.preRuns ?? [], postRuns: docker.postRuns ?? [], command };
939
+ return {
940
+ content,
941
+ image: imageScript,
942
+ preRuns: docker.preRuns ?? [],
943
+ postRuns: docker.postRuns ?? [],
944
+ command
945
+ };
916
946
  }
917
947
  static async from(app) {
918
948
  const [configImp, baseDevEnv, libs, rootPackageJson] = await Promise.all([
@@ -938,9 +968,24 @@ CMD [${command.map((c) => `"${c}"`).join(",")}]`;
938
968
  ...SSR_RUNTIME_PACKAGES,
939
969
  ...NATIVE_RUNTIME_PACKAGES,
940
970
  ...DEFAULT_BACKEND_RUNTIME_PACKAGES,
941
- ...DATABASE_MODE_RUNTIME_PACKAGES[this.defaultDatabaseMode]
971
+ ...this.getDatabaseModeRuntimePackages()
942
972
  ];
943
973
  }
974
+ getDatabaseModeRuntimePackages(databaseMode = this.defaultDatabaseMode) {
975
+ return [...DATABASE_MODE_RUNTIME_PACKAGES[databaseMode]];
976
+ }
977
+ getMissingDatabaseModeDependencySpecs(databaseMode = this.defaultDatabaseMode) {
978
+ const rootDependencies = {
979
+ ...this.rootPackageJson.dependencies,
980
+ ...this.rootPackageJson.devDependencies
981
+ };
982
+ return this.getDatabaseModeRuntimePackages(databaseMode).filter((lib) => !rootDependencies[lib]).map((lib) => {
983
+ const version = this.#resolveProductionDependencyVersion(lib);
984
+ if (!version)
985
+ throw new Error(`Dependency ${lib} not found in package.json`);
986
+ return `${lib}@${version}`;
987
+ });
988
+ }
944
989
  getProductionPackageJson(data = {}) {
945
990
  return {
946
991
  name: this.app.name,
@@ -976,7 +1021,12 @@ function getAkanPackageJson() {
976
1021
  return akanPackageJson;
977
1022
  } catch {}
978
1023
  }
979
- akanPackageJson = { name: "akanjs", version: "0.0.0", description: "akanjs", dependencies: {} };
1024
+ akanPackageJson = {
1025
+ name: "akanjs",
1026
+ version: "0.0.0",
1027
+ description: "akanjs",
1028
+ dependencies: {}
1029
+ };
980
1030
  return akanPackageJson;
981
1031
  }
982
1032
  function mergeImageConfig(config = {}) {
@@ -1000,7 +1050,9 @@ class AkanLibConfig {
1000
1050
  this.externalLibs = config?.externalLibs ?? [];
1001
1051
  }
1002
1052
  static async from(lib) {
1003
- const [configImp] = await Promise.all([import(`${lib.cwdPath}/akan.config.ts`).then((mod) => mod.default)]);
1053
+ const [configImp] = await Promise.all([
1054
+ import(`${lib.cwdPath}/akan.config.ts`).then((mod) => mod.default)
1055
+ ]);
1004
1056
  const config = typeof configImp === "function" ? configImp(lib) : configImp;
1005
1057
  return new AkanLibConfig(lib, config);
1006
1058
  }
@@ -2374,13 +2426,8 @@ class CommandExecutionError extends Error {
2374
2426
  const displayCommand = formatCommandForDisplay(command, args);
2375
2427
  const status = signal ? `signal: ${signal}` : `exit code: ${code ?? "unknown"}`;
2376
2428
  const output = (stderr || stdout).trim();
2377
- super([
2378
- `Command failed: ${displayCommand}`,
2379
- `cwd: ${cwd}`,
2380
- status,
2381
- output ? `
2382
- ${output}` : ""
2383
- ].join(`
2429
+ super([`Command failed: ${displayCommand}`, `cwd: ${cwd}`, status, output ? `
2430
+ ${output}` : ""].join(`
2384
2431
  `), {
2385
2432
  cause
2386
2433
  });
@@ -2429,13 +2476,7 @@ var parseEnvFile = (envPath) => {
2429
2476
  }
2430
2477
  return env;
2431
2478
  };
2432
- var PAGE_ROUTE_EXPORTS = new Set([
2433
- "default",
2434
- "pageConfig",
2435
- "head",
2436
- "generateHead",
2437
- "Loading"
2438
- ]);
2479
+ var PAGE_ROUTE_EXPORTS = new Set(["default", "pageConfig", "head", "generateHead", "Loading"]);
2439
2480
  var ROOT_LAYOUT_EXPORTS = new Set([
2440
2481
  "default",
2441
2482
  "head",
@@ -2446,14 +2487,11 @@ var ROOT_LAYOUT_EXPORTS = new Set([
2446
2487
  "reconnect",
2447
2488
  "layoutStyle",
2448
2489
  "gaTrackingId",
2449
- "Loading"
2450
- ]);
2451
- var LAYOUT_ROUTE_EXPORTS = new Set([
2452
- "default",
2453
- "head",
2454
- "generateHead",
2455
- "Loading"
2490
+ "Loading",
2491
+ "NotFound",
2492
+ "Error"
2456
2493
  ]);
2494
+ var LAYOUT_ROUTE_EXPORTS = new Set(["default", "head", "generateHead", "Loading", "NotFound", "Error"]);
2457
2495
  function validateRouteSourceExports(source, filePath, kind, options = {}) {
2458
2496
  const sourceFile = ts3.createSourceFile(filePath, source, ts3.ScriptTarget.Latest, true, ts3.ScriptKind.TSX);
2459
2497
  const allowed = kind === "page" ? PAGE_ROUTE_EXPORTS : options.rootLayout ? ROOT_LAYOUT_EXPORTS : LAYOUT_ROUTE_EXPORTS;
@@ -2800,11 +2838,7 @@ class Executor {
2800
2838
  this.logger.debug(msg);
2801
2839
  return this;
2802
2840
  }
2803
- spinning(msg, {
2804
- prefix = `${this.emoji}${this.name}`,
2805
- indent = 0,
2806
- enableSpin = !Executor.verbose
2807
- } = {}) {
2841
+ spinning(msg, { prefix = `${this.emoji}${this.name}`, indent = 0, enableSpin = !Executor.verbose } = {}) {
2808
2842
  return new Spinner(msg, { prefix, indent, enableSpin }).start();
2809
2843
  }
2810
2844
  #tsconfig = null;
@@ -2833,9 +2867,7 @@ class Executor {
2833
2867
  this.#tsconfig = tsconfig;
2834
2868
  }
2835
2869
  #packageJson = null;
2836
- async getPackageJson({
2837
- refresh
2838
- } = {}) {
2870
+ async getPackageJson({ refresh } = {}) {
2839
2871
  if (this.#packageJson && !refresh)
2840
2872
  return this.#packageJson;
2841
2873
  const packageJson = await this.readJson("package.json");
@@ -2951,10 +2983,7 @@ class Executor {
2951
2983
  async applyTemplate(options) {
2952
2984
  const dict = {
2953
2985
  ...options.dict ?? {},
2954
- ...Object.fromEntries(Object.entries(options.dict ?? {}).map(([key, value]) => [
2955
- capitalize(key),
2956
- capitalize(value)
2957
- ]))
2986
+ ...Object.fromEntries(Object.entries(options.dict ?? {}).map(([key, value]) => [capitalize(key), capitalize(value)]))
2958
2987
  };
2959
2988
  return this._applyTemplate({ ...options, dict });
2960
2989
  }
@@ -3090,10 +3119,7 @@ class WorkspaceExecutor extends Executor {
3090
3119
  return await this.#getDirHasFile(`${this.workspaceRoot}/libs`, "akan.config.ts");
3091
3120
  }
3092
3121
  async getSyss() {
3093
- const [appNames, libNames] = await Promise.all([
3094
- this.getApps(),
3095
- this.getLibs()
3096
- ]);
3122
+ const [appNames, libNames] = await Promise.all([this.getApps(), this.getLibs()]);
3097
3123
  return [appNames, libNames];
3098
3124
  }
3099
3125
  async getPkgs() {
@@ -3102,11 +3128,7 @@ class WorkspaceExecutor extends Executor {
3102
3128
  return await this.#getDirHasFile(`${this.workspaceRoot}/pkgs`, "package.json");
3103
3129
  }
3104
3130
  async getExecs() {
3105
- const [appNames, libNames, pkgNames] = await Promise.all([
3106
- this.getApps(),
3107
- this.getLibs(),
3108
- this.getPkgs()
3109
- ]);
3131
+ const [appNames, libNames, pkgNames] = await Promise.all([this.getApps(), this.getLibs(), this.getPkgs()]);
3110
3132
  return [appNames, libNames, pkgNames];
3111
3133
  }
3112
3134
  async setPkgTsPaths(name) {
@@ -3124,10 +3146,7 @@ class WorkspaceExecutor extends Executor {
3124
3146
  async unsetPkgTsPaths(name) {
3125
3147
  const rootTsConfig = await this.readJson("tsconfig.json");
3126
3148
  const filteredKeys = Object.keys(rootTsConfig.compilerOptions.paths ?? {}).filter((key) => key !== name && key !== `${name}/*`);
3127
- rootTsConfig.compilerOptions.paths = Object.fromEntries(filteredKeys.map((key) => [
3128
- key,
3129
- rootTsConfig.compilerOptions.paths?.[key] ?? []
3130
- ]));
3149
+ rootTsConfig.compilerOptions.paths = Object.fromEntries(filteredKeys.map((key) => [key, rootTsConfig.compilerOptions.paths?.[key] ?? []]));
3131
3150
  if (rootTsConfig.references) {
3132
3151
  rootTsConfig.references = rootTsConfig.references.filter((ref) => ref.path !== `./pkgs/${name}/tsconfig.json`);
3133
3152
  }
@@ -3219,11 +3238,7 @@ class SysExecutor extends Executor {
3219
3238
  name;
3220
3239
  type;
3221
3240
  emoji;
3222
- constructor({
3223
- workspace = WorkspaceExecutor.fromRoot(),
3224
- name,
3225
- type
3226
- }) {
3241
+ constructor({ workspace = WorkspaceExecutor.fromRoot(), name, type }) {
3227
3242
  super(name, `${workspace.workspaceRoot}/${type}s/${name}`);
3228
3243
  this.workspace = workspace;
3229
3244
  this.name = name;
@@ -3326,10 +3341,7 @@ class SysExecutor extends Executor {
3326
3341
  },
3327
3342
  devDependencies: {
3328
3343
  ...Object.fromEntries(Object.entries(libPackageJson.devDependencies ?? {}).filter(([dep]) => !dependencySet.has(dep))),
3329
- ...Object.fromEntries(devDependencies.filter((dep) => rootPackageJson.dependencies?.[dep] || rootPackageJson.devDependencies?.[dep]).sort().map((dep) => [
3330
- dep,
3331
- rootPackageJson.devDependencies?.[dep] ?? rootPackageJson.dependencies?.[dep]
3332
- ]))
3344
+ ...Object.fromEntries(devDependencies.filter((dep) => rootPackageJson.dependencies?.[dep] || rootPackageJson.devDependencies?.[dep]).sort().map((dep) => [dep, rootPackageJson.devDependencies?.[dep] ?? rootPackageJson.dependencies?.[dep]]))
3333
3345
  }
3334
3346
  };
3335
3347
  await this.setPackageJson(libPkgJsonWithDeps);
@@ -3396,11 +3408,7 @@ class SysExecutor extends Executor {
3396
3408
  ...await LibExecutor.from(this, lib).getConstantFiles(),
3397
3409
  ...await LibExecutor.from(this, lib).getScalarConstantFiles()
3398
3410
  ]));
3399
- return [
3400
- ...sysContantFiles,
3401
- ...sysScalarConstantFiles,
3402
- ...libConstantFiles.flat()
3403
- ];
3411
+ return [...sysContantFiles, ...sysScalarConstantFiles, ...libConstantFiles.flat()];
3404
3412
  }
3405
3413
  async getDictionaryFiles() {
3406
3414
  const modules = await this.getModules();
@@ -3409,10 +3417,7 @@ class SysExecutor extends Executor {
3409
3417
  async applyTemplate(options) {
3410
3418
  const dict = {
3411
3419
  ...options.dict ?? {},
3412
- ...Object.fromEntries(Object.entries(options.dict ?? {}).map(([key, value]) => [
3413
- capitalize(key),
3414
- capitalize(value)
3415
- ]))
3420
+ ...Object.fromEntries(Object.entries(options.dict ?? {}).map(([key, value]) => [capitalize(key), capitalize(value)]))
3416
3421
  };
3417
3422
  const scanInfo = await this.scan();
3418
3423
  const fileContents = await this._applyTemplate({
@@ -3445,6 +3450,13 @@ class AppExecutor extends SysExecutor {
3445
3450
  getEnv() {
3446
3451
  return WorkspaceExecutor.getBaseDevEnv().env;
3447
3452
  }
3453
+ async getDevPort() {
3454
+ const basePort = 8282;
3455
+ const appNames = (await this.workspace.getApps()).sort((a, b) => a.localeCompare(b));
3456
+ const appIndex = Math.max(appNames.indexOf(this.name), 0);
3457
+ const portOffset = WorkspaceExecutor.getBaseDevEnv().portOffset;
3458
+ return basePort + appIndex + portOffset;
3459
+ }
3448
3460
  getCommandEnv(env = {}) {
3449
3461
  const basePort = 8282;
3450
3462
  const portOffset = WorkspaceExecutor.getBaseDevEnv().portOffset;
@@ -3471,17 +3483,19 @@ class AppExecutor extends SysExecutor {
3471
3483
  if (type === "build") {
3472
3484
  if (await this.exists(this.dist.cwdPath))
3473
3485
  await this.dist.exec(`rm -rf ${this.dist.cwdPath}`);
3474
- await Promise.all([
3475
- this.dist.mkdir("private"),
3476
- this.dist.mkdir("public")
3477
- ]);
3486
+ await Promise.all([this.dist.mkdir("private"), this.dist.mkdir("public")]);
3478
3487
  await Promise.all([
3479
3488
  this.cp("private", `${this.dist.cwdPath}/private`),
3480
3489
  this.cp("public", `${this.dist.cwdPath}/public`)
3481
3490
  ]);
3482
3491
  } else
3483
3492
  await this.removeDir(".akan");
3484
- const env = this.getCommandEnv({ AKAN_COMMAND_TYPE: type, ...routeEnv });
3493
+ const devPort = type === "start" ? (await this.getDevPort()).toString() : undefined;
3494
+ const env = this.getCommandEnv({
3495
+ AKAN_COMMAND_TYPE: type,
3496
+ ...routeEnv,
3497
+ ...devPort ? { PORT: devPort, AKAN_PUBLIC_CLIENT_PORT: devPort, AKAN_PUBLIC_SERVER_PORT: devPort } : {}
3498
+ });
3485
3499
  return { env };
3486
3500
  }
3487
3501
  #publicEnv = null;
@@ -3517,9 +3531,7 @@ class AppExecutor extends SysExecutor {
3517
3531
  return this.#akanConfig;
3518
3532
  }
3519
3533
  #pageKeys = null;
3520
- async getPageKeys({
3521
- refresh
3522
- } = {}) {
3534
+ async getPageKeys({ refresh } = {}) {
3523
3535
  if (this.#pageKeys && !refresh)
3524
3536
  return this.#pageKeys;
3525
3537
  const akanConfig2 = await this.getConfig();
@@ -3568,10 +3580,7 @@ class AppExecutor extends SysExecutor {
3568
3580
  const projectAssetsPath = `${this.cwdPath}/private`;
3569
3581
  const projectPublicLibPath = `${projectPublicPath}/libs`;
3570
3582
  const projectAssetsLibPath = `${projectAssetsPath}/libs`;
3571
- await Promise.all([
3572
- this.removeDir(projectPublicLibPath),
3573
- this.removeDir(projectAssetsLibPath)
3574
- ]);
3583
+ await Promise.all([this.removeDir(projectPublicLibPath), this.removeDir(projectAssetsLibPath)]);
3575
3584
  const targetPublicDeps = [];
3576
3585
  for (const dep of libDeps) {
3577
3586
  if (await this.exists(`${this.workspace.workspaceRoot}/libs/${dep}/public`))
@@ -3589,10 +3598,7 @@ class AppExecutor extends SysExecutor {
3589
3598
  ...targetAssetsDeps.map((dep) => this.cp(`${this.workspace.workspaceRoot}/libs/${dep}/private`, `${projectAssetsLibPath}/${dep}`))
3590
3599
  ]);
3591
3600
  }
3592
- async scanSync({
3593
- refresh = false,
3594
- write = true
3595
- } = {}) {
3601
+ async scanSync({ refresh = false, write = true } = {}) {
3596
3602
  const scanInfo = await this.scan({
3597
3603
  refresh,
3598
3604
  write,
@@ -3641,10 +3647,7 @@ class PkgExecutor extends Executor {
3641
3647
  name;
3642
3648
  dist;
3643
3649
  emoji = execEmoji.pkg;
3644
- constructor({
3645
- workspace = WorkspaceExecutor.fromRoot(),
3646
- name
3647
- }) {
3650
+ constructor({ workspace = WorkspaceExecutor.fromRoot(), name }) {
3648
3651
  super(name, `${workspace.workspaceRoot}/pkgs/${name}`);
3649
3652
  this.workspace = workspace;
3650
3653
  this.name = name;
@@ -3708,10 +3711,7 @@ class PkgExecutor extends Executor {
3708
3711
  };
3709
3712
  }
3710
3713
  async updatePackageJsonDependencies(dependencies = [], devDependencies = []) {
3711
- const [rootPackageJson, pkgJson] = await Promise.all([
3712
- this.workspace.getPackageJson(),
3713
- this.getPackageJson()
3714
- ]);
3714
+ const [rootPackageJson, pkgJson] = await Promise.all([this.workspace.getPackageJson(), this.getPackageJson()]);
3715
3715
  const dependencyMaps = await this.#toDependencyMap(rootPackageJson, dependencies, devDependencies);
3716
3716
  const newPkgJson = {
3717
3717
  ...pkgJson,
@@ -3721,10 +3721,7 @@ class PkgExecutor extends Executor {
3721
3721
  return newPkgJson;
3722
3722
  }
3723
3723
  async generateDistPackageJson(dependencies = [], devDependencies = []) {
3724
- const [rootPackageJson, pkgJson] = await Promise.all([
3725
- this.workspace.getPackageJson(),
3726
- this.getPackageJson()
3727
- ]);
3724
+ const [rootPackageJson, pkgJson] = await Promise.all([this.workspace.getPackageJson(), this.getPackageJson()]);
3728
3725
  const dependencyMaps = await this.#toDependencyMap(rootPackageJson, dependencies, devDependencies);
3729
3726
  const distPkgJson = {
3730
3727
  ...pkgJson,
@@ -3740,10 +3737,7 @@ class PkgExecutor extends Executor {
3740
3737
  engines: { bun: ">=1.3.13" },
3741
3738
  ...dependencyMaps
3742
3739
  };
3743
- await Promise.all([
3744
- this.dist.writeJson("package.json", distPkgJson),
3745
- this.writeJson("package.json", distPkgJson)
3746
- ]);
3740
+ await Promise.all([this.dist.writeJson("package.json", distPkgJson), this.writeJson("package.json", distPkgJson)]);
3747
3741
  return distPkgJson;
3748
3742
  }
3749
3743
  async build() {
@@ -3756,10 +3750,7 @@ class PkgExecutor extends Executor {
3756
3750
  await this.cp(`${this.cwdPath}/dist`, this.dist.cwdPath);
3757
3751
  }
3758
3752
  async generateTsconfigJson() {
3759
- const [rootTsconfig, pkgTsconfig] = await Promise.all([
3760
- this.workspace.getTsConfig(),
3761
- this.getTsConfig()
3762
- ]);
3753
+ const [rootTsconfig, pkgTsconfig] = await Promise.all([this.workspace.getTsConfig(), this.getTsConfig()]);
3763
3754
  const tsconfig = {
3764
3755
  ...rootTsconfig,
3765
3756
  ...pkgTsconfig,
@@ -4630,6 +4621,9 @@ export async function generateHead(props: PageProps) {
4630
4621
  return inheritedLayout.head;
4631
4622
  }
4632
4623
 
4624
+ export const NotFound = userLayout.NotFound ?? inheritedLayout.NotFound;
4625
+ export const Error = userLayout.Error ?? inheritedLayout.Error;
4626
+
4633
4627
  export default function GeneratedLayout({ children, params, searchParams }: LayoutProps) {
4634
4628
  return (
4635
4629
  <System.Provider
@@ -4659,6 +4653,9 @@ export async function generateHead(props: PageProps) {
4659
4653
  return inheritedLayout.head;
4660
4654
  }
4661
4655
 
4656
+ export const NotFound = userLayout.NotFound ?? inheritedLayout.NotFound;
4657
+ export const Error = userLayout.Error ?? inheritedLayout.Error;
4658
+
4662
4659
  export default function GeneratedLayout({ children, params, searchParams }: LayoutProps) {
4663
4660
  return <UserLayout params={params} searchParams={searchParams}>{children}</UserLayout>;
4664
4661
  }