@akanjs/cli 0.0.134 → 0.0.136

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.
@@ -5,7 +5,7 @@ import { createNextMiddleware } from "@akanjs/next";
5
5
 
6
6
  export const config = {
7
7
  unstable_allowDynamic: ["/node_modules/reflect-metadata/**"],
8
- matcher: ["/((?!api|_next|.*\\..*).*)"],
8
+ matcher: ["/((?!api|_next|.*\\\\..*).*)"],
9
9
  };
10
10
  export const middleware = createNextMiddleware();
11
11
  `;
@@ -13,8 +13,8 @@ import { cnst } from "../cnst";
13
13
  export const register${dict.Model}Module = (option: ModulesOptions) =>
14
14
  databaseModuleOf(
15
15
  {
16
- constant: cnst.${dict.Model}Cnst,
17
- database: db.${dict.Model}Db,
16
+ constant: cnst.${dict.model}Cnst,
17
+ database: db.${dict.model}Db,
18
18
  signal: ${dict.Model}Signal,
19
19
  service: ${dict.Model}Service,
20
20
  },
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "sourceType": "module",
3
3
  "name": "@akanjs/cli",
4
- "version": "0.0.134",
4
+ "version": "0.0.136",
5
5
  "bin": {
6
6
  "akan": "cjs/index.js"
7
7
  },
@@ -10,4 +10,5 @@ export declare class ModuleCommand {
10
10
  createTest(name: string, workspace: Workspace): Promise<void>;
11
11
  createView(sys: Sys, workspace: Workspace): Promise<void>;
12
12
  createUnit(sys: Sys, workspace: Workspace): Promise<void>;
13
+ createTemplate(sys: Sys, workspace: Workspace): Promise<void>;
13
14
  }
@@ -1,6 +1,7 @@
1
- export declare const frameworkDescription = "\n\t\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.\n\t\n\t\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.\n\t\n\t \n\t\n\t\uAC00\uC7A5 \uC678\uBD80\uC758 \uAD6C\uC870\uB294\n\t\n\t- app\n\t\n\t- project1\n\t\n\t- project2\n\t\n\t- project3\n\t\n\t- project4\n\t\n\t- lib\n\t\n\t- core\n\t\n\t- external\n\t\n\t- game\n\t\n\t- mint\n\t\n\t- platform\n\t\n\t- shared\n\t\n\t- social\n\t\n\t- util\n\t\n\tapp\uC740 \uAC01 \uD504\uB85C\uC81D\uD2B8\uB97C \uB9CC\uB4DC\uB294 \uACF3\uC774\uC57C\n\t\n\tlib \uD558\uC704 \uD3F4\uB354\uB4E4\uC740 \uC5EC\uB7EC \uD504\uB85C\uC81D\uD2B8\uC5D0\uC11C \uACF5\uC6A9\uC73C\uB85C \uC0AC\uC6A9\uD560 \uC218 \uC788\uACA0\uB2E4 \uB77C\uACE0 \uD310\uB2E8\uD574\uC11C \uBD84\uB9AC\uD574\uB193\uC740 \uACF3\uC774\uC57C.\n\t\n\t\uB2E4\uC74C\uC740 app/project \uB0B4\uBD80\uC758 \uAD6C\uC870\uB97C \uC54C\uB824\uC904\uAC8C.\n\t\n\t \n\t\n\tproject\n\t\n\t- app\n\t\n\t- [lang]\n\t\n\t- (projectName)\n\t\n\t- (user)\n\t\n\t- page.tsx\n\t\n\t- layout.tsx\n\t\n\t- (public)\n\t\n\t- page.tsx\n\t\n\t- layout.tsx\n\t\n\t- (admin)\n\t\n\t- page.tsx\n\t\n\t- layout.tsx\n\t\n\t \n\t\n\t- lib\n\t\n\t- dataName1\n\t\n\t- dataName2\n\t\n\t- dataName3\n\t\n\t- dataName4\n\t\n\t- dataName5\n\t\n\t- dataName6\n\t\n\t- dataName7\n\t\n\t \n\t\n\tapp\uC740 \uC9C1\uC811\uC801\uC73C\uB85C \uC720\uC800\uAC00 \uBCF4\uB294 \uD398\uC774\uC9C0\uB97C \uC9DC\uB294 \uACF3\uC774\uC57C. \uD3F4\uB354 \uAD6C\uC870\uB294 next 13\uC758 app directory\uB97C \uB530\uB974\uACE0 \uC788\uC5B4.\n\t\n\tpublic/page.tsx\uAC00 \uAC00\uC7A5 \uCD5C\uCD08\uB85C \uC811\uADFC\uB418\uB294 Index \uD398\uC774\uC9C0\uAC00 \uB420 \uAC70\uC57C.\n\t\n\t\uC544\uB798\uB294 public/page.tsx\uC758 \uAE30\uBCF8 \uD15C\uD50C\uB9BF \uC18C\uC2A4\uCF54\uB4DC\uC57C.\n\t\n\t```\n\t\n\timport {{ Image, Link }} from \"@util/ui\";\n\t\n\timport {{ getSelf }} from \"@akanjs/client\";\n\t\n\t \n\t\n\texport default function Page() {{\n\t\n\tconst self = getSelf();\n\t\n\treturn (\n\t\n\t<div className=\"relative w-full h-screen overflow-hidden flex items-center justify-center\">\n\t\n\t<Image\n\t\n\tclassName=\"absolute left-0 right-0 top-0 bottom-0 w-full h-screen -z-50\"\n\t\n\twidth={{1920}}\n\t\n\theight={{1080}}\n\t\n\tsrc=\"/back.jpg\"\n\t\n\t/>\n\t\n\t<div className=\"max-w-md bg-base-100/50 shadow-lg rounded-xl backdrop-blur-xs w-full py-8 px-16 flex flex-col items-center justify-center gap-3\">\n\t\n\t<h1 className=\"text-4xl mt-2\"><%= project %></h1>\n\t\n\t<h2 className=\"text-lg\"><%= project %> description</h2>\n\t\n\t<Link className=\"w-full\" href={{self ? \"/home\" : \"/signin\"}}>\n\t\n\t<button className=\"btn w-full btn-primary\">Go to dashboard</button>\n\t\n\t</Link>\n\t\n\t</div>\n\t\n\t</div>\n\t\n\t);\n\t\n\t}}\n\t\n\t```\n\t\n\t \n\t\n\tlib\uC740 \uC11C\uBE44\uC2A4\uB97C \uB9CC\uB4E4\uB2E4\uBCF4\uBA74 \uD544\uC694\uD55C \uB370\uC774\uD130\uB97C \uC815\uC758\uD558\uB294 \uACF3\uC774\uC57C.\n\t\n\t\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.\n\t\n\t \n\t\n\t\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.\n\t\n\t\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.\n\t\n\t \n\t\n\t\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.\n\t\n\t \n\t\n\t\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.\n\t\n\t \n\t\n\tpencil\n\t\n\t- pencil.constant.ts ( pencil\uC5D0 \uB300\uD55C db schema, query, sort \uAD6C\uBB38\uC744 \uC815\uC758 )\n\t\n\t- pencil.document.ts ( model\uC5D0\uC11C \uC790\uC8FC \uC0AC\uC6A9\uD558\uB294 method, static function, middleware\uB85C \uAC04\uB2E8\uD55C db \uAD00\uB9AC \uD568\uC218\uB4F1\uC744 \uAD00\uB9AC\uD568.)\n\t\n\t- pencil.dictionary.ts (\uB2E4\uAD6D\uC5B4\uB97C \uC704\uD574\uC11C schema field, enum, service name\uC758 \uB2E4\uAD6D\uC5B4 \uC815\uBCF4 \uB4F1\uC744 \uBAA8\uB450 \uAD00\uB9AC. )\n\t\n\t- 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 )\n\t\n\t- 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.)\n\t\n\t- pencil.store.ts (pencil field\uC5D0 \uB300\uD55C \uC0C1\uD0DC\uAD00\uB9AC \uC800\uC7A5\uC18C.)\n\t\n\t- 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. )\n\t\n\t- 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. )\n\t\n\t- 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. )\n\t\n\t- pencil.Util.tsx (Action \uBC84\uD2BC\uC744 \uC815\uC758\uD558\uB294 \uACF3. client component\uB85C \uC815\uC758\uB428. )\n\t\n\t- pencil.View.tsx (\uB2E8\uC77C view \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uC815\uC758\uD558\uB294 \uACF3. server component\uB85C \uC815\uC758\uB428. )\n\t\n\t \n\t \n\t\n\t\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.\n\t\n\t \n\t\n\tdocument, signal, service\uB294 \uBC31\uC5D4\uB4DC\uC640 \uC5F0\uAD00\uB418\uC5B4\uC788\uB294 \uC18C\uC2A4\uCF54\uB4DC\uC57C.\n\t\n\t\uC11C\uB85C\uAC04\uC758 \uAD00\uACC4\uB294 \uC8FC\uB85C signal\uC5D0\uC11C \uAC00\uC7A5 \uBA3C\uC800 \uC694\uCCAD\uC744 \uBC1B\uACE0 \uC774\uD6C4 \uB85C\uC9C1\uC758 \uBCF5\uC7A1\uB3C4\uC5D0 \uB530\uB77C\uC11C service\uB85C \uCC98\uB9AC\uD560 \uC9C0, docuemnt\uB85C \uCC98\uB9AC\uD560 \uC9C0\uB97C \uACB0\uC815\uD574.\n\t\n\tsignal - document\n\t\n\tsignal - service - document\n\t\n\t \n\t\n\tstore\uB294 \uD504\uB860\uD2B8\uC5D4\uB4DC\uC5D0\uC11C \uC0C1\uD0DC\uAD00\uB9AC\uB97C \uD560 \uB54C \uC0AC\uC6A9\uB3FC.\n\t\n\t\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.\n\t\n\t \n\t\n\t\uC774\uB807\uAC8C 11\uAC1C\uC758 \uD30C\uC77C\uB85C \uAD6C\uBD84\uD574\uC11C \uC815\uC758\uAC00 \uB3FC.\n\t\n\t\uC9C0\uAE08\uBD80\uD134 \uD55C \uD30C\uC77C\uB4E4\uB9C8\uB2E4 \uC0C1\uC138\uD55C \uC124\uBA85\uC744 \uD574\uC904\uAC8C.\n\t\n\t \n\t\n\tmodel.constant.ts\n\t\n\t \n\t\n\tconstant\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.\n\t\n\t\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\n\t\n\t\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.\n\t\n\t\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.\n\t\n\t\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.\n\t\n\t \n\t\n\t```\n\t\n\timport { enumOf, Int } from \"@akanjs/base\";\n\t\n\timport { Field, Filter, Model, sortOf, via } from \"@akanjs/constant\";\n\t\n\t \n\t\n\texport const ${dict.Model}Statuses = [\"active\"] as const;\n\t\n\texport type ${dict.Model}Status = (typeof ${dict.Model}Statuses)[number];\n\t\n\t \n\t\n\t//\uB370\uC774\uD130\uB97C \uB9CC\uB4E4 \uB54C \uD544\uC694\uD55C \uB370\uC774\uD130 \uD0C0\uC785\uC744 \uC815\uC758\uD558\uB294 \uACF3\n\t\n\t@Model.Input(\"${dict.Model}Input\")\n\t\n\texport class ${dict.Model}Input {{\n\t\n\t@Field.Prop(() => String)\n\t\n\tfield: string;\n\t\n\t \n\t\n\t@Field.Prop(() => Int, {{ nullable: true }})\n\t\n\tfieldInt: number | null;\n\t\n\t \n\t\n\t@Field.Prop(() => Date, {{default: dayjs()}})\n\t\n\tfieldInt: Dayjs;\n\t\n\t}}\n\t\n\t \n\t\n\t//\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\n\t\n\t@Model.Object(\"${dict.Model}Object\")\n\t\n\texport class ${dict.Model}Object extends via(${dict.Model}Input) {\n\t\n\t@Field.Prop(() => String, {{ enum: ${dict.Model}Statuses, default: \"active\" }})\n\t\n\tstatus: ${dict.Model}Status;\n\t\n\t}}\n\t\n\t \n\t\n\t//\uB370\uC774\uD130\uB97C \uB9AC\uC2A4\uD2B8\uB85C \uBCF4\uC5EC\uC904 \uB54C \uD544\uC694\uD55C \uB370\uC774\uD130\uB9CC \uC81C\uACF5\uD558\uB294 \uACF3\n\t\n\t@Model.Light(\"Light${dict.Model}\")\n\t\n\texport class Light${dict.Model} extends via(${dict.Model}Object, [\n\t\n\t\"field\",\n\t\n\t\"status\",\n\t\n\t] as const) {}\n\t\n\t \n\t\n\t//\uCD5C\uC885 \uB370\uC774\uD130\uC758 Full \uD0C0\uC785\uC774 \uC815\uC758\uB418\uB294 \uACF3\n\t\n\t@Model.Full(\"${dict.Model}\")\n\t\n\texport class ${dict.Model} extends via(${dict.Model}Object, Light${dict.Model}) {}\n\t\n\t \n\t\n\t//\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\n\t\n\t@Model.Insight(\"${dict.Model}Insight\")\n\t\n\texport class ${dict.Model}Insight {{\n\t\n\t@Field.Prop(() => Int, {{ default: 0, accumulate: {{ $sum: 1 }} }})\n\t\n\tcount: number;\n\t\n\t}}\n\t\n\t \n\t\n\t//\uB370\uC774\uD130\uC758 \uD1B5\uACC4\uB97C \uACC4\uC0B0\uD558\uB294 \uACF3\n\t\n\t@Model.Summary(\"${dict.Model}Summary\")\n\t\n\texport class ${dict.Model}Summary {{\n\t\n\t@Field.Prop(() => Int, {{ min: 0, default: 0, query: {{ status: {{}} }} }})\n\t\n\ttotal${dict.Model}: number;\n\t\n\t}}\n\t\n\t \n\t\n\t@Model.Filter(\"${dict.Model}Filter\")\n\t\n\texport class ${dict.Model}Filter extends sortOf(${dict.Model}, {}) {}\n\t\n\t```\n\t\n\t \n\t \n\t\n\tmodel.dictonary.ts\n\t\n\t```\n\t\n\timport {\n\t\n\tbaseTrans,\n\t\n\tgetBaseSignalTrans,\n\t\n\tModelDictionary,\n\t\n\tSignalDictionary,\n\t\n\tSummaryDictionary,\n\t\n\t} from \"@akanjs/dictionary\";\n\t\n\t \n\t\n\timport type { ${dict.Model}, ${dict.Model}Filter, ${dict.Model}Insight, ${dict.Model}Summary } from \"./${dict.model}.constant\";\n\t\n\timport type { ${dict.Model}Signal } from \"./${dict.model}.signal\";\n\t\n\t \n\t\n\tconst modelDictionary = {{\n\t\n\t...baseTrans,\n\t\n\tmodelName: [\"${dict.Model}\", \"${dict.Model}\"],\n\t\n\tmodelDesc: [\n\t\n\t\"${dict.Model} description\",\n\t\n\t\"${dict.Model} \uC124\uBA85\",\n\t\n\t],\n\t\n\t \n\t\n\t// * ==================== Model ==================== * //\n\t\n\tfield: [\"Field\", \"\uD544\uB4DC\"],\n\t\n\t\"desc-field\": [\"Field\", \"\uD544\uB4DC\"],\n\t\n\t// * ==================== Model ==================== * //\n\t\n\t \n\t\n\t// * ==================== Insight ==================== * //\n\t\n\tcount: [\"Count\", \"\uAC1C\uC218\"],\n\t\n\t\"desc-count\": [\"${dict.Model} count in current query settting\", \"\uD604\uC7AC \uCFFC\uB9AC \uC124\uC815\uC5D0 \uB9DE\uB294 ${dict.Model} \uC218\"],\n\t\n\t// * ==================== Insight ==================== * //\n\t\n\t \n\t\n\t// * ==================== Filter ==================== * //\n\t\n\t// * ==================== Filter ==================== * //\n\t\n\t \n\t\n\t// * ==================== Etc ==================== * //\n\t\n\t\"enum-status-active\": [\"Active\", \"\uD65C\uC131\"],\n\t\n\t\"enumdesc-status-active\": [\"Active status\", \"\uD65C\uC131 \uC0C1\uD0DC\"],\n\t\n\t// * ==================== Etc ==================== * //\n\t\n\t}} satisfies ModelDictionary<${dict.Model}, ${dict.Model}Insight, typeof ${dict.Model}Sort>;\n\t\n\t \n\t\n\texport const ${dict.Model}SummaryDictionary = {{\n\t\n\t// * ==================== Summary ==================== * //\n\t\n\ttotal${dict.Model}: [\"Total ${dict.Model}\", \"\uCD1D ${dict.Model} \uC218\"],\n\t\n\t\"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\"],\n\t\n\t// * ==================== Summary ==================== * //\n\t\n\t}} satisfies SummaryDictionary<${dict.Model}Summary>;\n\t\n\t \n\t\n\tconst signalDictionary = {{\n\t\n\t...getBaseSignalTrans(\"${dict.Model}\" as const),\n\t\n\t// * ==================== Endpoint ==================== * //\n\t\n\t\"api-${dict.Model}ListInPublic\": [\"${dict.Model} List In Public\", \"\uACF5\uAC1C\uB41C ${dict.Model} \uB9AC\uC2A4\uD2B8\"],\n\t\n\t\"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\"],\n\t\n\t\"arg-${dict.Model}ListInPublic-statuses\": [\"Statuses\", \"\uC0C1\uD0DC\"],\n\t\n\t\"argdesc-${dict.Model}ListInPublic-statuses\": [\"Statuses to filter\", \"\uD544\uD130\uB9C1\uD560 \uC0C1\uD0DC\"],\n\t\n\t\"arg-${dict.Model}ListInPublic-skip\": [\"Skip\", \"\uAC74\uB108\uB6F0\uAE30\"],\n\t\n\t\"argdesc-${dict.Model}ListInPublic-skip\": [\"Number of items to skip\", \"\uAC74\uB108\uB6F8 \uC544\uC774\uD15C \uC218\"],\n\t\n\t\"arg-${dict.Model}ListInPublic-limit\": [\"Limit\", \"\uC81C\uD55C\"],\n\t\n\t\"argdesc-${dict.Model}ListInPublic-limit\": [\"Maximum number of items to return\", \"\uBC18\uD658\uD560 \uCD5C\uB300 \uC544\uC774\uD15C \uC218\"],\n\t\n\t\"arg-${dict.Model}ListInPublic-sort\": [\"Sort\", \"\uC815\uB82C\"],\n\t\n\t\"argdesc-${dict.Model}ListInPublic-sort\": [\"Sort order of the items\", \"\uC544\uC774\uD15C\uC758 \uC815\uB82C \uC21C\uC11C\"],\n\t\n\t \n\t\n\t\"api-${dict.Model}InsightInPublic\": [\"${dict.Model} Insight In Public\", \"\uACF5\uAC1C\uB41C ${dict.Model} \uC778\uC0AC\uC774\uD2B8\"],\n\t\n\t\"apidesc-${dict.Model}InsightInPublic\": [\n\t\n\t\"Get insight data for public ${dict.Model}\",\n\t\n\t\"\uACF5\uAC1C\uB41C ${dict.Model}\uC5D0 \uB300\uD55C \uC778\uC0AC\uC774\uD2B8 \uB370\uC774\uD130\uB97C \uAC00\uC838\uC635\uB2C8\uB2E4\",\n\t\n\t],\n\t\n\t\"arg-${dict.Model}InsightInPublic-statuses\": [\"Statuses\", \"\uC0C1\uD0DC\"],\n\t\n\t\"argdesc-${dict.Model}InsightInPublic-statuses\": [\"Statuses to filter\", \"\uD544\uD130\uB9C1\uD560 \uC0C1\uD0DC\"],\n\t\n\t// * ==================== Endpoint ==================== * //\n\t\n\t}} satisfies SignalDictionary<${dict.Model}Signal, ${dict.Model}>;\n\t\n\t```\n\t\n\texport const ${dict.model}Dictionary = {{ ...modelDictionary, ...signalDictionary }};\n\t\n\t \n\t \n\t \n\t\n\tmodel.document.ts\n\t\n\t```\n\t\n\timport { beyond, by, Database, into, type SchemaOf } from \"@akanjs/document\";\n\t\n\t \n\t\n\timport { cnst } from \"../cnst\";\n\t\n\t@Database.Input(() => cnst.${dict.Model}Input)\n\t\n\texport class ${dict.Model}Input extends by(cnst.${dict.Model}Input) {}\n\t\n\t \n\t\n\t@Database.Document(() => cnst.${dict.Model})\n\t\n\texport class ${dict.Model} extends by(cnst.${dict.Model}) {}\n\t\n\t \n\t\n\t@Database.Model(() => cnst.${dict.Model})\n\t\n\texport class ${dict.Model}Model extends into(${dict.Model}, cnst.${dict.Model}Cnst) {\n\t\n\tasync getSummary(): Promise<cnst.${dict.Model}Summary> {\n\t\n\treturn {\n\t\n\t...(await this.getDefaultSummary()),\n\t\n\t};\n\t\n\t}\n\t\n\t}\n\t\n\t \n\t\n\t@Database.Middleware(() => cnst.${dict.Model})\n\t\n\texport class ${dict.Model}Middleware extends beyond(${dict.Model}Model, ${dict.Model}) {\n\t\n\tonSchema(schema: SchemaOf<${dict.Model}Model, ${dict.Model}>) {\n\t\n\t// schema.index({ status: 1 })\n\t\n\t}\n\t\n\t}\n\t\n\t```\n\t\n\t \n\t \n\t\n\tmodel.signal.ts\n\t\n\t```\n\t\n\timport { Int } from \"@akanjs/base\";\n\t\n\timport { SortOf } from \"@akanjs/constant\";\n\t\n\timport { Arg, DbSignal, Mutation, Query, resolve, Signal } from \"@akanjs/signal\";\n\t\n\t \n\t\n\timport { cnst, Srvs } from \"../cnst\";\n\t\n\t \n\t\n\t@Signal(() => cnst.${dict.Model})\n\t\n\texport class ${dict.Model}Signal extends DbSignal(cnst.${dict.model}Cnst, Srvs, {\n\t\n\tguards: { get: Query.Public, cru: Mutation.Public },\n\t\n\t}) {\n\t\n\t// * /////////////////////////////////////\n\t\n\t// * Public Slice\n\t\n\t@Query.Public(() => [cnst.${dict.Model}])\n\t\n\tasync ${dict.model}ListInPublic(\n\t\n\t@Arg.Query(\"statuses\", () => [String], { nullable: true }) statuses: cnst.${dict.Model}Status[] | null,\n\t\n\t@Arg.Query(\"skip\", () => Int, { nullable: true }) skip: number | null,\n\t\n\t@Arg.Query(\"limit\", () => Int, { nullable: true }) limit: number | null,\n\t\n\t@Arg.Query(\"sort\", () => String, { nullable: true }) sort: SortOf<cnst.${dict.Model}Filter> | null\n\t\n\t) {\n\t\n\tconst ${dict.models} = await this.${dict.model}Service.listByStatuses(statuses, { skip, limit, sort });\n\t\n\treturn resolve<cnst.${dict.Model}[]>(${dict.models});\n\t\n\t}\n\t\n\t@Query.Public(() => cnst.${dict.Model}Insight)\n\t\n\tasync ${dict.model}InsightInPublic(\n\t\n\t@Arg.Query(\"statuses\", () => [String], { nullable: true }) statuses: cnst.${dict.Model}Status[] | null\n\t\n\t) {\n\t\n\tconst ${dict.model}Insight = await this.${dict.model}Service.insightByStatuses(statuses);\n\t\n\treturn resolve<cnst.${dict.Model}Insight>(${dict.model}Insight);\n\t\n\t}\n\t\n\t// * Public Slice\n\t\n\t// * /////////////////////////////////////\n\t\n\t}\n\t\n\t```\n\t\n\t \n\t \n\t\n\tmodel.service.ts\n\t\n\t```\n\t\n\timport { DbService, Service } from \"@akanjs/service\";\n\t\n\t \n\t\n\timport { cnst } from \"../cnst\";\n\t\n\timport * as db from \"../db\";\n\t\n\t \n\t\n\t@Service(\"${dict.Model}Service\")\n\t\n\texport class ${dict.Model}Service extends DbService(db.${dict.Model}Db) {\n\t\n\tasync summarize(): Promise<cnst.${dict.Model}Summary> {\n\t\n\treturn {\n\t\n\t...(await this.${dict.Model}Model.getSummary()),\n\t\n\t};\n\t\n\t}\n\t\n\t}\n\t\n\t```\n\t\n\t \n\t \n\t\n\tmodel.store.ts\n\t\n\t```\n\t\n\timport { stateOf, Store } from \"@akanjs/store\";\n\t\n\t \n\t\n\timport { cnst } from \"../cnst\";\n\t\n\timport { fetch } from \"../fetch\";\n\t\n\t \n\t\n\t@Store(() => cnst.${dict.Model})\n\t\n\texport class ${dict.Model}Store extends stateOf(fetch.${dict.model}Gql, {\n\t\n\t// state\n\t\n\t}) {\n\t\n\t// action\n\t\n\t}\n\t\n\t```\n\t\n\t \n\t \n\t\n\tmodel.Zone.tsx\n\t\n\t```\n\t\n\t\"use client\";\n\t\n\timport { Data, Load } from \"@shared/ui\";\n\t\n\timport { ModelsProps } from \"@akanjs/client\";\n\t\n\timport { cnst, ${dict.Model} } from \"@${dict.appName}/client\";\n\t\n\timport { ClientInit, ClientView, DefaultOf } from \"@akanjs/signal\";\n\t\n\t \n\t\n\texport const Admin = ({ sliceName = \"${dict.model}\", init, query }: ModelsProps<cnst.${dict.Model}>>) => {\n\t\n\treturn (\n\t\n\t<Data.ListContainer\n\t\n\tinit={init}\n\t\n\tquery={query}\n\t\n\tsliceName={sliceName}\n\t\n\trenderItem={${dict.Model}.Unit.Card}\n\t\n\trenderDashboard={${dict.Model}.Util.Stat}\n\t\n\trenderInsight={${dict.Model}.Util.Insight}\n\t\n\trenderTemplate={${dict.Model}.Template.General}\n\t\n\trenderTitle={(${dict.model}: DefaultOf<cnst.${dict.Model}>>) => `${dict.Model} - ${${dict.model}.id ? ${dict.model}.id : \"New\"}`}\n\t\n\trenderView={(${dict.model}: cnst.${dict.Model}>) => <${dict.Model}.View.General ${dict.model}={${dict.model}} />}\n\t\n\tcolumns={[\n\t\n\t\"id\",\n\t\n\t\"status\",\n\t\n\t\"createdAt\",\n\t\n\t\"updatedAt\",\n\t\n\t]}\n\t\n\tactions={(${dict.model}: cnst.Light${dict.Model}, idx) => [\"remove\", \"edit\", \"view\"]}\n\t\n\t/>\n\t\n\t);\n\t\n\t};\n\t\n\t \n\t\n\tinterface CardProps {\n\t\n\tclassName?: string;\n\t\n\tinit: ClientInit<\"${dict.model}\", cnst.Light${dict.Model}>;\n\t\n\t}\n\t\n\texport const Card = ({ className, init }: CardProps) => {\n\t\n\treturn (\n\t\n\t<Load.Units\n\t\n\tclassName={className}\n\t\n\tinit={init}\n\t\n\trenderItem={(${dict.model}: cnst.Light${dict.Model}) => (\n\t\n\t<${dict.Model}.Unit.Card key={${dict.model}.id} href={`/${dict.model}/${${dict.model}.id}`} ${dict.model}={${dict.model}} />\n\t\n\t)}\n\t\n\t/>\n\t\n\t);\n\t\n\t};\n\t\n\t \n\t\n\tinterface ViewProps {\n\t\n\tclassName?: string;\n\t\n\tview: ClientView<\"${dict.model}\", cnst.${dict.Model}>;\n\t\n\t}\n\t\n\texport const View = ({ view }: ViewProps) => {\n\t\n\treturn <Load.View view={view} renderView={(${dict.model}) => <${dict.Model}.View.General ${dict.model}={${dict.model}} />} />;\n\t\n\t};\n\t\n\t```\n\t\n\t \n\t\n\tmodel.Templete.tsx\n\t\n\t```\n\t\n\t\"use client\";\n\t\n\timport { cnst, st, usePage } from \"@${dict.appName}/client\";\n\t\n\timport { Field } from \"@shared/ui\";\n\t\n\timport { Layout } from \"@util/ui\";\n\t\n\t \n\t\n\tinterface ${dict.Model}EditProps {\n\t\n\t${dict.model}Id?: string | null;\n\t\n\t}\n\t\n\t \n\t\n\texport const General = ({ ${dict.model}Id = undefined }: ${dict.Model}EditProps) => {\n\t\n\tconst ${dict.model}Form = st.use.${dict.model}Form();\n\t\n\tconst { l } = usePage();\n\t\n\treturn (\n\t\n\t<Layout.Template>\n\t\n\t<Field.Text\n\t\n\tlabel={l.field(\"${dict.model}\", \"id\")}\n\t\n\tdesc={l.desc(\"${dict.model}\", \"id\")}\n\t\n\tvalue={${dict.model}Form.id}\n\t\n\tonChange={st.do.setIdOn${dict.Model}}\n\t\n\t/>\n\t\n\t</Layout.Template>\n\t\n\t);\n\t\n\t};\n\t\n\t```\n\t\n\t \n\t \n\t\n\tmodel.Unit.tsx\n\t\n\t```\n\t\n\timport { ModelProps } from \"@akanjs/client\";\n\t\n\timport { cnst, ${dict.Model} } from \"@${dict.appName}/client\";\n\t\n\timport { Link } from \"@util/ui\";\n\t\n\t \n\t\n\texport const Card = ({ ${dict.model}, href }: ModelProps<\"${dict.model}\", cnst.Light${dict.Model}>>) => {\n\t\n\treturn (\n\t\n\t<Link href={href} className=\"animate-fadeIn w-full h-36 flex rounded-lg shadow-sm hover:shadow-lg duration-300\">\n\t\n\t<div>{${dict.model}.id}</div>\n\t\n\t</Link>\n\t\n\t);\n\t\n\t};\n\t\n\t```\n\t\n\t \n\t \n\t\n\tmodel.Util.tsx\n\t\n\t```\n\t\n\t\"use client\";\n\t\n\timport { ModelDashboardProps, ModelInsightProps } from \"@akanjs/client\";\n\t\n\timport { getQueryMap } from \"@akanjs/constant\";\n\t\n\timport { cnst } from \"@${dict.appName}/client\";\n\t\n\timport { Data } from \"@shared/ui\";\n\t\n\t \n\t\n\texport const Stat = ({\n\t\n\tclassName,\n\t\n\tsummary,\n\t\n\tsliceName = \"${dict.model}\",\n\t\n\tqueryMap = getQueryMap(cnst.${dict.Model}Summary),\n\t\n\thidePresents,\n\t\n\t}: ModelDashboardProps<cnst.Summary>) => {\n\t\n\treturn (\n\t\n\t<Data.Dashboard\n\t\n\tclassName={className}\n\t\n\tsummary={summary}\n\t\n\tsliceName={sliceName}\n\t\n\tqueryMap={queryMap}\n\t\n\tcolumns={[\"total${dict.Model}\"]}\n\t\n\thidePresents={hidePresents}\n\t\n\t/>\n\t\n\t);\n\t\n\t};\n\t\n\t \n\t\n\texport const Insight = ({\n\t\n\tclassName,\n\t\n\tinsight,\n\t\n\tsliceName = \"${dict.model}\",\n\t\n\t}: ModelInsightProps<cnst.${dict.Model}Insight>) => {\n\t\n\treturn (\n\t\n\t<Data.Insight\n\t\n\tclassName={className}\n\t\n\tinsight={insight}\n\t\n\tsliceName={sliceName}\n\t\n\tcolumns={[\"count\"]}\n\t\n\t/>\n\t\n\t);\n\t\n\t};\n\t\n\t```\n\t\n\t \n\t \n\t\n\tmodel.View.tsx\n\t\n\t```\n\t\n\timport { clsx } from \"@akanjs/client\";\n\t\n\timport { cnst } from \"@${dict.appName}/client\";\n\t\n\timport { Image } from \"@util/ui\";\n\t\n\t \n\t\n\tinterface ${dict.Model}ViewProps {\n\t\n\tclassName?: string;\n\t\n\t${dict.model}: cnst.${dict.Model};\n\t\n\tself?: { id?: string } | null;\n\t\n\t}\n\t\n\t \n\t\n\texport const General = ({ className, ${dict.model}, self }: ${dict.Model}ViewProps) => {\n\t\n\treturn (\n\t\n\t<div className={clsx(className, \"animate-fadeIn w-full\")}>\n\t\n\t<div>{${dict.model}.id}</div>\n\t\n\t</div>\n\t\n\t);\n\t\n\t};\n\t\n\t```\n\t\n\t\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.\n\t\n\t \n\t\n\t\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.\n\t\n\t";
1
+ export declare const frameworkDescription = "\n\t";
2
2
  export declare const moduleDesription = "\n\nThe project follows a modular architecture with clear separation of concerns. Each module in lib/<model>/ represents a domain\nentity with a standardized file structure that promotes consistency and maintainability.\n\n## Core Components\n\n### <Model>.View.tsx\n - Core Purpose: Presentation-only components that render data\n - Execution Context: Works as a server component\n - State Management: Does not manage internal state\n - Data Handling: Accepts model data as props and displays it according to specific layouts\n - Primary Focus: Focuses purely on how data looks to the user\n - Model Usage: Only uses the full model\n - Interaction Restrictions: No click events or other interaction events\n - Interaction Extension: If interaction is needed, wrap with <Model>.Zone.tsx component\n - Navigation: Link component can be used for navigation purposes\n - Full Model Rendering: Implements complete rendering of the entire model data structure, ensuring all properties and relationships within the model are displayed rather than selecting only partial attributes\n\n### <Model>.Template.tsx\nReusable layout patterns with integrated state management. It works as a client component, These components provide consistent UI patterns and handle data\nbinding, often using store hooks to access application state.\n\n### <Model>.Unit.tsx\n - Single Component Export: Each file exports one Card component for displaying model data\n - Server-Side Rendered: React Server Components without \"use client\" directive\n - Type-Safe Props: Uses ModelProps<\"modelName\", cnst.LightModel> interface\n - Optional Navigation: useable Link component for navigation in util/ui\n - Tailwind Styling: Universal use of Tailwind CSS with DaisyUI classes\n - Model Data Display: Direct access to typed model properties and methods\n\n\n### <Model>.Zone.tsx\nTop-level container components that orchestrate other components. It works as a client component, They compose views, templates, and units into complete UI\nsections while managing data flow to child components.\n\n### <Model>.Util.tsx\nSpecialized components and utility functions specific to a model, It works as a client component, providing both UI components and helper functions for\nmodel-specific functionality.\n\n## Data Management\n\n### <model>.signal.ts\nDefines API endpoints with type safety using decorators for GraphQL queries and mutations, creating a type-safe bridge between\nfrontend and backend.\n\n### <model>.store.ts\nManages client-side state with typed actions and state, handling UI state, form state, and cached data.\n\n### <model>.service.ts\nImplements server-side business logic with dependency injection, handling data processing and complex operations.\n\n### <model>.constant.ts\nDefines type definitions and model schemas using decorators to structure model fields, validation, and relationships.\n\n### <model>.dictionary.ts\nProvides internationalization and label definitions for model properties and operations.\n\n### <model>.document.ts\nDefines database schema and model operations with decorators for database interaction.\n\n## Data Flow\nThe architecture follows a clear data flow pattern:\n- Server-side: Document \u2192 Service \u2192 Signal \u2192 API\n- Client-side: API \u2192 Store \u2192 Components (Zone \u2192 Template/View/Unit)\n\nThis modular structure enables rapid development while maintaining consistency, type safety, and testability throughout the\napplication.\n";
