@xyo-network/payload 2.21.11
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/LICENSE +165 -0
- package/README.md +79 -0
- package/babel.config.json +5 -0
- package/dist/cjs/Builder/Builder.d.ts +15 -0
- package/dist/cjs/Builder/Builder.js +31 -0
- package/dist/cjs/Builder/Builder.js.map +1 -0
- package/dist/cjs/Builder/index.d.ts +1 -0
- package/dist/cjs/Builder/index.js +5 -0
- package/dist/cjs/Builder/index.js.map +1 -0
- package/dist/cjs/Huri/Huri.d.ts +29 -0
- package/dist/cjs/Huri/Huri.js +111 -0
- package/dist/cjs/Huri/Huri.js.map +1 -0
- package/dist/cjs/Huri/index.d.ts +1 -0
- package/dist/cjs/Huri/index.js +5 -0
- package/dist/cjs/Huri/index.js.map +1 -0
- package/dist/cjs/Query/QueryPayload.d.ts +11 -0
- package/dist/cjs/Query/QueryPayload.js +3 -0
- package/dist/cjs/Query/QueryPayload.js.map +1 -0
- package/dist/cjs/Query/index.d.ts +1 -0
- package/dist/cjs/Query/index.js +5 -0
- package/dist/cjs/Query/index.js.map +1 -0
- package/dist/cjs/Schema/Payload.d.ts +10 -0
- package/dist/cjs/Schema/Payload.js +3 -0
- package/dist/cjs/Schema/Payload.js.map +1 -0
- package/dist/cjs/Schema/index.d.ts +1 -0
- package/dist/cjs/Schema/index.js +5 -0
- package/dist/cjs/Schema/index.js.map +1 -0
- package/dist/cjs/SchemaNameValidator.d.ts +73 -0
- package/dist/cjs/SchemaNameValidator.js +135 -0
- package/dist/cjs/SchemaNameValidator.js.map +1 -0
- package/dist/cjs/Test/index.d.ts +1 -0
- package/dist/cjs/Test/index.js +5 -0
- package/dist/cjs/Test/index.js.map +1 -0
- package/dist/cjs/Test/testPayload.d.ts +5 -0
- package/dist/cjs/Test/testPayload.js +19 -0
- package/dist/cjs/Test/testPayload.js.map +1 -0
- package/dist/cjs/Validator/BodyValidator.d.ts +9 -0
- package/dist/cjs/Validator/BodyValidator.js +29 -0
- package/dist/cjs/Validator/BodyValidator.js.map +1 -0
- package/dist/cjs/Validator/MetaValidator.d.ts +8 -0
- package/dist/cjs/Validator/MetaValidator.js +34 -0
- package/dist/cjs/Validator/MetaValidator.js.map +1 -0
- package/dist/cjs/Validator/Validator.d.ts +10 -0
- package/dist/cjs/Validator/Validator.js +20 -0
- package/dist/cjs/Validator/Validator.js.map +1 -0
- package/dist/cjs/Validator/index.d.ts +3 -0
- package/dist/cjs/Validator/index.js +7 -0
- package/dist/cjs/Validator/index.js.map +1 -0
- package/dist/cjs/Wrapper/Validator.d.ts +8 -0
- package/dist/cjs/Wrapper/Validator.js +17 -0
- package/dist/cjs/Wrapper/Validator.js.map +1 -0
- package/dist/cjs/Wrapper/Wrapper.d.ts +9 -0
- package/dist/cjs/Wrapper/Wrapper.js +27 -0
- package/dist/cjs/Wrapper/Wrapper.js.map +1 -0
- package/dist/cjs/Wrapper/index.d.ts +2 -0
- package/dist/cjs/Wrapper/index.js +6 -0
- package/dist/cjs/Wrapper/index.js.map +1 -0
- package/dist/cjs/index.d.ts +9 -0
- package/dist/cjs/index.js +13 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/isXyoPayloadOfSchemaType.d.ts +4 -0
- package/dist/cjs/isXyoPayloadOfSchemaType.js +9 -0
- package/dist/cjs/isXyoPayloadOfSchemaType.js.map +1 -0
- package/dist/cjs/models/Base.d.ts +6 -0
- package/dist/cjs/models/Base.js +3 -0
- package/dist/cjs/models/Base.js.map +1 -0
- package/dist/cjs/models/Meta.d.ts +24 -0
- package/dist/cjs/models/Meta.js +3 -0
- package/dist/cjs/models/Meta.js.map +1 -0
- package/dist/cjs/models/XyoPayload.d.ts +2 -0
- package/dist/cjs/models/XyoPayload.js +3 -0
- package/dist/cjs/models/XyoPayload.js.map +1 -0
- package/dist/cjs/models/index.d.ts +3 -0
- package/dist/cjs/models/index.js +7 -0
- package/dist/cjs/models/index.js.map +1 -0
- package/dist/docs.json +7 -0
- package/dist/esm/Builder/Builder.d.ts +15 -0
- package/dist/esm/Builder/Builder.js +30 -0
- package/dist/esm/Builder/Builder.js.map +1 -0
- package/dist/esm/Builder/index.d.ts +1 -0
- package/dist/esm/Builder/index.js +2 -0
- package/dist/esm/Builder/index.js.map +1 -0
- package/dist/esm/Huri/Huri.d.ts +29 -0
- package/dist/esm/Huri/Huri.js +99 -0
- package/dist/esm/Huri/Huri.js.map +1 -0
- package/dist/esm/Huri/index.d.ts +1 -0
- package/dist/esm/Huri/index.js +2 -0
- package/dist/esm/Huri/index.js.map +1 -0
- package/dist/esm/Query/QueryPayload.d.ts +11 -0
- package/dist/esm/Query/QueryPayload.js +2 -0
- package/dist/esm/Query/QueryPayload.js.map +1 -0
- package/dist/esm/Query/index.d.ts +1 -0
- package/dist/esm/Query/index.js +2 -0
- package/dist/esm/Query/index.js.map +1 -0
- package/dist/esm/Schema/Payload.d.ts +10 -0
- package/dist/esm/Schema/Payload.js +2 -0
- package/dist/esm/Schema/Payload.js.map +1 -0
- package/dist/esm/Schema/index.d.ts +1 -0
- package/dist/esm/Schema/index.js +2 -0
- package/dist/esm/Schema/index.js.map +1 -0
- package/dist/esm/SchemaNameValidator.d.ts +73 -0
- package/dist/esm/SchemaNameValidator.js +117 -0
- package/dist/esm/SchemaNameValidator.js.map +1 -0
- package/dist/esm/Test/index.d.ts +1 -0
- package/dist/esm/Test/index.js +2 -0
- package/dist/esm/Test/index.js.map +1 -0
- package/dist/esm/Test/testPayload.d.ts +5 -0
- package/dist/esm/Test/testPayload.js +15 -0
- package/dist/esm/Test/testPayload.js.map +1 -0
- package/dist/esm/Validator/BodyValidator.d.ts +9 -0
- package/dist/esm/Validator/BodyValidator.js +24 -0
- package/dist/esm/Validator/BodyValidator.js.map +1 -0
- package/dist/esm/Validator/MetaValidator.d.ts +8 -0
- package/dist/esm/Validator/MetaValidator.js +31 -0
- package/dist/esm/Validator/MetaValidator.js.map +1 -0
- package/dist/esm/Validator/Validator.d.ts +10 -0
- package/dist/esm/Validator/Validator.js +16 -0
- package/dist/esm/Validator/Validator.js.map +1 -0
- package/dist/esm/Validator/index.d.ts +3 -0
- package/dist/esm/Validator/index.js +4 -0
- package/dist/esm/Validator/index.js.map +1 -0
- package/dist/esm/Wrapper/Validator.d.ts +8 -0
- package/dist/esm/Wrapper/Validator.js +13 -0
- package/dist/esm/Wrapper/Validator.js.map +1 -0
- package/dist/esm/Wrapper/Wrapper.d.ts +9 -0
- package/dist/esm/Wrapper/Wrapper.js +20 -0
- package/dist/esm/Wrapper/Wrapper.js.map +1 -0
- package/dist/esm/Wrapper/index.d.ts +2 -0
- package/dist/esm/Wrapper/index.js +3 -0
- package/dist/esm/Wrapper/index.js.map +1 -0
- package/dist/esm/index.d.ts +9 -0
- package/dist/esm/index.js +10 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/isXyoPayloadOfSchemaType.d.ts +4 -0
- package/dist/esm/isXyoPayloadOfSchemaType.js +5 -0
- package/dist/esm/isXyoPayloadOfSchemaType.js.map +1 -0
- package/dist/esm/models/Base.d.ts +6 -0
- package/dist/esm/models/Base.js +2 -0
- package/dist/esm/models/Base.js.map +1 -0
- package/dist/esm/models/Meta.d.ts +24 -0
- package/dist/esm/models/Meta.js +2 -0
- package/dist/esm/models/Meta.js.map +1 -0
- package/dist/esm/models/XyoPayload.d.ts +2 -0
- package/dist/esm/models/XyoPayload.js +2 -0
- package/dist/esm/models/XyoPayload.js.map +1 -0
- package/dist/esm/models/index.d.ts +3 -0
- package/dist/esm/models/index.js +4 -0
- package/dist/esm/models/index.js.map +1 -0
- package/jest.config.cjs +25 -0
- package/package.json +56 -0
- package/src/Builder/Builder.spec.ts +37 -0
- package/src/Builder/Builder.ts +43 -0
- package/src/Builder/index.ts +1 -0
- package/src/Huri/Huri.spec.ts +92 -0
- package/src/Huri/Huri.ts +155 -0
- package/src/Huri/index.ts +1 -0
- package/src/Query/QueryPayload.ts +15 -0
- package/src/Query/index.ts +1 -0
- package/src/Schema/Payload.ts +11 -0
- package/src/Schema/index.ts +1 -0
- package/src/SchemaNameValidator.ts +128 -0
- package/src/Test/index.ts +1 -0
- package/src/Test/testPayload.ts +19 -0
- package/src/Validator/BodyValidator.spec.ts +11 -0
- package/src/Validator/BodyValidator.ts +28 -0
- package/src/Validator/MetaValidator.spec.ts +11 -0
- package/src/Validator/MetaValidator.ts +34 -0
- package/src/Validator/Validator.spec.ts +63 -0
- package/src/Validator/Validator.ts +21 -0
- package/src/Validator/index.ts +3 -0
- package/src/Wrapper/Validator.ts +17 -0
- package/src/Wrapper/Wrapper.ts +25 -0
- package/src/Wrapper/index.ts +2 -0
- package/src/index.ts +9 -0
- package/src/isXyoPayloadOfSchemaType.ts +8 -0
- package/src/models/Base.ts +6 -0
- package/src/models/Meta.ts +28 -0
- package/src/models/XyoPayload.ts +3 -0
- package/src/models/index.ts +3 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { domainExists } from '@xyo-network/core'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Validates a XYO schema structure and existence
|
|
5
|
+
*/
|
|
6
|
+
export class XyoSchemaNameValidator {
|
|
7
|
+
public schema?: string
|
|
8
|
+
constructor(schema?: string) {
|
|
9
|
+
this.schema = schema
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
private _parts?: string[]
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The schema converted into a string array split on '.'
|
|
16
|
+
*
|
|
17
|
+
* @returns string[]
|
|
18
|
+
*/
|
|
19
|
+
get parts() {
|
|
20
|
+
this._parts = this._parts ?? this.schema?.split('.')
|
|
21
|
+
return this._parts
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Levels in the schema
|
|
26
|
+
*
|
|
27
|
+
* @returns number
|
|
28
|
+
*/
|
|
29
|
+
get levels(): number | undefined {
|
|
30
|
+
return this.parts?.length
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Checks whether the schema is all lowercase
|
|
35
|
+
*
|
|
36
|
+
* @returns boolean
|
|
37
|
+
*/
|
|
38
|
+
get isLowercase(): boolean {
|
|
39
|
+
return this.schema === this.schema?.toLowerCase()
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
*
|
|
44
|
+
* Get a domain for the schema at a certain level
|
|
45
|
+
*
|
|
46
|
+
* @param level - Zero based level to check
|
|
47
|
+
* @returns string
|
|
48
|
+
*/
|
|
49
|
+
private domainLevel(level: number): string | undefined {
|
|
50
|
+
return this.parts
|
|
51
|
+
?.slice(0, level + 1)
|
|
52
|
+
.reverse()
|
|
53
|
+
.join('.')
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
private _rootDomain?: string
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* The rootDomain is the first two levels of the schema, in reverse order
|
|
60
|
+
* This can be used to determine who 'owns' that schema, based on domain
|
|
61
|
+
* registration
|
|
62
|
+
*
|
|
63
|
+
* @returns string
|
|
64
|
+
*/
|
|
65
|
+
get rootDomain(): string | undefined {
|
|
66
|
+
this._rootDomain = this._rootDomain ?? this.domainLevel(1)
|
|
67
|
+
return this._rootDomain
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Checks if the root domain validates via DNS resolution
|
|
72
|
+
*
|
|
73
|
+
* @returns boolean
|
|
74
|
+
*/
|
|
75
|
+
public async rootDomainExists() {
|
|
76
|
+
return await domainExists(this.rootDomain)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Determines how many levels of the schema's reverse domain
|
|
81
|
+
* pass DNS resolution
|
|
82
|
+
*
|
|
83
|
+
* @returns number (0 if none exist)
|
|
84
|
+
*/
|
|
85
|
+
public async domainExistanceDepth() {
|
|
86
|
+
const levels = this.levels ?? 0
|
|
87
|
+
let level = 0
|
|
88
|
+
while (level < levels) {
|
|
89
|
+
if (!(await domainExists(this.domainLevel(level)))) {
|
|
90
|
+
break
|
|
91
|
+
}
|
|
92
|
+
level += 1
|
|
93
|
+
}
|
|
94
|
+
return level
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Run all the validations
|
|
99
|
+
* @param checkExistance - boolean
|
|
100
|
+
* @returns Error[]
|
|
101
|
+
*/
|
|
102
|
+
|
|
103
|
+
public async allDynamic() {
|
|
104
|
+
const errors: Error[] = []
|
|
105
|
+
if ((this.schema?.length ?? 0) === 0) errors.push(Error('schema missing'))
|
|
106
|
+
else if (!(await this.rootDomainExists())) errors.push(Error(`schema root domain must exist [${this.rootDomain}]`))
|
|
107
|
+
return errors
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Run all static validations
|
|
112
|
+
* @returns Error[]
|
|
113
|
+
*/
|
|
114
|
+
|
|
115
|
+
public all() {
|
|
116
|
+
const errors: Error[] = []
|
|
117
|
+
if ((this.schema?.length ?? 0) === 0) errors.push(Error('schema missing'))
|
|
118
|
+
else if ((this.levels ?? 0) < 3) errors.push(Error(`schema levels < 3 [${this.levels}, ${this.schema}]`))
|
|
119
|
+
else if (!this.isLowercase) errors.push(Error(`schema not lowercase [${this.schema}]`))
|
|
120
|
+
return errors
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** @deprectated use XyoSchemaNameValidator instead */
|
|
125
|
+
export class SchemaValidator extends XyoSchemaNameValidator {}
|
|
126
|
+
|
|
127
|
+
/** @deprectated use XyoSchemaNameValidator instead */
|
|
128
|
+
export class XyoSchemaValidator extends XyoSchemaNameValidator {}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './testPayload'
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { WithAdditional } from '@xyo-network/core'
|
|
2
|
+
|
|
3
|
+
import { XyoPayloadWithMeta } from '../models'
|
|
4
|
+
|
|
5
|
+
const testSchema = 'network.xyo.test'
|
|
6
|
+
const testPayload: WithAdditional<XyoPayloadWithMeta> = {
|
|
7
|
+
_archive: 'test',
|
|
8
|
+
_hash: '20e14207f952a09f767ff614a648546c037fe524ace0bfe55db31f818aff1f1c',
|
|
9
|
+
_timestamp: 1609459255555,
|
|
10
|
+
numberField: 1,
|
|
11
|
+
objectField: {
|
|
12
|
+
numberField: 1,
|
|
13
|
+
stringField: 'stringValue',
|
|
14
|
+
},
|
|
15
|
+
schema: testSchema,
|
|
16
|
+
stringField: 'stringValue',
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export { testPayload, testSchema }
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { dumpErrors } from '@xyo-network/core'
|
|
2
|
+
|
|
3
|
+
import { testPayload } from '../Test'
|
|
4
|
+
import { XyoPayloadBodyValidator } from './BodyValidator'
|
|
5
|
+
|
|
6
|
+
test('all', () => {
|
|
7
|
+
const validator = new XyoPayloadBodyValidator(testPayload)
|
|
8
|
+
const errors = validator.validate()
|
|
9
|
+
dumpErrors(errors)
|
|
10
|
+
expect(errors.length).toBe(0)
|
|
11
|
+
})
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { XyoValidator } from '@xyo-network/core'
|
|
2
|
+
|
|
3
|
+
import { XyoPayload } from '../models'
|
|
4
|
+
import { XyoSchemaNameValidator } from '../SchemaNameValidator'
|
|
5
|
+
|
|
6
|
+
export class XyoPayloadBodyValidator<T extends XyoPayload = XyoPayload> extends XyoValidator<T> {
|
|
7
|
+
private _schemaValidator?: XyoSchemaNameValidator
|
|
8
|
+
get schemaValidator() {
|
|
9
|
+
this._schemaValidator = this._schemaValidator ?? new XyoSchemaNameValidator(this.obj.schema ?? '')
|
|
10
|
+
return this._schemaValidator
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public schemaName() {
|
|
14
|
+
const errors: Error[] = []
|
|
15
|
+
if (this.obj.schema === undefined) {
|
|
16
|
+
errors.push(Error('schema missing'))
|
|
17
|
+
} else {
|
|
18
|
+
errors.push(...this.schemaValidator.all())
|
|
19
|
+
}
|
|
20
|
+
return errors
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public validate() {
|
|
24
|
+
const errors: Error[] = []
|
|
25
|
+
errors.push(...this.schemaName())
|
|
26
|
+
return errors
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { dumpErrors } from '@xyo-network/core'
|
|
2
|
+
|
|
3
|
+
import { testPayload } from '../Test'
|
|
4
|
+
import { XyoPayloadMetaValidator } from './MetaValidator'
|
|
5
|
+
|
|
6
|
+
test('all', () => {
|
|
7
|
+
const validator = new XyoPayloadMetaValidator(testPayload)
|
|
8
|
+
const errors = validator.validate()
|
|
9
|
+
dumpErrors(errors)
|
|
10
|
+
expect(errors.length).toBe(0)
|
|
11
|
+
})
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { XyoHasher, XyoValidator } from '@xyo-network/core'
|
|
2
|
+
|
|
3
|
+
import { XyoPayloadMeta } from '../models'
|
|
4
|
+
|
|
5
|
+
const MIN_ALLOWED_TIMESTAMP = 1609459200000
|
|
6
|
+
const MAX_ALLOWED_TIMESTAMP = 4102444800000
|
|
7
|
+
|
|
8
|
+
class XyoPayloadMetaValidator<T extends XyoPayloadMeta = XyoPayloadMeta> extends XyoValidator<T> {
|
|
9
|
+
public hash() {
|
|
10
|
+
const errors: Error[] = []
|
|
11
|
+
const wrapper = new XyoHasher(this.obj)
|
|
12
|
+
|
|
13
|
+
const bodyHash = wrapper.hash
|
|
14
|
+
if (bodyHash !== this.obj._hash) errors.push(new Error(`Body hash mismatch: [calculated: ${bodyHash}] [found: ${this.obj._hash}]`))
|
|
15
|
+
return errors
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public timestamp() {
|
|
19
|
+
const errors: Error[] = []
|
|
20
|
+
const { _timestamp } = this.obj
|
|
21
|
+
if (_timestamp === undefined) errors.push(new Error('Missing _timestamp'))
|
|
22
|
+
else if (_timestamp < MIN_ALLOWED_TIMESTAMP) errors.push(new Error('_timestamp is before year 2021'))
|
|
23
|
+
else if (_timestamp > MAX_ALLOWED_TIMESTAMP) errors.push(new Error('_timestamp is after year 2100'))
|
|
24
|
+
return errors
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public validate() {
|
|
28
|
+
const errors: Error[] = []
|
|
29
|
+
errors.push(...this.hash(), ...this.timestamp())
|
|
30
|
+
return errors
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export { XyoPayloadMetaValidator }
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { dumpErrors } from '@xyo-network/core'
|
|
2
|
+
|
|
3
|
+
import { XyoPayloadWithMeta } from '../models'
|
|
4
|
+
import { XyoPayloadValidator } from './Validator'
|
|
5
|
+
|
|
6
|
+
const testPayloadNoSchema: XyoPayloadWithMeta = {
|
|
7
|
+
_hash: '44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a',
|
|
8
|
+
_timestamp: 1609459255555,
|
|
9
|
+
} as XyoPayloadWithMeta
|
|
10
|
+
const testPayloadMixedCase: XyoPayloadWithMeta = {
|
|
11
|
+
_hash: '9a67116e05c33135f6ba23768f9a3fbbba155297ee1bb0a7e21d91fdc3835769',
|
|
12
|
+
_timestamp: 1609459255555,
|
|
13
|
+
schema: 'network.xyo.testMixedCaseSchema',
|
|
14
|
+
} as XyoPayloadWithMeta
|
|
15
|
+
const testPayloadTooFewLevels: XyoPayloadWithMeta = {
|
|
16
|
+
_hash: '95206b26e3173deaac5e3f5d4510d50112b6348d3a2128b1eb6fe3ca66957628',
|
|
17
|
+
_timestamp: 1609459255555,
|
|
18
|
+
schema: 'network.xyo',
|
|
19
|
+
} as XyoPayloadWithMeta
|
|
20
|
+
const testPayloadDoesNotExist: XyoPayloadWithMeta = {
|
|
21
|
+
_hash: '360b4ce36862ef2a20dd572d69283a86d351b2b4a9cd4f61ae6f7a320be81dbf',
|
|
22
|
+
_timestamp: 1609459255555,
|
|
23
|
+
schema: 'network.dfd-sf-sf-s.blahblah',
|
|
24
|
+
} as XyoPayloadWithMeta
|
|
25
|
+
const testPayloadValid: XyoPayloadWithMeta = {
|
|
26
|
+
_hash: '4b5958c6d16b26d6790e33f5be45578728b0ea36e40a0d1b9c9164822341cac1',
|
|
27
|
+
_timestamp: 1609459255555,
|
|
28
|
+
schema: 'network.xyo.test',
|
|
29
|
+
} as XyoPayloadWithMeta
|
|
30
|
+
|
|
31
|
+
test('all [missing schema]', () => {
|
|
32
|
+
const validator = new XyoPayloadValidator(testPayloadNoSchema)
|
|
33
|
+
const errors = validator.validate()
|
|
34
|
+
expect(errors.length).toBe(1)
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
test('all [mixed case]', () => {
|
|
38
|
+
const validator = new XyoPayloadValidator(testPayloadMixedCase)
|
|
39
|
+
const errors = validator.validate()
|
|
40
|
+
expect(errors.length).toBe(1)
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
test('all [too few levels]', () => {
|
|
44
|
+
const validator = new XyoPayloadValidator(testPayloadTooFewLevels)
|
|
45
|
+
const errors = validator.validate()
|
|
46
|
+
expect(errors.length).toBe(1)
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
test('all [does not exist]', () => {
|
|
50
|
+
const validator = new XyoPayloadValidator(testPayloadDoesNotExist)
|
|
51
|
+
const errors = validator.validate()
|
|
52
|
+
dumpErrors(errors)
|
|
53
|
+
expect(errors.length).toBe(0)
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
test('all [valid]', () => {
|
|
57
|
+
const validator = new XyoPayloadValidator(testPayloadValid)
|
|
58
|
+
|
|
59
|
+
let errors: Error[] = []
|
|
60
|
+
errors = validator.validate()
|
|
61
|
+
dumpErrors(errors)
|
|
62
|
+
expect(errors.length).toBe(0)
|
|
63
|
+
})
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { XyoValidator } from '@xyo-network/core'
|
|
2
|
+
|
|
3
|
+
import { XyoPayloadWithMeta } from '../models'
|
|
4
|
+
import { XyoPayloadBodyValidator } from './BodyValidator'
|
|
5
|
+
import { XyoPayloadMetaValidator } from './MetaValidator'
|
|
6
|
+
|
|
7
|
+
export class XyoPayloadValidator<T extends XyoPayloadWithMeta = XyoPayloadWithMeta> extends XyoValidator<T> {
|
|
8
|
+
public body: XyoPayloadBodyValidator
|
|
9
|
+
public meta: XyoPayloadMetaValidator
|
|
10
|
+
constructor(payload: T) {
|
|
11
|
+
super(payload)
|
|
12
|
+
this.body = new XyoPayloadBodyValidator(payload)
|
|
13
|
+
this.meta = new XyoPayloadMetaValidator(payload)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public validate() {
|
|
17
|
+
const errors: Error[] = []
|
|
18
|
+
errors.push(...this.body.validate())
|
|
19
|
+
return errors
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { XyoValidator } from '@xyo-network/core'
|
|
2
|
+
|
|
3
|
+
import { XyoPayloadWithMeta } from '../models'
|
|
4
|
+
import { XyoPayloadValidator } from '../Validator'
|
|
5
|
+
import { XyoPayloadWrapper } from './Wrapper'
|
|
6
|
+
|
|
7
|
+
export class XyoPayloadWrapperValidator<T extends XyoPayloadWrapper<XyoPayloadWithMeta> = XyoPayloadWrapper<XyoPayloadWithMeta>> extends XyoValidator<T> {
|
|
8
|
+
public get payload() {
|
|
9
|
+
return new XyoPayloadValidator(this.obj.body)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
public validate() {
|
|
13
|
+
const errors: Error[] = []
|
|
14
|
+
errors.push(...this.payload.validate())
|
|
15
|
+
return errors
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { deepOmitUnderscoreFields, deepPickUnderscoreFields, XyoDataLike, XyoHasher } from '@xyo-network/core'
|
|
2
|
+
|
|
3
|
+
import { Huri } from '../Huri'
|
|
4
|
+
import { XyoPayload } from '../models'
|
|
5
|
+
|
|
6
|
+
export class XyoPayloadWrapper<T extends XyoPayload> extends XyoHasher<T> {
|
|
7
|
+
public get payload() {
|
|
8
|
+
return this.obj
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
public get body() {
|
|
12
|
+
return deepOmitUnderscoreFields<T>(this.obj)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
public get meta() {
|
|
16
|
+
return deepPickUnderscoreFields<T>(this.obj)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public static async load(address: XyoDataLike | Huri) {
|
|
20
|
+
const payload = await new Huri(address).fetch()
|
|
21
|
+
if (payload) {
|
|
22
|
+
return new XyoPayloadWrapper(payload)
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from './Builder'
|
|
2
|
+
export * from './Huri'
|
|
3
|
+
export * from './isXyoPayloadOfSchemaType'
|
|
4
|
+
export * from './models'
|
|
5
|
+
export * from './Query'
|
|
6
|
+
export * from './Schema'
|
|
7
|
+
export * from './SchemaNameValidator'
|
|
8
|
+
export * from './Validator'
|
|
9
|
+
export * from './Wrapper'
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { XyoPayload } from './models'
|
|
2
|
+
import { XyoSchemaPayload } from './Schema'
|
|
3
|
+
|
|
4
|
+
export const isXyoPayloadOfSchemaType = <T extends XyoPayload>(schema: string) => {
|
|
5
|
+
return (x: XyoPayload): x is T => x.schema === schema
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const isXyoSchemaPayload = isXyoPayloadOfSchemaType<XyoSchemaPayload>('network.xyo.schema')
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { XyoPayloadBase } from './Base'
|
|
2
|
+
import { XyoPayload } from './XyoPayload'
|
|
3
|
+
|
|
4
|
+
export interface XyoPayloadMetaBase {
|
|
5
|
+
_hash: string
|
|
6
|
+
_observeDuration?: number
|
|
7
|
+
_archive: string
|
|
8
|
+
_client?: string
|
|
9
|
+
_reportedHash?: string
|
|
10
|
+
_timestamp: number
|
|
11
|
+
_sources?: XyoPayload[]
|
|
12
|
+
_user_agent?: string
|
|
13
|
+
_schemaValid?: boolean
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface XyoQueryPayloadMetaBase extends XyoPayloadMetaBase {
|
|
17
|
+
_queryId: string
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export type XyoPayloadMeta<T = unknown> = T & XyoPayloadMetaBase
|
|
21
|
+
export type XyoPartialPayloadMeta<T = unknown> = T & Partial<XyoPayloadMetaBase>
|
|
22
|
+
export type XyoPayloadWithMeta<T = unknown> = T & XyoPayloadMetaBase & XyoPayloadBase
|
|
23
|
+
export type XyoPayloadWithPartialMeta<T = unknown> = T & Partial<XyoPayloadMetaBase> & XyoPayloadBase
|
|
24
|
+
|
|
25
|
+
export type XyoQueryPayloadMeta<T = unknown> = T & XyoQueryPayloadMetaBase
|
|
26
|
+
export type XyoQueryPartialPayloadMeta<T = unknown> = T & Partial<XyoQueryPayloadMetaBase>
|
|
27
|
+
export type XyoQueryPayloadWithMeta<T = unknown> = T & XyoQueryPayloadMetaBase & XyoPayloadBase
|
|
28
|
+
export type XyoQueryPayloadWithPartialMeta<T = unknown> = T & Partial<XyoQueryPayloadMetaBase> & XyoPayloadBase
|