@akanjs/cli 0.0.82 → 0.0.84
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 +373 -344
- package/package.json +1 -1
- package/pkgs/@akanjs/cli/src/module/module.command.d.ts +2 -2
- package/pkgs/@akanjs/cli/src/module/module.prompt.d.ts +13 -2
- package/pkgs/@akanjs/cli/src/module/module.runner.d.ts +47 -1
- package/pkgs/@akanjs/cli/src/module/module.script.d.ts +2 -2
- package/pkgs/@akanjs/devkit/src/executors.d.ts +1 -0
- package/src/templates/workspaceRoot/.gitignore.template +1 -0
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
|
|
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,
|
|
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
|
|
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.
|
|
2327
|
-
|
|
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
|
-
|
|
2341
|
+
|
|
2335
2342
|
\`\`\`
|
|
2336
|
-
import {
|
|
2337
|
-
import {
|
|
2343
|
+
import { enumOf, Int } from "@akanjs/base";
|
|
2344
|
+
import { Field, Filter, Model, sortOf, via } from "@akanjs/constant";
|
|
2338
2345
|
|
|
2339
|
-
export const
|
|
2340
|
-
export type
|
|
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("
|
|
2344
|
-
export class
|
|
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("
|
|
2357
|
-
export class
|
|
2358
|
-
@Field.Prop(() => String, {{ enum:
|
|
2359
|
-
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
|
|
2364
|
-
export class Light
|
|
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("
|
|
2368
|
-
export class
|
|
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("
|
|
2372
|
-
export class
|
|
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("
|
|
2379
|
-
export class
|
|
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
|
|
2391
|
+
total\${dict.Model}: number;
|
|
2382
2392
|
}}
|
|
2383
2393
|
|
|
2384
|
-
|
|
2385
|
-
export
|
|
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 {
|
|
2398
|
-
|
|
2399
|
-
|
|
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: ["
|
|
2414
|
+
modelName: ["\${dict.Model}", "\${dict.Model}"],
|
|
2404
2415
|
modelDesc: [
|
|
2405
|
-
"
|
|
2406
|
-
"
|
|
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": ["
|
|
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
|
|
2437
|
+
}} satisfies ModelDictionary<\${dict.Model}, \${dict.Model}Insight, typeof \${dict.Model}Sort>;
|
|
2427
2438
|
|
|
2428
|
-
export const
|
|
2439
|
+
export const \${dict.Model}SummaryDictionary = {{
|
|
2429
2440
|
// * ==================== Summary ==================== * //
|
|
2430
|
-
total
|
|
2431
|
-
"desc-total
|
|
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
|
|
2444
|
+
}} satisfies SummaryDictionary<\${dict.Model}Summary>;
|
|
2434
2445
|
|
|
2435
2446
|
const signalDictionary = {{
|
|
2436
|
-
...getBaseSignalTrans("
|
|
2447
|
+
...getBaseSignalTrans("\${dict.Model}" as const),
|
|
2437
2448
|
// * ==================== Endpoint ==================== * //
|
|
2438
|
-
"api
|
|
2439
|
-
"apidesc
|
|
2440
|
-
"arg
|
|
2441
|
-
"argdesc
|
|
2442
|
-
"arg
|
|
2443
|
-
"argdesc
|
|
2444
|
-
"arg
|
|
2445
|
-
"argdesc
|
|
2446
|
-
"arg
|
|
2447
|
-
"argdesc
|
|
2448
|
-
|
|
2449
|
-
"api
|
|
2450
|
-
"apidesc
|
|
2451
|
-
"Get insight data for public
|
|
2452
|
-
"\uACF5\uAC1C\uB41C
|
|
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
|
|
2455
|
-
"argdesc
|
|
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
|
|
2468
|
+
}} satisfies SignalDictionary<\${dict.Model}Signal, \${dict.Model}>;
|
|
2458
2469
|
\`\`\`
|
|
2459
|
-
export const
|
|
2470
|
+
export const \${dict.model}Dictionary = {{ ...modelDictionary, ...signalDictionary }};
|
|
2460
2471
|
|
|
2461
2472
|
|
|
2462
2473
|
|
|
2463
2474
|
model.document.ts
|
|
2464
2475
|
\`\`\`
|
|
2465
|
-
import {
|
|
2466
|
-
import {{ cnst }} from "../cnst";
|
|
2476
|
+
import { beyond, by, Database, into, type SchemaOf } from "@akanjs/document";
|
|
2467
2477
|
|
|
2468
|
-
|
|
2469
|
-
|
|
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
|
|
2472
|
-
export class
|
|
2482
|
+
@Database.Document(() => cnst.\${dict.Model})
|
|
2483
|
+
export class \${dict.Model} extends by(cnst.\${dict.Model}) {}
|
|
2473
2484
|
|
|
2474
|
-
@Database.Model(() => cnst
|
|
2475
|
-
export class
|
|
2476
|
-
async getSummary(): Promise<cnst
|
|
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
|
|
2484
|
-
export class
|
|
2485
|
-
onSchema(schema: SchemaOf
|
|
2486
|
-
// schema.index({
|
|
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 {
|
|
2494
|
-
import {{ Int }} from "@akanjs/base";
|
|
2495
|
-
import {{ Srvs, cnst }} from "../cnst";
|
|
2509
|
+
import { cnst, Srvs } from "../cnst";
|
|
2496
2510
|
|
|
2497
|
-
@Signal(() => cnst
|
|
2498
|
-
export class
|
|
2499
|
-
guards: {
|
|
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
|
|
2504
|
-
async
|
|
2505
|
-
@Arg.Query("statuses", () => [String], {
|
|
2506
|
-
@Arg.Query("skip", () => Int, {
|
|
2507
|
-
@Arg.Query("limit", () => Int, {
|
|
2508
|
-
@Arg.Query("sort", () => String, {
|
|
2509
|
-
) {
|
|
2510
|
-
const
|
|
2511
|
-
return resolve<cnst
|
|
2512
|
-
}
|
|
2513
|
-
@Query.Public(() => cnst
|
|
2514
|
-
async
|
|
2515
|
-
|
|
2516
|
-
|
|
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
|
-
|
|
2528
|
-
|
|
2529
|
-
|
|
2530
|
-
|
|
2531
|
-
|
|
2532
|
-
|
|
2533
|
-
|
|
2534
|
-
|
|
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 {
|
|
2548
|
-
|
|
2549
|
-
import {
|
|
2560
|
+
import { stateOf, Store } from "@akanjs/store";
|
|
2561
|
+
|
|
2562
|
+
import { cnst } from "../cnst";
|
|
2563
|
+
import { fetch } from "../fetch";
|
|
2550
2564
|
|
|
2551
|
-
@Store(() => cnst
|
|
2552
|
-
export class
|
|
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 {
|
|
2564
|
-
import {
|
|
2565
|
-
import {
|
|
2566
|
-
import {
|
|
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 = ({
|
|
2582
|
+
export const Admin = ({ sliceName = "\${dict.model}", init, query }: ModelsProps<cnst.\${dict.Model}>>) => {
|
|
2570
2583
|
return (
|
|
2571
2584
|
<Data.ListContainer
|
|
2572
|
-
init={
|
|
2573
|
-
query={
|
|
2574
|
-
sliceName={
|
|
2575
|
-
renderItem={{
|
|
2576
|
-
renderDashboard={{
|
|
2577
|
-
renderInsight={{
|
|
2578
|
-
renderTemplate={{
|
|
2579
|
-
renderTitle={{
|
|
2580
|
-
renderView={{
|
|
2581
|
-
|
|
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={{
|
|
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<"
|
|
2596
|
-
}
|
|
2597
|
-
export const Card = ({
|
|
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={
|
|
2601
|
-
init={
|
|
2602
|
-
renderItem={{
|
|
2603
|
-
|
|
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<"
|
|
2612
|
-
}
|
|
2613
|
-
export const View = ({
|
|
2614
|
-
return <Load.View view={
|
|
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 {
|
|
2622
|
-
import {
|
|
2623
|
-
import {
|
|
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
|
|
2626
|
-
|
|
2627
|
-
}
|
|
2637
|
+
interface \${dict.Model}EditProps {
|
|
2638
|
+
\${dict.model}Id?: string | null;
|
|
2639
|
+
}
|
|
2628
2640
|
|
|
2629
|
-
export const General = ({{
|
|
2630
|
-
const
|
|
2631
|
-
const {
|
|
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={
|
|
2636
|
-
desc={
|
|
2637
|
-
value={{
|
|
2638
|
-
onChange={
|
|
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 {
|
|
2649
|
-
import {
|
|
2650
|
-
import {
|
|
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 = ({{
|
|
2664
|
+
export const Card = ({ \${dict.model}, href }: ModelProps<"\${dict.model}", cnst.Light\${dict.Model}>>) => {
|
|
2653
2665
|
return (
|
|
2654
|
-
<Link href={
|
|
2655
|
-
<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 {
|
|
2666
|
-
import {
|
|
2667
|
-
import {
|
|
2668
|
-
import {
|
|
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 = "
|
|
2674
|
-
queryMap = getQueryMap(cnst
|
|
2685
|
+
sliceName = "\${dict.model}",
|
|
2686
|
+
queryMap = getQueryMap(cnst.\${dict.Model}Summary),
|
|
2675
2687
|
hidePresents,
|
|
2676
|
-
}
|
|
2688
|
+
}: ModelDashboardProps<cnst.Summary>) => {
|
|
2677
2689
|
return (
|
|
2678
2690
|
<Data.Dashboard
|
|
2679
|
-
className={
|
|
2680
|
-
summary={
|
|
2681
|
-
sliceName={
|
|
2682
|
-
queryMap={
|
|
2683
|
-
columns={
|
|
2684
|
-
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 = "
|
|
2693
|
-
}
|
|
2704
|
+
sliceName = "\${dict.model}",
|
|
2705
|
+
}: ModelInsightProps<cnst.\${dict.Model}Insight>) => {
|
|
2694
2706
|
return (
|
|
2695
2707
|
<Data.Insight
|
|
2696
|
-
className={
|
|
2697
|
-
insight={
|
|
2698
|
-
sliceName={
|
|
2699
|
-
columns={
|
|
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 {
|
|
2709
|
-
import {
|
|
2710
|
-
import {
|
|
2720
|
+
import { clsx } from "@akanjs/client";
|
|
2721
|
+
import { cnst } from "@\${dict.appName}/client";
|
|
2722
|
+
import { Image } from "@util/ui";
|
|
2711
2723
|
|
|
2712
|
-
interface
|
|
2724
|
+
interface \${dict.Model}ViewProps {
|
|
2713
2725
|
className?: string;
|
|
2714
|
-
|
|
2715
|
-
self?: {
|
|
2716
|
-
}
|
|
2726
|
+
\${dict.model}: cnst.\${dict.Model};
|
|
2727
|
+
self?: { id?: string } | null;
|
|
2728
|
+
}
|
|
2717
2729
|
|
|
2718
|
-
export const General = ({
|
|
2730
|
+
export const General = ({ className, \${dict.model}, self }: \${dict.Model}ViewProps) => {
|
|
2719
2731
|
return (
|
|
2720
|
-
<div className={
|
|
2721
|
-
<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.
|
|
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
|
-
|
|
3176
|
-
|
|
3171
|
+
\`\`\`
|
|
3177
3172
|
page.tsx
|
|
3178
3173
|
index \uD398\uC774\uC9C0 \uD15C\uD50C\uB9BF
|
|
3179
3174
|
page.tsx_end
|
|
@@ -3271,14 +3266,13 @@ var ApplicationRunner = class {
|
|
|
3271
3266
|
packages: "external",
|
|
3272
3267
|
platform: "node",
|
|
3273
3268
|
format: "cjs",
|
|
3274
|
-
write:
|
|
3269
|
+
write: false,
|
|
3275
3270
|
logLevel: "warning",
|
|
3276
3271
|
footer: { js: "module.exports = module.exports.default;" }
|
|
3277
3272
|
});
|
|
3278
3273
|
const rootPackageJson = app.workspace.readJson("package.json");
|
|
3279
|
-
const dependencies =
|
|
3280
|
-
|
|
3281
|
-
buildResult.outputFiles.map((file) => distApp.writeFile(file.path, file.text));
|
|
3274
|
+
const dependencies = extractDependencies(buildResult.outputFiles, rootPackageJson, ["next", "react", "react-dom"]);
|
|
3275
|
+
buildResult.outputFiles.map((file) => distApp.writeFile(file.path, file.text));
|
|
3282
3276
|
const appPackageJson = {
|
|
3283
3277
|
name: `${app.name}/frontend`,
|
|
3284
3278
|
description: `${app.name} frontend`,
|
|
@@ -3377,7 +3371,7 @@ var ApplicationRunner = class {
|
|
|
3377
3371
|
app.log(`CSR server is running on http://localhost:4201`);
|
|
3378
3372
|
}
|
|
3379
3373
|
async #prepareIos(app) {
|
|
3380
|
-
const isAdded =
|
|
3374
|
+
const isAdded = import_fs12.default.existsSync(`${app.cwdPath}/ios/App/Podfile`);
|
|
3381
3375
|
if (!isAdded) {
|
|
3382
3376
|
await app.spawn("npx", ["cap", "add", "ios"]);
|
|
3383
3377
|
await app.spawn("npx", ["@capacitor/assets", "generate"]);
|
|
@@ -3412,7 +3406,7 @@ var ApplicationRunner = class {
|
|
|
3412
3406
|
await capacitorApp.releaseIos();
|
|
3413
3407
|
}
|
|
3414
3408
|
async #prepareAndroid(app) {
|
|
3415
|
-
const isAdded =
|
|
3409
|
+
const isAdded = import_fs12.default.existsSync(`${app.cwdPath}/android/app/build.gradle`);
|
|
3416
3410
|
if (!isAdded) {
|
|
3417
3411
|
await app.spawn("npx", ["cap", "add", "android"]);
|
|
3418
3412
|
await app.spawn("npx", ["@capacitor/assets", "generate"]);
|
|
@@ -3495,14 +3489,14 @@ var ApplicationRunner = class {
|
|
|
3495
3489
|
const buildRoot = `${app.workspace.workspaceRoot}/releases/builds/${app.name}`;
|
|
3496
3490
|
const appVersionInfo = import_js_yaml2.default.load(app.readFile("config.yaml"));
|
|
3497
3491
|
const platformVersion = appVersionInfo.platforms.android.versionName;
|
|
3498
|
-
if (
|
|
3492
|
+
if (import_fs12.default.existsSync(buildRoot))
|
|
3499
3493
|
await import_promises2.default.rm(buildRoot, { recursive: true, force: true });
|
|
3500
3494
|
await import_promises2.default.mkdir(buildRoot, { recursive: true });
|
|
3501
|
-
if (rebuild || !
|
|
3495
|
+
if (rebuild || !import_fs12.default.existsSync(`${distApp.cwdPath}/backend`))
|
|
3502
3496
|
await this.buildBackend(app, distApp);
|
|
3503
|
-
if (rebuild || !
|
|
3497
|
+
if (rebuild || !import_fs12.default.existsSync(`${distApp.cwdPath}/frontend`))
|
|
3504
3498
|
await this.buildFrontend(app, distApp);
|
|
3505
|
-
if (rebuild || !
|
|
3499
|
+
if (rebuild || !import_fs12.default.existsSync(`${distApp.cwdPath}/csr`))
|
|
3506
3500
|
await this.buildCsr(app, distApp);
|
|
3507
3501
|
const buildVersion = `${platformVersion}-${buildNum}`;
|
|
3508
3502
|
const buildPath = `${buildRoot}/${buildVersion}`;
|
|
@@ -3517,7 +3511,7 @@ var ApplicationRunner = class {
|
|
|
3517
3511
|
buildRoot,
|
|
3518
3512
|
"./"
|
|
3519
3513
|
]);
|
|
3520
|
-
if (
|
|
3514
|
+
if (import_fs12.default.existsSync(`${distApp.cwdPath}/csr`)) {
|
|
3521
3515
|
await import_promises2.default.cp(`${distApp.cwdPath}/csr`, "./csr", { recursive: true });
|
|
3522
3516
|
await app.workspace.spawn("zip", [
|
|
3523
3517
|
"-r",
|
|
@@ -3527,7 +3521,7 @@ var ApplicationRunner = class {
|
|
|
3527
3521
|
await import_promises2.default.rm("./csr", { recursive: true, force: true });
|
|
3528
3522
|
}
|
|
3529
3523
|
const sourceRoot = `${app.workspace.workspaceRoot}/releases/sources/${app.name}`;
|
|
3530
|
-
if (
|
|
3524
|
+
if (import_fs12.default.existsSync(sourceRoot)) {
|
|
3531
3525
|
const MAX_RETRY = 3;
|
|
3532
3526
|
for (let i = 0; i < MAX_RETRY; i++) {
|
|
3533
3527
|
try {
|
|
@@ -3547,7 +3541,7 @@ var ApplicationRunner = class {
|
|
|
3547
3541
|
await Promise.all(
|
|
3548
3542
|
[".next", "ios", "android", "public/libs"].map(async (path7) => {
|
|
3549
3543
|
const targetPath = `${sourceRoot}/apps/${app.name}/${path7}`;
|
|
3550
|
-
if (
|
|
3544
|
+
if (import_fs12.default.existsSync(targetPath))
|
|
3551
3545
|
await import_promises2.default.rm(targetPath, { recursive: true, force: true });
|
|
3552
3546
|
})
|
|
3553
3547
|
);
|
|
@@ -3575,8 +3569,8 @@ var ApplicationRunner = class {
|
|
|
3575
3569
|
[]
|
|
3576
3570
|
)
|
|
3577
3571
|
]);
|
|
3578
|
-
|
|
3579
|
-
|
|
3572
|
+
import_fs12.default.writeFileSync(`${sourceRoot}/tsconfig.json`, JSON.stringify(tsconfig, null, 2));
|
|
3573
|
+
import_fs12.default.writeFileSync(
|
|
3580
3574
|
`${sourceRoot}/README.md`,
|
|
3581
3575
|
`# ${app.name}
|
|
3582
3576
|
\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 +3997,7 @@ ApplicationCommand = __decorateClass([
|
|
|
4003
3997
|
// pkgs/@akanjs/cli/src/package/package.runner.ts
|
|
4004
3998
|
var esbuild2 = __toESM(require("esbuild"));
|
|
4005
3999
|
var import_esbuild_plugin_d = require("esbuild-plugin-d.ts");
|
|
4006
|
-
var
|
|
4000
|
+
var import_fs13 = __toESM(require("fs"));
|
|
4007
4001
|
var import_promises3 = __toESM(require("fs/promises"));
|
|
4008
4002
|
var PackageRunner = class {
|
|
4009
4003
|
async version(workspace) {
|
|
@@ -4025,7 +4019,7 @@ var PackageRunner = class {
|
|
|
4025
4019
|
async buildPackage(pkg, distPkg) {
|
|
4026
4020
|
const rootPackageJson = pkg.workspace.readJson("package.json");
|
|
4027
4021
|
const pkgJson = pkg.readJson("package.json");
|
|
4028
|
-
if (
|
|
4022
|
+
if (import_fs13.default.existsSync(distPkg.cwdPath))
|
|
4029
4023
|
await pkg.workspace.exec(`rm -rf ${distPkg.cwdPath}`);
|
|
4030
4024
|
let buildResult;
|
|
4031
4025
|
if (pkg.name === "@akanjs/config") {
|
|
@@ -4371,27 +4365,9 @@ LibraryCommand = __decorateClass([
|
|
|
4371
4365
|
], LibraryCommand);
|
|
4372
4366
|
|
|
4373
4367
|
// pkgs/@akanjs/cli/src/module/module.runner.ts
|
|
4374
|
-
var
|
|
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"));
|
|
4368
|
+
var import_fs14 = __toESM(require("fs"));
|
|
4379
4369
|
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);
|
|
4370
|
+
async createModule(workspace, sysType, sysName, moduleName, description) {
|
|
4395
4371
|
}
|
|
4396
4372
|
async removeModule(workspace, name) {
|
|
4397
4373
|
}
|
|
@@ -4413,11 +4389,67 @@ var ModuleRunner = class {
|
|
|
4413
4389
|
}
|
|
4414
4390
|
};
|
|
4415
4391
|
}
|
|
4392
|
+
async createModuleTemplate(sys2, name) {
|
|
4393
|
+
const akanConfig = await sys2.getConfig();
|
|
4394
|
+
const scanResult = await sys2.scan({ akanConfig });
|
|
4395
|
+
await sys2.applyTemplate({
|
|
4396
|
+
basePath: `./lib/${name}`,
|
|
4397
|
+
template: "module",
|
|
4398
|
+
scanResult,
|
|
4399
|
+
dict: { model: name, Model: capitalize(name) }
|
|
4400
|
+
});
|
|
4401
|
+
await sys2.scan({ akanConfig });
|
|
4402
|
+
return {
|
|
4403
|
+
constant: { filename: `${name}.constant.ts`, content: sys2.readFile(`lib/module/${name}/${name}.constant.ts`) },
|
|
4404
|
+
dictionary: {
|
|
4405
|
+
filename: `${name}.dictionary.ts`,
|
|
4406
|
+
content: sys2.readFile(`lib/module/${name}/${name}.dictionary.ts`)
|
|
4407
|
+
},
|
|
4408
|
+
service: {
|
|
4409
|
+
filename: `${name}.service.ts`,
|
|
4410
|
+
content: sys2.readFile(`lib/module/${name}/${name}.service.ts`)
|
|
4411
|
+
},
|
|
4412
|
+
store: {
|
|
4413
|
+
filename: `${name}.store.ts`,
|
|
4414
|
+
content: sys2.readFile(`lib/module/${name}/${name}.store.ts`)
|
|
4415
|
+
},
|
|
4416
|
+
signal: {
|
|
4417
|
+
filename: `${name}.signal.ts`,
|
|
4418
|
+
content: sys2.readFile(`lib/module/${name}/${name}.signal.ts`)
|
|
4419
|
+
},
|
|
4420
|
+
test: {
|
|
4421
|
+
filename: `${name}.test.ts`,
|
|
4422
|
+
content: sys2.readFile(`lib/module/${name}/${name}.test.ts`)
|
|
4423
|
+
},
|
|
4424
|
+
unit: {
|
|
4425
|
+
filename: `${name}.Unit.tsx`,
|
|
4426
|
+
content: sys2.readFile(`lib/module/${name}/${name}.Unit.tsx`)
|
|
4427
|
+
},
|
|
4428
|
+
view: {
|
|
4429
|
+
filename: `${name}.View.tsx`,
|
|
4430
|
+
content: sys2.readFile(`lib/module/${name}/${name}.View.tsx`)
|
|
4431
|
+
},
|
|
4432
|
+
template: {
|
|
4433
|
+
filename: `${name}.Template.tsx`,
|
|
4434
|
+
content: sys2.readFile(`lib/module/${name}/${name}.Template.tsx`)
|
|
4435
|
+
},
|
|
4436
|
+
zone: {
|
|
4437
|
+
filename: `${name}.Zone.tsx`,
|
|
4438
|
+
content: sys2.readFile(`lib/module/${name}/${name}.Zone.tsx`)
|
|
4439
|
+
},
|
|
4440
|
+
util: {
|
|
4441
|
+
filename: `${name}.Util.tsx`,
|
|
4442
|
+
content: sys2.readFile(`lib/module/${name}/${name}.Util.tsx`)
|
|
4443
|
+
}
|
|
4444
|
+
};
|
|
4445
|
+
}
|
|
4416
4446
|
async createUnit(sys2, modelName) {
|
|
4417
4447
|
const modelFileData = getModelFileData(sys2.cwdPath, modelName);
|
|
4418
4448
|
const { paths } = getRelatedCnsts(modelFileData.constantFilePath);
|
|
4419
4449
|
const names = { model: modelName, Model: capitalize(modelName), LightModel: `Light${capitalize(modelName)}` };
|
|
4420
|
-
const prompt =
|
|
4450
|
+
const prompt = `
|
|
4451
|
+
|
|
4452
|
+
\uB108\uB294 React, Typescript, TailwindCSS\uB97C \uAE30\uBC18\uC73C\uB85C \uCF54\uB529\uD558\uB294 \uD504\uB860\uD2B8\uC5D4\uB4DC \uAC1C\uBC1C\uC790\uC57C.
|
|
4421
4453
|
${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
4454
|
|
|
4423
4455
|
\`\`\`
|
|
@@ -4436,7 +4468,7 @@ ${paths ? new Array(paths.size).fill(0).map((_, index) => {
|
|
|
4436
4468
|
if (!filePath)
|
|
4437
4469
|
throw new Error("filePath is undefined");
|
|
4438
4470
|
return `${key}
|
|
4439
|
-
\`\`\`${
|
|
4471
|
+
\`\`\`${import_fs14.default.readFileSync(filePath, "utf8")}\`\`\`\`
|
|
4440
4472
|
|
|
4441
4473
|
`;
|
|
4442
4474
|
}) : ""}
|
|
@@ -4451,67 +4483,37 @@ css\uB77C\uC774\uBE0C\uB7EC\uB9AC\uB294 DaisyUI\uB97C \uAE30\uBC18\uC73C\uB85C \
|
|
|
4451
4483
|
${names.Model}.Unit.Card\uC758 \uB9AC\uC561\uD2B8 \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uB514\uC790\uC778\uD574\uC11C \uC791\uC131\uD574\uC918.
|
|
4452
4484
|
`;
|
|
4453
4485
|
try {
|
|
4454
|
-
|
|
4486
|
+
import_fs14.default.writeFileSync("./local/prompt.txt", prompt);
|
|
4455
4487
|
const { content } = await streamAi(prompt, (chunk) => {
|
|
4456
4488
|
process.stdout.write(chunk);
|
|
4457
4489
|
});
|
|
4458
|
-
|
|
4490
|
+
import_fs14.default.writeFileSync("./local/result.txt", content);
|
|
4459
4491
|
} catch (error) {
|
|
4460
4492
|
}
|
|
4461
4493
|
}
|
|
4462
4494
|
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
4495
|
}
|
|
4508
4496
|
};
|
|
4509
4497
|
|
|
4510
4498
|
// pkgs/@akanjs/cli/src/module/module.script.ts
|
|
4511
4499
|
var ModuleScript = class {
|
|
4512
4500
|
#runner = new ModuleRunner();
|
|
4513
|
-
async createModule(
|
|
4514
|
-
await
|
|
4501
|
+
async createModule(sys2) {
|
|
4502
|
+
const [appNames, libNames] = await sys2.workspace.getSyss();
|
|
4503
|
+
const constantExampleFiles = [
|
|
4504
|
+
...(await Promise.all(
|
|
4505
|
+
appNames.map(async (appName) => {
|
|
4506
|
+
const app = AppExecutor.from(sys2.workspace, appName);
|
|
4507
|
+
const databaseModules = await app.getDatabaseModules();
|
|
4508
|
+
return await Promise.all(
|
|
4509
|
+
databaseModules.map((databaseModule) => ({
|
|
4510
|
+
path: `${appName}/${databaseModule}/${databaseModule}.constant.ts`,
|
|
4511
|
+
content: app.readFile(`lib/${databaseModule}/${databaseModule}.constant.ts`)
|
|
4512
|
+
}))
|
|
4513
|
+
);
|
|
4514
|
+
})
|
|
4515
|
+
)).flat()
|
|
4516
|
+
];
|
|
4515
4517
|
}
|
|
4516
4518
|
async removeModule(workspace, name) {
|
|
4517
4519
|
}
|
|
@@ -4539,16 +4541,42 @@ var ModuleScript = class {
|
|
|
4539
4541
|
const sys2 = type === "app" ? AppExecutor.from(workspace, appOrLibName) : LibExecutor.from(workspace, appOrLibName);
|
|
4540
4542
|
await this.#runner.createUnit(sys2, modelName);
|
|
4541
4543
|
}
|
|
4542
|
-
async createView(
|
|
4543
|
-
const
|
|
4544
|
-
|
|
4544
|
+
async createView(sys2) {
|
|
4545
|
+
const [appNames, libNames] = await sys2.workspace.getSyss();
|
|
4546
|
+
const viewExampleFiles = [
|
|
4547
|
+
...(await Promise.all(
|
|
4548
|
+
appNames.map(async (appName) => {
|
|
4549
|
+
const app = AppExecutor.from(sys2.workspace, appName);
|
|
4550
|
+
const viewModules = await app.getViewModules();
|
|
4551
|
+
return await Promise.all(
|
|
4552
|
+
viewModules.map((viewModule) => ({
|
|
4553
|
+
path: `${appName}/${viewModule}/${viewModule}.View.tsx`,
|
|
4554
|
+
content: app.readFile(`lib/${viewModule}/${viewModule}.View.tsx`)
|
|
4555
|
+
}))
|
|
4556
|
+
);
|
|
4557
|
+
})
|
|
4558
|
+
)).flat(),
|
|
4559
|
+
...(await Promise.all(
|
|
4560
|
+
libNames.map(async (libName) => {
|
|
4561
|
+
const lib = LibExecutor.from(sys2.workspace, libName);
|
|
4562
|
+
const viewModules = await lib.getViewModules();
|
|
4563
|
+
return await Promise.all(
|
|
4564
|
+
viewModules.map((viewModule) => ({
|
|
4565
|
+
path: `${libName}/${viewModule}/${viewModule}.View.tsx`,
|
|
4566
|
+
content: lib.readFile(`lib/${viewModule}/${viewModule}.View.tsx`)
|
|
4567
|
+
}))
|
|
4568
|
+
);
|
|
4569
|
+
})
|
|
4570
|
+
)).flat()
|
|
4571
|
+
];
|
|
4545
4572
|
}
|
|
4546
4573
|
};
|
|
4547
4574
|
|
|
4548
4575
|
// pkgs/@akanjs/cli/src/module/module.command.ts
|
|
4549
4576
|
var ModuleCommand = class {
|
|
4550
4577
|
moduleScript = new ModuleScript();
|
|
4551
|
-
async createModule(
|
|
4578
|
+
async createModule(sys2, workspace) {
|
|
4579
|
+
await this.moduleScript.createModule(sys2);
|
|
4552
4580
|
}
|
|
4553
4581
|
async removeModule(name, workspace) {
|
|
4554
4582
|
}
|
|
@@ -4561,14 +4589,15 @@ var ModuleCommand = class {
|
|
|
4561
4589
|
}
|
|
4562
4590
|
async createTest(name, workspace) {
|
|
4563
4591
|
}
|
|
4564
|
-
async createView(
|
|
4592
|
+
async createView(sys2, workspace) {
|
|
4593
|
+
await this.moduleScript.createView(sys2);
|
|
4565
4594
|
}
|
|
4566
4595
|
async createUnit(name, workspace) {
|
|
4567
4596
|
}
|
|
4568
4597
|
};
|
|
4569
4598
|
__decorateClass([
|
|
4570
4599
|
Target.Public(),
|
|
4571
|
-
__decorateParam(0,
|
|
4600
|
+
__decorateParam(0, Sys()),
|
|
4572
4601
|
__decorateParam(1, Workspace())
|
|
4573
4602
|
], ModuleCommand.prototype, "createModule", 1);
|
|
4574
4603
|
__decorateClass([
|
|
@@ -4601,7 +4630,7 @@ __decorateClass([
|
|
|
4601
4630
|
], ModuleCommand.prototype, "createTest", 1);
|
|
4602
4631
|
__decorateClass([
|
|
4603
4632
|
Target.Public(),
|
|
4604
|
-
__decorateParam(0,
|
|
4633
|
+
__decorateParam(0, Sys()),
|
|
4605
4634
|
__decorateParam(1, Workspace())
|
|
4606
4635
|
], ModuleCommand.prototype, "createView", 1);
|
|
4607
4636
|
__decorateClass([
|