@milaboratories/pl-tree 1.8.47 → 1.8.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +29 -0
  2. package/dist/accessors.cjs +236 -273
  3. package/dist/accessors.cjs.map +1 -1
  4. package/dist/accessors.d.ts +93 -93
  5. package/dist/accessors.js +235 -271
  6. package/dist/accessors.js.map +1 -1
  7. package/dist/dump.cjs +79 -80
  8. package/dist/dump.cjs.map +1 -1
  9. package/dist/dump.d.ts +16 -18
  10. package/dist/dump.js +79 -79
  11. package/dist/dump.js.map +1 -1
  12. package/dist/index.cjs +31 -35
  13. package/dist/index.d.ts +10 -10
  14. package/dist/index.js +9 -8
  15. package/dist/snapshot.cjs +50 -71
  16. package/dist/snapshot.cjs.map +1 -1
  17. package/dist/snapshot.d.ts +36 -38
  18. package/dist/snapshot.js +49 -69
  19. package/dist/snapshot.js.map +1 -1
  20. package/dist/state.cjs +487 -624
  21. package/dist/state.cjs.map +1 -1
  22. package/dist/state.d.ts +117 -116
  23. package/dist/state.js +486 -622
  24. package/dist/state.js.map +1 -1
  25. package/dist/sync.cjs +113 -133
  26. package/dist/sync.cjs.map +1 -1
  27. package/dist/sync.d.ts +37 -33
  28. package/dist/sync.js +111 -131
  29. package/dist/sync.js.map +1 -1
  30. package/dist/synchronized_tree.cjs +167 -232
  31. package/dist/synchronized_tree.cjs.map +1 -1
  32. package/dist/synchronized_tree.d.ts +66 -68
  33. package/dist/synchronized_tree.js +165 -211
  34. package/dist/synchronized_tree.js.map +1 -1
  35. package/dist/traversal_ops.d.ts +42 -42
  36. package/dist/value_and_error.cjs +9 -12
  37. package/dist/value_and_error.cjs.map +1 -1
  38. package/dist/value_and_error.d.ts +8 -5
  39. package/dist/value_and_error.js +9 -11
  40. package/dist/value_and_error.js.map +1 -1
  41. package/dist/value_or_error.d.ts +8 -5
  42. package/package.json +9 -9
  43. package/src/synchronized_tree.ts +10 -5
  44. package/dist/accessors.d.ts.map +0 -1
  45. package/dist/dump.d.ts.map +0 -1
  46. package/dist/index.cjs.map +0 -1
  47. package/dist/index.d.ts.map +0 -1
  48. package/dist/index.js.map +0 -1
  49. package/dist/snapshot.d.ts.map +0 -1
  50. package/dist/state.d.ts.map +0 -1
  51. package/dist/sync.d.ts.map +0 -1
  52. package/dist/synchronized_tree.d.ts.map +0 -1
  53. package/dist/test_utils.d.ts +0 -25
  54. package/dist/test_utils.d.ts.map +0 -1
  55. package/dist/traversal_ops.d.ts.map +0 -1
  56. package/dist/value_and_error.d.ts.map +0 -1
  57. package/dist/value_or_error.d.ts.map +0 -1
package/dist/accessors.js CHANGED
@@ -1,288 +1,252 @@
1
- import { resourceIdToString, resourceTypesEqual, resourceTypeToString } from '@milaboratories/pl-client';
2
- import { mapValueAndError } from './value_and_error.js';
3
- import { parsePlError } from '@milaboratories/pl-errors';
4
- import { notEmpty } from '@milaboratories/ts-helpers';
1
+ import { mapValueAndError } from "./value_and_error.js";
2
+ import { resourceIdToString, resourceTypeToString, resourceTypesEqual } from "@milaboratories/pl-client";
3
+ import { parsePlError } from "@milaboratories/pl-errors";
4
+ import { notEmpty } from "@milaboratories/ts-helpers";
5
5
 
6
+ //#region src/accessors.ts
6
7
  /** Error encountered during traversal in field or resource. */
7
- class PlError extends Error {
8
- constructor(message) {
9
- super(message);
10
- }
11
- }
8
+ var PlError = class extends Error {
9
+ constructor(message) {
10
+ super(message);
11
+ }
12
+ };
12
13
  function isPlTreeEntry(obj) {
13
- return (typeof obj === "object" &&
14
- obj !== null &&
15
- obj["__pl_tree_type_marker__"] === "PlTreeEntry");
14
+ return typeof obj === "object" && obj !== null && obj["__pl_tree_type_marker__"] === "PlTreeEntry";
16
15
  }
17
16
  function isPlTreeEntryAccessor(obj) {
18
- return (typeof obj === "object" &&
19
- obj !== null &&
20
- obj["__pl_tree_type_marker__"] === "PlTreeEntryAccessor");
17
+ return typeof obj === "object" && obj !== null && obj["__pl_tree_type_marker__"] === "PlTreeEntryAccessor";
21
18
  }
22
19
  function isPlTreeNodeAccessor(obj) {
23
- return (typeof obj === "object" &&
24
- obj !== null &&
25
- obj["__pl_tree_type_marker__"] === "PlTreeNodeAccessor");
20
+ return typeof obj === "object" && obj !== null && obj["__pl_tree_type_marker__"] === "PlTreeNodeAccessor";
26
21
  }
27
22
  /** Main entry point for using PlTree in reactive setting */
