From e949377435f21eeb570edadef22374e35b3b41e8 Mon Sep 17 00:00:00 2001 From: Zach Date: Thu, 21 Mar 2024 12:50:14 -0500 Subject: [PATCH 01/19] shaky fix for issue#1692 --- lib/handlers/put.js | 28 ++++++++++++++++++++++++++++ package.json | 1 + test/integration/http-test.js | 19 ++++++++++++++++++- test/resources/foo/bar.acl/test.ttl | 0 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 test/resources/foo/bar.acl/test.ttl diff --git a/lib/handlers/put.js b/lib/handlers/put.js index 740bf346a..a85a56a06 100644 --- a/lib/handlers/put.js +++ b/lib/handlers/put.js @@ -6,12 +6,40 @@ const getContentType = require('../utils').getContentType const HTTPError = require('../http-error') const { stringToStream } = require('../utils') +// TODO: ask alain a better way to get the suffix variables here +const RESERVED_SUFFIXES = ['.acl', '.meta'] + +/** + * This function is used to make sure a resource or container which contains + * reserved suffixes for auxiliary documents cannot be created. + * @param {string} path - the uri to check for invalid suffixes + * @returns {boolean} true is fail - if the path contains reserved suffixes + */ +function containsInvalidSuffixes (path) { + // if it is a container, no suffix so remove last slash + if (path.endsWith('/')) { + path = path.slice(0, -1) + } else { + // this is a resource, so it either ends with an extension, or just text + const lastFullStop = path.lastIndexOf('.') + if (lastFullStop !== -1) { // contains at least one full stop + path = path.slice(0, lastFullStop) + } + } + return RESERVED_SUFFIXES.some(suffix => path.includes(suffix)) +} + async function handler (req, res, next) { debug(req.originalUrl) // deprecated kept for compatibility res.header('MS-Author-Via', 'SPARQL') // is this needed ? const contentType = req.get('content-type') + // make sure the resource being created does not attempt invalid resource creation + if (containsInvalidSuffixes(req.url)) { + next(new HTTPError(400, `${req.url} contained reserved suffixes in path`)) + } + // check whether a folder or resource with same name exists try { const ldp = req.app.locals.ldp diff --git a/package.json b/package.json index 54a9041da..517b612d3 100644 --- a/package.json +++ b/package.json @@ -146,6 +146,7 @@ "validate": "node ./test/validate-turtle.js", "nyc": "cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 nyc --reporter=text-summary mocha --recursive test/integration/ test/unit/", "mocha": "cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --recursive test/integration/ test/unit/", + "mocha-http": "cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --recursive test/integration/http-test.js", "prepublishOnly": "npm test", "postpublish": "git push --follow-tags", "test": "npm run standard && npm run validate && npm run nyc", diff --git a/test/integration/http-test.js b/test/integration/http-test.js index 4ef3f0941..03489e49a 100644 --- a/test/integration/http-test.js +++ b/test/integration/http-test.js @@ -670,6 +670,23 @@ describe('HTTP APIs', function () { .expect(201, done) } ) + it('should return a 400 error when trying to put a container that contains a reserved suffix', + function (done) { + server.put('/foo/bar.acl/test/') + .set('content-type', 'text/turtle') + .set('link', '; rel="type"') + .expect(400, done) + } + ) + it('should return a 400 error when trying to put a resource that contains a reserved suffix', + function (done) { + server.put('/foo/bar.acl/test.ttl') + .send(putRequestBody) + .set('content-type', 'text/turtle') + .set('link', '; rel="type"') + .expect(400, done) + } + ) // Cleanup after(function () { rm('/foo/') @@ -846,7 +863,7 @@ describe('HTTP APIs', function () { if (err) return done(err) try { postLocation = res.headers.location - console.log('location ' + postLocation) + // console.log('location ' + postLocation) const createdDir = fs.statSync(path.join(__dirname, '../resources', postLocation.slice(0, -1))) assert(createdDir.isDirectory(), 'Container should have been created') } catch (err) { diff --git a/test/resources/foo/bar.acl/test.ttl b/test/resources/foo/bar.acl/test.ttl new file mode 100644 index 000000000..e69de29bb From 4d029be90328c190c62c1916bc942673059d2f7e Mon Sep 17 00:00:00 2001 From: Zach Date: Thu, 21 Mar 2024 12:51:02 -0500 Subject: [PATCH 02/19] removed resource from originally failing tests --- test/resources/foo/bar.acl/test.ttl | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test/resources/foo/bar.acl/test.ttl diff --git a/test/resources/foo/bar.acl/test.ttl b/test/resources/foo/bar.acl/test.ttl deleted file mode 100644 index e69de29bb..000000000 From d5a6103073b9b8ab89077ff783de18a69bea64b8 Mon Sep 17 00:00:00 2001 From: zg009 <103973669+zg009@users.noreply.github.com> Date: Thu, 21 Mar 2024 13:53:09 -0500 Subject: [PATCH 03/19] Update lib/handlers/put.js Co-authored-by: Ted Thibodeau Jr --- lib/handlers/put.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/handlers/put.js b/lib/handlers/put.js index a85a56a06..05bf8b307 100644 --- a/lib/handlers/put.js +++ b/lib/handlers/put.js @@ -20,7 +20,7 @@ function containsInvalidSuffixes (path) { if (path.endsWith('/')) { path = path.slice(0, -1) } else { - // this is a resource, so it either ends with an extension, or just text + // this is a resource, so it either ends with an extension, or is just text const lastFullStop = path.lastIndexOf('.') if (lastFullStop !== -1) { // contains at least one full stop path = path.slice(0, lastFullStop) From 1a8987e9ca369885f6d263e455eb12e85dfe9d24 Mon Sep 17 00:00:00 2001 From: zg009 <103973669+zg009@users.noreply.github.com> Date: Thu, 21 Mar 2024 13:53:17 -0500 Subject: [PATCH 04/19] Update lib/handlers/put.js Co-authored-by: Ted Thibodeau Jr --- lib/handlers/put.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/handlers/put.js b/lib/handlers/put.js index 05bf8b307..958c85d10 100644 --- a/lib/handlers/put.js +++ b/lib/handlers/put.js @@ -10,8 +10,8 @@ const { stringToStream } = require('../utils') const RESERVED_SUFFIXES = ['.acl', '.meta'] /** - * This function is used to make sure a resource or container which contains - * reserved suffixes for auxiliary documents cannot be created. + * This function is used to prevent creation of a resource or container + * which contains auxiliary documents named with reserved suffixes. * @param {string} path - the uri to check for invalid suffixes * @returns {boolean} true is fail - if the path contains reserved suffixes */ From 08886afa474cf29752e33f2dfdc64abe93293101 Mon Sep 17 00:00:00 2001 From: zg009 <103973669+zg009@users.noreply.github.com> Date: Thu, 21 Mar 2024 13:53:26 -0500 Subject: [PATCH 05/19] Update lib/handlers/put.js Co-authored-by: Ted Thibodeau Jr --- lib/handlers/put.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/handlers/put.js b/lib/handlers/put.js index 958c85d10..b2583e061 100644 --- a/lib/handlers/put.js +++ b/lib/handlers/put.js @@ -16,7 +16,7 @@ const RESERVED_SUFFIXES = ['.acl', '.meta'] * @returns {boolean} true is fail - if the path contains reserved suffixes */ function containsInvalidSuffixes (path) { - // if it is a container, no suffix so remove last slash + // if it is a container, no suffix, so remove last slash if (path.endsWith('/')) { path = path.slice(0, -1) } else { From 52480a39943f2f9b4da339e0db01741aa0ebc278 Mon Sep 17 00:00:00 2001 From: Zach Date: Thu, 21 Mar 2024 18:45:10 -0500 Subject: [PATCH 06/19] moved invalid suffix logic to LDP class, write test for patch in patch-test and put in http-test, cleaned up package.json --- lib/handlers/put.js | 28 ---------------------------- lib/ldp.js | 24 ++++++++++++++++++++++++ package.json | 1 - test/integration/patch-test.js | 10 ++++++++++ 4 files changed, 34 insertions(+), 29 deletions(-) diff --git a/lib/handlers/put.js b/lib/handlers/put.js index a85a56a06..740bf346a 100644 --- a/lib/handlers/put.js +++ b/lib/handlers/put.js @@ -6,40 +6,12 @@ const getContentType = require('../utils').getContentType const HTTPError = require('../http-error') const { stringToStream } = require('../utils') -// TODO: ask alain a better way to get the suffix variables here -const RESERVED_SUFFIXES = ['.acl', '.meta'] - -/** - * This function is used to make sure a resource or container which contains - * reserved suffixes for auxiliary documents cannot be created. - * @param {string} path - the uri to check for invalid suffixes - * @returns {boolean} true is fail - if the path contains reserved suffixes - */ -function containsInvalidSuffixes (path) { - // if it is a container, no suffix so remove last slash - if (path.endsWith('/')) { - path = path.slice(0, -1) - } else { - // this is a resource, so it either ends with an extension, or just text - const lastFullStop = path.lastIndexOf('.') - if (lastFullStop !== -1) { // contains at least one full stop - path = path.slice(0, lastFullStop) - } - } - return RESERVED_SUFFIXES.some(suffix => path.includes(suffix)) -} - async function handler (req, res, next) { debug(req.originalUrl) // deprecated kept for compatibility res.header('MS-Author-Via', 'SPARQL') // is this needed ? const contentType = req.get('content-type') - // make sure the resource being created does not attempt invalid resource creation - if (containsInvalidSuffixes(req.url)) { - next(new HTTPError(400, `${req.url} contained reserved suffixes in path`)) - } - // check whether a folder or resource with same name exists try { const ldp = req.app.locals.ldp diff --git a/lib/ldp.js b/lib/ldp.js index de8789e6a..a6e7166a3 100644 --- a/lib/ldp.js +++ b/lib/ldp.js @@ -327,11 +327,35 @@ class LDP { } catch (err) { } } + /** + * This function is used to make sure a resource or container which contains + * reserved suffixes for auxiliary documents cannot be created. + * @param {string} path - the uri to check for invalid suffixes + * @returns {boolean} true is fail - if the path contains reserved suffixes + */ + _containsInvalidSuffixes (path) { + // if it is a container, no suffix so remove last slash + if (path.endsWith('/')) { + path = path.slice(0, -1) + } else { + // this is a resource, so it either ends with an extension, or just text + const lastFullStop = path.lastIndexOf('.') + if (lastFullStop !== -1) { // contains at least one full stop + path = path.slice(0, lastFullStop) + } + } + return AUXILIARY_RESOURCES.some(suffix => path.includes(suffix)) + } + // check whether a document (or container) has the same name as another document (or container) async checkItemName (url) { let testName, testPath const { hostname, pathname } = this.resourceMapper._parseUrl(url) // (url.url || url) let itemUrl = this.resourceMapper.resolveUrl(hostname, pathname) + // make sure the resource being created does not attempt invalid resource creation + if (this._containsInvalidSuffixes(itemUrl)) { + throw error(400, `${itemUrl} contained reserved suffixes in path`) + } const container = itemUrl.endsWith('/') try { const testUrl = container ? itemUrl.slice(0, -1) : itemUrl + '/' diff --git a/package.json b/package.json index 517b612d3..54a9041da 100644 --- a/package.json +++ b/package.json @@ -146,7 +146,6 @@ "validate": "node ./test/validate-turtle.js", "nyc": "cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 nyc --reporter=text-summary mocha --recursive test/integration/ test/unit/", "mocha": "cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --recursive test/integration/ test/unit/", - "mocha-http": "cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --recursive test/integration/http-test.js", "prepublishOnly": "npm test", "postpublish": "git push --follow-tags", "test": "npm run standard && npm run validate && npm run nyc", diff --git a/test/integration/patch-test.js b/test/integration/patch-test.js index 53ddb90e3..b848d3899 100644 --- a/test/integration/patch-test.js +++ b/test/integration/patch-test.js @@ -131,6 +131,16 @@ describe('PATCH through text/n3', () => { result: '@prefix : .\n@prefix tim: .\n\ntim:x tim:y tim:z.\n\n' })) + describe('on an N3 file that has an invalid uri', describePatch({ + path: '/foo/bar.acl/test.n3', + exists: false, + patch: `<> a solid:InsertDeletePatch; + solid:inserts { . }.` + }, { + status: 400, + text: '/foo/bar.acl/test.n3 contained reserved suffixes in path' + })) + describe('on a resource with read-only access', describePatch({ path: '/read-only.ttl', patch: `<> a solid:InsertDeletePatch; From 51163e91d546fe167c12cfc7604bf41fd9ee859e Mon Sep 17 00:00:00 2001 From: Zach Date: Fri, 22 Mar 2024 10:09:36 -0500 Subject: [PATCH 07/19] added invalid suffix check to ldp and test in http-test --- lib/ldp.js | 4 ++++ test/integration/http-test.js | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/lib/ldp.js b/lib/ldp.js index a6e7166a3..5a9c93081 100644 --- a/lib/ldp.js +++ b/lib/ldp.js @@ -148,11 +148,15 @@ class LDP { // prepare slug if (slug) { if (this.isAuxResource(slug, extension)) throw error(403, 'POST is not allowed for auxiliary resources') + if (this._containsInvalidSuffixes(slug)) { + throw error(400, `${slug} is an invalid file path`) + } slug = decodeURIComponent(slug) if (slug.match(/\/|\||:/)) { throw error(400, 'The name of new file POSTed may not contain : | or /') } } + // Containers should not receive an extension if (container) { extension = '' diff --git a/test/integration/http-test.js b/test/integration/http-test.js index 03489e49a..150c0e44c 100644 --- a/test/integration/http-test.js +++ b/test/integration/http-test.js @@ -891,6 +891,13 @@ describe('HTTP APIs', function () { .set('content-type', 'text/turtle') .expect(403, done) }) + it('should error with 400 if slug contains invalid suffix', function (done) { + server.post('/post-tests/') + .set('slug', 'put-resource.acl.ttl') + .send(postRequest1Body) + .set('content-type', 'text-turtle') + .expect(400, done) + }) it('should error with 400 if the body is empty and no content type is provided', function (done) { server.post('/post-tests/') .set('slug', 'post-resource-empty-fail') From d56cdf0d0d4b7060371e1b14ef9bdc3c4e10e7c3 Mon Sep 17 00:00:00 2001 From: bourgeoa Date: Sat, 23 Mar 2024 18:45:33 +0100 Subject: [PATCH 08/19] only for containers --- lib/ldp.js | 33 ++- package-lock.json | 374 ++++----------------------------- test/integration/http-test.js | 39 +++- test/integration/patch-test.js | 2 +- 4 files changed, 86 insertions(+), 362 deletions(-) diff --git a/lib/ldp.js b/lib/ldp.js index 5a9c93081..7a22bfa28 100644 --- a/lib/ldp.js +++ b/lib/ldp.js @@ -145,23 +145,24 @@ class LDP { const ldp = this debug.handlers('POST -- On parent: ' + containerPath) - // prepare slug + if (container) { + // Containers should not receive an extension + extension = '' + } + // pepare slug if (slug) { - if (this.isAuxResource(slug, extension)) throw error(403, 'POST is not allowed for auxiliary resources') - if (this._containsInvalidSuffixes(slug)) { - throw error(400, `${slug} is an invalid file path`) - } slug = decodeURIComponent(slug) + + if (container) { + // the name of a container cannot be a valid auxiliary resource document + if (this._containsInvalidSuffixes(slug + '/')) slug = slug.split('.')[0] + } else if (this.isAuxResource(slug, extension)) throw error(403, 'POST is not allowed for auxiliary resources') + if (slug.match(/\/|\||:/)) { throw error(400, 'The name of new file POSTed may not contain : | or /') } } - // Containers should not receive an extension - if (container) { - extension = '' - } - // always return a valid URL. const resourceUrl = await ldp.getAvailableUrl(hostname, containerPath, { slug, extension, container }) debug.handlers('POST -- Will create at: ' + resourceUrl) @@ -338,17 +339,7 @@ class LDP { * @returns {boolean} true is fail - if the path contains reserved suffixes */ _containsInvalidSuffixes (path) { - // if it is a container, no suffix so remove last slash - if (path.endsWith('/')) { - path = path.slice(0, -1) - } else { - // this is a resource, so it either ends with an extension, or just text - const lastFullStop = path.lastIndexOf('.') - if (lastFullStop !== -1) { // contains at least one full stop - path = path.slice(0, lastFullStop) - } - } - return AUXILIARY_RESOURCES.some(suffix => path.includes(suffix)) + return AUXILIARY_RESOURCES.some(suffix => path.endsWith(suffix + '/')) } // check whether a document (or container) has the same name as another document (or container) diff --git a/package-lock.json b/package-lock.json index d3e9687e7..682e32978 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4127,9 +4127,7 @@ "node_modules/@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "optional": true, - "peer": true + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" }, "node_modules/@graphql-typed-document-node/core": { "version": "3.2.0", @@ -4715,20 +4713,20 @@ } }, "node_modules/@noble/curves": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", - "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", + "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", "dependencies": { - "@noble/hashes": "1.3.3" + "@noble/hashes": "1.4.0" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@noble/hashes": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", - "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "engines": { "node": ">= 16" }, @@ -4772,8 +4770,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "optional": true, - "peer": true, "dependencies": { "@gar/promisify": "^1.0.1", "semver": "^7.3.5" @@ -4784,8 +4780,6 @@ "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", "deprecated": "This functionality has been moved to @npmcli/fs", - "optional": true, - "peer": true, "dependencies": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" @@ -4798,8 +4792,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, - "peer": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -6663,7 +6655,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "devOptional": true, "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -6840,8 +6831,7 @@ "node_modules/archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==" }, "node_modules/arg": { "version": "4.1.0", @@ -7723,8 +7713,6 @@ "version": "15.3.0", "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "optional": true, - "peer": true, "dependencies": { "@npmcli/fs": "^1.0.0", "@npmcli/move-file": "^1.0.1", @@ -7753,8 +7741,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "optional": true, - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -7766,8 +7752,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, - "peer": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -7778,9 +7762,7 @@ "node_modules/cacache/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true, - "peer": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/cached-path-relative": { "version": "1.1.0", @@ -8066,8 +8048,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "optional": true, - "peer": true, "engines": { "node": ">=10" } @@ -8139,7 +8119,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "devOptional": true, "engines": { "node": ">=6" } @@ -8626,9 +8605,9 @@ "dev": true }, "node_modules/core-js": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.34.0.tgz", - "integrity": "sha512-aDdvlDder8QmY91H88GzNi9EtQi2TjvQhpCX6B1v/dAZHU1AuLgHvRh54RiOerpEhEW46Tkf+vgAViB/CWC0ag==", + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.1.tgz", + "integrity": "sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -9206,9 +9185,9 @@ } }, "node_modules/dompurify": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.6.tgz", - "integrity": "sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w==" + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.11.tgz", + "integrity": "sha512-Fan4uMuyB26gFV3ovPoEoQbxRRPfTu3CvImyZnhGq5fsIEO+gEFLp45ISFt+kQBWsK5ulDdT0oV28jS1UrwQLg==" }, "node_modules/domutils": { "version": "3.1.0", @@ -11195,8 +11174,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "optional": true, - "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -11862,8 +11839,6 @@ "version": "3.0.8", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", - "optional": true, - "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -11875,8 +11850,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "optional": true, - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -11887,9 +11860,7 @@ "node_modules/hosted-git-info/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true, - "peer": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/html-escaper": { "version": "2.0.2", @@ -12097,7 +12068,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "devOptional": true, "engines": { "node": ">=8" } @@ -12105,9 +12075,7 @@ "node_modules/infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "optional": true, - "peer": true + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, "node_modules/inflight": { "version": "1.0.6", @@ -13468,9 +13436,9 @@ "peer": true }, "node_modules/jose": { - "version": "4.15.4", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.4.tgz", - "integrity": "sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==", + "version": "4.15.5", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.5.tgz", + "integrity": "sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg==", "funding": { "url": "https://github.com/sponsors/panva" } @@ -14404,9 +14372,9 @@ } }, "node_modules/lint-staged/node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dependencies": { "path-key": "^4.0.0" }, @@ -14564,9 +14532,9 @@ } }, "node_modules/lit-html": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.0.tgz", - "integrity": "sha512-FwAjq3iNsaO6SOZXEIpeROlJLUlrbyMkn4iuv4f4u1H40Jw8wkeR/OUXZUHUoiYabGk8Y4Y0F/rgq+R4MrOLmA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.2.tgz", + "integrity": "sha512-3OBZSUrPnAHoKJ9AMjRL/m01YJxQMf+TMHanNtTHG68ubjnZxK0RFl102DPzsw4mWnHibfZIBJm3LWCZ/LmMvg==", "dependencies": { "@types/trusted-types": "^2.0.2" } @@ -15074,9 +15042,9 @@ } }, "node_modules/marked": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-11.1.0.tgz", - "integrity": "sha512-fvKJWAPEafVj1dwGwcPI5mBB/0pvViL6NlCbNDG1HOIRwwAU/jeMoFxfbRLuirO1wRH7m4yPvBqD/O1wyWvayw==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-11.2.0.tgz", + "integrity": "sha512-HR0m3bvu0jAPYiIvLUUQtdg1g6D247//lvcekpHO1WMvbwDlwSkZAX9Lw4F4YHE1T0HaaNve0tuAWuV1UJ6vtw==", "bin": { "marked": "bin/marked.js" }, @@ -15813,8 +15781,6 @@ "version": "3.1.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "optional": true, - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -15826,8 +15792,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "optional": true, - "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -15839,8 +15803,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "optional": true, - "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -15852,8 +15814,6 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "optional": true, - "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -15864,16 +15824,12 @@ "node_modules/minipass/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true, - "peer": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "optional": true, - "peer": true, "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -15885,16 +15841,12 @@ "node_modules/minizlib/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true, - "peer": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "optional": true, - "peer": true, "dependencies": { "minimist": "^1.2.6" }, @@ -16662,8 +16614,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-7.0.0.tgz", "integrity": "sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g==", - "optional": true, - "peer": true, "dependencies": { "hosted-git-info": "^3.0.2", "osenv": "^0.1.5", @@ -16675,8 +16625,6 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "optional": true, - "peer": true, "bin": { "semver": "bin/semver" } @@ -16706,28 +16654,25 @@ }, "node_modules/npm/node_modules/@colors/colors": { "version": "1.5.0", - "extraneous": true, "inBundle": true, "license": "MIT", + "optional": true, "engines": { "node": ">=0.1.90" } }, "node_modules/npm/node_modules/@gar/promisify": { "version": "1.1.3", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/@isaacs/string-locale-compare": { "version": "1.1.0", - "extraneous": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/@npmcli/arborist": { "version": "5.6.3", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -16778,7 +16723,6 @@ }, "node_modules/npm/node_modules/@npmcli/ci-detect": { "version": "2.0.0", - "extraneous": true, "inBundle": true, "license": "ISC", "engines": { @@ -16787,7 +16731,6 @@ }, "node_modules/npm/node_modules/@npmcli/config": { "version": "4.2.2", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -16806,7 +16749,6 @@ }, "node_modules/npm/node_modules/@npmcli/disparity-colors": { "version": "2.0.0", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -16818,7 +16760,6 @@ }, "node_modules/npm/node_modules/@npmcli/fs": { "version": "2.1.2", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -16831,7 +16772,6 @@ }, "node_modules/npm/node_modules/@npmcli/git": { "version": "3.0.2", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -16851,7 +16791,6 @@ }, "node_modules/npm/node_modules/@npmcli/installed-package-contents": { "version": "1.0.7", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -16867,7 +16806,6 @@ }, "node_modules/npm/node_modules/@npmcli/installed-package-contents/node_modules/npm-bundled": { "version": "1.1.2", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -16876,7 +16814,6 @@ }, "node_modules/npm/node_modules/@npmcli/map-workspaces": { "version": "2.0.4", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -16891,7 +16828,6 @@ }, "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { "version": "3.1.1", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -16906,7 +16842,6 @@ }, "node_modules/npm/node_modules/@npmcli/move-file": { "version": "2.0.1", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -16919,13 +16854,11 @@ }, "node_modules/npm/node_modules/@npmcli/name-from-folder": { "version": "1.0.1", - "extraneous": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/@npmcli/node-gyp": { "version": "2.0.0", - "extraneous": true, "inBundle": true, "license": "ISC", "engines": { @@ -16934,7 +16867,6 @@ }, "node_modules/npm/node_modules/@npmcli/package-json": { "version": "2.0.0", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -16946,7 +16878,6 @@ }, "node_modules/npm/node_modules/@npmcli/promise-spawn": { "version": "3.0.0", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -16958,7 +16889,6 @@ }, "node_modules/npm/node_modules/@npmcli/query": { "version": "1.2.0", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -16972,7 +16902,6 @@ }, "node_modules/npm/node_modules/@npmcli/run-script": { "version": "4.2.1", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -16988,7 +16917,6 @@ }, "node_modules/npm/node_modules/@tootallnate/once": { "version": "2.0.0", - "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -16997,13 +16925,11 @@ }, "node_modules/npm/node_modules/abbrev": { "version": "1.1.1", - "extraneous": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/agent-base": { "version": "6.0.2", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -17015,7 +16941,6 @@ }, "node_modules/npm/node_modules/agentkeepalive": { "version": "4.2.1", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -17029,7 +16954,6 @@ }, "node_modules/npm/node_modules/aggregate-error": { "version": "3.1.0", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -17042,7 +16966,6 @@ }, "node_modules/npm/node_modules/ansi-regex": { "version": "5.0.1", - "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -17051,7 +16974,6 @@ }, "node_modules/npm/node_modules/ansi-styles": { "version": "4.3.0", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -17066,19 +16988,16 @@ }, "node_modules/npm/node_modules/aproba": { "version": "2.0.0", - "extraneous": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/archy": { "version": "1.0.0", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/are-we-there-yet": { "version": "3.0.1", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -17091,19 +17010,16 @@ }, "node_modules/npm/node_modules/asap": { "version": "2.0.6", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/balanced-match": { "version": "1.0.2", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/bin-links": { "version": "3.0.3", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -17120,7 +17036,6 @@ }, "node_modules/npm/node_modules/bin-links/node_modules/npm-normalize-package-bin": { "version": "2.0.0", - "extraneous": true, "inBundle": true, "license": "ISC", "engines": { @@ -17129,7 +17044,6 @@ }, "node_modules/npm/node_modules/binary-extensions": { "version": "2.2.0", - "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -17138,7 +17052,6 @@ }, "node_modules/npm/node_modules/brace-expansion": { "version": "2.0.1", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -17147,7 +17060,6 @@ }, "node_modules/npm/node_modules/builtins": { "version": "5.0.1", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -17156,7 +17068,6 @@ }, "node_modules/npm/node_modules/cacache": { "version": "16.1.3", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -17185,7 +17096,6 @@ }, "node_modules/npm/node_modules/chalk": { "version": "4.1.2", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -17201,7 +17111,6 @@ }, "node_modules/npm/node_modules/chownr": { "version": "2.0.0", - "extraneous": true, "inBundle": true, "license": "ISC", "engines": { @@ -17210,7 +17119,6 @@ }, "node_modules/npm/node_modules/cidr-regex": { "version": "3.1.1", - "extraneous": true, "inBundle": true, "license": "BSD-2-Clause", "dependencies": { @@ -17222,7 +17130,6 @@ }, "node_modules/npm/node_modules/clean-stack": { "version": "2.2.0", - "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -17231,7 +17138,6 @@ }, "node_modules/npm/node_modules/cli-columns": { "version": "4.0.0", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -17244,7 +17150,6 @@ }, "node_modules/npm/node_modules/cli-table3": { "version": "0.6.2", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -17259,7 +17164,6 @@ }, "node_modules/npm/node_modules/clone": { "version": "1.0.4", - "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -17268,7 +17172,6 @@ }, "node_modules/npm/node_modules/cmd-shim": { "version": "5.0.0", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -17280,7 +17183,6 @@ }, "node_modules/npm/node_modules/color-convert": { "version": "2.0.1", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -17292,13 +17194,11 @@ }, "node_modules/npm/node_modules/color-name": { "version": "1.1.4", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/color-support": { "version": "1.1.3", - "extraneous": true, "inBundle": true, "license": "ISC", "bin": { @@ -17307,7 +17207,6 @@ }, "node_modules/npm/node_modules/columnify": { "version": "1.6.0", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -17320,25 +17219,21 @@ }, "node_modules/npm/node_modules/common-ancestor-path": { "version": "1.0.1", - "extraneous": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/concat-map": { "version": "0.0.1", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/console-control-strings": { "version": "1.1.0", - "extraneous": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/cssesc": { "version": "3.0.0", - "extraneous": true, "inBundle": true, "license": "MIT", "bin": { @@ -17350,7 +17245,6 @@ }, "node_modules/npm/node_modules/debug": { "version": "4.3.4", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -17367,13 +17261,11 @@ }, "node_modules/npm/node_modules/debug/node_modules/ms": { "version": "2.1.2", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/debuglog": { "version": "1.0.1", - "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -17382,7 +17274,6 @@ }, "node_modules/npm/node_modules/defaults": { "version": "1.0.3", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -17391,13 +17282,11 @@ }, "node_modules/npm/node_modules/delegates": { "version": "1.0.0", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/depd": { "version": "1.1.2", - "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -17406,7 +17295,6 @@ }, "node_modules/npm/node_modules/dezalgo": { "version": "1.0.4", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -17416,7 +17304,6 @@ }, "node_modules/npm/node_modules/diff": { "version": "5.1.0", - "extraneous": true, "inBundle": true, "license": "BSD-3-Clause", "engines": { @@ -17425,22 +17312,20 @@ }, "node_modules/npm/node_modules/emoji-regex": { "version": "8.0.0", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/encoding": { "version": "0.1.13", - "extraneous": true, "inBundle": true, "license": "MIT", + "optional": true, "dependencies": { "iconv-lite": "^0.6.2" } }, "node_modules/npm/node_modules/env-paths": { "version": "2.2.1", - "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -17449,19 +17334,16 @@ }, "node_modules/npm/node_modules/err-code": { "version": "2.0.3", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/fastest-levenshtein": { "version": "1.0.12", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/fs-minipass": { "version": "2.1.0", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -17473,19 +17355,16 @@ }, "node_modules/npm/node_modules/fs.realpath": { "version": "1.0.0", - "extraneous": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/function-bind": { "version": "1.1.1", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/gauge": { "version": "4.0.4", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -17504,7 +17383,6 @@ }, "node_modules/npm/node_modules/glob": { "version": "8.0.3", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -17523,13 +17401,11 @@ }, "node_modules/npm/node_modules/graceful-fs": { "version": "4.2.10", - "extraneous": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/has": { "version": "1.0.3", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -17541,7 +17417,6 @@ }, "node_modules/npm/node_modules/has-flag": { "version": "4.0.0", - "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -17550,13 +17425,11 @@ }, "node_modules/npm/node_modules/has-unicode": { "version": "2.0.1", - "extraneous": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/hosted-git-info": { "version": "5.2.1", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -17568,13 +17441,11 @@ }, "node_modules/npm/node_modules/http-cache-semantics": { "version": "4.1.1", - "extraneous": true, "inBundle": true, "license": "BSD-2-Clause" }, "node_modules/npm/node_modules/http-proxy-agent": { "version": "5.0.0", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -17588,7 +17459,6 @@ }, "node_modules/npm/node_modules/https-proxy-agent": { "version": "5.0.1", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -17601,7 +17471,6 @@ }, "node_modules/npm/node_modules/humanize-ms": { "version": "1.2.1", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -17610,9 +17479,9 @@ }, "node_modules/npm/node_modules/iconv-lite": { "version": "0.6.3", - "extraneous": true, "inBundle": true, "license": "MIT", + "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -17622,7 +17491,6 @@ }, "node_modules/npm/node_modules/ignore-walk": { "version": "5.0.1", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -17634,7 +17502,6 @@ }, "node_modules/npm/node_modules/imurmurhash": { "version": "0.1.4", - "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -17643,7 +17510,6 @@ }, "node_modules/npm/node_modules/indent-string": { "version": "4.0.0", - "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -17652,13 +17518,11 @@ }, "node_modules/npm/node_modules/infer-owner": { "version": "1.0.4", - "extraneous": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/inflight": { "version": "1.0.6", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -17668,13 +17532,11 @@ }, "node_modules/npm/node_modules/inherits": { "version": "2.0.4", - "extraneous": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/ini": { "version": "3.0.1", - "extraneous": true, "inBundle": true, "license": "ISC", "engines": { @@ -17683,7 +17545,6 @@ }, "node_modules/npm/node_modules/init-package-json": { "version": "3.0.2", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -17701,13 +17562,11 @@ }, "node_modules/npm/node_modules/ip": { "version": "2.0.0", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/ip-regex": { "version": "4.3.0", - "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -17716,7 +17575,6 @@ }, "node_modules/npm/node_modules/is-cidr": { "version": "4.0.2", - "extraneous": true, "inBundle": true, "license": "BSD-2-Clause", "dependencies": { @@ -17728,7 +17586,6 @@ }, "node_modules/npm/node_modules/is-core-module": { "version": "2.10.0", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -17740,7 +17597,6 @@ }, "node_modules/npm/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -17749,25 +17605,21 @@ }, "node_modules/npm/node_modules/is-lambda": { "version": "1.0.1", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/isexe": { "version": "2.0.0", - "extraneous": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/json-stringify-nice": { "version": "1.1.4", - "extraneous": true, "inBundle": true, "license": "ISC", "funding": { @@ -17779,25 +17631,21 @@ "engines": [ "node >= 0.2.0" ], - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/just-diff": { "version": "5.1.1", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/just-diff-apply": { "version": "5.4.1", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/libnpmaccess": { "version": "6.0.4", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -17812,7 +17660,6 @@ }, "node_modules/npm/node_modules/libnpmdiff": { "version": "4.0.5", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -17831,7 +17678,6 @@ }, "node_modules/npm/node_modules/libnpmexec": { "version": "4.0.14", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -17856,7 +17702,6 @@ }, "node_modules/npm/node_modules/libnpmfund": { "version": "3.0.5", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -17868,7 +17713,6 @@ }, "node_modules/npm/node_modules/libnpmhook": { "version": "8.0.4", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -17881,7 +17725,6 @@ }, "node_modules/npm/node_modules/libnpmorg": { "version": "4.0.4", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -17894,7 +17737,6 @@ }, "node_modules/npm/node_modules/libnpmpack": { "version": "4.1.3", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -17908,7 +17750,6 @@ }, "node_modules/npm/node_modules/libnpmpublish": { "version": "6.0.5", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -17924,7 +17765,6 @@ }, "node_modules/npm/node_modules/libnpmsearch": { "version": "5.0.4", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -17936,7 +17776,6 @@ }, "node_modules/npm/node_modules/libnpmteam": { "version": "4.0.4", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -17949,7 +17788,6 @@ }, "node_modules/npm/node_modules/libnpmversion": { "version": "3.0.7", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -17965,7 +17803,6 @@ }, "node_modules/npm/node_modules/lru-cache": { "version": "7.13.2", - "extraneous": true, "inBundle": true, "license": "ISC", "engines": { @@ -17974,7 +17811,6 @@ }, "node_modules/npm/node_modules/make-fetch-happen": { "version": "10.2.1", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18001,7 +17837,6 @@ }, "node_modules/npm/node_modules/minimatch": { "version": "5.1.0", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18013,7 +17848,6 @@ }, "node_modules/npm/node_modules/minipass": { "version": "3.3.4", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18025,7 +17859,6 @@ }, "node_modules/npm/node_modules/minipass-collect": { "version": "1.0.2", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18037,7 +17870,6 @@ }, "node_modules/npm/node_modules/minipass-fetch": { "version": "2.1.1", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -18054,7 +17886,6 @@ }, "node_modules/npm/node_modules/minipass-flush": { "version": "1.0.5", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18066,7 +17897,6 @@ }, "node_modules/npm/node_modules/minipass-json-stream": { "version": "1.0.1", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -18076,7 +17906,6 @@ }, "node_modules/npm/node_modules/minipass-pipeline": { "version": "1.2.4", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18088,7 +17917,6 @@ }, "node_modules/npm/node_modules/minipass-sized": { "version": "1.0.3", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18100,7 +17928,6 @@ }, "node_modules/npm/node_modules/minizlib": { "version": "2.1.2", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -18113,7 +17940,6 @@ }, "node_modules/npm/node_modules/mkdirp": { "version": "1.0.4", - "extraneous": true, "inBundle": true, "license": "MIT", "bin": { @@ -18125,7 +17951,6 @@ }, "node_modules/npm/node_modules/mkdirp-infer-owner": { "version": "2.0.0", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18139,19 +17964,16 @@ }, "node_modules/npm/node_modules/ms": { "version": "2.1.3", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/mute-stream": { "version": "0.0.8", - "extraneous": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/negotiator": { "version": "0.6.3", - "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -18160,7 +17982,6 @@ }, "node_modules/npm/node_modules/node-gyp": { "version": "9.1.0", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -18184,7 +18005,6 @@ }, "node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { "version": "1.1.11", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -18194,7 +18014,6 @@ }, "node_modules/npm/node_modules/node-gyp/node_modules/glob": { "version": "7.2.3", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18214,7 +18033,6 @@ }, "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { "version": "3.1.2", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18226,7 +18044,6 @@ }, "node_modules/npm/node_modules/node-gyp/node_modules/nopt": { "version": "5.0.0", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18241,7 +18058,6 @@ }, "node_modules/npm/node_modules/nopt": { "version": "6.0.0", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18256,7 +18072,6 @@ }, "node_modules/npm/node_modules/normalize-package-data": { "version": "4.0.1", - "extraneous": true, "inBundle": true, "license": "BSD-2-Clause", "dependencies": { @@ -18271,7 +18086,6 @@ }, "node_modules/npm/node_modules/npm-audit-report": { "version": "3.0.0", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18283,7 +18097,6 @@ }, "node_modules/npm/node_modules/npm-bundled": { "version": "2.0.1", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18295,7 +18108,6 @@ }, "node_modules/npm/node_modules/npm-bundled/node_modules/npm-normalize-package-bin": { "version": "2.0.0", - "extraneous": true, "inBundle": true, "license": "ISC", "engines": { @@ -18304,7 +18116,6 @@ }, "node_modules/npm/node_modules/npm-install-checks": { "version": "5.0.0", - "extraneous": true, "inBundle": true, "license": "BSD-2-Clause", "dependencies": { @@ -18316,13 +18127,11 @@ }, "node_modules/npm/node_modules/npm-normalize-package-bin": { "version": "1.0.1", - "extraneous": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/npm-package-arg": { "version": "9.1.0", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18337,7 +18146,6 @@ }, "node_modules/npm/node_modules/npm-packlist": { "version": "5.1.3", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18355,7 +18163,6 @@ }, "node_modules/npm/node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { "version": "2.0.0", - "extraneous": true, "inBundle": true, "license": "ISC", "engines": { @@ -18364,7 +18171,6 @@ }, "node_modules/npm/node_modules/npm-pick-manifest": { "version": "7.0.2", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18379,7 +18185,6 @@ }, "node_modules/npm/node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { "version": "2.0.0", - "extraneous": true, "inBundle": true, "license": "ISC", "engines": { @@ -18388,7 +18193,6 @@ }, "node_modules/npm/node_modules/npm-profile": { "version": "6.2.1", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18401,7 +18205,6 @@ }, "node_modules/npm/node_modules/npm-registry-fetch": { "version": "13.3.1", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18419,13 +18222,11 @@ }, "node_modules/npm/node_modules/npm-user-validate": { "version": "1.0.1", - "extraneous": true, "inBundle": true, "license": "BSD-2-Clause" }, "node_modules/npm/node_modules/npmlog": { "version": "6.0.2", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18440,7 +18241,6 @@ }, "node_modules/npm/node_modules/once": { "version": "1.4.0", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18449,7 +18249,6 @@ }, "node_modules/npm/node_modules/opener": { "version": "1.5.2", - "extraneous": true, "inBundle": true, "license": "(WTFPL OR MIT)", "bin": { @@ -18458,7 +18257,6 @@ }, "node_modules/npm/node_modules/p-map": { "version": "4.0.0", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -18473,7 +18271,6 @@ }, "node_modules/npm/node_modules/pacote": { "version": "13.6.2", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18508,7 +18305,6 @@ }, "node_modules/npm/node_modules/parse-conflict-json": { "version": "2.0.2", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18522,7 +18318,6 @@ }, "node_modules/npm/node_modules/path-is-absolute": { "version": "1.0.1", - "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -18531,7 +18326,6 @@ }, "node_modules/npm/node_modules/postcss-selector-parser": { "version": "6.0.10", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -18544,7 +18338,6 @@ }, "node_modules/npm/node_modules/proc-log": { "version": "2.0.1", - "extraneous": true, "inBundle": true, "license": "ISC", "engines": { @@ -18553,7 +18346,6 @@ }, "node_modules/npm/node_modules/promise-all-reject-late": { "version": "1.0.1", - "extraneous": true, "inBundle": true, "license": "ISC", "funding": { @@ -18562,7 +18354,6 @@ }, "node_modules/npm/node_modules/promise-call-limit": { "version": "1.0.1", - "extraneous": true, "inBundle": true, "license": "ISC", "funding": { @@ -18571,13 +18362,11 @@ }, "node_modules/npm/node_modules/promise-inflight": { "version": "1.0.1", - "extraneous": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/promise-retry": { "version": "2.0.1", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -18590,7 +18379,6 @@ }, "node_modules/npm/node_modules/promzard": { "version": "0.3.0", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18599,7 +18387,6 @@ }, "node_modules/npm/node_modules/qrcode-terminal": { "version": "0.12.0", - "extraneous": true, "inBundle": true, "bin": { "qrcode-terminal": "bin/qrcode-terminal.js" @@ -18607,7 +18394,6 @@ }, "node_modules/npm/node_modules/read": { "version": "1.0.7", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18619,7 +18405,6 @@ }, "node_modules/npm/node_modules/read-cmd-shim": { "version": "3.0.0", - "extraneous": true, "inBundle": true, "license": "ISC", "engines": { @@ -18628,7 +18413,6 @@ }, "node_modules/npm/node_modules/read-package-json": { "version": "5.0.2", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18643,7 +18427,6 @@ }, "node_modules/npm/node_modules/read-package-json-fast": { "version": "2.0.3", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18656,7 +18439,6 @@ }, "node_modules/npm/node_modules/read-package-json/node_modules/npm-normalize-package-bin": { "version": "2.0.0", - "extraneous": true, "inBundle": true, "license": "ISC", "engines": { @@ -18665,7 +18447,6 @@ }, "node_modules/npm/node_modules/readable-stream": { "version": "3.6.0", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -18679,7 +18460,6 @@ }, "node_modules/npm/node_modules/readdir-scoped-modules": { "version": "1.1.0", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18691,7 +18471,6 @@ }, "node_modules/npm/node_modules/retry": { "version": "0.12.0", - "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -18700,7 +18479,6 @@ }, "node_modules/npm/node_modules/rimraf": { "version": "3.0.2", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18715,7 +18493,6 @@ }, "node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { "version": "1.1.11", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -18725,7 +18502,6 @@ }, "node_modules/npm/node_modules/rimraf/node_modules/glob": { "version": "7.2.3", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18745,7 +18521,6 @@ }, "node_modules/npm/node_modules/rimraf/node_modules/minimatch": { "version": "3.1.2", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18757,7 +18532,6 @@ }, "node_modules/npm/node_modules/safe-buffer": { "version": "5.2.1", - "extraneous": true, "funding": [ { "type": "github", @@ -18777,13 +18551,12 @@ }, "node_modules/npm/node_modules/safer-buffer": { "version": "2.1.2", - "extraneous": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "optional": true }, "node_modules/npm/node_modules/semver": { "version": "7.3.7", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18798,7 +18571,6 @@ }, "node_modules/npm/node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18810,19 +18582,16 @@ }, "node_modules/npm/node_modules/set-blocking": { "version": "2.0.0", - "extraneous": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/signal-exit": { "version": "3.0.7", - "extraneous": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/smart-buffer": { "version": "4.2.0", - "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -18832,7 +18601,6 @@ }, "node_modules/npm/node_modules/socks": { "version": "2.7.0", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -18846,7 +18614,6 @@ }, "node_modules/npm/node_modules/socks-proxy-agent": { "version": "7.0.0", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -18860,7 +18627,6 @@ }, "node_modules/npm/node_modules/spdx-correct": { "version": "3.1.1", - "extraneous": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { @@ -18870,13 +18636,11 @@ }, "node_modules/npm/node_modules/spdx-exceptions": { "version": "2.3.0", - "extraneous": true, "inBundle": true, "license": "CC-BY-3.0" }, "node_modules/npm/node_modules/spdx-expression-parse": { "version": "3.0.1", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -18886,13 +18650,11 @@ }, "node_modules/npm/node_modules/spdx-license-ids": { "version": "3.0.11", - "extraneous": true, "inBundle": true, "license": "CC0-1.0" }, "node_modules/npm/node_modules/ssri": { "version": "9.0.1", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18904,7 +18666,6 @@ }, "node_modules/npm/node_modules/string_decoder": { "version": "1.3.0", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -18913,7 +18674,6 @@ }, "node_modules/npm/node_modules/string-width": { "version": "4.2.3", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -18927,7 +18687,6 @@ }, "node_modules/npm/node_modules/strip-ansi": { "version": "6.0.1", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -18939,7 +18698,6 @@ }, "node_modules/npm/node_modules/supports-color": { "version": "7.2.0", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -18951,7 +18709,6 @@ }, "node_modules/npm/node_modules/tar": { "version": "6.1.11", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -18968,19 +18725,16 @@ }, "node_modules/npm/node_modules/text-table": { "version": "0.2.0", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/tiny-relative-date": { "version": "1.3.0", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/treeverse": { "version": "2.0.0", - "extraneous": true, "inBundle": true, "license": "ISC", "engines": { @@ -18989,7 +18743,6 @@ }, "node_modules/npm/node_modules/unique-filename": { "version": "2.0.1", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -19001,7 +18754,6 @@ }, "node_modules/npm/node_modules/unique-slug": { "version": "3.0.0", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -19013,13 +18765,11 @@ }, "node_modules/npm/node_modules/util-deprecate": { "version": "1.0.2", - "extraneous": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/validate-npm-package-license": { "version": "3.0.4", - "extraneous": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { @@ -19029,7 +18779,6 @@ }, "node_modules/npm/node_modules/validate-npm-package-name": { "version": "4.0.0", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -19041,13 +18790,11 @@ }, "node_modules/npm/node_modules/walk-up-path": { "version": "1.0.0", - "extraneous": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/wcwidth": { "version": "1.0.1", - "extraneous": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -19056,7 +18803,6 @@ }, "node_modules/npm/node_modules/which": { "version": "2.0.2", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -19071,7 +18817,6 @@ }, "node_modules/npm/node_modules/wide-align": { "version": "1.1.5", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -19080,13 +18825,11 @@ }, "node_modules/npm/node_modules/wrappy": { "version": "1.0.2", - "extraneous": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/write-file-atomic": { "version": "4.0.2", - "extraneous": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -19099,7 +18842,6 @@ }, "node_modules/npm/node_modules/yallist": { "version": "4.0.0", - "extraneous": true, "inBundle": true, "license": "ISC" }, @@ -19548,8 +19290,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "optional": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -19575,8 +19315,6 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "optional": true, - "peer": true, "dependencies": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.0" @@ -19637,8 +19375,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "optional": true, - "peer": true, "dependencies": { "aggregate-error": "^3.0.0" }, @@ -20427,9 +20163,7 @@ "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "optional": true, - "peer": true + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" }, "node_modules/prompts": { "version": "2.4.2", @@ -20553,8 +20287,6 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", - "optional": true, - "peer": true, "bin": { "qrcode-terminal": "bin/qrcode-terminal.js" } @@ -21535,9 +21267,9 @@ } }, "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==" }, "node_modules/rimraf": { "version": "3.0.2", @@ -22805,8 +22537,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "optional": true, - "peer": true, "dependencies": { "minipass": "^3.1.1" }, @@ -23596,8 +23326,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", - "optional": true, - "peer": true, "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -23614,8 +23342,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "optional": true, - "peer": true, "engines": { "node": ">=8" } @@ -23624,8 +23350,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, - "peer": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -23636,9 +23360,7 @@ "node_modules/tar/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true, - "peer": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/temp": { "version": "0.8.4", @@ -24321,8 +24043,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "optional": true, - "peer": true, "dependencies": { "unique-slug": "^2.0.0" } @@ -24331,8 +24051,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "optional": true, - "peer": true, "dependencies": { "imurmurhash": "^0.1.4" } @@ -24489,8 +24207,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", - "optional": true, - "peer": true, "dependencies": { "builtins": "^1.0.3" } @@ -24498,9 +24214,7 @@ "node_modules/validate-npm-package-name/node_modules/builtins": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", - "optional": true, - "peer": true + "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==" }, "node_modules/validator": { "version": "13.11.0", @@ -24784,8 +24498,6 @@ "version": "2.4.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "optional": true, - "peer": true, "dependencies": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", diff --git a/test/integration/http-test.js b/test/integration/http-test.js index 150c0e44c..51c5d7bf8 100644 --- a/test/integration/http-test.js +++ b/test/integration/http-test.js @@ -335,7 +335,7 @@ describe('HTTP APIs', function () { server.get('/invalidfile.foo') .expect(404, done) }) - it('should return 404 for non-existent container', function (done) { // alain + it('should return 404 for non-existent container', function (done) { server.get('/inexistant/') .expect('Accept-Put', 'text/turtle') .expect(404, done) @@ -891,12 +891,12 @@ describe('HTTP APIs', function () { .set('content-type', 'text/turtle') .expect(403, done) }) - it('should error with 400 if slug contains invalid suffix', function (done) { + it('should not error with 400 if slug contains invalid suffix', function (done) { // TODO find better name server.post('/post-tests/') .set('slug', 'put-resource.acl.ttl') .send(postRequest1Body) .set('content-type', 'text-turtle') - .expect(400, done) + .expect(201, done) }) it('should error with 400 if the body is empty and no content type is provided', function (done) { server.post('/post-tests/') @@ -959,19 +959,40 @@ describe('HTTP APIs', function () { .set('slug', 'loans.ttl') .set('link', '; rel="type"') .send(postRequest2Body) + .expect('location', /\/post-tests\/loans.ttl\//) .expect(201) - .end(function (err) { + .end((err, res) => { if (err) return done(err) - const stats = fs.statSync(path.join(__dirname, '../resources/post-tests/loans.ttl/')) - if (!stats.isDirectory()) { - return done(new Error('Cannot read container just created')) + try { + postLocation = res.headers.location + console.log('location ' + postLocation) + const createdDir = fs.statSync(path.join(__dirname, '../resources', postLocation.slice(0, -1))) + assert(createdDir.isDirectory(), 'Container should have been created') + } catch (err) { + return done(err) } done() }) }) it('should be able to access newly container', function (done) { - server.get('/post-tests/loans.ttl/') - .expect('content-type', /text\/turtle/) + console.log(postLocation) + server.get(postLocation) + // .expect('content-type', /text\/turtle/) + .expect(200, done) + }) + it('should create container', function (done) { + server.post('/post-tests/') + .set('content-type', 'text/turtle') + .set('slug', 'loans.acl') + .set('link', '; rel="type"') + .send(postRequest2Body) + .expect('location', /\/post-tests\/loans\//) + .expect(201, done) + }) + it('should be able to access newly container', function (done) { + console.log(postLocation) + server.get(postLocation) + // .expect('content-type', /text\/turtle/) .expect(200, done) }) it('should create a new slug if there is a container with same name', function (done) { diff --git a/test/integration/patch-test.js b/test/integration/patch-test.js index b848d3899..38594fb06 100644 --- a/test/integration/patch-test.js +++ b/test/integration/patch-test.js @@ -138,7 +138,7 @@ describe('PATCH through text/n3', () => { solid:inserts { . }.` }, { status: 400, - text: '/foo/bar.acl/test.n3 contained reserved suffixes in path' + text: 'contained reserved suffixes in path' })) describe('on a resource with read-only access', describePatch({ From e4bb2e9e4373790a02e19090f0c8f695f4e97b9e Mon Sep 17 00:00:00 2001 From: zg009 Date: Mon, 25 Mar 2024 14:10:41 -0500 Subject: [PATCH 09/19] fixed todo and added .meta test in patch-test --- test/integration/http-test.js | 16 +++++++++------- test/integration/patch-test.js | 12 +++++++++++- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/test/integration/http-test.js b/test/integration/http-test.js index 51c5d7bf8..ad5ec9e12 100644 --- a/test/integration/http-test.js +++ b/test/integration/http-test.js @@ -891,13 +891,6 @@ describe('HTTP APIs', function () { .set('content-type', 'text/turtle') .expect(403, done) }) - it('should not error with 400 if slug contains invalid suffix', function (done) { // TODO find better name - server.post('/post-tests/') - .set('slug', 'put-resource.acl.ttl') - .send(postRequest1Body) - .set('content-type', 'text-turtle') - .expect(201, done) - }) it('should error with 400 if the body is empty and no content type is provided', function (done) { server.post('/post-tests/') .set('slug', 'post-resource-empty-fail') @@ -921,6 +914,15 @@ describe('HTTP APIs', function () { .expect(hasHeader('acl', suffixAcl)) .expect(201, done) }) + it('should create new resource even if slug contains invalid suffix', function (done) { + server.post('/post-tests/') + .set('slug', 'put-resource.acl.ttl') + .send(postRequest1Body) + .set('content-type', 'text-turtle') + .expect(hasHeader('describedBy', suffixMeta)) + .expect(hasHeader('acl', suffixAcl)) + .expect(201, done) + }) it('should fail return 404 if no parent container found', function (done) { server.post('/hello.html/') .send(postRequest1Body) diff --git a/test/integration/patch-test.js b/test/integration/patch-test.js index 38594fb06..846f04801 100644 --- a/test/integration/patch-test.js +++ b/test/integration/patch-test.js @@ -131,7 +131,7 @@ describe('PATCH through text/n3', () => { result: '@prefix : .\n@prefix tim: .\n\ntim:x tim:y tim:z.\n\n' })) - describe('on an N3 file that has an invalid uri', describePatch({ + describe('on an N3 file that has an invalid uri (*.acl)', describePatch({ path: '/foo/bar.acl/test.n3', exists: false, patch: `<> a solid:InsertDeletePatch; @@ -141,6 +141,16 @@ describe('PATCH through text/n3', () => { text: 'contained reserved suffixes in path' })) + describe('on an N3 file that has an invalid uri (*.meta)', describePatch({ + path: '/foo/bar/xyz.meta/test.n3', + exists: false, + patch: `<> a solid:InsertDeletePatch; + solid:insers { . }.` + }, { + status: 400, + text: 'contained reserved suffixes in path' + })) + describe('on a resource with read-only access', describePatch({ path: '/read-only.ttl', patch: `<> a solid:InsertDeletePatch; From 3afe36b46eeab3ff65f651f571b2bff5b2d639c1 Mon Sep 17 00:00:00 2001 From: Zach Date: Fri, 29 Mar 2024 09:30:57 -0500 Subject: [PATCH 10/19] added example test and recursive suffix checking in ldp.post --- lib/ldp.js | 9 ++++++++- package.json | 1 + test/integration/http-test.js | 9 +++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/ldp.js b/lib/ldp.js index 7a22bfa28..2c4e849f1 100644 --- a/lib/ldp.js +++ b/lib/ldp.js @@ -137,6 +137,7 @@ class LDP { } async post (hostname, containerPath, stream, { container, slug, extension, contentType }) { + console.log('container:', container) // POST without content type is forbidden if (!contentType) { throw error(400, @@ -155,7 +156,13 @@ class LDP { if (container) { // the name of a container cannot be a valid auxiliary resource document - if (this._containsInvalidSuffixes(slug + '/')) slug = slug.split('.')[0] + while (this._containsInvalidSuffixes(slug + '/')) { + console.log('splitting slug', slug) + // slug = slug.split('.')[0] + const idx = slug.lastIndexOf('.') + slug = slug.substr(0, idx) + console.log('new slug', slug) + } } else if (this.isAuxResource(slug, extension)) throw error(403, 'POST is not allowed for auxiliary resources') if (slug.match(/\/|\||:/)) { diff --git a/package.json b/package.json index 54a9041da..8aa3514bf 100644 --- a/package.json +++ b/package.json @@ -146,6 +146,7 @@ "validate": "node ./test/validate-turtle.js", "nyc": "cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 nyc --reporter=text-summary mocha --recursive test/integration/ test/unit/", "mocha": "cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --recursive test/integration/ test/unit/", + "mocha-integration": "cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --recursive test/integration/http-test.js", "prepublishOnly": "npm test", "postpublish": "git push --follow-tags", "test": "npm run standard && npm run validate && npm run nyc", diff --git a/test/integration/http-test.js b/test/integration/http-test.js index ad5ec9e12..a535dec32 100644 --- a/test/integration/http-test.js +++ b/test/integration/http-test.js @@ -923,6 +923,15 @@ describe('HTTP APIs', function () { .expect(hasHeader('acl', suffixAcl)) .expect(201, done) }) + it('should do something', function (done) { + server.post('/post-tests/') + .set('content-type', 'text/turtle') + .set('slug', 'foo.bar.acl.meta') + .set('link', '; rel="type"') + .send(postRequest2Body) + .expect('location', /\/post-tests\/foo.bar\//) + .expect(201, done) + }) it('should fail return 404 if no parent container found', function (done) { server.post('/hello.html/') .send(postRequest1Body) From c68a3044cf41621332d119adc2cf6924f049bf4f Mon Sep 17 00:00:00 2001 From: Zach Date: Fri, 29 Mar 2024 09:32:11 -0500 Subject: [PATCH 11/19] renamed example test --- test/integration/http-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/http-test.js b/test/integration/http-test.js index a535dec32..ecb2efc11 100644 --- a/test/integration/http-test.js +++ b/test/integration/http-test.js @@ -923,7 +923,7 @@ describe('HTTP APIs', function () { .expect(hasHeader('acl', suffixAcl)) .expect(201, done) }) - it('should do something', function (done) { + it('create container with recursive example', function (done) { server.post('/post-tests/') .set('content-type', 'text/turtle') .set('slug', 'foo.bar.acl.meta') From d4198823cf225738f33baad4c8ee154268f43c6f Mon Sep 17 00:00:00 2001 From: bourgeoa Date: Fri, 29 Mar 2024 18:25:11 +0100 Subject: [PATCH 12/19] update POST create container test --- .nvmrc | 2 +- test/integration/http-test.js | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/.nvmrc b/.nvmrc index 832d38506..eb800ed45 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -16.14.0 +v18.19.0 diff --git a/test/integration/http-test.js b/test/integration/http-test.js index 51c5d7bf8..f4f5c82d3 100644 --- a/test/integration/http-test.js +++ b/test/integration/http-test.js @@ -983,13 +983,23 @@ describe('HTTP APIs', function () { it('should create container', function (done) { server.post('/post-tests/') .set('content-type', 'text/turtle') - .set('slug', 'loans.acl') + .set('slug', 'loans.acl.meta') .set('link', '; rel="type"') .send(postRequest2Body) .expect('location', /\/post-tests\/loans\//) - .expect(201, done) + .expect(201) + .end((err, res) => { + if (err) return done(err) + try { + postLocation = res.headers.location + assert(!postLocation.endsWith('.acl/') && !postLocation.endsWith('.meta/'), 'Container name should not end with .acl or .meta') + } catch (err) { + return done(err) + } + done() + }) }) - it('should be able to access newly container', function (done) { + it('should be able to access newly created container', function (done) { console.log(postLocation) server.get(postLocation) // .expect('content-type', /text\/turtle/) From a5b8e4860f34081182084aeeb7298a82dd3413aa Mon Sep 17 00:00:00 2001 From: zg009 Date: Fri, 29 Mar 2024 13:51:26 -0500 Subject: [PATCH 13/19] removed some comments --- lib/ldp.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/ldp.js b/lib/ldp.js index 2c4e849f1..13ec6b0f2 100644 --- a/lib/ldp.js +++ b/lib/ldp.js @@ -137,7 +137,6 @@ class LDP { } async post (hostname, containerPath, stream, { container, slug, extension, contentType }) { - console.log('container:', container) // POST without content type is forbidden if (!contentType) { throw error(400, @@ -157,11 +156,8 @@ class LDP { if (container) { // the name of a container cannot be a valid auxiliary resource document while (this._containsInvalidSuffixes(slug + '/')) { - console.log('splitting slug', slug) - // slug = slug.split('.')[0] const idx = slug.lastIndexOf('.') slug = slug.substr(0, idx) - console.log('new slug', slug) } } else if (this.isAuxResource(slug, extension)) throw error(403, 'POST is not allowed for auxiliary resources') From f6ef4438359a844e5d13f74d6827abcd44e8ec17 Mon Sep 17 00:00:00 2001 From: zg009 <103973669+zg009@users.noreply.github.com> Date: Mon, 1 Apr 2024 11:01:07 -0500 Subject: [PATCH 14/19] Update lib/ldp.js Co-authored-by: Ted Thibodeau Jr --- lib/ldp.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ldp.js b/lib/ldp.js index 13ec6b0f2..936c2bc43 100644 --- a/lib/ldp.js +++ b/lib/ldp.js @@ -159,7 +159,7 @@ class LDP { const idx = slug.lastIndexOf('.') slug = slug.substr(0, idx) } - } else if (this.isAuxResource(slug, extension)) throw error(403, 'POST is not allowed for auxiliary resources') + } else if (this.isAuxResource(slug, extension)) throw error(403, 'POST to auxiliary resources is not allowed') if (slug.match(/\/|\||:/)) { throw error(400, 'The name of new file POSTed may not contain : | or /') From 141868dc27bbce1e3b41f77f2bd7e2d312e923a4 Mon Sep 17 00:00:00 2001 From: zg009 <103973669+zg009@users.noreply.github.com> Date: Mon, 1 Apr 2024 11:01:19 -0500 Subject: [PATCH 15/19] Update lib/ldp.js Co-authored-by: Ted Thibodeau Jr --- lib/ldp.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ldp.js b/lib/ldp.js index 936c2bc43..af70c72e8 100644 --- a/lib/ldp.js +++ b/lib/ldp.js @@ -162,7 +162,7 @@ class LDP { } else if (this.isAuxResource(slug, extension)) throw error(403, 'POST to auxiliary resources is not allowed') if (slug.match(/\/|\||:/)) { - throw error(400, 'The name of new file POSTed may not contain : | or /') + throw error(400, 'The name of a POSTed new file may not contain ":" (colon), "|" (pipe), or "/" (slash)') } } From be1429efd4c9693739925215822f24224bd3b36e Mon Sep 17 00:00:00 2001 From: zg009 <103973669+zg009@users.noreply.github.com> Date: Mon, 1 Apr 2024 11:01:40 -0500 Subject: [PATCH 16/19] Update test/integration/http-test.js wording Co-authored-by: Ted Thibodeau Jr --- test/integration/http-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/http-test.js b/test/integration/http-test.js index 6c256e3da..baa2f1bca 100644 --- a/test/integration/http-test.js +++ b/test/integration/http-test.js @@ -670,7 +670,7 @@ describe('HTTP APIs', function () { .expect(201, done) } ) - it('should return a 400 error when trying to put a container that contains a reserved suffix', + it('should return a 400 error when trying to PUT a container with a name that contains a reserved suffix', function (done) { server.put('/foo/bar.acl/test/') .set('content-type', 'text/turtle') From 47a66d6503b881927fec25020229e06da512f4a4 Mon Sep 17 00:00:00 2001 From: zg009 <103973669+zg009@users.noreply.github.com> Date: Mon, 1 Apr 2024 11:01:52 -0500 Subject: [PATCH 17/19] Update test/integration/http-test.js wording Co-authored-by: Ted Thibodeau Jr --- test/integration/http-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/http-test.js b/test/integration/http-test.js index baa2f1bca..b4e5e4a99 100644 --- a/test/integration/http-test.js +++ b/test/integration/http-test.js @@ -678,7 +678,7 @@ describe('HTTP APIs', function () { .expect(400, done) } ) - it('should return a 400 error when trying to put a resource that contains a reserved suffix', + it('should return a 400 error when trying to PUT a resource with a name that contains a reserved suffix', function (done) { server.put('/foo/bar.acl/test.ttl') .send(putRequestBody) From d9a6865f58e02a7d5d8d445a10dcbe8d1aa7d6b1 Mon Sep 17 00:00:00 2001 From: zg009 <103973669+zg009@users.noreply.github.com> Date: Mon, 1 Apr 2024 11:02:04 -0500 Subject: [PATCH 18/19] Update test/integration/http-test.js wording Co-authored-by: Ted Thibodeau Jr --- test/integration/http-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/http-test.js b/test/integration/http-test.js index b4e5e4a99..d29758f9d 100644 --- a/test/integration/http-test.js +++ b/test/integration/http-test.js @@ -1003,7 +1003,7 @@ describe('HTTP APIs', function () { if (err) return done(err) try { postLocation = res.headers.location - assert(!postLocation.endsWith('.acl/') && !postLocation.endsWith('.meta/'), 'Container name should not end with .acl or .meta') + assert(!postLocation.endsWith('.acl/') && !postLocation.endsWith('.meta/'), 'Container name should not end with ".acl" or ".meta"') } catch (err) { return done(err) } From 81d8dfdf484e1cc7fc80c337e3554fa746b932ae Mon Sep 17 00:00:00 2001 From: zg009 <103973669+zg009@users.noreply.github.com> Date: Mon, 1 Apr 2024 11:41:34 -0500 Subject: [PATCH 19/19] Update test/integration/http-test.js Co-authored-by: Ted Thibodeau Jr --- test/integration/http-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/http-test.js b/test/integration/http-test.js index d29758f9d..4e5d599fe 100644 --- a/test/integration/http-test.js +++ b/test/integration/http-test.js @@ -1003,7 +1003,7 @@ describe('HTTP APIs', function () { if (err) return done(err) try { postLocation = res.headers.location - assert(!postLocation.endsWith('.acl/') && !postLocation.endsWith('.meta/'), 'Container name should not end with ".acl" or ".meta"') + assert(!postLocation.endsWith('.acl/') && !postLocation.endsWith('.meta/'), 'Container name cannot end with ".acl" or ".meta"') } catch (err) { return done(err) }