3
3
  export declare const utilUiDescription = "\n This UI kit is an internally developed UI kit within the Akan.js framework. \n The libs/util/ui directory contains a comprehensive React component library designed for modern web applications. \n This framework provides a complete set of production-ready, reusable UI components with consistent styling, type safety, and advanced functionality.\n\n [Strict caution]\n - Every component must be used exactly as described in the documentation.\n - Do not add any additional props to the components.\n - Must use the written props exactly.\n - Only the components explicitly listed in the documentation are available\u2014no additional components exist beyond those specified.\n\n\n\n Architecture & Foundation\n\n Core Technologies:\n - Built on React 18+ with TypeScript for strict type safety\n - Styled based on Tailwind CSS and DaisyUI base for a consistent design system.\n - Implements modern React patterns including hooks, context providers, and portals\n - Full internationalization (i18n) support for multilingual applications\n - Responsive-first design with mobile optimization\n\n Design Principles:\n - Composable component architecture with predictable APIs\n - Accessibility (a11y) compliance throughout\n - Performance optimization with lazy loading and code splitting\n - Consistent error handling and validation patterns\n - Session storage integration for form state persistence\n\n Component Categories\n\n Core Input Components\n\n Essential form controls with advanced validation and user experience features:\n - Button - Async-aware button with automatic loading/success/error states\n - Input - Comprehensive input system with real-time validation, multiple variants (Text, Password, Email, Number, Checkbox), and\n session caching\n - Select - Advanced dropdown with search, multi-select, and custom rendering\n - DatePicker - Date/time selection with range support and custom formatting\n - CodeInput - PIN/verification code input with auto-focus management\n - Upload - File upload system with drag-drop, progress tracking, image cropping, and multiple file support\n\n Data Display Components\n\n Components for presenting and organizing information:\n - Chart - Visualization suite (Bar, Line, Pie, Doughnut) built on Chart.js\n - Avatar - User profile images with intelligent fallbacks\n - ChatBubble - Chat interface with message grouping and timestamps\n - Empty - Customizable empty state displays\n - QRCode - QR code generation with click-to-open functionality\n\n Layout & Navigation System\n\n Comprehensive layout framework for application structure:\n - Layout - Complete layout system with Header (auto-hide), Sider (collapsible), Navbar (portal-based), BottomTab (with badges),\n and container components\n - Modal/Dialog - Composable dialog system with backdrop, animations, and gesture support\n - BottomSheet - Mobile-optimized bottom sheet with drag gestures\n - Menu - Navigation menus with horizontal/vertical modes and submenu support\n - Tab - Tabbed interfaces with lazy loading and scroll management\n - ScreenNavigator - Gesture-based screen navigation with spring animations\n\n Interactive Components\n\n Advanced user interaction components:\n - Pagination - Smart page navigation with ellipsis and responsive design\n - InfiniteScroll - Automatic content loading with intersection observer\n - DndKit - Drag and drop functionality with provider pattern\n - Radio - Radio button groups with custom styling\n - ToggleSelect - Button-based selection with single/multi-select modes\n - Share - Native share API with copy fallback\n\n Utility & Feedback Components\n\n Supporting components for enhanced user experience:\n - Loading - Comprehensive loading states (Area, Button, Input, Skeleton, Spin, ProgressBar) with animations\n - Link - Adaptive navigation links with SSR/CSR compatibility\n - MapView - Map integration supporting both Google Maps and Pigeon Maps with markers and overlays\n - Image - Optimized image component with blur placeholders and SSR support\n - Portal - Teleportation component for rendering outside component tree\n\n Advanced Features\n\n State Management Integration\n\n - Context-driven architecture for complex components\n - Signal-based real-time communication components\n - Session storage integration for form persistence\n - Theme-aware styling with automatic adaptation\n\n Performance Optimizations\n\n - Lazy loading support for heavy components\n - Code splitting at component level\n - Optimized re-rendering with React.memo patterns\n - Intersection Observer for scroll-based interactions\n\n Developer Experience\n\n - Comprehensive TypeScript interfaces for all props\n - Consistent naming conventions and API patterns\n - Built-in error boundaries and fallback handling\n - Extensive JSDoc documentation\n - Hot reload support for development\n\n Accessibility & Internationalization\n\n - ARIA attributes and keyboard navigation support\n - Screen reader compatibility\n - RTL (right-to-left) language support\n - Localized date/time formatting\n - Color contrast compliance\n\n Usage Patterns\n\n The library follows a consistent component composition pattern where complex components are built from smaller, focused\n subcomponents. For example:\n\n - Chart.Bar, Chart.Line for different visualization types\n - Dialog.Modal, Dialog.Title, Dialog.Content for composable modals\n - Layout.Header, Layout.Sider, Layout.Navbar for layout construction\n - Upload.File, Upload.Image, Upload.Images for different upload scenarios\n\n This design enables maximum flexibility while maintaining consistency across the application. Components are designed to work\n seamlessly together, sharing common styling patterns, validation systems, and state management approaches.\n\n The library serves as a comprehensive foundation for building modern, accessible, and performant web applications with a focus\n on developer productivity and end-user experience.\n\n Avatar\n - Displays user profile images with automatic fallback to user icon\n - Props: className?: string, icon?: ReactNode, src?: string\n\n Button\n - Enhanced button with automatic loading states and error handling\n - Props: onClick: (e, {onError}) => Promise<Result>, onSuccess?: (result) => void, className?, children, standard button props\n\n Input\n - Comprehensive input system with real-time validation and caching\n - Props: value: string, validate: (value) => boolean | string, onChange?, nullable?, inputStyleType?: \"bordered\" | \"borderless\" \n | \"underline\", icon?, cacheKey?\n - Variants: Input.TextArea, Input.Password, Input.Email, Input.Number, Input.Checkbox\n\n Select\n - Advanced dropdown with search and multi-select capabilities\n - Props: value: T | T[], options: {label, value}[], multiple?, searchable?, onChange, onSearch?, renderOption?, renderSelected?\n\n DatePicker\n - Date/time picker with range selection support\n - Props: value?: Dayjs, onChange, showTime?, format?, disabledDate?\n - Variants: DatePicker.RangePicker, DatePicker.TimePicker\n\n CodeInput\n - PIN/code input with individual character boxes\n - Props: maxNum: number, value: string, onChange, unitStyle?: \"box\" | \"underline\", autoComplete?\n\n Display Components\n\n Table\n - Feature-rich data table with pagination and responsive design\n - Props: columns: Column[], dataSource: any[], loading?, pagination?, onRow?, rowClassName?\n\n Modal\n - Dialog modal with backdrop and action buttons\n - Props: open: boolean, onCancel, title?, action?, confirmClose?\n - Variants: Modal.Window\n\n Image\n - Optimized image component with blur placeholder and SSR support\n - Props: src?, file?: ProtoFile, abstractData?, alt?, standard Next.js Image props\n\n ChatBubble\n - Chat message bubble with avatar and timestamp\n - Props: avatar?, hasPrev?, hasNext?, isMe?, name?, at?: Dayjs, children\n\n Empty\n - Empty state placeholder with customizable message\n - Props: description?, minHeight?, children?\n\n QRCode\n - QR code generator with click-to-open functionality\n - Props: href: string, className?\n\n Layout Components\n\n BottomSheet\n - Only mobile bottom sheet with drag gestures\n - Props: open: boolean, onCancel, type: \"full\" | \"half\", children\n\n Layout\n Layout - Complete layout framework with responsive design\n - Layout.Header - Top header with auto-hide functionality\n - Props: className?: string, type?: \"static\" | \"hide\", children?: any, height?: number\n - Features: Auto-hide on scroll, fixed positioning\n - Layout.Sider - Collapsible sidebar\n - Props: className?: string, bgClassName?: string, children?: any\n - Features: Drawer-based with toggle functionality\n - Layout.Navbar - Navigation bar with portal content\n - Props: className?: string, children?: ReactNode, height?: \n\n Menu\n - Navigation menu with horizontal/vertical modes and submenu support\n - Props: items: MenuItem[], mode?: \"horizontal\" | \"inline\", selectedKeys?, onClick?, inlineCollapsed?\n\n\n Tab \n - Tabbed interface system\n - Tab.Provider - Tab context provider\n - Props: className?: string, defaultMenu?: string | null, children?: any\n - Tab.Menu - Tab menu item\n - Props: className?: string, activeClassName?: string, disabledClassName?: string, disabled?: boolean, menu: string, children:\n any, scrollToTop?: boolean, tooltip?: string\n - Tab.Panel - Tab content panel\n - Props: className?: string, menu: string, children?: any, loading?: \"eager\" | \"lazy\" | \"every\"\n - Features: Lazy loading support\n\n ScreenNavigator \n - Gesture-based screen navigation\n - ScreenNavigator.Provider - Navigation context provider\n - Props: setMenu?: (menu: string) => void, children: ReactNode, menus: string[]\n - Features: Gesture-based navigation, spring animations\n - ScreenNavigator.Screen - Individual screen container\n - Props: children: ReactNode, className?: string\n - ScreenNavigator.NavbarItem - Navigation bar item\n - Props: menu: string, children: ReactNode, className?: string \n\n Upload \n - File upload system with multiple modes\n - Upload \n - Basic file upload with drag & drop\n - Props: onChange?: (fileList: FileList) => void; multiple?: boolean; accept?: string; className?: string; uploadClassName?: string; children: React.ReactNode; disabled?: boolean;\n - Upload.File \n - Single file upload with preview\n - Props: multiple?: boolean; file: ProtoFile | null; render?: (file: ProtoFile) => React.ReactNode; onChange?: (e: File | FileList) => void | Promise<void>; onRemove?: (e: any) => void; children?: React.ReactNode; disabled?: boolean; maxCount?: number; className?: string; uploadClassName?: string; accept?: string;\n - Upload.FileList \n - Multiple files with table view and progress tracking\n - Props: multiple?: boolean; fileList: ProtoFile[]; render?: (file: ProtoFile) => React.ReactNode; onChange?: (e: File | FileList) => void | Promise<void>; onRemove?: (e: any) => void; children?: React.ReactNode; disabled?: boolean; maxCount?: number; className?: string; uploadClassName?: string; accept?: string;\n - Upload.Image \n - Image upload with integrated cropping functionality\n - Props: multiple?: boolean; file: ProtoFile | null; render?: (file: ProtoFile) => React.ReactNode; onChange?: (e: File | FileList) => void | Promise<void>; onRemove?: (e: any) => void; children?: React.ReactNode; disabled?: boolean; maxCount?: number; className?: string; uploadClassName?: string; accept?: string;\n - Upload.Images \n - Multiple image upload with gallery preview\n - Props: multiple?: boolean; fileList: ProtoFile[]; render?: (file: ProtoFile) => React.ReactNode; onChange?: (e: File | FileList) => void | Promise<void>; onRemove?: (e: any) => void; children?: React.ReactNode; disabled?: boolean; maxCount?: number; className?: string; uploadClassName?: string; accept?: string;\n\n DndKit \n - Drag and drop functionality built on @dnd-kit\n - DndKit.Provider \n - DnD context provider\n - Props: className?: string + all DndContextProps\n - DndKit.DraggableUnit \n - Draggable item wrapper\n - Props: id: string, children: ReactNode, className?: string, onClick?: () => void | Promise<void>\n - DndKit.DroppableColumn \n - Drop target column\n - Props: id: string, items: T[], className?: string, children: ReactNode, onOver?: (id, items, event) => void, onEnd?: (id, \n item, event) => void\n\n MapView \n - Map integration with multiple providers\n - MapView.Map \n - Main map container with theme awareness\n - Props: className?: string, onLoad?: () => void, onClick?: (coordinate) => void, onRightClick?: (coordinate) => void,\n onMouseMove?: (coordinate) => void, children: any\n - MapView.Marker \n - Map marker component\n - Props: coordinate: cnst.Coordinate, zIndex?: number, children?: any\n - MapView.Google \n - Google Maps implementation\n - Props: id?: string, className?: string, mapKey: string, onClick/onRightClick?: (coordinate) => void, center?: \n cnst.Coordinate, onChangeCenter?: (coordinate) => void, zoom?: number, onChangeZoom?: (zoom) => void, bounds?: {minLat, maxLat, \n minLng, maxLng}, onLoad?: () => void, onMouseMove?: (coordinate, event) => void, options?: google.maps.MapOptions, children: any\n - MapView.Pigeon \n - Pigeon Maps implementation (lightweight alternative)\n - Props: id?: string, className?: string, onLoad?: () => void, onClick/onRightClick?: (coordinate) => void, center?: \n cnst.Coordinate, onChangeCenter?: (coordinate) => void, zoom?: number, onChangeZoom?: (zoom) => void, bounds?: {minLat, maxLat, \n minLng, maxLng}, onChangeBounds?: (bounds) => void, mouseEvents?: boolean, onMouseMove?: (coordinate) => void, mapTiler?: (x, y,\n z, dpr) => string, children?: any, zoomControlStyle?: CSSProperties\n\n\n Pagination\n - Page navigation with smart ellipsis and responsive design\n - Props: currentPage: number, total: number, onPageSelect, itemsPerPage: number\n\n Radio\n - Radio button group with custom styling support\n - Props: value, children: ReactElement[], onChange, disabled?\n\n ToggleSelect\n - Button-based selection with single/multi-select modes\n - Props: items, value, validate, onChange, nullable\n - Variants: ToggleSelect.Multi\n\n Share\n - Native share API with copy fallback\n - Props: title: string, url: string, children\n\n Specialized Component Groups\n\n Chart \n - Visualization components built on Chart.js and react-chartjs-2\n - Chart.Bar - Bar chart component\n - Props: data: ChartData<\"bar\">, options?: ChartOptions<\"bar\">\n - Features: Responsive layout, legend display, title configuration\n - Chart.Line - Line chart component\n - Props: data: ChartData<\"line\">, options?: ChartOptions<\"line\">\n - Features: Line-specific Chart.js configuration with curve interpolation\n - Chart.Pie - Pie chart component\n - Props: data: ChartData<\"pie\">, options?: ChartOptions<\"pie\">\n - Features: ArcElement rendering, responsive design\n - Chart.Doughnut - Doughnut chart component\n - Props: data: ChartData<\"doughnut\">, options?: ChartOptions<\"doughnut\">\n - Features: Similar to pie but with center cutout\n\n Dialog \n - Composable modal dialog system built on Radix UI\n - Dialog.Provider - Dialog context provider\n - Props: className?: string, open?: boolean, defaultOpen?: boolean, children?: any\n - Dialog.Modal - Main modal container\n - Props: className?: string, bodyClassName?: string, confirmClose?: boolean, children?: any, onCancel?: () => void\n - Features: Drag gestures, spring animations, responsive design, close confirmation\n - Dialog.Title - Modal title component\n - Props: children?: ReactNode\n - Dialog.Content - Modal content area\n - Props: className?: string, children?: ReactNode\n - Dialog.Action - Modal action buttons container\n - Props: children?: ReactNode\n - Dialog.Trigger - Modal trigger element\n - Props: className?: string, children?: any\n\n Link \n - Adaptive navigation system\n - Link \n - Main adaptive link (auto-switches between CSR/Next.js based on render mode)\n - Link.Back - Back navigation link\n - Props: className?: string, children?: any\n - Features: Browser history integration\n - Link.Close - Window close link\n - Props: Similar to Back but closes window\n - Link.CsrLink & Link.NextLink - Environment-specific implementations with active state support\n\n\n Loading \n - Loading states for different UI elements\n - Loading.Area - Full-screen loading overlay with animated dots\n - Loading.Button - Button loading skeleton\n - Props: className?: string, active?: boolean, style?: CSSProperties\n - Loading.Input - Input loading skeleton\n - Loading.Skeleton - Multi-line content skeleton with pulse animation\n - Loading.Spin - Custom loading spinner\n - Props: indicator?: ReactNode, isCenter?: boolean\n - Loading.ProgressBar - Animated progress bar\n - Props: className?: string, value: number, max: number\n - Features: React Spring animations\n\n Key Framework Features\n \n - TypeScript support with strict typing\n - Responsive design with mobile-first approach\n - Internationalization (i18n) integration\n - Session storage caching for form inputs\n - Accessibility compliance\n - Consistent DaisyUI/Tailwind CSS styling\n - Modern React patterns (hooks, context, providers)\n - Error handling and validation systems\n ";