28
- class PlTreeEntry {
29
- accessorData;
30
- rid;
31
- __pl_tree_type_marker__ = "PlTreeEntry";
32
- constructor(accessorData, rid) {
33
- this.accessorData = accessorData;
34
- this.rid = rid;
35
- }
36
- createAccessor(ctx, guard) {
37
- return new PlTreeEntryAccessor(this.accessorData, this.accessorData.treeProvider(), this.rid, {
38
- ctx,
39
- guard,
40
- });
41
- }
42
- toJSON() {
43
- return this.toString();
44
- }
45
- toString() {
46
- return `[ENTRY:${resourceIdToString(this.rid)}]`;
47
- }
48
- }
23
+ var PlTreeEntry = class {
24
+ __pl_tree_type_marker__ = "PlTreeEntry";
25
+ constructor(accessorData, rid) {
26
+ this.accessorData = accessorData;
27
+ this.rid = rid;
28
+ }
29
+ createAccessor(ctx, guard) {
30
+ return new PlTreeEntryAccessor(this.accessorData, this.accessorData.treeProvider(), this.rid, {
31
+ ctx,
32
+ guard
33
+ });
34
+ }
35
+ toJSON() {
36
+ return this.toString();
37
+ }
38
+ toString() {
39
+ return `[ENTRY:${resourceIdToString(this.rid)}]`;
40
+ }
41
+ };
49
42
  function getResourceFromTree(accessorData, tree, instanceData, rid, ops) {
50
- const acc = new PlTreeNodeAccessor(accessorData, tree, tree.get(instanceData.ctx.watcher, rid), instanceData);
51
- if (!ops.ignoreError) {
52
- const err = acc.getError();
53
- if (err !== undefined)
54
- throw parsePlError(notEmpty(err.getDataAsString()), acc.id, acc.resourceType);
55
- }
56
- if (ops.assertResourceType !== undefined &&
57
- (Array.isArray(ops.assertResourceType)
58
- ? ops.assertResourceType.findIndex((rt) => resourceTypesEqual(rt, acc.resourceType)) === -1
59
- : !resourceTypesEqual(ops.assertResourceType, acc.resourceType)))
60
- throw new Error(
61
- // eslint-disable-next-line @typescript-eslint/no-base-to-string
62
- `wrong resource type ${resourceTypeToString(acc.resourceType)} but expected ${ops.assertResourceType}`);
63
- return acc;
64
- }
65
- class PlTreeEntryAccessor {
66
- accessorData;
67
- tree;
68
- rid;
69
- instanceData;
70
- __pl_tree_type_marker__ = "PlTreeEntryAccessor";
71
- constructor(accessorData, tree, rid, instanceData) {
72
- this.accessorData = accessorData;
73
- this.tree = tree;
74
- this.rid = rid;
75
- this.instanceData = instanceData;
76
- }
77
- node(ops = {}) {
78
- this.instanceData.guard();
79
- // this is the only entry point to acquire a PlTreeNodeAccessor,
80
- // so this is the only point where we should attach the hooks
81
- if (this.accessorData.hooks !== undefined)
82
- this.instanceData.ctx.attacheHooks(this.accessorData.hooks);
83
- return getResourceFromTree(this.accessorData, this.tree, this.instanceData, this.rid, ops);
84
- }
43
+ const acc = new PlTreeNodeAccessor(accessorData, tree, tree.get(instanceData.ctx.watcher, rid), instanceData);
44
+ if (!ops.ignoreError) {
45
+ const err = acc.getError();
46
+ if (err !== void 0) throw parsePlError(notEmpty(err.getDataAsString()), acc.id, acc.resourceType);
47
+ }
48
+ if (ops.assertResourceType !== void 0 && (Array.isArray(ops.assertResourceType) ? ops.assertResourceType.findIndex((rt) => resourceTypesEqual(rt, acc.resourceType)) === -1 : !resourceTypesEqual(ops.assertResourceType, acc.resourceType))) throw new Error(`wrong resource type ${resourceTypeToString(acc.resourceType)} but expected ${ops.assertResourceType}`);
49
+ return acc;
85
50
  }
51
+ var PlTreeEntryAccessor = class {
52
+ __pl_tree_type_marker__ = "PlTreeEntryAccessor";
53
+ constructor(accessorData, tree, rid, instanceData) {
54
+ this.accessorData = accessorData;
55
+ this.tree = tree;
56
+ this.rid = rid;
57
+ this.instanceData = instanceData;
58
+ }
59
+ node(ops = {}) {
60
+ this.instanceData.guard();
61
+ if (this.accessorData.hooks !== void 0) this.instanceData.ctx.attacheHooks(this.accessorData.hooks);
62
+ return getResourceFromTree(this.accessorData, this.tree, this.instanceData, this.rid, ops);
63
+ }
64
+ };
86
65
  /**
87
- * Can be called only when a ctx is provided, because pl tree entry is a computable entity.
88
- * @deprecated
89
- * */
66
+ * Can be called only when a ctx is provided, because pl tree entry is a computable entity.
67
+ * @deprecated
68
+ * */
90
69
  function treeEntryToResourceInfo(res, ctx) {
91
- if (res instanceof PlTreeEntry)
92
- return ctx.accessor(res).node().resourceInfo;
93
- return res;
70
+ if (res instanceof PlTreeEntry) return ctx.accessor(res).node().resourceInfo;
71
+ return res;
94
72
  }
