@akanjs/cli 0.0.82 → 0.0.83

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
@@ -679,7 +679,7 @@ var makeAppConfig = (config, props = {}) => {
679
679
  dockerfile: config.backend?.dockerfile ?? `FROM node:22-slim
680
680
  RUN ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
681
681
  RUN apt-get update && apt-get upgrade -y
682
- RUN apt-get install -y ca-certificates fonts-liberation libappindicator3-1 libasound2 libatk-bridge2.0-0 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libglib2.0-0 libgtk-3-0 libnspr4 libnss3 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 lsb-release wget xdg-utils udev
682
+ RUN apt-get install -y ca-certificates fonts-liberation libappindicator3-1 libasound2 libatk-bridge2.0-0 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libglib2.0-0 libgtk-3-0 libnspr4 libnss3 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 lsb-release wget xdg-utils udev ffmpeg
683
683
  ARG TARGETARCH
684
684
  RUN if [ "$TARGETARCH" = "amd64" ]; then wget https://fastdl.mongodb.org/tools/db/mongodb-database-tools-debian92-x86_64-100.3.1.deb && apt-get install -y ./mongodb-database-tools-*.deb && rm -f mongodb-database-tools-*.deb; fi
685
685
  RUN apt-get install -y git redis build-essential python3
@@ -1418,7 +1418,7 @@ var SysExecutor = class extends Executor {
1418
1418
  return { filepath, content };
1419
1419
  }
1420
1420
  async getDatabaseModules() {
1421
- const databaseModules = (await import_promises.default.readdir(`${this.cwdPath}/lib`)).filter((name) => !name.startsWith("_")).filter((name) => import_fs7.default.existsSync(`${this.cwdPath}/lib/${name}/${name}.constant.ts`));
1421
+ const databaseModules = (await import_promises.default.readdir(`${this.cwdPath}/lib`)).filter((name) => !name.startsWith("_") && !name.startsWith("__") && !name.endsWith(".ts")).filter((name) => import_fs7.default.existsSync(`${this.cwdPath}/lib/${name}/${name}.constant.ts`));
1422
1422
  return databaseModules;
1423
1423
  }
1424
1424
  async getServiceModules() {
@@ -1429,6 +1429,10 @@ var SysExecutor = class extends Executor {
1429
1429
  const scalarModules = (await import_promises.default.readdir(`${this.cwdPath}/lib/__scalar`)).filter((name) => !name.startsWith("_")).filter((name) => import_fs7.default.existsSync(`${this.cwdPath}/lib/__scalar/${name}/${name}.constant.ts`));
1430
1430
  return scalarModules;
1431
1431
  }
1432
+ async getViewModules() {
1433
+ const viewModules = (await import_promises.default.readdir(`${this.cwdPath}/lib`)).filter((name) => !name.startsWith("_") && !name.startsWith("__") && !name.endsWith(".ts")).filter((name) => import_fs7.default.existsSync(`${this.cwdPath}/lib/${name}/${name}.View.tsx`));
1434
+ return viewModules;
1435
+ }
1432
1436
  async getScalarConstantFiles() {
1433
1437
  const scalarModules = await this.getScalarModules();
1434
1438
  return scalarModules.map(
@@ -2206,7 +2210,7 @@ var import_openai3 = require("@langchain/openai");
2206
2210
  var import_plugin_react = __toESM(require("@vitejs/plugin-react"));
2207
2211
  var import_dotenv2 = __toESM(require("dotenv"));
2208
2212
  var esbuild = __toESM(require("esbuild"));
2209
- var import_fs11 = __toESM(require("fs"));
2213
+ var import_fs12 = __toESM(require("fs"));
2210
2214
  var import_promises2 = __toESM(require("fs/promises"));
2211
2215
  var import_js_yaml2 = __toESM(require("js-yaml"));
2212
2216
  var import_ora2 = __toESM(require("ora"));
@@ -2216,6 +2220,7 @@ var import_vite_plugin_node_polyfills = require("vite-plugin-node-polyfills");
2216
2220
  var import_vite_tsconfig_paths = __toESM(require("vite-tsconfig-paths"));
2217
2221
 
2218
2222
  // pkgs/@akanjs/cli/src/module/module.prompt.ts
2223
+ var import_fs11 = __toESM(require("fs"));
2219
2224
  var frameworkDescription = `\uB098\uB294 \uC880 \uB354 \uD6A8\uC728\uC801\uC73C\uB85C \uCF54\uB529\uC744 \uD558\uAE30 \uC704\uD574\uC11C \uC790\uCCB4 \uD504\uB808\uC784\uC6CC\uD06C\uB97C \uC81C\uC791\uD588\uC5B4. \uADF8\uB798\uC11C \uC6B0\uB9AC \uD504\uB808\uC784\uC6CC\uD06C\uC5D0 \uB300\uD55C \uC124\uBA85\uC744 \uD574\uC904\uD14C\uB2C8\uAE4C \uC798 \uC774\uD574\uD558\uB3C4\uB85D \uD574. \uC6B0\uB9AC \uD504\uB808\uC784\uC6CC\uD06C\uB294 next.js 13\uACFC nest.js, capacitor.js, nx, mongoDB \uAE30\uBC18\uC758 \uD504\uB860\uD2B8\uC5D4\uB4DC, \uC571, \uBC31\uC5D4\uB4DC \uD1B5\uD569 \uD504\uB808\uC784\uC6CC\uD06C\uC57C. \uADF8\uB798\uC11C \uBC31\uC5D4\uB4DC, \uD504\uB860\uD2B8\uC5D4\uB4DC, DB Schema\uC5D0 \uB300\uD55C \uCF54\uB4DC\uAC00 \uBAA8\uB450 \uD55C \uD3F4\uB354 \uC548\uC5D0 \uC788\uC5B4. \uADF8\uB798\uC11C \uC790\uBC14\uC2A4\uD06C\uB9BD\uD2B8, \uD0C0\uC785\uC2A4\uD06C\uB9BD\uD2B8, \uADF8\uB9AC\uACE0 \uD504\uB808\uC784\uC6CC\uD06C\uC5D0 \uB300\uD55C \uC774\uD574\uB9CC \uC788\uB2E4\uBA74 \uAD6C\uBD84\uC9D3\uC9C0 \uC54A\uACE0 \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4\uB294 \uC7A5\uC810\uC774 \uC788\uC5B4.
2220
2225
 
2221
2226
  \uAC00\uC7A5 \uC678\uBD80\uC758 \uAD6C\uC870\uB294
@@ -2290,12 +2295,12 @@ export default function Page() {{
2290
2295
  \`\`\`
2291
2296
 
2292
2297
  lib\uC740 \uC11C\uBE44\uC2A4\uB97C \uB9CC\uB4E4\uB2E4\uBCF4\uBA74 \uD544\uC694\uD55C \uB370\uC774\uD130\uB97C \uC815\uC758\uD558\uB294 \uACF3\uC774\uC57C.
2293
- \uB530\uB77C\uC11C dataName\uC740 DB\uC774\uB984. \uC989 \uB370\uC774\uD130\uBA85\uC744 \uB530\uB77C. \uB2E4\uB9CC \uD3F4\uB354 \uB0B4\uBD80\uC5D0\uB294 backend, Frontend\uC5D0\uC11C \uD1B5\uD569\uC73C\uB85C \uC4F0\uB294 \uC18C\uC2A4\uCF54\uB4DC\uB4E4\uC774 \uC788\uC5B4.
2298
+ \uB530\uB77C\uC11C dataName\uC740 DB\uC774\uB984. \uC989 \uB370\uC774\uD130\uBA85\uC744 \uB530\uB77C. \uB2E4\uB9CC \uD3F4\uB354 \uB0B4\uBD80\uC5D0\uB294 backend, frontend\uC5D0\uC11C \uD1B5\uD569\uC73C\uB85C \uC4F0\uB294 \uC18C\uC2A4\uCF54\uB4DC\uB4E4\uC774 \uC788\uC5B4.
2294
2299
 
2295
- \uC6B0\uB9AC \uD504\uB808\uC784\uC6CC\uD06C\uC758 \uD575\uC2EC\uC740 \uC815\uC758\uD55C \uBA54\uD0C0\uB370\uC774\uD130\uB4E4\uC744 \uC774\uC6A9\uD574\uC11C \uAC01 \uB370\uC774\uD130\uAC04\uC758 \uC5F0\uAD00\uC810\uC774\uB098, \uB370\uC774\uD130 \uD0C0\uC785\uC744 \uBCF4\uACE0 \uBBF8\uB9AC \uC815\uB9AC\uB41C \uACB0\uACFC\uB97C \uB9CC\uB4E4\uC5B4\uC8FC\uACE0 \uD504\uB85C\uC81D\uD2B8\uB97C \uB9CC\uB4E0\uB2E4\uBA74 \uAC70\uC758 \uBAA8\uB450 \uD544\uC694\uD55C \uC791\uC5C5\uB4E4\uC744 \uBBF8\uB9AC \uC815\uB9AC\uD574\uB1A8\uC5B4. \uC608\uB97C \uB4E4\uC5B4 \uB370\uC774\uD130 \uD0C0\uC785\uC5D0 \uC774\uBBF8\uC9C0 \uD30C\uC77C\uC774 \uC788\uB2E4\uACE0 \uD55C\uB2E4\uBA74 \uBC31\uC5D4\uB4DC\uB97C \uD1B5\uD574 \uADF8 \uC774\uBBF8\uC9C0\uB97C \uC11C\uBC84\uC758 \uC2A4\uD1A0\uB9AC\uC9C0\uC5D0 \uC800\uC7A5\uD558\uACE0 \uADF8 \uC800\uC7A5\uB41C \uD30C\uC77C\uC744 \uD2B9\uC815 db\uC5D0 id\uB97C \uCD94\uAC00\uD574\uC8FC\uB294 \uD568\uC218\uB4E4 \uAC19\uC740 \uAC83\uB4E4\uC740 \uC5B4\uB290 \uD504\uB85C\uC81D\uD2B8\uB358 \uAC04\uC5D0 \uBAA8\uB450 \uC0AC\uC6A9\uB418\uB294 \uBC29\uC2DD\uC774\uB77C\uACE0 \uD310\uB2E8\uD588\uC5B4. \uD558\uC9C0\uB9CC \uC6B0\uB9AC\uB294 \uD504\uB85C\uC81D\uD2B8\uB97C \uC791\uC5C5\uD560 \uB54C\uB9C8\uB2E4 \uC774 \uBD88\uD544\uC694\uD55C \uC791\uC5C5\uB4E4\uC744 \uD56D\uC0C1 \uB9CC\uB4E4\uACE0 \uD14C\uC2A4\uD2B8\uB97C\uD558\uB294 \uBD88\uD544\uC694\uD55C \uC77C\uB4E4\uC744 \uD558\uACE0\uC788\uC9C0. \uADF8\uB798\uC11C \uC6B0\uB9AC\uB294 \uAC01 \uD504\uB85C\uC81D\uD2B8\uAC00 \uB9CC\uB4E4 \uB54C\uB9C8\uB2E4 \uD544\uC218\uB85C \uC788\uC5B4\uC57C\uD560 \uC774\uBBF8\uC9C0 \uC5C5\uB85C\uB4DC \uD504\uB85C\uC138\uC2A4\uB97C \uD504\uB808\uC784\uC6CC\uD06C\uB97C \uD1B5\uD574 \uBBF8\uB9AC \uC815\uC758\uB41C \uC0C1\uD0DC\uB85C \uC0AC\uC6A9\uD560 \uC218 \uC788\uC5B4.
2300
+ \uC6B0\uB9AC \uD504\uB808\uC784\uC6CC\uD06C\uC758 \uD575\uC2EC\uC740 \uC815\uC758\uD55C \uBA54\uD0C0\uB370\uC774\uD130\uB4E4\uC744 \uC774\uC6A9\uD574\uC11C \uAC01 \uB370\uC774\uD130\uAC04\uC758 \uC5F0\uAD00\uC810\uC774\uB098, \uB370\uC774\uD130 \uD0C0\uC785\uC744 \uBCF4\uACE0 \uBBF8\uB9AC \uC815\uB9AC\uB41C \uACB0\uACFC\uB97C \uB9CC\uB4E4\uC5B4\uC8FC\uACE0 \uD504\uB85C\uC81D\uD2B8\uB97C \uB9CC\uB4E0\uB2E4\uBA74 \uAC70\uC758 \uBAA8\uB450 \uD544\uC694\uD55C \uC791\uC5C5\uB4E4\uC744 \uBBF8\uB9AC \uC815\uB9AC\uD574\uB1A8\uC5B4. \uC608\uB97C \uB4E4\uC5B4 \uB370\uC774\uD130 \uD0C0\uC785\uC5D0 \uC774\uBBF8\uC9C0 \uD30C\uC77C\uC774 \uC788\uB2E4\uACE0 \uD55C\uB2E4\uBA74 \uBC31\uC5D4\uB4DC\uB97C \uD1B5\uD574 \uADF8 \uC774\uBBF8\uC9C0\uB97C \uC11C\uBC84\uC758 \uC2A4\uD1A0\uB9AC\uC9C0\uC5D0 \uC800\uC7A5\uD558\uACE0 \uADF8 \uC800\uC7A5\uB41C \uD30C\uC77C\uC744 \uD2B9\uC815 db\uC5D0 id\uB97C \uCD94\uAC00\uD574\uC8FC\uB294 \uD568\uC218\uB4E4 \uAC19\uC740 \uAC83\uB4E4\uC740 \uC5B4\uB290 \uD504\uB85C\uC81D\uD2B8\uB358 \uAC04\uC5D0 \uBAA8\uB450 \uC0AC\uC6A9\uB418\uB294 \uBC29\uC2DD\uC774\uB77C\uACE0 \uD310\uB2E8\uD588\uC5B4. \uD558\uC9C0\uB9CC \uC6B0\uB9AC\uB294 \uD504\uB85C\uC81D\uD2B8\uB97C \uC791\uC5C5\uD560 \uB54C\uB9C8\uB2E4 \uC774 \uBD88\uD544\uC694\uD55C \uC791\uC5C5\uB4E4\uC744 \uD56D\uC0C1 \uB9CC\uB4E4\uACE0 \uD14C\uC2A4\uD2B8\uB97C \uD558\uB294 \uBD88\uD544\uC694\uD55C \uC77C\uB4E4\uC744 \uD558\uACE0\uC788\uC9C0. \uADF8\uB798\uC11C \uC6B0\uB9AC\uB294 \uAC01 \uD504\uB85C\uC81D\uD2B8\uAC00 \uB9CC\uB4E4 \uB54C\uB9C8\uB2E4 \uD544\uC218\uB85C \uC788\uC5B4\uC57C\uD560 \uC774\uBBF8\uC9C0 \uC5C5\uB85C\uB4DC \uD504\uB85C\uC138\uC2A4\uB97C \uD504\uB808\uC784\uC6CC\uD06C\uB97C \uD1B5\uD574 \uBBF8\uB9AC \uC815\uC758\uB41C \uC0C1\uD0DC\uB85C \uC0AC\uC6A9\uD560 \uC218 \uC788\uC5B4.
2296
2301
  \uACB0\uACFC\uC801\uC73C\uB85C \uC6B0\uB9B0 \uD544\uC694\uD558\uC9C0\uB9CC \uB9E4\uBC88 \uC791\uC5C5\uD558\uAE30\uC5D4 \uC190\uC774 \uB9CE\uC774\uAC00\uB294 \uC791\uC5C5\uB4E4\uC744 \uBBF8\uB9AC \uC815\uC758\uD574\uB1A8\uC5B4.
2297
2302
 
2298
- \uB610\uD55C \uC6B0\uB9B0 Nx\uC5D0\uC11C \uC81C\uACF5\uD558\uB294 \uD15C\uD50C\uB9BF \uC81C\uC791 \uBB38\uBC95\uC744 \uC0AC\uC6A9\uD574\uC11C \uCEE4\uB9E8\uB4DC \uD55C \uC904\uB85C \uD2B9\uC815 \uD504\uB85C\uC81D\uD2B8 \uD3F4\uB354 \uD15C\uD50C\uB9BF\uC744 \uB9CC\uB4E4\uC5B4\uC8FC\uAC70\uB098, \uD2B9\uC815 \uBAA8\uB378\uC758 \uD544\uB4DC\uB4E4\uC744 \uB9CC\uB4E4 \uC218 \uC788\uB3C4\uB85D \uD574\uB1A8\uC5B4. Model\uC774\uB77C\uB294 \uBCC0\uC218\uC758 \uACB0\uACFC\uAC12\uC744 \uBC1B\uACE0 \uC800 \uD15C\uD50C\uB9BF\uC5D0 \uB9DE\uAC8C\uB054 \uC774\uB984\uC744 \uB123\uC5B4\uC8FC\uB294 \uAC70\uC9C0. \uB9CC\uC57D \uB0B4\uAC00 phone\uC774\uB77C\uB294 \uBCC0\uC218\uB97C \uB123\uC5C8\uB2E4\uBA74 \uC800 \uBAA8\uB378\uC5D0 Phone\uACFC \uAC19\uC740 \uACB0\uACFC\uAC12\uC73C\uB85C \uAC12\uC774 \uB4E4\uC5B4\uAC00\uAC8C \uB428\uC73C\uB85C\uC11C \uD15C\uD50C\uB9BF\uC774 \uC0DD\uC131\uB3FC. \uC774\uB294 \uC6B0\uB9AC\uAC00 \uC774\uBBF8 \uB9CC\uB4E4\uC5B4\uB193\uC740 \uCEE4\uB9E8\uB4DC\uAC00 \uC788\uC5B4.
2303
+ \uB610\uD55C \uC6B0\uB9B0 CLI\uB97C \uD1B5\uD574\uC11C \uD2B9\uC815 \uD504\uB85C\uC81D\uD2B8 \uD3F4\uB354 \uD15C\uD50C\uB9BF\uC744 \uB9CC\uB4E4\uC5B4\uC8FC\uAC70\uB098, \uD2B9\uC815 \uBAA8\uB378\uC758 \uD544\uB4DC\uB4E4\uC744 \uB9CC\uB4E4 \uC218 \uC788\uB3C4\uB85D \uD574\uB1A8\uC5B4. Model\uC774\uB77C\uB294 \uBCC0\uC218\uC758 \uACB0\uACFC\uAC12\uC744 \uBC1B\uACE0 \uC800 \uD15C\uD50C\uB9BF\uC5D0 \uB9DE\uAC8C\uB054 \uC774\uB984\uC744 \uB123\uC5B4\uC8FC\uB294 \uAC70\uC9C0. \uB9CC\uC57D \uB0B4\uAC00 phone\uC774\uB77C\uB294 \uBCC0\uC218\uB97C \uB123\uC5C8\uB2E4\uBA74 \uC800 \uBAA8\uB378\uC5D0 Phone\uACFC \uAC19\uC740 \uACB0\uACFC\uAC12\uC73C\uB85C \uAC12\uC774 \uB4E4\uC5B4\uAC00\uAC8C \uB428\uC73C\uB85C\uC11C \uD15C\uD50C\uB9BF\uC774 \uC0DD\uC131\uB3FC. \uC774\uB294 \uC6B0\uB9AC\uAC00 \uC774\uBBF8 \uB9CC\uB4E4\uC5B4\uB193\uC740 \uCEE4\uB9E8\uB4DC\uAC00 \uC788\uC5B4.
2299
2304
 
2300
2305
  \uC608\uB97C \uB4E4\uC5B4 \uC5F0\uD544\uC774\uB77C\uB294 \uBAA8\uB378\uC744 \uCEE4\uB9E8\uB4DC\uB97C \uD1B5\uD574 \uC0DD\uC131\uD558\uBA74 \uC544\uB798\uC640 \uAC19\uC740 \uD30C\uC77C\uB4E4\uC774 \uC0DD\uC131\uB3FC.
2301
2306
 
@@ -2306,11 +2311,11 @@ pencil
2306
2311
  - pencil.signal.ts (frontend\uC758 fetch\uB97C \uC5F4\uC5B4\uC8FC\uB294 \uC77C\uC885\uC758 \uCC3D\uAD6C, \uAD8C\uD55C\uAD00\uB9AC\uB4F1\uC744 \uD568 nestjs\uC758 resolver\uC640 \uC720\uC0AC )
2307
2312
  - pencil.service.ts (\uC2E4\uC9C8\uC801\uC778 \uC11C\uBE44\uC2A4 \uCF54\uB4DC\uB97C \uC791\uC131\uD558\uB294 \uACF3. \uAC01\uC885 \uBE44\uC988\uB2C8\uC2A4 \uB85C\uC9C1\uC744 \uCC98\uB9AC\uD568.)
2308
2313
  - pencil.store.ts (pencil field\uC5D0 \uB300\uD55C \uC0C1\uD0DC\uAD00\uB9AC \uC800\uC7A5\uC18C.)
2309
- - pencil.Zone.tsx (\uC544\uB798 Templete, Unit, Util, View, Util\uB4F1\uC744 \uC870\uD569\uD574\uC11C \uB2E4\uC74C \uB808\uBCA8 \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uC791\uC131\uD558\uB294 \uACF3 )
2310
- - pencil.Templete.tsx (\uC8FC\uB85C edit\uC5D0 \uC5F0\uAD00\uB41C \uCEF4\uD3EC\uB10C\uD2B8 \uC815\uC758\uD558\uB294 \uACF3 )
2311
- - pencil.Unit.tsx (list \uCC98\uB7FC \uBCF5\uC218\uAC1C\uC758 \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uC815\uC758\uD558\uB294 \uACF3 )
2312
- - pencil.Util.tsx (Action \uBC84\uD2BC\uC744 \uC815\uC758\uD558\uB294 \uACF3 )
2313
- - pencil.View.tsx (\uB2E8\uC77C view \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uC815\uC758\uD558\uB294 \uACF3 )
2314
+ - pencil.Zone.tsx (\uC544\uB798 Templete, Unit, Util, View, Util\uB4F1\uC744 \uC870\uD569\uD574\uC11C \uB2E4\uC74C \uB808\uBCA8 \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uC791\uC131\uD558\uB294 \uACF3 client component\uB85C \uC815\uC758\uB428. )
2315
+ - pencil.Templete.tsx (\uC8FC\uB85C edit\uC5D0 \uC5F0\uAD00\uB41C \uCEF4\uD3EC\uB10C\uD2B8 \uC815\uC758\uD558\uB294 \uACF3. client component\uB85C \uC815\uC758\uB428. )
2316
+ - pencil.Unit.tsx (list \uCC98\uB7FC \uBCF5\uC218\uAC1C\uC758 \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uC815\uC758\uD558\uB294 \uACF3. server component\uB85C \uC815\uC758\uB428. )
2317
+ - pencil.Util.tsx (Action \uBC84\uD2BC\uC744 \uC815\uC758\uD558\uB294 \uACF3. client component\uB85C \uC815\uC758\uB428. )
2318
+ - pencil.View.tsx (\uB2E8\uC77C view \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uC815\uC758\uD558\uB294 \uACF3. server component\uB85C \uC815\uC758\uB428. )
2314
2319
 
2315
2320
 
2316
2321
  \uC5EC\uAE30\uC11C constant\uC5D0 \uC815\uC758 \uB418\uC5B4\uC788\uB294 schema\uB97C \uAE30\uBCF8\uC73C\uB85C \uD574\uC11C \uAC01 document, dictionary, signal, service, store\uB97C \uC0DD\uC131\uD574.
@@ -2323,25 +2328,27 @@ signal - service - document
2323
2328
  store\uB294 \uD504\uB860\uD2B8\uC5D4\uB4DC\uC5D0\uC11C \uC0C1\uD0DC\uAD00\uB9AC\uB97C \uD560 \uB54C \uC0AC\uC6A9\uB3FC.
2324
2329
  \uC6B0\uB9AC\uB294 signal\uC758 \uCF54\uB4DC\uB85C \uB098\uC628 \uBA54\uD0C0\uB370\uC774\uD130\uB97C \uC774\uC6A9\uD574\uC11C store\uC5D0\uC11C \uD754\uD788 \uC0AC\uC6A9\uB420\uB9CC\uD55C \uD568\uC218\uB4E4\uC744 \uBBF8\uB9AC \uC815\uC758\uD558\uAC8C\uB054 \uB9CC\uB4E4\uC5C8\uC5B4.
2325
2330
 
2326
- \uC774\uB807\uAC8C 11\uAC1C\uC758 \uD30C\uC77C\uB85C \uAD6C\uBD84\uD574\uC11C \uC815\uC758\uAC00 \uB3FC. \uC544\uB798\uB294 \uAC01 \uD15C\uD50C\uB9BF \uBCC4\uB85C \uD30C\uC77C\uB9C8\uB2E4 \uC815\uC758\uB418\uC788\uB294 \uC18C\uC2A4\uCF54\uB4DC\uC57C.
2327
- <%=model %> \uC774 \uBD80\uBD84\uC5D0 \uC6B0\uB9AC\uAC00 \uC785\uB825\uD55C \uBAA8\uB378\uC744 \uAE30\uBC18\uC73C\uB85C \uC0DD\uC131\uB418\uB294 \uAC70\uC9C0.
2331
+ \uC774\uB807\uAC8C 11\uAC1C\uC758 \uD30C\uC77C\uB85C \uAD6C\uBD84\uD574\uC11C \uC815\uC758\uAC00 \uB3FC.
2332
+ \uC9C0\uAE08\uBD80\uD134 \uD55C \uD30C\uC77C\uB4E4\uB9C8\uB2E4 \uC0C1\uC138\uD55C \uC124\uBA85\uC744 \uD574\uC904\uAC8C.
2333
+
2334
+ model.constant.ts
2328
2335
 
2329
2336
  constant\uB294 \uAE30\uBCF8 \uC2A4\uD0A4\uB9C8\uAC00 \uAD6C\uC131\uB418\uB294 \uACF3\uC774\uC57C. \uADF8\uB798\uC11C \uC774 \uACF3\uC5D0\uC11C DB \uC2A4\uD0A4\uB9C8, \uCFFC\uB9AC, \uC815\uB82C \uAD6C\uBB38\uC744 \uC815\uC758\uD574.
2330
2337
  \uC8FC\uC758\uD574\uC57C\uD560 \uAC74 decorator\uC5D0\uC11C \uC815\uC758\uD558\uB294 \uD0C0\uC785\uACFC \uC544\uB798\uC5D0 \uC815\uC758\uD558\uB294 \uD0C0\uC785\uC774 \uC57D\uAC04 \uB2E4\uB97C \uC218 \uC788\uC5B4
2331
2338
  \uC608\uB97C \uB4E4\uC5B4 decorator\uC5D0\uC11C\uB294 Int\uB85C \uC815\uC758\uD558\uACE0 constant\uC5D0\uC11C\uB294 number\uB85C \uC815\uC758\uD574\uC57C\uD574.
2332
2339
  \uCD94\uAC00\uB85C createdAt\uACFC updatedAt, status\uB294 \uAE30\uBCF8\uC801\uC73C\uB85C \uC0DD\uC131\uB418\uB294 \uD544\uB4DC\uC774\uB2C8\uAE4C \uB530\uB85C \uC815\uC758\uD558\uC9C0 \uC54A\uC544\uB3C4 \uB3FC.
2333
2340
  \uC774\uB294 decorator\uC5D0\uC11C\uB294 GraphQL\uC5D0\uC11C \uC0AC\uC6A9\uD560 \uD0C0\uC785\uC744 \uC815\uC758\uD558\uACE0 constant\uC5D0\uC11C\uB294 \uC2E4\uC81C \uD0C0\uC785\uC744 \uC815\uC758\uD558\uB294 \uAC70\uC9C0.
2334
- model.constant.ts
2341
+
2335
2342
  \`\`\`
2336
- import {{ BaseModel, Field, Full, Light, Model, baseQueries, baseSorts }} from "@akanjs/constant";
2337
- import {{ Int, Dayjs, dayjs }} from "@akanjs/base";
2343
+ import { enumOf, Int } from "@akanjs/base";
2344
+ import { Field, Filter, Model, sortOf, via } from "@akanjs/constant";
2338
2345
 
2339
- export const <%= model %>Statuses = ["active"] as const;
2340
- export type <%= Model %>Status = (typeof <%= model %>Statuses)[number];
2346
+ export const \${dict.Model}Statuses = ["active"] as const;
2347
+ export type \${dict.Model}Status = (typeof \${dict.Model}Statuses)[number];
2341
2348
 
2342
2349
  //\uB370\uC774\uD130\uB97C \uB9CC\uB4E4 \uB54C \uD544\uC694\uD55C \uB370\uC774\uD130 \uD0C0\uC785\uC744 \uC815\uC758\uD558\uB294 \uACF3
2343
- @Model.Input("<%= Model %>Input")
2344
- export class <%= Model %>Input {{
2350
+ @Model.Input("\${dict.Model}Input")
2351
+ export class \${dict.Model}Input {{
2345
2352
  @Field.Prop(() => String)
2346
2353
  field: string;
2347
2354
 
@@ -2353,57 +2360,61 @@ export class <%= Model %>Input {{
2353
2360
  }}
2354
2361
 
2355
2362
  //\uB370\uC774\uD130\uAC00 \uB9CC\uB4E4\uC5B4\uC9C4 \uC774\uD6C4 \uC0DD\uC131\uB418\uAC70\uB098 \uC800\uC7A5\uC73C\uB85C \uCD94\uAC00\uD560 \uC218 \uC788\uB294 \uACF3
2356
- @Model.Object("<%= Model %>Object")
2357
- export class <%= Model %>Object extends BaseModel(<%= Model %>Input) {{
2358
- @Field.Prop(() => String, {{ enum: <%= model %>Statuses, default: "active" }})
2359
- status: <%= Model %>Status;
2363
+ @Model.Object("\${dict.Model}Object")
2364
+ export class \${dict.Model}Object extends via(\${dict.Model}Input) {
2365
+ @Field.Prop(() => String, {{ enum: \${dict.Model}Statuses, default: "active" }})
2366
+ status: \${dict.Model}Status;
2360
2367
  }}
2361
2368
 
2362
2369
  //\uB370\uC774\uD130\uB97C \uB9AC\uC2A4\uD2B8\uB85C \uBCF4\uC5EC\uC904 \uB54C \uD544\uC694\uD55C \uB370\uC774\uD130\uB9CC \uC81C\uACF5\uD558\uB294 \uACF3
2363
- @Model.Light("Light<%= Model %>")
2364
- export class Light<%= Model %> extends Light(<%= Model %>Object, ["field", "status"] as const) {{}}
2370
+ @Model.Light("Light\${dict.Model}")
2371
+ export class Light\${dict.Model} extends via(\${dict.Model}Object, [
2372
+ "field",
2373
+ "status",
2374
+ ] as const) {}
2365
2375
 
2366
- //\uCD5C\uC885 \uB370\uC774\uD130\uC758 \uD0C0\uC785\uC774 \uC815\uC758\uB418\uB294 \uACF3
2367
- @Model.Full("<%= Model %>")
2368
- export class <%= Model %> extends Full(<%= Model %>Object, Light<%= Model %>) {{}}
2376
+ //\uCD5C\uC885 \uB370\uC774\uD130\uC758 Full \uD0C0\uC785\uC774 \uC815\uC758\uB418\uB294 \uACF3
2377
+ @Model.Full("\${dict.Model}")
2378
+ export class \${dict.Model} extends via(\${dict.Model}Object, Light\${dict.Model}) {}
2369
2379
 
2370
2380
  //\uB370\uC774\uD130\uC758 \uC778\uC0AC\uC774\uD2B8\uB97C \uCE21\uC815\uD558\uAE30 \uC704\uD574\uC11C \uD544\uC694\uD55C \uB370\uC774\uD130\uB97C \uC815\uC758\uD558\uB294 \uACF3
2371
- @Model.Insight("<%= Model %>Insight")
2372
- export class <%= Model %>Insight {{
2381
+ @Model.Insight("\${dict.Model}Insight")
2382
+ export class \${dict.Model}Insight {{
2373
2383
  @Field.Prop(() => Int, {{ default: 0, accumulate: {{ $sum: 1 }} }})
2374
2384
  count: number;
2375
2385
  }}
2376
2386
 
2377
2387
  //\uB370\uC774\uD130\uC758 \uD1B5\uACC4\uB97C \uACC4\uC0B0\uD558\uB294 \uACF3
2378
- @Model.Summary("<%= Model %>Summary")
2379
- export class <%= Model %>Summary {{
2388
+ @Model.Summary("\${dict.Model}Summary")
2389
+ export class \${dict.Model}Summary {{
2380
2390
  @Field.Prop(() => Int, {{ min: 0, default: 0, query: {{ status: {{}} }} }})
2381
- total<%= Model %>: number;
2391
+ total\${dict.Model}: number;
2382
2392
  }}
2383
2393
 
2384
- //\uB370\uC774\uD130\uB97C \uC870\uD68C\uD560 \uB54C \uD544\uC694\uD55C \uCFFC\uB9AC\uB97C \uC815\uC758\uD558\uB294 \uACF3
2385
- export const <%= model %>Query = {{
2386
- ...baseQueries,
2387
- }};
2388
- //\uB370\uC774\uD130\uB97C \uC815\uB82C\uD560 \uB54C \uD544\uC694\uD55C \uC815\uB82C\uC744 \uC815\uC758\uD558\uB294 \uACF3
2389
- export const <%= model %>Sort = {{
2390
- ...baseSorts,
2391
- }};
2394
+ @Model.Filter("\${dict.Model}Filter")
2395
+ export class \${dict.Model}Filter extends sortOf(\${dict.Model}, {}) {}
2392
2396
  \`\`\`
2393
2397
 
2394
2398
 
2395
2399
  model.dictonary.ts
2396
2400
  \`\`\`
2397
- import {{ ModelDictionary, SignalDictionary, SummaryDictionary, baseTrans, getBaseSignalTrans }} from "@akanjs/dictionary";
2398
- import type {{ <%= Model %>, <%= Model %>Insight, <%= Model %>Summary, <%= model %>Sort }} from "./<%= model %>.constant";
2399
- import type {{ <%= Model %>Signal }} from "./<%= model %>.signal";
2401
+ import {
2402
+ baseTrans,
2403
+ getBaseSignalTrans,
2404
+ ModelDictionary,
2405
+ SignalDictionary,
2406
+ SummaryDictionary,
2407
+ } from "@akanjs/dictionary";
2408
+
2409
+ import type { \${dict.Model}, \${dict.Model}Filter, \${dict.Model}Insight, \${dict.Model}Summary } from "./\${dict.model}.constant";
2410
+ import type { \${dict.Model}Signal } from "./\${dict.model}.signal";
2400
2411
 
2401
2412
  const modelDictionary = {{
2402
2413
  ...baseTrans,
2403
- modelName: ["<%= Model %>", "<%= Model %>"],
2414
+ modelName: ["\${dict.Model}", "\${dict.Model}"],
2404
2415
  modelDesc: [
2405
- "<%= Model %> description",
2406
- "<%= Model %> \uC124\uBA85",
2416
+ "\${dict.Model} description",
2417
+ "\${dict.Model} \uC124\uBA85",
2407
2418
  ],
2408
2419
 
2409
2420
  // * ==================== Model ==================== * //
@@ -2413,7 +2424,7 @@ const modelDictionary = {{
2413
2424
 
2414
2425
  // * ==================== Insight ==================== * //
2415
2426
  count: ["Count", "\uAC1C\uC218"],
2416
- "desc-count": ["<%= Model %> count in current query settting", "\uD604\uC7AC \uCFFC\uB9AC \uC124\uC815\uC5D0 \uB9DE\uB294 <%= Model %> \uC218"],
2427
+ "desc-count": ["\${dict.Model} count in current query settting", "\uD604\uC7AC \uCFFC\uB9AC \uC124\uC815\uC5D0 \uB9DE\uB294 \${dict.Model} \uC218"],
2417
2428
  // * ==================== Insight ==================== * //
2418
2429
 
2419
2430
  // * ==================== Filter ==================== * //
@@ -2423,326 +2434,310 @@ const modelDictionary = {{
2423
2434
  "enum-status-active": ["Active", "\uD65C\uC131"],
2424
2435
  "enumdesc-status-active": ["Active status", "\uD65C\uC131 \uC0C1\uD0DC"],
2425
2436
  // * ==================== Etc ==================== * //
2426
- }} satisfies ModelDictionary<<%= Model %>, <%= Model %>Insight, typeof <%= model %>Sort>;
2437
+ }} satisfies ModelDictionary<\${dict.Model}, \${dict.Model}Insight, typeof \${dict.Model}Sort>;
2427
2438
 
2428
- export const <%= model %>SummaryDictionary = {{
2439
+ export const \${dict.Model}SummaryDictionary = {{
2429
2440
  // * ==================== Summary ==================== * //
2430
- total<%= Model %>: ["Total <%= Model %>", "\uCD1D <%= Model %> \uC218"],
2431
- "desc-total<%= Model %>": ["Total <%= model %> count in the database", "\uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0 \uC800\uC7A5\uB41C \uCD1D <%= Model %> \uC218"],
2441
+ total\${dict.Model}: ["Total \${dict.Model}", "\uCD1D \${dict.Model} \uC218"],
2442
+ "desc-total\${dict.Model}": ["Total \${dict.Model} count in the database", "\uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0 \uC800\uC7A5\uB41C \uCD1D \${dict.Model} \uC218"],
2432
2443
  // * ==================== Summary ==================== * //
2433
- }} satisfies SummaryDictionary<<%= Model %>Summary>;
2444
+ }} satisfies SummaryDictionary<\${dict.Model}Summary>;
2434
2445
 
2435
2446
  const signalDictionary = {{
2436
- ...getBaseSignalTrans("<%= model %>" as const),
2447
+ ...getBaseSignalTrans("\${dict.Model}" as const),
2437
2448
  // * ==================== Endpoint ==================== * //
2438
- "api-<%= model %>ListInPublic": ["<%= Model %> List In Public", "\uACF5\uAC1C\uB41C <%= Model %> \uB9AC\uC2A4\uD2B8"],
2439
- "apidesc-<%= model %>ListInPublic": ["Get a list of public <%= model %>", "\uACF5\uAC1C\uB41C <%= Model %>\uC758 \uB9AC\uC2A4\uD2B8\uB97C \uAC00\uC838\uC635\uB2C8\uB2E4"],
2440
- "arg-<%= model %>ListInPublic-statuses": ["Statuses", "\uC0C1\uD0DC"],
2441
- "argdesc-<%= model %>ListInPublic-statuses": ["Statuses to filter", "\uD544\uD130\uB9C1\uD560 \uC0C1\uD0DC"],
2442
- "arg-<%= model %>ListInPublic-skip": ["Skip", "\uAC74\uB108\uB6F0\uAE30"],
2443
- "argdesc-<%= model %>ListInPublic-skip": ["Number of items to skip", "\uAC74\uB108\uB6F8 \uC544\uC774\uD15C \uC218"],
2444
- "arg-<%= model %>ListInPublic-limit": ["Limit", "\uC81C\uD55C"],
2445
- "argdesc-<%= model %>ListInPublic-limit": ["Maximum number of items to return", "\uBC18\uD658\uD560 \uCD5C\uB300 \uC544\uC774\uD15C \uC218"],
2446
- "arg-<%= model %>ListInPublic-sort": ["Sort", "\uC815\uB82C"],
2447
- "argdesc-<%= model %>ListInPublic-sort": ["Sort order of the items", "\uC544\uC774\uD15C\uC758 \uC815\uB82C \uC21C\uC11C"],
2448
-
2449
- "api-<%= model %>InsightInPublic": ["<%= Model %> Insight In Public", "\uACF5\uAC1C\uB41C <%= Model %> \uC778\uC0AC\uC774\uD2B8"],
2450
- "apidesc-<%= model %>InsightInPublic": [
2451
- "Get insight data for public <%= model %>",
2452
- "\uACF5\uAC1C\uB41C <%= Model %>\uC5D0 \uB300\uD55C \uC778\uC0AC\uC774\uD2B8 \uB370\uC774\uD130\uB97C \uAC00\uC838\uC635\uB2C8\uB2E4",
2449
+ "api-\${dict.Model}ListInPublic": ["\${dict.Model} List In Public", "\uACF5\uAC1C\uB41C \${dict.Model} \uB9AC\uC2A4\uD2B8"],
2450
+ "apidesc-\${dict.Model}ListInPublic": ["Get a list of public \${dict.Model}", "\uACF5\uAC1C\uB41C \${dict.Model}\uC758 \uB9AC\uC2A4\uD2B8\uB97C \uAC00\uC838\uC635\uB2C8\uB2E4"],
2451
+ "arg-\${dict.Model}ListInPublic-statuses": ["Statuses", "\uC0C1\uD0DC"],
2452
+ "argdesc-\${dict.Model}ListInPublic-statuses": ["Statuses to filter", "\uD544\uD130\uB9C1\uD560 \uC0C1\uD0DC"],
2453
+ "arg-\${dict.Model}ListInPublic-skip": ["Skip", "\uAC74\uB108\uB6F0\uAE30"],
2454
+ "argdesc-\${dict.Model}ListInPublic-skip": ["Number of items to skip", "\uAC74\uB108\uB6F8 \uC544\uC774\uD15C \uC218"],
2455
+ "arg-\${dict.Model}ListInPublic-limit": ["Limit", "\uC81C\uD55C"],
2456
+ "argdesc-\${dict.Model}ListInPublic-limit": ["Maximum number of items to return", "\uBC18\uD658\uD560 \uCD5C\uB300 \uC544\uC774\uD15C \uC218"],
2457
+ "arg-\${dict.Model}ListInPublic-sort": ["Sort", "\uC815\uB82C"],
2458
+ "argdesc-\${dict.Model}ListInPublic-sort": ["Sort order of the items", "\uC544\uC774\uD15C\uC758 \uC815\uB82C \uC21C\uC11C"],
2459
+
2460
+ "api-\${dict.Model}InsightInPublic": ["\${dict.Model} Insight In Public", "\uACF5\uAC1C\uB41C \${dict.Model} \uC778\uC0AC\uC774\uD2B8"],
2461
+ "apidesc-\${dict.Model}InsightInPublic": [
2462
+ "Get insight data for public \${dict.Model}",
2463
+ "\uACF5\uAC1C\uB41C \${dict.Model}\uC5D0 \uB300\uD55C \uC778\uC0AC\uC774\uD2B8 \uB370\uC774\uD130\uB97C \uAC00\uC838\uC635\uB2C8\uB2E4",
2453
2464
  ],
2454
- "arg-<%= model %>InsightInPublic-statuses": ["Statuses", "\uC0C1\uD0DC"],
2455
- "argdesc-<%= model %>InsightInPublic-statuses": ["Statuses to filter", "\uD544\uD130\uB9C1\uD560 \uC0C1\uD0DC"],
2465
+ "arg-\${dict.Model}InsightInPublic-statuses": ["Statuses", "\uC0C1\uD0DC"],
2466
+ "argdesc-\${dict.Model}InsightInPublic-statuses": ["Statuses to filter", "\uD544\uD130\uB9C1\uD560 \uC0C1\uD0DC"],
2456
2467
  // * ==================== Endpoint ==================== * //
2457
- }} satisfies SignalDictionary<<%= Model %>Signal, <%= Model %>>;
2468
+ }} satisfies SignalDictionary<\${dict.Model}Signal, \${dict.Model}>;
2458
2469
  \`\`\`
2459
- export const <%= model %>Dictionary = {{ ...modelDictionary, ...signalDictionary }};
2470
+ export const \${dict.model}Dictionary = {{ ...modelDictionary, ...signalDictionary }};
2460
2471
 
2461
2472
 
2462
2473
 
2463
2474
  model.document.ts
2464
2475
  \`\`\`
2465
- import {{ Database, Document, Input, Middleware, Model, type SchemaOf }} from "@akanjs/server";
2466
- import {{ cnst }} from "../cnst";
2476
+ import { beyond, by, Database, into, type SchemaOf } from "@akanjs/document";
2467
2477
 
2468
- @Database.Input(() => cnst.<%= Model %>Input)
2469
- export class <%= Model %>Input extends Input(cnst.<%= Model %>Input) {{}}
2478
+ import { cnst } from "../cnst";
2479
+ @Database.Input(() => cnst.\${dict.Model}Input)
2480
+ export class \${dict.Model}Input extends by(cnst.\${dict.Model}Input) {}
2470
2481
 
2471
- @Database.Document(() => cnst.<%= Model %>)
2472
- export class <%= Model %> extends Document(cnst.<%= Model %>) {{}}
2482
+ @Database.Document(() => cnst.\${dict.Model})
2483
+ export class \${dict.Model} extends by(cnst.\${dict.Model}) {}
2473
2484
 
2474
- @Database.Model(() => cnst.<%= Model %>)
2475
- export class <%= Model %>Model extends Model(<%= Model %>, cnst.<%= model %>Cnst) {{
2476
- async getSummary(): Promise<cnst.<%= Model %>Summary> {{
2477
- return {{
2485
+ @Database.Model(() => cnst.\${dict.Model})
2486
+ export class \${dict.Model}Model extends into(\${dict.Model}, cnst.\${dict.Model}Cnst) {
2487
+ async getSummary(): Promise<cnst.\${dict.Model}Summary> {
2488
+ return {
2478
2489
  ...(await this.getDefaultSummary()),
2479
- }};
2480
- }}
2481
- }}
2490
+ };
2491
+ }
2492
+ }
2482
2493
 
2483
- @Database.Middleware(() => cnst.<%= Model %>)
2484
- export class <%= Model %>Middleware extends Middleware(<%= Model %>Model, <%= Model %>) {{
2485
- onSchema(schema: SchemaOf<<%= Model %>Model, <%= Model %>>) {{
2486
- // schema.index({{ status: 1 }})
2487
- }}
2488
- }}
2494
+ @Database.Middleware(() => cnst.\${dict.Model})
2495
+ export class \${dict.Model}Middleware extends beyond(\${dict.Model}Model, \${dict.Model}) {
2496
+ onSchema(schema: SchemaOf<\${dict.Model}Model, \${dict.Model}>) {
2497
+ // schema.index({ status: 1 })
2498
+ }
2499
+ }
2500
+ \`\`\`
2489
2501
 
2490
2502
 
2491
2503
  model.signal.ts
2504
+ \`\`\`
2505
+ import { Int } from "@akanjs/base";
2506
+ import { SortOf } from "@akanjs/constant";
2507
+ import { Arg, DbSignal, Mutation, Query, resolve, Signal } from "@akanjs/signal";
2492
2508
 
2493
- import {{ Arg, DbSignal, Mutation, Query, Signal, resolve }} from "@akanjs/signal";
2494
- import {{ Int }} from "@akanjs/base";
2495
- import {{ Srvs, cnst }} from "../cnst";
2509
+ import { cnst, Srvs } from "../cnst";
2496
2510
 
2497
- @Signal(() => cnst.<%= Model %>)
2498
- export class <%= Model %>Signal extends DbSignal(cnst.<%= model %>Cnst, Srvs, {{
2499
- guards: {{ get: Query.Public, cru: Mutation.Every }},
2500
- }}) {{
2511
+ @Signal(() => cnst.\${dict.Model})
2512
+ export class \${dict.Model}Signal extends DbSignal(cnst.\${dict.model}Cnst, Srvs, {
2513
+ guards: { get: Query.Public, cru: Mutation.Public },
2514
+ }) {
2501
2515
  // * /////////////////////////////////////
2502
2516
  // * Public Slice
2503
- @Query.Public(() => [cnst.<%= Model %>])
2504
- async <%= model %>ListInPublic(
2505
- @Arg.Query("statuses", () => [String], {{ nullable: true }}) statuses: cnst.<%= Model %>Status[] | null,
2506
- @Arg.Query("skip", () => Int, {{ nullable: true }}) skip: number | null,
2507
- @Arg.Query("limit", () => Int, {{ nullable: true }}) limit: number | null,
2508
- @Arg.Query("sort", () => String, {{ nullable: true }}) sort: keyof typeof cnst.<%= model %>Sort | null
2509
- ) {{
2510
- const <%= models %> = await this.<%= model %>Service.listByStatuses(statuses, {{ skip, limit, sort }});
2511
- return resolve<cnst.<%= Model %>[]>(<%= models %>);
2512
- }}
2513
- @Query.Public(() => cnst.<%= Model %>Insight)
2514
- async <%= model %>InsightInPublic(@Arg.Query("statuses", () => [String], {{ nullable: true }}) statuses: cnst.<%= Model %>Status[] | null) {{
2515
- const <%= model %>Insight = await this.<%= model %>Service.insightByStatuses(statuses);
2516
- return resolve<cnst.<%= Model %>Insight>(<%= model %>Insight);
2517
- }}
2517
+ @Query.Public(() => [cnst.\${dict.Model}])
2518
+ async \${dict.model}ListInPublic(
2519
+ @Arg.Query("statuses", () => [String], { nullable: true }) statuses: cnst.\${dict.Model}Status[] | null,
2520
+ @Arg.Query("skip", () => Int, { nullable: true }) skip: number | null,
2521
+ @Arg.Query("limit", () => Int, { nullable: true }) limit: number | null,
2522
+ @Arg.Query("sort", () => String, { nullable: true }) sort: SortOf<cnst.\${dict.Model}Filter> | null
2523
+ ) {
2524
+ const \${dict.models} = await this.\${dict.model}Service.listByStatuses(statuses, { skip, limit, sort });
2525
+ return resolve<cnst.\${dict.Model}[]>(\${dict.models});
2526
+ }
2527
+ @Query.Public(() => cnst.\${dict.Model}Insight)
2528
+ async \${dict.model}InsightInPublic(
2529
+ @Arg.Query("statuses", () => [String], { nullable: true }) statuses: cnst.\${dict.Model}Status[] | null
2530
+ ) {
2531
+ const \${dict.model}Insight = await this.\${dict.model}Service.insightByStatuses(statuses);
2532
+ return resolve<cnst.\${dict.Model}Insight>(\${dict.model}Insight);
2533
+ }
2518
2534
  // * Public Slice
2519
2535
  // * /////////////////////////////////////
2520
- }}
2536
+ }
2521
2537
  \`\`\`
2522
2538
 
2523
2539
 
2524
2540
  model.service.ts
2525
2541
  \`\`\`
2542
+ import { DbService, Service } from "@akanjs/service";
2543
+
2544
+ import { cnst } from "../cnst";
2526
2545
  import * as db from "../db";
2527
- import {{ DbService, Service }} from "@akanjs/server";
2528
- import {{ cnst }} from "../cnst";
2529
- // import type * as srv from "../srv";
2530
-
2531
- @Service("<%= Model %>Service")
2532
- export class <%= Model %>Service extends DbService(db.<%= model %>Db) {{
2533
- // @Use() protected readonly injectedVar: string;
2534
- // @Srv() protected readonly otherService: srv.OtherService;
2535
-
2536
- async summarize(): Promise<cnst.<%= Model %>Summary> {{
2537
- return {{
2538
- ...(await this.<%= model %>Model.getSummary()),
2539
- }};
2540
- }}
2541
- }}
2546
+
2547
+ @Service("\${dict.Model}Service")
2548
+ export class \${dict.Model}Service extends DbService(db.\${dict.Model}Db) {
2549
+ async summarize(): Promise<cnst.\${dict.Model}Summary> {
2550
+ return {
2551
+ ...(await this.\${dict.Model}Model.getSummary()),
2552
+ };
2553
+ }
2554
+ }
2542
2555
  \`\`\`
2543
2556
 
2544
2557
 
2545
2558
  model.store.ts
2546
2559
  \`\`\`
2547
- import {{ Store, stateOf }} from "@akanjs/client";
2548
- import {{ cnst }} from "../cnst";
2549
- import {{ fetch }} from "../fetch";
2560
+ import { stateOf, Store } from "@akanjs/store";
2561
+
2562
+ import { cnst } from "../cnst";
2563
+ import { fetch } from "../fetch";
2550
2564
 
2551
- @Store(() => cnst.<%= Model %>)
2552
- export class <%= Model %>Store extends stateOf(fetch.<%= model %>Gql, {{
2565
+ @Store(() => cnst.\${dict.Model})
2566
+ export class \${dict.Model}Store extends stateOf(fetch.\${dict.model}Gql, {
2553
2567
  // state
2554
- }}) {{
2568
+ }) {
2555
2569
  // action
2556
- }}
2570
+ }
2557
2571
  \`\`\`
2558
2572
 
2559
2573
 
2560
2574
  model.Zone.tsx
2561
2575
  \`\`\`
2562
2576
  "use client";
2563
- import {{ Data, Load }} from "@shared/ui";
2564
- import {{ ModelsProps }} from "@akanjs/client";
2565
- import {{ cnst, fetch, <%= Model %> }} from "<%= clientPath %>";
2566
- import {{ ClientInit, ClientView, DefaultOf }} from "@akanjs/signal";
2567
- import {{ getQueryMap }} from "@akanjs/constant";
2577
+ import { Data, Load } from "@shared/ui";
2578
+ import { ModelsProps } from "@akanjs/client";
2579
+ import { cnst, \${dict.Model} } from "@\${dict.appName}/client";
2580
+ import { ClientInit, ClientView, DefaultOf } from "@akanjs/signal";
2568
2581
 
2569
- export const Admin = ({{ sliceName = "<%= model %>", init, query }}: ModelsProps<cnst.<%= Model %>>) => {{
2582
+ export const Admin = ({ sliceName = "\${dict.model}", init, query }: ModelsProps<cnst.\${dict.Model}>>) => {
2570
2583
  return (
2571
2584
  <Data.ListContainer
2572
- init={{init}}
2573
- query={{query}}
2574
- sliceName={{sliceName}}
2575
- renderItem={{<%= Model %>.Unit.Card}}
2576
- renderDashboard={{<%= Model %>.Util.Stat}}
2577
- renderInsight={{<%= Model %>.Util.Insight}}
2578
- renderTemplate={{<%= Model %>.Template.General}}
2579
- renderTitle={{(<%= model %>: DefaultOf<cnst.<%= Model %>>) => \`<%= Model %> - \${{<%= model %>.id ? <%= model %>.id : "New"}}\`}}
2580
- renderView={{(<%= model %>: cnst.<%= Model %>) => <<%= Model %>.View.General <%= model %>={{<%= model %>}} />}}
2581
- queryMap={{getQueryMap(cnst.<%= Model %>Summary)}}
2582
- columns={{[
2585
+ init={init}
2586
+ query={query}
2587
+ sliceName={sliceName}
2588
+ renderItem={\${dict.Model}.Unit.Card}
2589
+ renderDashboard={\${dict.Model}.Util.Stat}
2590
+ renderInsight={\${dict.Model}.Util.Insight}
2591
+ renderTemplate={\${dict.Model}.Template.General}
2592
+ renderTitle={(\${dict.model}: DefaultOf<cnst.\${dict.Model}>>) => \`\${dict.Model} - \${\${dict.model}.id ? \${dict.model}.id : "New"}\`}
2593
+ renderView={(\${dict.model}: cnst.\${dict.Model}>) => <\${dict.Model}.View.General \${dict.model}={\${dict.model}} />}
2594
+ columns={[
2583
2595
  "id",
2584
2596
  "status",
2585
2597
  "createdAt",
2586
2598
  "updatedAt",
2587
- ]}}
2588
- actions={{(<%= model %>: cnst.Light<%= Model %>, idx) => ["remove", "edit", "view"]}}
2599
+ ]}
2600
+ actions={(\${dict.model}: cnst.Light\${dict.Model}, idx) => ["remove", "edit", "view"]}
2589
2601
  />
2590
2602
  );
2591
- }};
2603
+ };
2592
2604
 
2593
- interface CardProps {{
2605
+ interface CardProps {
2594
2606
  className?: string;
2595
- init: ClientInit<"<%= model %>", cnst.Light<%= Model %>>;
2596
- }}
2597
- export const Card = ({{ className, init }}: CardProps) => {{
2607
+ init: ClientInit<"\${dict.model}", cnst.Light\${dict.Model}>;
2608
+ }
2609
+ export const Card = ({ className, init }: CardProps) => {
2598
2610
  return (
2599
2611
  <Load.Units
2600
- className={{className}}
2601
- init={{init}}
2602
- renderItem={{(<%= model %>: cnst.Light<%= Model %>) => (
2603
- <<%= Model %>.Unit.Card key={{<%= model %>.id}} href={{\`/<%= model %>\${{<%= model %>.id}}\`}} <%= model %>={{<%= model %>}} />
2604
- )}}
2612
+ className={className}
2613
+ init={init}
2614
+ renderItem={(\${dict.model}: cnst.Light\${dict.Model}) => (
2615
+ <\${dict.Model}.Unit.Card key={\${dict.model}.id} href={\`/\${dict.model}/\${\${dict.model}.id}\`} \${dict.model}={\${dict.model}} />
2616
+ )}
2605
2617
  />
2606
2618
  );
2607
- }};
2619
+ };
2608
2620
 
2609
- interface ViewProps {{
2621
+ interface ViewProps {
2610
2622
  className?: string;
2611
- view: ClientView<"<%= model %>", cnst.<%= Model %>>;
2612
- }}
2613
- export const View = ({{ view }}: ViewProps) => {{
2614
- return <Load.View view={{view}} renderView={{(<%= model %>) => <<%= Model %>.View.General <%= model %>={{<%= model %>}} />}} />;
2615
- }};
2623
+ view: ClientView<"\${dict.model}", cnst.\${dict.Model}>;
2624
+ }
2625
+ export const View = ({ view }: ViewProps) => {
2626
+ return <Load.View view={view} renderView={(\${dict.model}) => <\${dict.Model}.View.General \${dict.model}={\${dict.model}} />} />;
2627
+ };
2616
2628
  \`\`\`
2617
2629
 
2618
2630
  model.Templete.tsx
2619
2631
  \`\`\`
2620
2632
  "use client";
2621
- import {{ Field }} from "@shared.ui";
2622
- import {{ Layout }} from "@util.ui";
2623
- import {{ cnst, st, usePage }} from "<%= clientPath %>";
2633
+ import { cnst, st, usePage } from "@\${dict.appName}/client";
2634
+ import { Field } from "@shared/ui";
2635
+ import { Layout } from "@util/ui";
2624
2636
 
2625
- interface <%= Model %>EditProps {{
2626
- <%= model %>Id?: string | null;
2627
- }}
2637
+ interface \${dict.Model}EditProps {
2638
+ \${dict.model}Id?: string | null;
2639
+ }
2628
2640
 
2629
- export const General = ({{ <%= model %>Id = undefined }}: <%= Model %>EditProps) => {{
2630
- const <%= model %>Form = st.use.<%= model %>Form();
2631
- const {{ l }} = usePage();
2641
+ export const General = ({ \${dict.model}Id = undefined }: \${dict.Model}EditProps) => {
2642
+ const \${dict.model}Form = st.use.\${dict.model}Form();
2643
+ const { l } = usePage();
2632
2644
  return (
2633
2645
  <Layout.Template>
2634
2646
  <Field.Text
2635
- label={{l.field("<%= model %>", "id")}}
2636
- desc={{l.desc("<%= model %>", "id")}}
2637
- value={{<%= model %>Form.id}}
2638
- onChange={{st.do.setIdOn<%= Model %>}}
2647
+ label={l.field("\${dict.model}", "id")}
2648
+ desc={l.desc("\${dict.model}", "id")}
2649
+ value={\${dict.model}Form.id}
2650
+ onChange={st.do.setIdOn\${dict.Model}}
2639
2651
  />
2640
2652
  </Layout.Template>
2641
2653
  );
2642
- }};
2654
+ };
2643
2655
  \`\`\`
2644
2656
 
2645
2657
 
2646
2658
  model.Unit.tsx
2647
2659
  \`\`\`
2648
- import {{ Link }} from "@util.ui";
2649
- import {{ cnst, <%= Model %> }} from "<%= clientPath %>";
2650
- import {{ ModelProps }} from "@akanjs/client";
2660
+ import { ModelProps } from "@akanjs/client";
2661
+ import { cnst, \${dict.Model} } from "@\${dict.appName}/client";
2662
+ import { Link } from "@util/ui";
2651
2663
 
2652
- export const Card = ({{ <%= model %>, href }}: ModelProps<"<%= model %>", cnst.Light<%= Model %>>) => {{
2664
+ export const Card = ({ \${dict.model}, href }: ModelProps<"\${dict.model}", cnst.Light\${dict.Model}>>) => {
2653
2665
  return (
2654
- <Link href={{href}} className="animate-fadeIn w-full h-36 flex rounded-lg shadow-sm hover:shadow-lg duration-300">
2655
- <div>{{<%= model %>.id}}</div>
2666
+ <Link href={href} className="animate-fadeIn w-full h-36 flex rounded-lg shadow-sm hover:shadow-lg duration-300">
2667
+ <div>{\${dict.model}.id}</div>
2656
2668
  </Link>
2657
2669
  );
2658
- }};
2670
+ };
2659
2671
  \`\`\`
2660
2672
 
2661
2673
 
2662
2674
  model.Util.tsx
2663
2675
  \`\`\`
2664
2676
  "use client";
2665
- import {{ Data }} from "@shared.ui";
2666
- import {{ ModelDashboardProps, ModelInsightProps }} from "@akanjs/client";
2667
- import {{ cnst, fetch, st, usePage, <%= Model %> }} from "<%= clientPath %>";
2668
- import {{ getQueryMap }} from "@akanjs/constant";
2677
+ import { ModelDashboardProps, ModelInsightProps } from "@akanjs/client";
2678
+ import { getQueryMap } from "@akanjs/constant";
2679
+ import { cnst } from "@\${dict.appName}/client";
2680
+ import { Data } from "@shared/ui";
2669
2681
 
2670
- export const Stat = ({{
2682
+ export const Stat = ({
2671
2683
  className,
2672
2684
  summary,
2673
- sliceName = "<%= model %>",
2674
- queryMap = getQueryMap(cnst.<%= Model %>Summary),
2685
+ sliceName = "\${dict.model}",
2686
+ queryMap = getQueryMap(cnst.\${dict.Model}Summary),
2675
2687
  hidePresents,
2676
- }}: ModelDashboardProps<cnst.Summary>) => {{
2688
+ }: ModelDashboardProps<cnst.Summary>) => {
2677
2689
  return (
2678
2690
  <Data.Dashboard
2679
- className={{className}}
2680
- summary={{summary}}
2681
- sliceName={{sliceName}}
2682
- queryMap={{queryMap}}
2683
- columns={{["total<%= Model %>"]}}
2684
- hidePresents={{hidePresents}}
2691
+ className={className}
2692
+ summary={summary}
2693
+ sliceName={sliceName}
2694
+ queryMap={queryMap}
2695
+ columns={["total\${dict.Model}"]}
2696
+ hidePresents={hidePresents}
2685
2697
  />
2686
2698
  );
2687
- }};
2699
+ };
2688
2700
 
2689
- export const Insight = ({{
2701
+ export const Insight = ({
2690
2702
  className,
2691
2703
  insight,
2692
- sliceName = "<%= model %>",
2693
- }}: ModelInsightProps<cnst.<%= Model %>Insight>) => {{
2704
+ sliceName = "\${dict.model}",
2705
+ }: ModelInsightProps<cnst.\${dict.Model}Insight>) => {
2694
2706
  return (
2695
2707
  <Data.Insight
2696
- className={{className}}
2697
- insight={{insight}}
2698
- sliceName={{sliceName}}
2699
- columns={{["count"]}}
2708
+ className={className}
2709
+ insight={insight}
2710
+ sliceName={sliceName}
2711
+ columns={["count"]}
2700
2712
  />
2701
2713
  );
2702
- }};
2714
+ };
2703
2715
  \`\`\`
2704
2716
 
2705
2717
 
2706
2718
  model.View.tsx
2707
2719
  \`\`\`
2708
- import {{ Image }} from "@util.ui";
2709
- import {{ cnst, <%= Model %> }} from "<%= clientPath %>";
2710
- import {{ clsx }} from "@akanjs/client";
2720
+ import { clsx } from "@akanjs/client";
2721
+ import { cnst } from "@\${dict.appName}/client";
2722
+ import { Image } from "@util/ui";
2711
2723
 
2712
- interface <%= Model %>ViewProps {{
2724
+ interface \${dict.Model}ViewProps {
2713
2725
  className?: string;
2714
- <%= model %>: cnst.<%= Model %>;
2715
- self?: {{ id?: string }} | null;
2716
- }}
2726
+ \${dict.model}: cnst.\${dict.Model};
2727
+ self?: { id?: string } | null;
2728
+ }
2717
2729
 
2718
- export const General = ({{ className, <%= model %>, self }}: <%= Model %>ViewProps) => {{
2730
+ export const General = ({ className, \${dict.model}, self }: \${dict.Model}ViewProps) => {
2719
2731
  return (
2720
- <div className={{clsx(className, \`animate-fadeIn w-full\`)}}>
2721
- <div>{{<%= model %>.id}}</div>
2732
+ <div className={clsx(className, "animate-fadeIn w-full")}>
2733
+ <div>{\${dict.model}.id}</div>
2722
2734
  </div>
2723
2735
  );
2724
- }};
2736
+ };
2725
2737
  \`\`\`
2726
2738
  \uC774\uB7F0\uC2DD\uC73C\uB85C \uC6B0\uB9AC\uAC00 \uC9C1\uC811 \uB9CC\uB4E0 \uD504\uB808\uC784\uC6CC\uD06C\uC5D0 \uAE30\uBC18\uD574\uC11C db\uC640 \uC11C\uBE44\uC2A4 \uC2A4\uD1A0\uC5B4\uAE4C\uC9C0 \uBAA8\uB450 \uC5F0\uB3D9\uD574\uC11C \uD558\uB098\uC758 \uBAA8\uB378\uC5D0 \uB9DE\uAC8C\uB054 \uBAA8\uB4C8\uC744 \uD55C \uD3F4\uB354\uC5D0\uC11C \uC791\uC5C5\uD560 \uC218 \uC788\uAC8C\uB054 \uAD6C\uC870\uB97C \uB9CC\uB4E4\uC5C8\uC5B4.
2727
2739
 
2728
2740
  \uC77C\uB2E8 \uD504\uB808\uC784\uC6CC\uD06C\uC5D0 \uB300\uD55C \uC124\uBA85\uC740 \uC774 \uC815\uB3C4\uB85C \uD558\uACE0 \uC774 \uC815\uBCF4\uB4E4\uC744 \uAE30\uBC18\uC73C\uB85C \uB0B4\uAC00 \uC6D0\uD558\uB294 \uC694\uAD6C\uB97C \uB4E4\uC5B4\uC918.
2729
- `;
2730
- var requestModule = () => `${frameworkDescription}
2731
- \uB108\uB294 \uC9C0\uAE08\uBD80\uD130 \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC124\uACC4\uC790\uB85C\uC11C \uB370\uC774\uD130\uB97C \uC815\uAD50\uD558\uACE0 \uD6A8\uC728\uC801\uC73C\uB85C \uAD00\uB9AC\uD558\uB294 \uC5ED\uD560\uC744 \uB9E1\uC558\uC5B4.
2732
- \uB0B4\uAC00 \uBC29\uAE08 \uC124\uBA85\uD55C \uD504\uB808\uC784\uC6CC\uD06C \uC124\uBA85\uC744 \uC798 \uCC38\uACE0\uD574\uC11C \uD504\uB85C\uC81D\uD2B8\uB97C \uAE30\uBC18\uC73C\uB85C \uC11C\uBE44\uC2A4\uC5D0 \uD544\uC694\uD55C \uD544\uB4DC\uB97C \uB9CC\uB4E4\uC5B4\uC11C \uC918.
2733
- \uD504\uB85C\uC81D\uD2B8 \uBA85\uC740 {projectName}\uC774\uACE0,
2734
- \uD504\uB85C\uC81D\uD2B8 \uC124\uBA85\uC740 {projectDesc}\uC57C.
2735
- \uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0 {serviceName} \uC11C\uBE44\uC2A4\uB97C \uD558\uB098 \uCD94\uAC00\uD560 \uAC74\uB370 \uC774 \uD504\uB85C\uC81D\uD2B8\uB97C \uAE30\uBC18\uC73C\uB85C \uC774 \uC11C\uBE44\uC2A4\uC5D0 \uD544\uC694\uD558\uB2E4 \uC2F6\uC740 \uD544\uB4DC\uB97C \uCD94\uAC00\uD574\uC11C \uD15C\uD50C\uB9BF\uC5D0 \uC787\uB294 \uAC83\uB9CC \uCD94\uAC00\uD558\uC9C0 \uB9D0\uACE0 \uB108\uAC00 \uB17C\uB9AC\uC801\uC73C\uB85C \uD544\uC694\uD558\uB2E4 \uC2F6\uC740 \uD544\uB4DC\uB97C \uCD94\uAC00\uD574\uC11C constant.ts\uC640 dictionary.ts\uB97C \uB9CC\uB4E4\uC5B4\uC918
2736
- \uD30C\uC2F1\uD558\uAE30 \uC27D\uAC8C \uC544\uB798\uC5D0 \uADDC\uACA9\uC5D0 \uB9DE\uAC8C \uC815\uB9AC\uD574\uC11C \uC918
2737
- \uC528\uBC1C\uC544 \uD30C\uC2F1\uD558\uAE30 \uC27D\uAC8C \uB2EC\uB77C\uACE0 \uC544\uB798 \uADDC\uACA9 \uC548\uC5D0 \uC4F8\uB370\uC5C6\uB294 \uC0AC\uB2F4 \uCCD0 \uC9D1\uC5B4\uB123\uC9C0 \uC880 \uB9C8\uB77C
2738
- constantStart
2739
-
2740
- constantEnd
2741
-
2742
- dictionaryStart
2743
-
2744
- dictionaryEnd
2745
-
2746
2741
  `;
2747
2742
  var frameworkAbstract = `
2748
2743
  Intro
@@ -3157,12 +3152,13 @@ var requestApplication = () => `${frameworkDescription}
3157
3152
  {projectDesc}\uB97C \uAE30\uBC18\uC73C\uB85C \uC880 \uB354 \uC0C1\uC138\uD558\uAC8C \uC57D 100\uC790 \uC774\uC0C1\uC758 \uC124\uBA85\uC73C\uB85C \uB354 \uC0C1\uC138\uD558\uAC8C \uC124\uBA85\uD574\uC918.
3158
3153
  \uBC88\uC5ED\uB41C \uC5B8\uC5B4\uB85C en\uACFC {projectName}\uC5D0 \uC801\uD78C \uC5B8\uC5B4\uC640 \uB3D9\uC77C\uD55C \uC5B8\uC5B4\uAC00 \uD544\uC694\uD574. object\uC758 \uAC01\uAC01 \uC5B8\uC5B4\uC5D0 \uB9DE\uAC8C \uBC88\uC5ED\uD574\uC11C \uB123\uACE0 projectName\uC740 lowerCamelCase\uB85C \uB9CC\uB4E4\uC5B4\uC11C \uB123\uACE0 \uB744\uC5B4\uC4F0\uAE30\uB294 \uB2E4 \uC5C6\uC560.
3159
3154
 
3160
- \uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uB300\uD55C \uD0A4\uC6CC\uB4DC\uB97C 3\uAC1C \uC815\uB3C4 \uC120\uC815\uD558\uACE0 \uADF8 \uD0A4\uC6CC\uB4DC\uC5D0 \uC801\uD569\uD558\uACE0 \uC6F9\uC0AC\uC774\uD2B8\uB97C \uB9CC\uB4E4 \uB54C \uC88B\uC740 \uD1A4\uC744 \uACE0\uB824\uD55C \uD6C4 daisy UI\uC758 \uCEEC\uB7EC \uD314\uB808\uD2B8\uB8F0\uC5D0 \uC788\uB294 \uBAA8\uB4E0 \uD544\uB4DC\uB97C \uD558\uB098\uB3C4 \uBE60\uC9D0\uC5C6\uC774 \uCEEC\uB7EC\uB97C \uC120\uC815\uD574. light, dark \uB450 \uAC1C \uC815\uB3C4 \uD314\uB808\uD2B8\uAC00 \uC788\uC73C\uBA74 \uC88B\uACA0\uC5B4. \uBAA8\uB4DC\uAC00 \uB2E4\uB974\uB2E4\uACE0 \uB72C\uAE08\uC5C6\uB294 \uCEEC\uB7EC\uB97C \uCD94\uCC9C\uD558\uC9C0\uB9D0\uACE0 light\uC5D0 \uCD94\uCC9C\uB41C \uCEEC\uB7EC\uB97C \uAE30\uBC18\uC73C\uB85C \uAC01\uAC01\uC758 \uBAA8\uB4DC\uC5D0 \uC54C\uB9DE\uAC8C \uCC44\uB3C4 \uC815\uB3C4\uB9CC \uC870\uC815\uD574. \uB2E4\uB978 \uCEEC\uB7EC\uB4E4\uC740 primary\uC640 \uC870\uD654\uAC00 \uC5B4\uC6B8\uB9AC\uB294 \uCEEC\uB7EC\uC5EC\uC57C \uD574. \uC120\uC815\uD560 \uB54C \uAC01\uAC01\uC758 \uCEEC\uB7EC\uAC00 \uC720\uC0AC\uD558\uC9C0 \uC54A\uB3C4\uB85D \uD574.
3155
+ \uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uB300\uD55C \uD0A4\uC6CC\uB4DC\uB97C 3\uAC1C \uC815\uB3C4 \uC120\uC815\uD558\uACE0 \uADF8 \uD0A4\uC6CC\uB4DC\uC5D0 \uC801\uD569\uD558\uACE0 \uC6F9\uC0AC\uC774\uD2B8\uB97C \uB9CC\uB4E4 \uB54C \uC88B\uC740 \uD1A4\uC744 \uACE0\uB824\uD55C \uD6C4 daisy UI\uC758 \uCEEC\uB7EC \uD314\uB808\uD2B8 \uB8F0\uC5D0 \uC788\uB294 \uBAA8\uB4E0 \uD544\uB4DC\uB97C \uD558\uB098\uB3C4 \uBE60\uC9D0\uC5C6\uC774 \uCEEC\uB7EC\uB97C \uC120\uC815\uD574. light, dark \uB450 \uAC1C \uC815\uB3C4 \uD314\uB808\uD2B8\uAC00 \uC788\uC73C\uBA74 \uC88B\uACA0\uC5B4. \uBAA8\uB4DC\uAC00 \uB2E4\uB974\uB2E4\uACE0 \uB72C\uAE08\uC5C6\uB294 \uCEEC\uB7EC\uB97C \uCD94\uCC9C\uD558\uC9C0\uB9D0\uACE0 light\uC5D0 \uCD94\uCC9C\uB41C \uCEEC\uB7EC\uB97C \uAE30\uBC18\uC73C\uB85C \uAC01\uAC01\uC758 \uBAA8\uB4DC\uC5D0 \uC54C\uB9DE\uAC8C \uCC44\uB3C4 \uC815\uB3C4\uB9CC \uC870\uC815\uD574. \uB2E4\uB978 \uCEEC\uB7EC\uB4E4\uC740 primary\uC640 \uC870\uD654\uAC00 \uC5B4\uC6B8\uB9AC\uB294 \uCEEC\uB7EC\uC5EC\uC57C \uD574. \uC120\uC815\uD560 \uB54C \uAC01\uAC01\uC758 \uCEEC\uB7EC\uAC00 \uC720\uC0AC\uD558\uC9C0 \uC54A\uB3C4\uB85D \uD574.
3161
3156
 
3162
3157
  \uB0B4\uAC00 \uC0AC\uC804\uC5D0 \uC124\uBA85\uD55C index \uD398\uC774\uC9C0 \uD15C\uD50C\uB9BF\uC744 \uC124\uBA85\uD55C \uD504\uB85C\uC81D\uD2B8\uBA85\uACFC \uD504\uB85C\uC81D\uD2B8 \uC124\uBA85\uC5D0 \uB9DE\uAC8C\uB054 \uB9CC\uB4E4\uC5B4\uC918.
3163
3158
  \uACB0\uACFC\uB294 \uC544\uB798\uC758 \uADDC\uACA9\uC5D0 \uB9DE\uAC8C \uC81C\uACF5\uD574\uC57C\uB3FC.
3164
- \uC544\uB798 \uADDC\uACA9\uC5D0 \uB9DE\uAC8C \uD30C\uC2F1\uD560 \uAC70\uB77C\uC11C \uAF2D \uC9C0\uCF1C\uC918\uC57C\uD574. \uB2E4\uB978 \uBD80\uAC00\uC801\uC778 \uC4F8\uB370\uC5C6\uB294 \uB9D0 \uD558\uC9C0\uB9D0\uACE0 \uBC11\uC5D0 \uADDC\uACA9\uC5D0 \uB9DE\uAC8C \uC81C\uACF5\uD574. \uB300\uB2F5\uB3C4 \uD558\uC9C0\uB9C8. \`\`\`\uC774\uB534 \uAC83\uB3C4 \uB123\uC9C0\uB9C8 \uC528\uBC1C \uADF8\uB0E5 \uB0B4\uAC00 \uD558\uB77C\uB294 \uB300\uB85C\uB9CC\uD574 \uC790\uAFB8 \uB2C8 \uC886\uAC19\uC740 \uAC70 \uCD94\uAC00\uD558\uC9C0\uB9D0\uACE0
3159
+ \uC544\uB798 \uADDC\uACA9\uC5D0 \uB9DE\uAC8C \uD30C\uC2F1\uD560 \uAC70\uB77C\uC11C \uAF2D \uC9C0\uCF1C\uC918\uC57C\uD574. \uB2E4\uB978 \uBD80\uAC00\uC801\uC778 \uC4F8\uB370\uC5C6\uB294 \uB9D0 \uD558\uC9C0\uB9D0\uACE0 \uBC11\uC5D0 \uADDC\uACA9\uC5D0 \uB9DE\uAC8C \uC81C\uACF5\uD574.
3165
3160
 
3161
+ \`\`\`
3166
3162
  project.json
3167
3163
  {{
3168
3164
  [lang] :{{
@@ -3172,8 +3168,7 @@ project.json
3172
3168
  light : {{}},
3173
3169
  dark: {{}},
3174
3170
  }}
3175
- project.json_end
3176
-
3171
+ \`\`\`
3177
3172
  page.tsx
3178
3173
  index \uD398\uC774\uC9C0 \uD15C\uD50C\uB9BF
3179
3174
  page.tsx_end
@@ -3377,7 +3372,7 @@ var ApplicationRunner = class {
3377
3372
  app.log(`CSR server is running on http://localhost:4201`);
3378
3373
  }
3379
3374
  async #prepareIos(app) {
3380
- const isAdded = import_fs11.default.existsSync(`${app.cwdPath}/ios/App/Podfile`);
3375
+ const isAdded = import_fs12.default.existsSync(`${app.cwdPath}/ios/App/Podfile`);
3381
3376
  if (!isAdded) {
3382
3377
  await app.spawn("npx", ["cap", "add", "ios"]);
3383
3378
  await app.spawn("npx", ["@capacitor/assets", "generate"]);
@@ -3412,7 +3407,7 @@ var ApplicationRunner = class {
3412
3407
  await capacitorApp.releaseIos();
3413
3408
  }
3414
3409
  async #prepareAndroid(app) {
3415
- const isAdded = import_fs11.default.existsSync(`${app.cwdPath}/android/app/build.gradle`);
3410
+ const isAdded = import_fs12.default.existsSync(`${app.cwdPath}/android/app/build.gradle`);
3416
3411
  if (!isAdded) {
3417
3412
  await app.spawn("npx", ["cap", "add", "android"]);
3418
3413
  await app.spawn("npx", ["@capacitor/assets", "generate"]);
@@ -3495,14 +3490,14 @@ var ApplicationRunner = class {
3495
3490
  const buildRoot = `${app.workspace.workspaceRoot}/releases/builds/${app.name}`;
3496
3491
  const appVersionInfo = import_js_yaml2.default.load(app.readFile("config.yaml"));
3497
3492
  const platformVersion = appVersionInfo.platforms.android.versionName;
3498
- if (import_fs11.default.existsSync(buildRoot))
3493
+ if (import_fs12.default.existsSync(buildRoot))
3499
3494
  await import_promises2.default.rm(buildRoot, { recursive: true, force: true });
3500
3495
  await import_promises2.default.mkdir(buildRoot, { recursive: true });
3501
- if (rebuild || !import_fs11.default.existsSync(`${distApp.cwdPath}/backend`))
3496
+ if (rebuild || !import_fs12.default.existsSync(`${distApp.cwdPath}/backend`))
3502
3497
  await this.buildBackend(app, distApp);
3503
- if (rebuild || !import_fs11.default.existsSync(`${distApp.cwdPath}/frontend`))
3498
+ if (rebuild || !import_fs12.default.existsSync(`${distApp.cwdPath}/frontend`))
3504
3499
  await this.buildFrontend(app, distApp);
3505
- if (rebuild || !import_fs11.default.existsSync(`${distApp.cwdPath}/csr`))
3500
+ if (rebuild || !import_fs12.default.existsSync(`${distApp.cwdPath}/csr`))
3506
3501
  await this.buildCsr(app, distApp);
3507
3502
  const buildVersion = `${platformVersion}-${buildNum}`;
3508
3503
  const buildPath = `${buildRoot}/${buildVersion}`;
@@ -3517,7 +3512,7 @@ var ApplicationRunner = class {
3517
3512
  buildRoot,
3518
3513
  "./"
3519
3514
  ]);
3520
- if (import_fs11.default.existsSync(`${distApp.cwdPath}/csr`)) {
3515
+ if (import_fs12.default.existsSync(`${distApp.cwdPath}/csr`)) {
3521
3516
  await import_promises2.default.cp(`${distApp.cwdPath}/csr`, "./csr", { recursive: true });
3522
3517
  await app.workspace.spawn("zip", [
3523
3518
  "-r",
@@ -3527,7 +3522,7 @@ var ApplicationRunner = class {
3527
3522
  await import_promises2.default.rm("./csr", { recursive: true, force: true });
3528
3523
  }
3529
3524
  const sourceRoot = `${app.workspace.workspaceRoot}/releases/sources/${app.name}`;
3530
- if (import_fs11.default.existsSync(sourceRoot)) {
3525
+ if (import_fs12.default.existsSync(sourceRoot)) {
3531
3526
  const MAX_RETRY = 3;
3532
3527
  for (let i = 0; i < MAX_RETRY; i++) {
3533
3528
  try {
@@ -3547,7 +3542,7 @@ var ApplicationRunner = class {
3547
3542
  await Promise.all(
3548
3543
  [".next", "ios", "android", "public/libs"].map(async (path7) => {
3549
3544
  const targetPath = `${sourceRoot}/apps/${app.name}/${path7}`;
3550
- if (import_fs11.default.existsSync(targetPath))
3545
+ if (import_fs12.default.existsSync(targetPath))
3551
3546
  await import_promises2.default.rm(targetPath, { recursive: true, force: true });
3552
3547
  })
3553
3548
  );
@@ -3575,8 +3570,8 @@ var ApplicationRunner = class {
3575
3570
  []
3576
3571
  )
3577
3572
  ]);
3578
- import_fs11.default.writeFileSync(`${sourceRoot}/tsconfig.json`, JSON.stringify(tsconfig, null, 2));
3579
- import_fs11.default.writeFileSync(
3573
+ import_fs12.default.writeFileSync(`${sourceRoot}/tsconfig.json`, JSON.stringify(tsconfig, null, 2));
3574
+ import_fs12.default.writeFileSync(
3580
3575
  `${sourceRoot}/README.md`,
3581
3576
  `# ${app.name}
3582
3577
  \uBCF8 \uD504\uB85C\uC81D\uD2B8\uC758 \uC18C\uC2A4\uCF54\uB4DC \uBC0F \uAD00\uB828\uC790\uB8CC\uB294 \uBAA8\uB450 \uBE44\uBC00\uC815\uBCF4\uB85C \uAD00\uB9AC\uB429\uB2C8\uB2E4.
@@ -4003,7 +3998,7 @@ ApplicationCommand = __decorateClass([
4003
3998
  // pkgs/@akanjs/cli/src/package/package.runner.ts
4004
3999
  var esbuild2 = __toESM(require("esbuild"));
4005
4000
  var import_esbuild_plugin_d = require("esbuild-plugin-d.ts");
4006
- var import_fs12 = __toESM(require("fs"));
4001
+ var import_fs13 = __toESM(require("fs"));
4007
4002
  var import_promises3 = __toESM(require("fs/promises"));
4008
4003
  var PackageRunner = class {
4009
4004
  async version(workspace) {
@@ -4025,7 +4020,7 @@ var PackageRunner = class {
4025
4020
  async buildPackage(pkg, distPkg) {
4026
4021
  const rootPackageJson = pkg.workspace.readJson("package.json");
4027
4022
  const pkgJson = pkg.readJson("package.json");
4028
- if (import_fs12.default.existsSync(distPkg.cwdPath))
4023
+ if (import_fs13.default.existsSync(distPkg.cwdPath))
4029
4024
  await pkg.workspace.exec(`rm -rf ${distPkg.cwdPath}`);
4030
4025
  let buildResult;
4031
4026
  if (pkg.name === "@akanjs/config") {
@@ -4371,27 +4366,9 @@ LibraryCommand = __decorateClass([
4371
4366
  ], LibraryCommand);
4372
4367
 
4373
4368
  // pkgs/@akanjs/cli/src/module/module.runner.ts
4374
- var import_output_parsers2 = require("@langchain/core/output_parsers");
4375
- var import_prompts8 = require("@langchain/core/prompts");
4376
- var import_runnables3 = require("@langchain/core/runnables");
4377
- var import_openai4 = require("@langchain/openai");
4378
- var import_fs13 = __toESM(require("fs"));
4369
+ var import_fs14 = __toESM(require("fs"));
4379
4370
  var ModuleRunner = class {
4380
- async createModule(workspace, moduleName) {
4381
- const openAIApiKey = process.env.OPENAI_API_KEY;
4382
- if (!openAIApiKey)
4383
- throw new Error("OPENAI_API_KEY is not set");
4384
- const chatModel = new import_openai4.ChatOpenAI({ modelName: "gpt-4o", openAIApiKey });
4385
- const projectConfig = JSON.parse(import_fs13.default.readFileSync(`rootPath/projectConfig.json`, "utf-8"));
4386
- const mainPrompt = import_prompts8.PromptTemplate.fromTemplate(requestModule());
4387
- const chain = import_runnables3.RunnableSequence.from([mainPrompt, chatModel, new import_output_parsers2.StringOutputParser()]);
4388
- const resultOne = await chain.invoke({
4389
- projectName: projectConfig.en.projectName,
4390
- projectDesc: projectConfig.en.desc,
4391
- serviceName: moduleName
4392
- });
4393
- const constant = resultOne.slice(resultOne.search("constantStart") + 13, resultOne.search("constantEnd") - 1);
4394
- const dictionary = resultOne.slice(resultOne.search("dictionaryStart") + 15, resultOne.search("dictionaryEnd") - 1);
4371
+ async createModule(workspace, sysType, sysName, moduleName, description) {
4395
4372
  }
4396
4373
  async removeModule(workspace, name) {
4397
4374
  }
@@ -4413,11 +4390,67 @@ var ModuleRunner = class {
4413
4390
  }
4414
4391
  };
4415
4392
  }
4393
+ async createModuleTemplate(sys2, name) {
4394
+ const akanConfig = await sys2.getConfig();
4395
+ const scanResult = await sys2.scan({ akanConfig });
4396
+ await sys2.applyTemplate({
4397
+ basePath: `./lib/${name}`,
4398
+ template: "module",
4399
+ scanResult,
4400
+ dict: { model: name, Model: capitalize(name) }
4401
+ });
4402
+ await sys2.scan({ akanConfig });
4403
+ return {
4404
+ constant: { filename: `${name}.constant.ts`, content: sys2.readFile(`lib/module/${name}/${name}.constant.ts`) },
4405
+ dictionary: {
4406
+ filename: `${name}.dictionary.ts`,
4407
+ content: sys2.readFile(`lib/module/${name}/${name}.dictionary.ts`)
4408
+ },
4409
+ service: {
4410
+ filename: `${name}.service.ts`,
4411
+ content: sys2.readFile(`lib/module/${name}/${name}.service.ts`)
4412
+ },
4413
+ store: {
4414
+ filename: `${name}.store.ts`,
4415
+ content: sys2.readFile(`lib/module/${name}/${name}.store.ts`)
4416
+ },
4417
+ signal: {
4418
+ filename: `${name}.signal.ts`,
4419
+ content: sys2.readFile(`lib/module/${name}/${name}.signal.ts`)
4420
+ },
4421
+ test: {
4422
+ filename: `${name}.test.ts`,
4423
+ content: sys2.readFile(`lib/module/${name}/${name}.test.ts`)
4424
+ },
4425
+ unit: {
4426
+ filename: `${name}.Unit.tsx`,
4427
+ content: sys2.readFile(`lib/module/${name}/${name}.Unit.tsx`)
4428
+ },
4429
+ view: {
4430
+ filename: `${name}.View.tsx`,
4431
+ content: sys2.readFile(`lib/module/${name}/${name}.View.tsx`)
4432
+ },
4433
+ template: {
4434
+ filename: `${name}.Template.tsx`,
4435
+ content: sys2.readFile(`lib/module/${name}/${name}.Template.tsx`)
4436
+ },
4437
+ zone: {
4438
+ filename: `${name}.Zone.tsx`,
4439
+ content: sys2.readFile(`lib/module/${name}/${name}.Zone.tsx`)
4440
+ },
4441
+ util: {
4442
+ filename: `${name}.Util.tsx`,
4443
+ content: sys2.readFile(`lib/module/${name}/${name}.Util.tsx`)
4444
+ }
4445
+ };
4446
+ }
4416
4447
  async createUnit(sys2, modelName) {
4417
4448
  const modelFileData = getModelFileData(sys2.cwdPath, modelName);
4418
4449
  const { paths } = getRelatedCnsts(modelFileData.constantFilePath);
4419
4450
  const names = { model: modelName, Model: capitalize(modelName), LightModel: `Light${capitalize(modelName)}` };
4420
- const prompt = `\uB108\uB294 React, Typescript, TailwindCSS\uB97C \uAE30\uBC18\uC73C\uB85C \uCF54\uB529\uD558\uB294 \uD504\uB860\uD2B8\uC5D4\uB4DC \uAC1C\uBC1C\uC790\uC57C.
4451
+ const prompt = `
4452
+
4453
+ \uB108\uB294 React, Typescript, TailwindCSS\uB97C \uAE30\uBC18\uC73C\uB85C \uCF54\uB529\uD558\uB294 \uD504\uB860\uD2B8\uC5D4\uB4DC \uAC1C\uBC1C\uC790\uC57C.
4421
4454
  ${names.Model}\uC774\uB77C\uB294 \uB3C4\uBA54\uC778\uC5D0 \uB300\uD574\uC11C ${names.LightModel} \uC2A4\uD0A4\uB9C8\uB97C \uB300\uC0C1\uC73C\uB85C react component\uB97C \uB514\uC790\uC778\uD558\uB824\uACE0 \uD574. \uC544\uB798\uB294 \uD604\uC7AC \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8 \uD615\uD0DC\uC758 \uCEF4\uD3EC\uB10C\uD2B8\uC57C.
4422
4455
 
4423
4456
  \`\`\`
@@ -4436,7 +4469,7 @@ ${paths ? new Array(paths.size).fill(0).map((_, index) => {
4436
4469
  if (!filePath)
4437
4470
  throw new Error("filePath is undefined");
4438
4471
  return `${key}
4439
- \`\`\`${import_fs13.default.readFileSync(filePath, "utf8")}\`\`\`\`
4472
+ \`\`\`${import_fs14.default.readFileSync(filePath, "utf8")}\`\`\`\`
4440
4473
 
4441
4474
  `;
4442
4475
  }) : ""}
@@ -4451,67 +4484,37 @@ css\uB77C\uC774\uBE0C\uB7EC\uB9AC\uB294 DaisyUI\uB97C \uAE30\uBC18\uC73C\uB85C \
4451
4484
  ${names.Model}.Unit.Card\uC758 \uB9AC\uC561\uD2B8 \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uB514\uC790\uC778\uD574\uC11C \uC791\uC131\uD574\uC918.
4452
4485
  `;
4453
4486
  try {
4454
- import_fs13.default.writeFileSync("./local/prompt.txt", prompt);
4487
+ import_fs14.default.writeFileSync("./local/prompt.txt", prompt);
4455
4488
  const { content } = await streamAi(prompt, (chunk) => {
4456
4489
  process.stdout.write(chunk);
4457
4490
  });
4458
- import_fs13.default.writeFileSync("./local/result.txt", content);
4491
+ import_fs14.default.writeFileSync("./local/result.txt", content);
4459
4492
  } catch (error) {
4460
4493
  }
4461
4494
  }
4462
4495
  async createView(sys2, modelName) {
4463
- const modelFileData = getModelFileData(sys2.cwdPath, modelName);
4464
- const { paths } = getRelatedCnsts(modelFileData.constantFilePath);
4465
- const names = { model: modelName, Model: capitalize(modelName), LightModel: `Light${capitalize(modelName)}` };
4466
- const prompt = `\uB108\uB294 React, Typescript, TailwindCSS\uB97C \uAE30\uBC18\uC73C\uB85C \uCF54\uB529\uD558\uB294 \uD504\uB860\uD2B8\uC5D4\uB4DC \uAC1C\uBC1C\uC790\uC57C.
4467
- ${names.Model}\uC774\uB77C\uB294 \uB3C4\uBA54\uC778\uC5D0 \uB300\uD574\uC11C ${names.Model} \uC2A4\uD0A4\uB9C8\uB97C \uB300\uC0C1\uC73C\uB85C react component\uB97C \uB514\uC790\uC778\uD558\uB824\uACE0 \uD574. \uC544\uB798\uB294 \uD604\uC7AC \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8 \uD615\uD0DC\uC758 \uCEF4\uD3EC\uB10C\uD2B8\uC57C.
4468
-
4469
- \`\`\`
4470
- ${modelFileData.viewFileStr}
4471
- \`\`\`
4472
-
4473
- ${names.Model}\uC740 \uB2E4\uC74C\uACFC \uAC19\uC774 ${names.Model}Input\uACFC ${names.Model}Object\uAC00 \uD569\uCCD0\uC9C4 Full \uD615\uD0DC\uB85C \uC124\uACC4\uB418\uC5B4\uC788\uC5B4.
4474
- \`\`\`
4475
- ${modelFileData.constantFileStr}
4476
- \`\`\`
4477
-
4478
- \uC544\uB798\uB294 \uD604\uC7AC \uC2A4\uD0A4\uB9C8\uC640 \uC5F0\uAD00\uB41C \uC2A4\uD0A4\uB9C8 \uD30C\uC77C\uB4E4\uC774\uC57C. \uC2A4\uD0A4\uB9C8 \uD30C\uC77C\uB4E4\uC758 \uCF54\uB4DC\uB4E4\uC744 \uBCF4\uACE0 \uC11C\uB85C \uC5B4\uB5BB\uAC8C \uC5F0\uACC4 \uB418\uC5B4\uC788\uB294\uC9C0 \uC774\uD574\uD558\uB3C4\uB85D \uD574.
4479
- ${paths ? new Array(paths.size).fill(0).map((_, index) => {
4480
- const key = Array.from(paths.keys())[index];
4481
- const filePath = paths.get(key)?.filePath;
4482
- if (!filePath)
4483
- throw new Error("filePath is undefined");
4484
- return `${key}
4485
- \`\`\`${import_fs13.default.readFileSync(filePath, "utf8")}\`\`\`\`
4486
-
4487
- `;
4488
- }) : ""}
4489
-
4490
- \uCD94\uAC00\uB85C, \uB9CC\uC57D\uC5D0 \uC544\uC774\uCF58 \uC0AC\uC6A9\uC774 \uD544\uC694\uD558\uBA74 react-icons/bi \uB77C\uC774\uBE0C\uB7EC\uB9AC\uC5D0\uC11C \uC0AC\uC6A9\uD574\uC918.
4491
- \uB610, \uC0C9\uC0C1\uC744 \uC0AC\uC6A9\uD558\uB824\uACE0 \uD558\uBA74 \uD558\uB4DC\uCF54\uB529\uB41C \uC0C9\uC0C1(bg-red)\uC774 \uC544\uB2CC \uD14C\uB9C8 \uC0C9\uC0C1(bg-primary)\uC744 \uC0AC\uC6A9\uD574\uC11C \uC791\uC131\uD574\uC918.
4492
- \uADF8\uB9AC\uACE0 optional\uD55C \uD544\uB4DC\uB294 field && <div>... \uAC00 \uC544\uB2CC, field ? <div>... : null \uD615\uD0DC\uB85C \uC791\uC131\uD574\uC918.
4493
- css\uB77C\uC774\uBE0C\uB7EC\uB9AC\uB294 DaisyUI\uB97C \uAE30\uBC18\uC73C\uB85C \uC791\uC131\uD574\uC8FC\uB294\uB370, btn, input, badge\uC640 \uAC19\uC740 \uB2E8\uC21C\uD55C \uAE30\uBCF8 css\uB294 \uC0AC\uC6A9\uD574\uB3C4 \uAD1C\uCC2E\uC544. \uADF8\uB7F0\uB370 card, hero\uAC19\uC774 \uBCF5\uC7A1\uD55C \uCEF4\uD3EC\uB10C\uD2B8\uB294 \uC0AC\uC6A9\uD558\uBA74 \uC548\uB3FC.
4494
- \uC870\uAC74\uBD80 className\uC774 \uD544\uC694\uD55C \uACBD\uC6B0\uC5D0\uB294 clsx \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB97C \uC0AC\uC6A9\uD574\uC11C \uC791\uC131\uD574\uC57C\uD574.
4495
- \uBAA8\uB378\uC5D0 \uB300\uD574\uC11C object destructuring\uC740 \uD558\uC9C0\uB9D0\uACE0 ${modelName}.field \uD615\uD0DC\uB85C \uC811\uADFC\uD558\uAC8C \uCF54\uB4DC\uB97C \uC791\uC131\uD574\uC57C\uD574.
4496
-
4497
- ${names.Model}.View.General \uB9AC\uC561\uD2B8 \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uB514\uC790\uC778\uD574\uC11C \uC791\uC131\uD574\uC918.
4498
- `;
4499
- try {
4500
- import_fs13.default.writeFileSync("./local/prompt.txt", prompt);
4501
- const { content } = await streamAi(prompt, (chunk) => {
4502
- process.stdout.write(chunk);
4503
- });
4504
- import_fs13.default.writeFileSync("./local/result.txt", content);
4505
- } catch (error) {
4506
- }
4507
4496
  }
4508
4497
  };
4509
4498
 
4510
4499
  // pkgs/@akanjs/cli/src/module/module.script.ts
4511
4500
  var ModuleScript = class {
4512
4501
  #runner = new ModuleRunner();
4513
- async createModule(workspace, name) {
4514
- await this.#runner.createModule(workspace, name);
4502
+ async createModule(sys2) {
4503
+ const [appNames, libNames] = await sys2.workspace.getSyss();
4504
+ const constantExampleFiles = [
4505
+ ...(await Promise.all(
4506
+ appNames.map(async (appName) => {
4507
+ const app = AppExecutor.from(sys2.workspace, appName);
4508
+ const databaseModules = await app.getDatabaseModules();
4509
+ return await Promise.all(
4510
+ databaseModules.map((databaseModule) => ({
4511
+ path: `${appName}/${databaseModule}/${databaseModule}.constant.ts`,
4512
+ content: app.readFile(`lib/${databaseModule}/${databaseModule}.constant.ts`)
4513
+ }))
4514
+ );
4515
+ })
4516
+ )).flat()
4517
+ ];
4515
4518
  }
4516
4519
  async removeModule(workspace, name) {
4517
4520
  }
@@ -4539,16 +4542,42 @@ var ModuleScript = class {
4539
4542
  const sys2 = type === "app" ? AppExecutor.from(workspace, appOrLibName) : LibExecutor.from(workspace, appOrLibName);
4540
4543
  await this.#runner.createUnit(sys2, modelName);
4541
4544
  }
4542
- async createView(workspace, type, appOrLibName, modelName) {
4543
- const sys2 = type === "app" ? AppExecutor.from(workspace, appOrLibName) : LibExecutor.from(workspace, appOrLibName);
4544
- await this.#runner.createView(sys2, modelName);
4545
+ async createView(sys2) {
4546
+ const [appNames, libNames] = await sys2.workspace.getSyss();
4547
+ const viewExampleFiles = [
4548
+ ...(await Promise.all(
4549
+ appNames.map(async (appName) => {
4550
+ const app = AppExecutor.from(sys2.workspace, appName);
4551
+ const viewModules = await app.getViewModules();
4552
+ return await Promise.all(
4553
+ viewModules.map((viewModule) => ({
4554
+ path: `${appName}/${viewModule}/${viewModule}.View.tsx`,
4555
+ content: app.readFile(`lib/${viewModule}/${viewModule}.View.tsx`)
4556
+ }))
4557
+ );
4558
+ })
4559
+ )).flat(),
4560
+ ...(await Promise.all(
4561
+ libNames.map(async (libName) => {
4562
+ const lib = LibExecutor.from(sys2.workspace, libName);
4563
+ const viewModules = await lib.getViewModules();
4564
+ return await Promise.all(
4565
+ viewModules.map((viewModule) => ({
4566
+ path: `${libName}/${viewModule}/${viewModule}.View.tsx`,
4567
+ content: lib.readFile(`lib/${viewModule}/${viewModule}.View.tsx`)
4568
+ }))
4569
+ );
4570
+ })
4571
+ )).flat()
4572
+ ];
4545
4573
  }
4546
4574
  };
4547
4575
 
4548
4576
  // pkgs/@akanjs/cli/src/module/module.command.ts
4549
4577
  var ModuleCommand = class {
4550
4578
  moduleScript = new ModuleScript();
4551
- async createModule(name, workspace) {
4579
+ async createModule(sys2, workspace) {
4580
+ await this.moduleScript.createModule(sys2);
4552
4581
  }
4553
4582
  async removeModule(name, workspace) {
4554
4583
  }
@@ -4561,14 +4590,15 @@ var ModuleCommand = class {
4561
4590
  }
4562
4591
  async createTest(name, workspace) {
4563
4592
  }
4564
- async createView(name, workspace) {
4593
+ async createView(sys2, workspace) {
4594
+ await this.moduleScript.createView(sys2);
4565
4595
  }
4566
4596
  async createUnit(name, workspace) {
4567
4597
  }
4568
4598
  };
4569
4599
  __decorateClass([
4570
4600
  Target.Public(),
4571
- __decorateParam(0, Option("name", { desc: "name of module" })),
4601
+ __decorateParam(0, Sys()),
4572
4602
  __decorateParam(1, Workspace())
4573
4603
  ], ModuleCommand.prototype, "createModule", 1);
4574
4604
  __decorateClass([
@@ -4601,7 +4631,7 @@ __decorateClass([
4601
4631
  ], ModuleCommand.prototype, "createTest", 1);
4602
4632
  __decorateClass([
4603
4633
  Target.Public(),
4604
- __decorateParam(0, Option("name", { desc: "name of view module" })),
4634
+ __decorateParam(0, Sys()),
4605
4635
  __decorateParam(1, Workspace())
4606
4636
  ], ModuleCommand.prototype, "createView", 1);
4607
4637
  __decorateClass([