4
+ export declare const shardUiDescription = "\nShared UI Library Analysis\n\n Library Overview\n\n The shared UI library in the akansoft project is a comprehensive React component collection designed for building data-driven\n applications. It provides a complete toolkit with consistent patterns, extensive customization options, and deep integration with the\n application's store system.\n\n Key Characteristics\n\n - Store-Centric Architecture: Deep integration with standardized store slices and naming conventions\n - Type-Safe Components: Extensive TypeScript generic usage for compile-time safety\n - Internationalization Ready: Built-in multi-language support throughout all components\n - Responsive Design: Mobile-first approach with adaptive breakpoints\n - Performance Optimized: Memoization, lazy loading, and efficient re-rendering\n - Accessibility Compliant: Proper ARIA attributes and keyboard navigation\n - Extensible Architecture: Plugin systems and customizable renderers\n - Unidirectional Data Flow: Predictable state management patterns\n\n Component Categories\n\n 1. Field Components (Field.tsx)\n\nField.tsx is a core form component library for the akansoft project, providing more than 25 specialized input fields.\n\n## Basic Structure and Common Features\n\n### Label Component\n\n```typescript\ninterface LabelProps {\n className?: string;\n label: string;\n desc?: string;\n unit?: string;\n nullable?: boolean;\n mode?: \"view\" | \"edit\";\n}\n```\n- Purpose: Consistent label display for all fields\n- Features:\n - Help tooltip support (desc)\n - Unit display (unit)\n - Optional field display (nullable)\n - Required indicator is commented out (design decision)\n\n## Text Input Components\n\n### 1. Field.Text\n\n```typescript\ninterface TextProps {\n label?: string;\n desc?: string;\n value: string | null;\n onChange: (value: string) => void;\n placeholder?: string;\n nullable?: boolean;\n disabled?: boolean;\n minlength?: number; // Default: nullable ? 0 : 2\n maxlength?: number; // Default: 200\n transform?: (value: string) => string;\n validate?: (text: string) => boolean | string;\n cache?: boolean; // Form caching support\n onPressEnter?: () => void;\n inputStyleType?: \"bordered\" | \"borderless\" | \"underline\";\n}\n```\nKey features:\n- Real-time transformation (transform)\n- Automatic cache key generation: ${label}-${desc}-text\n- Length validation and custom validation\n- Various input styles supported\n\n### 2. Field.TextArea\n\n```typescript\ninterface TextAreaProps {\n // Same basic props as Text +\n rows?: number; // Default: 3\n maxlength?: number; // Default: 1000\n}\n```\nKey features:\n- Multi-line text input\n- Adjustable height (rows)\n- Longer maximum length than Text\n\n### 3. Field.Price (to be deprecated)\n\n```typescript\ninterface PriceProps {\n // Similar to Text but specialized for prices\n maxlength?: number; // Default: 80\n placeholder?: string; // Default: \"~ ${l('shared.priceUnit')}\"\n}\n```\nKey features:\n- Automatic removal of commas and spaces\n- Automatic price unit placeholder\n- Marked as \"delete\" in comments - legacy component\n\n## List Management Components\n\n### 4. Field.List\n\n```typescript\ninterface ListProps<Item> {\n label?: string;\n value: Item[];\n onChange: (value: Item[]) => void;\n onAdd: () => void;\n renderItem: (item: Item, idx: number) => ReactNode;\n}\n```\nKey features:\n- Generic type supporting all item types\n- Custom rendering for each item\n- Automatic delete button addition\n- Automatic divider insertion\n\n### 5. Field.TextList\n\n```typescript\ninterface TextListProps {\n value: string[];\n onChange: (value: string[]) => void;\n minlength?: number; // Minimum array length, Default: 0\n maxlength?: number; // Maximum array length, Default: 50\n minTextlength?: number; // Minimum individual text length, Default: 2\n maxTextlength?: number; // Maximum individual text length, Default: 200\n transform?: (value: string) => string;\n validate?: (text: string) => boolean | string;\n cache?: boolean;\n}\n```\nKey features:\n- Drag and drop for order changes\n- Individual text input validation\n- Cache key: ${label}-${desc}-textList-[${idx}]\n- Conditional \"New\" button display based on maximum length limit\n\n### 6. Field.Tags\n\n```typescript\ninterface TagsProps {\n value: string[];\n onChange: (value: string[]) => void;\n minlength?: number; // Default: 0\n maxlength?: number; // Default: 50 \n minTextlength?: number; // Default: 2\n maxTextlength?: number; // Default: 10 (tags are shorter)\n transform?: (value: string) => string;\n validate?: (text: string) => boolean | string;\n}\n```\nKey features:\n- Tag style UI (includes # prefix)\n- Inline editing mode\n- Creates additional input field when clicked\n- Cancel editing with ESC key\n- Complete tag addition with Enter/Blur\n\n## Numeric Input Components\n\n### 7. Field.Number\n\n```typescript\ninterface NumberProps {\n value: number | null;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n unit?: string;\n transform?: (value: number) => number;\n validate?: (text: number) => boolean | string;\n formatter?: (value: string) => string; // Display format\n parser?: (value: string) => string; // Parsing format\n cache?: boolean;\n}\n```\nKey features:\n- Automatic number validation and min/max checks\n- Customizable display format with formatter/parser\n- Unit display support\n- Cache key: ${label}-${desc}-number\n\n### 8. Field.DoubleNumber\n\n```typescript\ninterface DoubleNumberProps {\n value: [number, number] | null;\n onChange: (value: [number, number]) => void;\n min?: [number, number] | null;\n max?: [number, number] | null;\n separator?: ReactNode | string; // Separator between inputs\n}\n```\nKey features:\n- Range input (start-end values)\n- Independent min/max validation for each\n- Custom separator (e.g., \"~\", \"-\")\n- Cache keys: ${label}-${desc}-number-[0], ${label}-${desc}-number-[1]\n\n## Selection Components\n\n### 9. Field.Switch\n\n```typescript\ninterface SwitchProps {\n value: boolean;\n onChange: (value: boolean) => void;\n onDesc?: string; // Description when true\n offDesc?: string; // Description when false\n disabled?: boolean;\n}\n```\nKey features:\n- DaisyUI toggle style\n- State-specific description text\n- Uses toggle-accent class\n\n### 10. Field.ToggleSelect\n\n```typescript\ninterface ToggleSelectProps<I> {\n items: { label: string; value: I }[] | readonly I[] | I[] | Enum<I>;\n value: I | null;\n onChange: (value: I) => void;\n model?: string; // Model name for internationalization\n field?: string; // Field name for internationalization\n validate?: (value: I) => boolean | string;\n btnClassName?: string;\n}\n```\nKey features:\n- Button-style single selection\n- Direct Enum type support\n- Automatic internationalization (l.enum(model, field, item))\n- Custom button styling\n\n### 11. Field.MultiToggleSelect\n\n```typescript\ninterface MultiToggleSelectProps<I> {\n items: Enum<I> | { label: string; value: I }[] | readonly I[] | I[];\n value: I[];\n onChange: (value: I[]) => void;\n minlength?: number;\n maxlength?: number;\n validate?: (value: I[]) => boolean | string;\n}\n```\nKey features:\n- Multiple selection button UI\n- Minimum/maximum selection limit\n- Array length validation\n\n## Relational Data Selection Components\n\n### 12. Field.Parent & Field.ParentId\n\n```typescript\ninterface ParentProps<T, State, Input, Full, Light, Sort, QueryArgs> {\n sliceName: string; // Target slice name\n value: Light | null; // Parent returns object\n onChange: (value?: Light | null) => void;\n initArgs?: any[]; // Initialization arguments\n sortOption?: (a: Light, b: Light) => number;\n renderOption: (model: Light) => ReactNode; // Option renderer\n renderSelected?: (value: Light) => ReactNode; // Selected item renderer\n onSearch?: (text: string) => void; // Search handler\n}\n\ninterface ParentIdProps extends ParentProps {\n value: string | null; // ParentId returns only ID\n onChange: (id?: string | null, model?: Light | null) => void;\n}\n```\nKey features:\n- Dynamic store slice integration\n- Automatic naming convention: ${modelName}List, init${ModelName}, etc.\n- Searchable dropdown\n- Lazy loading (data fetched on onOpen)\n- Parent: returns full object, ParentId: returns only ID\n\n### 13. Field.Children & Field.ChildrenId\n\n```typescript\ninterface ChildrenProps extends ParentProps {\n value: Light[]; // Multiple selection\n onChange: (value?: Light[] | null) => void;\n}\n\ninterface ChildrenIdProps extends ChildrenProps {\n value: string[]; // ID array\n onChange: (value: string[]) => void;\n}\n```\nKey features:\n- Multiple relationship selection\n- Same store integration logic as Parent\n- Automatic initialization (useEffect)\n\n## Date/Time Components\n\n### 14. Field.Date\n\n```typescript\ninterface DateProps<Nullable extends boolean> {\n value: Nullable extends true ? Dayjs | null : Dayjs;\n onChange: (value: Dayjs) => void;\n min?: Dayjs;\n max?: Dayjs;\n showTime?: boolean; // datetime-local vs date\n nullable?: boolean;\n}\n```\nKey features:\n- Uses Dayjs objects\n- Conditional nullable type (using TypeScript generics)\n- Automatic format change based on showTime\n- Uses HTML5 date/datetime-local inputs\n- Includes comment about DaisyUI max value bug\n\n### 15. Field.DateRange\n\n```typescript\ninterface DateRangeProps<Nullable extends boolean> {\n from: Nullable extends true ? Dayjs | null : Dayjs;\n to: Nullable extends true ? Dayjs | null : Dayjs;\n onChangeFrom: (value: Dayjs) => void;\n onChangeTo: (value: Dayjs) => void;\n onChange?: (from: Dayjs, to: Dayjs) => void; // Optional unified handler\n showTime?: boolean;\n}\n```\nKey features:\n- Individual management of start/end dates\n- Optional unified change handler\n- Automatic \"From\"/\"To\" label display\n- Responsive layout (vertical on mobile)\n\n## File Upload Components\n\n### 16. Field.Img\n\n```typescript\ninterface ImageProps {\n sliceName: string; // Determines file upload API\n value: cnst.File | null;\n onChange: (file: cnst.File | null) => void;\n styleType?: \"circle\" | \"square\"; // Default: \"circle\"\n aspectRatio?: number[]; // Aspect ratio restriction\n render?: (file: cnst.File) => ReactNode;\n disabled?: boolean;\n}\n```\nKey features:\n- Dynamic upload API: add${capitalize(sliceName)}Files\n- Upload status polling (1-second interval)\n- Aspect ratio restriction support\n- Circular/square preview\n\n### 17. Field.Imgs\n\n```typescript\ninterface ImagesProps {\n sliceName: string;\n value: cnst.File[];\n onChange: (files: cnst.File[]) => void;\n minlength?: number; // Default: 1\n maxlength?: number; // Default: 30\n render?: (file: cnst.File) => ReactNode;\n}\n```\nKey features:\n- Multiple image upload\n- Batch polling of upload status\n- Minimum/maximum file count limit\n- Fixed square style\n\n### 18. Field.File & Field.Files\n\n```typescript\ninterface FileProps {\n sliceName: string;\n value: cnst.File | null; // File is single\n onChange: (file: cnst.File | null) => void;\n render?: (file: cnst.File) => ReactNode;\n}\n\ninterface FilesProps {\n sliceName: string;\n value: cnst.File[]; // Files is multiple\n onChange: (files: cnst.File[]) => void;\n minlength?: number; // Default: 1\n maxlength?: number; // Default: 30\n}\n```\nKey features:\n- Support for all file types (beyond images)\n- Same upload logic as Img/Imgs\n- Custom file renderer support\n\n## Rich Text Editor\n\n### 19. Field.Slate\n\n```typescript\ninterface SlateProps {\n sliceName: string; // Determines file upload API\n valuePath: string; // Store path\n onChange: (value: unknown) => void;\n addFile: (file: cnst.File | cnst.File[], options?) => void;\n placeholder?: string;\n disabled?: boolean;\n editorHeight?: string;\n}\n```\nKey features:\n- Slate.js-based rich text editor\n- File drag and drop support\n- Dynamic store path access\n- Adjustable height\n\n### 20. Field.Yoopta\n\n```typescript\ninterface YooptaProps {\n value: JSON;\n onChange: (value: JSON) => void;\n readonly?: boolean;\n}\n```\nKey features:\n- Yoopta editor integration\n- JSON data format\n- Read-only mode support\n\n## Authentication and Contact Components\n\n### 21. Field.Email\n\n```typescript\ninterface EmailProps {\n value: string | null;\n onChange: (value: string) => void;\n placeholder?: string; // Default: \"example@email.com\"\n minlength?: number; // Default: nullable ? 0 : 2\n maxlength?: number; // Default: 80\n inputStyleType?: \"bordered\" | \"borderless\" | \"underline\";\n cache?: boolean;\n}\n```\nKey features:\n- Automatic email format validation\n- Uses Input.Email component\n- Cache key: ${label}-${desc}-email\n\n### 22. Field.Phone\n\n```typescript\ninterface PhoneProps {\n value: string | null;\n onChange: (value: string) => void;\n maxlength?: number; // Default: 13\n transform?: (value: string) => string; // Default: formatPhone\n cache?: boolean;\n}\n```\nKey features:\n- Automatic phone number formatting (formatPhone)\n- isPhoneNumber validation\n- Cache key: ${label}-${desc}-phone\n\n### 23. Field.Password\n\n```typescript\ninterface PasswordProps {\n value: string | null;\n onChange: (value: string) => void;\n confirmValue?: string | null; // Confirmation input\n onChangeConfirm?: (value: string) => void;\n showConfirm?: boolean; // Show confirmation input\n minlength?: number; // Default: nullable ? 0 : 8\n maxlength?: number; // Default: 20\n cache?: boolean;\n}\n```\nKey features:\n- Optional password confirmation input\n- Automatic match validation\n- Secure input (masking)\n- Cache key: ${label}-${desc}-password\n\n## Geographic Location Components\n\n### 24. Field.Coordinate\n\n```typescript\ninterface CoordinateProps {\n coordinate: cnst.util.Coordinate | null;\n onChange: (coordinate: cnst.util.Coordinate) => void;\n mapKey: string; // Google Maps API key\n mapClassName?: string;\n disabled?: boolean;\n}\n```\nKey features:\n- Google Maps integration\n- Coordinate selection by clicking\n- Automatic marker display (AiTwotoneEnvironment icon)\n- Default zoom level 3\n\n### 25. Field.Postcode\n\n```typescript\ninterface PostcodeProps {\n kakaoKey: string; // Kakao API key\n address: string | null;\n onChange: ({\n address: string;\n addressEn: string;\n zipcode: string;\n coordinate: cnst.util.Coordinate;\n }) => void;\n}\n```\nKey features:\n- Daum postcode service (react-daum-postcode)\n- Coordinate conversion using Kakao Maps API\n- Simultaneous Korean/English address provision\n- Modal address search\n\n### 26. Field.KoreanCityDistrict\n\n```typescript\ninterface KoreanCityDistrictProps {\n city: string | null;\n onChangeCity: (city: string | null) => void;\n district: string | null;\n onChangeDistrict: (district: string | null) => void;\n disabled?: boolean;\n}\n```\nKey features:\n- Hardcoded Korean region data\n- Two-level selection (city/province \u2192 district/county)\n- Includes detailed regions: 25 districts in Seoul, 16 in Busan, etc.\n- Linked selection (district activates after city selection)\n\n## Common Patterns and Features\n\n### 1. Caching System\n\nMost input components support form data persistence with the cache prop:\ncacheKey={cache ? `${label}-${desc}-${componentType}` : undefined}\n\n### 2. Validation System\n\nAll components support multi-layer validation:\n- Basic validation (length, type, format)\n- Custom validation functions\n- Internationalized error messages\n\n### 3. Internationalization\n\n- Labels, placeholders, error messages all use l() function\n- Automatic translation for Enum types\n- Multi-language error message templates\n\n### 4. Store Integration\n\nRelational components automatically connect to the store through naming conventions:\n```javascript\nconst names = {\n model: modelName,\n modelList: `${modelName}List`,\n initModel: `init${ModelName}`,\n};\n```\n\n### 5. Type Safety\n\n- Type safety ensured with TypeScript generics\n- Conditional types for handling nullable properties\n- Strict props interface definitions\n\nThis comprehensive field library provides a consistent user experience and developer convenience, designed to make complex form compositions simple and safe.\n 2. Data Components (/Data/)\n\n Purpose: Complete data visualization and management interfaces\n\n ListContainer\n\n - type?: \"card\" | \"list\" - Display mode selection\n - columns?: DataColumn<any>[] - Column configuration\n - tools?: DataTool[] - Toolbar actions\n - renderDashboard?: (props) => ReactNode - Dashboard customization\n - renderItem?: (props) => ReactNode - Item renderer\n\n CardList\n\n - sliceName: string - Store slice identifier\n - columns: DataColumn<any>[] - Data column definitions\n - actions?: DataAction<Light>[] - Item actions\n - renderItem: (args) => ReactNode - Card renderer\n - renderLoading?: () => ReactNode - Loading state\n\n Dashboard\n\n - summary: { [key: string]: any } - Statistics data\n - queryMap: { [key: string]: any } - Filter mappings\n - columns?: string[] - Clickable statistics\n - hidePresents?: boolean - Display control\n\n 3. Load Components (/Load/)\n\n Purpose: Data loading and state management with SSR/CSR support\n\n Page\n\n - loader: () => Promise<Return> - Data fetching function\n - render: (data: Return) => ReactNode - Content renderer\n - loading?: () => ReactNode - Loading state\n\n Edit\n\n - edit: ClientEdit<T, Full> | Partial<Full> - Edit data\n - type?: \"modal\" | \"form\" | \"empty\" - Display mode\n - sliceName: string - Store slice\n - onSubmit?: string | ((model: Full) => void) - Submit handler\n\n Units\n\n - init: ClientInit<T, L> - Initial data\n - filter?: (item: L, idx: number) => boolean - Item filtering\n - sort?: (a: L, b: L) => number - Sorting function\n - renderItem?: (item: L, idx: number) => ReactNode - Item renderer\n - pagination?: boolean - Pagination control\n\n 4. Model Components (/Model/)\n\n Purpose: CRUD operations with modal and inline editing\n\n EditModal\n\n - sliceName: string - Store slice identifier\n - id?: string - Model ID for editing\n - renderTitle?: ((model: Full) => ReactNode) | string - Title customization\n - onSubmit?: string | ((model: Full) => void) - Submit handler\n - onCancel?: string | ((form?: any) => any) - Cancel handler\n\n ViewModal\n\n - id: string - Model identifier\n - renderView: (model: any) => ReactNode - View content renderer\n - renderAction?: (model: any) => ReactNode - Action buttons\n\n NewWrapper\n\n - sliceName: string - Store slice\n - partial?: Partial<Full> - Default values\n - modal?: string | null - Modal type\n\n 5. System Components (/System/)\n\n Purpose: Application-level providers and system utilities\n\n Provider (CSR)\n\n - fonts: ReactFont[] - Font configurations\n - gaTrackingId?: string - Analytics tracking\n - layoutStyle?: \"mobile\" | \"web\" - Layout mode\n\n Provider (SSR)\n\n - fonts?: NextFont[] - Next.js font configurations\n\n SelectLanguage\n\n - languages?: string[] - Available languages\n\n 6. Only Components (/Only/)\n\n Purpose: Conditional rendering based on user state and device\n\n Admin\n\n - roles?: cnst.AdminRole[] - Required admin roles\n\n User\n\n - roles?: cnst.UserRole[] - Required user roles\n\n Show\n\n - show?: boolean | cnst.util.Responsive[] - Show conditions\n\n Mobile/Web\n\n - No props - Device-based rendering\n\n 7. Editor Components (/Editor/)\n\n Purpose: Rich text editing capabilities\n\n Slate\n\n - addFilesGql: (fileList: FileList, id?: string) => Promise<File[]> - File upload\n - addFile: (file: cnst.File | cnst.File[], options?) => void - File management\n - onChange: (value: unknown) => void - Content change handler\n - defaultValue?: unknown - Initial content\n - placeholder?: string - Placeholder text\n - disabled?: boolean - Read-only mode\n\n SlateContent\n\n - content: unknown - Slate content to display\n\n 8. Property Component (Property.tsx)\n\n Purpose: Metadata-driven property editing\n\n - prop: string - Property name\n - slice: StoreOf<any, any> - Store slice\n - renderTemplate?: (form: any) => ReactNode - Custom edit renderer\n - renderView?: (model: any) => ReactNode - Custom view renderer\n - modelPath?: string - Model path in store\n\n Integration Patterns\n\n Store Integration\n\n - Components use standardized naming conventions for store slices\n - Automatic state management through slice integration\n - Consistent error handling and loading states\n\n Validation System\n\n - Built-in validation for all field types\n - Custom validation function support\n - Internationalized error messages\n\n File Management\n\n - Integrated file upload system\n - Progress tracking and status management\n - Multiple file type support with preview\n\n Responsive Behavior\n\n - Mobile-first design approach\n - Adaptive layouts based on screen size\n - Touch-friendly interactions\n\n This comprehensive UI library provides everything needed to build sophisticated data management interfaces with consistent user\n experience and maintainable code architecture.\n";
4
5
  export declare const frameworkAbstract = "\nIntro\n- Build an all-stack application at once.\n- Write one line, deploy on web, app, server, database, and infra.\n- Akan is a framework with least code, highest performance for typescript-written applications.\n\nKey features\n- Integral interface: Akan serves an interface for building from schema, to service logic, api endpoint, state management, and component design.\n- Stable, Scalable, Safe built-in architecture: Fully type-safe, i18n, security, file management, text-search, automatic documentation, admin page, etc are all served with modular development.\n- application as a service: Akan deploys server, database, web, app at once through Akan cloud. Commit once, deploy and manage all.\n\nProcedure\n- add field on database and api at once, with fully typed\n- add backend api endpoint and frontend fetch function at once, with fully typed\n- write query interface and use everywhere!\n- No spaghetti state management anymore, build your global store with domain-driven state&actions.\n- No Spaghetti Components anymore, build your page with domain-driven components\n- write one page, use SSR on Next.js and build Android&iOS CSR app with beautiful page transitions!\n- built-in ai code generation, tell about business, the logic is generated.\n\n\n";
