diff --git a/.changeset/nine-dogs-flow.md b/.changeset/nine-dogs-flow.md new file mode 100644 index 0000000000..5e9e949b51 --- /dev/null +++ b/.changeset/nine-dogs-flow.md @@ -0,0 +1,5 @@ +--- +'@chainlink/s3-csv-reader-adapter': minor +--- + +security mitigations diff --git a/.pnp.cjs b/.pnp.cjs index 08eb596d55..66464b2dbc 100644 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -8832,13 +8832,13 @@ const RAW_RUNTIME_STATE = ["@chainlink/s3-csv-reader-adapter", "workspace:packages/sources/s3-csv-reader"],\ ["@aws-sdk/client-s3", "npm:3.600.0"],\ ["@chainlink/external-adapter-framework", "npm:1.1.0"],\ - ["@types/jest", "npm:27.5.2"],\ - ["@types/node", "npm:16.11.68"],\ + ["@types/jest", "npm:29.5.12"],\ + ["@types/node", "npm:20.14.10"],\ ["csv-parse", "npm:5.5.6"],\ ["date-fns", "npm:3.6.0"],\ ["nock", "npm:13.5.4"],\ - ["tslib", "npm:2.4.1"],\ - ["typescript", "patch:typescript@npm%3A5.0.4#optional!builtin::version=5.0.4&hash=b5f058"]\ + ["tslib", "npm:2.6.3"],\ + ["typescript", "patch:typescript@npm%3A5.5.3#optional!builtin::version=5.5.3&hash=379a07"]\ ],\ "linkType": "SOFT"\ }]\ @@ -12614,6 +12614,14 @@ const RAW_RUNTIME_STATE = ["jest-get-type", "npm:29.4.3"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:29.7.0", {\ + "packageLocation": "./.yarn/cache/@jest-expect-utils-npm-29.7.0-14740cc487-ef8d379778.zip/node_modules/@jest/expect-utils/",\ + "packageDependencies": [\ + ["@jest/expect-utils", "npm:29.7.0"],\ + ["jest-get-type", "npm:29.6.3"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@jest/fake-timers", [\ @@ -12698,6 +12706,14 @@ const RAW_RUNTIME_STATE = ["@sinclair/typebox", "npm:0.25.24"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:29.6.3", {\ + "packageLocation": "./.yarn/cache/@jest-schemas-npm-29.6.3-292730e442-910040425f.zip/node_modules/@jest/schemas/",\ + "packageDependencies": [\ + ["@jest/schemas", "npm:29.6.3"],\ + ["@sinclair/typebox", "npm:0.27.8"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@jest/source-map", [\ @@ -12787,6 +12803,19 @@ const RAW_RUNTIME_STATE = ["chalk", "npm:4.1.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:29.6.3", {\ + "packageLocation": "./.yarn/cache/@jest-types-npm-29.6.3-a584ca999d-f74bf512fd.zip/node_modules/@jest/types/",\ + "packageDependencies": [\ + ["@jest/types", "npm:29.6.3"],\ + ["@jest/schemas", "npm:29.6.3"],\ + ["@types/istanbul-lib-coverage", "npm:2.0.4"],\ + ["@types/istanbul-reports", "npm:3.0.1"],\ + ["@types/node", "npm:18.8.3"],\ + ["@types/yargs", "npm:17.0.24"],\ + ["chalk", "npm:4.1.2"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@jridgewell/gen-mapping", [\ @@ -14819,6 +14848,13 @@ const RAW_RUNTIME_STATE = ["@sinclair/typebox", "npm:0.25.24"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:0.27.8", {\ + "packageLocation": "./.yarn/cache/@sinclair-typebox-npm-0.27.8-23e206d653-297f95ff77.zip/node_modules/@sinclair/typebox/",\ + "packageDependencies": [\ + ["@sinclair/typebox", "npm:0.27.8"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@sindresorhus/is", [\ @@ -16311,6 +16347,15 @@ const RAW_RUNTIME_STATE = ["pretty-format", "npm:27.5.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:29.5.12", {\ + "packageLocation": "./.yarn/cache/@types-jest-npm-29.5.12-6459b9d012-312e8dcf92.zip/node_modules/@types/jest/",\ + "packageDependencies": [\ + ["@types/jest", "npm:29.5.12"],\ + ["expect", "npm:29.7.0"],\ + ["pretty-format", "npm:29.7.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@types/json-bigint", [\ @@ -16492,13 +16537,6 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "HARD"\ }],\ - ["npm:16.11.68", {\ - "packageLocation": "./.yarn/cache/@types-node-npm-16.11.68-c2f2ea9840-7906b0fe63.zip/node_modules/@types/node/",\ - "packageDependencies": [\ - ["@types/node", "npm:16.11.68"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:16.18.96", {\ "packageLocation": "./.yarn/cache/@types-node-npm-16.18.96-43ecb971a5-6b6d1250c7.zip/node_modules/@types/node/",\ "packageDependencies": [\ @@ -16520,6 +16558,14 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "HARD"\ }],\ + ["npm:20.14.10", {\ + "packageLocation": "./.yarn/cache/@types-node-npm-20.14.10-5efcbc9009-672892cf94.zip/node_modules/@types/node/",\ + "packageDependencies": [\ + ["@types/node", "npm:20.14.10"],\ + ["undici-types", "npm:5.26.5"]\ + ],\ + "linkType": "HARD"\ + }],\ ["npm:8.10.66", {\ "packageLocation": "./.yarn/cache/@types-node-npm-8.10.66-b849acaf16-49a93cbeec.zip/node_modules/@types/node/",\ "packageDependencies": [\ @@ -22018,6 +22064,13 @@ const RAW_RUNTIME_STATE = ["diff-sequences", "npm:29.4.3"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:29.6.3", {\ + "packageLocation": "./.yarn/cache/diff-sequences-npm-29.6.3-18ab2c9949-179daf9d2f.zip/node_modules/diff-sequences/",\ + "packageDependencies": [\ + ["diff-sequences", "npm:29.6.3"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["dir-glob", [\ @@ -23649,6 +23702,18 @@ const RAW_RUNTIME_STATE = ["jest-util", "npm:29.5.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:29.7.0", {\ + "packageLocation": "./.yarn/cache/expect-npm-29.7.0-62e9f7979e-63f97bc51f.zip/node_modules/expect/",\ + "packageDependencies": [\ + ["expect", "npm:29.7.0"],\ + ["@jest/expect-utils", "npm:29.7.0"],\ + ["jest-get-type", "npm:29.6.3"],\ + ["jest-matcher-utils", "npm:29.7.0"],\ + ["jest-message-util", "npm:29.7.0"],\ + ["jest-util", "npm:29.7.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["express", [\ @@ -28983,6 +29048,17 @@ const RAW_RUNTIME_STATE = ["pretty-format", "npm:29.5.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:29.7.0", {\ + "packageLocation": "./.yarn/cache/jest-diff-npm-29.7.0-0149e01930-6f3a7eb9cd.zip/node_modules/jest-diff/",\ + "packageDependencies": [\ + ["jest-diff", "npm:29.7.0"],\ + ["chalk", "npm:4.1.2"],\ + ["diff-sequences", "npm:29.6.3"],\ + ["jest-get-type", "npm:29.6.3"],\ + ["pretty-format", "npm:29.7.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["jest-docblock", [\ @@ -29038,6 +29114,13 @@ const RAW_RUNTIME_STATE = ["jest-get-type", "npm:29.4.3"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:29.6.3", {\ + "packageLocation": "./.yarn/cache/jest-get-type-npm-29.6.3-500477292e-88ac9102d4.zip/node_modules/jest-get-type/",\ + "packageDependencies": [\ + ["jest-get-type", "npm:29.6.3"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["jest-haste-map", [\ @@ -29094,6 +29177,17 @@ const RAW_RUNTIME_STATE = ["pretty-format", "npm:29.5.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:29.7.0", {\ + "packageLocation": "./.yarn/cache/jest-matcher-utils-npm-29.7.0-dfc74b630e-981904a494.zip/node_modules/jest-matcher-utils/",\ + "packageDependencies": [\ + ["jest-matcher-utils", "npm:29.7.0"],\ + ["chalk", "npm:4.1.2"],\ + ["jest-diff", "npm:29.7.0"],\ + ["jest-get-type", "npm:29.6.3"],\ + ["pretty-format", "npm:29.7.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["jest-message-util", [\ @@ -29112,6 +29206,22 @@ const RAW_RUNTIME_STATE = ["stack-utils", "npm:2.0.5"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:29.7.0", {\ + "packageLocation": "./.yarn/cache/jest-message-util-npm-29.7.0-7f88b6e8d1-31d53c6ed2.zip/node_modules/jest-message-util/",\ + "packageDependencies": [\ + ["jest-message-util", "npm:29.7.0"],\ + ["@babel/code-frame", "npm:7.18.6"],\ + ["@jest/types", "npm:29.6.3"],\ + ["@types/stack-utils", "npm:2.0.1"],\ + ["chalk", "npm:4.1.2"],\ + ["graceful-fs", "npm:4.2.10"],\ + ["micromatch", "npm:4.0.5"],\ + ["pretty-format", "npm:29.7.0"],\ + ["slash", "npm:3.0.0"],\ + ["stack-utils", "npm:2.0.5"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["jest-mock", [\ @@ -29305,6 +29415,19 @@ const RAW_RUNTIME_STATE = ["picomatch", "npm:2.3.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:29.7.0", {\ + "packageLocation": "./.yarn/cache/jest-util-npm-29.7.0-ff1d59714b-30d58af696.zip/node_modules/jest-util/",\ + "packageDependencies": [\ + ["jest-util", "npm:29.7.0"],\ + ["@jest/types", "npm:29.6.3"],\ + ["@types/node", "npm:18.8.3"],\ + ["chalk", "npm:4.1.2"],\ + ["ci-info", "npm:3.4.0"],\ + ["graceful-fs", "npm:4.2.10"],\ + ["picomatch", "npm:2.3.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["jest-validate", [\ @@ -34937,6 +35060,16 @@ const RAW_RUNTIME_STATE = ["react-is", "npm:18.2.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:29.7.0", {\ + "packageLocation": "./.yarn/cache/pretty-format-npm-29.7.0-7d330b2ea2-dea96bc83c.zip/node_modules/pretty-format/",\ + "packageDependencies": [\ + ["pretty-format", "npm:29.7.0"],\ + ["@jest/schemas", "npm:29.6.3"],\ + ["ansi-styles", "npm:5.2.0"],\ + ["react-is", "npm:18.2.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["private-ip", [\ @@ -39671,6 +39804,13 @@ const RAW_RUNTIME_STATE = ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ ],\ "linkType": "HARD"\ + }],\ + ["patch:typescript@npm%3A5.5.3#optional!builtin::version=5.5.3&hash=379a07", {\ + "packageLocation": "./.yarn/cache/typescript-patch-9fde7bec60-7cf7acb78a.zip/node_modules/typescript/",\ + "packageDependencies": [\ + ["typescript", "patch:typescript@npm%3A5.5.3#optional!builtin::version=5.5.3&hash=379a07"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["typical", [\ @@ -39748,6 +39888,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["undici-types", [\ + ["npm:5.26.5", {\ + "packageLocation": "./.yarn/cache/undici-types-npm-5.26.5-de4f7c7bb9-0097779d94.zip/node_modules/undici-types/",\ + "packageDependencies": [\ + ["undici-types", "npm:5.26.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["unicode-canonical-property-names-ecmascript", [\ ["npm:2.0.0", {\ "packageLocation": "./.yarn/cache/unicode-canonical-property-names-ecmascript-npm-2.0.0-d2d8554a14-39be078afd.zip/node_modules/unicode-canonical-property-names-ecmascript/",\ diff --git a/.yarn/cache/@jest-expect-utils-npm-29.7.0-14740cc487-ef8d379778.zip b/.yarn/cache/@jest-expect-utils-npm-29.7.0-14740cc487-ef8d379778.zip new file mode 100644 index 0000000000..ef177749b9 Binary files /dev/null and b/.yarn/cache/@jest-expect-utils-npm-29.7.0-14740cc487-ef8d379778.zip differ diff --git a/.yarn/cache/@jest-schemas-npm-29.6.3-292730e442-910040425f.zip b/.yarn/cache/@jest-schemas-npm-29.6.3-292730e442-910040425f.zip new file mode 100644 index 0000000000..ce56da4513 Binary files /dev/null and b/.yarn/cache/@jest-schemas-npm-29.6.3-292730e442-910040425f.zip differ diff --git a/.yarn/cache/@jest-types-npm-29.6.3-a584ca999d-f74bf512fd.zip b/.yarn/cache/@jest-types-npm-29.6.3-a584ca999d-f74bf512fd.zip new file mode 100644 index 0000000000..2ac5bed3c6 Binary files /dev/null and b/.yarn/cache/@jest-types-npm-29.6.3-a584ca999d-f74bf512fd.zip differ diff --git a/.yarn/cache/@sinclair-typebox-npm-0.27.8-23e206d653-297f95ff77.zip b/.yarn/cache/@sinclair-typebox-npm-0.27.8-23e206d653-297f95ff77.zip new file mode 100644 index 0000000000..471c008b21 Binary files /dev/null and b/.yarn/cache/@sinclair-typebox-npm-0.27.8-23e206d653-297f95ff77.zip differ diff --git a/.yarn/cache/@types-jest-npm-29.5.12-6459b9d012-312e8dcf92.zip b/.yarn/cache/@types-jest-npm-29.5.12-6459b9d012-312e8dcf92.zip new file mode 100644 index 0000000000..3b867eeb6c Binary files /dev/null and b/.yarn/cache/@types-jest-npm-29.5.12-6459b9d012-312e8dcf92.zip differ diff --git a/.yarn/cache/@types-node-npm-16.11.68-c2f2ea9840-7906b0fe63.zip b/.yarn/cache/@types-node-npm-16.11.68-c2f2ea9840-7906b0fe63.zip deleted file mode 100644 index e8362653d0..0000000000 Binary files a/.yarn/cache/@types-node-npm-16.11.68-c2f2ea9840-7906b0fe63.zip and /dev/null differ diff --git a/.yarn/cache/@types-node-npm-20.14.10-5efcbc9009-672892cf94.zip b/.yarn/cache/@types-node-npm-20.14.10-5efcbc9009-672892cf94.zip new file mode 100644 index 0000000000..48a81d311e Binary files /dev/null and b/.yarn/cache/@types-node-npm-20.14.10-5efcbc9009-672892cf94.zip differ diff --git a/.yarn/cache/diff-sequences-npm-29.6.3-18ab2c9949-179daf9d2f.zip b/.yarn/cache/diff-sequences-npm-29.6.3-18ab2c9949-179daf9d2f.zip new file mode 100644 index 0000000000..03fe8b077c Binary files /dev/null and b/.yarn/cache/diff-sequences-npm-29.6.3-18ab2c9949-179daf9d2f.zip differ diff --git a/.yarn/cache/expect-npm-29.7.0-62e9f7979e-63f97bc51f.zip b/.yarn/cache/expect-npm-29.7.0-62e9f7979e-63f97bc51f.zip new file mode 100644 index 0000000000..b292f78fa8 Binary files /dev/null and b/.yarn/cache/expect-npm-29.7.0-62e9f7979e-63f97bc51f.zip differ diff --git a/.yarn/cache/jest-diff-npm-29.7.0-0149e01930-6f3a7eb9cd.zip b/.yarn/cache/jest-diff-npm-29.7.0-0149e01930-6f3a7eb9cd.zip new file mode 100644 index 0000000000..0c268e5ea4 Binary files /dev/null and b/.yarn/cache/jest-diff-npm-29.7.0-0149e01930-6f3a7eb9cd.zip differ diff --git a/.yarn/cache/jest-get-type-npm-29.6.3-500477292e-88ac9102d4.zip b/.yarn/cache/jest-get-type-npm-29.6.3-500477292e-88ac9102d4.zip new file mode 100644 index 0000000000..8afbbd1b39 Binary files /dev/null and b/.yarn/cache/jest-get-type-npm-29.6.3-500477292e-88ac9102d4.zip differ diff --git a/.yarn/cache/jest-matcher-utils-npm-29.7.0-dfc74b630e-981904a494.zip b/.yarn/cache/jest-matcher-utils-npm-29.7.0-dfc74b630e-981904a494.zip new file mode 100644 index 0000000000..b8edc33f66 Binary files /dev/null and b/.yarn/cache/jest-matcher-utils-npm-29.7.0-dfc74b630e-981904a494.zip differ diff --git a/.yarn/cache/jest-message-util-npm-29.7.0-7f88b6e8d1-31d53c6ed2.zip b/.yarn/cache/jest-message-util-npm-29.7.0-7f88b6e8d1-31d53c6ed2.zip new file mode 100644 index 0000000000..770cff6a17 Binary files /dev/null and b/.yarn/cache/jest-message-util-npm-29.7.0-7f88b6e8d1-31d53c6ed2.zip differ diff --git a/.yarn/cache/jest-util-npm-29.7.0-ff1d59714b-30d58af696.zip b/.yarn/cache/jest-util-npm-29.7.0-ff1d59714b-30d58af696.zip new file mode 100644 index 0000000000..af20ef41ff Binary files /dev/null and b/.yarn/cache/jest-util-npm-29.7.0-ff1d59714b-30d58af696.zip differ diff --git a/.yarn/cache/pretty-format-npm-29.7.0-7d330b2ea2-dea96bc83c.zip b/.yarn/cache/pretty-format-npm-29.7.0-7d330b2ea2-dea96bc83c.zip new file mode 100644 index 0000000000..dc231885fc Binary files /dev/null and b/.yarn/cache/pretty-format-npm-29.7.0-7d330b2ea2-dea96bc83c.zip differ diff --git a/.yarn/cache/typescript-npm-5.5.3-9d4a463231-11a8673124.zip b/.yarn/cache/typescript-npm-5.5.3-9d4a463231-11a8673124.zip new file mode 100644 index 0000000000..2d22931161 Binary files /dev/null and b/.yarn/cache/typescript-npm-5.5.3-9d4a463231-11a8673124.zip differ diff --git a/.yarn/cache/typescript-patch-9fde7bec60-7cf7acb78a.zip b/.yarn/cache/typescript-patch-9fde7bec60-7cf7acb78a.zip new file mode 100644 index 0000000000..6fcedb56ee Binary files /dev/null and b/.yarn/cache/typescript-patch-9fde7bec60-7cf7acb78a.zip differ diff --git a/.yarn/cache/undici-types-npm-5.26.5-de4f7c7bb9-0097779d94.zip b/.yarn/cache/undici-types-npm-5.26.5-de4f7c7bb9-0097779d94.zip new file mode 100644 index 0000000000..194c916e9f Binary files /dev/null and b/.yarn/cache/undici-types-npm-5.26.5-de4f7c7bb9-0097779d94.zip differ diff --git a/packages/sources/s3-csv-reader/README.md b/packages/sources/s3-csv-reader/README.md index 0fee704820..e1eee6e6ac 100644 --- a/packages/sources/s3-csv-reader/README.md +++ b/packages/sources/s3-csv-reader/README.md @@ -31,14 +31,14 @@ There are no rate limits for this adapter. ### Input Params -| Required? | Name | Aliases | Description | Type | Options | Default | Depends On | Not Valid With | -| :-------: | :-----------: | :----------: | :---------------------------------------------------------------------------------------------------------------: | :----: | :-----: | :-----: | :--------: | :------------: | -| ✅ | bucket | | The S3 bucket to query | string | | | | | -| ✅ | keyPrefix | `pathPrefix` | The path prefix of the file stored in S3. is appended to search for older files. | string | | | | | -| ✅ | headerRow | | The 1-indexed row of the CSV file that contains the column headers | number | | | | | -| ✅ | matcherColumn | | The column field to compare with the matcherValue | string | | | | | -| ✅ | matcherValue | | The value to match with matcherField | string | | | | | -| ✅ | resultColumn | | The column of the CSV file to return a result for, where the row value for matcherColumn is equal to matcherValue | string | | | | | +| Required? | Name | Aliases | Description | Type | Options | Default | Depends On | Not Valid With | +| :-------: | :-----------: | :----------: | :--------------------------------------------------------------------------------------------------------------------------------------: | :----: | :-----: | :-----: | :--------: | :------------: | +| ✅ | bucket | | The S3 bucket to query | string | | | | | +| ✅ | keyPrefix | `pathPrefix` | The path prefix of the file stored in S3. Will be prefixed onto .csv to search for older files, e.g. 'path/prefix-01-02-2024.csv'. | string | | | | | +| ✅ | headerRow | | The 1-indexed row of the CSV file that contains the column headers | number | | | | | +| ✅ | matcherColumn | | The column field to compare with the matcherValue | string | | | | | +| ✅ | matcherValue | | The value to match with matcherField | string | | | | | +| ✅ | resultColumn | | The column of the CSV file to return a result for, where the row value for matcherColumn is equal to matcherValue | string | | | | | ### Example @@ -48,7 +48,7 @@ Request: { "data": { "endpoint": "csv", - "bucket": "s3_bucket", + "bucket": "s3-bucket", "keyPrefix": "path/to/file", "headerRow": 2, "matcherColumn": "matcherColumn", diff --git a/packages/sources/s3-csv-reader/package.json b/packages/sources/s3-csv-reader/package.json index 948af15905..0b3024ab4d 100644 --- a/packages/sources/s3-csv-reader/package.json +++ b/packages/sources/s3-csv-reader/package.json @@ -28,16 +28,16 @@ "start": "yarn server:dist" }, "devDependencies": { - "@types/jest": "27.5.2", - "@types/node": "16.11.68", + "@types/jest": "29.5.12", + "@types/node": "20.14.10", "nock": "13.5.4", - "typescript": "5.0.4" + "typescript": "5.5.3" }, "dependencies": { "@aws-sdk/client-s3": "^3.600.0", "@chainlink/external-adapter-framework": "1.1.0", "csv-parse": "5.5.6", "date-fns": "3.6.0", - "tslib": "2.4.1" + "tslib": "2.6.3" } } diff --git a/packages/sources/s3-csv-reader/src/endpoint/csv.ts b/packages/sources/s3-csv-reader/src/endpoint/csv.ts index 8ed62b85a5..34b6c2c507 100644 --- a/packages/sources/s3-csv-reader/src/endpoint/csv.ts +++ b/packages/sources/s3-csv-reader/src/endpoint/csv.ts @@ -1,9 +1,17 @@ import { AdapterEndpoint } from '@chainlink/external-adapter-framework/adapter' import { InputParameters } from '@chainlink/external-adapter-framework/validation' -import { SingleNumberResultResponse } from '@chainlink/external-adapter-framework/util' +import { + AdapterRequest, + SingleNumberResultResponse, +} from '@chainlink/external-adapter-framework/util' import { config } from '../config' import overrides from '../config/overrides.json' import { transport } from '../transport/csv' +import { + AdapterError, + AdapterInputError, +} from '@chainlink/external-adapter-framework/validation/error' +import { isValidBucket, isValidKeyPrefix } from '../transport/s3utils' export const inputParameters = new InputParameters( { @@ -43,7 +51,7 @@ export const inputParameters = new InputParameters( }, [ { - bucket: 's3_bucket', + bucket: 's3-bucket', keyPrefix: 'path/to/file', headerRow: 2, matcherColumn: 'matcherColumn', @@ -59,9 +67,32 @@ export type BaseEndpointTypes = { Settings: typeof config.settings } +export function customInputValidation( + req: AdapterRequest, +): AdapterError | undefined { + const { bucket, keyPrefix } = req.requestContext.data + + if (!isValidBucket(bucket)) { + throw new AdapterInputError({ + statusCode: 400, + message: `Error: bucket contains invalid input characters`, + }) + } + + // all chars in the string must match one in KEY_PREFIX_REGEX + if (!isValidKeyPrefix(keyPrefix)) { + throw new AdapterInputError({ + statusCode: 400, + message: `Error: keyPrefix contains invalid input characters`, + }) + } + return +} + export const endpoint = new AdapterEndpoint({ name: 'csv', transport: transport, inputParameters, + customInputValidation, overrides: overrides['s3-csv-reader'], }) diff --git a/packages/sources/s3-csv-reader/src/transport/csv.ts b/packages/sources/s3-csv-reader/src/transport/csv.ts index 4b77279d45..219dff7663 100644 --- a/packages/sources/s3-csv-reader/src/transport/csv.ts +++ b/packages/sources/s3-csv-reader/src/transport/csv.ts @@ -133,18 +133,10 @@ export class S3PollerTransport extends SubscriptionTransport { const parsedHeaderRow = parsed[0] // validate CSV contains headers matcherColumn and resultColumn if (!(matcherColumn in parsedHeaderRow)) { - throw new Error( - `CSV file does not contain matcherColumn header ${matcherColumn}, got [${Object.keys( - parsedHeaderRow, - ).join(', ')}]`, - ) + throw new Error(`CSV file does not contain matcherColumn header ${matcherColumn}`) } if (!(resultColumn in parsedHeaderRow)) { - throw new Error( - `CSV file does not contain resultColumn header ${resultColumn}, got [${Object.keys( - parsedHeaderRow, - ).join(', ')}]`, - ) + throw new Error(`CSV file does not contain resultColumn header ${resultColumn}`) } // find correct row using matcher diff --git a/packages/sources/s3-csv-reader/src/transport/s3utils.ts b/packages/sources/s3-csv-reader/src/transport/s3utils.ts index 06f8e88e52..03bd6bd880 100644 --- a/packages/sources/s3-csv-reader/src/transport/s3utils.ts +++ b/packages/sources/s3-csv-reader/src/transport/s3utils.ts @@ -11,6 +11,27 @@ const logger = makeLogger('s3utils') // Note: any issues with S3 calls may be related to credentials. // Ensure policy is set up or CLI login is functional with > aws s3 ls +const KEY_PREFIX_REGEX = /^[0-9a-zA-Z!\-_.*'()/]+$/ +const KEY_PREFIX_INVALID = ['../'] + +const BUCKET_REGEX = /^[0-9a-z\-.]+$/ +const BUCKET_INVALID = ['..'] + +export function isValidBucket(bucketName: string): boolean { + return ( + BUCKET_REGEX.test(bucketName) && + !BUCKET_INVALID.some((invalidSubstring) => bucketName.includes(invalidSubstring)) + ) +} + +export function isValidKeyPrefix(keyPrefix: string): boolean { + // all chars in the string must match one in KEY_PREFIX_REGEX + return ( + KEY_PREFIX_REGEX.test(keyPrefix) && + !KEY_PREFIX_INVALID.some((invalidSubstring) => keyPrefix.includes(invalidSubstring)) + ) +} + export async function bucketExistsS3(s3Client: S3Client, bucket: string): Promise { const command = new HeadBucketCommand({ Bucket: bucket, diff --git a/packages/sources/s3-csv-reader/test/integration/__snapshots__/adapter.test.ts.snap b/packages/sources/s3-csv-reader/test/integration/__snapshots__/adapter.test.ts.snap index 1aff2cbd0b..13fa42af6e 100644 --- a/packages/sources/s3-csv-reader/test/integration/__snapshots__/adapter.test.ts.snap +++ b/packages/sources/s3-csv-reader/test/integration/__snapshots__/adapter.test.ts.snap @@ -1,5 +1,27 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`execute csv endpoint should return 400 for invalid bucket name 1`] = ` +{ + "error": { + "message": "Error: bucket contains invalid input characters", + "name": "AdapterError", + }, + "status": "errored", + "statusCode": 400, +} +`; + +exports[`execute csv endpoint should return 400 for invalid keyPrefix name 1`] = ` +{ + "error": { + "message": "Error: keyPrefix contains invalid input characters", + "name": "AdapterError", + }, + "status": "errored", + "statusCode": 400, +} +`; + exports[`execute csv endpoint should return error for empty CSV file 1`] = ` { "errorMessage": "CSV file is empty", @@ -24,7 +46,7 @@ exports[`execute csv endpoint should return error for invalid CSV file 1`] = ` exports[`execute csv endpoint should return error for invalid matcher column 1`] = ` { - "errorMessage": "CSV file does not contain matcherColumn header Invalid, got [Name, Value, Other]", + "errorMessage": "CSV file does not contain matcherColumn header Invalid", "statusCode": 502, "timestamps": { "providerDataReceivedUnixMs": 0, @@ -46,7 +68,7 @@ exports[`execute csv endpoint should return error for invalid matcher value 1`] exports[`execute csv endpoint should return error for invalid result column 1`] = ` { - "errorMessage": "CSV file does not contain resultColumn header Invalid, got [Name, Value, Other]", + "errorMessage": "CSV file does not contain resultColumn header Invalid", "statusCode": 502, "timestamps": { "providerDataReceivedUnixMs": 0, @@ -57,7 +79,7 @@ exports[`execute csv endpoint should return error for invalid result column 1`] exports[`execute csv endpoint should return error for unrecognised bucket 1`] = ` { - "errorMessage": "The specified bucket incorrect_s3_bucket does not exist", + "errorMessage": "The specified bucket incorrect-s3-bucket does not exist", "statusCode": 502, "timestamps": { "providerDataReceivedUnixMs": 0, diff --git a/packages/sources/s3-csv-reader/test/integration/adapter.test.ts b/packages/sources/s3-csv-reader/test/integration/adapter.test.ts index 8a4a13cb99..800754728a 100644 --- a/packages/sources/s3-csv-reader/test/integration/adapter.test.ts +++ b/packages/sources/s3-csv-reader/test/integration/adapter.test.ts @@ -11,7 +11,7 @@ jest.mock('@aws-sdk/client-s3', () => { return { send: jest.fn().mockImplementation(async (command) => { if (command.constructor.name === 'GetObjectCommand') { - if (command.input.Bucket == 's3_bucket') { + if (command.input.Bucket == 's3-bucket') { if (command.input.Key == 'correct/path/file-01-01-2001.csv') { return { Body: { @@ -58,7 +58,7 @@ jest.mock('@aws-sdk/client-s3', () => { throw new Error('Error: The specified key does not exist.') } } else if (command.constructor.name === 'HeadBucketCommand') { - if (command.input.Bucket == 's3_bucket') { + if (command.input.Bucket == 's3-bucket') { return true } throw new Error(`The specified bucket ${command.input.Bucket} does not exist.`) @@ -108,7 +108,7 @@ describe('execute', () => { it('should return success', async () => { const request = { endpoint: 'csv', - bucket: 's3_bucket', + bucket: 's3-bucket', keyPrefix: 'correct/path/file', headerRow: 2, resultColumn: 'Value', @@ -122,10 +122,44 @@ describe('execute', () => { expect(response.json()).toMatchSnapshot() }) + it('should return 400 for invalid bucket name', async () => { + const request = { + endpoint: 'csv', + bucket: 'invalid_s3_bucket#$%^', + keyPrefix: 'incorrect/path/file', + headerRow: 2, + resultColumn: 'Value', + matcherColumn: 'Name', + matcherValue: 'RowTwo', + } + + const response = await testAdapter.request(request) + + expect(response.statusCode).toBe(400) + expect(response.json()).toMatchSnapshot() + }) + + it('should return 400 for invalid keyPrefix name', async () => { + const request = { + endpoint: 'csv', + bucket: 'valid-s3-bucket', + keyPrefix: 'invalid^$@path', + headerRow: 2, + resultColumn: 'Value', + matcherColumn: 'Name', + matcherValue: 'RowTwo', + } + + const response = await testAdapter.request(request) + + expect(response.statusCode).toBe(400) + expect(response.json()).toMatchSnapshot() + }) + it('should return error for unrecognised file path prefix', async () => { const request = { endpoint: 'csv', - bucket: 's3_bucket', + bucket: 's3-bucket', keyPrefix: 'incorrect/path/file', headerRow: 2, resultColumn: 'Value', @@ -142,7 +176,7 @@ describe('execute', () => { it('should return error for unrecognised bucket', async () => { const request = { endpoint: 'csv', - bucket: 'incorrect_s3_bucket', + bucket: 'incorrect-s3-bucket', keyPrefix: 'correct/path/file', headerRow: 2, resultColumn: 'Value', @@ -159,7 +193,7 @@ describe('execute', () => { it('should return error for invalid result column', async () => { const request = { endpoint: 'csv', - bucket: 's3_bucket', + bucket: 's3-bucket', keyPrefix: 'correct/path/file', headerRow: 2, resultColumn: 'Invalid', @@ -176,7 +210,7 @@ describe('execute', () => { it('should return error for invalid matcher column', async () => { const request = { endpoint: 'csv', - bucket: 's3_bucket', + bucket: 's3-bucket', keyPrefix: 'correct/path/file', headerRow: 2, resultColumn: 'Value', @@ -193,7 +227,7 @@ describe('execute', () => { it('should return error for invalid matcher value', async () => { const request = { endpoint: 'csv', - bucket: 's3_bucket', + bucket: 's3-bucket', keyPrefix: 'correct/path/file', headerRow: 2, resultColumn: 'Value', @@ -210,7 +244,7 @@ describe('execute', () => { it('should return error for invalid CSV file', async () => { const request = { endpoint: 'csv', - bucket: 's3_bucket', + bucket: 's3-bucket', keyPrefix: 'correct/path/invalid', headerRow: 2, resultColumn: 'Value', @@ -227,7 +261,7 @@ describe('execute', () => { it('should return error for empty CSV file', async () => { const request = { endpoint: 'csv', - bucket: 's3_bucket', + bucket: 's3-bucket', keyPrefix: 'correct/path/empty', headerRow: 2, resultColumn: 'Value', @@ -244,7 +278,7 @@ describe('execute', () => { it('should return success for CSV with single header', async () => { const request = { endpoint: 'csv', - bucket: 's3_bucket', + bucket: 's3-bucket', keyPrefix: 'correct/path/single-header', headerRow: 1, resultColumn: 'Value', @@ -261,7 +295,7 @@ describe('execute', () => { it('should return error if multiple matching rows are found', async () => { const request = { endpoint: 'csv', - bucket: 's3_bucket', + bucket: 's3-bucket', keyPrefix: 'correct/path/multiple-matches', headerRow: 2, resultColumn: 'Value', diff --git a/packages/sources/s3-csv-reader/test/unit/s3utils.test.ts b/packages/sources/s3-csv-reader/test/unit/s3utils.test.ts new file mode 100644 index 0000000000..bdc953f2a6 --- /dev/null +++ b/packages/sources/s3-csv-reader/test/unit/s3utils.test.ts @@ -0,0 +1,39 @@ +import { isValidBucket, isValidKeyPrefix } from '../../src/transport/s3utils' + +describe('s3utils test', () => { + describe('isValidBucket', () => { + it('valid bucket', () => { + const bucketName = 'valid-s3-bucket.name' + const result = isValidBucket(bucketName) + expect(result).toBe(true) + }) + it('invalid char bucket', () => { + const bucketName = 'my/bucket_s3' + const result = isValidBucket(bucketName) + expect(result).toBe(false) + }) + it('invalid substring bucket', () => { + const bucketName = 'invalid..s3-bucket' + const result = isValidBucket(bucketName) + expect(result).toBe(false) + }) + }) + + describe('isValidKeyPrefix', () => { + it('valid keyPrefix', () => { + const keyPrefix = 'my/Valid_s3-(key)*.name' + const result = isValidKeyPrefix(keyPrefix) + expect(result).toBe(true) + }) + it('invalid char bucket', () => { + const keyPrefix = 'invalid^key' + const result = isValidKeyPrefix(keyPrefix) + expect(result).toBe(false) + }) + it('invalid substring bucket', () => { + const keyPrefix = '../my-s3-bucket' + const result = isValidKeyPrefix(keyPrefix) + expect(result).toBe(false) + }) + }) +}) diff --git a/yarn.lock b/yarn.lock index d6a3b3ecba..e54604a4d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5800,13 +5800,13 @@ __metadata: dependencies: "@aws-sdk/client-s3": "npm:^3.600.0" "@chainlink/external-adapter-framework": "npm:1.1.0" - "@types/jest": "npm:27.5.2" - "@types/node": "npm:16.11.68" + "@types/jest": "npm:29.5.12" + "@types/node": "npm:20.14.10" csv-parse: "npm:5.5.6" date-fns: "npm:3.6.0" nock: "npm:13.5.4" - tslib: "npm:2.4.1" - typescript: "npm:5.0.4" + tslib: "npm:2.6.3" + typescript: "npm:5.5.3" languageName: unknown linkType: soft @@ -9376,6 +9376,15 @@ __metadata: languageName: node linkType: hard +"@jest/expect-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect-utils@npm:29.7.0" + dependencies: + jest-get-type: "npm:^29.6.3" + checksum: 10/ef8d379778ef574a17bde2801a6f4469f8022a46a5f9e385191dc73bb1fc318996beaed4513fbd7055c2847227a1bed2469977821866534593a6e52a281499ee + languageName: node + linkType: hard + "@jest/expect@npm:^29.5.0": version: 29.5.0 resolution: "@jest/expect@npm:29.5.0" @@ -9458,6 +9467,15 @@ __metadata: languageName: node linkType: hard +"@jest/schemas@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/schemas@npm:29.6.3" + dependencies: + "@sinclair/typebox": "npm:^0.27.8" + checksum: 10/910040425f0fc93cd13e68c750b7885590b8839066dfa0cd78e7def07bbb708ad869381f725945d66f2284de5663bbecf63e8fdd856e2ae6e261ba30b1687e93 + languageName: node + linkType: hard + "@jest/source-map@npm:^29.4.3": version: 29.4.3 resolution: "@jest/source-map@npm:29.4.3" @@ -9543,6 +9561,20 @@ __metadata: languageName: node linkType: hard +"@jest/types@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/types@npm:29.6.3" + dependencies: + "@jest/schemas": "npm:^29.6.3" + "@types/istanbul-lib-coverage": "npm:^2.0.0" + "@types/istanbul-reports": "npm:^3.0.0" + "@types/node": "npm:*" + "@types/yargs": "npm:^17.0.8" + chalk: "npm:^4.0.0" + checksum: 10/f74bf512fd09bbe2433a2ad460b04668b7075235eea9a0c77d6a42222c10a79b9747dc2b2a623f140ed40d6865a2ed8f538f3cbb75169120ea863f29a7ed76cd + languageName: node + linkType: hard + "@jridgewell/gen-mapping@npm:^0.1.0": version: 0.1.1 resolution: "@jridgewell/gen-mapping@npm:0.1.1" @@ -11243,6 +11275,13 @@ __metadata: languageName: node linkType: hard +"@sinclair/typebox@npm:^0.27.8": + version: 0.27.8 + resolution: "@sinclair/typebox@npm:0.27.8" + checksum: 10/297f95ff77c82c54de8c9907f186076e715ff2621c5222ba50b8d40a170661c0c5242c763cba2a4791f0f91cb1d8ffa53ea1d7294570cf8cd4694c0e383e484d + languageName: node + linkType: hard + "@sindresorhus/is@npm:^0.14.0": version: 0.14.0 resolution: "@sindresorhus/is@npm:0.14.0" @@ -12599,6 +12638,16 @@ __metadata: languageName: node linkType: hard +"@types/jest@npm:29.5.12": + version: 29.5.12 + resolution: "@types/jest@npm:29.5.12" + dependencies: + expect: "npm:^29.0.0" + pretty-format: "npm:^29.0.0" + checksum: 10/312e8dcf92cdd5a5847d6426f0940829bca6fe6b5a917248f3d7f7ef5d85c9ce78ef05e47d2bbabc40d41a930e0e36db2d443d2610a9e3db9062da2d5c904211 + languageName: node + linkType: hard + "@types/json-bigint@npm:^1.0.1": version: 1.0.1 resolution: "@types/json-bigint@npm:1.0.1" @@ -12757,13 +12806,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:16.11.68": - version: 16.11.68 - resolution: "@types/node@npm:16.11.68" - checksum: 10/7906b0fe63f64a0ee8a929c643560c6813b279c43495d69de6e331c1d24488a1e35149da870856a247c588058b108c2598650e8992409a834ee7960494fc1c4a - languageName: node - linkType: hard - "@types/node@npm:16.18.96": version: 16.18.96 resolution: "@types/node@npm:16.18.96" @@ -12778,6 +12820,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:20.14.10": + version: 20.14.10 + resolution: "@types/node@npm:20.14.10" + dependencies: + undici-types: "npm:~5.26.4" + checksum: 10/672892cf94d0d95cf052f11271990686a0fd204cd1e5fe7a4ef240e5315e06711765dc47b9ec98627d3adac18b8c92bb7e2d8db21d18faa20bc3e3203a143e79 + languageName: node + linkType: hard + "@types/node@npm:>=8.0.0 <15": version: 14.18.36 resolution: "@types/node@npm:14.18.36" @@ -17415,6 +17466,13 @@ __metadata: languageName: node linkType: hard +"diff-sequences@npm:^29.6.3": + version: 29.6.3 + resolution: "diff-sequences@npm:29.6.3" + checksum: 10/179daf9d2f9af5c57ad66d97cb902a538bcf8ed64963fa7aa0c329b3de3665ce2eb6ffdc2f69f29d445fa4af2517e5e55e5b6e00c00a9ae4f43645f97f7078cb + languageName: node + linkType: hard + "diff@npm:5.0.0": version: 5.0.0 resolution: "diff@npm:5.0.0" @@ -18954,6 +19012,19 @@ __metadata: languageName: node linkType: hard +"expect@npm:^29.0.0": + version: 29.7.0 + resolution: "expect@npm:29.7.0" + dependencies: + "@jest/expect-utils": "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10/63f97bc51f56a491950fb525f9ad94f1916e8a014947f8d8445d3847a665b5471b768522d659f5e865db20b6c2033d2ac10f35fcbd881a4d26407a4f6f18451a + languageName: node + linkType: hard + "expect@npm:^29.5.0": version: 29.5.0 resolution: "expect@npm:29.5.0" @@ -23800,6 +23871,18 @@ __metadata: languageName: node linkType: hard +"jest-diff@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-diff@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + diff-sequences: "npm:^29.6.3" + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10/6f3a7eb9cd9de5ea9e5aa94aed535631fa6f80221832952839b3cb59dd419b91c20b73887deb0b62230d06d02d6b6cf34ebb810b88d904bb4fe1e2e4f0905c98 + languageName: node + linkType: hard + "jest-docblock@npm:^29.4.3": version: 29.4.3 resolution: "jest-docblock@npm:29.4.3" @@ -23850,6 +23933,13 @@ __metadata: languageName: node linkType: hard +"jest-get-type@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-get-type@npm:29.6.3" + checksum: 10/88ac9102d4679d768accae29f1e75f592b760b44277df288ad76ce5bf038c3f5ce3719dea8aa0f035dac30e9eb034b848ce716b9183ad7cc222d029f03e92205 + languageName: node + linkType: hard + "jest-haste-map@npm:^29.5.0": version: 29.5.0 resolution: "jest-haste-map@npm:29.5.0" @@ -23907,6 +23997,18 @@ __metadata: languageName: node linkType: hard +"jest-matcher-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-matcher-utils@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + jest-diff: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10/981904a494299cf1e3baed352f8a3bd8b50a8c13a662c509b6a53c31461f94ea3bfeffa9d5efcfeb248e384e318c87de7e3baa6af0f79674e987482aa189af40 + languageName: node + linkType: hard + "jest-message-util@npm:^29.5.0": version: 29.5.0 resolution: "jest-message-util@npm:29.5.0" @@ -23924,6 +24026,23 @@ __metadata: languageName: node linkType: hard +"jest-message-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-message-util@npm:29.7.0" + dependencies: + "@babel/code-frame": "npm:^7.12.13" + "@jest/types": "npm:^29.6.3" + "@types/stack-utils": "npm:^2.0.0" + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + micromatch: "npm:^4.0.4" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + stack-utils: "npm:^2.0.3" + checksum: 10/31d53c6ed22095d86bab9d14c0fa70c4a92c749ea6ceece82cf30c22c9c0e26407acdfbdb0231435dc85a98d6d65ca0d9cbcd25cd1abb377fe945e843fb770b9 + languageName: node + linkType: hard + "jest-mock@npm:^29.5.0": version: 29.5.0 resolution: "jest-mock@npm:29.5.0" @@ -24099,6 +24218,20 @@ __metadata: languageName: node linkType: hard +"jest-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-util@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + graceful-fs: "npm:^4.2.9" + picomatch: "npm:^2.2.3" + checksum: 10/30d58af6967e7d42bd903ccc098f3b4d3859ed46238fbc88d4add6a3f10bea00c226b93660285f058bc7a65f6f9529cf4eb80f8d4707f79f9e3a23686b4ab8f3 + languageName: node + linkType: hard + "jest-validate@npm:^29.5.0": version: 29.5.0 resolution: "jest-validate@npm:29.5.0" @@ -29240,6 +29373,17 @@ __metadata: languageName: node linkType: hard +"pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0": + version: 29.7.0 + resolution: "pretty-format@npm:29.7.0" + dependencies: + "@jest/schemas": "npm:^29.6.3" + ansi-styles: "npm:^5.0.0" + react-is: "npm:^18.0.0" + checksum: 10/dea96bc83c83cd91b2bfc55757b6b2747edcaac45b568e46de29deee80742f17bc76fe8898135a70d904f4928eafd8bb693cd1da4896e8bdd3c5e82cadf1d2bb + languageName: node + linkType: hard + "pretty-format@npm:^29.5.0": version: 29.5.0 resolution: "pretty-format@npm:29.5.0" @@ -33256,6 +33400,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:2.6.3, tslib@npm:^2.6.2": + version: 2.6.3 + resolution: "tslib@npm:2.6.3" + checksum: 10/52109bb681f8133a2e58142f11a50e05476de4f075ca906d13b596ae5f7f12d30c482feb0bff167ae01cfc84c5803e575a307d47938999246f5a49d174fc558c + languageName: node + linkType: hard + "tslib@npm:^1.8.1, tslib@npm:^1.9.0, tslib@npm:^1.9.3": version: 1.14.1 resolution: "tslib@npm:1.14.1" @@ -33263,13 +33414,6 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.6.2": - version: 2.6.3 - resolution: "tslib@npm:2.6.3" - checksum: 10/52109bb681f8133a2e58142f11a50e05476de4f075ca906d13b596ae5f7f12d30c482feb0bff167ae01cfc84c5803e575a307d47938999246f5a49d174fc558c - languageName: node - linkType: hard - "tslib@npm:~2.1.0": version: 2.1.0 resolution: "tslib@npm:2.1.0" @@ -33546,6 +33690,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:5.5.3": + version: 5.5.3 + resolution: "typescript@npm:5.5.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10/11a867312419ed497929aafd2f1d28b2cd41810a5eb6c6e9e169559112e9ea073d681c121a29102e67cd4478d0a4ae37a306a5800f3717f59c4337e6a9bd5e8d + languageName: node + linkType: hard + "typescript@npm:^4.9.5": version: 4.9.5 resolution: "typescript@npm:4.9.5" @@ -33576,6 +33730,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@npm%3A5.5.3#optional!builtin": + version: 5.5.3 + resolution: "typescript@patch:typescript@npm%3A5.5.3#optional!builtin::version=5.5.3&hash=379a07" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10/7cf7acb78a80f749b82842f2ffe01e90e7b3e709a6f4268588e0b7599c41dca1059be217f47778fe1a380bfaf60933021ef20d002c426d4d7745e1b36c11467b + languageName: node + linkType: hard + "typescript@patch:typescript@npm%3A^4.9.5#optional!builtin": version: 4.9.5 resolution: "typescript@patch:typescript@npm%3A4.9.5#optional!builtin::version=4.9.5&hash=289587" @@ -33654,6 +33818,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: 10/0097779d94bc0fd26f0418b3a05472410408877279141ded2bd449167be1aed7ea5b76f756562cb3586a07f251b90799bab22d9019ceba49c037c76445f7cddd + languageName: node + linkType: hard + "undici@npm:^5.14.0": version: 5.28.4 resolution: "undici@npm:5.28.4"