From 57c75822150f515edd3122f706b8227e7810d0a1 Mon Sep 17 00:00:00 2001 From: ajuvercr Date: Mon, 8 Apr 2024 15:52:04 +0200 Subject: [PATCH 1/8] update rdf-lens --- input.ttl | 2 +- ontology.ttl | 44 +- package-lock.json | 4164 +++++++++++++++++++++++++--------- package.json | 2 +- processor/test.js | 8 +- src/connectors.ts | 45 +- src/connectors/file.ts | 6 +- src/connectors/http.ts | 4 +- src/connectors/kafka.ts | 4 +- src/connectors/ws.ts | 4 +- src/index.ts | 27 +- src/shacl.ts | 429 ---- src/util.ts | 1 - test/configuration.test.ts | 10 +- test/connectors/file.test.ts | 16 +- test/connectors/http.test.ts | 42 +- test/connectors/ws.test.ts | 12 +- test/processors.test.ts | 37 +- test/shacl.test.ts | 301 --- 19 files changed, 3191 insertions(+), 1967 deletions(-) delete mode 100644 src/shacl.ts delete mode 100644 test/shacl.test.ts diff --git a/input.ttl b/input.ttl index 8887d5e..48668a5 100644 --- a/input.ttl +++ b/input.ttl @@ -19,7 +19,7 @@ a js:JsReaderChannel. a js:JsWriterChannel. [ ] a js:Send; - js:msg "Hallo world"; + js:msg "Hello"; js:sendWriter . [ ] a js:Resc; diff --git a/ontology.ttl b/ontology.ttl index f3d4a92..83f4577 100644 --- a/ontology.ttl +++ b/ontology.ttl @@ -7,6 +7,7 @@ @prefix rdfs: . @prefix rdf: . @prefix dc: . +@prefix rdfl: . [ ] a sh:NodeShape; sh:targetClass :Channel; @@ -14,6 +15,7 @@ sh:path ( ); sh:name "id"; sh:maxCount 1; + sh:minCount 1; sh:datatype xsd:iri; ], [ sh:path :reader; @@ -30,34 +32,56 @@ [ ] a sh:NodeShape; sh:targetClass :ReaderChannel; sh:property [ - sh:path [ sh:inversePath :reader ]; - sh:name "channel"; - sh:maxCount 1; - sh:class :Channel; - ], [ sh:path rdf:type; sh:name "ty"; sh:maxCount 1; sh:datatype xsd:iri; + ], [ + sh:path ( ); + sh:name "config"; + sh:maxCount 1; + sh:minCount 1; + sh:class rdfl:TypedExtract; ]. [ ] a sh:NodeShape; sh:targetClass :WriterChannel; sh:property [ - sh:path [ sh:inversePath :writer ]; - sh:name "channel"; - sh:maxCount 1; - sh:class :Channel; - ], [ sh:path rdf:type; sh:name "ty"; sh:maxCount 1; + sh:minCount 1; sh:datatype xsd:iri; + ], [ + sh:path ( ); + sh:name "config"; + sh:maxCount 1; + sh:minCount 1; + sh:class rdfl:TypedExtract; ]. js:JsChannel rdfs:subClassOf :Channel. js:JsReaderChannel rdfs:subClassOf :ReaderChannel. +[ ] a sh:NodeShape; + sh:targetClass js:JsReaderChannel; + sh:property [ + sh:path [ sh:inversePath :reader ]; + sh:name "channel"; + sh:maxCount 1; + sh:minCount 1; + sh:class :Channel; + ]. + js:JsWriterChannel rdfs:subClassOf :WriterChannel. +[ ] a sh:NodeShape; + sh:targetClass js:JsWriterChannel; + sh:property [ + sh:path [ sh:inversePath :writer ]; + sh:name "channel"; + sh:maxCount 1; + sh:minCount 1; + sh:class :Channel; + ]. # js:JsChannel a :Channel; diff --git a/package-lock.json b/package-lock.json index 0fa86c8..97bfe86 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "command-line-usage": "^6.1.3", "kafkajs": "^2.2.4", "n3": "^1.17.1", - "rdf-lens": "^1.1.3", + "rdf-lens": "^1.2.3", "stream-to-array": "^2.3.0", "ws": "^8.14.2" }, @@ -36,9 +36,7 @@ }, "node_modules/@ampproject/remapping": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -49,9 +47,8 @@ }, "node_modules/@babel/code-frame": { "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/highlight": "^7.24.2", "picocolors": "^1.0.0" @@ -62,29 +59,27 @@ }, "node_modules/@babel/compat-data": { "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", + "version": "7.24.5", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", + "@babel/generator": "^7.24.5", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -101,20 +96,18 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "version": "7.24.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.0", + "@babel/types": "^7.24.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -125,9 +118,8 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.23.5", "@babel/helper-validator-option": "^7.23.5", @@ -141,27 +133,24 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.22.15", "@babel/types": "^7.23.0" @@ -172,9 +161,8 @@ }, "node_modules/@babel/helper-hoist-variables": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -184,9 +172,8 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.24.0" }, @@ -195,16 +182,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.5", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-simple-access": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -214,33 +200,30 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.24.5", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -248,52 +231,45 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", - "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, + "version": "7.24.5", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "version": "7.24.5", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "version": "7.24.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.5", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -304,9 +280,8 @@ }, "node_modules/@babel/highlight/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -316,9 +291,8 @@ }, "node_modules/@babel/highlight/node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -330,42 +304,37 @@ }, "node_modules/@babel/highlight/node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -374,10 +343,8 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", - "dev": true, + "version": "7.24.5", + "license": "MIT", "bin": { "parser": "bin/babel-parser.js" }, @@ -387,9 +354,8 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -399,9 +365,8 @@ }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -411,9 +376,8 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -423,9 +387,8 @@ }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -435,9 +398,8 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -447,9 +409,8 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, @@ -462,9 +423,8 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -474,9 +434,8 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -486,9 +445,8 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -498,9 +456,8 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -510,9 +467,8 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -522,9 +478,8 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -534,9 +489,8 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -549,9 +503,8 @@ }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", - "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" }, @@ -564,9 +517,8 @@ }, "node_modules/@babel/template": { "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.23.5", "@babel/parser": "^7.24.0", @@ -577,19 +529,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "version": "7.24.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -598,24 +549,191 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", - "dev": true, + "version": "7.24.5", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "license": "MIT" + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "license": "BSD-3-Clause" + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -628,11 +746,35 @@ "node": ">=12" } }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -644,11 +786,18 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -657,11 +806,22 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -671,9 +831,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -686,9 +845,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -698,27 +856,31 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jest/environment": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -731,9 +893,8 @@ }, "node_modules/@jest/expect": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, + "license": "MIT", "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" @@ -744,9 +905,8 @@ }, "node_modules/@jest/expect-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, + "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3" }, @@ -756,9 +916,8 @@ }, "node_modules/@jest/fake-timers": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -773,9 +932,8 @@ }, "node_modules/@jest/globals": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -788,9 +946,7 @@ }, "node_modules/@jest/schemas": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, + "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -800,9 +956,8 @@ }, "node_modules/@jest/transform": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -826,9 +981,8 @@ }, "node_modules/@jest/types": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -843,9 +997,7 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -857,33 +1009,25 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -891,9 +1035,8 @@ }, "node_modules/@knighted/duel": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@knighted/duel/-/duel-1.0.7.tgz", - "integrity": "sha512-N/Z/BqKFNwuyPZvrTtcsVtnPABOIfVgyQN58YpTOBBJIWCP/ZrNM4KaMjdWpf5byYjC1LIOzf8Va/9l/buHmig==", "dev": true, + "license": "MIT", "dependencies": { "@knighted/specifier": "^1.0.1", "find-up": "^6.3.0", @@ -913,9 +1056,8 @@ }, "node_modules/@knighted/specifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@knighted/specifier/-/specifier-1.0.1.tgz", - "integrity": "sha512-LArFWJN7wGGLU1P3TeEHgO6wGKWEYq/o4/Yij7rnKk0ng1HbQn1wythI0E9Q7B3+7LRnposEtaeY9AZlE3Cg+Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.22.7", "@babel/traverse": "^7.23.2", @@ -925,260 +1067,85 @@ "node": ">=14" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, "engines": { - "node": ">=14" + "node": ">= 8" } }, - "node_modules/@rdfjs/types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rdfjs/types/-/types-1.1.0.tgz", - "integrity": "sha512-5zm8bN2/CC634dTcn/0AhTRLaQRjXDZs3QfcAsQKNturHT7XVWcKy/8p3P5gXl+YkZTAmy7T5M/LyiT/jbkENw==", - "dependencies": { - "@types/node": "*" + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "license": "MIT", + "engines": { + "node": ">= 8" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.3.tgz", - "integrity": "sha512-X9alQ3XM6I9IlSlmC8ddAvMSyG1WuHk5oUnXGw+yUBs3BFoTizmG1La/Gr8fVJvDWAq+zlYTZ9DBgrlKRVY06g==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.3.tgz", - "integrity": "sha512-eQK5JIi+POhFpzk+LnjKIy4Ks+pwJ+NXmPxOCSvOKSNRPONzKuUvWE+P9JxGZVxrtzm6BAYMaL50FFuPe0oWMQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.3.tgz", - "integrity": "sha512-Od4vE6f6CTT53yM1jgcLqNfItTsLt5zE46fdPaEmeFHvPs5SjZYlLpHrSiHEKR1+HdRfxuzXHjDOIxQyC3ptBA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.3.tgz", - "integrity": "sha512-0IMAO21axJeNIrvS9lSe/PGthc8ZUS+zC53O0VhF5gMxfmcKAP4ESkKOCwEi6u2asUrt4mQv2rjY8QseIEb1aw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.3.tgz", - "integrity": "sha512-ge2DC7tHRHa3caVEoSbPRJpq7azhG+xYsd6u2MEnJ6XzPSzQsTKyXvh6iWjXRf7Rt9ykIUWHtl0Uz3T6yXPpKw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.14.3.tgz", - "integrity": "sha512-ljcuiDI4V3ySuc7eSk4lQ9wU8J8r8KrOUvB2U+TtK0TiW6OFDmJ+DdIjjwZHIw9CNxzbmXY39wwpzYuFDwNXuw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.3.tgz", - "integrity": "sha512-Eci2us9VTHm1eSyn5/eEpaC7eP/mp5n46gTRB3Aar3BgSvDQGJZuicyq6TsH4HngNBgVqC5sDYxOzTExSU+NjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.3.tgz", - "integrity": "sha512-UrBoMLCq4E92/LCqlh+blpqMz5h1tJttPIniwUgOFJyjWI1qrtrDhhpHPuFxULlUmjFHfloWdixtDhSxJt5iKw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.3.tgz", - "integrity": "sha512-5aRjvsS8q1nWN8AoRfrq5+9IflC3P1leMoy4r2WjXyFqf3qcqsxRCfxtZIV58tCxd+Yv7WELPcO9mY9aeQyAmw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.3.tgz", - "integrity": "sha512-sk/Qh1j2/RJSX7FhEpJn8n0ndxy/uf0kI/9Zc4b1ELhqULVdTfN6HL31CDaTChiBAOgLcsJ1sgVZjWv8XNEsAQ==", - "cpu": [ - "riscv64" - ], + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", "dev": true, + "license": "MIT", "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": ">=14" + } }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.3.tgz", - "integrity": "sha512-jOO/PEaDitOmY9TgkxF/TQIjXySQe5KVYB57H/8LRP/ux0ZoO8cSHCX17asMSv3ruwslXW/TLBcxyaUzGRHcqg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] + "node_modules/@rdfjs/types": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.3.tgz", - "integrity": "sha512-8ybV4Xjy59xLMyWo3GCfEGqtKV5M5gCSrZlxkPGvEPCGDLNla7v48S662HSGwRd6/2cSneMQWiv+QzcttLrrOA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.3.tgz", - "integrity": "sha512-s+xf1I46trOY10OqAtZ5Rm6lzHre/UiLA1J2uOhCFXWkbZrJRkYBPO6FhvGfHmdtQ3Bx793MNa7LvoWFAm93bg==", + "version": "4.17.2", "cpu": [ "x64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.3.tgz", - "integrity": "sha512-+4h2WrGOYsOumDQ5S2sYNyhVfrue+9tc9XcLWLh+Kw3UOxAvrfOrSMFon60KspcDdytkNDh7K2Vs6eMaYImAZg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.3.tgz", - "integrity": "sha512-T1l7y/bCeL/kUwh9OD4PQT4aM7Bq43vX05htPJJ46RTI4r5KNt6qJRzAfNfM+OYMNEVBWQzR2Gyk+FXLZfogGw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.3.tgz", - "integrity": "sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@sinclair/typebox": { "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "license": "MIT" }, "node_modules/@sinonjs/commons": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "node_modules/@treecg/types": { "version": "0.4.6", - "resolved": "https://registry.npmjs.org/@treecg/types/-/types-0.4.6.tgz", - "integrity": "sha512-iL8rBhAX4INvfuHZzJ1RELh1i/fspviylENZTk6D2p/xDazY1pTkd+y/hxKYVWCC0jHNolDWRsH7ozwaFGNQKA==", + "license": "UNLICENSE", "dependencies": { "@rdfjs/types": "*", "loglevel": "^1.8.1", @@ -1186,205 +1153,523 @@ "rdf-data-factory": "^1.1.0" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "license": "MIT" + }, "node_modules/@types/command-line-args": { "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.3.tgz", - "integrity": "sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/command-line-usage": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.4.tgz", - "integrity": "sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/estree": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "license": "MIT" }, "node_modules/@types/graceful-fs": { "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/n3": { "version": "1.16.4", - "resolved": "https://registry.npmjs.org/@types/n3/-/n3-1.16.4.tgz", - "integrity": "sha512-6PmHRYCCdjbbBV2UVC/HjtL6/5Orx9ku2CQjuojucuHvNvPmnm6+02B18YGhHfvU25qmX2jPXyYPHsMNkn+w2w==", "dev": true, + "license": "MIT", "dependencies": { "@rdfjs/types": "^1.1.0", "@types/node": "*" } }, "node_modules/@types/node": { - "version": "18.19.31", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.31.tgz", - "integrity": "sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==", + "version": "18.19.33", + "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/stack-utils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/ws": { "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/yargs": { "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, + "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.9.0", + "license": "MIT", "dependencies": { - "event-target-shim": "^5.0.0" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.9.0", + "@typescript-eslint/type-utils": "7.9.0", + "@typescript-eslint/utils": "7.9.0", + "@typescript-eslint/visitor-keys": "7.9.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": ">=6.5" + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, + "node_modules/@typescript-eslint/parser": { + "version": "7.9.0", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "7.9.0", + "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/typescript-estree": "7.9.0", + "@typescript-eslint/visitor-keys": "7.9.0", + "debug": "^4.3.4" + }, "engines": { - "node": ">=12" + "node": "^18.18.0 || >=20.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.9.0", + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/visitor-keys": "7.9.0" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || >=20.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.9.0", + "license": "MIT", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "@typescript-eslint/typescript-estree": "7.9.0", + "@typescript-eslint/utils": "7.9.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": ">= 8" + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" + "node_modules/@typescript-eslint/types": { + "version": "7.9.0", + "license": "MIT", + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.9.0", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/visitor-keys": "7.9.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, "engines": { - "node": ">=6" + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, + "node_modules/@typescript-eslint/utils": { + "version": "7.9.0", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.9.0", + "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/typescript-estree": "7.9.0" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" } }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.9.0", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.9.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/@vitest/coverage-v8": { + "version": "1.6.0", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.4", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.4", + "istanbul-reports": "^3.1.6", + "magic-string": "^0.30.5", + "magicast": "^0.3.3", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "test-exclude": "^6.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "1.6.0" + } + }, + "node_modules/@vitest/expect": { + "version": "1.6.0", + "license": "MIT", + "dependencies": { + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "1.6.0", + "license": "MIT", + "dependencies": { + "@vitest/utils": "1.6.0", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "1.6.0", + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "1.6.0", + "license": "MIT", + "dependencies": { + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "1.6.0", + "license": "MIT", + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "6.2.1", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "node_modules/array-back": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "dev": true, + "license": "MIT", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -1405,14 +1690,10 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -1426,22 +1707,29 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/braces": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, + "license": "MIT", "dependencies": { "fill-range": "^7.0.1" }, @@ -1451,8 +1739,6 @@ }, "node_modules/browserslist": { "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "funding": [ { @@ -1468,6 +1754,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001587", "electron-to-chromium": "^1.4.668", @@ -1483,17 +1770,14 @@ }, "node_modules/bser": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "node-int64": "^0.4.0" } }, "node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -1508,24 +1792,36 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, + "node_modules/cac": { + "version": "6.7.14", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/camelcase": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001610", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz", - "integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==", + "version": "1.0.30001618", "dev": true, "funding": [ { @@ -1540,13 +1836,28 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" + }, + "node_modules/chai": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + }, + "engines": { + "node": ">=4" + } }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1558,10 +1869,50 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/check-error": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/ci-info": { "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -1569,15 +1920,83 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/cli-cursor": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "10.3.0", + "license": "MIT" + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1587,14 +2006,15 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "license": "MIT" }, "node_modules/command-line-args": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "license": "MIT", "dependencies": { "array-back": "^3.1.0", "find-replace": "^3.0.0", @@ -1607,8 +2027,7 @@ }, "node_modules/command-line-usage": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", - "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", + "license": "MIT", "dependencies": { "array-back": "^4.0.2", "chalk": "^2.4.2", @@ -1621,8 +2040,7 @@ }, "node_modules/command-line-usage/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -1632,16 +2050,14 @@ }, "node_modules/command-line-usage/node_modules/array-back": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/command-line-usage/node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -1653,37 +2069,32 @@ }, "node_modules/command-line-usage/node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/command-line-usage/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "license": "MIT" }, "node_modules/command-line-usage/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/command-line-usage/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/command-line-usage/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -1693,29 +2104,38 @@ }, "node_modules/command-line-usage/node_modules/typical": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/commander": { + "version": "11.1.0", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.1.7", + "license": "MIT" }, "node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/create-require": { + "version": "1.1.1", + "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1727,9 +2147,7 @@ }, "node_modules/debug": { "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -1742,64 +2160,357 @@ } } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "node_modules/deep-eql": { + "version": "4.1.3", + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "license": "MIT" + }, + "node_modules/diff": { + "version": "4.0.2", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.769", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.20.2", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/path-exists": { + "version": "4.0.0", + "license": "MIT", "engines": { - "node": ">=4.0.0" + "node": ">=8" } }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.738", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.738.tgz", - "integrity": "sha512-lwKft2CLFztD+vEIpesrOtCrko/TFnEJlHFdRhazU7Y/jx5qc4cqsocfVrBg4So4gGe9lvxnbLIoev47WMpg+A==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, + "node_modules/eslint/node_modules/yocto-queue": { + "version": "0.1.0", + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, + "node_modules/espree": { + "version": "9.6.1", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -1808,27 +2519,90 @@ "node": ">=4" } }, + "node_modules/esquery": { + "version": "1.5.0", + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/event-target-shim": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "license": "MIT" + }, "node_modules/events": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", "engines": { "node": ">=0.8.x" } }, + "node_modules/execa": { + "version": "8.0.1", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, "node_modules/expect": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -1840,26 +2614,70 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } }, "node_modules/fb-watchman": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "bser": "2.1.1" } }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/fill-range": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1869,8 +2687,7 @@ }, "node_modules/find-replace": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "license": "MIT", "dependencies": { "array-back": "^3.0.1" }, @@ -1880,9 +2697,8 @@ }, "node_modules/find-up": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" @@ -1896,9 +2712,8 @@ }, "node_modules/find-up-simple": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", - "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -1906,11 +2721,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/flat-cache": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "license": "ISC" + }, "node_modules/foreground-child": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", "dev": true, + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -1924,102 +2754,140 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } + "license": "ISC" }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/get-package-type": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.0.0" } }, + "node_modules/get-stream": { + "version": "8.0.1", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "version": "10.3.15", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.6", "minimatch": "^9.0.1", "minipass": "^7.0.4", - "path-scurry": "^1.10.2" + "path-scurry": "^1.11.0" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/glob-parent": { + "version": "6.0.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/globals": { "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, + "node_modules/globby": { + "version": "11.1.0", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "license": "MIT" + }, "node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "license": "MIT" }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -2028,10 +2896,9 @@ } }, "node_modules/hosted-git-info": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", - "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", + "version": "7.0.2", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" }, @@ -2040,18 +2907,39 @@ } }, "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "version": "10.2.2", "dev": true, + "license": "ISC", "engines": { "node": "14 || >=16.14" } }, + "node_modules/html-escaper": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/human-signals": { + "version": "5.0.0", + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/husky": { + "version": "9.0.11", + "license": "MIT", + "bin": { + "husky": "bin.mjs" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, "node_modules/ieee754": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -2065,22 +2953,41 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.1", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/index-to-position": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-0.1.2.tgz", - "integrity": "sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -2090,9 +2997,7 @@ }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -2100,15 +3005,22 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "license": "ISC" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } }, "node_modules/is-core-module": { "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.0" }, @@ -2116,44 +3028,72 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, + "node_modules/is-extglob": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, + "node_modules/is-stream": { + "version": "3.0.0", + "license": "MIT", "engines": { - "node": ">=0.12.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "license": "ISC" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -2167,18 +3107,51 @@ }, "node_modules/istanbul-lib-instrument/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.4", + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jackspeak": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -2194,9 +3167,8 @@ }, "node_modules/jest-diff": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", @@ -2209,18 +3181,16 @@ }, "node_modules/jest-get-type": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -2243,9 +3213,8 @@ }, "node_modules/jest-matcher-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -2258,9 +3227,8 @@ }, "node_modules/jest-message-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -2278,9 +3246,8 @@ }, "node_modules/jest-mock": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -2292,18 +3259,16 @@ }, "node_modules/jest-regex-util": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", @@ -2332,9 +3297,8 @@ }, "node_modules/jest-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -2349,9 +3313,8 @@ }, "node_modules/jest-worker": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -2364,9 +3327,8 @@ }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -2379,18 +3341,14 @@ }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, + "version": "4.1.0", + "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -2398,66 +3356,342 @@ }, "node_modules/jsesc": { "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, - "engines": { - "node": ">=4" + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/kafkajs": { + "version": "2.2.4", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/lint-staged": { + "version": "15.2.2", + "license": "MIT", + "dependencies": { + "chalk": "5.3.0", + "commander": "11.1.0", + "debug": "4.3.4", + "execa": "8.0.1", + "lilconfig": "3.0.0", + "listr2": "8.0.1", + "micromatch": "4.0.5", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.3.4" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.3.0", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/listr2": { + "version": "8.0.1", + "license": "MIT", + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.0.0", + "rfdc": "^1.3.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "10.3.0", + "license": "MIT" + }, + "node_modules/listr2/node_modules/string-width": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/local-pkg": { + "version": "0.5.0", + "license": "MIT", + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "license": "MIT" + }, + "node_modules/log-update": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^6.2.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^7.0.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.3.0", + "license": "MIT" + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" + "node_modules/log-update/node_modules/string-width": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true - }, - "node_modules/kafkajs": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/kafkajs/-/kafkajs-2.2.4.tgz", - "integrity": "sha512-j/YeapB1vfPT2iOIUn/vxdyKEuhuY2PxMBvf5JWux6iSaukAccrMtXEY/Lb7OvavDhOWME589bpLrEdnVHjfjA==", + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { - "node": ">=14.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "license": "MIT", "dependencies": { - "p-locate": "^6.0.0" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - }, "node_modules/loglevel": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz", - "integrity": "sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==", + "license": "MIT", "engines": { "node": ">= 0.6.0" }, @@ -2468,50 +3702,78 @@ }, "node_modules/loglevel-plugin-prefix": { "version": "0.8.4", - "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz", - "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==" + "license": "MIT" + }, + "node_modules/loupe": { + "version": "2.3.7", + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } }, "node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } }, "node_modules/magic-string": { - "version": "0.30.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.9.tgz", - "integrity": "sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==", - "dev": true, + "version": "0.30.10", + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/magicast": { + "version": "0.3.4", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.24.4", + "@babel/types": "^7.24.0", + "source-map-js": "^1.2.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" }, "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-error": { + "version": "1.3.6", + "license": "ISC" + }, "node_modules/makeerror": { "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "tmpl": "1.0.5" } }, "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "license": "MIT", + "engines": { + "node": ">= 8" + } }, "node_modules/micromatch": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -2520,11 +3782,19 @@ "node": ">=8.6" } }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -2536,24 +3806,41 @@ } }, "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.1", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, + "node_modules/mlly": { + "version": "1.7.0", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.1.0", + "ufo": "^1.5.3" + } + }, "node_modules/ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "license": "MIT" + }, + "node_modules/mylas": { + "version": "2.1.13", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/raouldeheer" + } }, "node_modules/n3": { "version": "1.17.3", - "resolved": "https://registry.npmjs.org/n3/-/n3-1.17.3.tgz", - "integrity": "sha512-ZHc24eZi2GIJcJQVxtL6NT3g+mTHRNeTVfXWELzeUOirqLrh2AAyg0nfYZ/kryJWKFSCgO37DGB6Ok3qmGgEcA==", + "license": "MIT", "dependencies": { "queue-microtask": "^1.1.2", "readable-stream": "^4.0.0" @@ -2562,29 +3849,40 @@ "node": ">=12.0" } }, + "node_modules/nanoid": { + "version": "3.3.7", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "license": "MIT" }, "node_modules/node-int64": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/normalize-package-data": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", - "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "version": "6.0.1", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^7.0.0", "is-core-module": "^2.8.1", @@ -2597,27 +3895,73 @@ }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } }, + "node_modules/onetime": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/p-limit": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^1.0.0" }, @@ -2630,9 +3974,8 @@ }, "node_modules/p-locate": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^4.0.0" }, @@ -2645,18 +3988,26 @@ }, "node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, "engines": { "node": ">=6" } }, "node_modules/parse-json": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz", - "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.22.13", "index-to-position": "^0.1.2", @@ -2671,67 +4022,74 @@ }, "node_modules/path-exists": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-scurry": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", - "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "version": "1.11.1", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "version": "10.2.2", "dev": true, + "license": "ISC", "engines": { "node": "14 || >=16.14" } }, + "node_modules/path-type": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/pathval": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.0.1", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -2739,20 +4097,92 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pidtree": { + "version": "0.6.0", + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/pirates": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, + "node_modules/pkg-types": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.7", + "mlly": "^1.7.0", + "pathe": "^1.1.2" + } + }, + "node_modules/plimit-lit": { + "version": "1.6.1", + "license": "MIT", + "dependencies": { + "queue-lit": "^1.5.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/postcss": { + "version": "8.4.38", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.2.5", + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -2764,28 +4194,37 @@ }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process": { + "version": "0.11.10", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=6" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "node_modules/queue-lit": { + "version": "1.5.2", + "license": "MIT", "engines": { - "node": ">= 0.6.0" + "node": ">=12" } }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { "type": "github", @@ -2799,36 +4238,46 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/rdf-data-factory": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/rdf-data-factory/-/rdf-data-factory-1.1.2.tgz", - "integrity": "sha512-TfQD63Lokabd09ES1jAtKK8AA6rkr9rwyUBGo6olOt1CE0Um36CUQIqytyf0am2ouBPR0l7SaHxCiMcPGHkt1A==", + "license": "MIT", "dependencies": { "@rdfjs/types": "*" } }, "node_modules/rdf-lens": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/rdf-lens/-/rdf-lens-1.2.5.tgz", - "integrity": "sha512-1r4rXTVRG9Qbva969+Kb1ACjYAfbHp8H05jPQj8t+CK7BD65FQTy5Vp3usHA7QkkphAIx7EK/tUTejCXZQHcbQ==", + "version": "1.2.8", + "license": "MIT", "dependencies": { "@rdfjs/types": "^1.1.0", - "@treecg/types": "^0.4.5" + "@treecg/types": "^0.4.5", + "@typescript-eslint/eslint-plugin": "^7.5.0", + "@typescript-eslint/parser": "^7.4.0", + "@vitest/coverage-v8": "^1.4.0", + "dotenv": "^16.4.5", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "husky": "^9.0.11", + "lint-staged": "^15.2.2", + "prettier": "^3.2.5", + "ts-node": "^10.9.2", + "tsc-alias": "^1.8.8", + "typescript": "^5.4.3", + "vite-tsconfig-paths": "^4.3.2", + "vitest": "^1.4.0" } }, "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "version": "18.3.1", + "license": "MIT" }, "node_modules/read-package-up": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", - "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", "dev": true, + "license": "MIT", "dependencies": { "find-up-simple": "^1.0.0", "read-pkg": "^9.0.0", @@ -2843,9 +4292,8 @@ }, "node_modules/read-pkg": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", - "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", "dev": true, + "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.3", "normalize-package-data": "^6.0.0", @@ -2862,8 +4310,7 @@ }, "node_modules/readable-stream": { "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -2875,28 +4322,132 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/readdirp": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/reduce-flatten": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, + "version": "4.0.0", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC" + }, + "node_modules/reusify": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.1", + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, "node_modules/rollup": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.3.tgz", - "integrity": "sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==", - "dev": true, + "version": "4.17.2", + "license": "MIT", "dependencies": { "@types/estree": "1.0.5" }, @@ -2908,29 +4459,48 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.14.3", - "@rollup/rollup-android-arm64": "4.14.3", - "@rollup/rollup-darwin-arm64": "4.14.3", - "@rollup/rollup-darwin-x64": "4.14.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.14.3", - "@rollup/rollup-linux-arm-musleabihf": "4.14.3", - "@rollup/rollup-linux-arm64-gnu": "4.14.3", - "@rollup/rollup-linux-arm64-musl": "4.14.3", - "@rollup/rollup-linux-powerpc64le-gnu": "4.14.3", - "@rollup/rollup-linux-riscv64-gnu": "4.14.3", - "@rollup/rollup-linux-s390x-gnu": "4.14.3", - "@rollup/rollup-linux-x64-gnu": "4.14.3", - "@rollup/rollup-linux-x64-musl": "4.14.3", - "@rollup/rollup-win32-arm64-msvc": "4.14.3", - "@rollup/rollup-win32-ia32-msvc": "4.14.3", - "@rollup/rollup-win32-x64-msvc": "4.14.3", + "@rollup/rollup-android-arm-eabi": "4.17.2", + "@rollup/rollup-android-arm64": "4.17.2", + "@rollup/rollup-darwin-arm64": "4.17.2", + "@rollup/rollup-darwin-x64": "4.17.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.17.2", + "@rollup/rollup-linux-arm-musleabihf": "4.17.2", + "@rollup/rollup-linux-arm64-gnu": "4.17.2", + "@rollup/rollup-linux-arm64-musl": "4.17.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2", + "@rollup/rollup-linux-riscv64-gnu": "4.17.2", + "@rollup/rollup-linux-s390x-gnu": "4.17.2", + "@rollup/rollup-linux-x64-gnu": "4.17.2", + "@rollup/rollup-linux-x64-musl": "4.17.2", + "@rollup/rollup-win32-arm64-msvc": "4.17.2", + "@rollup/rollup-win32-ia32-msvc": "4.17.2", + "@rollup/rollup-win32-x64-msvc": "4.17.2", "fsevents": "~2.3.2" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -2944,16 +4514,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.2", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -2961,29 +4527,9 @@ "node": ">=10" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -2993,18 +4539,18 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "license": "ISC" + }, "node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -3014,18 +4560,46 @@ }, "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/spdx-correct": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -3033,15 +4607,13 @@ }, "node_modules/spdx-exceptions": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true + "dev": true, + "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, + "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -3049,21 +4621,18 @@ }, "node_modules/spdx-license-ids": { "version": "3.0.17", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", - "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/stack-utils": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -3071,27 +4640,47 @@ "node": ">=10" } }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.7.0", + "license": "MIT" + }, "node_modules/stream-to-array": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", - "integrity": "sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==", + "license": "MIT", "dependencies": { "any-promise": "^1.1.0" } }, "node_modules/string_decoder": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, + "node_modules/string-argv": { + "version": "0.3.2", + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, "node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -3107,9 +4696,8 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -3119,26 +4707,47 @@ "node": ">=8" } }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { + "node_modules/string-width/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -3146,48 +4755,55 @@ "node": ">=8" } }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^5.0.1" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "license": "MIT", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "node_modules/strip-literal": { + "version": "2.1.0", + "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "js-tokens": "^9.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.0", + "license": "MIT" }, "node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -3197,8 +4813,7 @@ }, "node_modules/table-layout": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", + "license": "MIT", "dependencies": { "array-back": "^4.0.1", "deep-extend": "~0.6.0", @@ -3211,25 +4826,21 @@ }, "node_modules/table-layout/node_modules/array-back": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/table-layout/node_modules/typical": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/test-exclude": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, + "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -3241,9 +4852,7 @@ }, "node_modules/test-exclude/node_modules/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, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3251,9 +4860,7 @@ }, "node_modules/test-exclude/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3271,9 +4878,7 @@ }, "node_modules/test-exclude/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3281,26 +4886,43 @@ "node": "*" } }, + "node_modules/text-table": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.8.0", + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "0.8.4", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.2.1", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/tmpl": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/to-fast-properties": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -3308,20 +4930,118 @@ "node": ">=8.0" } }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tsc-alias": { + "version": "1.8.10", + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.3", + "commander": "^9.0.0", + "globby": "^11.0.4", + "mylas": "^2.1.9", + "normalize-path": "^3.0.0", + "plimit-lit": "^1.2.6" + }, + "bin": { + "tsc-alias": "dist/bin/index.js" + } + }, + "node_modules/tsc-alias/node_modules/commander": { + "version": "9.5.0", + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/tsconfck": { + "version": "3.0.3", + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/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, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/type-fest": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.15.0.tgz", - "integrity": "sha512-tB9lu0pQpX5KJq54g+oHOLumOx+pMep4RaM6liXh2PKmVRFF+/vAtUP0ZaJ0kOySfVNjF6doBWPHhBhISKdlIA==", + "version": "4.18.2", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=16" }, @@ -3331,9 +5051,7 @@ }, "node_modules/typescript": { "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -3344,22 +5062,23 @@ }, "node_modules/typical": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/ufo": { + "version": "1.5.3", + "license": "MIT" + }, "node_modules/undici-types": { "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "license": "MIT" }, "node_modules/unicorn-magic": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -3368,9 +5087,7 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.16", "dev": true, "funding": [ { @@ -3386,9 +5103,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -3397,30 +5115,190 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "license": "MIT" + }, "node_modules/validate-npm-package-license": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, + "node_modules/vite": { + "version": "5.2.11", + "license": "MIT", + "dependencies": { + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "1.6.0", + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.3.2", + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.3" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "1.6.0", + "license": "MIT", + "dependencies": { + "@vitest/expect": "1.6.0", + "@vitest/runner": "1.6.0", + "@vitest/snapshot": "1.6.0", + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.3", + "vite": "^5.0.0", + "vite-node": "1.6.0", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "1.6.0", + "@vitest/ui": "1.6.0", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, "node_modules/walker": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "makeerror": "1.0.12" } }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -3431,10 +5309,30 @@ "node": ">= 8" } }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrapjs": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", + "license": "MIT", "dependencies": { "reduce-flatten": "^2.0.0", "typical": "^5.2.0" @@ -3445,17 +5343,15 @@ }, "node_modules/wordwrapjs/node_modules/typical": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -3471,9 +5367,8 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -3486,26 +5381,23 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -3515,23 +5407,21 @@ "node": ">=8" } }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -3539,17 +5429,28 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "license": "ISC" }, "node_modules/write-file-atomic": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -3560,14 +5461,12 @@ }, "node_modules/write-file-atomic/node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.0", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -3586,15 +5485,26 @@ }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.3.4", + "license": "ISC", + "engines": { + "node": ">= 14" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } }, "node_modules/yocto-queue": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, + "license": "MIT", "engines": { "node": ">=12.20" }, diff --git a/package.json b/package.json index d035ede..767d33d 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "command-line-usage": "^6.1.3", "kafkajs": "^2.2.4", "n3": "^1.17.1", - "rdf-lens": "^1.1.3", + "rdf-lens": "^1.2.3", "stream-to-array": "^2.3.0", "ws": "^8.14.2" }, diff --git a/processor/test.js b/processor/test.js index 57fb468..ade9720 100644 --- a/processor/test.js +++ b/processor/test.js @@ -11,10 +11,12 @@ function streamToString(ev) { export async function send(msg, writer) { const host = "0.0.0.0"; const port = 8000; - const requestListener = function (req, res) { - streamToString(req).then((st) => writer.push(st.toString())); + const requestListener = async function (req, res) { + const data = await streamToString(req); + const ret = `${msg} ${data}`; + await writer.push(ret); res.writeHead(200); - res.end(msg); + res.end(ret); }; const server = http.createServer(requestListener); diff --git a/src/connectors.ts b/src/connectors.ts index 4aa9f2d..169c9f5 100644 --- a/src/connectors.ts +++ b/src/connectors.ts @@ -2,7 +2,6 @@ import { createTermNamespace } from "@treecg/types"; import { NamedNode, Term } from "@rdfjs/types"; import { - FileReaderConfig, FileWriterConfig, startFileStreamReader, startFileStreamWriter, @@ -12,7 +11,6 @@ export * from "./connectors/file"; import { startWsStreamReader, startWsStreamWriter, - WsReaderConfig, WsWriterConfig, } from "./connectors/ws"; export * from "./connectors/ws"; @@ -43,18 +41,21 @@ export const Conn = createTermNamespace( "KafkaWriterChannel", "WsReaderChannel", "WsWriterChannel", + "WriterChannel", + "ReaderChannel", ); -export interface Config { +export interface Config { ty: NamedNode; + config: T; } -export type ReaderConstructor = (config: C) => { +export type ReaderConstructor = (config: C) => { reader: Stream; init: () => Promise; }; -export type WriterConstructor = (config: C) => { +export type WriterConstructor = (config: C) => { writer: Writer; init: () => Promise; }; @@ -67,7 +68,7 @@ export const JsOntology = createTermNamespace( "JsWriterChannel", ); type JsChannel = { - channel?: { + channel: { id: Term; }; }; @@ -77,16 +78,16 @@ export class ChannelFactory { private jsChannelsNamedNodes: { [label: string]: SimpleStream } = {}; private jsChannelsBlankNodes: { [label: string]: SimpleStream } = {}; - createReader(config: Config): Stream { + createReader(config: Config): Stream { if (config.ty.equals(Conn.FileReaderChannel)) { - const { reader, init } = startFileStreamReader(config); + const { reader, init } = startFileStreamReader(config.config); this.inits.push(init); return reader; } if (config.ty.equals(Conn.WsReaderChannel)) { - const { reader, init } = startWsStreamReader(config); + const { reader, init } = startWsStreamReader(config.config); this.inits.push(init); return reader; @@ -94,20 +95,22 @@ export class ChannelFactory { if (config.ty.equals(Conn.KafkaReaderChannel)) { const { reader, init } = startKafkaStreamReader( - config, + config.config, ); this.inits.push(init); return reader; } if (config.ty.equals(Conn.HttpReaderChannel)) { - const { reader, init } = startHttpStreamReader(config); + const { reader, init } = startHttpStreamReader( + config.config, + ); this.inits.push(init); return reader; } if (config.ty.equals(JsOntology.JsReaderChannel)) { - const c = config; + const c = config.config; if (c.channel) { const id = c.channel.id.value; if (c.channel.id.termType === "NamedNode") { @@ -131,16 +134,20 @@ export class ChannelFactory { throw "Unknown reader channel " + config.ty.value; } - createWriter(config: Config): Writer { + createWriter(config: Config): Writer { if (config.ty.equals(Conn.FileWriterChannel)) { - const { writer, init } = startFileStreamWriter(config); + const { writer, init } = startFileStreamWriter( + config.config, + ); this.inits.push(init); return writer; } if (config.ty.equals(Conn.WsWriterChannel)) { - const { writer, init } = startWsStreamWriter(config); + const { writer, init } = startWsStreamWriter( + config.config, + ); this.inits.push(init); return writer; @@ -148,20 +155,22 @@ export class ChannelFactory { if (config.ty.equals(Conn.KafkaWriterChannel)) { const { writer, init } = startKafkaStreamWriter( - config, + config.config, ); this.inits.push(init); return writer; } if (config.ty.equals(Conn.HttpWriterChannel)) { - const { writer, init } = startHttpStreamWriter(config); + const { writer, init } = startHttpStreamWriter( + config.config, + ); this.inits.push(init); return writer; } if (config.ty.equals(JsOntology.JsWriterChannel)) { - const c = config; + const c = config.config; if (c.channel) { const id = c.channel.id.value; if (c.channel.id.termType === "NamedNode") { diff --git a/src/connectors/file.ts b/src/connectors/file.ts index f0e7b7c..34bdef0 100644 --- a/src/connectors/file.ts +++ b/src/connectors/file.ts @@ -3,7 +3,6 @@ import { appendFile, readFile, stat, writeFile } from "fs/promises"; import { isAbsolute } from "path"; import { watch } from "node:fs"; import { - Config, ReaderConstructor, SimpleStream, WriterConstructor, @@ -13,14 +12,14 @@ interface FileError extends Error { code: string; } -export interface FileReaderConfig extends Config { +export interface FileReaderConfig { path: string; onReplace: boolean; readFirstContent?: boolean; encoding?: string; } -export interface FileWriterConfig extends Config { +export interface FileWriterConfig { path: string; onReplace: boolean; readFirstContent?: boolean; @@ -99,7 +98,6 @@ export const startFileStreamReader: ReaderConstructor = ( ); if (config.onReplace && config.readFirstContent) { - console.log("reading first content"); const content = await readFile(path, { encoding }); await reader.push(content); } diff --git a/src/connectors/http.ts b/src/connectors/http.ts index cc3243e..ac50aa7 100644 --- a/src/connectors/http.ts +++ b/src/connectors/http.ts @@ -31,7 +31,7 @@ function streamToString( }); } -export interface HttpReaderConfig extends Config { +export interface HttpReaderConfig { endpoint: string; port: number; binary: boolean; @@ -92,7 +92,7 @@ export const startHttpStreamReader: ReaderConstructor = ( return { reader: stream, init }; }; -export interface HttpWriterConfig extends Config { +export interface HttpWriterConfig { endpoint: string; method: string; } diff --git a/src/connectors/kafka.ts b/src/connectors/kafka.ts index 509a63a..1b2faa6 100644 --- a/src/connectors/kafka.ts +++ b/src/connectors/kafka.ts @@ -40,7 +40,7 @@ export interface CSTopic { topic: string; fromBeginning?: boolean; } -export interface KafkaReaderConfig extends Config { +export interface KafkaReaderConfig { topic: { name: string; fromBeginning?: boolean; @@ -106,7 +106,7 @@ export const startKafkaStreamReader: ReaderConstructor = ( return { reader: stream, init }; }; -export interface KafkaWriterConfig extends Config { +export interface KafkaWriterConfig { topic: { name: string; }; diff --git a/src/connectors/ws.ts b/src/connectors/ws.ts index 1a7d19c..3c13d77 100644 --- a/src/connectors/ws.ts +++ b/src/connectors/ws.ts @@ -7,7 +7,7 @@ import { import { RawData, WebSocket } from "ws"; import { WebSocketServer } from "ws"; -export interface WsWriterConfig extends Config { +export interface WsWriterConfig { url: string; } @@ -27,7 +27,7 @@ function connectWs(url: string): Promise { return new Promise((res) => _connectWs(url, res)); } -export interface WsReaderConfig extends Config { +export interface WsReaderConfig { host: string; port: number; } diff --git a/src/index.ts b/src/index.ts index 67185a1..0a997de 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,14 +3,14 @@ import { getArgs } from "./args"; import { load_store } from "./util"; export * from "./connectors"; -export * from "./shacl"; import path from "path"; -import { extractShapes, Shapes } from "./shacl"; import { RDF } from "@treecg/types"; import { ChannelFactory, Conn, JsOntology } from "./connectors"; import { Quad, Term } from "@rdfjs/types"; +import { extractShapes, Shapes } from "rdf-lens"; + function safeJoin(a: string, b: string) { if (b.startsWith("/")) { return b; @@ -56,7 +56,6 @@ export async function extractProcessors( x.object.equals(JsOntology.JsProcess), ) .map((x) => x.subject); - console.log("Finding", JsOntology.JsChannel.value) const processorLens = config.lenses[JsOntology.JsProcess.value]; const processors = subjects.map((id) => processorLens.execute({ id, quads })); return { processors, quads, shapes: config }; @@ -93,7 +92,6 @@ export function extractSteps( } export async function jsRunner() { - console.log("JS runner is running!"); const args = getArgs(); const cwd = process.cwd(); @@ -105,25 +103,8 @@ export async function jsRunner() { const factory = new ChannelFactory(); /// Small hack, if something is extracted from these types, that should be converted to a reader/writer const apply: { [label: string]: (item: any) => any } = {}; - for (let ty of [ - Conn.FileReaderChannel, - Conn.WsReaderChannel, - Conn.HttpReaderChannel, - Conn.KafkaReaderChannel, - JsOntology.JsReaderChannel, - ]) { - apply[ty.value] = (x) => factory.createReader(x); - } - - for (let ty of [ - Conn.FileWriterChannel, - Conn.WsWriterChannel, - Conn.HttpWriterChannel, - Conn.KafkaWriterChannel, - JsOntology.JsWriterChannel, - ]) { - apply[ty.value] = (x) => factory.createWriter(x); - } + apply[Conn.ReaderChannel.value] = factory.createReader.bind(factory); + apply[Conn.WriterChannel.value] = factory.createWriter.bind(factory); const { processors, diff --git a/src/shacl.ts b/src/shacl.ts deleted file mode 100644 index 3a18e49..0000000 --- a/src/shacl.ts +++ /dev/null @@ -1,429 +0,0 @@ -import { Quad, Term } from "@rdfjs/types"; -import { createTermNamespace, RDF, XSD } from "@treecg/types"; -import { - BasicLens, - BasicLensM, - Cont, - empty, - invPred, - pred, - subjects, - unique, -} from "rdf-lens"; -import { CONN2, literal } from "./util"; - -export const RDFS = createTermNamespace( - "http://www.w3.org/2000/01/rdf-schema#", - "subClassOf", -); - -export const SHACL = createTermNamespace( - "http://www.w3.org/ns/shacl#", - // Basics - "Shape", - "NodeShape", - "PropertyShape", - // SHACL target constraints - "targetNode", - "targetClass", - "targetSubjectsOf", - "targetObjectsOf", - // Property things - "property", - "path", - "class", - "name", - "description", - "defaultValue", - // Path things - "alternativePath", - "zeroOrMorePath", - "inversePath", - "minCount", - "maxCount", - "datatype", -); - -export interface ShapeField { - name: string; - path: BasicLensM; - minCount?: number; - maxCount?: number; - extract: BasicLens; - // extract: (term: Term, quads: Quad[]) => any; -} - -export interface Shape { - id: string; - ty: Term; - description?: string; - fields: ShapeField[]; -} - -export function toLens( - shape: Shape, -): BasicLens { - if (shape.fields.length === 0) return empty().map(() => ({})); - - const fields = shape.fields.map((field) => { - const minCount = field.minCount || 0; - const maxCount = field.maxCount || Number.MAX_SAFE_INTEGER; - const base = - maxCount < 2 // There will be at most one - ? field.path.one().then(field.extract) - : field.path.thenAll(field.extract).map((xs) => { - if (xs.length < minCount) { - throw `${shape.ty}:${field.name} required at least ${minCount} elements, found ${xs.length}`; - } - if (xs.length > maxCount) { - throw `${shape.ty}:${field.name} required at most ${maxCount} elements, found ${xs.length}`; - } - return xs; - }); - - const asField = base.map((x) => { - const out = <{ [label: string]: any }>{}; - out[field.name] = x; - return out; - }); - - return minCount > 0 ? asField : asField.or(empty().map(() => ({}))); - }); - - return fields[0] - .and(...fields.slice(1)) - .map((xs) => Object.assign({}, ...xs)); -} - -const RDFListElement = pred(RDF.terms.first) - .one() - .and(pred(RDF.terms.rest).one()); -export const RdfList: BasicLens = new BasicLens((c) => { - if (c.id.equals(RDF.terms.nil)) { - return []; - } - - const [first, rest] = RDFListElement.execute(c); - const els = RdfList.execute(rest); - els.unshift(first.id); - return els; -}); - -export const ShaclSequencePath: BasicLens< - Cont, - BasicLensM -> = new BasicLens((c) => { - const pathList = RdfList.execute(c); - - if (pathList.length === 0) { - return new BasicLensM((c) => [c]); - } - - let start = pred(pathList[0]); - - for (let i = 1; i < pathList.length; i++) { - start = start.thenFlat(pred(pathList[i])); - } - - return start; -}); - -export const ShaclAlternativepath: BasicLens< - Cont, - BasicLensM -> = new BasicLens((c) => { - const options = pred(SHACL.alternativePath).one().then(RdfList).execute(c); - const optionLenses = options.map((id) => - ShaclPath.execute({ id, quads: c.quads }), - ); - return optionLenses[0].orAll(...optionLenses.slice(1)); -}); - -export const ShaclPredicatePath: BasicLens< - Cont, - BasicLensM -> = new BasicLens((c) => { - return pred(c.id); -}); - -export const ShaclInversePath: BasicLens> = pred( - SHACL.inversePath, -) - .one() - .then( - new BasicLens>((c) => { - const pathList = RdfList.execute(c); - - if (pathList.length === 0) { - return new BasicLensM((c) => [c]); - } - - pathList.reverse(); - - let start = invPred(pathList[0]); - - for (let i = 1; i < pathList.length; i++) { - start = start.thenFlat(invPred(pathList[i])); - } - - return start; - }).or( - new BasicLens>((c) => { - return invPred(c.id); - }), - ), - ); - -export const ShaclPath = ShaclSequencePath.or( - ShaclAlternativepath, - ShaclInversePath, - ShaclPredicatePath, -); - -function field( - predicate: Term, - name: T, - convert?: (inp: string) => O, -): BasicLens { - const conv = convert || ((x: string) => x); - - return pred(predicate) - .one() - .map(({ id }) => { - const out = <{ [F in T]: O }>{}; - out[name] = conv(id.value); - return out; - }); -} - -function optionalField( - predicate: Term, - name: T, - convert?: (inp: string) => O | undefined, -): BasicLens { - const conv = convert || ((x: string) => x); - - return pred(predicate) - .one(undefined) - .map((inp) => { - const out = <{ [F in T]: O | undefined }>{}; - if (inp) { - out[name] = conv(inp.id.value); - } - return out; - }); -} - -function dataTypeToExtract(dataType: Term, t: Term): any { - if (dataType.equals(XSD.terms.integer)) return +t.value; - if (dataType.equals(XSD.terms.custom("float"))) return +t.value; - if (dataType.equals(XSD.terms.custom("double"))) return +t.value; - if (dataType.equals(XSD.terms.custom("decimal"))) return +t.value; - if (dataType.equals(XSD.terms.string)) return t.value; - if (dataType.equals(XSD.terms.dateTime)) return new Date(t.value); - if (dataType.equals(XSD.terms.custom("boolean"))) return t.value === "true"; - - return t; -} - -function envLens(dataType: Term): BasicLens { - const checkType = pred(RDF.terms.type) - .thenSome( - new BasicLens(({ id }) => { - if (!id.equals(CONN2.terms.EnvVariable)) { - throw "expected type " + CONN2.EnvVariable; - } - return { checked: true }; - }), - ) - .expectOne(); - - const envName = pred(CONN2.terms.envKey) - .one() - .map(({ id }) => ({ - key: id.value, - })); - - const defaultValue = pred(CONN2.terms.envDefault) - .one(undefined) - .map((found) => ({ - defaultValue: found?.id.value, - })); - - return checkType - .and(envName, defaultValue) - .map(([_, { key }, { defaultValue }]) => { - const value = process.env[key] || defaultValue; - if (value) { - return dataTypeToExtract(dataType, literal(value)); - } else { - throw "Nothing set for ENV " + key + ". No default was set either!"; - } - }); -} - -type Cache = { - [clazz: string]: BasicLens; -}; - -type SubClasses = { - [clazz: string]: string; -}; - -function extractProperty( - cache: Cache, - subClasses: SubClasses, - apply: { [clazz: string]: (item: any) => any }, -): BasicLens { - const pathLens = pred(SHACL.path) - .one() - .then(ShaclPath) - .map((path) => ({ - path, - })); - const nameLens = field(SHACL.name, "name"); - const minCount = optionalField(SHACL.minCount, "minCount", (x) => +x); - const maxCount = optionalField(SHACL.maxCount, "maxCount", (x) => +x); - - const dataTypeLens: BasicLens = - pred(SHACL.datatype) - .one() - .map(({ id }) => ({ - extract: envLens(id).or( - empty().map((item) => dataTypeToExtract(id, item.id)), - ), - })); - - const clazzLens: BasicLens = field( - SHACL.class, - "clazz", - ).map(({ clazz: expected_class }) => { - return { - extract: new BasicLens(({ id, quads }) => { - // How do I extract this value: use a pre - let found_class = false; - - const ty = quads.find( - (q) => q.subject.equals(id) && q.predicate.equals(RDF.terms.type), - )?.object.value; - - if (!ty) { - // We did not find a type, so use the expected class lens - const lens = cache[expected_class]; - if (!lens) { - throw `Tried extracting class ${expected_class} but no shape was defined`; - } - return lens.execute({ id, quads }); - } - - // We found a type, let's see if the expected class is inside the class hierachry - const lenses: (typeof cache)[string][] = []; - - let current = ty; - while (!!current) { - if (lenses.length < 2) { - const lens = cache[current]; - if (lens) { - lenses.push(lens); - } - } - found_class = found_class || current === expected_class; - current = subClasses[current]; - } - - if (!found_class) { - throw `${ty} is not a subClassOf ${expected_class}`; - } - - if (lenses.length === 0) { - throw `Tried the classhierarchy for ${ty}, but found no shape definition`; - } - - const finalLens = - lenses.length == 1 - ? lenses[0] - : lenses[0].and(lenses[1]).map(([a, b]) => Object.assign({}, a, b)); - - if (apply[ty]) { - return finalLens.map(apply[ty]).execute({ id, quads }); - } else { - return finalLens.execute({ id, quads }); - } - }), - }; - }); - - return pathLens - .and(nameLens, minCount, maxCount, clazzLens.or(dataTypeLens)) - .map((xs) => Object.assign({}, ...xs)); -} - -export function extractShape( - cache: Cache, - subclasses: { [label: string]: string }, - apply: { [label: string]: (item: any) => any }, -): BasicLens { - const checkTy = pred(RDF.terms.type) - .one() - .map(({ id }) => { - if (id.equals(SHACL.NodeShape)) return {}; - throw "Shape is not sh:NodeShape"; - }); - - const idLens = empty().map(({ id }) => ({ id: id.value })); - const clazzs = pred(SHACL.targetClass); - - const multiple = clazzs.thenAll(empty().map(({ id }) => ({ ty: id }))); - - // TODO: Add implictTargetClass - const descriptionClassLens = optionalField(SHACL.description, "description"); - const fields = pred(SHACL.property) - .thenSome(extractProperty(cache, subclasses, apply)) - .map((fields) => ({ fields })); - - return multiple - .and(checkTy, idLens, descriptionClassLens, fields) - .map(([multiple, ...others]) => - multiple.map((xs) => Object.assign({}, xs, ...others)), - ); -} - -export type Shapes = { - shapes: Shape[]; - lenses: Cache; - subClasses: SubClasses; -}; - -export function extractShapes( - quads: Quad[], - apply: { [label: string]: (item: any) => any } = {}, -): Shapes { - const cache: Cache = {}; - const subClasses: SubClasses = {}; - quads - .filter((x) => x.predicate.equals(RDFS.subClassOf)) - .forEach((x) => (subClasses[x.subject.value] = x.object.value)); - const shapes = subjects() - .then(unique()) - .asMulti() - .thenSome(extractShape(cache, subClasses, apply)) - .execute(quads) - .flat(); - const lenses = []; - - // Populate cache - for (let shape of shapes) { - const lens = toLens(shape); - const target = cache[shape.ty.value]; - - if (target) { - cache[shape.ty.value] = target.or(lens); - // subClasses: shape.subTypes, - } else { - cache[shape.ty.value] = lens; - } - lenses.push(lens); - } - - return { lenses: cache, shapes, subClasses }; -} diff --git a/src/util.ts b/src/util.ts index 1a5a066..c3b8d11 100644 --- a/src/util.ts +++ b/src/util.ts @@ -56,7 +56,6 @@ async function get_readstream(location: string): Promise { export async function load_quads(location: string, baseIRI?: string) { try { - console.log("load_quads", location, baseIRI); const parser = new StreamParser({ baseIRI: baseIRI || location }); const rdfStream = await get_readstream(location); rdfStream.pipe(parser); diff --git a/test/configuration.test.ts b/test/configuration.test.ts index bbbe6cc..bafe28c 100644 --- a/test/configuration.test.ts +++ b/test/configuration.test.ts @@ -3,7 +3,7 @@ import { Quad } from "@rdfjs/types"; import { RDF } from "@treecg/types"; import { readFileSync } from "fs"; import { DataFactory, Parser } from "n3"; -import { extractShapes } from "../src/shacl"; +import { extractShapes } from "rdf-lens"; function parseQuads(inp: string): Quad[] { return new Parser().parse(inp); @@ -19,7 +19,7 @@ const JsProcessor = DataFactory.namedNode("https://w3id.org/conn/js#JsProcess"); describe("Input test", () => { test("Parse configuration", () => { const output = parseConfig(); - expect(output.shapes.length).toBe(6); + expect(output.shapes.length).toBe(8); expect(output.lenses[JsProcessor.value]).toBeDefined(); }); @@ -61,7 +61,7 @@ describe("Input test", () => { .map((x) => x.subject); const processorLens = config.lenses[JsProcessor.value]; const processors = subjects.map((id) => - processorLens.execute({ id, quads }), + processorLens.execute({ id, quads: quads }), ); const found: any[] = []; @@ -78,7 +78,9 @@ describe("Input test", () => { ); const processorLens = config.lenses[proc.ty.value]; - found.push(...subjects.map((id) => processorLens.execute({ id, quads }))); + found.push( + ...subjects.map((id) => processorLens.execute({ id, quads: quads })), + ); } console.log( diff --git a/test/connectors/file.test.ts b/test/connectors/file.test.ts index 455343b..1a6251a 100644 --- a/test/connectors/file.test.ts +++ b/test/connectors/file.test.ts @@ -6,13 +6,11 @@ import * as conn from "../../src/connectors"; describe("File Channel", () => { test("Reader - Writer", async () => { const config: FileReaderConfig = { - ty: conn.Conn.FileReaderChannel, path: "/tmp/test.txt", onReplace: true, encoding: "utf-8", }; - const writerConfig: FileReaderConfig = { - ty: conn.Conn.FileWriterChannel, + const writerConfig: FileWriterConfig = { path: "/tmp/test.txt", onReplace: true, encoding: "utf-8", @@ -23,14 +21,20 @@ describe("File Channel", () => { const factory = new conn.ChannelFactory(); const items: string[] = []; - const reader = factory.createReader(config); + const reader = factory.createReader({ + config, + ty: conn.Conn.FileReaderChannel, + }); expect(reader).toBeInstanceOf(conn.SimpleStream); reader.data((x) => { - items.push(x); + items.push(x); }); - const writer = factory.createWriter(writerConfig); + const writer = factory.createWriter({ + config: writerConfig, + ty: conn.Conn.FileWriterChannel, + }); await factory.init(); await writer.push("Number 1 " + Math.random()); diff --git a/test/connectors/http.test.ts b/test/connectors/http.test.ts index ea7bfa7..4bdd2c9 100644 --- a/test/connectors/http.test.ts +++ b/test/connectors/http.test.ts @@ -8,17 +8,21 @@ describe("connector-http", () => { endpoint: "localhost", port: 8080, binary: false, - ty: conn.Conn.HttpReaderChannel, }; const writerConfig: HttpWriterConfig = { endpoint: "http://localhost:8080", method: "POST", - ty: conn.Conn.HttpWriterChannel, }; const factory = new conn.ChannelFactory(); - const reader = factory.createReader(readerConfig); - const writer = factory.createWriter(writerConfig); + const reader = factory.createReader({ + config: readerConfig, + ty: conn.Conn.HttpReaderChannel, + }); + const writer = factory.createWriter({ + config: writerConfig, + ty: conn.Conn.HttpWriterChannel, + }); reader.data((data) => { items.push(data); @@ -44,17 +48,21 @@ describe("connector-http", () => { port: 8081, binary: true, waitHandled: false, - ty: conn.Conn.HttpReaderChannel, }; const writerConfig: HttpWriterConfig = { endpoint: "http://localhost:8081", method: "POST", - ty: conn.Conn.HttpWriterChannel, }; const factory = new conn.ChannelFactory(); - const reader = factory.createReader(readerConfig); - const writer = factory.createWriter(writerConfig); + const reader = factory.createReader({ + config: readerConfig, + ty: conn.Conn.HttpReaderChannel, + }); + const writer = factory.createWriter({ + config: writerConfig, + ty: conn.Conn.HttpWriterChannel, + }); reader.data((data) => { console.log("This reader works"); @@ -82,17 +90,21 @@ describe("connector-http", () => { port: 8082, binary: true, waitHandled: true, - ty: conn.Conn.HttpReaderChannel, }; const writerConfig: HttpWriterConfig = { endpoint: "http://localhost:8082", method: "POST", - ty: conn.Conn.HttpWriterChannel, }; const factory = new conn.ChannelFactory(); - const reader = factory.createReader(readerConfig); - const writer = factory.createWriter(writerConfig); + const reader = factory.createReader({ + config: readerConfig, + ty: conn.Conn.HttpReaderChannel, + }); + const writer = factory.createWriter({ + config: writerConfig, + ty: conn.Conn.HttpWriterChannel, + }); reader.data(async (data) => { expect(Buffer.isBuffer(data)).toBeTruthy(); @@ -121,11 +133,13 @@ describe("connector-http", () => { port: 8083, binary: false, responseCode: 202, - ty: conn.Conn.HttpReaderChannel, }; const factory = new conn.ChannelFactory(); - const reader = factory.createReader(readerConfig); + const reader = factory.createReader({ + config: readerConfig, + ty: conn.Conn.HttpReaderChannel, + }); reader.data((data) => { items.push(data); diff --git a/test/connectors/ws.test.ts b/test/connectors/ws.test.ts index e97b196..5369666 100644 --- a/test/connectors/ws.test.ts +++ b/test/connectors/ws.test.ts @@ -5,19 +5,23 @@ import { WsReaderConfig, WsWriterConfig } from "../../src/connectors/ws"; describe("connector-ws", () => { test("Should write -> WebSocket -> read", async () => { const readerConfig: WsReaderConfig = { - ty: conn.Conn.WsReaderChannel, host: "0.0.0.0", port: 8123, }; const writerConfig: WsWriterConfig = { - ty: conn.Conn.WsWriterChannel, url: "ws://127.0.0.1:8123", }; const factory = new conn.ChannelFactory(); - const reader = factory.createReader(readerConfig); - const writer = factory.createWriter(writerConfig); + const reader = factory.createReader({ + config: readerConfig, + ty: conn.Conn.WsReaderChannel, + }); + const writer = factory.createWriter({ + config: writerConfig, + ty: conn.Conn.WsWriterChannel, + }); const items: unknown[] = []; reader.data((x) => { items.push(x); diff --git a/test/processors.test.ts b/test/processors.test.ts index 03ac38b..7e3ada8 100644 --- a/test/processors.test.ts +++ b/test/processors.test.ts @@ -8,6 +8,7 @@ const prefixes = ` @prefix rdfs: . @prefix xsd: . @prefix sh: . +@prefix rdfl: . `; const JS = "https://w3id.org/conn/js#"; @@ -47,8 +48,8 @@ describe("test existing processors", () => { const [[arg]] = argss; expect(arg).toBeInstanceOf(Object); - expect(arg.channel).toBeDefined(); - expect(arg.channel.id).toBeDefined(); + expect(arg.config.channel).toBeDefined(); + expect(arg.config.channel.id).toBeDefined(); expect(arg.ty).toBeDefined(); }); @@ -90,8 +91,8 @@ describe("test existing processors", () => { const [[msg, writer]] = argss; expect(msg).toBe("Hello world!"); expect(writer).toBeInstanceOf(Object); - expect(writer.channel).toBeDefined(); - expect(writer.channel.id).toBeDefined(); + expect(writer.config.channel).toBeDefined(); + expect(writer.config.channel.id).toBeDefined(); expect(writer.ty).toBeDefined(); }); @@ -106,9 +107,9 @@ describe("test existing processors", () => { a js:JsWriterChannel. [ ] a js:Send; js:msg [ - a :EnvVariable; - :envDefault "FromEnv"; - :envKey "msg" + a rdfl:EnvVariable; + rdfl:envDefault "FromEnv"; + rdfl:envKey "msg" ]; js:sendWriter . `; @@ -138,8 +139,8 @@ describe("test existing processors", () => { const [[msg, writer]] = argss; expect(msg).toBe("FromEnv"); expect(writer).toBeInstanceOf(Object); - expect(writer.channel).toBeDefined(); - expect(writer.channel.id).toBeDefined(); + expect(writer.config.channel).toBeDefined(); + expect(writer.config.channel.id).toBeDefined(); expect(writer.ty).toBeDefined(); }); @@ -155,8 +156,8 @@ describe("test existing processors", () => { const [[msg, writer]] = argss; expect(msg).toBe("FROM ENV"); expect(writer).toBeInstanceOf(Object); - expect(writer.channel).toBeDefined(); - expect(writer.channel.id).toBeDefined(); + expect(writer.config.channel).toBeDefined(); + expect(writer.config.channel.id).toBeDefined(); expect(writer.ty).toBeDefined(); }); }); @@ -168,8 +169,10 @@ describe("test existing processors", () => { [ ] a :Channel; :reader ; :writer . + a js:JsReaderChannel. a js:JsWriterChannel. + [ ] a js:Echo; js:input ; js:output . @@ -194,16 +197,20 @@ describe("test existing processors", () => { const argss = extractSteps(proc!, quads, config); expect(argss.length).toBe(1); expect(argss[0].length).toBe(2); + console.log(argss); + const [[reader, writer]] = argss; + console.log(reader.ty.value); + console.log(writer.ty.value); expect(reader).toBeInstanceOf(Object); - expect(reader.channel).toBeDefined(); - expect(reader.channel.id).toBeDefined(); + expect(reader.config.channel).toBeDefined(); + expect(reader.config.channel.id).toBeDefined(); expect(reader.ty).toBeDefined(); expect(writer).toBeInstanceOf(Object); - expect(writer.channel).toBeDefined(); - expect(writer.channel.id).toBeDefined(); + expect(writer.config.channel).toBeDefined(); + expect(writer.config.channel.id).toBeDefined(); expect(writer.ty).toBeDefined(); }); }); diff --git a/test/shacl.test.ts b/test/shacl.test.ts deleted file mode 100644 index 9c7887a..0000000 --- a/test/shacl.test.ts +++ /dev/null @@ -1,301 +0,0 @@ -import { describe, expect, test } from "@jest/globals"; -import { Quad } from "@rdfjs/types"; -import { RDF } from "@treecg/types"; -import { Parser } from "n3"; -import { extractShapes } from "../src/shacl"; - -const prefixes = ` -@prefix js: . -@prefix fno: . -@prefix fnom: . -@prefix xsd: . -@prefix : . -@prefix sh: . -@prefix rdfs: . -@prefix dc: . -@prefix rdfs: . -`; - -const shapes = ` -${prefixes} -[] a sh:NodeShape; - sh:targetClass js:3DPoint; - sh:property [ - sh:datatype xsd:integer; - sh:path js:z; - sh:name "z"; - sh:maxCount 1; - ]. - -js:3DPoint rdfs:subClassOf js:Point. - -[] a sh:NodeShape; - sh:targetClass js:Point; - sh:property [ - sh:datatype xsd:integer; - sh:path js:x; - sh:name "x"; - sh:maxCount 1; - ], [ - sh:datatype xsd:integer; - sh:path js:y; - sh:name "y"; - sh:maxCount 1; - ]. - -js:JsProcessorShape a sh:NodeShape; - sh:targetClass js:JsProcess; - sh:property [ - sh:datatype xsd:string; - sh:path :required; - sh:name "required"; - sh:maxCount 1; - sh:minCount 1; - ], [ - sh:datatype xsd:string; - sh:path :multiple; - sh:name "multiple"; - ], [ - sh:datatype xsd:string; - sh:path :at_least; - sh:name "atLeast"; - sh:minCount 1; - ], [ - sh:path :point; - sh:class js:Point; - sh:name "point"; - sh:maxCount 1; - sh:minCount 1; - ]. -`; - -function parseQuads(inp: string): Quad[] { - return new Parser().parse(inp); -} - -describe("Shapes test", () => { - test("Parse shapes", () => { - const quads = parseQuads(shapes); - const output = extractShapes(quads); - expect(output.shapes.length).toBe(3); - }); - - test("Parse objects", () => { - const data = ` -${prefixes} - a js:JsProcess; - :required "true"; - :multiple "one!"; - :at_least "two!"; - :point [ - a js:Point; - js:x 5; - js:y 42; - ]. -`; - - const output = extractShapes(parseQuads(shapes)); - const quads = parseQuads(data); - const quad = quads.find((x) => x.predicate.equals(RDF.terms.type))!; - - const object = output.lenses[quad.object.value].execute({ - id: quad.subject, - quads, - }); - expect(object.required).toBe("true"); - expect(object.multiple).toEqual(["one!"]); - expect(object.atLeast).toEqual(["two!"]); - expect(object.point.x).toBe(5); - expect(object.point.y).toBe(42); - }); - - test("Invalid objects", () => { - const data = ` -${prefixes} - a js:JsProcess; - # :required "true"; - :multiple "one!"; - :at_least "two!"; - :point [ - a js:Point; - js:x 5; - js:y 42; - ]. -`; - const output = extractShapes(parseQuads(shapes)); - - const quads = parseQuads(data); - const quad = quads.find((x) => x.predicate.equals(RDF.terms.type))!; - - expect(() => - output.lenses[quad.object.value].execute({ - id: quad.subject, - quads, - }), - ).toThrow(); - }); - - test("Parse subclassed objects", () => { - const data = ` -${prefixes} - a js:JsProcess; - :required "true"; - :multiple "one!"; - :at_least "two!"; - :point [ - a js:3DPoint; - js:x 5; - js:y 42; - js:z 64; - ]. -`; - const output = extractShapes(parseQuads(shapes)); - - const quads = parseQuads(data); - const quad = quads.find((x) => x.predicate.equals(RDF.terms.type))!; - - const object = output.lenses[quad.object.value].execute({ - id: quad.subject, - quads, - }); - expect(object.point.z).toBe(64); - expect(object.point.x).toBe(5); - expect(object.point.y).toBe(42); - }); - - test("Parse objects without type", () => { - const data = ` -${prefixes} - a js:JsProcess; - :required "true"; - :multiple "one!"; - :at_least "two!"; - :point [ - js:x 5; - js:y 42; - ]. -`; - const output = extractShapes(parseQuads(shapes)); - - const quads = parseQuads(data); - const quad = quads.find((x) => x.predicate.equals(RDF.terms.type))!; - const object = output.lenses[quad.object.value].execute({ - id: quad.subject, - quads, - }); - - expect(object.point.x).toBe(5); - expect(object.point.y).toBe(42); - }); - - test("Parse fake subclassed objects fail", () => { - const data = ` -${prefixes} - a js:JsProcess; - :required "true"; - :multiple "one!"; - :at_least "two!"; - :point [ - a js:JsProcess; - :required "true"; - :multiple "one!"; - :at_least "two!"; - :point [ - js:x 5; - js:y 42; - ]; - ]. -`; - const output = extractShapes(parseQuads(shapes)); - - const quads = parseQuads(data); - const quad = quads.find((x) => x.predicate.equals(RDF.terms.type))!; - - expect(() => - output.lenses[quad.object.value].execute({ - id: quad.subject, - quads, - }), - ).toThrow(); - }); - - test("Empty list", () => { - const data = ` -${prefixes} - a js:JsProcess; - :required "true"; - :at_least "two!"; - :point [ - js:x 5; - js:y 42; - ]. -`; - const output = extractShapes(parseQuads(shapes)); - - const quads = parseQuads(data); - const quad = quads.find((x) => x.predicate.equals(RDF.terms.type))!; - const object = output.lenses[quad.object.value].execute({ - id: quad.subject, - quads, - }); - expect(object.multiple).toEqual([]); - }); - - test("Empty list fails", () => { - const data = ` -${prefixes} - a js:JsProcess; - :required "true"; - :point [ - js:x 5; - js:y 42; - ]. -`; - const output = extractShapes(parseQuads(shapes)); - - const quads = parseQuads(data); - const quad = quads.find((x) => x.predicate.equals(RDF.terms.type))!; - expect(() => - output.lenses[quad.object.value].execute({ - id: quad.subject, - quads, - }), - ).toThrow(); - }); - - test("Inverse path", () => { - const shapes = ` -${prefixes} -[] a sh:NodeShape; - sh:targetClass js:Point; - sh:property [ - sh:datatype xsd:string; - sh:path [ sh:inversePath js:x ]; - sh:name "x"; - sh:maxCount 1; - ], [ - sh:datatype xsd:string; - sh:path [ sh:inversePath ( js:x js:y ) ]; - sh:name "y"; - sh:maxCount 1; - ]. -`; - const data = ` -${prefixes} - a js:Point. - - js:x . - js:x [ js:y ]. -`; - const output = extractShapes(parseQuads(shapes)); - - const quads = parseQuads(data); - const quad = quads.find((x) => x.predicate.equals(RDF.terms.type))!; - const obj = output.lenses[quad.object.value].execute({ - id: quad.subject, - quads, - }); - expect(obj.x).toBe("x"); - expect(obj.y).toBe("y"); - }); -}); From 03beb9c7e05953fc1adb29823302b9d8a5d576ad Mon Sep 17 00:00:00 2001 From: ajuvercr Date: Mon, 8 Apr 2024 15:54:26 +0200 Subject: [PATCH 2/8] add gh action tests --- .github/workflows/test.yml | 19 +++++++++++++++++++ test/configuration.test.ts | 11 ----------- test/connectors/file.test.ts | 1 - test/connectors/http.test.ts | 1 - test/processors.test.ts | 7 ------- 5 files changed, 19 insertions(+), 20 deletions(-) create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..fa849ea --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,19 @@ +name: bun-test +on: + pull_request: + push: + branches: + - 'master' +jobs: + my-job: + name: bun-test + runs-on: ubuntu-latest + steps: + # ... + - uses: actions/checkout@v4 + - uses: oven-sh/setup-bun@v1 + + # run any `bun` or `bunx` command + - run: bun install + - run: bun test + diff --git a/test/configuration.test.ts b/test/configuration.test.ts index bafe28c..d8b2934 100644 --- a/test/configuration.test.ts +++ b/test/configuration.test.ts @@ -71,22 +71,11 @@ describe("Input test", () => { (x) => x.predicate.equals(RDF.terms.type) && x.object.equals(proc.ty), ) .map((x) => x.subject); - console.log( - "checking proc", - proc.ty.value, - subjects.map((x) => x.value), - ); const processorLens = config.lenses[proc.ty.value]; found.push( ...subjects.map((id) => processorLens.execute({ id, quads: quads })), ); } - - console.log( - config.shapes.map((x) => x.ty.value), - processors, - ); - console.log(found); }); }); diff --git a/test/connectors/file.test.ts b/test/connectors/file.test.ts index 1a6251a..40e7a48 100644 --- a/test/connectors/file.test.ts +++ b/test/connectors/file.test.ts @@ -40,7 +40,6 @@ describe("File Channel", () => { await sleep(300); expect(items.length).toBe(1); - console.log(items); expect(items[0].startsWith("Number 1")).toBeTruthy(); await writer.push("Number 2"); diff --git a/test/connectors/http.test.ts b/test/connectors/http.test.ts index 4bdd2c9..c46b5cd 100644 --- a/test/connectors/http.test.ts +++ b/test/connectors/http.test.ts @@ -65,7 +65,6 @@ describe("connector-http", () => { }); reader.data((data) => { - console.log("This reader works"); expect(Buffer.isBuffer(data)).toBeTruthy(); items.push(data.toString()); }); diff --git a/test/processors.test.ts b/test/processors.test.ts index 7e3ada8..edcba59 100644 --- a/test/processors.test.ts +++ b/test/processors.test.ts @@ -25,7 +25,6 @@ describe("test existing processors", () => { js:rescReader . `; const baseIRI = process.cwd() + "/config.ttl"; - console.log(baseIRI); const source: Source = { value, @@ -67,7 +66,6 @@ describe("test existing processors", () => { js:sendWriter . `; const baseIRI = process.cwd() + "/config.ttl"; - console.log(baseIRI); const source: Source = { value, @@ -114,7 +112,6 @@ describe("test existing processors", () => { js:sendWriter . `; const baseIRI = process.cwd() + "/config.ttl"; - console.log(baseIRI); const source: Source = { value, @@ -178,7 +175,6 @@ describe("test existing processors", () => { js:output . `; const baseIRI = process.cwd() + "/config.ttl"; - console.log(baseIRI); const source: Source = { value, @@ -197,11 +193,8 @@ describe("test existing processors", () => { const argss = extractSteps(proc!, quads, config); expect(argss.length).toBe(1); expect(argss[0].length).toBe(2); - console.log(argss); const [[reader, writer]] = argss; - console.log(reader.ty.value); - console.log(writer.ty.value); expect(reader).toBeInstanceOf(Object); expect(reader.config.channel).toBeDefined(); From 7703434c3dcc12481aef0033d9116e0f07d794d5 Mon Sep 17 00:00:00 2001 From: ajuvercr Date: Mon, 8 Apr 2024 16:17:33 +0200 Subject: [PATCH 3/8] move to DEBUG logging --- ontology.ttl | 12 ++++++++++++ package-lock.json | 17 +++++++++++++++++ package.json | 4 +++- src/connectors.ts | 4 ++++ src/index.ts | 4 +++- src/util.ts | 11 +++++++++++ test/connectors/file.test.ts | 3 +++ test/connectors/http.test.ts | 8 ++++++++ test/connectors/ws.test.ts | 3 +++ 9 files changed, 64 insertions(+), 2 deletions(-) diff --git a/ontology.ttl b/ontology.ttl index 83f4577..3b359e4 100644 --- a/ontology.ttl +++ b/ontology.ttl @@ -32,6 +32,12 @@ [ ] a sh:NodeShape; sh:targetClass :ReaderChannel; sh:property [ + sh:path ( ); + sh:name "id"; + sh:maxCount 1; + sh:minCount 1; + sh:datatype xsd:iri; + ], [ sh:path rdf:type; sh:name "ty"; sh:maxCount 1; @@ -47,6 +53,12 @@ [ ] a sh:NodeShape; sh:targetClass :WriterChannel; sh:property [ + sh:path ( ); + sh:name "id"; + sh:maxCount 1; + sh:minCount 1; + sh:datatype xsd:iri; + ], [ sh:path rdf:type; sh:name "ty"; sh:maxCount 1; diff --git a/package-lock.json b/package-lock.json index 97bfe86..7993a2f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@treecg/types": "^0.4.5", "command-line-args": "^5.2.1", "command-line-usage": "^6.1.3", + "debug": "^4.3.4", "kafkajs": "^2.2.4", "n3": "^1.17.1", "rdf-lens": "^1.2.3", @@ -27,6 +28,7 @@ "@knighted/duel": "^1.0.6", "@types/command-line-args": "^5.2.2", "@types/command-line-usage": "^5.0.3", + "@types/debug": "^4.1.12", "@types/n3": "^1.16.3", "@types/node": "^18.11.15", "@types/ws": "^8.5.8", @@ -1179,6 +1181,15 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.5", "license": "MIT" @@ -1212,6 +1223,12 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "dev": true + }, "node_modules/@types/n3": { "version": "1.16.4", "dev": true, diff --git a/package.json b/package.json index 767d33d..2ea685f 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "js-runner": "bin/bundle.mjs" }, "scripts": { - "build": "tsc && rollup ./dist/index.js --file ./dist/index.cjs --format cjs && bun build ./bin/js-runner.js --outfile bin/bundle.mjs --target node && npm run build:recompose", + "build": "tsc && rollup ./dist/index.js --file ./dist/index.cjs --format cjs && bun build --external debug ./bin/js-runner.js --outfile bin/bundle.mjs --target node && npm run build:recompose", "build:recompose": "sed -z 's/var __require = (id) => {\\n return import.meta.require(id);\\n};/import Module from \"node:module\";\\nconst __require = Module.createRequire(import.meta.url);/' -i bin/bundle.mjs", "watch": "tsc -w", "test": "bun test" @@ -32,6 +32,7 @@ "@treecg/types": "^0.4.5", "command-line-args": "^5.2.1", "command-line-usage": "^6.1.3", + "debug": "^4.3.4", "kafkajs": "^2.2.4", "n3": "^1.17.1", "rdf-lens": "^1.2.3", @@ -43,6 +44,7 @@ "@knighted/duel": "^1.0.6", "@types/command-line-args": "^5.2.2", "@types/command-line-usage": "^5.0.3", + "@types/debug": "^4.1.12", "@types/n3": "^1.16.3", "@types/node": "^18.11.15", "@types/ws": "^8.5.8", diff --git a/src/connectors.ts b/src/connectors.ts index 169c9f5..495f50b 100644 --- a/src/connectors.ts +++ b/src/connectors.ts @@ -29,6 +29,7 @@ import { startHttpStreamReader, startHttpStreamWriter, } from "./connectors/http"; +import { LOG } from "./util"; export * from "./connectors/http"; export const Conn = createTermNamespace( @@ -46,6 +47,7 @@ export const Conn = createTermNamespace( ); export interface Config { + id: Term; ty: NamedNode; config: T; } @@ -79,6 +81,7 @@ export class ChannelFactory { private jsChannelsBlankNodes: { [label: string]: SimpleStream } = {}; createReader(config: Config): Stream { + LOG.channel("Creating reader %s: a %s", config.id.value, config.ty.value); if (config.ty.equals(Conn.FileReaderChannel)) { const { reader, init } = startFileStreamReader(config.config); this.inits.push(init); @@ -135,6 +138,7 @@ export class ChannelFactory { } createWriter(config: Config): Writer { + LOG.channel("Creating writer %s: a %s", config.id.value, config.ty.value); if (config.ty.equals(Conn.FileWriterChannel)) { const { writer, init } = startFileStreamWriter( config.config, diff --git a/src/index.ts b/src/index.ts index 0a997de..a0890f1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,6 @@ import { Store } from "n3"; import { getArgs } from "./args"; -import { load_store } from "./util"; +import { load_store, LOG } from "./util"; export * from "./connectors"; @@ -112,6 +112,8 @@ export async function jsRunner() { shapes: config, } = await extractProcessors(source, apply); + LOG.main("Found %d processors", processors.length); + const starts = []; for (let proc of processors) { const argss = extractSteps(proc, quads, config); diff --git a/src/util.ts b/src/util.ts index c3b8d11..dff7b44 100644 --- a/src/util.ts +++ b/src/util.ts @@ -7,6 +7,16 @@ import { createUriAndTermNamespace } from "@treecg/types"; import { Source } from "."; import { Quad, Term } from "@rdfjs/types"; +import debug from "debug"; + +export const LOG = (function () { + const main = debug("js-runner"); + const channel = main.extend("channel"); + const util = main.extend("util"); + + return { main, channel, util }; +})(); + export function toArray(stream: stream.Readable): Promise { const output: T[] = []; return new Promise((res, rej) => { @@ -56,6 +66,7 @@ async function get_readstream(location: string): Promise { export async function load_quads(location: string, baseIRI?: string) { try { + LOG.util("Loading quads %s", location); const parser = new StreamParser({ baseIRI: baseIRI || location }); const rdfStream = await get_readstream(location); rdfStream.pipe(parser); diff --git a/test/connectors/file.test.ts b/test/connectors/file.test.ts index 40e7a48..062b07b 100644 --- a/test/connectors/file.test.ts +++ b/test/connectors/file.test.ts @@ -2,6 +2,7 @@ import { describe, expect, test } from "@jest/globals"; import { writeFile } from "fs/promises"; import { FileReaderConfig, FileWriterConfig } from "../../src/connectors/file"; import * as conn from "../../src/connectors"; +import { namedNode } from "../../src/util"; describe("File Channel", () => { test("Reader - Writer", async () => { @@ -23,6 +24,7 @@ describe("File Channel", () => { const reader = factory.createReader({ config, + id: namedNode("reader"), ty: conn.Conn.FileReaderChannel, }); expect(reader).toBeInstanceOf(conn.SimpleStream); @@ -33,6 +35,7 @@ describe("File Channel", () => { const writer = factory.createWriter({ config: writerConfig, + id: namedNode("writer"), ty: conn.Conn.FileWriterChannel, }); await factory.init(); diff --git a/test/connectors/http.test.ts b/test/connectors/http.test.ts index c46b5cd..bebace0 100644 --- a/test/connectors/http.test.ts +++ b/test/connectors/http.test.ts @@ -1,6 +1,7 @@ import { describe, expect, test } from "@jest/globals"; import * as conn from "../../src/connectors"; import { HttpReaderConfig, HttpWriterConfig } from "../../src/connectors/http"; +import { namedNode } from "../../src/util"; describe("connector-http", () => { test("Should write -> HTTP -> read (string)", async () => { @@ -17,10 +18,12 @@ describe("connector-http", () => { const factory = new conn.ChannelFactory(); const reader = factory.createReader({ config: readerConfig, + id: namedNode("reader"), ty: conn.Conn.HttpReaderChannel, }); const writer = factory.createWriter({ config: writerConfig, + id: namedNode("writer"), ty: conn.Conn.HttpWriterChannel, }); @@ -57,10 +60,12 @@ describe("connector-http", () => { const factory = new conn.ChannelFactory(); const reader = factory.createReader({ config: readerConfig, + id: namedNode("reader"), ty: conn.Conn.HttpReaderChannel, }); const writer = factory.createWriter({ config: writerConfig, + id: namedNode("writer"), ty: conn.Conn.HttpWriterChannel, }); @@ -98,10 +103,12 @@ describe("connector-http", () => { const factory = new conn.ChannelFactory(); const reader = factory.createReader({ config: readerConfig, + id: namedNode("reader"), ty: conn.Conn.HttpReaderChannel, }); const writer = factory.createWriter({ config: writerConfig, + id: namedNode("writer"), ty: conn.Conn.HttpWriterChannel, }); @@ -137,6 +144,7 @@ describe("connector-http", () => { const factory = new conn.ChannelFactory(); const reader = factory.createReader({ config: readerConfig, + id: namedNode("reader"), ty: conn.Conn.HttpReaderChannel, }); diff --git a/test/connectors/ws.test.ts b/test/connectors/ws.test.ts index 5369666..2dab162 100644 --- a/test/connectors/ws.test.ts +++ b/test/connectors/ws.test.ts @@ -1,6 +1,7 @@ import { describe, expect, test } from "@jest/globals"; import * as conn from "../../src/connectors"; import { WsReaderConfig, WsWriterConfig } from "../../src/connectors/ws"; +import { namedNode } from "../../src/util"; describe("connector-ws", () => { test("Should write -> WebSocket -> read", async () => { @@ -16,10 +17,12 @@ describe("connector-ws", () => { const factory = new conn.ChannelFactory(); const reader = factory.createReader({ config: readerConfig, + id: namedNode("reader"), ty: conn.Conn.WsReaderChannel, }); const writer = factory.createWriter({ config: writerConfig, + id: namedNode("writer"), ty: conn.Conn.WsWriterChannel, }); const items: unknown[] = []; From 729126c422bf7eaad5f309d7a9d33cb36126474a Mon Sep 17 00:00:00 2001 From: ajuvercr Date: Wed, 17 Apr 2024 13:34:19 +0200 Subject: [PATCH 4/8] bump dependencies --- bun.lockb | Bin 86450 -> 116273 bytes package-lock.json | 2 +- package.json | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bun.lockb b/bun.lockb index 484555599c0521c9796e6303a42b70aab18b651c..270ecfa8eecfc40dab430dbdadafcaa91be37c37 100755 GIT binary patch delta 35575 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 diff --git a/package-lock.json b/package-lock.json index 7993a2f..11c1475 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "debug": "^4.3.4", "kafkajs": "^2.2.4", "n3": "^1.17.1", - "rdf-lens": "^1.2.3", + "rdf-lens": "^1.2.5", "stream-to-array": "^2.3.0", "ws": "^8.14.2" }, diff --git a/package.json b/package.json index 2ea685f..f6ac43c 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "debug": "^4.3.4", "kafkajs": "^2.2.4", "n3": "^1.17.1", - "rdf-lens": "^1.2.3", + "rdf-lens": "^1.2.5", "stream-to-array": "^2.3.0", "ws": "^8.14.2" }, From 68f709e9913b101ad758d236c5ee4521079e8e31 Mon Sep 17 00:00:00 2001 From: ajuvercr Date: Thu, 25 Apr 2024 14:05:55 +0200 Subject: [PATCH 5/8] bump dependencies --- package-lock.json | 6 +++--- package.json | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 11c1475..143a46e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ajuvercr/js-runner", - "version": "0.1.20", + "version": "0.2.0-alpha.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ajuvercr/js-runner", - "version": "0.1.20", + "version": "0.2.0-alpha.1", "license": "MIT", "dependencies": { "@rdfjs/types": "^1.1.0", @@ -16,7 +16,7 @@ "debug": "^4.3.4", "kafkajs": "^2.2.4", "n3": "^1.17.1", - "rdf-lens": "^1.2.5", + "rdf-lens": "^1.2.6", "stream-to-array": "^2.3.0", "ws": "^8.14.2" }, diff --git a/package.json b/package.json index f6ac43c..6861056 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ajuvercr/js-runner", - "version": "0.1.20", + "version": "0.2.0-alpha.1", "type": "module", "exports": { "import": "./dist/index.js", @@ -35,7 +35,7 @@ "debug": "^4.3.4", "kafkajs": "^2.2.4", "n3": "^1.17.1", - "rdf-lens": "^1.2.5", + "rdf-lens": "^1.2.6", "stream-to-array": "^2.3.0", "ws": "^8.14.2" }, From 94312eb7b889a02a539282d4f25ad52085ba7495 Mon Sep 17 00:00:00 2001 From: ajuvercr Date: Thu, 25 Apr 2024 14:06:06 +0200 Subject: [PATCH 6/8] 0.2.0-alpha.2 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 143a46e..ba693d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ajuvercr/js-runner", - "version": "0.2.0-alpha.1", + "version": "0.2.0-alpha.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ajuvercr/js-runner", - "version": "0.2.0-alpha.1", + "version": "0.2.0-alpha.2", "license": "MIT", "dependencies": { "@rdfjs/types": "^1.1.0", diff --git a/package.json b/package.json index 6861056..84b6be0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ajuvercr/js-runner", - "version": "0.2.0-alpha.1", + "version": "0.2.0-alpha.2", "type": "module", "exports": { "import": "./dist/index.js", From 66832a03d4e3e2ce0699767972431af0fb40d21e Mon Sep 17 00:00:00 2001 From: ajuvercr Date: Wed, 15 May 2024 16:32:03 +0200 Subject: [PATCH 7/8] add configuration from template --- .eslintignore | 2 + .eslintrc.json | 24 ++ .github/dependabot.yml | 6 + .github/workflows/build-test.yml | 3 +- .../workflows/npm-publish-github-packages.yml | 35 ++ .gitignore | 180 ++++++++++- .husky/pre-commit | 1 + .lintstagedrc.json | 3 + .npmignore | 2 + .prettierignore | 2 + .prettierrc.json | 6 + LICENSE | 21 ++ package-lock.json | 17 +- package.json | 22 +- processors.ttl | 39 +++ test/configuration.test.ts | 125 ++++---- test/connectors/file.test.ts | 94 +++--- test/connectors/http.test.ts | 300 +++++++++--------- test/connectors/kafka.test.ts | 1 - test/connectors/ws.test.ts | 74 ++--- test/models.test.ts | 34 +- test/processors.test.ts | 288 ++++++++--------- tsconfig.json | 41 ++- vite.config.ts | 16 + 24 files changed, 860 insertions(+), 476 deletions(-) create mode 100644 .eslintignore create mode 100644 .eslintrc.json create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/npm-publish-github-packages.yml create mode 100644 .husky/pre-commit create mode 100644 .lintstagedrc.json create mode 100644 .npmignore create mode 100644 .prettierignore create mode 100644 .prettierrc.json create mode 100644 LICENSE create mode 100644 processors.ttl delete mode 100644 test/connectors/kafka.test.ts create mode 100644 vite.config.ts diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..3063f07 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +lib +node_modules diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..ac0d2f8 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,24 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "prettier" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "plugins": ["@typescript-eslint"], + "rules": { + "indent": ["error", 4], + "linebreak-style": ["error", "unix"], + "quotes": ["error", "double"], + "semi": ["error", "always"], + "@typescript-eslint/no-unused-vars": "warn" + } +} diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..9b580b8 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "daily" diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index 9a35336..90b9a6b 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -19,4 +19,5 @@ jobs: bun-version: latest - run: bun i # Install dependencies - - run: bun test # Run tests \ No newline at end of file + - run: bun test # Run tests + diff --git a/.github/workflows/npm-publish-github-packages.yml b/.github/workflows/npm-publish-github-packages.yml new file mode 100644 index 0000000..1042f67 --- /dev/null +++ b/.github/workflows/npm-publish-github-packages.yml @@ -0,0 +1,35 @@ +name: Node.js Package + +on: + workflow_dispatch: + release: + types: [created] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 20 + - run: npm ci + - run: npm run build + - run: npm run tests + + publish: + needs: build + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 20 + registry-url: https://npm.pkg.github.com/ + - run: npm ci + - run: npm publish + env: + NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/.gitignore b/.gitignore index 5c3ddef..15c871e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,180 @@ -node_modules + +bin/bundle.mjs +# Outputs lib + +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Caches + +.cache + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt dist -bin/bundle.mjs + +# Gatsby files + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..2312dc5 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +npx lint-staged diff --git a/.lintstagedrc.json b/.lintstagedrc.json new file mode 100644 index 0000000..5192d1e --- /dev/null +++ b/.lintstagedrc.json @@ -0,0 +1,3 @@ +{ + "*.ts": ["eslint --fix", "prettier --write"] +} diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..349c45f --- /dev/null +++ b/.npmignore @@ -0,0 +1,2 @@ +* +!lib diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..3063f07 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +lib +node_modules diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..2259cff --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,6 @@ +{ + "trailingComma": "all", + "tabWidth": 4, + "semi": true, + "singleQuote": false +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..85fbb03 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Jens Pots + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/package-lock.json b/package-lock.json index ba693d8..217f07d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "debug": "^4.3.4", "kafkajs": "^2.2.4", "n3": "^1.17.1", - "rdf-lens": "^1.2.6", + "rdf-lens": "^1.2.8", "stream-to-array": "^2.3.0", "ws": "^8.14.2" }, @@ -32,8 +32,21 @@ "@types/n3": "^1.16.3", "@types/node": "^18.11.15", "@types/ws": "^8.5.8", + "@typescript-eslint/eslint-plugin": "^7.5.0", + "@typescript-eslint/parser": "^7.4.0", + "@vitest/coverage-v8": "^1.4.0", + "dotenv": "^16.4.5", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "husky": "^9.0.11", + "lint-staged": "^15.2.2", + "prettier": "^3.2.5", "rollup": "^4.12.0", - "typescript": "^5.2.2" + "ts-node": "^10.9.2", + "tsc-alias": "^1.8.8", + "typescript": "^5.4.3", + "vite-tsconfig-paths": "^4.3.2", + "vitest": "^1.4.0" } }, "node_modules/@ampproject/remapping": { diff --git a/package.json b/package.json index 84b6be0..1660910 100644 --- a/package.json +++ b/package.json @@ -19,10 +19,11 @@ "js-runner": "bin/bundle.mjs" }, "scripts": { - "build": "tsc && rollup ./dist/index.js --file ./dist/index.cjs --format cjs && bun build --external debug ./bin/js-runner.js --outfile bin/bundle.mjs --target node && npm run build:recompose", + "build": "tsc && tsc-alias && rollup ./dist/index.js --file ./dist/index.cjs --format cjs && bun build --external debug ./bin/js-runner.js --outfile bin/bundle.mjs --target node && npm run build:recompose", "build:recompose": "sed -z 's/var __require = (id) => {\\n return import.meta.require(id);\\n};/import Module from \"node:module\";\\nconst __require = Module.createRequire(import.meta.url);/' -i bin/bundle.mjs", "watch": "tsc -w", - "test": "bun test" + "test": "vitest run --coverage --coverage.include src", + "prepare": "husky" }, "keywords": [], "author": "", @@ -35,7 +36,7 @@ "debug": "^4.3.4", "kafkajs": "^2.2.4", "n3": "^1.17.1", - "rdf-lens": "^1.2.6", + "rdf-lens": "^1.2.8", "stream-to-array": "^2.3.0", "ws": "^8.14.2" }, @@ -49,6 +50,19 @@ "@types/node": "^18.11.15", "@types/ws": "^8.5.8", "rollup": "^4.12.0", - "typescript": "^5.2.2" + "@typescript-eslint/eslint-plugin": "^7.5.0", + "@typescript-eslint/parser": "^7.4.0", + "@vitest/coverage-v8": "^1.4.0", + "dotenv": "^16.4.5", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "husky": "^9.0.11", + "lint-staged": "^15.2.2", + "prettier": "^3.2.5", + "ts-node": "^10.9.2", + "tsc-alias": "^1.8.8", + "typescript": "^5.4.3", + "vite-tsconfig-paths": "^4.3.2", + "vitest": "^1.4.0" } } diff --git a/processors.ttl b/processors.ttl new file mode 100644 index 0000000..38c01d6 --- /dev/null +++ b/processors.ttl @@ -0,0 +1,39 @@ +@prefix js: . +@prefix fno: . +@prefix fnom: . +@prefix xsd: . +@prefix : . +@prefix sh: . + +js:Log a js:JsProcess; + js:file <./lib/index.js>; + js:function "log"; + js:location <./>; + js:mapping [ + a fno:Mapping; + fno:parameterMapping [ + a fnom:PositionParameterMapping; + fnom:functionParameter "incoming"; + fnom:implementationParameterPosition "0"^^xsd:int; + ], [ + a fnom:PositionParameterMapping; + fnom:functionParameter "outgoing"; + fnom:implementationParameterPosition "1"^^xsd:int; + ]; + ]. + +[ ] a sh:NodeShape; + sh:targetClass js:Log; + sh:property [ + sh:class :ReaderChannel; + sh:path js:incoming; + sh:name "incoming"; + sh:maxCount 1; + sh:minCount 1; + ], [ + sh:class :WriterChannel; + sh:path js:outgoing; + sh:name "outgoing"; + sh:maxCount 1; + sh:minCount 1; + ]. diff --git a/test/configuration.test.ts b/test/configuration.test.ts index d8b2934..105733b 100644 --- a/test/configuration.test.ts +++ b/test/configuration.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "@jest/globals"; +import { describe, expect, test } from "vitest"; import { Quad } from "@rdfjs/types"; import { RDF } from "@treecg/types"; import { readFileSync } from "fs"; @@ -6,76 +6,83 @@ import { DataFactory, Parser } from "n3"; import { extractShapes } from "rdf-lens"; function parseQuads(inp: string): Quad[] { - return new Parser().parse(inp); + return new Parser().parse(inp); } function parseConfig() { - const file = readFileSync("./ontology.ttl", { encoding: "utf8" }); - const quads = parseQuads(file); - return extractShapes(quads); + const file = readFileSync("./ontology.ttl", { encoding: "utf8" }); + const quads = parseQuads(file); + return extractShapes(quads); } const JsProcessor = DataFactory.namedNode("https://w3id.org/conn/js#JsProcess"); describe("Input test", () => { - test("Parse configuration", () => { - const output = parseConfig(); - expect(output.shapes.length).toBe(8); - expect(output.lenses[JsProcessor.value]).toBeDefined(); - }); - - test("Parse processor config", () => { - const config = parseConfig(); - const processorFile = readFileSync("./processor/send.ttl", { - encoding: "utf8", + test("Parse configuration", () => { + const output = parseConfig(); + expect(output.shapes.length).toBe(8); + expect(output.lenses[JsProcessor.value]).toBeDefined(); }); - const quads = parseQuads(processorFile); - const quad = quads.find( - (x) => x.predicate.equals(RDF.terms.type) && x.object.equals(JsProcessor), - )!; - const object = config.lenses[quad.object.value].execute({ - id: quad.subject, - quads, - }); + test("Parse processor config", () => { + const config = parseConfig(); + const processorFile = readFileSync("./processor/send.ttl", { + encoding: "utf8", + }); + const quads = parseQuads(processorFile); - expect(object).toBeDefined(); - }); + const quad = quads.find( + (x) => + x.predicate.equals(RDF.terms.type) && + x.object.equals(JsProcessor), + )!; + const object = config.lenses[quad.object.value].execute({ + id: quad.subject, + quads, + }); - test("parse js-runner pipeline", () => { - const parse = (location: string) => - parseQuads(readFileSync(location, { encoding: "utf8" })); - const files = [ - "./ontology.ttl", - "./processor/send.ttl", - "./processor/resc.ttl", - "./input.ttl", - ]; - const quads = files.flatMap(parse); - const config = extractShapes(quads); + expect(object).toBeDefined(); + }); - const subjects = quads - .filter( - (x) => - x.predicate.equals(RDF.terms.type) && x.object.equals(JsProcessor), - ) - .map((x) => x.subject); - const processorLens = config.lenses[JsProcessor.value]; - const processors = subjects.map((id) => - processorLens.execute({ id, quads: quads }), - ); + test("parse js-runner pipeline", () => { + const parse = (location: string) => + parseQuads(readFileSync(location, { encoding: "utf8" })); + const files = [ + "./ontology.ttl", + "./processor/send.ttl", + "./processor/resc.ttl", + "./input.ttl", + ]; + const quads = files.flatMap(parse); + const config = extractShapes(quads); - const found: any[] = []; - for (let proc of processors) { - const subjects = quads - .filter( - (x) => x.predicate.equals(RDF.terms.type) && x.object.equals(proc.ty), - ) - .map((x) => x.subject); - const processorLens = config.lenses[proc.ty.value]; + const subjects = quads + .filter( + (x) => + x.predicate.equals(RDF.terms.type) && + x.object.equals(JsProcessor), + ) + .map((x) => x.subject); + const processorLens = config.lenses[JsProcessor.value]; + const processors = subjects.map((id) => + processorLens.execute({ id, quads: quads }), + ); - found.push( - ...subjects.map((id) => processorLens.execute({ id, quads: quads })), - ); - } - }); + const found: unknown[] = []; + for (const proc of processors) { + const subjects = quads + .filter( + (x) => + x.predicate.equals(RDF.terms.type) && + x.object.equals(proc.ty), + ) + .map((x) => x.subject); + const processorLens = config.lenses[proc.ty.value]; + + found.push( + ...subjects.map((id) => + processorLens.execute({ id, quads: quads }), + ), + ); + } + }); }); diff --git a/test/connectors/file.test.ts b/test/connectors/file.test.ts index 062b07b..93fe95e 100644 --- a/test/connectors/file.test.ts +++ b/test/connectors/file.test.ts @@ -1,58 +1,58 @@ -import { describe, expect, test } from "@jest/globals"; +import { describe, expect, test } from "vitest"; import { writeFile } from "fs/promises"; import { FileReaderConfig, FileWriterConfig } from "../../src/connectors/file"; import * as conn from "../../src/connectors"; import { namedNode } from "../../src/util"; describe("File Channel", () => { - test("Reader - Writer", async () => { - const config: FileReaderConfig = { - path: "/tmp/test.txt", - onReplace: true, - encoding: "utf-8", - }; - const writerConfig: FileWriterConfig = { - path: "/tmp/test.txt", - onReplace: true, - encoding: "utf-8", - }; - - await writeFile("/tmp/test.txt", ""); - - const factory = new conn.ChannelFactory(); - const items: string[] = []; - - const reader = factory.createReader({ - config, - id: namedNode("reader"), - ty: conn.Conn.FileReaderChannel, + test("Reader - Writer", async () => { + const config: FileReaderConfig = { + path: "/tmp/test.txt", + onReplace: true, + encoding: "utf-8", + }; + const writerConfig: FileWriterConfig = { + path: "/tmp/test.txt", + onReplace: true, + encoding: "utf-8", + }; + + await writeFile("/tmp/test.txt", ""); + + const factory = new conn.ChannelFactory(); + const items: string[] = []; + + const reader = factory.createReader({ + config, + id: namedNode("reader"), + ty: conn.Conn.FileReaderChannel, + }); + expect(reader).toBeInstanceOf(conn.SimpleStream); + + reader.data((x) => { + items.push(x); + }); + + const writer = factory.createWriter({ + config: writerConfig, + id: namedNode("writer"), + ty: conn.Conn.FileWriterChannel, + }); + await factory.init(); + await writer.push("Number 1 " + Math.random()); + + await sleep(300); + expect(items.length).toBe(1); + expect(items[0].startsWith("Number 1")).toBeTruthy(); + + await writer.push("Number 2"); + + await sleep(300); + expect(items.length).toBe(2); + expect(items[1]).toBe("Number 2"); }); - expect(reader).toBeInstanceOf(conn.SimpleStream); - - reader.data((x) => { - items.push(x); - }); - - const writer = factory.createWriter({ - config: writerConfig, - id: namedNode("writer"), - ty: conn.Conn.FileWriterChannel, - }); - await factory.init(); - await writer.push("Number 1 " + Math.random()); - - await sleep(300); - expect(items.length).toBe(1); - expect(items[0].startsWith("Number 1")).toBeTruthy(); - - await writer.push("Number 2"); - - await sleep(300); - expect(items.length).toBe(2); - expect(items[1]).toBe("Number 2"); - }); }); function sleep(x: number): Promise { - return new Promise((resolve) => setTimeout(resolve, x)); + return new Promise((resolve) => setTimeout(resolve, x)); } diff --git a/test/connectors/http.test.ts b/test/connectors/http.test.ts index bebace0..fa4c864 100644 --- a/test/connectors/http.test.ts +++ b/test/connectors/http.test.ts @@ -1,173 +1,173 @@ -import { describe, expect, test } from "@jest/globals"; +import { describe, expect, test } from "vitest"; import * as conn from "../../src/connectors"; import { HttpReaderConfig, HttpWriterConfig } from "../../src/connectors/http"; import { namedNode } from "../../src/util"; describe("connector-http", () => { - test("Should write -> HTTP -> read (string)", async () => { - const readerConfig: HttpReaderConfig = { - endpoint: "localhost", - port: 8080, - binary: false, - }; - const writerConfig: HttpWriterConfig = { - endpoint: "http://localhost:8080", - method: "POST", - }; - - const factory = new conn.ChannelFactory(); - const reader = factory.createReader({ - config: readerConfig, - id: namedNode("reader"), - ty: conn.Conn.HttpReaderChannel, - }); - const writer = factory.createWriter({ - config: writerConfig, - id: namedNode("writer"), - ty: conn.Conn.HttpWriterChannel, - }); - - reader.data((data) => { - items.push(data); - }); - - await factory.init(); - - const items: unknown[] = []; - - await writer.push("test1"); - await sleep(200); - await writer.push("test2"); - await sleep(200); - - expect(items).toEqual(["test1", "test2"]); - - await Promise.all([reader.end(), writer.end()]); - }); - - test("Should write -> HTTP -> read (Buffer)", async () => { - const readerConfig: HttpReaderConfig = { - endpoint: "localhost", - port: 8081, - binary: true, - waitHandled: false, - }; - const writerConfig: HttpWriterConfig = { - endpoint: "http://localhost:8081", - method: "POST", - }; - - const factory = new conn.ChannelFactory(); - const reader = factory.createReader({ - config: readerConfig, - id: namedNode("reader"), - ty: conn.Conn.HttpReaderChannel, - }); - const writer = factory.createWriter({ - config: writerConfig, - id: namedNode("writer"), - ty: conn.Conn.HttpWriterChannel, - }); - - reader.data((data) => { - expect(Buffer.isBuffer(data)).toBeTruthy(); - items.push(data.toString()); + test("Should write -> HTTP -> read (string)", async () => { + const readerConfig: HttpReaderConfig = { + endpoint: "localhost", + port: 8080, + binary: false, + }; + const writerConfig: HttpWriterConfig = { + endpoint: "http://localhost:8080", + method: "POST", + }; + + const factory = new conn.ChannelFactory(); + const reader = factory.createReader({ + config: readerConfig, + id: namedNode("reader"), + ty: conn.Conn.HttpReaderChannel, + }); + const writer = factory.createWriter({ + config: writerConfig, + id: namedNode("writer"), + ty: conn.Conn.HttpWriterChannel, + }); + + reader.data((data) => { + items.push(data); + }); + + await factory.init(); + + const items: unknown[] = []; + + await writer.push("test1"); + await sleep(200); + await writer.push("test2"); + await sleep(200); + + expect(items).toEqual(["test1", "test2"]); + + await Promise.all([reader.end(), writer.end()]); }); - await factory.init(); - - const items: unknown[] = []; - - await writer.push(Buffer.from("test1", "utf8")); - await sleep(200); - await writer.push(Buffer.from("test2", "utf8")); - await sleep(200); - - expect(items).toEqual(["test1", "test2"]); - - await Promise.all([reader.end(), writer.end()]); - }); - - test("Should write -> HTTP -> read (Buffer) and await response", async () => { - const readerConfig: HttpReaderConfig = { - endpoint: "localhost", - port: 8082, - binary: true, - waitHandled: true, - }; - const writerConfig: HttpWriterConfig = { - endpoint: "http://localhost:8082", - method: "POST", - }; - - const factory = new conn.ChannelFactory(); - const reader = factory.createReader({ - config: readerConfig, - id: namedNode("reader"), - ty: conn.Conn.HttpReaderChannel, - }); - const writer = factory.createWriter({ - config: writerConfig, - id: namedNode("writer"), - ty: conn.Conn.HttpWriterChannel, + test("Should write -> HTTP -> read (Buffer)", async () => { + const readerConfig: HttpReaderConfig = { + endpoint: "localhost", + port: 8081, + binary: true, + waitHandled: false, + }; + const writerConfig: HttpWriterConfig = { + endpoint: "http://localhost:8081", + method: "POST", + }; + + const factory = new conn.ChannelFactory(); + const reader = factory.createReader({ + config: readerConfig, + id: namedNode("reader"), + ty: conn.Conn.HttpReaderChannel, + }); + const writer = factory.createWriter({ + config: writerConfig, + id: namedNode("writer"), + ty: conn.Conn.HttpWriterChannel, + }); + + reader.data((data) => { + expect(Buffer.isBuffer(data)).toBeTruthy(); + items.push(data.toString()); + }); + + await factory.init(); + + const items: unknown[] = []; + + await writer.push(Buffer.from("test1", "utf8")); + await sleep(200); + await writer.push(Buffer.from("test2", "utf8")); + await sleep(200); + + expect(items).toEqual(["test1", "test2"]); + + await Promise.all([reader.end(), writer.end()]); }); - reader.data(async (data) => { - expect(Buffer.isBuffer(data)).toBeTruthy(); - items.push(data.toString()); - await sleep(1500); + test("Should write -> HTTP -> read (Buffer) and await response", async () => { + const readerConfig: HttpReaderConfig = { + endpoint: "localhost", + port: 8082, + binary: true, + waitHandled: true, + }; + const writerConfig: HttpWriterConfig = { + endpoint: "http://localhost:8082", + method: "POST", + }; + + const factory = new conn.ChannelFactory(); + const reader = factory.createReader({ + config: readerConfig, + id: namedNode("reader"), + ty: conn.Conn.HttpReaderChannel, + }); + const writer = factory.createWriter({ + config: writerConfig, + id: namedNode("writer"), + ty: conn.Conn.HttpWriterChannel, + }); + + reader.data(async (data) => { + expect(Buffer.isBuffer(data)).toBeTruthy(); + items.push(data.toString()); + await sleep(1500); + }); + + await factory.init(); + + const items: unknown[] = []; + + const start = new Date().getTime(); + await writer.push(Buffer.from("test1", "utf8")); + const end = new Date().getTime(); + await sleep(200); + + expect(end - start > 1000).toBeTruthy(); + expect(items).toEqual(["test1"]); + + await Promise.all([reader.end(), writer.end()]); }); - await factory.init(); - - const items: unknown[] = []; - - const start = new Date().getTime(); - await writer.push(Buffer.from("test1", "utf8")); - const end = new Date().getTime(); - await sleep(200); - - expect(end - start > 1000).toBeTruthy(); - expect(items).toEqual(["test1"]); + test("http channel uses correct response code", async () => { + const readerConfig: HttpReaderConfig = { + endpoint: "localhost", + port: 8083, + binary: false, + responseCode: 202, + }; - await Promise.all([reader.end(), writer.end()]); - }); + const factory = new conn.ChannelFactory(); + const reader = factory.createReader({ + config: readerConfig, + id: namedNode("reader"), + ty: conn.Conn.HttpReaderChannel, + }); - test("http channel uses correct response code", async () => { - const readerConfig: HttpReaderConfig = { - endpoint: "localhost", - port: 8083, - binary: false, - responseCode: 202, - }; + reader.data((data) => { + items.push(data); + }); - const factory = new conn.ChannelFactory(); - const reader = factory.createReader({ - config: readerConfig, - id: namedNode("reader"), - ty: conn.Conn.HttpReaderChannel, - }); + await factory.init(); - reader.data((data) => { - items.push(data); - }); + const items: unknown[] = []; - await factory.init(); + const resp = await fetch("http://localhost:8083", { + body: "test1", + method: "PUT", + }); - const items: unknown[] = []; + expect(items).toEqual(["test1"]); + expect(resp.status).toEqual(202); - const resp = await fetch("http://localhost:8083", { - body: "test1", - method: "PUT", + await Promise.all([reader.end()]); }); - - expect(items).toEqual(["test1"]); - expect(resp.status).toEqual(202); - - await Promise.all([reader.end()]); - }); }); function sleep(x: number): Promise { - return new Promise((resolve) => setTimeout(resolve, x)); + return new Promise((resolve) => setTimeout(resolve, x)); } diff --git a/test/connectors/kafka.test.ts b/test/connectors/kafka.test.ts deleted file mode 100644 index 0ffdd02..0000000 --- a/test/connectors/kafka.test.ts +++ /dev/null @@ -1 +0,0 @@ -// TODO \ No newline at end of file diff --git a/test/connectors/ws.test.ts b/test/connectors/ws.test.ts index 2dab162..07bbbe9 100644 --- a/test/connectors/ws.test.ts +++ b/test/connectors/ws.test.ts @@ -1,47 +1,47 @@ -import { describe, expect, test } from "@jest/globals"; +import { describe, expect, test } from "vitest"; import * as conn from "../../src/connectors"; import { WsReaderConfig, WsWriterConfig } from "../../src/connectors/ws"; import { namedNode } from "../../src/util"; describe("connector-ws", () => { - test("Should write -> WebSocket -> read", async () => { - const readerConfig: WsReaderConfig = { - host: "0.0.0.0", - port: 8123, - }; - - const writerConfig: WsWriterConfig = { - url: "ws://127.0.0.1:8123", - }; - - const factory = new conn.ChannelFactory(); - const reader = factory.createReader({ - config: readerConfig, - id: namedNode("reader"), - ty: conn.Conn.WsReaderChannel, + test("Should write -> WebSocket -> read", async () => { + const readerConfig: WsReaderConfig = { + host: "0.0.0.0", + port: 8123, + }; + + const writerConfig: WsWriterConfig = { + url: "ws://127.0.0.1:8123", + }; + + const factory = new conn.ChannelFactory(); + const reader = factory.createReader({ + config: readerConfig, + id: namedNode("reader"), + ty: conn.Conn.WsReaderChannel, + }); + const writer = factory.createWriter({ + config: writerConfig, + id: namedNode("writer"), + ty: conn.Conn.WsWriterChannel, + }); + const items: unknown[] = []; + reader.data((x) => { + items.push(x); + }); + + await factory.init(); + + await writer.push("test1"); + await writer.push("test2"); + await sleep(200); + + expect(items).toEqual(["test1", "test2"]); + + await Promise.all([writer.end(), reader.end()]); }); - const writer = factory.createWriter({ - config: writerConfig, - id: namedNode("writer"), - ty: conn.Conn.WsWriterChannel, - }); - const items: unknown[] = []; - reader.data((x) => { - items.push(x); - }); - - await factory.init(); - - await writer.push("test1"); - await writer.push("test2"); - await sleep(200); - - expect(items).toEqual(["test1", "test2"]); - - await Promise.all([writer.end(), reader.end()]); - }); }); function sleep(x: number): Promise { - return new Promise((resolve) => setTimeout(resolve, x)); + return new Promise((resolve) => setTimeout(resolve, x)); } diff --git a/test/models.test.ts b/test/models.test.ts index 20d1cf0..06c8027 100644 --- a/test/models.test.ts +++ b/test/models.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "@jest/globals"; +import { describe, expect, test } from "vitest"; const prefixes = ` @prefix js: . @@ -10,8 +10,8 @@ const prefixes = ` `; describe("Processor Lens", () => { - test("Parse full config", () => { - const turtle = ` + test("Parse full config", () => { + const turtle = ` ${prefixes} js:Echo a js:JsProcess; @@ -43,19 +43,19 @@ js:Echo a js:JsProcess; sh:name "Output Channel" ]. `; - // const quads = new Parser().parse(turtle); - // - // const lens = subjects().then(unique()).asMulti().thenSome(ProcessorLens) - // const out = lens.execute(quads); - // - // expect(out.length).toBe(1); - // expect(out[0].id).toEqual("https://w3id.org/conn/js#Echo"); - // expect(out[0].mappings.length).toBe(2); - // expect(out[0].shape).toBeInstanceOf(BasicLens); - }); + // const quads = new Parser().parse(turtle); + // + // const lens = subjects().then(unique()).asMulti().thenSome(ProcessorLens) + // const out = lens.execute(quads); + // + // expect(out.length).toBe(1); + // expect(out[0].id).toEqual("https://w3id.org/conn/js#Echo"); + // expect(out[0].mappings.length).toBe(2); + // expect(out[0].shape).toBeInstanceOf(BasicLens); + }); - test("2 + 2 = 4", () => { - const four = 2 + 2; - expect(four).toBe(4); - }); + test("2 + 2 = 4", () => { + const four = 2 + 2; + expect(four).toBe(4); + }); }); diff --git a/test/processors.test.ts b/test/processors.test.ts index edcba59..0aa89cb 100644 --- a/test/processors.test.ts +++ b/test/processors.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "@jest/globals"; +import { describe, expect, test } from "vitest"; import { extractProcessors, extractSteps, Source } from "../src/index"; const prefixes = ` @prefix js: . @@ -13,8 +13,8 @@ const prefixes = ` const JS = "https://w3id.org/conn/js#"; describe("test existing processors", () => { - test("resc.ttl", async () => { - const value = `${prefixes} + test("resc.ttl", async () => { + const value = `${prefixes} <> owl:imports <./ontology.ttl>, <./processor/resc.ttl>. [ ] a :Channel; @@ -24,36 +24,36 @@ describe("test existing processors", () => { [ ] a js:Resc; js:rescReader . `; - const baseIRI = process.cwd() + "/config.ttl"; - - const source: Source = { - value, - baseIRI, - type: "memory", - }; - - const { - processors, - quads, - shapes: config, - } = await extractProcessors(source); - - const proc = processors.find((x) => x.ty.value === JS + "Resc"); - expect(proc).toBeDefined(); - - const argss = extractSteps(proc!, quads, config); - expect(argss.length).toBe(1); - expect(argss[0].length).toBe(1); - - const [[arg]] = argss; - expect(arg).toBeInstanceOf(Object); - expect(arg.config.channel).toBeDefined(); - expect(arg.config.channel.id).toBeDefined(); - expect(arg.ty).toBeDefined(); - }); - - test("send.ttl", async () => { - const value = `${prefixes} + const baseIRI = process.cwd() + "/config.ttl"; + + const source: Source = { + value, + baseIRI, + type: "memory", + }; + + const { + processors, + quads, + shapes: config, + } = await extractProcessors(source); + + const proc = processors.find((x) => x.ty.value === JS + "Resc"); + expect(proc).toBeDefined(); + + const argss = extractSteps(proc!, quads, config); + expect(argss.length).toBe(1); + expect(argss[0].length).toBe(1); + + const [[arg]] = argss; + expect(arg).toBeInstanceOf(Object); + expect(arg.config.channel).toBeDefined(); + expect(arg.config.channel.id).toBeDefined(); + expect(arg.ty).toBeDefined(); + }); + + test("send.ttl", async () => { + const value = `${prefixes} <> owl:imports <./ontology.ttl>, <./processor/send.ttl> . [ ] a :Channel; @@ -65,37 +65,37 @@ describe("test existing processors", () => { js:msg "Hello world!"; js:sendWriter . `; - const baseIRI = process.cwd() + "/config.ttl"; - - const source: Source = { - value, - baseIRI, - type: "memory", - }; - - const { - processors, - quads, - shapes: config, - } = await extractProcessors(source); - - const proc = processors.find((x) => x.ty.value === JS + "Send"); - expect(proc).toBeDefined(); - - const argss = extractSteps(proc!, quads, config); - expect(argss.length).toBe(1); - expect(argss[0].length).toBe(2); - - const [[msg, writer]] = argss; - expect(msg).toBe("Hello world!"); - expect(writer).toBeInstanceOf(Object); - expect(writer.config.channel).toBeDefined(); - expect(writer.config.channel.id).toBeDefined(); - expect(writer.ty).toBeDefined(); - }); - - describe("send.ttl from env", async () => { - const value = `${prefixes} + const baseIRI = process.cwd() + "/config.ttl"; + + const source: Source = { + value, + baseIRI, + type: "memory", + }; + + const { + processors, + quads, + shapes: config, + } = await extractProcessors(source); + + const proc = processors.find((x) => x.ty.value === JS + "Send"); + expect(proc).toBeDefined(); + + const argss = extractSteps(proc!, quads, config); + expect(argss.length).toBe(1); + expect(argss[0].length).toBe(2); + + const [[msg, writer]] = argss; + expect(msg).toBe("Hello world!"); + expect(writer).toBeInstanceOf(Object); + expect(writer.config.channel).toBeDefined(); + expect(writer.config.channel.id).toBeDefined(); + expect(writer.ty).toBeDefined(); + }); + + describe("send.ttl from env", async () => { + const value = `${prefixes} <> owl:imports <./ontology.ttl>, <./processor/send.ttl> . [ ] a :Channel; @@ -111,56 +111,56 @@ describe("test existing processors", () => { ]; js:sendWriter . `; - const baseIRI = process.cwd() + "/config.ttl"; - - const source: Source = { - value, - baseIRI, - type: "memory", - }; - - const { - processors, - quads, - shapes: config, - } = await extractProcessors(source); - - test("Env default value", () => { - const proc = processors.find((x) => x.ty.value === JS + "Send"); - expect(proc).toBeDefined(); - - const argss = extractSteps(proc!, quads, config); - expect(argss.length).toBe(1); - expect(argss[0].length).toBe(2); - - const [[msg, writer]] = argss; - expect(msg).toBe("FromEnv"); - expect(writer).toBeInstanceOf(Object); - expect(writer.config.channel).toBeDefined(); - expect(writer.config.channel.id).toBeDefined(); - expect(writer.ty).toBeDefined(); + const baseIRI = process.cwd() + "/config.ttl"; + + const source: Source = { + value, + baseIRI, + type: "memory", + }; + + const { + processors, + quads, + shapes: config, + } = await extractProcessors(source); + + test("Env default value", () => { + const proc = processors.find((x) => x.ty.value === JS + "Send"); + expect(proc).toBeDefined(); + + const argss = extractSteps(proc!, quads, config); + expect(argss.length).toBe(1); + expect(argss[0].length).toBe(2); + + const [[msg, writer]] = argss; + expect(msg).toBe("FromEnv"); + expect(writer).toBeInstanceOf(Object); + expect(writer.config.channel).toBeDefined(); + expect(writer.config.channel.id).toBeDefined(); + expect(writer.ty).toBeDefined(); + }); + + test("Env value", () => { + process.env["msg"] = "FROM ENV"; + const proc = processors.find((x) => x.ty.value === JS + "Send"); + expect(proc).toBeDefined(); + + const argss = extractSteps(proc!, quads, config); + expect(argss.length).toBe(1); + expect(argss[0].length).toBe(2); + + const [[msg, writer]] = argss; + expect(msg).toBe("FROM ENV"); + expect(writer).toBeInstanceOf(Object); + expect(writer.config.channel).toBeDefined(); + expect(writer.config.channel.id).toBeDefined(); + expect(writer.ty).toBeDefined(); + }); }); - test("Env value", () => { - process.env["msg"] = "FROM ENV"; - const proc = processors.find((x) => x.ty.value === JS + "Send"); - expect(proc).toBeDefined(); - - const argss = extractSteps(proc!, quads, config); - expect(argss.length).toBe(1); - expect(argss[0].length).toBe(2); - - const [[msg, writer]] = argss; - expect(msg).toBe("FROM ENV"); - expect(writer).toBeInstanceOf(Object); - expect(writer.config.channel).toBeDefined(); - expect(writer.config.channel.id).toBeDefined(); - expect(writer.ty).toBeDefined(); - }); - }); - - test("echo.ttl", async () => { - const value = `${prefixes} + test("echo.ttl", async () => { + const value = `${prefixes} <> owl:imports <./ontology.ttl>, <./processor/echo.ttl> . [ ] a :Channel; @@ -174,36 +174,36 @@ describe("test existing processors", () => { js:input ; js:output . `; - const baseIRI = process.cwd() + "/config.ttl"; - - const source: Source = { - value, - baseIRI, - type: "memory", - }; - - const { - processors, - quads, - shapes: config, - } = await extractProcessors(source); - - const proc = processors.find((x) => x.ty.value === JS + "Echo"); - expect(proc).toBeDefined(); - const argss = extractSteps(proc!, quads, config); - expect(argss.length).toBe(1); - expect(argss[0].length).toBe(2); - - const [[reader, writer]] = argss; - - expect(reader).toBeInstanceOf(Object); - expect(reader.config.channel).toBeDefined(); - expect(reader.config.channel.id).toBeDefined(); - expect(reader.ty).toBeDefined(); - - expect(writer).toBeInstanceOf(Object); - expect(writer.config.channel).toBeDefined(); - expect(writer.config.channel.id).toBeDefined(); - expect(writer.ty).toBeDefined(); - }); + const baseIRI = process.cwd() + "/config.ttl"; + + const source: Source = { + value, + baseIRI, + type: "memory", + }; + + const { + processors, + quads, + shapes: config, + } = await extractProcessors(source); + + const proc = processors.find((x) => x.ty.value === JS + "Echo"); + expect(proc).toBeDefined(); + const argss = extractSteps(proc!, quads, config); + expect(argss.length).toBe(1); + expect(argss[0].length).toBe(2); + + const [[reader, writer]] = argss; + + expect(reader).toBeInstanceOf(Object); + expect(reader.config.channel).toBeDefined(); + expect(reader.config.channel.id).toBeDefined(); + expect(reader.ty).toBeDefined(); + + expect(writer).toBeInstanceOf(Object); + expect(writer.config.channel).toBeDefined(); + expect(writer.config.channel.id).toBeDefined(); + expect(writer.ty).toBeDefined(); + }); }); diff --git a/tsconfig.json b/tsconfig.json index 3921413..4010bc1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,21 +1,38 @@ { "compilerOptions": { - // Generate d.ts files "declaration": true, + "outDir": "dist/", + "lib": [ + "ES2022" + ], + "target": "ES2022", + "module": "ES2022", "moduleResolution": "node", - "target": "esnext", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ - /* Modules */ - "module": "esnext", /* Specify what module code is generated. */ - "outDir": "./dist", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ - "rootDir": "./src", /* Specify an output folder for all emitted files. */ - "sourceMap": true, - "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ - "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ - // "emitDeclarationOnly": true, - "strict": true /* Enable all strict type-checking options. */ + "preserveConstEnums": true, + "downlevelIteration": true, + "skipLibCheck": true, + "strict": true, + "strictFunctionTypes": false, + "strictPropertyInitialization": false, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "incremental": true, + "esModuleInterop": true, + "removeComments": true }, + "ts-node": { + "esm": true, + "experimentalSpecifierResolution": "node" + }, + "tsc-alias": { + "resolveFullPaths": true, + "verbose": false + }, + "include": [ + "src/**/*" + ], "exclude": [ - "test/**/*.ts", + "node_modules/**/*", "dist/**/*" ] } diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..7d5ca2f --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from "vitest/config"; +import tsconfigPaths from "vite-tsconfig-paths"; + +export default defineConfig({ + plugins: [tsconfigPaths()], + test: { + deps: { + optimizer: { + ssr: { + enabled: true, + include: ["@ajuvercr/js-runner"], + }, + }, + }, + }, +}); From 03d034ae994fdf917d3709556a9598750a310eea Mon Sep 17 00:00:00 2001 From: ajuvercr Date: Wed, 15 May 2024 16:36:14 +0200 Subject: [PATCH 8/8] 0.2.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 217f07d..f8247d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ajuvercr/js-runner", - "version": "0.2.0-alpha.2", + "version": "0.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ajuvercr/js-runner", - "version": "0.2.0-alpha.2", + "version": "0.2.0", "license": "MIT", "dependencies": { "@rdfjs/types": "^1.1.0", diff --git a/package.json b/package.json index 1660910..12f806a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ajuvercr/js-runner", - "version": "0.2.0-alpha.2", + "version": "0.2.0", "type": "module", "exports": { "import": "./dist/index.js",