5
6
  export declare const eslintDescription = "\nCore ESLint Extensions\n\n Base Configurations:\n - eslint:recommended - Standard ESLint recommended rules\n - next & next/core-web-vitals - Next.js specific linting rules\n - @typescript-eslint/recommended-type-checked - TypeScript recommended rules with type checking\n - @typescript-eslint/strict-type-checked - Strict TypeScript type checking rules\n - @typescript-eslint/stylistic-type-checked - TypeScript stylistic rules with type checking\n\n Third-Party Plugins\n\n 1. eslint-plugin-unused-imports\n - Automatically detects and warns about unused imports\n - Helps keep code clean by removing unnecessary import statements\n\n 2. eslint-plugin-simple-import-sort\n - Automatically sorts import statements in a consistent order\n - Enforces clean import organization throughout the codebase\n\n Custom Plugin: @akanjs/lint\n\n 1. useClientByFile\n - Enforces proper \"use client\" directive usage in Next.js App Router\n - Server files must NOT have \"use client\" directive\n - Client files MUST have \"use client\" directive at the top\n\n 2. noImportClientFunctions\n - Prevents server files from importing client-side functions\n - Ensures proper separation between server and client code\n\n 3. nonScalarPropsRestricted\n - Prevents non-scalar props (functions) in server components\n - Specifically targets page.tsx and layout.tsx files\n - Allows exceptions for specific props like \"loader\", \"render\", and \"of\"\n\n 4. noImportExternalLibrary\n - Restricts external library imports in pure import/re-export files\n - Only allows imports from the same app scope (@appName/...)\n - Promotes clean architecture and prevents dependency leakage\n\n Key Rule Configurations\n\n Disabled Rules:\n - no-console: \"error\" - Prevents console statements in production code\n - Various TypeScript strict rules are disabled for flexibility\n - React and Next.js specific rules are relaxed for development ease\n\n Import Management:\n - unused-imports/no-unused-imports: \"warn\" - Warns about unused imports\n - simple-import-sort/imports: \"warn\" - Enforces import sorting\n - import/first: \"warn\" - Ensures imports come first\n - import/newline-after-import: \"warn\" - Enforces newline after imports\n\n This configuration creates a robust linting setup that enforces Next.js App Router best practices, maintains clean code\n organization, and ensures proper server/client code separation.\n ";
