fix(core): update
This commit is contained in:
parent
45593168b0
commit
d77c104915
@ -25,12 +25,12 @@
|
|||||||
"@git.zone/tsrun": "^1.2.44",
|
"@git.zone/tsrun": "^1.2.44",
|
||||||
"@git.zone/tstest": "^1.0.77",
|
"@git.zone/tstest": "^1.0.77",
|
||||||
"@push.rocks/tapbundle": "^5.0.8",
|
"@push.rocks/tapbundle": "^5.0.8",
|
||||||
"@types/node": "^20.11.20"
|
"@types/node": "^20.11.24"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@push.rocks/smartstring": "^4.0.13",
|
"@push.rocks/smartbuffer": "^1.0.7",
|
||||||
"@types/buffer-json": "^2.0.3",
|
"@push.rocks/smartenv": "^5.0.12",
|
||||||
"buffer-json": "^2.0.0",
|
"@push.rocks/smartstring": "^4.0.14",
|
||||||
"fast-json-stable-stringify": "^2.1.0",
|
"fast-json-stable-stringify": "^2.1.0",
|
||||||
"lodash.clonedeep": "^4.5.0"
|
"lodash.clonedeep": "^4.5.0"
|
||||||
},
|
},
|
||||||
|
109
pnpm-lock.yaml
generated
109
pnpm-lock.yaml
generated
@ -5,15 +5,15 @@ settings:
|
|||||||
excludeLinksFromLockfile: false
|
excludeLinksFromLockfile: false
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
|
'@push.rocks/smartbuffer':
|
||||||
|
specifier: ^1.0.7
|
||||||
|
version: 1.0.7
|
||||||
|
'@push.rocks/smartenv':
|
||||||
|
specifier: ^5.0.12
|
||||||
|
version: 5.0.12
|
||||||
'@push.rocks/smartstring':
|
'@push.rocks/smartstring':
|
||||||
specifier: ^4.0.13
|
specifier: ^4.0.14
|
||||||
version: 4.0.13
|
version: 4.0.14
|
||||||
'@types/buffer-json':
|
|
||||||
specifier: ^2.0.3
|
|
||||||
version: 2.0.3
|
|
||||||
buffer-json:
|
|
||||||
specifier: ^2.0.0
|
|
||||||
version: 2.0.0
|
|
||||||
fast-json-stable-stringify:
|
fast-json-stable-stringify:
|
||||||
specifier: ^2.1.0
|
specifier: ^2.1.0
|
||||||
version: 2.1.0
|
version: 2.1.0
|
||||||
@ -23,20 +23,20 @@ dependencies:
|
|||||||
|
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@git.zone/tsbuild':
|
'@git.zone/tsbuild':
|
||||||
specifier: ^2.1.72
|
specifier: ^2.1.66
|
||||||
version: 2.1.72
|
version: 2.1.72
|
||||||
'@git.zone/tsrun':
|
'@git.zone/tsrun':
|
||||||
specifier: ^1.2.46
|
specifier: ^1.2.44
|
||||||
version: 1.2.46(@types/node@20.11.20)
|
version: 1.2.46(@types/node@20.11.24)
|
||||||
'@git.zone/tstest':
|
'@git.zone/tstest':
|
||||||
specifier: ^1.0.86
|
specifier: ^1.0.77
|
||||||
version: 1.0.86(@types/node@20.11.20)(sinon@17.0.1)
|
version: 1.0.86(@types/node@20.11.24)(sinon@17.0.1)
|
||||||
'@push.rocks/tapbundle':
|
'@push.rocks/tapbundle':
|
||||||
specifier: ^5.0.15
|
specifier: ^5.0.8
|
||||||
version: 5.0.15(sinon@17.0.1)
|
version: 5.0.15(sinon@17.0.1)
|
||||||
'@types/node':
|
'@types/node':
|
||||||
specifier: ^20.11.20
|
specifier: ^20.11.24
|
||||||
version: 20.11.20
|
version: 20.11.24
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
|
|
||||||
@ -103,7 +103,7 @@ packages:
|
|||||||
'@push.rocks/smartjson': 5.0.10
|
'@push.rocks/smartjson': 5.0.10
|
||||||
'@push.rocks/smartrx': 3.0.7
|
'@push.rocks/smartrx': 3.0.7
|
||||||
'@push.rocks/smartsocket': 2.0.24
|
'@push.rocks/smartsocket': 2.0.24
|
||||||
'@push.rocks/smartstring': 4.0.13
|
'@push.rocks/smartstring': 4.0.14
|
||||||
'@push.rocks/smarturl': 3.0.7
|
'@push.rocks/smarturl': 3.0.7
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- bufferutil
|
- bufferutil
|
||||||
@ -390,13 +390,13 @@ packages:
|
|||||||
- supports-color
|
- supports-color
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@git.zone/tsrun@1.2.46(@types/node@20.11.20):
|
/@git.zone/tsrun@1.2.46(@types/node@20.11.24):
|
||||||
resolution: {integrity: sha512-8miFVBle9Mnjx+uPGI/P+EuWcIOXWjBAkdjN5IYbdp5Ytt4xQODCLh4JSnC9h56UeU1nUxCAxZeJs2e9TXrivA==}
|
resolution: {integrity: sha512-8miFVBle9Mnjx+uPGI/P+EuWcIOXWjBAkdjN5IYbdp5Ytt4xQODCLh4JSnC9h56UeU1nUxCAxZeJs2e9TXrivA==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
dependencies:
|
dependencies:
|
||||||
'@push.rocks/smartfile': 10.0.41
|
'@push.rocks/smartfile': 10.0.41
|
||||||
'@push.rocks/smartshell': 3.0.3
|
'@push.rocks/smartshell': 3.0.3
|
||||||
ts-node: 10.9.2(@types/node@20.11.20)(typescript@5.1.6)
|
ts-node: 10.9.2(@types/node@20.11.24)(typescript@5.1.6)
|
||||||
typescript: 5.1.6
|
typescript: 5.1.6
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- '@swc/core'
|
- '@swc/core'
|
||||||
@ -404,13 +404,13 @@ packages:
|
|||||||
- '@types/node'
|
- '@types/node'
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@git.zone/tstest@1.0.86(@types/node@20.11.20)(sinon@17.0.1):
|
/@git.zone/tstest@1.0.86(@types/node@20.11.24)(sinon@17.0.1):
|
||||||
resolution: {integrity: sha512-ec95MNeA21L+ob+lvLVCmwPTTC1BY+v/JHLYZ9DOZ9+9buLgx+cJ7VkwGBJCnlWJtqEtJosUrFKTih36iNuT3g==}
|
resolution: {integrity: sha512-ec95MNeA21L+ob+lvLVCmwPTTC1BY+v/JHLYZ9DOZ9+9buLgx+cJ7VkwGBJCnlWJtqEtJosUrFKTih36iNuT3g==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
dependencies:
|
dependencies:
|
||||||
'@api.global/typedserver': 3.0.24
|
'@api.global/typedserver': 3.0.24
|
||||||
'@git.zone/tsbundle': 2.0.15
|
'@git.zone/tsbundle': 2.0.15
|
||||||
'@git.zone/tsrun': 1.2.46(@types/node@20.11.20)
|
'@git.zone/tsrun': 1.2.46(@types/node@20.11.24)
|
||||||
'@push.rocks/consolecolor': 2.0.1
|
'@push.rocks/consolecolor': 2.0.1
|
||||||
'@push.rocks/smartbrowser': 2.0.6
|
'@push.rocks/smartbrowser': 2.0.6
|
||||||
'@push.rocks/smartdelay': 3.0.5
|
'@push.rocks/smartdelay': 3.0.5
|
||||||
@ -616,6 +616,10 @@ packages:
|
|||||||
- utf-8-validate
|
- utf-8-validate
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/@push.rocks/smartbuffer@1.0.7:
|
||||||
|
resolution: {integrity: sha512-ESs16KRJuHo0wXxAZjwu0uiBgwUC6EodHtERFHAo2XfT+fw40DPnAvIi37RJPA8FZ7kIkpzRcuTCuFW81UH7VA==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@push.rocks/smartcache@1.0.16:
|
/@push.rocks/smartcache@1.0.16:
|
||||||
resolution: {integrity: sha512-UAXf74eDuH4/RebJhydIbHlYVR3ACYJjniEY/9ZePblu7bIPgwFZqLBE9g1lcKVogbH9yY62dk3rSpgBzenyfQ==}
|
resolution: {integrity: sha512-UAXf74eDuH4/RebJhydIbHlYVR3ACYJjniEY/9ZePblu7bIPgwFZqLBE9g1lcKVogbH9yY62dk3rSpgBzenyfQ==}
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -731,7 +735,7 @@ packages:
|
|||||||
/@push.rocks/smartjson@5.0.10:
|
/@push.rocks/smartjson@5.0.10:
|
||||||
resolution: {integrity: sha512-yuntSMGZ+XNHMrbS9RxotaD+eOgoNTcuDoWsttis+N3Mkc9DIam0pt/ER4NU8TgfMmhT/hKwQH+3DJceDzntoA==}
|
resolution: {integrity: sha512-yuntSMGZ+XNHMrbS9RxotaD+eOgoNTcuDoWsttis+N3Mkc9DIam0pt/ER4NU8TgfMmhT/hKwQH+3DJceDzntoA==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@push.rocks/smartstring': 4.0.13
|
'@push.rocks/smartstring': 4.0.14
|
||||||
'@types/buffer-json': 2.0.3
|
'@types/buffer-json': 2.0.3
|
||||||
buffer-json: 2.0.0
|
buffer-json: 2.0.0
|
||||||
fast-json-stable-stringify: 2.1.0
|
fast-json-stable-stringify: 2.1.0
|
||||||
@ -943,16 +947,14 @@ packages:
|
|||||||
'@push.rocks/smartrx': 3.0.7
|
'@push.rocks/smartrx': 3.0.7
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@push.rocks/smartstring@4.0.13:
|
/@push.rocks/smartstring@4.0.14:
|
||||||
resolution: {integrity: sha512-iEAch6fYC+VijBYWFfRif5Wj5KxdUgC2Xnn0NNgDFrBmI14HsECcPbZ0YdESawRVD27pLYYZJCCbu/M/Llo1kg==}
|
resolution: {integrity: sha512-0zwtB+3yT1rFOtZY6+H6c8DIpKPrqQH/zx+P667nykvLgopH1t/kjGWNvaLC2mJOT3l+GjUd58DUO7DlTZzOSA==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@push.rocks/isounique': 1.0.5
|
'@push.rocks/isounique': 1.0.5
|
||||||
'@push.rocks/smartenv': 5.0.12
|
'@push.rocks/smartenv': 5.0.12
|
||||||
'@types/randomatic': 3.1.5
|
'@types/randomatic': 3.1.5
|
||||||
buffer: 6.0.3
|
|
||||||
crypto-random-string: 5.0.0
|
crypto-random-string: 5.0.0
|
||||||
js-base64: 3.7.7
|
js-base64: 3.7.7
|
||||||
normalize-newline: 4.1.0
|
|
||||||
randomatic: 3.1.1
|
randomatic: 3.1.1
|
||||||
strip-indent: 4.0.0
|
strip-indent: 4.0.0
|
||||||
url: 0.11.3
|
url: 0.11.3
|
||||||
@ -1348,7 +1350,7 @@ packages:
|
|||||||
/@types/accepts@1.3.7:
|
/@types/accepts@1.3.7:
|
||||||
resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==}
|
resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.11.20
|
'@types/node': 20.11.24
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@types/babel__code-frame@7.0.6:
|
/@types/babel__code-frame@7.0.6:
|
||||||
@ -1359,11 +1361,12 @@ packages:
|
|||||||
resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==}
|
resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/connect': 3.4.38
|
'@types/connect': 3.4.38
|
||||||
'@types/node': 20.11.20
|
'@types/node': 20.11.24
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@types/buffer-json@2.0.3:
|
/@types/buffer-json@2.0.3:
|
||||||
resolution: {integrity: sha512-ItD4UfF3Q5jA+PEV6ZUWEHvlWaXJbd0rpuBKOIrEebM053FHaJddKsgUf0vy7nLSTs44nqFj3Mh8J3TiT0xv4g==}
|
resolution: {integrity: sha512-ItD4UfF3Q5jA+PEV6ZUWEHvlWaXJbd0rpuBKOIrEebM053FHaJddKsgUf0vy7nLSTs44nqFj3Mh8J3TiT0xv4g==}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/@types/chai-dom@0.0.9:
|
/@types/chai-dom@0.0.9:
|
||||||
resolution: {integrity: sha512-jj4F2NJog2/GBYsyJ8+NvhnWUBbPY4MUAKLdPJE6+568rw12GGXvj0ycUuP5nndVrnJgozmJAoMTvxvjJATXWw==}
|
resolution: {integrity: sha512-jj4F2NJog2/GBYsyJ8+NvhnWUBbPY4MUAKLdPJE6+568rw12GGXvj0ycUuP5nndVrnJgozmJAoMTvxvjJATXWw==}
|
||||||
@ -1378,21 +1381,21 @@ packages:
|
|||||||
/@types/clean-css@4.2.11:
|
/@types/clean-css@4.2.11:
|
||||||
resolution: {integrity: sha512-Y8n81lQVTAfP2TOdtJJEsCoYl1AnOkqDqMvXb9/7pfgZZ7r8YrEyurrAvAoAjHOGXKRybay+5CsExqIH6liccw==}
|
resolution: {integrity: sha512-Y8n81lQVTAfP2TOdtJJEsCoYl1AnOkqDqMvXb9/7pfgZZ7r8YrEyurrAvAoAjHOGXKRybay+5CsExqIH6liccw==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.11.20
|
'@types/node': 20.11.24
|
||||||
source-map: 0.6.1
|
source-map: 0.6.1
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@types/co-body@6.1.3:
|
/@types/co-body@6.1.3:
|
||||||
resolution: {integrity: sha512-UhuhrQ5hclX6UJctv5m4Rfp52AfG9o9+d9/HwjxhVB5NjXxr5t9oKgJxN8xRHgr35oo8meUEHUPFWiKg6y71aA==}
|
resolution: {integrity: sha512-UhuhrQ5hclX6UJctv5m4Rfp52AfG9o9+d9/HwjxhVB5NjXxr5t9oKgJxN8xRHgr35oo8meUEHUPFWiKg6y71aA==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.11.20
|
'@types/node': 20.11.24
|
||||||
'@types/qs': 6.9.11
|
'@types/qs': 6.9.11
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@types/connect@3.4.38:
|
/@types/connect@3.4.38:
|
||||||
resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
|
resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.11.20
|
'@types/node': 20.11.24
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@types/content-disposition@0.5.8:
|
/@types/content-disposition@0.5.8:
|
||||||
@ -1413,13 +1416,13 @@ packages:
|
|||||||
'@types/connect': 3.4.38
|
'@types/connect': 3.4.38
|
||||||
'@types/express': 4.17.21
|
'@types/express': 4.17.21
|
||||||
'@types/keygrip': 1.0.6
|
'@types/keygrip': 1.0.6
|
||||||
'@types/node': 20.11.20
|
'@types/node': 20.11.24
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@types/cors@2.8.17:
|
/@types/cors@2.8.17:
|
||||||
resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==}
|
resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.11.20
|
'@types/node': 20.11.24
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@types/debounce@1.2.4:
|
/@types/debounce@1.2.4:
|
||||||
@ -1433,7 +1436,7 @@ packages:
|
|||||||
/@types/express-serve-static-core@4.17.43:
|
/@types/express-serve-static-core@4.17.43:
|
||||||
resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==}
|
resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.11.20
|
'@types/node': 20.11.24
|
||||||
'@types/qs': 6.9.11
|
'@types/qs': 6.9.11
|
||||||
'@types/range-parser': 1.2.7
|
'@types/range-parser': 1.2.7
|
||||||
'@types/send': 0.17.4
|
'@types/send': 0.17.4
|
||||||
@ -1451,21 +1454,21 @@ packages:
|
|||||||
/@types/from2@2.3.5:
|
/@types/from2@2.3.5:
|
||||||
resolution: {integrity: sha512-giavnjf3kNlJnE+HpZA1CQ3UKHxgehzsTuIMGda8pGMbOiLYGVNADEskey44OZcADHm/HOoBany8IV+0x28XFw==}
|
resolution: {integrity: sha512-giavnjf3kNlJnE+HpZA1CQ3UKHxgehzsTuIMGda8pGMbOiLYGVNADEskey44OZcADHm/HOoBany8IV+0x28XFw==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.11.20
|
'@types/node': 20.11.24
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@types/fs-extra@11.0.4:
|
/@types/fs-extra@11.0.4:
|
||||||
resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==}
|
resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/jsonfile': 6.1.4
|
'@types/jsonfile': 6.1.4
|
||||||
'@types/node': 20.11.20
|
'@types/node': 20.11.24
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@types/glob@8.1.0:
|
/@types/glob@8.1.0:
|
||||||
resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==}
|
resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/minimatch': 5.1.2
|
'@types/minimatch': 5.1.2
|
||||||
'@types/node': 20.11.20
|
'@types/node': 20.11.24
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@types/html-minifier@4.0.5:
|
/@types/html-minifier@4.0.5:
|
||||||
@ -1515,7 +1518,7 @@ packages:
|
|||||||
/@types/jsonfile@6.1.4:
|
/@types/jsonfile@6.1.4:
|
||||||
resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==}
|
resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.11.20
|
'@types/node': 20.11.24
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@types/keygrip@1.0.6:
|
/@types/keygrip@1.0.6:
|
||||||
@ -1538,7 +1541,7 @@ packages:
|
|||||||
'@types/http-errors': 2.0.4
|
'@types/http-errors': 2.0.4
|
||||||
'@types/keygrip': 1.0.6
|
'@types/keygrip': 1.0.6
|
||||||
'@types/koa-compose': 3.2.8
|
'@types/koa-compose': 3.2.8
|
||||||
'@types/node': 20.11.20
|
'@types/node': 20.11.24
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@types/mime-types@2.1.4:
|
/@types/mime-types@2.1.4:
|
||||||
@ -1565,8 +1568,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==}
|
resolution: {integrity: sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@types/node@20.11.20:
|
/@types/node@20.11.24:
|
||||||
resolution: {integrity: sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==}
|
resolution: {integrity: sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==}
|
||||||
dependencies:
|
dependencies:
|
||||||
undici-types: 5.26.5
|
undici-types: 5.26.5
|
||||||
dev: true
|
dev: true
|
||||||
@ -1598,7 +1601,7 @@ packages:
|
|||||||
resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==}
|
resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/mime': 1.3.5
|
'@types/mime': 1.3.5
|
||||||
'@types/node': 20.11.20
|
'@types/node': 20.11.24
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@types/serve-static@1.15.5:
|
/@types/serve-static@1.15.5:
|
||||||
@ -1606,7 +1609,7 @@ packages:
|
|||||||
dependencies:
|
dependencies:
|
||||||
'@types/http-errors': 2.0.4
|
'@types/http-errors': 2.0.4
|
||||||
'@types/mime': 3.0.4
|
'@types/mime': 3.0.4
|
||||||
'@types/node': 20.11.20
|
'@types/node': 20.11.24
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@types/sinon-chai@3.2.12:
|
/@types/sinon-chai@3.2.12:
|
||||||
@ -1633,7 +1636,7 @@ packages:
|
|||||||
/@types/through2@2.0.41:
|
/@types/through2@2.0.41:
|
||||||
resolution: {integrity: sha512-ryQ0tidWkb1O1JuYvWKyMLYEtOWDqF5mHerJzKz/gQpoAaJq2l/dsMPBF0B5BNVT34rbARYJ5/tsZwLfUi2kwQ==}
|
resolution: {integrity: sha512-ryQ0tidWkb1O1JuYvWKyMLYEtOWDqF5mHerJzKz/gQpoAaJq2l/dsMPBF0B5BNVT34rbARYJ5/tsZwLfUi2kwQ==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.11.20
|
'@types/node': 20.11.24
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@types/trusted-types@2.0.7:
|
/@types/trusted-types@2.0.7:
|
||||||
@ -1661,20 +1664,20 @@ packages:
|
|||||||
/@types/ws@7.4.7:
|
/@types/ws@7.4.7:
|
||||||
resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==}
|
resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.11.20
|
'@types/node': 20.11.24
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@types/ws@8.5.10:
|
/@types/ws@8.5.10:
|
||||||
resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==}
|
resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.11.20
|
'@types/node': 20.11.24
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@types/yauzl@2.10.3:
|
/@types/yauzl@2.10.3:
|
||||||
resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
|
resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
|
||||||
requiresBuild: true
|
requiresBuild: true
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.11.20
|
'@types/node': 20.11.24
|
||||||
dev: true
|
dev: true
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
@ -1973,6 +1976,7 @@ packages:
|
|||||||
|
|
||||||
/base64-js@1.5.1:
|
/base64-js@1.5.1:
|
||||||
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
|
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/base64id@2.0.0:
|
/base64id@2.0.0:
|
||||||
resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==}
|
resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==}
|
||||||
@ -2062,6 +2066,7 @@ packages:
|
|||||||
|
|
||||||
/buffer-json@2.0.0:
|
/buffer-json@2.0.0:
|
||||||
resolution: {integrity: sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==}
|
resolution: {integrity: sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/buffer@5.7.1:
|
/buffer@5.7.1:
|
||||||
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
|
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
|
||||||
@ -2075,6 +2080,7 @@ packages:
|
|||||||
dependencies:
|
dependencies:
|
||||||
base64-js: 1.5.1
|
base64-js: 1.5.1
|
||||||
ieee754: 1.2.1
|
ieee754: 1.2.1
|
||||||
|
dev: true
|
||||||
|
|
||||||
/bytes@3.1.2:
|
/bytes@3.1.2:
|
||||||
resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
|
resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
|
||||||
@ -2612,7 +2618,7 @@ packages:
|
|||||||
dependencies:
|
dependencies:
|
||||||
'@types/cookie': 0.4.1
|
'@types/cookie': 0.4.1
|
||||||
'@types/cors': 2.8.17
|
'@types/cors': 2.8.17
|
||||||
'@types/node': 20.11.20
|
'@types/node': 20.11.24
|
||||||
accepts: 1.3.8
|
accepts: 1.3.8
|
||||||
base64id: 2.0.0
|
base64id: 2.0.0
|
||||||
cookie: 0.4.2
|
cookie: 0.4.2
|
||||||
@ -3314,6 +3320,7 @@ packages:
|
|||||||
|
|
||||||
/ieee754@1.2.1:
|
/ieee754@1.2.1:
|
||||||
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
|
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/ignore@5.3.1:
|
/ignore@5.3.1:
|
||||||
resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==}
|
resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==}
|
||||||
@ -4158,6 +4165,7 @@ packages:
|
|||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
dependencies:
|
dependencies:
|
||||||
replace-buffer: 1.2.1
|
replace-buffer: 1.2.1
|
||||||
|
dev: true
|
||||||
|
|
||||||
/normalize-path@3.0.0:
|
/normalize-path@3.0.0:
|
||||||
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
|
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
|
||||||
@ -4615,6 +4623,7 @@ packages:
|
|||||||
/replace-buffer@1.2.1:
|
/replace-buffer@1.2.1:
|
||||||
resolution: {integrity: sha512-ly3OKwKu+3T55DjP5PjIMzxgz9lFx6dQnBmAIxryZyRKl8f22juy12ShOyuq8WrQE5UlFOseZgQZDua0iF9DHw==}
|
resolution: {integrity: sha512-ly3OKwKu+3T55DjP5PjIMzxgz9lFx6dQnBmAIxryZyRKl8f22juy12ShOyuq8WrQE5UlFOseZgQZDua0iF9DHw==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/require-directory@2.1.1:
|
/require-directory@2.1.1:
|
||||||
resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=}
|
resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=}
|
||||||
@ -5191,7 +5200,7 @@ packages:
|
|||||||
hasBin: true
|
hasBin: true
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/ts-node@10.9.2(@types/node@20.11.20)(typescript@5.1.6):
|
/ts-node@10.9.2(@types/node@20.11.24)(typescript@5.1.6):
|
||||||
resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
|
resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@ -5210,7 +5219,7 @@ packages:
|
|||||||
'@tsconfig/node12': 1.0.11
|
'@tsconfig/node12': 1.0.11
|
||||||
'@tsconfig/node14': 1.0.3
|
'@tsconfig/node14': 1.0.3
|
||||||
'@tsconfig/node16': 1.0.4
|
'@tsconfig/node16': 1.0.4
|
||||||
'@types/node': 20.11.20
|
'@types/node': 20.11.24
|
||||||
acorn: 8.11.3
|
acorn: 8.11.3
|
||||||
acorn-walk: 8.3.2
|
acorn-walk: 8.3.2
|
||||||
arg: 4.1.3
|
arg: 4.1.3
|
||||||
|
@ -61,12 +61,15 @@ tap.test('stringify should handle plain string', async () => {
|
|||||||
|
|
||||||
tap.test('should work with buffers', async () => {
|
tap.test('should work with buffers', async () => {
|
||||||
const someObject = {
|
const someObject = {
|
||||||
myBuffer: Buffer.from('hello'),
|
myBuffer: new TextEncoder().encode('hello')
|
||||||
};
|
};
|
||||||
|
console.log(someObject.myBuffer);
|
||||||
const stringified = smartjson.stringify(someObject);
|
const stringified = smartjson.stringify(someObject);
|
||||||
|
console.log(stringified);
|
||||||
const decoded = smartjson.parse(stringified);
|
const decoded = smartjson.parse(stringified);
|
||||||
expect(decoded.myBuffer.toString()).toEqual('hello');
|
console.log(decoded.myBuffer);
|
||||||
|
let text = new TextDecoder().decode(decoded.myBuffer);
|
||||||
|
expect(text).toEqual('hello');
|
||||||
});
|
});
|
||||||
|
|
||||||
tap.start();
|
tap.start();
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
*/
|
*/
|
||||||
export const commitinfo = {
|
export const commitinfo = {
|
||||||
name: '@push.rocks/smartjson',
|
name: '@push.rocks/smartjson',
|
||||||
version: '5.0.11',
|
version: '5.0.12',
|
||||||
description: 'typed json handlers'
|
description: 'typed json handlers'
|
||||||
}
|
}
|
||||||
|
121
ts/bufferhandling.ts
Normal file
121
ts/bufferhandling.ts
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
import * as plugins from './smartjson.plugins.js';
|
||||||
|
|
||||||
|
// Define interfaces and types for better type checking and readability
|
||||||
|
interface IBufferLike {
|
||||||
|
type: 'Buffer';
|
||||||
|
data: string | any[]; // `any[]` for array data representation
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IEncodedBuffer {
|
||||||
|
type: 'EncodedBuffer',
|
||||||
|
data: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
type TParseReviver = (this: any, key: string, value: any) => any;
|
||||||
|
type TParseReplacer = (this: any, key: string, value: any) => any;
|
||||||
|
|
||||||
|
// Utility functions to handle base64 encoding/decoding in a cross-platform way
|
||||||
|
function base64Encode(data: Uint8Array): string {
|
||||||
|
return btoa(String.fromCharCode(...data));
|
||||||
|
}
|
||||||
|
|
||||||
|
function base64Decode(str: string): Uint8Array {
|
||||||
|
return new Uint8Array(Array.from(atob(str)).map((char) => char.charCodeAt(0)));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Main functionality with cross-platform support
|
||||||
|
function stringify(value: any, space?: string | number): string {
|
||||||
|
return JSON.stringify(value, replacer, space);
|
||||||
|
}
|
||||||
|
|
||||||
|
function parse(text: string): any {
|
||||||
|
return JSON.parse(text, reviver);
|
||||||
|
}
|
||||||
|
|
||||||
|
const replacer: TParseReplacer = (key, value) => {
|
||||||
|
// Check if value is IBufferLike
|
||||||
|
if (isBufferLike(value)) {
|
||||||
|
let bufferData: Uint8Array;
|
||||||
|
|
||||||
|
// Handle IBufferLike objects with a .data property
|
||||||
|
if ('data' in value && isArray(value.data)) {
|
||||||
|
if (value.data.length > 0) {
|
||||||
|
bufferData = new Uint8Array(value.data);
|
||||||
|
} else {
|
||||||
|
return ''; // Return empty string for empty data arrays
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Handle Uint8Array directly
|
||||||
|
else if (value instanceof Uint8Array) {
|
||||||
|
bufferData = value;
|
||||||
|
} else {
|
||||||
|
// If not a recognized format, return value as is
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Encode the bufferData (Uint8Array) to base64
|
||||||
|
const base64Data = 'base64:' + base64Encode(bufferData);
|
||||||
|
return {
|
||||||
|
type: 'EncodedBuffer',
|
||||||
|
data: base64Data,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return value unchanged if not buffer-like
|
||||||
|
return value;
|
||||||
|
};
|
||||||
|
|
||||||
|
const reviver: TParseReviver = (key, value) => {
|
||||||
|
if (isEncodedBuffer(value)) {
|
||||||
|
if (isString(value.data) && value.data.startsWith('base64:')) {
|
||||||
|
// Correctly slice the 'base64:' prefix before decoding
|
||||||
|
const base64Data = value.data.slice(7); // Skip 'base64:' prefix
|
||||||
|
const buffer = base64Decode(base64Data);
|
||||||
|
// Assuming the rest of your application can work directly with Uint8Array,
|
||||||
|
// otherwise, you might need to convert it to another format
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
};
|
||||||
|
|
||||||
|
function isEncodedBuffer(x: any): x is IEncodedBuffer {
|
||||||
|
return isObject(x) && (x as any).type === 'EncodedBuffer' && isString((x as any).data);
|
||||||
|
}
|
||||||
|
|
||||||
|
function isBufferLike(x: any): x is IBufferLike | Uint8Array {
|
||||||
|
return (
|
||||||
|
(isObject(x) &&
|
||||||
|
((x as any).type === 'Buffer' &&
|
||||||
|
(isArray((x as any).data) || isString((x as any).data)))) ||
|
||||||
|
x instanceof Uint8Array
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We use this function to check if a value is an array
|
||||||
|
* @param x
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
function isArray(x: any): x is any[] {
|
||||||
|
return Array.isArray(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We use this function to check if a value is a string
|
||||||
|
* @param x
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
function isString(x: any): x is string {
|
||||||
|
return typeof x === 'string';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We use this function to check if a value is an object
|
||||||
|
* @param x
|
||||||
|
*/
|
||||||
|
function isObject(x: any): x is object {
|
||||||
|
return typeof x === 'object' && x !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export { stringify, parse, replacer, reviver };
|
@ -1,9 +1,10 @@
|
|||||||
import * as plugins from './smartjson.plugins.js';
|
import * as plugins from './smartjson.plugins.js';
|
||||||
|
import * as bufferhandling from './bufferhandling.js';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* allows you to parse a json
|
* allows you to parse a json
|
||||||
*/
|
*/
|
||||||
export const parse = plugins.bufferJson.parse;
|
export const parse = bufferhandling.parse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -15,7 +16,7 @@ export const stringify = (
|
|||||||
simpleOrderArray?: string[],
|
simpleOrderArray?: string[],
|
||||||
optionsArg: plugins.IStableJsonTypes['Options'] = {}
|
optionsArg: plugins.IStableJsonTypes['Options'] = {}
|
||||||
): string => {
|
): string => {
|
||||||
const bufferedJson = plugins.bufferJson.stringify(objArg);
|
const bufferedJson = bufferhandling.stringify(objArg);
|
||||||
objArg = JSON.parse(bufferedJson);
|
objArg = JSON.parse(bufferedJson);
|
||||||
let returnJson = plugins.stableJson(objArg, optionsArg);
|
let returnJson = plugins.stableJson(objArg, optionsArg);
|
||||||
return returnJson;
|
return returnJson;
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
// @pushrocks scope
|
// @pushrocks scope
|
||||||
|
import * as smartenv from '@push.rocks/smartenv';
|
||||||
import * as smartstring from '@push.rocks/smartstring';
|
import * as smartstring from '@push.rocks/smartstring';
|
||||||
|
|
||||||
export { smartstring };
|
export { smartenv, smartstring };
|
||||||
|
|
||||||
// third party scope
|
// third party scope
|
||||||
import lodashCloneDeep from 'lodash.clonedeep';
|
import lodashCloneDeep from 'lodash.clonedeep';
|
||||||
import stableJson2 from 'fast-json-stable-stringify';
|
import stableJson2 from 'fast-json-stable-stringify';
|
||||||
import bufferJson from 'buffer-json';
|
|
||||||
|
|
||||||
const stableJson = stableJson2 as any;
|
const stableJson = stableJson2 as any;
|
||||||
|
|
||||||
export { bufferJson, lodashCloneDeep, stableJson };
|
export { lodashCloneDeep, stableJson };
|
||||||
|
|
||||||
export interface IStableJsonTypes {
|
export interface IStableJsonTypes {
|
||||||
Comparator: (
|
Comparator: (
|
||||||
|
Loading…
Reference in New Issue
Block a user