nesoi 3.0.0 → 3.0.6

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 (186) 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/apps/monolyth/stages/6_dump_package_json_stage.js +1 -1
  27. package/lib/compiler/elements/bucket.element.js +26 -11
  28. package/lib/compiler/elements/constants.element.js +1 -1
  29. package/lib/compiler/elements/element.d.ts +2 -0
  30. package/lib/compiler/elements/message.element.js +4 -4
  31. package/lib/compiler/helpers/dump_helpers.js +5 -2
  32. package/lib/compiler/stages/7_dump_stage.js +2 -0
  33. package/lib/compiler/treeshake.js +9 -37
  34. package/lib/compiler/typescript/bridge/extract.js +12 -0
  35. package/lib/compiler/typescript/bridge/inject.js +3 -0
  36. package/lib/compiler/typescript/bridge/organize.js +3 -3
  37. package/lib/elements/blocks/block.builder.js +4 -2
  38. package/lib/elements/blocks/job/internal/resource_job.builder.d.ts +22 -20
  39. package/lib/elements/blocks/job/internal/resource_job.d.ts +2 -1
  40. package/lib/elements/blocks/job/internal/resource_job.js +17 -4
  41. package/lib/elements/blocks/job/job.js +3 -0
  42. package/lib/elements/blocks/job/job.types.d.ts +7 -0
  43. package/lib/elements/blocks/job/job.types.js +2 -0
  44. package/lib/elements/blocks/machine/machine.js +3 -2
  45. package/lib/elements/blocks/resource/resource.builder.js +2 -4
  46. package/lib/elements/blocks/resource/resource.d.ts +5 -3
  47. package/lib/elements/blocks/resource/resource.js +26 -17
  48. package/lib/elements/edge/controller/adapters/controller_adapter.d.ts +2 -1
  49. package/lib/elements/edge/controller/adapters/controller_adapter.js +11 -2
  50. package/lib/elements/edge/controller/controller.builder.d.ts +4 -5
  51. package/lib/elements/edge/controller/controller.builder.js +7 -7
  52. package/lib/elements/edge/controller/controller.d.ts +2 -1
  53. package/lib/elements/edge/controller/controller.js +8 -6
  54. package/lib/elements/entities/bucket/adapters/bucket_adapter.d.ts +61 -23
  55. package/lib/elements/entities/bucket/adapters/bucket_adapter.js +22 -13
  56. package/lib/elements/entities/bucket/adapters/memory.bucket_adapter.d.ts +21 -22
  57. package/lib/elements/entities/bucket/adapters/memory.bucket_adapter.js +68 -2
  58. package/lib/elements/entities/bucket/adapters/memory.nql.d.ts +10 -6
  59. package/lib/elements/entities/bucket/adapters/memory.nql.js +38 -3
  60. package/lib/elements/entities/bucket/adapters/slow_memory.bucket_adapter.d.ts +0 -20
  61. package/lib/elements/entities/bucket/adapters/slow_memory.bucket_adapter.js +46 -30
  62. package/lib/elements/entities/bucket/bucket.builder.d.ts +8 -2
  63. package/lib/elements/entities/bucket/bucket.builder.js +13 -19
  64. package/lib/elements/entities/bucket/bucket.config.d.ts +5 -1
  65. package/lib/elements/entities/bucket/bucket.d.ts +180 -19
  66. package/lib/elements/entities/bucket/bucket.js +662 -48
  67. package/lib/elements/entities/bucket/bucket.schema.d.ts +7 -1
  68. package/lib/elements/entities/bucket/bucket.schema.js +2 -1
  69. package/lib/elements/entities/bucket/bucket.types.d.ts +2 -7
  70. package/lib/elements/entities/bucket/cache/bucket_cache.d.ts +6 -2
  71. package/lib/elements/entities/bucket/cache/bucket_cache.js +12 -12
  72. package/lib/elements/entities/bucket/graph/bucket_graph.d.ts +32 -5
  73. package/lib/elements/entities/bucket/graph/bucket_graph.js +80 -111
  74. package/lib/elements/entities/bucket/graph/bucket_graph.schema.d.ts +3 -6
  75. package/lib/elements/entities/bucket/graph/bucket_graph.schema.js +1 -4
  76. package/lib/elements/entities/bucket/graph/bucket_graph_link.builder.d.ts +3 -7
  77. package/lib/elements/entities/bucket/graph/bucket_graph_link.builder.js +6 -2
  78. package/lib/elements/entities/bucket/model/bucket_model.builder.js +1 -1
  79. package/lib/elements/entities/bucket/model/bucket_model.convert.js +3 -3
  80. package/lib/elements/entities/bucket/model/bucket_model.schema.d.ts +37 -8
  81. package/lib/elements/entities/bucket/model/bucket_model.schema.js +25 -4
  82. package/lib/elements/entities/bucket/model/bucket_model_field.builder.d.ts +33 -14
  83. package/lib/elements/entities/bucket/model/bucket_model_field.builder.js +56 -13
  84. package/lib/elements/entities/bucket/query/nql.schema.d.ts +1 -0
  85. package/lib/elements/entities/bucket/query/nql_compiler.js +13 -2
  86. package/lib/elements/entities/bucket/query/nql_engine.d.ts +11 -4
  87. package/lib/elements/entities/bucket/query/nql_engine.js +20 -11
  88. package/lib/elements/entities/bucket/view/bucket_view.js +63 -35
  89. package/lib/elements/entities/bucket/view/bucket_view.schema.d.ts +5 -2
  90. package/lib/elements/entities/bucket/view/bucket_view_field.builder.d.ts +6 -2
  91. package/lib/elements/entities/bucket/view/bucket_view_field.builder.js +22 -16
  92. package/lib/elements/entities/constants/constants.schema.d.ts +1 -1
  93. package/lib/elements/entities/drive/drive_adapter.d.ts +44 -0
  94. package/lib/elements/entities/drive/drive_adapter.js +10 -0
  95. package/lib/elements/entities/drive/local.drive_adapter.d.ts +10 -0
  96. package/lib/elements/entities/drive/local.drive_adapter.js +34 -0
  97. package/lib/elements/entities/message/message.schema.d.ts +1 -0
  98. package/lib/elements/entities/message/message.schema.js +33 -0
  99. package/lib/elements/entities/message/message_parser.d.ts +5 -1
  100. package/lib/elements/entities/message/message_parser.js +56 -35
  101. package/lib/elements/entities/message/template/message_template.schema.d.ts +10 -8
  102. package/lib/elements/entities/message/template/message_template_field.builder.d.ts +16 -6
  103. package/lib/elements/entities/message/template/message_template_field.builder.js +25 -0
  104. package/lib/elements/entities/message/template/message_template_parser.js +2 -1
  105. package/lib/engine/apps/app.config.d.ts +32 -11
  106. package/lib/engine/apps/app.config.js +12 -0
  107. package/lib/engine/apps/app.d.ts +2 -0
  108. package/lib/engine/apps/app.js +3 -0
  109. package/lib/engine/apps/inline.app.d.ts +5 -3
  110. package/lib/engine/apps/inline.app.js +27 -12
  111. package/lib/engine/apps/monolyth/monolyth.app.d.ts +4 -2
  112. package/lib/engine/apps/monolyth/monolyth.app.js +22 -10
  113. package/lib/engine/auth/authn.d.ts +5 -1
  114. package/lib/engine/auth/zero.authn_provider.d.ts +4 -2
  115. package/lib/engine/auth/zero.authn_provider.js +2 -2
  116. package/lib/engine/cli/cli.d.ts +3 -1
  117. package/lib/engine/cli/cli.js +22 -3
  118. package/lib/engine/cli/cli_adapter.d.ts +2 -1
  119. package/lib/engine/cli/cli_adapter.js +2 -1
  120. package/lib/engine/cli/cli_input.d.ts +19 -0
  121. package/lib/engine/cli/cli_input.js +207 -0
  122. package/lib/engine/cli/ui.d.ts +1 -1
  123. package/lib/engine/cli/ui.js +2 -2
  124. package/lib/engine/daemon.d.ts +3 -2
  125. package/lib/engine/daemon.js +14 -2
  126. package/lib/engine/data/date.js +2 -2
  127. package/lib/engine/data/datetime.d.ts +40 -4
  128. package/lib/engine/data/datetime.js +70 -11
  129. package/lib/engine/data/decimal.d.ts +1 -1
  130. package/lib/engine/data/decimal.js +3 -3
  131. package/lib/engine/data/error.d.ts +21 -4
  132. package/lib/engine/data/error.js +23 -7
  133. package/lib/engine/data/file.d.ts +38 -0
  134. package/lib/engine/data/file.js +54 -0
  135. package/lib/engine/data/json.d.ts +6 -0
  136. package/lib/engine/data/json.js +26 -0
  137. package/lib/engine/data/obj.d.ts +1 -1
  138. package/lib/engine/data/trash.d.ts +14 -0
  139. package/lib/engine/data/trash.js +2 -0
  140. package/lib/engine/data/tree.d.ts +7 -12
  141. package/lib/engine/data/tree.js +101 -49
  142. package/lib/engine/module.d.ts +2 -1
  143. package/lib/engine/module.js +2 -5
  144. package/lib/engine/space.d.ts +1 -0
  145. package/lib/engine/space.js +6 -0
  146. package/lib/engine/transaction/nodes/bucket.trx_node.d.ts +184 -24
  147. package/lib/engine/transaction/nodes/bucket.trx_node.js +346 -451
  148. package/lib/engine/transaction/nodes/bucket_query.trx_node.d.ts +4 -2
  149. package/lib/engine/transaction/nodes/bucket_query.trx_node.js +27 -15
  150. package/lib/engine/transaction/nodes/job.trx_node.d.ts +2 -1
  151. package/lib/engine/transaction/nodes/job.trx_node.js +6 -0
  152. package/lib/engine/transaction/trx.d.ts +5 -2
  153. package/lib/engine/transaction/trx.js +2 -2
  154. package/lib/engine/transaction/trx_engine.config.d.ts +1 -3
  155. package/lib/engine/transaction/trx_engine.d.ts +2 -2
  156. package/lib/engine/transaction/trx_engine.js +14 -11
  157. package/lib/engine/transaction/trx_node.d.ts +14 -4
  158. package/lib/engine/transaction/trx_node.js +50 -8
  159. package/lib/engine/tree.d.ts +1 -1
  160. package/lib/engine/util/crypto.d.ts +50 -0
  161. package/lib/engine/util/crypto.js +89 -0
  162. package/lib/engine/util/deep.d.ts +5 -0
  163. package/lib/engine/util/deep.js +46 -0
  164. package/lib/engine/util/dotenv.d.ts +2 -8
  165. package/lib/engine/util/dotenv.js +14 -36
  166. package/lib/engine/util/hash.d.ts +3 -0
  167. package/lib/engine/util/hash.js +23 -0
  168. package/lib/engine/util/log.js +1 -1
  169. package/lib/engine/util/mime.d.ts +10 -0
  170. package/lib/engine/util/mime.js +389 -0
  171. package/lib/engine/util/parse.d.ts +6 -5
  172. package/lib/engine/util/parse.js +16 -15
  173. package/lib/engine/util/path.d.ts +3 -0
  174. package/lib/engine/util/path.js +92 -0
  175. package/lib/engine/util/rules.d.ts +4 -0
  176. package/lib/engine/util/rules.js +12 -0
  177. package/package.json +2 -2
  178. package/tools/compile.js +2 -2
  179. package/tools/dotenv.d.ts +1 -0
  180. package/tools/dotenv.js +4 -0
  181. package/tools/joaquin/job.d.ts +5 -5
  182. package/tools/joaquin/mock.d.ts +23 -2
  183. package/tools/joaquin/mock.js +127 -21
  184. package/tsconfig.build.tsbuildinfo +1 -1
  185. package/lib/adapters/postgres/test/postgres.bucket_query.test.d.ts +0 -0
  186. package/lib/adapters/postgres/test/postgres.bucket_query.test.js +0 -136
