Compare commits
24 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
bd9c040f98 | ||
|
55a10f3366 | ||
|
da315034e4 | ||
|
933ecc050a | ||
|
38b2cd8fa4 | ||
|
4b7c9ec6cd | ||
|
92dba5274e | ||
|
c63ff06453 | ||
|
8e0b859408 | ||
|
a8d5382ac3 | ||
|
b76808022f | ||
|
8dbc2bcb7f | ||
|
2c4a0203d5 | ||
|
500bb33689 | ||
|
9b57728892 | ||
|
8de05e6b7f | ||
|
baa1f106e6 | ||
|
7a8cc08d4a | ||
|
7f403f4163 | ||
|
f24645a6eb | ||
|
f46f4982e9 | ||
|
a1241afd28 | ||
|
f11334f814 | ||
|
ebde530f76 |
8
.gitignore
vendored
8
.gitignore
vendored
@ -1,4 +1,4 @@
|
||||
node_modules/
|
||||
yarn.lock
|
||||
private.pem
|
||||
lib/
|
||||
node_modules/
|
||||
yarn.lock
|
||||
private.pem
|
||||
lib/
|
||||
|
@ -1,3 +1,3 @@
|
||||
tsconfig.json
|
||||
src/
|
||||
node_modules/
|
||||
tsconfig.json
|
||||
node_modules/
|
||||
.vscode/
|
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@ -1,3 +0,0 @@
|
||||
{
|
||||
"cSpell.enabled": false
|
||||
}
|
331
package-lock.json
generated
331
package-lock.json
generated
@ -1,331 +0,0 @@
|
||||
{
|
||||
"name": "secure-file-wrapper",
|
||||
"version": "1.1.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"@types/chai": {
|
||||
"version": "4.1.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.7.tgz",
|
||||
"integrity": "sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/isomorphic-fetch": {
|
||||
"version": "0.0.34",
|
||||
"resolved": "https://registry.npmjs.org/@types/isomorphic-fetch/-/isomorphic-fetch-0.0.34.tgz",
|
||||
"integrity": "sha1-PDSD5gbAQTeEOOlRRk8A5OYHBtY=",
|
||||
"dev": true
|
||||
},
|
||||
"@types/mocha": {
|
||||
"version": "5.2.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz",
|
||||
"integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "10.12.18",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz",
|
||||
"integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/node-fetch": {
|
||||
"version": "2.1.4",
|
||||
"resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.1.4.tgz",
|
||||
"integrity": "sha512-tR1ekaXUGpmzOcDXWU9BW73YfA2/VW1DF1FH+wlJ82BbCSnWTbdX+JkqWQXWKIGsFPnPsYadbXfNgz28g+ccWg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"assertion-error": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
|
||||
"integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
|
||||
"dev": true
|
||||
},
|
||||
"balanced-match": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
||||
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
|
||||
"dev": true
|
||||
},
|
||||
"brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"balanced-match": "^1.0.0",
|
||||
"concat-map": "0.0.1"
|
||||
}
|
||||
},
|
||||
"browser-stdout": {
|
||||
"version": "1.3.1",
|
||||
"resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
|
||||
"integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
|
||||
"dev": true
|
||||
},
|
||||
"chai": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
|
||||
"integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"assertion-error": "^1.1.0",
|
||||
"check-error": "^1.0.2",
|
||||
"deep-eql": "^3.0.1",
|
||||
"get-func-name": "^2.0.0",
|
||||
"pathval": "^1.1.0",
|
||||
"type-detect": "^4.0.5"
|
||||
}
|
||||
},
|
||||
"check-error": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
|
||||
"integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
|
||||
"dev": true
|
||||
},
|
||||
"commander": {
|
||||
"version": "2.15.1",
|
||||
"resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
|
||||
"integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
|
||||
"dev": true
|
||||
},
|
||||
"concat-map": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
||||
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
|
||||
"dev": true
|
||||
},
|
||||
"debug": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
|
||||
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
},
|
||||
"deep-eql": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
|
||||
"integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"type-detect": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"diff": {
|
||||
"version": "3.5.0",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
|
||||
"integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
|
||||
"dev": true
|
||||
},
|
||||
"encoding": {
|
||||
"version": "0.1.12",
|
||||
"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
|
||||
"integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
|
||||
"requires": {
|
||||
"iconv-lite": "~0.4.13"
|
||||
}
|
||||
},
|
||||
"escape-string-regexp": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
|
||||
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
|
||||
"dev": true
|
||||
},
|
||||
"fs.realpath": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
||||
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
|
||||
"dev": true
|
||||
},
|
||||
"get-func-name": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
|
||||
"integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
|
||||
"dev": true
|
||||
},
|
||||
"glob": {
|
||||
"version": "7.1.2",
|
||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
|
||||
"integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"fs.realpath": "^1.0.0",
|
||||
"inflight": "^1.0.4",
|
||||
"inherits": "2",
|
||||
"minimatch": "^3.0.4",
|
||||
"once": "^1.3.0",
|
||||
"path-is-absolute": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"growl": {
|
||||
"version": "1.10.5",
|
||||
"resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
|
||||
"integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
|
||||
"dev": true
|
||||
},
|
||||
"has-flag": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
|
||||
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
|
||||
"dev": true
|
||||
},
|
||||
"he": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
|
||||
"integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
|
||||
"dev": true
|
||||
},
|
||||
"iconv-lite": {
|
||||
"version": "0.4.19",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
|
||||
"integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
|
||||
},
|
||||
"inflight": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
|
||||
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"once": "^1.3.0",
|
||||
"wrappy": "1"
|
||||
}
|
||||
},
|
||||
"inherits": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
|
||||
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
|
||||
"dev": true
|
||||
},
|
||||
"is-stream": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
|
||||
"integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
|
||||
},
|
||||
"isomorphic-fetch": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
|
||||
"integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
|
||||
"requires": {
|
||||
"node-fetch": "^1.0.1",
|
||||
"whatwg-fetch": ">=0.10.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"node-fetch": {
|
||||
"version": "1.7.3",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
|
||||
"integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
|
||||
"requires": {
|
||||
"encoding": "^0.1.11",
|
||||
"is-stream": "^1.0.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"minimatch": {
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
|
||||
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"brace-expansion": "^1.1.7"
|
||||
}
|
||||
},
|
||||
"minimist": {
|
||||
"version": "0.0.8",
|
||||
"resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
|
||||
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
|
||||
"dev": true
|
||||
},
|
||||
"mkdirp": {
|
||||
"version": "0.5.1",
|
||||
"resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
|
||||
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"minimist": "0.0.8"
|
||||
}
|
||||
},
|
||||
"mocha": {
|
||||
"version": "5.2.0",
|
||||
"resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz",
|
||||
"integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"browser-stdout": "1.3.1",
|
||||
"commander": "2.15.1",
|
||||
"debug": "3.1.0",
|
||||
"diff": "3.5.0",
|
||||
"escape-string-regexp": "1.0.5",
|
||||
"glob": "7.1.2",
|
||||
"growl": "1.10.5",
|
||||
"he": "1.1.1",
|
||||
"minimatch": "3.0.4",
|
||||
"mkdirp": "0.5.1",
|
||||
"supports-color": "5.4.0"
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
|
||||
"dev": true
|
||||
},
|
||||
"once": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
||||
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"wrappy": "1"
|
||||
}
|
||||
},
|
||||
"path-is-absolute": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
|
||||
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
|
||||
"dev": true
|
||||
},
|
||||
"pathval": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
|
||||
"integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
|
||||
"dev": true
|
||||
},
|
||||
"supports-color": {
|
||||
"version": "5.4.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
|
||||
"integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"has-flag": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"type-detect": {
|
||||
"version": "4.0.8",
|
||||
"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
|
||||
"integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
|
||||
"dev": true
|
||||
},
|
||||
"typescript": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz",
|
||||
"integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==",
|
||||
"dev": true
|
||||
},
|
||||
"whatwg-fetch": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz",
|
||||
"integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ="
|
||||
},
|
||||
"wrappy": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
||||
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
}
|
23
package.json
23
package.json
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "secure-file-wrapper",
|
||||
"version": "2.0.0",
|
||||
"name": "@hibas123/secure-file-wrapper",
|
||||
"version": "2.5.3",
|
||||
"main": "lib/index.js",
|
||||
"author": "Fabian Stamm <dev@fabianstamm.de>",
|
||||
"license": "MIT",
|
||||
@ -8,20 +8,21 @@
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"watch": "tsc --watch",
|
||||
"prepublish": "tsc",
|
||||
"prepublishOnly": "tsc",
|
||||
"test": "mocha lib/test.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"isomorphic-fetch": "^2.2.1"
|
||||
"@hibas123/utils": "^2.1.0",
|
||||
"cross-fetch": "^4.0.0",
|
||||
"uuid": "^10.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/chai": "^4.1.4",
|
||||
"@types/isomorphic-fetch": "^0.0.34",
|
||||
"@types/mocha": "^5.2.2",
|
||||
"@types/node": "^10.12.18",
|
||||
"@types/node-fetch": "^2.1.4",
|
||||
"chai": "^4.1.2",
|
||||
"mocha": "^5.2.0",
|
||||
"typescript": "^3.2.2"
|
||||
"@types/mocha": "^10.0.7",
|
||||
"@types/node": "^20.14.8",
|
||||
"@types/uuid": "^10.0.0",
|
||||
"chai": "^5.1.1",
|
||||
"mocha": "^10.4.0",
|
||||
"typescript": "^5.5.2"
|
||||
}
|
||||
}
|
729
pnpm-lock.yaml
Normal file
729
pnpm-lock.yaml
Normal file
@ -0,0 +1,729 @@
|
||||
lockfileVersion: '9.0'
|
||||
|
||||
settings:
|
||||
autoInstallPeers: true
|
||||
excludeLinksFromLockfile: false
|
||||
|
||||
importers:
|
||||
|
||||
.:
|
||||
dependencies:
|
||||
'@hibas123/utils':
|
||||
specifier: ^2.1.0
|
||||
version: 2.2.18
|
||||
cross-fetch:
|
||||
specifier: ^4.0.0
|
||||
version: 4.0.0
|
||||
uuid:
|
||||
specifier: ^10.0.0
|
||||
version: 10.0.0
|
||||
devDependencies:
|
||||
'@types/chai':
|
||||
specifier: ^4.1.4
|
||||
version: 4.3.16
|
||||
'@types/mocha':
|
||||
specifier: ^10.0.7
|
||||
version: 10.0.7
|
||||
'@types/node':
|
||||
specifier: ^20.14.8
|
||||
version: 20.14.8
|
||||
'@types/uuid':
|
||||
specifier: ^10.0.0
|
||||
version: 10.0.0
|
||||
chai:
|
||||
specifier: ^5.1.1
|
||||
version: 5.1.1
|
||||
mocha:
|
||||
specifier: ^10.4.0
|
||||
version: 10.4.0
|
||||
typescript:
|
||||
specifier: ^5.5.2
|
||||
version: 5.5.2
|
||||
|
||||
packages:
|
||||
|
||||
'@hibas123/utils@2.2.18':
|
||||
resolution: {integrity: sha512-wCsEx12ju1JqfRjt2zLuw/yIP0YJ3aUoYazOBDCDGVWdIt56sG0l8mmU0Q+UroDBo+m9nd0YNg0za0PTBOOX+A==}
|
||||
|
||||
'@types/chai@4.3.16':
|
||||
resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==}
|
||||
|
||||
'@types/mocha@10.0.7':
|
||||
resolution: {integrity: sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==}
|
||||
|
||||
'@types/node@20.14.8':
|
||||
resolution: {integrity: sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==}
|
||||
|
||||
'@types/uuid@10.0.0':
|
||||
resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==}
|
||||
|
||||
ansi-colors@4.1.1:
|
||||
resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
ansi-regex@5.0.1:
|
||||
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
ansi-styles@4.3.0:
|
||||
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
anymatch@3.1.3:
|
||||
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
|
||||
engines: {node: '>= 8'}
|
||||
|
||||
argparse@2.0.1:
|
||||
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
|
||||
|
||||
assertion-error@2.0.1:
|
||||
resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
balanced-match@1.0.2:
|
||||
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
|
||||
|
||||
binary-extensions@2.3.0:
|
||||
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
brace-expansion@2.0.1:
|
||||
resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
|
||||
|
||||
braces@3.0.3:
|
||||
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
browser-stdout@1.3.1:
|
||||
resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==}
|
||||
|
||||
camelcase@6.3.0:
|
||||
resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
chai@5.1.1:
|
||||
resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
chalk@4.1.2:
|
||||
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
check-error@2.1.1:
|
||||
resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==}
|
||||
engines: {node: '>= 16'}
|
||||
|
||||
chokidar@3.5.3:
|
||||
resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
|
||||
engines: {node: '>= 8.10.0'}
|
||||
|
||||
cliui@7.0.4:
|
||||
resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
|
||||
|
||||
color-convert@2.0.1:
|
||||
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
|
||||
engines: {node: '>=7.0.0'}
|
||||
|
||||
color-name@1.1.4:
|
||||
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
|
||||
|
||||
cross-fetch@4.0.0:
|
||||
resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==}
|
||||
|
||||
debug@4.3.4:
|
||||
resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
|
||||
engines: {node: '>=6.0'}
|
||||
peerDependencies:
|
||||
supports-color: '*'
|
||||
peerDependenciesMeta:
|
||||
supports-color:
|
||||
optional: true
|
||||
|
||||
decamelize@4.0.0:
|
||||
resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
deep-eql@5.0.2:
|
||||
resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
diff@5.0.0:
|
||||
resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==}
|
||||
engines: {node: '>=0.3.1'}
|
||||
|
||||
emoji-regex@8.0.0:
|
||||
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
|
||||
|
||||
escalade@3.1.2:
|
||||
resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
escape-string-regexp@4.0.0:
|
||||
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
fill-range@7.1.1:
|
||||
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
find-up@5.0.0:
|
||||
resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
flat@5.0.2:
|
||||
resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==}
|
||||
hasBin: true
|
||||
|
||||
fs.realpath@1.0.0:
|
||||
resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=}
|
||||
|
||||
fsevents@2.3.3:
|
||||
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
|
||||
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
|
||||
os: [darwin]
|
||||
|
||||
get-caller-file@2.0.5:
|
||||
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
|
||||
engines: {node: 6.* || 8.* || >= 10.*}
|
||||
|
||||
get-func-name@2.0.2:
|
||||
resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==}
|
||||
|
||||
glob-parent@5.1.2:
|
||||
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
|
||||
engines: {node: '>= 6'}
|
||||
|
||||
glob@8.1.0:
|
||||
resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
has-flag@4.0.0:
|
||||
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
he@1.2.0:
|
||||
resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
|
||||
hasBin: true
|
||||
|
||||
inflight@1.0.6:
|
||||
resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=}
|
||||
|
||||
inherits@2.0.4:
|
||||
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
|
||||
|
||||
is-binary-path@2.1.0:
|
||||
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
is-extglob@2.1.1:
|
||||
resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
is-fullwidth-code-point@3.0.0:
|
||||
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
is-glob@4.0.3:
|
||||
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
is-number@7.0.0:
|
||||
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
|
||||
engines: {node: '>=0.12.0'}
|
||||
|
||||
is-plain-obj@2.1.0:
|
||||
resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
is-unicode-supported@0.1.0:
|
||||
resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
js-yaml@4.1.0:
|
||||
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
|
||||
hasBin: true
|
||||
|
||||
locate-path@6.0.0:
|
||||
resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
log-symbols@4.1.0:
|
||||
resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
loupe@3.1.1:
|
||||
resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==}
|
||||
|
||||
minimatch@5.0.1:
|
||||
resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
mocha@10.4.0:
|
||||
resolution: {integrity: sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==}
|
||||
engines: {node: '>= 14.0.0'}
|
||||
hasBin: true
|
||||
|
||||
ms@2.1.2:
|
||||
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
|
||||
|
||||
ms@2.1.3:
|
||||
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
|
||||
|
||||
node-fetch@2.7.0:
|
||||
resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
|
||||
engines: {node: 4.x || >=6.0.0}
|
||||
peerDependencies:
|
||||
encoding: ^0.1.0
|
||||
peerDependenciesMeta:
|
||||
encoding:
|
||||
optional: true
|
||||
|
||||
normalize-path@3.0.0:
|
||||
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
once@1.4.0:
|
||||
resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=}
|
||||
|
||||
p-limit@3.1.0:
|
||||
resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
p-locate@5.0.0:
|
||||
resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
path-exists@4.0.0:
|
||||
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
pathval@2.0.0:
|
||||
resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==}
|
||||
engines: {node: '>= 14.16'}
|
||||
|
||||
picomatch@2.3.1:
|
||||
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
|
||||
engines: {node: '>=8.6'}
|
||||
|
||||
randombytes@2.1.0:
|
||||
resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
|
||||
|
||||
readdirp@3.6.0:
|
||||
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
|
||||
engines: {node: '>=8.10.0'}
|
||||
|
||||
require-directory@2.1.1:
|
||||
resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
safe-buffer@5.2.1:
|
||||
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
|
||||
|
||||
serialize-javascript@6.0.0:
|
||||
resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==}
|
||||
|
||||
string-width@4.2.3:
|
||||
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
strip-ansi@6.0.1:
|
||||
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
strip-json-comments@3.1.1:
|
||||
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
supports-color@7.2.0:
|
||||
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
supports-color@8.1.1:
|
||||
resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
to-regex-range@5.0.1:
|
||||
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
|
||||
engines: {node: '>=8.0'}
|
||||
|
||||
tr46@0.0.3:
|
||||
resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=}
|
||||
|
||||
typescript@5.5.2:
|
||||
resolution: {integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==}
|
||||
engines: {node: '>=14.17'}
|
||||
hasBin: true
|
||||
|
||||
undici-types@5.26.5:
|
||||
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
|
||||
|
||||
uuid@10.0.0:
|
||||
resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==}
|
||||
hasBin: true
|
||||
|
||||
webidl-conversions@3.0.1:
|
||||
resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=}
|
||||
|
||||
whatwg-url@5.0.0:
|
||||
resolution: {integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0=}
|
||||
|
||||
workerpool@6.2.1:
|
||||
resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==}
|
||||
|
||||
wrap-ansi@7.0.0:
|
||||
resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
wrappy@1.0.2:
|
||||
resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=}
|
||||
|
||||
y18n@5.0.8:
|
||||
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
yargs-parser@20.2.4:
|
||||
resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
yargs-unparser@2.0.0:
|
||||
resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
yargs@16.2.0:
|
||||
resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
yocto-queue@0.1.0:
|
||||
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
snapshots:
|
||||
|
||||
'@hibas123/utils@2.2.18': {}
|
||||
|
||||
'@types/chai@4.3.16': {}
|
||||
|
||||
'@types/mocha@10.0.7': {}
|
||||
|
||||
'@types/node@20.14.8':
|
||||
dependencies:
|
||||
undici-types: 5.26.5
|
||||
|
||||
'@types/uuid@10.0.0': {}
|
||||
|
||||
ansi-colors@4.1.1: {}
|
||||
|
||||
ansi-regex@5.0.1: {}
|
||||
|
||||
ansi-styles@4.3.0:
|
||||
dependencies:
|
||||
color-convert: 2.0.1
|
||||
|
||||
anymatch@3.1.3:
|
||||
dependencies:
|
||||
normalize-path: 3.0.0
|
||||
picomatch: 2.3.1
|
||||
|
||||
argparse@2.0.1: {}
|
||||
|
||||
assertion-error@2.0.1: {}
|
||||
|
||||
balanced-match@1.0.2: {}
|
||||
|
||||
binary-extensions@2.3.0: {}
|
||||
|
||||
brace-expansion@2.0.1:
|
||||
dependencies:
|
||||
balanced-match: 1.0.2
|
||||
|
||||
braces@3.0.3:
|
||||
dependencies:
|
||||
fill-range: 7.1.1
|
||||
|
||||
browser-stdout@1.3.1: {}
|
||||
|
||||
camelcase@6.3.0: {}
|
||||
|
||||
chai@5.1.1:
|
||||
dependencies:
|
||||
assertion-error: 2.0.1
|
||||
check-error: 2.1.1
|
||||
deep-eql: 5.0.2
|
||||
loupe: 3.1.1
|
||||
pathval: 2.0.0
|
||||
|
||||
chalk@4.1.2:
|
||||
dependencies:
|
||||
ansi-styles: 4.3.0
|
||||
supports-color: 7.2.0
|
||||
|
||||
check-error@2.1.1: {}
|
||||
|
||||
chokidar@3.5.3:
|
||||
dependencies:
|
||||
anymatch: 3.1.3
|
||||
braces: 3.0.3
|
||||
glob-parent: 5.1.2
|
||||
is-binary-path: 2.1.0
|
||||
is-glob: 4.0.3
|
||||
normalize-path: 3.0.0
|
||||
readdirp: 3.6.0
|
||||
optionalDependencies:
|
||||
fsevents: 2.3.3
|
||||
|
||||
cliui@7.0.4:
|
||||
dependencies:
|
||||
string-width: 4.2.3
|
||||
strip-ansi: 6.0.1
|
||||
wrap-ansi: 7.0.0
|
||||
|
||||
color-convert@2.0.1:
|
||||
dependencies:
|
||||
color-name: 1.1.4
|
||||
|
||||
color-name@1.1.4: {}
|
||||
|
||||
cross-fetch@4.0.0:
|
||||
dependencies:
|
||||
node-fetch: 2.7.0
|
||||
transitivePeerDependencies:
|
||||
- encoding
|
||||
|
||||
debug@4.3.4(supports-color@8.1.1):
|
||||
dependencies:
|
||||
ms: 2.1.2
|
||||
optionalDependencies:
|
||||
supports-color: 8.1.1
|
||||
|
||||
decamelize@4.0.0: {}
|
||||
|
||||
deep-eql@5.0.2: {}
|
||||
|
||||
diff@5.0.0: {}
|
||||
|
||||
emoji-regex@8.0.0: {}
|
||||
|
||||
escalade@3.1.2: {}
|
||||
|
||||
escape-string-regexp@4.0.0: {}
|
||||
|
||||
fill-range@7.1.1:
|
||||
dependencies:
|
||||
to-regex-range: 5.0.1
|
||||
|
||||
find-up@5.0.0:
|
||||
dependencies:
|
||||
locate-path: 6.0.0
|
||||
path-exists: 4.0.0
|
||||
|
||||
flat@5.0.2: {}
|
||||
|
||||
fs.realpath@1.0.0: {}
|
||||
|
||||
fsevents@2.3.3:
|
||||
optional: true
|
||||
|
||||
get-caller-file@2.0.5: {}
|
||||
|
||||
get-func-name@2.0.2: {}
|
||||
|
||||
glob-parent@5.1.2:
|
||||
dependencies:
|
||||
is-glob: 4.0.3
|
||||
|
||||
glob@8.1.0:
|
||||
dependencies:
|
||||
fs.realpath: 1.0.0
|
||||
inflight: 1.0.6
|
||||
inherits: 2.0.4
|
||||
minimatch: 5.0.1
|
||||
once: 1.4.0
|
||||
|
||||
has-flag@4.0.0: {}
|
||||
|
||||
he@1.2.0: {}
|
||||
|
||||
inflight@1.0.6:
|
||||
dependencies:
|
||||
once: 1.4.0
|
||||
wrappy: 1.0.2
|
||||
|
||||
inherits@2.0.4: {}
|
||||
|
||||
is-binary-path@2.1.0:
|
||||
dependencies:
|
||||
binary-extensions: 2.3.0
|
||||
|
||||
is-extglob@2.1.1: {}
|
||||
|
||||
is-fullwidth-code-point@3.0.0: {}
|
||||
|
||||
is-glob@4.0.3:
|
||||
dependencies:
|
||||
is-extglob: 2.1.1
|
||||
|
||||
is-number@7.0.0: {}
|
||||
|
||||
is-plain-obj@2.1.0: {}
|
||||
|
||||
is-unicode-supported@0.1.0: {}
|
||||
|
||||
js-yaml@4.1.0:
|
||||
dependencies:
|
||||
argparse: 2.0.1
|
||||
|
||||
locate-path@6.0.0:
|
||||
dependencies:
|
||||
p-locate: 5.0.0
|
||||
|
||||
log-symbols@4.1.0:
|
||||
dependencies:
|
||||
chalk: 4.1.2
|
||||
is-unicode-supported: 0.1.0
|
||||
|
||||
loupe@3.1.1:
|
||||
dependencies:
|
||||
get-func-name: 2.0.2
|
||||
|
||||
minimatch@5.0.1:
|
||||
dependencies:
|
||||
brace-expansion: 2.0.1
|
||||
|
||||
mocha@10.4.0:
|
||||
dependencies:
|
||||
ansi-colors: 4.1.1
|
||||
browser-stdout: 1.3.1
|
||||
chokidar: 3.5.3
|
||||
debug: 4.3.4(supports-color@8.1.1)
|
||||
diff: 5.0.0
|
||||
escape-string-regexp: 4.0.0
|
||||
find-up: 5.0.0
|
||||
glob: 8.1.0
|
||||
he: 1.2.0
|
||||
js-yaml: 4.1.0
|
||||
log-symbols: 4.1.0
|
||||
minimatch: 5.0.1
|
||||
ms: 2.1.3
|
||||
serialize-javascript: 6.0.0
|
||||
strip-json-comments: 3.1.1
|
||||
supports-color: 8.1.1
|
||||
workerpool: 6.2.1
|
||||
yargs: 16.2.0
|
||||
yargs-parser: 20.2.4
|
||||
yargs-unparser: 2.0.0
|
||||
|
||||
ms@2.1.2: {}
|
||||
|
||||
ms@2.1.3: {}
|
||||
|
||||
node-fetch@2.7.0:
|
||||
dependencies:
|
||||
whatwg-url: 5.0.0
|
||||
|
||||
normalize-path@3.0.0: {}
|
||||
|
||||
once@1.4.0:
|
||||
dependencies:
|
||||
wrappy: 1.0.2
|
||||
|
||||
p-limit@3.1.0:
|
||||
dependencies:
|
||||
yocto-queue: 0.1.0
|
||||
|
||||
p-locate@5.0.0:
|
||||
dependencies:
|
||||
p-limit: 3.1.0
|
||||
|
||||
path-exists@4.0.0: {}
|
||||
|
||||
pathval@2.0.0: {}
|
||||
|
||||
picomatch@2.3.1: {}
|
||||
|
||||
randombytes@2.1.0:
|
||||
dependencies:
|
||||
safe-buffer: 5.2.1
|
||||
|
||||
readdirp@3.6.0:
|
||||
dependencies:
|
||||
picomatch: 2.3.1
|
||||
|
||||
require-directory@2.1.1: {}
|
||||
|
||||
safe-buffer@5.2.1: {}
|
||||
|
||||
serialize-javascript@6.0.0:
|
||||
dependencies:
|
||||
randombytes: 2.1.0
|
||||
|
||||
string-width@4.2.3:
|
||||
dependencies:
|
||||
emoji-regex: 8.0.0
|
||||
is-fullwidth-code-point: 3.0.0
|
||||
strip-ansi: 6.0.1
|
||||
|
||||
strip-ansi@6.0.1:
|
||||
dependencies:
|
||||
ansi-regex: 5.0.1
|
||||
|
||||
strip-json-comments@3.1.1: {}
|
||||
|
||||
supports-color@7.2.0:
|
||||
dependencies:
|
||||
has-flag: 4.0.0
|
||||
|
||||
supports-color@8.1.1:
|
||||
dependencies:
|
||||
has-flag: 4.0.0
|
||||
|
||||
to-regex-range@5.0.1:
|
||||
dependencies:
|
||||
is-number: 7.0.0
|
||||
|
||||
tr46@0.0.3: {}
|
||||
|
||||
typescript@5.5.2: {}
|
||||
|
||||
undici-types@5.26.5: {}
|
||||
|
||||
uuid@10.0.0: {}
|
||||
|
||||
webidl-conversions@3.0.1: {}
|
||||
|
||||
whatwg-url@5.0.0:
|
||||
dependencies:
|
||||
tr46: 0.0.3
|
||||
webidl-conversions: 3.0.1
|
||||
|
||||
workerpool@6.2.1: {}
|
||||
|
||||
wrap-ansi@7.0.0:
|
||||
dependencies:
|
||||
ansi-styles: 4.3.0
|
||||
string-width: 4.2.3
|
||||
strip-ansi: 6.0.1
|
||||
|
||||
wrappy@1.0.2: {}
|
||||
|
||||
y18n@5.0.8: {}
|
||||
|
||||
yargs-parser@20.2.4: {}
|
||||
|
||||
yargs-unparser@2.0.0:
|
||||
dependencies:
|
||||
camelcase: 6.3.0
|
||||
decamelize: 4.0.0
|
||||
flat: 5.0.2
|
||||
is-plain-obj: 2.1.0
|
||||
|
||||
yargs@16.2.0:
|
||||
dependencies:
|
||||
cliui: 7.0.4
|
||||
escalade: 3.1.2
|
||||
get-caller-file: 2.0.5
|
||||
require-directory: 2.1.1
|
||||
string-width: 4.2.3
|
||||
y18n: 5.0.8
|
||||
yargs-parser: 20.2.4
|
||||
|
||||
yocto-queue@0.1.0: {}
|
471
src/index.ts
471
src/index.ts
@ -1,223 +1,250 @@
|
||||
import Observable from "./observable";
|
||||
import Lock from "./lock";
|
||||
|
||||
export interface IFileVersion {
|
||||
version: string;
|
||||
time: Date;
|
||||
preview: string;
|
||||
deleted: boolean;
|
||||
}
|
||||
|
||||
export interface IFile {
|
||||
_id: string;
|
||||
type: string;
|
||||
name: string;
|
||||
folder: string;
|
||||
deleted: boolean;
|
||||
active: IFileVersion;
|
||||
versions: IFileVersion[];
|
||||
user: string;
|
||||
application: string;
|
||||
}
|
||||
|
||||
export interface IHistory {
|
||||
file: IFile;
|
||||
history: IFileVersion[];
|
||||
}
|
||||
|
||||
|
||||
export class NoConnection extends Error {
|
||||
type: string;
|
||||
constructor() {
|
||||
super("No connection");
|
||||
this.type = "noconnection"
|
||||
}
|
||||
}
|
||||
|
||||
export class Unauthorized extends Error {
|
||||
type: string;
|
||||
constructor() {
|
||||
super("Not authorized");
|
||||
this.type = "unauthorized"
|
||||
}
|
||||
}
|
||||
|
||||
export class NoPermission extends Error {
|
||||
type: string;
|
||||
constructor() {
|
||||
super("No permission");
|
||||
this.type = "nopermission"
|
||||
}
|
||||
}
|
||||
|
||||
export class NotFound extends Error {
|
||||
type: string;
|
||||
constructor() {
|
||||
super("Not found");
|
||||
this.type = "notfound"
|
||||
}
|
||||
}
|
||||
|
||||
export class BadRequest extends Error {
|
||||
type: string;
|
||||
constructor() {
|
||||
super("Bad request");
|
||||
this.type = "badrequest"
|
||||
}
|
||||
}
|
||||
|
||||
import * as fetch from "isomorphic-fetch";
|
||||
|
||||
function statusParser(res: Response) {
|
||||
if (res.status !== 200) {
|
||||
switch (res.status) {
|
||||
case 400:
|
||||
throw new BadRequest();
|
||||
case 404:
|
||||
throw new NotFound();
|
||||
case 403:
|
||||
throw new NoPermission();
|
||||
case 401:
|
||||
throw new Unauthorized();
|
||||
default:
|
||||
throw new Error(res.statusText);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default class SecureFileWrapper {
|
||||
private _jwtObservableServer: Observable<(jwt: string) => void> = new Observable();
|
||||
jwtObservable = this._jwtObservableServer.getPublicApi();
|
||||
|
||||
jwt: string;
|
||||
|
||||
auth_lock = new Lock();
|
||||
|
||||
constructor(private server: string) {
|
||||
if (this.server.endsWith("/")) {
|
||||
this.server += "api/v1";
|
||||
} else {
|
||||
this.server += "/api/v1";
|
||||
}
|
||||
}
|
||||
|
||||
public async getJWT() {
|
||||
if (!this.auth_lock.locked) {
|
||||
let lock = await this.auth_lock.getLock();
|
||||
this._jwtObservableServer.send((jwt: string) => {
|
||||
this.jwt = jwt;
|
||||
lock.release();
|
||||
});
|
||||
}
|
||||
|
||||
await this.auth_lock.getLock().then(lock => lock.release())
|
||||
}
|
||||
|
||||
public async makeRequest(endpoint: string, method: "POST" | "GET" | "PUT" | "DELETE", query: any, body?: ArrayBuffer | ArrayBufferView, second = false) {
|
||||
if (!this.jwt || this.jwt === undefined) {
|
||||
await this.getJWT();
|
||||
}
|
||||
|
||||
query.jwt = this.jwt;
|
||||
let query_str = "?";
|
||||
let first = true;
|
||||
for (let key in query) {
|
||||
if (!first) query_str += "&";
|
||||
query_str += encodeURIComponent(key) + "=" + encodeURIComponent(query[key]);
|
||||
first = false;
|
||||
}
|
||||
var headers = {
|
||||
"pragme": "no-cache",
|
||||
"cache-control": "no-cache"
|
||||
};
|
||||
|
||||
let body_n;
|
||||
if (body) {
|
||||
headers["Content-Type"] = "application/octet-stream"
|
||||
body_n = Buffer ? Buffer.from(body instanceof ArrayBuffer ? body : body.buffer) : body;
|
||||
}
|
||||
try {
|
||||
let res = await fetch(this.server + endpoint + query_str, { method, body: body_n, headers });
|
||||
if (res.status === 401 && !second) {
|
||||
await this.getJWT();
|
||||
return this.makeRequest(endpoint, method, query, body, true);
|
||||
} else {
|
||||
statusParser(res);
|
||||
return res;
|
||||
}
|
||||
} catch (err) {
|
||||
if (err instanceof TypeError || err.errno === "ECONNREFUSED")
|
||||
throw new NoConnection();
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
// async test(jwt): Promise<{ user: string, test: true }> {
|
||||
// let res = await this.makeRequest("/test", "GET", {}, undefined, this.jwt_enabled);
|
||||
// statusParser(res);
|
||||
// return await res.json();
|
||||
// }
|
||||
|
||||
async list(folder?: string): Promise<IFile[]> {
|
||||
let query: any = {}
|
||||
if (folder) query.folder = folder;
|
||||
let res = await this.makeRequest("/files", "GET", query);
|
||||
let d = await res.json();
|
||||
return d.files;
|
||||
}
|
||||
|
||||
async create(name: string, data: ArrayBuffer | ArrayBufferView, type: "text" | "binary", folder?: string, preview?: string): Promise<IFile> {
|
||||
let params: any = { type: type, name: name };
|
||||
if (preview) {
|
||||
params.preview = preview;
|
||||
}
|
||||
if (folder) {
|
||||
params.folder = folder;
|
||||
}
|
||||
|
||||
let res = await this.makeRequest("/files", "POST", params, data);
|
||||
return (await res.json()).file;
|
||||
}
|
||||
|
||||
async get(id: string, version?: string): Promise<ArrayBuffer> {
|
||||
let res: Response;
|
||||
if (typeof version === "string") {
|
||||
res = await this.makeRequest(`/files/${id}/history/${version}`, "GET", {});
|
||||
} else {
|
||||
res = await this.makeRequest("/files/" + id, "GET", {});
|
||||
}
|
||||
|
||||
if (res.arrayBuffer) {
|
||||
return res.arrayBuffer()
|
||||
} else {
|
||||
let blob: Buffer = await (<any>res).buffer()
|
||||
// console.log(blob.length);
|
||||
return Uint8Array.from(blob).buffer;
|
||||
}
|
||||
}
|
||||
|
||||
async update(id: string, data: ArrayBuffer | ArrayBufferView, preview?: string): Promise<IFile> {
|
||||
let put: any = {};
|
||||
if (preview) put.preview = preview;
|
||||
let res = await this.makeRequest("/files/" + id, "PUT", put, data);
|
||||
|
||||
let json = await res.json()
|
||||
return json.file;
|
||||
}
|
||||
|
||||
async delete(id: string): Promise<boolean> {
|
||||
let res = await this.makeRequest("/files/" + id, "DELETE", {});
|
||||
|
||||
return res.json();
|
||||
}
|
||||
|
||||
async history(id: string): Promise<IHistory> {
|
||||
let res = await this.makeRequest(`/files/${id}/history`, "GET", {});
|
||||
statusParser(res);
|
||||
return res.json();
|
||||
}
|
||||
|
||||
async restore(id: string, version: string) {
|
||||
await this.makeRequest(`/files/${id}/history/${version}/restore`, "PUT", {});
|
||||
}
|
||||
import { Observable, Lock } from "@hibas123/utils";
|
||||
//this references global on node and window in browser
|
||||
const fetch = typeof window !== "undefined" && typeof window.fetch !== undefined ? window.fetch : require("cross-fetch").default;
|
||||
|
||||
export interface IFileVersion {
|
||||
version: string;
|
||||
time: Date;
|
||||
preview: string;
|
||||
deleted: boolean;
|
||||
folder: string;
|
||||
}
|
||||
|
||||
export interface IFile {
|
||||
_id: string;
|
||||
type: string;
|
||||
name: string;
|
||||
deleted: boolean;
|
||||
active: IFileVersion;
|
||||
versions: IFileVersion[];
|
||||
user: string;
|
||||
application: string;
|
||||
}
|
||||
|
||||
export interface IHistory {
|
||||
file: IFile;
|
||||
history: IFileVersion[];
|
||||
}
|
||||
|
||||
|
||||
export class NoConnection extends Error {
|
||||
type: string;
|
||||
constructor() {
|
||||
super("No connection");
|
||||
this.type = "noconnection"
|
||||
}
|
||||
}
|
||||
|
||||
export class Unauthorized extends Error {
|
||||
type: string;
|
||||
constructor() {
|
||||
super("Not authorized");
|
||||
this.type = "unauthorized"
|
||||
}
|
||||
}
|
||||
|
||||
export class NoPermission extends Error {
|
||||
type: string;
|
||||
constructor() {
|
||||
super("No permission");
|
||||
this.type = "nopermission"
|
||||
}
|
||||
}
|
||||
|
||||
export class NotFound extends Error {
|
||||
type: string;
|
||||
constructor() {
|
||||
super("Not found");
|
||||
this.type = "notfound"
|
||||
}
|
||||
}
|
||||
|
||||
export class BadRequest extends Error {
|
||||
type: string;
|
||||
constructor() {
|
||||
super("Bad request");
|
||||
this.type = "badrequest"
|
||||
}
|
||||
}
|
||||
|
||||
function statusParser(res: Response) {
|
||||
if (res.status !== 200) {
|
||||
switch (res.status) {
|
||||
case 400:
|
||||
throw new BadRequest();
|
||||
case 404:
|
||||
throw new NotFound();
|
||||
case 403:
|
||||
throw new NoPermission();
|
||||
case 401:
|
||||
throw new Unauthorized();
|
||||
default:
|
||||
throw new Error(res.statusText);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export type JWTCallback = (err: Error | null | string, jwt: string) => void;
|
||||
|
||||
export default class SecureFileWrapper {
|
||||
private _jwtObservableServer: Observable<JWTCallback> = new Observable();
|
||||
jwtObservable = this._jwtObservableServer.getPublicApi();
|
||||
|
||||
private jwt: string;
|
||||
|
||||
private auth_lock = new Lock();
|
||||
|
||||
constructor(private server: string) {
|
||||
if (this.server.endsWith("/")) {
|
||||
this.server += "api/v1";
|
||||
} else {
|
||||
this.server += "/api/v1";
|
||||
}
|
||||
}
|
||||
|
||||
public async getJWT() {
|
||||
if (!this.auth_lock.locked) {
|
||||
let lock = await this.auth_lock.getLock();
|
||||
await new Promise<void>((yes, no) => {
|
||||
this._jwtObservableServer.send((err: Error | null | string, jwt: string) => {
|
||||
if (err) {
|
||||
this.jwt = undefined;
|
||||
no(err);
|
||||
}
|
||||
else {
|
||||
this.jwt = jwt;
|
||||
yes();
|
||||
}
|
||||
});
|
||||
}).finally(() => lock.release())
|
||||
}
|
||||
|
||||
await this.auth_lock.getLock().then(lock => lock.release())
|
||||
}
|
||||
|
||||
public async makeRequest(endpoint: string, method: "POST" | "GET" | "PUT" | "DELETE", query: any, body?: ArrayBuffer | ArrayBufferView, second = false) {
|
||||
if (!this.jwt || this.jwt === undefined) {
|
||||
await this.getJWT();
|
||||
}
|
||||
|
||||
let query_str = "?";
|
||||
let first = true;
|
||||
for (let key in query) {
|
||||
if (!first) query_str += "&";
|
||||
query_str += encodeURIComponent(key) + "=" + encodeURIComponent(query[key]);
|
||||
first = false;
|
||||
}
|
||||
var headers = {
|
||||
"pragma": "no-cache",
|
||||
"cache-control": "no-cache",
|
||||
"x-jwt": this.jwt
|
||||
};
|
||||
|
||||
if (body) {
|
||||
headers["Content-Type"] = "application/octet-stream"
|
||||
}
|
||||
try {
|
||||
let res = await fetch(this.server + endpoint + query_str, { method, body, headers });
|
||||
if (res.status === 401 && !second) {
|
||||
await this.getJWT();
|
||||
return this.makeRequest(endpoint, method, query, body, true);
|
||||
} else {
|
||||
statusParser(res);
|
||||
return res;
|
||||
}
|
||||
} catch (err) {
|
||||
if (err instanceof TypeError || err.errno === "ECONNREFUSED")
|
||||
throw new NoConnection();
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
private fixIFileVersion(version: IFileVersion): IFileVersion {
|
||||
version.time = new Date(version.time)
|
||||
return version;
|
||||
}
|
||||
|
||||
private fixIFile(file: IFile): IFile {
|
||||
file.active.time = new Date(file.active.time)
|
||||
if (file.versions) {
|
||||
file.versions = file.versions.map(e => this.fixIFileVersion(e))
|
||||
}
|
||||
return file;
|
||||
}
|
||||
|
||||
// async test(jwt): Promise<{ user: string, test: true }> {
|
||||
// let res = await this.makeRequest("/test", "GET", {}, undefined, this.jwt_enabled);
|
||||
// statusParser(res);
|
||||
// return await res.json();
|
||||
// }
|
||||
|
||||
async list(folder?: string): Promise<IFile[]> {
|
||||
let query: any = {}
|
||||
if (folder) query.folder = folder;
|
||||
let res = await this.makeRequest("/files", "GET", query);
|
||||
let d: { files: IFile[] } = await res.json();
|
||||
return d.files.map(e => this.fixIFile(e));
|
||||
}
|
||||
|
||||
async create(name: string, data: ArrayBuffer | ArrayBufferView, type: "text" | "binary", folder?: string, preview?: string, id?: string, date?: Date): Promise<IFile> {
|
||||
let params: any = { type: type, name: name };
|
||||
if (preview)
|
||||
params.preview = preview;
|
||||
|
||||
if (folder)
|
||||
params.folder = folder;
|
||||
|
||||
if (id)
|
||||
params.id = id
|
||||
|
||||
if (date)
|
||||
params.date = date.toJSON()
|
||||
|
||||
|
||||
let res = await this.makeRequest("/files", "POST", params, data);
|
||||
return this.fixIFile((await res.json()).file);
|
||||
}
|
||||
|
||||
async get(id: string, version?: string): Promise<ArrayBuffer> {
|
||||
let res: Response;
|
||||
if (typeof version === "string") {
|
||||
res = await this.makeRequest(`/files/${id}/history/${version}`, "GET", {});
|
||||
} else {
|
||||
res = await this.makeRequest("/files/" + id, "GET", {});
|
||||
}
|
||||
|
||||
return res.arrayBuffer()
|
||||
}
|
||||
|
||||
async update(id: string, data: ArrayBuffer | ArrayBufferView, preview?: string, date?: Date, old = false): Promise<IFile> {
|
||||
let params: any = { old };
|
||||
if (preview) params.preview = preview;
|
||||
if (date)
|
||||
params.date = date.toJSON()
|
||||
let res = await this.makeRequest("/files/" + id, "PUT", params, data);
|
||||
|
||||
let json = await res.json()
|
||||
return this.fixIFile(json.file);
|
||||
}
|
||||
|
||||
async delete(id: string): Promise<void> {
|
||||
let res = await this.makeRequest("/files/" + id, "DELETE", {});
|
||||
}
|
||||
|
||||
async history(id: string): Promise<IHistory> {
|
||||
let res = await this.makeRequest(`/files/${id}/history`, "GET", {});
|
||||
let data: IHistory = await res.json();
|
||||
data.file = this.fixIFile(data.file)
|
||||
data.history = data.history.map(v => this.fixIFileVersion(v));
|
||||
return data;
|
||||
}
|
||||
|
||||
async restore(id: string, version: string) {
|
||||
await this.makeRequest(`/files/${id}/history/${version}/restore`, "PUT", {});
|
||||
}
|
||||
|
||||
async clean(id: string, val: number | Date): Promise<void> {
|
||||
let query = typeof val === "number" ? { count: val } : { date: val.toISOString() };
|
||||
return this.makeRequest(`/files/${id}/history/clean`, "PUT", query);
|
||||
}
|
||||
}
|
36
src/lock.ts
36
src/lock.ts
@ -1,36 +0,0 @@
|
||||
export type Release = { release: () => void };
|
||||
export default class Lock {
|
||||
private _locked: boolean = false;
|
||||
get locked() {
|
||||
return this._locked;
|
||||
}
|
||||
private toCome: (() => void)[] = [];
|
||||
|
||||
constructor() {
|
||||
this.release = this.release.bind(this);
|
||||
}
|
||||
|
||||
async getLock(): Promise<Release> {
|
||||
if (!this._locked) return { release: this.lock() };
|
||||
else {
|
||||
return new Promise<Release>((resolve) => {
|
||||
this.toCome.push(() => {
|
||||
resolve({ release: this.lock() });
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
private lock() {
|
||||
this._locked = true;
|
||||
return this.release;
|
||||
}
|
||||
|
||||
private async release() {
|
||||
if (this.toCome.length > 0) {
|
||||
this.toCome.shift()();
|
||||
} else {
|
||||
this._locked = false;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,38 +0,0 @@
|
||||
export type ObserverCallback<T> = (data: T) => void;
|
||||
|
||||
export default class Observable<T = any> {
|
||||
private subscriber: ObserverCallback<T[]>[] = [];
|
||||
private events: T[] = [];
|
||||
private timeout = undefined;
|
||||
|
||||
constructor(private collect: boolean = true, private collect_intervall: number = 100) { }
|
||||
|
||||
getPublicApi() {
|
||||
return {
|
||||
subscribe: (callback: ObserverCallback<T[]>) => {
|
||||
if (this.subscriber.indexOf(callback) < 0)
|
||||
this.subscriber.push(callback)
|
||||
},
|
||||
unsubscribe: (callback: ObserverCallback<T[]>) => {
|
||||
let idx = this.subscriber.indexOf(callback);
|
||||
if (idx >= 0) {
|
||||
this.subscriber.splice(idx, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
send(data: T) {
|
||||
if (!this.collect)
|
||||
this.subscriber.forEach(e => e([data]));
|
||||
else {
|
||||
this.events.push(data);
|
||||
if (!this.timeout) {
|
||||
this.timeout = setTimeout(() => {
|
||||
this.subscriber.forEach(e => e(this.events));
|
||||
this.timeout = 0;
|
||||
}, this.collect_intervall);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
301
src/test.ts
301
src/test.ts
@ -1,130 +1,173 @@
|
||||
import SecureFile, { NotFound } from "./index";
|
||||
|
||||
import { TextEncoder, TextDecoder } from "util";
|
||||
|
||||
const testname = "ouiavgbsop687463743"
|
||||
const encoder = new TextEncoder();
|
||||
const decoder = new TextDecoder();
|
||||
const testdata = encoder.encode("Ich bin ein Test");
|
||||
const newTestData = encoder.encode("neue test daten");
|
||||
const testprev = "Ich bin...";
|
||||
|
||||
const testfolder = "iabos";
|
||||
let ftestid;
|
||||
|
||||
import { expect } from "chai"
|
||||
|
||||
function test(sf: SecureFile) {
|
||||
let testid: string;
|
||||
let testver: string;
|
||||
let testver2: string;
|
||||
|
||||
it("create", async () => {
|
||||
let res = await sf.create(testname, testdata, "text", undefined, testprev)
|
||||
expect(res, "Res isnnot set").to.exist;
|
||||
expect(res._id, "Res has no _id").to.exist;
|
||||
testid = res._id;
|
||||
testver = res.active.version;
|
||||
})
|
||||
|
||||
it("get", async () => {
|
||||
let res = await sf.get(testid);
|
||||
expect(res, "No data returned").to.exist;
|
||||
expect(decoder.decode(res), "Returned data not equal to stored").to.be.equal(decoder.decode(testdata));
|
||||
})
|
||||
|
||||
it("get - fail", async () => {
|
||||
const inverr = new Error("Should have failed!");
|
||||
try {
|
||||
await sf.get(testid + "asod");
|
||||
throw inverr
|
||||
} catch (err) {
|
||||
if (err !== inverr) {
|
||||
expect(err).to.be.instanceOf(NotFound);
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
it("list", async () => {
|
||||
let res = await sf.list();
|
||||
expect(Array.isArray(res), "Is not from type Array").to.be.true;
|
||||
expect(res.length, "No elements returned").to.greaterThan(0);
|
||||
let found = !!res.find(e => e._id === testid);
|
||||
expect(found, "Element not in List").to.be.true;
|
||||
})
|
||||
|
||||
it("update", async () => {
|
||||
let res = await sf.update(testid, newTestData, undefined);
|
||||
expect(res, "No data returned").to.exist;
|
||||
expect(res._id, "_id missing").to.exist;
|
||||
expect(res.active.version, "No new version was created").to.not.equal(testver);
|
||||
testver2 = res.active.version;
|
||||
let res2 = await sf.get(testid);
|
||||
expect(decoder.decode(res2), "Fetched data not updated").to.be.equal(decoder.decode(newTestData));
|
||||
})
|
||||
|
||||
it("history", async () => {
|
||||
let his = await sf.history(testid);
|
||||
expect(his, "no data returned").to.exist;
|
||||
expect(his.file, "file not set").to.exist;
|
||||
expect(his.history, "history not set").to.exist;
|
||||
expect(his.history.length, `Not expected history length. Expected 1 got ${his.history.length}`).to.be.equal(1);
|
||||
|
||||
expect(his.history[0].version, "Wrong version on history").to.be.equal(testver);
|
||||
expect(his.file.active.version, "Wrong version on file").to.be.equal(testver2);
|
||||
});
|
||||
|
||||
it("history get old", async () => {
|
||||
let arch = await sf.get(testid, testver);
|
||||
expect(decoder.decode(arch), "Old version has wrong data").to.be.equal(decoder.decode(testdata));
|
||||
})
|
||||
|
||||
it("history restore", async () => {
|
||||
await sf.restore(testid, testver);
|
||||
|
||||
let res = await sf.get(testid);
|
||||
expect(res, "No data returned").to.exist;
|
||||
expect(decoder.decode(res), "Returned data not equal to stored").to.be.equal(decoder.decode(testdata));
|
||||
})
|
||||
|
||||
it("delete", async () => {
|
||||
let res = await sf.delete(testid);
|
||||
expect(res, "Res not set").to.exist;
|
||||
})
|
||||
|
||||
describe("folder", () => {
|
||||
it("create", async () => {
|
||||
let res = await sf.create(testname, testdata, "text", testfolder, testprev)
|
||||
expect(res, "Res not set").to.exist;
|
||||
expect(res._id, "No _id field").to.exist;
|
||||
ftestid = res._id;
|
||||
testver = res.active.version;
|
||||
})
|
||||
|
||||
it("list", async () => {
|
||||
let res = await sf.list(testfolder);
|
||||
expect(Array.isArray(res), "Is from type Array").to.be.true;
|
||||
expect(res.length, "Do elements exist?").to.be.greaterThan(0);
|
||||
let found = false;
|
||||
res.forEach(e => {
|
||||
if (e._id === ftestid) {
|
||||
found = true;
|
||||
}
|
||||
})
|
||||
expect(found, "Element is not in List").to.exist;
|
||||
})
|
||||
|
||||
it("delete", async () => {
|
||||
let res = await sf.delete(ftestid);
|
||||
expect(res, "Res not set").to.exist;
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
describe("SecureFile Tests", function () {
|
||||
let sf = new SecureFile("http://localhost:3004");
|
||||
sf.jwtObservable.subscribe((callback) => {
|
||||
callback[0]("TESTJWT");
|
||||
})
|
||||
test(sf)
|
||||
import SecureFile, { NotFound } from "./index";
|
||||
import { v4 } from "uuid"
|
||||
import { TextEncoder, TextDecoder } from "util";
|
||||
|
||||
const testname = "ouiavgbsop687463743"
|
||||
const encoder = new TextEncoder();
|
||||
const decoder = new TextDecoder();
|
||||
const testdata = encoder.encode("Ich bin ein Test");
|
||||
const newTestData = encoder.encode("neue test daten");
|
||||
const newTestDataOld = encoder.encode("neue test daten asd");
|
||||
const testprev = "Ich bin...";
|
||||
|
||||
const testfolder = "iabos";
|
||||
let ftestid;
|
||||
|
||||
import { expect } from "chai"
|
||||
|
||||
function test(sf: SecureFile) {
|
||||
let testid: string;
|
||||
let testver: string;
|
||||
let testver2: string;
|
||||
|
||||
it("create", async () => {
|
||||
let res = await sf.create(testname, testdata, "text", undefined, testprev)
|
||||
expect(res, "Res isnnot set").to.exist;
|
||||
expect(res._id, "Res has no _id").to.exist;
|
||||
testid = res._id;
|
||||
testver = res.active.version;
|
||||
})
|
||||
|
||||
it("get", async () => {
|
||||
let res = await sf.get(testid);
|
||||
expect(res, "No data returned").to.exist;
|
||||
expect(decoder.decode(res), "Returned data not equal to stored").to.be.equal(decoder.decode(testdata));
|
||||
})
|
||||
|
||||
it("get - fail", async () => {
|
||||
const inverr = new Error("Should have failed!");
|
||||
try {
|
||||
await sf.get(testid + "asod");
|
||||
throw inverr
|
||||
} catch (err) {
|
||||
if (err !== inverr) {
|
||||
expect(err).to.be.instanceOf(NotFound);
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
it("list", async () => {
|
||||
let res = await sf.list();
|
||||
expect(Array.isArray(res), "Is not from type Array").to.be.true;
|
||||
expect(res.length, "No elements returned").to.greaterThan(0);
|
||||
let found = !!res.find(e => e._id === testid);
|
||||
expect(found, "Element not in List").to.be.true;
|
||||
})
|
||||
|
||||
it("update to history", async () => {
|
||||
let res = await sf.update(testid, newTestDataOld, undefined, undefined, true);
|
||||
expect(res, "No data returned").to.exist;
|
||||
expect(res._id, "_id missing").to.exist;
|
||||
expect(res.active.version, "New version was created").to.equal(testver);
|
||||
let res2 = await sf.get(testid);
|
||||
expect(decoder.decode(res2), "Fetched data not updated").to.be.equal(decoder.decode(testdata));
|
||||
})
|
||||
|
||||
it("update", async () => {
|
||||
let res = await sf.update(testid, newTestData, undefined);
|
||||
expect(res, "No data returned").to.exist;
|
||||
expect(res._id, "_id missing").to.exist;
|
||||
expect(res.active.version, "No new version was created").to.not.equal(testver);
|
||||
testver2 = res.active.version;
|
||||
let res2 = await sf.get(testid);
|
||||
expect(decoder.decode(res2), "Fetched data not updated").to.be.equal(decoder.decode(newTestData));
|
||||
})
|
||||
|
||||
it("history", async () => {
|
||||
let his = await sf.history(testid);
|
||||
expect(his, "no data returned").to.exist;
|
||||
expect(his.file, "file not set").to.exist;
|
||||
expect(his.history, "history not set").to.exist;
|
||||
expect(his.history.length, `Not expected history length. Expected 1 got ${his.history.length}`).to.be.equal(2);
|
||||
|
||||
expect(his.history[1].version, "Wrong version on history").to.be.equal(testver);
|
||||
expect(his.file.active.version, "Wrong version on file").to.be.equal(testver2);
|
||||
});
|
||||
|
||||
it("history get old", async () => {
|
||||
let arch = await sf.get(testid, testver);
|
||||
expect(decoder.decode(arch), "Old version has wrong data").to.be.equal(decoder.decode(testdata));
|
||||
})
|
||||
|
||||
it("history restore", async () => {
|
||||
await sf.restore(testid, testver);
|
||||
|
||||
let res = await sf.get(testid);
|
||||
expect(res, "No data returned").to.exist;
|
||||
expect(decoder.decode(res), "Returned data not equal to stored").to.be.equal(decoder.decode(testdata));
|
||||
})
|
||||
|
||||
it("delete", async () => {
|
||||
await sf.delete(testid);
|
||||
})
|
||||
|
||||
|
||||
describe("fixed id", () => {
|
||||
let id = v4();
|
||||
it("create", async () => {
|
||||
let res = await sf.create(testname, testdata, "text", undefined, testprev, id)
|
||||
expect(res, "Res isnnot set").to.exist;
|
||||
expect(res._id, "Res has no _id").to.exist;
|
||||
expect(res._id, "Res has invalid _id").to.be.equal(id)
|
||||
})
|
||||
|
||||
it("get", async () => {
|
||||
let res = await sf.get(id);
|
||||
expect(res, "No data returned").to.exist;
|
||||
expect(decoder.decode(res), "Returned data not equal to stored").to.be.equal(decoder.decode(testdata));
|
||||
})
|
||||
})
|
||||
|
||||
describe("predefined date", () => {
|
||||
let id = v4();
|
||||
it("create", async () => {
|
||||
const date = new Date("2017-01-01T00:00:00.000Z")
|
||||
let res = await sf.create(testname, testdata, "text", undefined, testprev, id, date)
|
||||
expect(res, "Res isnnot set").to.exist;
|
||||
expect(res._id, "Res has no _id").to.exist;
|
||||
expect(res._id, "Res has invalid _id").to.be.equal(id)
|
||||
expect(res.active.time.toJSON()).to.be.equal(date.toJSON())
|
||||
})
|
||||
|
||||
it("list", async () => {
|
||||
let res = await sf.get(id);
|
||||
expect(res, "No data returned").to.exist;
|
||||
expect(decoder.decode(res), "Returned data not equal to stored").to.be.equal(decoder.decode(testdata));
|
||||
})
|
||||
})
|
||||
|
||||
describe("folder", () => {
|
||||
it("create", async () => {
|
||||
let res = await sf.create(testname, testdata, "text", testfolder, testprev)
|
||||
expect(res, "Res not set").to.exist;
|
||||
expect(res._id, "No _id field").to.exist;
|
||||
ftestid = res._id;
|
||||
testver = res.active.version;
|
||||
})
|
||||
|
||||
it("list", async () => {
|
||||
let res = await sf.list(testfolder);
|
||||
expect(Array.isArray(res), "Is from type Array").to.be.true;
|
||||
expect(res.length, "Do elements exist?").to.be.greaterThan(0);
|
||||
let found = false;
|
||||
res.forEach(e => {
|
||||
if (e._id === ftestid) {
|
||||
found = true;
|
||||
}
|
||||
})
|
||||
expect(found, "Element is not in List").to.exist;
|
||||
})
|
||||
|
||||
it("delete", async () => {
|
||||
await sf.delete(ftestid);
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
describe("SecureFile Tests", function () {
|
||||
let sf = new SecureFile("http://localhost:3004");
|
||||
sf.jwtObservable.subscribe((callback) => {
|
||||
callback(null, "TESTJWT");
|
||||
})
|
||||
test(sf)
|
||||
})
|
@ -1,17 +1,20 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
/* Basic Options */
|
||||
"target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */
|
||||
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
|
||||
"declaration": true, /* Generates corresponding '.d.ts' file. */
|
||||
"lib": [
|
||||
"es6",
|
||||
"dom"
|
||||
],
|
||||
"outDir": "./lib",
|
||||
"sourceMap": true
|
||||
},
|
||||
"include": [
|
||||
"./src"
|
||||
]
|
||||
{
|
||||
"compilerOptions": {
|
||||
/* Basic Options */
|
||||
"target": "es6",
|
||||
/* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */
|
||||
"module": "commonjs",
|
||||
/* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
|
||||
"declaration": true,
|
||||
/* Generates corresponding '.d.ts' file. */
|
||||
"lib": [
|
||||
"es6",
|
||||
"dom"
|
||||
],
|
||||
"outDir": "./lib",
|
||||
"sourceMap": true
|
||||
},
|
||||
"include": [
|
||||
"./src"
|
||||
]
|
||||
}
|
Reference in New Issue
Block a user