95
73
  /**
96
- * API contracts:
97
- * - API never return {@link NullResourceId}, absence of link is always modeled as `undefined`
98
- *
99
- * Important: never store instances of this class, always get fresh instance from {@link PlTreeState} accessor.
100
- * */
101
- class PlTreeNodeAccessor {
102
- accessorData;
103
- tree;
104
- resource;
105
- instanceData;
106
- __pl_tree_type_marker__ = "PlTreeNodeAccessor";
107
- constructor(accessorData, tree, resource, instanceData) {
108
- this.accessorData = accessorData;
109
- this.tree = tree;
110
- this.resource = resource;
111
- this.instanceData = instanceData;
112
- }
113
- get id() {
114
- this.instanceData.guard();
115
- return this.resource.id;
116
- }
117
- get originalId() {
118
- this.instanceData.guard();
119
- return this.resource.originalResourceId;
120
- }
121
- get resourceType() {
122
- this.instanceData.guard();
123
- return this.resource.type;
124
- }
125
- get resourceInfo() {
126
- return { id: this.id, type: this.resourceType };
127
- }
128
- getResourceFromTree(rid, ops) {
129
- return getResourceFromTree(this.accessorData, this.tree, this.instanceData, rid, ops);
130
- }
131
- traverse(...steps) {
132
- return this.traverseWithCommon({}, ...steps);
133
- }
134
- traverseOrError(...steps) {
135
- return this.traverseOrErrorWithCommon({}, ...steps);
136
- }
137
- traverseWithCommon(commonOptions, ...steps) {
138
- const result = this.traverseOrErrorWithCommon(commonOptions, ...steps);
139
- if (result === undefined)
140
- return undefined;
141
- if (!result.ok)
142
- throw result.error;
143
- return result.value;
144
- }
145
- traverseOrErrorWithCommon(commonOptions, ...steps) {
146
- // eslint-disable-next-line @typescript-eslint/no-this-alias
147
- let current = this;
148
- for (const _step of steps) {
149
- const step = typeof _step === "string"
150
- ? {
151
- ...commonOptions,
152
- field: _step,
153
- }
154
- : { ...commonOptions, ..._step };
155
- const next = current.getField(_step);
156
- if (next === undefined)
157
- return undefined;
158
- if (step.pureFieldErrorToUndefined && next.value === undefined && next.error !== undefined)
159
- return undefined;
160
- if ((!step.ignoreError || next.value === undefined) && next.error !== undefined)
161
- return {
162
- ok: false,
163
- // FIXME: in next tickets we'll allow Errors to be thrown.
164
- error: parsePlError(notEmpty(next.error.getDataAsString()), current.id, current.resourceType, step.field),
165
- };
166
- if (next.value === undefined) {
167
- if (step.errorIfFieldNotSet)
168
- return {
169
- ok: false,
170
- error: new Error(`field have no assigned value ${step.field} of ${resourceIdToString(current.id)}`),
171
- };
172
- // existing but unpopulated field is unstable because it must be resolved at some point
173
- this.onUnstableLambda("unpopulated_field:" + step.field);
174
- return undefined;
175
- }
176
- current = next.value;
177
- }
178
- return { ok: true, value: current };
179
- }
180
- onUnstableLambda = (marker) => {
181
- this.instanceData.ctx.markUnstable(marker);
182
- };
183
- getField(_step) {
184
- this.instanceData.guard();
185
- const step = typeof _step === "string" ? { field: _step } : _step;
186
- const ve = this.resource.getField(this.instanceData.ctx.watcher, step, this.onUnstableLambda);
187
- if (ve === undefined)
188
- return undefined;
189
- return mapValueAndError(ve, (rid) => this.getResourceFromTree(rid, { ignoreError: true }));
190
- }
191
- getInputsLocked() {
192
- this.instanceData.guard();
193
- const result = this.resource.getInputsLocked(this.instanceData.ctx.watcher);
194
- if (!result)
195
- this.instanceData.ctx.markUnstable("inputs_unlocked:" + this.resourceType.name);
196
- return result;
197
- }
198
- getOutputsLocked() {
199
- this.instanceData.guard();
200
- const result = this.resource.getOutputsLocked(this.instanceData.ctx.watcher);
201
- if (!result)
202
- this.instanceData.ctx.markUnstable("outputs_unlocked:" + this.resourceType.name);
203
- return result;
204
- }
205
- getIsReadyOrError() {
206
- this.instanceData.guard();
207
- const result = this.resource.getIsReadyOrError(this.instanceData.ctx.watcher);
208
- if (!result)
209
- this.instanceData.ctx.markUnstable("not_ready:" + this.resourceType.name);
210
- return result;
211
- }
212
- getIsFinal() {
213
- this.instanceData.guard();
214
- return this.resource.getIsFinal(this.instanceData.ctx.watcher);
215
- }
216
- getError() {
217
- this.instanceData.guard();
218
- const rid = this.resource.getError(this.instanceData.ctx.watcher);
219
- if (rid === undefined)
220
- // absence of error always considered as stable
221
- return undefined;
222
- return this.getResourceFromTree(rid, {});
223
- }
224
- getData() {
225
- return this.resource.data;
226
- }
227
- getDataAsString() {
228
- return this.resource.getDataAsString();
229
- }
230
- getDataAsJson() {
231
- return this.resource.getDataAsJson();
232
- }
233
- listInputFields() {
234
- this.instanceData.guard();
235
- this.getInputsLocked(); // will set unstable if not locked
236
- return this.resource.listInputFields(this.instanceData.ctx.watcher);
237
- }
238
- listOutputFields() {
239
- this.instanceData.guard();
240
- this.getOutputsLocked(); // will set unstable if not locked
241
- return this.resource.listOutputFields(this.instanceData.ctx.watcher);
242
- }
243
- listDynamicFields() {
244
- this.instanceData.guard();
245
- return this.resource.listDynamicFields(this.instanceData.ctx.watcher);
246
- }
247
- getKeyValue(key, unstableIfNotFound = false) {
248
- this.instanceData.guard();
249
- const result = this.resource.getKeyValue(this.instanceData.ctx.watcher, key);
250
- if (result === undefined && unstableIfNotFound)
251
- this.instanceData.ctx.markUnstable("key_not_found_b:" + key);
252
- return result;
253
- }
254
- /** @deprecated */
255
- getKeyValueString(key) {
256
- return this.getKeyValueAsString(key);
257
- }
258
- getKeyValueAsString(key, unstableIfNotFound = false) {
259
- this.instanceData.guard();
260
- const result = this.resource.getKeyValueString(this.instanceData.ctx.watcher, key);
261
- if (result === undefined && unstableIfNotFound)
262
- this.instanceData.ctx.markUnstable("key_not_found_s:" + key);
263
- return result;
264
- }
265
- getKeyValueAsJson(key, unstableIfNotFound = false) {
266
- const result = this.resource.getKeyValueAsJson(this.instanceData.ctx.watcher, key);
267
- if (result === undefined) {
268
- if (unstableIfNotFound)
269
- this.instanceData.ctx.markUnstable("key_not_found_j:" + key);
270
- return undefined;
271
- }
272
- return result;
273
- }
274
- /**
275
- * Can be used to pass a higher level accessor that will wrap the resource and throw its
276
- * errors on node resolution.
277
- * */
278
- toEntryAccessor() {
279
- return new PlTreeEntryAccessor(this.accessorData, this.tree, this.id, this.instanceData);
280
- }
281
- /** Can be passed to nested computable. */
282
- persist() {
283
- return new PlTreeEntry(this.accessorData, this.resource.id);
284
- }
285
- }
74
+ * API contracts:
75
+ * - API never return {@link NullResourceId}, absence of link is always modeled as `undefined`
76
+ *
77
+ * Important: never store instances of this class, always get fresh instance from {@link PlTreeState} accessor.
78
+ * */
79
+ var PlTreeNodeAccessor = class {
80
+ __pl_tree_type_marker__ = "PlTreeNodeAccessor";
81
+ constructor(accessorData, tree, resource, instanceData) {
82
+ this.accessorData = accessorData;
83
+ this.tree = tree;
84
+ this.resource = resource;
85
+ this.instanceData = instanceData;
86
+ }
87
+ get id() {
88
+ this.instanceData.guard();
89
+ return this.resource.id;
90
+ }
91
+ get originalId() {
92
+ this.instanceData.guard();
93
+ return this.resource.originalResourceId;
94
+ }
95
+ get resourceType() {
96
+ this.instanceData.guard();
97
+ return this.resource.type;
98
+ }
99
+ get resourceInfo() {
100
+ return {
101
+ id: this.id,
102
+ type: this.resourceType
103
+ };
104
+ }
105
+ getResourceFromTree(rid, ops) {
106
+ return getResourceFromTree(this.accessorData, this.tree, this.instanceData, rid, ops);
107
+ }
108
+ traverse(...steps) {
109
+ return this.traverseWithCommon({}, ...steps);
110
+ }
111
+ traverseOrError(...steps) {
112
+ return this.traverseOrErrorWithCommon({}, ...steps);
113
+ }
114
+ traverseWithCommon(commonOptions, ...steps) {
115
+ const result = this.traverseOrErrorWithCommon(commonOptions, ...steps);
116
+ if (result === void 0) return void 0;
117
+ if (!result.ok) throw result.error;
118
+ return result.value;
119
+ }
120
+ traverseOrErrorWithCommon(commonOptions, ...steps) {
121
+ let current = this;
122
+ for (const _step of steps) {
123
+ const step = typeof _step === "string" ? {
124
+ ...commonOptions,
125
+ field: _step
126
+ } : {
127
+ ...commonOptions,
128
+ ..._step
129
+ };
130
+ const next = current.getField(_step);
131
+ if (next === void 0) return void 0;
132
+ if (step.pureFieldErrorToUndefined && next.value === void 0 && next.error !== void 0) return void 0;
133
+ if ((!step.ignoreError || next.value === void 0) && next.error !== void 0) return {
134
+ ok: false,
135
+ error: parsePlError(notEmpty(next.error.getDataAsString()), current.id, current.resourceType, step.field)
136
+ };
137
+ if (next.value === void 0) {
138
+ if (step.errorIfFieldNotSet) return {
139
+ ok: false,
140
+ error: /* @__PURE__ */ new Error(`field have no assigned value ${step.field} of ${resourceIdToString(current.id)}`)
141
+ };
142
+ this.onUnstableLambda("unpopulated_field:" + step.field);
143
+ return;
144
+ }
145
+ current = next.value;
146
+ }
147
+ return {
148
+ ok: true,
149
+ value: current
150
+ };
151
+ }
152
+ onUnstableLambda = (marker) => {
153
+ this.instanceData.ctx.markUnstable(marker);
154
+ };
155
+ getField(_step) {
156
+ this.instanceData.guard();
157
+ const step = typeof _step === "string" ? { field: _step } : _step;
158
+ const ve = this.resource.getField(this.instanceData.ctx.watcher, step, this.onUnstableLambda);
159
+ if (ve === void 0) return void 0;
160
+ return mapValueAndError(ve, (rid) => this.getResourceFromTree(rid, { ignoreError: true }));
161
+ }
162
+ getInputsLocked() {
163
+ this.instanceData.guard();
164
+ const result = this.resource.getInputsLocked(this.instanceData.ctx.watcher);
165
+ if (!result) this.instanceData.ctx.markUnstable("inputs_unlocked:" + this.resourceType.name);
166
+ return result;
167
+ }
168
+ getOutputsLocked() {
169
+ this.instanceData.guard();
170
+ const result = this.resource.getOutputsLocked(this.instanceData.ctx.watcher);
171
+ if (!result) this.instanceData.ctx.markUnstable("outputs_unlocked:" + this.resourceType.name);
172
+ return result;
173
+ }
174
+ getIsReadyOrError() {
175
+ this.instanceData.guard();
176
+ const result = this.resource.getIsReadyOrError(this.instanceData.ctx.watcher);
177
+ if (!result) this.instanceData.ctx.markUnstable("not_ready:" + this.resourceType.name);
178
+ return result;
179
+ }
180
+ getIsFinal() {
181
+ this.instanceData.guard();
182
+ return this.resource.getIsFinal(this.instanceData.ctx.watcher);
183
+ }
184
+ getError() {
185
+ this.instanceData.guard();
186
+ const rid = this.resource.getError(this.instanceData.ctx.watcher);
187
+ if (rid === void 0) return void 0;
188
+ return this.getResourceFromTree(rid, {});
189
+ }
190
+ getData() {
191
+ return this.resource.data;
192
+ }
193
+ getDataAsString() {
194
+ return this.resource.getDataAsString();
195
+ }
196
+ getDataAsJson() {
197
+ return this.resource.getDataAsJson();
198
+ }
199
+ listInputFields() {
200
+ this.instanceData.guard();
201
+ this.getInputsLocked();
202
+ return this.resource.listInputFields(this.instanceData.ctx.watcher);
203
+ }
204
+ listOutputFields() {
205
+ this.instanceData.guard();
206
+ this.getOutputsLocked();
207
+ return this.resource.listOutputFields(this.instanceData.ctx.watcher);
208
+ }
209
+ listDynamicFields() {
210
+ this.instanceData.guard();
211
+ return this.resource.listDynamicFields(this.instanceData.ctx.watcher);
212
+ }
213
+ getKeyValue(key, unstableIfNotFound = false) {
214
+ this.instanceData.guard();
215
+ const result = this.resource.getKeyValue(this.instanceData.ctx.watcher, key);
216
+ if (result === void 0 && unstableIfNotFound) this.instanceData.ctx.markUnstable("key_not_found_b:" + key);
217
+ return result;
218
+ }
219
+ /** @deprecated */
220
+ getKeyValueString(key) {
221
+ return this.getKeyValueAsString(key);
222
+ }
223
+ getKeyValueAsString(key, unstableIfNotFound = false) {
224
+ this.instanceData.guard();
225
+ const result = this.resource.getKeyValueString(this.instanceData.ctx.watcher, key);
226
+ if (result === void 0 && unstableIfNotFound) this.instanceData.ctx.markUnstable("key_not_found_s:" + key);
227
+ return result;
228
+ }
229
+ getKeyValueAsJson(key, unstableIfNotFound = false) {
230
+ const result = this.resource.getKeyValueAsJson(this.instanceData.ctx.watcher, key);
231
+ if (result === void 0) {
232
+ if (unstableIfNotFound) this.instanceData.ctx.markUnstable("key_not_found_j:" + key);
233
+ return;
234
+ }
235
+ return result;
236
+ }
237
+ /**
238
+ * Can be used to pass a higher level accessor that will wrap the resource and throw its
239
+ * errors on node resolution.
240
+ * */
241
+ toEntryAccessor() {
242
+ return new PlTreeEntryAccessor(this.accessorData, this.tree, this.id, this.instanceData);
243
+ }
244
+ /** Can be passed to nested computable. */
245
+ persist() {
246
+ return new PlTreeEntry(this.accessorData, this.resource.id);
247
+ }
248
+ };
286
249
 
