nesoi 3.0.21 → 3.1.1

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 (91) hide show
  1. package/lib/compiler/apps/monolyth/stages/2_build_typescript_stage.js +1 -0
  2. package/lib/compiler/apps/monolyth/stages/4_dump_modules_stage.js +8 -0
  3. package/lib/compiler/compiler.js +1 -1
  4. package/lib/compiler/elements/bucket.element.d.ts +3 -2
  5. package/lib/compiler/elements/bucket.element.js +86 -128
  6. package/lib/compiler/elements/element.js +4 -2
  7. package/lib/compiler/elements/externals.element.js +3 -0
  8. package/lib/compiler/elements/machine.element.js +2 -2
  9. package/lib/compiler/elements/message.element.js +35 -57
  10. package/lib/compiler/elements/queue.element.js +1 -1
  11. package/lib/compiler/helpers/dump_helpers.d.ts +5 -3
  12. package/lib/compiler/helpers/dump_helpers.js +43 -26
  13. package/lib/compiler/stages/4_build_schemas_stage.js +12 -0
  14. package/lib/compiler/stages/5_inject_ts_stage.js +4 -1
  15. package/lib/compiler/stages/7_dump_stage.js +7 -1
  16. package/lib/compiler/treeshake.js +4 -2
  17. package/lib/compiler/typescript/bridge/extract.js +37 -107
  18. package/lib/compiler/typescript/bridge/inject.d.ts +1 -1
  19. package/lib/compiler/typescript/bridge/inject.js +73 -45
  20. package/lib/compiler/typescript/bridge/organize.js +9 -5
  21. package/lib/compiler/typescript/typescript_compiler.d.ts +4 -6
  22. package/lib/compiler/typescript/typescript_compiler.js +139 -75
  23. package/lib/elements/blocks/block.builder.d.ts +1 -10
  24. package/lib/elements/blocks/block.builder.js +0 -32
  25. package/lib/elements/blocks/job/internal/resource_job.builder.d.ts +3 -21
  26. package/lib/elements/blocks/job/job.builder.d.ts +6 -20
  27. package/lib/elements/blocks/job/job.builder.js +0 -4
  28. package/lib/elements/blocks/machine/machine.builder.d.ts +5 -14
  29. package/lib/elements/blocks/machine/machine.builder.js +2 -2
  30. package/lib/elements/blocks/queue/queue.builder.d.ts +6 -15
  31. package/lib/elements/blocks/queue/queue.builder.js +2 -2
  32. package/lib/elements/edge/externals/externals.builder.d.ts +2 -0
  33. package/lib/elements/edge/externals/externals.builder.js +6 -1
  34. package/lib/elements/edge/externals/externals.schema.d.ts +2 -1
  35. package/lib/elements/edge/externals/externals.schema.js +3 -1
  36. package/lib/elements/entities/bucket/adapters/bucket_adapter.d.ts +1 -1
  37. package/lib/elements/entities/bucket/adapters/memory.bucket_adapter.d.ts +7 -0
  38. package/lib/elements/entities/bucket/adapters/memory.bucket_adapter.js +46 -36
  39. package/lib/elements/entities/bucket/adapters/memory.nql.js +1 -1
  40. package/lib/elements/entities/bucket/bucket.builder.d.ts +6 -4
  41. package/lib/elements/entities/bucket/bucket.js +42 -43
  42. package/lib/elements/entities/bucket/bucket.schema.d.ts +2 -1
  43. package/lib/elements/entities/bucket/cache/bucket_cache.d.ts +1 -4
  44. package/lib/elements/entities/bucket/graph/bucket_graph.infer.d.ts +7 -5
  45. package/lib/elements/entities/bucket/graph/bucket_graph_link.builder.d.ts +2 -1
  46. package/lib/elements/entities/bucket/model/bucket_model.builder.d.ts +1 -1
  47. package/lib/elements/entities/bucket/model/bucket_model.convert.d.ts +1 -1
  48. package/lib/elements/entities/bucket/model/bucket_model.convert.js +4 -4
  49. package/lib/elements/entities/bucket/model/bucket_model.infer.d.ts +41 -9
  50. package/lib/elements/entities/bucket/model/bucket_model.schema.d.ts +8 -6
  51. package/lib/elements/entities/bucket/model/bucket_model.schema.js +184 -21
  52. package/lib/elements/entities/bucket/model/bucket_model_field.builder.d.ts +89 -56
  53. package/lib/elements/entities/bucket/model/bucket_model_field.builder.js +22 -30
  54. package/lib/elements/entities/bucket/query/nql.schema.d.ts +13 -10
  55. package/lib/elements/entities/bucket/query/nql_compiler.js +46 -21
  56. package/lib/elements/entities/bucket/view/bucket_view.builder.js +1 -1
  57. package/lib/elements/entities/bucket/view/bucket_view.d.ts +19 -0
  58. package/lib/elements/entities/bucket/view/bucket_view.js +230 -108
  59. package/lib/elements/entities/bucket/view/bucket_view.schema.d.ts +5 -10
  60. package/lib/elements/entities/bucket/view/bucket_view.schema.js +3 -5
  61. package/lib/elements/entities/bucket/view/bucket_view_field.builder.d.ts +16 -12
  62. package/lib/elements/entities/bucket/view/bucket_view_field.builder.js +55 -40
  63. package/lib/elements/entities/message/message.builder.d.ts +1 -11
  64. package/lib/elements/entities/message/message.infer.d.ts +6 -30
  65. package/lib/elements/entities/message/message.schema.js +2 -2
  66. package/lib/elements/entities/message/template/message_template.builder.js +1 -1
  67. package/lib/elements/entities/message/template/message_template.schema.d.ts +10 -15
  68. package/lib/elements/entities/message/template/message_template.schema.js +29 -12
  69. package/lib/elements/entities/message/template/message_template_field.builder.d.ts +45 -209
  70. package/lib/elements/entities/message/template/message_template_field.builder.js +69 -85
  71. package/lib/elements/entities/message/template/message_template_parser.js +52 -64
  72. package/lib/engine/apps/inline.app.js +1 -0
  73. package/lib/engine/data/trash.js +7 -7
  74. package/lib/engine/data/tree.d.ts +3 -0
  75. package/lib/engine/data/tree.js +36 -0
  76. package/lib/engine/space.js +1 -1
  77. package/lib/engine/transaction/trx_engine.config.d.ts +3 -2
  78. package/lib/engine/transaction/trx_engine.d.ts +9 -1
  79. package/lib/engine/transaction/trx_engine.js +52 -9
  80. package/lib/engine/util/deep.js +4 -0
  81. package/lib/engine/util/parse.d.ts +22 -14
  82. package/lib/engine/util/parse.js +20 -5
  83. package/lib/engine/util/type.d.ts +3 -0
  84. package/package.json +1 -1
  85. package/tools/joaquin/bucket.d.ts +9 -0
  86. package/tools/joaquin/bucket.js +49 -0
  87. package/tools/joaquin/message.d.ts +2 -1
  88. package/tools/joaquin/message.js +9 -2
  89. package/tools/joaquin/mock.d.ts +1 -0
  90. package/tools/joaquin/mock.js +13 -5
  91. package/tsconfig.build.tsbuildinfo +1 -1