@@ -2,24 +2,28 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.$BucketModel = exports.$BucketModelField = void 0;
4
4
  class $BucketModelField {
5
- constructor(name, type, alias, array, required, _enum, defaultValue, children, or) {
5
+ constructor(name, path, type, alias, array, required, meta, defaultValue, children, or, crypto) {
6
6
  this.name = name;
7
+ this.path = path;
7
8
  this.type = type;
8
9
  this.alias = alias;
9
10
  this.array = array;
10
11
  this.required = required;
11
- this._enum = _enum;
12
+ this.meta = meta;
12
13
  this.defaultValue = defaultValue;
13
14
  this.children = children;
14
15
  this.or = or;
16
+ this.crypto = crypto;
15
17
  this.$t = 'bucket.model.field';
16
18
  }
17
19
  }
18
20
  exports.$BucketModelField = $BucketModelField;
19
21
  class $BucketModel {
20
- constructor(fields, defaults = {}) {
22
+ constructor(fields, defaults = {}, hasFileField = false, hasEncryptedField = false) {
21
23
  this.fields = fields;
22
24
  this.defaults = defaults;
25
+ this.hasFileField = hasFileField;
26
+ this.hasEncryptedField = hasEncryptedField;
23
27
  this.$t = 'bucket.model';
24
28
  }
25
29
  static get(model, fieldpath) {
@@ -27,7 +31,7 @@ class $BucketModel {
27
31
  let ref = model.fields;
28
32
  for (let i = 0; i < paths.length; i++) {
29
33
  const path = paths[i];
30
- if (path === '*') {
34
+ if (path === '#') {
31
35
  continue;
32
36
  }
33
37
  else {
@@ -43,5 +47,22 @@ class $BucketModel {
43
47
  }
44
48
  return ref;
45
49
  }
50
+ static fieldsOfType(model, type) {
51
+ const fields = [];
52
+ let poll = Object.values(model.fields);
53
+ while (poll.length) {
54
+ const next = [];
55
+ for (const field of poll) {
56
+ if (field.type === type) {
57
+ fields.push(field);
58
+ }
59
+ if (field.children) {
60
+ next.push(...Object.values(field.children));
61
+ }
62
+ }
63
+ poll = next;
64
+ }
65
+ return fields;
66
+ }
46
67
  }
47
68
  exports.$BucketModel = $BucketModel;
@@ -2,10 +2,10 @@ import { $Module, $Space } from "../../../../schema";
2
2
  import { $BucketModelField, $BucketModelFieldType, $BucketModelFields } from './bucket_model.schema';
3
3
  import { NesoiDate } from "../../../../engine/data/date";
4
4
  import { BucketFieldpathObjInfer, BucketModelObjInfer } from './bucket_model.infer';
5
- import { $Dependency } from "../../../../engine/dependency";
6
5
  import { EnumFromName, EnumName } from '../../constants/constants.schema';
7
- import { Decimal } from "../../../../engine/data/decimal";
6
+ import { NesoiDecimal } from "../../../../engine/data/decimal";
8
7
  import { NesoiDatetime } from "../../../../engine/data/datetime";
8
+ import { NesoiFile } from "../../../../engine/data/file";
9
9
  export declare class BucketModelFieldFactory<Space extends $Space, Module extends $Module> {
10
10
  private module;
11
11
  constructor(module: string);
@@ -26,8 +26,8 @@ export declare class BucketModelFieldFactory<Space extends $Space, Module extend
26
26
  decimal(def?: {
27
27
  left?: number;
28
28
  right?: number;
29
- }): BucketModelFieldBuilder<Module, Decimal, never, Decimal, {
30
- '': Decimal;
29
+ }): BucketModelFieldBuilder<Module, NesoiDecimal, never, NesoiDecimal, {
30
+ '': NesoiDecimal;
31
31
  }>;
32
32
  enum<Enums extends EnumName<Space>, Options extends (keyof Enums & string) | (readonly string[])>(options: Options): BucketModelFieldBuilder<Module, Options extends string ? EnumFromName<Space, Options>["#data"] : Options extends (infer X)[] | readonly (infer X)[] ? X : Options[keyof Options], never, Options extends string ? EnumFromName<Space, Options>["#data"] : Options extends (infer X)[] | readonly (infer X)[] ? X : Options[keyof Options], {
33
33
  '': Options extends string ? EnumFromName<Space, Options>["#data"] : Options extends (infer X)[] | readonly (infer X)[] ? X : Options[keyof Options];
@@ -41,9 +41,17 @@ export declare class BucketModelFieldFactory<Space extends $Space, Module extend
41
41
  get string(): BucketModelFieldBuilder<Module, string, never, string, {
42
42
  '': string;
43
43
  }>;
44
+ /**
45
+ * An object with a specific set of child fields.
46
+ */
44
47
  obj<T extends BucketModelFieldBuilders<Module>>(fields?: T): BucketModelFieldBuilder<Module, BucketModelObjInfer<T>, never, BucketModelObjInfer<T>, {
45
48
  '': BucketModelObjInfer<T>;
46
49
  } & BucketFieldpathObjInfer<T, ".">>;
50
+ /**
51
+ * An object with an unknown number of child fields of a given type.
52
+ *
53
+ * - All child fields are optional. You can specify a default value.
54
+ */
47
55
  dict<T extends BucketModelFieldBuilder<Module, any>>(dictItem: T): BucketModelFieldBuilder<Module, Record<string, T extends BucketModelFieldBuilder<any, any, any, infer X, {
48
56
  '': infer X;
49
57
  }> ? X : never>, never, Record<string, T extends BucketModelFieldBuilder<any, any, any, infer X, {
@@ -54,7 +62,13 @@ export declare class BucketModelFieldFactory<Space extends $Space, Module extend
54
62
  }> ? X : never>;
55
63
  } & BucketFieldpathObjInfer<{
56
64
  '': T;
57
- }, ".*">>;
65
+ }, ".#">>;
66
+ file(def?: {
67
+ extnames?: string[];
68
+ maxsize?: number;
69
+ }): BucketModelFieldBuilder<Module, NesoiFile, never, NesoiFile, {
70
+ '': NesoiFile;
71
+ }>;
58
72
  }
59
73
  export declare class BucketModelFieldBuilder<Module extends $Module, DefinedData, TypeAppend = never, Data = DefinedData | TypeAppend, Fieldpath = {
60
74
  '': Data;
@@ -62,16 +76,14 @@ export declare class BucketModelFieldBuilder<Module extends $Module, DefinedData
62
76
  private module;
63
77
  private type;
64
78
  private alias?;
65
- private _enum?;
79
+ private meta?;
66
80
  private children?;
67
81
  private _array;
68
82
  private _required;
69
83
  private _defaultValue?;
70
84
  private _or?;
71
- constructor(module: string, type: $BucketModelFieldType, alias?: string | undefined, _enum?: {
72
- options: string | string[];
73
- dep?: $Dependency;
74
- } | undefined, children?: BucketModelFieldBuilders<Module> | undefined);
85
+ private crypto?;
86
+ constructor(module: string, type: $BucketModelFieldType, alias?: string | undefined, meta?: $BucketModelField['meta'], children?: BucketModelFieldBuilders<Module> | undefined);
75
87
  as(alias: string): this;
76
88
  /**
77
89
  * This field can be `undefined`.
@@ -84,9 +96,9 @@ export declare class BucketModelFieldBuilder<Module extends $Module, DefinedData
84
96
  * resource method, this value is used if undefined is passed.
85
97
  */
86
98
  default(defaultValue: DefinedData): BucketModelFieldBuilder<Module, DefinedData, never, DefinedData, Fieldpath>;
87
- get array(): BucketModelFieldBuilder<Module, DefinedData[], TypeAppend, DefinedData[] | TypeAppend, { [K in Exclude<keyof Fieldpath, ""> as `.*${K & string}`]: Fieldpath[K]; } & {
99
+ get array(): BucketModelFieldBuilder<Module, DefinedData[], TypeAppend, DefinedData[] | TypeAppend, { [K in Exclude<keyof Fieldpath, ""> as `.#${K & string}`]: Fieldpath[K]; } & {
88
100
  "": DefinedData[] | TypeAppend;
89
- ".*": DefinedData | TypeAppend;
101
+ ".#": DefinedData | TypeAppend;
90
102
  }>;
91
103
  or<Def extends AnyBucketModelFieldBuilder>(def: Def): BucketModelFieldBuilder<Module, DefinedData | (Def extends BucketModelFieldBuilder<any, any, any, infer X, {
92
104
  '': infer X;
@@ -107,10 +119,17 @@ export declare class BucketModelFieldBuilder<Module extends $Module, DefinedData
107
119
  * > If you want unconstrained enum you must specify `null` here.
108
120
  */
109
121
  maxLength(val: number | null): void;
110
- static build(builder: BucketModelFieldBuilder<any, any>, name: string): $BucketModelField;
111
- static buildChildren(module: string, children: BucketModelFieldBuilders<any>): {
122
+ encrypt(key: keyof Module['constants']['values'], algorithm?: string): void;
123
+ static build(builder: BucketModelFieldBuilder<any, any>, name: string, path?: string): {
124
+ schema: $BucketModelField;
125
+ hasFile: boolean;
126
+ hasEncrypted: boolean;
127
+ };
128
+ static buildChildren(module: string, children: BucketModelFieldBuilders<any>, path?: string): {
112
129
  schema: $BucketModelFields;
113
130
  defaults: Record<string, any>;
131
+ hasFileField: boolean;
132
+ hasEncryptedField: boolean;
114
133
  };
115
134
  }
116
135
  export type BucketModelFieldBuilders<Module extends $Module> = {
@@ -27,8 +27,9 @@ class BucketModelFieldFactory {
27
27
  return new BucketModelFieldBuilder(this.module, 'datetime', this.alias);
28
28
  }
29
29
  decimal(def) {
30
- // TODO: store definition on schema
31
- return new BucketModelFieldBuilder(this.module, 'decimal', this.alias);
30
+ return new BucketModelFieldBuilder(this.module, 'decimal', this.alias, {
31
+ decimal: def
32
+ });
32
33
  }
33
34
  enum(options) {
34
35
  const strings = (Array.isArray(options) || typeof options === 'string')
@@ -44,7 +45,9 @@ class BucketModelFieldFactory {
44
45
  dep = new dependency_1.$Dependency(this.module, 'constants', '*');
45
46
  }
46
47
  }
47
- return new BucketModelFieldBuilder(this.module, 'enum', this.alias, { options: strings, dep });
48
+ return new BucketModelFieldBuilder(this.module, 'enum', this.alias, {
49
+ enum: { options: strings, dep }
50
+ });
48
51
  }
49
52
  get int() {
50
53
  return new BucketModelFieldBuilder(this.module, 'int', this.alias);
@@ -55,23 +58,37 @@ class BucketModelFieldFactory {
55
58
  get string() {
56
59
  return new BucketModelFieldBuilder(this.module, 'string', this.alias);
57
60
  }
61
+ /**
62
+ * An object with a specific set of child fields.
63
+ */
58
64
  obj(fields) {
59
65
  return new BucketModelFieldBuilder(this.module, 'obj', this.alias, undefined, fields);
60
66
  }
67
+ /**
68
+ * An object with an unknown number of child fields of a given type.
69
+ *
70
+ * - All child fields are optional. You can specify a default value.
71
+ */
61
72
  dict(dictItem) {
73
+ dictItem = dictItem.optional;
62
74
  return new BucketModelFieldBuilder(this.module, 'dict', this.alias, undefined, { __dict: dictItem });
63
75
  }
76
+ file(def) {
77
+ return new BucketModelFieldBuilder(this.module, 'file', this.alias, {
78
+ file: def
79
+ });
80
+ }
64
81
  }
65
82
  exports.BucketModelFieldFactory = BucketModelFieldFactory;
66
83
  /*
67
84
  Builder
68
85
  */
69
86
  class BucketModelFieldBuilder {
70
- constructor(module, type, alias, _enum, children) {
87
+ constructor(module, type, alias, meta, children) {
71
88
  this.module = module;
72
89
  this.type = type;
73
90
  this.alias = alias;
74
- this._enum = _enum;
91
+ this.meta = meta;
75
92
  this.children = children;
76
93
  this._array = false;
77
94
  this._required = true;
@@ -118,10 +135,19 @@ class BucketModelFieldBuilder {
118
135
  */
119
136
  maxLength(val) {
120
137
  }
138
+ encrypt(key, algorithm = 'aes256') {
139
+ this.crypto = {
140
+ algorithm,
141
+ key: key
142
+ };
143
+ }
121
144
  // Build
122
- static build(builder, name) {
145
+ static build(builder, name, path = '') {
146
+ path += name;
123
147
  const children = builder.children
124
- ? BucketModelFieldBuilder.buildChildren(builder.module, builder.children)
148
+ ? BucketModelFieldBuilder.buildChildren(builder.module, builder.children, builder._array
149
+ ? path + '.#.'
150
+ : path + '.')
125
151
  : undefined;
126
152
  const defaults = builder._defaultValue && builder.children
127
153
  ? Object.assign({}, builder._defaultValue, children?.defaults)
@@ -129,26 +155,43 @@ class BucketModelFieldBuilder {
129
155
  const or = builder._or
130
156
  ? this.build(builder._or, name)
131
157
  : undefined;
132
- return new bucket_model_schema_1.$BucketModelField(name, builder.type, builder.alias || name, builder._array, builder._required, builder._enum, defaults, children?.schema, or);
133
- }
134
- static buildChildren(module, children) {
158
+ const schema = new bucket_model_schema_1.$BucketModelField(name, path, builder.type, builder.alias || name, builder._array, builder._required, builder.meta, defaults, children?.schema, or?.schema, builder.crypto);
159
+ const hasFile = builder.type === 'file'
160
+ || children?.hasFileField
161
+ || or?.hasFile
162
+ || false;
163
+ const hasEncrypted = !!builder.crypto
164
+ || children?.hasEncryptedField
165
+ || or?.hasEncrypted
166
+ || false;
167
+ return { schema, hasFile, hasEncrypted };
168
+ }
169
+ static buildChildren(module, children, path) {
135
170
  const schema = {};
136
171
  const defaults = {};
172
+ let hasFileField = false;
173
+ let hasEncryptedField = false;
137
174
  for (const c in children) {
138
175
  const child = children[c];
139
176
  if (child instanceof BucketModelFieldBuilder) {
140
- schema[c] = BucketModelFieldBuilder.build(child, c);
177
+ const out = BucketModelFieldBuilder.build(child, c, path);
178
+ schema[c] = out.schema;
179
+ hasFileField || (hasFileField = out.hasFile);
180
+ hasEncryptedField || (hasEncryptedField = out.hasEncrypted);
141
181
  }
142
182
  // Builders are allowed to implicitly declare nested fields.
143
183
  // The code below transforms these groups into fields of the scope 'group'.
144
184
  else {
145
185
  const fieldTypeBuilder = new BucketModelFieldFactory(module);
146
186
  const fieldBuilder = fieldTypeBuilder.obj(child);
147
- schema[c] = BucketModelFieldBuilder.build(fieldBuilder, c);
187
+ const out = BucketModelFieldBuilder.build(fieldBuilder, c, path);
188
+ schema[c] = out.schema;
189
+ hasFileField || (hasFileField = out.hasFile);
190
+ hasEncryptedField || (hasEncryptedField = out.hasEncrypted);
148
191
  }
149
192
  defaults[c] = schema[c].defaultValue;
150
193
  }
151
- return { schema, defaults };
194
+ return { schema, defaults, hasFileField, hasEncryptedField };
152
195
  }
153
196
  }
154
197
  exports.BucketModelFieldBuilder = BucketModelFieldBuilder;
@@ -56,6 +56,7 @@ export type NQL_Order<Fieldpath> = {
56
56
  export type NQL_Pagination = {
57
57
  page?: number;
58
58
  perPage?: number;
59
+ count?: boolean;
59
60
  };
60
61
  /**
61
62
  * A union of all operators which apply to the selected field
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.NQL_CompiledQuery = exports.NQL_Compiler = exports.NQL_RuleTree = void 0;
4
4
  const bucket_model_schema_1 = require("../model/bucket_model.schema");
5
5
  const string_1 = require("../../../../engine/util/string");
6
- const bucket_1 = require("../bucket");
7
6
  class NQL_RuleTree {
8
7
  constructor(module, bucketName, query, debug = false) {
9
8
  this.module = module;
@@ -23,7 +22,7 @@ class NQL_RuleTree {
23
22
  }
24
23
  // Parse NQL
25
24
  parseUnion(bucket, query, select) {
26
- const meta = bucket_1.Bucket.getQueryMeta(bucket);
25
+ const meta = bucket.getQueryMeta();
27
26
  const union = {
28
27
  meta: {
29
28
  ...meta,
@@ -283,6 +282,12 @@ class NQL_RuleTree {
283
282
  const parent = stack.at(-2);
284
283
  // Union
285
284
  if ('inters' in node[0]) {
285
+ // Union has no child and a parent, should be removed
286
+ if (node[0].inters.length == 0 && parent) {
287
+ parent[0].rules.splice(parent[1], 1); // TODO: investigate 'as any'
288
+ stack.pop();
289
+ continue;
290
+ }
286
291
  // Union has a single child and a parent, should be collapsed
287
292
  if (node[0].inters.length == 1 && parent) {
288
293
  // Parent is a Intersection
@@ -310,6 +315,12 @@ class NQL_RuleTree {
310
315
  }
311
316
  // Intersection
312
317
  else if ('rules' in node[0]) {
318
+ // Intersection has no rule and a parent, should be removed
319
+ if (node[0].rules.length == 0 && parent) {
320
+ parent[0].inters.splice(parent[1], 1); // TODO: investigate 'as any'
321
+ stack.pop();
322
+ continue;
323
+ }
313
324
  // Iterate
314
325
  node[1]++;
315
326
  const next = node[0].rules[node[1]];
@@ -1,16 +1,23 @@
1
1
  import { AnyModule } from "../../../../engine/module";
2
2
  import { NQL_CompiledQuery } from './nql_compiler';
3
3
  import { AnyTrxNode } from "../../../../engine/transaction/trx_node";
4
- import { NQL_Part } from './nql.schema';
4
+ import { AnyBucket } from '../bucket';
5
+ import { NQL_Pagination, NQL_Part } from './nql.schema';
5
6
  type Obj = Record<string, any>;
6
- type Objs = Record<string, Obj>;
7
+ export type NQL_Result<T = Obj> = {
8
+ data: T[];
9
+ count?: number;
10
+ page?: number;
11
+ perPage?: number;
12
+ };
7
13
  export declare abstract class NQLRunner {
8
- abstract run(trx: AnyTrxNode, part: NQL_Part, params: Record<string, any>): Promise<Objs>;
14
+ abstract run(trx: AnyTrxNode, part: NQL_Part, params: Record<string, any>, pagination?: NQL_Pagination): Promise<NQL_Result>;
9
15
  }
10
16
  export declare class NQL_Engine {
11
17
  private module;
12
18
  private runners;
13
19
  constructor(module: AnyModule);
14
- run(trx: AnyTrxNode, query: NQL_CompiledQuery, params?: Record<string, any>): Promise<Obj[]>;
20
+ run(trx: AnyTrxNode, query: NQL_CompiledQuery, pagination?: NQL_Pagination, params?: Record<string, any>): Promise<NQL_Result>;
21
+ linkExternal(bucket: AnyBucket): void;
15
22
  }
16
23
  export {};
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.NQL_Engine = exports.NQLRunner = void 0;
4
- const bucket_1 = require("../bucket");
5
4
  class NQLRunner {
6
5
  }
7
6
  exports.NQLRunner = NQLRunner;
@@ -11,32 +10,42 @@ class NQL_Engine {
11
10
  this.runners = {};
12
11
  for (const b in module.buckets) {
13
12
  const bucket = module.buckets[b];
14
- const meta = bucket_1.Bucket.getQueryMeta(bucket);
13
+ const meta = bucket.getQueryMeta();
15
14
  if (!(meta.scope in this.runners)) {
16
- this.runners[meta.scope] = bucket_1.Bucket.getQueryRunner(bucket);
15
+ this.runners[meta.scope] = bucket.adapter.nql;
17
16
  }
18
17
  }
19
18
  }
20
- async run(trx, query, params = {}) {
21
- let data = [];
19
+ async run(trx, query, pagination, params = {}) {
20
+ let result = {
21
+ data: []
22
+ };
22
23
  for (let i = 0; i < query.execOrder.length; i++) {
23
24
  const part_i = query.execOrder[i];
24
25
  const part = query.parts[part_i];
25
26
  // Run part
26
27
  const runner = this.runners[part.union.meta.scope];
27
- const out = await runner.run(trx, part, params);
28
- data = Object.values(out);
28
+ const out = await runner.run(trx, part, params, pagination);
29
+ result = out;
29
30
  // Part failed, return
30
31
  // Failure here is only when a single value is expected,
31
32
  if (!part.many) {
32
- if (data.length === 0) {
33
- return [];
33
+ if (result.data.length === 0) {
34
+ return {
35
+ data: []
36
+ };
34
37
  }
35
38
  }
36
39
  // Fill part params
37
- params[`%__${part_i}__%`] = part.many ? data : data[0];
40
+ params[`%__${part_i}__%`] = part.many ? result.data : result.data[0];
41
+ }
42
+ return result;
43
+ }
44
+ linkExternal(bucket) {
45
+ const meta = bucket.getQueryMeta();
46
+ if (!(meta.scope in this.runners)) {
47
+ this.runners[meta.scope] = bucket.adapter.nql;
38
48
  }
39
- return data;
40
49
  }
41
50
  }
42
51
  exports.NQL_Engine = NQL_Engine;
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.BucketView = void 0;
7
7
  const promise_1 = __importDefault(require("../../../../engine/util/promise"));
8
8
  const tree_1 = require("../../../../engine/data/tree");
9
+ const error_1 = require("../../../../engine/data/error");
9
10
  class BucketView {
10
11
  constructor(bucket, schema) {
11
12
  this.bucket = bucket;
@@ -21,39 +22,7 @@ class BucketView {
21
22
  if (prop.scope !== 'model') {
22
23
  continue;
23
24
  }
24
- const value = prop.value.model;
25
- const rawValue = tree_1.Tree.get(raw, value.key, index);
26
- if (prop.children) {
27
- if (prop.array) {
28
- if (!Array.isArray(rawValue)) {
29
- continue;
30
- }
31
- const parsedArray = [];
32
- for (let i = 0; i < rawValue.length; i++) {
33
- const child = await doParse(prop.children, [...(index || []), i]);
34
- parsedArray.push(child);
35
- }
36
- parsedObj[k] = parsedArray;
37
- continue;
38
- }
39
- else if (prop.type === 'dict') {
40
- if (typeof rawValue !== 'object' || Array.isArray(rawValue)) {
41
- continue;
42
- }
43
- const parsedArray = [];
44
- for (const k in rawValue) {
45
- const child = await doParse(prop.children, [...(index || []), k]);
46
- parsedArray.push(child);
47
- }
48
- parsedObj[k] = parsedArray;
49
- continue;
50
- }
51
- else {
52
- parsedObj[k] = await doParse(prop.children, index || []);
53
- continue;
54
- }
55
- }
56
- parsedObj[k] = rawValue;
25
+ parsedObj[k] = await parseModelProp(raw, prop, index);
57
26
  }
58
27
  // Computed props
59
28
  for (const k in schema) {
@@ -77,7 +46,35 @@ class BucketView {
77
46
  continue;
78
47
  }
79
48
  const value = prop.value.graph;
80
- parsedObj[k] = await promise_1.default.solve(bucket.graph.readLink(trx, value.link, raw, value.view, index || []));
49
+ let link;
50
+ if (!value.view) {
51
+ link = bucket.graph.readLink(trx, raw, value.link, { silent: true }); // TODO: fieldpath indexes
52
+ }
53
+ else {
54
+ link = bucket.graph.viewLink(trx, raw, value.link, value.view, { silent: true }); // TODO: fieldpath indexes
55
+ }
56
+ parsedObj[k] = await promise_1.default.solve(link);
57
+ }
58
+ // Drive props
59
+ for (const k in schema) {
60
+ const prop = schema[k];
61
+ if (prop.$t !== 'bucket.view.field') {
62
+ continue;
63
+ }
64
+ if (prop.scope !== 'drive') {
65
+ continue;
66
+ }
67
+ if (!bucket.drive) {
68
+ throw error_1.NesoiError.Bucket.Drive.NoAdapter({ bucket: bucket.schema.alias });
69
+ }
70
+ const value = prop.value.drive;
71
+ const model = tree_1.Tree.get(raw, value.path);
72
+ if (Array.isArray(model)) {
73
+ parsedObj[k] = await bucket.drive.public(model);
74
+ }
75
+ else {
76
+ parsedObj[k] = (await bucket.drive.public([model]))[0];
77
+ }
81
78
  }
82
79
  // Group props
83
80
  for (const k in schema) {
@@ -92,7 +89,38 @@ class BucketView {
92
89
  }
93
90
  return parsedObj;
94
91
  };
95
- const parsedObj = await doParse(this.schema.fields, null);
92
+ const parseModelProp = async (obj, prop, index, key) => {
93
+ const value = prop.value.model;
94
+ const rawValue = tree_1.Tree.get(obj, key || value.key, index);
95
+ if (prop.children) {
96
+ if (prop.array) {
97
+ if (!Array.isArray(rawValue)) {
98
+ return undefined;
99
+ }
100
+ const parsedArray = [];
101
+ for (let i = 0; i < rawValue.length; i++) {
102
+ const child = await doParse(prop.children, [...(index || []), i]);
103
+ parsedArray.push(child);
104
+ }
105
+ return parsedArray;
106
+ }
107
+ else if (prop.type === 'dict') {
108
+ if (typeof rawValue !== 'object' || Array.isArray(rawValue)) {
109
+ return undefined;
110
+ }
111
+ const parsedDict = {};
112
+ for (const j in rawValue) {
113
+ parsedDict[j] = await parseModelProp(rawValue, prop.children.__dict, [...(index || []), j], j);
114
+ }
115
+ return parsedDict;
116
+ }
117
+ else {
118
+ return doParse(prop.children, index || []);
119
+ }
120
+ }
121
+ return rawValue;
122
+ };
123
+ const parsedObj = await doParse(this.schema.fields, '*');
96
124
  return {
97
125
  id: raw.id,
98
126
  ...parsedObj
@@ -21,11 +21,14 @@ export type $BucketViewFieldValue = {
21
21
  view?: {
22
22
  view: string;
23
23
  };
24
+ drive?: {
25
+ path: string;
26
+ };
24
27
  group?: {};
25
28
  };
26
29
  export declare class $BucketViewField {
27
30
  name: string;
28
- scope: 'model' | 'graph' | 'computed' | 'group' | 'view';
31
+ scope: 'model' | 'graph' | 'computed' | 'group' | 'view' | 'drive';
29
32
  type: $BucketModelFieldType | 'id';
30
33
  alias: string;
31
34
  array: boolean | 'unknown';
@@ -34,7 +37,7 @@ export declare class $BucketViewField {
34
37
  children?: $BucketViewFields | undefined;
35
38
  $t: string;
36
39
  '#data': unknown;
37
- constructor(name: string, scope: 'model' | 'graph' | 'computed' | 'group' | 'view', type: $BucketModelFieldType | 'id', alias: string, array: boolean | 'unknown', required: boolean, value: $BucketViewFieldValue, children?: $BucketViewFields | undefined);
40
+ constructor(name: string, scope: 'model' | 'graph' | 'computed' | 'group' | 'view' | 'drive', type: $BucketModelFieldType | 'id', alias: string, array: boolean | 'unknown', required: boolean, value: $BucketViewFieldValue, children?: $BucketViewFields | undefined);
38
41
  }
39
42
  export type $BucketViewFields = {
40
43
  [x: string]: $BucketViewField;
@@ -6,6 +6,10 @@ import { BucketViewBuilder } from './bucket_view.builder';
6
6
  import { $Bucket } from '../bucket.schema';
7
7
  import { $BucketViewFieldBuilderInfer } from '../bucket.infer';
8
8
  import { TrxNode } from "../../../../engine/transaction/trx_node";
9
+ import { NesoiFile } from "../../../../engine/data/file";
10
+ type DriveFieldpath<Bucket extends $Bucket> = {
11
+ [K in keyof Bucket['#fieldpath']]: NonNullable<Bucket['#fieldpath'][K]> extends NesoiFile ? K : never;
12
+ }[keyof Bucket['#fieldpath']];
9
13
  type GraphLinkBucket<Bucket extends $Bucket, L extends keyof Bucket['graph']['links']> = Bucket['graph']['links'][L]['#bucket'];
10
14
  type ComputedData<Fn extends $BucketViewFieldFn<any, any>, R = ReturnType<Fn>> = R extends Promise<infer X> ? X : R;
11
15
  export declare class BucketViewFieldFactory<Space extends $Space, Module extends $Module, Bucket extends $Bucket> {
@@ -17,6 +21,7 @@ export declare class BucketViewFieldFactory<Space extends $Space, Module extends
17
21
  model<K extends keyof Bucket['#fieldpath'], Extra extends BucketViewFieldBuilderTree>(key: K, extra?: Extra): BucketViewFieldBuilder<Bucket["#fieldpath"][K], "model", never>;
18
22
  computed<Fn extends $BucketViewFieldFn<TrxNode<Space, Module, Space['authnUsers']>, Bucket>>(fn: Fn): BucketViewFieldBuilder<ComputedData<Fn, ReturnType<Fn>>, "computed", never>;
19
23
  graph<L extends keyof Bucket['graph']['links'], LinkBucket extends GraphLinkBucket<Bucket, L>, V extends (keyof LinkBucket['views']) | undefined>(link: L, view?: V): BucketViewFieldBuilder<undefined extends V ? LinkBucket["#data"] : ViewObj<LinkBucket, NonNullable<V>>, "graph", `${LinkBucket["name"]}.${V & string}`>;
24
+ drive<F extends DriveFieldpath<Bucket>>(path: F): BucketViewFieldBuilder<string, "drive", never>;
20
25
  view<ViewName extends keyof Bucket['views'], View extends Bucket['views'][ViewName]>(view: ViewName): BucketViewFieldBuilder<View["#data"], "view", never>;
21
26
  extend<ViewName extends keyof Bucket['views'], Builders extends BucketViewFieldBuilderTree>(view: ViewName, fields: Builders): $BucketViewFieldBuilderInfer<Bucket["views"][ViewName]["#data"]> & Builders;
22
27
  static group(name: string, children: $BucketViewFields): $BucketViewField;
@@ -24,10 +29,9 @@ export declare class BucketViewFieldFactory<Space extends $Space, Module extends
24
29
  export declare class BucketViewFieldBuilder<Data, Scope extends $BucketViewField['scope'], GraphLink extends string = never> {
25
30
  protected scope: $BucketViewField['scope'];
26
31
  protected value: $BucketViewFieldValue;
27
- protected refKey?: string | undefined;
28
32
  protected extra?: BucketViewFieldBuilderTree | undefined;
29
33
  protected type: $BucketViewField['type'];
30
- constructor(scope: $BucketViewField['scope'], value: $BucketViewFieldValue, refKey?: string | undefined, extra?: BucketViewFieldBuilderTree | undefined);
34
+ constructor(scope: $BucketViewField['scope'], value: $BucketViewFieldValue, extra?: BucketViewFieldBuilderTree | undefined);
31
35
  static build(builder: BucketViewFieldBuilder<any, any>, model: $BucketModel, graph: $BucketGraph, views: $BucketViews, name: string): $BucketViewField;
32
36
  static buildFields(fields: BucketViewFieldBuilderTree, model: $BucketModel, graph: $BucketGraph, views: $BucketViews): $BucketViewFields;
33
37
  }