@milaboratories/pl-tree 1.9.23 → 1.10.0

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.
@@ -32,6 +32,13 @@ var PlTreeEntry = class {
32
32
  guard
33
33
  });
34
34
  }
35
+ /**
36
+ * Tree TreeEntry ID suitable for persistence and use in names (files/objects/whatever), as it does not
37
+ * contain signature which can change from session to session.
38
+ */
39
+ get id() {
40
+ return (0, _milaboratories_pl_client.resourceIdToString)(this.rid);
41
+ }
35
42
  toJSON() {
36
43
  return this.toString();
37
44
  }
@@ -72,7 +79,7 @@ function treeEntryToResourceInfo(res, ctx) {
72
79
  }
73
80
  /**
74
81
  * API contracts:
75
- * - API never return {@link NullResourceId}, absence of link is always modeled as `undefined`
82
+ * - API never return {@link NullSignedResourceId}, absence of link is always modeled as `undefined`
76
83
  *
77
84
  * Important: never store instances of this class, always get fresh instance from {@link PlTreeState} accessor.
78
85
  * */
@@ -1 +1 @@
1
- {"version":3,"file":"accessors.cjs","names":["mapValueAndError"],"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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"}
1
+ {"version":3,"file":"accessors.cjs","names":["mapValueAndError"],"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 {\n SignedResourceId,\n ResourceType,\n OptionalSignedResourceId,\n} from \"@milaboratories/pl-client\";\nimport {\n resourceIdToString,\n resourceTypesEqual,\n resourceTypeToString,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n NullSignedResourceId,\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: SignedResourceId, // only for runtime. Not exposing rid at all causes too much pain. Never persist this anywhere.\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 /**\n * Tree TreeEntry ID suitable for persistence and use in names (files/objects/whatever), as it does not\n * contain signature which can change from session to session.\n */\n public get id(): string {\n return resourceIdToString(this.rid);\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: SignedResourceId,\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: SignedResourceId,\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: SignedResourceId;\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 NullSignedResourceId}, 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(): SignedResourceId {\n this.instanceData.guard();\n return this.resource.id;\n }\n\n public get originalId(): OptionalSignedResourceId {\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(\n rid: SignedResourceId,\n ops: ResourceTraversalOps,\n ): 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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"}
@@ -2,7 +2,7 @@ import { CommonFieldTraverseOps, FieldTraversalStep, GetFieldStep, ResourceTrave
2
2
  import { ValueAndError } from "./value_and_error.js";
3
3
  import { ValueOrError } from "./value_or_error.js";
4
4
  import { PlTreeResource, PlTreeState } from "./state.js";
5
- import { OptionalResourceId, ResourceId, ResourceType } from "@milaboratories/pl-client";
5
+ import { OptionalSignedResourceId, ResourceType, SignedResourceId } from "@milaboratories/pl-client";
6
6
  import { AccessorProvider, ComputableCtx, ComputableHooks, UsageGuard } from "@milaboratories/computable";
7
7
 
8
8
  //#region src/accessors.d.ts
@@ -24,10 +24,15 @@ declare function isPlTreeNodeAccessor(obj: unknown): obj is PlTreeNodeAccessor;
24
24
  /** Main entry point for using PlTree in reactive setting */
25
25
  declare class PlTreeEntry implements AccessorProvider<PlTreeEntryAccessor> {
26
26
  private readonly accessorData;
27
- readonly rid: ResourceId;
27
+ readonly rid: SignedResourceId;
28
28
  private readonly __pl_tree_type_marker__;
29
- constructor(accessorData: TreeAccessorData, rid: ResourceId);
29
+ constructor(accessorData: TreeAccessorData, rid: SignedResourceId);
30
30
  createAccessor(ctx: ComputableCtx, guard: UsageGuard): PlTreeEntryAccessor;
31
+ /**
32
+ * Tree TreeEntry ID suitable for persistence and use in names (files/objects/whatever), as it does not
33
+ * contain signature which can change from session to session.
34
+ */
35
+ get id(): string;
31
36
  toJSON(): string;
32
37
  toString(): string;
33
38
  }
@@ -37,14 +42,14 @@ declare class PlTreeEntryAccessor {
37
42
  private readonly rid;
38
43
  private readonly instanceData;
39
44
  private readonly __pl_tree_type_marker__;
40
- constructor(accessorData: TreeAccessorData, tree: PlTreeState, rid: ResourceId, instanceData: TreeAccessorInstanceData);
45
+ constructor(accessorData: TreeAccessorData, tree: PlTreeState, rid: SignedResourceId, instanceData: TreeAccessorInstanceData);
41
46
  node(ops?: ResourceTraversalOps): PlTreeNodeAccessor;
42
47
  }
43
48
  /**
44
49
  * Helper type to simplify implementation of APIs requiring type information.
45
50
  * */
46
51
  type ResourceInfo = {
47
- readonly id: ResourceId;
52
+ readonly id: SignedResourceId;
48
53
  readonly type: ResourceType;
49
54
  };
50
55
  /**
@@ -54,7 +59,7 @@ type ResourceInfo = {
54
59
  declare function treeEntryToResourceInfo(res: PlTreeEntry | ResourceInfo, ctx: ComputableCtx): ResourceInfo;
55
60
  /**
56
61
  * API contracts:
57
- * - API never return {@link NullResourceId}, absence of link is always modeled as `undefined`
62
+ * - API never return {@link NullSignedResourceId}, absence of link is always modeled as `undefined`
58
63
  *
59
64
  * Important: never store instances of this class, always get fresh instance from {@link PlTreeState} accessor.
60
65
  * */
@@ -65,8 +70,8 @@ declare class PlTreeNodeAccessor {
65
70
  private readonly instanceData;
66
71
  private readonly __pl_tree_type_marker__;
67
72
  constructor(accessorData: TreeAccessorData, tree: PlTreeState, resource: PlTreeResource, instanceData: TreeAccessorInstanceData);
68
- get id(): ResourceId;
69
- get originalId(): OptionalResourceId;
73
+ get id(): SignedResourceId;
74
+ get originalId(): OptionalSignedResourceId;
70
75
  get resourceType(): ResourceType;
71
76
  get resourceInfo(): ResourceInfo;
72
77
  private getResourceFromTree;
@@ -1 +1 @@
1
- {"version":3,"file":"accessors.d.ts","names":[],"sources":["../src/accessors.ts"],"mappings":"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"}
1
+ {"version":3,"file":"accessors.d.ts","names":[],"sources":["../src/accessors.ts"],"mappings":"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"}
package/dist/accessors.js CHANGED
@@ -31,6 +31,13 @@ var PlTreeEntry = class {
31
31
  guard
32
32
  });
33
33
  }
34
+ /**
35
+ * Tree TreeEntry ID suitable for persistence and use in names (files/objects/whatever), as it does not
36
+ * contain signature which can change from session to session.
37
+ */
38
+ get id() {
39
+ return resourceIdToString(this.rid);
40
+ }
34
41
  toJSON() {
35
42
  return this.toString();
36
43
  }
@@ -71,7 +78,7 @@ function treeEntryToResourceInfo(res, ctx) {
71
78
  }
72
79
  /**
73
80
  * API contracts:
74
- * - API never return {@link NullResourceId}, absence of link is always modeled as `undefined`
81
+ * - API never return {@link NullSignedResourceId}, absence of link is always modeled as `undefined`
75
82
  *
76
83
  * Important: never store instances of this class, always get fresh instance from {@link PlTreeState} accessor.
77
84
  * */