@@ -1,4 +1,4 @@
1
- import { $BucketViewField, $BucketViewFieldFn, $BucketViewFieldValue, $BucketViewFields, $BucketViews } from './bucket_view.schema';
1
+ import { $BucketViewField, $BucketViewFieldFn, $BucketViewFieldMeta, $BucketViewFields, $BucketViews } from './bucket_view.schema';
2
2
  import { $Module, $Space, ViewObj } from "../../../../schema";
3
3
  import { $BucketModel } from '../model/bucket_model.schema';
4
4
  import { $BucketGraph } from '../graph/bucket_graph.schema';
@@ -8,8 +8,8 @@ import { $BucketViewFieldBuilderInfer } from '../bucket.infer';
8
8
  import { TrxNode } from "../../../../engine/transaction/trx_node";
9
9
  import { NesoiFile } from "../../../../engine/data/file";
10
10
  type DriveFieldpath<Bucket extends $Bucket> = {
11
- [K in keyof Bucket['#fieldpath']]: NonNullable<Bucket['#fieldpath'][K]> extends NesoiFile ? K : never;
12
- }[keyof Bucket['#fieldpath']];
11
+ [K in keyof Bucket['#modelpath']]: NonNullable<Bucket['#modelpath'][K]> extends NesoiFile ? K : never;
12
+ }[keyof Bucket['#modelpath']];
13
13
  type GraphLinkBucket<Bucket extends $Bucket, L extends keyof Bucket['graph']['links']> = Bucket['graph']['links'][L]['#bucket'];