250
+ //#endregion
287
251
  export { PlError, PlTreeEntry, PlTreeEntryAccessor, PlTreeNodeAccessor, isPlTreeEntry, isPlTreeEntryAccessor, isPlTreeNodeAccessor, treeEntryToResourceInfo };
288
- //# sourceMappingURL=accessors.js.map
252
+ //# sourceMappingURL=accessors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"accessors.js","sources":["../src/accessors.ts"],"sourcesContent":["import type { PlTreeResource, PlTreeState } from \"./state\";\nimport type {\n AccessorProvider,\n ComputableCtx,\n ComputableHooks,\n UsageGuard,\n} from \"@milaboratories/computable\";\nimport type { ResourceId, ResourceType, OptionalResourceId } from \"@milaboratories/pl-client\";\nimport {\n resourceIdToString,\n resourceTypesEqual,\n resourceTypeToString,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n NullResourceId,\n} from \"@milaboratories/pl-client\";\nimport type { ValueAndError } from \"./value_and_error\";\nimport { mapValueAndError } from \"./value_and_error\";\nimport type {\n CommonFieldTraverseOps,\n FieldTraversalStep,\n GetFieldStep,\n ResourceTraversalOps,\n} from \"./traversal_ops\";\nimport type { ValueOrError } from \"./value_or_error\";\nimport { parsePlError } from \"@milaboratories/pl-errors\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\n/** Error encountered during traversal in field or resource. */\nexport class PlError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\nexport type TreeAccessorData = {\n readonly treeProvider: () => PlTreeState;\n readonly hooks?: ComputableHooks;\n};\n\nexport type TreeAccessorInstanceData = {\n readonly guard: UsageGuard;\n readonly ctx: ComputableCtx;\n};\n\nexport function isPlTreeEntry(obj: unknown): obj is PlTreeEntry {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n (obj as any)[\"__pl_tree_type_marker__\"] === \"PlTreeEntry\"\n );\n}\n\nexport function isPlTreeEntryAccessor(obj: unknown): obj is PlTreeEntryAccessor {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n (obj as any)[\"__pl_tree_type_marker__\"] === \"PlTreeEntryAccessor\"\n );\n}\n\nexport function isPlTreeNodeAccessor(obj: unknown): obj is PlTreeNodeAccessor {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n (obj as any)[\"__pl_tree_type_marker__\"] === \"PlTreeNodeAccessor\"\n );\n}\n\n/** Main entry point for using PlTree in reactive setting */\nexport class PlTreeEntry implements AccessorProvider<PlTreeEntryAccessor> {\n private readonly __pl_tree_type_marker__ = \"PlTreeEntry\";\n\n constructor(\n private readonly accessorData: TreeAccessorData,\n public readonly rid: ResourceId,\n ) {}\n\n public createAccessor(ctx: ComputableCtx, guard: UsageGuard): PlTreeEntryAccessor {\n return new PlTreeEntryAccessor(this.accessorData, this.accessorData.treeProvider(), this.rid, {\n ctx,\n guard,\n });\n }\n\n public toJSON(): string {\n return this.toString();\n }\n\n public toString(): string {\n return `[ENTRY:${resourceIdToString(this.rid)}]`;\n }\n}\n\nfunction getResourceFromTree(\n accessorData: TreeAccessorData,\n tree: PlTreeState,\n instanceData: TreeAccessorInstanceData,\n rid: ResourceId,\n ops: ResourceTraversalOps,\n): PlTreeNodeAccessor {\n const acc = new PlTreeNodeAccessor(\n accessorData,\n tree,\n tree.get(instanceData.ctx.watcher, rid),\n instanceData,\n );\n\n if (!ops.ignoreError) {\n const err = acc.getError();\n if (err !== undefined)\n throw parsePlError(notEmpty(err.getDataAsString()), acc.id, acc.resourceType);\n }\n\n if (\n ops.assertResourceType !== undefined &&\n (Array.isArray(ops.assertResourceType)\n ? ops.assertResourceType.findIndex((rt) => resourceTypesEqual(rt, acc.resourceType)) === -1\n : !resourceTypesEqual(ops.assertResourceType, acc.resourceType))\n )\n throw new Error(\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n `wrong resource type ${resourceTypeToString(acc.resourceType)} but expected ${ops.assertResourceType}`,\n );\n\n return acc;\n}\n\nexport class PlTreeEntryAccessor {\n private readonly __pl_tree_type_marker__ = \"PlTreeEntryAccessor\";\n\n constructor(\n private readonly accessorData: TreeAccessorData,\n private readonly tree: PlTreeState,\n private readonly rid: ResourceId,\n private readonly instanceData: TreeAccessorInstanceData,\n ) {}\n\n node(ops: ResourceTraversalOps = {}): PlTreeNodeAccessor {\n this.instanceData.guard();\n\n // this is the only entry point to acquire a PlTreeNodeAccessor,\n // so this is the only point where we should attach the hooks\n if (this.accessorData.hooks !== undefined)\n this.instanceData.ctx.attacheHooks(this.accessorData.hooks);\n\n return getResourceFromTree(this.accessorData, this.tree, this.instanceData, this.rid, ops);\n }\n}\n\n/**\n * Helper type to simplify implementation of APIs requiring type information.\n * */\nexport type ResourceInfo = {\n readonly id: ResourceId;\n readonly type: ResourceType;\n};\n\n/**\n * Can be called only when a ctx is provided, because pl tree entry is a computable entity.\n * @deprecated\n * */\nexport function treeEntryToResourceInfo(res: PlTreeEntry | ResourceInfo, ctx: ComputableCtx) {\n if (res instanceof PlTreeEntry) return ctx.accessor(res).node().resourceInfo;\n\n return res;\n}\n\n/**\n * API contracts:\n * - API never return {@link NullResourceId}, absence of link is always modeled as `undefined`\n *\n * Important: never store instances of this class, always get fresh instance from {@link PlTreeState} accessor.\n * */\nexport class PlTreeNodeAccessor {\n private readonly __pl_tree_type_marker__ = \"PlTreeNodeAccessor\";\n\n constructor(\n private readonly accessorData: TreeAccessorData,\n private readonly tree: PlTreeState,\n private readonly resource: PlTreeResource,\n private readonly instanceData: TreeAccessorInstanceData,\n ) {}\n\n public get id(): ResourceId {\n this.instanceData.guard();\n return this.resource.id;\n }\n\n public get originalId(): OptionalResourceId {\n this.instanceData.guard();\n return this.resource.originalResourceId;\n }\n\n public get resourceType(): ResourceType {\n this.instanceData.guard();\n return this.resource.type;\n }\n\n public get resourceInfo(): ResourceInfo {\n return { id: this.id, type: this.resourceType };\n }\n\n private getResourceFromTree(rid: ResourceId, ops: ResourceTraversalOps): PlTreeNodeAccessor {\n return getResourceFromTree(this.accessorData, this.tree, this.instanceData, rid, ops);\n }\n\n public traverse(\n ...steps: [\n Omit<FieldTraversalStep, \"errorIfFieldNotSet\"> & {\n errorIfFieldNotSet: true;\n },\n ]\n ): PlTreeNodeAccessor;\n public traverse(...steps: (FieldTraversalStep | string)[]): PlTreeNodeAccessor | undefined;\n public traverse(...steps: (FieldTraversalStep | string)[]): PlTreeNodeAccessor | undefined {\n return this.traverseWithCommon({}, ...steps);\n }\n\n public traverseOrError(\n ...steps: [\n Omit<FieldTraversalStep, \"errorIfFieldNotSet\"> & {\n errorIfFieldNotSet: true;\n },\n ]\n ): ValueOrError<PlTreeNodeAccessor, Error>;\n public traverseOrError(\n ...steps: (FieldTraversalStep | string)[]\n ): ValueOrError<PlTreeNodeAccessor, Error> | undefined;\n public traverseOrError(\n ...steps: (FieldTraversalStep | string)[]\n ): ValueOrError<PlTreeNodeAccessor, Error> | undefined {\n return this.traverseOrErrorWithCommon({}, ...steps);\n }\n\n public traverseWithCommon(\n commonOptions: CommonFieldTraverseOps,\n ...steps: (FieldTraversalStep | string)[]\n ): PlTreeNodeAccessor | undefined {\n const result = this.traverseOrErrorWithCommon(commonOptions, ...steps);\n if (result === undefined) return undefined;\n\n if (!result.ok) throw result.error;\n return result.value;\n }\n\n public traverseOrErrorWithCommon(\n commonOptions: CommonFieldTraverseOps,\n ...steps: (FieldTraversalStep | string)[]\n ): ValueOrError<PlTreeNodeAccessor, Error> | undefined {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let current: PlTreeNodeAccessor = this;\n\n for (const _step of steps) {\n const step: FieldTraversalStep =\n typeof _step === \"string\"\n ? {\n ...commonOptions,\n field: _step,\n }\n : { ...commonOptions, ..._step };\n\n const next = current.getField(_step);\n\n if (next === undefined) return undefined;\n\n if (step.pureFieldErrorToUndefined && next.value === undefined && next.error !== undefined)\n return undefined;\n\n if ((!step.ignoreError || next.value === undefined) && next.error !== undefined)\n return {\n ok: false,\n\n // FIXME: in next tickets we'll allow Errors to be thrown.\n error: parsePlError(\n notEmpty(next.error.getDataAsString()),\n current.id,\n current.resourceType,\n step.field,\n ),\n };\n\n if (next.value === undefined) {\n if (step.errorIfFieldNotSet)\n return {\n ok: false,\n error: new Error(\n `field have no assigned value ${step.field} of ${resourceIdToString(current.id)}`,\n ),\n };\n // existing but unpopulated field is unstable because it must be resolved at some point\n this.onUnstableLambda(\"unpopulated_field:\" + step.field);\n return undefined;\n }\n\n current = next.value;\n }\n return { ok: true, value: current };\n }\n\n private readonly onUnstableLambda = (marker: string) => {\n this.instanceData.ctx.markUnstable(marker);\n };\n\n public getField(\n _step:\n | (Omit<GetFieldStep, \"errorIfFieldNotFound\"> & { errorIfFieldNotFound: true })\n | (Omit<GetFieldStep, \"errorIfFieldNotSet\"> & { errorIfFieldNotSet: true }),\n ): ValueAndError<PlTreeNodeAccessor>;\n public getField(_step: GetFieldStep | string): ValueAndError<PlTreeNodeAccessor> | undefined;\n public getField(_step: GetFieldStep | string): ValueAndError<PlTreeNodeAccessor> | undefined {\n this.instanceData.guard();\n const step: GetFieldStep = typeof _step === \"string\" ? { field: _step } : _step;\n\n const ve = this.resource.getField(this.instanceData.ctx.watcher, step, this.onUnstableLambda);\n\n if (ve === undefined) return undefined;\n\n return mapValueAndError(ve, (rid) => this.getResourceFromTree(rid, { ignoreError: true }));\n }\n\n public getInputsLocked(): boolean {\n this.instanceData.guard();\n const result = this.resource.getInputsLocked(this.instanceData.ctx.watcher);\n if (!result) this.instanceData.ctx.markUnstable(\"inputs_unlocked:\" + this.resourceType.name);\n return result;\n }\n\n public getOutputsLocked(): boolean {\n this.instanceData.guard();\n const result = this.resource.getOutputsLocked(this.instanceData.ctx.watcher);\n if (!result) this.instanceData.ctx.markUnstable(\"outputs_unlocked:\" + this.resourceType.name);\n return result;\n }\n\n public getIsReadyOrError(): boolean {\n this.instanceData.guard();\n const result = this.resource.getIsReadyOrError(this.instanceData.ctx.watcher);\n if (!result) this.instanceData.ctx.markUnstable(\"not_ready:\" + this.resourceType.name);\n return result;\n }\n\n public getIsFinal() {\n this.instanceData.guard();\n return this.resource.getIsFinal(this.instanceData.ctx.watcher);\n }\n\n public getError(): PlTreeNodeAccessor | undefined {\n this.instanceData.guard();\n const rid = this.resource.getError(this.instanceData.ctx.watcher);\n if (rid === undefined)\n // absence of error always considered as stable\n return undefined;\n return this.getResourceFromTree(rid, {});\n }\n\n public getData(): Uint8Array | undefined {\n return this.resource.data;\n }\n\n public getDataAsString(): string | undefined {\n return this.resource.getDataAsString();\n }\n\n public getDataAsJson<T = unknown>(): T | undefined {\n return this.resource.getDataAsJson<T>();\n }\n\n public listInputFields(): string[] {\n this.instanceData.guard();\n this.getInputsLocked(); // will set unstable if not locked\n return this.resource.listInputFields(this.instanceData.ctx.watcher);\n }\n\n public listOutputFields(): string[] {\n this.instanceData.guard();\n this.getOutputsLocked(); // will set unstable if not locked\n return this.resource.listOutputFields(this.instanceData.ctx.watcher);\n }\n\n public listDynamicFields(): string[] {\n this.instanceData.guard();\n return this.resource.listDynamicFields(this.instanceData.ctx.watcher);\n }\n\n public getKeyValue(key: string, unstableIfNotFound: boolean = false): Uint8Array | undefined {\n this.instanceData.guard();\n const result = this.resource.getKeyValue(this.instanceData.ctx.watcher, key);\n if (result === undefined && unstableIfNotFound)\n this.instanceData.ctx.markUnstable(\"key_not_found_b:\" + key);\n return result;\n }\n\n /** @deprecated */\n public getKeyValueString(key: string): string | undefined {\n return this.getKeyValueAsString(key);\n }\n\n public getKeyValueAsString(key: string, unstableIfNotFound: boolean = false): string | undefined {\n this.instanceData.guard();\n const result = this.resource.getKeyValueString(this.instanceData.ctx.watcher, key);\n if (result === undefined && unstableIfNotFound)\n this.instanceData.ctx.markUnstable(\"key_not_found_s:\" + key);\n return result;\n }\n\n public getKeyValueAsJson<T = unknown>(\n key: string,\n unstableIfNotFound: boolean = false,\n ): T | undefined {\n const result = this.resource.getKeyValueAsJson<T>(this.instanceData.ctx.watcher, key);\n if (result === undefined) {\n if (unstableIfNotFound) this.instanceData.ctx.markUnstable(\"key_not_found_j:\" + key);\n return undefined;\n }\n return result;\n }\n\n /**\n * Can be used to pass a higher level accessor that will wrap the resource and throw its\n * errors on node resolution.\n * */\n public toEntryAccessor(): PlTreeEntryAccessor {\n return new PlTreeEntryAccessor(this.accessorData, this.tree, this.id, this.instanceData);\n }\n\n /** Can be passed to nested computable. */\n public persist(): PlTreeEntry {\n return new PlTreeEntry(this.accessorData, this.resource.id);\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"accessors.js","names":[],"sources":["../src/accessors.ts"],"sourcesContent":["import type { PlTreeResource, PlTreeState } from \"./state\";\nimport type {\n AccessorProvider,\n ComputableCtx,\n ComputableHooks,\n UsageGuard,\n} from \"@milaboratories/computable\";\nimport type { ResourceId, ResourceType, OptionalResourceId } from \"@milaboratories/pl-client\";\nimport {\n resourceIdToString,\n resourceTypesEqual,\n resourceTypeToString,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n NullResourceId,\n} from \"@milaboratories/pl-client\";\nimport type { ValueAndError } from \"./value_and_error\";\nimport { mapValueAndError } from \"./value_and_error\";\nimport type {\n CommonFieldTraverseOps,\n FieldTraversalStep,\n GetFieldStep,\n ResourceTraversalOps,\n} from \"./traversal_ops\";\nimport type { ValueOrError } from \"./value_or_error\";\nimport { parsePlError } from \"@milaboratories/pl-errors\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\n/** Error encountered during traversal in field or resource. */\nexport class PlError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\nexport type TreeAccessorData = {\n readonly treeProvider: () => PlTreeState;\n readonly hooks?: ComputableHooks;\n};\n\nexport type TreeAccessorInstanceData = {\n readonly guard: UsageGuard;\n readonly ctx: ComputableCtx;\n};\n\nexport function isPlTreeEntry(obj: unknown): obj is PlTreeEntry {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n (obj as any)[\"__pl_tree_type_marker__\"] === \"PlTreeEntry\"\n );\n}\n\nexport function isPlTreeEntryAccessor(obj: unknown): obj is PlTreeEntryAccessor {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n (obj as any)[\"__pl_tree_type_marker__\"] === \"PlTreeEntryAccessor\"\n );\n}\n\nexport function isPlTreeNodeAccessor(obj: unknown): obj is PlTreeNodeAccessor {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n (obj as any)[\"__pl_tree_type_marker__\"] === \"PlTreeNodeAccessor\"\n );\n}\n\n/** Main entry point for using PlTree in reactive setting */\nexport class PlTreeEntry implements AccessorProvider<PlTreeEntryAccessor> {\n private readonly __pl_tree_type_marker__ = \"PlTreeEntry\";\n\n constructor(\n private readonly accessorData: TreeAccessorData,\n public readonly rid: ResourceId,\n ) {}\n\n public createAccessor(ctx: ComputableCtx, guard: UsageGuard): PlTreeEntryAccessor {\n return new PlTreeEntryAccessor(this.accessorData, this.accessorData.treeProvider(), this.rid, {\n ctx,\n guard,\n });\n }\n\n public toJSON(): string {\n return this.toString();\n }\n\n public toString(): string {\n return `[ENTRY:${resourceIdToString(this.rid)}]`;\n }\n}\n\nfunction getResourceFromTree(\n accessorData: TreeAccessorData,\n tree: PlTreeState,\n instanceData: TreeAccessorInstanceData,\n rid: ResourceId,\n ops: ResourceTraversalOps,\n): PlTreeNodeAccessor {\n const acc = new PlTreeNodeAccessor(\n accessorData,\n tree,\n tree.get(instanceData.ctx.watcher, rid),\n instanceData,\n );\n\n if (!ops.ignoreError) {\n const err = acc.getError();\n if (err !== undefined)\n throw parsePlError(notEmpty(err.getDataAsString()), acc.id, acc.resourceType);\n }\n\n if (\n ops.assertResourceType !== undefined &&\n (Array.isArray(ops.assertResourceType)\n ? ops.assertResourceType.findIndex((rt) => resourceTypesEqual(rt, acc.resourceType)) === -1\n : !resourceTypesEqual(ops.assertResourceType, acc.resourceType))\n )\n throw new Error(\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n `wrong resource type ${resourceTypeToString(acc.resourceType)} but expected ${ops.assertResourceType}`,\n );\n\n return acc;\n}\n\nexport class PlTreeEntryAccessor {\n private readonly __pl_tree_type_marker__ = \"PlTreeEntryAccessor\";\n\n constructor(\n private readonly accessorData: TreeAccessorData,\n private readonly tree: PlTreeState,\n private readonly rid: ResourceId,\n private readonly instanceData: TreeAccessorInstanceData,\n ) {}\n\n node(ops: ResourceTraversalOps = {}): PlTreeNodeAccessor {\n this.instanceData.guard();\n\n // this is the only entry point to acquire a PlTreeNodeAccessor,\n // so this is the only point where we should attach the hooks\n if (this.accessorData.hooks !== undefined)\n this.instanceData.ctx.attacheHooks(this.accessorData.hooks);\n\n return getResourceFromTree(this.accessorData, this.tree, this.instanceData, this.rid, ops);\n }\n}\n\n/**\n * Helper type to simplify implementation of APIs requiring type information.\n * */\nexport type ResourceInfo = {\n readonly id: ResourceId;\n readonly type: ResourceType;\n};\n\n/**\n * Can be called only when a ctx is provided, because pl tree entry is a computable entity.\n * @deprecated\n * */\nexport function treeEntryToResourceInfo(res: PlTreeEntry | ResourceInfo, ctx: ComputableCtx) {\n if (res instanceof PlTreeEntry) return ctx.accessor(res).node().resourceInfo;\n\n return res;\n}\n\n/**\n * API contracts:\n * - API never return {@link NullResourceId}, absence of link is always modeled as `undefined`\n *\n * Important: never store instances of this class, always get fresh instance from {@link PlTreeState} accessor.\n * */\nexport class PlTreeNodeAccessor {\n private readonly __pl_tree_type_marker__ = \"PlTreeNodeAccessor\";\n\n constructor(\n private readonly accessorData: TreeAccessorData,\n private readonly tree: PlTreeState,\n private readonly resource: PlTreeResource,\n private readonly instanceData: TreeAccessorInstanceData,\n ) {}\n\n public get id(): ResourceId {\n this.instanceData.guard();\n return this.resource.id;\n }\n\n public get originalId(): OptionalResourceId {\n this.instanceData.guard();\n return this.resource.originalResourceId;\n }\n\n public get resourceType(): ResourceType {\n this.instanceData.guard();\n return this.resource.type;\n }\n\n public get resourceInfo(): ResourceInfo {\n return { id: this.id, type: this.resourceType };\n }\n\n private getResourceFromTree(rid: ResourceId, ops: ResourceTraversalOps): PlTreeNodeAccessor {\n return getResourceFromTree(this.accessorData, this.tree, this.instanceData, rid, ops);\n }\n\n public traverse(\n ...steps: [\n Omit<FieldTraversalStep, \"errorIfFieldNotSet\"> & {\n errorIfFieldNotSet: true;\n },\n ]\n ): PlTreeNodeAccessor;\n public traverse(...steps: (FieldTraversalStep | string)[]): PlTreeNodeAccessor | undefined;\n public traverse(...steps: (FieldTraversalStep | string)[]): PlTreeNodeAccessor | undefined {\n return this.traverseWithCommon({}, ...steps);\n }\n\n public traverseOrError(\n ...steps: [\n Omit<FieldTraversalStep, \"errorIfFieldNotSet\"> & {\n errorIfFieldNotSet: true;\n },\n ]\n ): ValueOrError<PlTreeNodeAccessor, Error>;\n public traverseOrError(\n ...steps: (FieldTraversalStep | string)[]\n ): ValueOrError<PlTreeNodeAccessor, Error> | undefined;\n public traverseOrError(\n ...steps: (FieldTraversalStep | string)[]\n ): ValueOrError<PlTreeNodeAccessor, Error> | undefined {\n return this.traverseOrErrorWithCommon({}, ...steps);\n }\n\n public traverseWithCommon(\n commonOptions: CommonFieldTraverseOps,\n ...steps: (FieldTraversalStep | string)[]\n ): PlTreeNodeAccessor | undefined {\n const result = this.traverseOrErrorWithCommon(commonOptions, ...steps);\n if (result === undefined) return undefined;\n\n if (!result.ok) throw result.error;\n return result.value;\n }\n\n public traverseOrErrorWithCommon(\n commonOptions: CommonFieldTraverseOps,\n ...steps: (FieldTraversalStep | string)[]\n ): ValueOrError<PlTreeNodeAccessor, Error> | undefined {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let current: PlTreeNodeAccessor = this;\n\n for (const _step of steps) {\n const step: FieldTraversalStep =\n typeof _step === \"string\"\n ? {\n ...commonOptions,\n field: _step,\n }\n : { ...commonOptions, ..._step };\n\n const next = current.getField(_step);\n\n if (next === undefined) return undefined;\n\n if (step.pureFieldErrorToUndefined && next.value === undefined && next.error !== undefined)\n return undefined;\n\n if ((!step.ignoreError || next.value === undefined) && next.error !== undefined)\n return {\n ok: false,\n\n // FIXME: in next tickets we'll allow Errors to be thrown.\n error: parsePlError(\n notEmpty(next.error.getDataAsString()),\n current.id,\n current.resourceType,\n step.field,\n ),\n };\n\n if (next.value === undefined) {\n if (step.errorIfFieldNotSet)\n return {\n ok: false,\n error: new Error(\n `field have no assigned value ${step.field} of ${resourceIdToString(current.id)}`,\n ),\n };\n // existing but unpopulated field is unstable because it must be resolved at some point\n this.onUnstableLambda(\"unpopulated_field:\" + step.field);\n return undefined;\n }\n\n current = next.value;\n }\n return { ok: true, value: current };\n }\n\n private readonly onUnstableLambda = (marker: string) => {\n this.instanceData.ctx.markUnstable(marker);\n };\n\n public getField(\n _step:\n | (Omit<GetFieldStep, \"errorIfFieldNotFound\"> & { errorIfFieldNotFound: true })\n | (Omit<GetFieldStep, \"errorIfFieldNotSet\"> & { errorIfFieldNotSet: true }),\n ): ValueAndError<PlTreeNodeAccessor>;\n public getField(_step: GetFieldStep | string): ValueAndError<PlTreeNodeAccessor> | undefined;\n public getField(_step: GetFieldStep | string): ValueAndError<PlTreeNodeAccessor> | undefined {\n this.instanceData.guard();\n const step: GetFieldStep = typeof _step === \"string\" ? { field: _step } : _step;\n\n const ve = this.resource.getField(this.instanceData.ctx.watcher, step, this.onUnstableLambda);\n\n if (ve === undefined) return undefined;\n\n return mapValueAndError(ve, (rid) => this.getResourceFromTree(rid, { ignoreError: true }));\n }\n\n public getInputsLocked(): boolean {\n this.instanceData.guard();\n const result = this.resource.getInputsLocked(this.instanceData.ctx.watcher);\n if (!result) this.instanceData.ctx.markUnstable(\"inputs_unlocked:\" + this.resourceType.name);\n return result;\n }\n\n public getOutputsLocked(): boolean {\n this.instanceData.guard();\n const result = this.resource.getOutputsLocked(this.instanceData.ctx.watcher);\n if (!result) this.instanceData.ctx.markUnstable(\"outputs_unlocked:\" + this.resourceType.name);\n return result;\n }\n\n public getIsReadyOrError(): boolean {\n this.instanceData.guard();\n const result = this.resource.getIsReadyOrError(this.instanceData.ctx.watcher);\n if (!result) this.instanceData.ctx.markUnstable(\"not_ready:\" + this.resourceType.name);\n return result;\n }\n\n public getIsFinal() {\n this.instanceData.guard();\n return this.resource.getIsFinal(this.instanceData.ctx.watcher);\n }\n\n public getError(): PlTreeNodeAccessor | undefined {\n this.instanceData.guard();\n const rid = this.resource.getError(this.instanceData.ctx.watcher);\n if (rid === undefined)\n // absence of error always considered as stable\n return undefined;\n return this.getResourceFromTree(rid, {});\n }\n\n public getData(): Uint8Array | undefined {\n return this.resource.data;\n }\n\n public getDataAsString(): string | undefined {\n return this.resource.getDataAsString();\n }\n\n public getDataAsJson<T = unknown>(): T | undefined {\n return this.resource.getDataAsJson<T>();\n }\n\n public listInputFields(): string[] {\n this.instanceData.guard();\n this.getInputsLocked(); // will set unstable if not locked\n return this.resource.listInputFields(this.instanceData.ctx.watcher);\n }\n\n public listOutputFields(): string[] {\n this.instanceData.guard();\n this.getOutputsLocked(); // will set unstable if not locked\n return this.resource.listOutputFields(this.instanceData.ctx.watcher);\n }\n\n public listDynamicFields(): string[] {\n this.instanceData.guard();\n return this.resource.listDynamicFields(this.instanceData.ctx.watcher);\n }\n\n public getKeyValue(key: string, unstableIfNotFound: boolean = false): Uint8Array | undefined {\n this.instanceData.guard();\n const result = this.resource.getKeyValue(this.instanceData.ctx.watcher, key);\n if (result === undefined && unstableIfNotFound)\n this.instanceData.ctx.markUnstable(\"key_not_found_b:\" + key);\n return result;\n }\n\n /** @deprecated */\n public getKeyValueString(key: string): string | undefined {\n return this.getKeyValueAsString(key);\n }\n\n public getKeyValueAsString(key: string, unstableIfNotFound: boolean = false): string | undefined {\n this.instanceData.guard();\n const result = this.resource.getKeyValueString(this.instanceData.ctx.watcher, key);\n if (result === undefined && unstableIfNotFound)\n this.instanceData.ctx.markUnstable(\"key_not_found_s:\" + key);\n return result;\n }\n\n public getKeyValueAsJson<T = unknown>(\n key: string,\n unstableIfNotFound: boolean = false,\n ): T | undefined {\n const result = this.resource.getKeyValueAsJson<T>(this.instanceData.ctx.watcher, key);\n if (result === undefined) {\n if (unstableIfNotFound) this.instanceData.ctx.markUnstable(\"key_not_found_j:\" + key);\n return undefined;\n }\n return result;\n }\n\n /**\n * Can be used to pass a higher level accessor that will wrap the resource and throw its\n * errors on node resolution.\n * */\n public toEntryAccessor(): PlTreeEntryAccessor {\n return new PlTreeEntryAccessor(this.accessorData, this.tree, this.id, this.instanceData);\n }\n\n /** Can be passed to nested computable. */\n public persist(): PlTreeEntry {\n return new PlTreeEntry(this.accessorData, this.resource.id);\n }\n}\n"],"mappings":"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"}