6
7
  interface RequestConstantProps {
@@ -15,6 +16,22 @@ interface RequestConstantProps {
15
16
  }[];
16
17
  }
17
18
  export declare const requestScalarConstant: ({ sysName, modelName, modelDesc, modelSchemaDesign, boilerplate, otherConstants, }: RequestConstantProps) => string;
19
+ interface RequestTemplateProps {
20
+ sysName: string;
21
+ modelName: string;
22
+ ModelName: string;
23
+ constant: string;
24
+ boilerplate?: string;
25
+ properties: {
26
+ key: string;
27
+ source: string;
28
+ }[];
29
+ exampleFiles: {
30
+ filepath: string;
31
+ content: string;
32
+ }[];
33
+ }
34
+ export declare const requestTemplate: ({ sysName, modelName, ModelName, boilerplate, constant, properties, exampleFiles, }: RequestTemplateProps) => string;
18
35
  interface RequestViewProps {
19
36
  sysName: string;
20
37
  modelName: string;
@@ -46,5 +63,5 @@ interface RequestUnitProps {
46
63
  content: string;
47
64
  }[];
48
65
  }
49
- export declare const requestUnit: ({ sysName, modelName, ModelName, constant, properties, exampleFiles, }: RequestUnitProps) => string;
66
+ export declare const requestUnit: ({ sysName, modelName, ModelName, constant, properties, boilerplate, exampleFiles, }: RequestUnitProps) => string;
50
67
  export {};
@@ -12,6 +12,12 @@ export declare class ModuleRunner {
12
12
  content: string;
13
13
  };
14
14
  }>;
15
+ createComponentTemplate(sys: Sys, name: string, type: "unit" | "view" | "template" | "zone" | "util"): Promise<{
16
+ component: {
17
+ filename: string;
18
+ content: string;
19
+ };
20
+ }>;
15
21
  createModuleTemplate(sys: Sys, name: string): Promise<{
16
22
  constant: {
17
23
  filename: string;
@@ -7,6 +7,7 @@ export declare class ModuleScript {
7
7
  createScalar(sys: Sys, name: string, description: string, schemaDescription: string): Promise<void>;
8
8
  createService(workspace: Workspace, name: string): Promise<void>;
9
9
  createTest(workspace: Workspace, name: string): Promise<void>;
10
+ createTemplate(sys: Sys): Promise<void>;
10
11
  createUnit(sys: Sys): Promise<void>;
11
12
  createView(sys: Sys): Promise<void>;
12
13
  }