14
14
  type ComputedData<Fn extends $BucketViewFieldFn<any, any>, R = ReturnType<Fn>> = R extends Promise<infer X> ? X : R;
15
15
  /**
@@ -19,10 +19,12 @@ type ComputedData<Fn extends $BucketViewFieldFn<any, any>, R = ReturnType<Fn>> =
19
19
  export declare class BucketViewFieldFactory<Space extends $Space, Module extends $Module, Bucket extends $Bucket> {
20
20
  private _view;
21
21
  protected scope: $BucketViewField['scope'];
22
- protected type: $BucketViewField['type'];
23
- protected value: $BucketViewField['value'];
22
+ protected value: $BucketViewField['meta'];
24
23
  constructor(_view: BucketViewBuilder<any, any, any>);
25
- model<K extends keyof Bucket['#fieldpath'], Extra extends BucketViewFieldBuilderTree>(key: K, extra?: Extra): BucketViewFieldBuilder<Bucket["#fieldpath"][K], "model", never>;
24
+ raw(): {
25
+ [K in keyof Bucket['#data']]: BucketViewFieldBuilder<Bucket['#data'][K], 'model'>;
26
+ };
27
+ model<K extends keyof Bucket['#modelpath'], SubModel extends BucketViewFieldBuilderTree>(path: K, submodel?: SubModel): BucketViewFieldBuilder<Bucket["#modelpath"][K], "model", never>;
26
28
  computed<Fn extends $BucketViewFieldFn<TrxNode<Space, Module, Space['authnUsers']>, Bucket>>(fn: Fn): BucketViewFieldBuilder<ComputedData<Fn, ReturnType<Fn>>, "computed", never>;
27
29
  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}`>;
28
30
  drive<F extends DriveFieldpath<Bucket>>(path: F): BucketViewFieldBuilder<string, "drive", never>;
@@ -36,12 +38,14 @@ export declare class BucketViewFieldFactory<Space extends $Space, Module extends
36
38
  * */
37
39
  export declare class BucketViewFieldBuilder<Data, Scope extends $BucketViewField['scope'], GraphLink extends string = never> {
38
40
  protected scope: $BucketViewField['scope'];
39
- protected value: $BucketViewFieldValue;
40
- protected extra?: BucketViewFieldBuilderTree | undefined;
41
- protected type: $BucketViewField['type'];
42
- constructor(scope: $BucketViewField['scope'], value: $BucketViewFieldValue, extra?: BucketViewFieldBuilderTree | undefined);
43
- static build(builder: BucketViewFieldBuilder<any, any>, model: $BucketModel, graph: $BucketGraph, views: $BucketViews, name: string): $BucketViewField;
44
- static buildFields(fields: BucketViewFieldBuilderTree, model: $BucketModel, graph: $BucketGraph, views: $BucketViews): $BucketViewFields;
41
+ protected meta: $BucketViewFieldMeta;
42
+ protected submodel?: BucketViewFieldBuilderTree | undefined;
43
+ $b: "view.field";
44
+ protected _chain?: BucketViewFieldBuilder<any, any, any>;
45
+ constructor(scope: $BucketViewField['scope'], meta: $BucketViewFieldMeta, submodel?: BucketViewFieldBuilderTree | undefined);
46
+ chain<Fn extends $BucketViewFieldFn<any, any>>(fn: Fn): void;
47
+ static build(builder: BucketViewFieldBuilder<any, any>, model: $BucketModel, graph: $BucketGraph, views: $BucketViews, name: string, n_indexes: number): $BucketViewField;
48
+ static buildFields(fields: BucketViewFieldBuilderTree, model: $BucketModel, graph: $BucketGraph, views: $BucketViews, n_indexes?: number): $BucketViewFields;
45
49
  }
