diff --git a/.changeset/young-geese-teach.md b/.changeset/young-geese-teach.md deleted file mode 100644 index 90da8e47..00000000 --- a/.changeset/young-geese-teach.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"barnard59-base": minor -"barnard59-cube": patch ---- - -added batch operation diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 5546d805..e155be0c 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -80,7 +80,14 @@ jobs: - run: npm run lint smoke-test-cli: - runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + os: + - ubuntu-latest + - macos-latest + - windows-latest + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v3 @@ -92,9 +99,17 @@ jobs: - run: npx barnard59 run test/e2e/definitions/world-clock/async.ttl - run: npx barnard59 run test/e2e/definitions/world-clock/file.ttl - run: npx barnard59 run test/e2e/definitions/world-clock/node.ttl + - run: npx barnard59 run test/e2e/definitions/code-imports/main.ttl global-installation: - runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + os: + - ubuntu-latest + - macos-latest + - windows-latest + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v3 @@ -102,6 +117,13 @@ jobs: - name: pack all run: npm pack -ws - run: npm install -g barnard59-*.tgz + if: matrix.os == 'ubuntu-latest' || matrix.os == 'macos-latest' + - run: cmd /c npm install -g (Get-ChildItem -Filter barnard59-*.tgz).FullName + if: matrix.os == 'windows-latest' - run: which barnard59 - run: barnard59 --help - run: barnard59 shacl validate --shapes test/support/pipeline-shapes.ttl < test/e2e/definitions/file-loader.ttl + if: matrix.os == 'ubuntu-latest' || matrix.os == 'macos-latest' + - run: barnard59 shacl validate --shapes test/support/pipeline-shapes.ttl < test/e2e/definitions/file-loader.ttl + if: matrix.os == 'windows-latest' + shell: cmd diff --git a/package-lock.json b/package-lock.json index 45cd8bbc..de0e6aa2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ ], "devDependencies": { "@changesets/cli": "^2.26.1", - "@tpluscode/eslint-config": "^0.4.4", + "@tpluscode/eslint-config": "^0.4.5", "@types/node": "^18", "@typescript-eslint/eslint-plugin": "^6.13.2", "@typescript-eslint/parser": "^6.13.2", @@ -47,8 +47,7 @@ }, "node_modules/@aws-crypto/crc32": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", - "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/util": "^3.0.0", "@aws-sdk/types": "^3.222.0", @@ -57,13 +56,11 @@ }, "node_modules/@aws-crypto/crc32/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "license": "0BSD" }, "node_modules/@aws-crypto/crc32c": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz", - "integrity": "sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/util": "^3.0.0", "@aws-sdk/types": "^3.222.0", @@ -72,8 +69,7 @@ }, "node_modules/@aws-crypto/crc32c/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "license": "0BSD" }, "node_modules/@aws-crypto/ie11-detection": { "version": "3.0.0", @@ -105,8 +101,7 @@ }, "node_modules/@aws-crypto/sha256-browser": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", - "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/ie11-detection": "^3.0.0", "@aws-crypto/sha256-js": "^3.0.0", @@ -120,13 +115,11 @@ }, "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "license": "0BSD" }, "node_modules/@aws-crypto/sha256-js": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", - "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/util": "^3.0.0", "@aws-sdk/types": "^3.222.0", @@ -135,8 +128,7 @@ }, "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "license": "0BSD" }, "node_modules/@aws-crypto/supports-web-crypto": { "version": "3.0.0", @@ -164,8 +156,7 @@ }, "node_modules/@aws-sdk/client-s3": { "version": "3.481.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.481.0.tgz", - "integrity": "sha512-W4xpJRTuKKhQf1yCNPoErqAHize140LJf+YU+H60UB6rHy0uI52KJVSdMMKAghwAlAMLwmLWhKeMYWVpBOOtJw==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha1-browser": "3.0.0", "@aws-crypto/sha256-browser": "3.0.0", @@ -232,8 +223,7 @@ }, "node_modules/@aws-sdk/client-sso": { "version": "3.481.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.481.0.tgz", - "integrity": "sha512-d+crFfW8HSDXa68MSfMDX6LH0J22P29SxJW4IGgRZKwHWEaSf4UjOP0mjA4V26R50suAV052/WBY6LjtGsZsHg==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", @@ -279,8 +269,7 @@ }, "node_modules/@aws-sdk/client-sts": { "version": "3.481.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.481.0.tgz", - "integrity": "sha512-GSnJiceKpwLSEW5q2KRu9zHNJgtYysiy9Xkey0EKLKCdDRdM62yCJEFerAbvRRVJsF2LTSrmBmUl2zWB5RT8mw==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", @@ -329,8 +318,7 @@ }, "node_modules/@aws-sdk/core": { "version": "3.481.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.481.0.tgz", - "integrity": "sha512-UeyAc2FnWQDts81vPVBWKEj0WagYK4SVAgNfGcg6zCzzqsUG4unr4NPKQoca2L+XOU55yMCy+5l2K6R3YsFGKg==", + "license": "Apache-2.0", "dependencies": { "@smithy/core": "^1.2.1", "@smithy/protocol-http": "^3.0.11", @@ -345,8 +333,7 @@ }, "node_modules/@aws-sdk/credential-provider-env": { "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.468.0.tgz", - "integrity": "sha512-k/1WHd3KZn0EQYjadooj53FC0z24/e4dUZhbSKTULgmxyO62pwh9v3Brvw4WRa/8o2wTffU/jo54tf4vGuP/ZA==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.468.0", "@smithy/property-provider": "^2.0.0", @@ -359,8 +346,7 @@ }, "node_modules/@aws-sdk/credential-provider-ini": { "version": "3.481.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.481.0.tgz", - "integrity": "sha512-QXMlILewLV/yQHkyjXsu7PhvmTZIDAaQ4uAfhjnqbH1B8mErRpZKkzHWwp4yeZdTcHfenTVqoTnx9WDa+SnK/Q==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.468.0", "@aws-sdk/credential-provider-process": "3.468.0", @@ -379,8 +365,7 @@ }, "node_modules/@aws-sdk/credential-provider-node": { "version": "3.481.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.481.0.tgz", - "integrity": "sha512-148Ztn2FjlS3VdGWJnAMjuXiZ55/tD823I/koawgp80LnDqMiKfmSGAioXIikqaBHl40K7ZvtBMqP/n/6GM41A==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.468.0", "@aws-sdk/credential-provider-ini": "3.481.0", @@ -400,8 +385,7 @@ }, "node_modules/@aws-sdk/credential-provider-process": { "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.468.0.tgz", - "integrity": "sha512-OYSn1A/UsyPJ7Z8Q2cNhTf55O36shPmSsvOfND04nSfu1nPaR+VUvvsP7v+brhGpwC/GAKTIdGAo4blH31BS6A==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.468.0", "@smithy/property-provider": "^2.0.0", @@ -415,8 +399,7 @@ }, "node_modules/@aws-sdk/credential-provider-sso": { "version": "3.481.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.481.0.tgz", - "integrity": "sha512-3MrSIQPQDOxhZDppC2XpOLVfuUm7iqRfTrwjSYGeWc//pUZtUI7nMXYjEDL+li5gvasw1lYfYX3VHNdwNnvyOQ==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-sso": "3.481.0", "@aws-sdk/token-providers": "3.481.0", @@ -432,8 +415,7 @@ }, "node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.468.0.tgz", - "integrity": "sha512-rexymPmXjtkwCPfhnUq3EjO1rSkf39R4Jz9CqiM7OsqK2qlT5Y/V3gnMKn0ZMXsYaQOMfM3cT5xly5R+OKDHlw==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.468.0", "@smithy/property-provider": "^2.0.0", @@ -446,8 +428,7 @@ }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { "version": "3.470.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.470.0.tgz", - "integrity": "sha512-vLXXNWtsRmEIwzJ9HUQfIuTNAsEzvCv0Icsnkvt2BiBZXnmHdp2vIC3e3+kfy1D7dVQloXqMmnfcLu/BUMu2Jw==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.468.0", "@aws-sdk/util-arn-parser": "3.465.0", @@ -463,8 +444,7 @@ }, "node_modules/@aws-sdk/middleware-expect-continue": { "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.468.0.tgz", - "integrity": "sha512-/wmLjmfgeulxhhmnxX3X3N933TvGsYckVIFjAtDSpLjqkbwzEcNiLq7AdmNJ4BfxG0MCMgcht561DCCD19x8Bg==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.468.0", "@smithy/protocol-http": "^3.0.11", @@ -477,8 +457,7 @@ }, "node_modules/@aws-sdk/middleware-flexible-checksums": { "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.468.0.tgz", - "integrity": "sha512-LQwL/N5MCj3Y5keLLewHTqeAXUIMsHFZyxDXRm/uxrOon9ufLKDvGvzAmfwn1/CuSUo66ZfT8VPSA4BsC90RtA==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "3.0.0", "@aws-crypto/crc32c": "3.0.0", @@ -495,8 +474,7 @@ }, "node_modules/@aws-sdk/middleware-host-header": { "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.468.0.tgz", - "integrity": "sha512-gwQ+/QhX+lhof304r6zbZ/V5l5cjhGRxLL3CjH1uJPMcOAbw9wUlMdl+ibr8UwBZ5elfKFGiB1cdW/0uMchw0w==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.468.0", "@smithy/protocol-http": "^3.0.11", @@ -509,8 +487,7 @@ }, "node_modules/@aws-sdk/middleware-location-constraint": { "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.468.0.tgz", - "integrity": "sha512-0gBX/lDynQr4YIhM9h1dVnkVWqrg+34iOCVIUq8jHxzUzgZWglGkG9lHGGg0r1xkLTmegeoo1OKH8wrQ6n33Cg==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.468.0", "@smithy/types": "^2.7.0", @@ -522,8 +499,7 @@ }, "node_modules/@aws-sdk/middleware-logger": { "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.468.0.tgz", - "integrity": "sha512-X5XHKV7DHRXI3f29SAhJPe/OxWRFgDWDMMCALfzhmJfCi6Jfh0M14cJKoC+nl+dk9lB+36+jKjhjETZaL2bPlA==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.468.0", "@smithy/types": "^2.7.0", @@ -535,8 +511,7 @@ }, "node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.468.0.tgz", - "integrity": "sha512-vch9IQib2Ng9ucSyRW2eKNQXHUPb5jUPCLA5otTW/8nGjcOU37LxQG4WrxO7uaJ9Oe8hjHO+hViE3P0KISUhtA==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.468.0", "@smithy/protocol-http": "^3.0.11", @@ -549,8 +524,7 @@ }, "node_modules/@aws-sdk/middleware-sdk-s3": { "version": "3.481.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.481.0.tgz", - "integrity": "sha512-LOFXtxZOnU75vB5rL5/rOjSrYrbk/kqJGbnQJywHQosAiPKSVw9BR/6Q6tQIDDvtMYsVqMB7Db5SzA64hr80Rg==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.468.0", "@aws-sdk/util-arn-parser": "3.465.0", @@ -568,8 +542,7 @@ }, "node_modules/@aws-sdk/middleware-signing": { "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.468.0.tgz", - "integrity": "sha512-s+7fSB1gdnnTj5O0aCCarX3z5Vppop8kazbNSZADdkfHIDWCN80IH4ZNjY3OWqaAz0HmR4LNNrovdR304ojb4Q==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.468.0", "@smithy/property-provider": "^2.0.0", @@ -585,8 +558,7 @@ }, "node_modules/@aws-sdk/middleware-ssec": { "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.468.0.tgz", - "integrity": "sha512-y1qLW24wRkOGBTK5d6eJXf6d8HYo4rzT4a1mNDN1rd18NSffwQ6Yke5qeUiIaxa0y/l+FvvNYErbhYtij2rJoQ==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.468.0", "@smithy/types": "^2.7.0", @@ -598,8 +570,7 @@ }, "node_modules/@aws-sdk/middleware-user-agent": { "version": "3.478.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.478.0.tgz", - "integrity": "sha512-Rec+nAPIzzwxgHPW+xqY6tooJGFOytpYg/xSRv8/IXl3xKGhmpMGs6gDWzmMBv/qy5nKTvLph/csNWJ98GWXCw==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.468.0", "@aws-sdk/util-endpoints": "3.478.0", @@ -613,8 +584,7 @@ }, "node_modules/@aws-sdk/region-config-resolver": { "version": "3.470.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.470.0.tgz", - "integrity": "sha512-C1o1J06iIw8cyAAOvHqT4Bbqf+PgQ/RDlSyjt2gFfP2OovDpc2o2S90dE8f8iZdSGpg70N5MikT1DBhW9NbhtQ==", + "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^2.1.8", "@smithy/types": "^2.7.0", @@ -628,8 +598,7 @@ }, "node_modules/@aws-sdk/signature-v4-multi-region": { "version": "3.481.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.481.0.tgz", - "integrity": "sha512-bNQ+5Gb3c6a+AiR4D9o0olPjPkGal8Dqvq4Mt0vWQ+ZOzzKEZZDSjpCMUdkhm3ezYIFr9rnCmQOpTtyf3/KDVg==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/middleware-sdk-s3": "3.481.0", "@aws-sdk/types": "3.468.0", @@ -644,8 +613,7 @@ }, "node_modules/@aws-sdk/token-providers": { "version": "3.481.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.481.0.tgz", - "integrity": "sha512-G4ObHF2A/FlvQG7Lb/2sjuklG89IiH3TI1EiNZSzgu6TvY904Js72Slldls4VeJLY2zAnZgyZ9903pBMkDrcxQ==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", @@ -691,8 +659,7 @@ }, "node_modules/@aws-sdk/types": { "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.468.0.tgz", - "integrity": "sha512-rx/9uHI4inRbp2tw3Y4Ih4PNZkVj32h7WneSg3MVgVjAoVD5Zti9KhS5hkvsBxfgmQmg0AQbE+b1sy5WGAgntA==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^2.7.0", "tslib": "^2.5.0" @@ -703,8 +670,7 @@ }, "node_modules/@aws-sdk/util-arn-parser": { "version": "3.465.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.465.0.tgz", - "integrity": "sha512-zOJ82vzDJFqBX9yZBlNeHHrul/kpx/DCoxzW5UBbZeb26kfV53QhMSoEmY8/lEbBqlqargJ/sgRC845GFhHNQw==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.5.0" }, @@ -714,8 +680,7 @@ }, "node_modules/@aws-sdk/util-endpoints": { "version": "3.478.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.478.0.tgz", - "integrity": "sha512-u9Mcg3euGJGs5clPt9mBuhBjHiEKiD0PnfvArhfq9i+dcY5mbCq/i1Dezp3iv1fZH9xxQt7hPXDfSpt1yUSM6g==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.468.0", "@smithy/util-endpoints": "^1.0.7", @@ -749,8 +714,7 @@ }, "node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.468.0.tgz", - "integrity": "sha512-OJyhWWsDEizR3L+dCgMXSUmaCywkiZ7HSbnQytbeKGwokIhD69HTiJcibF/sgcM5gk4k3Mq3puUhGnEZ46GIig==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.468.0", "@smithy/types": "^2.7.0", @@ -760,8 +724,7 @@ }, "node_modules/@aws-sdk/util-user-agent-node": { "version": "3.470.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.470.0.tgz", - "integrity": "sha512-QxsZ9iVHcBB/XRdYvwfM5AMvNp58HfqkIrH88mY0cmxuvtlIGDfWjczdDrZMJk9y0vIq+cuoCHsGXHu7PyiEAQ==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.468.0", "@smithy/node-config-provider": "^2.1.8", @@ -789,8 +752,7 @@ }, "node_modules/@aws-sdk/xml-builder": { "version": "3.472.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.472.0.tgz", - "integrity": "sha512-PwjVxz1hr9up8QkddabuScPZ/d5aDHgvHYgK4acHYzltXL4wngfvimi5ZqXTzVWF2QANxHmWnHUr45QJX71oJQ==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^2.7.0", "tslib": "^2.5.0" @@ -801,9 +763,8 @@ }, "node_modules/@babel/code-frame": { "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" @@ -870,9 +831,8 @@ }, "node_modules/@babel/generator": { "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", @@ -924,18 +884,16 @@ }, "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" @@ -1005,9 +963,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -1025,9 +982,8 @@ }, "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, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -1055,9 +1011,8 @@ }, "node_modules/@babel/highlight": { "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", @@ -1069,9 +1024,8 @@ }, "node_modules/@babel/parser": { "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, + "license": "MIT", "bin": { "parser": "bin/babel-parser.js" }, @@ -1255,9 +1209,8 @@ }, "node_modules/@babel/template": { "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/parser": "^7.22.15", @@ -1269,9 +1222,8 @@ }, "node_modules/@babel/traverse": { "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.23.0", @@ -1298,9 +1250,8 @@ }, "node_modules/@babel/types": { "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.20", @@ -1561,9 +1512,8 @@ }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -1573,9 +1523,8 @@ }, "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -1590,36 +1539,16 @@ "kuler": "^2.0.0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", - "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", - "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@digitalbazaar/http-client": { + "version": "3.4.1", + "license": "BSD-3-Clause", + "dependencies": { + "ky": "^0.33.3", + "ky-universal": "^0.11.0", + "undici": "^5.21.2" + }, "engines": { - "node": ">=12" + "node": ">=14.0" } }, "node_modules/@eslint-community/eslint-utils": { @@ -1694,6 +1623,122 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@fastify/busboy": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@graphy/content.nq.read": { + "version": "4.3.7", + "dev": true, + "license": "ISC", + "dependencies": { + "@graphy/core.data.factory": "^4.3.7", + "@graphy/core.iso.stream": "^4.3.7" + }, + "engines": { + "node": ">=8.4.0" + } + }, + "node_modules/@graphy/content.trig.read": { + "version": "4.3.7", + "dev": true, + "license": "ISC", + "dependencies": { + "@graphy/core.data.factory": "^4.3.7", + "@graphy/core.iso.stream": "^4.3.7", + "uri-js": "^4.4.0" + }, + "engines": { + "node": ">=8.4.0" + } + }, + "node_modules/@graphy/content.trig.write": { + "version": "4.3.7", + "dev": true, + "license": "ISC", + "dependencies": { + "@graphy/core.class.writable": "^4.3.7", + "@graphy/core.data.factory": "^4.3.7", + "big-integer": "^1.6.48" + }, + "engines": { + "node": ">=8.4.0" + } + }, + "node_modules/@graphy/content.ttl.write": { + "version": "4.3.7", + "dev": true, + "license": "ISC", + "dependencies": { + "@graphy/core.class.writable": "^4.3.7", + "@graphy/core.data.factory": "^4.3.7", + "big-integer": "^1.6.48" + }, + "engines": { + "node": ">=8.4.0" + } + }, + "node_modules/@graphy/content.xml.scribe": { + "version": "4.3.7", + "dev": true, + "license": "ISC", + "dependencies": { + "@graphy/core.class.writable": "^4.3.7", + "@graphy/core.data.factory": "^4.3.7" + }, + "engines": { + "node": ">=8.4.0" + } + }, + "node_modules/@graphy/core.class.scribable": { + "version": "4.3.7", + "dev": true, + "license": "ISC", + "dependencies": { + "@graphy/core.data.factory": "^4.3.7", + "@graphy/core.iso.stream": "^4.3.7" + }, + "engines": { + "node": ">=8.4.0" + } + }, + "node_modules/@graphy/core.class.writable": { + "version": "4.3.7", + "dev": true, + "license": "ISC", + "dependencies": { + "@graphy/core.class.scribable": "^4.3.7", + "@graphy/core.data.factory": "^4.3.7" + }, + "engines": { + "node": ">=8.4.0" + } + }, + "node_modules/@graphy/core.data.factory": { + "version": "4.3.7", + "dev": true, + "license": "ISC", + "dependencies": { + "uri-js": "^4.4.0" + }, + "engines": { + "node": ">=8.4.0" + } + }, + "node_modules/@graphy/core.iso.stream": { + "version": "4.3.7", + "dev": true, + "license": "ISC", + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8.4.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.10", "dev": true, @@ -4347,9 +4392,8 @@ }, "node_modules/@manypkg/find-root/node_modules/@types/node": { "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@manypkg/find-root/node_modules/fs-extra": { "version": "8.1.0", @@ -4752,8 +4796,7 @@ }, "node_modules/@pnpm/constants": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@pnpm/constants/-/constants-7.1.1.tgz", - "integrity": "sha512-31pZqMtjwV+Vaq7MaPrT1EoDFSYwye3dp6BiHIGRJmVThCQwySRKM7hCvqqI94epNkqFAAYoWrNynWoRYosGdw==", + "license": "MIT", "engines": { "node": ">=16.14" }, @@ -4763,8 +4806,7 @@ }, "node_modules/@pnpm/crypto.base32-hash": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@pnpm/crypto.base32-hash/-/crypto.base32-hash-2.0.0.tgz", - "integrity": "sha512-3ttOeHBpmWRbgJrpDQ8Nwd3W8s8iuiP5YZM0JRyKWaMtX8lu9d7/AKyxPmhYsMJuN+q/1dwHa7QFeDZJ53b0oA==", + "license": "MIT", "dependencies": { "rfc4648": "^1.5.2" }, @@ -4777,8 +4819,7 @@ }, "node_modules/@pnpm/dependency-path": { "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@pnpm/dependency-path/-/dependency-path-2.1.6.tgz", - "integrity": "sha512-xHld0DIIfMMTYmestpNInVpDQL7VC/9uXYzj1fNrDC4wLafgSBcjljlFPaWVCRC1xyrNcsepQD86Bl2hgZ7sJg==", + "license": "MIT", "dependencies": { "@pnpm/crypto.base32-hash": "2.0.0", "@pnpm/types": "9.4.1", @@ -4794,8 +4835,7 @@ }, "node_modules/@pnpm/dependency-path/node_modules/semver": { "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -4808,8 +4848,7 @@ }, "node_modules/@pnpm/error": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/error/-/error-5.0.2.tgz", - "integrity": "sha512-0TEm+tWNYm+9uh6DSKyRbv8pv/6b4NL0PastLvMxIoqZbBZ5Zj1cYi332R9xsSUi31ZOsu2wpgn/bC7DA9hrjg==", + "license": "MIT", "dependencies": { "@pnpm/constants": "7.1.1" }, @@ -4822,8 +4861,7 @@ }, "node_modules/@pnpm/lockfile-types": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@pnpm/lockfile-types/-/lockfile-types-5.1.4.tgz", - "integrity": "sha512-m2alyNWTPjg63rQfBHpzbbl9FmbxfwNJ0H1dTM++FHQiUymS4MXvch6Uo0dQrxWLBb1tJ2C9Vb+LjjblVns8RA==", + "license": "MIT", "dependencies": { "@pnpm/types": "9.4.1" }, @@ -4836,8 +4874,7 @@ }, "node_modules/@pnpm/merge-lockfile-changes": { "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@pnpm/merge-lockfile-changes/-/merge-lockfile-changes-5.0.6.tgz", - "integrity": "sha512-UwBa6wp/UFGQwIy7ejIcg+yROKg+eNV1vrnqPf/Ot2EcNKUnKjtz/TDzVxk9wiCr7YpoQfIyhaW0ddFVv6jj/Q==", + "license": "MIT", "dependencies": { "@pnpm/lockfile-types": "5.1.4", "comver-to-semver": "^1.0.0", @@ -4853,8 +4890,7 @@ }, "node_modules/@pnpm/merge-lockfile-changes/node_modules/semver": { "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -4867,8 +4903,7 @@ }, "node_modules/@pnpm/types": { "version": "9.4.1", - "resolved": "https://registry.npmjs.org/@pnpm/types/-/types-9.4.1.tgz", - "integrity": "sha512-X7k9wdk5XlW1uo9Nq38nSzqRvOAxrPcrzgx8xm2T3DtRsLYsiBbzcGZyqrGpsW37lYf/KLZwoTVMeQkACPE64Q==", + "license": "MIT", "engines": { "node": ">=16.14" }, @@ -4876,6 +4911,27 @@ "url": "https://opencollective.com/pnpm" } }, + "node_modules/@rdfjs-elements/formats-pretty": { + "version": "0.6.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphy/content.nq.read": "^4.3.7", + "@graphy/content.trig.read": "^4.3.7", + "@graphy/content.trig.write": "^4.3.7", + "@graphy/content.ttl.write": "^4.3.7", + "@graphy/content.xml.scribe": "^4.3.7", + "@graphy/core.data.factory": "^4.3.7", + "@rdfjs/environment": "^1", + "@rdfjs/formats": "^4.0.0", + "@rdfjs/serializer-jsonld-ext": "^4.0.0", + "@rdfjs/term-map": "^2.0.0", + "@tpluscode/rdf-ns-builders": ">=3.0.2", + "@zazuko/formats-lazy": "^1.0.1", + "@zazuko/prefixes": "^2.0.0", + "readable-stream": ">=3.6.0" + } + }, "node_modules/@rdfjs/data-model": { "version": "2.0.1", "license": "MIT", @@ -4891,17 +4947,8 @@ } }, "node_modules/@rdfjs/environment": { - "version": "0.1.2", - "license": "MIT", - "dependencies": { - "@rdfjs/data-model": "^2.0.1", - "@rdfjs/dataset": "^2.0.1", - "@rdfjs/fetch-lite": "^3.2.1", - "@rdfjs/namespace": "^2.0.0", - "@rdfjs/sink-map": "^2.0.0", - "@rdfjs/term-map": "^2.0.0", - "@rdfjs/term-set": "^2.0.1" - } + "version": "1.0.0", + "license": "MIT" }, "node_modules/@rdfjs/fetch": { "version": "3.1.1", @@ -4913,22 +4960,23 @@ } }, "node_modules/@rdfjs/fetch-lite": { - "version": "3.2.1", + "version": "3.2.2", "license": "MIT", "dependencies": { "is-stream": "^3.0.0", "nodeify-fetch": "^3.1.0", - "readable-stream": "^4.2.0" + "readable-stream": "^4.4.2" } }, "node_modules/@rdfjs/fetch-lite/node_modules/readable-stream": { - "version": "4.4.0", + "version": "4.5.2", "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", - "process": "^0.11.10" + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4973,162 +5021,165 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@rdfjs/formats-common": { - "version": "2.2.0", + "node_modules/@rdfjs/formats": { + "version": "4.0.0", "license": "MIT", "dependencies": { - "@rdfjs/parser-jsonld": "^1.2.1", - "@rdfjs/parser-n3": "^1.1.4", - "@rdfjs/serializer-jsonld": "^1.2.3", - "@rdfjs/serializer-ntriples": "^1.0.3", - "@rdfjs/sink-map": "^1.0.0", - "rdfxml-streaming-parser": "^1.4.0" + "@rdfjs/parser-jsonld": "^2.1.0", + "@rdfjs/parser-n3": "^2.0.1", + "@rdfjs/serializer-jsonld": "^2.0.0", + "@rdfjs/serializer-jsonld-ext": "^4.0.0", + "@rdfjs/serializer-ntriples": "^2.0.0", + "@rdfjs/serializer-turtle": "^1.1.1", + "@rdfjs/sink-map": "^2.0.0", + "rdfxml-streaming-parser": "^2.3.0" } }, - "node_modules/@rdfjs/formats-common/node_modules/@rdfjs/data-model": { - "version": "1.3.4", + "node_modules/@rdfjs/formats/node_modules/rdfxml-streaming-parser": { + "version": "2.4.0", "license": "MIT", "dependencies": { - "@rdfjs/types": ">=1.0.1" - }, - "bin": { - "rdfjs-data-model-test": "bin/test.js" + "@rdfjs/types": "*", + "@rubensworks/saxes": "^6.0.1", + "@types/readable-stream": "^2.3.13", + "buffer": "^6.0.3", + "rdf-data-factory": "^1.1.0", + "readable-stream": "^4.4.2", + "relative-to-absolute-iri": "^1.0.0", + "validate-iri": "^1.0.0" } }, - "node_modules/@rdfjs/formats-common/node_modules/@rdfjs/namespace": { - "version": "1.1.0", + "node_modules/@rdfjs/formats/node_modules/readable-stream": { + "version": "4.5.2", "license": "MIT", "dependencies": { - "@rdfjs/data-model": "^1.1.0" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">=6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@rdfjs/formats-common/node_modules/@rdfjs/parser-jsonld": { - "version": "1.3.1", + "node_modules/@rdfjs/namespace": { + "version": "2.0.0", "license": "MIT", "dependencies": { - "@rdfjs/data-model": "^1.3.4", - "@rdfjs/sink": "^1.0.3", - "jsonld-streaming-parser": "^2.4.3", - "readable-stream": "^3.6.0" + "@rdfjs/data-model": "^2.0.0" } }, - "node_modules/@rdfjs/formats-common/node_modules/@rdfjs/parser-n3": { - "version": "1.1.4", + "node_modules/@rdfjs/parser-jsonld": { + "version": "2.1.0", "license": "MIT", "dependencies": { - "@rdfjs/data-model": "^1.0.1", - "@rdfjs/sink": "^1.0.2", - "n3": "^1.3.5", - "readable-stream": "^3.6.0", - "readable-to-readable": "^0.1.0" + "@rdfjs/data-model": "^2.0.1", + "@rdfjs/sink": "^2.0.0", + "duplex-to": "^2.0.0", + "jsonld-streaming-parser": "^3.0.0", + "readable-stream": "^4.2.0" } }, - "node_modules/@rdfjs/formats-common/node_modules/@rdfjs/serializer-jsonld": { - "version": "1.2.3", + "node_modules/@rdfjs/parser-jsonld/node_modules/duplex-to": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/@rdfjs/parser-jsonld/node_modules/readable-stream": { + "version": "4.4.0", "license": "MIT", "dependencies": { - "@rdfjs/namespace": "^1.1.0", - "@rdfjs/sink": "^1.0.3", - "readable-stream": "^3.6.0" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@rdfjs/formats-common/node_modules/@rdfjs/serializer-ntriples": { - "version": "1.0.3", + "node_modules/@rdfjs/parser-n3": { + "version": "2.0.1", "license": "MIT", "dependencies": { - "@rdfjs/sink": "^1.0.3", - "@rdfjs/to-ntriples": "^1.0.2", - "readable-to-readable": "^0.1.0" + "@rdfjs/data-model": "^2.0.1", + "@rdfjs/sink": "^2.0.0", + "duplex-to": "^2.0.0", + "n3": "^1.16.2", + "readable-stream": "^4.2.0" } }, - "node_modules/@rdfjs/formats-common/node_modules/@rdfjs/sink": { - "version": "1.0.3", - "license": "MIT", - "engines": { - "node": ">=6" - } + "node_modules/@rdfjs/parser-n3/node_modules/duplex-to": { + "version": "2.0.0", + "license": "MIT" }, - "node_modules/@rdfjs/formats-common/node_modules/@rdfjs/sink-map": { - "version": "1.0.1", + "node_modules/@rdfjs/parser-n3/node_modules/readable-stream": { + "version": "4.4.0", "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10" + }, "engines": { - "node": ">=6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@rdfjs/formats-common/node_modules/@rdfjs/to-ntriples": { - "version": "1.0.2", + "node_modules/@rdfjs/prefix-map": { + "version": "0.1.1", "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "readable-stream": "^4.3.0" } }, - "node_modules/@rdfjs/formats-common/node_modules/jsonld-streaming-parser": { - "version": "2.4.3", + "node_modules/@rdfjs/prefix-map/node_modules/readable-stream": { + "version": "4.5.2", "license": "MIT", "dependencies": { - "@rdfjs/types": "*", - "@types/http-link-header": "^1.0.1", - "canonicalize": "^1.0.1", - "http-link-header": "^1.0.2", - "jsonld-context-parser": "^2.1.3", - "jsonparse": "^1.3.1", - "rdf-data-factory": "^1.1.0" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@rdfjs/namespace": { + "node_modules/@rdfjs/serializer-jsonld": { "version": "2.0.0", "license": "MIT", "dependencies": { - "@rdfjs/data-model": "^2.0.0" + "@rdfjs/sink": "^2.0.0", + "readable-stream": "^4.2.0" } }, - "node_modules/@rdfjs/parser-jsonld": { - "version": "2.1.0", + "node_modules/@rdfjs/serializer-jsonld-ext": { + "version": "4.0.0", "license": "MIT", "dependencies": { - "@rdfjs/data-model": "^2.0.1", "@rdfjs/sink": "^2.0.0", - "duplex-to": "^2.0.0", - "jsonld-streaming-parser": "^3.0.0", - "readable-stream": "^4.2.0" + "jsonld": "^8.1.0", + "readable-stream": "^4.3.0", + "stream-chunks": "^1.0.0" } }, - "node_modules/@rdfjs/parser-jsonld/node_modules/duplex-to": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/@rdfjs/parser-jsonld/node_modules/readable-stream": { - "version": "4.4.0", + "node_modules/@rdfjs/serializer-jsonld-ext/node_modules/readable-stream": { + "version": "4.5.2", "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", - "process": "^0.11.10" + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@rdfjs/parser-n3": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "@rdfjs/data-model": "^2.0.1", - "@rdfjs/sink": "^2.0.0", - "duplex-to": "^2.0.0", - "n3": "^1.16.2", - "readable-stream": "^4.2.0" - } - }, - "node_modules/@rdfjs/parser-n3/node_modules/duplex-to": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/@rdfjs/parser-n3/node_modules/readable-stream": { + "node_modules/@rdfjs/serializer-jsonld/node_modules/readable-stream": { "version": "4.4.0", "license": "MIT", "dependencies": { @@ -5141,15 +5192,20 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@rdfjs/serializer-jsonld": { + "node_modules/@rdfjs/serializer-ntriples": { "version": "2.0.0", "license": "MIT", "dependencies": { - "@rdfjs/sink": "^2.0.0", + "@rdfjs/to-ntriples": "^2.0.0", + "duplex-to": "^2.0.0", "readable-stream": "^4.2.0" } }, - "node_modules/@rdfjs/serializer-jsonld/node_modules/readable-stream": { + "node_modules/@rdfjs/serializer-ntriples/node_modules/duplex-to": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/@rdfjs/serializer-ntriples/node_modules/readable-stream": { "version": "4.4.0", "license": "MIT", "dependencies": { @@ -5162,27 +5218,30 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@rdfjs/serializer-ntriples": { - "version": "2.0.0", + "node_modules/@rdfjs/serializer-turtle": { + "version": "1.1.2", "license": "MIT", "dependencies": { + "@rdfjs/data-model": "^2.0.1", + "@rdfjs/namespace": "^2.0.0", + "@rdfjs/prefix-map": "^0.1.1", + "@rdfjs/sink": "^2.0.0", + "@rdfjs/term-map": "^2.0.0", "@rdfjs/to-ntriples": "^2.0.0", - "duplex-to": "^2.0.0", - "readable-stream": "^4.2.0" + "@rdfjs/tree": "^0.2.1", + "readable-stream": "^4.3.0", + "stream-chunks": "^1.0.0" } }, - "node_modules/@rdfjs/serializer-ntriples/node_modules/duplex-to": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/@rdfjs/serializer-ntriples/node_modules/readable-stream": { - "version": "4.4.0", + "node_modules/@rdfjs/serializer-turtle/node_modules/readable-stream": { + "version": "4.5.2", "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", - "process": "^0.11.10" + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5257,12 +5316,20 @@ }, "node_modules/@rdfjs/traverser": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@rdfjs/traverser/-/traverser-0.1.2.tgz", - "integrity": "sha512-EBB/p9LrTMzupZ6VlxtBXyL0bdXFY7e5lAp2tHNwxOoe3kcR6hOJFVWdPT7pdWaSotyXbTIEQxG4PkXMw/OY7w==", + "license": "MIT", "dependencies": { "@rdfjs/to-ntriples": "^2.0.0" } }, + "node_modules/@rdfjs/tree": { + "version": "0.2.1", + "license": "MIT", + "dependencies": { + "@rdfjs/namespace": "^2.0.0", + "@rdfjs/term-map": "^2.0.0", + "@rdfjs/term-set": "^2.0.1" + } + }, "node_modules/@rdfjs/types": { "version": "1.1.0", "license": "MIT", @@ -5326,8 +5393,7 @@ }, "node_modules/@smithy/abort-controller": { "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.15.tgz", - "integrity": "sha512-JkS36PIS3/UCbq/MaozzV7jECeL+BTt4R75bwY8i+4RASys4xOyUS1HsRyUNSqUXFP4QyCz5aNnh3ltuaxv+pw==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^2.7.0", "tslib": "^2.5.0" @@ -5338,16 +5404,14 @@ }, "node_modules/@smithy/chunked-blob-reader": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-2.0.0.tgz", - "integrity": "sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.5.0" } }, "node_modules/@smithy/chunked-blob-reader-native": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-2.0.1.tgz", - "integrity": "sha512-N2oCZRglhWKm7iMBu7S6wDzXirjAofi7tAd26cxmgibRYOBS4D3hGfmkwCpHdASZzwZDD8rluh0Rcqw1JeZDRw==", + "license": "Apache-2.0", "dependencies": { "@smithy/util-base64": "^2.0.1", "tslib": "^2.5.0" @@ -5355,8 +5419,7 @@ }, "node_modules/@smithy/config-resolver": { "version": "2.0.21", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.21.tgz", - "integrity": "sha512-rlLIGT+BeqjnA6C2FWumPRJS1UW07iU5ZxDHtFuyam4W65gIaOFMjkB90ofKCIh+0mLVQrQFrl/VLtQT/6FWTA==", + "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^2.1.8", "@smithy/types": "^2.7.0", @@ -5370,8 +5433,7 @@ }, "node_modules/@smithy/core": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.2.1.tgz", - "integrity": "sha512-f6cwmMuHo7RIw/c184NBd2rGeGvGIX6p55HSrG5jfR3qkNYo80PHRfhzkJMq1+mv1ZjI5p8NhenWMMkIRJR4tw==", + "license": "Apache-2.0", "dependencies": { "@smithy/middleware-endpoint": "^2.2.3", "@smithy/middleware-retry": "^2.0.25", @@ -5388,8 +5450,7 @@ }, "node_modules/@smithy/credential-provider-imds": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.4.tgz", - "integrity": "sha512-cwPJN1fa1YOQzhBlTXRavABEYRRchci1X79QRwzaNLySnIMJfztyv1Zkst0iZPLMnpn8+CnHu3wOHS11J5Dr3A==", + "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^2.1.8", "@smithy/property-provider": "^2.0.16", @@ -5403,8 +5464,7 @@ }, "node_modules/@smithy/eventstream-codec": { "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.15.tgz", - "integrity": "sha512-crjvz3j1gGPwA0us6cwS7+5gAn35CTmqu/oIxVbYJo2Qm/sGAye6zGJnMDk3BKhWZw5kcU1G4MxciTkuBpOZPg==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "3.0.0", "@smithy/types": "^2.7.0", @@ -5414,8 +5474,7 @@ }, "node_modules/@smithy/eventstream-serde-browser": { "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.0.15.tgz", - "integrity": "sha512-WiFG5N9j3jmS5P0z5Xev6dO0c3lf7EJYC2Ncb0xDnWFvShwXNn741AF71ABr5EcZw8F4rQma0362MMjAwJeZog==", + "license": "Apache-2.0", "dependencies": { "@smithy/eventstream-serde-universal": "^2.0.15", "@smithy/types": "^2.7.0", @@ -5427,8 +5486,7 @@ }, "node_modules/@smithy/eventstream-serde-config-resolver": { "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.0.15.tgz", - "integrity": "sha512-o65d2LRjgCbWYH+VVNlWXtmsI231SO99ZTOL4UuIPa6WTjbSHWtlXvUcJG9libhEKWmEV9DIUiH2IqyPWi7ubA==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^2.7.0", "tslib": "^2.5.0" @@ -5439,8 +5497,7 @@ }, "node_modules/@smithy/eventstream-serde-node": { "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.0.15.tgz", - "integrity": "sha512-9OOXiIhHq1VeOG6xdHkn2ZayfMYM3vzdUTV3zhcCnt+tMqA3BJK3XXTJFRR2BV28rtRM778DzqbBTf+hqwQPTg==", + "license": "Apache-2.0", "dependencies": { "@smithy/eventstream-serde-universal": "^2.0.15", "@smithy/types": "^2.7.0", @@ -5452,8 +5509,7 @@ }, "node_modules/@smithy/eventstream-serde-universal": { "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.0.15.tgz", - "integrity": "sha512-dP8AQp/pXlWBjvL0TaPBJC3rM0GoYv7O0Uim8d/7UKZ2Wo13bFI3/BhQfY/1DeiP1m23iCHFNFtOQxfQNBB8rQ==", + "license": "Apache-2.0", "dependencies": { "@smithy/eventstream-codec": "^2.0.15", "@smithy/types": "^2.7.0", @@ -5465,8 +5521,7 @@ }, "node_modules/@smithy/fetch-http-handler": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.3.1.tgz", - "integrity": "sha512-6MNk16fqb8EwcYY8O8WxB3ArFkLZ2XppsSNo1h7SQcFdDDwIumiJeO6wRzm7iB68xvsOQzsdQKbdtTieS3hfSQ==", + "license": "Apache-2.0", "dependencies": { "@smithy/protocol-http": "^3.0.11", "@smithy/querystring-builder": "^2.0.15", @@ -5477,8 +5532,7 @@ }, "node_modules/@smithy/hash-blob-browser": { "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-2.0.16.tgz", - "integrity": "sha512-cSYRi05LA7DZDwjB1HL0BP8B56eUNNeLglVH147QTXFyuXJq/7erAIiLRfsyXB8+GfFHkSS5BHbc76a7k/AYPA==", + "license": "Apache-2.0", "dependencies": { "@smithy/chunked-blob-reader": "^2.0.0", "@smithy/chunked-blob-reader-native": "^2.0.1", @@ -5488,8 +5542,7 @@ }, "node_modules/@smithy/hash-node": { "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.17.tgz", - "integrity": "sha512-Il6WuBcI1nD+e2DM7tTADMf01wEPGK8PAhz4D+YmDUVaoBqlA+CaH2uDJhiySifmuKBZj748IfygXty81znKhw==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^2.7.0", "@smithy/util-buffer-from": "^2.0.0", @@ -5502,8 +5555,7 @@ }, "node_modules/@smithy/hash-stream-node": { "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-2.0.17.tgz", - "integrity": "sha512-ey8DtnATzp1mOXgS7rqMwSmAki6iJA+jgNucKcxRkhMB1rrICfHg+rhmIF50iLPDHUhTcS5pBMOrLzzpZftvNQ==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^2.7.0", "@smithy/util-utf8": "^2.0.2", @@ -5515,8 +5567,7 @@ }, "node_modules/@smithy/invalid-dependency": { "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.15.tgz", - "integrity": "sha512-dlEKBFFwVfzA5QroHlBS94NpgYjXhwN/bFfun+7w3rgxNvVy79SK0w05iGc7UAeC5t+D7gBxrzdnD6hreZnDVQ==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^2.7.0", "tslib": "^2.5.0" @@ -5524,8 +5575,7 @@ }, "node_modules/@smithy/is-array-buffer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", - "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.5.0" }, @@ -5535,8 +5585,7 @@ }, "node_modules/@smithy/md5-js": { "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.0.17.tgz", - "integrity": "sha512-jmISTCnEkOnm2oCNx/rMkvBT/eQh3aA6nktevkzbmn/VYqYEuc5Z2n5sTTqsciMSO01Lvf56wG1A4twDqovYeQ==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^2.7.0", "@smithy/util-utf8": "^2.0.2", @@ -5545,8 +5594,7 @@ }, "node_modules/@smithy/middleware-content-length": { "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.17.tgz", - "integrity": "sha512-OyadvMcKC7lFXTNBa8/foEv7jOaqshQZkjWS9coEXPRZnNnihU/Ls+8ZuJwGNCOrN2WxXZFmDWhegbnM4vak8w==", + "license": "Apache-2.0", "dependencies": { "@smithy/protocol-http": "^3.0.11", "@smithy/types": "^2.7.0", @@ -5558,8 +5606,7 @@ }, "node_modules/@smithy/middleware-endpoint": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.2.3.tgz", - "integrity": "sha512-nYfxuq0S/xoAjdLbyn1ixeVB6cyH9wYCMtbbOCpcCRYR5u2mMtqUtVjjPAZ/DIdlK3qe0tpB0Q76szFGNuz+kQ==", + "license": "Apache-2.0", "dependencies": { "@smithy/middleware-serde": "^2.0.15", "@smithy/node-config-provider": "^2.1.8", @@ -5575,8 +5622,7 @@ }, "node_modules/@smithy/middleware-retry": { "version": "2.0.25", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.25.tgz", - "integrity": "sha512-FXhafCPvx/9L9OgHJ3cdo/pD1f7ngC7DKsjDV2J7k6LO/Yl69POoBLk4sI1OZPUGc4dfxriENlTma9Nj1hI+IQ==", + "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^2.1.8", "@smithy/protocol-http": "^3.0.11", @@ -5594,16 +5640,14 @@ }, "node_modules/@smithy/middleware-retry/node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/@smithy/middleware-serde": { "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.15.tgz", - "integrity": "sha512-FOZRFk/zN4AT4wzGuBY+39XWe+ZnCFd0gZtyw3f9Okn2CJPixl9GyWe98TIaljeZdqWkgrzGyPre20AcW2UMHQ==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^2.7.0", "tslib": "^2.5.0" @@ -5614,8 +5658,7 @@ }, "node_modules/@smithy/middleware-stack": { "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.9.tgz", - "integrity": "sha512-bCB5dUtGQ5wh7QNL2ELxmDc6g7ih7jWU3Kx6MYH1h4mZbv9xL3WyhKHojRltThCB1arLPyTUFDi+x6fB/oabtA==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^2.7.0", "tslib": "^2.5.0" @@ -5626,8 +5669,7 @@ }, "node_modules/@smithy/node-config-provider": { "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.8.tgz", - "integrity": "sha512-+w26OKakaBUGp+UG+dxYZtFb5fs3tgHg3/QrRrmUZj+rl3cIuw840vFUXX35cVPTUCQIiTqmz7CpVF7+hdINdQ==", + "license": "Apache-2.0", "dependencies": { "@smithy/property-provider": "^2.0.16", "@smithy/shared-ini-file-loader": "^2.2.7", @@ -5640,8 +5682,7 @@ }, "node_modules/@smithy/node-http-handler": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.2.1.tgz", - "integrity": "sha512-8iAKQrC8+VFHPAT8pg4/j6hlsTQh+NKOWlctJBrYtQa4ExcxX7aSg3vdQ2XLoYwJotFUurg/NLqFCmZaPRrogw==", + "license": "Apache-2.0", "dependencies": { "@smithy/abort-controller": "^2.0.15", "@smithy/protocol-http": "^3.0.11", @@ -5655,8 +5696,7 @@ }, "node_modules/@smithy/property-provider": { "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.16.tgz", - "integrity": "sha512-28Ky0LlOqtEjwg5CdHmwwaDRHcTWfPRzkT6HrhwOSRS2RryAvuDfJrZpM+BMcrdeCyEg1mbcgIMoqTla+rdL8Q==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^2.7.0", "tslib": "^2.5.0" @@ -5667,8 +5707,7 @@ }, "node_modules/@smithy/protocol-http": { "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.11.tgz", - "integrity": "sha512-3ziB8fHuXIRamV/akp/sqiWmNPR6X+9SB8Xxnozzj+Nq7hSpyKdFHd1FLpBkgfGFUTzzcBJQlDZPSyxzmdcx5A==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^2.7.0", "tslib": "^2.5.0" @@ -5679,8 +5718,7 @@ }, "node_modules/@smithy/querystring-builder": { "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.15.tgz", - "integrity": "sha512-e1q85aT6HutvouOdN+dMsN0jcdshp50PSCvxDvo6aIM57LqeXimjfONUEgfqQ4IFpYWAtVixptyIRE5frMp/2A==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^2.7.0", "@smithy/util-uri-escape": "^2.0.0", @@ -5692,8 +5730,7 @@ }, "node_modules/@smithy/querystring-parser": { "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.15.tgz", - "integrity": "sha512-jbBvoK3cc81Cj1c1TH1qMYxNQKHrYQ2DoTntN9FBbtUWcGhc+T4FP6kCKYwRLXyU4AajwGIZstvNAmIEgUUNTQ==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^2.7.0", "tslib": "^2.5.0" @@ -5704,8 +5741,7 @@ }, "node_modules/@smithy/service-error-classification": { "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.8.tgz", - "integrity": "sha512-jCw9+005im8tsfYvwwSc4TTvd29kXRFkH9peQBg5R/4DD03ieGm6v6Hpv9nIAh98GwgYg1KrztcINC1s4o7/hg==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^2.7.0" }, @@ -5715,8 +5751,7 @@ }, "node_modules/@smithy/shared-ini-file-loader": { "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.7.tgz", - "integrity": "sha512-0Qt5CuiogIuvQIfK+be7oVHcPsayLgfLJGkPlbgdbl0lD28nUKu4p11L+UG3SAEsqc9UsazO+nErPXw7+IgDpQ==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^2.7.0", "tslib": "^2.5.0" @@ -5727,8 +5762,7 @@ }, "node_modules/@smithy/signature-v4": { "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.18.tgz", - "integrity": "sha512-SJRAj9jT/l9ocm8D0GojMbnA1sp7I4JeStOQ4lEXI8A5eHE73vbjlzlqIFB7cLvIgau0oUl4cGVpF9IGCrvjlw==", + "license": "Apache-2.0", "dependencies": { "@smithy/eventstream-codec": "^2.0.15", "@smithy/is-array-buffer": "^2.0.0", @@ -5745,8 +5779,7 @@ }, "node_modules/@smithy/smithy-client": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.2.0.tgz", - "integrity": "sha512-C/bkNue5H5Obgl83SnlBt4v6VM68CqIjIELh3vAabud87xFYznLNKtj6Qb69Z+QOnLp9T+We++sEem/f2AHE+Q==", + "license": "Apache-2.0", "dependencies": { "@smithy/middleware-endpoint": "^2.2.3", "@smithy/middleware-stack": "^2.0.9", @@ -5761,8 +5794,7 @@ }, "node_modules/@smithy/types": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.7.0.tgz", - "integrity": "sha512-1OIFyhK+vOkMbu4aN2HZz/MomREkrAC/HqY5mlJMUJfGrPRwijJDTeiN8Rnj9zUaB8ogXAfIOtZrrgqZ4w7Wnw==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.5.0" }, @@ -5772,8 +5804,7 @@ }, "node_modules/@smithy/url-parser": { "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.15.tgz", - "integrity": "sha512-sADUncUj9rNbOTrdDGm4EXlUs0eQ9dyEo+V74PJoULY4jSQxS+9gwEgsPYyiu8PUOv16JC/MpHonOgqP/IEDZA==", + "license": "Apache-2.0", "dependencies": { "@smithy/querystring-parser": "^2.0.15", "@smithy/types": "^2.7.0", @@ -5782,8 +5813,7 @@ }, "node_modules/@smithy/util-base64": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.1.tgz", - "integrity": "sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ==", + "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^2.0.0", "tslib": "^2.5.0" @@ -5794,16 +5824,14 @@ }, "node_modules/@smithy/util-body-length-browser": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.1.tgz", - "integrity": "sha512-NXYp3ttgUlwkaug4bjBzJ5+yIbUbUx8VsSLuHZROQpoik+gRkIBeEG9MPVYfvPNpuXb/puqodeeUXcKFe7BLOQ==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.5.0" } }, "node_modules/@smithy/util-body-length-node": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", - "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.5.0" }, @@ -5813,8 +5841,7 @@ }, "node_modules/@smithy/util-buffer-from": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", - "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^2.0.0", "tslib": "^2.5.0" @@ -5825,8 +5852,7 @@ }, "node_modules/@smithy/util-config-provider": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", - "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.5.0" }, @@ -5836,8 +5862,7 @@ }, "node_modules/@smithy/util-defaults-mode-browser": { "version": "2.0.23", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.23.tgz", - "integrity": "sha512-2u+7t7Wgz1jlfsf6il3pz6DIzyJHS3qrnNnmATICm00pQeqp2D4kUOYauOgKGIeKgVpwzzq8+hFQe749r3xR5w==", + "license": "Apache-2.0", "dependencies": { "@smithy/property-provider": "^2.0.16", "@smithy/smithy-client": "^2.2.0", @@ -5851,8 +5876,7 @@ }, "node_modules/@smithy/util-defaults-mode-node": { "version": "2.0.30", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.30.tgz", - "integrity": "sha512-nmcmEyRlClNprp7mBnUzfmW6HrKQK+yvl+cyXCRUoQSxRvZuLDrztV+JD+zr3qV/oirEc4Q0QNIrrhTDCE6JeA==", + "license": "Apache-2.0", "dependencies": { "@smithy/config-resolver": "^2.0.21", "@smithy/credential-provider-imds": "^2.1.4", @@ -5868,8 +5892,7 @@ }, "node_modules/@smithy/util-endpoints": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.7.tgz", - "integrity": "sha512-Q2gEind3jxoLk6hdKWyESMU7LnXz8aamVwM+VeVjOYzYT1PalGlY/ETa48hv2YpV4+YV604y93YngyzzzQ4IIA==", + "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^2.1.8", "@smithy/types": "^2.7.0", @@ -5881,8 +5904,7 @@ }, "node_modules/@smithy/util-hex-encoding": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", - "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.5.0" }, @@ -5892,8 +5914,7 @@ }, "node_modules/@smithy/util-middleware": { "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.8.tgz", - "integrity": "sha512-qkvqQjM8fRGGA8P2ydWylMhenCDP8VlkPn8kiNuFEaFz9xnUKC2irfqsBSJrfrOB9Qt6pQsI58r3zvvumhFMkw==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^2.7.0", "tslib": "^2.5.0" @@ -5904,8 +5925,7 @@ }, "node_modules/@smithy/util-retry": { "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.8.tgz", - "integrity": "sha512-cQTPnVaVFMjjS6cb44WV2yXtHVyXDC5icKyIbejMarJEApYeJWpBU3LINTxHqp/tyLI+MZOUdosr2mZ3sdziNg==", + "license": "Apache-2.0", "dependencies": { "@smithy/service-error-classification": "^2.0.8", "@smithy/types": "^2.7.0", @@ -5917,8 +5937,7 @@ }, "node_modules/@smithy/util-stream": { "version": "2.0.23", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.23.tgz", - "integrity": "sha512-OJMWq99LAZJUzUwTk+00plyxX3ESktBaGPhqNIEVab+53gLULiWN9B/8bRABLg0K6R6Xg4t80uRdhk3B/LZqMQ==", + "license": "Apache-2.0", "dependencies": { "@smithy/fetch-http-handler": "^2.3.1", "@smithy/node-http-handler": "^2.2.1", @@ -6046,8 +6065,7 @@ }, "node_modules/@smithy/util-uri-escape": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", - "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.5.0" }, @@ -6057,8 +6075,7 @@ }, "node_modules/@smithy/util-utf8": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.2.tgz", - "integrity": "sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA==", + "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^2.0.0", "tslib": "^2.5.0" @@ -6069,8 +6086,7 @@ }, "node_modules/@smithy/util-waiter": { "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.15.tgz", - "integrity": "sha512-9Y+btzzB7MhLADW7xgD6SjvmoYaRkrb/9SCbNGmNdfO47v38rxb90IGXyDtAK0Shl9bMthTmLgjlfYc+vtz2Qw==", + "license": "Apache-2.0", "dependencies": { "@smithy/abort-controller": "^2.0.15", "@smithy/types": "^2.7.0", @@ -6089,10 +6105,9 @@ } }, "node_modules/@tpluscode/eslint-config": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@tpluscode/eslint-config/-/eslint-config-0.4.4.tgz", - "integrity": "sha512-pAGt5d+ISIuM9TYcTVhNstYezg98cpCxF8Sk3dHtgneKPysJPaLHRsD246KZW4bwfQ4lZUOKFircyJVjHX6Pwg==", + "version": "0.4.5", "dev": true, + "license": "MIT", "optionalDependencies": { "@typescript-eslint/eslint-plugin": ">=2", "@typescript-eslint/parser": ">=2", @@ -6106,13 +6121,13 @@ "eslint-plugin-node": ">=11", "eslint-plugin-promise": ">=6", "eslint-plugin-require-extensions": ">=0.1.3", + "eslint-plugin-unused-imports": "^3.0.0", "standard": ">=11" } }, "node_modules/@tpluscode/rdf-ns-builders": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tpluscode/rdf-ns-builders/-/rdf-ns-builders-4.3.0.tgz", - "integrity": "sha512-x3uh9mYwAU+PrALaDKhVjml1TCCWWduo6J8rybd9SMEEAoooXq1MYb13MRputjRT/kYaFyCND7LMobzhxZ/+bg==", + "license": "MIT", "dependencies": { "@rdfjs/data-model": "^2", "@rdfjs/namespace": "^2", @@ -6122,39 +6137,34 @@ } }, "node_modules/@tpluscode/rdf-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@tpluscode/rdf-string/-/rdf-string-1.1.0.tgz", - "integrity": "sha512-n9RUQmeGS4V7Pj+zx/baURoFEia9ajmvwk4nG6pslgOMT3zp+d79dA20IjlOgC9zyYeH5bmMirXmIVOjeke3rQ==", + "version": "1.1.2", "dev": true, + "license": "MIT", "dependencies": { "@rdfjs/types": "*", - "@zazuko/env": "^1.5.2", + "@zazuko/env": "^2", "@zazuko/prefixes": ">=1" } }, "node_modules/@tsconfig/node10": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.1", @@ -6202,9 +6212,8 @@ }, "node_modules/@types/duplex-to": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/duplex-to/-/duplex-to-1.0.3.tgz", - "integrity": "sha512-iSW0wk0D6/ACGiA0OlR1Hml8N0fIdfLTGvOhJm2Ps7dcjH08pzEmnAtOLzU23LMXgYuMiEpaqOxmBty8bcQgRg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/readable-stream": "*" @@ -6212,18 +6221,24 @@ }, "node_modules/@types/duplexify": { "version": "3.6.4", - "resolved": "https://registry.npmjs.org/@types/duplexify/-/duplexify-3.6.4.tgz", - "integrity": "sha512-2eahVPsd+dy3CL6FugAzJcxoraWhUghZGEQJns1kTKfCXWKJ5iG/VkaB05wRVrDKHfOFKqb0X0kXh91eE99RZg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, + "node_modules/@types/file-fetch": { + "version": "1.6.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node-fetch": "*" + } + }, "node_modules/@types/glob": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, + "license": "MIT", "dependencies": { "@types/minimatch": "*", "@types/node": "*" @@ -6276,9 +6291,8 @@ }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -6288,20 +6302,22 @@ }, "node_modules/@types/jsonld": { "version": "1.5.9", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/lodash": { "version": "4.14.202", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", - "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime-types": { + "version": "2.1.4", + "dev": true, + "license": "MIT" }, "node_modules/@types/minimatch": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/minimist": { "version": "1.2.2", @@ -6310,18 +6326,38 @@ }, "node_modules/@types/mocha": { "version": "10.0.6", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz", - "integrity": "sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { "version": "18.19.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.2.tgz", - "integrity": "sha512-6wzfBdbWpe8QykUkXBjtmO3zITA0A3FIjoy+in0Y2K4KrCiRhNYJIdwAPDffZ3G6GnaKaSLSEa9ZuORLfEoiwg==", + "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } }, + "node_modules/@types/node-fetch": { + "version": "2.6.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/node-fetch/node_modules/form-data": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", "dev": true, @@ -6329,9 +6365,8 @@ }, "node_modules/@types/parallel-transform": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@types/parallel-transform/-/parallel-transform-1.1.4.tgz", - "integrity": "sha512-Dlw8uStux7ZL3FuKgw3h+zeBPv1gmJySEvyCuACjKzr6Aco43hW4LHHkmwsL6w8Q9GldlhdJwyRsFxyz/uwlqA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -6343,25 +6378,36 @@ }, "node_modules/@types/promise-the-world": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/promise-the-world/-/promise-the-world-1.0.6.tgz", - "integrity": "sha512-Zj9XGVMO/mPq/dG3vuTvOr/AgbEfAwW3t+vIZ8x6QQ7MmUQQPXpVVl0UljXupQm1nbUA8qgP9AlEioMngAhuCg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/@types/proto-fetch": { + "version": "1.0.5", + "dev": true, + "license": "MIT" }, "node_modules/@types/rdf-dataset-ext": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/rdf-dataset-ext/-/rdf-dataset-ext-1.0.6.tgz", - "integrity": "sha512-gSKGOXk4z4AQcK+dnb4SUbtXC1sLbYraOueqJ2luHvA//sSC4IfeyjVH9/rXi3tnfyEtNA037WSR8Og4ROfAlA==", + "license": "MIT", "peer": true, "dependencies": { "@types/readable-stream": "*", "rdf-js": "^4.0.2" } }, + "node_modules/@types/rdf-transform-triple-to-quad": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@rdfjs/types": ">=1.0.0", + "@types/readable-stream": "*" + } + }, "node_modules/@types/rdf-validate-shacl": { "version": "0.4.6", - "resolved": "https://registry.npmjs.org/@types/rdf-validate-shacl/-/rdf-validate-shacl-0.4.6.tgz", - "integrity": "sha512-Hh/iZjZsW1Rbj6UPyDe8hZZRXxZXzW7wB5HBRxwHrk/DdBCjlylTUFVPGTcTGiIIetL1Ibnz3n9lrX6Hne1PoQ==", "dev": true, + "license": "MIT", "dependencies": { "@rdfjs/types": "*", "@types/clownface": "*", @@ -6369,7 +6415,7 @@ } }, "node_modules/@types/rdfjs__data-model": { - "version": "2.0.4", + "version": "2.0.7", "license": "MIT", "peer": true, "dependencies": { @@ -6377,7 +6423,7 @@ } }, "node_modules/@types/rdfjs__dataset": { - "version": "2.0.3", + "version": "2.0.7", "license": "MIT", "peer": true, "dependencies": { @@ -6385,36 +6431,53 @@ } }, "node_modules/@types/rdfjs__environment": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@types/rdfjs__environment/-/rdfjs__environment-0.1.9.tgz", - "integrity": "sha512-u7NUsgI2r0X06JXY8lMqcvEpgjVv1eL8lh//CGRsN6ovgA5RKYiTjedU80No21vPU/LEQ3wB8fJ5diMPy+IDDw==", + "version": "1.0.0", + "license": "MIT", "peer": true, "dependencies": { "@rdfjs/types": "*", + "@types/node": "*" + } + }, + "node_modules/@types/rdfjs__fetch": { + "version": "3.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@rdfjs/types": ">=1.0.0", "@types/node": "*", - "@types/rdfjs__data-model": "*", - "@types/rdfjs__dataset": "*", - "@types/rdfjs__namespace": "*", - "@types/rdfjs__sink-map": "*", - "@types/rdfjs__term-map": "*", - "@types/rdfjs__term-set": "*" + "@types/rdfjs__fetch-lite": "*" } }, "node_modules/@types/rdfjs__fetch-lite": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/rdfjs__fetch-lite/-/rdfjs__fetch-lite-3.0.7.tgz", - "integrity": "sha512-xqxtNe01Z3kkzXQMbb8IhqzyMbP073sTFkegjlABOyTIwHQtAM5lgQiAunrtGpAnLdsD1Qp2qunxvB+WssFl2A==", - "peer": true, + "version": "3.0.8", + "license": "MIT", "dependencies": { "@rdfjs/types": "*", "@types/node": "*", "@types/rdfjs__formats-common": "*" } }, + "node_modules/@types/rdfjs__formats": { + "version": "4.0.0", + "license": "MIT", + "peer": true, + "dependencies": { + "@rdfjs/types": ">=1.0.0", + "@types/node": "*", + "@types/rdfjs__parser-jsonld": "*", + "@types/rdfjs__parser-n3": "*", + "@types/rdfjs__serializer-jsonld": "*", + "@types/rdfjs__serializer-jsonld-ext": "*", + "@types/rdfjs__serializer-ntriples": "*", + "@types/rdfjs__serializer-turtle": "*", + "@types/rdfjs__sink-map": "*", + "rdfxml-streaming-parser": ">=2" + } + }, "node_modules/@types/rdfjs__formats-common": { "version": "3.1.0", "license": "MIT", - "peer": true, "dependencies": { "@types/rdfjs__parser-jsonld": "*", "@types/rdfjs__parser-n3": "*", @@ -6428,7 +6491,6 @@ "node_modules/@types/rdfjs__formats-common/node_modules/rdfxml-streaming-parser": { "version": "2.2.3", "license": "MIT", - "peer": true, "dependencies": { "@rdfjs/types": "*", "@rubensworks/saxes": "^6.0.1", @@ -6443,6 +6505,35 @@ "node_modules/@types/rdfjs__formats-common/node_modules/readable-stream": { "version": "4.4.2", "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@types/rdfjs__formats/node_modules/rdfxml-streaming-parser": { + "version": "2.4.0", + "license": "MIT", + "peer": true, + "dependencies": { + "@rdfjs/types": "*", + "@rubensworks/saxes": "^6.0.1", + "@types/readable-stream": "^2.3.13", + "buffer": "^6.0.3", + "rdf-data-factory": "^1.1.0", + "readable-stream": "^4.4.2", + "relative-to-absolute-iri": "^1.0.0", + "validate-iri": "^1.0.0" + } + }, + "node_modules/@types/rdfjs__formats/node_modules/readable-stream": { + "version": "4.5.2", + "license": "MIT", "peer": true, "dependencies": { "abort-controller": "^3.0.0", @@ -6456,7 +6547,7 @@ } }, "node_modules/@types/rdfjs__namespace": { - "version": "2.0.4", + "version": "2.0.10", "license": "MIT", "dependencies": { "@rdfjs/types": "*" @@ -6465,7 +6556,6 @@ "node_modules/@types/rdfjs__parser-jsonld": { "version": "2.1.1", "license": "MIT", - "peer": true, "dependencies": { "@types/jsonld": "*", "rdf-js": "^4.0.2" @@ -6474,37 +6564,61 @@ "node_modules/@types/rdfjs__parser-n3": { "version": "2.0.1", "license": "MIT", - "peer": true, "dependencies": { "rdf-js": "^4.0.2" } }, + "node_modules/@types/rdfjs__prefix-map": { + "version": "0.1.5", + "license": "MIT", + "peer": true, + "dependencies": { + "@rdfjs/types": "*" + } + }, "node_modules/@types/rdfjs__serializer-jsonld": { "version": "2.0.0", "license": "MIT", - "peer": true, "dependencies": { "rdf-js": "^4.0.2" } }, + "node_modules/@types/rdfjs__serializer-jsonld-ext": { + "version": "4.0.0", + "license": "MIT", + "peer": true, + "dependencies": { + "@rdfjs/types": ">=1.0.0", + "@types/jsonld": "*", + "@types/node": "*" + } + }, "node_modules/@types/rdfjs__serializer-ntriples": { "version": "2.0.1", "license": "MIT", - "peer": true, "dependencies": { "rdf-js": "^4.0.2" } }, + "node_modules/@types/rdfjs__serializer-turtle": { + "version": "1.1.0", + "license": "MIT", + "peer": true, + "dependencies": { + "@rdfjs/types": ">=1.0.0", + "@types/node": "*", + "@types/rdfjs__prefix-map": "*" + } + }, "node_modules/@types/rdfjs__sink-map": { "version": "2.0.1", "license": "MIT", - "peer": true, "dependencies": { "@rdfjs/types": "*" } }, "node_modules/@types/rdfjs__term-map": { - "version": "2.0.5", + "version": "2.0.9", "license": "MIT", "peer": true, "dependencies": { @@ -6512,7 +6626,7 @@ } }, "node_modules/@types/rdfjs__term-set": { - "version": "2.0.4", + "version": "2.0.8", "license": "MIT", "peer": true, "dependencies": { @@ -6521,8 +6635,7 @@ }, "node_modules/@types/rdfjs__traverser": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@types/rdfjs__traverser/-/rdfjs__traverser-0.1.4.tgz", - "integrity": "sha512-bjIl9UwA931xm8hWJWrUpodO9UCii6ypVJpULi7befJpaeOyhEkVuZVOlci+oLPX828jzcd/8E4HxSwHZIXuNA==", + "license": "MIT", "peer": true, "dependencies": { "@rdfjs/types": "*" @@ -6538,9 +6651,8 @@ }, "node_modules/@types/readable-to-readable": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@types/readable-to-readable/-/readable-to-readable-0.1.0.tgz", - "integrity": "sha512-a7r1nxyuywe4js62uqGvJHkdiaBqiYfFsQNT9D8/gFzrOB0h0DlAtbfJAHB9PZWlcMF90e2Moi0bSvpiSLxk1g==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -6565,9 +6677,8 @@ }, "node_modules/@types/sparql-http-client": { "version": "2.2.14", - "resolved": "https://registry.npmjs.org/@types/sparql-http-client/-/sparql-http-client-2.2.14.tgz", - "integrity": "sha512-mbpNHsX1jTns+oAvfsbQBqPmkryau3v5n0AGNbN08PS7LGASmh4PLr2lu6z6EiFUvjgNO6p++JVYaOzwyhrv7A==", "dev": true, + "license": "MIT", "dependencies": { "rdf-js": "^4.0.2" } @@ -6579,9 +6690,8 @@ }, "node_modules/@types/through2": { "version": "2.0.41", - "resolved": "https://registry.npmjs.org/@types/through2/-/through2-2.0.41.tgz", - "integrity": "sha512-ryQ0tidWkb1O1JuYvWKyMLYEtOWDqF5mHerJzKz/gQpoAaJq2l/dsMPBF0B5BNVT34rbARYJ5/tsZwLfUi2kwQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -6605,9 +6715,8 @@ }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.2.tgz", - "integrity": "sha512-3+9OGAWHhk4O1LlcwLBONbdXsAhLjyCFogJY/cWy2lxdVJ2JrcTF2pTGMaLl2AE7U1l31n8Py4a8bx5DLf/0dQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.5.1", "@typescript-eslint/scope-manager": "6.13.2", @@ -6654,9 +6763,8 @@ }, "node_modules/@typescript-eslint/parser": { "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.2.tgz", - "integrity": "sha512-MUkcC+7Wt/QOGeVlM8aGGJZy1XV5YKjTpq9jK6r6/iLsGXhBVaGP5N0UYvFsu9BFlSpwY9kMretzdBH01rkRXg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "6.13.2", "@typescript-eslint/types": "6.13.2", @@ -6682,9 +6790,8 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.2.tgz", - "integrity": "sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "6.13.2", "@typescript-eslint/visitor-keys": "6.13.2" @@ -6699,9 +6806,8 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.2.tgz", - "integrity": "sha512-Qr6ssS1GFongzH2qfnWKkAQmMUyZSyOr0W54nZNU1MDfo+U4Mv3XveeLZzadc/yq8iYhQZHYT+eoXJqnACM1tw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "6.13.2", "@typescript-eslint/utils": "6.13.2", @@ -6726,9 +6832,8 @@ }, "node_modules/@typescript-eslint/types": { "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.2.tgz", - "integrity": "sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==", "dev": true, + "license": "MIT", "engines": { "node": "^16.0.0 || >=18.0.0" }, @@ -6739,9 +6844,8 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.2.tgz", - "integrity": "sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "6.13.2", "@typescript-eslint/visitor-keys": "6.13.2", @@ -6766,9 +6870,8 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -6781,9 +6884,8 @@ }, "node_modules/@typescript-eslint/utils": { "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.2.tgz", - "integrity": "sha512-b9Ptq4eAZUym4idijCRzl61oPCwwREcfDI8xGk751Vhzig5fFZR9CyzDz4Sp/nxSLBYxUPyh4QdIDqWykFhNmQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", @@ -6806,15 +6908,13 @@ }, "node_modules/@typescript-eslint/utils/node_modules/@types/semver": { "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@typescript-eslint/utils/node_modules/semver": { "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -6827,9 +6927,8 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "6.13.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.2.tgz", - "integrity": "sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "6.13.2", "eslint-visitor-keys": "^3.4.1" @@ -6844,87 +6943,104 @@ }, "node_modules/@vocabulary/sh": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vocabulary/sh/-/sh-1.1.2.tgz", - "integrity": "sha512-1hXJe79ipXJbo/ywVGdefEcHPutedK2ilZv9G6op71wTibeUlCe1ik9OvnSeyH42RfLHqDs2vLvK3zH50RZS+w==" + "license": "MIT" }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" + "license": "BSD-2-Clause" }, "node_modules/@zazuko/env": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@zazuko/env/-/env-1.11.0.tgz", - "integrity": "sha512-NztltXvbai2IWx9Sf91/PNi7Gdac2imIJ3ygUtQTUG9nnwaJcujFFIZTnRUwUYo9OqGzZG2UCxi7mwZtcKIeag==", + "version": "2.0.3", + "license": "MIT", "dependencies": { + "@rdfjs/data-model": "^2.0.1", "@rdfjs/dataset": "^2.0.1", - "@rdfjs/environment": "^0.1.2", + "@rdfjs/environment": "^1.0.0", + "@rdfjs/namespace": "^2.0.0", + "@rdfjs/term-map": "^2.0.0", + "@rdfjs/term-set": "^2.0.1", "@rdfjs/traverser": "^0.1.2", "@tpluscode/rdf-ns-builders": "^4.1.0", "@zazuko/prefixes": "^2.1.0", - "clownface": "^2.0.1", + "clownface": "^2.0.2", "get-stream": "^8.0.1", "rdf-dataset-ext": "^1.1.0" }, "peerDependencies": { "@types/clownface": "^2.0.0", "@types/rdf-dataset-ext": "^1", - "@types/rdfjs__environment": "^0.1.7", - "@types/rdfjs__formats-common": "^3.1.0", + "@types/rdfjs__data-model": "^2.0.7", + "@types/rdfjs__dataset": "^2.0.7", + "@types/rdfjs__environment": "^1.0.0", + "@types/rdfjs__formats": "^4.0.0", + "@types/rdfjs__namespace": "^2.0.10", + "@types/rdfjs__term-map": "^2.0.9", + "@types/rdfjs__term-set": "^2.0.8", "@types/rdfjs__traverser": "^0.1.3" } }, "node_modules/@zazuko/env-node": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@zazuko/env-node/-/env-node-1.0.3.tgz", - "integrity": "sha512-VI5vxzqRAFcwiTKtgn8D+6sx2rm7ow9kLTlOr/xMZXn5iD7HtNnJYrsI9mZYEcu3iqt8anq7rWZFulMmikgPRg==", + "version": "2.1.1", + "license": "MIT", "dependencies": { - "@rdfjs/dataset": "^2.0.1", - "@rdfjs/environment": "^0.1.2", - "@rdfjs/fetch-lite": "^3.2.1", - "@rdfjs/formats-common": "^3.1.0", - "@rdfjs/traverser": "^0.1.2", - "@tpluscode/rdf-ns-builders": "^4.1.0", - "@zazuko/env": "^1.11.0", - "@zazuko/rdf-utils-fs": "^3.2.0", - "clownface": "^2.0.1" + "@rdfjs/fetch-lite": "^3.2.2", + "@rdfjs/formats": "^4.0.0", + "@zazuko/env": "^2.0.2", + "@zazuko/rdf-utils-fs": "^3.3.0" }, "peerDependencies": { "@types/rdfjs__fetch-lite": "^3.0.6" } }, - "node_modules/@zazuko/env-node/node_modules/@rdfjs/formats-common": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rdfjs/formats-common/-/formats-common-3.1.0.tgz", - "integrity": "sha512-wgz5za/Uls+pttLdLl/aH0m0LQNgjqpWwk9exNs2Smmb2CosynRo4S0+CxeNOVZh4zeUm7oAlr1CK/tyg4Ff6g==", + "node_modules/@zazuko/env/node_modules/get-stream": { + "version": "8.0.1", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@zazuko/formats-lazy": { + "version": "1.0.1", + "dev": true, + "license": "MIT", "dependencies": { "@rdfjs/parser-jsonld": "^2.0.0", "@rdfjs/parser-n3": "^2.0.0", "@rdfjs/serializer-jsonld": "^2.0.0", "@rdfjs/serializer-ntriples": "^2.0.0", "@rdfjs/sink-map": "^2.0.0", - "rdfxml-streaming-parser": "^2.2.0" + "@types/rdfjs__parser-jsonld": "^2.0.0", + "@types/rdfjs__parser-n3": "^2.0.0", + "@types/rdfjs__serializer-jsonld": "^2.0.0", + "@types/rdfjs__serializer-ntriples": "^2.0.0", + "@types/rdfjs__sink-map": "^2.0.0", + "onetime": "^6.0.0", + "rdfxml-streaming-parser": "^2.2.0", + "readable-stream": "^4" } }, - "node_modules/@zazuko/env-node/node_modules/rdfxml-streaming-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/rdfxml-streaming-parser/-/rdfxml-streaming-parser-2.2.3.tgz", - "integrity": "sha512-HoH8urnga+YQ5sDY9ufRb0wg6FvwR284sSXpZ+fJE5X5Oej6dfzkFer81uBNZzyNmzJR1TpMYMznyXEjPMLhCA==", + "node_modules/@zazuko/formats-lazy/node_modules/rdfxml-streaming-parser": { + "version": "2.4.0", + "dev": true, + "license": "MIT", "dependencies": { "@rdfjs/types": "*", "@rubensworks/saxes": "^6.0.1", "@types/readable-stream": "^2.3.13", "buffer": "^6.0.3", "rdf-data-factory": "^1.1.0", - "readable-stream": "^4.0.0", + "readable-stream": "^4.4.2", "relative-to-absolute-iri": "^1.0.0", "validate-iri": "^1.0.0" } }, - "node_modules/@zazuko/env-node/node_modules/readable-stream": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", - "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "node_modules/@zazuko/formats-lazy/node_modules/readable-stream": { + "version": "4.5.2", + "dev": true, + "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -6936,17 +7052,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@zazuko/env/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@zazuko/node-fetch": { "version": "2.6.6", "license": "MIT", @@ -6959,25 +7064,22 @@ }, "node_modules/@zazuko/prefixes": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@zazuko/prefixes/-/prefixes-2.1.0.tgz", - "integrity": "sha512-dm0/YBNzuwJUm8cXoF3Dn9DfQetnRDaOJ8NdlgLY645OaUddCzUAAYcanm+xZmEo1SWX+/Tp3jbScwCaN2b/aQ==" + "license": "MIT" }, "node_modules/@zazuko/rdf-utils-fs": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@zazuko/rdf-utils-fs/-/rdf-utils-fs-3.2.0.tgz", - "integrity": "sha512-SqRddafcPHAc3YL4p5awMrKhYg/UTV3+Q0LFGvmp6IlOXrIOu1NuYfmxUrb4EBxVB1ri8/IOXWxY4+XeGw5QKg==", + "version": "3.3.1", + "license": "MIT", "dependencies": { "readable-stream": ">=3.6.0" }, "peerDependencies": { "@rdfjs/types": "*", - "@types/rdfjs__environment": "^0.1.8" + "@types/rdfjs__environment": "0 - 1", + "@types/rdfjs__formats": "^4" } }, "node_modules/@zazuko/vocabulary-extras-builders": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@zazuko/vocabulary-extras-builders/-/vocabulary-extras-builders-1.1.3.tgz", - "integrity": "sha512-8J74EvzjVjs5I2L+sXdoE9AELscWbp5hc9qWGV+Ojii549m5EB53FddWb7Yq8l4cI9b2KbM+bFr0ogpl1gH/Qg==", "dependencies": { "@rdfjs/namespace": "^2.0.0" }, @@ -8599,9 +8701,8 @@ }, "node_modules/arg": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/argparse": { "version": "1.0.10", @@ -9341,6 +9442,14 @@ "node": ">=4" } }, + "node_modules/big-integer": { + "version": "1.6.52", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, "node_modules/bignumber.js": { "version": "9.1.1", "license": "MIT", @@ -9399,8 +9508,7 @@ }, "node_modules/bowser": { "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + "license": "MIT" }, "node_modules/brace-expansion": { "version": "1.1.11", @@ -9794,8 +9902,7 @@ }, "node_modules/chai": { "version": "4.3.10", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", - "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", + "license": "MIT", "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.3", @@ -9837,8 +9944,7 @@ }, "node_modules/check-error": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "license": "MIT", "dependencies": { "get-func-name": "^2.0.2" }, @@ -9885,8 +9991,7 @@ }, "node_modules/chunkify-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chunkify-stream/-/chunkify-stream-1.0.0.tgz", - "integrity": "sha512-LTzfbDrGyMglcGijQtHCTr6uzQIz7VAtvpitKzzIZeDZbBDZzSEhrpu0lH8eyL4/1LO10Oy9kUcXbQtVXlZUMw==", + "license": "MIT", "dependencies": { "readable-stream": "^3.4.0" } @@ -10119,11 +10224,12 @@ } }, "node_modules/clownface": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/clownface/-/clownface-2.0.1.tgz", - "integrity": "sha512-8RVfn/LZEl7BTDhIEIamz13Bhm5YahA1qiJigMb0HYGaiKnsVV0PpLBz0kzqyAI0+IzOlYbCLMFOAc1dkQfwgQ==", + "version": "2.0.2", + "license": "MIT", "dependencies": { - "@rdfjs/environment": "^0.1.2" + "@rdfjs/data-model": "^2.0.1", + "@rdfjs/environment": "0 - 1", + "@rdfjs/namespace": "^2.0.0" } }, "node_modules/co": { @@ -10224,8 +10330,7 @@ }, "node_modules/comver-to-semver": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/comver-to-semver/-/comver-to-semver-1.0.0.tgz", - "integrity": "sha512-gcGtbRxjwROQOdXLUWH1fQAXqThUVRZ219aAwgtX3KfYw429/Zv6EIJRf5TBSzWdAGwePmqH7w70WTaX4MDqag==", + "license": "MIT", "engines": { "node": ">=12.17" } @@ -11179,9 +11284,8 @@ }, "node_modules/create-require": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cross-fetch": { "version": "3.1.6", @@ -11648,8 +11752,7 @@ }, "node_modules/encode-registry": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/encode-registry/-/encode-registry-3.0.1.tgz", - "integrity": "sha512-6qOwkl1g0fv0DN3Y3ggr2EaZXN71aoAqPp3p/pVaWSBSIo+YjLOWN61Fva43oVyQNPf7kgm8lkudzlzojwE2jw==", + "license": "MIT", "dependencies": { "mem": "^8.0.0" }, @@ -11796,373 +11899,67 @@ } }, "node_modules/es-to-primitive": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", - "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.15.18", - "@esbuild/linux-loong64": "0.15.18", - "esbuild-android-64": "0.15.18", - "esbuild-android-arm64": "0.15.18", - "esbuild-darwin-64": "0.15.18", - "esbuild-darwin-arm64": "0.15.18", - "esbuild-freebsd-64": "0.15.18", - "esbuild-freebsd-arm64": "0.15.18", - "esbuild-linux-32": "0.15.18", - "esbuild-linux-64": "0.15.18", - "esbuild-linux-arm": "0.15.18", - "esbuild-linux-arm64": "0.15.18", - "esbuild-linux-mips64le": "0.15.18", - "esbuild-linux-ppc64le": "0.15.18", - "esbuild-linux-riscv64": "0.15.18", - "esbuild-linux-s390x": "0.15.18", - "esbuild-netbsd-64": "0.15.18", - "esbuild-openbsd-64": "0.15.18", - "esbuild-sunos-64": "0.15.18", - "esbuild-windows-32": "0.15.18", - "esbuild-windows-64": "0.15.18", - "esbuild-windows-arm64": "0.15.18" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", - "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", - "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", - "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", - "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", - "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", - "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", - "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", - "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", - "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", - "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", - "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", - "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", - "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", - "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", - "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", - "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", - "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", - "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", - "cpu": [ - "ia32" - ], + "version": "1.2.1", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild-windows-64": { + "node_modules/esbuild": { "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", - "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", - "cpu": [ - "x64" - ], "dev": true, - "optional": true, - "os": [ - "win32" - ], + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.15.18", + "@esbuild/linux-loong64": "0.15.18", + "esbuild-android-64": "0.15.18", + "esbuild-android-arm64": "0.15.18", + "esbuild-darwin-64": "0.15.18", + "esbuild-darwin-arm64": "0.15.18", + "esbuild-freebsd-64": "0.15.18", + "esbuild-freebsd-arm64": "0.15.18", + "esbuild-linux-32": "0.15.18", + "esbuild-linux-64": "0.15.18", + "esbuild-linux-arm": "0.15.18", + "esbuild-linux-arm64": "0.15.18", + "esbuild-linux-mips64le": "0.15.18", + "esbuild-linux-ppc64le": "0.15.18", + "esbuild-linux-riscv64": "0.15.18", + "esbuild-linux-s390x": "0.15.18", + "esbuild-netbsd-64": "0.15.18", + "esbuild-openbsd-64": "0.15.18", + "esbuild-sunos-64": "0.15.18", + "esbuild-windows-32": "0.15.18", + "esbuild-windows-64": "0.15.18", + "esbuild-windows-arm64": "0.15.18" } }, - "node_modules/esbuild-windows-arm64": { + "node_modules/esbuild-darwin-64": { "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", - "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", "cpu": [ - "arm64" + "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ], "engines": { "node": ">=12" @@ -12347,9 +12144,8 @@ }, "node_modules/eslint-import-resolver-typescript": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", "dev": true, + "license": "ISC", "dependencies": { "debug": "^4.3.4", "enhanced-resolve": "^5.12.0", @@ -12660,6 +12456,36 @@ "eslint": "*" } }, + "node_modules/eslint-plugin-unused-imports": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "eslint-rule-composer": "^0.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^6.0.0", + "eslint": "^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "node_modules/eslint-rule-composer": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/eslint-utils": { "version": "2.1.0", "dev": true, @@ -13187,9 +13013,8 @@ }, "node_modules/express": { "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -13309,8 +13134,7 @@ }, "node_modules/external-merge-sort": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/external-merge-sort/-/external-merge-sort-0.1.3.tgz", - "integrity": "sha512-lFm7ErWX9YfEjApT8Kr53f4HG5h3MQNon9sat8YECMwazGN/o8MYmOh9VD+JsVeDqhW21iStnH/t2dA/OPdl7g==", + "license": "MIT", "dependencies": { "heap": "^0.2.7" } @@ -13371,9 +13195,8 @@ }, "node_modules/fast-glob": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -13409,8 +13232,6 @@ }, "node_modules/fast-xml-parser": { "version": "4.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", - "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", "funding": [ { "type": "paypal", @@ -13421,6 +13242,7 @@ "url": "https://github.com/sponsors/NaturalIntelligence" } ], + "license": "MIT", "dependencies": { "strnum": "^1.0.5" }, @@ -13560,8 +13382,7 @@ }, "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==", + "license": "MIT", "engines": { "node": ">=18" }, @@ -14005,8 +13826,7 @@ }, "node_modules/get-func-name": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "license": "MIT", "engines": { "node": "*" } @@ -14121,8 +13941,7 @@ }, "node_modules/global-directory": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", - "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "license": "MIT", "dependencies": { "ini": "4.1.1" }, @@ -14362,8 +14181,7 @@ }, "node_modules/heap": { "version": "0.2.7", - "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", - "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==" + "license": "MIT" }, "node_modules/hosted-git-info": { "version": "2.8.9", @@ -14569,8 +14387,7 @@ }, "node_modules/ini": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -14838,8 +14655,7 @@ }, "node_modules/is-installed-globally": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", - "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", + "license": "MIT", "dependencies": { "global-directory": "^4.0.1", "is-path-inside": "^4.0.0" @@ -14853,8 +14669,7 @@ }, "node_modules/is-installed-globally/node_modules/is-path-inside": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -14972,8 +14787,7 @@ }, "node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -15232,9 +15046,8 @@ }, "node_modules/jackspeak": { "version": "2.3.5", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.5.tgz", - "integrity": "sha512-Ratx+B8WeXLAtRJn26hrhY8S1+Jz6pxPMrkrdkgb/NstTNiqMhX0/oFVu5wX+g5n6JlEu2LPsDJmY8nRP4+alw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -20101,6 +19914,19 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonld": { + "version": "8.3.2", + "license": "BSD-3-Clause", + "dependencies": { + "@digitalbazaar/http-client": "^3.4.1", + "canonicalize": "^1.0.1", + "lru-cache": "^6.0.0", + "rdf-canonize": "^3.4.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/jsonld-context-parser": { "version": "2.3.0", "license": "MIT", @@ -20213,6 +20039,55 @@ "version": "2.0.0", "license": "MIT" }, + "node_modules/ky": { + "version": "0.33.3", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" + } + }, + "node_modules/ky-universal": { + "version": "0.11.0", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "node-fetch": "^3.2.10" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky-universal?sponsor=1" + }, + "peerDependencies": { + "ky": ">=0.31.4", + "web-streams-polyfill": ">=3.2.1" + }, + "peerDependenciesMeta": { + "web-streams-polyfill": { + "optional": true + } + } + }, + "node_modules/ky-universal/node_modules/node-fetch": { + "version": "3.3.2", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "node_modules/leven": { "version": "3.1.0", "dev": true, @@ -20757,8 +20632,7 @@ }, "node_modules/map-age-cleaner": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "license": "MIT", "dependencies": { "p-defer": "^1.0.0" }, @@ -20877,8 +20751,7 @@ }, "node_modules/mem": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", - "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", + "license": "MIT", "dependencies": { "map-age-cleaner": "^0.1.3", "mimic-fn": "^3.1.0" @@ -20892,8 +20765,7 @@ }, "node_modules/mem/node_modules/mimic-fn": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "license": "MIT", "engines": { "node": ">=8" } @@ -21023,8 +20895,7 @@ }, "node_modules/mimic-function": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.0.tgz", - "integrity": "sha512-RBfQ+9X9DpXdEoK7Bu+KeEU6vFhumEIiXKWECPzRBmDserEq4uR2b/VCm0LwpMSosoq2k+Zuxj/GzOr0Fn6h/g==", + "license": "MIT", "engines": { "node": ">=18" }, @@ -21623,9 +21494,8 @@ }, "node_modules/nise": { "version": "5.1.5", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.5.tgz", - "integrity": "sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^2.0.0", "@sinonjs/fake-timers": "^10.0.2", @@ -22121,14 +21991,13 @@ "license": "MIT" }, "node_modules/oxigraph": { - "version": "0.4.0-alpha.2", - "resolved": "https://registry.npmjs.org/oxigraph/-/oxigraph-0.4.0-alpha.2.tgz", - "integrity": "sha512-7f3RhLkMV6ERIZP5XyNqonbHSN5Obs1JZts63JqxrGYnfysxHtQxnC7c7/NJw2xNXHLFt4ErB35sVu8rdY+79A==" + "version": "0.4.0-alpha.3", + "resolved": "https://registry.npmjs.org/oxigraph/-/oxigraph-0.4.0-alpha.3.tgz", + "integrity": "sha512-eUkIU8dnAwoNixUO7zBO8eZooedIJJ6rIpBPWy99d+EKXrcwOa0pEryQc/BqIofpxJbHAMIXA+sZaXVfoqNx8g==" }, "node_modules/p-defer": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", + "license": "MIT", "engines": { "node": ">=4" } @@ -22509,8 +22378,7 @@ }, "node_modules/pkgscan": { "version": "1.0.24", - "resolved": "https://registry.npmjs.org/pkgscan/-/pkgscan-1.0.24.tgz", - "integrity": "sha512-jQPbmlPJHMmHmocDl12eoRrNnOJ4VPbDPHIUuceWl4CfQTEGyRGVxln2OOELj+3TbvB8BSFwva6MTiaaDnxjtQ==", + "license": "MIT", "dependencies": { "@pnpm/constants": "^7.1.1", "@pnpm/dependency-path": "^2.1.2", @@ -22536,21 +22404,18 @@ }, "node_modules/pkgscan/node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "license": "Python-2.0" }, "node_modules/pkgscan/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==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/pkgscan/node_modules/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -22562,21 +22427,18 @@ }, "node_modules/pkgscan/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==" + "license": "MIT" }, "node_modules/pkgscan/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==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/pkgscan/node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -22586,8 +22448,7 @@ }, "node_modules/pkgscan/node_modules/minimatch": { "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -22600,8 +22461,7 @@ }, "node_modules/pkgscan/node_modules/semver": { "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -22614,8 +22474,7 @@ }, "node_modules/pkgscan/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==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -22627,8 +22486,7 @@ }, "node_modules/pkgscan/node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -22644,8 +22502,7 @@ }, "node_modules/pkgscan/node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", "engines": { "node": ">=12" } @@ -22950,8 +22807,7 @@ "node_modules/ramda": { "name": "@pnpm/ramda", "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@pnpm/ramda/-/ramda-0.28.1.tgz", - "integrity": "sha512-zcAG+lvU0fMziNeGXpPyCyCJYp5ZVrPElEE4t14jAmViaihohocZ+dDkcRIyAomox8pQsuZnv1EyHR+pOhmUWw==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/ramda" @@ -23006,8 +22862,7 @@ }, "node_modules/rdf-dataset-ext": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/rdf-dataset-ext/-/rdf-dataset-ext-1.1.0.tgz", - "integrity": "sha512-CH85RfRKN9aSlbju8T7aM8hgCSWMBsh2eh/tGxUUtWMN+waxi6iFDt8/r4PAEmKaEA82guimZJ4ISbmJ2rvWQg==", + "license": "MIT", "dependencies": { "rdf-canonize": "^3.0.0", "readable-stream": "3 - 4" @@ -23029,9 +22884,8 @@ } }, "node_modules/rdf-loader-code": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/rdf-loader-code/-/rdf-loader-code-2.1.1.tgz", - "integrity": "sha512-JR49VuWX5VHQv7a/ZUOsUHs85IuI7dBotWuI0Obtu8vauSQkTwl5E7fhyz6aFq0j6DVTNIt5N76meUrmZwxybw==", + "version": "2.1.3", + "license": "MIT", "dependencies": { "@rdfjs/namespace": "^2.0.0", "clownface": "^2.0.0", @@ -23041,8 +22895,7 @@ }, "node_modules/rdf-loaders-registry": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rdf-loaders-registry/-/rdf-loaders-registry-1.0.1.tgz", - "integrity": "sha512-tmFG53SDk1y7o0oLk5LhWyyijKFI5mxS08D+kir8XNTXl5dKwUY55UcvD1au4P4ClMtj00U7sNOqghYlccJwsA==", + "license": "MIT", "dependencies": { "@rdfjs/data-model": "^2", "is-graph-pointer": "^2.1.0" @@ -23089,8 +22942,7 @@ }, "node_modules/rdf-stream-to-dataset-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rdf-stream-to-dataset-stream/-/rdf-stream-to-dataset-stream-1.0.0.tgz", - "integrity": "sha512-ogWBAsrc92B2tJkKw7Q3aIim2EOA4OvFn/PQilQ/ovs0pAbrDU+f6PfqS08JGxmdLcUsP8rCOztdualeVyf+vw==", + "license": "MIT", "dependencies": { "@rdfjs/data-model": "^1.1.2", "@rdfjs/dataset": "^1.0.1", @@ -23099,8 +22951,7 @@ }, "node_modules/rdf-stream-to-dataset-stream/node_modules/@rdfjs/data-model": { "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@rdfjs/data-model/-/data-model-1.3.4.tgz", - "integrity": "sha512-iKzNcKvJotgbFDdti7GTQDCYmL7GsGldkYStiP0K8EYtN7deJu5t7U11rKTz+nR7RtesUggT+lriZ7BakFv8QQ==", + "license": "MIT", "dependencies": { "@rdfjs/types": ">=1.0.1" }, @@ -23110,8 +22961,7 @@ }, "node_modules/rdf-stream-to-dataset-stream/node_modules/@rdfjs/dataset": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@rdfjs/dataset/-/dataset-1.1.1.tgz", - "integrity": "sha512-BNwCSvG0cz0srsG5esq6CQKJc1m8g/M0DZpLuiEp0MMpfwguXX7VeS8TCg4UUG3DV/DqEvhy83ZKSEjdsYseeA==", + "license": "MIT", "dependencies": { "@rdfjs/data-model": "^1.2.0" }, @@ -23121,8 +22971,7 @@ }, "node_modules/rdf-transform-graph-imports": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/rdf-transform-graph-imports/-/rdf-transform-graph-imports-0.2.2.tgz", - "integrity": "sha512-VzBXChikqmQWjW4zCgIXiioZVaNDDGpkd0DzFoN4WJFKBGKpDVSP0y4zfan97tq5kwfNCn7F7I2dG2BxScm7Vw==", + "license": "MIT", "dependencies": { "anylogger": "^1.0.11", "readable-stream": "3 - 4", @@ -23147,29 +22996,21 @@ "rdfjs-data-model-test": "bin/test.js" } }, - "node_modules/rdf-utils-fs": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@rdfjs/formats-common": "^2.2.0", - "readable-stream": "^3.6.0" - } - }, "node_modules/rdf-validate-datatype": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rdf-validate-datatype/-/rdf-validate-datatype-0.2.0.tgz", - "integrity": "sha512-Ru7OcqxkPHgMwBrqw/RXCOqJ+hPaL1foelcgdDy5eFdNonP2D6YDLkYlODaeiSo2dgCnUvrD1k/QGi3Spa82fg==", + "license": "MIT", "dependencies": { "@rdfjs/term-map": "^2.0.0", "@tpluscode/rdf-ns-builders": "3 - 4" } }, "node_modules/rdf-validate-shacl": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/rdf-validate-shacl/-/rdf-validate-shacl-0.5.1.tgz", - "integrity": "sha512-KpXLqfkf8BkNy4H7Yxhy+fd3BpedQpRIrPH0SoYhGBUhMR5JNNt8Va+eda1CsiA9DnnfDadXBxQVyKkuSFwhTA==", + "version": "0.5.3", + "license": "MIT", "dependencies": { - "@rdfjs/environment": "^0.1.2", + "@rdfjs/data-model": "^2", + "@rdfjs/dataset": "^2", + "@rdfjs/environment": "^1", "@rdfjs/namespace": "^2.0.0", "@rdfjs/term-set": "^2.0.1", "@vocabulary/sh": "^1.0.1", @@ -23549,8 +23390,7 @@ }, "node_modules/rfc4648": { "version": "1.5.3", - "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.3.tgz", - "integrity": "sha512-MjOWxM065+WswwnmNONOT+bD1nXzY9Km6u3kzvnx8F8/HXGZdz3T6e6vZJ8Q/RIMUSp/nxqjH3GwvJDy8ijeQQ==" + "license": "MIT" }, "node_modules/rfdc": { "version": "1.3.0", @@ -24148,9 +23988,8 @@ }, "node_modules/shelljs": { "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "glob": "^7.0.0", "interpret": "^1.0.0", @@ -25443,8 +25282,7 @@ }, "node_modules/strnum": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + "license": "MIT" }, "node_modules/supports-color": { "version": "5.5.0", @@ -25719,9 +25557,8 @@ }, "node_modules/ts-api-utils": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", "dev": true, + "license": "MIT", "engines": { "node": ">=16.13.0" }, @@ -25731,9 +25568,8 @@ }, "node_modules/ts-node": { "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, + "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -25774,18 +25610,16 @@ }, "node_modules/ts-node/node_modules/acorn-walk": { "version": "8.3.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", - "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/ts-node/node_modules/diff": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -25808,9 +25642,8 @@ }, "node_modules/tsm": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tsm/-/tsm-2.3.0.tgz", - "integrity": "sha512-++0HFnmmR+gMpDtKTnW3XJ4yv9kVGi20n+NfyQWB9qwJvTaIWY9kBmzek2YUQK5APTQ/1DTrXmm4QtFPmW9Rzw==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.15.16" }, @@ -26046,9 +25879,8 @@ }, "node_modules/typescript": { "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -26071,15 +25903,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici": { + "version": "5.28.2", + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, "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==", + "license": "MIT", "engines": { "node": ">=18" }, @@ -26202,7 +26042,6 @@ "version": "4.4.1", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "punycode": "^2.1.0" } @@ -26255,9 +26094,8 @@ }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/v8-to-istanbul": { "version": "9.1.0", @@ -27009,9 +26847,8 @@ }, "node_modules/yn": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -27029,7 +26866,7 @@ }, "packages/base": { "name": "barnard59-base", - "version": "2.3.0", + "version": "2.4.0", "license": "MIT", "dependencies": { "@opentelemetry/api": "^1.0.1", @@ -27048,7 +26885,7 @@ "@types/readable-stream": "^4.0.10", "@types/readable-to-readable": "^0.1.0", "@types/through2": "^2.0.41", - "barnard59-core": "^5.3.0", + "barnard59-core": "^5.3.1", "chai": "^4.3.10", "get-stream": "^6.0.1", "into-stream": "^7.0.0", @@ -27062,18 +26899,16 @@ }, "packages/base/node_modules/@sinonjs/fake-timers": { "version": "11.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", - "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "packages/base/node_modules/@types/readable-stream": { "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.10.tgz", - "integrity": "sha512-AbUKBjcC8SHmImNi4yK2bbjogQlkFSg7shZCcicxPQapniOlajG8GCc39lvXzCWX4lLRRs7DM3VAeSlqmEVZUA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "safe-buffer": "~5.1.1" @@ -27089,9 +26924,8 @@ }, "packages/base/node_modules/sinon": { "version": "17.0.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-17.0.0.tgz", - "integrity": "sha512-p4lJiYKBoOEVUxxVIC9H1MM2znG1/c8gud++I2BauJA5hsz7hHsst35eurNWXTusBsIq66FzOQbZ/uMdpvbPIQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.0", "@sinonjs/fake-timers": "^11.2.2", @@ -27107,18 +26941,16 @@ }, "packages/base/node_modules/sinon/node_modules/diff": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "packages/base/node_modules/sinon/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" }, @@ -27128,7 +26960,7 @@ }, "packages/cli": { "name": "barnard59", - "version": "4.4.0", + "version": "4.5.2", "license": "MIT", "dependencies": { "@opentelemetry/api": "^1.0.0", @@ -27140,8 +26972,8 @@ "@opentelemetry/semantic-conventions": "^0.24.0", "@opentelemetry/tracing": "^0.24.0", "@rdfjs/namespace": "^2.0.0", - "barnard59-core": "5.3.0", - "barnard59-env": "1.2.1", + "barnard59-core": "5.3.2", + "barnard59-env": "1.2.3", "commander": "^11.0.0", "find-up": "^7.0.0", "is-graph-pointer": "^2.1.0", @@ -27149,7 +26981,8 @@ "lodash": "^4.17.21", "pkg-dir": "^8.0.0", "pkgscan": "^1.0.24", - "rdf-loader-code": "^2.1.1", + "rdf-loader-code": "^2.1.3", + "rdf-transform-graph-imports": "^0.2.2", "readable-stream": "^3.6.0" }, "bin": { @@ -27157,25 +26990,26 @@ "barnard59": "bin/barnard59.sh" }, "devDependencies": { + "@rdfjs-elements/formats-pretty": "^0.6.7", "@types/lodash": "^4.14.202", "@types/readable-stream": "^4.0.10", "approvals": "^6.2.2", - "barnard59-base": "^2.3.0", + "barnard59-base": "^2.4.0", "barnard59-formats": "^2.1.0", - "barnard59-graph-store": "^5.1.0", + "barnard59-graph-store": "^5.1.1", "barnard59-http": "^2.0.0", "barnard59-shell": "^0.1.0", "barnard59-test-support": "^0.0.3", "chai": "^4.3.7", + "mocha-chai-jest-snapshot": "^1.1.4", "shelljs": "^0.8.4", "strip-ansi": "^7.0.0" } }, "packages/cli/node_modules/@types/readable-stream": { "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.10.tgz", - "integrity": "sha512-AbUKBjcC8SHmImNi4yK2bbjogQlkFSg7shZCcicxPQapniOlajG8GCc39lvXzCWX4lLRRs7DM3VAeSlqmEVZUA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "safe-buffer": "~5.1.1" @@ -27194,8 +27028,7 @@ }, "packages/cli/node_modules/find-up": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", - "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", + "license": "MIT", "dependencies": { "locate-path": "^7.2.0", "path-exists": "^5.0.0", @@ -27210,8 +27043,7 @@ }, "packages/cli/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==", + "license": "MIT", "dependencies": { "p-locate": "^6.0.0" }, @@ -27224,8 +27056,7 @@ }, "packages/cli/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==", + "license": "MIT", "dependencies": { "yocto-queue": "^1.0.0" }, @@ -27238,8 +27069,7 @@ }, "packages/cli/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==", + "license": "MIT", "dependencies": { "p-limit": "^4.0.0" }, @@ -27252,16 +27082,14 @@ }, "packages/cli/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==", + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "packages/cli/node_modules/pkg-dir": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-8.0.0.tgz", - "integrity": "sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==", + "license": "MIT", "dependencies": { "find-up-simple": "^1.0.0" }, @@ -27288,8 +27116,7 @@ }, "packages/cli/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==", + "license": "MIT", "engines": { "node": ">=12.20" }, @@ -27299,7 +27126,7 @@ }, "packages/core": { "name": "barnard59-core", - "version": "5.3.0", + "version": "5.3.2", "license": "MIT", "dependencies": { "@opentelemetry/api": "^1.0.1", @@ -27309,7 +27136,7 @@ "is-graph-pointer": "^2.1.0", "is-stream": "^3.0.0", "onetime": "^6.0.0", - "rdf-loader-code": "^2.1.1", + "rdf-loader-code": "^2.1.3", "rdf-loaders-registry": "^1.0.1", "readable-stream": "^3.6.0", "untildify": "^5.0.0", @@ -27318,7 +27145,7 @@ "devDependencies": { "@rdfjs/namespace": "^2.0.0", "@types/readable-stream": "^4.0.9", - "barnard59-env": "^1.2.1", + "barnard59-env": "^1.2.2", "barnard59-http": "^2.0.0", "barnard59-test-support": "^0.0.3", "chai": "^4.3.7", @@ -27331,9 +27158,8 @@ }, "packages/core/node_modules/@types/readable-stream": { "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.9.tgz", - "integrity": "sha512-4cwuvrmNF96M4Nrx0Eep37RwPB1Mth+nCSezsGRv5+PsFyRvDdLd0pil6gVLcWD/bh69INNdwZ98dJwfHpLohA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "safe-buffer": "~5.1.1" @@ -27397,14 +27223,14 @@ }, "packages/cube": { "name": "barnard59-cube", - "version": "1.2.0", + "version": "1.4.0", "license": "MIT", "dependencies": { - "barnard59-base": "^2.2.0", + "barnard59-base": "^2.4.0", "barnard59-formats": "^2.0.0", "barnard59-http": "^2.0.0", - "barnard59-rdf": "^3.3.0", - "barnard59-shacl": "^1.2.0", + "barnard59-rdf": "^3.4.0", + "barnard59-shacl": "^1.4.0", "barnard59-sparql": "^2.1.1", "external-merge-sort": "^0.1.3", "lodash": "^4.17.21", @@ -27414,19 +27240,20 @@ }, "devDependencies": { "@rdfjs/to-ntriples": "^2.0.0", - "barnard59-env": "^1.2.0", + "barnard59-env": "^1.2.3", "chai": "^4.3.7", "get-stream": "^6.0.1", "is-stream": "^3.0.0", + "rdf-validate-shacl": "^0.5.1", "shelljs": "^0.8.5" } }, "packages/env": { "name": "barnard59-env", - "version": "1.2.1", + "version": "1.2.3", "license": "MIT", "dependencies": { - "@zazuko/env-node": "^1.0.3", + "@zazuko/env-node": "^2.1.1", "@zazuko/vocabulary-extras-builders": "^1.1.3" } }, @@ -27609,7 +27436,7 @@ }, "packages/graph-store": { "name": "barnard59-graph-store", - "version": "5.1.0", + "version": "5.1.1", "license": "MIT", "dependencies": { "barnard59-base": "^2.3.0", @@ -27626,7 +27453,7 @@ "@types/promise-the-world": "^1.0.6", "@types/readable-stream": "^4.0.10", "@types/sparql-http-client": "^2.2.14", - "@zazuko/env": "^1.9.0", + "@zazuko/env": "^2", "express-as-promise": "^1.2.0", "get-stream": "^6.0.1", "isstream": "^0.1.2" @@ -27637,9 +27464,8 @@ }, "packages/graph-store/node_modules/@types/readable-stream": { "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.10.tgz", - "integrity": "sha512-AbUKBjcC8SHmImNi4yK2bbjogQlkFSg7shZCcicxPQapniOlajG8GCc39lvXzCWX4lLRRs7DM3VAeSlqmEVZUA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "safe-buffer": "~5.1.1" @@ -27647,8 +27473,7 @@ }, "packages/graph-store/node_modules/onetime": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "license": "MIT", "dependencies": { "mimic-function": "^5.0.0" }, @@ -27694,17 +27519,16 @@ }, "packages/rdf": { "name": "barnard59-rdf", - "version": "3.3.0", + "version": "3.4.0", "license": "MIT", "dependencies": { "@rdfjs/fetch": "^3.0.0", - "barnard59-env": "^1.2.0", + "barnard59-env": "^1.2.2", "file-fetch": "^1.7.0", "is-stream": "^3.0.0", "lodash": "^4.17.21", "mime-types": "^2.1.35", "proto-fetch": "^1.0.0", - "rdf-dataset-ext": "^1.0.1", "rdf-literal": "^1.3.0", "rdf-stream-to-dataset-stream": "^1.0.0", "rdf-transform-graph-imports": "^0.2.2", @@ -27713,6 +27537,12 @@ }, "devDependencies": { "@rdfjs/to-ntriples": "^2.0.0", + "@types/file-fetch": "^1.6.6", + "@types/mime-types": "^2.1.4", + "@types/proto-fetch": "^1.0.5", + "@types/rdf-transform-triple-to-quad": "^2.0.5", + "@types/rdfjs__fetch": "^3.0.6", + "@types/rdfjs__fetch-lite": "^3.0.8", "assert-throws-async": "^3.0.0", "chai": "^4.3.7", "express-as-promise": "^1.2.0", @@ -27752,27 +27582,24 @@ }, "packages/s3/node_modules/@types/node": { "version": "20.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", - "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", "dev": true, + "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } }, "packages/s3/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" } }, "packages/s3/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" @@ -27786,9 +27613,8 @@ }, "packages/s3/node_modules/get-stream": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, + "license": "MIT", "engines": { "node": ">=16" }, @@ -27798,9 +27624,8 @@ }, "packages/s3/node_modules/glob": { "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.5", @@ -27820,9 +27645,8 @@ }, "packages/s3/node_modules/minimatch": { "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -27835,8 +27659,7 @@ }, "packages/s3/node_modules/mkdirp": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "license": "MIT", "bin": { "mkdirp": "dist/cjs/src/bin.js" }, @@ -27849,9 +27672,8 @@ }, "packages/s3/node_modules/rimraf": { "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", "dev": true, + "license": "ISC", "dependencies": { "glob": "^10.3.7" }, @@ -27867,9 +27689,8 @@ }, "packages/s3/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" }, @@ -27879,24 +27700,24 @@ }, "packages/shacl": { "name": "barnard59-shacl", - "version": "1.3.0", + "version": "1.4.1", "license": "MIT", "dependencies": { "@rdfjs/fetch": "^3.0.0", - "barnard59-base": "^2.3.0", + "@rdfjs/to-ntriples": "^2.0.0", + "barnard59-base": "^2.4.0", "barnard59-formats": "^2.1.0", - "barnard59-rdf": "^3.3.0", + "barnard59-rdf": "^3.4.0", "is-stream": "^3.0.0", - "rdf-validate-shacl": "^0.5.1", + "rdf-validate-shacl": "^0.5.3", "readable-stream": "3 - 4" }, "devDependencies": { - "@rdfjs/to-ntriples": "^2.0.0", - "@tpluscode/rdf-string": "^1.1.0", + "@tpluscode/rdf-string": "^1.1.2", "@types/rdf-validate-shacl": "^0.4.6", "assert-throws-async": "^3.0.0", - "barnard59-core": "^5.3.0", - "barnard59-env": "^1.2.1", + "barnard59-core": "^5.3.2", + "barnard59-env": "^1.2.3", "barnard59-test-support": "*", "chai": "^4.3.4", "express": "^4.18.2", @@ -27909,9 +27730,8 @@ }, "packages/shacl/node_modules/get-stream": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, + "license": "MIT", "engines": { "node": ">=16" }, @@ -27930,8 +27750,8 @@ "sparql-http-client": "^2.4.0" }, "devDependencies": { - "@tpluscode/rdf-string": "^1.0.3", - "@zazuko/env": "^1.0.0", + "@tpluscode/rdf-string": "^1.1.2", + "@zazuko/env": "^2", "get-stream": "^6.0.0", "is-stream": "^3.0.0", "nock": "^13.1.1" @@ -27957,24 +27777,24 @@ }, "packages/validation": { "name": "barnard59-validation", - "version": "0.4.1", + "version": "0.4.2", "license": "MIT", "dependencies": { "@rdfjs/namespace": "^2.0.0", "anylogger": "^1.0.11", "anylogger-console": "^1.0.0", - "barnard59-env": "^1.2.0", + "barnard59-env": "^1.2.2", "chalk": "^4.1.0", "commander": "^11.0.0", - "rdf-loader-code": "^2.1.1" + "rdf-loader-code": "^2.1.3" }, "bin": { "barnard59-validate": "cli.js" }, "devDependencies": { "@jsdevtools/chai-exec": "^2.1.1", - "barnard59-base": "^2.0.1", - "barnard59-core": "^5.2.0", + "barnard59-base": "^2.4.0", + "barnard59-core": "^5.3.1", "barnard59-formats": "^2.1.0", "chai": "^4.3.0", "deep-equal": "^2.0.5", @@ -28044,6 +27864,7 @@ "name": "barnard59-test-e2e", "version": "0.1.0", "dependencies": { + "@zazuko/rdf-utils-fs": "^3.3.1", "barnard59-base": "^2.3.0", "barnard59-core": "^5.3.0", "barnard59-env": "^1.2.1", @@ -28054,8 +27875,7 @@ "get-stream": "^6.0.0", "nock": "^13.3.1", "rdf-dataset-ext": "^1.0.1", - "rdf-loader-code": "^2.1.1", - "rdf-utils-fs": "^2.3.0", + "rdf-loader-code": "^2.1.3", "readable-stream": "^3", "string-to-stream": "^3.0.1" } @@ -28065,9 +27885,7 @@ "version": "0.0.3", "dependencies": { "@rdfjs/namespace": "^2.0.0", - "@zazuko/env": "^1.0.1", - "rdf-dataset-ext": "^1.0.1", - "rdf-utils-fs": "^2.3.0" + "@zazuko/env-node": "^2.1.1" } } } diff --git a/package.json b/package.json index 8e2e1db2..5e15893e 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ ], "devDependencies": { "@changesets/cli": "^2.26.1", - "@tpluscode/eslint-config": "^0.4.4", + "@tpluscode/eslint-config": "^0.4.5", "@types/node": "^18", "@typescript-eslint/eslint-plugin": "^6.13.2", "@typescript-eslint/parser": "^6.13.2", diff --git a/packages/base/CHANGELOG.md b/packages/base/CHANGELOG.md index 87947eb8..635b5db7 100644 --- a/packages/base/CHANGELOG.md +++ b/packages/base/CHANGELOG.md @@ -1,5 +1,11 @@ # barnard59-base +## 2.4.0 + +### Minor Changes + +- 7456a6a: added batch operation + ## 2.3.0 ### Minor Changes diff --git a/packages/base/nul.js b/packages/base/dev-nul.js similarity index 100% rename from packages/base/nul.js rename to packages/base/dev-nul.js diff --git a/packages/base/index.js b/packages/base/index.js index 1d13e183..70f177b1 100644 --- a/packages/base/index.js +++ b/packages/base/index.js @@ -7,7 +7,7 @@ export { default as glob } from './glob.js' export { parse as jsonParse, stringify as jsonStringify } from './json.js' export { default as limit } from './limit.js' export { default as map } from './map.js' -export { default as nul } from './nul.js' +export { default as nul } from './dev-nul.js' export { default as offset } from './offset.js' export * from './process.js' export { default as toString } from './toString.js' diff --git a/packages/base/manifest.ttl b/packages/base/manifest.ttl index ea03e01c..8000b108 100644 --- a/packages/base/manifest.ttl +++ b/packages/base/manifest.ttl @@ -91,7 +91,7 @@ rdfs:label "/dev/null"; rdfs:comment "Dummy output stream, just like /dev/null."; code:implementedBy [ a code:EcmaScriptModule; - code:link + code:link ]. a p:Operation, p:WritableObjectMode, p:ReadableObjectMode; diff --git a/packages/base/package.json b/packages/base/package.json index 3fc9b878..156f7e07 100644 --- a/packages/base/package.json +++ b/packages/base/package.json @@ -1,6 +1,6 @@ { "name": "barnard59-base", - "version": "2.3.0", + "version": "2.4.0", "description": "Linked Data pipelines", "main": "index.js", "type": "module", @@ -39,7 +39,7 @@ "@types/readable-stream": "^4.0.10", "@types/readable-to-readable": "^0.1.0", "@types/through2": "^2.0.41", - "barnard59-core": "^5.3.0", + "barnard59-core": "^5.3.1", "chai": "^4.3.10", "get-stream": "^6.0.1", "into-stream": "^7.0.0", diff --git a/packages/base/test/batch.test.js b/packages/base/test/batch.test.js index ee47918e..2d648030 100644 --- a/packages/base/test/batch.test.js +++ b/packages/base/test/batch.test.js @@ -1,4 +1,4 @@ -import { deepStrictEqual, strictEqual } from 'assert' +import { deepStrictEqual, strictEqual } from 'node:assert' import { array } from 'get-stream' import { isReadableStream as isReadable, isWritableStream as isWritable } from 'is-stream' import { Readable } from 'readable-stream' diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 8b5eaac3..c25ce11c 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,35 @@ # barnard59 +## 4.5.2 + +### Patch Changes + +- e82aa36: Remove references of `rdf-js` types package, repaced with `@rdfjs/types` +- Updated dependencies [e82aa36] + - barnard59-core@5.3.2 + +## 4.5.1 + +### Patch Changes + +- Updated dependencies [9178b7e] + - barnard59-env@1.2.3 + +## 4.5.0 + +### Minor Changes + +- 68dff05: Support [`code:imports`](https://github.com/zazuko/rdf-transform-graph-imports) when loading pipeline definitions (closes #93) + +### Patch Changes + +- 9d0ce9f: Improve Windows compatibility (re zazuko/rdf-loader-code#34) +- Updated dependencies [9d0ce9f] +- Updated dependencies [c090ff2] +- Updated dependencies [82dbe7e] + - barnard59-core@5.3.1 + - barnard59-env@1.2.2 + ## 4.4.0 ### Minor Changes diff --git a/packages/cli/lib/pipeline.js b/packages/cli/lib/pipeline.js index 7178fb6c..db3ca021 100644 --- a/packages/cli/lib/pipeline.js +++ b/packages/cli/lib/pipeline.js @@ -6,11 +6,12 @@ import { isGraphPointer } from 'is-graph-pointer' import { packageDirectory } from 'pkg-dir' import iriResolve from 'rdf-loader-code/lib/iriResolve.js' import isInstalledGlobally from 'is-installed-globally' +import transformImports from 'rdf-transform-graph-imports' import findPipeline from '../findPipeline.js' import discoverManifests from './discoverManifests.js' /** - * @typedef {Map} OperationMap + * @typedef {Map} OperationMap */ /** @@ -34,12 +35,12 @@ const discoverOperations = async (pipelinePath) => { } /** - * @param {import('rdf-js').DatasetCore} dataset + * @param {import('@rdfjs/types').DatasetCore} dataset * @param {object} options * @param {import('winston').Logger} [options.logger] * @param {OperationMap} [options.knownOperations] * @param {string} options.pipelinePath - * @returns {Promise} + * @returns {Promise} */ export const desugar = async (dataset, { logger, knownOperations, pipelinePath }) => { const operations = knownOperations ?? await discoverOperations(pipelinePath) @@ -94,15 +95,18 @@ export const desugar = async (dataset, { logger, knownOperations, pipelinePath } /** * @param {string} filename - * @return {Promise} + * @return {Promise} */ async function fileToDataset(filename) { - return rdf.dataset().import(rdf.fromFile(filename)) + const stream = rdf.fromFile(filename, { + implicitBaseIRI: true, + }).pipe(transformImports(rdf)) + return rdf.dataset().import(stream) } /** * @param {string} filename - * @param {string | import('@rdfjs/types').NamedNode | undefined} iri + * @param {string | import('@rdfjs/types').NamedNode} [iri] * @param {object} [options] * @param {import('winston').Logger} [options.logger] * @return {Promise<{ basePath: string, ptr: import('clownface').GraphPointer }>} diff --git a/packages/cli/package.json b/packages/cli/package.json index e71b2a3e..c8ff4910 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "barnard59", - "version": "4.4.0", + "version": "4.5.2", "description": "Barnard59 Linked Data pipelines", "type": "module", "main": "index.js", @@ -36,8 +36,8 @@ "@opentelemetry/semantic-conventions": "^0.24.0", "@opentelemetry/tracing": "^0.24.0", "@rdfjs/namespace": "^2.0.0", - "barnard59-core": "5.3.0", - "barnard59-env": "1.2.1", + "barnard59-core": "5.3.2", + "barnard59-env": "1.2.3", "commander": "^11.0.0", "pkgscan": "^1.0.24", "find-up": "^7.0.0", @@ -45,20 +45,23 @@ "is-graph-pointer": "^2.1.0", "lodash": "^4.17.21", "pkg-dir": "^8.0.0", - "rdf-loader-code": "^2.1.1", + "rdf-loader-code": "^2.1.3", + "rdf-transform-graph-imports": "^0.2.2", "readable-stream": "^3.6.0" }, "devDependencies": { + "@rdfjs-elements/formats-pretty": "^0.6.7", "@types/lodash": "^4.14.202", "@types/readable-stream": "^4.0.10", "approvals": "^6.2.2", - "barnard59-base": "^2.3.0", + "barnard59-base": "^2.4.0", "barnard59-formats": "^2.1.0", - "barnard59-graph-store": "^5.1.0", + "barnard59-graph-store": "^5.1.1", "barnard59-http": "^2.0.0", "barnard59-shell": "^0.1.0", "barnard59-test-support": "^0.0.3", "chai": "^4.3.7", + "mocha-chai-jest-snapshot": "^1.1.4", "shelljs": "^0.8.4", "strip-ansi": "^7.0.0" }, diff --git a/packages/cli/test/__snapshots__/codeImports.test.js.snap b/packages/cli/test/__snapshots__/codeImports.test.js.snap new file mode 100644 index 00000000..b6292e0d --- /dev/null +++ b/packages/cli/test/__snapshots__/codeImports.test.js.snap @@ -0,0 +1,41 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`pipeline with code:imports merges the pipelines 1`] = ` +"@prefix sh: . +@prefix rdf: . +@prefix p: . +@prefix code: . + + a p:Pipeline ; + p:steps [ + p:stepList ( + [ + rdf:type p:Step ; + code:arguments ( + \\"foo\\" + \\"bar\\" + ) ; + code:implementedBy [ + rdf:type code:EcmaScriptModule ; + code:link ; + ] ; + ] + + ) ; + ] . + + a p:Pipeline, p:Writable ; + p:steps [ + p:stepList ( + [ + rdf:type p:Step ; + code:implementedBy [ + rdf:type code:EcmaScriptModule ; + code:link ; + ] ; + ] + ) ; + ] . + +" +`; diff --git a/packages/cli/test/codeImports.test.js b/packages/cli/test/codeImports.test.js new file mode 100644 index 00000000..2af42a4b --- /dev/null +++ b/packages/cli/test/codeImports.test.js @@ -0,0 +1,36 @@ +import { createRequire } from 'node:module' +import env from 'barnard59-env' +import formatsPretty from '@rdfjs-elements/formats-pretty' +import chai, { expect } from 'chai' +import { jestSnapshotPlugin } from 'mocha-chai-jest-snapshot' +import * as pipeline from '../lib/pipeline.js' + +const require = createRequire(import.meta.url) +env.formats.import({ + serializers: formatsPretty.serializers, +}) + +const prefixes = [ + 'sh', + 'rdf', + ['p', 'https://pipeline.described.at/'], + ['code', 'https://code.described.at/'], +] + +describe('pipeline', () => { + chai.use(jestSnapshotPlugin()) + + context('with code:imports', () => { + it('merges the pipelines', async () => { + // given + const filename = require.resolve('barnard59-test-e2e/definitions/code-imports/main.ttl') + + // when + const { ptr } = await pipeline.parse(filename, env.namedNode('http://example.org/pipeline/')) + + // then + const pretty = await ptr.dataset.serialize({ format: 'text/turtle', prefixes }) + expect(pretty).toMatchSnapshot() + }) + }) +}) diff --git a/packages/cli/test/simplify.test.js b/packages/cli/test/simplify.test.js index d40cbd27..8b0ee263 100644 --- a/packages/cli/test/simplify.test.js +++ b/packages/cli/test/simplify.test.js @@ -4,7 +4,8 @@ import rdf from 'barnard59-env' import { pipelineDefinitionLoader } from 'barnard59-test-support/loadPipelineDefinition.js' import { desugar } from '../lib/pipeline.js' -const dirname = resolve('test', 'support', 'approvals') +const __dirname = new URL('.', import.meta.url).pathname +const dirname = resolve(__dirname, 'support/approvals') const loadPipelineDefinition = pipelineDefinitionLoader(import.meta.url) diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 0e877df8..804812ae 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -1,5 +1,17 @@ # barnard59-core +## 5.3.2 + +### Patch Changes + +- e82aa36: Remove references of `rdf-js` types package, repaced with `@rdfjs/types` + +## 5.3.1 + +### Patch Changes + +- 9d0ce9f: Improve Windows compatibility (re zazuko/rdf-loader-code#34) + ## 5.3.0 ### Minor Changes diff --git a/packages/core/lib/cloneTerm.ts b/packages/core/lib/cloneTerm.ts index 0f5c1d54..7dd14e8a 100644 --- a/packages/core/lib/cloneTerm.ts +++ b/packages/core/lib/cloneTerm.ts @@ -1,4 +1,4 @@ -import type { Term } from 'rdf-js' +import type { Term } from '@rdfjs/types' import type { Environment } from 'barnard59-env' function cloneTerm(rdf: Environment, term: T | null | undefined): T | null { diff --git a/packages/core/lib/factory/pipeline.ts b/packages/core/lib/factory/pipeline.ts index 985f3a08..09143900 100644 --- a/packages/core/lib/factory/pipeline.ts +++ b/packages/core/lib/factory/pipeline.ts @@ -1,4 +1,4 @@ -import type { DatasetCore, Term } from 'rdf-js' +import type { DatasetCore, Term } from '@rdfjs/types' import type { GraphPointer, MultiPointer } from 'clownface' import { Logger } from 'winston' import { LoaderRegistry } from 'rdf-loaders-registry' diff --git a/packages/core/package.json b/packages/core/package.json index 19d3ce65..d2b09f53 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "barnard59-core", - "version": "5.3.0", + "version": "5.3.2", "description": "Core component of Barnard59 Linked Data pipelines", "type": "module", "main": "index.js", @@ -29,7 +29,7 @@ "is-graph-pointer": "^2.1.0", "is-stream": "^3.0.0", "onetime": "^6.0.0", - "rdf-loader-code": "^2.1.1", + "rdf-loader-code": "^2.1.3", "rdf-loaders-registry": "^1.0.1", "readable-stream": "^3.6.0", "untildify": "^5.0.0", @@ -38,7 +38,7 @@ "devDependencies": { "@rdfjs/namespace": "^2.0.0", "@types/readable-stream": "^4.0.9", - "barnard59-env": "^1.2.1", + "barnard59-env": "^1.2.2", "barnard59-http": "^2.0.0", "barnard59-test-support": "^0.0.3", "chai": "^4.3.7", diff --git a/packages/core/test/Pipeline.test.js b/packages/core/test/Pipeline.test.js index 4e5e1cad..d502f657 100644 --- a/packages/core/test/Pipeline.test.js +++ b/packages/core/test/Pipeline.test.js @@ -1,6 +1,5 @@ -import { strictEqual, rejects } from 'assert' -import { resolve } from 'path' -import { promisify } from 'util' +import { strictEqual, rejects } from 'node:assert' +import { promisify } from 'node:util' import getStream from 'get-stream' import stream from 'readable-stream' import { pipelineDefinitionLoader } from 'barnard59-test-support/loadPipelineDefinition.js' @@ -20,9 +19,9 @@ describe('Pipeline', () => { }) it('should process the given pipeline definition', async () => { - const { ptr } = await loadPipelineDefinition('read') + const { ptr, basePath } = await loadPipelineDefinition('read') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) const result = await getStream(pipeline.stream) @@ -30,9 +29,9 @@ describe('Pipeline', () => { }) it('should support writable pipelines', async () => { - const { ptr } = await loadPipelineDefinition('write') + const { ptr, basePath } = await loadPipelineDefinition('write') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) pipeline.stream.end('test') @@ -42,9 +41,9 @@ describe('Pipeline', () => { }) it('should support nested pipelines', async () => { - const { ptr } = await loadPipelineDefinition('nested') + const { ptr, basePath } = await loadPipelineDefinition('nested') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) const result = await getStream(pipeline.stream) @@ -52,9 +51,9 @@ describe('Pipeline', () => { }) it('should emit error when nested pipeline step errors immediately', async () => { - const { ptr } = await loadPipelineDefinition('nestedErrorBeforeInit') + const { ptr, basePath } = await loadPipelineDefinition('nestedErrorBeforeInit') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) await rejects(async () => { await getStream(pipeline.stream) @@ -62,12 +61,12 @@ describe('Pipeline', () => { }) it('should support nested writable pipelines', async () => { - const { ptr } = await loadPipelineDefinition('nested-write') + const { ptr, basePath } = await loadPipelineDefinition('nested-write') const result = [] const pipeline = createPipeline(ptr, { env, - basePath: resolve('test'), + basePath, context: { env, result }, }) @@ -77,41 +76,41 @@ describe('Pipeline', () => { }) it('should assign the pipeline stream to the .stream property', async () => { - const { ptr } = await loadPipelineDefinition('nested') + const { ptr, basePath } = await loadPipelineDefinition('nested') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) strictEqual(isStream(pipeline.stream), true) }) it('should assign the pipeline to the .pipeline property of the stream', async () => { - const { ptr } = await loadPipelineDefinition('nested') + const { ptr, basePath } = await loadPipelineDefinition('nested') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) strictEqual(pipeline.stream.pipeline, pipeline) }) it('should have a basePath string property', async () => { - const { ptr } = await loadPipelineDefinition('read') + const { ptr, basePath } = await loadPipelineDefinition('read') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) strictEqual(typeof pipeline.basePath, 'string') }) it('should have a context object property', async () => { - const { ptr } = await loadPipelineDefinition('read') + const { ptr, basePath } = await loadPipelineDefinition('read') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) strictEqual(typeof pipeline.context, 'object') }) it('should emit an error if the Pipeline contains no steps', async () => { - const { ptr } = await loadPipelineDefinition('empty') + const { ptr, basePath } = await loadPipelineDefinition('empty') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) await rejects(async () => { await getStream(pipeline.stream) @@ -119,9 +118,9 @@ describe('Pipeline', () => { }) it('should have a ptr clownface property', async () => { - const { ptr } = await loadPipelineDefinition('read') + const { ptr, basePath } = await loadPipelineDefinition('read') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) strictEqual(typeof pipeline.ptr, 'object') strictEqual(typeof pipeline.ptr.any, 'function') @@ -129,17 +128,17 @@ describe('Pipeline', () => { }) it('should have a ptr variables Map property', async () => { - const { ptr } = await loadPipelineDefinition('read') + const { ptr, basePath } = await loadPipelineDefinition('read') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) strictEqual(pipeline.variables instanceof Map, true) }) it('should emit an error if an operation returns an invalid stream', async () => { - const { ptr } = await loadPipelineDefinition('step-invalid') + const { ptr, basePath } = await loadPipelineDefinition('step-invalid') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) await rejects(async () => { await getStream(pipeline.stream) @@ -147,9 +146,9 @@ describe('Pipeline', () => { }) it('should emit an error if an operation rejects with error', async () => { - const { ptr } = await loadPipelineDefinition('step-operation-error') + const { ptr, basePath } = await loadPipelineDefinition('step-operation-error') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) await rejects(async () => { await getStream(pipeline.stream) @@ -157,9 +156,9 @@ describe('Pipeline', () => { }) it('should emit step stream errors', async () => { - const { ptr } = await loadPipelineDefinition('step-stream-error') + const { ptr, basePath } = await loadPipelineDefinition('step-stream-error') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) await rejects(async () => { await getStream(pipeline.stream) @@ -167,9 +166,9 @@ describe('Pipeline', () => { }) it('should catch and emit step stream errors', async () => { - const { ptr } = await loadPipelineDefinition('step-stream-throw') + const { ptr, basePath } = await loadPipelineDefinition('step-stream-throw') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) await rejects(async () => { await getStream(pipeline.stream) @@ -178,9 +177,9 @@ describe('Pipeline', () => { describe('plain Pipeline', () => { it('should emit an end event', async () => { - const { ptr } = await loadPipelineDefinition('plain') + const { ptr, basePath } = await loadPipelineDefinition('plain') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) const promise = eventToPromise(pipeline.stream, 'end') @@ -192,9 +191,9 @@ describe('Pipeline', () => { describe('readable Pipeline', () => { it('should emit an end event', async () => { - const { ptr } = await loadPipelineDefinition('read') + const { ptr, basePath } = await loadPipelineDefinition('read') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) const promise = eventToPromise(pipeline.stream, 'end') @@ -204,9 +203,9 @@ describe('Pipeline', () => { }) it('should emit an error if the last step doesn\'t have a readable interface', async () => { - const { ptr } = await loadPipelineDefinition('read-step-not-read') + const { ptr, basePath } = await loadPipelineDefinition('read-step-not-read') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) await rejects(async () => { await getStream(pipeline.stream) @@ -216,9 +215,9 @@ describe('Pipeline', () => { describe('writeable Pipeline', () => { it('should emit an finish event', async () => { - const { ptr } = await loadPipelineDefinition('write') + const { ptr, basePath } = await loadPipelineDefinition('write') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) const promise = eventToPromise(pipeline.stream, 'finish') diff --git a/packages/core/test/factory/operation.test.js b/packages/core/test/factory/operation.test.js index 41435e0c..7416f52d 100644 --- a/packages/core/test/factory/operation.test.js +++ b/packages/core/test/factory/operation.test.js @@ -1,5 +1,4 @@ -import { strictEqual } from 'assert' -import { resolve } from 'path' +import { strictEqual } from 'node:assert' import { pipelineDefinitionLoader } from 'barnard59-test-support/loadPipelineDefinition.js' import env from 'barnard59-env' import defaultLoaderRegistry from '../../lib/defaultLoaderRegistry.js' @@ -16,12 +15,12 @@ describe('factory/operation', () => { }) it('should load the given operation', async () => { - const { ptr: definition } = await loadPipelineDefinition('plain') + const { ptr: definition, basePath } = await loadPipelineDefinition('plain') const ptr = [...definition.node(ns.ex('')).out(ns.p.steps).out(ns.p.stepList).list()][0].out(ns.code.implementedBy) const operation = await createOperation(ptr, { context, - basePath: resolve('test'), + basePath, loaderRegistry: defaultLoaderRegistry(env), }) diff --git a/packages/core/test/factory/pipeline.test.js b/packages/core/test/factory/pipeline.test.js index 3628a5ab..9f68c3f0 100644 --- a/packages/core/test/factory/pipeline.test.js +++ b/packages/core/test/factory/pipeline.test.js @@ -1,5 +1,4 @@ -import { strictEqual, throws } from 'assert' -import { resolve } from 'path' +import { strictEqual, throws } from 'node:assert' import { expect } from 'chai' import sinon from 'sinon' import getStream from 'get-stream' @@ -17,42 +16,41 @@ describe('factory/pipeline', () => { }) it('should return a Pipeline object', async () => { - const { ptr } = await loadPipelineDefinition('plain') + const { ptr, basePath } = await loadPipelineDefinition('plain') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) strictEqual(pipeline instanceof Pipeline, true) }) it('should load the given pipeline from a plain graph pointer', async () => { - const { ptr: definition } = await loadPipelineDefinition('plain') + const { ptr: definition, basePath } = await loadPipelineDefinition('plain') const ptr = { dataset: definition.dataset, term: definition.term } - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) await pipeline.init() strictEqual(pipeline.children.length, 2) }) it('should throw an error if the term property of the graph pointer is missing', async () => { - const { ptr: graph } = await loadPipelineDefinition('read') + const { ptr: graph, basePath } = await loadPipelineDefinition('read') throws(() => { - createPipeline(graph.any(), { env, basePath: resolve('test') }) + createPipeline(graph.any(), { env, basePath }) }) }) it('should throw an error if the dataset property of the graph pointer is missing', async () => { - const { ptr } = (await loadPipelineDefinition('read')) + const { ptr, basePath } = (await loadPipelineDefinition('read')) throws(() => { - createPipeline({ term: ptr.term }, { env, basePath: resolve('test') }) + createPipeline({ term: ptr.term }, { env, basePath }) }) }) it('should use the given basePath', async () => { - const basePath = resolve('test') - const { ptr } = await loadPipelineDefinition('read') + const { ptr, basePath } = await loadPipelineDefinition('read') const pipeline = createPipeline(ptr, { env, basePath }) @@ -61,52 +59,52 @@ describe('factory/pipeline', () => { it('should use the given context', async () => { const context = { abc: 'def', env } - const { ptr } = await loadPipelineDefinition('read') + const { ptr, basePath } = await loadPipelineDefinition('read') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test'), context }) + const pipeline = createPipeline(ptr, { env, basePath, context }) await getStream(pipeline.stream) strictEqual(pipeline.context.abc, context.abc) }) it('should create a pipeline with readable interface matching the rdf:type', async () => { - const { ptr } = await loadPipelineDefinition('read') + const { ptr, basePath } = await loadPipelineDefinition('read') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) strictEqual(isReadable(pipeline.stream), true) strictEqual(!isReadableObjectMode(pipeline.stream), true) }) it('should create a pipeline with readable object mode interface matching the rdf:type', async () => { - const { ptr } = await loadPipelineDefinition('read-object-mode') + const { ptr, basePath } = await loadPipelineDefinition('read-object-mode') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) strictEqual(isReadableObjectMode(pipeline.stream), true) }) it('should create a pipeline with writable interface matching the rdf:type', async () => { - const { ptr } = await loadPipelineDefinition('write') + const { ptr, basePath } = await loadPipelineDefinition('write') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) strictEqual(isWritable(pipeline.stream), true) strictEqual(!isWritableObjectMode(pipeline.stream), true) }) it('should create a pipeline with writable object mode interface matching the rdf:type', async () => { - const { ptr } = await loadPipelineDefinition('write-object-mode') + const { ptr, basePath } = await loadPipelineDefinition('write-object-mode') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) strictEqual(isWritableObjectMode(pipeline.stream), true) }) it('should attach createPipeline to the context', async () => { - const { ptr } = await loadPipelineDefinition('plain') + const { ptr, basePath } = await loadPipelineDefinition('plain') - const pipeline = createPipeline(ptr, { env, basePath: resolve('test') }) + const pipeline = createPipeline(ptr, { env, basePath }) await pipeline.init() strictEqual(typeof pipeline.context.createPipeline, 'function') @@ -114,7 +112,7 @@ describe('factory/pipeline', () => { it('should log variables', async () => { // given - const { ptr } = await loadPipelineDefinition('nested') + const { ptr, basePath } = await loadPipelineDefinition('nested') const logger = { debug: sinon.spy(), info: sinon.spy(), @@ -126,7 +124,7 @@ describe('factory/pipeline', () => { // when const pipeline = createPipeline(ptr, { env, - basePath: resolve('test'), + basePath, logger, variables: new Map([['bar', 'secret'], ['baz', 'baz']]), }) diff --git a/packages/core/test/factory/step.test.js b/packages/core/test/factory/step.test.js index 5ce450ab..5eb0b70a 100644 --- a/packages/core/test/factory/step.test.js +++ b/packages/core/test/factory/step.test.js @@ -1,5 +1,4 @@ -import { strictEqual, rejects } from 'assert' -import { resolve } from 'path' +import { strictEqual, rejects } from 'node:assert' import getStream from 'get-stream' import { pipelineDefinitionLoader } from 'barnard59-test-support/loadPipelineDefinition.js' import env from 'barnard59-env' @@ -18,12 +17,12 @@ describe('factory/step', () => { }) it('should load the given step', async () => { - const { ptr: definition } = await loadPipelineDefinition('plain') + const { ptr: definition, basePath } = await loadPipelineDefinition('plain') const ptr = [...definition.node(ns.ex('')).out(ns.p.steps).out(ns.p.stepList).list()][0] const step = await createStep(ptr, { context, - basePath: resolve('test'), + basePath, loaderRegistry: defaultLoaderRegistry(env), logger: defaultLogger(), }) @@ -32,13 +31,13 @@ describe('factory/step', () => { }) it('should forward errors thrown by the loader', async () => { - const { ptr: definition } = await loadPipelineDefinition('step-operation-missing-error') + const { ptr: definition, basePath } = await loadPipelineDefinition('step-operation-missing-error') const ptr = [...definition.node(ns.ex('')).out(ns.p.steps).out(ns.p.stepList).list()][0] await rejects(async () => { await createStep(ptr, { context, - basePath: resolve('test'), + basePath, loaderRegistry: defaultLoaderRegistry(env), logger: defaultLogger(), }) @@ -51,12 +50,12 @@ describe('factory/step', () => { }) it('should attach step to the context', async () => { - const { ptr: definition } = await loadPipelineDefinition('step-ptr') + const { ptr: definition, basePath } = await loadPipelineDefinition('step-ptr') const ptr = [...definition.node(ns.ex('')).out(ns.p.steps).out(ns.p.stepList).list()][0] const step = await createStep(ptr, { context, - basePath: resolve('test'), + basePath, loaderRegistry: defaultLoaderRegistry(env), logger: defaultLogger(), }) diff --git a/packages/core/test/loader/pipeline.test.js b/packages/core/test/loader/pipeline.test.js index c333bb64..73036580 100644 --- a/packages/core/test/loader/pipeline.test.js +++ b/packages/core/test/loader/pipeline.test.js @@ -1,5 +1,4 @@ -import { strictEqual, rejects } from 'assert' -import { resolve } from 'path' +import { strictEqual, rejects } from 'node:assert' import rdf from 'barnard59-env' import { pipelineDefinitionLoader } from 'barnard59-test-support/loadPipelineDefinition.js' import { run } from '../../index.js' @@ -10,8 +9,7 @@ const context = { env: rdf } describe('loader/pipeline', () => { it('should use the given variables', async () => { - const basePath = resolve('test') - const { ptr } = await loadPipelineDefinition('plain') + const { ptr, basePath } = await loadPipelineDefinition('plain') const variables = new Map([ ['foo', 'bar'], diff --git a/packages/core/test/support/definitions/nested-write.ttl b/packages/core/test/support/definitions/nested-write.ttl index 5f00c8c5..cb22cc73 100644 --- a/packages/core/test/support/definitions/nested-write.ttl +++ b/packages/core/test/support/definitions/nested-write.ttl @@ -14,11 +14,11 @@ a p:Step; code:implementedBy [ a code:EcmaScriptModule; - code:link + code:link ]; code:arguments ("t" "e" "s" "t"). a p:Step; code:implementedBy [ a code:EcmaScriptModule; - code:link + code:link ]. diff --git a/packages/core/test/support/definitions/nested.ttl b/packages/core/test/support/definitions/nested.ttl index b7843f7a..d2d96a47 100644 --- a/packages/core/test/support/definitions/nested.ttl +++ b/packages/core/test/support/definitions/nested.ttl @@ -28,6 +28,6 @@ a p:Step; code:implementedBy [ a code:EcmaScriptModule; - code:link + code:link ]; code:arguments ("t" "e" "s" "t"). diff --git a/packages/core/test/support/definitions/plain.ttl b/packages/core/test/support/definitions/plain.ttl index 94128ec9..e515b77a 100644 --- a/packages/core/test/support/definitions/plain.ttl +++ b/packages/core/test/support/definitions/plain.ttl @@ -9,11 +9,11 @@ a p:Step; code:implementedBy [ a code:EcmaScriptModule; - code:link + code:link ]; code:arguments ("t" "e" "s" "t"). a p:Step; code:implementedBy [ a code:EcmaScriptModule; - code:link + code:link ]. diff --git a/packages/core/test/support/definitions/read.ttl b/packages/core/test/support/definitions/read.ttl index 115e107d..9f0c2315 100644 --- a/packages/core/test/support/definitions/read.ttl +++ b/packages/core/test/support/definitions/read.ttl @@ -9,6 +9,6 @@ a p:Step; code:implementedBy [ a code:EcmaScriptModule; - code:link + code:link ]; code:arguments ("t" "e" "s" "t"). diff --git a/packages/core/test/support/definitions/step-operation-missing-error.ttl b/packages/core/test/support/definitions/step-operation-missing-error.ttl index b184af1f..230d48cf 100644 --- a/packages/core/test/support/definitions/step-operation-missing-error.ttl +++ b/packages/core/test/support/definitions/step-operation-missing-error.ttl @@ -9,5 +9,5 @@ a p:Step; code:implementedBy [ a code:EcmaScriptModule; - code:link + code:link ]. diff --git a/packages/core/test/support/definitions/step-ptr.ttl b/packages/core/test/support/definitions/step-ptr.ttl index 079ac0c0..5648d855 100644 --- a/packages/core/test/support/definitions/step-ptr.ttl +++ b/packages/core/test/support/definitions/step-ptr.ttl @@ -9,5 +9,5 @@ a p:Step; code:implementedBy [ a code:EcmaScriptModule; - code:link + code:link ]. diff --git a/packages/core/test/support/definitions/write.ttl b/packages/core/test/support/definitions/write.ttl index 929fba1d..61c0f71c 100644 --- a/packages/core/test/support/definitions/write.ttl +++ b/packages/core/test/support/definitions/write.ttl @@ -19,5 +19,5 @@ a p:Step; code:implementedBy [ a code:EcmaScriptModule; - code:link + code:link ]. diff --git a/packages/cube/CHANGELOG.md b/packages/cube/CHANGELOG.md index c9df2946..d5dcd1ee 100644 --- a/packages/cube/CHANGELOG.md +++ b/packages/cube/CHANGELOG.md @@ -1,5 +1,32 @@ # barnard59-cube +## 1.4.0 + +### Minor Changes + +- 37b5b19: Additional commands: `fetch-cube`, `fetch-constraint` + +### Patch Changes + +- Updated dependencies [452d885] + - barnard59-shacl@1.4.0 + +## 1.3.0 + +### Minor Changes + +- f2e796c: Shape creation refactoring and improvements + +### Patch Changes + +- 7456a6a: added batch operation +- Updated dependencies [82dbe7e] +- Updated dependencies [c090ff2] +- Updated dependencies [7456a6a] + - barnard59-rdf@3.4.0 + - barnard59-shacl@1.3.1 + - barnard59-base@2.4.0 + ## 1.2.0 ### Minor Changes diff --git a/packages/cube/README.md b/packages/cube/README.md index 1d232608..08a3f50f 100644 --- a/packages/cube/README.md +++ b/packages/cube/README.md @@ -38,7 +38,7 @@ Pipeline `fetch-metadata` queries a given SPARQL endpoint to retrieve a [concise bounded description](https://docs.stardog.com/query-stardog/#describe-queries) of a given cube and its constraint (excluding the observations). ```bash -npx barnard59 cube fetch-metadata \ +barnard59 cube fetch-metadata \ --cube https://agriculture.ld.admin.ch/agroscope/PRIFm8t15/2 \ --endpoint https://int.lindas.admin.ch/query ``` @@ -55,21 +55,21 @@ The pipeline reads the metadata from `stdin`, allowing input from a local file ( ```bash cat cube.ttl \ -| npx barnard59 cube check-metadata \ +| barnard59 cube check-metadata \ --profile https://cube.link/v0.1.0/shape/standalone-constraint-constraint ``` SHACL reports for violations are written to `stdout`. In cases when a remote address give to `--profile` option does not include a correct `content-type` header (or does not provide a `content-type` header at all), the pipeline will fail. In such cases, it is possible to use the `--profileFormat` option to select the correct RDF parser. Its value must be a media type, such as `text/turtle`. -```bash + ### fetch observations Pipeline `fetch-observations` queries a given SPARQL endpoint to retrieve the observations of a given cube. ```bash -npx barnard59 cube fetch-observations \ +barnard59 cube fetch-observations \ --cube https://agriculture.ld.admin.ch/agroscope/PRIFm8t15/2 \ --endpoint https://int.lindas.admin.ch/query ``` @@ -83,7 +83,7 @@ The pipeline reads the observations from `stdin`, allowing input from a local fi ```bash cat observations.ttl \ -| npx barnard59 cube check-observations \ +| barnard59 cube check-observations \ --constraint metadata.ttl ``` @@ -95,6 +95,18 @@ SHACL reports for violations are written to `stdout`. To limit the output size, there is also a `maxViolations` option to stop validation when the given number of violations is reached. + +### Report Summary +The validation pipelines write a machine-readable [standard](https://www.w3.org/TR/shacl/#validation-report) report to `stdout`. +The `barnard59-shacl` package provides an additional `report-summary` pipeline to produce a human-readable summary of this report: + +```bash +cat observations.ttl \ +| barnard59 cube check-observations --constraint metadata.ttl \ +| barnard59 shacl report-summary +``` + + ### Known issues Command `check-metadata` may fail if there are `sh:in` constraints with too many values. diff --git a/packages/cube/lib/cube/buildCubeShape/Cube.js b/packages/cube/lib/cube/buildCubeShape/Cube.js index 6c368005..e3e8f571 100644 --- a/packages/cube/lib/cube/buildCubeShape/Cube.js +++ b/packages/cube/lib/cube/buildCubeShape/Cube.js @@ -2,7 +2,7 @@ import cbdCopy from '../../cbdCopy.js' import Dimension from './Dimension.js' class Cube { - constructor({ rdf, metadata, observationSet, shape, term, propertyShapeId }) { + constructor({ rdf, metadata, observationSet, shape, term, propertyShapeId, inListMaxSize }) { this.rdf = rdf this.metadata = metadata this.observationSet = observationSet @@ -10,6 +10,11 @@ class Cube { this.term = term this.dimensions = rdf.termMap() this.propertyShapeId = propertyShapeId + this.inListMaxSize = inListMaxSize + } + + get messages() { + return [...this.dimensions.values()].flatMap(({ messages }) => messages) } dimension({ predicate, object }) { @@ -21,7 +26,7 @@ class Cube { .out(this.rdf.ns.sh.property) .has(this.rdf.ns.sh.path, predicate) - dimension = new Dimension({ rdf: this.rdf, metadata, predicate, object, shapeId: this.propertyShapeId }) + dimension = new Dimension({ rdf: this.rdf, metadata, predicate, object, shapeId: this.propertyShapeId, inListMaxSize: this.inListMaxSize }) this.dimensions.set(predicate, dimension) } diff --git a/packages/cube/lib/cube/buildCubeShape/Dimension.js b/packages/cube/lib/cube/buildCubeShape/Dimension.js index 4520be24..cfd679dd 100644 --- a/packages/cube/lib/cube/buildCubeShape/Dimension.js +++ b/packages/cube/lib/cube/buildCubeShape/Dimension.js @@ -1,54 +1,23 @@ import cbdCopy from '../../cbdCopy.js' -import initDatatypeParsers from './datatypes.js' +import datatypeParsers from './datatypes.js' +import { CompositeConstraintBuilder } from './constraintBuilder/CompositeConstraintBuilder.js' +import { DimensionConstraintsBuilder } from './constraintBuilder/DimensionConstraintsBuilder.js' +import { NodeKindConstraintBuilder } from './constraintBuilder/NodeKindConstraintBuilder.js' class Dimension { - constructor({ rdf, metadata, predicate, object, shapeId = () => rdf.blankNode() }) { + constructor({ rdf, metadata, predicate, shapeId = () => rdf.blankNode(), inListMaxSize }) { this.rdf = rdf this.metadata = metadata this.predicate = predicate - this.termType = object.termType - this.datatype = rdf.termSet() this.shapeId = shapeId - - this.datatypeParsers = initDatatypeParsers(rdf) - if (object.datatype && this.datatypeParsers.has(object.datatype)) { - const datatypeParser = this.datatypeParsers.get(object.datatype) - - const value = datatypeParser(object) - - this.min = object - this.minValue = value - this.max = object - this.maxValue = value - } else { - this.in = rdf.termSet() - } + this.constraints = new CompositeConstraintBuilder( + new NodeKindConstraintBuilder(rdf), + new DimensionConstraintsBuilder({ rdf, datatypeParsers: datatypeParsers(rdf), inListMaxSize })) + this.messages = [] } update({ object }) { - if (object.datatype) { - this.datatype.add(object.datatype) - } - - if (object.datatype && this.datatypeParsers.has(object.datatype)) { - const datatypeParser = this.datatypeParsers.get(object.datatype) - - const value = datatypeParser(object) - - if (value < this.minValue) { - this.min = object - this.minValue = value - } - - if (value > this.maxValue) { - this.max = object - this.maxValue = value - } - } - - if (this.in) { - this.in.add(object) - } + this.constraints.add(object) } toDataset({ cube, shape }) { @@ -60,33 +29,15 @@ class Dimension { ptr .addIn(this.rdf.ns.sh.property, shape) .addOut(this.rdf.ns.sh.path, this.predicate) - .addOut(this.rdf.ns.sh.nodeKind, this.termType === 'NamedNode' ? this.rdf.ns.sh.IRI : this.rdf.ns.sh.Literal) .addOut(this.rdf.ns.sh.minCount, 1) .addOut(this.rdf.ns.sh.maxCount, 1) - if (this.datatype.size === 1) { - ptr.addOut(this.rdf.ns.sh.datatype, [...this.datatype][0]) - } - - if (this.datatype.size > 1) { - ptr.addList(this.rdf.ns.sh.or, [...this.datatype].map(datatype => { - return ptr - .blankNode() - .addOut(this.rdf.ns.sh.datatype, datatype) - })) - } - - if (this.in) { - ptr.addList(this.rdf.ns.sh.in, [...this.in.values()]) - } + this.constraints.build(ptr) - if (this.min) { - ptr.addOut(this.rdf.ns.sh.minInclusive, this.min) - } - - if (this.max) { - ptr.addOut(this.rdf.ns.sh.maxInclusive, this.max) - } + ptr.out(this.rdf.ns.sh.description) + .forEach(description => { + this.messages.push(`${this.predicate.value}: ${description.term.value}`) + }) if (this.metadata.term) { cbdCopy(this.rdf, this.metadata, ptr) diff --git a/packages/cube/lib/cube/buildCubeShape/constraintBuilder/CompositeConstraintBuilder.js b/packages/cube/lib/cube/buildCubeShape/constraintBuilder/CompositeConstraintBuilder.js new file mode 100644 index 00000000..ccb33caa --- /dev/null +++ b/packages/cube/lib/cube/buildCubeShape/constraintBuilder/CompositeConstraintBuilder.js @@ -0,0 +1,13 @@ +export class CompositeConstraintBuilder { + constructor(...builders) { + this.builders = builders + } + + add(object) { + this.builders.forEach(builder => builder.add(object)) + } + + build(ptr) { + this.builders.forEach(builder => builder.build(ptr)) + } +} diff --git a/packages/cube/lib/cube/buildCubeShape/constraintBuilder/DatatypeConstraintBuilder.js b/packages/cube/lib/cube/buildCubeShape/constraintBuilder/DatatypeConstraintBuilder.js new file mode 100644 index 00000000..44f64152 --- /dev/null +++ b/packages/cube/lib/cube/buildCubeShape/constraintBuilder/DatatypeConstraintBuilder.js @@ -0,0 +1,19 @@ +export class DatatypeConstraintBuilder { + constructor(rdf, datatype) { + this.sh = rdf.ns.sh + this.datatype = datatype + this.enabled = true + } + + add(object) { + if (!this.datatype.equals(object.datatype)) { + this.enabled = false + } + } + + build(ptr) { + if (this.enabled) { + ptr.addOut(this.sh.datatype, this.datatype) + } + } +} diff --git a/packages/cube/lib/cube/buildCubeShape/constraintBuilder/DimensionConstraintsBuilder.js b/packages/cube/lib/cube/buildCubeShape/constraintBuilder/DimensionConstraintsBuilder.js new file mode 100644 index 00000000..7f929698 --- /dev/null +++ b/packages/cube/lib/cube/buildCubeShape/constraintBuilder/DimensionConstraintsBuilder.js @@ -0,0 +1,75 @@ +import { DatatypeConstraintBuilder } from './DatatypeConstraintBuilder.js' +import { CompositeConstraintBuilder } from './CompositeConstraintBuilder.js' +import { RangeConstraintBuilder } from './RangeConstraintBuilder.js' +import { ValuesConstraintBuilder } from './ValuesConstraintBuilder.js' + +export class DimensionConstraintsBuilder { + constructor({ rdf, datatypeParsers, inListMaxSize }) { + this.rdf = rdf + this.datatypeParsers = datatypeParsers + this.inListMaxSize = inListMaxSize + this.builders = rdf.termMap() + } + + #createBuilder(datatype) { + if (this.datatypeParsers.has(datatype)) { + return new CompositeConstraintBuilder( + new DatatypeConstraintBuilder(this.rdf, datatype), + new RangeConstraintBuilder(this.rdf, this.datatypeParsers.get(datatype))) + } else { + return new CompositeConstraintBuilder( + new DatatypeConstraintBuilder(this.rdf, datatype), + new ValuesConstraintBuilder(this.rdf, this.inListMaxSize)) + } + } + + #addDatatype(object) { + if (this.builders.has(object.datatype)) { + this.builders.get(object.datatype).add(object) + } else { + const builder = this.#createBuilder(object.datatype) + builder.add(object) + this.builders.set(object.datatype, builder) + } + } + + #addOther(object) { + if (this.valuesBuilder) { + this.valuesBuilder.add(object) + } else { + this.valuesBuilder = new ValuesConstraintBuilder(this.rdf, this.inListMaxSize) + this.valuesBuilder.add(object) + } + } + + add(object) { + if (object.datatype) { + this.#addDatatype(object) + } else { + this.#addOther(object) + } + } + + build(ptr) { + if (this.valuesBuilder?.message) { + ptr.addOut(this.rdf.ns.sh.description, this.valuesBuilder.message) + return + } + + const builders = [...this.builders.values()] + if (this.valuesBuilder) { + builders.push(this.valuesBuilder) + } + + if (builders.length === 1) { + builders[0].build(ptr) + } + if (builders.length > 1) { + ptr.addList(this.rdf.ns.sh.or, builders.map(builder => { + const blankNode = ptr.blankNode() + builder.build(blankNode) + return blankNode + })) + } + } +} diff --git a/packages/cube/lib/cube/buildCubeShape/constraintBuilder/NodeKindConstraintBuilder.js b/packages/cube/lib/cube/buildCubeShape/constraintBuilder/NodeKindConstraintBuilder.js new file mode 100644 index 00000000..768aea0b --- /dev/null +++ b/packages/cube/lib/cube/buildCubeShape/constraintBuilder/NodeKindConstraintBuilder.js @@ -0,0 +1,42 @@ +export class NodeKindConstraintBuilder { + #termTypes = new Set() + + constructor(rdf) { + this.sh = rdf.ns.sh + } + + add(object) { + this.#termTypes.add(object.termType) + } + + get #nodeKind() { + if (this.#termTypes.size === 1) { + if (this.#termTypes.has('NamedNode')) { + return this.sh.IRI + } + if (this.#termTypes.has('Literal')) { + return this.sh.Literal + } + if (this.#termTypes.has('BlankNode')) { + return this.sh.BlankNode + } + } + if (this.#termTypes.size === 2) { + if (this.#termTypes.has('NamedNode') && this.#termTypes.has('Literal')) { + return this.sh.IRIOrLiteral + } + if (this.#termTypes.has('NamedNode') && this.#termTypes.has('BlankNode')) { + return this.sh.BlankNodeOrIRI + } + if (this.#termTypes.has('Literal') && this.#termTypes.has('BlankNode')) { + return this.sh.BlankNodeOrLiteral + } + } + } + + build(ptr) { + if (this.#nodeKind !== undefined) { + ptr.addOut(this.sh.nodeKind, this.#nodeKind) + } + } +} diff --git a/packages/cube/lib/cube/buildCubeShape/constraintBuilder/RangeConstraintBuilder.js b/packages/cube/lib/cube/buildCubeShape/constraintBuilder/RangeConstraintBuilder.js new file mode 100644 index 00000000..94f284f5 --- /dev/null +++ b/packages/cube/lib/cube/buildCubeShape/constraintBuilder/RangeConstraintBuilder.js @@ -0,0 +1,56 @@ +export class RangeConstraintBuilder { + // consider removing the parser argument and always use fromRdf from 'rdf-literal' + // because we rely on its behavior in case of parsing issues + constructor(rdf, parser) { + this.sh = rdf.ns.sh + this.parser = parser + this.enabled = true + } + + #initRange(object, value) { + return { + min: value, + max: value, + minObject: object, + maxObject: object, + } + } + + #updateRange(object, value, range) { + if (value < range.min) { + range.min = value + range.minObject = object + } + if (value > range.max) { + range.max = value + range.maxObject = object + } + } + + add(object) { + if (!this.enabled) return + + if (!object.datatype) { + this.enabled = false + return + } + + const value = this.parser(object) + + if (this.range) { + this.#updateRange(object, value, this.range) + } else { + this.range = this.#initRange(object, value) + } + + // can be false in case of parsing issues + this.enabled = (this.range.min <= value && value <= this.range.max) + } + + build(ptr) { + if (this.enabled && this.range) { + ptr.addOut(this.sh.minInclusive, this.range.minObject) + ptr.addOut(this.sh.maxInclusive, this.range.maxObject) + } + } +} diff --git a/packages/cube/lib/cube/buildCubeShape/constraintBuilder/ValuesConstraintBuilder.js b/packages/cube/lib/cube/buildCubeShape/constraintBuilder/ValuesConstraintBuilder.js new file mode 100644 index 00000000..527c74ad --- /dev/null +++ b/packages/cube/lib/cube/buildCubeShape/constraintBuilder/ValuesConstraintBuilder.js @@ -0,0 +1,24 @@ +export class ValuesConstraintBuilder { + constructor(rdf, threshold) { + this.sh = rdf.ns.sh + this.threshold = threshold + this.values = rdf.termSet() + this.enabled = true + } + + add(object) { + if (!this.enabled) return + this.values.add(object) + if (this.values.size > this.threshold) { + this.enabled = false + this.message = 'Too many values for in-list constraint.' // TODO: better message + this.values.clear() + } + } + + build(ptr) { + if (this.enabled && this.values.size > 0) { + ptr.addList(this.sh.in, this.values) + } + } +} diff --git a/packages/cube/lib/cube/buildCubeShape/index.js b/packages/cube/lib/cube/buildCubeShape/index.js index bdc08956..fadbb171 100644 --- a/packages/cube/lib/cube/buildCubeShape/index.js +++ b/packages/cube/lib/cube/buildCubeShape/index.js @@ -24,7 +24,7 @@ function defaultShape({ term }) { } class CubeShapeBuilder extends Transform { - constructor({ rdf, excludeValuesOf, metadata, graph, propertyShapeId } = {}) { + constructor({ rdf, excludeValuesOf, metadata, graph, propertyShapeId, inListMaxSize } = {}) { super({ objectMode: true }) this.rdf = rdf @@ -36,6 +36,7 @@ class CubeShapeBuilder extends Transform { shape: defaultShape.bind({ rdf }), graph, propertyShapeId, + inListMaxSize, } this.init = once(() => this._init()) @@ -76,6 +77,7 @@ class CubeShapeBuilder extends Transform { observationSet: context.observationSet, shape: context.shape, propertyShapeId: this.options.propertyShapeId, + inListMaxSize: this.options.inListMaxSize, }) this.options.cubes.set(context.term, context.cube) @@ -104,8 +106,8 @@ class CubeShapeBuilder extends Transform { } } -function buildCubeShape({ excludeValuesOf, metadata, graph, propertyShapeId } = {}) { - return new CubeShapeBuilder({ rdf: this.env, excludeValuesOf, metadata, graph, propertyShapeId }) +function buildCubeShape({ excludeValuesOf, metadata, graph, propertyShapeId, inListMaxSize } = {}) { + return new CubeShapeBuilder({ rdf: this.env, excludeValuesOf, metadata, graph, propertyShapeId, inListMaxSize }) } export default buildCubeShape diff --git a/packages/cube/manifest.ttl b/packages/cube/manifest.ttl index f45c4011..88f39213 100644 --- a/packages/cube/manifest.ttl +++ b/packages/cube/manifest.ttl @@ -48,3 +48,18 @@ rdfs:label "Validate input observations against cube constraint" ; b59:source "barnard59-cube/pipeline/check-observations.ttl" ; . + + + a b59:CliCommand ; + b59:command "fetch-constraint" ; + rdfs:label "Retrieves cube constraint from SPARQL endpoint" ; + b59:source "barnard59-cube/pipeline/fetch-constraint.ttl" ; +. + + + a b59:CliCommand ; + b59:command "fetch-cube" ; + rdfs:label "Retrieves cube with observations from SPARQL endpoint" ; + b59:source "barnard59-cube/pipeline/fetch-cube.ttl" ; +. + diff --git a/packages/cube/package.json b/packages/cube/package.json index f55853fa..51549653 100644 --- a/packages/cube/package.json +++ b/packages/cube/package.json @@ -1,6 +1,6 @@ { "name": "barnard59-cube", - "version": "1.2.0", + "version": "1.4.0", "description": "Build and check RDF cubes in Linked Data pipelines", "type": "module", "main": "index.js", @@ -20,12 +20,12 @@ }, "homepage": "https://github.com/zazuko/barnard59", "dependencies": { - "barnard59-base": "^2.2.0", + "barnard59-base": "^2.4.0", "barnard59-formats": "^2.0.0", "barnard59-http": "^2.0.0", - "barnard59-rdf": "^3.3.0", + "barnard59-rdf": "^3.4.0", + "barnard59-shacl": "^1.4.0", "barnard59-sparql": "^2.1.1", - "barnard59-shacl": "^1.2.0", "external-merge-sort": "^0.1.3", "lodash": "^4.17.21", "rdf-literal": "^1.3.0", @@ -34,10 +34,11 @@ }, "devDependencies": { "@rdfjs/to-ntriples": "^2.0.0", - "barnard59-env": "^1.2.0", + "barnard59-env": "^1.2.3", "chai": "^4.3.7", - "is-stream": "^3.0.0", "get-stream": "^6.0.1", + "is-stream": "^3.0.0", + "rdf-validate-shacl": "^0.5.1", "shelljs": "^0.8.5" }, "mocha": { diff --git a/packages/cube/pipeline/fetch-constraint.ttl b/packages/cube/pipeline/fetch-constraint.ttl new file mode 100644 index 00000000..5cda6ede --- /dev/null +++ b/packages/cube/pipeline/fetch-constraint.ttl @@ -0,0 +1,32 @@ +@prefix code: . +@prefix p: . +@prefix ntriples: . +@prefix rdfs: . +@prefix : . + +[ + code:imports <./query-constraint> ; + code:extension "ttl" ; +] . + +_:endpoint a p:Variable ; + p:name "endpoint" ; + rdfs:label "SPARQL endpoint" ; +. + +_:cube a p:Variable ; + p:name "cube" ; + rdfs:label "cube URI" ; +. + +:fetch-constraint a p:Pipeline , p:Readable ; + p:variables [ p:variable _:endpoint, _:cube ] ; + p:steps + [ + p:stepList + ( + :queryConstraint + [ ntriples:serialize () ] + ) + ] +. diff --git a/packages/cube/pipeline/fetch-cube.ttl b/packages/cube/pipeline/fetch-cube.ttl new file mode 100644 index 00000000..cced5a95 --- /dev/null +++ b/packages/cube/pipeline/fetch-cube.ttl @@ -0,0 +1,45 @@ +@prefix code: . +@prefix p: . +@prefix ntriples: . +@prefix base: . +@prefix rdfs: . +@prefix : . + +[ + code:imports <./query-cube> ; + code:extension "ttl" ; +] . +[ + code:imports <./query-observation-sets> ; + code:extension "ttl" ; +] . +[ + code:imports <./query-observations> ; + code:extension "ttl" ; +] . + +_:endpoint a p:Variable ; + p:name "endpoint" ; + rdfs:label "SPARQL endpoint" ; +. + +_:cube a p:Variable ; + p:name "cube" ; + rdfs:label "cube URI" ; +. + +:fetch-cube a p:Pipeline , p:Readable ; + p:variables [ p:variable _:endpoint, _:cube ] ; + p:steps + [ + p:stepList + ( + [ base:concat\/object ( + :queryCube + :queryObservationSet + :queryObservations + ) ] + [ ntriples:serialize () ] + ) + ] +. diff --git a/packages/cube/pipeline/fetch-metadata.ttl b/packages/cube/pipeline/fetch-metadata.ttl index d29ddbed..20125a3b 100644 --- a/packages/cube/pipeline/fetch-metadata.ttl +++ b/packages/cube/pipeline/fetch-metadata.ttl @@ -1,11 +1,18 @@ @prefix code: . @prefix p: . -@prefix sparql: . @prefix ntriples: . @prefix base: . @prefix rdfs: . +@prefix : . -@base . +[ + code:imports <./query-cube> ; + code:extension "ttl" ; +] . +[ + code:imports <./query-constraint> ; + code:extension "ttl" ; +] . _:endpoint a p:Variable ; p:name "endpoint" ; @@ -17,65 +24,14 @@ _:cube a p:Variable ; rdfs:label "cube URI" ; . - a p:Pipeline , p:Readable ; +:fetch-metadata a p:Pipeline , p:Readable ; p:variables [ p:variable _:endpoint, _:cube ] ; p:steps [ p:stepList ( - [ base:concat\/object (_:queryCube _:queryConstraint) ] + [ base:concat\/object (:queryCube :queryConstraint) ] [ ntriples:serialize () ] ) ] . - - -# relying on cbd is not ideal (vendor specific) - -_:queryCube a p:Pipeline , p:ReadableObjectMode ; - p:steps - [ - p:stepList - ( - [ - sparql:construct - [ code:name "endpoint"; code:value "endpoint"^^p:VariableName ] , - [ - code:name "query"; - code:value """ - #pragma describe.strategy cbd - - DESCRIBE <${cube}> - """^^code:EcmaScriptTemplateLiteral - ] - ] - ) - ] - . - -_:queryConstraint a p:Pipeline, p:ReadableObjectMode ; - p:steps - [ - p:stepList - ( - [ - sparql:construct - [ code:name "endpoint"; code:value "endpoint"^^p:VariableName ] , - [ - code:name "query"; - code:value """ - #pragma describe.strategy cbd - - PREFIX cube: - - DESCRIBE ?s - WHERE { - <${cube}> cube:observationConstraint ?s . - } - """^^code:EcmaScriptTemplateLiteral - ] - ] - ) - ] - . - \ No newline at end of file diff --git a/packages/cube/pipeline/fetch-observations.ttl b/packages/cube/pipeline/fetch-observations.ttl index d5680060..6a8b330e 100644 --- a/packages/cube/pipeline/fetch-observations.ttl +++ b/packages/cube/pipeline/fetch-observations.ttl @@ -1,10 +1,13 @@ @prefix code: . @prefix p: . -@prefix sparql: . @prefix ntriples: . @prefix rdfs: . +@prefix : . -@base . +[ + code:imports <./query-observations> ; + code:extension "ttl" ; +] . _:endpoint a p:Variable ; p:name "endpoint" ; @@ -16,34 +19,14 @@ _:cube a p:Variable ; rdfs:label "cube URI" ; . - a p:Pipeline , p:Readable ; +:fetch-observations a p:Pipeline , p:Readable ; p:variables [ p:variable _:endpoint, _:cube ] ; p:steps [ p:stepList ( - _:queryObservations + :queryObservations [ ntriples:serialize () ] ) ] . - - -_:queryObservations sparql:construct - [ - code:name "endpoint"; - code:value "endpoint"^^p:VariableName - ] , - [ - code:name "query"; - code:value """ - PREFIX cube: - - CONSTRUCT { ?s ?p ?o } - WHERE { - <${cube}> cube:observationSet/cube:observation ?s . - ?s ?p ?o - } - """^^code:EcmaScriptTemplateLiteral - ] -. diff --git a/packages/cube/pipeline/query-constraint.ttl b/packages/cube/pipeline/query-constraint.ttl new file mode 100644 index 00000000..a224b02e --- /dev/null +++ b/packages/cube/pipeline/query-constraint.ttl @@ -0,0 +1,32 @@ +@prefix code: . +@prefix p: . +@prefix sparql: . +@prefix : . + +# relying on cbd is not ideal (vendor specific) +:queryConstraint a p:Pipeline, p:ReadableObjectMode ; + p:steps + [ + p:stepList + ( + [ + sparql:construct + [ code:name "endpoint"; code:value "endpoint"^^p:VariableName ] , + [ + code:name "query"; + code:value """ + #pragma describe.strategy cbd + + PREFIX cube: + + DESCRIBE ?s + WHERE { + <${cube}> cube:observationConstraint ?s . + } + """^^code:EcmaScriptTemplateLiteral + ] + ] + ) + ] + . + \ No newline at end of file diff --git a/packages/cube/pipeline/query-cube.ttl b/packages/cube/pipeline/query-cube.ttl new file mode 100644 index 00000000..785eb15c --- /dev/null +++ b/packages/cube/pipeline/query-cube.ttl @@ -0,0 +1,26 @@ +@prefix code: . +@prefix p: . +@prefix sparql: . +@prefix : . + +# relying on cbd is not ideal (vendor specific) +:queryCube a p:Pipeline , p:ReadableObjectMode ; + p:steps + [ + p:stepList + ( + [ + sparql:construct + [ code:name "endpoint"; code:value "endpoint"^^p:VariableName ] , + [ + code:name "query"; + code:value """ + #pragma describe.strategy cbd + + DESCRIBE <${cube}> + """^^code:EcmaScriptTemplateLiteral + ] + ] + ) + ] + . diff --git a/packages/cube/pipeline/query-observation-sets.ttl b/packages/cube/pipeline/query-observation-sets.ttl new file mode 100644 index 00000000..75f487ae --- /dev/null +++ b/packages/cube/pipeline/query-observation-sets.ttl @@ -0,0 +1,29 @@ +@prefix code: . +@prefix p: . +@prefix sparql: . +@prefix : . + +:queryObservationSet a p:Pipeline, p:ReadableObjectMode ; + p:steps + [ + p:stepList + ( + [ + sparql:construct + [ code:name "endpoint"; code:value "endpoint"^^p:VariableName ] , + [ + code:name "query"; + code:value """ + PREFIX cube: + + CONSTRUCT { ?s cube:observation ?o } + WHERE { + <${cube}> cube:observationSet ?s . + ?s cube:observation ?o . + } + """^^code:EcmaScriptTemplateLiteral + ] + ] + ) + ] + . diff --git a/packages/cube/pipeline/query-observations.ttl b/packages/cube/pipeline/query-observations.ttl new file mode 100644 index 00000000..f7fbc354 --- /dev/null +++ b/packages/cube/pipeline/query-observations.ttl @@ -0,0 +1,30 @@ +@prefix code: . +@prefix p: . +@prefix sparql: . +@prefix : . + +:queryObservations a p:Pipeline, p:ReadableObjectMode ; + p:steps + [ + p:stepList + ( + [ + sparql:construct + [ code:name "endpoint"; code:value "endpoint"^^p:VariableName ] , + [ + code:name "query"; + code:value """ + PREFIX cube: + + CONSTRUCT { ?s ?p ?o } + WHERE { + <${cube}> cube:observationSet/cube:observation ?s . + ?s ?p ?o + } + """^^code:EcmaScriptTemplateLiteral + ] + ] + ) + ] + . + \ No newline at end of file diff --git a/packages/cube/test/cube.test.js b/packages/cube/test/cube.test.js index e14e7ce2..4449592b 100644 --- a/packages/cube/test/cube.test.js +++ b/packages/cube/test/cube.test.js @@ -1,2 +1,3 @@ import './cube/buildCubeShape.test.js' import './cube/toObservation.test.js' +import './cube/constraintBuilder.test.js' diff --git a/packages/cube/test/cube/buildCubeShape.test.js b/packages/cube/test/cube/buildCubeShape.test.js index d88b762a..a2cf215c 100644 --- a/packages/cube/test/cube/buildCubeShape.test.js +++ b/packages/cube/test/cube/buildCubeShape.test.js @@ -1,4 +1,4 @@ -import { deepStrictEqual, strictEqual } from 'assert' +import { strictEqual } from 'assert' import toNT from '@rdfjs/to-ntriples' import { isDuplexStream as isDuplex } from 'is-stream' import rdf from 'barnard59-env' @@ -13,13 +13,26 @@ const buildCubeShape = buildCubeShapeUnbound.bind({ env: rdf }) function checkMinMax(result, min, max) { const propertyShape = result.has(ns.sh.path, ex.property) - const shapeMin = propertyShape.out(ns.sh.minInclusive) - const shapeMax = propertyShape.out(ns.sh.maxInclusive) + checkRange(propertyShape, min, max) +} + +function checkRange(ptr, min, max) { + const shapeMin = ptr.out(ns.sh.minInclusive) + const shapeMax = ptr.out(ns.sh.maxInclusive) strictEqual(toNT(shapeMin.term), toNT(min)) strictEqual(toNT(shapeMax.term), toNT(max)) } +function checkValues(ptr, ...expectedValues) { + const values = rdf.termSet([...ptr.out(ns.sh.in).list()].map(ptr => ptr.term)) + + strictEqual(values.size, expectedValues.length) + for (const expectedValue of expectedValues) { + strictEqual(values.has(expectedValue), true) + } +} + describe('cube.buildCubeShape', () => { it('should be a factory', () => { strictEqual(typeof buildCubeShape, 'function') @@ -233,6 +246,26 @@ describe('cube.buildCubeShape', () => { strictEqual(toNT(nodeKind.term), toNT(ns.sh.IRI)) }) + it('should generate nodeKind for mixed node values', async () => { + const input = createObservationsStream({ + observations: [{ + [ex.property.value]: rdf.literal('A'), + }, { + [ex.property.value]: ex.valueB, + }], + }) + const transform = buildCubeShape() + + input.pipe(transform) + + const result = await datasetStreamToClownface(transform) + + const propertyShape = result.has(ns.sh.path, ex.property) + const nodeKind = propertyShape.out(ns.sh.nodeKind) + + strictEqual(toNT(nodeKind.term), toNT(ns.sh.IRIOrLiteral)) + }) + it('should generate a sh:in list for plain string values', async () => { const input = createObservationsStream({ observations: [{ @@ -248,9 +281,27 @@ describe('cube.buildCubeShape', () => { const result = await datasetStreamToClownface(transform) const propertyShape = result.has(ns.sh.path, ex.property) - const values = [...propertyShape.out(ns.sh.in).list()].map(ptr => ptr.value).sort() + checkValues(propertyShape, rdf.literal('A'), rdf.literal('B')) + }) + + it('should generate a sh:in list for literal values without a parser', async () => { + const literalA = rdf.literal('A', ns.xsd.fake) + const literalB = rdf.literal('B', ns.xsd.fake) + const input = createObservationsStream({ + observations: [{ + [ex.property.value]: literalA, + }, { + [ex.property.value]: literalB, + }], + }) + const transform = buildCubeShape() - deepStrictEqual(values, ['A', 'B']) + input.pipe(transform) + + const result = await datasetStreamToClownface(transform) + + const propertyShape = result.has(ns.sh.path, ex.property) + checkValues(propertyShape, literalA, literalB) }) it('should generate a sh:in list for named node values', async () => { @@ -268,10 +319,7 @@ describe('cube.buildCubeShape', () => { const result = await datasetStreamToClownface(transform) const propertyShape = result.has(ns.sh.path, ex.property) - const values = rdf.termSet([...propertyShape.out(ns.sh.in).list()].map(ptr => ptr.term)) - - strictEqual(values.has(ex.valueA), true) - strictEqual(values.has(ex.valueB), true) + checkValues(propertyShape, ex.valueA, ex.valueB) }) it('should generate sh:minInclusive an sh:maxInclusive properties for date values', async () => { @@ -421,6 +469,76 @@ describe('cube.buildCubeShape', () => { strictEqual(datatypes.has(ns.cube.Undefined), true) }) + it('should limit number of values in sh:in', async () => { + const input = createObservationsStream({ + observations: [{ + [ex.property.value]: ex.valueA, + }, { + [ex.property.value]: ex.valueB, + }], + }) + const transform = buildCubeShape({ inListMaxSize: 1 }) + + input.pipe(transform) + + const result = await datasetStreamToClownface(transform) + + const propertyShape = result.has(ns.sh.path, ex.property) + strictEqual(propertyShape.out(ns.sh.in).terms.length, 0) + const message = propertyShape.out(ns.sh.description).term.value + strictEqual(message, 'Too many values for in-list constraint.') + }) + + it('should place other constraints inside sh:or if there are multiple datatypes', async () => { + const two = rdf.literal('2', ns.xsd.integer) + const five = rdf.literal('5', ns.xsd.integer) + const undefinedValue = rdf.literal('', ns.cube.Undefined) + + const input = createObservationsStream({ + observations: [{ + [ex.property.value]: five, + }, { + [ex.property.value]: two, + }, { + [ex.property.value]: undefinedValue, + }], + }) + const transform = buildCubeShape() + + input.pipe(transform) + + const result = await datasetStreamToClownface(transform) + + const propertyShape = result.has(ns.sh.path, ex.property) + const disjuncts = [...propertyShape.out(ns.sh.or).list()] + const integer = disjuncts.find(x => x.out(ns.sh.datatype).term.equals(ns.xsd.integer)) + const undefinedType = disjuncts.find(x => x.out(ns.sh.datatype).term.equals(ns.cube.Undefined)) + checkRange(integer, two, five) + checkValues(undefinedType, undefinedValue) + }) + + it('should create no range constraints on parsing error', async () => { + const two = rdf.literal('2', ns.xsd.integer) + const five = rdf.literal('5', ns.xsd.integer) + const input = createObservationsStream({ + observations: [{ + [ex.property.value]: two, + }, { + [ex.property.value]: rdf.literal('googol', ns.xsd.integer), + }, { + [ex.property.value]: five, + }], + }) + const transform = buildCubeShape() + + input.pipe(transform) + + const result = await datasetStreamToClownface(transform) + + strictEqual(result.out(ns.sh.minInclusive).terms.length, 0) + strictEqual(result.out(ns.sh.maxInclusive).terms.length, 0) + }) + it('should merge given metadata to cube metadata', async () => { const metadata = rdf.dataset([ rdf.quad(ex.cube, ns.schema.name, rdf.literal('Test Cube')), diff --git a/packages/cube/test/cube/constraintBuilder.test.js b/packages/cube/test/cube/constraintBuilder.test.js new file mode 100644 index 00000000..879bbf09 --- /dev/null +++ b/packages/cube/test/cube/constraintBuilder.test.js @@ -0,0 +1,5 @@ +import './constraintBuilder/DatatypeConstraintBuilder.test.js' +import './constraintBuilder/RangeConstraintBuilder.test.js' +import './constraintBuilder/ValuesConstraintBuilder.test.js' +import './constraintBuilder/NodeKindConstraintBuilder.test.js' +import './constraintBuilder/DimensionConstraintsBuilder.test.js' diff --git a/packages/cube/test/cube/constraintBuilder/DatatypeConstraintBuilder.test.js b/packages/cube/test/cube/constraintBuilder/DatatypeConstraintBuilder.test.js new file mode 100644 index 00000000..9635212c --- /dev/null +++ b/packages/cube/test/cube/constraintBuilder/DatatypeConstraintBuilder.test.js @@ -0,0 +1,31 @@ +import rdf from 'barnard59-env' +import { DatatypeConstraintBuilder } from '../../../lib/cube/buildCubeShape/constraintBuilder/DatatypeConstraintBuilder.js' +import { buildShape, conforms, notConforms } from './support.js' + +const { xsd } = rdf.ns + +describe('DatatypeConstraintBuilder', () => { + const string1 = rdf.literal('foo', xsd.string) + const string2 = rdf.literal('bar', xsd.string) + const string3 = rdf.literal('baz', xsd.string) + const integer = rdf.literal('2', xsd.integer) + const namedNode = rdf.namedNode('http://example.org/namedNode') + + context('built from all strings', () => { + const builder = new DatatypeConstraintBuilder(rdf, xsd.string) + const validator = buildShape(builder, string1, string2) + const assertConforms = conforms.bind(null, validator) + const assertNotConforms = notConforms.bind(null, validator) + + it('string conforms', () => assertConforms(string3)) + it('integer does not conform', () => assertNotConforms(integer)) + it('named node does not conform', () => assertNotConforms(namedNode)) + }) + context('built from not only strings', () => { + const builder = new DatatypeConstraintBuilder(rdf, xsd.string) + const validator = buildShape(builder, string1, string2, namedNode) + const assertConforms = conforms.bind(null, validator) + + it('everything conforms', () => assertConforms(string1, string2, string3, integer, namedNode)) + }) +}) diff --git a/packages/cube/test/cube/constraintBuilder/DimensionConstraintsBuilder.test.js b/packages/cube/test/cube/constraintBuilder/DimensionConstraintsBuilder.test.js new file mode 100644 index 00000000..bea121c6 --- /dev/null +++ b/packages/cube/test/cube/constraintBuilder/DimensionConstraintsBuilder.test.js @@ -0,0 +1,87 @@ +import rdf from 'barnard59-env' +import { fromRdf } from 'rdf-literal' +import { DimensionConstraintsBuilder } from '../../../lib/cube/buildCubeShape/constraintBuilder/DimensionConstraintsBuilder.js' +import { buildShape, conforms, notConforms } from './support.js' + +const { xsd } = rdf.ns + +const datatypeParsers = rdf.termMap([ + [xsd.integer, fromRdf], +]) + +describe('DimensionConstraintsBuilder', () => { + const namedNode1 = rdf.namedNode('http://example.org/namedNode1') + const namedNode2 = rdf.namedNode('http://example.org/namedNode2') + const namedNode3 = rdf.namedNode('http://example.org/namedNode3') + const string1 = rdf.literal('foo', xsd.string) + const string2 = rdf.literal('bar', xsd.string) + const string3 = rdf.literal('baz', xsd.string) + const one = rdf.literal('1', xsd.integer) + const two = rdf.literal('2', xsd.integer) + const three = rdf.literal('3', xsd.integer) + const four = rdf.literal('4', xsd.integer) + + context('built from two named nodes', () => { + const builder = new DimensionConstraintsBuilder({ rdf, datatypeParsers }) + const validator = buildShape(builder, namedNode1, namedNode2) + const assertConforms = conforms.bind(null, validator) + const assertNotConforms = notConforms.bind(null, validator) + + it('the two named nodes conform', () => assertConforms(namedNode1, namedNode2)) + it('another named node does not conform', () => assertNotConforms(namedNode3)) + it('a string literal does not conform', () => assertNotConforms(string1)) + it('an integer literal does not conform', () => assertNotConforms(one)) + }) + context('built from too many distinct named nodes', () => { + const builder = new DimensionConstraintsBuilder({ rdf, datatypeParsers, inListMaxSize: 1 }) + const validator = buildShape(builder, namedNode1, namedNode2) + const assertConforms = conforms.bind(null, validator) + it('everything conforms', () => assertConforms(namedNode1, namedNode2, namedNode3, string1, one)) + }) + context('built from two strings', () => { + const builder = new DimensionConstraintsBuilder({ rdf, datatypeParsers }) + const validator = buildShape(builder, string1, string2) + const assertConforms = conforms.bind(null, validator) + const assertNotConforms = notConforms.bind(null, validator) + + it('the two strings conform', () => assertConforms(string1, string2)) + it('another string does not conform', () => assertNotConforms(string3)) + it('a named node does not conform', () => assertNotConforms(namedNode1)) + it('an integer literal does not conform', () => assertNotConforms(one)) + }) + context('built from too many distinct strings', () => { + const builder = new DimensionConstraintsBuilder({ rdf, datatypeParsers, inListMaxSize: 1 }) + const validator = buildShape(builder, string1, string2) + const assertConforms = conforms.bind(null, validator) + const assertNotConforms = notConforms.bind(null, validator) + it('every string conforms', () => assertConforms(string1, string2, string3)) + it('an integer literal does not conform', () => assertNotConforms(one)) + it('a named node does not conform', () => assertNotConforms(namedNode1)) + }) + context('built from two integers', () => { + const builder = new DimensionConstraintsBuilder({ rdf, datatypeParsers }) + const validator = buildShape(builder, one, three) + const assertConforms = conforms.bind(null, validator) + const assertNotConforms = notConforms.bind(null, validator) + + it('the two integers conform', () => assertConforms(one, three)) + it('an integer in between conforms', () => assertConforms(two)) + it('an integer outside the range does not conform', () => assertNotConforms(four)) + it('a string literal does not conform', () => assertNotConforms(string1)) + it('a named node does not conform', () => assertNotConforms(namedNode1)) + }) + context('built two named nodes, two strings and two integers', () => { + const builder = new DimensionConstraintsBuilder({ rdf, datatypeParsers }) + const validator = buildShape(builder, namedNode1, namedNode2, string1, string2, one, three) + const assertConforms = conforms.bind(null, validator) + const assertNotConforms = notConforms.bind(null, validator) + + it('the two named nodes conform', () => assertConforms(namedNode1, namedNode2)) + it('another named node does not conform', () => assertNotConforms(namedNode3)) + it('the two strings conform', () => assertConforms(string1, string2)) + it('another string does not conform', () => assertNotConforms(string3)) + it('the two integers conform', () => assertConforms(one, three)) + it('an integer in between conforms', () => assertConforms(two)) + it('an integer outside the range does not conform', () => assertNotConforms(four)) + }) +}) diff --git a/packages/cube/test/cube/constraintBuilder/NodeKindConstraintBuilder.test.js b/packages/cube/test/cube/constraintBuilder/NodeKindConstraintBuilder.test.js new file mode 100644 index 00000000..951088ca --- /dev/null +++ b/packages/cube/test/cube/constraintBuilder/NodeKindConstraintBuilder.test.js @@ -0,0 +1,42 @@ +import rdf from 'barnard59-env' +import { NodeKindConstraintBuilder } from '../../../lib/cube/buildCubeShape/constraintBuilder/NodeKindConstraintBuilder.js' +import { buildShape, conforms, notConforms } from './support.js' + +const { xsd } = rdf.ns + +describe('NodeKindConstraintBuilder', () => { + const literal1 = rdf.literal('foo', xsd.string) + const literal2 = rdf.literal('3', xsd.integer) + const literal3 = rdf.literal('3.0', xsd.decimal) + const namedNode1 = rdf.namedNode('http://example.org/namedNode1') + const namedNode2 = rdf.namedNode('http://example.org/namedNode2') + const namedNode3 = rdf.namedNode('http://example.org/namedNode3') + const blankNode1 = rdf.blankNode('b1') + const blankNode2 = rdf.blankNode('b2') + const blankNode3 = rdf.blankNode('b3') + + context('built from all kinds of nodes', () => { + const builder = new NodeKindConstraintBuilder(rdf) + const validator = buildShape(builder, literal1, namedNode1, blankNode1) + const assertConforms = conforms.bind(null, validator) + it('everything conforms', () => assertConforms(literal1, literal2, namedNode1, namedNode2, blankNode1, blankNode2)) + }) + context('built from literals', () => { + const builder = new NodeKindConstraintBuilder(rdf) + const validator = buildShape(builder, literal1, literal2) + const assertConforms = conforms.bind(null, validator) + const assertNotConforms = notConforms.bind(null, validator) + it('literals conform', () => assertConforms(literal1, literal2, literal3)) + it('named nodes do not conform', () => assertNotConforms(namedNode1, namedNode2, namedNode3)) + it('blank nodes do not conform', () => assertNotConforms(blankNode1, blankNode2, blankNode3)) + }) + context('built from literals and named nodes', () => { + const builder = new NodeKindConstraintBuilder(rdf) + const validator = buildShape(builder, literal1, namedNode1, literal2) + const assertConforms = conforms.bind(null, validator) + const assertNotConforms = notConforms.bind(null, validator) + it('literals conform', () => assertConforms(literal1, literal2, literal3)) + it('named nodes conform', () => assertConforms(namedNode1, namedNode2, namedNode3)) + it('blank nodes do not conform', () => assertNotConforms(blankNode1, blankNode2, blankNode3)) + }) +}) diff --git a/packages/cube/test/cube/constraintBuilder/RangeConstraintBuilder.test.js b/packages/cube/test/cube/constraintBuilder/RangeConstraintBuilder.test.js new file mode 100644 index 00000000..569ef9fd --- /dev/null +++ b/packages/cube/test/cube/constraintBuilder/RangeConstraintBuilder.test.js @@ -0,0 +1,43 @@ +import rdf from 'barnard59-env' +import { fromRdf } from 'rdf-literal' +import { RangeConstraintBuilder } from '../../../lib/cube/buildCubeShape/constraintBuilder/RangeConstraintBuilder.js' +import { buildShape, conforms, notConforms } from './support.js' + +const { xsd } = rdf.ns + +describe('RangeConstraintBuilder', () => { + const [one, two, three, four, five, six, seven, eight] = [1, 2, 3, 4, 5, 6, 7, 8].map(x => rdf.literal(`${x}`, xsd.integer)) + const wrong = rdf.literal('wrong', xsd.integer) + const string = rdf.literal('foo', xsd.string) + const namedNode = rdf.namedNode('http://example.org/namedNode') + + context('built from integers between 2 and 7', () => { + const builder = new RangeConstraintBuilder(rdf, fromRdf) + const validator = buildShape(builder, four, two, three, seven) + const assertConforms = conforms.bind(null, validator) + const assertNotConforms = notConforms.bind(null, validator) + + it('integers in range conform', () => assertConforms(five, six)) + it('integers outside range do not conform', () => assertNotConforms(one, eight)) + }) + it('should create an unconstrained shape due to wrong datatype', () => { + const builder = new RangeConstraintBuilder(rdf, fromRdf) + const validator = buildShape(builder, one, string, seven) + conforms(validator, one, two, three, four, five, six, seven, eight, wrong, string, namedNode) + }) + it('should create an unconstrained shape due to missing datatype', () => { + const builder = new RangeConstraintBuilder(rdf, fromRdf) + const validator = buildShape(builder, one, namedNode, seven) + conforms(validator, one, two, three, four, five, six, seven, eight, wrong, string, namedNode) + }) + it('should create an unconstrained shape due to unexpected value', () => { + const builder = new RangeConstraintBuilder(rdf, fromRdf) + const validator = buildShape(builder, one, wrong, seven) + conforms(validator, one, two, three, four, five, six, seven, eight, wrong, string, namedNode) + }) + it('should create an unconstrained shape due to parsing issue of initial value', () => { + const builder = new RangeConstraintBuilder(rdf, fromRdf) + const validator = buildShape(builder, wrong) + conforms(validator, one, two, three, four, five, six, seven, eight, wrong, string, namedNode) + }) +}) diff --git a/packages/cube/test/cube/constraintBuilder/ValuesConstraintBuilder.test.js b/packages/cube/test/cube/constraintBuilder/ValuesConstraintBuilder.test.js new file mode 100644 index 00000000..b283e564 --- /dev/null +++ b/packages/cube/test/cube/constraintBuilder/ValuesConstraintBuilder.test.js @@ -0,0 +1,32 @@ +import { strictEqual } from 'assert' +import rdf from 'barnard59-env' +import { ValuesConstraintBuilder } from '../../../lib/cube/buildCubeShape/constraintBuilder/ValuesConstraintBuilder.js' +import { buildShape, conforms, notConforms } from './support.js' + +const { xsd } = rdf.ns + +describe('ValuesConstraintBuilder', () => { + const string = rdf.literal('foo', xsd.string) + const integer = rdf.literal('2', xsd.integer) + const namedNode = rdf.namedNode('http://example.org/namedNode') + const blankNode = rdf.blankNode('b1') + const other = rdf.namedNode('http://example.org/other') + + context('built without threshold', () => { + const builder = new ValuesConstraintBuilder(rdf) + const validator = buildShape(builder, string, integer, namedNode, blankNode) + const assertConforms = conforms.bind(null, validator) + const assertNotConforms = notConforms.bind(null, validator) + it('values used to build the shape conform', () => assertConforms(string, integer, namedNode, blankNode)) + it('other values do not conform', () => assertNotConforms(other)) + }) + context('built with too many values', () => { + const threshold = 2 + const builder = new ValuesConstraintBuilder(rdf, threshold) + const validator = buildShape(builder, string, integer, namedNode, blankNode) + const assertConforms = conforms.bind(null, validator) + + it('everything conforms', () => assertConforms(string, integer, namedNode, blankNode, other)) + it('reports too many values', () => strictEqual(builder.message, 'Too many values for in-list constraint.')) + }) +}) diff --git a/packages/cube/test/cube/constraintBuilder/support.js b/packages/cube/test/cube/constraintBuilder/support.js new file mode 100644 index 00000000..c1de93a8 --- /dev/null +++ b/packages/cube/test/cube/constraintBuilder/support.js @@ -0,0 +1,37 @@ +import { strictEqual } from 'assert' +import rdf from 'barnard59-env' +import SHACLValidator from 'rdf-validate-shacl' + +const { sh } = rdf.ns + +const subject = rdf.namedNode('http://example.org/subject') +const property = rdf.namedNode('http://example.org/property') + +const createDataset = values => + rdf.clownface().namedNode(subject).addOut(property, values).dataset + +export const conforms = (validator, ...values) => { + const report = validator.validate(createDataset(values)) + strictEqual(report.conforms, true) +} + +export const notConforms = (validator, ...values) => { + const report = validator.validate(createDataset(values)) + strictEqual(report.conforms, false) +} + +export const buildShape = (builder, ...values) => { + const shape = rdf.clownface() + const ptr = shape.blankNode() + shape.namedNode('http://example.org/shape') + .addOut(sh.targetNode, subject) + .addOut(sh.property, ptr) + ptr.addOut(sh.path, property) + + values.forEach(x => builder.add(x)) + builder.build(ptr) + + const validator = new SHACLValidator(shape.dataset, { factory: rdf }) + conforms(validator, ...values) + return validator +} diff --git a/packages/env/.npmignore b/packages/env/.npmignore deleted file mode 100644 index 6461deec..00000000 --- a/packages/env/.npmignore +++ /dev/null @@ -1 +0,0 @@ -*.ts diff --git a/packages/env/CHANGELOG.md b/packages/env/CHANGELOG.md index be9008cf..1ee3b6d5 100644 --- a/packages/env/CHANGELOG.md +++ b/packages/env/CHANGELOG.md @@ -1,5 +1,18 @@ # barnard59-env +## 1.2.3 + +### Patch Changes + +- 9178b7e: .d.ts files were not included in package + +## 1.2.2 + +### Patch Changes + +- c090ff2: Update `@zazuko/env` to v2 +- 82dbe7e: Exported environment did not include fs functionality + ## 1.2.1 ### Patch Changes diff --git a/packages/env/index.ts b/packages/env/index.ts index 718a1dbf..b1601009 100644 --- a/packages/env/index.ts +++ b/packages/env/index.ts @@ -1,8 +1,8 @@ -import { create } from '@zazuko/env-node' -import type { DefaultEnv, DerivedEnvironment } from '@zazuko/env' +import BaseEnv, { Environment as ZazukoEnv } from '@zazuko/env-node' import NamespacesFactory from './lib/Namespaces.js' import ConstantsFactory from './lib/Constants.js' -export type Environment = DerivedEnvironment +const env = new ZazukoEnv([NamespacesFactory, ConstantsFactory], { parent: BaseEnv }) -export default create(NamespacesFactory, ConstantsFactory) +export default env +export type Environment = typeof env diff --git a/packages/env/package.json b/packages/env/package.json index ba813568..72054807 100644 --- a/packages/env/package.json +++ b/packages/env/package.json @@ -1,14 +1,20 @@ { "name": "barnard59-env", - "version": "1.2.1", + "version": "1.2.3", "type": "module", "main": "index.js", "scripts": { "build": "tsc", "prepack": "npm run build" }, + "files": [ + "*.js", + "*.d.ts", + "lib/*.js", + "lib/*.d.ts" + ], "dependencies": { - "@zazuko/env-node": "^1.0.3", + "@zazuko/env-node": "^2.1.1", "@zazuko/vocabulary-extras-builders": "^1.1.3" }, "repository": { diff --git a/packages/graph-store/CHANGELOG.md b/packages/graph-store/CHANGELOG.md index d25d7f76..b880d611 100644 --- a/packages/graph-store/CHANGELOG.md +++ b/packages/graph-store/CHANGELOG.md @@ -1,5 +1,11 @@ # barnard59-graph-store +## 5.1.1 + +### Patch Changes + +- e82aa36: Remove references of `rdf-js` types package, repaced with `@rdfjs/types` + ## 5.1.0 ### Minor Changes diff --git a/packages/graph-store/get.js b/packages/graph-store/get.js index edfcb409..bd130da3 100644 --- a/packages/graph-store/get.js +++ b/packages/graph-store/get.js @@ -5,7 +5,7 @@ import unpromiseReadable from './lib/unpromiseReadable.js' * @this {import('barnard59-core').Context} * @param {Pick & { * endpoint: string, - * graph: string | import('rdf-js').NamedNode | import('rdf-js').DefaultGraph, + * graph: string | import('@rdfjs/types').NamedNode | import('@rdfjs/types').DefaultGraph, * }} options */ function get({ endpoint, graph, user, password }) { diff --git a/packages/graph-store/package.json b/packages/graph-store/package.json index 0b854f67..d72b0588 100644 --- a/packages/graph-store/package.json +++ b/packages/graph-store/package.json @@ -1,6 +1,6 @@ { "name": "barnard59-graph-store", - "version": "5.1.0", + "version": "5.1.1", "description": "SPARQL Graph Store Protocol support for Linked Data pipelines", "type": "module", "main": "index.js", @@ -37,7 +37,7 @@ "@types/promise-the-world": "^1.0.6", "@types/readable-stream": "^4.0.10", "@types/sparql-http-client": "^2.2.14", - "@zazuko/env": "^1.9.0", + "@zazuko/env": "^2", "express-as-promise": "^1.2.0", "get-stream": "^6.0.1", "isstream": "^0.1.2" diff --git a/packages/rdf/CHANGELOG.md b/packages/rdf/CHANGELOG.md index 2559a52b..ee537f32 100644 --- a/packages/rdf/CHANGELOG.md +++ b/packages/rdf/CHANGELOG.md @@ -1,5 +1,17 @@ # barnard59-rdf +## 3.4.0 + +### Minor Changes + +- 82dbe7e: Bundle TypeScript type declarations + +### Patch Changes + +- Updated dependencies [c090ff2] +- Updated dependencies [82dbe7e] + - barnard59-env@1.2.2 + ## 3.3.0 ### Minor Changes diff --git a/packages/rdf/fs.js b/packages/rdf/fs.js index 7b174870..6fd64452 100644 --- a/packages/rdf/fs.js +++ b/packages/rdf/fs.js @@ -1,5 +1,9 @@ import { Transform } from 'readable-stream' +/** + * @this {import('barnard59-core').Context} + * @return {Transform} + */ export function parse() { const { env } = this @@ -7,16 +11,19 @@ export function parse() { objectMode: true, transform: async function (path, encoding, callback) { try { + /** + * @type {import('@rdfjs/types').Stream} + */ const fileStream = env.fromFile(path) let failed = false - fileStream.on('data', quad => this.push(quad)) - fileStream.on('error', (e) => { + fileStream.on('data', /** @type {import('@rdfjs/types').Quad} */ quad => this.push(quad)) + fileStream.on('error', (/** @type {any} */ e) => { callback(e) failed = true }) fileStream.on('end', () => !failed && callback()) - } catch (e) { + } catch (/** @type {any} */ e) { callback(e) } }, diff --git a/packages/rdf/imports.js b/packages/rdf/imports.js index c3606ab1..a4ad0ee7 100644 --- a/packages/rdf/imports.js +++ b/packages/rdf/imports.js @@ -1,5 +1,9 @@ import transform from 'rdf-transform-graph-imports' +/** + * @this {import('barnard59-core').Context} + * @return {import('stream').Transform} + */ export default function () { return transform(this.env) } diff --git a/packages/rdf/lib/PatternMatcher.js b/packages/rdf/lib/PatternMatcher.js index 0ba4b8be..0ed70afe 100644 --- a/packages/rdf/lib/PatternMatcher.js +++ b/packages/rdf/lib/PatternMatcher.js @@ -1,7 +1,22 @@ import rdf from 'barnard59-env' +/** + * @typedef {'subject' | 'predicate' | 'object' | 'graph'} QuadPart + * @typedef {import('@rdfjs/term-set').default} TermSet + */ + class PatternMatcher { + /** + * @param {object} [options] + * @param {import('@rdfjs/types').Quad_Subject | Iterable} [options.subject] + * @param {import('@rdfjs/types').Quad_Predicate | Iterable} [options.predicate] + * @param {import('@rdfjs/types').Quad_Object | Iterable} [options.object] + * @param {import('@rdfjs/types').Quad_Graph | Iterable} [options.graph] + */ constructor({ subject, predicate, object, graph } = {}) { + /** + * @type {Partial>} + */ this.pattern = {} this.set('subject', subject) @@ -10,16 +25,25 @@ class PatternMatcher { this.set('graph', graph) } + /** + * @param {import('@rdfjs/types').Quad} quad + * @returns {boolean} + */ test(quad) { + // @ts-expect-error return Object.entries(this.pattern).every(([name, values]) => values.has(quad[name])) } + /** + * @param {QuadPart} name + * @param {import('@rdfjs/types').Term | Iterable | undefined} value + */ set(name, value) { if (!value) { return } - if (value[Symbol.iterator]) { + if (Symbol.iterator in value) { this.pattern[name] = rdf.termSet([...value]) } else { this.pattern[name] = rdf.termSet([value]) diff --git a/packages/rdf/lib/append.js b/packages/rdf/lib/append.js index 3ab1daff..261a71d7 100644 --- a/packages/rdf/lib/append.js +++ b/packages/rdf/lib/append.js @@ -3,6 +3,16 @@ import { localFetch } from './localFetch/localFetch.js' import { applyOptions } from './metadata/applyOptions.js' class MetadataAppend extends Transform { + /** + * @param {import('barnard59-core').Context} context + * @param {string | undefined} basePath + * @param {string} input + * @param {{ + * dateCreated?: import('./metadata/namedDateLiterals.js').NamedDateLiteral, + * dateModified?: import('./metadata/namedDateLiterals.js').NamedDateLiteral, + * graph?: string | import('@rdfjs/types').NamedNode + * }} options + */ constructor(context, basePath, input, options) { super({ objectMode: true }) this.context = context @@ -11,17 +21,25 @@ class MetadataAppend extends Transform { this.options = options } + /** + * @param {import('@rdfjs/types').Quad} chunk + * @param {string} encoding + * @param {import('stream').TransformCallback} callback + */ _transform(chunk, encoding, callback) { callback(null, chunk) } + /** + * @param {import('stream').TransformCallback} callback + */ async _flush(callback) { try { const { quadStream, metadata } = await localFetch.call(this.context, this.input, this.basePath) for (const quad of await applyOptions(quadStream, metadata, this.options)) { this.push(quad) } - } catch (err) { + } catch (/** @type {any} */ err) { this.destroy(err) } finally { callback() @@ -29,6 +47,16 @@ class MetadataAppend extends Transform { } } +/** + * @this import('barnard59-core').Context + * @param {object} [options] + * @param {string | undefined} [options.input] + * @param {string} [options.basepath] + * @param {import('./metadata/namedDateLiterals.js').NamedDateLiteral} [options.dateModified] + * @param {import('./metadata/namedDateLiterals.js').NamedDateLiteral} [options.dateCreated] + * @param {*} [options.graph] + * @return {Promise} + */ async function append({ input, basepath, diff --git a/packages/rdf/lib/localFetch/localFetch.js b/packages/rdf/lib/localFetch/localFetch.js index 53ab635b..f339a1d0 100644 --- a/packages/rdf/lib/localFetch/localFetch.js +++ b/packages/rdf/lib/localFetch/localFetch.js @@ -1,14 +1,29 @@ -import fsp from 'fs/promises' - -import { resolve } from 'path' -import { pathToFileURL } from 'url' +import fsp from 'node:fs/promises' +import { resolve } from 'node:path' +import { pathToFileURL } from 'node:url' import rdfFetch from '@rdfjs/fetch' import fileFetch from 'file-fetch' import { isReadableStream } from 'is-stream' import protoFetch from 'proto-fetch' import { getParserByExtension } from './lookupParser.js' -async function streamWithMetadata(input) { +/** + * @typedef {{ + * type: string; + * value?: string | URL; + * stats?: import('fs').Stats; + * }} Metadata + */ + +/** + * @typedef {{metadata: Metadata, quadStream: import('@rdfjs/types').Stream}} LocalFetchResponse + */ + +/** + * @param {import('@rdfjs/types').Stream} input + * @return {LocalFetchResponse} + */ +function streamWithMetadata(input) { return { quadStream: input, metadata: { @@ -17,6 +32,10 @@ async function streamWithMetadata(input) { } } +/** + * @param {string} input + * @return {Promise} + */ async function fetchHTTPWithMeta(input) { const url = new URL(input, import.meta.url) const res = await rdfFetch(url) @@ -29,6 +48,10 @@ async function fetchHTTPWithMeta(input) { } } +/** + * @param {import('barnard59-env').Environment} env + * @param {string} filePath + */ function guessParserForFile(env, filePath) { const parser = getParserByExtension(env, filePath) if (!parser) { @@ -37,9 +60,17 @@ function guessParserForFile(env, filePath) { return parser } +/** + * @param {import('barnard59-env').Environment} env + * @param {string} input + * @return {Promise} + */ async function fetchFileWithMeta(env, input) { const filePathURL = new URL(input, import.meta.url) const res = await fileFetch(filePathURL.toString()) + /** + * @type {any} + */ const stream = res.body const quadStream = await guessParserForFile(env, input).import(stream) return { @@ -52,7 +83,13 @@ async function fetchFileWithMeta(env, input) { } } -// Tries to fetch or read locally one file +/** + * Tries to fetch or read locally one file + * @this import('barnard59-core').Context + * @param {import('stream').Readable | string} input + * @param {string} [basePath] + * @return {Promise} + */ async function localFetch( input, basePath, @@ -61,11 +98,15 @@ async function localFetch( throw new Error('needs input filename or URL') } if (isReadableStream(input)) { - return streamWithMetadata(input, basePath) + return streamWithMetadata(input) } if (typeof input !== 'string') { throw new Error(`needs input filename or URL, got [${typeof input}]`) } + /** + * @type {(input: (string | URL)) => Promise} + */ + // @ts-expect-error const fetch = protoFetch({ file: fetchFileWithMeta.bind(null, this.env), http: fetchHTTPWithMeta, diff --git a/packages/rdf/lib/localFetch/lookupParser.js b/packages/rdf/lib/localFetch/lookupParser.js index 1cc91608..bddbb316 100644 --- a/packages/rdf/lib/localFetch/lookupParser.js +++ b/packages/rdf/lib/localFetch/lookupParser.js @@ -1,8 +1,17 @@ import mime from 'mime-types' +/** + * @param {import('barnard59-env').Environment} env + * @param {string | URL} fileUrl + * @returns {import('@rdfjs/types').Sink | undefined} + */ function getParserByExtension(env, fileUrl) { const mimeType = mime.lookup(fileUrl.toString()) - return env.formats.parsers.get(mimeType) + if (mimeType) { + return env.formats.parsers.get(mimeType) + } + + return undefined } export { diff --git a/packages/rdf/lib/membership.js b/packages/rdf/lib/membership.js index 70715410..d5da68a5 100644 --- a/packages/rdf/lib/membership.js +++ b/packages/rdf/lib/membership.js @@ -1,41 +1,69 @@ import rdf from 'barnard59-env' import { Transform } from 'readable-stream' -import * as ns from './namespaces.js' class AddRelations extends Transform { + /** + * @param {import('barnard59-core').Context} context + * @param {object} options + * @param {(targetUri: string | import('@rdfjs/types').NamedNode) => import('@rdfjs/types').Quad} options.createRelation + * @param {import('@rdfjs/types').Quad[]} options.additionalQuads + * @param {import('@rdfjs/term-set').default} options.classes + */ constructor(context, { createRelation, additionalQuads, classes, }) { super({ objectMode: true }) + this.rdf = context.env this.classes = classes this.createRelation = createRelation this.additionalQuads = additionalQuads } + /** + * @param {import('@rdfjs/types').Quad} chunk + * @param {string} encoding + * @param {import('stream').TransformCallback} callback + */ _transform(chunk, encoding, callback) { - if (chunk.predicate.equals(ns.rdf.type) && this.classes.has(chunk.object)) { + if (chunk.predicate.equals(this.rdf.ns.rdf.type) && this.classes.has(chunk.object) && chunk.subject.termType === 'NamedNode') { const quad = this.createRelation(chunk.subject) this.push(quad) } callback(null, chunk) } + /** + * @param {import('stream').TransformCallback} callback + */ async _flush(callback) { this.additionalQuads.forEach(quad => this.push(quad)) callback() } } +/** + * @param {string|import('@rdfjs/types').NamedNode} item + * @return {import('@rdfjs/types').NamedNode} + */ const toNamedNode = item => typeof item === 'string' ? rdf.namedNode(item) : item +/** + * @this {import('barnard59-core').Context} + * @param {object} options + * @param {string | import('@rdfjs/types').NamedNode} options.targetUri + * @param {string | import('@rdfjs/types').NamedNode} options.targetClass + * @param {string | import('@rdfjs/types').NamedNode} options.property + * @param {(string | import('@rdfjs/types').NamedNode)[]} options.classes + * @return {Transform} + */ function toTarget({ targetUri, targetClass, property, classes = [], -} = {}) { +}) { if (!targetUri) { throw new Error('Needs targetUri as parameter') } @@ -50,18 +78,27 @@ function toTarget({ } return new AddRelations(this, { - createRelation: sourceUri => rdf.quad(toNamedNode(sourceUri), toNamedNode(property), toNamedNode(targetUri)), - additionalQuads: [rdf.quad(toNamedNode(targetUri), ns.rdf.type, toNamedNode(targetClass))], - classes: rdf.termSet(classes.map(toNamedNode)), + createRelation: sourceUri => this.env.quad(toNamedNode(sourceUri), toNamedNode(property), toNamedNode(targetUri)), + additionalQuads: [this.env.quad(toNamedNode(targetUri), this.env.ns.rdf.type, toNamedNode(targetClass))], + classes: this.env.termSet(classes.map(toNamedNode)), }) } +/** + * @this {import('barnard59-core').Context} + * @param {object} options + * @param {string | import('@rdfjs/types').NamedNode} options.sourceUri + * @param {string | import('@rdfjs/types').NamedNode} options.sourceClass + * @param {string | import('@rdfjs/types').NamedNode} options.property + * @param {(string | import('@rdfjs/types').NamedNode)[]} options.classes + * @return {Transform} + */ function fromSource({ sourceUri, sourceClass, property, classes = [], -} = {}) { +}) { if (!sourceUri) { throw new Error('Needs sourceUri as parameter') } @@ -76,9 +113,9 @@ function fromSource({ } return new AddRelations(this, { - createRelation: targetUri => rdf.quad(toNamedNode(sourceUri), toNamedNode(property), toNamedNode(targetUri)), - additionalQuads: [rdf.quad(toNamedNode(sourceUri), ns.rdf.type, toNamedNode(sourceClass))], - classes: rdf.termSet(classes.map(toNamedNode)), + createRelation: targetUri => this.env.quad(toNamedNode(sourceUri), toNamedNode(property), toNamedNode(targetUri)), + additionalQuads: [this.env.quad(toNamedNode(sourceUri), this.env.ns.rdf.type, toNamedNode(sourceClass))], + classes: this.env.termSet(classes.map(toNamedNode)), }) } diff --git a/packages/rdf/lib/metadata/applyOptions.js b/packages/rdf/lib/metadata/applyOptions.js index 2ee5b5ec..b9d9b148 100644 --- a/packages/rdf/lib/metadata/applyOptions.js +++ b/packages/rdf/lib/metadata/applyOptions.js @@ -1,20 +1,32 @@ import rdf from 'barnard59-env' -import fromStream from 'rdf-dataset-ext/fromStream.js' -import * as ns from '../namespaces.js' -import { xsd } from '../namespaces.js' import { wellKnownDatasetClasses, wellKnownDatasetClassesWithDcterms } from './datasetClasses.js' import { namedDateLiterals } from './namedDateLiterals.js' +/** + * @param {import('@rdfjs/types').DatasetCore} dataset + * @param {Set} classes + * @return {Set} + */ function subjectsWithDatasetType(dataset, classes) { + /** + * @type {Set} + */ const result = rdf.termSet() ;[...dataset] - .filter(quad => (quad.predicate.equals(ns.rdf.type) && classes.has(quad.object))) + .filter(quad => (quad.predicate.equals(rdf.ns.rdf.type) && classes.has(quad.object))) .forEach(quad => { result.add(quad.subject) }) return result } +/** + * @param {import('@rdfjs/types').DatasetCore} dataset + * @param {Set} datasetClasses + * @param {import('@rdfjs/types').Quad_Predicate} predicate + * @param {import('@rdfjs/types').Quad_Object} object + * @return {import('@rdfjs/types').DatasetCore} + */ function updateOrInsert(dataset, datasetClasses, predicate, object) { const targetSubjects = subjectsWithDatasetType(dataset, datasetClasses) @@ -31,34 +43,58 @@ function updateOrInsert(dataset, datasetClasses, predicate, object) { return dataset } -function toDateLiteral(item) { - return typeof item === 'string' ? rdf.literal(item, xsd.dateTime) : item -} - +/** + * @param {string | import('@rdfjs/types').NamedNode | undefined} item + * @return {import('@rdfjs/types').NamedNode | undefined} + */ function toNamedNode(item) { return typeof item === 'string' ? rdf.namedNode(item) : item } +/** + * @param {import('@rdfjs/types').Literal | import('./namedDateLiterals.js').NamedDateLiteral} value + * @param {import('./namedDateLiterals.js').Metadata} metadata + * @return {import('@rdfjs/types').Literal} + */ function resolveNamedDate(value, metadata) { - return namedDateLiterals.has(value) ? namedDateLiterals.get(value)(metadata) : toDateLiteral(value) + if (typeof value !== 'string') { + return value + } + + const factory = namedDateLiterals.get(value) + + return factory ? factory(metadata) : rdf.literal(value, rdf.ns.xsd.dateTime) } +/** + * @param {import('@rdfjs/types').Stream & import('stream').EventEmitter} quadStream + * @param {import('./namedDateLiterals.js').Metadata} [metadata] + * @param {{ + * dateModified?: import('./namedDateLiterals.js').NamedDateLiteral; + * dateCreated?: import('./namedDateLiterals.js').NamedDateLiteral; + * graph?: string | import('@rdfjs/types').NamedNode + * }} [options] + * @return {Promise} + */ async function applyOptions(quadStream, metadata = {}, options = {}) { - let dataset = await fromStream(rdf.dataset(), quadStream) + /** + * @type {import('@rdfjs/types').DatasetCore} + */ + let dataset = await rdf.dataset().import(quadStream) // dateModified if (options.dateModified) { const dateModifiedLiteral = resolveNamedDate(options.dateModified, metadata) - dataset = updateOrInsert(dataset, wellKnownDatasetClassesWithDcterms, ns.dcterms.modified, dateModifiedLiteral) - dataset = updateOrInsert(dataset, wellKnownDatasetClasses, ns.schema.dateModified, dateModifiedLiteral) + dataset = updateOrInsert(dataset, wellKnownDatasetClassesWithDcterms, rdf.ns.dcterms.modified, dateModifiedLiteral) + dataset = updateOrInsert(dataset, wellKnownDatasetClasses, rdf.ns.schema.dateModified, dateModifiedLiteral) } // dateCreated if (options.dateCreated) { const dateCreatedLiteral = resolveNamedDate(options.dateCreated, metadata) - dataset = updateOrInsert(dataset, wellKnownDatasetClassesWithDcterms, ns.dcterms.created, dateCreatedLiteral) - dataset = updateOrInsert(dataset, wellKnownDatasetClasses, ns.schema.dateCreated, dateCreatedLiteral) + dataset = updateOrInsert(dataset, wellKnownDatasetClassesWithDcterms, rdf.ns.dcterms.created, dateCreatedLiteral) + dataset = updateOrInsert(dataset, wellKnownDatasetClasses, rdf.ns.schema.dateCreated, dateCreatedLiteral) } // Sets graph diff --git a/packages/rdf/lib/metadata/datasetClasses.js b/packages/rdf/lib/metadata/datasetClasses.js index b53b8647..43dcedda 100644 --- a/packages/rdf/lib/metadata/datasetClasses.js +++ b/packages/rdf/lib/metadata/datasetClasses.js @@ -1,15 +1,20 @@ import rdf from 'barnard59-env' -import * as ns from '../namespaces.js' +/** + * @type {Set} + */ const wellKnownDatasetClasses = rdf.termSet([ - ns.schema.Dataset, - ns.cube.Cube, + rdf.ns.schema.Dataset, + rdf.ns.cube.Cube, ], ) +/** + * @type {Set} + */ const wellKnownDatasetClassesWithDcterms = rdf.termSet([ - ns._void.Dataset, - ns.dcat.Dataset, + rdf.ns._void.Dataset, + rdf.ns.dcat.Dataset, ], ) diff --git a/packages/rdf/lib/metadata/namedDateLiterals.js b/packages/rdf/lib/metadata/namedDateLiterals.js index 624abc19..5e4322c0 100644 --- a/packages/rdf/lib/metadata/namedDateLiterals.js +++ b/packages/rdf/lib/metadata/namedDateLiterals.js @@ -1,24 +1,40 @@ import rdf from 'barnard59-env' -import { xsd } from '../namespaces.js' +/** + * @typedef {{ + * type?: string; + * stats?: { + * birthtimeMs?: number; + * mtimeMs?: number; + * } + * }} Metadata + */ + +/** + * @typedef {'TIME_NOW' | 'TIME_FILE_CREATION' | 'TIME_FILE_MODIFICATION'} NamedDateLiteral + */ + +/** + * @type {Map import('@rdfjs/types').Literal>} + */ const namedDateLiterals = new Map() -namedDateLiterals.set('TIME_NOW', metadata => { - return rdf.literal((new Date()).toISOString(), xsd.dateTime) +namedDateLiterals.set('TIME_NOW', () => { + return rdf.literal((new Date()).toISOString(), rdf.ns.xsd.dateTime) }) namedDateLiterals.set('TIME_FILE_CREATION', metadata => { if (!metadata?.stats?.birthtimeMs) { throw new Error('No metadata.stats.birthtimeMs') } - return rdf.literal((new Date(metadata.stats.birthtimeMs)).toISOString(), xsd.dateTime) + return rdf.literal((new Date(metadata.stats.birthtimeMs)).toISOString(), rdf.ns.xsd.dateTime) }) namedDateLiterals.set('TIME_FILE_MODIFICATION', metadata => { if (!metadata?.stats?.mtimeMs) { throw new Error('No metadata.stats.mtimeMs') } - return rdf.literal((new Date(metadata.stats.mtimeMs)).toISOString(), xsd.dateTime) + return rdf.literal((new Date(metadata.stats.mtimeMs)).toISOString(), rdf.ns.xsd.dateTime) }) export { namedDateLiterals } diff --git a/packages/rdf/lib/namespaces.js b/packages/rdf/lib/namespaces.js deleted file mode 100644 index 985a8016..00000000 --- a/packages/rdf/lib/namespaces.js +++ /dev/null @@ -1,5 +0,0 @@ -import $rdf from 'barnard59-env' - -const { cube, rdf, rdfs, sh, xsd, _void, dcat, schema, dcterms } = $rdf.ns - -export { cube, rdf, rdfs, sh, xsd, _void, dcat, schema, dcterms } diff --git a/packages/rdf/lib/voidStats.js b/packages/rdf/lib/voidStats.js index 92b5cb7b..d851428c 100644 --- a/packages/rdf/lib/voidStats.js +++ b/packages/rdf/lib/voidStats.js @@ -1,8 +1,22 @@ import rdf from 'barnard59-env' import { Transform } from 'readable-stream' -import * as ns from './namespaces.js' + +/** + * @typedef {(datasetUri: import('@rdfjs/types').NamedNode, index: number) => import('@rdfjs/types').NamedNode} CreatePartitionUri + */ class VoidStats extends Transform { + /** + * @param {import('barnard59-core').Context} context + * @param {object} options + * @param {import('@rdfjs/types').NamedNode} options.voidDatasetUri + * @param {(import('@rdfjs/types').NamedNode | undefined)[]} options.classPartitions + * @param {(import('@rdfjs/types').NamedNode | undefined)[]} options.propertyPartitions + * @param {boolean} options.includeTotals + * @param {import('@rdfjs/types').NamedNode | undefined} options.graph + * @param {CreatePartitionUri} options.createClassPartitionUri + * @param {CreatePartitionUri} options.createPropertyPartitionUri + */ constructor(context, { voidDatasetUri, classPartitions, @@ -13,6 +27,7 @@ class VoidStats extends Transform { createPropertyPartitionUri, }) { super({ objectMode: true }) + this.rdf = context.env this.voidDatasetUri = voidDatasetUri this.includeTotals = includeTotals this.graph = graph @@ -33,10 +48,15 @@ class VoidStats extends Transform { this.totalEntityCount = 0 } + /** + * @param {import('@rdfjs/types').Quad} chunk + * @param {string} encoding + * @param {(error?: Error | null, chunk?: import('@rdfjs/types').Quad) => void} callback + */ _transform(chunk, encoding, callback) { this.totalTripleCount++ - if (chunk.predicate.equals(ns.rdf.type)) { + if (chunk.predicate.equals(this.rdf.ns.rdf.type)) { this.totalEntityCount++ for (const [key, value] of this.classPartitionsCounts) { if (chunk.object.equals(key)) { @@ -54,25 +74,28 @@ class VoidStats extends Transform { callback(null, chunk) } + /** + * @param {() => void} callback + */ async _flush(callback) { try { const datasetUri = toNamedNode(this.voidDatasetUri) const datasetGraph = this.graph ? toNamedNode(this.graph) : undefined - const stats = rdf.clownface({ - dataset: rdf.dataset(), + const stats = this.rdf.clownface({ + dataset: this.rdf.dataset(), graph: datasetGraph, }) stats .namedNode(datasetUri) - .addOut(ns.rdf.type, ns._void.Dataset) + .addOut(this.rdf.ns.rdf.type, this.rdf.ns._void.Dataset) if (this.includeTotals) { stats .namedNode(datasetUri) - .addOut(ns._void.triples, this.totalTripleCount) - .addOut(ns._void.entities, this.totalEntityCount) + .addOut(this.rdf.ns._void.triples, this.totalTripleCount) + .addOut(this.rdf.ns._void.entities, this.totalEntityCount) } if (this.classPartitionsCounts.size) { @@ -80,10 +103,10 @@ class VoidStats extends Transform { for (const [currentClass, count] of this.classPartitionsCounts) { stats .namedNode(datasetUri) - .addOut(ns._void.classPartition, this.createClassPartitionUri(datasetUri, index), partition => { + .addOut(this.rdf.ns._void.classPartition, this.createClassPartitionUri(datasetUri, index), partition => { partition - .addOut(ns._void.class, currentClass) - .addOut(ns._void.entities, count) + .addOut(this.rdf.ns._void.class, currentClass) + .addOut(this.rdf.ns._void.entities, count) }) index += 1 } @@ -94,10 +117,10 @@ class VoidStats extends Transform { for (const [currentProperty, count] of this.propertyPartitionsCounts) { stats .namedNode(datasetUri) - .addOut(ns._void.propertyPartition, this.createPropertyPartitionUri(datasetUri, index), partition => { + .addOut(this.rdf.ns._void.propertyPartition, this.createPropertyPartitionUri(datasetUri, index), partition => { partition - .addOut(ns._void.property, currentProperty) - .addOut(ns._void.entities, count) + .addOut(this.rdf.ns._void.property, currentProperty) + .addOut(this.rdf.ns._void.entities, count) }) index += 1 } @@ -106,7 +129,7 @@ class VoidStats extends Transform { for (const quad of stats.dataset) { this.push(quad) } - } catch (err) { + } catch (/** @type {any} */ err) { this.destroy(err) } finally { callback() @@ -114,6 +137,20 @@ class VoidStats extends Transform { } } +/** + * @overload + * @param {string | import('@rdfjs/types').NamedNode} item + * @returns {import('@rdfjs/types').NamedNode} + */ +/** + * @overload + * @param {string | import('@rdfjs/types').NamedNode | undefined} item + * @returns {import('@rdfjs/types').NamedNode | undefined} + */ +/** + * @param {string | import('@rdfjs/types').NamedNode | undefined} item + * @returns {import('@rdfjs/types').NamedNode | undefined} + */ function toNamedNode(item) { if (item === undefined) { return undefined @@ -121,14 +158,26 @@ function toNamedNode(item) { return typeof item === 'string' ? rdf.namedNode(item) : item } +/** + * @this {import('barnard59-core').Context} + * @param {object} options + * @param {string | import('@rdfjs/types').NamedNode} [options.voidDatasetUri] + * @param {(string | import('@rdfjs/types').NamedNode)[]} [options.classPartitions] + * @param {(string | import('@rdfjs/types').NamedNode)[]} [options.propertyPartitions] + * @param {boolean} [options.includeTotals] + * @param {string | import('@rdfjs/types').NamedNode} [options.graph] + * @param {CreatePartitionUri} [options.createClassPartitionUri] + * @param {CreatePartitionUri} [options.createPropertyPartitionUri] + * @return {Transform} + */ function graphStats({ voidDatasetUri = undefined, classPartitions = [], propertyPartitions = [], includeTotals = true, graph = undefined, - createClassPartitionUri = (datasetUri, index) => rdf.namedNode(`${datasetUri.value}/classPartition/${index}`), - createPropertyPartitionUri = (datasetUri, index) => rdf.namedNode(`${datasetUri.value}/propertyPartition/${index}`), + createClassPartitionUri = (datasetUri, index) => this.env.namedNode(`${datasetUri.value}/classPartition/${index}`), + createPropertyPartitionUri = (datasetUri, index) => this.env.namedNode(`${datasetUri.value}/propertyPartition/${index}`), } = {}) { if (!voidDatasetUri) { throw new Error('Needs voidDatasetUri as parameter') diff --git a/packages/rdf/mapMatch.js b/packages/rdf/mapMatch.js index 4671c0fd..de95143d 100644 --- a/packages/rdf/mapMatch.js +++ b/packages/rdf/mapMatch.js @@ -1,12 +1,33 @@ -import rdf from 'barnard59-env' import { Transform } from 'readable-stream' import PatternMatcher from './lib/PatternMatcher.js' +/** + * @typedef {(this: { rdf: import('barnard59-env').Environment }, quad: import('@rdfjs/types').Quad) => Promise | T} MapCallback + * @template T + */ + +/** + * @this {import('barnard59-core').Context} + * @param {object} options + * @param {MapCallback} options.map + * @param {import('@rdfjs/types').Quad_Subject | Iterable} [options.subject] + * @param {import('@rdfjs/types').Quad_Predicate | Iterable} [options.predicate] + * @param {import('@rdfjs/types').Quad_Object | Iterable} [options.object] + * @param {import('@rdfjs/types').Quad_Graph | Iterable} [options.graph] + * @return {Transform} + * @template T + */ function mapMatch({ map, subject, predicate, object, graph }) { const matcher = new PatternMatcher({ subject, predicate, object, graph }) return new Transform({ objectMode: true, + /** + * @param {import('@rdfjs/types').Quad} quad + * @param {string} encoding + * @param {(error?: Error | null, data?: unknown) => void} callback + * @return {Promise} + */ transform: async (quad, encoding, callback) => { // these are not the quads you're looking for if (!matcher.test(quad)) { @@ -14,8 +35,8 @@ function mapMatch({ map, subject, predicate, object, graph }) { } try { - callback(null, await map.call({ rdf }, quad)) - } catch (err) { + callback(null, await map.call({ rdf: this.env }, quad)) + } catch (/** @type {any} */ err) { callback(err) } }, diff --git a/packages/rdf/open.js b/packages/rdf/open.js index 3c20103c..a5464d3e 100644 --- a/packages/rdf/open.js +++ b/packages/rdf/open.js @@ -1,3 +1,9 @@ +/** + * @this {import('barnard59-core').Context} + * @param {string} pathOrUri + * @param {string} [mediaTypeOverride] + * @return {Promise} + */ export default async function (pathOrUri, mediaTypeOverride) { let url @@ -8,11 +14,18 @@ export default async function (pathOrUri, mediaTypeOverride) { } const response = await this.env.fetch(url) + if (!response.body) { + throw new Error(`Empty response from ${url}`) + } + let parserStream if (mediaTypeOverride) { - parserStream = this.env.formats.parsers.import(mediaTypeOverride, response.body, { - baseIRI: response.url, - }) + parserStream = this.env.formats.parsers.import( + mediaTypeOverride, + // @ts-expect-error + response.body, { + baseIRI: response.url, + }) if (!parserStream) { throw new Error(`No parser found for ${mediaTypeOverride}`) diff --git a/packages/rdf/package.json b/packages/rdf/package.json index ab8798ce..8cd87aaf 100644 --- a/packages/rdf/package.json +++ b/packages/rdf/package.json @@ -1,11 +1,14 @@ { "name": "barnard59-rdf", - "version": "3.3.0", + "version": "3.4.0", "description": "RDF support for Linked Data pipelines", "main": "index.js", "type": "module", "scripts": { - "test": "mocha" + "test": "mocha", + "prebuild": "rimraf -g *.d.ts lib/**/*.d.ts lib/*.d.ts", + "build": "tsc", + "prepack": "npm run build" }, "publishConfig": { "access": "public" @@ -24,13 +27,12 @@ "homepage": "https://github.com/zazuko/barnard59", "dependencies": { "@rdfjs/fetch": "^3.0.0", - "barnard59-env": "^1.2.0", + "barnard59-env": "^1.2.2", "file-fetch": "^1.7.0", "is-stream": "^3.0.0", "lodash": "^4.17.21", "mime-types": "^2.1.35", "proto-fetch": "^1.0.0", - "rdf-dataset-ext": "^1.0.1", "rdf-literal": "^1.3.0", "rdf-transform-graph-imports": "^0.2.2", "rdf-transform-triple-to-quad": "^2.0.0", @@ -39,6 +41,12 @@ }, "devDependencies": { "@rdfjs/to-ntriples": "^2.0.0", + "@types/file-fetch": "^1.6.6", + "@types/mime-types": "^2.1.4", + "@types/proto-fetch": "^1.0.5", + "@types/rdf-transform-triple-to-quad": "^2.0.5", + "@types/rdfjs__fetch-lite": "^3.0.8", + "@types/rdfjs__fetch": "^3.0.6", "assert-throws-async": "^3.0.0", "chai": "^4.3.7", "express-as-promise": "^1.2.0", diff --git a/packages/rdf/setGraph.js b/packages/rdf/setGraph.js index 7bdce464..f4a2a783 100644 --- a/packages/rdf/setGraph.js +++ b/packages/rdf/setGraph.js @@ -1,14 +1,18 @@ -import rdf from 'barnard59-env' import TripleToQuadTransform from 'rdf-transform-triple-to-quad' +/** + * @this {import('barnard59-core').Context} + * @param {string | import('@rdfjs/types').Term | undefined} graph + * @return {import('readable-stream').Transform} + */ function setGraph(graph) { - const iri = (graph && graph.value) || (graph && graph.toString()) || '' + const iri = (graph && (typeof graph === 'string' ? graph : graph.value)) || '' if (iri === '') { - return new TripleToQuadTransform(rdf.defaultGraph()) + return new TripleToQuadTransform(this.env.defaultGraph()) } - return new TripleToQuadTransform(rdf.namedNode(iri), { factory: rdf }) + return new TripleToQuadTransform(this.env.namedNode(iri), { factory: this.env }) } export default setGraph diff --git a/packages/rdf/test/PatternMatcher.test.js b/packages/rdf/test/PatternMatcher.test.js index 4dee9b31..d1f07f5c 100644 --- a/packages/rdf/test/PatternMatcher.test.js +++ b/packages/rdf/test/PatternMatcher.test.js @@ -1,4 +1,4 @@ -import { strictEqual } from 'assert' +import { strictEqual } from 'node:assert' import rdf from 'barnard59-env' import PatternMatcher from '../lib/PatternMatcher.js' import { ex } from './support/namespaces.js' diff --git a/packages/rdf/test/append.test.js b/packages/rdf/test/append.test.js index b56a4fc1..d9e2d517 100644 --- a/packages/rdf/test/append.test.js +++ b/packages/rdf/test/append.test.js @@ -1,41 +1,31 @@ -import { equal, strictEqual } from 'assert' -import fs from 'fs' +import { equal, strictEqual } from 'node:assert' +import fs from 'node:fs' import fsp from 'fs/promises' -import { fileURLToPath } from 'url' -import { resolve } from 'path' +import { fileURLToPath } from 'node:url' +import { resolve } from 'node:path' import assertThrows from 'assert-throws-async' import getStream from 'get-stream' import { isDuplexStream as isDuplex } from 'is-stream' import nock from 'nock' import rdf from 'barnard59-env' import { Readable } from 'readable-stream' -import fromStream from 'rdf-dataset-ext/fromStream.js' -import addAll from 'rdf-dataset-ext/addAll.js' -import toCanonical from 'rdf-dataset-ext/toCanonical.js' import appendUnbound from '../lib/append.js' -import { schema, xsd, dcterms } from '../lib/namespaces.js' -const dataPath = './support/dataset.ttl' +const __dirname = fileURLToPath(new URL('.', import.meta.url)) -const metadataPath = './support/dataset_description.ttl' +const dataPath = resolve(__dirname, './support/dataset.ttl') -const __dirname = fileURLToPath(new URL('.', import.meta.url)) +const metadataPath = resolve(__dirname, './support/dataset_description.ttl') const ex = rdf.namespace('http://example.org/') async function getRDFDataset(filePath) { - return fromStream(rdf.dataset(), getRDFStream(filePath)) -} - -function getRDFStream(filePath) { - const stream = fs.createReadStream(resolve(__dirname, filePath)) - const parser = rdf.formats.parsers.get('text/turtle') - return parser.import(stream) + return rdf.dataset().import(rdf.fromFile(filePath)) } async function applyStep(transform) { const initial = await getRDFDataset(dataPath) - const stream = getRDFStream(dataPath).pipe(transform) + const stream = rdf.fromFile(dataPath).pipe(transform) const final = rdf.dataset(await getStream.array(stream)) return { initial, final } } @@ -51,7 +41,7 @@ describe('metadata.append', () => { it('should return a duplex stream with a stream metadata parameter', async () => { const step = await append({ - input: getRDFStream(metadataPath), + input: rdf.fromFile(metadataPath), }) strictEqual(isDuplex(step), true) }) @@ -78,24 +68,24 @@ describe('metadata.append', () => { it('should append data and metadata with default values', async () => { const all = rdf.dataset() - addAll(all, await getRDFDataset(dataPath)) - addAll(all, await getRDFDataset(metadataPath)) + .addAll(await getRDFDataset(dataPath)) + .addAll(await getRDFDataset(metadataPath)) const step = await append({ - input: getRDFStream(metadataPath), + input: rdf.fromFile(metadataPath), }) const { final } = await applyStep(step) equal( - toCanonical(final), - toCanonical(all), 'appended quads not as expected', + final.toCanonical(), + all.toCanonical(), 'appended quads not as expected', ) }) it('should append data and metadata with default values, and path as string', async () => { const all = rdf.dataset() - addAll(all, await getRDFDataset(dataPath)) - addAll(all, await getRDFDataset(metadataPath)) + .addAll(await getRDFDataset(dataPath)) + .addAll(await getRDFDataset(metadataPath)) const step = await append({ input: metadataPath, @@ -104,8 +94,8 @@ describe('metadata.append', () => { const { final } = await applyStep(step) equal( - toCanonical(final), - toCanonical(all), 'appended quads not as expected', + final.toCanonical(), + all.toCanonical(), 'appended quads not as expected', ) }) @@ -173,14 +163,14 @@ describe('File System: metadata.append', () => { const result = await getStream.array(Readable.from(data).pipe(step)) strictEqual(result.length, 7) - strictEqual(result[4].predicate.value, schema.dateModified.value) + strictEqual(result[4].predicate.value, rdf.ns.schema.dateModified.value) strictEqual(result[4].object.value, rdf.literal('2020-05-30').value) - strictEqual(result[5].predicate.value, dcterms.created.value) - strictEqual(result[5].object.value, rdf.literal((new Date(stats.birthtimeMs)).toISOString(), xsd.dateTime).value) + strictEqual(result[5].predicate.value, rdf.ns.dcterms.created.value) + strictEqual(result[5].object.value, rdf.literal((new Date(stats.birthtimeMs)).toISOString(), rdf.ns.xsd.dateTime).value) - strictEqual(result[6].predicate.value, schema.dateCreated.value) - strictEqual(result[6].object.value, rdf.literal((new Date(stats.birthtimeMs)).toISOString(), xsd.dateTime).value) + strictEqual(result[6].predicate.value, rdf.ns.schema.dateCreated.value) + strictEqual(result[6].object.value, rdf.literal((new Date(stats.birthtimeMs)).toISOString(), rdf.ns.xsd.dateTime).value) }) it('should use resolved literal TIME_FILE_CREATION with dateModified', async () => { @@ -199,14 +189,14 @@ describe('File System: metadata.append', () => { strictEqual(result.length, 7) - strictEqual(result[4].predicate.value, schema.dateCreated.value) + strictEqual(result[4].predicate.value, rdf.ns.schema.dateCreated.value) strictEqual(result[4].object.value, rdf.literal('2020-05-30').value) - strictEqual(result[5].predicate.value, dcterms.modified.value) - strictEqual(result[5].object.value, rdf.literal((new Date(stats.birthtimeMs)).toISOString(), xsd.dateTime).value) + strictEqual(result[5].predicate.value, rdf.ns.dcterms.modified.value) + strictEqual(result[5].object.value, rdf.literal((new Date(stats.birthtimeMs)).toISOString(), rdf.ns.xsd.dateTime).value) - strictEqual(result[6].predicate.value, schema.dateModified.value) - strictEqual(result[6].object.value, rdf.literal((new Date(stats.birthtimeMs)).toISOString(), xsd.dateTime).value) + strictEqual(result[6].predicate.value, rdf.ns.schema.dateModified.value) + strictEqual(result[6].object.value, rdf.literal((new Date(stats.birthtimeMs)).toISOString(), rdf.ns.xsd.dateTime).value) }) it('should use resolved literal TIME_FILE_MODIFICATION with dateCreated', async () => { @@ -224,14 +214,14 @@ describe('File System: metadata.append', () => { const result = await getStream.array(Readable.from(data).pipe(step)) strictEqual(result.length, 7) - strictEqual(result[4].predicate.value, schema.dateModified.value) + strictEqual(result[4].predicate.value, rdf.ns.schema.dateModified.value) strictEqual(result[4].object.value, rdf.literal('2020-05-30').value) - strictEqual(result[5].predicate.value, dcterms.created.value) - strictEqual(result[5].object.value, rdf.literal((new Date(stats.mtimeMs)).toISOString(), xsd.dateTime).value) + strictEqual(result[5].predicate.value, rdf.ns.dcterms.created.value) + strictEqual(result[5].object.value, rdf.literal((new Date(stats.mtimeMs)).toISOString(), rdf.ns.xsd.dateTime).value) - strictEqual(result[6].predicate.value, schema.dateCreated.value) - strictEqual(result[6].object.value, rdf.literal((new Date(stats.mtimeMs)).toISOString(), xsd.dateTime).value) + strictEqual(result[6].predicate.value, rdf.ns.schema.dateCreated.value) + strictEqual(result[6].object.value, rdf.literal((new Date(stats.mtimeMs)).toISOString(), rdf.ns.xsd.dateTime).value) }) it('should use resolved literal TIME_FILE_MODIFICATION with dateModified', async () => { @@ -250,14 +240,14 @@ describe('File System: metadata.append', () => { strictEqual(result.length, 7) - strictEqual(result[4].predicate.value, schema.dateCreated.value) + strictEqual(result[4].predicate.value, rdf.ns.schema.dateCreated.value) strictEqual(result[4].object.value, rdf.literal('2020-05-30').value) - strictEqual(result[5].predicate.value, dcterms.modified.value) - strictEqual(result[5].object.value, rdf.literal((new Date(stats.mtimeMs)).toISOString(), xsd.dateTime).value) + strictEqual(result[5].predicate.value, rdf.ns.dcterms.modified.value) + strictEqual(result[5].object.value, rdf.literal((new Date(stats.mtimeMs)).toISOString(), rdf.ns.xsd.dateTime).value) - strictEqual(result[6].predicate.value, schema.dateModified.value) - strictEqual(result[6].object.value, rdf.literal((new Date(stats.mtimeMs)).toISOString(), xsd.dateTime).value) + strictEqual(result[6].predicate.value, rdf.ns.schema.dateModified.value) + strictEqual(result[6].object.value, rdf.literal((new Date(stats.mtimeMs)).toISOString(), rdf.ns.xsd.dateTime).value) }) it('should use resolved literal TIME_NOW with dateModified', async () => { @@ -265,9 +255,9 @@ describe('File System: metadata.append', () => { rdf.quad(ex.subject0, ex.predicate0, ex.object0, ex.graph0), ] const metadata = [ - rdf.quad(ex.subject1, rdf.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), schema.Dataset), - rdf.quad(ex.subject1, schema.dateCreated, rdf.literal('2020-05-30')), - rdf.quad(ex.subject1, schema.dateModified, rdf.literal('2020-05-30')), + rdf.quad(ex.subject1, rdf.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), rdf.ns.schema.Dataset), + rdf.quad(ex.subject1, rdf.ns.schema.dateCreated, rdf.literal('2020-05-30')), + rdf.quad(ex.subject1, rdf.ns.schema.dateModified, rdf.literal('2020-05-30')), ] const step = await append({ input: Readable.from(metadata), @@ -278,10 +268,10 @@ describe('File System: metadata.append', () => { strictEqual(result.length, 4) - strictEqual(result[2].predicate.value, schema.dateCreated.value) + strictEqual(result[2].predicate.value, rdf.ns.schema.dateCreated.value) strictEqual(result[2].object.value, rdf.literal('2020-05-30').value) - strictEqual(result[3].predicate.value, schema.dateModified.value) + strictEqual(result[3].predicate.value, rdf.ns.schema.dateModified.value) strictEqual(result[3].object.value === rdf.literal('2020-05-30').value, false) }) @@ -290,9 +280,9 @@ describe('File System: metadata.append', () => { rdf.quad(ex.subject0, ex.predicate0, ex.object0, ex.graph0), ] const metadata = [ - rdf.quad(ex.subject1, rdf.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), schema.Dataset), - rdf.quad(ex.subject1, schema.dateCreated, rdf.literal('2020-05-30')), - rdf.quad(ex.subject1, schema.dateModified, rdf.literal('2020-05-30')), + rdf.quad(ex.subject1, rdf.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), rdf.ns.schema.Dataset), + rdf.quad(ex.subject1, rdf.ns.schema.dateCreated, rdf.literal('2020-05-30')), + rdf.quad(ex.subject1, rdf.ns.schema.dateModified, rdf.literal('2020-05-30')), ] const step = await append({ input: Readable.from(metadata), @@ -303,10 +293,10 @@ describe('File System: metadata.append', () => { strictEqual(result.length, 4) - strictEqual(result[2].predicate.value, schema.dateModified.value) + strictEqual(result[2].predicate.value, rdf.ns.schema.dateModified.value) strictEqual(result[2].object.value, rdf.literal('2020-05-30').value) - strictEqual(result[3].predicate.value, schema.dateCreated.value) + strictEqual(result[3].predicate.value, rdf.ns.schema.dateCreated.value) strictEqual(result[3].object.value === rdf.literal('2020-05-30').value, false) }) @@ -315,8 +305,8 @@ describe('File System: metadata.append', () => { rdf.quad(ex.subject0, ex.predicate0, ex.object0, ex.graph0), ] const metadata = [ - rdf.quad(ex.subject1, rdf.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), schema.Dataset), - rdf.quad(ex.subject1, schema.dateModified, rdf.literal('2020-05-30')), + rdf.quad(ex.subject1, rdf.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), rdf.ns.schema.Dataset), + rdf.quad(ex.subject1, rdf.ns.schema.dateModified, rdf.literal('2020-05-30')), ] const step = await append({ input: Readable.from(metadata), @@ -327,7 +317,7 @@ describe('File System: metadata.append', () => { strictEqual(result.length, 3) - strictEqual(result[2].predicate.value, schema.dateModified.value) + strictEqual(result[2].predicate.value, rdf.ns.schema.dateModified.value) strictEqual(result[2].object.value, rdf.literal('1999-12-31').value) }) @@ -336,8 +326,8 @@ describe('File System: metadata.append', () => { rdf.quad(ex.subject0, ex.predicate0, ex.object0, ex.graph0), ] const metadata = [ - rdf.quad(ex.subject1, rdf.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), schema.Dataset), - rdf.quad(ex.subject1, schema.dateCreated, rdf.literal('2020-05-30')), + rdf.quad(ex.subject1, rdf.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), rdf.ns.schema.Dataset), + rdf.quad(ex.subject1, rdf.ns.schema.dateCreated, rdf.literal('2020-05-30')), ] const step = await append({ input: Readable.from(metadata), @@ -348,7 +338,7 @@ describe('File System: metadata.append', () => { strictEqual(result.length, 3) - strictEqual(result[2].predicate.value, schema.dateCreated.value) + strictEqual(result[2].predicate.value, rdf.ns.schema.dateCreated.value) strictEqual(result[2].object.value, rdf.literal('1999-12-31').value) }) @@ -357,19 +347,19 @@ describe('File System: metadata.append', () => { rdf.quad(ex.subject0, ex.predicate0, ex.object0, ex.graph0), ] const metadata = [ - rdf.quad(ex.subject1, rdf.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), schema.Dataset), - rdf.quad(ex.subject1, schema.dateModified, rdf.literal('2020-05-30')), + rdf.quad(ex.subject1, rdf.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), rdf.ns.schema.Dataset), + rdf.quad(ex.subject1, rdf.ns.schema.dateModified, rdf.literal('2020-05-30')), ] const step = await append({ input: Readable.from(metadata), - dateModified: rdf.literal('1999-12-31', xsd.dateTime), + dateModified: rdf.literal('1999-12-31', rdf.ns.xsd.dateTime), }) const result = await getStream.array(Readable.from(data).pipe(step)) strictEqual(result.length, 3) - strictEqual(result[2].predicate.value, schema.dateModified.value) + strictEqual(result[2].predicate.value, rdf.ns.schema.dateModified.value) strictEqual(result[2].object.value, rdf.literal('1999-12-31').value) }) @@ -378,19 +368,19 @@ describe('File System: metadata.append', () => { rdf.quad(ex.subject0, ex.predicate0, ex.object0, ex.graph0), ] const metadata = [ - rdf.quad(ex.subject1, rdf.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), schema.Dataset), - rdf.quad(ex.subject1, schema.dateCreated, rdf.literal('2020-05-30')), + rdf.quad(ex.subject1, rdf.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), rdf.ns.schema.Dataset), + rdf.quad(ex.subject1, rdf.ns.schema.dateCreated, rdf.literal('2020-05-30')), ] const step = await append({ input: Readable.from(metadata), - dateCreated: rdf.literal('1999-12-31', xsd.dateTime), + dateCreated: rdf.literal('1999-12-31', rdf.ns.xsd.dateTime), }) const result = await getStream.array(Readable.from(data).pipe(step)) strictEqual(result.length, 3) - strictEqual(result[2].predicate.value, schema.dateCreated.value) + strictEqual(result[2].predicate.value, rdf.ns.schema.dateCreated.value) strictEqual(result[2].object.value, rdf.literal('1999-12-31').value) }) }) diff --git a/packages/rdf/test/fs.test.js b/packages/rdf/test/fs.test.js index 2cd5c20f..f098892d 100644 --- a/packages/rdf/test/fs.test.js +++ b/packages/rdf/test/fs.test.js @@ -1,11 +1,9 @@ -import { Readable } from 'stream' -import { resolve } from 'path' -import * as url from 'url' +import { Readable } from 'node:stream' +import { resolve } from 'node:path' +import * as url from 'node:url' import $rdf from 'barnard59-env' import chai, { expect } from 'chai' import { jestSnapshotPlugin } from 'mocha-chai-jest-snapshot' -import fromStream from 'rdf-dataset-ext/fromStream.js' -import toCanonical from 'rdf-dataset-ext/toCanonical.js' import { parse as unbound } from '../fs.js' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) @@ -25,10 +23,10 @@ describe('fs', () => { ]) // when - const dataset = await fromStream($rdf.dataset(), files.pipe(parse())) + const dataset = await $rdf.dataset().import(files.pipe(parse())) // then - expect(toCanonical(dataset)).toMatchSnapshot() + expect(dataset.toCanonical()).toMatchSnapshot() }) it('fails when file does not exist', (done) => { diff --git a/packages/rdf/test/localFetch/localFetch.test.js b/packages/rdf/test/localFetch/localFetch.test.js index 5e199e1a..7285d8b3 100644 --- a/packages/rdf/test/localFetch/localFetch.test.js +++ b/packages/rdf/test/localFetch/localFetch.test.js @@ -1,13 +1,11 @@ -import { equal, strictEqual } from 'assert' -import fs from 'fs' -import { resolve } from 'path' -import { fileURLToPath } from 'url' +import { equal, strictEqual } from 'node:assert' +import fs from 'node:fs' +import { resolve } from 'node:path' +import { fileURLToPath } from 'node:url' import { expect } from 'chai' import assertThrows from 'assert-throws-async' import nock from 'nock' import rdf from 'barnard59-env' -import fromStream from 'rdf-dataset-ext/fromStream.js' -import toCanonical from 'rdf-dataset-ext/toCanonical.js' import { localFetch as unbound } from '../../lib/localFetch/localFetch.js' const __dirname = fileURLToPath(new URL('.', import.meta.url)) @@ -15,13 +13,7 @@ const datasetPath = '../support/dataset.ttl' const datasetAbsolutePath = resolve(__dirname, datasetPath) async function getRDFDataset(filePath) { - return fromStream(rdf.dataset(), getRDFStream(filePath)) -} - -function getRDFStream(filePath) { - const stream = fs.createReadStream(resolve(__dirname, filePath)) - const parser = rdf.formats.parsers.get('text/turtle') - return parser.import(stream) + return rdf.dataset().import(rdf.fromFile(filePath)) } const localFetch = unbound.bind({ env: rdf }) @@ -49,15 +41,15 @@ describe('metadata.lfetch', () => { it('with defaults, should get the same dataset', async () => { const expected = await getRDFDataset(datasetPath) - const { quadStream } = await localFetch(getRDFStream(datasetPath)) - const actual = await fromStream(rdf.dataset(), quadStream) + const { quadStream } = await localFetch(rdf.fromFile(datasetPath)) + const actual = await rdf.dataset().import(quadStream) equal(expected.equals(actual), true) }) it('with filename and base, should get the same dataset', async () => { const expected = await getRDFDataset(datasetPath) const { quadStream } = await localFetch(datasetPath, __dirname) - const actual = await fromStream(rdf.dataset(), quadStream) + const actual = await rdf.dataset().import(quadStream) equal(expected.equals(actual), true) }) @@ -65,7 +57,7 @@ describe('metadata.lfetch', () => { it('with absolute filename, should get the same dataset', async () => { const expected = await getRDFDataset(datasetPath) const { quadStream } = await localFetch(datasetAbsolutePath) - const actual = await fromStream(rdf.dataset(), quadStream) + const actual = await rdf.dataset().import(quadStream) equal(expected.equals(actual), true) }) @@ -73,7 +65,7 @@ describe('metadata.lfetch', () => { it('with absolute filename, should ignore basePath and get the same dataset', async () => { const expected = await getRDFDataset(datasetPath) const { quadStream } = await localFetch(datasetAbsolutePath, '/unknown/') - const actual = await fromStream(rdf.dataset(), quadStream) + const actual = await rdf.dataset().import(quadStream) equal(expected.equals(actual), true) }) @@ -99,9 +91,9 @@ describe('metadata.lfetch', () => { const expected = await getRDFDataset(datasetPath) const { quadStream } = await localFetch('https://example.com/metadata.ttl') - const actual = await fromStream(rdf.dataset(), quadStream) + const actual = await rdf.dataset().import(quadStream) - expect(toCanonical(actual)).to.eq(toCanonical(expected)) + expect(actual.toCanonical()).to.eq(expected.toCanonical()) }) it('fails at unknown file extension', async () => { diff --git a/packages/rdf/test/mapMatch.test.js b/packages/rdf/test/mapMatch.test.js index 978e780d..420480b6 100644 --- a/packages/rdf/test/mapMatch.test.js +++ b/packages/rdf/test/mapMatch.test.js @@ -1,16 +1,14 @@ -import { strictEqual } from 'assert' +import { strictEqual } from 'node:assert' import getStream from 'get-stream' import { isDuplexStream } from 'is-stream' import rdf from 'barnard59-env' import { Readable } from 'readable-stream' -import mapMatch from '../mapMatch.js' +import mapMatchUnbound from '../mapMatch.js' import * as ns from './support/namespaces.js' -describe('mapMatch', () => { - it('should be a factory', () => { - strictEqual(typeof mapMatch, 'function') - }) +const mapMatch = mapMatchUnbound.bind({ env: rdf }) +describe('mapMatch', () => { it('should return a duplex stream', () => { const stream = mapMatch({ predicate: '', map: () => {} }) diff --git a/packages/rdf/test/membership.test.js b/packages/rdf/test/membership.test.js index 51f00259..d46c180e 100644 --- a/packages/rdf/test/membership.test.js +++ b/packages/rdf/test/membership.test.js @@ -1,20 +1,17 @@ -import { equal, strictEqual, throws } from 'assert' +import { strictEqual, throws } from 'node:assert' import getStream from 'get-stream' import { isDuplexStream as isDuplex } from 'is-stream' import rdf from 'barnard59-env' import { Readable } from 'readable-stream' -import toCanonical from 'rdf-dataset-ext/toCanonical.js' -import append from '../lib/append.js' -import { toTarget, fromSource } from '../lib/membership.js' -import * as ns from '../lib/namespaces.js' +import { expect } from 'chai' +import * as membership from '../lib/membership.js' + +const toTarget = membership.toTarget.bind({ env: rdf }) +const fromSource = membership.fromSource.bind({ env: rdf }) const ex = rdf.namespace('http://example.org/') describe('membership.toTarget', () => { - it('should be a factory', () => { - strictEqual(typeof append, 'function') - }) - const parameterSet = [ { targetUri: undefined, targetClass: ex.targetClass, property: ex.property, classes: [ex.class] }, { targetUri: ex.targetUri, targetClass: undefined, property: ex.property, classes: [ex.class] }, @@ -42,17 +39,17 @@ describe('membership.toTarget', () => { it('should append meta-data to the data', async () => { const data = [ - rdf.quad(ex.bob, ns.rdf.type, ex.Person), - rdf.quad(ex.alice, ns.rdf.type, ex.Person), - rdf.quad(ex.fido, ns.rdf.type, ex.Dog), - rdf.quad(ex.tom, ns.rdf.type, ex.Cat), + rdf.quad(ex.bob, rdf.ns.rdf.type, ex.Person), + rdf.quad(ex.alice, rdf.ns.rdf.type, ex.Person), + rdf.quad(ex.fido, rdf.ns.rdf.type, ex.Dog), + rdf.quad(ex.tom, rdf.ns.rdf.type, ex.Cat), ] const expectedMetadata = [ rdf.quad(ex.bob, ex.in, ex.house), rdf.quad(ex.alice, ex.in, ex.house), rdf.quad(ex.tom, ex.in, ex.house), - rdf.quad(ex.house, ns.rdf.type, ex.Container), + rdf.quad(ex.house, rdf.ns.rdf.type, ex.Container), ] const step = toTarget({ @@ -64,25 +61,22 @@ describe('membership.toTarget', () => { const result = await getStream.array(Readable.from(data).pipe(step)) - equal( - toCanonical(result), - toCanonical(rdf.dataset([...data, ...expectedMetadata])), - ) + expect(result).to.deep.contain.all.members([...data, ...expectedMetadata]) }) it('should append meta-data to the data with string parameters', async () => { const data = [ - rdf.quad(ex.bob, ns.rdf.type, ex.Person), - rdf.quad(ex.alice, ns.rdf.type, ex.Person), - rdf.quad(ex.fido, ns.rdf.type, ex.Dog), - rdf.quad(ex.tom, ns.rdf.type, ex.Cat), + rdf.quad(ex.bob, rdf.ns.rdf.type, ex.Person), + rdf.quad(ex.alice, rdf.ns.rdf.type, ex.Person), + rdf.quad(ex.fido, rdf.ns.rdf.type, ex.Dog), + rdf.quad(ex.tom, rdf.ns.rdf.type, ex.Cat), ] const expectedMetadata = [ rdf.quad(ex.bob, ex.in, ex.house), rdf.quad(ex.alice, ex.in, ex.house), rdf.quad(ex.tom, ex.in, ex.house), - rdf.quad(ex.house, ns.rdf.type, ex.Container), + rdf.quad(ex.house, rdf.ns.rdf.type, ex.Container), ] const step = toTarget({ @@ -94,18 +88,11 @@ describe('membership.toTarget', () => { const result = await getStream.array(Readable.from(data).pipe(step)) - equal( - toCanonical(result), - toCanonical(rdf.dataset([...data, ...expectedMetadata])), - ) + expect(result).to.deep.contain.all.members([...data, ...expectedMetadata]) }) }) describe('membership.fromSource', () => { - it('should be a factory', () => { - strictEqual(typeof append, 'function') - }) - const parameterSet = [ { sourceUri: undefined, sourceClass: ex.sourceClass, property: ex.property, classes: [ex.class] }, { sourceUri: ex.sourceUri, sourceClass: undefined, property: ex.property, classes: [ex.class] }, @@ -133,17 +120,17 @@ describe('membership.fromSource', () => { it('should append meta-data to the data', async () => { const data = [ - rdf.quad(ex.bob, ns.rdf.type, ex.Person), - rdf.quad(ex.alice, ns.rdf.type, ex.Person), - rdf.quad(ex.fido, ns.rdf.type, ex.Dog), - rdf.quad(ex.tom, ns.rdf.type, ex.Cat), + rdf.quad(ex.bob, rdf.ns.rdf.type, ex.Person), + rdf.quad(ex.alice, rdf.ns.rdf.type, ex.Person), + rdf.quad(ex.fido, rdf.ns.rdf.type, ex.Dog), + rdf.quad(ex.tom, rdf.ns.rdf.type, ex.Cat), ] const expectedMetadata = [ rdf.quad(ex.house, ex.contains, ex.bob), rdf.quad(ex.house, ex.contains, ex.alice), rdf.quad(ex.house, ex.contains, ex.tom), - rdf.quad(ex.house, ns.rdf.type, ex.Container), + rdf.quad(ex.house, rdf.ns.rdf.type, ex.Container), ] const step = fromSource({ @@ -155,25 +142,22 @@ describe('membership.fromSource', () => { const result = await getStream.array(Readable.from(data).pipe(step)) - equal( - toCanonical(result), - toCanonical(rdf.dataset([...data, ...expectedMetadata])), - ) + expect(result).to.deep.contain.all.members([...data, ...expectedMetadata]) }) it('should append meta-data to the data with string parameters', async () => { const data = [ - rdf.quad(ex.bob, ns.rdf.type, ex.Person), - rdf.quad(ex.alice, ns.rdf.type, ex.Person), - rdf.quad(ex.fido, ns.rdf.type, ex.Dog), - rdf.quad(ex.tom, ns.rdf.type, ex.Cat), + rdf.quad(ex.bob, rdf.ns.rdf.type, ex.Person), + rdf.quad(ex.alice, rdf.ns.rdf.type, ex.Person), + rdf.quad(ex.fido, rdf.ns.rdf.type, ex.Dog), + rdf.quad(ex.tom, rdf.ns.rdf.type, ex.Cat), ] const expectedMetadata = [ rdf.quad(ex.house, ex.contains, ex.bob), rdf.quad(ex.house, ex.contains, ex.alice), rdf.quad(ex.house, ex.contains, ex.tom), - rdf.quad(ex.house, ns.rdf.type, ex.Container), + rdf.quad(ex.house, rdf.ns.rdf.type, ex.Container), ] const step = fromSource({ @@ -185,9 +169,6 @@ describe('membership.fromSource', () => { const result = await getStream.array(Readable.from(data).pipe(step)) - equal( - toCanonical(result), - toCanonical(rdf.dataset([...data, ...expectedMetadata])), - ) + expect(result).to.deep.contain.all.members([...data, ...expectedMetadata]) }) }) diff --git a/packages/rdf/test/metadata/applyOptions.test.js b/packages/rdf/test/metadata/applyOptions.test.js index d0d71221..0b7390f6 100644 --- a/packages/rdf/test/metadata/applyOptions.test.js +++ b/packages/rdf/test/metadata/applyOptions.test.js @@ -1,10 +1,8 @@ -import { strictEqual } from 'assert' +import { strictEqual } from 'node:assert' import { expect } from 'chai' import rdf from 'barnard59-env' import { Readable } from 'readable-stream' import { applyOptions } from '../../lib/metadata/applyOptions.js' -import * as ns from '../../lib/namespaces.js' -import { xsd } from '../../lib/namespaces.js' const ex = rdf.namespace('http://example.org/') @@ -15,7 +13,7 @@ describe('applyOptions', () => { it('should return the same data if no options given', async () => { const data = [ - rdf.quad(ex.subject0, ns.rdf.type, ex.type0, ex.graph1), + rdf.quad(ex.subject0, rdf.ns.rdf.type, ex.type0, ex.graph1), ] const options = {} @@ -28,14 +26,14 @@ describe('applyOptions', () => { it('should update or append schema:dateCreated for known classes', async () => { const data = [ - rdf.quad(ex.subject0, ns.rdf.type, ns.schema.Dataset, ex.graph1), - rdf.quad(ex.subject0, ns.schema.dateCreated, rdf.literal('Not me'), ex.graph0), - rdf.quad(ex.subject1, ns.rdf.type, ex.type1, ex.graph0), - rdf.quad(ex.subject3, ns.rdf.type, ns.schema.Dataset, ex.graph0), + rdf.quad(ex.subject0, rdf.ns.rdf.type, rdf.ns.schema.Dataset, ex.graph1), + rdf.quad(ex.subject0, rdf.ns.schema.dateCreated, rdf.literal('Not me'), ex.graph0), + rdf.quad(ex.subject1, rdf.ns.rdf.type, ex.type1, ex.graph0), + rdf.quad(ex.subject3, rdf.ns.rdf.type, rdf.ns.schema.Dataset, ex.graph0), ] const options = { - dateCreated: rdf.literal('1999-12-31', xsd.dateTime), + dateCreated: rdf.literal('1999-12-31', rdf.ns.xsd.dateTime), } const quadStream = Readable.from(data) const result = [...await applyOptions(quadStream, {}, options)] @@ -44,13 +42,13 @@ describe('applyOptions', () => { strictEqual(result[0].equals(data[0]), true) strictEqual(result[1].equals(data[2]), true) strictEqual(result[2].equals(data[3]), true) - strictEqual(result[3].equals(rdf.quad(ex.subject0, ns.schema.dateCreated, rdf.literal('1999-12-31', xsd.dateTime))), true) - strictEqual(result[4].equals(rdf.quad(ex.subject3, ns.schema.dateCreated, rdf.literal('1999-12-31', xsd.dateTime))), true) + strictEqual(result[3].equals(rdf.quad(ex.subject0, rdf.ns.schema.dateCreated, rdf.literal('1999-12-31', rdf.ns.xsd.dateTime))), true) + strictEqual(result[4].equals(rdf.quad(ex.subject3, rdf.ns.schema.dateCreated, rdf.literal('1999-12-31', rdf.ns.xsd.dateTime))), true) }) it('should update or append schema:dateCreated for known classes (string)', async () => { const data = [ - rdf.quad(ex.subject0, ns.rdf.type, ns.schema.Dataset, ex.graph1), + rdf.quad(ex.subject0, rdf.ns.rdf.type, rdf.ns.schema.Dataset, ex.graph1), ] const options = { @@ -61,19 +59,19 @@ describe('applyOptions', () => { strictEqual(result.length, 2) strictEqual(result[0].equals(data[0]), true) - expect(result[1]).to.deep.equal(rdf.quad(ex.subject0, ns.schema.dateCreated, rdf.literal('1999-12-31', xsd.dateTime))) + expect(result[1]).to.deep.equal(rdf.quad(ex.subject0, rdf.ns.schema.dateCreated, rdf.literal('1999-12-31', rdf.ns.xsd.dateTime))) }) it('should update or append dcterms:created for known classes', async () => { const data = [ - rdf.quad(ex.subject0, ns.rdf.type, ns.dcat.Dataset, ex.graph1), - rdf.quad(ex.subject0, ns.dcterms.created, rdf.literal('Not me'), ex.graph0), - rdf.quad(ex.subject1, ns.rdf.type, ex.type1, ex.graph0), - rdf.quad(ex.subject3, ns.rdf.type, ns.dcat.Dataset, ex.graph0), + rdf.quad(ex.subject0, rdf.ns.rdf.type, rdf.ns.dcat.Dataset, ex.graph1), + rdf.quad(ex.subject0, rdf.ns.dcterms.created, rdf.literal('Not me'), ex.graph0), + rdf.quad(ex.subject1, rdf.ns.rdf.type, ex.type1, ex.graph0), + rdf.quad(ex.subject3, rdf.ns.rdf.type, rdf.ns.dcat.Dataset, ex.graph0), ] const options = { - dateCreated: rdf.literal('1999-12-31', xsd.dateTime), + dateCreated: rdf.literal('1999-12-31', rdf.ns.xsd.dateTime), } const quadStream = Readable.from(data) const result = [...await applyOptions(quadStream, {}, options)] @@ -82,20 +80,20 @@ describe('applyOptions', () => { strictEqual(result[0].equals(data[0]), true) strictEqual(result[1].equals(data[2]), true) strictEqual(result[2].equals(data[3]), true) - strictEqual(result[3].equals(rdf.quad(ex.subject0, ns.dcterms.created, rdf.literal('1999-12-31', xsd.dateTime))), true) - strictEqual(result[4].equals(rdf.quad(ex.subject3, ns.dcterms.created, rdf.literal('1999-12-31', xsd.dateTime))), true) + strictEqual(result[3].equals(rdf.quad(ex.subject0, rdf.ns.dcterms.created, rdf.literal('1999-12-31', rdf.ns.xsd.dateTime))), true) + strictEqual(result[4].equals(rdf.quad(ex.subject3, rdf.ns.dcterms.created, rdf.literal('1999-12-31', rdf.ns.xsd.dateTime))), true) }) it('should update or append schema:dateModified for known classes', async () => { const data = [ - rdf.quad(ex.subject0, ns.rdf.type, ns.schema.Dataset, ex.graph1), - rdf.quad(ex.subject0, ns.schema.dateModified, rdf.literal('Not me'), ex.graph0), - rdf.quad(ex.subject1, ns.rdf.type, ex.type1, ex.graph0), - rdf.quad(ex.subject3, ns.rdf.type, ns.schema.Dataset, ex.graph0), + rdf.quad(ex.subject0, rdf.ns.rdf.type, rdf.ns.schema.Dataset, ex.graph1), + rdf.quad(ex.subject0, rdf.ns.schema.dateModified, rdf.literal('Not me'), ex.graph0), + rdf.quad(ex.subject1, rdf.ns.rdf.type, ex.type1, ex.graph0), + rdf.quad(ex.subject3, rdf.ns.rdf.type, rdf.ns.schema.Dataset, ex.graph0), ] const options = { - dateModified: rdf.literal('1999-12-31', xsd.dateTime), + dateModified: rdf.literal('1999-12-31', rdf.ns.xsd.dateTime), } const quadStream = Readable.from(data) const result = [...await applyOptions(quadStream, {}, options)] @@ -104,20 +102,20 @@ describe('applyOptions', () => { strictEqual(result[0].equals(data[0]), true) strictEqual(result[1].equals(data[2]), true) strictEqual(result[2].equals(data[3]), true) - strictEqual(result[3].equals(rdf.quad(ex.subject0, ns.schema.dateModified, rdf.literal('1999-12-31', xsd.dateTime))), true) - strictEqual(result[4].equals(rdf.quad(ex.subject3, ns.schema.dateModified, rdf.literal('1999-12-31', xsd.dateTime))), true) + strictEqual(result[3].equals(rdf.quad(ex.subject0, rdf.ns.schema.dateModified, rdf.literal('1999-12-31', rdf.ns.xsd.dateTime))), true) + strictEqual(result[4].equals(rdf.quad(ex.subject3, rdf.ns.schema.dateModified, rdf.literal('1999-12-31', rdf.ns.xsd.dateTime))), true) }) it('should update or append dcterms:modified for known classes', async () => { const data = [ - rdf.quad(ex.subject0, ns.rdf.type, ns.dcat.Dataset, ex.graph1), - rdf.quad(ex.subject0, ns.dcterms.modified, rdf.literal('Not me'), ex.graph0), - rdf.quad(ex.subject1, ns.rdf.type, ex.type1, ex.graph0), - rdf.quad(ex.subject3, ns.rdf.type, ns.dcat.Dataset, ex.graph0), + rdf.quad(ex.subject0, rdf.ns.rdf.type, rdf.ns.dcat.Dataset, ex.graph1), + rdf.quad(ex.subject0, rdf.ns.dcterms.modified, rdf.literal('Not me'), ex.graph0), + rdf.quad(ex.subject1, rdf.ns.rdf.type, ex.type1, ex.graph0), + rdf.quad(ex.subject3, rdf.ns.rdf.type, rdf.ns.dcat.Dataset, ex.graph0), ] const options = { - dateModified: rdf.literal('1999-12-31', xsd.dateTime), + dateModified: rdf.literal('1999-12-31', rdf.ns.xsd.dateTime), } const quadStream = Readable.from(data) const result = [...await applyOptions(quadStream, {}, options)] @@ -126,18 +124,18 @@ describe('applyOptions', () => { strictEqual(result[0].equals(data[0]), true) strictEqual(result[1].equals(data[2]), true) strictEqual(result[2].equals(data[3]), true) - strictEqual(result[3].equals(rdf.quad(ex.subject0, ns.dcterms.modified, rdf.literal('1999-12-31', xsd.dateTime))), true) - strictEqual(result[4].equals(rdf.quad(ex.subject3, ns.dcterms.modified, rdf.literal('1999-12-31', xsd.dateTime))), true) + strictEqual(result[3].equals(rdf.quad(ex.subject0, rdf.ns.dcterms.modified, rdf.literal('1999-12-31', rdf.ns.xsd.dateTime))), true) + strictEqual(result[4].equals(rdf.quad(ex.subject3, rdf.ns.dcterms.modified, rdf.literal('1999-12-31', rdf.ns.xsd.dateTime))), true) }) it('should update or append both dcterms:modified and schema:modified for known classes', async () => { const data = [ - rdf.quad(ex.subject0, ns.rdf.type, ns.dcat.Dataset, ex.graph1), - rdf.quad(ex.subject0, ns.rdf.type, ns.schema.Dataset, ex.graph1), + rdf.quad(ex.subject0, rdf.ns.rdf.type, rdf.ns.dcat.Dataset, ex.graph1), + rdf.quad(ex.subject0, rdf.ns.rdf.type, rdf.ns.schema.Dataset, ex.graph1), ] const options = { - dateModified: rdf.literal('1999-12-31', xsd.dateTime), + dateModified: rdf.literal('1999-12-31', rdf.ns.xsd.dateTime), } const quadStream = Readable.from(data) const result = [...await applyOptions(quadStream, {}, options)] @@ -145,13 +143,13 @@ describe('applyOptions', () => { strictEqual(result.length, 4) strictEqual(result[0].equals(data[0]), true) strictEqual(result[1].equals(data[1]), true) - strictEqual(result[2].equals(rdf.quad(ex.subject0, ns.dcterms.modified, rdf.literal('1999-12-31', xsd.dateTime))), true) - strictEqual(result[3].equals(rdf.quad(ex.subject0, ns.schema.dateModified, rdf.literal('1999-12-31', xsd.dateTime))), true) + strictEqual(result[2].equals(rdf.quad(ex.subject0, rdf.ns.dcterms.modified, rdf.literal('1999-12-31', rdf.ns.xsd.dateTime))), true) + strictEqual(result[3].equals(rdf.quad(ex.subject0, rdf.ns.schema.dateModified, rdf.literal('1999-12-31', rdf.ns.xsd.dateTime))), true) }) it('should update or append schema:dateModified for known (string)', async () => { const data = [ - rdf.quad(ex.subject0, ns.rdf.type, ns.schema.Dataset, ex.graph1), + rdf.quad(ex.subject0, rdf.ns.rdf.type, rdf.ns.schema.Dataset, ex.graph1), ] const options = { @@ -162,20 +160,20 @@ describe('applyOptions', () => { strictEqual(result.length, 2) strictEqual(result[0].equals(data[0]), true) - expect(result[1]).to.deep.equal(rdf.quad(ex.subject0, ns.schema.dateModified, rdf.literal('1999-12-31', xsd.dateTime))) + expect(result[1]).to.deep.equal(rdf.quad(ex.subject0, rdf.ns.schema.dateModified, rdf.literal('1999-12-31', rdf.ns.xsd.dateTime))) }) it('should set the corresponding graph', async () => { const data = [ - rdf.quad(ex.subject0, ns.rdf.type, ns.schema.Dataset, ex.graph1), - rdf.quad(ex.subject0, ns.schema.dateModified, rdf.literal('Not me'), ex.graph0), - rdf.quad(ex.subject1, ns.rdf.type, ex.type1, ex.graph0), - rdf.quad(ex.subject3, ns.rdf.type, ns.schema.Dataset, ex.graph0), + rdf.quad(ex.subject0, rdf.ns.rdf.type, rdf.ns.schema.Dataset, ex.graph1), + rdf.quad(ex.subject0, rdf.ns.schema.dateModified, rdf.literal('Not me'), ex.graph0), + rdf.quad(ex.subject1, rdf.ns.rdf.type, ex.type1, ex.graph0), + rdf.quad(ex.subject3, rdf.ns.rdf.type, rdf.ns.schema.Dataset, ex.graph0), ] const options = { graph: ex.graph2, - dateModified: rdf.literal('1999-12-31', xsd.dateTime), + dateModified: rdf.literal('1999-12-31', rdf.ns.xsd.dateTime), } const quadStream = Readable.from(data) const result = [...await applyOptions(quadStream, {}, options)] @@ -190,7 +188,7 @@ describe('applyOptions', () => { it('should set the corresponding graph (string)', async () => { const data = [ - rdf.quad(ex.subject0, ns.rdf.type, ns.schema.Dataset, ex.graph1), + rdf.quad(ex.subject0, rdf.ns.rdf.type, rdf.ns.schema.Dataset, ex.graph1), ] const options = { diff --git a/packages/rdf/test/open.test.js b/packages/rdf/test/open.test.js index 9ef5a0e0..56287eb9 100644 --- a/packages/rdf/test/open.test.js +++ b/packages/rdf/test/open.test.js @@ -26,6 +26,7 @@ describe('open', function () { const quadStream = sinon.stub().returns('foo') const env = { fetch: async () => ({ + body: Readable.from(''), quadStream, }), } diff --git a/packages/rdf/test/setGraph.test.js b/packages/rdf/test/setGraph.test.js index 9004eba3..864dd6f8 100644 --- a/packages/rdf/test/setGraph.test.js +++ b/packages/rdf/test/setGraph.test.js @@ -3,14 +3,12 @@ import getStream from 'get-stream' import { isDuplexStream as isDuplex } from 'is-stream' import rdf from 'barnard59-env' import { Readable } from 'readable-stream' -import setGraph from '../setGraph.js' +import setGraphUnbound from '../setGraph.js' import * as ns from './support/namespaces.js' -describe('setGraph', () => { - it('should be a factory', () => { - strictEqual(typeof setGraph, 'function') - }) +const setGraph = setGraphUnbound.bind({ env: rdf }) +describe('setGraph', () => { it('should return a duplex stream', () => { const stream = setGraph(ns.ex.graph) diff --git a/packages/rdf/test/voidStats.test.js b/packages/rdf/test/voidStats.test.js index 125b2c2b..9b447205 100644 --- a/packages/rdf/test/voidStats.test.js +++ b/packages/rdf/test/voidStats.test.js @@ -1,22 +1,19 @@ -import { equal, strictEqual } from 'assert' +import { strictEqual } from 'node:assert' +import { expect } from 'chai' import assertThrows from 'assert-throws-async' import getStream from 'get-stream' import { isDuplexStream as isDuplex } from 'is-stream' import rdf from 'barnard59-env' import { Readable } from 'readable-stream' -import toCanonical from 'rdf-dataset-ext/toCanonical.js' -import * as ns from '../lib/namespaces.js' -import voidStats from '../lib/voidStats.js' +import voidStatsUnbound from '../lib/voidStats.js' + +const voidStats = voidStatsUnbound.bind({ env: rdf }) const ex = rdf.namespace('http://example.org/') /** * https://www.w3.org/TR/void/#statistics */ describe('metadata.voidStats', () => { - it('should be a factory', () => { - strictEqual(typeof voidStats, 'function') - }) - it('throws an error if no argument is given', async () => { await assertThrows(async () => { await voidStats() @@ -33,15 +30,15 @@ describe('metadata.voidStats', () => { it('includes counts at the end of the stream', async () => { const data = [ - rdf.quad(ex.bob, ns.rdf.type, ex.Person), - rdf.quad(ex.alice, ns.rdf.type, ex.Person), + rdf.quad(ex.bob, rdf.ns.rdf.type, ex.Person), + rdf.quad(ex.alice, rdf.ns.rdf.type, ex.Person), rdf.quad(ex.bob, ex.knows, ex.alice), rdf.quad(ex.alice, ex.name, rdf.literal('Alice')), ] const expectedMetadata = [ - rdf.quad(ex.dataset, ns.rdf.type, ns._void.Dataset), - rdf.quad(ex.dataset, ns._void.triples, rdf.literal('4', ns.xsd.integer)), - rdf.quad(ex.dataset, ns._void.entities, rdf.literal('2', ns.xsd.integer)), + rdf.quad(ex.dataset, rdf.ns.rdf.type, rdf.ns._void.Dataset), + rdf.quad(ex.dataset, rdf.ns._void.triples, rdf.literal('4', rdf.ns.xsd.integer)), + rdf.quad(ex.dataset, rdf.ns._void.entities, rdf.literal('2', rdf.ns.xsd.integer)), ] const inputStream = Readable.from(data) @@ -51,18 +48,15 @@ describe('metadata.voidStats', () => { const result = await getStream.array(inputStream.pipe(sut)) - equal( - toCanonical(result.slice(4)), - toCanonical(expectedMetadata), - ) + expect(result.slice(4)).to.deep.contain.all.members(expectedMetadata) }) it('returns zero counts for no data', async () => { const data = [] const expectedMetadata = [ - rdf.quad(ex.dataset, ns.rdf.type, ns._void.Dataset), - rdf.quad(ex.dataset, ns._void.triples, rdf.literal('0', ns.xsd.integer)), - rdf.quad(ex.dataset, ns._void.entities, rdf.literal('0', ns.xsd.integer)), + rdf.quad(ex.dataset, rdf.ns.rdf.type, rdf.ns._void.Dataset), + rdf.quad(ex.dataset, rdf.ns._void.triples, rdf.literal('0', rdf.ns.xsd.integer)), + rdf.quad(ex.dataset, rdf.ns._void.entities, rdf.literal('0', rdf.ns.xsd.integer)), ] const inputStream = Readable.from(data) @@ -72,10 +66,7 @@ describe('metadata.voidStats', () => { const result = await getStream.array(inputStream.pipe(sut)) - equal( - toCanonical(result), - toCanonical(expectedMetadata), - ) + expect(result).to.deep.contain.all.members(expectedMetadata) }) it('returns zero counts for 0 classes', async () => { @@ -84,9 +75,9 @@ describe('metadata.voidStats', () => { rdf.quad(ex.alice, ex.name, rdf.literal('Alice')), ] const expectedMetadata = [ - rdf.quad(ex.dataset, ns.rdf.type, ns._void.Dataset), - rdf.quad(ex.dataset, ns._void.triples, rdf.literal('2', ns.xsd.integer)), - rdf.quad(ex.dataset, ns._void.entities, rdf.literal('0', ns.xsd.integer)), + rdf.quad(ex.dataset, rdf.ns.rdf.type, rdf.ns._void.Dataset), + rdf.quad(ex.dataset, rdf.ns._void.triples, rdf.literal('2', rdf.ns.xsd.integer)), + rdf.quad(ex.dataset, rdf.ns._void.entities, rdf.literal('0', rdf.ns.xsd.integer)), ] const inputStream = Readable.from(data) @@ -96,18 +87,15 @@ describe('metadata.voidStats', () => { const result = await getStream.array(inputStream.pipe(sut)) - equal( - toCanonical(result.slice(2)), - toCanonical(expectedMetadata), - ) + expect(result.slice(2)).to.deep.contain.all.members(expectedMetadata) }) it('uses the named-graph given as parameter', async () => { const data = [] const expectedMetadata = [ - rdf.quad(ex.dataset, ns.rdf.type, ns._void.Dataset, ex.metadata), - rdf.quad(ex.dataset, ns._void.triples, rdf.literal('0', ns.xsd.integer), ex.metadata), - rdf.quad(ex.dataset, ns._void.entities, rdf.literal('0', ns.xsd.integer), ex.metadata), + rdf.quad(ex.dataset, rdf.ns.rdf.type, rdf.ns._void.Dataset, ex.metadata), + rdf.quad(ex.dataset, rdf.ns._void.triples, rdf.literal('0', rdf.ns.xsd.integer), ex.metadata), + rdf.quad(ex.dataset, rdf.ns._void.entities, rdf.literal('0', rdf.ns.xsd.integer), ex.metadata), ] const inputStream = Readable.from(data) @@ -118,10 +106,7 @@ describe('metadata.voidStats', () => { const result = await getStream.array(inputStream.pipe(sut)) - equal( - toCanonical(result), - toCanonical(expectedMetadata), - ) + expect(result).to.deep.contain.all.members(expectedMetadata) }) it('does not include total counts with includeTotals: false', async () => { @@ -130,7 +115,7 @@ describe('metadata.voidStats', () => { rdf.quad(ex.alice, ex.name, rdf.literal('Alice')), ] const expectedMetadata = [ - rdf.quad(ex.dataset, ns.rdf.type, ns._void.Dataset), + rdf.quad(ex.dataset, rdf.ns.rdf.type, rdf.ns._void.Dataset), ] const inputStream = Readable.from(data) @@ -141,29 +126,26 @@ describe('metadata.voidStats', () => { const result = await getStream.array(inputStream.pipe(sut)) - equal( - toCanonical(result.slice(2)), - toCanonical(expectedMetadata), - ) + expect(result.slice(2)).to.deep.contain.all.members(expectedMetadata) }) it('describes counts for class partitions', async () => { const data = [ - rdf.quad(ex.a_1, ns.rdf.type, ex.A), - rdf.quad(ex.a_2, ns.rdf.type, ex.A), - rdf.quad(ex.b_1, ns.rdf.type, ex.B), - rdf.quad(ex.c_1, ns.rdf.type, ex.C), + rdf.quad(ex.a_1, rdf.ns.rdf.type, ex.A), + rdf.quad(ex.a_2, rdf.ns.rdf.type, ex.A), + rdf.quad(ex.b_1, rdf.ns.rdf.type, ex.B), + rdf.quad(ex.c_1, rdf.ns.rdf.type, ex.C), ] const partition1 = rdf.namedNode('http://example.org/dataset/classPartition/0') const partition2 = rdf.namedNode('http://example.org/dataset/classPartition/1') const expectedMetadata = [ - rdf.quad(ex.dataset, ns.rdf.type, ns._void.Dataset), - rdf.quad(ex.dataset, ns._void.classPartition, partition1), - rdf.quad(ex.dataset, ns._void.classPartition, partition2), - rdf.quad(partition1, ns._void.class, ex.A), - rdf.quad(partition1, ns._void.entities, rdf.literal('2', ns.xsd.integer)), - rdf.quad(partition2, ns._void.class, ex.C), - rdf.quad(partition2, ns._void.entities, rdf.literal('1', ns.xsd.integer)), + rdf.quad(ex.dataset, rdf.ns.rdf.type, rdf.ns._void.Dataset), + rdf.quad(ex.dataset, rdf.ns._void.classPartition, partition1), + rdf.quad(ex.dataset, rdf.ns._void.classPartition, partition2), + rdf.quad(partition1, rdf.ns._void.class, ex.A), + rdf.quad(partition1, rdf.ns._void.entities, rdf.literal('2', rdf.ns.xsd.integer)), + rdf.quad(partition2, rdf.ns._void.class, ex.C), + rdf.quad(partition2, rdf.ns._void.entities, rdf.literal('1', rdf.ns.xsd.integer)), ] const inputStream = Readable.from(data) @@ -175,10 +157,7 @@ describe('metadata.voidStats', () => { const result = await getStream.array(inputStream.pipe(sut)) - equal( - toCanonical(result.slice(4)), - toCanonical(expectedMetadata), - ) + expect(result.slice(4)).to.deep.contain.all.members(expectedMetadata) }) it('describe counts for class partitions with no matches', async () => { @@ -186,13 +165,13 @@ describe('metadata.voidStats', () => { const partition1 = rdf.namedNode('http://example.org/dataset/classPartition/0') const partition2 = rdf.namedNode('http://example.org/dataset/classPartition/1') const expectedMetadata = [ - rdf.quad(ex.dataset, ns.rdf.type, ns._void.Dataset), - rdf.quad(ex.dataset, ns._void.classPartition, partition1), - rdf.quad(ex.dataset, ns._void.classPartition, partition2), - rdf.quad(partition1, ns._void.class, ex.A), - rdf.quad(partition1, ns._void.entities, rdf.literal('0', ns.xsd.integer)), - rdf.quad(partition2, ns._void.class, ex.C), - rdf.quad(partition2, ns._void.entities, rdf.literal('0', ns.xsd.integer)), + rdf.quad(ex.dataset, rdf.ns.rdf.type, rdf.ns._void.Dataset), + rdf.quad(ex.dataset, rdf.ns._void.classPartition, partition1), + rdf.quad(ex.dataset, rdf.ns._void.classPartition, partition2), + rdf.quad(partition1, rdf.ns._void.class, ex.A), + rdf.quad(partition1, rdf.ns._void.entities, rdf.literal('0', rdf.ns.xsd.integer)), + rdf.quad(partition2, rdf.ns._void.class, ex.C), + rdf.quad(partition2, rdf.ns._void.entities, rdf.literal('0', rdf.ns.xsd.integer)), ] const inputStream = Readable.from(data) @@ -204,10 +183,7 @@ describe('metadata.voidStats', () => { const result = await getStream.array(inputStream.pipe(sut)) - equal( - toCanonical(result), - toCanonical(expectedMetadata), - ) + expect(result).to.deep.contain.all.members(expectedMetadata) }) it('describe counts for property partitions', async () => { @@ -220,13 +196,13 @@ describe('metadata.voidStats', () => { const partition1 = rdf.namedNode('http://example.org/dataset/propertyPartition/0') const partition2 = rdf.namedNode('http://example.org/dataset/propertyPartition/1') const expectedMetadata = [ - rdf.quad(ex.dataset, ns.rdf.type, ns._void.Dataset), - rdf.quad(ex.dataset, ns._void.propertyPartition, partition1), - rdf.quad(ex.dataset, ns._void.propertyPartition, partition2), - rdf.quad(partition1, ns._void.property, ex.p_1), - rdf.quad(partition1, ns._void.entities, rdf.literal('2', ns.xsd.integer)), - rdf.quad(partition2, ns._void.property, ex.p_3), - rdf.quad(partition2, ns._void.entities, rdf.literal('1', ns.xsd.integer)), + rdf.quad(ex.dataset, rdf.ns.rdf.type, rdf.ns._void.Dataset), + rdf.quad(ex.dataset, rdf.ns._void.propertyPartition, partition1), + rdf.quad(ex.dataset, rdf.ns._void.propertyPartition, partition2), + rdf.quad(partition1, rdf.ns._void.property, ex.p_1), + rdf.quad(partition1, rdf.ns._void.entities, rdf.literal('2', rdf.ns.xsd.integer)), + rdf.quad(partition2, rdf.ns._void.property, ex.p_3), + rdf.quad(partition2, rdf.ns._void.entities, rdf.literal('1', rdf.ns.xsd.integer)), ] const inputStream = Readable.from(data) @@ -238,10 +214,7 @@ describe('metadata.voidStats', () => { const result = await getStream.array(inputStream.pipe(sut)) - equal( - toCanonical(result.slice(4)), - toCanonical(expectedMetadata), - ) + expect(result.slice(4)).to.deep.contain.all.members(expectedMetadata) }) it('describe counts for property partitions with no matches', async () => { @@ -249,13 +222,13 @@ describe('metadata.voidStats', () => { const partition1 = rdf.namedNode('http://example.org/dataset/propertyPartition/0') const partition2 = rdf.namedNode('http://example.org/dataset/propertyPartition/1') const expectedMetadata = [ - rdf.quad(ex.dataset, ns.rdf.type, ns._void.Dataset), - rdf.quad(ex.dataset, ns._void.propertyPartition, partition1), - rdf.quad(ex.dataset, ns._void.propertyPartition, partition2), - rdf.quad(partition1, ns._void.property, ex.p_1), - rdf.quad(partition1, ns._void.entities, rdf.literal('0', ns.xsd.integer)), - rdf.quad(partition2, ns._void.property, ex.p_3), - rdf.quad(partition2, ns._void.entities, rdf.literal('0', ns.xsd.integer)), + rdf.quad(ex.dataset, rdf.ns.rdf.type, rdf.ns._void.Dataset), + rdf.quad(ex.dataset, rdf.ns._void.propertyPartition, partition1), + rdf.quad(ex.dataset, rdf.ns._void.propertyPartition, partition2), + rdf.quad(partition1, rdf.ns._void.property, ex.p_1), + rdf.quad(partition1, rdf.ns._void.entities, rdf.literal('0', rdf.ns.xsd.integer)), + rdf.quad(partition2, rdf.ns._void.property, ex.p_3), + rdf.quad(partition2, rdf.ns._void.entities, rdf.literal('0', rdf.ns.xsd.integer)), ] const inputStream = Readable.from(data) @@ -267,18 +240,15 @@ describe('metadata.voidStats', () => { const result = await getStream.array(inputStream.pipe(sut)) - equal( - toCanonical(result), - toCanonical(expectedMetadata), - ) + expect(result).to.deep.contain.all.members(expectedMetadata) }) it('accepts string parameters', async () => { const data = [ - rdf.quad(ex.a_1, ns.rdf.type, ex.A), - rdf.quad(ex.a_2, ns.rdf.type, ex.A), - rdf.quad(ex.b_1, ns.rdf.type, ex.B), - rdf.quad(ex.c_1, ns.rdf.type, ex.C), + rdf.quad(ex.a_1, rdf.ns.rdf.type, ex.A), + rdf.quad(ex.a_2, rdf.ns.rdf.type, ex.A), + rdf.quad(ex.b_1, rdf.ns.rdf.type, ex.B), + rdf.quad(ex.c_1, rdf.ns.rdf.type, ex.C), rdf.quad(ex.a, ex.p_1, ex.b), rdf.quad(ex.a, ex.p_1, ex.b), rdf.quad(ex.a, ex.p_2, ex.b), diff --git a/packages/rdf/tsconfig.json b/packages/rdf/tsconfig.json new file mode 100644 index 00000000..a84667c2 --- /dev/null +++ b/packages/rdf/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "emitDeclarationOnly": true + }, + "files": [ + "fs.js", + "imports.js", + "mapMatch.js", + "members.js", + "metadata.js", + "open.js", + "setGraph.js" + ] +} diff --git a/packages/shacl/CHANGELOG.md b/packages/shacl/CHANGELOG.md index e666777d..210633bc 100644 --- a/packages/shacl/CHANGELOG.md +++ b/packages/shacl/CHANGELOG.md @@ -1,5 +1,27 @@ # barnard59-shacl +## 1.4.1 + +### Patch Changes + +- e82aa36: Remove references of `rdf-js` types package, repaced with `@rdfjs/types` + +## 1.4.0 + +### Minor Changes + +- 452d885: Added `report-summary` command + +## 1.3.1 + +### Patch Changes + +- c090ff2: Updated `rdf-validate-shacl` +- Updated dependencies [82dbe7e] +- Updated dependencies [7456a6a] + - barnard59-rdf@3.4.0 + - barnard59-base@2.4.0 + ## 1.3.0 ### Minor Changes diff --git a/packages/shacl/lib/report.js b/packages/shacl/lib/report.js new file mode 100644 index 00000000..95c1bf0e --- /dev/null +++ b/packages/shacl/lib/report.js @@ -0,0 +1,28 @@ +import termToNt from '@rdfjs/to-ntriples' +import ValidationReport from 'rdf-validate-shacl/src/validation-report.js' + +function validationResultToString(result) { + const severity = result.severity.value.split('#')[1] + const message = result.message.map(m => m.value).join(' ') + const path = termToNt(result.path) + const focusNode = termToNt(result.focusNode) + const sourceConstraintComponent = result.sourceConstraintComponent.value.split('#')[1] + const sourceShape = termToNt(result.sourceShape) + + return `${severity} of ${sourceConstraintComponent}: "${message}" with path ${path} at focus node ${focusNode} (source: ${sourceShape})` +} + +function includeNestedResult(result) { + const nestedResult = Object.keys(result.detail).length ? result.detail.map(includeNestedResult).flat() : [] + return [result].concat(nestedResult).flat() +} + +function getMessages(report) { + return report.results.flatMap(includeNestedResult) + .map(validationResultToString) + .map(message => message + '\n') +} + +export function getSummary(dataset) { + return getMessages(new ValidationReport(this.env.clownface({ dataset }))) +} diff --git a/packages/shacl/manifest.ttl b/packages/shacl/manifest.ttl index 6623f7d7..32b16ed1 100644 --- a/packages/shacl/manifest.ttl +++ b/packages/shacl/manifest.ttl @@ -24,3 +24,11 @@ rdfs:label "Validates the RDF in standard input against a SHACL document" ; b59:source "barnard59-shacl/pipeline/validate.ttl" ; . + + + + a b59:CliCommand ; + b59:command "report-summary" ; + rdfs:label "Human-readable summary of SHACL validation report" ; + b59:source "barnard59-shacl/pipeline/report-summary.ttl" ; +. diff --git a/packages/shacl/package.json b/packages/shacl/package.json index 6cf10b0b..36cda3b4 100644 --- a/packages/shacl/package.json +++ b/packages/shacl/package.json @@ -1,6 +1,6 @@ { "name": "barnard59-shacl", - "version": "1.3.0", + "version": "1.4.1", "description": "A barnard59 step that validates RDF using the Shapes Constraint Language (SHACL).", "type": "module", "main": "index.js", @@ -24,20 +24,20 @@ "homepage": "https://github.com/zazuko/barnard59", "dependencies": { "@rdfjs/fetch": "^3.0.0", - "is-stream": "^3.0.0", - "rdf-validate-shacl": "^0.5.1", - "readable-stream": "3 - 4", - "barnard59-base": "^2.3.0", + "@rdfjs/to-ntriples": "^2.0.0", + "barnard59-base": "^2.4.0", "barnard59-formats": "^2.1.0", - "barnard59-rdf": "^3.3.0" + "barnard59-rdf": "^3.4.0", + "is-stream": "^3.0.0", + "rdf-validate-shacl": "^0.5.3", + "readable-stream": "3 - 4" }, "devDependencies": { - "@rdfjs/to-ntriples": "^2.0.0", - "@tpluscode/rdf-string": "^1.1.0", + "@tpluscode/rdf-string": "^1.1.2", "@types/rdf-validate-shacl": "^0.4.6", "assert-throws-async": "^3.0.0", - "barnard59-core": "^5.3.0", - "barnard59-env": "^1.2.1", + "barnard59-core": "^5.3.2", + "barnard59-env": "^1.2.3", "barnard59-test-support": "*", "chai": "^4.3.4", "express": "^4.18.2", diff --git a/packages/shacl/pipeline/report-summary.ttl b/packages/shacl/pipeline/report-summary.ttl new file mode 100644 index 00000000..3989babe --- /dev/null +++ b/packages/shacl/pipeline/report-summary.ttl @@ -0,0 +1,25 @@ +@prefix code: . +@prefix p: . +@prefix base: . +@prefix n3: . +@prefix rdf: . + +@base . + + a p:Pipeline , p:Readable ; + p:steps + [ + p:stepList ( + [ base:stdin () ] + [ n3:parse () ] + [ rdf:getDataset () ] + [ base:map ([ + a code:EcmaScriptModule ; + code:link + ]) + ] + [ base:flatten () ] + ) + ] +. + diff --git a/packages/shacl/readme.md b/packages/shacl/readme.md index f10c3abe..cfe7249a 100644 --- a/packages/shacl/readme.md +++ b/packages/shacl/readme.md @@ -137,3 +137,12 @@ cat data.ttl | barnard59 shacl validate --shapes https://example.com/shapes.ttl Shapes can also be path relative to the working directory. In cases when a remote address give to `--shapes` option does not include a correct `content-type` header (or does not provide a `content-type` header at all), the pipeline will fail. In such cases, it is possible to use the `--shapesFormat` option to select the correct RDF parser. Its value must be a media type, such as `text/turtle`. + +### report-summary + +Creates a human-readable summary of the machine-readable [standard](https://www.w3.org/TR/shacl/#validation-report) output of the validation pipeline. +```bash +cat data.ttl \ +| barnard59 shacl validate --shapes https://example.com/shapes.ttl \ +| barnard59 shacl report-summary +``` diff --git a/packages/shacl/report.js b/packages/shacl/report.js index 20a60dd0..123062b2 100644 --- a/packages/shacl/report.js +++ b/packages/shacl/report.js @@ -4,7 +4,7 @@ import SHACLValidator from 'rdf-validate-shacl' /** * @this {import('barnard59-core').Context} - * @param {import('rdf-js').DatasetCore} ds + * @param {import('@rdfjs/types').DatasetCore} ds * @param {number | undefined} maxViolations * @param {AsyncIterable} iterable */ diff --git a/packages/shacl/validate.js b/packages/shacl/validate.js index 16f70c6f..2795c22f 100644 --- a/packages/shacl/validate.js +++ b/packages/shacl/validate.js @@ -15,7 +15,7 @@ import { ValidationError } from './lib/errors.js' class ValidateChunk extends Transform { /** * @param {import('barnard59-core').Context} context - * @param {import('rdf-js').DatasetCore} shape + * @param {import('@rdfjs/types').DatasetCore} shape * @param {{ maxErrors?: number, onViolation?: OnViolation }} options */ constructor(context, shape, { maxErrors, onViolation } = {}) { diff --git a/packages/sparql/package.json b/packages/sparql/package.json index 746be0f6..677161b5 100644 --- a/packages/sparql/package.json +++ b/packages/sparql/package.json @@ -24,8 +24,8 @@ "sparql-http-client": "^2.4.0" }, "devDependencies": { - "@tpluscode/rdf-string": "^1.0.3", - "@zazuko/env": "^1.0.0", + "@tpluscode/rdf-string": "^1.1.2", + "@zazuko/env": "^2", "get-stream": "^6.0.0", "is-stream": "^3.0.0", "nock": "^13.1.1" diff --git a/packages/validation/CHANGELOG.md b/packages/validation/CHANGELOG.md index d6150b0c..e84e685d 100644 --- a/packages/validation/CHANGELOG.md +++ b/packages/validation/CHANGELOG.md @@ -1,5 +1,14 @@ # barnard59-validation +## 0.4.2 + +### Patch Changes + +- 9d0ce9f: Improve Windows compatibility (re zazuko/rdf-loader-code#34) +- Updated dependencies [c090ff2] +- Updated dependencies [82dbe7e] + - barnard59-env@1.2.2 + ## 0.4.1 ### Patch Changes diff --git a/packages/validation/package.json b/packages/validation/package.json index 77e8bba6..4d046718 100644 --- a/packages/validation/package.json +++ b/packages/validation/package.json @@ -1,6 +1,6 @@ { "name": "barnard59-validation", - "version": "0.4.1", + "version": "0.4.2", "type": "module", "main": "cli.js", "bin": { @@ -15,8 +15,8 @@ "license": "MIT", "devDependencies": { "@jsdevtools/chai-exec": "^2.1.1", - "barnard59-base": "^2.0.1", - "barnard59-core": "^5.2.0", + "barnard59-base": "^2.4.0", + "barnard59-core": "^5.3.1", "barnard59-formats": "^2.1.0", "chai": "^4.3.0", "deep-equal": "^2.0.5", @@ -34,12 +34,12 @@ "homepage": "https://github.com/zazuko/barnard59", "dependencies": { "@rdfjs/namespace": "^2.0.0", - "barnard59-env": "^1.2.0", + "barnard59-env": "^1.2.2", "anylogger": "^1.0.11", "anylogger-console": "^1.0.0", "chalk": "^4.1.0", "commander": "^11.0.0", - "rdf-loader-code": "^2.1.1" + "rdf-loader-code": "^2.1.3" }, "mocha": { "loader": "esmock" diff --git a/packages/validation/test/parser.test.js b/packages/validation/test/parser.test.js index ead06ebe..c74c3e19 100644 --- a/packages/validation/test/parser.test.js +++ b/packages/validation/test/parser.test.js @@ -1,6 +1,6 @@ -import assert from 'assert' -import path from 'path' -import * as url from 'url' +import assert from 'node:assert' +import path from 'node:path' +import * as url from 'node:url' import iriResolve from 'rdf-loader-code/lib/iriResolve.js' import sinon from 'sinon' import esmock from 'esmock' @@ -110,7 +110,7 @@ describe('parser', () => { 'barnard59-formats': new Set(['node:barnard59-formats#ntriples.serialize']), }, 'file:': { - [path.join(process.cwd(), 'awesomeModule')]: new Set(['file:awesomeModule#awesomeFunction']), + [url.pathToFileURL(path.join(process.cwd(), 'awesomeModule'))]: new Set(['file:awesomeModule#awesomeFunction']), }, } const actual = parser.getDependencies(input, process.cwd()) @@ -273,7 +273,7 @@ describe('parser', () => { it('should get operation properties from manifest.ttl file', async () => { const mockedParser = await esmock('../lib/parser.js', { '../lib/utils.js': { - getManifestPath: sinon.stub().returns('test/fixtures/manifest.ttl'), + getManifestPath: sinon.stub().returns(path.resolve(__dirname, 'fixtures/manifest.ttl')), isModuleInstalled: sinon.stub().returns(true), }, }) @@ -320,7 +320,7 @@ describe('parser', () => { it('should return properties for existing operations, and nulls for nonexisting ones', async () => { const parser = await esmock('../lib/parser.js', { '../lib/utils.js': { - getManifestPath: sinon.stub().returns('test/fixtures/manifest.ttl'), + getManifestPath: sinon.stub().returns(path.resolve(__dirname, 'fixtures/manifest.ttl')), isModuleInstalled: sinon.stub().returns(true), }, }) diff --git a/test/e2e/definitions/code-imports/main.ttl b/test/e2e/definitions/code-imports/main.ttl new file mode 100644 index 00000000..c29e4d44 --- /dev/null +++ b/test/e2e/definitions/code-imports/main.ttl @@ -0,0 +1,22 @@ +@prefix ex: . +@prefix code: . +@prefix p: . +@prefix rdf: . +@prefix base: . + +[ + code:imports <./out-pipeline> ; + code:extension "ttl" ; +] . + +ex: + a p:Pipeline ; + p:steps + [ + p:stepList + ( + [ base:streamValues ( "foo" "bar" ) ] + ex:out + ) + ] ; +. diff --git a/test/e2e/definitions/code-imports/out-pipeline.ttl b/test/e2e/definitions/code-imports/out-pipeline.ttl new file mode 100644 index 00000000..90f32aa9 --- /dev/null +++ b/test/e2e/definitions/code-imports/out-pipeline.ttl @@ -0,0 +1,15 @@ +@base . +@prefix code: . +@prefix p: . +@prefix base: . + + + a p:Pipeline, p:Writable ; + p:steps + [ + p:stepList + ( + [ base:stdout () ] + ) + ] ; +. diff --git a/test/e2e/package.json b/test/e2e/package.json index 442cefc5..354cd184 100644 --- a/test/e2e/package.json +++ b/test/e2e/package.json @@ -7,6 +7,7 @@ "test": "mocha *.test.js" }, "dependencies": { + "@zazuko/rdf-utils-fs": "^3.3.1", "barnard59-base": "^2.3.0", "barnard59-core": "^5.3.0", "barnard59-env": "^1.2.1", @@ -18,8 +19,7 @@ "barnard59-test-support": "^0.0.3", "readable-stream": "^3", "rdf-dataset-ext": "^1.0.1", - "rdf-loader-code": "^2.1.1", - "rdf-utils-fs": "^2.3.0", + "rdf-loader-code": "^2.1.3", "string-to-stream": "^3.0.1" }, "mocha": { diff --git a/test/e2e/pipeline.e2e.test.js b/test/e2e/pipeline.e2e.test.js index b9ac2bf7..a22ce95e 100644 --- a/test/e2e/pipeline.e2e.test.js +++ b/test/e2e/pipeline.e2e.test.js @@ -7,7 +7,7 @@ import { pipelineDefinitionLoader } from 'barnard59-test-support/loadPipelineDef import { expect } from 'chai' import toCanonical from 'rdf-dataset-ext/toCanonical.js' import fromStream from 'rdf-dataset-ext/fromStream.js' -import fromFile from 'rdf-utils-fs/fromFile.js' +import fromFile from '@zazuko/rdf-utils-fs/fromFile.js' import env from 'barnard59-env' import { promisedEcmaScriptLoader, promisedUrlLoader } from './asyncLoaders.js' diff --git a/test/support/loadPipelineDefinition.js b/test/support/loadPipelineDefinition.js index d272cbac..dc60e5fa 100644 --- a/test/support/loadPipelineDefinition.js +++ b/test/support/loadPipelineDefinition.js @@ -1,9 +1,7 @@ import { resolve, dirname } from 'node:path' import * as url from 'node:url' -import rdf from '@zazuko/env' -import fromFile from 'rdf-utils-fs/fromFile.js' +import rdf from '@zazuko/env-node' import namespace from '@rdfjs/namespace' -import fromStream from 'rdf-dataset-ext/fromStream.js' // eslint-disable-next-line import/no-extraneous-dependencies import { desugar as desugarDefinition } from 'barnard59/lib/pipeline.js' @@ -14,8 +12,7 @@ export function pipelineDefinitionLoader(baseUrl, path = 'support/definitions') return async (name, { term = ex(''), logger, desugar = true } = {}) => { const filename = resolve(basePath, `${path}/${name}.ttl`) - const stream = fromFile(filename) - let dataset = await fromStream(rdf.dataset(), stream) + let dataset = await rdf.dataset().import(rdf.fromFile(filename)) if (desugar) { dataset = await desugarDefinition(dataset, { logger, pipelinePath: filename }) } diff --git a/test/support/package.json b/test/support/package.json index 0e1d58c7..e337de12 100644 --- a/test/support/package.json +++ b/test/support/package.json @@ -5,8 +5,6 @@ "type": "module", "dependencies": { "@rdfjs/namespace": "^2.0.0", - "@zazuko/env": "^1.0.1", - "rdf-dataset-ext": "^1.0.1", - "rdf-utils-fs": "^2.3.0" + "@zazuko/env-node": "^2.1.1" } }