@xyo-network/payload-builder 2.89.0-rc.1 → 2.89.0-rc.10
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.
- package/dist/browser/Builder.d.cts +12 -17
- package/dist/browser/Builder.d.cts.map +1 -1
- package/dist/browser/Builder.d.mts +12 -17
- package/dist/browser/Builder.d.mts.map +1 -1
- package/dist/browser/Builder.d.ts +12 -17
- package/dist/browser/Builder.d.ts.map +1 -1
- package/dist/browser/BuilderBase.d.cts +17 -0
- package/dist/browser/BuilderBase.d.cts.map +1 -0
- package/dist/browser/BuilderBase.d.mts +17 -0
- package/dist/browser/BuilderBase.d.mts.map +1 -0
- package/dist/browser/BuilderBase.d.ts +17 -0
- package/dist/browser/BuilderBase.d.ts.map +1 -0
- package/dist/browser/Options.d.cts +10 -0
- package/dist/browser/Options.d.cts.map +1 -0
- package/dist/browser/Options.d.mts +10 -0
- package/dist/browser/Options.d.mts.map +1 -0
- package/dist/browser/Options.d.ts +10 -0
- package/dist/browser/Options.d.ts.map +1 -0
- package/dist/browser/index.cjs +78 -39
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.d.cts +2 -0
- package/dist/browser/index.d.cts.map +1 -1
- package/dist/browser/index.d.mts +2 -0
- package/dist/browser/index.d.mts.map +1 -1
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +79 -40
- package/dist/browser/index.js.map +1 -1
- package/dist/node/Builder.d.cts +12 -17
- package/dist/node/Builder.d.cts.map +1 -1
- package/dist/node/Builder.d.mts +12 -17
- package/dist/node/Builder.d.mts.map +1 -1
- package/dist/node/Builder.d.ts +12 -17
- package/dist/node/Builder.d.ts.map +1 -1
- package/dist/node/BuilderBase.d.cts +17 -0
- package/dist/node/BuilderBase.d.cts.map +1 -0
- package/dist/node/BuilderBase.d.mts +17 -0
- package/dist/node/BuilderBase.d.mts.map +1 -0
- package/dist/node/BuilderBase.d.ts +17 -0
- package/dist/node/BuilderBase.d.ts.map +1 -0
- package/dist/node/Options.d.cts +10 -0
- package/dist/node/Options.d.cts.map +1 -0
- package/dist/node/Options.d.mts +10 -0
- package/dist/node/Options.d.mts.map +1 -0
- package/dist/node/Options.d.ts +10 -0
- package/dist/node/Options.d.ts.map +1 -0
- package/dist/node/index.cjs +78 -39
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.d.cts +2 -0
- package/dist/node/index.d.cts.map +1 -1
- package/dist/node/index.d.mts +2 -0
- package/dist/node/index.d.mts.map +1 -1
- package/dist/node/index.d.ts +2 -0
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +77 -39
- package/dist/node/index.js.map +1 -1
- package/package.json +8 -6
- package/src/Builder.ts +48 -60
- package/src/BuilderBase.ts +57 -0
- package/src/Options.ts +10 -0
- package/src/index.ts +2 -0
package/src/Builder.ts
CHANGED
|
@@ -1,37 +1,26 @@
|
|
|
1
|
-
import { assertEx } from '@xylabs/assert'
|
|
2
1
|
import { Hash } from '@xylabs/hex'
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { AnyObject } from '@xylabs/object'
|
|
3
|
+
import { PayloadHasher } from '@xyo-network/hash'
|
|
5
4
|
import { Payload, PayloadWithMeta, WithMeta } from '@xyo-network/payload-model'
|
|
6
5
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
meta?: JsonObject
|
|
10
|
-
schema: string
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export class PayloadBuilder<T extends Payload = Payload> {
|
|
14
|
-
private _$meta?: JsonObject
|
|
15
|
-
private _fields: Partial<T> = {}
|
|
16
|
-
private _schema: string
|
|
17
|
-
|
|
18
|
-
constructor({ schema, fields, meta }: PayloadBuilderOptions<T>) {
|
|
19
|
-
this._schema = schema
|
|
20
|
-
this._fields = fields ?? {}
|
|
21
|
-
this._$meta = meta
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
get schema() {
|
|
25
|
-
this._schema = this._schema ?? this._fields['schema']
|
|
26
|
-
return this._schema
|
|
27
|
-
}
|
|
6
|
+
import { PayloadBuilderBase } from './BuilderBase'
|
|
7
|
+
import { PayloadBuilderOptions } from './Options'
|
|
28
8
|
|
|
9
|
+
export class PayloadBuilder<
|
|
10
|
+
T extends Payload = Payload<AnyObject>,
|
|
11
|
+
O extends PayloadBuilderOptions<T> = PayloadBuilderOptions<T>,
|
|
12
|
+
> extends PayloadBuilderBase<T, O> {
|
|
29
13
|
static async build<T extends Payload>(payload: T) {
|
|
30
|
-
|
|
31
|
-
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
15
|
+
const { schema, $hash, $meta, ...fields } = payload as WithMeta<T>
|
|
16
|
+
const builder = new PayloadBuilder<T>({ fields: fields as T, meta: $meta, schema: payload.schema })
|
|
32
17
|
return await builder.build()
|
|
33
18
|
}
|
|
34
19
|
|
|
20
|
+
static async dataHash<T extends Payload>(payload: T): Promise<Hash> {
|
|
21
|
+
return (await this.build(payload)).$hash
|
|
22
|
+
}
|
|
23
|
+
|
|
35
24
|
static async dataHashPairs<T extends Payload>(payloads: T[]): Promise<[WithMeta<T>, Hash][]> {
|
|
36
25
|
return await Promise.all(
|
|
37
26
|
payloads.map(async (payload) => {
|
|
@@ -41,27 +30,39 @@ export class PayloadBuilder<T extends Payload = Payload> {
|
|
|
41
30
|
)
|
|
42
31
|
}
|
|
43
32
|
|
|
44
|
-
static async dataHashes
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
33
|
+
static async dataHashes(payloads: undefined): Promise<undefined>
|
|
34
|
+
static async dataHashes<T extends Payload>(payloads: T[]): Promise<Hash[]>
|
|
35
|
+
static async dataHashes<T extends Payload>(payloads?: T[]): Promise<Hash[] | undefined> {
|
|
36
|
+
return payloads
|
|
37
|
+
? await Promise.all(
|
|
38
|
+
payloads.map(async (payload) => {
|
|
39
|
+
const built = await PayloadBuilder.build(payload)
|
|
40
|
+
return built.$hash
|
|
41
|
+
}),
|
|
42
|
+
)
|
|
43
|
+
: undefined
|
|
51
44
|
}
|
|
52
45
|
|
|
53
46
|
static async filterExclude<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {
|
|
47
|
+
return await PayloadHasher.filterExcludeByHash(await this.filterExcludeByDataHash(payloads, hash), hash)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
static async filterExcludeByDataHash<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {
|
|
54
51
|
const hashes = Array.isArray(hash) ? hash : [hash]
|
|
55
|
-
return (await this.
|
|
52
|
+
return (await this.dataHashPairs(payloads)).filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0])
|
|
56
53
|
}
|
|
57
54
|
|
|
58
|
-
static async
|
|
55
|
+
static async filterIncludeByDataHash<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {
|
|
59
56
|
const hashes = Array.isArray(hash) ? hash : [hash]
|
|
60
|
-
return (await this.
|
|
57
|
+
return (await this.dataHashPairs(payloads)).filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0])
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
static async findByDataHash<T extends Payload>(payloads: T[] = [], hash: Hash): Promise<T | undefined> {
|
|
61
|
+
return (await this.dataHashPairs(payloads)).find(([_, objHash]) => objHash === hash)?.[0]
|
|
61
62
|
}
|
|
62
63
|
|
|
63
|
-
static async
|
|
64
|
-
return
|
|
64
|
+
static async hash<T extends Payload>(payload: T): Promise<Hash> {
|
|
65
|
+
return await PayloadHasher.hash(payload)
|
|
65
66
|
}
|
|
66
67
|
|
|
67
68
|
/**
|
|
@@ -73,11 +74,17 @@ export class PayloadBuilder<T extends Payload = Payload> {
|
|
|
73
74
|
return await Promise.all(
|
|
74
75
|
payloads.map<Promise<[WithMeta<T>, Hash]>>(async (payload) => {
|
|
75
76
|
const built = await PayloadBuilder.build(payload)
|
|
76
|
-
return [built, await
|
|
77
|
+
return [built, await PayloadBuilder.hash(built)]
|
|
77
78
|
}),
|
|
78
79
|
)
|
|
79
80
|
}
|
|
80
81
|
|
|
82
|
+
static async hashes(payloads: undefined): Promise<undefined>
|
|
83
|
+
static async hashes<T extends Payload>(payloads: T[]): Promise<Hash[]>
|
|
84
|
+
static async hashes<T extends Payload>(payloads?: T[]): Promise<Hash[] | undefined> {
|
|
85
|
+
return await PayloadHasher.hashes(payloads)
|
|
86
|
+
}
|
|
87
|
+
|
|
81
88
|
static async toDataHashMap<T extends Payload>(objs: T[]): Promise<Record<Hash, T>> {
|
|
82
89
|
const result: Record<Hash, T> = {}
|
|
83
90
|
for (const pair of await this.dataHashPairs(objs)) {
|
|
@@ -99,14 +106,9 @@ export class PayloadBuilder<T extends Payload = Payload> {
|
|
|
99
106
|
return result
|
|
100
107
|
}
|
|
101
108
|
|
|
102
|
-
$meta(fields?: JsonObject) {
|
|
103
|
-
this._$meta = fields
|
|
104
|
-
return this
|
|
105
|
-
}
|
|
106
|
-
|
|
107
109
|
async build(): Promise<WithMeta<T>> {
|
|
108
|
-
const dataHashableFields = this.dataHashableFields()
|
|
109
|
-
const $hash = await
|
|
110
|
+
const dataHashableFields = await this.dataHashableFields()
|
|
111
|
+
const $hash = await PayloadBuilder.hash(dataHashableFields)
|
|
110
112
|
const hashableFields: PayloadWithMeta = { ...dataHashableFields, $hash }
|
|
111
113
|
|
|
112
114
|
//only add $meta if it exists and has at least one field
|
|
@@ -115,18 +117,4 @@ export class PayloadBuilder<T extends Payload = Payload> {
|
|
|
115
117
|
}
|
|
116
118
|
return hashableFields as WithMeta<T>
|
|
117
119
|
}
|
|
118
|
-
|
|
119
|
-
dataHashableFields() {
|
|
120
|
-
return {
|
|
121
|
-
...removeEmptyFields(deepOmitPrefixedFields(deepOmitPrefixedFields(this._fields, '$'), '_')),
|
|
122
|
-
schema: assertEx(this.schema, 'Payload: Missing Schema'),
|
|
123
|
-
} as T
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
fields(fields?: Partial<T>) {
|
|
127
|
-
if (fields) {
|
|
128
|
-
this._fields = { ...this._fields, ...removeEmptyFields(fields) }
|
|
129
|
-
}
|
|
130
|
-
return this
|
|
131
|
-
}
|
|
132
120
|
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { assertEx } from '@xylabs/assert'
|
|
2
|
+
import { AnyObject, JsonObject } from '@xylabs/object'
|
|
3
|
+
import { Promisable } from '@xylabs/promise'
|
|
4
|
+
import { deepOmitPrefixedFields, removeEmptyFields } from '@xyo-network/hash'
|
|
5
|
+
import { Payload, Schema, WithMeta } from '@xyo-network/payload-model'
|
|
6
|
+
|
|
7
|
+
import { PayloadBuilderOptions } from './Options'
|
|
8
|
+
|
|
9
|
+
export class PayloadBuilderBase<T extends Payload = Payload<AnyObject>, O extends PayloadBuilderOptions<T> = PayloadBuilderOptions<T>> {
|
|
10
|
+
protected _$meta?: JsonObject
|
|
11
|
+
protected _fields?: Omit<T, 'schema' | '$hash' | '$meta'>
|
|
12
|
+
protected _schema: Schema
|
|
13
|
+
|
|
14
|
+
constructor(readonly options: O) {
|
|
15
|
+
const { schema, fields, meta } = options
|
|
16
|
+
this._schema = schema
|
|
17
|
+
this._fields = fields
|
|
18
|
+
this._$meta = meta
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
$meta(meta?: JsonObject) {
|
|
22
|
+
this._$meta = meta ?? (this._fields as WithMeta<T>).$meta
|
|
23
|
+
return this
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async dataHashableFields(): Promise<T> {
|
|
27
|
+
return deepOmitPrefixedFields(await this.hashableFields(), '$')
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
//we do not require sending in $hash since it will be generated anyway
|
|
31
|
+
fields(fields: Omit<WithMeta<T>, '$hash' | 'schema'> & Partial<Pick<WithMeta<T>, '$hash' | 'schema'>>) {
|
|
32
|
+
if (fields) {
|
|
33
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
34
|
+
const { $meta, $hash, schema, ...fieldsOnly } = fields as WithMeta<T>
|
|
35
|
+
if ($meta) {
|
|
36
|
+
this.$meta($meta)
|
|
37
|
+
}
|
|
38
|
+
if (schema) {
|
|
39
|
+
this.schema(schema)
|
|
40
|
+
}
|
|
41
|
+
this._fields = { ...this._fields, ...removeEmptyFields(fieldsOnly) }
|
|
42
|
+
}
|
|
43
|
+
return this
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
hashableFields(): Promisable<T> {
|
|
47
|
+
const schema = assertEx(this._schema, 'Payload: Missing Schema')
|
|
48
|
+
return {
|
|
49
|
+
...removeEmptyFields(deepOmitPrefixedFields(this._fields ?? {}, '_')),
|
|
50
|
+
schema,
|
|
51
|
+
} as T
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
schema(value: Schema) {
|
|
55
|
+
this._schema = value
|
|
56
|
+
}
|
|
57
|
+
}
|
package/src/Options.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Logger } from '@xylabs/logger'
|
|
2
|
+
import { JsonObject } from '@xylabs/object'
|
|
3
|
+
import { Schema } from '@xyo-network/payload-model'
|
|
4
|
+
|
|
5
|
+
export interface PayloadBuilderOptions<T> {
|
|
6
|
+
readonly fields?: Omit<T, 'schema' | '$hash' | '$meta'>
|
|
7
|
+
readonly logger?: Logger
|
|
8
|
+
readonly meta?: JsonObject
|
|
9
|
+
readonly schema: Schema
|
|
10
|
+
}
|
package/src/index.ts
CHANGED