@@ -1 +1 @@
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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"}
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 {\n SignedResourceId,\n ResourceType,\n OptionalSignedResourceId,\n} from \"@milaboratories/pl-client\";\nimport {\n resourceIdToString,\n resourceTypesEqual,\n resourceTypeToString,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n NullSignedResourceId,\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: SignedResourceId, // only for runtime. Not exposing rid at all causes too much pain. Never persist this anywhere.\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 /**\n * Tree TreeEntry ID suitable for persistence and use in names (files/objects/whatever), as it does not\n * contain signature which can change from session to session.\n */\n public get id(): string {\n return resourceIdToString(this.rid);\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: SignedResourceId,\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: SignedResourceId,\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: SignedResourceId;\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 NullSignedResourceId}, 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(): SignedResourceId {\n this.instanceData.guard();\n return this.resource.id;\n }\n\n public get originalId(): OptionalSignedResourceId {\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(\n rid: SignedResourceId,\n ops: ResourceTraversalOps,\n ): 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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.cjs","names":["PlTreeEntry","PlTreeEntryAccessor"],"sources":["../src/snapshot.ts"],"sourcesContent":["import type { ResourceId, ResourceType } from \"@milaboratories/pl-client\";\nimport type { Optional, Writable } from \"utility-types\";\nimport type { ZodType, z } from \"zod\";\nimport type { PlTreeNodeAccessor } from \"./accessors\";\nimport { PlTreeEntry, PlTreeEntryAccessor } from \"./accessors\";\nimport type { ComputableCtx } from \"@milaboratories/computable\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\n\n/**\n * A DTO that can be generated from a tree node to make a snapshot of specific parts of it's state.\n * Such snapshots can then be used in core that requires this information without the need of\n * retrieving state from the tree.\n */\nexport type ResourceSnapshot<\n Data = undefined,\n Fields extends Record<string, ResourceId | undefined> | undefined = undefined,\n KV extends Record<string, unknown> | undefined = undefined,\n> = {\n readonly id: ResourceId;\n readonly type: ResourceType;\n readonly data: Data;\n readonly fields: Fields;\n readonly kv: KV;\n};\n\n/** The most generic type of ResourceSnapshot. */\ntype ResourceSnapshotGeneric = ResourceSnapshot<\n unknown,\n Record<string, ResourceId | undefined> | undefined,\n Record<string, unknown> | undefined\n>;\n\n/** Request that we'll pass to getResourceSnapshot function. We infer the type of ResourceSnapshot from this. */\nexport type ResourceSnapshotSchema<\n Data extends ZodType | \"raw\" | undefined = undefined,\n Fields extends Record<string, boolean> | undefined = undefined,\n KV extends Record<string, ZodType | \"raw\"> | undefined = undefined,\n> = {\n readonly data: Data;\n readonly fields: Fields;\n readonly kv: KV;\n};\n\n/** Creates ResourceSnapshotSchema. It converts an optional schema type to schema type. */\nexport function rsSchema<\n const Data extends ZodType | \"raw\" | undefined = undefined,\n const Fields extends Record<string, boolean> | undefined = undefined,\n const KV extends Record<string, ZodType | \"raw\"> | undefined = undefined,\n>(\n schema: Optional<ResourceSnapshotSchema<Data, Fields, KV>>,\n): ResourceSnapshotSchema<Data, Fields, KV> {\n return schema as any;\n}\n\n/** The most generic type of ResourceSnapshotSchema. */\ntype ResourceSnapshotSchemaGeneric = ResourceSnapshotSchema<\n ZodType | \"raw\" | undefined,\n Record<string, boolean> | undefined,\n Record<string, ZodType | \"raw\"> | undefined\n>;\n\n/**\n * If Data is 'raw' in schema, we'll get bytes,\n * if it's Zod, we'll parse it via zod.\n * Or else we just got undefined in the field.\n */\ntype InferDataType<Data extends ZodType | \"raw\" | undefined> = Data extends \"raw\"\n ? Uint8Array\n : Data extends ZodType\n ? z.infer<Data>\n : undefined;\n\n/**\n * If Fields is a record of field names to booleans,\n * then if the value of the field is true, we'll require this field and throw a Error if it wasn't found.\n * If it's false and doesn't exist, we'll return undefined.\n * If Fields type is undefined, we won't set fields at all.\n */\ntype InferFieldsType<Fields extends Record<string, boolean> | undefined> = Fields extends undefined\n ? undefined\n : {\n [FieldName in keyof Fields]: Fields[FieldName] extends true\n ? ResourceId\n : ResourceId | undefined;\n };\n\n/**\n * If KV is undefined, won't set it.\n * If one of values is Zod, we'll get KV and converts it to Zod schema.\n * If the value is 'raw', just returns bytes.\n */\ntype InferKVType<KV extends Record<string, ZodType | \"raw\"> | undefined> = KV extends undefined\n ? undefined\n : {\n [FieldName in keyof KV]: KV[FieldName] extends ZodType ? z.infer<KV[FieldName]> : Uint8Array;\n };\n\n/** Infer ResourceSnapshot from ResourceShapshotSchema, S can be any ResourceSnapshotSchema. */\nexport type InferSnapshot<S extends ResourceSnapshotSchemaGeneric> = ResourceSnapshot<\n InferDataType<S[\"data\"]>,\n InferFieldsType<S[\"fields\"]>,\n InferKVType<S[\"kv\"]>\n>;\n\n/** Gets a ResourceSnapshot from PlTreeEntry. */\nexport function makeResourceSnapshot<Schema extends ResourceSnapshotSchemaGeneric>(\n res: PlTreeEntry,\n schema: Schema,\n ctx: ComputableCtx,\n): InferSnapshot<Schema>;\nexport function makeResourceSnapshot<Schema extends ResourceSnapshotSchemaGeneric>(\n res: PlTreeEntryAccessor | PlTreeNodeAccessor,\n schema: Schema,\n): InferSnapshot<Schema>;\nexport function makeResourceSnapshot<Schema extends ResourceSnapshotSchemaGeneric>(\n res: PlTreeEntry | PlTreeEntryAccessor | PlTreeNodeAccessor,\n schema: Schema,\n ctx?: ComputableCtx,\n): InferSnapshot<Schema> {\n const node =\n res instanceof PlTreeEntry\n ? notEmpty(ctx).accessor(res).node()\n : res instanceof PlTreeEntryAccessor\n ? res.node()\n : res;\n const info = node.resourceInfo;\n const result: Optional<Writable<ResourceSnapshotGeneric>, \"data\" | \"fields\" | \"kv\"> = { ...info };\n\n if (schema.data !== undefined) {\n if (schema.data === \"raw\") result.data = node.getData();\n else result.data = schema.data.parse(node.getDataAsJson());\n }\n\n if (schema.fields !== undefined) {\n const fields: Record<string, ResourceId | undefined> = {};\n // even if field is not defined, corresponding object field\n // with \"undefined\" value will still be added\n for (const [fieldName, required] of Object.entries(schema.fields))\n fields[fieldName] = node.traverse({\n field: fieldName,\n errorIfFieldNotSet: required,\n stableIfNotFound: !required,\n })?.id;\n result.fields = fields;\n }\n\n if (schema.kv !== undefined) {\n const kv: Record<string, unknown> = {};\n for (const [fieldName, type] of Object.entries(schema.kv)) {\n const value = node.getKeyValue(fieldName);\n\n if (value === undefined) {\n throw new Error(`Key not found ${fieldName}`);\n } else if (type === \"raw\") {\n kv[fieldName] = value;\n } else {\n kv[fieldName] = type.parse(JSON.parse(Buffer.from(value).toString(\"utf-8\")));\n }\n }\n result.kv = kv;\n }\n\n return result as any;\n}\n\n/** @deprecated */\nexport type ResourceWithData = {\n readonly id: ResourceId;\n readonly type: ResourceType;\n readonly fields: Map<string, ResourceId | undefined>;\n readonly data?: Uint8Array;\n};\n\n/** @deprecated */\nexport function treeEntryToResourceWithData(\n res: PlTreeEntry | ResourceWithData,\n fields: string[],\n ctx: ComputableCtx,\n): ResourceWithData {\n if (res instanceof PlTreeEntry) {\n const node = ctx.accessor(res).node();\n const info = node.resourceInfo;\n\n const fValues: [string, ResourceId | undefined][] = fields.map((name) => [\n name,\n node.getField(name)?.value?.id,\n ]);\n\n return {\n ...info,\n fields: new Map(fValues),\n data: node.getData() ?? new Uint8Array(),\n };\n }\n\n return res;\n}\n\n/** @deprecated */\nexport type ResourceWithMetadata = {\n readonly id: ResourceId;\n readonly type: ResourceType;\n readonly metadata: Record<string, any>;\n};\n\n/** @deprecated */\nexport function treeEntryToResourceWithMetadata(\n res: PlTreeEntry | ResourceWithMetadata,\n mdKeys: string[],\n ctx: ComputableCtx,\n): ResourceWithMetadata {\n if (!(res instanceof PlTreeEntry)) return res;\n\n const node = ctx.accessor(res).node();\n const info = node.resourceInfo;\n const mdEntries: [string, any][] = mdKeys.map((k) => [k, node.getKeyValue(k)]);\n\n return {\n ...info,\n metadata: Object.fromEntries(mdEntries),\n };\n}\n"],"mappings":";;;;;AA4CA,SAAgB,SAKd,QAC0C;AAC1C,QAAO;;AA+DT,SAAgB,qBACd,KACA,QACA,KACuB;CACvB,MAAM,OACJ,eAAeA,kBAAAA,eAAAA,GAAAA,2BAAAA,UACF,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,GAClC,eAAeC,kBAAAA,sBACb,IAAI,MAAM,GACV;CAER,MAAM,SAAgF,EAAE,GAD3E,KAAK,cAC+E;AAEjG,KAAI,OAAO,SAAS,KAAA,EAClB,KAAI,OAAO,SAAS,MAAO,QAAO,OAAO,KAAK,SAAS;KAClD,QAAO,OAAO,OAAO,KAAK,MAAM,KAAK,eAAe,CAAC;AAG5D,KAAI,OAAO,WAAW,KAAA,GAAW;EAC/B,MAAM,SAAiD,EAAE;AAGzD,OAAK,MAAM,CAAC,WAAW,aAAa,OAAO,QAAQ,OAAO,OAAO,CAC/D,QAAO,aAAa,KAAK,SAAS;GAChC,OAAO;GACP,oBAAoB;GACpB,kBAAkB,CAAC;GACpB,CAAC,EAAE;AACN,SAAO,SAAS;;AAGlB,KAAI,OAAO,OAAO,KAAA,GAAW;EAC3B,MAAM,KAA8B,EAAE;AACtC,OAAK,MAAM,CAAC,WAAW,SAAS,OAAO,QAAQ,OAAO,GAAG,EAAE;GACzD,MAAM,QAAQ,KAAK,YAAY,UAAU;AAEzC,OAAI,UAAU,KAAA,EACZ,OAAM,IAAI,MAAM,iBAAiB,YAAY;YACpC,SAAS,MAClB,IAAG,aAAa;OAEhB,IAAG,aAAa,KAAK,MAAM,KAAK,MAAM,OAAO,KAAK,MAAM,CAAC,SAAS,QAAQ,CAAC,CAAC;;AAGhF,SAAO,KAAK;;AAGd,QAAO;;;AAYT,SAAgB,4BACd,KACA,QACA,KACkB;AAClB,KAAI,eAAeD,kBAAAA,aAAa;EAC9B,MAAM,OAAO,IAAI,SAAS,IAAI,CAAC,MAAM;EACrC,MAAM,OAAO,KAAK;EAElB,MAAM,UAA8C,OAAO,KAAK,SAAS,CACvE,MACA,KAAK,SAAS,KAAK,EAAE,OAAO,GAC7B,CAAC;AAEF,SAAO;GACL,GAAG;GACH,QAAQ,IAAI,IAAI,QAAQ;GACxB,MAAM,KAAK,SAAS,IAAI,IAAI,YAAY;GACzC;;AAGH,QAAO;;;AAWT,SAAgB,gCACd,KACA,QACA,KACsB;AACtB,KAAI,EAAE,eAAeA,kBAAAA,aAAc,QAAO;CAE1C,MAAM,OAAO,IAAI,SAAS,IAAI,CAAC,MAAM;CACrC,MAAM,OAAO,KAAK;CAClB,MAAM,YAA6B,OAAO,KAAK,MAAM,CAAC,GAAG,KAAK,YAAY,EAAE,CAAC,CAAC;AAE9E,QAAO;EACL,GAAG;EACH,UAAU,OAAO,YAAY,UAAU;EACxC"}
1
+ {"version":3,"file":"snapshot.cjs","names":["PlTreeEntry","PlTreeEntryAccessor"],"sources":["../src/snapshot.ts"],"sourcesContent":["import type { SignedResourceId, ResourceType } from \"@milaboratories/pl-client\";\nimport type { Optional, Writable } from \"utility-types\";\nimport type { ZodType, z } from \"zod\";\nimport type { PlTreeNodeAccessor } from \"./accessors\";\nimport { PlTreeEntry, PlTreeEntryAccessor } from \"./accessors\";\nimport type { ComputableCtx } from \"@milaboratories/computable\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\n\n/**\n * A DTO that can be generated from a tree node to make a snapshot of specific parts of it's state.\n * Such snapshots can then be used in core that requires this information without the need of\n * retrieving state from the tree.\n */\nexport type ResourceSnapshot<\n Data = undefined,\n Fields extends Record<string, SignedResourceId | undefined> | undefined = undefined,\n KV extends Record<string, unknown> | undefined = undefined,\n> = {\n readonly id: SignedResourceId;\n readonly type: ResourceType;\n readonly data: Data;\n readonly fields: Fields;\n readonly kv: KV;\n};\n\n/** The most generic type of ResourceSnapshot. */\ntype ResourceSnapshotGeneric = ResourceSnapshot<\n unknown,\n Record<string, SignedResourceId | undefined> | undefined,\n Record<string, unknown> | undefined\n>;\n\n/** Request that we'll pass to getResourceSnapshot function. We infer the type of ResourceSnapshot from this. */\nexport type ResourceSnapshotSchema<\n Data extends ZodType | \"raw\" | undefined = undefined,\n Fields extends Record<string, boolean> | undefined = undefined,\n KV extends Record<string, ZodType | \"raw\"> | undefined = undefined,\n> = {\n readonly data: Data;\n readonly fields: Fields;\n readonly kv: KV;\n};\n\n/** Creates ResourceSnapshotSchema. It converts an optional schema type to schema type. */\nexport function rsSchema<\n const Data extends ZodType | \"raw\" | undefined = undefined,\n const Fields extends Record<string, boolean> | undefined = undefined,\n const KV extends Record<string, ZodType | \"raw\"> | undefined = undefined,\n>(\n schema: Optional<ResourceSnapshotSchema<Data, Fields, KV>>,\n): ResourceSnapshotSchema<Data, Fields, KV> {\n return schema as any;\n}\n\n/** The most generic type of ResourceSnapshotSchema. */\ntype ResourceSnapshotSchemaGeneric = ResourceSnapshotSchema<\n ZodType | \"raw\" | undefined,\n Record<string, boolean> | undefined,\n Record<string, ZodType | \"raw\"> | undefined\n>;\n\n/**\n * If Data is 'raw' in schema, we'll get bytes,\n * if it's Zod, we'll parse it via zod.\n * Or else we just got undefined in the field.\n */\ntype InferDataType<Data extends ZodType | \"raw\" | undefined> = Data extends \"raw\"\n ? Uint8Array\n : Data extends ZodType\n ? z.infer<Data>\n : undefined;\n\n/**\n * If Fields is a record of field names to booleans,\n * then if the value of the field is true, we'll require this field and throw a Error if it wasn't found.\n * If it's false and doesn't exist, we'll return undefined.\n * If Fields type is undefined, we won't set fields at all.\n */\ntype InferFieldsType<Fields extends Record<string, boolean> | undefined> = Fields extends undefined\n ? undefined\n : {\n [FieldName in keyof Fields]: Fields[FieldName] extends true\n ? SignedResourceId\n : SignedResourceId | undefined;\n };\n\n/**\n * If KV is undefined, won't set it.\n * If one of values is Zod, we'll get KV and converts it to Zod schema.\n * If the value is 'raw', just returns bytes.\n */\ntype InferKVType<KV extends Record<string, ZodType | \"raw\"> | undefined> = KV extends undefined\n ? undefined\n : {\n [FieldName in keyof KV]: KV[FieldName] extends ZodType ? z.infer<KV[FieldName]> : Uint8Array;\n };\n\n/** Infer ResourceSnapshot from ResourceShapshotSchema, S can be any ResourceSnapshotSchema. */\nexport type InferSnapshot<S extends ResourceSnapshotSchemaGeneric> = ResourceSnapshot<\n InferDataType<S[\"data\"]>,\n InferFieldsType<S[\"fields\"]>,\n InferKVType<S[\"kv\"]>\n>;\n\n/** Gets a ResourceSnapshot from PlTreeEntry. */\nexport function makeResourceSnapshot<Schema extends ResourceSnapshotSchemaGeneric>(\n res: PlTreeEntry,\n schema: Schema,\n ctx: ComputableCtx,\n): InferSnapshot<Schema>;\nexport function makeResourceSnapshot<Schema extends ResourceSnapshotSchemaGeneric>(\n res: PlTreeEntryAccessor | PlTreeNodeAccessor,\n schema: Schema,\n): InferSnapshot<Schema>;\nexport function makeResourceSnapshot<Schema extends ResourceSnapshotSchemaGeneric>(\n res: PlTreeEntry | PlTreeEntryAccessor | PlTreeNodeAccessor,\n schema: Schema,\n ctx?: ComputableCtx,\n): InferSnapshot<Schema> {\n const node =\n res instanceof PlTreeEntry\n ? notEmpty(ctx).accessor(res).node()\n : res instanceof PlTreeEntryAccessor\n ? res.node()\n : res;\n const info = node.resourceInfo;\n const result: Optional<Writable<ResourceSnapshotGeneric>, \"data\" | \"fields\" | \"kv\"> = { ...info };\n\n if (schema.data !== undefined) {\n if (schema.data === \"raw\") result.data = node.getData();\n else result.data = schema.data.parse(node.getDataAsJson());\n }\n\n if (schema.fields !== undefined) {\n const fields: Record<string, SignedResourceId | undefined> = {};\n // even if field is not defined, corresponding object field\n // with \"undefined\" value will still be added\n for (const [fieldName, required] of Object.entries(schema.fields))\n fields[fieldName] = node.traverse({\n field: fieldName,\n errorIfFieldNotSet: required,\n stableIfNotFound: !required,\n })?.id;\n result.fields = fields;\n }\n\n if (schema.kv !== undefined) {\n const kv: Record<string, unknown> = {};\n for (const [fieldName, type] of Object.entries(schema.kv)) {\n const value = node.getKeyValue(fieldName);\n\n if (value === undefined) {\n throw new Error(`Key not found ${fieldName}`);\n } else if (type === \"raw\") {\n kv[fieldName] = value;\n } else {\n kv[fieldName] = type.parse(JSON.parse(Buffer.from(value).toString(\"utf-8\")));\n }\n }\n result.kv = kv;\n }\n\n return result as any;\n}\n\n/** @deprecated */\nexport type ResourceWithData = {\n readonly id: SignedResourceId;\n readonly type: ResourceType;\n readonly fields: Map<string, SignedResourceId | undefined>;\n readonly data?: Uint8Array;\n};\n\n/** @deprecated */\nexport function treeEntryToResourceWithData(\n res: PlTreeEntry | ResourceWithData,\n fields: string[],\n ctx: ComputableCtx,\n): ResourceWithData {\n if (res instanceof PlTreeEntry) {\n const node = ctx.accessor(res).node();\n const info = node.resourceInfo;\n\n const fValues: [string, SignedResourceId | undefined][] = fields.map((name) => [\n name,\n node.getField(name)?.value?.id,\n ]);\n\n return {\n ...info,\n fields: new Map(fValues),\n data: node.getData() ?? new Uint8Array(),\n };\n }\n\n return res;\n}\n\n/** @deprecated */\nexport type ResourceWithMetadata = {\n readonly id: SignedResourceId;\n readonly type: ResourceType;\n readonly metadata: Record<string, any>;\n};\n\n/** @deprecated */\nexport function treeEntryToResourceWithMetadata(\n res: PlTreeEntry | ResourceWithMetadata,\n mdKeys: string[],\n ctx: ComputableCtx,\n): ResourceWithMetadata {\n if (!(res instanceof PlTreeEntry)) return res;\n\n const node = ctx.accessor(res).node();\n const info = node.resourceInfo;\n const mdEntries: [string, any][] = mdKeys.map((k) => [k, node.getKeyValue(k)]);\n\n return {\n ...info,\n metadata: Object.fromEntries(mdEntries),\n };\n}\n"],"mappings":";;;;;AA4CA,SAAgB,SAKd,QAC0C;AAC1C,QAAO;;AA+DT,SAAgB,qBACd,KACA,QACA,KACuB;CACvB,MAAM,OACJ,eAAeA,kBAAAA,eAAAA,GAAAA,2BAAAA,UACF,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,GAClC,eAAeC,kBAAAA,sBACb,IAAI,MAAM,GACV;CAER,MAAM,SAAgF,EAAE,GAD3E,KAAK,cAC+E;AAEjG,KAAI,OAAO,SAAS,KAAA,EAClB,KAAI,OAAO,SAAS,MAAO,QAAO,OAAO,KAAK,SAAS;KAClD,QAAO,OAAO,OAAO,KAAK,MAAM,KAAK,eAAe,CAAC;AAG5D,KAAI,OAAO,WAAW,KAAA,GAAW;EAC/B,MAAM,SAAuD,EAAE;AAG/D,OAAK,MAAM,CAAC,WAAW,aAAa,OAAO,QAAQ,OAAO,OAAO,CAC/D,QAAO,aAAa,KAAK,SAAS;GAChC,OAAO;GACP,oBAAoB;GACpB,kBAAkB,CAAC;GACpB,CAAC,EAAE;AACN,SAAO,SAAS;;AAGlB,KAAI,OAAO,OAAO,KAAA,GAAW;EAC3B,MAAM,KAA8B,EAAE;AACtC,OAAK,MAAM,CAAC,WAAW,SAAS,OAAO,QAAQ,OAAO,GAAG,EAAE;GACzD,MAAM,QAAQ,KAAK,YAAY,UAAU;AAEzC,OAAI,UAAU,KAAA,EACZ,OAAM,IAAI,MAAM,iBAAiB,YAAY;YACpC,SAAS,MAClB,IAAG,aAAa;OAEhB,IAAG,aAAa,KAAK,MAAM,KAAK,MAAM,OAAO,KAAK,MAAM,CAAC,SAAS,QAAQ,CAAC,CAAC;;AAGhF,SAAO,KAAK;;AAGd,QAAO;;;AAYT,SAAgB,4BACd,KACA,QACA,KACkB;AAClB,KAAI,eAAeD,kBAAAA,aAAa;EAC9B,MAAM,OAAO,IAAI,SAAS,IAAI,CAAC,MAAM;EACrC,MAAM,OAAO,KAAK;EAElB,MAAM,UAAoD,OAAO,KAAK,SAAS,CAC7E,MACA,KAAK,SAAS,KAAK,EAAE,OAAO,GAC7B,CAAC;AAEF,SAAO;GACL,GAAG;GACH,QAAQ,IAAI,IAAI,QAAQ;GACxB,MAAM,KAAK,SAAS,IAAI,IAAI,YAAY;GACzC;;AAGH,QAAO;;;AAWT,SAAgB,gCACd,KACA,QACA,KACsB;AACtB,KAAI,EAAE,eAAeA,kBAAAA,aAAc,QAAO;CAE1C,MAAM,OAAO,IAAI,SAAS,IAAI,CAAC,MAAM;CACrC,MAAM,OAAO,KAAK;CAClB,MAAM,YAA6B,OAAO,KAAK,MAAM,CAAC,GAAG,KAAK,YAAY,EAAE,CAAC,CAAC;AAE9E,QAAO;EACL,GAAG;EACH,UAAU,OAAO,YAAY,UAAU;EACxC"}
@@ -1,5 +1,5 @@
1
1
  import { PlTreeEntry, PlTreeEntryAccessor, PlTreeNodeAccessor } from "./accessors.js";
