stated-protocol-parser 1.0.6 → 5.0.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.
- package/README.md +231 -22
- package/dist/constants.d.ts +193 -15
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +197 -20
- package/dist/constants.js.map +1 -1
- package/dist/esm/constants.d.ts +193 -15
- package/dist/esm/constants.d.ts.map +1 -1
- package/dist/esm/{hash.browser.d.ts → hash.d.ts} +11 -5
- package/dist/esm/hash.d.ts.map +1 -0
- package/dist/esm/index.d.ts +4 -42
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2102 -641
- package/dist/esm/index.js.map +7 -1
- package/dist/esm/protocol.d.ts +30 -0
- package/dist/esm/protocol.d.ts.map +1 -0
- package/dist/esm/signature.d.ts +49 -0
- package/dist/esm/signature.d.ts.map +1 -0
- package/dist/esm/types.d.ts +26 -60
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/utils.d.ts +10 -0
- package/dist/esm/utils.d.ts.map +1 -1
- package/dist/{hash.browser.d.ts → hash.d.ts} +11 -5
- package/dist/hash.d.ts.map +1 -0
- package/dist/{hash.browser.js → hash.js} +44 -10
- package/dist/hash.js.map +1 -0
- package/dist/index.d.ts +4 -42
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -674
- package/dist/index.js.map +1 -1
- package/dist/protocol.d.ts +30 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +677 -0
- package/dist/protocol.js.map +1 -0
- package/dist/signature.d.ts +49 -0
- package/dist/signature.d.ts.map +1 -0
- package/dist/signature.js +169 -0
- package/dist/signature.js.map +1 -0
- package/dist/types.d.ts +26 -60
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +27 -0
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +10 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +79 -11
- package/dist/utils.js.map +1 -1
- package/package.json +25 -16
- package/src/constants.ts +228 -44
- package/src/fixtures.test.ts +236 -0
- package/src/hash.test.ts +217 -215
- package/src/hash.ts +99 -0
- package/src/index.ts +5 -678
- package/src/organisation-verification.test.ts +50 -0
- package/src/person-verification.test.ts +55 -0
- package/src/poll.test.ts +28 -0
- package/src/protocol.ts +871 -0
- package/src/rating.test.ts +25 -0
- package/src/signature.test.ts +200 -0
- package/src/signature.ts +159 -0
- package/src/statement.test.ts +101 -0
- package/src/types.ts +155 -156
- package/src/utils.test.ts +140 -0
- package/src/utils.ts +102 -16
- package/dist/esm/constants.js +0 -47
- package/dist/esm/constants.js.map +0 -1
- package/dist/esm/hash.browser.d.ts.map +0 -1
- package/dist/esm/hash.browser.js +0 -58
- package/dist/esm/hash.browser.js.map +0 -1
- package/dist/esm/hash.node.d.ts +0 -31
- package/dist/esm/hash.node.d.ts.map +0 -1
- package/dist/esm/hash.node.js +0 -43
- package/dist/esm/hash.node.js.map +0 -1
- package/dist/esm/hash.test.d.ts +0 -2
- package/dist/esm/hash.test.d.ts.map +0 -1
- package/dist/esm/hash.test.js +0 -181
- package/dist/esm/hash.test.js.map +0 -1
- package/dist/esm/index.test.d.ts +0 -2
- package/dist/esm/index.test.d.ts.map +0 -1
- package/dist/esm/index.test.js +0 -293
- package/dist/esm/index.test.js.map +0 -1
- package/dist/esm/types.js +0 -2
- package/dist/esm/types.js.map +0 -1
- package/dist/esm/utils.js +0 -23
- package/dist/esm/utils.js.map +0 -1
- package/dist/esm/v3.d.ts +0 -5
- package/dist/esm/v3.d.ts.map +0 -1
- package/dist/esm/v3.js +0 -60
- package/dist/esm/v3.js.map +0 -1
- package/dist/hash.browser.d.ts.map +0 -1
- package/dist/hash.browser.js.map +0 -1
- package/dist/hash.node.d.ts +0 -31
- package/dist/hash.node.d.ts.map +0 -1
- package/dist/hash.node.js +0 -53
- package/dist/hash.node.js.map +0 -1
- package/dist/hash.test.d.ts +0 -2
- package/dist/hash.test.d.ts.map +0 -1
- package/dist/hash.test.js +0 -183
- package/dist/hash.test.js.map +0 -1
- package/dist/index.test.d.ts +0 -2
- package/dist/index.test.d.ts.map +0 -1
- package/dist/index.test.js +0 -295
- package/dist/index.test.js.map +0 -1
- package/dist/v3.d.ts +0 -5
- package/dist/v3.d.ts.map +0 -1
- package/dist/v3.js +0 -64
- package/dist/v3.js.map +0 -1
- package/src/hash.browser.ts +0 -65
- package/src/hash.node.ts +0 -47
- package/src/index.test.ts +0 -378
- package/src/v3.ts +0 -62
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stated-protocol-parser",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0",
|
|
4
4
|
"description": "Parser and formatter for the Stated protocol - a decentralized statement verification system",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|
|
@@ -8,23 +8,25 @@
|
|
|
8
8
|
"exports": {
|
|
9
9
|
".": {
|
|
10
10
|
"types": "./dist/index.d.ts",
|
|
11
|
-
"browser": "./dist/esm/index.js",
|
|
12
11
|
"import": "./dist/esm/index.js",
|
|
13
12
|
"require": "./dist/index.js",
|
|
14
13
|
"default": "./dist/index.js"
|
|
15
|
-
},
|
|
16
|
-
"./node": {
|
|
17
|
-
"types": "./dist/hash.node.d.ts",
|
|
18
|
-
"import": "./dist/esm/hash.node.js",
|
|
19
|
-
"require": "./dist/hash.node.js"
|
|
20
14
|
}
|
|
21
15
|
},
|
|
22
16
|
"scripts": {
|
|
23
|
-
"
|
|
17
|
+
"clean": "rm -rf dist",
|
|
18
|
+
"build": "npm run clean && npm run build:cjs && npm run build:esm",
|
|
24
19
|
"build:cjs": "tsc",
|
|
25
|
-
"build:esm": "tsc -p tsconfig.esm.json",
|
|
26
|
-
"test": "
|
|
27
|
-
"
|
|
20
|
+
"build:esm": "node scripts/build-esm.js && tsc -p tsconfig.esm.json --emitDeclarationOnly",
|
|
21
|
+
"test": "tsx --test 'src/**/*.test.ts'",
|
|
22
|
+
"lint": "eslint 'src/**/*.ts' 'scripts/**/*.ts'",
|
|
23
|
+
"lint:fix": "eslint 'src/**/*.ts' 'scripts/**/*.ts' --fix",
|
|
24
|
+
"format": "prettier --write 'src/**/*.ts' 'scripts/**/*.ts'",
|
|
25
|
+
"format:check": "prettier --check 'src/**/*.ts' 'scripts/**/*.ts'",
|
|
26
|
+
"fix": "npm run format && npm run lint:fix",
|
|
27
|
+
"typecheck": "tsc --noEmit",
|
|
28
|
+
"prepublishOnly": "npm run build",
|
|
29
|
+
"update-fixtures": "tsx scripts/updateFixtures.ts"
|
|
28
30
|
},
|
|
29
31
|
"keywords": [
|
|
30
32
|
"stated",
|
|
@@ -38,10 +40,13 @@
|
|
|
38
40
|
"author": "",
|
|
39
41
|
"license": "MIT",
|
|
40
42
|
"devDependencies": {
|
|
41
|
-
"@types/
|
|
42
|
-
"@
|
|
43
|
-
"
|
|
44
|
-
"
|
|
43
|
+
"@types/node": "^20.19.27",
|
|
44
|
+
"@typescript-eslint/eslint-plugin": "^6.21.0",
|
|
45
|
+
"@typescript-eslint/parser": "^6.21.0",
|
|
46
|
+
"esbuild": "^0.27.2",
|
|
47
|
+
"eslint": "^8.57.0",
|
|
48
|
+
"prettier": "^3.2.5",
|
|
49
|
+
"tsx": "^4.21.0",
|
|
45
50
|
"typescript": "^5.0.0"
|
|
46
51
|
},
|
|
47
52
|
"files": [
|
|
@@ -53,5 +58,9 @@
|
|
|
53
58
|
"repository": {
|
|
54
59
|
"type": "git",
|
|
55
60
|
"url": "https://github.com/c-riq/stated"
|
|
61
|
+
},
|
|
62
|
+
"dependencies": {
|
|
63
|
+
"@noble/ed25519": "^3.0.0",
|
|
64
|
+
"@noble/hashes": "^2.0.1"
|
|
56
65
|
}
|
|
57
|
-
}
|
|
66
|
+
}
|
package/src/constants.ts
CHANGED
|
@@ -1,61 +1,245 @@
|
|
|
1
1
|
export const legalForms = {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
2
|
+
local_government: 'local government',
|
|
3
|
+
state_government: 'state government',
|
|
4
|
+
foreign_affairs_ministry: 'foreign affairs ministry',
|
|
5
|
+
corporation: 'corporation',
|
|
6
|
+
};
|
|
7
7
|
|
|
8
8
|
export const statementTypes = {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
signPdf: "sign_pdf",
|
|
22
|
-
bounty: "bounty",
|
|
23
|
-
unsupported: "unsupported",
|
|
24
|
-
}
|
|
9
|
+
statement: 'statement',
|
|
10
|
+
organisationVerification: 'organisation_verification',
|
|
11
|
+
personVerification: 'person_verification',
|
|
12
|
+
poll: 'poll',
|
|
13
|
+
vote: 'vote',
|
|
14
|
+
response: 'response',
|
|
15
|
+
disputeContent: 'dispute_statement_content',
|
|
16
|
+
disputeAuthenticity: 'dispute_statement_authenticity',
|
|
17
|
+
rating: 'rating',
|
|
18
|
+
signPdf: 'sign_pdf',
|
|
19
|
+
unsupported: 'unsupported',
|
|
20
|
+
};
|
|
25
21
|
|
|
26
22
|
export const peopleCountBuckets = {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
23
|
+
'0': '0-10',
|
|
24
|
+
'10': '10-100',
|
|
25
|
+
'100': '100-1000',
|
|
26
|
+
'1000': '1000-10,000',
|
|
27
|
+
'10000': '10,000-100,000',
|
|
28
|
+
'100000': '100,000+',
|
|
29
|
+
'1000000': '1,000,000+',
|
|
30
|
+
'10000000': '10,000,000+',
|
|
31
|
+
};
|
|
36
32
|
|
|
37
|
-
export const
|
|
33
|
+
export const supportedLanguages = {
|
|
34
|
+
aa: 'aa',
|
|
35
|
+
ab: 'ab',
|
|
36
|
+
af: 'af',
|
|
37
|
+
ak: 'ak',
|
|
38
|
+
am: 'am',
|
|
39
|
+
ar: 'ar',
|
|
40
|
+
an: 'an',
|
|
41
|
+
as: 'as',
|
|
42
|
+
av: 'av',
|
|
43
|
+
ay: 'ay',
|
|
44
|
+
az: 'az',
|
|
45
|
+
ba: 'ba',
|
|
46
|
+
bm: 'bm',
|
|
47
|
+
be: 'be',
|
|
48
|
+
bn: 'bn',
|
|
49
|
+
bi: 'bi',
|
|
50
|
+
bo: 'bo',
|
|
51
|
+
bs: 'bs',
|
|
52
|
+
br: 'br',
|
|
53
|
+
bg: 'bg',
|
|
54
|
+
ca: 'ca',
|
|
55
|
+
cs: 'cs',
|
|
56
|
+
ch: 'ch',
|
|
57
|
+
ce: 'ce',
|
|
58
|
+
cv: 'cv',
|
|
59
|
+
kw: 'kw',
|
|
60
|
+
co: 'co',
|
|
61
|
+
cr: 'cr',
|
|
62
|
+
cy: 'cy',
|
|
63
|
+
da: 'da',
|
|
64
|
+
de: 'de',
|
|
65
|
+
dv: 'dv',
|
|
66
|
+
dz: 'dz',
|
|
67
|
+
el: 'el',
|
|
68
|
+
en: 'en',
|
|
69
|
+
eo: 'eo',
|
|
70
|
+
et: 'et',
|
|
71
|
+
eu: 'eu',
|
|
72
|
+
ee: 'ee',
|
|
73
|
+
fo: 'fo',
|
|
74
|
+
fa: 'fa',
|
|
75
|
+
fj: 'fj',
|
|
76
|
+
fi: 'fi',
|
|
77
|
+
fr: 'fr',
|
|
78
|
+
fy: 'fy',
|
|
79
|
+
ff: 'ff',
|
|
80
|
+
gd: 'gd',
|
|
81
|
+
ga: 'ga',
|
|
82
|
+
gl: 'gl',
|
|
83
|
+
gv: 'gv',
|
|
84
|
+
gn: 'gn',
|
|
85
|
+
gu: 'gu',
|
|
86
|
+
ht: 'ht',
|
|
87
|
+
ha: 'ha',
|
|
88
|
+
sh: 'sh',
|
|
89
|
+
he: 'he',
|
|
90
|
+
hz: 'hz',
|
|
91
|
+
hi: 'hi',
|
|
92
|
+
ho: 'ho',
|
|
93
|
+
hr: 'hr',
|
|
94
|
+
hu: 'hu',
|
|
95
|
+
hy: 'hy',
|
|
96
|
+
ig: 'ig',
|
|
97
|
+
io: 'io',
|
|
98
|
+
ii: 'ii',
|
|
99
|
+
iu: 'iu',
|
|
100
|
+
ie: 'ie',
|
|
101
|
+
ia: 'ia',
|
|
102
|
+
id: 'id',
|
|
103
|
+
ik: 'ik',
|
|
104
|
+
is: 'is',
|
|
105
|
+
it: 'it',
|
|
106
|
+
jv: 'jv',
|
|
107
|
+
ja: 'ja',
|
|
108
|
+
kl: 'kl',
|
|
109
|
+
kn: 'kn',
|
|
110
|
+
ks: 'ks',
|
|
111
|
+
ka: 'ka',
|
|
112
|
+
kr: 'kr',
|
|
113
|
+
kk: 'kk',
|
|
114
|
+
km: 'km',
|
|
115
|
+
ki: 'ki',
|
|
116
|
+
rw: 'rw',
|
|
117
|
+
ky: 'ky',
|
|
118
|
+
kv: 'kv',
|
|
119
|
+
kg: 'kg',
|
|
120
|
+
ko: 'ko',
|
|
121
|
+
kj: 'kj',
|
|
122
|
+
ku: 'ku',
|
|
123
|
+
lo: 'lo',
|
|
124
|
+
la: 'la',
|
|
125
|
+
lv: 'lv',
|
|
126
|
+
li: 'li',
|
|
127
|
+
ln: 'ln',
|
|
128
|
+
lt: 'lt',
|
|
129
|
+
lb: 'lb',
|
|
130
|
+
lu: 'lu',
|
|
131
|
+
lg: 'lg',
|
|
132
|
+
mh: 'mh',
|
|
133
|
+
ml: 'ml',
|
|
134
|
+
mr: 'mr',
|
|
135
|
+
mk: 'mk',
|
|
136
|
+
mg: 'mg',
|
|
137
|
+
mt: 'mt',
|
|
138
|
+
mn: 'mn',
|
|
139
|
+
mi: 'mi',
|
|
140
|
+
ms: 'ms',
|
|
141
|
+
my: 'my',
|
|
142
|
+
na: 'na',
|
|
143
|
+
nv: 'nv',
|
|
144
|
+
nr: 'nr',
|
|
145
|
+
nd: 'nd',
|
|
146
|
+
ng: 'ng',
|
|
147
|
+
ne: 'ne',
|
|
148
|
+
nl: 'nl',
|
|
149
|
+
nn: 'nn',
|
|
150
|
+
nb: 'nb',
|
|
151
|
+
no: 'no',
|
|
152
|
+
ny: 'ny',
|
|
153
|
+
oc: 'oc',
|
|
154
|
+
oj: 'oj',
|
|
155
|
+
or: 'or',
|
|
156
|
+
om: 'om',
|
|
157
|
+
os: 'os',
|
|
158
|
+
pa: 'pa',
|
|
159
|
+
pi: 'pi',
|
|
160
|
+
pl: 'pl',
|
|
161
|
+
pt: 'pt',
|
|
162
|
+
ps: 'ps',
|
|
163
|
+
qu: 'qu',
|
|
164
|
+
rm: 'rm',
|
|
165
|
+
ro: 'ro',
|
|
166
|
+
rn: 'rn',
|
|
167
|
+
ru: 'ru',
|
|
168
|
+
sg: 'sg',
|
|
169
|
+
sa: 'sa',
|
|
170
|
+
si: 'si',
|
|
171
|
+
sk: 'sk',
|
|
172
|
+
sl: 'sl',
|
|
173
|
+
se: 'se',
|
|
174
|
+
sm: 'sm',
|
|
175
|
+
sn: 'sn',
|
|
176
|
+
sd: 'sd',
|
|
177
|
+
so: 'so',
|
|
178
|
+
st: 'st',
|
|
179
|
+
es: 'es',
|
|
180
|
+
sq: 'sq',
|
|
181
|
+
sc: 'sc',
|
|
182
|
+
sr: 'sr',
|
|
183
|
+
ss: 'ss',
|
|
184
|
+
su: 'su',
|
|
185
|
+
sw: 'sw',
|
|
186
|
+
sv: 'sv',
|
|
187
|
+
ty: 'ty',
|
|
188
|
+
ta: 'ta',
|
|
189
|
+
tt: 'tt',
|
|
190
|
+
te: 'te',
|
|
191
|
+
tg: 'tg',
|
|
192
|
+
tl: 'tl',
|
|
193
|
+
th: 'th',
|
|
194
|
+
ti: 'ti',
|
|
195
|
+
to: 'to',
|
|
196
|
+
tn: 'tn',
|
|
197
|
+
ts: 'ts',
|
|
198
|
+
tk: 'tk',
|
|
199
|
+
tr: 'tr',
|
|
200
|
+
tw: 'tw',
|
|
201
|
+
ug: 'ug',
|
|
202
|
+
uk: 'uk',
|
|
203
|
+
ur: 'ur',
|
|
204
|
+
uz: 'uz',
|
|
205
|
+
ve: 've',
|
|
206
|
+
vi: 'vi',
|
|
207
|
+
vo: 'vo',
|
|
208
|
+
wa: 'wa',
|
|
209
|
+
wo: 'wo',
|
|
210
|
+
xh: 'xh',
|
|
211
|
+
yi: 'yi',
|
|
212
|
+
yo: 'yo',
|
|
213
|
+
za: 'za',
|
|
214
|
+
zh: 'zh',
|
|
215
|
+
zu: 'zu',
|
|
216
|
+
} as const;
|
|
38
217
|
|
|
39
|
-
export
|
|
218
|
+
export type SupportedLanguage = (typeof supportedLanguages)[keyof typeof supportedLanguages];
|
|
40
219
|
|
|
41
|
-
export const
|
|
220
|
+
export const UTCFormat: RegExp =
|
|
221
|
+
/(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s\d{2}\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{4}\s\d{2}:\d{2}:\d{2}\sGMT/;
|
|
42
222
|
|
|
43
|
-
export const
|
|
223
|
+
export const pollKeys =
|
|
224
|
+
/(Type: |The poll outcome is finalized when the following nodes agree: |Voting deadline: |Poll: |Option 1: |Option 2: |Option 3: |Option 4: |Option 5: |Allow free text votes: |Who can vote: |Description: |Country scope: |City scope: |Legal form scope: |Domain scope: |All entities with the following property: |As observed by: |Link to query defining who can vote: )/g;
|
|
44
225
|
|
|
45
|
-
export const
|
|
226
|
+
export const organisationVerificationKeys =
|
|
227
|
+
/(Type: |Description: |Name: |English name: |Country: |Legal entity: |Legal form: |Department using the domain: |Owner of the domain: |Foreign domain used for publishing statements: |Province or state: |Business register number: |City: |Longitude: |Latitude: |Population: |Logo: |Employee count: |Reliability policy: |Confidence: |Public key: )/g;
|
|
46
228
|
|
|
47
|
-
export const
|
|
229
|
+
export const personVerificationKeys =
|
|
230
|
+
/(Type: |Description: |Name: |Date of birth: |City of birth: |Country of birth: |Job title: |Employer: |Owner of the domain: |Foreign domain used for publishing statements: |Picture: |Verification method: |Confidence: |Reliability policy: )/g;
|
|
48
231
|
|
|
49
|
-
export const
|
|
232
|
+
export const voteKeys = /(Type: |Poll id: |Poll: |Option: )/g;
|
|
50
233
|
|
|
51
|
-
export const
|
|
234
|
+
export const disputeAuthenticityKeys =
|
|
235
|
+
/(Type: |Description: |Hash of referenced statement: |Confidence: |Reliability policy: )/g;
|
|
52
236
|
|
|
53
|
-
export const
|
|
237
|
+
export const disputeContentKeys =
|
|
238
|
+
/(Type: |Description: |Hash of referenced statement: |Confidence: |Reliability policy: )/g;
|
|
54
239
|
|
|
55
|
-
export const
|
|
240
|
+
export const responseKeys = /(Type: |Hash of referenced statement: |Response: )/;
|
|
56
241
|
|
|
57
|
-
export const
|
|
242
|
+
export const PDFSigningKeys = /(Type: |Description: |PDF file hash: )/g;
|
|
58
243
|
|
|
59
|
-
export const
|
|
60
|
-
|
|
61
|
-
export const BoycottKeys = /(Type: |Description: |Subject: |Subject identity reference: )/
|
|
244
|
+
export const ratingKeys =
|
|
245
|
+
/(Type: |Subject type: |Subject name: |URL that identifies the subject: |Document file hash: |Rated quality: |Our rating: |Comment: )/;
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { describe, it } from 'node:test';
|
|
5
|
+
import assert from 'node:assert';
|
|
6
|
+
import {
|
|
7
|
+
buildStatement,
|
|
8
|
+
parseStatement,
|
|
9
|
+
buildPollContent,
|
|
10
|
+
buildVoteContent,
|
|
11
|
+
buildOrganisationVerificationContent,
|
|
12
|
+
buildPersonVerificationContent,
|
|
13
|
+
buildDisputeAuthenticityContent,
|
|
14
|
+
buildDisputeContentContent,
|
|
15
|
+
buildResponseContent,
|
|
16
|
+
buildPDFSigningContent,
|
|
17
|
+
buildRating,
|
|
18
|
+
} from './protocol';
|
|
19
|
+
import { verifySignedStatement } from './signature';
|
|
20
|
+
|
|
21
|
+
// ESM-compatible __dirname
|
|
22
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
23
|
+
const __dirname = path.dirname(__filename);
|
|
24
|
+
|
|
25
|
+
const fixturesDir = path.join(__dirname, '../fixtures');
|
|
26
|
+
|
|
27
|
+
function getFixtureDirs(): string[] {
|
|
28
|
+
if (!fs.existsSync(fixturesDir)) {
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
return fs
|
|
32
|
+
.readdirSync(fixturesDir, { withFileTypes: true })
|
|
33
|
+
.filter((dirent) => dirent.isDirectory())
|
|
34
|
+
.map((dirent) => dirent.name);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
38
|
+
function buildContentFromInput(contentObj: any): string {
|
|
39
|
+
if (!contentObj || typeof contentObj !== 'object') {
|
|
40
|
+
throw new Error('Content must be an object with a type field');
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
switch (contentObj.type) {
|
|
44
|
+
case 'poll':
|
|
45
|
+
return buildPollContent({
|
|
46
|
+
poll: contentObj.poll,
|
|
47
|
+
options: contentObj.options || [],
|
|
48
|
+
deadline: contentObj.deadline ? new Date(contentObj.deadline) : undefined,
|
|
49
|
+
scopeDescription: contentObj.scopeDescription,
|
|
50
|
+
allowArbitraryVote: contentObj.allowArbitraryVote,
|
|
51
|
+
});
|
|
52
|
+
case 'vote':
|
|
53
|
+
return buildVoteContent({
|
|
54
|
+
pollHash: contentObj.pollHash,
|
|
55
|
+
poll: contentObj.poll,
|
|
56
|
+
vote: contentObj.vote,
|
|
57
|
+
});
|
|
58
|
+
case 'organisation_verification':
|
|
59
|
+
return buildOrganisationVerificationContent({
|
|
60
|
+
name: contentObj.name,
|
|
61
|
+
englishName: contentObj.englishName,
|
|
62
|
+
country: contentObj.country,
|
|
63
|
+
city: contentObj.city,
|
|
64
|
+
province: contentObj.province,
|
|
65
|
+
legalForm: contentObj.legalForm,
|
|
66
|
+
department: contentObj.department,
|
|
67
|
+
domain: contentObj.domain,
|
|
68
|
+
foreignDomain: contentObj.foreignDomain,
|
|
69
|
+
serialNumber: contentObj.serialNumber,
|
|
70
|
+
confidence: contentObj.confidence,
|
|
71
|
+
reliabilityPolicy: contentObj.reliabilityPolicy,
|
|
72
|
+
employeeCount: contentObj.employeeCount,
|
|
73
|
+
pictureHash: contentObj.pictureHash,
|
|
74
|
+
latitude: contentObj.latitude,
|
|
75
|
+
longitude: contentObj.longitude,
|
|
76
|
+
population: contentObj.population,
|
|
77
|
+
publicKey: contentObj.publicKey,
|
|
78
|
+
});
|
|
79
|
+
case 'person_verification':
|
|
80
|
+
return buildPersonVerificationContent({
|
|
81
|
+
name: contentObj.name,
|
|
82
|
+
countryOfBirth: contentObj.countryOfBirth,
|
|
83
|
+
cityOfBirth: contentObj.cityOfBirth,
|
|
84
|
+
ownDomain: contentObj.ownDomain,
|
|
85
|
+
foreignDomain: contentObj.foreignDomain,
|
|
86
|
+
dateOfBirth: new Date(contentObj.dateOfBirth),
|
|
87
|
+
jobTitle: contentObj.jobTitle,
|
|
88
|
+
employer: contentObj.employer,
|
|
89
|
+
verificationMethod: contentObj.verificationMethod,
|
|
90
|
+
confidence: contentObj.confidence,
|
|
91
|
+
picture: contentObj.picture,
|
|
92
|
+
reliabilityPolicy: contentObj.reliabilityPolicy,
|
|
93
|
+
publicKey: contentObj.publicKey,
|
|
94
|
+
});
|
|
95
|
+
case 'dispute_authenticity':
|
|
96
|
+
return buildDisputeAuthenticityContent({
|
|
97
|
+
hash: contentObj.hash,
|
|
98
|
+
confidence: contentObj.confidence,
|
|
99
|
+
reliabilityPolicy: contentObj.reliabilityPolicy,
|
|
100
|
+
});
|
|
101
|
+
case 'dispute_content':
|
|
102
|
+
return buildDisputeContentContent({
|
|
103
|
+
hash: contentObj.hash,
|
|
104
|
+
confidence: contentObj.confidence,
|
|
105
|
+
reliabilityPolicy: contentObj.reliabilityPolicy,
|
|
106
|
+
});
|
|
107
|
+
case 'response':
|
|
108
|
+
return buildResponseContent({
|
|
109
|
+
hash: contentObj.hash,
|
|
110
|
+
response: contentObj.response,
|
|
111
|
+
});
|
|
112
|
+
case 'pdf_signing':
|
|
113
|
+
return buildPDFSigningContent({
|
|
114
|
+
hash: contentObj.hash,
|
|
115
|
+
});
|
|
116
|
+
case 'rating':
|
|
117
|
+
return buildRating({
|
|
118
|
+
subjectName: contentObj.subjectName,
|
|
119
|
+
subjectType: contentObj.subjectType,
|
|
120
|
+
subjectReference: contentObj.subjectReference,
|
|
121
|
+
documentFileHash: contentObj.documentFileHash,
|
|
122
|
+
rating: contentObj.rating,
|
|
123
|
+
quality: contentObj.quality,
|
|
124
|
+
comment: contentObj.comment,
|
|
125
|
+
});
|
|
126
|
+
default:
|
|
127
|
+
throw new Error(`Unknown content type: ${contentObj.type}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
describe('Fixture Validation', () => {
|
|
132
|
+
const fixtureDirs = getFixtureDirs();
|
|
133
|
+
|
|
134
|
+
if (fixtureDirs.length === 0) {
|
|
135
|
+
it('no fixtures found', () => {
|
|
136
|
+
// No fixture directories found
|
|
137
|
+
assert.ok(true);
|
|
138
|
+
});
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
for (const dir of fixtureDirs) {
|
|
143
|
+
describe(`Fixture: ${dir}`, () => {
|
|
144
|
+
const inputPath = path.join(fixturesDir, dir, 'input.json');
|
|
145
|
+
const outputPath = path.join(fixturesDir, dir, 'output.txt');
|
|
146
|
+
|
|
147
|
+
if (!fs.existsSync(inputPath)) {
|
|
148
|
+
it('should have input.json', () => {
|
|
149
|
+
assert.fail(`Missing input.json in ${dir}`);
|
|
150
|
+
});
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (!fs.existsSync(outputPath)) {
|
|
155
|
+
it('should have output.txt', () => {
|
|
156
|
+
assert.fail(`Missing output.txt in ${dir}`);
|
|
157
|
+
});
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
it('output.txt should match built statement from input.json', async () => {
|
|
162
|
+
const input = JSON.parse(fs.readFileSync(inputPath, 'utf-8'));
|
|
163
|
+
const expectedOutput = fs.readFileSync(outputPath, 'utf-8');
|
|
164
|
+
|
|
165
|
+
if (input.signature) {
|
|
166
|
+
const isValid = await verifySignedStatement(expectedOutput);
|
|
167
|
+
assert.strictEqual(isValid, true);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
let content: string;
|
|
172
|
+
if (typeof input.content === 'string') {
|
|
173
|
+
content = input.content;
|
|
174
|
+
} else {
|
|
175
|
+
content = buildContentFromInput(input.content);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Build statement
|
|
179
|
+
const builtStatement = buildStatement({
|
|
180
|
+
domain: input.domain,
|
|
181
|
+
author: input.author,
|
|
182
|
+
time: new Date(input.time),
|
|
183
|
+
tags: input.tags,
|
|
184
|
+
content,
|
|
185
|
+
representative: input.representative,
|
|
186
|
+
supersededStatement: input.supersededStatement,
|
|
187
|
+
translations: input.translations,
|
|
188
|
+
attachments: input.attachments,
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
assert.strictEqual(builtStatement, expectedOutput);
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
it('output.txt should not contain double newlines', () => {
|
|
195
|
+
const output = fs.readFileSync(outputPath, 'utf-8');
|
|
196
|
+
assert.ok(!/\n\n/.test(output));
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
it('output.txt should be parseable', () => {
|
|
200
|
+
const output = fs.readFileSync(outputPath, 'utf-8');
|
|
201
|
+
const parsed = parseStatement({ statement: output });
|
|
202
|
+
|
|
203
|
+
assert.ok(parsed.domain);
|
|
204
|
+
assert.ok(parsed.author);
|
|
205
|
+
assert.ok(parsed.content);
|
|
206
|
+
assert.strictEqual(parsed.formatVersion, '5');
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
it('round-trip: parse(output.txt) should match input.json structure', () => {
|
|
210
|
+
const input = JSON.parse(fs.readFileSync(inputPath, 'utf-8'));
|
|
211
|
+
const output = fs.readFileSync(outputPath, 'utf-8');
|
|
212
|
+
const parsed = parseStatement({ statement: output });
|
|
213
|
+
|
|
214
|
+
assert.strictEqual(parsed.domain, input.domain);
|
|
215
|
+
assert.strictEqual(parsed.author, input.author);
|
|
216
|
+
assert.strictEqual(new Date(parsed.time).toISOString(), new Date(input.time).toISOString());
|
|
217
|
+
|
|
218
|
+
if (input.tags) {
|
|
219
|
+
assert.deepStrictEqual(parsed.tags, input.tags);
|
|
220
|
+
}
|
|
221
|
+
if (input.representative) {
|
|
222
|
+
assert.strictEqual(parsed.representative, input.representative);
|
|
223
|
+
}
|
|
224
|
+
if (input.supersededStatement) {
|
|
225
|
+
assert.strictEqual(parsed.supersededStatement, input.supersededStatement);
|
|
226
|
+
}
|
|
227
|
+
if (input.attachments) {
|
|
228
|
+
assert.deepStrictEqual(parsed.attachments, input.attachments);
|
|
229
|
+
}
|
|
230
|
+
if (input.translations) {
|
|
231
|
+
assert.deepStrictEqual(parsed.translations, input.translations);
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
});
|