nesoi 3.0.0 → 3.0.3

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 (185) hide show
  1. package/README.md +10 -0
  2. package/lib/adapters/postgres/src/migrator/bucket.d.ts +20 -0
  3. package/lib/adapters/postgres/src/migrator/bucket.js +184 -0
  4. package/lib/adapters/postgres/src/migrator/csv.d.ts +7 -0
  5. package/lib/adapters/postgres/src/migrator/csv.js +72 -0
  6. package/lib/adapters/postgres/src/migrator/migration.d.ts +2 -18
  7. package/lib/adapters/postgres/src/migrator/migration.js +10 -158
  8. package/lib/adapters/postgres/src/migrator/migrator.js +8 -5
  9. package/lib/adapters/postgres/src/migrator/runner.d.ts +16 -6
  10. package/lib/adapters/postgres/src/migrator/runner.js +103 -34
  11. package/lib/adapters/postgres/src/postgres.bucket_adapter.d.ts +19 -22
  12. package/lib/adapters/postgres/src/postgres.bucket_adapter.js +116 -100
  13. package/lib/adapters/postgres/src/postgres.cli.d.ts +23 -3
  14. package/lib/adapters/postgres/src/postgres.cli.js +70 -10
  15. package/lib/adapters/postgres/src/postgres.config.d.ts +5 -0
  16. package/lib/adapters/postgres/src/postgres.config.js +2 -0
  17. package/lib/adapters/postgres/src/postgres.nql.d.ts +7 -3
  18. package/lib/adapters/postgres/src/postgres.nql.js +86 -32
  19. package/lib/adapters/postgres/src/postgres.provider.d.ts +18 -0
  20. package/lib/adapters/postgres/src/postgres.provider.js +77 -0
  21. package/lib/adapters/postgres/test/postgres.bucket_adapter.test.js +76 -39
  22. package/lib/compiler/apps/monolyth/monolyth_compiler.d.ts +3 -0
  23. package/lib/compiler/apps/monolyth/monolyth_compiler.js +24 -0
  24. package/lib/compiler/apps/monolyth/stages/2_build_typescript_stage.js +2 -1
  25. package/lib/compiler/apps/monolyth/stages/5_dump_cli_stage.js +1 -1
  26. package/lib/compiler/elements/bucket.element.js +26 -11
  27. package/lib/compiler/elements/constants.element.js +1 -1
  28. package/lib/compiler/elements/element.d.ts +2 -0
  29. package/lib/compiler/elements/message.element.js +4 -4
  30. package/lib/compiler/helpers/dump_helpers.js +5 -2
  31. package/lib/compiler/stages/7_dump_stage.js +2 -0
  32. package/lib/compiler/treeshake.js +9 -37
  33. package/lib/compiler/typescript/bridge/extract.js +12 -0
  34. package/lib/compiler/typescript/bridge/inject.js +3 -0
  35. package/lib/compiler/typescript/bridge/organize.js +3 -3
  36. package/lib/elements/blocks/block.builder.js +4 -2
  37. package/lib/elements/blocks/job/internal/resource_job.builder.d.ts +22 -20
  38. package/lib/elements/blocks/job/internal/resource_job.d.ts +2 -1
  39. package/lib/elements/blocks/job/internal/resource_job.js +17 -4
  40. package/lib/elements/blocks/job/job.js +3 -0
  41. package/lib/elements/blocks/job/job.types.d.ts +7 -0
  42. package/lib/elements/blocks/job/job.types.js +2 -0
  43. package/lib/elements/blocks/machine/machine.js +3 -2
  44. package/lib/elements/blocks/resource/resource.builder.js +2 -4
  45. package/lib/elements/blocks/resource/resource.d.ts +5 -3
  46. package/lib/elements/blocks/resource/resource.js +26 -17
  47. package/lib/elements/edge/controller/adapters/controller_adapter.d.ts +2 -1
  48. package/lib/elements/edge/controller/adapters/controller_adapter.js +11 -2
  49. package/lib/elements/edge/controller/controller.builder.d.ts +4 -5
  50. package/lib/elements/edge/controller/controller.builder.js +7 -7
  51. package/lib/elements/edge/controller/controller.d.ts +2 -1
  52. package/lib/elements/edge/controller/controller.js +8 -6
  53. package/lib/elements/entities/bucket/adapters/bucket_adapter.d.ts +61 -23
  54. package/lib/elements/entities/bucket/adapters/bucket_adapter.js +22 -13
  55. package/lib/elements/entities/bucket/adapters/memory.bucket_adapter.d.ts +21 -22
  56. package/lib/elements/entities/bucket/adapters/memory.bucket_adapter.js +68 -2
  57. package/lib/elements/entities/bucket/adapters/memory.nql.d.ts +10 -6
  58. package/lib/elements/entities/bucket/adapters/memory.nql.js +38 -3
  59. package/lib/elements/entities/bucket/adapters/slow_memory.bucket_adapter.d.ts +0 -20
  60. package/lib/elements/entities/bucket/adapters/slow_memory.bucket_adapter.js +46 -30
  61. package/lib/elements/entities/bucket/bucket.builder.d.ts +8 -2
  62. package/lib/elements/entities/bucket/bucket.builder.js +13 -19
  63. package/lib/elements/entities/bucket/bucket.config.d.ts +5 -1
  64. package/lib/elements/entities/bucket/bucket.d.ts +180 -19
  65. package/lib/elements/entities/bucket/bucket.js +658 -48
  66. package/lib/elements/entities/bucket/bucket.schema.d.ts +7 -1
  67. package/lib/elements/entities/bucket/bucket.schema.js +2 -1
  68. package/lib/elements/entities/bucket/bucket.types.d.ts +2 -7
  69. package/lib/elements/entities/bucket/cache/bucket_cache.d.ts +6 -2
  70. package/lib/elements/entities/bucket/cache/bucket_cache.js +12 -12
  71. package/lib/elements/entities/bucket/graph/bucket_graph.d.ts +32 -5
  72. package/lib/elements/entities/bucket/graph/bucket_graph.js +80 -111
  73. package/lib/elements/entities/bucket/graph/bucket_graph.schema.d.ts +3 -6
  74. package/lib/elements/entities/bucket/graph/bucket_graph.schema.js +1 -4
  75. package/lib/elements/entities/bucket/graph/bucket_graph_link.builder.d.ts +3 -7
  76. package/lib/elements/entities/bucket/graph/bucket_graph_link.builder.js +6 -2
  77. package/lib/elements/entities/bucket/model/bucket_model.builder.js +1 -1
  78. package/lib/elements/entities/bucket/model/bucket_model.convert.js +3 -3
  79. package/lib/elements/entities/bucket/model/bucket_model.schema.d.ts +37 -8
  80. package/lib/elements/entities/bucket/model/bucket_model.schema.js +25 -4
  81. package/lib/elements/entities/bucket/model/bucket_model_field.builder.d.ts +33 -14
  82. package/lib/elements/entities/bucket/model/bucket_model_field.builder.js +56 -13
  83. package/lib/elements/entities/bucket/query/nql.schema.d.ts +1 -0
  84. package/lib/elements/entities/bucket/query/nql_compiler.js +13 -2
  85. package/lib/elements/entities/bucket/query/nql_engine.d.ts +11 -4
  86. package/lib/elements/entities/bucket/query/nql_engine.js +20 -11
  87. package/lib/elements/entities/bucket/view/bucket_view.js +63 -35
  88. package/lib/elements/entities/bucket/view/bucket_view.schema.d.ts +5 -2
  89. package/lib/elements/entities/bucket/view/bucket_view_field.builder.d.ts +6 -2
  90. package/lib/elements/entities/bucket/view/bucket_view_field.builder.js +21 -15
  91. package/lib/elements/entities/constants/constants.schema.d.ts +1 -1
  92. package/lib/elements/entities/drive/drive_adapter.d.ts +36 -0
  93. package/lib/elements/entities/drive/drive_adapter.js +10 -0
  94. package/lib/elements/entities/drive/local.drive_adapter.d.ts +8 -0
  95. package/lib/elements/entities/drive/local.drive_adapter.js +28 -0
  96. package/lib/elements/entities/message/message.schema.d.ts +1 -0
  97. package/lib/elements/entities/message/message.schema.js +33 -0
  98. package/lib/elements/entities/message/message_parser.d.ts +5 -1
  99. package/lib/elements/entities/message/message_parser.js +56 -35
  100. package/lib/elements/entities/message/template/message_template.schema.d.ts +10 -8
  101. package/lib/elements/entities/message/template/message_template_field.builder.d.ts +16 -6
  102. package/lib/elements/entities/message/template/message_template_field.builder.js +25 -0
  103. package/lib/elements/entities/message/template/message_template_parser.js +2 -1
  104. package/lib/engine/apps/app.config.d.ts +32 -11
  105. package/lib/engine/apps/app.config.js +12 -0
  106. package/lib/engine/apps/app.d.ts +2 -0
  107. package/lib/engine/apps/app.js +3 -0
  108. package/lib/engine/apps/inline.app.d.ts +5 -3
  109. package/lib/engine/apps/inline.app.js +27 -12
  110. package/lib/engine/apps/monolyth/monolyth.app.d.ts +4 -2
  111. package/lib/engine/apps/monolyth/monolyth.app.js +22 -10
  112. package/lib/engine/auth/authn.d.ts +5 -1
  113. package/lib/engine/auth/zero.authn_provider.d.ts +4 -2
  114. package/lib/engine/auth/zero.authn_provider.js +2 -2
  115. package/lib/engine/cli/cli.d.ts +3 -1
  116. package/lib/engine/cli/cli.js +22 -3
  117. package/lib/engine/cli/cli_adapter.d.ts +2 -1
  118. package/lib/engine/cli/cli_adapter.js +2 -1
  119. package/lib/engine/cli/cli_input.d.ts +19 -0
  120. package/lib/engine/cli/cli_input.js +207 -0
  121. package/lib/engine/cli/ui.d.ts +1 -1
  122. package/lib/engine/cli/ui.js +2 -2
  123. package/lib/engine/daemon.d.ts +3 -2
  124. package/lib/engine/daemon.js +14 -2
  125. package/lib/engine/data/date.js +2 -2
  126. package/lib/engine/data/datetime.d.ts +40 -4
  127. package/lib/engine/data/datetime.js +70 -11
  128. package/lib/engine/data/decimal.d.ts +1 -1
  129. package/lib/engine/data/decimal.js +3 -3
  130. package/lib/engine/data/error.d.ts +21 -4
  131. package/lib/engine/data/error.js +23 -7
  132. package/lib/engine/data/file.d.ts +23 -0
  133. package/lib/engine/data/file.js +53 -0
  134. package/lib/engine/data/json.d.ts +6 -0
  135. package/lib/engine/data/json.js +26 -0
  136. package/lib/engine/data/obj.d.ts +1 -1
  137. package/lib/engine/data/trash.d.ts +14 -0
  138. package/lib/engine/data/trash.js +2 -0
  139. package/lib/engine/data/tree.d.ts +7 -12
  140. package/lib/engine/data/tree.js +101 -49
  141. package/lib/engine/module.d.ts +2 -1
  142. package/lib/engine/module.js +2 -5
  143. package/lib/engine/space.d.ts +1 -0
  144. package/lib/engine/space.js +6 -0
  145. package/lib/engine/transaction/nodes/bucket.trx_node.d.ts +156 -24
  146. package/lib/engine/transaction/nodes/bucket.trx_node.js +297 -467
  147. package/lib/engine/transaction/nodes/bucket_query.trx_node.d.ts +4 -2
  148. package/lib/engine/transaction/nodes/bucket_query.trx_node.js +27 -15
  149. package/lib/engine/transaction/nodes/job.trx_node.d.ts +2 -1
  150. package/lib/engine/transaction/nodes/job.trx_node.js +6 -0
  151. package/lib/engine/transaction/trx.d.ts +5 -2
  152. package/lib/engine/transaction/trx.js +2 -2
  153. package/lib/engine/transaction/trx_engine.config.d.ts +1 -3
  154. package/lib/engine/transaction/trx_engine.d.ts +2 -2
  155. package/lib/engine/transaction/trx_engine.js +14 -11
  156. package/lib/engine/transaction/trx_node.d.ts +14 -4
  157. package/lib/engine/transaction/trx_node.js +50 -8
  158. package/lib/engine/tree.d.ts +1 -1
  159. package/lib/engine/util/crypto.d.ts +50 -0
  160. package/lib/engine/util/crypto.js +89 -0
  161. package/lib/engine/util/deep.d.ts +5 -0
  162. package/lib/engine/util/deep.js +46 -0
  163. package/lib/engine/util/dotenv.d.ts +2 -8
  164. package/lib/engine/util/dotenv.js +14 -36
  165. package/lib/engine/util/hash.d.ts +3 -0
  166. package/lib/engine/util/hash.js +23 -0
  167. package/lib/engine/util/log.js +1 -1
  168. package/lib/engine/util/mime.d.ts +10 -0
  169. package/lib/engine/util/mime.js +389 -0
  170. package/lib/engine/util/parse.d.ts +6 -5
  171. package/lib/engine/util/parse.js +16 -15
  172. package/lib/engine/util/path.d.ts +3 -0
  173. package/lib/engine/util/path.js +92 -0
  174. package/lib/engine/util/rules.d.ts +4 -0
  175. package/lib/engine/util/rules.js +12 -0
  176. package/package.json +1 -1
  177. package/tools/compile.js +2 -2
  178. package/tools/dotenv.d.ts +1 -0
  179. package/tools/dotenv.js +4 -0
  180. package/tools/joaquin/job.d.ts +5 -5
  181. package/tools/joaquin/mock.d.ts +23 -2
  182. package/tools/joaquin/mock.js +127 -21
  183. package/tsconfig.build.tsbuildinfo +1 -1
  184. package/lib/adapters/postgres/test/postgres.bucket_query.test.d.ts +0 -0
  185. package/lib/adapters/postgres/test/postgres.bucket_query.test.js +0 -136