2
- import { ResourceId, ResourceType } from "@milaboratories/pl-client";
2
+ import { ResourceType, SignedResourceId } from "@milaboratories/pl-client";
3
3
  import { ComputableCtx } from "@milaboratories/computable";
4
4
  import { Optional } from "utility-types";
5
5
  import { ZodType, z } from "zod";
@@ -10,8 +10,8 @@ import { ZodType, z } from "zod";
10
10
  * Such snapshots can then be used in core that requires this information without the need of
11
11
  * retrieving state from the tree.
12
12
  */
13
- type ResourceSnapshot<Data = undefined, Fields extends Record<string, ResourceId | undefined> | undefined = undefined, KV extends Record<string, unknown> | undefined = undefined> = {
14
- readonly id: ResourceId;
13
+ type ResourceSnapshot<Data = undefined, Fields extends Record<string, SignedResourceId | undefined> | undefined = undefined, KV extends Record<string, unknown> | undefined = undefined> = {
14
+ readonly id: SignedResourceId;
15
15
  readonly type: ResourceType;
16
16
  readonly data: Data;
17
17
  readonly fields: Fields;
@@ -39,7 +39,7 @@ type InferDataType<Data extends ZodType | "raw" | undefined> = Data extends "raw
39
39
  * If it's false and doesn't exist, we'll return undefined.
40
40
  * If Fields type is undefined, we won't set fields at all.
41
41
  */
42
- type InferFieldsType<Fields extends Record<string, boolean> | undefined> = Fields extends undefined ? undefined : { [FieldName in keyof Fields]: Fields[FieldName] extends true ? ResourceId : ResourceId | undefined };
42
+ type InferFieldsType<Fields extends Record<string, boolean> | undefined> = Fields extends undefined ? undefined : { [FieldName in keyof Fields]: Fields[FieldName] extends true ? SignedResourceId : SignedResourceId | undefined };
43
43
  /**
44
44
  * If KV is undefined, won't set it.
45
45
  * If one of values is Zod, we'll get KV and converts it to Zod schema.
@@ -53,16 +53,16 @@ declare function makeResourceSnapshot<Schema extends ResourceSnapshotSchemaGener
53
53
  declare function makeResourceSnapshot<Schema extends ResourceSnapshotSchemaGeneric>(res: PlTreeEntryAccessor | PlTreeNodeAccessor, schema: Schema): InferSnapshot<Schema>;
54
54
  /** @deprecated */
55
55
  type ResourceWithData = {
56
- readonly id: ResourceId;
56
+ readonly id: SignedResourceId;
57
57
  readonly type: ResourceType;
58
- readonly fields: Map<string, ResourceId | undefined>;
58
+ readonly fields: Map<string, SignedResourceId | undefined>;
59
59
  readonly data?: Uint8Array;
60
60
  };
61
61
  /** @deprecated */
62
62
  declare function treeEntryToResourceWithData(res: PlTreeEntry | ResourceWithData, fields: string[], ctx: ComputableCtx): ResourceWithData;
63
63
  /** @deprecated */
64
64
  type ResourceWithMetadata = {
65
- readonly id: ResourceId;
65
+ readonly id: SignedResourceId;
66
66
  readonly type: ResourceType;
67
67
  readonly metadata: Record<string, any>;
68
68
  };
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.d.ts","names":[],"sources":["../src/snapshot.ts"],"mappings":";;;;;;;;AAaA;;;;KAAY,gBAAA,kCAEK,MAAA,SAAe,UAAA,kDACnB,MAAA;EAAA,SAEF,EAAA,EAAI,UAAA;EAAA,SACJ,IAAA,EAAM,YAAA;EAAA,SACN,IAAA,EAAM,IAAA;EAAA,SACN,MAAA,EAAQ,MAAA;EAAA,SACR,EAAA,EAAI,EAAA;AAAA;;KAWH,sBAAA,cACG,OAAA,iDACE,MAAA,sDACJ,MAAA,SAAe,OAAA;EAAA,SAEjB,IAAA,EAAM,IAAA;EAAA,SACN,MAAA,EAAQ,MAAA;EAAA,SACR,EAAA,EAAI,EAAA;AAAA;;iBAIC,QAAA,oBACK,OAAA,uDACE,MAAA,4DACJ,MAAA,SAAe,OAAA,kCAAA,CAEhC,MAAA,EAAQ,QAAA,CAAS,sBAAA,CAAuB,IAAA,EAAM,MAAA,EAAQ,EAAA,KACrD,sBAAA,CAAuB,IAAA,EAAM,MAAA,EAAQ,EAAA;;KAKnC,6BAAA,GAAgC,sBAAA,CACnC,OAAA,sBACA,MAAA,+BACA,MAAA,SAAe,OAAA;;;;;;KAQZ,aAAA,cAA2B,OAAA,wBAA+B,IAAA,iBAC3D,UAAA,GACA,IAAA,SAAa,OAAA,GACX,CAAA,CAAE,KAAA,CAAM,IAAA;;;;;AApCd;;KA6CK,eAAA,gBAA+B,MAAA,iCAAuC,MAAA,uDAGjD,MAAA,GAAS,MAAA,CAAO,SAAA,iBAChC,UAAA,GACA,UAAA;;;;;;KAQL,WAAA,YAAuB,MAAA,SAAe,OAAA,yBAAgC,EAAA,uDAGjD,EAAA,GAAK,EAAA,CAAG,SAAA,UAAmB,OAAA,GAAU,CAAA,CAAE,KAAA,CAAM,EAAA,CAAG,SAAA,KAAc,UAAA;;KAI5E,aAAA,WAAwB,6BAAA,IAAiC,gBAAA,CACnE,aAAA,CAAc,CAAA,WACd,eAAA,CAAgB,CAAA,aAChB,WAAA,CAAY,CAAA;;iBAIE,oBAAA,gBAAoC,6BAAA,CAAA,CAClD,GAAA,EAAK,WAAA,EACL,MAAA,EAAQ,MAAA,EACR,GAAA,EAAK,aAAA,GACJ,aAAA,CAAc,MAAA;AAAA,iBACD,oBAAA,gBAAoC,6BAAA,CAAA,CAClD,GAAA,EAAK,mBAAA,GAAsB,kBAAA,EAC3B,MAAA,EAAQ,MAAA,GACP,aAAA,CAAc,MAAA;;KAqDL,gBAAA;EAAA,SACD,EAAA,EAAI,UAAA;EAAA,SACJ,IAAA,EAAM,YAAA;EAAA,SACN,MAAA,EAAQ,GAAA,SAAY,UAAA;EAAA,SACpB,IAAA,GAAO,UAAA;AAAA;;iBAIF,2BAAA,CACd,GAAA,EAAK,WAAA,GAAc,gBAAA,EACnB,MAAA,YACA,GAAA,EAAK,aAAA,GACJ,gBAAA;AAtIH;AAAA,KA2JY,oBAAA;EAAA,SACD,EAAA,EAAI,UAAA;EAAA,SACJ,IAAA,EAAM,YAAA;EAAA,SACN,QAAA,EAAU,MAAA;AAAA;;iBAIL,+BAAA,CACd,GAAA,EAAK,WAAA,GAAc,oBAAA,EACnB,MAAA,YACA,GAAA,EAAK,aAAA,GACJ,oBAAA"}
1
+ {"version":3,"file":"snapshot.d.ts","names":[],"sources":["../src/snapshot.ts"],"mappings":";;;;;;;;AAaA;;;;KAAY,gBAAA,kCAEK,MAAA,SAAe,gBAAA,kDACnB,MAAA;EAAA,SAEF,EAAA,EAAI,gBAAA;EAAA,SACJ,IAAA,EAAM,YAAA;EAAA,SACN,IAAA,EAAM,IAAA;EAAA,SACN,MAAA,EAAQ,MAAA;EAAA,SACR,EAAA,EAAI,EAAA;AAAA;;KAWH,sBAAA,cACG,OAAA,iDACE,MAAA,sDACJ,MAAA,SAAe,OAAA;EAAA,SAEjB,IAAA,EAAM,IAAA;EAAA,SACN,MAAA,EAAQ,MAAA;EAAA,SACR,EAAA,EAAI,EAAA;AAAA;;iBAIC,QAAA,oBACK,OAAA,uDACE,MAAA,4DACJ,MAAA,SAAe,OAAA,kCAAA,CAEhC,MAAA,EAAQ,QAAA,CAAS,sBAAA,CAAuB,IAAA,EAAM,MAAA,EAAQ,EAAA,KACrD,sBAAA,CAAuB,IAAA,EAAM,MAAA,EAAQ,EAAA;;KAKnC,6BAAA,GAAgC,sBAAA,CACnC,OAAA,sBACA,MAAA,+BACA,MAAA,SAAe,OAAA;;;;;;KAQZ,aAAA,cAA2B,OAAA,wBAA+B,IAAA,iBAC3D,UAAA,GACA,IAAA,SAAa,OAAA,GACX,CAAA,CAAE,KAAA,CAAM,IAAA;;;;;AApCd;;KA6CK,eAAA,gBAA+B,MAAA,iCAAuC,MAAA,uDAGjD,MAAA,GAAS,MAAA,CAAO,SAAA,iBAChC,gBAAA,GACA,gBAAA;;;;;;KAQL,WAAA,YAAuB,MAAA,SAAe,OAAA,yBAAgC,EAAA,uDAGjD,EAAA,GAAK,EAAA,CAAG,SAAA,UAAmB,OAAA,GAAU,CAAA,CAAE,KAAA,CAAM,EAAA,CAAG,SAAA,KAAc,UAAA;;KAI5E,aAAA,WAAwB,6BAAA,IAAiC,gBAAA,CACnE,aAAA,CAAc,CAAA,WACd,eAAA,CAAgB,CAAA,aAChB,WAAA,CAAY,CAAA;;iBAIE,oBAAA,gBAAoC,6BAAA,CAAA,CAClD,GAAA,EAAK,WAAA,EACL,MAAA,EAAQ,MAAA,EACR,GAAA,EAAK,aAAA,GACJ,aAAA,CAAc,MAAA;AAAA,iBACD,oBAAA,gBAAoC,6BAAA,CAAA,CAClD,GAAA,EAAK,mBAAA,GAAsB,kBAAA,EAC3B,MAAA,EAAQ,MAAA,GACP,aAAA,CAAc,MAAA;;KAqDL,gBAAA;EAAA,SACD,EAAA,EAAI,gBAAA;EAAA,SACJ,IAAA,EAAM,YAAA;EAAA,SACN,MAAA,EAAQ,GAAA,SAAY,gBAAA;EAAA,SACpB,IAAA,GAAO,UAAA;AAAA;;iBAIF,2BAAA,CACd,GAAA,EAAK,WAAA,GAAc,gBAAA,EACnB,MAAA,YACA,GAAA,EAAK,aAAA,GACJ,gBAAA;AAtIH;AAAA,KA2JY,oBAAA;EAAA,SACD,EAAA,EAAI,gBAAA;EAAA,SACJ,IAAA,EAAM,YAAA;EAAA,SACN,QAAA,EAAU,MAAA;AAAA;;iBAIL,+BAAA,CACd,GAAA,EAAK,WAAA,GAAc,oBAAA,EACnB,MAAA,YACA,GAAA,EAAK,aAAA,GACJ,oBAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.js","names":[],"sources":["../src/snapshot.ts"],"sourcesContent":["import type { ResourceId, ResourceType } from \"@milaboratories/pl-client\";\nimport type { Optional, Writable } from \"utility-types\";\nimport type { ZodType, z } from \"zod\";\nimport type { PlTreeNodeAccessor } from \"./accessors\";\nimport { PlTreeEntry, PlTreeEntryAccessor } from \"./accessors\";\nimport type { ComputableCtx } from \"@milaboratories/computable\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\n\n/**\n * A DTO that can be generated from a tree node to make a snapshot of specific parts of it's state.\n * Such snapshots can then be used in core that requires this information without the need of\n * retrieving state from the tree.\n */\nexport type ResourceSnapshot<\n Data = undefined,\n Fields extends Record<string, ResourceId | undefined> | undefined = undefined,\n KV extends Record<string, unknown> | undefined = undefined,\n> = {\n readonly id: ResourceId;\n readonly type: ResourceType;\n readonly data: Data;\n readonly fields: Fields;\n readonly kv: KV;\n};\n\n/** The most generic type of ResourceSnapshot. */\ntype ResourceSnapshotGeneric = ResourceSnapshot<\n unknown,\n Record<string, ResourceId | undefined> | undefined,\n Record<string, unknown> | undefined\n>;\n\n/** Request that we'll pass to getResourceSnapshot function. We infer the type of ResourceSnapshot from this. */\nexport type ResourceSnapshotSchema<\n Data extends ZodType | \"raw\" | undefined = undefined,\n Fields extends Record<string, boolean> | undefined = undefined,\n KV extends Record<string, ZodType | \"raw\"> | undefined = undefined,\n> = {\n readonly data: Data;\n readonly fields: Fields;\n readonly kv: KV;\n};\n\n/** Creates ResourceSnapshotSchema. It converts an optional schema type to schema type. */\nexport function rsSchema<\n const Data extends ZodType | \"raw\" | undefined = undefined,\n const Fields extends Record<string, boolean> | undefined = undefined,\n const KV extends Record<string, ZodType | \"raw\"> | undefined = undefined,\n>(\n schema: Optional<ResourceSnapshotSchema<Data, Fields, KV>>,\n): ResourceSnapshotSchema<Data, Fields, KV> {\n return schema as any;\n}\n\n/** The most generic type of ResourceSnapshotSchema. */\ntype ResourceSnapshotSchemaGeneric = ResourceSnapshotSchema<\n ZodType | \"raw\" | undefined,\n Record<string, boolean> | undefined,\n Record<string, ZodType | \"raw\"> | undefined\n>;\n\n/**\n * If Data is 'raw' in schema, we'll get bytes,\n * if it's Zod, we'll parse it via zod.\n * Or else we just got undefined in the field.\n */\ntype InferDataType<Data extends ZodType | \"raw\" | undefined> = Data extends \"raw\"\n ? Uint8Array\n : Data extends ZodType\n ? z.infer<Data>\n : undefined;\n\n/**\n * If Fields is a record of field names to booleans,\n * then if the value of the field is true, we'll require this field and throw a Error if it wasn't found.\n * If it's false and doesn't exist, we'll return undefined.\n * If Fields type is undefined, we won't set fields at all.\n */\ntype InferFieldsType<Fields extends Record<string, boolean> | undefined> = Fields extends undefined\n ? undefined\n : {\n [FieldName in keyof Fields]: Fields[FieldName] extends true\n ? ResourceId\n : ResourceId | undefined;\n };\n\n/**\n * If KV is undefined, won't set it.\n * If one of values is Zod, we'll get KV and converts it to Zod schema.\n * If the value is 'raw', just returns bytes.\n */\ntype InferKVType<KV extends Record<string, ZodType | \"raw\"> | undefined> = KV extends undefined\n ? undefined\n : {\n [FieldName in keyof KV]: KV[FieldName] extends ZodType ? z.infer<KV[FieldName]> : Uint8Array;\n };\n\n/** Infer ResourceSnapshot from ResourceShapshotSchema, S can be any ResourceSnapshotSchema. */\nexport type InferSnapshot<S extends ResourceSnapshotSchemaGeneric> = ResourceSnapshot<\n InferDataType<S[\"data\"]>,\n InferFieldsType<S[\"fields\"]>,\n InferKVType<S[\"kv\"]>\n>;\n\n/** Gets a ResourceSnapshot from PlTreeEntry. */\nexport function makeResourceSnapshot<Schema extends ResourceSnapshotSchemaGeneric>(\n res: PlTreeEntry,\n schema: Schema,\n ctx: ComputableCtx,\n): InferSnapshot<Schema>;\nexport function makeResourceSnapshot<Schema extends ResourceSnapshotSchemaGeneric>(\n res: PlTreeEntryAccessor | PlTreeNodeAccessor,\n schema: Schema,\n): InferSnapshot<Schema>;\nexport function makeResourceSnapshot<Schema extends ResourceSnapshotSchemaGeneric>(\n res: PlTreeEntry | PlTreeEntryAccessor | PlTreeNodeAccessor,\n schema: Schema,\n ctx?: ComputableCtx,\n): InferSnapshot<Schema> {\n const node =\n res instanceof PlTreeEntry\n ? notEmpty(ctx).accessor(res).node()\n : res instanceof PlTreeEntryAccessor\n ? res.node()\n : res;\n const info = node.resourceInfo;\n const result: Optional<Writable<ResourceSnapshotGeneric>, \"data\" | \"fields\" | \"kv\"> = { ...info };\n\n if (schema.data !== undefined) {\n if (schema.data === \"raw\") result.data = node.getData();\n else result.data = schema.data.parse(node.getDataAsJson());\n }\n\n if (schema.fields !== undefined) {\n const fields: Record<string, ResourceId | undefined> = {};\n // even if field is not defined, corresponding object field\n // with \"undefined\" value will still be added\n for (const [fieldName, required] of Object.entries(schema.fields))\n fields[fieldName] = node.traverse({\n field: fieldName,\n errorIfFieldNotSet: required,\n stableIfNotFound: !required,\n })?.id;\n result.fields = fields;\n }\n\n if (schema.kv !== undefined) {\n const kv: Record<string, unknown> = {};\n for (const [fieldName, type] of Object.entries(schema.kv)) {\n const value = node.getKeyValue(fieldName);\n\n if (value === undefined) {\n throw new Error(`Key not found ${fieldName}`);\n } else if (type === \"raw\") {\n kv[fieldName] = value;\n } else {\n kv[fieldName] = type.parse(JSON.parse(Buffer.from(value).toString(\"utf-8\")));\n }\n }\n result.kv = kv;\n }\n\n return result as any;\n}\n\n/** @deprecated */\nexport type ResourceWithData = {\n readonly id: ResourceId;\n readonly type: ResourceType;\n readonly fields: Map<string, ResourceId | undefined>;\n readonly data?: Uint8Array;\n};\n\n/** @deprecated */\nexport function treeEntryToResourceWithData(\n res: PlTreeEntry | ResourceWithData,\n fields: string[],\n ctx: ComputableCtx,\n): ResourceWithData {\n if (res instanceof PlTreeEntry) {\n const node = ctx.accessor(res).node();\n const info = node.resourceInfo;\n\n const fValues: [string, ResourceId | undefined][] = fields.map((name) => [\n name,\n node.getField(name)?.value?.id,\n ]);\n\n return {\n ...info,\n fields: new Map(fValues),\n data: node.getData() ?? new Uint8Array(),\n };\n }\n\n return res;\n}\n\n/** @deprecated */\nexport type ResourceWithMetadata = {\n readonly id: ResourceId;\n readonly type: ResourceType;\n readonly metadata: Record<string, any>;\n};\n\n/** @deprecated */\nexport function treeEntryToResourceWithMetadata(\n res: PlTreeEntry | ResourceWithMetadata,\n mdKeys: string[],\n ctx: ComputableCtx,\n): ResourceWithMetadata {\n if (!(res instanceof PlTreeEntry)) return res;\n\n const node = ctx.accessor(res).node();\n const info = node.resourceInfo;\n const mdEntries: [string, any][] = mdKeys.map((k) => [k, node.getKeyValue(k)]);\n\n return {\n ...info,\n metadata: Object.fromEntries(mdEntries),\n };\n}\n"],"mappings":";;;;AA4CA,SAAgB,SAKd,QAC0C;AAC1C,QAAO;;AA+DT,SAAgB,qBACd,KACA,QACA,KACuB;CACvB,MAAM,OACJ,eAAe,cACX,SAAS,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,GAClC,eAAe,sBACb,IAAI,MAAM,GACV;CAER,MAAM,SAAgF,EAAE,GAD3E,KAAK,cAC+E;AAEjG,KAAI,OAAO,SAAS,KAAA,EAClB,KAAI,OAAO,SAAS,MAAO,QAAO,OAAO,KAAK,SAAS;KAClD,QAAO,OAAO,OAAO,KAAK,MAAM,KAAK,eAAe,CAAC;AAG5D,KAAI,OAAO,WAAW,KAAA,GAAW;EAC/B,MAAM,SAAiD,EAAE;AAGzD,OAAK,MAAM,CAAC,WAAW,aAAa,OAAO,QAAQ,OAAO,OAAO,CAC/D,QAAO,aAAa,KAAK,SAAS;GAChC,OAAO;GACP,oBAAoB;GACpB,kBAAkB,CAAC;GACpB,CAAC,EAAE;AACN,SAAO,SAAS;;AAGlB,KAAI,OAAO,OAAO,KAAA,GAAW;EAC3B,MAAM,KAA8B,EAAE;AACtC,OAAK,MAAM,CAAC,WAAW,SAAS,OAAO,QAAQ,OAAO,GAAG,EAAE;GACzD,MAAM,QAAQ,KAAK,YAAY,UAAU;AAEzC,OAAI,UAAU,KAAA,EACZ,OAAM,IAAI,MAAM,iBAAiB,YAAY;YACpC,SAAS,MAClB,IAAG,aAAa;OAEhB,IAAG,aAAa,KAAK,MAAM,KAAK,MAAM,OAAO,KAAK,MAAM,CAAC,SAAS,QAAQ,CAAC,CAAC;;AAGhF,SAAO,KAAK;;AAGd,QAAO;;;AAYT,SAAgB,4BACd,KACA,QACA,KACkB;AAClB,KAAI,eAAe,aAAa;EAC9B,MAAM,OAAO,IAAI,SAAS,IAAI,CAAC,MAAM;EACrC,MAAM,OAAO,KAAK;EAElB,MAAM,UAA8C,OAAO,KAAK,SAAS,CACvE,MACA,KAAK,SAAS,KAAK,EAAE,OAAO,GAC7B,CAAC;AAEF,SAAO;GACL,GAAG;GACH,QAAQ,IAAI,IAAI,QAAQ;GACxB,MAAM,KAAK,SAAS,IAAI,IAAI,YAAY;GACzC;;AAGH,QAAO;;;AAWT,SAAgB,gCACd,KACA,QACA,KACsB;AACtB,KAAI,EAAE,eAAe,aAAc,QAAO;CAE1C,MAAM,OAAO,IAAI,SAAS,IAAI,CAAC,MAAM;CACrC,MAAM,OAAO,KAAK;CAClB,MAAM,YAA6B,OAAO,KAAK,MAAM,CAAC,GAAG,KAAK,YAAY,EAAE,CAAC,CAAC;AAE9E,QAAO;EACL,GAAG;EACH,UAAU,OAAO,YAAY,UAAU;EACxC"}
1
+ {"version":3,"file":"snapshot.js","names":[],"sources":["../src/snapshot.ts"],"sourcesContent":["import type { SignedResourceId, ResourceType } from \"@milaboratories/pl-client\";\nimport type { Optional, Writable } from \"utility-types\";\nimport type { ZodType, z } from \"zod\";\nimport type { PlTreeNodeAccessor } from \"./accessors\";\nimport { PlTreeEntry, PlTreeEntryAccessor } from \"./accessors\";\nimport type { ComputableCtx } from \"@milaboratories/computable\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\n\n/**\n * A DTO that can be generated from a tree node to make a snapshot of specific parts of it's state.\n * Such snapshots can then be used in core that requires this information without the need of\n * retrieving state from the tree.\n */\nexport type ResourceSnapshot<\n Data = undefined,\n Fields extends Record<string, SignedResourceId | undefined> | undefined = undefined,\n KV extends Record<string, unknown> | undefined = undefined,\n> = {\n readonly id: SignedResourceId;\n readonly type: ResourceType;\n readonly data: Data;\n readonly fields: Fields;\n readonly kv: KV;\n};\n\n/** The most generic type of ResourceSnapshot. */\ntype ResourceSnapshotGeneric = ResourceSnapshot<\n unknown,\n Record<string, SignedResourceId | undefined> | undefined,\n Record<string, unknown> | undefined\n>;\n\n/** Request that we'll pass to getResourceSnapshot function. We infer the type of ResourceSnapshot from this. */\nexport type ResourceSnapshotSchema<\n Data extends ZodType | \"raw\" | undefined = undefined,\n Fields extends Record<string, boolean> | undefined = undefined,\n KV extends Record<string, ZodType | \"raw\"> | undefined = undefined,\n> = {\n readonly data: Data;\n readonly fields: Fields;\n readonly kv: KV;\n};\n\n/** Creates ResourceSnapshotSchema. It converts an optional schema type to schema type. */\nexport function rsSchema<\n const Data extends ZodType | \"raw\" | undefined = undefined,\n const Fields extends Record<string, boolean> | undefined = undefined,\n const KV extends Record<string, ZodType | \"raw\"> | undefined = undefined,\n>(\n schema: Optional<ResourceSnapshotSchema<Data, Fields, KV>>,\n): ResourceSnapshotSchema<Data, Fields, KV> {\n return schema as any;\n}\n\n/** The most generic type of ResourceSnapshotSchema. */\ntype ResourceSnapshotSchemaGeneric = ResourceSnapshotSchema<\n ZodType | \"raw\" | undefined,\n Record<string, boolean> | undefined,\n Record<string, ZodType | \"raw\"> | undefined\n>;\n\n/**\n * If Data is 'raw' in schema, we'll get bytes,\n * if it's Zod, we'll parse it via zod.\n * Or else we just got undefined in the field.\n */\ntype InferDataType<Data extends ZodType | \"raw\" | undefined> = Data extends \"raw\"\n ? Uint8Array\n : Data extends ZodType\n ? z.infer<Data>\n : undefined;\n\n/**\n * If Fields is a record of field names to booleans,\n * then if the value of the field is true, we'll require this field and throw a Error if it wasn't found.\n * If it's false and doesn't exist, we'll return undefined.\n * If Fields type is undefined, we won't set fields at all.\n */\ntype InferFieldsType<Fields extends Record<string, boolean> | undefined> = Fields extends undefined\n ? undefined\n : {\n [FieldName in keyof Fields]: Fields[FieldName] extends true\n ? SignedResourceId\n : SignedResourceId | undefined;\n };\n\n/**\n * If KV is undefined, won't set it.\n * If one of values is Zod, we'll get KV and converts it to Zod schema.\n * If the value is 'raw', just returns bytes.\n */\ntype InferKVType<KV extends Record<string, ZodType | \"raw\"> | undefined> = KV extends undefined\n ? undefined\n : {\n [FieldName in keyof KV]: KV[FieldName] extends ZodType ? z.infer<KV[FieldName]> : Uint8Array;\n };\n\n/** Infer ResourceSnapshot from ResourceShapshotSchema, S can be any ResourceSnapshotSchema. */\nexport type InferSnapshot<S extends ResourceSnapshotSchemaGeneric> = ResourceSnapshot<\n InferDataType<S[\"data\"]>,\n InferFieldsType<S[\"fields\"]>,\n InferKVType<S[\"kv\"]>\n>;\n\n/** Gets a ResourceSnapshot from PlTreeEntry. */\nexport function makeResourceSnapshot<Schema extends ResourceSnapshotSchemaGeneric>(\n res: PlTreeEntry,\n schema: Schema,\n ctx: ComputableCtx,\n): InferSnapshot<Schema>;\nexport function makeResourceSnapshot<Schema extends ResourceSnapshotSchemaGeneric>(\n res: PlTreeEntryAccessor | PlTreeNodeAccessor,\n schema: Schema,\n): InferSnapshot<Schema>;\nexport function makeResourceSnapshot<Schema extends ResourceSnapshotSchemaGeneric>(\n res: PlTreeEntry | PlTreeEntryAccessor | PlTreeNodeAccessor,\n schema: Schema,\n ctx?: ComputableCtx,\n): InferSnapshot<Schema> {\n const node =\n res instanceof PlTreeEntry\n ? notEmpty(ctx).accessor(res).node()\n : res instanceof PlTreeEntryAccessor\n ? res.node()\n : res;\n const info = node.resourceInfo;\n const result: Optional<Writable<ResourceSnapshotGeneric>, \"data\" | \"fields\" | \"kv\"> = { ...info };\n\n if (schema.data !== undefined) {\n if (schema.data === \"raw\") result.data = node.getData();\n else result.data = schema.data.parse(node.getDataAsJson());\n }\n\n if (schema.fields !== undefined) {\n const fields: Record<string, SignedResourceId | undefined> = {};\n // even if field is not defined, corresponding object field\n // with \"undefined\" value will still be added\n for (const [fieldName, required] of Object.entries(schema.fields))\n fields[fieldName] = node.traverse({\n field: fieldName,\n errorIfFieldNotSet: required,\n stableIfNotFound: !required,\n })?.id;\n result.fields = fields;\n }\n\n if (schema.kv !== undefined) {\n const kv: Record<string, unknown> = {};\n for (const [fieldName, type] of Object.entries(schema.kv)) {\n const value = node.getKeyValue(fieldName);\n\n if (value === undefined) {\n throw new Error(`Key not found ${fieldName}`);\n } else if (type === \"raw\") {\n kv[fieldName] = value;\n } else {\n kv[fieldName] = type.parse(JSON.parse(Buffer.from(value).toString(\"utf-8\")));\n }\n }\n result.kv = kv;\n }\n\n return result as any;\n}\n\n/** @deprecated */\nexport type ResourceWithData = {\n readonly id: SignedResourceId;\n readonly type: ResourceType;\n readonly fields: Map<string, SignedResourceId | undefined>;\n readonly data?: Uint8Array;\n};\n\n/** @deprecated */\nexport function treeEntryToResourceWithData(\n res: PlTreeEntry | ResourceWithData,\n fields: string[],\n ctx: ComputableCtx,\n): ResourceWithData {\n if (res instanceof PlTreeEntry) {\n const node = ctx.accessor(res).node();\n const info = node.resourceInfo;\n\n const fValues: [string, SignedResourceId | undefined][] = fields.map((name) => [\n name,\n node.getField(name)?.value?.id,\n ]);\n\n return {\n ...info,\n fields: new Map(fValues),\n data: node.getData() ?? new Uint8Array(),\n };\n }\n\n return res;\n}\n\n/** @deprecated */\nexport type ResourceWithMetadata = {\n readonly id: SignedResourceId;\n readonly type: ResourceType;\n readonly metadata: Record<string, any>;\n};\n\n/** @deprecated */\nexport function treeEntryToResourceWithMetadata(\n res: PlTreeEntry | ResourceWithMetadata,\n mdKeys: string[],\n ctx: ComputableCtx,\n): ResourceWithMetadata {\n if (!(res instanceof PlTreeEntry)) return res;\n\n const node = ctx.accessor(res).node();\n const info = node.resourceInfo;\n const mdEntries: [string, any][] = mdKeys.map((k) => [k, node.getKeyValue(k)]);\n\n return {\n ...info,\n metadata: Object.fromEntries(mdEntries),\n };\n}\n"],"mappings":";;;;AA4CA,SAAgB,SAKd,QAC0C;AAC1C,QAAO;;AA+DT,SAAgB,qBACd,KACA,QACA,KACuB;CACvB,MAAM,OACJ,eAAe,cACX,SAAS,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,GAClC,eAAe,sBACb,IAAI,MAAM,GACV;CAER,MAAM,SAAgF,EAAE,GAD3E,KAAK,cAC+E;AAEjG,KAAI,OAAO,SAAS,KAAA,EAClB,KAAI,OAAO,SAAS,MAAO,QAAO,OAAO,KAAK,SAAS;KAClD,QAAO,OAAO,OAAO,KAAK,MAAM,KAAK,eAAe,CAAC;AAG5D,KAAI,OAAO,WAAW,KAAA,GAAW;EAC/B,MAAM,SAAuD,EAAE;AAG/D,OAAK,MAAM,CAAC,WAAW,aAAa,OAAO,QAAQ,OAAO,OAAO,CAC/D,QAAO,aAAa,KAAK,SAAS;GAChC,OAAO;GACP,oBAAoB;GACpB,kBAAkB,CAAC;GACpB,CAAC,EAAE;AACN,SAAO,SAAS;;AAGlB,KAAI,OAAO,OAAO,KAAA,GAAW;EAC3B,MAAM,KAA8B,EAAE;AACtC,OAAK,MAAM,CAAC,WAAW,SAAS,OAAO,QAAQ,OAAO,GAAG,EAAE;GACzD,MAAM,QAAQ,KAAK,YAAY,UAAU;AAEzC,OAAI,UAAU,KAAA,EACZ,OAAM,IAAI,MAAM,iBAAiB,YAAY;YACpC,SAAS,MAClB,IAAG,aAAa;OAEhB,IAAG,aAAa,KAAK,MAAM,KAAK,MAAM,OAAO,KAAK,MAAM,CAAC,SAAS,QAAQ,CAAC,CAAC;;AAGhF,SAAO,KAAK;;AAGd,QAAO;;;AAYT,SAAgB,4BACd,KACA,QACA,KACkB;AAClB,KAAI,eAAe,aAAa;EAC9B,MAAM,OAAO,IAAI,SAAS,IAAI,CAAC,MAAM;EACrC,MAAM,OAAO,KAAK;EAElB,MAAM,UAAoD,OAAO,KAAK,SAAS,CAC7E,MACA,KAAK,SAAS,KAAK,EAAE,OAAO,GAC7B,CAAC;AAEF,SAAO;GACL,GAAG;GACH,QAAQ,IAAI,IAAI,QAAQ;GACxB,MAAM,KAAK,SAAS,IAAI,IAAI,YAAY;GACzC;;AAGH,QAAO;;;AAWT,SAAgB,gCACd,KACA,QACA,KACsB;AACtB,KAAI,EAAE,eAAe,aAAc,QAAO;CAE1C,MAAM,OAAO,IAAI,SAAS,IAAI,CAAC,MAAM;CACrC,MAAM,OAAO,KAAK;CAClB,MAAM,YAA6B,OAAO,KAAK,MAAM,CAAC,GAAG,KAAK,YAAY,EAAE,CAAC,CAAC;AAE9E,QAAO;EACL,GAAG;EACH,UAAU,OAAO,YAAY,UAAU;EACxC"}
package/dist/state.cjs CHANGED
@@ -110,8 +110,8 @@ var PlTreeResource = class {
110
110
  } else {
111
111
  if (step.assertFieldType !== void 0 && field.type !== step.assertFieldType) throw new Error(`Unexpected field type: expected ${step.assertFieldType} but got ${field.type} for the field name ${step.field}`);
112
112
  const ret = {};
113
- if ((0, _milaboratories_pl_client.isNotNullResourceId)(field.value)) ret.value = field.value;
114
- if ((0, _milaboratories_pl_client.isNotNullResourceId)(field.error)) ret.error = field.error;
113
+ if ((0, _milaboratories_pl_client.isNotNullSignedResourceId)(field.value)) ret.value = field.value;
114
+ if ((0, _milaboratories_pl_client.isNotNullSignedResourceId)(field.error)) ret.error = field.error;
115
115
  if (ret.value === void 0 && ret.error === void 0) onUnstable("field_not_resolved:" + step.field);
116
116
  field.change.attachWatcher(watcher);
117
117
  return ret;
@@ -126,7 +126,7 @@ var PlTreeResource = class {
126
126
  return this.outputsLocked;
127
127
  }
128
128
  get isReadyOrError() {
129
- return this.error !== _milaboratories_pl_client.NullResourceId || this.resourceReady || this.originalResourceId !== _milaboratories_pl_client.NullResourceId;
129
+ return this.error !== _milaboratories_pl_client.NullSignedResourceId || this.resourceReady || this.originalResourceId !== _milaboratories_pl_client.NullSignedResourceId;
130
130
  }
131
131
  getIsFinal(watcher) {
132
132
  this.finalChanged?.attachWatcher(watcher);
@@ -137,7 +137,7 @@ var PlTreeResource = class {
137
137
  return this.isReadyOrError;
138
138
  }
139
139
  getError(watcher) {
140
- if ((0, _milaboratories_pl_client.isNullResourceId)(this.error)) {
140
+ if ((0, _milaboratories_pl_client.isNullSignedResourceId)(this.error)) {
141
141
  this.resourceStateChange?.attachWatcher(watcher);
142
142
  return;
143
143
  } else return this.error;
@@ -288,13 +288,13 @@ var PlTreeState = class {
288
288
  let changed = false;
289
289
  resource.version += 1;
290
290
  if (resource.originalResourceId !== rd.originalResourceId) {
291
- if (resource.originalResourceId !== _milaboratories_pl_client.NullResourceId) unexpectedTransitionError("originalResourceId can't change after it is set");
291
+ if (resource.originalResourceId !== _milaboratories_pl_client.NullSignedResourceId) unexpectedTransitionError("originalResourceId can't change after it is set");
292
292
  resource.originalResourceId = rd.originalResourceId;
293
293
  (0, _milaboratories_ts_helpers.notEmpty)(resource.resourceStateChange).markChanged(`originalResourceId changed for ${(0, _milaboratories_pl_client.resourceIdToString)(resource.id)}`);
294
294
  changed = true;
295
295
  }
296
- if (resource.error !== rd.error) {
297
- if ((0, _milaboratories_pl_client.isNotNullResourceId)(resource.error)) unexpectedTransitionError("resource can't change attached error after it is set");
296
+ if ((0, _milaboratories_pl_client.isNotNullSignedResourceId)(rd.error) && resource.error !== rd.error) {
297
+ if ((0, _milaboratories_pl_client.isNotNullSignedResourceId)(resource.error)) unexpectedTransitionError("resource can't change attached error after it is set");
298
298
  resource.error = rd.error;
299
299
  incrementRefs.push(resource.error);
300
300
  (0, _milaboratories_ts_helpers.notEmpty)(resource.resourceStateChange).markChanged(`error changed for ${(0, _milaboratories_pl_client.resourceIdToString)(resource.id)}`);
@@ -304,8 +304,8 @@ var PlTreeState = class {
304
304
  let field = resource.fieldsMap.get(fd.name);
305
305
  if (!field) {
306
306
  field = new PlTreeField(fd.name, fd.type, fd.value, fd.error, fd.status, fd.valueIsFinal, resource.version);
307
- if ((0, _milaboratories_pl_client.isNotNullResourceId)(fd.value)) incrementRefs.push(fd.value);
308
- if ((0, _milaboratories_pl_client.isNotNullResourceId)(fd.error)) incrementRefs.push(fd.error);
307
+ if ((0, _milaboratories_pl_client.isNotNullSignedResourceId)(fd.value)) incrementRefs.push(fd.value);
308
+ if ((0, _milaboratories_pl_client.isNotNullSignedResourceId)(fd.error)) incrementRefs.push(fd.error);
309
309
  if (fd.type === "Input" || fd.type === "Service") {
310
310
  if (resource.inputsLocked) unexpectedTransitionError(`adding ${fd.type} (${fd.name}) field while inputs locked`);
311
311
  (0, _milaboratories_ts_helpers.notEmpty)(resource.inputAndServiceFieldListChanged).markChanged(`new ${fd.type} field ${fd.name} added to ${(0, _milaboratories_pl_client.resourceIdToString)(resource.id)}`);
@@ -332,16 +332,16 @@ var PlTreeState = class {
332
332
  changed = true;
333
333
  }
334
334
  if (field.value !== fd.value) {
335
- if ((0, _milaboratories_pl_client.isNotNullResourceId)(field.value)) decrementRefs.push(field.value);
335
+ if ((0, _milaboratories_pl_client.isNotNullSignedResourceId)(field.value)) decrementRefs.push(field.value);
336
336
  field.value = fd.value;
337
- if ((0, _milaboratories_pl_client.isNotNullResourceId)(fd.value)) incrementRefs.push(fd.value);
337
+ if ((0, _milaboratories_pl_client.isNotNullSignedResourceId)(fd.value)) incrementRefs.push(fd.value);
338
338
  field.change.markChanged(`field ${fd.name} value changed in ${(0, _milaboratories_pl_client.resourceIdToString)(resource.id)}`);
339
339
  changed = true;
340
340
  }
341
341
  if (field.error !== fd.error) {
342
- if ((0, _milaboratories_pl_client.isNotNullResourceId)(field.error)) decrementRefs.push(field.error);
342
+ if ((0, _milaboratories_pl_client.isNotNullSignedResourceId)(field.error)) decrementRefs.push(field.error);
343
343
  field.error = fd.error;
344
- if ((0, _milaboratories_pl_client.isNotNullResourceId)(fd.error)) incrementRefs.push(fd.error);
344
+ if ((0, _milaboratories_pl_client.isNotNullSignedResourceId)(fd.error)) incrementRefs.push(fd.error);
345
345
  field.change.markChanged(`field ${fd.name} error changed in ${(0, _milaboratories_pl_client.resourceIdToString)(resource.id)}`);
346
346
  changed = true;
347
347
  }
@@ -363,8 +363,8 @@ var PlTreeState = class {
363
363
  if (field.type === "Input" || field.type === "Service" || field.type === "Output") unexpectedTransitionError(`removal of ${field.type} field ${fieldName}`);
364
364
  field.change.markChanged(`dynamic field ${fieldName} removed from ${(0, _milaboratories_pl_client.resourceIdToString)(resource.id)}`);
365
365
  fields.delete(fieldName);
366
- if ((0, _milaboratories_pl_client.isNotNullResourceId)(field.value)) decrementRefs.push(field.value);
367
- if ((0, _milaboratories_pl_client.isNotNullResourceId)(field.error)) decrementRefs.push(field.error);
366
+ if ((0, _milaboratories_pl_client.isNotNullSignedResourceId)(field.value)) decrementRefs.push(field.value);
367
+ if ((0, _milaboratories_pl_client.isNotNullSignedResourceId)(field.error)) decrementRefs.push(field.error);
368
368
  (0, _milaboratories_ts_helpers.notEmpty)(resource.dynamicFieldListChanged).markChanged(`dynamic field ${fieldName} removed from ${(0, _milaboratories_pl_client.resourceIdToString)(resource.id)}`);
369
369
  }
370
370
  });
@@ -414,11 +414,11 @@ var PlTreeState = class {
414
414
  } else {
415
415
  resource = new PlTreeResource(rd);
416
416
  resource.verifyReadyState();
417
- if ((0, _milaboratories_pl_client.isNotNullResourceId)(resource.error)) incrementRefs.push(resource.error);
417
+ if ((0, _milaboratories_pl_client.isNotNullSignedResourceId)(resource.error)) incrementRefs.push(resource.error);
418
418
  for (const fd of rd.fields) {
419
419
  const field = new PlTreeField(fd.name, fd.type, fd.value, fd.error, fd.status, fd.valueIsFinal, InitialResourceVersion);
420
- if ((0, _milaboratories_pl_client.isNotNullResourceId)(fd.value)) incrementRefs.push(fd.value);
421
- if ((0, _milaboratories_pl_client.isNotNullResourceId)(fd.error)) incrementRefs.push(fd.error);
420
+ if ((0, _milaboratories_pl_client.isNotNullSignedResourceId)(fd.value)) incrementRefs.push(fd.value);
421
+ if ((0, _milaboratories_pl_client.isNotNullSignedResourceId)(fd.error)) incrementRefs.push(fd.error);
422
422
  resource.fieldsMap.set(fd.name, field);
423
423
  }
424
424
  for (const kv of rd.kv) resource.kv.set(kv.key, kv.value);
@@ -447,11 +447,11 @@ var PlTreeState = class {
447
447
  res.refCount--;
448
448
  if (res.refCount === 0 && res.id !== this.root) {
449
449
  res.fieldsMap.forEach((field) => {
450
- if ((0, _milaboratories_pl_client.isNotNullResourceId)(field.value)) nextRefs.push(field.value);
451
- if ((0, _milaboratories_pl_client.isNotNullResourceId)(field.error)) nextRefs.push(field.error);
450
+ if ((0, _milaboratories_pl_client.isNotNullSignedResourceId)(field.value)) nextRefs.push(field.value);
451
+ if ((0, _milaboratories_pl_client.isNotNullSignedResourceId)(field.error)) nextRefs.push(field.error);
452
452
  field.change.markChanged(`field ${field.name} removed during garbage collection of ${(0, _milaboratories_pl_client.resourceIdToString)(res.id)}`);
453
453
  });
454
- if ((0, _milaboratories_pl_client.isNotNullResourceId)(res.error)) nextRefs.push(res.error);
454
+ if ((0, _milaboratories_pl_client.isNotNullSignedResourceId)(res.error)) nextRefs.push(res.error);
455
455
  res.resourceRemoved.markChanged(`resource removed during garbage collection: ${(0, _milaboratories_pl_client.resourceIdToString)(res.id)}`);
456
456
  this.resources.delete(rid);
457
457
  }