@xyo-network/payload-builder 3.6.0-rc.4 → 3.6.0-rc.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,23 +1,31 @@
1
1
  import { assertEx } from '@xylabs/assert'
2
- import type { AnyObject } from '@xylabs/object'
2
+ import type { AnyObject, EmptyObject } from '@xylabs/object'
3
3
  import {
4
4
  isJsonObject, omitBy, toJson,
5
5
  } from '@xylabs/object'
6
6
  import type { Promisable } from '@xylabs/promise'
7
7
  import { removeEmptyFields } from '@xyo-network/hash'
8
- import type { Payload, Schema } from '@xyo-network/payload-model'
8
+ import type {
9
+ DeepOmitStartsWith,
10
+ Payload, Schema,
11
+ WithOptionalSchema,
12
+ WithoutClientMeta,
13
+ WithoutMeta,
14
+ WithoutPrivateStorageMeta,
15
+ WithoutSchema,
16
+ WithoutStorageMeta,
17
+ } from '@xyo-network/payload-model'
9
18
 
10
- import { PayloadBuilder } from './Builder.ts'
11
19
  import type { PayloadBuilderOptions } from './Options.ts'
12
20
 
13
- export type WithOptionalSchema<T extends Payload> = Omit<T, 'schema'> & Partial<T>
14
-
15
- export type WithoutSchema<T extends WithOptionalSchema<Payload>> = Omit<T, 'schema'>
21
+ export const omitByPrefix = <T extends EmptyObject, P extends string>(payload: T, prefix: P, maxDepth = 100): DeepOmitStartsWith<T, P> => {
22
+ return omitBy(payload, omitByPrefixPredicate(prefix), maxDepth) as unknown as DeepOmitStartsWith<T, P>
23
+ }
16
24
 