@@ -17,7 +17,7 @@ class BucketViewFieldFactory {
17
17
  model: {
18
18
  key: key
19
19
  }
20
- }, key, extra);
20
+ }, extra);
21
21
  }
22
22
  computed(fn) {
23
23
  return new BucketViewFieldBuilder('computed', {
@@ -32,14 +32,21 @@ class BucketViewFieldFactory {
32
32
  link: link,
33
33
  view: view
34
34
  }
35
- }, link);
35
+ });
36
+ }
37
+ drive(path) {
38
+ return new BucketViewFieldBuilder('drive', {
39
+ drive: {
40
+ path: path,
41
+ }
42
+ });
36
43
  }
37
44
  view(view) {
38
45
  return new BucketViewFieldBuilder('view', {
39
46
  view: {
40
47
  view: view
41
48
  }
42
- }, view);
49
+ });
43
50
  }
44
51
  extend(view, fields) {
45
52
  return {
@@ -56,10 +63,9 @@ exports.BucketViewFieldFactory = BucketViewFieldFactory;
56
63
  Builder
57
64
  */
58
65
  class BucketViewFieldBuilder {
59
- constructor(scope, value, refKey, extra) {
66
+ constructor(scope, value, extra) {
60
67
  this.scope = scope;
61
68
  this.value = value;
62
- this.refKey = refKey;
63
69
  this.extra = extra;
64
70
  this.type = 'unknown';
65
71
  this.type = 'unknown';
@@ -71,18 +77,18 @@ class BucketViewFieldBuilder {
71
77
  let required = true;
72
78
  let children = undefined;
73
79
  if (builder.scope === 'model') {
74
- const modelField = bucket_model_schema_1.$BucketModel.get(model, builder.refKey);
80
+ const modelField = bucket_model_schema_1.$BucketModel.get(model, builder.value.model.key);
75
81
  if (!modelField) {
76
- throw error_1.NesoiError.Builder.Bucket.UnknownModelField(builder.refKey);
82
+ throw error_1.NesoiError.Builder.Bucket.UnknownModelField(builder.value.model.key);
77
83
  }
78
84
  type = modelField.type;
79
- array = builder.refKey?.includes('.*') || modelField.array;
85
+ array = builder.value.model.key.includes('.#') || modelField.array;
80
86
  required = modelField.required;
81
- if (modelField._enum) {
82
- builder.value.model.enumOptions = modelField._enum.options;
87
+ if (modelField.meta?.enum) {
88
+ builder.value.model.enumOptions = modelField.meta.enum.options;
83
89
  }
84
90
  if (modelField.children) {
85
- const path = builder.refKey + ((modelField.array || modelField.type === 'dict') ? '.*' : '');
91
+ const path = builder.value.model.key + ((modelField.array || modelField.type === 'dict') ? '.#' : '');
86
92
  const fromModel = (0, bucket_model_convert_1.convertToView)(model, '', modelField.children, path).fields;
87
93
  children = Object.assign({}, fromModel);
88
94
  }
@@ -92,16 +98,16 @@ class BucketViewFieldBuilder {
92
98
  }
93
99
  }
94
100
  else if (builder.scope === 'graph') {
95
- const graphLink = builder.refKey ? graph.links[builder.refKey] : undefined;
101
+ const graphLink = builder.value.graph.link ? graph.links[builder.value.graph.link] : undefined;
96
102
  if (!graphLink) {
97
- throw error_1.NesoiError.Builder.Bucket.UnknownGraphLink(builder.refKey || '');
103
+ throw error_1.NesoiError.Builder.Bucket.UnknownGraphLink(builder.value.graph.link || '');
98
104
  }
99
105
  array = graphLink.many;
100
106
  }
101
107
  else if (builder.scope === 'view') {
102
- const view = builder.refKey ? views[builder.refKey] : undefined;
108
+ const view = builder.value.view?.view ? views[builder.value.view?.view] : undefined;
103
109
  if (!view) {
104
- throw error_1.NesoiError.Builder.Bucket.UnknownViewName(builder.refKey || '');
110
+ throw error_1.NesoiError.Builder.Bucket.UnknownViewName(builder.value.view?.view || '');
105
111
  }
106
112
  type = 'obj';
107
113
  array = false;
@@ -36,7 +36,7 @@ export declare class $Constants {
36
36
  type CompatibleMessageKey<Data, Subs extends string> = {
37
37
  [K in keyof Data]: Data[K] extends Subs ? K : never;
38
38
  }[keyof Data];
39
- type ParseMessageEnumpath<Message extends $Message, Path extends string, Subs extends string> = Path extends `${infer X}.*` ? `${X}.{${CompatibleMessageKey<Message['#parsed'], Subs> & string}}` : Path;
39
+ type ParseMessageEnumpath<Message extends $Message, Path extends string, Subs extends string> = Path extends `${infer X}.#` ? `${X}.{${CompatibleMessageKey<Message['#parsed'], Subs> & string}}` : Path;
40
40
  export type MessageEnumpath<Module extends $Module, Message extends $Message, Modules extends Record<string, $Module>> = MergeUnion<{
41
41
  [M in keyof Modules]: {
42
42
  [K in keyof Modules[M]['constants']['#enumpath'] as M extends Module['name'] ? ParseMessageEnumpath<Message, K & string, Modules[M]['constants']['#enumpath'][K]['_subs']> : `${M & string}::${ParseMessageEnumpath<Message, K & string, Modules[M]['constants']['#enumpath'][K]['_subs']>}`]: Modules[M]['constants']['#enumpath'][K]['_enum'];
@@ -0,0 +1,36 @@
1
+ import { NesoiFile } from "../../../engine/data/file";
2
+ export type DriveAdapterConfig = {
3
+ hashAlgorithm?: 'sha1' | 'md5' | 'sha256';
4
+ maxsize?: number;
5
+ };
6
+ export declare abstract class DriveAdapter {
7
+ dirpath: string;
8
+ config: DriveAdapterConfig;
9
+ constructor(dirpath: string, config?: DriveAdapterConfig);
10
+ /**
11
+ * Return a public reference to the file as a string, which
12
+ * can be used outside the application to reach it.
13
+ *
14
+ * @returns A `string` which publicly refers to the file
15
+ */
16
+ abstract public(remoteFile: NesoiFile[]): Promise<string[]>;
17
+ /**
18
+ * Read one file from the Drive, given a NesoiFile specifier.
19
+ *
20
+ * @returns The file contents as a Buffer
21
+ */
22
+ abstract read(remoteFile: NesoiFile): Promise<Buffer>;
23
+ /**
24
+ * Create a new file on the Drive, from the contents.
25
+ *
26
+ * @returns A new `NesoiFile` which refers to the Drive
27
+ */
28
+ abstract new(filepath: string, data: string | NodeJS.ArrayBufferView): Promise<NesoiFile>;
29
+ /**
30
+ * Copy a local file to the Drive
31
+ * - Fails if a file with the same name exists on the target dirpath of the Drive
32
+ *
33
+ * @returns A new `NesoiFile` which refers to the Drive
34
+ */
35
+ abstract copy(localFile: NesoiFile, dirpath: string, newFilename?: string): Promise<NesoiFile>;
36
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DriveAdapter = void 0;
4
+ class DriveAdapter {
5
+ constructor(dirpath, config = {}) {
6
+ this.dirpath = dirpath;
7
+ this.config = config;
8
+ }
9
+ }
10
+ exports.DriveAdapter = DriveAdapter;
@@ -0,0 +1,8 @@
1
+ import { NesoiFile } from "../../../engine/data/file";
2
+ import { DriveAdapter } from './drive_adapter';
3
+ export declare class LocalDriveAdapter extends DriveAdapter {
4
+ public(remoteFiles: NesoiFile[]): Promise<string[]>;
5
+ read(remoteFile: NesoiFile): Promise<Buffer>;
6
+ new(filepath: string, data: string | NodeJS.ArrayBufferView): Promise<NesoiFile>;
7
+ copy(localFile: NesoiFile, dirpath: string): Promise<NesoiFile>;
8
+ }
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LocalDriveAdapter = void 0;
7
+ const file_1 = require("../../../engine/data/file");
8
+ const drive_adapter_1 = require("./drive_adapter");
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ class LocalDriveAdapter extends drive_adapter_1.DriveAdapter {
12
+ public(remoteFiles) {
13
+ return Promise.resolve(remoteFiles.map(file => path_1.default.join(process.cwd(), file.filepath)));
14
+ }
15
+ read(remoteFile) {
16
+ return Promise.resolve(fs_1.default.readFileSync(remoteFile.filepath));
17
+ }
18
+ async new(filepath, data) {
19
+ fs_1.default.writeFileSync(filepath, data);
20
+ return new file_1.NesoiFile(filepath);
21
+ }
22
+ async copy(localFile, dirpath) {
23
+ const remoteFilepath = path_1.default.join(dirpath, localFile.newFilename);
24
+ fs_1.default.copyFileSync(localFile.filepath, remoteFilepath);
25
+ return new file_1.NesoiFile(remoteFilepath, { originalFilename: localFile.originalFilename });
26
+ }
27
+ }
28
+ exports.LocalDriveAdapter = LocalDriveAdapter;
@@ -12,4 +12,5 @@ export declare class $Message {
12
12
  $: unknown;
13
13
  };
14
14
  constructor(module: string, name: string, alias: string, template: $MessageTemplate);
15
+ static describe(schema: $Message): string;
15
16
  }
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.$Message = void 0;
4
+ const string_1 = require("../../../engine/util/string");
4
5
  class $Message {
5
6
  constructor(module, name, alias, template) {
6
7
  this.module = module;
@@ -9,5 +10,37 @@ class $Message {
9
10
  this.template = template;
10
11
  this.$t = 'message';
11
12
  }
13
+ static describe(schema) {
14
+ let str = '';
15
+ str += `◆ ${schema.module}::message:${(0, string_1.colored)(schema.name, 'lightblue')}\n`;
16
+ str += ` "${schema.alias}"\n\n`;
17
+ const fields = (_fields, d = 0) => {
18
+ for (const key in _fields) {
19
+ const field = _fields[key];
20
+ str += `${' '.repeat(d)}- ${(0, string_1.colored)(key, 'green')}${field.required ? '' : '?'}: ${field.type}`;
21
+ if (field.type === 'id') {
22
+ str += `(${field.meta.id.bucket.refName})`;
23
+ }
24
+ if (field.type === 'enum') {
25
+ const options = field.meta.enum.options;
26
+ if (typeof options === 'object') {
27
+ str += `(${Object.keys(options)})`;
28
+ }
29
+ else {
30
+ str += `(${options})`;
31
+ }
32
+ }
33
+ if (field.array) {
34
+ str += '[]';
35
+ }
36
+ str += '\n';
37
+ if (field.children) {
38
+ fields(field.children, d + 1);
39
+ }
40
+ }
41
+ };
42
+ fields(schema.template.fields);
43
+ return str;
44
+ }
12
45
  }
13
46
  exports.$Message = $Message;
@@ -8,5 +8,9 @@ export declare class MessageParser<$ extends $Message> {
8
8
  static parseWithTrxModule(trx: AnyTrxNode, raw: RawMessageInput<any, any>, sigKey?: string): Promise<any>;
9
9
  parse(trx: AnyTrxNode, raw: $['#raw'], sigKey?: string): Promise<Message<$>>;
10
10
  private sanitize;
11
- private isEmpty;
11
+ /**
12
+ * Empty values: `{}`, `[]`, `''`, `null`, `undefined`
13
+ */
14
+ static isEmpty(value: any): boolean;
12
15
  }
16
+ export type AnyMessageParser = MessageParser<$Message>;
@@ -45,47 +45,63 @@ class MessageParser {
45
45
  // 1. Sanitize input
46
46
  this.sanitize(value);
47
47
  // 2. Check for required fields
48
- if (this.isEmpty(value)) {
48
+ let parsedValue;
49
+ if (MessageParser.isEmpty(value)) {
49
50
  if (field.required) {
50
- throw error_1.NesoiError.Message.FieldIsRequired({ field: field.alias, path: field.path, value });
51
+ const pathWithSuffix = field.type === 'id' ? `${field.path}_id` : field.path;
52
+ throw error_1.NesoiError.Message.FieldIsRequired({ field: field.alias, path: pathWithSuffix, value });
51
53
  }
52
54
  else if (field.defaultValue !== undefined) {
53
- value = field.defaultValue;
55
+ parsedValue = { '': field.defaultValue };
54
56
  }
55
57
  else {
56
- return { '': undefined };
58
+ parsedValue = { '': undefined };
57
59
  }
58
60
  }
59
- if (field.array) {
60
- if (!Array.isArray(value)) {
61
- throw error_1.NesoiError.Message.InvalidFieldType({ field: field.alias, value, type: 'list' });
61
+ else {
62
+ if (field.array) {
63
+ if (!Array.isArray(value)) {
64
+ throw error_1.NesoiError.Message.InvalidFieldType({ field: field.alias, value, type: 'list' });
65
+ }
62
66
  }
63
- }
64
- // 3. Run parse method
65
- let parsedValue;
66
- try {
67
- parsedValue = await (0, message_template_parser_1.MessageTemplateFieldParser)(raw, trx, field, value, parseFields);
68
- }
69
- catch (e) {
70
- if (field.or) {
71
- return parseField(trx, field.or, value);
67
+ // 3. Run parse method
68
+ try {
69
+ parsedValue = await (0, message_template_parser_1.MessageTemplateFieldParser)(raw, trx, field, value, parseFields);
70
+ }
71
+ catch (e) {
72
+ // If this error was not triggered by a nested field,
73
+ // and we have another option, we try that option.
74
+ if (field.or && !e.__msg_deep_error) {
75
+ return parseField(trx, field.or, value);
76
+ }
77
+ e.__msg_deep_error = true;
78
+ throw e;
72
79
  }
73
- throw e;
74
80
  }
75
- // 4. Apply rules
76
- for (const r in field.rules) {
77
- const rule = field.rules[r];
78
- const res = await rule({ field, value: parsedValue, raw });
79
- if (typeof res === 'object') {
80
- parsedValue = res.set;
81
+ return parsedValue;
82
+ };
83
+ const applyRules = async (fields, parsed, parsedValue = parsed) => {
84
+ for (const f in fields) {
85
+ const field = fields[f];
86
+ for (const r in field.rules) {
87
+ const rule = field.rules[r];
88
+ const value = parsedValue?.[field.name];
89
+ const res = await rule({ field, value, msg: parsed });
90
+ if (typeof res === 'object') {
91
+ parsedValue ?? (parsedValue = {});
92
+ parsedValue[field.name] = res.set;
93
+ }
94
+ else if (res !== true) {
95
+ throw error_1.NesoiError.Message.RuleFailed(rule, res);
96
+ }
81
97
  }
82
- else if (res !== true) {
83
- throw error_1.NesoiError.Message.RuleFailed(rule, res);
98
+ if (field.children) {
99
+ await applyRules(field.children, parsed, parsedValue?.[field.name]);
84
100
  }
85
101
  }
86
- return parsedValue;
87
102
  };
88
103
  const parsed = await parseFields(trx, this.schema.template.fields, raw);
104
+ await applyRules(this.schema.template.fields, parsed);
89
105
  return message_1.Message.new(this.schema.name, parsed, sigKey);
90
106
  }
91
107
  sanitize(value) {
@@ -95,18 +111,23 @@ class MessageParser {
95
111
  });
96
112
  }
97
113
  }
98
- isEmpty(value) {
99
- // if (Array.isArray(value)) {
100
- // return value.length === 0
101
- // }
102
- // if (typeof value === 'object') {
103
- // return Object.keys(value).length === 0
104
- // }
114
+ /**
115
+ * Empty values: `{}`, `[]`, `''`, `null`, `undefined`
116
+ */
117
+ static isEmpty(value) {
118
+ if (value === null || value === undefined) {
119
+ return true;
120
+ }
121
+ if (Array.isArray(value)) {
122
+ return value.length === 0;
123
+ }
124
+ if (typeof value === 'object') {
125
+ return Object.keys(value).length === 0;
126
+ }
105
127
  if (typeof value === 'string') {
106
128
  return value.length === 0;
107
129
  }
108
- return value === null ||
109
- value === undefined;
130
+ return false;
110
131
  }
111
132
  }
112
133
  exports.MessageParser = MessageParser;
@@ -1,13 +1,14 @@
1
+ import { $Message } from "../../..";
1
2
  import { $BucketModelFieldType } from "../../bucket/model/bucket_model.schema";
2
3
  import { $Dependency } from "../../../../engine/dependency";
3
- export type $MessageTemplateRule<I, Raw> = (def: {
4
+ export type $MessageTemplateRule = (def: {
4
5
  field: $MessageTemplateField;
5
- value: I;
6
- raw: Raw;
6
+ value: any;
7
+ msg: $Message['#raw'];
7
8
  }) => {
8
- set: I;
9
+ set: any;
9
10
  } | true | string | Promise<{
10
- set: I;
11
+ set: any;
11
12
  } | true | string>;
12
13
  export type $MessageTemplateFieldMeta = {
13
14
  decimal?: {
@@ -19,11 +20,12 @@ export type $MessageTemplateFieldMeta = {
19
20
  dep?: $Dependency;
20
21
  };
21
22
  file?: {
22
- maxSize?: number;
23
+ maxsize?: number;
23
24
  extnames?: string[];
24
25
  };
25
26
  id?: {
26
27
  bucket: $Dependency;
28
+ type?: 'int' | 'string';
27
29
  view?: string;
28
30
  };
29
31
  msg?: $Dependency;
@@ -38,14 +40,14 @@ export declare class $MessageTemplateField {
38
40
  required: boolean;
39
41
  defaultValue: any;
40
42
  nullable: boolean;
41
- rules: $MessageTemplateRule<any, any>[];
43
+ rules: $MessageTemplateRule[];
42
44
  meta: $MessageTemplateFieldMeta;
43
45
  children?: $MessageTemplateFields | undefined;
44
46
  or?: $MessageTemplateField | undefined;
45
47
  '#raw': unknown;
46
48
  '#parsed': unknown;
47
49
  $t: string;
48
- constructor(type: $MessageTemplateFieldType, name: string, alias: string, path: string, array: boolean, required: boolean, defaultValue: any, nullable: boolean, rules: $MessageTemplateRule<any, any>[], meta: $MessageTemplateFieldMeta, children?: $MessageTemplateFields | undefined, or?: $MessageTemplateField | undefined);
50
+ constructor(type: $MessageTemplateFieldType, name: string, alias: string, path: string, array: boolean, required: boolean, defaultValue: any, nullable: boolean, rules: $MessageTemplateRule[], meta: $MessageTemplateFieldMeta, children?: $MessageTemplateFields | undefined, or?: $MessageTemplateField | undefined);
49
51
  }
50
52
  export type $MessageTemplateFields = {
51
53
  [x: string]: $MessageTemplateField;
@@ -1,13 +1,14 @@
1
1
  import { $Module, $Space, BucketName, ViewName } from "../../../../schema";
2
- import { $MessageTemplateField, $MessageTemplateFieldMeta, $MessageTemplateFieldType, $MessageTemplateFields, $MessageTemplateRule } from './message_template.schema';
2
+ import { $MessageTemplateField, $MessageTemplateFieldMeta, $MessageTemplateFieldType, $MessageTemplateFields } from './message_template.schema';
3
3
  import { $MessageInputInfer, $MessageOutputInfer, $MessageTemplateBuilderInfer } from '../message.infer';
4
4
  import { NesoiDate } from "../../../../engine/data/date";
5
5
  import { $Message } from '../message.schema';
6
6
  import { ModuleTree } from "../../../../engine/tree";
7
7
  import { NesoiObj } from "../../../../engine/data/obj";
8
8
  import { MessageEnumpath } from '../../constants/constants.schema';
9
- import { Decimal } from "../../../../engine/data/decimal";
9
+ import { NesoiDecimal } from "../../../../engine/data/decimal";
10
10
  import { NesoiDatetime } from "../../../../engine/data/datetime";
11
+ import { NesoiFile } from "../../../../engine/data/file";
11
12
  export declare class MessageTemplateFieldFactory<Space extends $Space, Module extends $Module, MsgName extends keyof Module['messages'], Message extends $Message = Module['messages'][MsgName]> {
12
13
  private module;
13
14
  private alias?;
@@ -36,7 +37,7 @@ export declare class MessageTemplateFieldFactory<Space extends $Space, Module ex
36
37
  decimal(config?: $MessageTemplateFieldMeta['decimal']): MessageTemplateFieldBuilder<Module, Message, {
37
38
  '': string;
38
39
  }, {
39
- '': Decimal;
40
+ '': NesoiDecimal;
40
41
  }, {}, [never, never], [never, never]>;
41
42
  enum<Enumpaths extends MessageEnumpath<Module, Module['messages'][MsgName], Space['modules']>, Options extends (keyof Enumpaths & string) | readonly string[] | Record<string, any>>(options: Options): MessageTemplateFieldBuilder<Module, Message, {
42
43
  '': (Options extends string ? keyof Enumpaths[Options & keyof Enumpaths]["options" & keyof Enumpaths[Options & keyof Enumpaths]] : Options extends (infer X)[] | readonly (infer X)[] ? X : keyof Options) & string;
@@ -44,9 +45,9 @@ export declare class MessageTemplateFieldFactory<Space extends $Space, Module ex
44
45
  '': (Options extends string ? keyof Enumpaths[Options & keyof Enumpaths]["options" & keyof Enumpaths[Options & keyof Enumpaths]] : Options extends (infer X)[] | readonly (infer X)[] ? X : keyof Options) & string;
45
46
  }, {}, [never, never], [never, never]>;
46
47
  file(config?: $MessageTemplateFieldMeta['file']): MessageTemplateFieldBuilder<Module, Message, {
47
- '': File;
48
+ '': NesoiFile;
48
49
  }, {
49
- '': File;
50
+ '': NesoiFile;
50
51
  }, {}, [never, never], [never, never]>;
51
52
  get float(): MessageTemplateFieldBuilder<Module, Message, {
52
53
  '': number;
@@ -213,7 +214,7 @@ Nullable extends [null | never, null | never] = [never, never]> {
213
214
  get optional(): MessageTemplateFieldBuilder<Module, Message, DefinedInput, DefinedOutput, Children, [undefined, undefined], Nullable>;
214
215
  default(value: DefinedInput[keyof DefinedInput] | Nullable[0]): MessageTemplateFieldBuilder<Module, Message, DefinedInput, DefinedOutput, Children, [undefined, never], Nullable>;
215
216
  get nullable(): MessageTemplateFieldBuilder<Module, Message, DefinedInput, DefinedOutput, Children, Optional, [null, null]>;
216
- rule(rule: $MessageTemplateRule<DefinedInput[keyof DefinedInput], Message['#raw']>): this;
217
+ rule(rule: MessageTemplateRuleDef<DefinedOutput[keyof DefinedOutput], Message['#raw']>): this;
217
218
  get array(): MessageTemplateFieldBuilder<Module, Message, { [K in keyof DefinedInput]: DefinedInput[K][]; }, { [K in keyof DefinedOutput]: DefinedOutput[K][]; }, Children, Optional, Nullable>;
218
219
  or<Def extends AnyMessageTemplateFieldBuilder>(def: Def): MessageTemplateFieldBuilder<Module, Message, { [K in keyof DefinedInput]: DefinedInput[K] | (Def extends MessageTemplateFieldBuilder<any, any, infer X, any, any, [never, never], [never, never]> ? X : never)[keyof (Def extends MessageTemplateFieldBuilder<any, any, infer X, any, any, [never, never], [never, never]> ? X : never)]; }, { [K in keyof DefinedOutput]: DefinedOutput[K] | (Def extends MessageTemplateFieldBuilder<any, any, any, infer X, any, [never, never], [never, never]> ? X : never)[keyof (Def extends MessageTemplateFieldBuilder<any, any, any, infer X, any, [never, never], [never, never]> ? X : never)]; }, Children, Optional, Nullable>;
219
220
  static build(builder: AnyMessageTemplateFieldBuilder, name: string, tree: ModuleTree, module: $Module, basePath: string): $MessageTemplateField;
@@ -223,3 +224,12 @@ export type MessageTemplateFieldBuilders = {
223
224
  [x: string]: AnyMessageTemplateFieldBuilder;
224
225
  };
225
226
  export type AnyMessageTemplateFieldBuilder = MessageTemplateFieldBuilder<any, any, any, any, any>;
227
+ export type MessageTemplateRuleDef<I, Msg> = (def: {
228
+ field: $MessageTemplateField;
229
+ value: I;
230
+ msg: Msg;
231
+ }) => {
232
+ set: I;
233
+ } | true | string | Promise<{
234
+ set: I;
235
+ } | true | string>;
@@ -64,6 +64,7 @@ class MessageTemplateFieldFactory {
64
64
  return new MessageTemplateFieldBuilder('obj', {}, this.alias, children);
65
65
  }
66
66
  dict(item) {
67
+ item = item.optional;
67
68
  return new MessageTemplateFieldBuilder('dict', {}, this.alias, { __dict: item });
68
69
  }
69
70
  msg(msg, extra) {
@@ -98,15 +99,26 @@ class MessageTemplateFieldBuilder {
98
99
  }
99
100
  get optional() {
100
101
  this._required = false;
102
+ if (this._or) {
103
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
104
+ this._or.optional;
105
+ }
101
106
  return this;
102
107
  }
103
108
  default(value) {
104
109
  this._required = false;
105
110
  this._defaultValue = value;
111
+ if (this._or) {
112
+ this._or.default(value);
113
+ }
106
114
  return this;
107
115
  }
108
116
  get nullable() {
109
117
  this._nullable = true;
118
+ if (this._or) {
119
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
120
+ this._or.nullable;
121
+ }
110
122
  return this;
111
123
  }
112
124
  rule(rule) {
@@ -115,10 +127,19 @@ class MessageTemplateFieldBuilder {
115
127
  }
116
128
  get array() {
117
129
  this._array = true;
130
+ if (this._or) {
131
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
132
+ this._or.array;
133
+ }
118
134
  return this;
119
135
  }
120
136
  or(def) {
121
137
  this._or = def;
138
+ this._or._array = this._array;
139
+ this._or._defaultValue = this._defaultValue;
140
+ this._or._nullable = this._nullable;
141
+ this._or._required = this._required;
142
+ this._or._rules = this._rules;
122
143
  return this;
123
144
  }
124
145
  // Build
@@ -130,6 +151,10 @@ class MessageTemplateFieldBuilder {
130
151
  const childrenBasePath = builder.children
131
152
  ? path + (builder._array ? '*.' : '')
132
153
  : undefined;
154
+ if (builder.value.id) {
155
+ const bucket = tree.getSchema(builder.value.id.bucket);
156
+ builder.value.id.type = bucket.model.fields.id.type;
157
+ }
133
158
  return new message_template_schema_1.$MessageTemplateField(builder.type, name, builder.alias || name, basePath + name, builder._array, builder._required, builder._defaultValue, builder._nullable, builder._rules, builder.value, builder.children ? MessageTemplateFieldBuilder.buildChildren(builder.children, tree, module, childrenBasePath) : undefined, or);
134
159
  }
135
160
  static buildChildren(fields, tree, module, basePath = '') {
@@ -48,8 +48,9 @@ async function MessageTemplateFieldParser(raw, trx, field, value, parseFields) {
48
48
  }
49
49
  if (field.type === 'id') {
50
50
  const bucket = field.meta.id.bucket;
51
+ const type = field.meta.id.type;
51
52
  const view = field.meta.id.view;
52
- const parsed = await (0, parse_1.parseId)(field, value, field.array, trx, bucket.refName, view);
53
+ const parsed = await (0, parse_1.parseId)(field, value, field.array, trx, bucket.refName, type, view);
53
54
  return {
54
55
  '': parsed.obj
55
56
  };
@@ -6,6 +6,11 @@ import { TrxEngineConfig } from '../transaction/trx_engine.config';
6
6
  import { CompilerConfig } from "../../compiler/compiler";
7
7
  import { App } from './app';
8
8
  import { CLIConfig } from '../cli/cli';
9
+ import { BucketAdapter } from "../../elements/entities/bucket/adapters/bucket_adapter";
10
+ import { TrashObj } from '../data/trash';
11
+ import { $Bucket } from "../../elements";
12
+ import { Overlay } from '../util/type';
13
+ import { TrxStatus } from '../transaction/trx';
9
14
  export type AppConfig<S extends $Space, Modules extends ModuleName<S>> = {
10
15
  i18n?: AppI18nConfig;
11
16
  authn?: AppAuthnConfig<S>;
@@ -20,13 +25,18 @@ export type AppI18nConfig = {
20
25
  [x: string]: ($: Record<string, any>) => string;
21
26
  };
22
27
  export type AppAuthnConfig<S extends $Space> = {
23
- [K in keyof S['authnUsers']]: AuthnProvider<S['authnUsers'][K]>;
28
+ [K in keyof S['authnUsers']]: () => AuthnProvider<S['authnUsers'][K]>;
24
29
  };
25
30
  export type AppBucketConfig<S extends $Space, Modules extends ModuleName<S>, Providers extends Record<string, any>> = Partial<{
26
31
  [M in (Modules & keyof S['modules'])]: Partial<{
27
- [K in keyof S['modules'][M]['buckets']]: BucketConfig<S['modules'][M]['buckets'][K], Providers>;
32
+ [K in keyof S['modules'][M]['buckets']]: BucketConfig<S['modules'][M], S['modules'][M]['buckets'][K], Providers>;
28
33
  }>;
29
34
  }>;
35
+ export type AppTrashConfig = {
36
+ adapter: ($: Overlay<$Bucket, {
37
+ '#data': TrashObj;
38
+ }>) => BucketAdapter<TrashObj>;
39
+ };
30
40
  export type AppControllerConfig<S extends $Space, Modules extends ModuleName<S>, Providers extends Record<string, any>> = Partial<{
31
41
  [M in (Modules & keyof S['modules'])]: Partial<{
32
42
  [K in keyof S['modules'][M]['controllers']]: ControllerConfig<S['modules'][M]['controllers'][K], Providers>;
@@ -35,15 +45,26 @@ export type AppControllerConfig<S extends $Space, Modules extends ModuleName<S>,
35
45
  export type AppTrxEngineConfig<S extends $Space, Modules extends ModuleName<S>, Providers extends Record<string, any>> = Partial<{
36
46
  [M in (Modules & keyof S['modules'])]: TrxEngineConfig<S, S['modules'][M], any, Providers>;
37
47
  }>;
38
- export declare class AppConfigFactory<S extends $Space, Modules extends string = ModuleName<S> & string, Providers extends Record<string, any> = Record<string, any>> {
48
+ export type AppAuditConfig = {
49
+ adapter: ($: Overlay<$Bucket, {
50
+ '#data': TrashObj;
51
+ }>) => BucketAdapter<TrashObj>;
52
+ transform?: (trx: TrxStatus<any>) => Record<string, any>;
53
+ };
54
+ /**
55
+ * Factory
56
+ */
57
+ export declare class AppConfigFactory<S extends $Space, Modules extends string = ModuleName<S> & string, Providers extends Record<string, any> = Record<string, any>, _App = App<S, Modules, Providers>> {
39
58
  private app;
40
59
  private config;
41
- constructor(app: App<S, Modules, Providers>);
42
- i18n(config: AppI18nConfig): App<S, Modules, Providers>;
43
- authn(config: AppAuthnConfig<S>): App<S, Modules, Providers>;
44
- buckets(config: AppBucketConfig<S, Modules, Providers>): App<S, Modules, Providers>;
45
- controllers(config: AppControllerConfig<S, Modules, Providers>): App<S, Modules, Providers>;
46
- compiler(config: CompilerConfig): App<S, Modules, Providers>;
47
- cli(config: CLIConfig<Providers>): App<S, Modules, Providers>;
48
- trx(config: AppTrxEngineConfig<S, Modules, Providers>): App<S, Modules, Providers>;
60
+ constructor(app: _App);
61
+ i18n(config: AppI18nConfig): _App;
62
+ authn(config: AppAuthnConfig<S>): _App;
63
+ buckets(config: AppBucketConfig<S, Modules, Providers>): _App;
64
+ trash(config: AppTrashConfig): _App;
65
+ controllers(config: AppControllerConfig<S, Modules, Providers>): _App;
66
+ audit(config: AppI18nConfig): _App;
67
+ compiler(config: CompilerConfig): _App;
68
+ cli(config: CLIConfig<Providers>): _App;
69
+ trx(config: AppTrxEngineConfig<S, Modules, Providers>): _App;
49
70
  }