@akanjs/cli 0.0.139 → 0.0.140

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/esm/index.js CHANGED
@@ -434,11 +434,11 @@ var Logger = class _Logger {
434
434
  console.log(`${processMsg} ${timestampMsg} ${logLevelMsg} ${contextMsg} ${contentMsg} ${timeDiffMsg}
435
435
  `);
436
436
  }
437
- static rawLog(msg, method) {
437
+ static rawLog(msg = "", method) {
438
438
  this.raw(`${msg}
439
439
  `, method);
440
440
  }
441
- static raw(msg, method) {
441
+ static raw(msg = "", method) {
442
442
  if (typeof window === "undefined" && method !== "console" && global.process)
443
443
  global.process.stdout.write(msg);
444
444
  else
@@ -986,13 +986,20 @@ var Executor = class _Executor {
986
986
  if (!fs6.existsSync(cwdPath))
987
987
  fs6.mkdirSync(cwdPath, { recursive: true });
988
988
  }
989
+ #stdout(data) {
990
+ if (_Executor.verbose)
991
+ Logger.raw(chalk.dim(data.toString()));
992
+ }
993
+ #stderr(data) {
994
+ Logger.raw(chalk.red(data.toString()));
995
+ }
989
996
  exec(command, options = {}) {
990
997
  const proc = exec(command, { cwd: this.cwdPath, ...options });
991
998
  proc.stdout?.on("data", (data) => {
992
- Logger.raw(chalk.dim(data.toString()));
999
+ this.#stdout(data);
993
1000
  });
994
1001
  proc.stderr?.on("data", (data) => {
995
- Logger.raw(chalk.dim(data.toString()));
1002
+ this.#stdout(data);
996
1003
  });
997
1004
  return new Promise((resolve, reject) => {
998
1005
  proc.on("exit", (code, signal) => {
@@ -1006,14 +1013,14 @@ var Executor = class _Executor {
1006
1013
  spawn(command, args = [], options = {}) {
1007
1014
  const proc = spawn(command, args, {
1008
1015
  cwd: this.cwdPath,
1009
- stdio: _Executor.verbose ? "inherit" : "ignore",
1016
+ stdio: "inherit",
1010
1017
  ...options
1011
1018
  });
1012
1019
  proc.stdout?.on("data", (data) => {
1013
- Logger.raw(chalk.dim(data.toString()));
1020
+ this.#stdout(data);
1014
1021
  });
1015
1022
  proc.stderr?.on("data", (data) => {
1016
- Logger.raw(chalk.dim(data.toString()));
1023
+ this.#stderr(data);
1017
1024
  });
1018
1025
  return new Promise((resolve, reject) => {
1019
1026
  proc.on("exit", (code, signal) => {
@@ -1027,14 +1034,14 @@ var Executor = class _Executor {
1027
1034
  fork(modulePath, args = [], options = {}) {
1028
1035
  const proc = fork(modulePath, args, {
1029
1036
  cwd: this.cwdPath,
1030
- stdio: _Executor.verbose ? ["ignore", "inherit", "inherit", "ipc"] : ["ignore", "ignore", "ignore", "ipc"],
1037
+ stdio: ["ignore", "inherit", "inherit", "ipc"],
1031
1038
  ...options
1032
1039
  });
1033
1040
  proc.stdout?.on("data", (data) => {
1034
- Logger.raw(data.toString());
1041
+ this.#stdout(data);
1035
1042
  });
1036
1043
  proc.stderr?.on("data", (data) => {
1037
- Logger.raw(data.toString());
1044
+ this.#stderr(data);
1038
1045
  });
1039
1046
  return new Promise((resolve, reject) => {
1040
1047
  proc.on("exit", (code, signal) => {
@@ -1059,6 +1066,20 @@ var Executor = class _Executor {
1059
1066
  const readPath = this.#getPath(filePath);
1060
1067
  return fs6.existsSync(readPath);
1061
1068
  }
1069
+ remove(filePath) {
1070
+ const readPath = this.#getPath(filePath);
1071
+ if (fs6.existsSync(readPath))
1072
+ fs6.unlinkSync(readPath);
1073
+ this.logger.verbose(`Remove file ${readPath}`);
1074
+ return this;
1075
+ }
1076
+ removeDir(dirPath) {
1077
+ const readPath = this.#getPath(dirPath);
1078
+ if (fs6.existsSync(readPath))
1079
+ fs6.rmSync(readPath, { recursive: true });
1080
+ this.logger.verbose(`Remove directory ${readPath}`);
1081
+ return this;
1082
+ }
1062
1083
  writeFile(filePath, content, { overwrite = true } = {}) {
1063
1084
  const writePath = this.#getPath(filePath);
1064
1085
  const dir = path4.dirname(writePath);
@@ -1279,23 +1300,41 @@ var WorkspaceExecutor = class _WorkspaceExecutor extends Executor {
1279
1300
  }
1280
1301
  setTsPaths(type, name) {
1281
1302
  const rootTsConfig = this.readJson("tsconfig.json");
1282
- if (type === "lib")
1303
+ if (type === "lib" || type === "pkg")
1283
1304
  rootTsConfig.compilerOptions.paths[`@${name}`] = [`${type}s/${name}/index.ts`];
1284
1305
  rootTsConfig.compilerOptions.paths[`@${name}/*`] = [`${type}s/${name}/*`];
1306
+ if (rootTsConfig.references) {
1307
+ if (!rootTsConfig.references.some((ref) => ref.path === `./${type}s/${name}/tsconfig.json`))
1308
+ rootTsConfig.references.push({ path: `./${type}s/${name}/tsconfig.json` });
1309
+ }
1310
+ this.writeJson("tsconfig.json", rootTsConfig);
1311
+ return this;
1312
+ }
1313
+ unsetTsPaths(type, name) {
1314
+ const rootTsConfig = this.readJson("tsconfig.json");
1315
+ const filteredKeys = Object.keys(rootTsConfig.compilerOptions.paths).filter((key) => !key.startsWith(`@${name}`));
1316
+ rootTsConfig.compilerOptions.paths = Object.fromEntries(
1317
+ filteredKeys.map((key) => [key, rootTsConfig.compilerOptions.paths[key]])
1318
+ );
1319
+ if (rootTsConfig.references) {
1320
+ rootTsConfig.references = rootTsConfig.references.filter(
1321
+ (ref) => !ref.path.startsWith(`./${type}s/${name}`)
1322
+ );
1323
+ }
1285
1324
  this.writeJson("tsconfig.json", rootTsConfig);
1286
1325
  return this;
1287
1326
  }
1288
1327
  async getDirInModule(basePath2, name) {
1289
- const AVOID_DIRS = ["__lib", "__scalar", `_${name}`];
1328
+ const AVOID_DIRS = ["__lib", "__scalar", `_`, `_${name}`];
1290
1329
  const getDirs = async (dirname, maxDepth = 3, results = [], prefix = "") => {
1291
1330
  const dirs = await fsPromise.readdir(dirname);
1292
1331
  await Promise.all(
1293
1332
  dirs.map(async (dir) => {
1294
- if (AVOID_DIRS.includes(dir))
1333
+ if (dir.includes("_") || AVOID_DIRS.includes(dir))
1295
1334
  return;
1296
1335
  const dirPath = path4.join(dirname, dir);
1297
1336
  if (fs6.lstatSync(dirPath).isDirectory()) {
1298
- results.push(`${name}/${prefix}${dir}`);
1337
+ results.push(`${prefix}${dir}`);
1299
1338
  if (maxDepth > 0)
1300
1339
  await getDirs(dirPath, maxDepth - 1, results, `${prefix}${dir}/`);
1301
1340
  }
@@ -1342,6 +1381,22 @@ var WorkspaceExecutor = class _WorkspaceExecutor extends Executor {
1342
1381
  ];
1343
1382
  return scalarConstantExampleFiles;
1344
1383
  }
1384
+ async getConstantFiles() {
1385
+ const [appNames, libNames] = await this.getSyss();
1386
+ const moduleConstantExampleFiles = [
1387
+ ...(await Promise.all(appNames.map((appName) => AppExecutor.from(this, appName).getConstantFiles()))).flat(),
1388
+ ...(await Promise.all(libNames.map((libName) => LibExecutor.from(this, libName).getConstantFiles()))).flat()
1389
+ ];
1390
+ return moduleConstantExampleFiles;
1391
+ }
1392
+ async getDictionaryFiles() {
1393
+ const [appNames, libNames] = await this.getSyss();
1394
+ const moduleDictionaryExampleFiles = [
1395
+ ...(await Promise.all(appNames.map((appName) => AppExecutor.from(this, appName).getDictionaryFiles()))).flat(),
1396
+ ...(await Promise.all(libNames.map((libName) => LibExecutor.from(this, libName).getDictionaryFiles()))).flat()
1397
+ ];
1398
+ return moduleDictionaryExampleFiles;
1399
+ }
1345
1400
  async getViewFiles() {
1346
1401
  const [appNames, libNames] = await this.getSyss();
1347
1402
  const viewExampleFiles = [
@@ -1571,9 +1626,15 @@ var SysExecutor = class extends Executor {
1571
1626
  }
1572
1627
  async getScalarDictionaryFiles() {
1573
1628
  const scalarModules = await this.getScalarModules();
1574
- return scalarModules.map(
1575
- (scalarModule) => this.getLocalFile(`lib/__scalar/${scalarModule}/${scalarModule}.dictionary.ts`)
1576
- );
1629
+ return scalarModules.map((scalarModule) => this.getLocalFile(`lib/${scalarModule}/${scalarModule}.dictionary.ts`));
1630
+ }
1631
+ async getConstantFiles() {
1632
+ const modules = await this.getModules();
1633
+ return modules.map((module) => this.getLocalFile(`lib/${module}/${module}.constant.ts`));
1634
+ }
1635
+ async getDictionaryFiles() {
1636
+ const modules = await this.getModules();
1637
+ return modules.map((module) => this.getLocalFile(`lib/${module}/${module}.dictionary.ts`));
1577
1638
  }
1578
1639
  setTsPaths() {
1579
1640
  this.workspace.setTsPaths(this.type, this.name);
@@ -2014,6 +2075,7 @@ var getArg = (type) => function(name, argsOption = {}) {
2014
2075
  setArgMetasOnPrototype(prototype, key, argMetas);
2015
2076
  };
2016
2077
  };
2078
+ var Argument = getArg("Argument");
2017
2079
  var Option = getArg("Option");
2018
2080
  var createArgMetaDecorator = (type) => {
2019
2081
  return function(option = {}) {
@@ -2090,6 +2152,16 @@ var handleOption = (programCommand, argMeta) => {
2090
2152
  );
2091
2153
  return programCommand;
2092
2154
  };
2155
+ var handleArgument = (programCommand, argMeta) => {
2156
+ const kebabName = camelToKebabCase(argMeta.name);
2157
+ if ((argMeta.argsOption.type ?? "string") !== "string")
2158
+ throw new Error(`Argument type must be string: ${argMeta.name}`);
2159
+ programCommand.argument(
2160
+ `[${kebabName}]`,
2161
+ `${argMeta.argsOption.desc}${argMeta.argsOption.example ? ` (example: ${argMeta.argsOption.example})` : ""}`
2162
+ );
2163
+ return programCommand;
2164
+ };
2093
2165
  var convertOptionValue = (value, type) => {
2094
2166
  if (type === "string")
2095
2167
  return value;
@@ -2126,7 +2198,21 @@ var getOptionValue = async (argMeta, opt) => {
2126
2198
  return convertOptionValue(await input({ message }), type ?? "string");
2127
2199
  }
2128
2200
  };
2129
- var getArgumentValue = async (argMeta, value, workspace) => {
2201
+ var getArgumentValue = async (argMeta, value) => {
2202
+ const {
2203
+ name,
2204
+ argsOption: { default: defaultValue, type, desc, nullable, example, ask }
2205
+ } = argMeta;
2206
+ if (value !== void 0)
2207
+ return value;
2208
+ else if (defaultValue !== void 0)
2209
+ return defaultValue;
2210
+ else if (nullable)
2211
+ return null;
2212
+ const message = ask ? `${ask}: ` : desc ? `${desc}: ` : `Enter the ${name} value${example ? ` (example: ${example})` : ""}: `;
2213
+ return await input({ message });
2214
+ };
2215
+ var getInternalArgumentValue = async (argMeta, value, workspace) => {
2130
2216
  if (argMeta.type === "Workspace")
2131
2217
  return workspace;
2132
2218
  const sysType = argMeta.type.toLowerCase();
@@ -2191,6 +2277,7 @@ var getArgumentValue = async (argMeta, value, workspace) => {
2191
2277
  var runCommands = async (...commands) => {
2192
2278
  process.on("unhandledRejection", (error) => {
2193
2279
  console.error(chalk2.red("[fatal]"), error);
2280
+ process.exit(1);
2194
2281
  });
2195
2282
  const hasPackageJson = fs9.existsSync(`${__dirname}/../package.json`);
2196
2283
  const version = hasPackageJson ? JSON.parse(fs9.readFileSync(`${__dirname}/../package.json`, "utf8")).version : "0.0.1";
@@ -2211,6 +2298,8 @@ var runCommands = async (...commands) => {
2211
2298
  for (const argMeta of allArgMetas) {
2212
2299
  if (argMeta.type === "Option")
2213
2300
  programCommand = handleOption(programCommand, argMeta);
2301
+ else if (argMeta.type === "Argument")
2302
+ programCommand = handleArgument(programCommand, argMeta);
2214
2303
  else if (argMeta.type === "Workspace")
2215
2304
  continue;
2216
2305
  const sysType = argMeta.type.toLowerCase();
@@ -2221,6 +2310,7 @@ var runCommands = async (...commands) => {
2221
2310
  }
2222
2311
  programCommand = programCommand.option(`-v, --verbose [boolean]`, `verbose output`);
2223
2312
  programCommand.action(async (...args) => {
2313
+ Logger.rawLog();
2224
2314
  const cmdArgs = args.slice(0, args.length - 2);
2225
2315
  const opt = args[args.length - 2];
2226
2316
  const commandArgs = [];
@@ -2228,8 +2318,14 @@ var runCommands = async (...commands) => {
2228
2318
  for (const argMeta of allArgMetas) {
2229
2319
  if (argMeta.type === "Option")
2230
2320
  commandArgs[argMeta.idx] = await getOptionValue(argMeta, opt);
2321
+ else if (argMeta.type === "Argument")
2322
+ commandArgs[argMeta.idx] = await getArgumentValue(argMeta, cmdArgs[argMeta.idx]);
2231
2323
  else
2232
- commandArgs[argMeta.idx] = await getArgumentValue(argMeta, cmdArgs[argMeta.idx], workspace);
2324
+ commandArgs[argMeta.idx] = await getInternalArgumentValue(
2325
+ argMeta,
2326
+ cmdArgs[argMeta.idx],
2327
+ workspace
2328
+ );
2233
2329
  if (commandArgs[argMeta.idx] instanceof AppExecutor)
2234
2330
  process.env.NEXT_PUBLIC_APP_NAME = commandArgs[argMeta.idx].name;
2235
2331
  if (opt.verbose)
@@ -2238,6 +2334,7 @@ var runCommands = async (...commands) => {
2238
2334
  const cmd = new command();
2239
2335
  try {
2240
2336
  await cmd[targetMeta.key](...commandArgs);
2337
+ Logger.rawLog();
2241
2338
  } catch (e) {
2242
2339
  const errMsg = e instanceof Error ? e.message : typeof e === "string" ? e : JSON.stringify(e);
2243
2340
  Logger.error(`Command Error: ${chalk2.red(errMsg)}`);
@@ -2340,7 +2437,7 @@ var AiSession = class _AiSession {
2340
2437
  const stream = await _AiSession.#chat.stream(this.messageHistory);
2341
2438
  let fullResponse = "", tokenIdx = 0;
2342
2439
  for await (const chunk of stream) {
2343
- if (loader.isSpinning())
2440
+ if (loader.isSpinning() && chunk.content.length)
2344
2441
  loader.succeed(`${_AiSession.#chat.model} responded`);
2345
2442
  const content = chunk.content;
2346
2443
  if (typeof content === "string") {
@@ -2470,22 +2567,14 @@ var LibraryRunner = class {
2470
2567
  await workspace.exec(`mkdir -p libs/${libName}`);
2471
2568
  const lib = LibExecutor.from(workspace, libName);
2472
2569
  await lib.applyTemplate({ basePath: ".", template: "libRoot", dict: { libName, LibName: capitalize(libName) } });
2473
- const rootTsConfig = workspace.readJson("tsconfig.json");
2474
- rootTsConfig.compilerOptions.paths[`@${libName}`] = [`libs/${libName}/index.ts`];
2475
- rootTsConfig.compilerOptions.paths[`@${libName}/*`] = [`libs/${libName}/*`];
2476
- if (rootTsConfig.references) {
2477
- if (!rootTsConfig.references.some((ref) => ref.path === `./libs/${libName}/tsconfig.json`))
2478
- rootTsConfig.references.push({ path: `./libs/${libName}/tsconfig.json` });
2479
- }
2480
- workspace.writeJson("tsconfig.json", rootTsConfig);
2570
+ workspace.setTsPaths("lib", libName);
2481
2571
  return lib;
2482
2572
  }
2483
2573
  async removeLibrary(lib) {
2484
2574
  await lib.workspace.exec(`rm -rf libs/${lib.name}`);
2485
- lib.log(`Library ${lib.name} removed`);
2575
+ lib.workspace.unsetTsPaths("lib", lib.name);
2486
2576
  }
2487
2577
  async installLibrary(workspace, libName) {
2488
- workspace.log(`Installing ${libName} library as git subtree...`);
2489
2578
  await workspace.exec(`git subtree add --prefix=libs/${libName} git@github.com:akan-team/${libName}.git main`);
2490
2579
  await workspace.cp(`libs/${libName}/env/env.server.example.ts`, `libs/${libName}/env/env.server.testing.ts`);
2491
2580
  workspace.setTsPaths("lib", libName);
@@ -2522,13 +2611,11 @@ var LibraryRunner = class {
2522
2611
  await lib.workspace.exec(
2523
2612
  `git subtree push --prefix=libs/${lib.name} git@github.com:akan-team/${lib.name}.git ${branch}`
2524
2613
  );
2525
- lib.logger.log(`${lib.name} library pushed to ${branch} branch`);
2526
2614
  }
2527
2615
  async pullLibrary(lib, branch) {
2528
2616
  await lib.workspace.exec(
2529
2617
  `git subtree pull --prefix=libs/${lib.name} git@github.com:akan-team/${lib.name}.git ${branch}`
2530
2618
  );
2531
- lib.logger.log(`${lib.name} library pulled from ${branch} branch`);
2532
2619
  }
2533
2620
  #getEnv(lib, env = {}) {
2534
2621
  const rootEnv = dotenv2.parse(lib.workspace.readFile(".env"));
@@ -2582,7 +2669,7 @@ var LibraryScript = class {
2582
2669
  const installSpinner = workspace.spinning(`Installing ${libName} library`);
2583
2670
  const lib = await this.#runner.installLibrary(workspace, libName);
2584
2671
  installSpinner.succeed(`${libName} library (libs/${libName}) is installed`);
2585
- const mergeSpinner = workspace.spinning("Merging library dependencies...");
2672
+ const mergeSpinner = lib.spinning("Merging library dependencies...");
2586
2673
  await this.#runner.mergeLibraryDependencies(lib);
2587
2674
  mergeSpinner.succeed(`${libName} library (libs/${libName}) dependencies merged to root package.json`);
2588
2675
  }
@@ -3903,87 +3990,6 @@ Core ESLint Extensions
3903
3990
  This configuration creates a robust linting setup that enforces Next.js App Router best practices, maintains clean code
3904
3991
  organization, and ensures proper server/client code separation.
3905
3992
  `;
3906
- var componentDefaultDescription = ({
3907
- modelName,
3908
- ModelName,
3909
- exampleFiles,
3910
- constant,
3911
- properties
3912
- }) => `
3913
-
3914
-
3915
- 1. Akan.js \uD504\uB808\uC784\uC6CC\uD06C\uC5D0 \uB300\uD55C \uAC1C\uC694
3916
- ${frameworkAbstract}
3917
-
3918
- 2. Akan.js\uD504\uB808\uC784\uC6CC\uD06C \uB370\uC774\uD130 \uAE30\uBC18 \uBAA8\uB4C8\uC5D0 \uB300\uD55C \uC124\uBA85
3919
- ${moduleDesription}
3920
-
3921
- 3. Akan.js eslint \uC124\uC815\uC5D0 \uB300\uD55C \uC124\uBA85
3922
- ${eslintDescription}
3923
-
3924
- 4. util/ui \uB0B4 ui\uD0B7\uC5D0 \uB300\uD55C \uC124\uBA85
3925
- ${utilUiDescription}
3926
-
3927
- 5. shared/ui \uB0B4 ui\uD0B7\uC5D0 \uB300\uD55C \uC124\uBA85
3928
- ${shardUiDescription}
3929
-
3930
- 6. ${ModelName}.constant.ts \uD30C\uC77C\uC5D0 \uB300\uD55C \uC815\uBCF4
3931
- ${constant}
3932
-
3933
- 7. ${modelName}\uC5D0\uC11C \uC885\uC18D\uB418\uB294 \uB2E4\uB978 \uBAA8\uB378\uB4E4\uC758 \uD0C0\uC785 \uC815\uC758
3934
- ${properties.map(
3935
- (property) => `
3936
- \`\`\`
3937
- ${property.key}.constant.ts
3938
-
3939
-
3940
- ${property.source}
3941
- \`\`\`
3942
- `
3943
- ).join("\n\n")}
3944
-
3945
-
3946
- 8. \uC608\uC2DC \uD30C\uC77C\uB4E4
3947
- ${exampleFiles.map(
3948
- (example) => `
3949
- Example filename: ${example.filepath}
3950
- \`\`\`
3951
- ${example.content}
3952
- \`\`\`
3953
- `
3954
- ).join("\n\n")}
3955
-
3956
-
3957
-
3958
-
3959
-
3960
-
3961
- \uC5ED\uD560\uBD80\uC5EC
3962
- - Akan.js \uC0AC\uB0B4 \uD504\uB808\uC784\uC6CC\uD06C \uAE30\uBC18 Typescript \uC2DC\uB2C8\uC5B4 \uD504\uB860\uD2B8\uC5D4\uB4DC \uAC1C\uBC1C\uC790.
3963
-
3964
- \uCF54\uB529 \uADDC\uCE59
3965
- - \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC0AC\uC6A9
3966
- - \uC544\uC774\uCF58: react-icons \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC0AC\uC6A9
3967
- - CSS: tailwind, DaisyUI(btn, input, badge \uAC19\uC740 \uAE30\uBCF8 \uC694\uC18C\uB9CC \uC0AC\uC6A9 \uAC00\uB2A5, card/hero \uAC19\uC740 \uBCF5\uC7A1\uD55C \uCEF4\uD3EC\uB10C\uD2B8 \uC0AC\uC6A9 X) \uC0AC\uC6A9
3968
- - Ui Component: @util/ui \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC0AC\uC6A9
3969
- - \uC870\uAC74\uBD80 \uD074\uB798\uC2A4: clsx \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC0AC\uC6A9
3970
- \uCF54\uB4DC \uC2A4\uD0C0\uC77C
3971
- - \uC0C9\uC0C1: \uD558\uB4DC\uCF54\uB529(bg-red) \uB300\uC2E0 \uD14C\uB9C8 \uC0C9\uC0C1(bg-primary) \uC0AC\uC6A9
3972
- - \uC870\uAC74\uBD80 \uB80C\uB354\uB9C1: field && <div>... \uB300\uC2E0 field ? <div>... : null \uC0AC\uC6A9
3973
- - \uBAA8\uB378 \uC811\uADFC: \uAD6C\uC870\uBD84\uD574\uD560\uB2F9 \uB300\uC2E0 ${modelName}.field \uD615\uC2DD\uC73C\uB85C \uC811\uADFC
3974
- - \uD0C0\uC785 \uC548\uC804: ${modelName}.constant.ts\uC758 \uC2A4\uD0A4\uB9C8 \uCC38\uC870\uD558\uC5EC \uC5D0\uB7EC \uBC29\uC9C0
3975
- \uD544\uB4DC \uC811\uADFC \uC804: \uC2A4\uD0A4\uB9C8\uC758 \uC2E4\uC81C \uD544\uB4DC \uB9AC\uC2A4\uD2B8 \uC791\uC131 \uBC0F \uAC80\uD1A0 \uD544\uC218
3976
-
3977
- \uC5C4\uACA9\uD55C \uC8FC\uC758\uC0AC\uD56D
3978
- - UI \uD0B7\uC740 \uBB38\uC11C\uC5D0 \uBA85\uC2DC\uB41C \uCEF4\uD3EC\uB10C\uD2B8\uB9CC \uC0AC\uC6A9
3979
- - \uCEF4\uD3EC\uB10C\uD2B8 \uC0AC\uC6A9 \uC804 \uBB38\uC11C \uD655\uC778 \uBC0F props \uC815\uD655\uD788 \uAC80\uC99D
3980
- - \uBA85\uC2DC\uB41C \uB8F0 \uC678 \uC784\uC758 \uCD94\uC0C1\uD654 \uAE08\uC9C0
3981
- - dayjs \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB294 @akanjs/base\uC5D0\uC11C \uB798\uD551\uD558\uC5EC \uC81C\uACF5\uD558\uACE0 \uC788\uC74C.
3982
-
3983
-
3984
-
3985
-
3986
- `;
3987
3993
  var scalarConstantDescription = `
3988
3994
  Purpose and Structure
3989
3995
 
@@ -4321,159 +4327,56 @@ The \`@Field.Prop()\` decorator is commonly used in different model types:
4321
4327
  - Reference options enable building relationships between different models
4322
4328
  - Aggregation options support analytics use cases
4323
4329
  `;
4324
- var requestScalarConstant = ({
4325
- sysName,
4330
+ var componentDefaultDescription = ({
4326
4331
  modelName,
4327
- modelDesc,
4328
- modelSchemaDesign,
4329
- boilerplate,
4330
- otherConstants
4332
+ ModelName,
4333
+ exampleFiles,
4334
+ constant,
4335
+ properties
4331
4336
  }) => `
4332
- \uB108\uB294 Akan.js\uB77C\uB294 \uC0AC\uB0B4 \uD504\uB808\uC784\uC6CC\uD06C\uB85C Typescript \uAE30\uBC18 \uD504\uB85C\uADF8\uB7A8\uC744 \uC791\uC131\uD558\uB294 \uC2DC\uB2C8\uC5B4 \uAC1C\uBC1C\uC790\uC57C.
4333
- \uB2E4\uC74C\uC758 \uBC30\uACBD \uC815\uBCF4\uB97C \uBC14\uD0D5\uC73C\uB85C ${modelName}.constant.ts \uD30C\uC77C\uC744 \uC791\uC131\uD574\uC918.
4337
+
4334
4338
 
4335
4339
  1. Akan.js \uD504\uB808\uC784\uC6CC\uD06C\uC5D0 \uB300\uD55C \uAC1C\uC694
4336
4340
  ${frameworkAbstract}
4337
4341
 
4338
- 2. <model>.constant.ts \uD30C\uC77C\uC5D0 \uB300\uD55C \uAC1C\uC694
4339
- ${scalarConstantDescription}
4340
-
4341
- 3. <model>.constant.ts \uD30C\uC77C\uC758 Enum \uC791\uC131\uBC95
4342
- ${howToSetEnumInModelConstant}
4343
-
4344
- 4. <model>.constant.ts \uD30C\uC77C\uC758 Field \uC791\uC131\uBC95
4345
- ${howToSetFieldInModelConstant}
4342
+ 2. Akan.js\uD504\uB808\uC784\uC6CC\uD06C \uB370\uC774\uD130 \uAE30\uBC18 \uBAA8\uB4C8\uC5D0 \uB300\uD55C \uC124\uBA85
4343
+ ${moduleDesription}
4346
4344
 
4347
- 5. \uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uB0B4 \uB2E4\uB978 constant.ts \uD30C\uC77C\uB4E4\uC5D0 \uB300\uD55C \uC608\uC2DC
4348
- ${otherConstants.map(
4349
- (constant) => `
4350
- Example file: ${constant.filepath}
4351
- \`\`\`
4352
- ${constant.content}
4353
- \`\`\`
4354
- `
4355
- ).join("\n")}
4345
+ 3. Akan.js eslint \uC124\uC815\uC5D0 \uB300\uD55C \uC124\uBA85
4346
+ ${eslintDescription}
4356
4347
 
4348
+ 4. util/ui \uB0B4 ui\uD0B7\uC5D0 \uB300\uD55C \uC124\uBA85
4349
+ ${utilUiDescription}
4357
4350
 
4358
- \uC704 \uB0B4\uC6A9\uB4E4\uC744 \uBC14\uD0D5\uC73C\uB85C \uD30C\uC2F1\uD558\uAE30 \uC27D\uAC8C \uC544\uB798\uC5D0 \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8\uC5D0 \uB9DE\uAC8C \uC815\uB9AC\uD574\uC11C \uC918
4351
+ 5. shared/ui \uB0B4 ui\uD0B7\uC5D0 \uB300\uD55C \uC124\uBA85
4352
+ ${shardUiDescription}
4359
4353
 
4360
- Application name: ${sysName}
4361
- Model name: ${modelName}
4362
- Model description: ${modelDesc}
4363
- Model schema design: ${modelSchemaDesign}
4354
+ 6. ${ModelName}.constant.ts \uD30C\uC77C\uC5D0 \uB300\uD55C \uC815\uBCF4
4355
+ ${constant}
4364
4356
 
4365
- Target filename: ${modelName}.constant.ts
4366
- \`\`\`
4367
- ${boilerplate}
4368
- \`\`\`
4369
- `;
4370
- var requestTemplate = ({
4371
- sysName,
4372
- modelName,
4373
- ModelName,
4374
- boilerplate,
4375
- constant,
4376
- properties,
4377
- exampleFiles
4378
- }) => `
4379
- ${componentDefaultDescription({
4380
- sysName,
4381
- modelName,
4382
- ModelName,
4383
- exampleFiles,
4384
- constant,
4385
- properties
4386
- })}
4387
- \uC694\uCCAD\uC0AC\uD56D
4388
- - \uC544\uB798 \uC81C\uACF5\uD560 \uAE30\uBCF8 \uD15C\uD50C\uB9BF \uCF54\uB4DC\uC5D0 \uCD94\uAC00\uB85C \uCEF4\uD3EC\uB10C\uD2B8 \uAC1C\uBC1C
4389
- - ${ModelName}.Template.tsx \uCF54\uB4DC \uC791\uC131
4390
- - \uCEF4\uD3EC\uB10C\uD2B8 \uC774\uB984\uC740 \uBAA8\uB378 \uC774\uB984\uC740 \uC2A4\uD0A4\uB9C8\uC5D0 \uAE30\uBC18\uD55C \uAE30\uB2A5\uC5D0 \uCD08\uC810\uC744 \uB450\uACE0 \uC791\uC131
4391
- - \uC544\uB798 \uC81C\uACF5\uD560 \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8\uC5D0 \uC788\uB294 General \uCEF4\uD3EC\uB10C\uD2B8 1\uAC1C\uB97C \uC81C\uC678\uD55C \uB514\uC790\uC778 \uCEF4\uD3EC\uB10C\uD2B8 4\uAC1C \uAC1C\uBC1C
4392
- - \uCD94\uC0C1\uD654 \uD574\uC57C\uD558\uB294 \uACBD\uC6B0\uAC00 \uC788\uC744 \uACBD\uC6B0\uC5D4 \uBB38\uC11C\uB97C \uB2E4\uC2DC \uCC38\uACE0\uD558\uACE0 \uC124\uBA85\uB41C \uB0B4\uC5D0\uC11C \uD574\uACB0\uD574\uC57C\uD568.
4393
- - \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8\uC5D0 \uB9DE\uAC8C \uC815\uB9AC\uD574\uC11C \uC81C\uACF5
4394
- -
4395
-
4396
- Application name: ${sysName}
4397
- Model name: ${modelName}
4398
- Target filename: ${ModelName}.Template.tsx
4357
+ 7. ${modelName}\uC5D0\uC11C \uC885\uC18D\uB418\uB294 \uB2E4\uB978 \uBAA8\uB378\uB4E4\uC758 \uD0C0\uC785 \uC815\uC758
4358
+ ${properties.map(
4359
+ (property) => `
4399
4360
  \`\`\`
4361
+ ${property.key}.constant.ts
4400
4362
 
4401
- \`\`\`
4402
-
4403
-
4404
- `;
4405
- var requestView = ({
4406
- sysName,
4407
- modelName,
4408
- ModelName,
4409
- boilerplate,
4410
- constant,
4411
- properties,
4412
- exampleFiles
4413
- }) => `
4414
- ${componentDefaultDescription({
4415
- sysName,
4416
- modelName,
4417
- ModelName,
4418
- exampleFiles,
4419
- constant,
4420
- properties
4421
- })}
4422
- \uC694\uCCAD\uC0AC\uD56D
4423
- - \uC544\uB798 \uC81C\uACF5\uD560 \uAE30\uBCF8 \uD15C\uD50C\uB9BF \uCF54\uB4DC\uC5D0 \uCD94\uAC00\uB85C \uCEF4\uD3EC\uB10C\uD2B8 \uAC1C\uBC1C
4424
- - ${ModelName}.View.tsx \uCF54\uB4DC \uC791\uC131
4425
- - \uCEF4\uD3EC\uB10C\uD2B8 \uC774\uB984\uC5D0 ${ModelName}\uC740 \uC0DD\uB7B5\uD558\uBA70, \uB514\uC790\uC778 \uC911\uC810\uC758 \uC774\uB984\uC73C\uB85C \uC791\uC131
4426
- - \uC544\uB798 \uC81C\uACF5\uD560 \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8\uC5D0 \uC788\uB294 General \uCEF4\uD3EC\uB10C\uD2B8 1\uAC1C\uB97C \uC81C\uC678\uD55C \uB514\uC790\uC778 \uCEF4\uD3EC\uB10C\uD2B8 4\uAC1C \uAC1C\uBC1C
4427
- - \uCD94\uC0C1\uD654 \uD574\uC57C\uD558\uB294 \uACBD\uC6B0\uAC00 \uC788\uC744 \uACBD\uC6B0\uC5D4 \uBB38\uC11C\uB97C \uB2E4\uC2DC \uCC38\uACE0\uD558\uACE0 \uC124\uBA85\uB41C \uB0B4\uC5D0\uC11C \uD574\uACB0\uD574\uC57C\uD568.
4428
- - \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8\uC5D0 \uB9DE\uAC8C \uC815\uB9AC\uD574\uC11C \uC81C\uACF5
4429
-
4430
-
4431
- Application name: ${sysName}
4432
- Model name: ${modelName}
4433
4363
 
4434
- Target filename: ${ModelName}.View.tsx
4435
- \`\`\`
4436
- ${boilerplate}
4364
+ ${property.source}
4437
4365
  \`\`\`
4366
+ `
4367
+ ).join("\n\n")}
4438
4368
 
4439
-
4440
- `;
4441
- var requestUnit = ({
4442
- sysName,
4443
- modelName,
4444
- ModelName,
4445
- constant,
4446
- properties,
4447
- boilerplate,
4448
- exampleFiles
4449
- }) => `
4450
- ${componentDefaultDescription({
4451
- sysName,
4452
- modelName,
4453
- ModelName,
4454
- exampleFiles,
4455
- constant,
4456
- properties
4457
- })}
4458
-
4459
- \uC694\uCCAD\uC0AC\uD56D
4460
- - \uC544\uB798 \uC81C\uACF5\uD560 \uAE30\uBCF8 \uD15C\uD50C\uB9BF \uCF54\uB4DC\uC5D0 \uCD94\uAC00\uB85C \uCEF4\uD3EC\uB10C\uD2B8 \uAC1C\uBC1C
4461
- - ${ModelName}.Unit.tsx \uCF54\uB4DC \uC791\uC131
4462
- - \uCEF4\uD3EC\uB10C\uD2B8 \uC774\uB984\uC5D0 ${ModelName}\uC740 \uC0DD\uB7B5\uD558\uBA70, \uB514\uC790\uC778 \uC911\uC810\uC758 \uC774\uB984\uC73C\uB85C \uC791\uC131
4463
- - \uC608\uC2DC\uD30C\uC77C \uCEF4\uD3EC\uB10C\uD2B8\uC758 \uAE30\uBC18\uD558\uC5EC \uC77C\uBC18\uC801\uC73C\uB85C \uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uCEF4\uD3EC\uB10C\uD2B8 1\uAC1C\uC640 \uB514\uC790\uC778\uC801 \uC694\uC18C\uAC00 \uD3EC\uD568\uB41C \uCEF4\uD3EC\uB10C\uD2B8 3\uAC1C \uAC1C\uBC1C
4464
- - \uCD94\uC0C1\uD654 \uD574\uC57C\uD558\uB294 \uACBD\uC6B0\uAC00 \uC788\uC744 \uACBD\uC6B0\uC5D4 \uBB38\uC11C\uB97C \uB2E4\uC2DC \uCC38\uACE0\uD558\uACE0 \uC124\uBA85\uB41C \uB0B4\uC5D0\uC11C \uD574\uACB0\uD574\uC57C\uD568.
4465
- - \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8\uC5D0 \uB9DE\uAC8C \uC815\uB9AC\uD574\uC11C \uC81C\uACF5
4466
-
4467
-
4468
- Application name: ${sysName}
4469
- Model name: ${modelName}
4470
4369
 
4471
- Target filename: ${ModelName}.Unit.tsx
4370
+ 8. \uC608\uC2DC \uD30C\uC77C\uB4E4
4371
+ ${exampleFiles.map(
4372
+ (example) => `
4373
+ Example filename: ${example.filepath}
4472
4374
  \`\`\`
4473
- ${boilerplate}
4375
+ ${example.content}
4474
4376
  \`\`\`
4377
+ `
4378
+ ).join("\n\n")}
4475
4379
 
4476
-
4477
4380
  `;
4478
4381
 
4479
4382
  // pkgs/@akanjs/cli/src/application/application.prompt.ts
@@ -4527,6 +4430,7 @@ var ApplicationRunner = class {
4527
4430
  }
4528
4431
  async removeApplication(app) {
4529
4432
  await app.workspace.exec(`rm -rf apps/${app.name}`);
4433
+ app.workspace.unsetTsPaths("app", app.name);
4530
4434
  }
4531
4435
  async getConfig(app) {
4532
4436
  return await getAppConfig(app.cwdPath, {
@@ -5173,8 +5077,8 @@ var ApplicationScript = class {
5173
5077
  // pkgs/@akanjs/cli/src/application/application.command.ts
5174
5078
  var ApplicationCommand = class {
5175
5079
  applicationScript = new ApplicationScript();
5176
- async createApplication(name, start, workspace) {
5177
- await this.applicationScript.createApplication(name.toLowerCase().replace(/ /g, "-"), workspace, { start });
5080
+ async createApplication(appName, start, workspace) {
5081
+ await this.applicationScript.createApplication(appName.toLowerCase().replace(/ /g, "-"), workspace, { start });
5178
5082
  }
5179
5083
  async removeApplication(app) {
5180
5084
  await this.applicationScript.removeApplication(app);
@@ -5251,7 +5155,7 @@ var ApplicationCommand = class {
5251
5155
  };
5252
5156
  __decorateClass([
5253
5157
  Target.Public(),
5254
- __decorateParam(0, Option("name", { desc: "name of application" })),
5158
+ __decorateParam(0, Argument("appName", { desc: "name of application" })),
5255
5159
  __decorateParam(1, Option("start", { type: "boolean", desc: "start application", default: false })),
5256
5160
  __decorateParam(2, Workspace())
5257
5161
  ], ApplicationCommand.prototype, "createApplication", 1);
@@ -5400,10 +5304,11 @@ var PackageRunner = class {
5400
5304
  template: "pkgRoot",
5401
5305
  dict: { pkgName, PkgName: capitalize(pkgName) }
5402
5306
  });
5307
+ workspace.setTsPaths("pkg", pkgName);
5403
5308
  }
5404
5309
  async removePackage(pkg) {
5405
5310
  await pkg.workspace.exec(`rm -rf pkgs/${pkg.name}`);
5406
- pkg.log(`Package ${pkg.name} removed`);
5311
+ pkg.workspace.unsetTsPaths("pkg", pkg.name);
5407
5312
  }
5408
5313
  async scanSync(pkg) {
5409
5314
  const scanResult = await pkg.scan();
@@ -5687,8 +5592,8 @@ CloudCommand = __decorateClass([
5687
5592
  // pkgs/@akanjs/cli/src/library/library.command.ts
5688
5593
  var LibraryCommand = class {
5689
5594
  libraryScript = new LibraryScript();
5690
- async createLibrary(name, workspace) {
5691
- await this.libraryScript.createLibrary(name.toLowerCase().replace(/ /g, "-"), workspace);
5595
+ async createLibrary(libName, workspace) {
5596
+ await this.libraryScript.createLibrary(libName.toLowerCase().replace(/ /g, "-"), workspace);
5692
5597
  }
5693
5598
  async removeLibrary(lib) {
5694
5599
  await this.libraryScript.removeLibrary(lib);
@@ -5696,8 +5601,8 @@ var LibraryCommand = class {
5696
5601
  async syncLibrary(lib) {
5697
5602
  await this.libraryScript.syncLibrary(lib);
5698
5603
  }
5699
- async installLibrary(name, workspace) {
5700
- await this.libraryScript.installLibrary(workspace, name);
5604
+ async installLibrary(libName, workspace) {
5605
+ await this.libraryScript.installLibrary(workspace, libName);
5701
5606
  }
5702
5607
  async pushLibrary(lib, branch) {
5703
5608
  await this.libraryScript.pushLibrary(lib, branch);
@@ -5708,7 +5613,7 @@ var LibraryCommand = class {
5708
5613
  };
5709
5614
  __decorateClass([
5710
5615
  Target.Public(),
5711
- __decorateParam(0, Option("name", { desc: "name of library" })),
5616
+ __decorateParam(0, Argument("libName", { desc: "name of library" })),
5712
5617
  __decorateParam(1, Workspace())
5713
5618
  ], LibraryCommand.prototype, "createLibrary", 1);
5714
5619
  __decorateClass([
@@ -5721,7 +5626,7 @@ __decorateClass([
5721
5626
  ], LibraryCommand.prototype, "syncLibrary", 1);
5722
5627
  __decorateClass([
5723
5628
  Target.Public(),
5724
- __decorateParam(0, Option("name", { desc: "name of library" })),
5629
+ __decorateParam(0, Argument("libName", { desc: "name of library", nullable: true })),
5725
5630
  __decorateParam(1, Workspace())
5726
5631
  ], LibraryCommand.prototype, "installLibrary", 1);
5727
5632
  __decorateClass([
@@ -5738,15 +5643,325 @@ LibraryCommand = __decorateClass([
5738
5643
  Commands()
5739
5644
  ], LibraryCommand);
5740
5645
 
5741
- // pkgs/@akanjs/cli/src/module/module.script.ts
5646
+ // pkgs/@akanjs/cli/src/module/module.command.ts
5742
5647
  import { select as select4 } from "@inquirer/prompts";
5648
+
5649
+ // pkgs/@akanjs/cli/src/module/module.script.ts
5743
5650
  import fs12 from "fs";
5744
5651
 
5652
+ // pkgs/@akanjs/cli/src/module/module.request.ts
5653
+ var requestConstant = ({
5654
+ sysName,
5655
+ modelName,
5656
+ modelDesc,
5657
+ modelSchemaDesign,
5658
+ boilerplate,
5659
+ exampleFiles
5660
+ }) => `
5661
+ \uB108\uB294 Akan.js\uB77C\uB294 \uC0AC\uB0B4 \uD504\uB808\uC784\uC6CC\uD06C\uB85C Typescript \uAE30\uBC18 \uD504\uB85C\uADF8\uB7A8\uC744 \uC791\uC131\uD558\uB294 \uC2DC\uB2C8\uC5B4 \uAC1C\uBC1C\uC790\uC57C.
5662
+ \uB2E4\uC74C\uC758 \uBC30\uACBD \uC815\uBCF4\uB97C \uBC14\uD0D5\uC73C\uB85C ${modelName}.constant.ts \uD30C\uC77C\uC744 \uC791\uC131\uD574\uC918.
5663
+
5664
+ 1. Akan.js \uD504\uB808\uC784\uC6CC\uD06C\uC5D0 \uB300\uD55C \uAC1C\uC694
5665
+ ${frameworkAbstract}
5666
+
5667
+ 2. <model>.constant.ts \uD30C\uC77C\uC5D0 \uB300\uD55C \uAC1C\uC694
5668
+ ${scalarConstantDescription}
5669
+
5670
+ 3. <model>.constant.ts \uD30C\uC77C\uC758 Enum \uC791\uC131\uBC95
5671
+ ${howToSetEnumInModelConstant}
5672
+
5673
+ 4. <model>.constant.ts \uD30C\uC77C\uC758 Field \uC791\uC131\uBC95
5674
+ ${howToSetFieldInModelConstant}
5675
+
5676
+ 5. \uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uB0B4 \uB2E4\uB978 constant.ts \uD30C\uC77C\uB4E4\uC5D0 \uB300\uD55C \uC608\uC2DC
5677
+ ${exampleFiles.map(
5678
+ (constant) => `
5679
+ Example file: ${constant.filepath}
5680
+ \`\`\`
5681
+ ${constant.content}
5682
+ \`\`\`
5683
+ `
5684
+ ).join("\n")}
5685
+
5686
+
5687
+ \uC704 \uB0B4\uC6A9\uB4E4\uC744 \uBC14\uD0D5\uC73C\uB85C \uD30C\uC2F1\uD558\uAE30 \uC27D\uAC8C \uC544\uB798\uC5D0 \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8\uC5D0 \uB9DE\uAC8C \uC815\uB9AC\uD574\uC11C \uC918
5688
+
5689
+ Application name: ${sysName}
5690
+ Model name: ${modelName}
5691
+ Model description: ${modelDesc}
5692
+ Model schema design: ${modelSchemaDesign}
5693
+
5694
+ Target filename: ${modelName}.constant.ts
5695
+ \`\`\`
5696
+ ${boilerplate}
5697
+ \`\`\`
5698
+ `;
5699
+ var requestDictionary = ({
5700
+ sysName,
5701
+ modelName,
5702
+ constant,
5703
+ modelDesc,
5704
+ modelSchemaDesign,
5705
+ boilerplate,
5706
+ exampleFiles
5707
+ }) => `
5708
+
5709
+
5710
+ -${modelName}\uC758 \uC2A4\uD0A4\uB9C8 \uC815\uC758.
5711
+ \`\`\`
5712
+ ${constant}
5713
+ \`\`\`
5714
+
5715
+ \uC5ED\uD560\uBD80\uC5EC
5716
+ - Akan.js \uC0AC\uB0B4 \uD504\uB808\uC784\uC6CC\uD06C \uAE30\uBC18 \uC720\uCC3D\uD55C \uBC88\uC5ED\uAC00.
5717
+
5718
+ \uC5C4\uACA9\uD55C \uC8FC\uC758\uC0AC\uD56D
5719
+ - \uBAA8\uB4E0 \uBB38\uC7A5\uC740 \uBB38\uBC95\uC801\uC73C\uB85C \uC62C\uBC14\uB974\uAC8C \uC791\uC131
5720
+ - \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8\uB0B4 signalDictionary \uBD80\uBD84\uC740 \uADF8\uB300\uB85C \uC720\uC9C0
5721
+
5722
+ \uC694\uCCAD\uC0AC\uD56D
5723
+ - \uC544\uB798 \uC81C\uACF5\uD560 \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8\uC5D0 \uB9DE\uCDB0 \uBC88\uC5ED\uBCF8 \uC18C\uC2A4\uCF54\uB4DC \uC81C\uACF5
5724
+
5725
+
5726
+
5727
+ Application name: ${sysName}
5728
+ Model name: ${modelName}
5729
+ Model description: ${modelDesc}
5730
+ Model schema design: ${modelSchemaDesign}
5731
+
5732
+ Target filename: ${modelName}.dictionary.ts
5733
+ \`\`\`
5734
+ ${boilerplate}
5735
+ \`\`\`
5736
+ `;
5737
+ var requestScalarConstant = ({
5738
+ sysName,
5739
+ modelName,
5740
+ modelDesc,
5741
+ modelSchemaDesign,
5742
+ boilerplate,
5743
+ exampleFiles
5744
+ }) => `
5745
+ \uB108\uB294 Akan.js\uB77C\uB294 \uC0AC\uB0B4 \uD504\uB808\uC784\uC6CC\uD06C\uB85C Typescript \uAE30\uBC18 \uD504\uB85C\uADF8\uB7A8\uC744 \uC791\uC131\uD558\uB294 \uC2DC\uB2C8\uC5B4 \uAC1C\uBC1C\uC790\uC57C.
5746
+ \uB2E4\uC74C\uC758 \uBC30\uACBD \uC815\uBCF4\uB97C \uBC14\uD0D5\uC73C\uB85C ${modelName}.constant.ts \uD30C\uC77C\uC744 \uC791\uC131\uD574\uC918.
5747
+
5748
+ 1. Akan.js \uD504\uB808\uC784\uC6CC\uD06C\uC5D0 \uB300\uD55C \uAC1C\uC694
5749
+ ${frameworkAbstract}
5750
+
5751
+ 2. <model>.constant.ts \uD30C\uC77C\uC5D0 \uB300\uD55C \uAC1C\uC694
5752
+ ${scalarConstantDescription}
5753
+
5754
+ 3. <model>.constant.ts \uD30C\uC77C\uC758 Enum \uC791\uC131\uBC95
5755
+ ${howToSetEnumInModelConstant}
5756
+
5757
+ 4. <model>.constant.ts \uD30C\uC77C\uC758 Field \uC791\uC131\uBC95
5758
+ ${howToSetFieldInModelConstant}
5759
+
5760
+ 5. \uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uB0B4 \uB2E4\uB978 constant.ts \uD30C\uC77C\uB4E4\uC5D0 \uB300\uD55C \uC608\uC2DC
5761
+ ${exampleFiles.map(
5762
+ (constant) => `
5763
+ Example file: ${constant.filepath}
5764
+ \`\`\`
5765
+ ${constant.content}
5766
+ \`\`\`
5767
+ `
5768
+ ).join("\n")}
5769
+
5770
+
5771
+ \uC704 \uB0B4\uC6A9\uB4E4\uC744 \uBC14\uD0D5\uC73C\uB85C \uD30C\uC2F1\uD558\uAE30 \uC27D\uAC8C \uC544\uB798\uC5D0 \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8\uC5D0 \uB9DE\uAC8C \uC815\uB9AC\uD574\uC11C \uC918
5772
+
5773
+ Application name: ${sysName}
5774
+ Model name: ${modelName}
5775
+ Model description: ${modelDesc}
5776
+ Model schema design: ${modelSchemaDesign}
5777
+
5778
+ Target filename: ${modelName}.constant.ts
5779
+ \`\`\`
5780
+ ${boilerplate}
5781
+ \`\`\`
5782
+ `;
5783
+ var requestTemplate = ({
5784
+ sysName,
5785
+ modelName,
5786
+ ModelName,
5787
+ boilerplate,
5788
+ constant,
5789
+ properties,
5790
+ exampleFiles
5791
+ }) => `
5792
+ ${componentDefaultDescription({
5793
+ sysName,
5794
+ modelName,
5795
+ ModelName: ModelName ?? capitalize(modelName),
5796
+ exampleFiles,
5797
+ constant,
5798
+ properties
5799
+ })}
5800
+ \uC5ED\uD560\uBD80\uC5EC
5801
+ - Akan.js \uC0AC\uB0B4 \uD504\uB808\uC784\uC6CC\uD06C \uAE30\uBC18 Typescript \uC2DC\uB2C8\uC5B4 \uD504\uB860\uD2B8\uC5D4\uB4DC \uAC1C\uBC1C\uC790.
5802
+
5803
+ \uCF54\uB529 \uADDC\uCE59
5804
+ - \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC0AC\uC6A9
5805
+ - \uC544\uC774\uCF58: react-icons \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC0AC\uC6A9
5806
+ - CSS: tailwind, DaisyUI(btn, input, badge \uAC19\uC740 \uAE30\uBCF8 \uC694\uC18C\uB9CC \uC0AC\uC6A9 \uAC00\uB2A5, card/hero \uAC19\uC740 \uBCF5\uC7A1\uD55C \uCEF4\uD3EC\uB10C\uD2B8 \uC0AC\uC6A9 X) \uC0AC\uC6A9
5807
+ - Ui Component: @util/ui \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC0AC\uC6A9
5808
+ - \uC870\uAC74\uBD80 \uD074\uB798\uC2A4: clsx \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC0AC\uC6A9
5809
+ \uCF54\uB4DC \uC2A4\uD0C0\uC77C
5810
+ - \uC0C9\uC0C1: \uD558\uB4DC\uCF54\uB529(bg-red) \uB300\uC2E0 \uD14C\uB9C8 \uC0C9\uC0C1(bg-primary) \uC0AC\uC6A9
5811
+ - \uC870\uAC74\uBD80 \uB80C\uB354\uB9C1: field && <div>... \uB300\uC2E0 field ? <div>... : null \uC0AC\uC6A9
5812
+ - \uBAA8\uB378 \uC811\uADFC: \uAD6C\uC870\uBD84\uD574\uD560\uB2F9 \uB300\uC2E0 ${modelName}.field \uD615\uC2DD\uC73C\uB85C \uC811\uADFC
5813
+ - \uD0C0\uC785 \uC548\uC804: ${modelName}.constant.ts\uC758 \uC2A4\uD0A4\uB9C8 \uCC38\uC870\uD558\uC5EC \uC5D0\uB7EC \uBC29\uC9C0
5814
+ \uD544\uB4DC \uC811\uADFC \uC804: \uC2A4\uD0A4\uB9C8\uC758 \uC2E4\uC81C \uD544\uB4DC \uB9AC\uC2A4\uD2B8 \uC791\uC131 \uBC0F \uAC80\uD1A0 \uD544\uC218
5815
+
5816
+ \uC5C4\uACA9\uD55C \uC8FC\uC758\uC0AC\uD56D
5817
+ - UI \uD0B7\uC740 \uBB38\uC11C\uC5D0 \uBA85\uC2DC\uB41C \uCEF4\uD3EC\uB10C\uD2B8\uB9CC \uC0AC\uC6A9
5818
+ - \uCEF4\uD3EC\uB10C\uD2B8 \uC0AC\uC6A9 \uC804 \uBB38\uC11C \uD655\uC778 \uBC0F props \uC815\uD655\uD788 \uAC80\uC99D
5819
+ - \uBA85\uC2DC\uB41C \uB8F0 \uC678 \uC784\uC758 \uCD94\uC0C1\uD654 \uAE08\uC9C0
5820
+ - dayjs \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB294 @akanjs/base\uC5D0\uC11C \uB798\uD551\uD558\uC5EC \uC81C\uACF5\uD558\uACE0 \uC788\uC74C.
5821
+
5822
+ \uC694\uCCAD\uC0AC\uD56D
5823
+ - \uC544\uB798 \uC81C\uACF5\uD560 \uAE30\uBCF8 \uD15C\uD50C\uB9BF \uCF54\uB4DC\uC5D0 \uCD94\uAC00\uB85C \uCEF4\uD3EC\uB10C\uD2B8 \uAC1C\uBC1C
5824
+ - ${ModelName}.Template.tsx \uCF54\uB4DC \uC791\uC131
5825
+ - \uCEF4\uD3EC\uB10C\uD2B8 \uC774\uB984\uC740 \uBAA8\uB378 \uC774\uB984\uC740 \uC2A4\uD0A4\uB9C8\uC5D0 \uAE30\uBC18\uD55C \uAE30\uB2A5\uC5D0 \uCD08\uC810\uC744 \uB450\uACE0 \uC791\uC131
5826
+ - \uC544\uB798 \uC81C\uACF5\uD560 \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8\uC5D0 \uC788\uB294 General \uCEF4\uD3EC\uB10C\uD2B8 1\uAC1C\uB97C \uC81C\uC678\uD55C \uB514\uC790\uC778 \uCEF4\uD3EC\uB10C\uD2B8 4\uAC1C \uAC1C\uBC1C
5827
+ - \uCD94\uC0C1\uD654 \uD574\uC57C\uD558\uB294 \uACBD\uC6B0\uAC00 \uC788\uC744 \uACBD\uC6B0\uC5D4 \uBB38\uC11C\uB97C \uB2E4\uC2DC \uCC38\uACE0\uD558\uACE0 \uC124\uBA85\uB41C \uB0B4\uC5D0\uC11C \uD574\uACB0\uD574\uC57C\uD568.
5828
+ - \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8\uC5D0 \uB9DE\uAC8C \uC815\uB9AC\uD574\uC11C \uC81C\uACF5
5829
+ -
5830
+
5831
+ Application name: ${sysName}
5832
+ Model name: ${modelName}
5833
+ Target filename: ${ModelName}.Template.tsx
5834
+ \`\`\`
5835
+ ${boilerplate}
5836
+ \`\`\`
5837
+
5838
+
5839
+ `;
5840
+ var requestView = ({
5841
+ sysName,
5842
+ modelName,
5843
+ ModelName,
5844
+ boilerplate,
5845
+ constant,
5846
+ properties,
5847
+ exampleFiles
5848
+ }) => `
5849
+ ${componentDefaultDescription({
5850
+ sysName,
5851
+ modelName,
5852
+ ModelName: ModelName ?? capitalize(modelName),
5853
+ exampleFiles,
5854
+ constant,
5855
+ properties
5856
+ })}
5857
+
5858
+ \uC5ED\uD560\uBD80\uC5EC
5859
+ - Akan.js \uC0AC\uB0B4 \uD504\uB808\uC784\uC6CC\uD06C \uAE30\uBC18 Typescript \uC2DC\uB2C8\uC5B4 \uD504\uB860\uD2B8\uC5D4\uB4DC \uAC1C\uBC1C\uC790.
5860
+
5861
+ \uCF54\uB529 \uADDC\uCE59
5862
+ - \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC0AC\uC6A9
5863
+ - \uC544\uC774\uCF58: react-icons \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC0AC\uC6A9
5864
+ - CSS: tailwind, DaisyUI(btn, input, badge \uAC19\uC740 \uAE30\uBCF8 \uC694\uC18C\uB9CC \uC0AC\uC6A9 \uAC00\uB2A5, card/hero \uAC19\uC740 \uBCF5\uC7A1\uD55C \uCEF4\uD3EC\uB10C\uD2B8 \uC0AC\uC6A9 X) \uC0AC\uC6A9
5865
+ - Ui Component: @util/ui \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC0AC\uC6A9
5866
+ - \uC870\uAC74\uBD80 \uD074\uB798\uC2A4: clsx \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC0AC\uC6A9
5867
+ \uCF54\uB4DC \uC2A4\uD0C0\uC77C
5868
+ - \uC0C9\uC0C1: \uD558\uB4DC\uCF54\uB529(bg-red) \uB300\uC2E0 \uD14C\uB9C8 \uC0C9\uC0C1(bg-primary) \uC0AC\uC6A9
5869
+ - \uC870\uAC74\uBD80 \uB80C\uB354\uB9C1: field && <div>... \uB300\uC2E0 field ? <div>... : null \uC0AC\uC6A9
5870
+ - \uBAA8\uB378 \uC811\uADFC: \uAD6C\uC870\uBD84\uD574\uD560\uB2F9 \uB300\uC2E0 ${modelName}.field \uD615\uC2DD\uC73C\uB85C \uC811\uADFC
5871
+ - \uD0C0\uC785 \uC548\uC804: ${modelName}.constant.ts\uC758 \uC2A4\uD0A4\uB9C8 \uCC38\uC870\uD558\uC5EC \uC5D0\uB7EC \uBC29\uC9C0
5872
+ \uD544\uB4DC \uC811\uADFC \uC804: \uC2A4\uD0A4\uB9C8\uC758 \uC2E4\uC81C \uD544\uB4DC \uB9AC\uC2A4\uD2B8 \uC791\uC131 \uBC0F \uAC80\uD1A0 \uD544\uC218
5873
+
5874
+ \uC5C4\uACA9\uD55C \uC8FC\uC758\uC0AC\uD56D
5875
+ - UI \uD0B7\uC740 \uBB38\uC11C\uC5D0 \uBA85\uC2DC\uB41C \uCEF4\uD3EC\uB10C\uD2B8\uB9CC \uC0AC\uC6A9
5876
+ - \uCEF4\uD3EC\uB10C\uD2B8 \uC0AC\uC6A9 \uC804 \uBB38\uC11C \uD655\uC778 \uBC0F props \uC815\uD655\uD788 \uAC80\uC99D
5877
+ - \uBA85\uC2DC\uB41C \uB8F0 \uC678 \uC784\uC758 \uCD94\uC0C1\uD654 \uAE08\uC9C0
5878
+ - dayjs \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB294 @akanjs/base\uC5D0\uC11C \uB798\uD551\uD558\uC5EC \uC81C\uACF5\uD558\uACE0 \uC788\uC74C.
5879
+
5880
+ \uC694\uCCAD\uC0AC\uD56D
5881
+ - \uC544\uB798 \uC81C\uACF5\uD560 \uAE30\uBCF8 \uD15C\uD50C\uB9BF \uCF54\uB4DC\uC5D0 \uCD94\uAC00\uB85C \uCEF4\uD3EC\uB10C\uD2B8 \uAC1C\uBC1C
5882
+ - ${ModelName}.View.tsx \uCF54\uB4DC \uC791\uC131
5883
+ - \uCEF4\uD3EC\uB10C\uD2B8 \uC774\uB984\uC5D0 ${ModelName}\uC740 \uC0DD\uB7B5\uD558\uBA70, \uB514\uC790\uC778 \uC911\uC810\uC758 \uC774\uB984\uC73C\uB85C \uC791\uC131
5884
+ - \uC544\uB798 \uC81C\uACF5\uD560 \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8\uC5D0 \uC788\uB294 General \uCEF4\uD3EC\uB10C\uD2B8 1\uAC1C\uB97C \uC81C\uC678\uD55C \uB514\uC790\uC778 \uCEF4\uD3EC\uB10C\uD2B8 4\uAC1C \uAC1C\uBC1C
5885
+ - \uCD94\uC0C1\uD654 \uD574\uC57C\uD558\uB294 \uACBD\uC6B0\uAC00 \uC788\uC744 \uACBD\uC6B0\uC5D4 \uBB38\uC11C\uB97C \uB2E4\uC2DC \uCC38\uACE0\uD558\uACE0 \uC124\uBA85\uB41C \uB0B4\uC5D0\uC11C \uD574\uACB0\uD574\uC57C\uD568.
5886
+ - \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8\uC5D0 \uB9DE\uAC8C \uC815\uB9AC\uD574\uC11C \uC81C\uACF5
5887
+
5888
+
5889
+ Application name: ${sysName}
5890
+ Model name: ${modelName}
5891
+
5892
+ Target filename: ${ModelName}.View.tsx
5893
+ \`\`\`
5894
+ ${boilerplate}
5895
+ \`\`\`
5896
+
5897
+
5898
+ `;
5899
+ var requestUnit = ({
5900
+ sysName,
5901
+ modelName,
5902
+ ModelName,
5903
+ constant,
5904
+ properties,
5905
+ boilerplate,
5906
+ exampleFiles
5907
+ }) => `
5908
+ ${componentDefaultDescription({
5909
+ sysName,
5910
+ modelName,
5911
+ ModelName: ModelName ?? capitalize(modelName),
5912
+ exampleFiles,
5913
+ constant,
5914
+ properties
5915
+ })}
5916
+
5917
+ \uC5ED\uD560\uBD80\uC5EC
5918
+ - Akan.js \uC0AC\uB0B4 \uD504\uB808\uC784\uC6CC\uD06C \uAE30\uBC18 Typescript \uC2DC\uB2C8\uC5B4 \uD504\uB860\uD2B8\uC5D4\uB4DC \uAC1C\uBC1C\uC790.
5919
+
5920
+ \uCF54\uB529 \uADDC\uCE59
5921
+ - \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC0AC\uC6A9
5922
+ - \uC544\uC774\uCF58: react-icons \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC0AC\uC6A9
5923
+ - CSS: tailwind, DaisyUI(btn, input, badge \uAC19\uC740 \uAE30\uBCF8 \uC694\uC18C\uB9CC \uC0AC\uC6A9 \uAC00\uB2A5, card/hero \uAC19\uC740 \uBCF5\uC7A1\uD55C \uCEF4\uD3EC\uB10C\uD2B8 \uC0AC\uC6A9 X) \uC0AC\uC6A9
5924
+ - Ui Component: @util/ui \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC0AC\uC6A9
5925
+ - \uC870\uAC74\uBD80 \uD074\uB798\uC2A4: clsx \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC0AC\uC6A9
5926
+ \uCF54\uB4DC \uC2A4\uD0C0\uC77C
5927
+ - \uC0C9\uC0C1: \uD558\uB4DC\uCF54\uB529(bg-red) \uB300\uC2E0 \uD14C\uB9C8 \uC0C9\uC0C1(bg-primary) \uC0AC\uC6A9
5928
+ - \uC870\uAC74\uBD80 \uB80C\uB354\uB9C1: field && <div>... \uB300\uC2E0 field ? <div>... : null \uC0AC\uC6A9
5929
+ - \uBAA8\uB378 \uC811\uADFC: \uAD6C\uC870\uBD84\uD574\uD560\uB2F9 \uB300\uC2E0 ${modelName}.field \uD615\uC2DD\uC73C\uB85C \uC811\uADFC
5930
+ - \uD0C0\uC785 \uC548\uC804: ${modelName}.constant.ts\uC758 \uC2A4\uD0A4\uB9C8 \uCC38\uC870\uD558\uC5EC \uC5D0\uB7EC \uBC29\uC9C0
5931
+ \uD544\uB4DC \uC811\uADFC \uC804: \uC2A4\uD0A4\uB9C8\uC758 \uC2E4\uC81C \uD544\uB4DC \uB9AC\uC2A4\uD2B8 \uC791\uC131 \uBC0F \uAC80\uD1A0 \uD544\uC218
5932
+
5933
+ \uC5C4\uACA9\uD55C \uC8FC\uC758\uC0AC\uD56D
5934
+ - UI \uD0B7\uC740 \uBB38\uC11C\uC5D0 \uBA85\uC2DC\uB41C \uCEF4\uD3EC\uB10C\uD2B8\uB9CC \uC0AC\uC6A9
5935
+ - \uCEF4\uD3EC\uB10C\uD2B8 \uC0AC\uC6A9 \uC804 \uBB38\uC11C \uD655\uC778 \uBC0F props \uC815\uD655\uD788 \uAC80\uC99D
5936
+ - \uBA85\uC2DC\uB41C \uB8F0 \uC678 \uC784\uC758 \uCD94\uC0C1\uD654 \uAE08\uC9C0
5937
+ - dayjs \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB294 @akanjs/base\uC5D0\uC11C \uB798\uD551\uD558\uC5EC \uC81C\uACF5\uD558\uACE0 \uC788\uC74C.
5938
+
5939
+ \uC694\uCCAD\uC0AC\uD56D
5940
+ - \uC544\uB798 \uC81C\uACF5\uD560 \uAE30\uBCF8 \uD15C\uD50C\uB9BF \uCF54\uB4DC\uC5D0 \uCD94\uAC00\uB85C \uCEF4\uD3EC\uB10C\uD2B8 \uAC1C\uBC1C
5941
+ - ${ModelName}.Unit.tsx \uCF54\uB4DC \uC791\uC131
5942
+ - \uCEF4\uD3EC\uB10C\uD2B8 \uC774\uB984\uC5D0 ${ModelName}\uC740 \uC0DD\uB7B5\uD558\uBA70, \uB514\uC790\uC778 \uC911\uC810\uC758 \uC774\uB984\uC73C\uB85C \uC791\uC131
5943
+ - \uC608\uC2DC\uD30C\uC77C \uCEF4\uD3EC\uB10C\uD2B8\uC758 \uAE30\uBC18\uD558\uC5EC \uC77C\uBC18\uC801\uC73C\uB85C \uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uCEF4\uD3EC\uB10C\uD2B8 1\uAC1C\uC640 \uB514\uC790\uC778\uC801 \uC694\uC18C\uAC00 \uD3EC\uD568\uB41C \uCEF4\uD3EC\uB10C\uD2B8 3\uAC1C \uAC1C\uBC1C
5944
+ - \uCD94\uC0C1\uD654 \uD574\uC57C\uD558\uB294 \uACBD\uC6B0\uAC00 \uC788\uC744 \uACBD\uC6B0\uC5D4 \uBB38\uC11C\uB97C \uB2E4\uC2DC \uCC38\uACE0\uD558\uACE0 \uC124\uBA85\uB41C \uB0B4\uC5D0\uC11C \uD574\uACB0\uD574\uC57C\uD568.
5945
+ - \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8\uC5D0 \uB9DE\uAC8C \uC815\uB9AC\uD574\uC11C \uC81C\uACF5
5946
+
5947
+
5948
+ Application name: ${sysName}
5949
+ Model name: ${modelName}
5950
+
5951
+ Target filename: ${ModelName}.Unit.tsx
5952
+ \`\`\`
5953
+ ${boilerplate}
5954
+ \`\`\`
5955
+
5956
+
5957
+ `;
5958
+
5745
5959
  // pkgs/@akanjs/cli/src/module/module.runner.ts
5746
5960
  var ModuleRunner = class {
5747
5961
  async createModule(workspace, sysType, sysName, moduleName, description) {
5748
5962
  }
5749
- async removeModule(workspace, name) {
5963
+ removeModule(sys2, name) {
5964
+ sys2.removeDir(`${sys2.cwdPath}/lib/${name}`);
5750
5965
  }
5751
5966
  async createScalarTemplate(sys2, name) {
5752
5967
  const akanConfig = await sys2.getConfig();
@@ -5774,11 +5989,25 @@ var ModuleRunner = class {
5774
5989
  }
5775
5990
  };
5776
5991
  }
5992
+ async createDictionaryTemplate(sys2, name) {
5993
+ const akanConfig = await sys2.getConfig();
5994
+ const scanResult = await sys2.scan({ akanConfig });
5995
+ await sys2.applyTemplate({
5996
+ basePath: `./lib/${name}`,
5997
+ template: "dictionary",
5998
+ scanResult,
5999
+ dict: { model: name, Model: capitalize(name), sysName: sys2.name, SysName: capitalize(sys2.name) }
6000
+ });
6001
+ await sys2.scan({ akanConfig });
6002
+ return {
6003
+ dictionary: { filename: `${name}.dictionary.ts`, content: sys2.readFile(`lib/${name}/${name}.dictionary.ts`) }
6004
+ };
6005
+ }
5777
6006
  async createComponentTemplate(sys2, name, type) {
5778
6007
  const akanConfig = await sys2.getConfig();
5779
6008
  const scanResult = await sys2.scan({ akanConfig });
5780
6009
  await sys2.applyTemplate({
5781
- basePath: `./lib/${name}__`,
6010
+ basePath: `./lib/${name}`,
5782
6011
  template: `module/__Model__.${capitalize(type)}.ts`,
5783
6012
  scanResult,
5784
6013
  dict: { model: name, Model: capitalize(name), appName: sys2.name }
@@ -5787,7 +6016,7 @@ var ModuleRunner = class {
5787
6016
  return {
5788
6017
  component: {
5789
6018
  filename: `${name}.${capitalize(type)}.tsx`,
5790
- content: sys2.readFile(`lib/${name}__/${capitalize(name)}.${capitalize(type)}.tsx`)
6019
+ content: sys2.readFile(`lib/${name}/${capitalize(name)}.${capitalize(type)}.tsx`)
5791
6020
  }
5792
6021
  // constant: {
5793
6022
  // filename: `${name}.constant.ts`,
@@ -5866,31 +6095,62 @@ var ModuleRunner = class {
5866
6095
  // pkgs/@akanjs/cli/src/module/module.script.ts
5867
6096
  var ModuleScript = class {
5868
6097
  #runner = new ModuleRunner();
5869
- async createModuleTemplate(sys2, name) {
6098
+ //! .command arg에 병합 필요.
6099
+ async createModuleTemplate(sys2, name, description) {
5870
6100
  await this.#runner.createModuleTemplate(sys2, name);
6101
+ }
6102
+ async createModule(sys2, name, description, schemaDescription) {
6103
+ await AiSession.init();
6104
+ const session = new AiSession();
6105
+ const [appNames, libNames] = await sys2.workspace.getSyss();
6106
+ const moduleConstantExampleFiles = await sys2.workspace.getConstantFiles();
6107
+ const moduleDictionaryExampleFiles = await sys2.workspace.getDictionaryFiles();
6108
+ const { constant, dictionary } = await this.#runner.createModuleTemplate(sys2, name);
6109
+ sys2.log(`Module ${name} created in ${sys2.type}s/${sys2.name}/lib/${name}`);
6110
+ const constantContent = await session.editTypescript(
6111
+ requestConstant({
6112
+ sysName: sys2.name,
6113
+ modelName: name,
6114
+ modelDesc: description ?? "",
6115
+ modelSchemaDesign: schemaDescription ?? "",
6116
+ boilerplate: constant.content,
6117
+ exampleFiles: randomPicks(moduleConstantExampleFiles, Math.min(10, moduleConstantExampleFiles.length))
6118
+ })
6119
+ );
6120
+ sys2.writeFile(`lib/${name}/${name}.constant.ts`, constantContent);
6121
+ const dictionaryContent = await session.editTypescript(
6122
+ requestDictionary({
6123
+ sysName: sys2.name,
6124
+ modelName: name,
6125
+ constant: constantContent,
6126
+ modelDesc: description ?? "",
6127
+ modelSchemaDesign: schemaDescription ?? "",
6128
+ boilerplate: dictionary.content,
6129
+ exampleFiles: randomPicks(moduleConstantExampleFiles, Math.min(10, moduleConstantExampleFiles.length))
6130
+ })
6131
+ );
6132
+ sys2.writeFile(`lib/${name}/${name}.dictionary.ts`, dictionaryContent);
6133
+ await this.createView(sys2, name);
6134
+ await this.createUnit(sys2, name);
6135
+ await this.createTemplate(sys2, name);
5871
6136
  sys2.log(`Module ${name} created in ${sys2.type}s/${sys2.name}/lib/${name}`);
5872
6137
  }
5873
- async createModule(sys2) {
6138
+ async createModule_(sys2, name, description, schemaDescription) {
6139
+ await AiSession.init();
6140
+ const session = new AiSession();
5874
6141
  const [appNames, libNames] = await sys2.workspace.getSyss();
5875
- const constantExampleFiles = [
5876
- ...(await Promise.all(
5877
- appNames.map(async (appName) => {
5878
- const app = AppExecutor.from(sys2.workspace, appName);
5879
- const databaseModules = await app.getDatabaseModules();
5880
- return await Promise.all(
5881
- databaseModules.map((databaseModule) => ({
5882
- path: `${appName}/${databaseModule}/${databaseModule}.constant.ts`,
5883
- content: app.readFile(`lib/${databaseModule}/${databaseModule}.constant.ts`)
5884
- }))
5885
- );
5886
- })
5887
- )).flat()
5888
- ];
6142
+ const moduleConstantExampleFiles = await sys2.workspace.getConstantFiles();
6143
+ const moduleDictionaryExampleFiles = await sys2.workspace.getDictionaryFiles();
6144
+ sys2.log(`Module ${name} created in ${sys2.type}s/${sys2.name}/lib/${name}`);
6145
+ await this.createView(sys2, name);
6146
+ await this.createUnit(sys2, name);
6147
+ await this.createTemplate(sys2, name);
6148
+ sys2.log(`Module ${name} created in ${sys2.type}s/${sys2.name}/lib/${name}`);
5889
6149
  }
5890
- async removeModule(workspace, name) {
6150
+ removeModule(sys2, name) {
6151
+ this.#runner.removeModule(sys2, name);
5891
6152
  }
5892
6153
  async createScalar(sys2, name, description, schemaDescription) {
5893
- await AiSession.init();
5894
6154
  await AiSession.init();
5895
6155
  const scalarConstantExampleFiles = await sys2.workspace.getScalarConstantFiles();
5896
6156
  const { constant, dictionary } = await this.#runner.createScalarTemplate(sys2, name);
@@ -5902,7 +6162,7 @@ var ModuleScript = class {
5902
6162
  modelDesc: description,
5903
6163
  modelSchemaDesign: schemaDescription,
5904
6164
  boilerplate: constant.content,
5905
- otherConstants: randomPicks(scalarConstantExampleFiles, Math.min(10, scalarConstantExampleFiles.length))
6165
+ exampleFiles: randomPicks(scalarConstantExampleFiles, Math.min(10, scalarConstantExampleFiles.length))
5906
6166
  })
5907
6167
  );
5908
6168
  sys2.writeFile(`lib/__scalar/${name}/${name}.constant.ts`, content);
@@ -5911,21 +6171,8 @@ var ModuleScript = class {
5911
6171
  }
5912
6172
  async createTest(workspace, name) {
5913
6173
  }
5914
- async createTemplate(sys2) {
6174
+ async createTemplate(sys2, name) {
5915
6175
  await AiSession.init();
5916
- const libs = await sys2.getModules();
5917
- const lib = await select4({
5918
- message: "Select the lib",
5919
- choices: libs
5920
- }).catch((e) => {
5921
- Logger.error("canceled");
5922
- return null;
5923
- });
5924
- if (!lib)
5925
- return;
5926
- const name = lib.split("/").pop();
5927
- if (!name)
5928
- return;
5929
6176
  const { component: template } = await this.#runner.createComponentTemplate(sys2, name, "template");
5930
6177
  const templateExampleFiles = (await sys2.getTemplatesSourceCode()).filter(
5931
6178
  (f) => !f.filepath.includes(`${name}.Template.tsx`)
@@ -5944,25 +6191,10 @@ var ModuleScript = class {
5944
6191
  exampleFiles: randomPicks(templateExampleFiles, Math.min(20, templateExampleFiles.length))
5945
6192
  });
5946
6193
  const content = await session.editTypescript(promptRst);
5947
- fs12.writeFileSync(`${sys2.cwdPath}/promptTemplate.txt`, promptRst);
5948
- fs12.writeFileSync(`${sys2.cwdPath}/resultTemplate.txt`, content);
5949
- sys2.writeFile(`lib/${name}__/${Name}.Template.tsx`, content);
6194
+ sys2.writeFile(`lib/${name}/${Name}.Template.tsx`, content);
5950
6195
  }
5951
- async createUnit(sys2) {
6196
+ async createUnit(sys2, name) {
5952
6197
  await AiSession.init();
5953
- const libs = await sys2.getModules();
5954
- const lib = await select4({
5955
- message: "Select the lib",
5956
- choices: libs
5957
- }).catch((e) => {
5958
- Logger.error("canceled");
5959
- return null;
5960
- });
5961
- if (!lib)
5962
- return;
5963
- const name = lib.split("/").pop();
5964
- if (!name)
5965
- return;
5966
6198
  const { component: unit } = await this.#runner.createComponentTemplate(sys2, name, "unit");
5967
6199
  const Name = capitalize(name);
5968
6200
  const unitExampleFiles = (await sys2.getUnitsSourceCode()).filter((f) => !f.filepath.includes(`${name}.Unit.tsx`));
@@ -5979,25 +6211,10 @@ var ModuleScript = class {
5979
6211
  boilerplate: unit.content
5980
6212
  });
5981
6213
  const content = await session.editTypescript(promptRst);
5982
- fs12.writeFileSync(`${sys2.cwdPath}/promptUnit.txt`, promptRst);
5983
- fs12.writeFileSync(`${sys2.cwdPath}/resultUnit.txt`, content);
5984
- sys2.writeFile(`lib/${name}__/${Name}.Unit.tsx`, content);
6214
+ sys2.writeFile(`lib/${name}/${Name}.Unit.tsx`, content);
5985
6215
  }
5986
- async createView(sys2) {
6216
+ async createView(sys2, name) {
5987
6217
  await AiSession.init();
5988
- const libs = await sys2.getModules();
5989
- const lib = await select4({
5990
- message: "Select the lib",
5991
- choices: libs
5992
- }).catch((e) => {
5993
- Logger.error("canceled");
5994
- return null;
5995
- });
5996
- if (!lib)
5997
- return;
5998
- const name = lib.split("/").pop();
5999
- if (!name)
6000
- return;
6001
6218
  const { component: view } = await this.#runner.createComponentTemplate(sys2, name, "view");
6002
6219
  const viewExampleFiles = (await sys2.getViewsSourceCode()).filter((f) => !f.filepath.includes(`${name}.View.tsx`));
6003
6220
  const Name = capitalize(name);
@@ -6014,73 +6231,82 @@ var ModuleScript = class {
6014
6231
  exampleFiles: randomPicks(viewExampleFiles, Math.min(20, viewExampleFiles.length))
6015
6232
  });
6016
6233
  const content = await session.editTypescript(promptRst);
6017
- fs12.writeFileSync(`${sys2.cwdPath}/prompt.txt`, promptRst);
6018
- fs12.writeFileSync(`${sys2.cwdPath}/result.txt`, content);
6019
- sys2.writeFile(`lib/${name}__/${Name}.View.tsx`, content);
6234
+ sys2.writeFile(`lib/${name}/${Name}.View.tsx`, content);
6020
6235
  }
6021
6236
  };
6022
6237
 
6023
6238
  // pkgs/@akanjs/cli/src/module/module.command.ts
6024
6239
  var ModuleCommand = class {
6025
6240
  moduleScript = new ModuleScript();
6026
- async createModule(sys2, name, workspace) {
6027
- await this.moduleScript.createModuleTemplate(sys2, lowerlize(name));
6028
- }
6029
- async removeModule(name, workspace) {
6030
- }
6031
- async scanModule(name, workspace) {
6241
+ async selectLib(sys2) {
6242
+ const libs = await sys2.getModules();
6243
+ const lib = await select4({
6244
+ message: "Select the lib",
6245
+ choices: libs.map((l) => `${sys2.name}/${l}`)
6246
+ }).catch((e) => {
6247
+ Logger.error("canceled");
6248
+ return null;
6249
+ });
6250
+ return lib?.split("/").pop();
6032
6251
  }
6033
- async createScalar(sys2, name, description, schemaDescription, workspace) {
6034
- await this.moduleScript.createScalar(sys2, lowerlize(name), description, schemaDescription);
6252
+ async createModule(sys2, moduleName, description, schemaDescription, ai, workspace) {
6253
+ const name = lowerlize(moduleName.replace(/ /g, ""));
6254
+ if (ai) {
6255
+ await this.moduleScript.createModule(sys2, name, description, schemaDescription);
6256
+ } else {
6257
+ await this.moduleScript.createModuleTemplate(sys2, name);
6258
+ }
6035
6259
  }
6036
- async createService(name, workspace) {
6260
+ async removeModule(sys2, workspace) {
6261
+ const name = await this.selectLib(sys2);
6262
+ if (!name)
6263
+ return;
6264
+ this.moduleScript.removeModule(sys2, name);
6037
6265
  }
6038
- async createTest(name, workspace) {
6266
+ async createScalar(sys2, scalarName, description, schemaDescription, workspace) {
6267
+ await this.moduleScript.createScalar(sys2, lowerlize(scalarName.replace(/ /g, "")), description, schemaDescription);
6039
6268
  }
6040
6269
  async createView(sys2, workspace) {
6041
- await this.moduleScript.createView(sys2);
6270
+ const name = await this.selectLib(sys2);
6271
+ if (!name)
6272
+ return;
6273
+ await this.moduleScript.createView(sys2, name);
6042
6274
  }
6043
6275
  async createUnit(sys2, workspace) {
6044
- await this.moduleScript.createUnit(sys2);
6276
+ const name = await this.selectLib(sys2);
6277
+ if (!name)
6278
+ return;
6279
+ await this.moduleScript.createUnit(sys2, name);
6045
6280
  }
6046
6281
  async createTemplate(sys2, workspace) {
6047
- await this.moduleScript.createTemplate(sys2);
6282
+ const name = await this.selectLib(sys2);
6283
+ if (!name)
6284
+ return;
6285
+ await this.moduleScript.createTemplate(sys2, name);
6048
6286
  }
6049
6287
  };
6050
6288
  __decorateClass([
6051
6289
  Target.Public(),
6052
6290
  __decorateParam(0, Sys()),
6053
- __decorateParam(1, Option("name", { desc: "name of module" })),
6054
- __decorateParam(2, Workspace())
6291
+ __decorateParam(1, Argument("moduleName", { desc: "name of module" })),
6292
+ __decorateParam(2, Option("description", { desc: "description of module" })),
6293
+ __decorateParam(3, Option("schemaDescription", { desc: "schema description of module" })),
6294
+ __decorateParam(4, Option("ai", { type: "boolean", default: false, desc: "use ai to create module" })),
6295
+ __decorateParam(5, Workspace())
6055
6296
  ], ModuleCommand.prototype, "createModule", 1);
6056
6297
  __decorateClass([
6057
6298
  Target.Public(),
6058
- __decorateParam(0, Option("name", { desc: "name of module" })),
6299
+ __decorateParam(0, Sys()),
6059
6300
  __decorateParam(1, Workspace())
6060
6301
  ], ModuleCommand.prototype, "removeModule", 1);
6061
- __decorateClass([
6062
- Target.Public(),
6063
- __decorateParam(0, Option("name", { desc: "name of module" })),
6064
- __decorateParam(1, Workspace())
6065
- ], ModuleCommand.prototype, "scanModule", 1);
6066
6302
  __decorateClass([
6067
6303
  Target.Public(),
6068
6304
  __decorateParam(0, Sys()),
6069
- __decorateParam(1, Option("name", { desc: "name of scalar module" })),
6305
+ __decorateParam(1, Argument("scalarName", { desc: "name of scalar module" })),
6070
6306
  __decorateParam(2, Option("description", { desc: "description of scalar module" })),
6071
6307
  __decorateParam(3, Option("schemaDescription", { desc: "schema description of scalar module" })),
6072
6308
  __decorateParam(4, Workspace())
6073
6309
  ], ModuleCommand.prototype, "createScalar", 1);
6074
- __decorateClass([
6075
- Target.Public(),
6076
- __decorateParam(0, Option("name", { desc: "name of service module" })),
6077
- __decorateParam(1, Workspace())
6078
- ], ModuleCommand.prototype, "createService", 1);
6079
- __decorateClass([
6080
- Target.Public(),
6081
- __decorateParam(0, Option("name", { desc: "name of test module" })),
6082
- __decorateParam(1, Workspace())
6083
- ], ModuleCommand.prototype, "createTest", 1);
6084
6310
  __decorateClass([
6085
6311
  Target.Public(),
6086
6312
  __decorateParam(0, Sys()),
@@ -6331,8 +6557,12 @@ var WorkspaceScript = class {
6331
6557
  // pkgs/@akanjs/cli/src/workspace/workspace.command.ts
6332
6558
  var WorkspaceCommand = class {
6333
6559
  workspaceScript = new WorkspaceScript();
6334
- async createWorkspace(name, app, dir) {
6335
- await this.workspaceScript.createWorkspace(name, app.toLowerCase().replace(/ /g, "-"), dir);
6560
+ async createWorkspace(workspaceName, app, dir) {
6561
+ await this.workspaceScript.createWorkspace(
6562
+ workspaceName.toLowerCase().replace(/ /g, "-"),
6563
+ app.toLowerCase().replace(/ /g, "-"),
6564
+ dir
6565
+ );
6336
6566
  }
6337
6567
  async generateMongo(workspace) {
6338
6568
  await this.workspaceScript.generateMongo(workspace);
@@ -6346,7 +6576,7 @@ var WorkspaceCommand = class {
6346
6576
  };
6347
6577
  __decorateClass([
6348
6578
  Target.Public(),
6349
- __decorateParam(0, Option("name", { desc: "what is the name of your organization?" })),
6579
+ __decorateParam(0, Argument("workspaceName", { desc: "what is the name of your organization?" })),
6350
6580
  __decorateParam(1, Option("app", { desc: "describe your first application to create " })),
6351
6581
  __decorateParam(2, Option("dir", { desc: "directory of workspace", default: process.env.USE_AKANJS_PKGS === "true" ? "local" : "." }))
6352
6582
  ], WorkspaceCommand.prototype, "createWorkspace", 1);