17
- export const removeMetaAndSchema = <T extends Payload>(payload: Partial<WithOptionalSchema<T>>): WithoutSchema<T> => {
18
- const { ...result } = PayloadBuilder.omitMeta(payload as T) as WithOptionalSchema<T>
25
+ export const omitSchema = <T extends WithOptionalSchema>(payload: T): WithoutSchema<T> => {
26
+ const result = structuredClone(payload)
19
27
  delete result.schema
20
- return result as Omit<T, 'schema'>
28
+ return result
21
29
  }
22
30
 
23
31
  const omitByPrefixPredicate = (prefix: string) => (_: unknown, key: string) => {
@@ -25,78 +33,75 @@ const omitByPrefixPredicate = (prefix: string) => (_: unknown, key: string) => {
25
33
  return key.startsWith(prefix)
26
34
  }
27
35
 
28
- export class PayloadBuilderBase<T extends Payload = Payload<AnyObject>, O extends PayloadBuilderOptions<T> = PayloadBuilderOptions<T>> {
29
- protected _fields?: Partial<WithoutSchema<T>>
36
+ export class PayloadBuilderBase<T extends Payload = Payload<AnyObject>,
37
+ O extends PayloadBuilderOptions<T> = PayloadBuilderOptions<T>> {
38
+ protected _fields?: WithoutMeta<WithoutSchema<T>>
30
39
  protected _schema: Schema
31
40
 
32
41
  constructor(readonly options: O) {
33
42
  const { schema, fields } = options
34
43
  this._schema = schema
35
- this._fields = removeMetaAndSchema(removeEmptyFields(structuredClone(fields ?? {})))
44
+ if (fields) {
45
+ this.fields(fields)
46
+ }
36
47
  }
37
48
 
38
49
  static dataHashableFields<T extends Payload>(
39
50
  schema: Schema,
40
51
  payload: WithoutSchema<T>,
41
52
 
42
- ): Promisable<Payload> {
53
+ ): Promisable<WithoutMeta<T>> {
43
54
  const cleanFields = removeEmptyFields({ ...payload, schema })
44
55
  assertEx(
45
56
  cleanFields === undefined || isJsonObject(cleanFields),
46
57
  () => `Fields must be JsonObject: ${JSON.stringify(toJson(cleanFields), null, 2)}`,
47
58
  )
48
- return this.omitMeta(cleanFields) as T
59
+ return this.omitMeta(cleanFields) as WithoutMeta<T>
49
60
  }
50
61
 
51
- static omitClientMeta<T extends Payload>(payload: T, maxDepth?: number): T
52
- static omitClientMeta<T extends Payload>(payloads: T[], maxDepth?: number): T[]
53
- static omitClientMeta<T extends Payload>(payloads: T | T[], maxDepth = 100): T | T[] {
62
+ static omitClientMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutClientMeta<T>
63
+ static omitClientMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutClientMeta<T>[]
64
+ static omitClientMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 100): WithoutClientMeta<T> | WithoutClientMeta<T>[] {
54
65
  return Array.isArray(payloads)
55
- ? payloads.map(payload => this.omitClientMeta(payload, maxDepth)) as T[]
56
- : omitBy(payloads, omitByPrefixPredicate('$'), maxDepth) as T
66
+ ? payloads.map(payload => this.omitClientMeta(payload, maxDepth))
67
+ : omitByPrefix(payloads, '$', maxDepth)
57
68
  }
58
69
 
59
- static omitMeta<T extends Payload>(payload: T, maxDepth?: number): T
60
- static omitMeta<T extends Payload>(payloads: T[], maxDepth?: number): T[]
61
- static omitMeta<T extends Payload>(payloads: T | T[], maxDepth = 100): T | T[] {
70
+ static omitMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutMeta<T>
71
+ static omitMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutMeta<T>[]
72
+ static omitMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 100): WithoutMeta<T> | WithoutMeta<T>[] {
62
73
  return Array.isArray(payloads)
63
- ? this.omitStorageMeta(this.omitClientMeta(payloads, maxDepth), maxDepth)
64
- : this.omitStorageMeta(this.omitClientMeta(payloads, maxDepth), maxDepth)
74
+ ? payloads.map(payload => this.omitMeta(payload, maxDepth))
75
+ : this.omitStorageMeta(this.omitClientMeta(payloads, maxDepth), maxDepth) as unknown as WithoutMeta<T>
65
76
  }
66
77
 
67
- static omitPrivateStorageMeta<T extends Payload>(payload: T, maxDepth?: number): T
68
- static omitPrivateStorageMeta<T extends Payload>(payloads: T[], maxDepth?: number): T[]
69
- static omitPrivateStorageMeta<T extends Payload>(payloads: T | T[], maxDepth = 100): T | T[] {
78
+ static omitPrivateStorageMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutPrivateStorageMeta<T>
79
+ static omitPrivateStorageMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutPrivateStorageMeta<T>[]
80
+ static omitPrivateStorageMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 100): WithoutPrivateStorageMeta<T> | WithoutPrivateStorageMeta<T>[] {
70
81
  return Array.isArray(payloads)
71
- ? payloads.map(payload => this.omitPrivateStorageMeta(payload, maxDepth)) as T[]
72
- : omitBy(payloads, omitByPrefixPredicate('_'), maxDepth) as T
82
+ ? payloads.map(payload => this.omitPrivateStorageMeta(payload, maxDepth))
83
+ : omitByPrefix(payloads, '__', maxDepth)
73
84
  }
74
85
 
75
- static omitStorageMeta<T extends Payload>(payload: T, maxDepth?: number): T
76
- static omitStorageMeta<T extends Payload>(payloads: T[], maxDepth?: number): T[]
77
- static omitStorageMeta<T extends Payload>(payloads: T | T[], maxDepth = 100): T | T[] {
86
+ static omitStorageMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutStorageMeta<T>
87
+ static omitStorageMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutStorageMeta<T>[]
88
+ static omitStorageMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 100): WithoutStorageMeta<T> | WithoutStorageMeta<T>[] {
78
89
  return Array.isArray(payloads)
79
- ? payloads.map(payload => this.omitStorageMeta(payload, maxDepth)) as T[]
80
- : omitBy(payloads, omitByPrefixPredicate('_'), maxDepth) as T
90
+ ? payloads.map(payload => this.omitStorageMeta(payload, maxDepth))
91
+ : omitByPrefix(payloads, '_', maxDepth)
81
92
  }
82
93
 
83
94
  async dataHashableFields() {
84
95
  return await PayloadBuilderBase.dataHashableFields(
85
96
  assertEx(this._schema, () => 'Payload: Missing Schema'),
86
97
  // TDOD: Add verification that required fields are present
87
- this._fields as T,
98
+ this._fields as WithoutSchema<T>,
88
99
  )
89
100
  }
90
101
 
91
- fields(fields: WithOptionalSchema<T>) {
92
- if (fields) {
93
- const fieldsClone = structuredClone(fields)
94
- const { schema } = fieldsClone
95
- if (schema) {
96
- this.schema(schema)
97
- }
98
- this._fields = removeEmptyFields(removeMetaAndSchema<T>(fieldsClone))
99
- }
102
+ fields(fields: WithoutMeta<WithoutSchema<T>>) {
103
+ // we need to do the cast here since ts seems to not like nested, yet same, generics
104
+ this._fields = omitSchema(PayloadBuilderBase.omitMeta(removeEmptyFields(structuredClone(fields)))) as unknown as WithoutMeta<WithoutSchema<T>>
100
105
  return this
101
106
  }
102
107
 
package/src/Options.ts CHANGED
@@ -1,9 +1,11 @@
1
1
  import type { Logger } from '@xylabs/logger'
2
- import type { JsonObject } from '@xylabs/object'
3
- import type { Schema } from '@xyo-network/payload-model'
2
+ import type { EmptyObject, JsonObject } from '@xylabs/object'
3
+ import type {
4
+ Schema, WithoutMeta, WithoutSchema,
5
+ } from '@xyo-network/payload-model'
4
6
 
5
- export interface PayloadBuilderOptions<T> {
6
- readonly fields?: Partial<T>
7
+ export interface PayloadBuilderOptions<T extends EmptyObject = EmptyObject> {
8
+ readonly fields?: WithoutMeta<WithoutSchema<T>>
7
9
  readonly logger?: Logger
8
10
  readonly meta?: JsonObject
9
11
  readonly schema: Schema