@akanjs/cli 2.1.1 → 2.1.2-rc.0

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