@akanjs/cli 0.0.138 → 0.0.140

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -41,7 +41,16 @@ export class ${dict.Model}Summary {
41
41
  }
42
42
 
43
43
  @Model.Filter("${dict.Model}Filter")
44
- export class ${dict.Model}Filter extends sortOf(${dict.Model}, {}) {}
44
+ export class ${dict.Model}Filter extends sortOf(${dict.Model}, {}) {
45
+ @Filter.Mongo()
46
+ inStatus(
47
+ @Filter.Arg("status", () => String) status: ${dict.Model}Status,
48
+ ) {
49
+ return {
50
+ status,
51
+ };
52
+ }
53
+ }
45
54
  `;
46
55
  }
47
56
  export {
@@ -43,6 +43,11 @@ export const ${dict.model}SummaryDictionary = {
43
43
  // * ==================== Summary ==================== * //
44
44
  total${dict.Model}: ["Total${dict.Model}", "\uCD1D \uBC30\uB108 \uC218"],
45
45
  "desc-total${dict.Model}": ["Total ${dict.model} count in the database", "\uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0 \uC800\uC7A5\uB41C \uCD1D \uBC30\uB108 \uC218"],
46
+
47
+ "qry-inStatus": ["In Status", "\uC0C1\uD0DC"],
48
+ "qrydesc-inStatus": ["Filter by status", "\uC0C1\uD0DC\uBCC4 \uD544\uD130\uB9C1"],
49
+ "qarg-inStatus-status": ["Status", "\uC0C1\uD0DC"],
50
+ "qargdesc-inStatus-status": ["Filter by status", "\uC0C1\uD0DC\uBCC4 \uD544\uD130\uB9C1"],
46
51
  // * ==================== Summary ==================== * //
47
52
  } satisfies SummaryDictionary<${dict.Model}Summary>;
48
53
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "sourceType": "module",
3
3
  "name": "@akanjs/cli",
4
- "version": "0.0.138",
4
+ "version": "0.0.140",
5
5
  "bin": {
6
6
  "akan": "cjs/index.js"
7
7
  },
@@ -2,9 +2,9 @@ import { App, Sys, Workspace } from "@akanjs/devkit";
2
2
  import { ApplicationScript } from "./application.script";
3
3
  export declare class ApplicationCommand {
4
4
  applicationScript: ApplicationScript;
5
- createApplication(name: string, start: boolean, workspace: Workspace): Promise<void>;
5
+ createApplication(appName: string, start: boolean, workspace: Workspace): Promise<void>;
6
6
  removeApplication(app: App): Promise<void>;
7
- syncApplication(app: App, verbose: boolean): Promise<void>;
7
+ syncApplication(app: App): Promise<void>;
8
8
  build(app: App): Promise<void>;
9
9
  buildBackend(app: App): Promise<void>;
10
10
  buildFrontend(app: App): Promise<void>;
@@ -13,17 +13,20 @@ export declare class ApplicationRunner {
13
13
  getConfig(app: App): Promise<AppConfigResult>;
14
14
  scanSync(app: App, akanConfig: AppConfigResult): Promise<import("@akanjs/config").AppScanResult | import("@akanjs/config").LibScanResult>;
15
15
  buildBackend(app: App): Promise<void>;
16
- startBackend(app: App, { open }?: {
16
+ startBackend(app: App, { open, onStart }?: {
17
17
  open?: boolean;
18
+ onStart?: () => void;
18
19
  }): Promise<void>;
19
20
  buildFrontend(app: App): Promise<void>;
20
- startFrontend(app: App, { open, turbo }?: {
21
+ startFrontend(app: App, { open, turbo, onStart }?: {
21
22
  open?: boolean;
22
23
  turbo?: boolean;
24
+ onStart?: () => void;
23
25
  }): Promise<void>;
24
26
  buildCsr(app: App): Promise<void>;
25
- startCsr(app: App, { open }?: {
27
+ startCsr(app: App, { open, onStart }?: {
26
28
  open?: boolean;
29
+ onStart?: () => void;
27
30
  }): Promise<void>;
28
31
  buildIos(app: App): Promise<void>;
29
32
  startIos(app: App, { open, operation }?: {
@@ -8,7 +8,7 @@ export declare class ApplicationScript {
8
8
  start?: boolean;
9
9
  }): Promise<void>;
10
10
  removeApplication(app: App): Promise<void>;
11
- syncApplication(app: App, verbose?: boolean): Promise<import("@akanjs/config").AppScanResult | import("@akanjs/config").LibScanResult>;
11
+ syncApplication(app: App): Promise<import("@akanjs/config").AppScanResult | import("@akanjs/config").LibScanResult>;
12
12
  build(app: App): Promise<void>;
13
13
  start(app: App, { open }?: {
14
14
  open?: boolean;
@@ -16,8 +16,9 @@ export declare class ApplicationScript {
16
16
  buildBackend(app: App, { sync }?: {
17
17
  sync?: boolean;
18
18
  }): Promise<void>;
19
- startBackend(app: App, { open, sync }?: {
19
+ startBackend(app: App, { open, dbup, sync }?: {
20
20
  open?: boolean;
21
+ dbup?: boolean;
21
22
  sync?: boolean;
22
23
  }): Promise<void>;
23
24
  buildFrontend(app: App, { sync }?: {
@@ -2,11 +2,11 @@ import { Workspace } from "@akanjs/devkit";
2
2
  import { CloudScript } from "./cloud.script";
3
3
  export declare class CloudCommand {
4
4
  cloudScript: CloudScript;
5
- login(): Promise<void>;
6
- logout(): void;
7
- setLlm(): Promise<void>;
8
- resetLlm(): void;
9
- ask(question: string): Promise<void>;
5
+ login(workspace: Workspace): Promise<void>;
6
+ logout(workspace: Workspace): void;
7
+ setLlm(workspace: Workspace): Promise<void>;
8
+ resetLlm(workspace: Workspace): void;
9
+ ask(question: string, workspace: Workspace): Promise<void>;
10
10
  deployAkan(workspace: Workspace): Promise<void>;
11
11
  update(workspace: Workspace): Promise<void>;
12
12
  }
@@ -1,11 +1,11 @@
1
1
  import { type Workspace } from "@akanjs/devkit";
2
2
  export declare class CloudScript {
3
3
  #private;
4
- login(): Promise<void>;
5
- logout(): void;
6
- setLlm(): Promise<void>;
7
- resetLlm(): void;
8
- ask(question: string): Promise<void>;
4
+ login(workspace: Workspace): Promise<void>;
5
+ logout(workspace: Workspace): void;
6
+ setLlm(workspace: Workspace): Promise<void>;
7
+ resetLlm(workspace: Workspace): void;
8
+ ask(question: string, workspace: Workspace): Promise<void>;
9
9
  deployAkan(workspace: Workspace): Promise<void>;
10
10
  update(workspace: Workspace): Promise<void>;
11
11
  }
@@ -2,11 +2,10 @@ import { Lib, Workspace } from "@akanjs/devkit";
2
2
  import { LibraryScript } from "./library.script";
3
3
  export declare class LibraryCommand {
4
4
  libraryScript: LibraryScript;
5
- createLibrary(name: string, workspace: Workspace): Promise<void>;
5
+ createLibrary(libName: string, workspace: Workspace): Promise<void>;
6
6
  removeLibrary(lib: Lib): Promise<void>;
7
- scanLibrary(lib: Lib): Promise<void>;
8
- buildLibrary(lib: Lib): Promise<void>;
9
- installLibrary(name: string, workspace: Workspace): Promise<void>;
7
+ syncLibrary(lib: Lib): Promise<void>;
8
+ installLibrary(libName: string, workspace: Workspace): Promise<void>;
10
9
  pushLibrary(lib: Lib, branch: string): Promise<void>;
11
10
  pullLibrary(lib: Lib, branch: string): Promise<void>;
12
11
  }
@@ -1,7 +1,6 @@
1
1
  import type { Lib, Workspace } from "@akanjs/devkit";
2
2
  export declare class LibraryScript {
3
3
  #private;
4
- scanLibrary(lib: Lib, verbose?: boolean): Promise<import("@akanjs/config").AppScanResult | import("@akanjs/config").LibScanResult>;
5
4
  syncLibrary(lib: Lib): Promise<import("@akanjs/config").AppScanResult | import("@akanjs/config").LibScanResult>;
6
5
  createLibrary(libName: string, workspace: Workspace): Promise<void>;
7
6
  removeLibrary(lib: Lib): Promise<void>;
@@ -2,12 +2,10 @@ import { Sys, Workspace } from "@akanjs/devkit";
2
2
  import { ModuleScript } from "./module.script";
3
3
  export declare class ModuleCommand {
4
4
  moduleScript: ModuleScript;
5
- createModule(sys: Sys, name: string, workspace: Workspace): Promise<void>;
6
- removeModule(name: string, workspace: Workspace): Promise<void>;
7
- scanModule(name: string, workspace: Workspace): Promise<void>;
8
- createScalar(sys: Sys, name: string, description: string, schemaDescription: string, workspace: Workspace): Promise<void>;
9
- createService(name: string, workspace: Workspace): Promise<void>;
10
- createTest(name: string, workspace: Workspace): Promise<void>;
5
+ private selectLib;
6
+ createModule(sys: Sys, moduleName: string, description: string, schemaDescription: string, ai: boolean, workspace: Workspace): Promise<void>;
7
+ removeModule(sys: Sys, workspace: Workspace): Promise<void>;
8
+ createScalar(sys: Sys, scalarName: string, description: string, schemaDescription: string, workspace: Workspace): Promise<void>;
11
9
  createView(sys: Sys, workspace: Workspace): Promise<void>;
12
10
  createUnit(sys: Sys, workspace: Workspace): Promise<void>;
13
11
  createTemplate(sys: Sys, workspace: Workspace): Promise<void>;
@@ -4,56 +4,16 @@ export declare const utilUiDescription = "\n This UI kit is an internally devel
4
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";
5
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";
6
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 ";
7
- interface RequestConstantProps {
8
- sysName: string;
9
- modelName: string;
10
- modelDesc: string;
11
- modelSchemaDesign: string;
12
- boilerplate: string;
13
- otherConstants: {
14
- filepath: string;
15
- content: string;
16
- }[];
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;
35
- interface RequestViewProps {
36
- sysName: string;
37
- modelName: string;
38
- ModelName: string;
39
- constant: string;
40
- boilerplate?: string;
41
- properties: {
42
- key: string;
43
- source: string;
44
- }[];
45
- exampleFiles: {
46
- filepath: string;
47
- content: string;
48
- }[];
49
- }
50
- export declare const requestView: ({ sysName, modelName, ModelName, boilerplate, constant, properties, exampleFiles, }: RequestViewProps) => string;
51
- interface RequestUnitProps {
7
+ export declare const dictionaryDescription = "\n Dictionary File Characteristics (Enumerated)\n\n 1. Structural Organization\n\n - Consistent section-based organization with comment separators (// * ==================== Section ==================== * //)\n - Four main sections: Model, Insight, Filter, Endpoint, and Etc\n - Modular composition pattern using spread operators and base extensions\n\n 2. Translation Format\n\n - All entries use tuple format: readonly [string, string] (English, Korean)\n - Extended format: readonly [string, string, string, string] for parameterized translations\n - Bilingual support with consistent English-first, Korean-second ordering\n\n 3. Naming Conventions\n\n - Base fields: fieldName for primary translation\n - Descriptions: desc-fieldName for detailed explanations\n - Enums: enum-fieldName-value and enumdesc-fieldName-value\n - APIs: api-endpointName, apidesc-endpointName, arg-*, argdesc-*\n - Queries: qry-queryName, qrydesc-queryName, qarg-*, qargdesc-*\n\n 4. Type Safety Implementation\n\n - Generic type constraints: ModelDictionary<Model, Insight, Filter>\n - satisfies operator for type checking without widening\n - Specialized types: SignalDictionary, SummaryDictionary, ExtendModelDictionary\n\n 5. Content Categories\n\n - Model translations: Entity field labels and descriptions\n - API documentation: Endpoint names, descriptions, and parameter translations\n - Enum mappings: User-friendly labels for status values and types\n - Query/filter labels: Search and filter operation translations\n - User messages: Success/error notifications and system messages\n\n 6. Export Patterns\n\n - Full model: Combined model + signal dictionaries with separate summary export\n - Scalar model: Simple model dictionary export\n - Basic: Direct constant object export with as const assertion\n\n 7. Base Integration\n\n - Extends baseTrans for common fields (id, createdAt, updatedAt, removedAt, status)\n - Uses getBaseSignalTrans() for standard CRUD operations\n - Leverages shared translation utilities for consistency\n\n 8. Documentation Coverage\n\n - Every field has corresponding description entry\n - Comprehensive enum value translations\n - Complete API parameter documentation\n - Business domain terminology standardization\n\n Use these characteristics when generating or analyzing dictionary files to ensure consistency with the project's internationalization and documentation standards.\n";
8
+ export declare const constantDescription = "\nThe constant.ts file defines the schema and API interface for model data structures within the application. It serves as a\ncentralized definition for:\n\n1. Data models and their structure\n2. Input/output interfaces\n3. Enumeration types\n4. Field validations and constraints\n5. Filter operations for data querying\n6. Summary and aggregation structures\n\nThese files act as a contract between the frontend and backend, ensuring type safety and consistent data structures throughout the\napplication.\n\nStructure and Components\n\n1. Enumerations\n\nDefine all possible values for specific fields:\n\nexport const RewardRequestStatus = enumOf([\"active\"] as const);\nexport type RewardRequestStatus = enumOf<typeof RewardRequestStatus>;\n\n2. Model Classes\n\nSeveral specialized model classes are defined using decorators:\n\nInput Models\n\nDefine the required fields for creating a new entity:\n\n@Model.Input(\"EntityNameInput\")\nexport class EntityNameInput {\n @Field.Prop(() => String)\n fieldName: string;\n\n @Field.Prop(() => ID)\n referenceField: string;\n}\n\nObject Models\n\nExtend input models with system fields:\n\n@Model.Object(\"EntityNameObject\")\nexport class EntityNameObject extends via(EntityNameInput) {\n @Field.Prop(() => String, { enum: EntityStatus, default: \"active\" })\n status: EntityStatus;\n}\n\nLight Models\n\nDefine compact version of models with essential fields:\n\n@Model.Light(\"LightEntityName\")\nexport class LightEntityName extends via(EntityNameObject, [\"name\", \"status\"] as const) {}\n\nFull Models\n\nComplete model definition, may include methods:\n\n@Model.Full(\"EntityName\")\nexport class EntityName extends via(EntityNameObject, LightEntityName) {\n // Optional static helper methods\n static helperMethod() {\n // Implementation\n }\n}\n\nInsight Models\n\nDefine aggregation structures for metrics:\n\n@Model.Insight(\"EntityNameInsight\")\nexport class EntityNameInsight {\n @Field.Prop(() => Int, { default: 0, accumulate: { $sum: 1 } })\n count: number;\n}\n\nSummary Models\n\nDefine summary fields for reporting:\n\n@Model.Summary(\"EntityNameSummary\")\nexport class EntityNameSummary {\n @Field.Prop(() => Int, { min: 0, default: 0, query: {} })\n totalCount: number;\n}\n\nFilter Models\n\nDefine query operations for the entity:\n\n@Model.Filter(\"EntityNameFilter\")\nexport class EntityNameFilter extends sortOf(EntityName, {}) {\n @Filter.Mongo()\n byUser(\n @Filter.Arg(\"userId\", () => ID, { ref: \"user\" }) userId: string\n ) {\n return { user: userId };\n }\n}\n\n3. Field Properties\n\nField decorators define validation rules and metadata:\n\n@Field.Prop(() => String, {\n nullable: true, // Allow null values\n default: \"value\", // Default value\n enum: EnumType, // Reference to enum\n min: 0, // Validation constraints\n type: \"email\" // Special type validators\n})\n\nBest Practices\n\n1. Type Safety: Always define proper types for all fields\n2. Inheritance: Use the via() helper for inheritance and composition\n3. References: Define relationships between models using references\n4. Validation: Include validation rules directly in field definitions\n5. Default Values: Provide sensible defaults where appropriate\n6. Enumerations: Use strict type enumerations for constrained values\n7. Namespacing: Import related constants with appropriate namespaces\n8. Helper Methods: Add static helper methods to Full models when needed\n9. Consistent Naming: Follow the naming convention of moduleName.constant.ts\n10. Field Organization: Group related fields together\n\nUsage Context\n\nThe constant.ts file definitions are used by:\n\n1. API layer for request/response validation\n2. Database layer for schema definition\n3. Frontend for type checking and form generation\n4. Service layer for business logic implementation\n\nExample Structure\n\nimport { enumOf, ID, Int } from \"@akanjs/base\";\nimport { Field, Filter, Model, sortOf, via } from \"@akanjs/constant\";\n\n// Enums\nexport const EntityStatus = enumOf([\"active\", \"inactive\"] as const);\nexport type EntityStatus = enumOf<typeof EntityStatus>;\n\n// Input model\n@Model.Input(\"EntityInput\")\nexport class EntityInput {\n // Field definitions\n}\n\n// Object model\n@Model.Object(\"EntityObject\")\nexport class EntityObject extends via(EntityInput) {\n // Additional fields\n}\n\n// Light model\n@Model.Light(\"LightEntity\")\nexport class LightEntity extends via(EntityObject, [\"essentialField1\", \"essentialField2\"] as const) {}\n\n// Full model\n@Model.Full(\"Entity\")\nexport class Entity extends via(EntityObject, LightEntity) {}\n\n// Insight model\n@Model.Insight(\"EntityInsight\")\nexport class EntityInsight {\n // Metrics\n}\n\n// Summary model\n@Model.Summary(\"EntitySummary\")\nexport class EntitySummary {\n // Summary fields\n}\n\n// Filter model\n@Model.Filter(\"EntityFilter\")\nexport class EntityFilter extends sortOf(Entity, {}) {\n // Query methods\n}\n\nThis standardized approach ensures consistent data modeling across the application and provides a clear contract for API\nintegrations.\n\n";
9
+ export declare const scalarConstantDescription = "\nPurpose and Structure\n\nScalar constant files define reusable data structures that can be embedded within other models. They represent complex field types\nthat are not entities themselves but are used as components within larger data models. These are located in the __scalar directory\nwithin application or library modules.\n\nKey Characteristics\n\n- Defined with @Model.Scalar decorator (not @Model.Input, @Model.Object, etc.)\n- Do not have their own database collection\n- Cannot be queried independently\n- Used as embedded objects within other models\n- Often represent complex value objects or domain concepts\n\nCreating Scalar Constant Files\n\nFile Organization\n\n1. Place scalar constants in the lib/__scalar/{scalarName}/ directory\n2. Name the file {scalarName}.constant.ts\n3. Register scalars in the _server.ts file in the __scalar directory\n\nBasic Structure\n\nimport { Field, Model } from \"@akanjs/constant\";\nimport { enumOf, Int, Dayjs } from \"@akanjs/base\"; // Import needed types\n\n// Optional: Define enums used by this scalar\nexport const ScalarEnum = enumOf([\"value1\", \"value2\", \"value3\"] as const);\nexport type ScalarEnum = enumOf<typeof ScalarEnum>;\n\n@Model.Scalar(\"ScalarName\") // Use the @Model.Scalar decorator\nexport class ScalarName {\n // Define properties with @Field.Prop decorator\n @Field.Prop(() => String)\n stringProperty: string;\n\n @Field.Prop(() => Int, { min: 0 })\n numericProperty: number;\n\n @Field.Prop(() => Boolean, { default: false })\n booleanProperty: boolean;\n\n @Field.Prop(() => Date)\n dateProperty: Dayjs;\n\n @Field.Prop(() => String, { enum: ScalarEnum })\n enumProperty: ScalarEnum;\n\n @Field.Prop(() => String, { nullable: true })\n optionalProperty: string | null;\n}\n\n\nCommon Types of Scalar Objects\n\nBased on the analyzed codebase, here are common patterns for scalar objects:\n\n1. Value Objects\n\nSimple structures that group related properties:\n\n@Model.Scalar(\"Address\")\nexport class Address {\n @Field.Prop(() => String)\n street: string;\n\n @Field.Prop(() => String)\n city: string;\n\n @Field.Prop(() => String)\n zipCode: string;\n\n @Field.Prop(() => String)\n country: string;\n}\n\n2. Configuration Objects\n\nObjects holding configuration or settings:\n\n@Model.Scalar(\"NotificationSettings\")\nexport class NotificationSettings {\n @Field.Prop(() => Boolean, { default: true })\n emailEnabled: boolean;\n\n @Field.Prop(() => Boolean, { default: true })\n pushEnabled: boolean;\n\n @Field.Prop(() => Boolean, { default: false })\n smsEnabled: boolean;\n}\n\n3. Metadata Objects\n\nObjects providing metadata about other entities:\n\n@Model.Scalar(\"FileMeta\")\nexport class FileMeta {\n @Field.Prop(() => Date)\n lastModifiedAt: Dayjs;\n\n @Field.Prop(() => Int)\n size: number;\n\n @Field.Prop(() => String, { nullable: true })\n mimeType: string | null;\n}\n\n4. Complex Value Type Objects\n\nObjects representing domain-specific complex values:\n\n@Model.Scalar(\"GeoLocation\")\nexport class GeoLocation {\n @Field.Prop(() => Float)\n latitude: number;\n\n @Field.Prop(() => Float)\n longitude: number;\n\n @Field.Prop(() => Float, { nullable: true })\n altitude: number | null;\n}\n\nBest Practices\n\n1. Keep it Simple: Scalar objects should be focused on a single concept\n2. No External References: Avoid referencing entities directly from scalar objects\n3. Validation Rules: Include validation rules in field definitions\n4. Default Values: Provide sensible defaults where appropriate\n5. Documentation: Document the purpose and usage of each scalar type\n6. Reusability: Design scalar objects to be reusable across different models\n7. Immutability: Treat scalar objects as immutable value objects\n8. Naming Convention: Use descriptive names that reflect the domain concept\n\nUsing Scalar Types in Models\n\nAfter defining scalar objects, you can use them in your entity models:\n\nimport { Field, Model } from \"@akanjs/constant\";\nimport { FileMeta } from \"../__scalar/fileMeta/fileMeta.constant\";\nimport { ExternalLink } from \"../__scalar/externalLink/externalLink.constant\";\n\n@Model.Input(\"ProfileInput\")\nexport class ProfileInput {\n @Field.Prop(() => String)\n name: string;\n\n @Field.Prop(() => FileMeta, { nullable: true })\n avatar: FileMeta | null;\n\n @Field.Prop(() => [ExternalLink])\n socialLinks: ExternalLink[];\n}\n\nKey Differences from Regular Models\n\nThis structured approach to scalar objects helps maintain clean, modular, and reusable code across your application, while keeping\nthe domain concepts well-organized and type-safe.\n";
10
+ export declare const howToSetEnumInModelConstant = "\nDeclaring Enumerations in Constant Files\n\nEnumerations in the constant.ts files are declared using the enumOf utility function from the @akanjs/base package. This creates\ntype-safe enumeration values with strong typing support.\n\nBasic Enum Declaration\n\nimport { enumOf } from \"@akanjs/base\";\n\n// Define the enum values as a const array\n// Export the type derived from the enum\nexport const UserStatus = enumOf([\"active\", \"inactive\", \"pending\"] as const);\nexport type UserStatus = enumOf<typeof UserStatus>;\n\nKey Features\n\n1. Type Safety: The as const assertion ensures values are treated as literal types\n2. Value Access: Enum values can be accessed via UserStatus.values\n3. Auto-completion: TypeScript provides auto-completion for enum values\n4. Validation: Prevents assigning invalid values to fields using this enum\n\nUsing Enums with Field Decorators\n\n@Field.Prop(() => String, { enum: UserStatus, default: \"active\" })\nstatus: UserStatus;\n\n// For array of enum values\n@Field.Prop(() => [String], { enum: UserRole, default: [\"user\"] })\nroles: UserRole[];\n";
11
+ export declare const howToSetFieldInModelConstant = "\n# @Field Decorator Documentation\n\nThe `@Field` decorator is used in the Akamir framework to define properties for model classes. This documentation focuses on the usage of `@Field.Prop()` and its available options.\n\n## Basic Usage\n\nThe `@Field.Prop()` decorator is used to define properties in model classes with specific types and options:\n\n```typescript\n@Field.Prop(() => Type, { ...options })\npropertyName: PropertyType;\n```\n\nWhere:\n- `Type` is the GraphQL type for the property (e.g., `String`, `Int`, `ID`, etc.)\n- `options` is an optional object containing configuration parameters\n- `PropertyType` is the TypeScript type of the property\n\n## Available Options\n\nThe following options can be provided to `@Field.Prop()`:\n\n### Basic Options\n\n| Option | Type | Description | Example |\n|-------------|-----------------------------------------------|----------------------------------------------------|------------------------------------------------|\n| `nullable` | `boolean` | Specifies if the field can be null | `{ nullable: true }` |\n| `default` | `string \\| number \\| boolean \\| object \\| null \\| Enum` | Default value for the field | `{ default: \"active\" }` or `{ default: 0 }` |\n| `enum` | `Enum<string \\| number>` | Restricts field values to predefined enum values | `{ enum: ProductStatus }` |\n| `type` | `\"email\" \\| \"password\" \\| \"url\"` | Special field type for validation | `{ type: \"email\" }` |\n\n### Reference Options\n\n| Option | Type | Description | Example |\n|-------------|-------------------------------|----------------------------------------------------|------------------------------------------------|\n| `ref` | `string` | Reference to another model (by model name) | `{ ref: \"product\" }` |\n| `refPath` | `string` | Path to field containing the model name | `{ refPath: \"modelType\" }` |\n| `refType` | `\"child\" \\| \"parent\" \\| \"relation\"` | Type of relationship between models | `{ refType: \"child\" }` |\n\n### Validation Options\n\n| Option | Type | Description | Example |\n|-------------|-------------------------------|----------------------------------------------------|------------------------------------------------|\n| `min` | `number` | Minimum value for number fields | `{ min: 0 }` |\n| `max` | `number` | Maximum value for number fields | `{ max: 100 }` |\n| `minlength` | `number` | Minimum length for string fields | `{ minlength: 3 }` |\n| `maxlength` | `number` | Maximum length for string fields | `{ maxlength: 50 }` |\n| `validate` | `(value: any, model: any) => boolean` | Custom validation function | `{ validate: isPhoneNumber }` |\n\n### Field Behavior Options\n\n| Option | Type | Description | Example |\n|-------------|-----------------------------------------------|----------------------------------------------------|------------------------------------------------|\n| `fieldType` | `\"property\" \\| \"hidden\" \\| \"resolve\"` | Determines how field is used in GraphQL schema | `{ fieldType: \"hidden\" }` |\n| `immutable` | `boolean` | Makes field immutable after creation | `{ immutable: true }` |\n| `select` | `boolean` | Controls if field is included in query results | `{ select: false }` |\n| `query` | `QueryOf<any> \\| (() => QueryOf<any>)` | MongoDB query for this field | `{ query: {} }` |\n| `accumulate`| `AccumulatorOperator` | MongoDB accumulator operator for aggregation | `{ accumulate: { $sum: 1 } }` |\n| `text` | `\"search\" \\| \"filter\"` | Enables text search or filter on this field | `{ text: \"search\" }` |\n\n### Other Options\n\n| Option | Type | Description | Example |\n|-------------|-----------------------------------------------|----------------------------------------------------|------------------------------------------------|\n| `of` | `GqlScalar` | Used for Map type fields to specify value type | `{ of: String }` |\n| `example` | `string \\| number \\| boolean \\| Dayjs \\| Array` | Example value for documentation/playground | `{ example: \"example@email.com\" }` |\n\n## Examples\n\n### Basic Property Definition\n\n```typescript\n@Field.Prop(() => String)\nname: string;\n```\n\n### Nullable Field with Default Value\n\n```typescript\n@Field.Prop(() => String, { nullable: true, default: \"Default Description\" })\ndescription: string | null;\n```\n\n### Enum-Constrained Field\n\n```typescript\n@Field.Prop(() => String, { enum: ProductStatus, default: \"active\" })\nstatus: ProductStatus;\n```\n\n### Number Field with Minimum Value\n\n```typescript\n@Field.Prop(() => Int, { min: 0, default: 0 })\ntotalProduct: number;\n```\n\n### Field with Custom Validation\n\n```typescript\n@Field.Prop(() => String, { validate: isPhoneNumber })\nphone: string;\n```\n\n### Field with Special Type\n\n```typescript\n@Field.Prop(() => String, { type: \"email\" })\nemail: string;\n```\n\n### Relationship Field\n\n```typescript\n@Field.Prop(() => LightBizLicense, { nullable: true })\nbizLicense: LightBizLicense | null;\n```\n\n### Aggregation Field\n\n```typescript\n@Field.Prop(() => Int, { default: 0, accumulate: { $sum: 1 } })\ncount: number;\n```\n\n## Usage Patterns\n\nThe `@Field.Prop()` decorator is commonly used in different model types:\n\n- **Input Models** (`@Model.Input`): Used for creating/updating objects\n- **Object Models** (`@Model.Object`): Base model representation\n- **Light Models** (`@Model.Light`): Light version with selected fields\n- **Full Models** (`@Model.Full`): Complete model representation\n- **Insight Models** (`@Model.Insight`): Used for analytics/statistics\n- **Summary Models** (`@Model.Summary`): Used for data summaries\n\n## Notes\n\n- The options allow for flexible field definition with both GraphQL and MongoDB integrations\n- Validation options help ensure data integrity at the model level\n- Reference options enable building relationships between different models\n- Aggregation options support analytics use cases\n";
12
+ export interface ComponentDefaultDescriptionProps {
52
13
  sysName: string;
53
14
  modelName: string;
54
15
  ModelName: string;
55
16
  constant: string;
56
- boilerplate?: string;
57
17
  properties: {
58
18
  key: string;
59
19
  source: string;
@@ -63,5 +23,4 @@ interface RequestUnitProps {
63
23
  content: string;
64
24
  }[];
65
25
  }
66
- export declare const requestUnit: ({ sysName, modelName, ModelName, constant, properties, boilerplate, exampleFiles, }: RequestUnitProps) => string;
67
- export {};
26
+ export declare const componentDefaultDescription: ({ modelName, ModelName, exampleFiles, constant, properties, }: ComponentDefaultDescriptionProps) => string;
@@ -0,0 +1,59 @@
1
+ interface RequestProps {
2
+ sysName: string;
3
+ modelName: string;
4
+ ModelName?: string;
5
+ boilerplate: string;
6
+ properties?: {
7
+ key: string;
8
+ source: string;
9
+ }[];
10
+ exampleFiles: {
11
+ filepath: string;
12
+ content: string;
13
+ }[];
14
+ }
15
+ interface RequestModuleProps extends RequestProps {
16
+ modelDesc: string;
17
+ modelSchemaDesign: string;
18
+ exampleFiles: {
19
+ filepath: string;
20
+ content: string;
21
+ }[];
22
+ }
23
+ export declare const requestConstant: ({ sysName, modelName, modelDesc, modelSchemaDesign, boilerplate, exampleFiles, }: RequestModuleProps) => string;
24
+ interface RequestDictionaryProps extends RequestProps {
25
+ constant: string;
26
+ modelDesc: string;
27
+ modelSchemaDesign: string;
28
+ }
29
+ export declare const requestDictionary: ({ sysName, modelName, constant, modelDesc, modelSchemaDesign, boilerplate, exampleFiles, }: RequestDictionaryProps) => string;
30
+ interface RequestConstantProps extends RequestProps {
31
+ modelDesc: string;
32
+ modelSchemaDesign: string;
33
+ }
34
+ export declare const requestScalarConstant: ({ sysName, modelName, modelDesc, modelSchemaDesign, boilerplate, exampleFiles, }: RequestConstantProps) => string;
35
+ interface RequestTemplateProps extends RequestProps {
36
+ constant: string;
37
+ properties: {
38
+ key: string;
39
+ source: string;
40
+ }[];
41
+ }
42
+ export declare const requestTemplate: ({ sysName, modelName, ModelName, boilerplate, constant, properties, exampleFiles, }: RequestTemplateProps) => string;
43
+ interface RequestViewProps extends RequestProps {
44
+ constant: string;
45
+ properties: {
46
+ key: string;
47
+ source: string;
48
+ }[];
49
+ }
50
+ export declare const requestView: ({ sysName, modelName, ModelName, boilerplate, constant, properties, exampleFiles, }: RequestViewProps) => string;
51
+ interface RequestUnitProps extends RequestProps {
52
+ constant: string;
53
+ properties: {
54
+ key: string;
55
+ source: string;
56
+ }[];
57
+ }
58
+ export declare const requestUnit: ({ sysName, modelName, ModelName, constant, properties, boilerplate, exampleFiles, }: RequestUnitProps) => string;
59
+ export {};
@@ -1,7 +1,7 @@
1
1
  import { type Sys, Workspace } from "@akanjs/devkit";
2
2
  export declare class ModuleRunner {
3
3
  createModule(workspace: Workspace, sysType: "app" | "lib", sysName: string, moduleName: string, description: string): Promise<void>;
4
- removeModule(workspace: Workspace, name: string): Promise<void>;
4
+ removeModule(sys: Sys, name: string): void;
5
5
  createScalarTemplate(sys: Sys, name: string): Promise<{
6
6
  constant: {
7
7
  filename: string;
@@ -12,6 +12,12 @@ export declare class ModuleRunner {
12
12
  content: string;
13
13
  };
14
14
  }>;
15
+ createDictionaryTemplate(sys: Sys, name: string): Promise<{
16
+ dictionary: {
17
+ filename: string;
18
+ content: string;
19
+ };
20
+ }>;
15
21
  createComponentTemplate(sys: Sys, name: string, type: "unit" | "view" | "template" | "zone" | "util"): Promise<{
16
22
  component: {
17
23
  filename: string;
@@ -1,13 +1,14 @@
1
1
  import { type Sys, Workspace } from "@akanjs/devkit";
2
2
  export declare class ModuleScript {
3
3
  #private;
4
- createModuleTemplate(sys: Sys, name: string): Promise<void>;
5
- createModule(sys: Sys): Promise<void>;
6
- removeModule(workspace: Workspace, name: string): Promise<void>;
4
+ createModuleTemplate(sys: Sys, name: string, description?: string): Promise<void>;
5
+ createModule(sys: Sys, name: string, description?: string, schemaDescription?: string): Promise<void>;
6
+ createModule_(sys: Sys, name: string, description: string, schemaDescription: string): Promise<void>;
7
+ removeModule(sys: Sys, name: string): void;
7
8
  createScalar(sys: Sys, name: string, description: string, schemaDescription: string): Promise<void>;
8
9
  createService(workspace: Workspace, name: string): Promise<void>;
9
10
  createTest(workspace: Workspace, name: string): Promise<void>;
10
- createTemplate(sys: Sys): Promise<void>;
11
- createUnit(sys: Sys): Promise<void>;
12
- createView(sys: Sys): Promise<void>;
11
+ createTemplate(sys: Sys, name: string): Promise<void>;
12
+ createUnit(sys: Sys, name: string): Promise<void>;
13
+ createView(sys: Sys, name: string): Promise<void>;
13
14
  }
@@ -5,6 +5,6 @@ export declare class PackageCommand {
5
5
  version(workspace: Workspace): Promise<void>;
6
6
  createPackage(name: string, workspace: Workspace): Promise<void>;
7
7
  removePackage(pkg: Pkg): Promise<void>;
8
- scanPackage(pkg: Pkg): Promise<void>;
8
+ syncPackage(pkg: Pkg): Promise<void>;
9
9
  buildPackage(pkg: Pkg): Promise<void>;
10
10
  }
@@ -4,6 +4,6 @@ export declare class PackageScript {
4
4
  version(workspace: Workspace): Promise<void>;
5
5
  createPackage(workspace: Workspace, pkgName: string): Promise<void>;
6
6
  removePackage(pkg: Pkg): Promise<void>;
7
- scanPackage(pkg: Pkg): Promise<void>;
7
+ syncPackage(pkg: Pkg): Promise<import("@akanjs/config").PkgScanResult>;
8
8
  buildPackage(pkg: Pkg): Promise<void>;
9
9
  }
@@ -2,7 +2,7 @@ import { Exec, Workspace } from "@akanjs/devkit";
2
2
  import { WorkspaceScript } from "./workspace.script";
3
3
  export declare class WorkspaceCommand {
4
4
  workspaceScript: WorkspaceScript;
5
- createWorkspace(name: string, app: string, dir: string): Promise<void>;
5
+ createWorkspace(workspaceName: string, app: string, dir: string): Promise<void>;
6
6
  generateMongo(workspace: Workspace): Promise<void>;
7
7
  lint(exec: Exec, fix: boolean, workspace: Workspace): Promise<void>;
8
8
  lintAll(fix: boolean, workspace: Workspace): Promise<void>;