@akanjs/cli 2.1.0-rc.1 → 2.1.0-rc.3

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/index.js CHANGED
@@ -1959,6 +1959,45 @@ var staticTemplateFileExtensions = new Set([
1959
1959
  ".woff2",
1960
1960
  ".xml"
1961
1961
  ]);
1962
+ var formatCommandArg = (value) => /^[\w@%+=:,./-]+$/.test(value) ? value : JSON.stringify(value);
1963
+ var formatCommandForDisplay = (command, args = []) => [command, ...args].map(formatCommandArg).join(" ");
1964
+
1965
+ class CommandExecutionError extends Error {
1966
+ command;
1967
+ args;
1968
+ cwd;
1969
+ code;
1970
+ signal;
1971
+ stdout;
1972
+ stderr;
1973
+ constructor({
1974
+ command,
1975
+ args = [],
1976
+ cwd,
1977
+ code,
1978
+ signal,
1979
+ stdout = "",
1980
+ stderr = "",
1981
+ cause
1982
+ }) {
1983
+ const displayCommand = formatCommandForDisplay(command, args);
1984
+ const status = signal ? `signal: ${signal}` : `exit code: ${code ?? "unknown"}`;
1985
+ const output = (stderr || stdout).trim();
1986
+ super([`Command failed: ${displayCommand}`, `cwd: ${cwd}`, status, output ? `
1987
+ ${output}` : ""].join(`
1988
+ `), {
1989
+ cause
1990
+ });
1991
+ this.name = "CommandExecutionError";
1992
+ this.command = command;
1993
+ this.args = args;
1994
+ this.cwd = cwd;
1995
+ this.code = code;
1996
+ this.signal = signal;
1997
+ this.stdout = stdout;
1998
+ this.stderr = stderr;
1999
+ }
2000
+ }
1962
2001
  var execEmoji = {
1963
2002
  workspace: "\uD83C\uDFE0",
1964
2003
  app: "\uD83D\uDE80",
@@ -2089,23 +2128,32 @@ class Executor {
2089
2128
  Logger4.raw(chalk4.red(data.toString()));
2090
2129
  }
2091
2130
  exec(command, options = {}) {
2131
+ const cwd = options.cwd?.toString() ?? this.cwdPath;
2092
2132
  const proc = exec(command, { cwd: this.cwdPath, ...options });
2133
+ let stdout = "";
2134
+ let stderr = "";
2093
2135
  proc.stdout?.on("data", (data) => {
2136
+ stdout += data.toString();
2094
2137
  this.#stdout(data);
2095
2138
  });
2096
2139
  proc.stderr?.on("data", (data) => {
2140
+ stderr += data.toString();
2097
2141
  this.#stdout(data);
2098
2142
  });
2099
2143
  return new Promise((resolve, reject) => {
2144
+ proc.on("error", (error) => {
2145
+ reject(new CommandExecutionError({ command, cwd, code: null, signal: null, stdout, stderr, cause: error }));
2146
+ });
2100
2147
  proc.on("exit", (code, signal) => {
2101
2148
  if (!!code || signal)
2102
- reject({ code, signal });
2149
+ reject(new CommandExecutionError({ command, cwd, code, signal, stdout, stderr }));
2103
2150
  else
2104
2151
  resolve({ code, signal });
2105
2152
  });
2106
2153
  });
2107
2154
  }
2108
2155
  spawn(command, args = [], options = {}) {
2156
+ const cwd = options.cwd?.toString() ?? this.cwdPath;
2109
2157
  const proc = spawn(command, args, {
2110
2158
  cwd: this.cwdPath,
2111
2159
  ...options
@@ -2123,9 +2171,12 @@ class Executor {
2123
2171
  this.#stdout(data);
2124
2172
  });
2125
2173
  return new Promise((resolve, reject) => {
2174
+ proc.on("error", (error) => {
2175
+ reject(new CommandExecutionError({ command, args, cwd, code: null, signal: null, stdout, stderr, cause: error }));
2176
+ });
2126
2177
  proc.on("close", (code, signal) => {
2127
2178
  if (code !== 0 || signal)
2128
- reject(stderr || stdout);
2179
+ reject(new CommandExecutionError({ command, args, cwd, code, signal, stdout, stderr }));
2129
2180
  else
2130
2181
  resolve(stdout);
2131
2182
  });
@@ -2139,20 +2190,37 @@ class Executor {
2139
2190
  return proc;
2140
2191
  }
2141
2192
  fork(modulePath, args = [], options = {}) {
2193
+ const cwd = options.cwd?.toString() ?? this.cwdPath;
2142
2194
  const proc = fork(modulePath, args, {
2143
2195
  cwd: this.cwdPath,
2144
2196
  ...options
2145
2197
  });
2198
+ let stdout = "";
2199
+ let stderr = "";
2146
2200
  proc.stdout?.on("data", (data) => {
2201
+ stdout += data.toString();
2147
2202
  this.#stdout(data);
2148
2203
  });
2149
2204
  proc.stderr?.on("data", (data) => {
2205
+ stderr += data.toString();
2150
2206
  this.#stderr(data);
2151
2207
  });
2152
2208
  return new Promise((resolve, reject) => {
2209
+ proc.on("error", (error) => {
2210
+ reject(new CommandExecutionError({
2211
+ command: modulePath,
2212
+ args,
2213
+ cwd,
2214
+ code: null,
2215
+ signal: null,
2216
+ stdout,
2217
+ stderr,
2218
+ cause: error
2219
+ }));
2220
+ });
2153
2221
  proc.on("exit", (code, signal) => {
2154
2222
  if (!!code || signal)
2155
- reject({ code, signal });
2223
+ reject(new CommandExecutionError({ command: modulePath, args, cwd, code, signal, stdout, stderr }));
2156
2224
  else
2157
2225
  resolve({ code, signal });
2158
2226
  });
@@ -3374,6 +3442,7 @@ class IncrementalBuilderHost {
3374
3442
  const candidates = [
3375
3443
  path8.join(app.workspace.workspaceRoot, "pkgs/@akanjs/devkit/incrementalBuilder/incrementalBuilder.proc.ts"),
3376
3444
  path8.join(app.workspace.workspaceRoot, "node_modules/@akanjs/devkit/incrementalBuilder/incrementalBuilder.proc.ts"),
3445
+ path8.join(import.meta.dir, "incrementalBuilder.proc.js"),
3377
3446
  path8.join(import.meta.dir, "incrementalBuilder.proc.ts")
3378
3447
  ];
3379
3448
  for (const c of candidates)
@@ -5793,9 +5862,9 @@ class CssImportResolver {
5793
5862
  }
5794
5863
  async resolve(id, fromBase) {
5795
5864
  for (const resolve of [
5865
+ () => this.#resolveWithTsconfig(id),
5796
5866
  () => this.#resolveWithBun(id, fromBase),
5797
5867
  () => this.#resolveWithRequire(id, fromBase),
5798
- () => this.#resolveWithTsconfig(id),
5799
5868
  () => this.#resolvePackageStyle(id, fromBase)
5800
5869
  ]) {
5801
5870
  const resolved = await resolve();
@@ -5805,20 +5874,24 @@ class CssImportResolver {
5805
5874
  return null;
5806
5875
  }
5807
5876
  #resolveWithBun(id, fromBase) {
5808
- try {
5809
- const resolved = Bun.resolveSync(id, fromBase);
5810
- return CssImportResolver.isCssFile(resolved) ? resolved : null;
5811
- } catch {
5812
- return null;
5877
+ for (const base of this.#resolutionBases(fromBase)) {
5878
+ try {
5879
+ const resolved = Bun.resolveSync(id, base);
5880
+ if (CssImportResolver.isCssFile(resolved))
5881
+ return resolved;
5882
+ } catch {}
5813
5883
  }
5884
+ return null;
5814
5885
  }
5815
5886
  #resolveWithRequire(id, fromBase) {
5816
- try {
5817
- const resolved = __require.resolve(id, { paths: [fromBase] });
5818
- return CssImportResolver.isCssFile(resolved) ? resolved : null;
5819
- } catch {
5820
- return null;
5887
+ for (const base of this.#resolutionBases(fromBase)) {
5888
+ try {
5889
+ const resolved = __require.resolve(id, { paths: [base] });
5890
+ if (CssImportResolver.isCssFile(resolved))
5891
+ return resolved;
5892
+ } catch {}
5821
5893
  }
5894
+ return null;
5822
5895
  }
5823
5896
  async#resolveWithTsconfig(id) {
5824
5897
  const exact = this.#paths[id];
@@ -5846,8 +5919,25 @@ class CssImportResolver {
5846
5919
  const pkgName = CssImportResolver.getPackageName(id);
5847
5920
  if (!pkgName)
5848
5921
  return null;
5922
+ for (const base of this.#resolutionBases(fromBase)) {
5923
+ try {
5924
+ const pkgPath = __require.resolve(`${pkgName}/package.json`, { paths: [base] });
5925
+ const resolved = await this.#resolvePackageStyleFromPackageJson(id, pkgName, pkgPath);
5926
+ if (resolved)
5927
+ return resolved;
5928
+ } catch {}
5929
+ }
5930
+ for (const pkgPath of this.#packageJsonCandidates(pkgName)) {
5931
+ const resolved = await this.#resolvePackageStyleFromPackageJson(id, pkgName, pkgPath);
5932
+ if (resolved)
5933
+ return resolved;
5934
+ }
5935
+ return null;
5936
+ }
5937
+ async#resolvePackageStyleFromPackageJson(id, pkgName, pkgPath) {
5849
5938
  try {
5850
- const pkgPath = __require.resolve(`${pkgName}/package.json`, { paths: [fromBase] });
5939
+ if (!await Bun.file(pkgPath).exists())
5940
+ return null;
5851
5941
  const pkgDir = path22.dirname(pkgPath);
5852
5942
  const pkg = await Bun.file(pkgPath).json();
5853
5943
  const subpath = id === pkgName ? "." : `.${id.slice(pkgName.length)}`;
@@ -5858,6 +5948,22 @@ class CssImportResolver {
5858
5948
  return null;
5859
5949
  }
5860
5950
  }
5951
+ #resolutionBases(fromBase) {
5952
+ return [
5953
+ fromBase,
5954
+ this.#workspaceRoot,
5955
+ path22.dirname(Bun.main),
5956
+ path22.resolve(path22.dirname(Bun.main), "../..")
5957
+ ];
5958
+ }
5959
+ #packageJsonCandidates(pkgName) {
5960
+ return [
5961
+ path22.join(this.#workspaceRoot, "pkgs", pkgName, "package.json"),
5962
+ path22.join(this.#workspaceRoot, "node_modules", pkgName, "package.json"),
5963
+ path22.join(path22.dirname(Bun.main), "node_modules", pkgName, "package.json"),
5964
+ path22.join(path22.dirname(Bun.main), "../../", pkgName, "package.json")
5965
+ ];
5966
+ }
5861
5967
  async#firstExisting(basePath2) {
5862
5968
  for (const suffix of CSS_IMPORT_EXTS) {
5863
5969
  const candidate = `${basePath2}${suffix}`;
@@ -6982,14 +7088,23 @@ class SsrBaseArtifactBuilder {
6982
7088
  async#resolveAkanServerPath() {
6983
7089
  const candidates = [
6984
7090
  path30.join(this.#app.workspace.workspaceRoot, "pkgs/akanjs/server"),
7091
+ path30.join(this.#app.workspace.workspaceRoot, "node_modules/akanjs/server"),
7092
+ path30.join(path30.dirname(Bun.main), "node_modules/akanjs/server"),
7093
+ path30.join(path30.dirname(Bun.main), "../../akanjs/server"),
6985
7094
  path30.resolve(import.meta.dir, "../../server"),
6986
7095
  path30.resolve(import.meta.dir, "../server")
6987
7096
  ];
7097
+ try {
7098
+ candidates.unshift(path30.dirname(Bun.resolveSync("akanjs/server", this.#app.workspace.workspaceRoot)));
7099
+ } catch {}
7100
+ try {
7101
+ candidates.unshift(path30.dirname(Bun.resolveSync("akanjs/server", path30.dirname(Bun.main))));
7102
+ } catch {}
6988
7103
  for (const candidate of candidates) {
6989
7104
  if (await Bun.file(path30.join(candidate, "rscClient.tsx")).exists())
6990
7105
  return candidate;
6991
7106
  }
6992
- return candidates[0];
7107
+ throw new Error(`[base-artifact] failed to locate akanjs/server; looked in: ${candidates.join(", ")}`);
6993
7108
  }
6994
7109
  async#buildStyleAssets() {
6995
7110
  const cssCompiler = new CssCompiler(this.#app);
@@ -8247,8 +8362,8 @@ var Pkg = createInternalArgToken("Pkg");
8247
8362
  var Module = createInternalArgToken("Module");
8248
8363
  var Workspace = createInternalArgToken("Workspace");
8249
8364
  // pkgs/@akanjs/devkit/commandDecorators/command.ts
8250
- import { confirm, input as input2, select as select2 } from "@inquirer/prompts";
8251
8365
  import path35 from "path";
8366
+ import { confirm, input as input2, select as select2 } from "@inquirer/prompts";
8252
8367
  import { Logger as Logger11 } from "akanjs/common";
8253
8368
  import chalk6 from "chalk";
8254
8369
  import { program } from "commander";
@@ -8506,6 +8621,37 @@ var formatCommandHelp = (command, key) => {
8506
8621
 
8507
8622
  // pkgs/@akanjs/devkit/commandDecorators/command.ts
8508
8623
  var camelToKebabCase2 = (str) => str.replace(/([A-Z])/g, "-$1").toLowerCase();
8624
+ var loggedCliErrorObjects = new WeakSet;
8625
+ var loggedCliErrorMessages = new Set;
8626
+ var formatCliError = (error) => {
8627
+ if (error instanceof Error)
8628
+ return error.message || error.name;
8629
+ if (typeof error === "string")
8630
+ return error.trim() || "Unknown error";
8631
+ if (error === null || error === undefined)
8632
+ return "Unknown error";
8633
+ try {
8634
+ const json = JSON.stringify(error);
8635
+ if (json)
8636
+ return json;
8637
+ } catch {
8638
+ return String(error);
8639
+ }
8640
+ return String(error) || "Unknown error";
8641
+ };
8642
+ var printCliError = (error) => {
8643
+ if (typeof error === "object" && error !== null) {
8644
+ if (loggedCliErrorObjects.has(error))
8645
+ return;
8646
+ loggedCliErrorObjects.add(error);
8647
+ }
8648
+ const message = formatCliError(error);
8649
+ if (loggedCliErrorMessages.has(message))
8650
+ return;
8651
+ loggedCliErrorMessages.add(message);
8652
+ Logger11.rawLog(`
8653
+ ${chalk6.red(message)}`);
8654
+ };
8509
8655
  var handleOption = (programCommand, argMeta) => {
8510
8656
  const {
8511
8657
  type,
@@ -8712,6 +8858,7 @@ var getInternalArgumentValue = async (argMeta, value, workspace) => {
8712
8858
  };
8713
8859
  var runCommands = async (...commands) => {
8714
8860
  process.on("unhandledRejection", (error) => {
8861
+ printCliError(error);
8715
8862
  process.exit(1);
8716
8863
  });
8717
8864
  const __dirname2 = getDirname(import.meta.url);
@@ -8802,9 +8949,7 @@ It may cause unexpected behavior. Run \`akan update\` to update latest akanjs.`)
8802
8949
  await targetMeta.handler.call(cmd, ...commandArgs);
8803
8950
  Logger11.rawLog();
8804
8951
  } catch (e) {
8805
- const errMsg = e instanceof Error ? e.message : typeof e === "string" ? e : JSON.stringify(e);
8806
- Logger11.rawLog(`
8807
- ${chalk6.red(errMsg)}`);
8952
+ printCliError(e);
8808
8953
  throw e;
8809
8954
  }
8810
8955
  });
@@ -9582,8 +9727,15 @@ class ApplicationRunner extends runner("application") {
9582
9727
  cwd: `${workspace.workspaceRoot}/local`
9583
9728
  });
9584
9729
  return wasAlreadyUp;
9585
- } catch {
9586
- throw new Error(`Docker daemon is not running. Please install docker or start docker daemon and try again.`);
9730
+ } catch (error) {
9731
+ const detail = error instanceof Error ? error.message : typeof error === "string" ? error : JSON.stringify(error) || "Unknown error";
9732
+ throw new Error([
9733
+ "Docker daemon may not be running. Please install Docker or start the Docker daemon and try again.",
9734
+ `Original error:
9735
+ ${detail}`
9736
+ ].join(`
9737
+
9738
+ `));
9587
9739
  }
9588
9740
  }
9589
9741
  async dbdown(workspace) {
@@ -11465,16 +11617,18 @@ class WorkspaceRunner extends runner("workspace") {
11465
11617
  workspace.getPackageJson(),
11466
11618
  this.#getAkanPeerDependencies()
11467
11619
  ]);
11620
+ const { typescript, ...dependencies } = peerDependencies;
11468
11621
  const packageJson = {
11469
11622
  ...rootPackageJson,
11470
11623
  dependencies: {
11471
11624
  ...rootPackageJson.dependencies,
11472
- ...peerDependencies,
11625
+ ...dependencies,
11473
11626
  akanjs: akanVersion
11474
11627
  },
11475
11628
  devDependencies: {
11476
11629
  ...rootPackageJson.devDependencies,
11477
- "@types/bun": latestTypesBunVersion
11630
+ "@types/bun": latestTypesBunVersion,
11631
+ ...typescript ? { typescript } : {}
11478
11632
  }
11479
11633
  };
11480
11634
  await workspace.setPackageJson(packageJson);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akanjs/cli",
3
- "version": "2.1.0-rc.1",
3
+ "version": "2.1.0-rc.3",
4
4
  "sourceType": "module",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -34,7 +34,7 @@
34
34
  "@langchain/deepseek": "^1.0.26",
35
35
  "@langchain/openai": "^1.4.6",
36
36
  "@trapezedev/project": "^7.1.4",
37
- "akanjs": "2.1.0-rc.0",
37
+ "akanjs": "2.1.0-rc.3",
38
38
  "chalk": "^5.6.2",
39
39
  "commander": "^14.0.3",
40
40
  "fontaine": "^0.8.0",