@akanjs/cli 0.9.48 → 0.9.49

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.
Files changed (128) hide show
  1. package/cjs/index.js +63 -52
  2. package/cjs/src/guidelines/___library/sharedUiStructureDescription.en.md +1 -1
  3. package/cjs/src/guidelines/databaseModule/databaseModule.instruction.md +9 -21
  4. package/cjs/src/guidelines/fieldDecorator/fieldDecorator.instruction.md +0 -5
  5. package/cjs/src/guidelines/framework/framework.instruction.md +10 -12
  6. package/cjs/src/guidelines/modelConstant/modelConstant.generate.json +0 -7
  7. package/cjs/src/guidelines/modelConstant/modelConstant.instruction.md +14 -19
  8. package/cjs/src/guidelines/modelDocument/modelDocument.instruction.md +0 -24
  9. package/cjs/src/guidelines/modelService/modelService.generate.json +4 -11
  10. package/cjs/src/guidelines/modelService/modelService.instruction.md +12 -75
  11. package/cjs/src/guidelines/modelSignal/modelSignal.generate.json +0 -1
  12. package/cjs/src/guidelines/modelSignal/modelSignal.instruction.md +2 -38
  13. package/cjs/src/guidelines/modelStore/modelStore.instruction.md +1 -3
  14. package/cjs/src/guidelines/modelTemplate/modelTemplate.instruction.md +2 -2
  15. package/cjs/src/guidelines/modelUnit/modelUnit.instruction.md +2 -2
  16. package/cjs/src/guidelines/scalarConstant/scalarConstant.instruction.md +6 -11
  17. package/cjs/src/templates/__scalar/__model__/__model__.constant.js +5 -6
  18. package/cjs/src/templates/__scalar/__model__/__model__.dictionary.js +1 -1
  19. package/cjs/src/templates/app/app/[lang]/layout.js +0 -1
  20. package/cjs/src/templates/app/app/csr.js +3 -1
  21. package/cjs/src/templates/app/lib/___appName__/__appName__.dictionary.js +1 -1
  22. package/cjs/src/templates/app/lib/___appName__/__appName__.service.js +2 -3
  23. package/cjs/src/templates/app/lib/___appName__/__appName__.signal.js +2 -3
  24. package/cjs/src/templates/app/lib/___appName__/__appName__.store.js +2 -3
  25. package/cjs/src/templates/client.js +4 -4
  26. package/cjs/src/templates/crudPages/[__model__Id]/edit/page.js +1 -1
  27. package/cjs/src/templates/crudPages/[__model__Id]/page.js +1 -1
  28. package/cjs/src/templates/crudPages/new/page.js +1 -1
  29. package/cjs/src/templates/crudPages/page.js +1 -1
  30. package/cjs/src/templates/index.js +0 -1
  31. package/cjs/src/templates/lib/__lib/lib.constant.js +0 -1
  32. package/cjs/src/templates/lib/__lib/lib.dictionary.js +7 -4
  33. package/cjs/src/templates/lib/__lib/lib.document.js +4 -3
  34. package/cjs/src/templates/lib/__lib/lib.service.js +1 -1
  35. package/cjs/src/templates/lib/__lib/lib.signal.js +23 -4
  36. package/cjs/src/templates/lib/__lib/lib.store.js +19 -2
  37. package/cjs/src/templates/lib/cnst.js +12 -6
  38. package/cjs/src/templates/lib/db.js +10 -3
  39. package/cjs/src/templates/lib/dict.js +12 -4
  40. package/cjs/src/templates/lib/sig.js +20 -9
  41. package/cjs/src/templates/lib/srv.js +7 -6
  42. package/cjs/src/templates/lib/st.js +10 -8
  43. package/cjs/src/templates/lib/useClient.js +39 -0
  44. package/cjs/src/templates/lib/{usePage.js → useServer.js} +6 -8
  45. package/cjs/src/templates/libRoot/lib/___libName__/__libName__.service.js +2 -3
  46. package/cjs/src/templates/libRoot/lib/___libName__/__libName__.store.js +2 -3
  47. package/cjs/src/templates/module/__model__.constant.js +10 -30
  48. package/cjs/src/templates/module/__model__.dictionary.js +2 -2
  49. package/cjs/src/templates/module/__model__.document.js +2 -8
  50. package/cjs/src/templates/module/__model__.service.js +2 -3
  51. package/cjs/src/templates/module/__model__.signal.js +4 -5
  52. package/cjs/src/templates/module/__model__.store.js +3 -4
  53. package/cjs/src/templates/server.js +5 -4
  54. package/cjs/src/templates/workspaceRoot/.gitignore.template +5 -3
  55. package/esm/index.js +63 -52
  56. package/esm/src/guidelines/___library/sharedUiStructureDescription.en.md +1 -1
  57. package/esm/src/guidelines/databaseModule/databaseModule.instruction.md +9 -21
  58. package/esm/src/guidelines/fieldDecorator/fieldDecorator.instruction.md +0 -5
  59. package/esm/src/guidelines/framework/framework.instruction.md +10 -12
  60. package/esm/src/guidelines/modelConstant/modelConstant.generate.json +0 -7
  61. package/esm/src/guidelines/modelConstant/modelConstant.instruction.md +14 -19
  62. package/esm/src/guidelines/modelDocument/modelDocument.instruction.md +0 -24
  63. package/esm/src/guidelines/modelService/modelService.generate.json +4 -11
  64. package/esm/src/guidelines/modelService/modelService.instruction.md +12 -75
  65. package/esm/src/guidelines/modelSignal/modelSignal.generate.json +0 -1
  66. package/esm/src/guidelines/modelSignal/modelSignal.instruction.md +2 -38
  67. package/esm/src/guidelines/modelStore/modelStore.instruction.md +1 -3
  68. package/esm/src/guidelines/modelTemplate/modelTemplate.instruction.md +2 -2
  69. package/esm/src/guidelines/modelUnit/modelUnit.instruction.md +2 -2
  70. package/esm/src/guidelines/scalarConstant/scalarConstant.instruction.md +6 -11
  71. package/esm/src/templates/__scalar/__model__/__model__.constant.js +5 -6
  72. package/esm/src/templates/__scalar/__model__/__model__.dictionary.js +1 -1
  73. package/esm/src/templates/app/app/[lang]/layout.js +0 -1
  74. package/esm/src/templates/app/app/csr.js +3 -1
  75. package/esm/src/templates/app/lib/___appName__/__appName__.dictionary.js +1 -1
  76. package/esm/src/templates/app/lib/___appName__/__appName__.service.js +2 -3
  77. package/esm/src/templates/app/lib/___appName__/__appName__.signal.js +2 -3
  78. package/esm/src/templates/app/lib/___appName__/__appName__.store.js +2 -3
  79. package/esm/src/templates/client.js +4 -4
  80. package/esm/src/templates/crudPages/[__model__Id]/edit/page.js +1 -1
  81. package/esm/src/templates/crudPages/[__model__Id]/page.js +1 -1
  82. package/esm/src/templates/crudPages/new/page.js +1 -1
  83. package/esm/src/templates/crudPages/page.js +1 -1
  84. package/esm/src/templates/index.js +0 -1
  85. package/esm/src/templates/lib/__lib/lib.constant.js +0 -1
  86. package/esm/src/templates/lib/__lib/lib.dictionary.js +7 -4
  87. package/esm/src/templates/lib/__lib/lib.document.js +4 -3
  88. package/esm/src/templates/lib/__lib/lib.service.js +1 -1
  89. package/esm/src/templates/lib/__lib/lib.signal.js +23 -4
  90. package/esm/src/templates/lib/__lib/lib.store.js +19 -2
  91. package/esm/src/templates/lib/cnst.js +12 -6
  92. package/esm/src/templates/lib/db.js +10 -3
  93. package/esm/src/templates/lib/dict.js +12 -4
  94. package/esm/src/templates/lib/sig.js +20 -9
  95. package/esm/src/templates/lib/srv.js +7 -6
  96. package/esm/src/templates/lib/st.js +10 -8
  97. package/esm/src/templates/lib/useClient.js +19 -0
  98. package/esm/src/templates/lib/useServer.js +11 -0
  99. package/esm/src/templates/libRoot/lib/___libName__/__libName__.service.js +2 -3
  100. package/esm/src/templates/libRoot/lib/___libName__/__libName__.store.js +2 -3
  101. package/esm/src/templates/module/__model__.constant.js +10 -30
  102. package/esm/src/templates/module/__model__.dictionary.js +2 -2
  103. package/esm/src/templates/module/__model__.document.js +2 -8
  104. package/esm/src/templates/module/__model__.service.js +2 -3
  105. package/esm/src/templates/module/__model__.signal.js +4 -5
  106. package/esm/src/templates/module/__model__.store.js +3 -4
  107. package/esm/src/templates/server.js +5 -4
  108. package/esm/src/templates/workspaceRoot/.gitignore.template +5 -3
  109. package/package.json +1 -1
  110. package/src/application/application.command.d.ts +7 -7
  111. package/src/application/application.script.d.ts +3 -1
  112. package/src/guidelines/___library/sharedUiStructureDescription.en.md +1 -1
  113. package/src/guidelines/databaseModule/databaseModule.instruction.md +9 -21
  114. package/src/guidelines/fieldDecorator/fieldDecorator.instruction.md +0 -5
  115. package/src/guidelines/framework/framework.instruction.md +10 -12
  116. package/src/guidelines/modelConstant/modelConstant.instruction.md +14 -19
  117. package/src/guidelines/modelDocument/modelDocument.instruction.md +0 -24
  118. package/src/guidelines/modelService/modelService.instruction.md +12 -75
  119. package/src/guidelines/modelSignal/modelSignal.instruction.md +2 -38
  120. package/src/guidelines/modelStore/modelStore.instruction.md +1 -3
  121. package/src/guidelines/modelTemplate/modelTemplate.instruction.md +2 -2
  122. package/src/guidelines/modelUnit/modelUnit.instruction.md +2 -2
  123. package/src/guidelines/scalarConstant/scalarConstant.instruction.md +6 -11
  124. package/src/templates/lib/useServer.d.ts +4 -0
  125. package/src/workspace/workspace.command.d.ts +1 -0
  126. package/src/workspace/workspace.script.d.ts +1 -0
  127. package/esm/src/templates/lib/usePage.js +0 -13
  128. /package/src/templates/lib/{usePage.d.ts → useClient.d.ts} +0 -0