46
50
  export type BucketViewFieldBuilderTree = {
47
51
  [x: string]: BucketViewFieldBuilder<any, any, any> | BucketViewFieldBuilderTree;
@@ -4,7 +4,6 @@ exports.BucketViewFieldBuilder = exports.BucketViewFieldFactory = void 0;
4
4
  const error_1 = require("../../../../engine/data/error");
5
5
  const bucket_view_schema_1 = require("./bucket_view.schema");
6
6
  const bucket_model_schema_1 = require("../model/bucket_model.schema");
7
- const bucket_model_convert_1 = require("../model/bucket_model.convert");
8
7
  /*
9
8
  Factory
10
9
  */
@@ -16,12 +15,17 @@ class BucketViewFieldFactory {
16
15
  constructor(_view) {
17
16
  this._view = _view;
18
17
  }
19
- model(key, extra) {
18
+ raw() {
19
+ return {
20
+ __raw: {}
21
+ };
22
+ }
23
+ model(path, submodel) {
20
24
  return new BucketViewFieldBuilder('model', {
21
25
  model: {
22
- key: key.replace(/\.__dict/g, '')
26
+ path: path
23
27
  }
24
- }, extra);
28
+ }, submodel);
25
29
  }
26
30
  computed(fn) {
27
31
  return new BucketViewFieldBuilder('computed', {
@@ -59,7 +63,7 @@ class BucketViewFieldFactory {
59
63
  };
60
64
  }
61
65
  static group(name, children) {
62
- return new bucket_view_schema_1.$BucketViewField(name, 'group', 'obj', name, false, true, { group: {} }, children);
66
+ return new bucket_view_schema_1.$BucketViewField(name, 'group', name, {}, children);
63
67
  }
64
68
  }
65
69
  exports.BucketViewFieldFactory = BucketViewFieldFactory;
@@ -71,59 +75,67 @@ exports.BucketViewFieldFactory = BucketViewFieldFactory;
71
75
  * @subcategory Entity
72
76
  * */
73
77
  class BucketViewFieldBuilder {
74
- constructor(scope, value, extra) {
78
+ constructor(scope, meta, submodel) {
75
79
  this.scope = scope;
76
- this.value = value;
77
- this.extra = extra;
78
- this.type = 'unknown';
79
- this.type = 'unknown';
80
+ this.meta = meta;
81
+ this.submodel = submodel;
82
+ this.$b = 'view.field';
83
+ }
84
+ chain(fn) {
85
+ this._chain = new BucketViewFieldBuilder('computed', {
86
+ computed: {
87
+ fn: fn
88
+ }
89
+ });
80
90
  }
81
91
  // Build
82
- static build(builder, model, graph, views, name) {
83
- let type = 'unknown';
84
- let array = 'unknown';
85
- let required = true;
92
+ static build(builder, model, graph, views, name, n_indexes) {
86
93
  let children = undefined;
94
+ const chain = builder._chain;
87
95
  if (builder.scope === 'model') {
88
- const modelField = bucket_model_schema_1.$BucketModel.get(model, builder.value.model.key);
89
- if (!modelField) {
90
- throw error_1.NesoiError.Builder.Bucket.UnknownModelField(builder.value.model.key);
96
+ const path = builder.meta.model.path;
97
+ const spread_n = path.match(/\.\*(\.|$)/g)?.length || 0;
98
+ if (spread_n === 0 && builder.submodel) {
99
+ throw new Error('Submodels can only be specified for modelpaths with at least one \'*\'');
91
100
  }
92
- type = modelField.type;
93
- array = builder.value.model.key.endsWith('.#') || modelField.array;
94
- required = modelField.required;
95
- if (modelField.meta?.enum) {
96
- builder.value.model.enumOptions = modelField.meta.enum.options;
101
+ // Check if indexes are valid
102
+ // $0, $1, $2.. should be up to n_indexes
103
+ const path_indexes = path.match(/\.\$\d+(\.|$)/g)?.map(d => parseInt(d.slice(2))) || [];
104
+ if (Math.max(...path_indexes) >= n_indexes) {
105
+ if (n_indexes === 0) {
106
+ throw new Error('Index $ can only be specified inside a submodel');
107
+ }
108
+ throw new Error(`Maximum index allowed: $${n_indexes - 1}`);
97
109
  }
98
- if (modelField.children) {
99
- const path = builder.value.model.key + ((modelField.array || modelField.type === 'dict') ? '.#' : '');
100
- const fromModel = (0, bucket_model_convert_1.convertToView)(model, '', modelField.children, path).fields;
101
- children = Object.assign({}, fromModel);
110
+ // Retrieve one or more BucketModelFields referenced by a modelpath.
111
+ // (It's only more than one when using unions)
112
+ // The field itself is not used, but serves to validate that the modelpath exists.
113
+ const modelFields = bucket_model_schema_1.$BucketModel.getField(model, path);
114
+ if (!modelFields.length) {
115
+ throw error_1.NesoiError.Builder.Bucket.UnknownModelField(builder.meta.model.path);
102
116
  }
103
- if (builder.extra) {
104
- const extra = this.buildFields(builder.extra, model, graph, views);
105
- children = Object.assign({}, children, extra);
117
+ // If there's a submodel, add it as children
118
+ if (builder.submodel) {
119
+ const overrides = this.buildFields(builder.submodel, model, graph, views, n_indexes + spread_n);
120
+ children = Object.assign({}, children, overrides);
106
121
  }
107
122
  }
108
123
  else if (builder.scope === 'graph') {
109
- const graphLink = builder.value.graph.link ? graph.links[builder.value.graph.link] : undefined;
124
+ const graphLink = builder.meta.graph.link ? graph.links[builder.meta.graph.link] : undefined;
110
125
  if (!graphLink) {
111
- throw error_1.NesoiError.Builder.Bucket.UnknownGraphLink(builder.value.graph.link || '');
126
+ throw error_1.NesoiError.Builder.Bucket.UnknownGraphLink(builder.meta.graph.link || '');
112
127
  }
113
- array = graphLink.many;
114
128
  }
115
129
  else if (builder.scope === 'view') {
116
- const view = builder.value.view?.view ? views[builder.value.view?.view] : undefined;
130
+ const view = builder.meta.view?.view ? views[builder.meta.view?.view] : undefined;
117
131
  if (!view) {
118
- throw error_1.NesoiError.Builder.Bucket.UnknownViewName(builder.value.view?.view || '');
132
+ throw error_1.NesoiError.Builder.Bucket.UnknownViewName(builder.meta.view?.view || '');
119
133
  }
120
- type = 'obj';
121
- array = false;
122
134
  children = view.fields;
123
135
  }
124
- return new bucket_view_schema_1.$BucketViewField(name, builder.scope, type, name, array, required, builder.value, children);
136
+ return new bucket_view_schema_1.$BucketViewField(name, builder.scope, name, builder.meta, children, chain);
125
137
  }
126
- static buildFields(fields, model, graph, views) {
138
+ static buildFields(fields, model, graph, views, n_indexes = 0) {
127
139
  const schema = {};
128
140
  // Extended fields inherit from other views
129
141
  if ('__ext' in fields) {
@@ -134,15 +146,18 @@ class BucketViewFieldBuilder {
134
146
  if (f === '__ext') {
135
147
  continue;
136
148
  }
149
+ if (f === '__raw') {
150
+ schema['__raw'] = {};
151
+ }
137
152
  const field = fields[f];
138
153
  // Normal fields are built here
139
154
  if (field instanceof BucketViewFieldBuilder) {
140
- schema[f] = BucketViewFieldBuilder.build(field, model, graph, views, f);
155
+ schema[f] = BucketViewFieldBuilder.build(field, model, graph, views, f, n_indexes);
141
156
  }
142
157
  // Builders are allowed to implicitly declare nested fields.
143
158
  // The code below transforms these groups into fields of the scope 'group'.
144
159
  else {
145
- const children = BucketViewFieldBuilder.buildFields(field, model, graph, views);
160
+ const children = BucketViewFieldBuilder.buildFields(field, model, graph, views, n_indexes);
146
161
  schema[f] = BucketViewFieldFactory.group(f, children);
147
162
  }
148
163
  }
@@ -16,17 +16,7 @@ export declare class MessageBuilder<Space extends $Space, Module extends $Module
16
16
  private _template;
17
17
  constructor(module: string, name: string);
18
18
  as(alias: string): this;
19
- template<Def extends MessageTemplateDef<Space, Module, Message['name']>>($: Def): MessageBuilder<Space, Module, $MessageInfer<Message["name"], Def, ReturnType<Def>, import("./message.infer").$MessageInputInfer<ReturnType<Def>, ReturnType<Def> extends infer T ? { [K in keyof T]: ReturnType<Def>[K] extends import("./template/message_template_field.builder").MessageTemplateFieldBuilder<any, any, infer I, any, any, infer Opt extends [undefined, undefined], infer Nul extends [null, null]> ? {
20
- path: `${K & string}${keyof I & string}`;
21
- data: I[keyof I];
22
- opt: Opt[0];
23
- nul: Nul[0];
24
- } : never; } : never>, import("./message.infer").$MessageOutputInfer<ReturnType<Def>, ReturnType<Def> extends infer T_1 ? { [K_1 in keyof T_1]: ReturnType<Def>[K_1] extends import("./template/message_template_field.builder").MessageTemplateFieldBuilder<any, any, any, infer O, any, infer Opt_1 extends [undefined, undefined], infer Nul_1 extends [null, null]> ? {
25
- path: `${K_1 & string}${keyof O & string}`;
26
- data: O[keyof O];
27
- opt: Opt_1[1];
28
- nul: Nul_1[1];
29
- } : never; } : never>>>;
19
+ template<Def extends MessageTemplateDef<Space, Module, Message['name']>>($: Def): MessageBuilder<Space, Module, $MessageInfer<Message["name"], Def, ReturnType<Def>, import("./message.infer").$MessageInputInfer<ReturnType<Def>>, import("./message.infer").$MessageOutputInfer<ReturnType<Def>>>>;
30
20
  static build(node: MessageBuilderNode, tree: ModuleTree, module: $Module): $Message;
31
21
  static buildInlines(node: ResolvedBuilderNode, tree: ModuleTree, module: $Module): Record<string, $Message>;
32
22
  }
@@ -2,39 +2,15 @@ import { MessageTemplateFieldBuilder, MessageTemplateFieldBuilders } from './tem
2
2
  import { MessageTemplateDef } from './template/message_template.builder';
3
3
  import { $Module } from "../../../schema";
4
4
  import { $Message } from './message.schema';
5
- export type $MessageInputInfer<Builder, Fields extends Record<string, {
6
- path: any;
7
- data: any;
8
- opt: any;
9
- nul: any;
10
- }> = {
11
- [K in keyof Builder]: Builder[K] extends MessageTemplateFieldBuilder<any, any, infer I, any, any, infer Opt, infer Nul> ? {
12
- path: `${K & string}${keyof I & string}`;
13
- data: I[keyof I];
14
- opt: Opt[0];
15
- nul: Nul[0];
16
- } : never;
17
- }> = {
18
- [K in keyof Fields as Fields[K]['opt'] extends never ? Fields[K]['path'] : never]: Fields[K]['data'] | Fields[K]['nul'];
5
+ export type $MessageInputInfer<Fields extends MessageTemplateFieldBuilders> = {
6
+ [K in keyof Fields as Fields[K]['#optional'][0] extends true ? never : `${K & string}${Fields[K]['#input_suffix']}`]: Fields[K]['#input'];
19
7
  } & {
20
- [K in keyof Fields as Fields[K]['opt'] extends never ? never : Fields[K]['path']]?: Fields[K]['data'] | Fields[K]['nul'];
8
+ [K in keyof Fields as Fields[K]['#optional'][0] extends true ? `${K & string}${Fields[K]['#input_suffix']}` : never]?: Fields[K]['#input'];
21
9
  };
22
- export type $MessageOutputInfer<Builder, Fields extends Record<string, {
23
- path: any;
24
- data: any;
25
- opt: any;
26
- nul: any;
27
- }> = {
28
- [K in keyof Builder]: Builder[K] extends MessageTemplateFieldBuilder<any, any, any, infer O, any, infer Opt, infer Nul> ? {
29
- path: `${K & string}${keyof O & string}`;
30
- data: O[keyof O];
31
- opt: Opt[1];
32
- nul: Nul[1];
33
- } : never;
34
- }> = {
35
- [K in keyof Fields as Fields[K]['opt'] extends never ? Fields[K]['path'] : never]: Fields[K]['data'] | Fields[K]['nul'];
10
+ export type $MessageOutputInfer<Fields extends MessageTemplateFieldBuilders> = {
11
+ [K in keyof Fields as Fields[K]['#optional'][1] extends true ? never : K]: Fields[K]['#output'];
36
12
  } & {
37
- [K in keyof Fields as Fields[K]['opt'] extends never ? never : Fields[K]['path']]?: Fields[K]['data'] | Fields[K]['nul'];
13
+ [K in keyof Fields as Fields[K]['#optional'][1] extends true ? K : never]?: Fields[K]['#output'];
38
14
  };
39
15
  export interface $MessageInfer<Name extends string, Def extends MessageTemplateDef<any, any, any>, Builders extends MessageTemplateFieldBuilders = ReturnType<Def>, Raw = $MessageInputInfer<Builders>, Parsed = $MessageOutputInfer<Builders>> extends $Message {
40
16
  name: Name;
@@ -25,7 +25,7 @@ class $Message {
25
25
  if (field.type === 'id') {
26
26
  str += `(${field.meta.id.bucket.refName})`;
27
27
  }
28
- if (field.type === 'enum') {
28
+ else if (field.type === 'enum') {
29
29
  const options = field.meta.enum.options;
30
30
  if (typeof options === 'object') {
31
31
  str += `(${Object.keys(options)})`;
@@ -34,7 +34,7 @@ class $Message {
34
34
  str += `(${options})`;
35
35
  }
36
36
  }
37
- if (field.array) {
37
+ else if (field.type === 'list') {
38
38
  str += '[]';
39
39
  }
40
40
  str += '\n';
@@ -17,7 +17,7 @@ class MessageTemplateBuilder {
17
17
  }
18
18
  /// Build
19
19
  static build(builder, tree, module) {
20
- const fields = message_template_field_builder_1.MessageTemplateFieldBuilder.buildChildren(builder._fields, tree, module);
20
+ const fields = message_template_field_builder_1.MessageTemplateFieldBuilder.buildMany(builder._fields, tree, module);
21
21
  return new message_template_schema_1.$MessageTemplate(fields);
22
22
  }
23
23
  }
@@ -47,23 +47,16 @@ export declare class $MessageTemplateField {
47
47
  name: string;
48
48
  /** A human name for the field */
49
49
  alias: string;
50
- /** A human name for the field union, assigned before the type.
51
- * This is only relevant when using .obj.or, to allow for different
52
- * aliases for the union and the root object */
53
- preAlias: string;
54
50
  /** The absolute path for reading the field value on the raw object */
55
- path_raw: string;
51
+ pathRaw: string;
56
52
  /** The absolute path for writing the field value on the parsed object */
57
- path_parsed: string;
58
- array: boolean;
53
+ pathParsed: string;
59
54
  required: boolean;
60
55
  defaultValue: any;
61
56
  nullable: boolean;
62
57
  rules: $MessageTemplateRule[];
63
- arrayRules: $MessageTemplateRule[];
64
58
  meta: $MessageTemplateFieldMeta;
65
59
  children?: $MessageTemplateFields | undefined;
66
- or?: $MessageTemplateField | undefined;
67
60
  '#raw': unknown;
68
61
  '#parsed': unknown;
69
62
  $t: string;
@@ -77,14 +70,15 @@ export declare class $MessageTemplateField {
77
70
  name: string,
78
71
  /** A human name for the field */
79
72
  alias: string,
80
- /** A human name for the field union, assigned before the type.
81
- * This is only relevant when using .obj.or, to allow for different
82
- * aliases for the union and the root object */
83
- preAlias: string,
84
73
  /** The absolute path for reading the field value on the raw object */
85
- path_raw: string,
74
+ pathRaw: string,
86
75
  /** The absolute path for writing the field value on the parsed object */
87
- path_parsed: string, array: boolean, required: boolean, defaultValue: any, nullable: boolean, rules: $MessageTemplateRule[], arrayRules: $MessageTemplateRule[], meta: $MessageTemplateFieldMeta, children?: $MessageTemplateFields | undefined, or?: $MessageTemplateField | undefined);
76
+ pathParsed: string, required: boolean, defaultValue: any, nullable: boolean, rules: $MessageTemplateRule[], meta: $MessageTemplateFieldMeta, children?: $MessageTemplateFields | undefined);
77
+ /**
78
+ * Warning: this does not clone the field's children or union.
79
+ * @returns
80
+ */
81
+ static clone(schema: $MessageTemplateField): $MessageTemplateField;
88
82
  }
89
83
  export type $MessageTemplateFields = {
90
84
  [x: string]: $MessageTemplateField;
@@ -98,4 +92,5 @@ export declare class $MessageTemplate {
98
92
  $t: string;
99
93
  constructor(fields?: $MessageTemplateFields);
100
94
  static fieldsOfType(template: $MessageTemplate, type: $MessageTemplateFieldType): $MessageTemplateField[];
95
+ static forEachField(template: $MessageTemplate, predicate: (field: $MessageTemplateField, path: string) => void): void;
101
96
  }
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.$MessageTemplate = exports.$MessageTemplateField = void 0;
4
+ const deep_1 = require("../../../../engine/util/deep");
4
5
  /**
5
6
  * @category Schemas
6
7
  * @subcategory Entity
@@ -16,31 +17,30 @@ class $MessageTemplateField {
16
17
  name,
17
18
  /** A human name for the field */
18
19
  alias,
19
- /** A human name for the field union, assigned before the type.
20
- * This is only relevant when using .obj.or, to allow for different
21
- * aliases for the union and the root object */
22
- preAlias,
23
20
  /** The absolute path for reading the field value on the raw object */
24
- path_raw,
21
+ pathRaw,
25
22
  /** The absolute path for writing the field value on the parsed object */
26
- path_parsed, array, required, defaultValue, nullable, rules, arrayRules, meta, children, or) {
23
+ pathParsed, required, defaultValue, nullable, rules, meta, children) {
27
24
  this.type = type;
28
25
  this.name = name;
29
26
  this.alias = alias;
30
- this.preAlias = preAlias;
31
- this.path_raw = path_raw;
32
- this.path_parsed = path_parsed;
33
- this.array = array;
27
+ this.pathRaw = pathRaw;
28
+ this.pathParsed = pathParsed;
34
29
  this.required = required;
35
30
  this.defaultValue = defaultValue;
36
31
  this.nullable = nullable;
37
32
  this.rules = rules;
38
- this.arrayRules = arrayRules;
39
33
  this.meta = meta;
40
34
  this.children = children;
41
- this.or = or;
42
35
  this.$t = 'message.template.field';
43
36
  }
37
+ /**
38
+ * Warning: this does not clone the field's children or union.
39
+ * @returns
40
+ */
41
+ static clone(schema) {
42
+ return new $MessageTemplateField(schema.type, schema.name, schema.alias, schema.pathRaw, schema.pathParsed, schema.required, schema.defaultValue, schema.nullable, [...schema.rules], deep_1.Deep.copy(schema.meta), undefined);
43
+ }
44
44
  }
45
45
  exports.$MessageTemplateField = $MessageTemplateField;
46
46
  /**
@@ -69,5 +69,22 @@ class $MessageTemplate {
69
69
  }
70
70
  return fields;
71
71
  }
72
+ static forEachField(template, predicate) {
73
+ let poll = Object.entries(template.fields).map(([path, field]) => ({ path, field }));
74
+ while (poll.length) {
75
+ const next = [];
76
+ for (const obj of poll) {
77
+ predicate(obj.field, obj.path);
78
+ if (obj.field.children) {
79
+ next.push(...Object.values(obj.field.children)
80
+ .map((field, i) => ({
81
+ field,
82
+ path: obj.path + '.' + (obj.field.type === 'union' ? i : field.name)
83
+ })));
84
+ }
85
+ }
86
+ poll = next;
87
+ }
88
+ }
72
89
  }
73
90
  exports.$MessageTemplate = $MessageTemplate;