@@ -40,7 +40,7 @@ Model.Template.tsx files are client-side React components that define the form s
40
40
  "use client";
41
41
  import { Field } from "@shared/ui";
42
42
  import { st } from "@[project]/client";
43
- import { usePage } from "@[project]/lib/usePage";
43
+ import { usePage } from "@[project]/lib/useClient";
44
44
 
45
45
  export const General = ({ id }: { id?: string }) => {
46
46
  const form = st.use.[model]Form();
@@ -466,7 +466,7 @@ const DockerRegistry = ({ value, onChange }) => (
466
466
 
467
467
  ```tsx
468
468
  // Model.constant.ts
469
- @Model.Input("ProjectInput")
469
+
470
470
  export class ProjectInput {
471
471
  @Field.Prop(() => String)
472
472
  name: string;
@@ -148,7 +148,7 @@ Model Units work with LightModel types defined in constant files:
148
148
 
149
149
  ```tsx
150
150
  // In your constant.ts file
151
- @Model.Light("LightProduct")
151
+
152
152
  export class LightProduct extends via(ProductObject, ["name", "price", "sku", "inStock"] as const) {
153
153
  get displayPrice() {
154
154
  return `${this.price.toLocaleString()} KRW`;
@@ -503,7 +503,7 @@ Type error: Property 'description' does not exist on type 'LightProduct'
503
503
 
504
504
  ```tsx
505
505
  // In constant.ts
506
- @Model.Light("LightProduct")
506
+
507
507
  export class LightProduct extends via(ProductObject, ["name", "price", "sku"] as const) {
508
508
  // Only these fields are guaranteed to be available
509
509
  }
@@ -41,7 +41,7 @@ export const Status = enumOf(["active", "inactive"] as const);
41
41
  export type Status = enumOf<typeof Status>;
42
42
 
43
43
  // 3. Scalar model class (SINGLE CLASS PER FILE)
44
- @Model.Scalar("ScalarName") // Must match class name
44
+ // Must match class name
45
45
  export class ScalarName {
46
46
  // Field definitions
47
47
  @Field.Prop(() => FieldType, { ...options })
@@ -74,7 +74,7 @@ import { OtherScalar } from "../other-scalar/other-scalar.constant";
74
74
  ### Basic Structure
75
75
 
76
76
  ```typescript
77
- @Model.Scalar("ScalarName") // String must match class name
77
+ // String must match class name
78
78
  export class ScalarName {
79
79
  // Field definitions go here
80
80
  }
@@ -207,7 +207,6 @@ status: Status;
207
207
  Scalar classes can include static methods for common operations on the scalar type:
208
208
 
209
209
  ```typescript
210
- @Model.Scalar("Coordinate")
211
210
  export class Coordinate {
212
211
  @Field.Prop(() => [Float], { default: [0, 0] })
213
212
  coordinates: number[];
@@ -305,8 +304,8 @@ export type Status = enumOf<typeof Status>;
305
304
 
306
305
  ```typescript
307
306
  // ❌ Wrong (violates single-responsibility)
308
- @Model.Scalar("Address") class Address { ... }
309
- @Model.Scalar("User") class User { ... }
307
+ class Address { ... }
308
+ class User { ... }
310
309
 
311
310
  // ✅ Correct (separate files)
312
311
  // address.constant.ts
@@ -339,7 +338,7 @@ createdAt: Dayjs;
339
338
  export class GeoLocation { ... }
340
339
 
341
340
  // ✅ Correct
342
- @Model.Scalar("GeoLocation")
341
+
343
342
  export class GeoLocation { ... }
344
343
  ```
345
344
 
@@ -352,7 +351,6 @@ export class GeoLocation { ... }
352
351
  import { Float } from "@akanjs/base";
353
352
  import { Field, Model } from "@akanjs/constant";
354
353
 
355
- @Model.Scalar("Amount")
356
354
  export class Amount {
357
355
  @Field.Prop(() => Float, { min: 0, default: 0 })
358
356
  value: number;
@@ -373,7 +371,6 @@ import { Field, Model } from "@akanjs/constant";
373
371
  export const AccuracyLevel = enumOf(["low", "medium", "high"] as const);
374
372
  export type AccuracyLevel = enumOf<typeof AccuracyLevel>;
375
373
 
376
- @Model.Scalar("GeoLocation")
377
374
  export class GeoLocation {
378
375
  @Field.Prop(() => Float, {
379
376
  min: -90,
@@ -418,7 +415,6 @@ import { Int, Float } from "@akanjs/base";
418
415
  import { Field, Model } from "@akanjs/constant";
419
416
  import { Dimension } from "../dimension/dimension.constant";
420
417
 
421
- @Model.Scalar("ProductSpec")
422
418
  export class ProductSpec {
423
419
  @Field.Prop(() => String)
424
420
  sku: string;
@@ -450,7 +446,6 @@ export class ProductSpec {
450
446
  import { Float } from "@akanjs/base";
451
447
  import { Field, Model } from "@akanjs/constant";
452
448
 
453
- @Model.Scalar("Coordinate")
454
449
  export class Coordinate {
455
450
  @Field.Prop(() => [Float], { default: [0, 0], example: [127.114367, 37.497114] })
456
451
  coordinates: number[];
@@ -477,7 +472,7 @@ export class Coordinate {
477
472
  1. **Location**: `__scalar/<camelCase>/<camelCase>.constant.ts`
478
473
  2. **Structure**: Single `@Model.Scalar` class per file
479
474
  3. **Naming**: Class name = PascalCase directory name
480
- 4. **Decorator**: `@Model.Scalar("ClassName")` with exact class name match
475
+ 4. **Decorator**: `` with exact class name match
481
476
  5. **Enum Values**: Always camelCase (`active`, not `ACTIVE`)
482
477
  6. **Fields**: Use `@Field.Prop` with arrow function types
483
478
  7. **Arrays**: Wrap in `[]` (e.g., `[Int]`)
@@ -24,12 +24,11 @@ __export(model_constant_exports, {
24
24
  module.exports = __toCommonJS(model_constant_exports);
25
25
  function getContent(scanInfo, dict) {
26
26
  return `
27
- import { Field, Model } from "@akanjs/constant";
27
+ import { via } from "@akanjs/constant";
28
28
 
29
- @Model.Scalar("${dict.Model}")
30
- export class ${dict.Model} {
31
- @Field.Prop(() => String)
32
- field: string;
33
- }
29
+
30
+ export class ${dict.Model} extends via((field) => ({
31
+ field: field(String),
32
+ })) {}
34
33
  `;
35
34
  }
@@ -28,7 +28,7 @@ import { ModelDictionary } from "@akanjs/dictionary";
28
28
 
29
29
  import type { ${dict.Model} } from "./${dict.model}.constant";
30
30
 
31
- const modelDictionary = {
31
+ export const modelDictionary = {
32
32
  modelName: ["${dict.Model}", "${dict.Model}"],
33
33
  modelDesc: ["${dict.Model}", "${dict.Model}"],
34
34
 
@@ -43,7 +43,6 @@ export default function Layout({ children, params }: RootLayoutProps) {
43
43
  head={<link rel="icon" href="/favicon.ico" />}
44
44
  // className="bg-base-100"
45
45
  env={env}
46
- fetch={fetch}
47
46
  >
48
47
  {children}
49
48
  </System.Provider>
@@ -28,7 +28,9 @@ function getContent(scanInfo, dict) {
28
28
  content: `
29
29
  import { bootCsr } from "@akanjs/next";
30
30
 
31
- void bootCsr(import.meta.glob("./**/*.tsx"));
31
+ import { registerClient } from "../client";
32
+
33
+ void bootCsr(import.meta.glob("./**/*.tsx"), registerClient);
32
34
  `
33
35
  };
34
36
  }
@@ -29,7 +29,7 @@ import type { ${dict.AppName}Signal } from "./${dict.appName}.signal";
29
29
 
30
30
  const dictionary = {} as const;
31
31
 
32
- const signalDictionary = {} satisfies SignalDictionary<${dict.AppName}Signal>;
32
+ export const signalDictionary = {} satisfies SignalDictionary<${dict.AppName}Signal>;
33
33
 
34
34
  export const ${dict.appName}Dictionary = { ...dictionary, ...signalDictionary };
35
35
  `;
@@ -24,9 +24,8 @@ __export(appName_service_exports, {
24
24
  module.exports = __toCommonJS(appName_service_exports);
25
25
  function getContent(scanInfo, dict) {
26
26
  return `
27
- import { LogService, Service } from "@akanjs/service";
27
+ import { serve } from "@akanjs/service";
28
28
 
29
- @Service("${dict.appName}Service", { serverMode: "batch" })
30
- export class ${dict.AppName}Service extends LogService("${dict.appName}Service") {}
29
+ export class ${dict.AppName}Service extends serve("${dict.appName}" as const, { serverMode: "batch" }) {}
31
30
  `;
32
31
  }
@@ -24,11 +24,10 @@ __export(appName_signal_exports, {
24
24
  module.exports = __toCommonJS(appName_signal_exports);
25
25
  function getContent(scanInfo, dict) {
26
26
  return `
27
- import { LogSignal, Signal } from "@akanjs/signal";
27
+ import { signal } from "@akanjs/signal";
28
28
 
29
29
  import * as cnst from "../cnst";
30
30
 
31
- @Signal({ name: "${dict.AppName}" })
32
- export class ${dict.AppName}Signal extends LogSignal(cnst.Srvs) {}
31
+ export class ${dict.AppName}Signal extends signal("${dict.AppName}" as const, cnst.Srvs) {}
33
32
  `;
34
33
  }
@@ -24,10 +24,9 @@ __export(appName_store_exports, {
24
24
  module.exports = __toCommonJS(appName_store_exports);
25
25
  function getContent(scanInfo, dict) {
26
26
  return `
27
- import { scalarStateOf, Store } from "@akanjs/store";
27
+ import { store } from "@akanjs/store";
28
28
 
29
- @Store({ name: "${dict.appName}" })
30
- export class ${dict.AppName}Store extends scalarStateOf("${dict.appName}" as const, {
29
+ export class ${dict.AppName}Store extends store("${dict.appName}" as const, {
31
30
  // state
32
31
  }) {
33
32
  // action
@@ -36,10 +36,10 @@ function getContent(scanInfo, dict = {}) {
36
36
  ([_, fileTypes]) => fileTypes.has("template") || fileTypes.has("unit") || fileTypes.has("util") || fileTypes.has("view") || fileTypes.has("zone")
37
37
  ).map(([key]) => key);
38
38
  return `
39
- export { Revert, msg, usePage } from "./lib/usePage";
40
- export { st, store } from "./lib/st";
41
- export { fetch } from "./lib/sig";
42
- export * as cnst from "./lib/cnst"
39
+ export * as cnst from "./lib/cnst";
40
+ export { msg, Revert, usePage, fetch, sig, registerClient } from "./lib/useClient";
41
+ export { st, RootStore } from "./lib/st";
42
+ export * as store from "./lib/st";
43
43
  ${scalarModules.map((module2) => `export { ${capitalize(module2)} } from "./lib/__scalar/${module2}";`).join("\n")}
44
44
  ${serviceModules.map((module2) => `export { ${capitalize(module2)} } from "./lib/_${module2}";`).join("\n")}
45
45
  ${databaseModules.map((module2) => `export { ${capitalize(module2)} } from "./lib/${module2}";`).join("\n")}
@@ -48,7 +48,7 @@ export default function Page({ params }: PageProps) {
48
48
  <div className="container">
49
49
  <div className="flex justify-between m-4 mt-8">
50
50
  <div className="text-xl text-primary flex gap-2 items-center">
51
- {l("shared.updateModel", { model: l("${dict.model}.modelName") })}
51
+ {l("base.updateModel", { model: l("${dict.model}.modelName") })}
52
52
  </div>
53
53
  </div>
54
54
  <Load.Edit
@@ -63,7 +63,7 @@ export default function Page({ params }: PageProps) {
63
63
  <${dict.Model}.Zone.View view={${dict.model}View} />
64
64
  <Link href={\`/${dict.model}/\${${dict.model}.id}/edit\`}>
65
65
  <button className="btn">
66
- {l("shared.updateModel", { model: l("${dict.model}.modelName") })}
66
+ {l("base.updateModel", { model: l("${dict.model}.modelName") })}
67
67
  </button>
68
68
  </Link>
69
69
  </div>
@@ -43,7 +43,7 @@ export default function Page() {
43
43
  <div className="container">
44
44
  <div className="flex justify-between m-4 mt-8">
45
45
  <div className="text-xl text-primary flex gap-2 items-center">
46
- + {l("shared.createModel", { model: l("${dict.model}.modelName") })}
46
+ + {l("base.createModel", { model: l("${dict.model}.modelName") })}
47
47
  </div>
48
48
  </div>
49
49
  <Load.Edit
@@ -46,7 +46,7 @@ export default function Page() {
46
46
  <div className="animate-fadeIn px-4 pt-4 flex gap-4 items-center">
47
47
  <div className="font-bold text-lg md:text-4xl">${dict.Model}s</div>
48
48
  <Link href={\`/${dict.model}/new\`}>
49
- <button className="btn">+ {l("shared.createModel", { model: l("${dict.model}.modelName") })}</button>
49
+ <button className="btn">+ {l("base.createModel", { model: l("${dict.model}.modelName") })}</button>
50
50
  </Link>
51
51
  </div>
52
52
  <div>{l("${dict.model}.modelDesc")}</div>
@@ -25,6 +25,5 @@ module.exports = __toCommonJS(templates_exports);
25
25
  function getContent(scanInfo, dict = {}) {
26
26
  return `
27
27
  export * as cnst from "./lib/cnst";
28
- export { fetch } from "./lib/sig";
29
28
  `;
30
29
  }
@@ -50,7 +50,6 @@ ${Object.entries(extendedModels).map(([modelName, extendedModels2]) => {
50
50
  lights: [${extendedModels2.map((libName) => `${libName}.Light${ModelName}`).join(", ")}] as const,
51
51
  models: [${extendedModels2.map((libName) => `${libName}.${ModelName}`).join(", ")}] as const,
52
52
  insights: [${extendedModels2.map((libName) => `${libName}.${ModelName}Insight`).join(", ")}] as const,
53
- filters: [${extendedModels2.map((libName) => `${libName}.${ModelName}Filter`).join(", ")}] as const,
54
53
  }`;
55
54
  }).join("\n")}
56
55
 
@@ -37,13 +37,16 @@ function getContent(scanInfo, dict = {}) {
37
37
  ).filter(([_, libNames]) => libNames.length > 0)
38
38
  );
39
39
  return `
40
- ${libs.length === 0 ? `import { dictionary as base } from "@akanjs/dictionary";` : ""}
41
- ${libs.map((lib) => `import { dictionary as ${lib} } from "@${lib}/server";`).join("\n")}
40
+ ${libs.length === 0 ? `import * as base from "@akanjs/dictionary";` : ""}
41
+ ${libs.map((lib) => `import { dict as ${lib} } from "@${lib}/server";`).join("\n")}
42
42
 
43
43
  ${Object.entries(extendedModels).map(([modelName, extendedModels2]) => {
44
- return `export const ${modelName} = Object.assign({}, ${extendedModels2.map((libName) => `${libName}.${modelName}`).join(", ")});`;
44
+ return `export const ${modelName} = {
45
+ models: Object.assign({}, ${extendedModels2.map((libName) => `${libName}.${modelName}.modelDictionary`).join(", ")}),
46
+ signals: Object.assign({}, ${extendedModels2.map((libName) => `${libName}.${modelName}.signalDictionary`).join(", ")}),
47
+ };`;
45
48
  }).join("\n")}
46
49
 
47
- export const allLibs = [${libs.length === 0 ? "base" : libs.join(", ")}] as const;
50
+ export const allLibs = [${libs.length === 0 ? "base.dictionary" : libs.map((lib) => `${lib}.dictionary`).join(", ")}] as const;
48
51
  `;
49
52
  }
@@ -41,9 +41,10 @@ ${libs.map((lib) => `export { db as ${lib} } from "@${lib}/server";`).join("\n")
41
41
 
42
42
  ${Object.entries(extendedModels).map(
43
43
  ([modelName, extendedModels2]) => `export const ${modelName} = {
44
- inputs: [${extendedModels2.map((libName) => `${libName}.${modelName}Db.Input`).join(", ")}] as const,
45
- docs: [${extendedModels2.map((libName) => `${libName}.${modelName}Db.Doc`).join(", ")}] as const,
46
- models: [${extendedModels2.map((libName) => `${libName}.${modelName}Db.Model`).join(", ")}] as const,
44
+ inputs: [${extendedModels2.map((libName) => `${libName}.${modelName}.Input`).join(", ")}] as const,
45
+ docs: [${extendedModels2.map((libName) => `${libName}.${modelName}.Doc`).join(", ")}] as const,
46
+ models: [${extendedModels2.map((libName) => `${libName}.${modelName}.Model`).join(", ")}] as const,
47
+ filters: [${extendedModels2.map((libName) => `${libName}.${modelName}.Filter`).join(", ")}] as const,
47
48
  }`
48
49
  ).join("\n")}
49
50
  export const allLibs = [${libs.join(", ")}] as const;
@@ -37,7 +37,7 @@ function getContent(scanInfo, dict = {}) {
37
37
  ).filter(([_, libNames]) => libNames.length > 0)
38
38
  );
39
39
  return `
40
- ${libs.length ? `import { DbService, Srv } from "@akanjs/service";` : `import type { BackendEnv } from "@akanjs/base";`}
40
+ ${libs.length ? `import { serve, Srv } from "@akanjs/service";` : `import type { BackendEnv } from "@akanjs/base";`}
41
41
  ${libs.map((lib) => `import { option as ${lib}Option, srv as ${lib} } from "@${lib}/server";`).join("\n")}
42
42
 
43
43
  import * as db from "../db";
@@ -22,16 +22,35 @@ __export(lib_signal_exports, {
22
22
  default: () => getContent
23
23
  });
24
24
  module.exports = __toCommonJS(lib_signal_exports);
25
+ var capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1);
25
26
  function getContent(scanInfo, dict = {}) {
26
27
  if (!scanInfo)
27
28
  return null;
28
29
  const libs = scanInfo.getLibs();
29
30
  const rootLib = scanInfo.akanConfig.rootLib;
31
+ const libInfos = [...scanInfo.getLibInfos().values()];
32
+ const extendedModels = Object.fromEntries(
33
+ [...scanInfo.file.signal.databases].map(
34
+ (modelName) => [
35
+ modelName,
36
+ libInfos.filter((libInfo) => libInfo.file.signal.databases.has(modelName)).map((libInfo) => libInfo.name)
37
+ ]
38
+ ).filter(([_, libNames]) => libNames.length > 0)
39
+ );
30
40
  return `
31
- ${libs.length > 0 ? "" : `import { fetch as base } from "@akanjs/signal";`}
32
- ${libs.map((lib) => `import { fetch as ${lib} } from "@${lib}";`).join("\n")}
41
+ ${libs.length > 0 ? "" : `import { fetch as baseFetch } from "@akanjs/signal";`}
42
+ ${libs.map((lib) => `import { sig as ${lib} } from "@${lib}/server";`).join("\n")}
33
43
 
34
- export const root = ${libs.length ? rootLib ?? libs[0] : "base"};
35
- export const libFetches = [${libs.length ? libs.join(", ") : "base"}] as const;
44
+ ${Object.entries(extendedModels).map(([modelName, extendedModels2]) => {
45
+ const ModelName = capitalize(modelName);
46
+ return `export const ${modelName} = {
47
+ internals: [${extendedModels2.map((libName) => `${libName}.${ModelName}Internal`).join(", ")}] as const,
48
+ slices: [${extendedModels2.map((libName) => `${libName}.${ModelName}Slice`).join(", ")}] as const,
49
+ endpoints: [${extendedModels2.map((libName) => `${libName}.${ModelName}Endpoint`).join(", ")}] as const,
50
+ }`;
51
+ }).join("\n")}
52
+
53
+ export const root = ${libs.length ? rootLib ?? libs[0] : "baseFetch"};
54
+ export const libFetches = [${libs.length ? libs.map((lib) => `${lib}.fetch`).join(", ") : "baseFetch"}] as const;
36
55
  `;
37
56
  }
@@ -22,14 +22,31 @@ __export(lib_store_exports, {
22
22
  default: () => getContent
23
23
  });
24
24
  module.exports = __toCommonJS(lib_store_exports);
25
+ var capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1);
25
26
  function getContent(scanInfo, dict = {}) {
26
27
  if (!scanInfo)
27
28
  return null;
28
29
  const libs = scanInfo.getLibs();
30
+ const libInfos = [...scanInfo.getLibInfos().values()];
31
+ const extendedModels = Object.fromEntries(
32
+ [...scanInfo.file.store.databases].map(
33
+ (modelName) => [
34
+ modelName,
35
+ libInfos.filter((libInfo) => libInfo.file.store.databases.has(modelName)).map((libInfo) => libInfo.name)
36
+ ]
37
+ ).filter(([_, libNames]) => libNames.length > 0)
38
+ );
29
39
  return `
30
- import { store as base } from "@akanjs/store";
40
+ import * as base from "@akanjs/store";
31
41
  ${libs.map((lib) => `import { store as ${lib} } from "@${lib}/client";`).join("\n")}
32
42
 
33
- export const libStores = [${[...libs, "base"].join(", ")}] as const;
43
+ ${Object.entries(extendedModels).map(([modelName, extendedModels2]) => {
44
+ const ModelName = capitalize(modelName);
45
+ return `export const ${modelName} = {
46
+ stores: [${extendedModels2.map((libName) => `${libName}.${ModelName}Store`).join(", ")}] as const,
47
+ }`;
48
+ }).join("\n")}
49
+
50
+ export const libStores = [${[...libs, "base"].map((lib) => `${lib}.RootStore`).join(", ")}] as const;
34
51
  `;
35
52
  }
@@ -28,11 +28,19 @@ function getContent(scanInfo, dict = {}) {
28
28
  return null;
29
29
  const databaseModules = scanInfo.getDatabaseModules();
30
30
  const scalarModules = scanInfo.getScalarModules();
31
+ const libInfos = scanInfo.getLibInfos();
32
+ const extendedModelMap = new Map(
33
+ [...scanInfo.file.constant.databases].map(
34
+ (modelName) => [
35
+ modelName,
36
+ [...libInfos.values()].filter((libInfo) => libInfo.file.constant.databases.has(modelName)).map((libInfo) => libInfo.name)
37
+ ]
38
+ ).filter(([_, libNames]) => libNames.length > 0)
39
+ );
31
40
  return `
32
- import type { AllSrvs } from "./srv";
33
41
  import { cnstOf, scalarCnstOf } from "@akanjs/constant";
34
42
 
35
- ${databaseModules.map((module2) => `import * as ${module2} from "./${module2}/${module2}.constant";`).join("\n")}
43
+ ${databaseModules.map((module2) => `import * as ${module2}Cnst from "./${module2}/${module2}.constant";`).join("\n")}
36
44
  ${scalarModules.map((module2) => `import { ${capitalize(module2)} } from "./__scalar/${module2}/${module2}.constant";`).join("\n")}
37
45
 
38
46
  export * from "./__lib/lib.constant";
@@ -41,10 +49,8 @@ ${scalarModules.map((module2) => `export * from "./__scalar/${module2}/${module2
41
49
 
42
50
  ${databaseModules.map((module2) => {
43
51
  const names = { Module: capitalize(module2) };
44
- return `export const ${module2}Cnst = cnstOf("${module2}" as const, ${module2}.${names.Module}Input, ${module2}.${names.Module}, ${module2}.Light${names.Module}, ${module2}.${names.Module}Insight, ${module2}.${names.Module}Filter);`;
52
+ return `export const ${module2} = cnstOf("${module2}" as const, ${module2}Cnst.${names.Module}Input, ${module2}Cnst.${names.Module}, ${module2}Cnst.Light${names.Module}, ${module2}Cnst.${names.Module}Insight${extendedModelMap.has(module2) ? ", { overwrite: true }" : ""});`;
45
53
  }).join("\n")}
46
- ${scalarModules.map((module2) => `export const ${module2}Cnst = scalarCnstOf("${module2}" as const, ${capitalize(module2)});`).join("\n")}
47
-
48
- export const Srvs = {} as AllSrvs;
54
+ ${scalarModules.map((module2) => `export const ${module2} = scalarCnstOf("${module2}" as const, ${capitalize(module2)});`).join("\n")}
49
55
  `;
50
56
  }
@@ -22,25 +22,32 @@ __export(db_exports, {
22
22
  default: () => getContent
23
23
  });
24
24
  module.exports = __toCommonJS(db_exports);
25
+ var capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1);
25
26
  function getContent(scanInfo, dict = {}) {
26
27
  if (!scanInfo)
27
28
  return null;
28
29
  const databaseModules = scanInfo.getDatabaseModules();
29
30
  const scalarModules = scanInfo.getScalarModules();
30
31
  return `
31
- import { dbOf } from "@akanjs/document";
32
+ import { by, dbOf, scalarDbOf } from "@akanjs/document";
32
33
 
33
34
  import * as cnst from "./cnst";
34
35
 
35
- ${databaseModules.map((module2) => `import * as ${module2} from "./${module2}/${module2}.document";`).join("\n")}
36
+ ${databaseModules.map((module2) => `import * as ${module2}Db from "./${module2}/${module2}.document";`).join("\n")}
37
+ ${scalarModules.map((module2) => `import { ${capitalize(module2)} } from "./__scalar/${module2}/${module2}.document";`).join("\n")}
38
+
39
+ ${databaseModules.map((module2) => `class ${capitalize(module2)}Input extends by(cnst.${capitalize(module2)}Input) {}`).join("\n")}
40
+ export type { ${databaseModules.map((module2) => `${capitalize(module2)}Input`).join(", ")} };
36
41
 
37
42
  export type * from "./__lib/lib.document";
43
+
38
44
  ${databaseModules.map((module2) => `export type * from "./${module2}/${module2}.document";`).join("\n")}
39
45
  ${scalarModules.map((module2) => `export type * from "./__scalar/${module2}/${module2}.document";`).join("\n")}
40
46
 
41
47
  ${databaseModules.map((module2) => {
42
48
  const names = { Module: module2.charAt(0).toUpperCase() + module2.slice(1) };
43
- return `export const ${module2}Db = dbOf("${module2}" as const, ${module2}.${names.Module}Input, ${module2}.${names.Module}, ${module2}.${names.Module}Model, ${module2}.${names.Module}Middleware, cnst.${names.Module}, cnst.${names.Module}Insight, cnst.${names.Module}Filter);`;
49
+ return `export const ${module2} = dbOf("${module2}" as const, ${names.Module}Input, ${module2}Db.${names.Module}, ${module2}Db.${names.Module}Model, ${module2}Db.${names.Module}Middleware, cnst.${names.Module}, cnst.${names.Module}Insight, ${module2}Db.${names.Module}Filter);`;
44
50
  }).join("\n")}
51
+ ${scalarModules.map((module2) => `export const ${module2} = scalarDbOf("${module2}" as const, ${capitalize(module2)});`).join("\n")}
45
52
  `;
46
53
  }
@@ -32,12 +32,20 @@ function getContent(scanInfo, dict = {}) {
32
32
  import { makeDictionary, makeTrans } from "@akanjs/dictionary";
33
33
 
34
34
  import { allLibs } from "./__lib/lib.dictionary";
35
- ${databaseModules.map((module2) => `import { ${module2}Dictionary } from "./${module2}/${module2}.dictionary";`).join("\n")}
36
- ${serviceModules.map((module2) => `import { ${module2}Dictionary } from "./_${module2}/${module2}.dictionary";`).join("\n")}
37
- ${scalarModules.map((module2) => `import { ${module2}Dictionary } from "./__scalar/${module2}/${module2}.dictionary";`).join("\n")}
35
+ ${databaseModules.map((module2) => `import * as ${module2} from "./${module2}/${module2}.dictionary";`).join("\n")}
36
+ ${serviceModules.map((module2) => `import * as ${module2} from "./_${module2}/${module2}.dictionary";`).join("\n")}
37
+ ${scalarModules.map((module2) => `import * as ${module2} from "./__scalar/${module2}/${module2}.dictionary";`).join("\n")}
38
+
39
+ ${databaseModules.map((module2) => `export * as ${module2} from "./${module2}/${module2}.dictionary";`).join("\n")}
40
+ ${serviceModules.map((module2) => `export * as ${module2} from "./_${module2}/${module2}.dictionary";`).join("\n")}
41
+ ${scalarModules.map((module2) => `export * as ${module2} from "./__scalar/${module2}/${module2}.dictionary";`).join("\n")}
38
42
 
39
43
  export const dictionary = makeDictionary(...allLibs, {
40
- ${[...databaseModules, ...scalarModules, ...serviceModules].map((module2) => `${module2}: ${module2}Dictionary`).join(",\n ")}
44
+ ${[
45
+ ...databaseModules.map((module2) => `${module2}: { ...${module2}.modelDictionary, ...${module2}.signalDictionary }`),
46
+ ...scalarModules.map((module2) => `${module2}: ${module2}.dictionary`),
47
+ ...serviceModules.map((module2) => `${module2}: ${module2}.dictionary`)
48
+ ].join(",\n ")}
41
49
  } as const);
42
50
 
43
51
  export const { Revert, translate, msg } = makeTrans(dictionary);
@@ -30,24 +30,35 @@ function getContent(scanInfo, dict = {}) {
30
30
  const scalarConstantModules = [...scanInfo.scalar.entries()].filter(([_, files]) => files.has("constant")).map(([module2]) => module2);
31
31
  const serviceModules = [...scanInfo.service.entries()].filter(([_, files]) => files.has("signal")).map(([module2]) => module2);
32
32
  return `
33
- import { fetchOf, gqlOf, makeFetch, scalarUtilOf } from "@akanjs/signal";
33
+ import { fetchOf, gqlOf, makeFetch, mergeSignals, signalInfo } from "@akanjs/signal";
34
34
 
35
35
  import { root, libFetches } from "./__lib/lib.signal";
36
36
  import * as cnst from "./cnst";
37
+ import * as db from "./db";
37
38
 
38
- ${[...scanInfo.database.entries()].filter(([_, files]) => files.has("signal")).map(([module2]) => `import { ${capitalize(module2)}Signal } from "./${module2}/${module2}.signal";`).join("\n")}
39
- ${[...scanInfo.service.entries()].filter(([_, files]) => files.has("signal")).map(([module2]) => `import { ${capitalize(module2)}Signal } from "./_${module2}/${module2}.signal";`).join("\n")}
39
+ ${[...scanInfo.database.entries()].filter(([_, files]) => files.has("signal")).map(([module2]) => `import * as ${module2}Sig from "./${module2}/${module2}.signal";`).join("\n")}
40
+ ${[...scanInfo.service.entries()].filter(([_, files]) => files.has("signal")).map(([module2]) => `import * as ${module2}Sig from "./_${module2}/${module2}.signal";`).join("\n")}
40
41
 
41
- ${[...scanInfo.database.entries()].filter(([_, files]) => files.has("signal")).map(([module2]) => `export { ${capitalize(module2)}Signal } from "./${module2}/${module2}.signal";`).join("\n")}
42
- ${[...scanInfo.service.entries()].filter(([_, files]) => files.has("signal")).map(([module2]) => `export { ${capitalize(module2)}Signal } from "./_${module2}/${module2}.signal";`).join("\n")}
42
+ ${[...scanInfo.database.entries()].filter(([_, files]) => files.has("signal")).map(([module2]) => `export * from "./${module2}/${module2}.signal";`).join("\n")}
43
+ ${[...scanInfo.service.entries()].filter(([_, files]) => files.has("signal")).map(([module2]) => `export * from "./_${module2}/${module2}.signal";`).join("\n")}
43
44
 
44
- ${databaseModules.map((module2) => `${["user", "setting", "summary"].includes(module2) ? "export " : ""}const ${module2}Gql = gqlOf(cnst.${module2}Cnst, ${capitalize(module2)}Signal${scanInfo.name !== "shared" && ["user", "setting", "summary"].includes(module2) ? `, { overwrite: root.${module2}Gql }` : ""});`).join("\n")}
45
+ ${[...scanInfo.database.entries()].filter(([_, files]) => files.has("signal")).map(
46
+ ([module2]) => `export class ${capitalize(module2)}Signal extends mergeSignals(${module2}Sig.${capitalize(module2)}Endpoint, ${module2}Sig.${capitalize(module2)}Internal, ${module2}Sig.${capitalize(module2)}Slice) {}`
47
+ ).join("\n")}
48
+ ${[...scanInfo.service.entries()].filter(([_, files]) => files.has("signal")).map(
49
+ ([module2]) => `export const ${capitalize(module2)}Signal = mergeSignals(${module2}Sig.${capitalize(module2)}Endpoint, ${module2}Sig.${capitalize(module2)}Internal);`
50
+ ).join("\n")}
51
+
52
+ const signals = signalInfo.registerSignals(
53
+ ${[...databaseModules, ...serviceModules].map((module2) => ` ${capitalize(module2)}Signal,`).join("\n")}
54
+ );
55
+ export const serializedSignals = signals.map((signal) => signalInfo.serialize(signal));
56
+
57
+ ${databaseModules.map((module2) => `export const ${module2} = gqlOf(cnst.${module2}, db.${module2}.Filter, ${capitalize(module2)}Signal${scanInfo.name !== "shared" && ["user", "setting", "summary"].includes(module2) ? `, { overwrite: root.${module2} }` : ""});`).join("\n")}
45
58
 
46
59
  export const fetch = makeFetch(...libFetches, {
47
- ${databaseModules.map((module2) => `...${module2}Gql,`).join("\n")}
48
- ${scalarConstantModules.map((module2) => `...scalarUtilOf(cnst.${module2}Cnst),`).join("\n")}
60
+ ${databaseModules.map((module2) => `...${module2},`).join("\n")}
49
61
  ${serviceModules.map((module2) => `...fetchOf(${capitalize(module2)}Signal),`).join("\n")}
50
- ${databaseModules.map((module2) => `${module2}Gql,`).join("\n")}
51
62
  });
52
63
  `;
53
64
  }
@@ -29,8 +29,9 @@ function getContent(scanInfo, dict = {}) {
29
29
  const databaseModules = [...scanInfo.database.entries()].filter(([_, files]) => files.has("service")).map(([module2]) => module2);
30
30
  const serviceModules = [...scanInfo.service.entries()].filter(([_, files]) => files.has("service")).map(([module2]) => module2);
31
31
  return `
32
- import { GetServices } from "@akanjs/service";
32
+ import { GetServices, ServiceModule, serviceInfo } from "@akanjs/service";
33
33
 
34
+ import * as cnst from "./cnst";
34
35
  import { libAllSrvs } from "./__lib/lib.service";
35
36
  ${databaseModules.map((module2) => `import { ${capitalize(module2)}Service } from "./${module2}/${module2}.service";`).join("\n")}
36
37
  ${serviceModules.map((module2) => `import { ${capitalize(module2)}Service } from "./_${module2}/${module2}.service";`).join("\n")}
@@ -39,11 +40,11 @@ export * from "./__lib/lib.service";
39
40
  ${databaseModules.map((module2) => `export { ${capitalize(module2)}Service } from "./${module2}/${module2}.service";`).join("\n")}
40
41
  ${serviceModules.map((module2) => `export { ${capitalize(module2)}Service } from "./_${module2}/${module2}.service";`).join("\n")}
41
42
 
42
- export const allSrvs = {
43
- ...libAllSrvs,
43
+ export const srvs = serviceInfo.registerServices({
44
44
  ${[...databaseModules, ...serviceModules].map((module2) => `${capitalize(module2)}Service`).join(",\n ")}
45
- } as const;
46
-
47
- export type AllSrvs = GetServices<typeof allSrvs>;
45
+ });
46
+ export const allSrvs = { ...libAllSrvs, ...srvs } as const;
47
+ ${databaseModules.map((module2) => `export const ${module2} = new ServiceModule("${module2}" as const, { ${capitalize(module2)}Service }, cnst.${module2});`).join("\n")}
48
+ ${serviceModules.map((module2) => `export const ${module2} = new ServiceModule("${module2}" as const, { ${capitalize(module2)}Service });`).join("\n")}
48
49
  `;
49
50
  }