diff --git a/docs/getting-started/1-concepts.md b/docs/getting-started/1-concepts.md index 14d78f9a2..d4651c21f 100644 --- a/docs/getting-started/1-concepts.md +++ b/docs/getting-started/1-concepts.md @@ -4,11 +4,11 @@ The power of integrating linting into the design-first workflow, or any workflow To achieve this, Spectral has three key concepts: -- **Rulesets** act as a container for rules and functions. - **Rules** filter your object down to a set of target values and specify the function that is used to evaluate those values. - **Functions** accept a value and return issues if the value is incorrect. +- **Rulesets** act as a container for rules and functions. -Rules can be comprised of one of more functions. For example: +Rules can be comprised of one of more functions, to standardize structured content, like making sure your OpenAPI descriptions match your [API style guides](https://stoplight.io/api-style-guides-guidelines-and-best-practices): - HTTP Basic is not allowed at this company - All operations are secured with a security schema diff --git a/docs/getting-started/3-rulesets.md b/docs/getting-started/3-rulesets.md index 99175e012..349ce4995 100644 --- a/docs/getting-started/3-rulesets.md +++ b/docs/getting-started/3-rulesets.md @@ -83,8 +83,8 @@ Formats are an optional way to specify which API description formats a rule, or - `aas2_4` (AsyncAPI v2.4.0) - `oas2` (OpenAPI v2.0) - `oas3` (OpenAPI v3.x) -- `oas3.0` (OpenAPI v3.0.x) -- `oas3.1` (OpenAPI v3.1.x) +- `oas3_0` (OpenAPI v3.0.x) +- `oas3_1` (OpenAPI v3.1.x) - `json-schema` (`$schema` says this is some JSON Schema draft) - `json-schema-loose` (looks like JSON Schema, but no `$schema` found) - `json-schema-draft4` (`$schema` says this is JSON Schema Draft 04) diff --git a/docs/reference/asyncapi-rules.md b/docs/reference/asyncapi-rules.md index 186399604..92f460ae2 100644 --- a/docs/reference/asyncapi-rules.md +++ b/docs/reference/asyncapi-rules.md @@ -132,6 +132,51 @@ info: name: MIT ``` +### asyncapi-message-examples + +All `examples` in message object should follow by `payload` and `headers` schemas. + +**Bad Example** + +```yaml +asyncapi: "2.0.0" +info: + title: Bad API + version: "1.0.0" +components: + messages: + someMessage: + payload: + type: string + headers: + type: object + examples: + - payload: 2137 + headers: someHeader +``` + +**Good Example** + +```yaml +asyncapi: "2.0.0" +info: + title: Good API + version: "1.0.0" +components: + messages: + someMessage: + payload: + type: string + headers: + type: object + examples: + - payload: foobar + headers: + someHeader: someValue +``` + +**Recommended:** Yes + ### asyncapi-operation-description Operation objects should have a description. diff --git a/docs/reference/openapi-rules.md b/docs/reference/openapi-rules.md index 3abcbcb47..3bf0a0d4c 100644 --- a/docs/reference/openapi-rules.md +++ b/docs/reference/openapi-rules.md @@ -6,7 +6,7 @@ In your ruleset file you can add `extends: "spectral:oas"` and you'll get all of ## OpenAPI v2 & v3 -These rules apply to both OpenAPI v2 and v3. +These rules apply to both OpenAPI v2.0, v3.0, and most likely v3.1, although there are some differences. ### operation-success-response @@ -186,7 +186,7 @@ info: ### no-\$ref-siblings -An object exposing a `$ref` property cannot be further extended with additional properties. +Prior to OpenAPI v3.1, keywords next to `$ref` were be ignored by most tooling, but not all. This leads to inconsistent experiences depending on what combinations of tools are used. As of v3.1 $ref siblings are allowed, so this rule will not be applied. **Recommended:** Yes @@ -195,9 +195,8 @@ An object exposing a `$ref` property cannot be further extended with additional ```yaml TheBadModel: $ref: "#/components/TheBadModelProperties" - examples: # <= This property will be ignored - an_example: - name: something + # This property should be ignored + example: May or may not show up ``` ### no-eval-in-markdown @@ -502,15 +501,13 @@ Ignores empty `security` values for cases where authentication is explicitly not Potential unused reusable `definition` entry has been detected. -_Warning:_ This rule may identify false positives when linting a specification -that acts as a library (a container storing reusable objects, leveraged by other -specifications that reference those objects). + -**Recommended:** Yes - -### oas2-valid-example - -Examples must be valid against their defined schema. +> #### Warning +> +> This rule may identify false positives when linting a specification +> that acts as a library (a container storing reusable objects, leveraged by other +> specifications that reference those objects). **Recommended:** Yes @@ -640,15 +637,13 @@ servers: Potential unused reusable `components` entry has been detected. -_Warning:_ This rule may identify false positives when linting a specification -that acts as a library (a container storing reusable objects, leveraged by other -specifications that reference those objects). - -**Recommended:** Yes - -### oas3-valid-example + -Examples must be valid against their defined schema. +> #### Warning +> +> This rule may identify false positives when linting a specification +> that acts as a library (a container storing reusable objects, leveraged by other +> specifications that reference those objects). **Recommended:** Yes diff --git a/packages/core/package.json b/packages/core/package.json index ff3edc77a..81fdbfb5a 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -44,8 +44,8 @@ "@stoplight/spectral-parsers": "^1.0.0", "@stoplight/spectral-ref-resolver": "^1.0.0", "@stoplight/spectral-runtime": "^1.0.0", - "@stoplight/types": "13.1.0", - "@types/json-schema": "^7.0.7", + "@stoplight/types": "~13.2.0", + "@types/json-schema": "^7.0.11", "ajv": "^8.6.0", "ajv-errors": "~3.0.0", "ajv-formats": "~2.1.0", @@ -53,7 +53,7 @@ "jsonpath-plus": "6.0.1", "lodash": "~4.17.21", "lodash.topath": "^4.5.2", - "minimatch": "3.0.4", + "minimatch": "3.1.2", "nimma": "0.2.2", "pony-cause": "^1.0.0", "simple-eval": "1.0.0", diff --git a/packages/rulesets/CHANGELOG.md b/packages/rulesets/CHANGELOG.md index ba553032a..af650dd83 100644 --- a/packages/rulesets/CHANGELOG.md +++ b/packages/rulesets/CHANGELOG.md @@ -1,3 +1,10 @@ +# [@stoplight/spectral-rulesets-v1.10.0](https://github.com/stoplightio/spectral/compare/@stoplight/spectral-rulesets-v1.9.0...@stoplight/spectral-rulesets-v1.10.0) (2022-06-07) + + +### Features + +* **rulesets:** add rule to validate AsyncAPI message's examples ([#2126](https://github.com/stoplightio/spectral/issues/2126)) ([87ef046](https://github.com/stoplightio/spectral/commit/87ef0464c1d31a8887c847e339a4b1bef3e5ad93)) + # [@stoplight/spectral-rulesets-v1.9.0](https://github.com/stoplightio/spectral/compare/@stoplight/spectral-rulesets-v1.8.0...@stoplight/spectral-rulesets-v1.9.0) (2022-05-31) diff --git a/packages/rulesets/package.json b/packages/rulesets/package.json index cac136182..970b451c1 100644 --- a/packages/rulesets/package.json +++ b/packages/rulesets/package.json @@ -1,6 +1,6 @@ { "name": "@stoplight/spectral-rulesets", - "version": "1.9.0", + "version": "1.10.0", "homepage": "https://github.com/stoplightio/spectral", "bugs": "https://github.com/stoplightio/spectral/issues", "author": "Stoplight ", diff --git a/packages/rulesets/src/asyncapi/__tests__/asyncapi-message-examples.test.ts b/packages/rulesets/src/asyncapi/__tests__/asyncapi-message-examples.test.ts new file mode 100644 index 000000000..b007b7f34 --- /dev/null +++ b/packages/rulesets/src/asyncapi/__tests__/asyncapi-message-examples.test.ts @@ -0,0 +1,197 @@ +import { DiagnosticSeverity } from '@stoplight/types'; +import testRule from './__helpers__/tester'; + +testRule('asyncapi-message-examples', [ + { + name: 'valid case', + document: { + asyncapi: '2.0.0', + channels: { + someChannel: { + publish: { + message: { + payload: { + type: 'string', + }, + headers: { + type: 'object', + }, + examples: [ + { + payload: 'foobar', + headers: { + someKey: 'someValue', + }, + }, + ], + }, + }, + }, + }, + }, + errors: [], + }, + + { + name: 'invalid case', + document: { + asyncapi: '2.0.0', + channels: { + someChannel: { + publish: { + message: { + payload: { + type: 'string', + }, + headers: { + type: 'object', + }, + examples: [ + { + payload: 2137, + headers: { + someKey: 'someValue', + }, + }, + ], + }, + }, + }, + }, + }, + errors: [ + { + message: '"payload" property type must be string', + path: ['channels', 'someChannel', 'publish', 'message', 'examples', '0', 'payload'], + severity: DiagnosticSeverity.Error, + }, + ], + }, + + { + name: 'invalid case (oneOf case)', + document: { + asyncapi: '2.0.0', + channels: { + someChannel: { + publish: { + message: { + oneOf: [ + { + payload: { + type: 'string', + }, + headers: { + type: 'object', + }, + examples: [ + { + payload: 2137, + headers: { + someKey: 'someValue', + }, + }, + ], + }, + ], + }, + }, + }, + }, + }, + errors: [ + { + message: '"payload" property type must be string', + path: ['channels', 'someChannel', 'publish', 'message', 'oneOf', '0', 'examples', '0', 'payload'], + severity: DiagnosticSeverity.Error, + }, + ], + }, + + { + name: 'invalid case (inside components.messages)', + document: { + asyncapi: '2.0.0', + components: { + messages: { + someMessage: { + payload: { + type: 'string', + }, + headers: { + type: 'object', + }, + examples: [ + { + payload: 2137, + headers: { + someKey: 'someValue', + }, + }, + ], + }, + }, + }, + }, + errors: [ + { + message: '"payload" property type must be string', + path: ['components', 'messages', 'someMessage', 'examples', '0', 'payload'], + severity: DiagnosticSeverity.Error, + }, + ], + }, + + { + name: 'invalid case (with multiple errors)', + document: { + asyncapi: '2.0.0', + components: { + messages: { + someMessage: { + payload: { + type: 'object', + required: ['key1', 'key2'], + properties: { + key1: { + type: 'string', + }, + key2: { + type: 'string', + }, + }, + }, + headers: { + type: 'object', + }, + examples: [ + { + payload: { + key1: 2137, + }, + headers: 'someValue', + }, + ], + }, + }, + }, + }, + errors: [ + { + message: '"payload" property must have required property "key2"', + path: ['components', 'messages', 'someMessage', 'examples', '0', 'payload'], + severity: DiagnosticSeverity.Error, + }, + { + message: '"key1" property type must be string', + path: ['components', 'messages', 'someMessage', 'examples', '0', 'payload', 'key1'], + severity: DiagnosticSeverity.Error, + }, + { + message: '"headers" property type must be object', + path: ['components', 'messages', 'someMessage', 'examples', '0', 'headers'], + severity: DiagnosticSeverity.Error, + }, + ], + }, +]); diff --git a/packages/rulesets/src/asyncapi/functions/asyncApi2MessageExamplesValidation.ts b/packages/rulesets/src/asyncapi/functions/asyncApi2MessageExamplesValidation.ts new file mode 100644 index 000000000..e6c89978f --- /dev/null +++ b/packages/rulesets/src/asyncapi/functions/asyncApi2MessageExamplesValidation.ts @@ -0,0 +1,96 @@ +import { createRulesetFunction } from '@stoplight/spectral-core'; +import { schema as schemaFn } from '@stoplight/spectral-functions'; + +import type { JsonPath } from '@stoplight/types'; +import type { IFunctionResult, RulesetFunctionContext } from '@stoplight/spectral-core'; +import type { JSONSchema7 } from 'json-schema'; + +interface MessageExample { + name?: string; + summary?: string; + payload?: unknown; + headers?: unknown; +} + +export interface MessageFragment { + payload: unknown; + headers: unknown; + examples?: MessageExample[]; +} + +function getMessageExamples(message: MessageFragment): Array<{ path: JsonPath; value: MessageExample }> { + if (!Array.isArray(message.examples)) { + return []; + } + return ( + message.examples.map((example, index) => { + return { + path: ['examples', index], + value: example, + }; + }) ?? [] + ); +} + +function validate( + value: unknown, + path: JsonPath, + type: 'payload' | 'headers', + schema: unknown, + ctx: RulesetFunctionContext, +): ReturnType { + return schemaFn( + value, + { + allErrors: true, + schema: schema as JSONSchema7, + }, + { + ...ctx, + path: [...ctx.path, ...path, type], + }, + ); +} + +export default createRulesetFunction( + { + input: { + type: 'object', + properties: { + name: { + type: 'string', + }, + summary: { + type: 'string', + }, + }, + }, + options: null, + }, + function asyncApi2MessageExamplesValidation(targetVal, _, ctx) { + if (!targetVal.examples) return; + const examples = getMessageExamples(targetVal); + + const results: IFunctionResult[] = []; + + for (const example of examples) { + // validate payload + if (example.value.payload !== undefined) { + const errors = validate(example.value.payload, example.path, 'payload', targetVal.payload, ctx); + if (Array.isArray(errors)) { + results.push(...errors); + } + } + + // validate headers + if (example.value.headers !== undefined) { + const errors = validate(example.value.headers, example.path, 'headers', targetVal.headers, ctx); + if (Array.isArray(errors)) { + results.push(...errors); + } + } + } + + return results; + }, +); diff --git a/packages/rulesets/src/asyncapi/index.ts b/packages/rulesets/src/asyncapi/index.ts index 930a92aba..f0bbe118c 100644 --- a/packages/rulesets/src/asyncapi/index.ts +++ b/packages/rulesets/src/asyncapi/index.ts @@ -10,6 +10,7 @@ import { import asyncApi2ChannelParameters from './functions/asyncApi2ChannelParameters'; import asyncApi2DocumentSchema from './functions/asyncApi2DocumentSchema'; +import asyncApi2MessageExamplesValidation from './functions/asyncApi2MessageExamplesValidation'; import asyncApi2OperationIdUniqueness from './functions/asyncApi2OperationIdUniqueness'; import asyncApi2SchemaValidation from './functions/asyncApi2SchemaValidation'; import asyncApi2PayloadValidation from './functions/asyncApi2PayloadValidation'; @@ -157,6 +158,31 @@ export default { function: truthy, }, }, + 'asyncapi-message-examples': { + description: 'Examples of message object should follow by "payload" and "headers" schemas.', + message: '{{error}}', + severity: 'error', + type: 'validation', + recommended: true, + given: [ + // messages + '$.channels.*.[publish,subscribe].message', + '$.channels.*.[publish,subscribe].message.oneOf.*', + '$.components.channels.*.[publish,subscribe].message', + '$.components.channels.*.[publish,subscribe].message.oneOf.*', + '$.components.messages.*', + // message traits + '$.channels.*.[publish,subscribe].message.traits.*', + '$.channels.*.[publish,subscribe].message.oneOf.*.traits.*', + '$.components.channels.*.[publish,subscribe].message.traits.*', + '$.components.channels.*.[publish,subscribe].message.oneOf.*.traits.*', + '$.components.messages.*.traits.*', + '$.components.messageTraits.*', + ], + then: { + function: asyncApi2MessageExamplesValidation, + }, + }, 'asyncapi-operation-description': { description: 'Operation "description" must be present and non-empty string.', recommended: true, diff --git a/toc.json b/toc.json new file mode 100644 index 000000000..b65c935e9 --- /dev/null +++ b/toc.json @@ -0,0 +1,130 @@ +{ + "items": [ + { + "type": "item", + "title": "Overview", + "uri": "/README.md" + }, + { + "type": "divider", + "title": "Getting Started" + }, + { + "type": "item", + "title": "Concepts", + "uri": "/docs/getting-started/1-concepts.md" + }, + { + "type": "item", + "title": "Installation", + "uri": "/docs/getting-started/2-installation.md" + }, + { + "type": "item", + "title": "Rulesets", + "uri": "/docs/getting-started/3-rulesets.md" + }, + { + "type": "item", + "title": "OpenAPI Support", + "uri": "/docs/getting-started/4-openapi.md" + }, + { + "type": "item", + "title": "AsyncAPI Support", + "uri": "/docs/getting-started/5-asyncapi.md" + }, + { + "type": "divider", + "title": "Guides" + }, + { + "type": "item", + "title": "Workflows", + "uri": "/docs/guides/1-workflows.md" + }, + { + "type": "item", + "title": "Spectral CLI", + "uri": "/docs/guides/2-cli.md" + }, + { + "type": "item", + "title": "Spectral in JavaScript", + "uri": "/docs/guides/3-javascript.md" + }, + { + "type": "item", + "title": "Custom Rulesets", + "uri": "/docs/guides/4-custom-rulesets.md" + }, + { + "type": "item", + "title": "Custom Functions", + "uri": "/docs/guides/5-custom-functions.md" + }, + { + "type": "item", + "title": "Sharing & Distributing Rulesets", + "uri": "/docs/guides/7-sharing-rulesets.md" + }, + { + "type": "item", + "title": "Continuous Integration", + "uri": "/docs/guides/8-continuous-integration.md" + }, + { + "type": "item", + "title": "Tips & Tricks", + "uri": "/docs/guides/8-tips-and-tricks.md" + }, + { + "type": "divider", + "title": "Migration Guides" + }, + { + "type": "item", + "title": "Spectral v2/v3 to v4 Migration Guide", + "uri": "/docs/migration-guides/4.0.md" + }, + { + "type": "item", + "title": "Spectral v4 to v5 Migration Guide", + "uri": "/docs/migration-guides/5.0.md" + }, + { + "type": "item", + "title": "Spectral v5 to \"v6\" Migration Guide", + "uri": "/docs/migration-guides/6.0.md" + }, + { + "type": "divider", + "title": "Reference" + }, + { + "type": "item", + "title": "OpenAPI Rules", + "uri": "/docs/reference/openapi-rules.md" + }, + { + "type": "item", + "title": "AsyncAPI Rules", + "uri": "/docs/reference/asyncapi-rules.md" + }, + { + "type": "item", + "title": "Core Functions", + "uri": "/docs/reference/functions.md" + }, + { + "type": "item", + "title": "Error Handling", + "uri": "/docs/reference/error-handling.md" + }, + { + "type": "item", + "title": "YAML support", + "uri": "/docs/reference/yaml.md" + } + ] +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index b08497b67..5737ca7e0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2402,9 +2402,9 @@ __metadata: "@stoplight/spectral-parsers": "*" "@stoplight/spectral-ref-resolver": ^1.0.0 "@stoplight/spectral-runtime": ^1.0.0 - "@stoplight/types": 13.1.0 + "@stoplight/types": ~13.2.0 "@stoplight/yaml": ^4.2.2 - "@types/json-schema": ^7.0.7 + "@types/json-schema": ^7.0.11 "@types/minimatch": ^3.0.5 "@types/treeify": ^1.0.0 ajv: ^8.6.0 @@ -2414,7 +2414,7 @@ __metadata: jsonpath-plus: 6.0.1 lodash: ~4.17.21 lodash.topath: ^4.5.2 - minimatch: 3.0.4 + minimatch: 3.1.2 nimma: 0.2.2 nock: ^13.1.0 pony-cause: ^1.0.0 @@ -2581,23 +2581,23 @@ __metadata: languageName: node linkType: hard -"@stoplight/types@npm:13.1.0, @stoplight/types@npm:^13.0.0": - version: 13.1.0 - resolution: "@stoplight/types@npm:13.1.0" +"@stoplight/types@npm:^12.0.0, @stoplight/types@npm:^12.3.0, @stoplight/types@npm:^12.5.0": + version: 12.5.0 + resolution: "@stoplight/types@npm:12.5.0" dependencies: "@types/json-schema": ^7.0.4 utility-types: ^3.10.0 - checksum: 4caf5374e541a38f905d2e83c81beea8250990fe458fcc299d0acc75bde60d8db17ace2c98afa15ab12014b6f0b536dc8d1d22bc9ce498c60493b9267edab72f + checksum: fe4a09df6e1c2f0cdb53f474b180cc7b8184e814e1ac4427d199642f10958335f597060530a908c0e5800ba2569d077afe124a51deaee466255ce942e1e03941 languageName: node linkType: hard -"@stoplight/types@npm:^12.0.0, @stoplight/types@npm:^12.3.0, @stoplight/types@npm:^12.5.0": - version: 12.5.0 - resolution: "@stoplight/types@npm:12.5.0" +"@stoplight/types@npm:^13.0.0, @stoplight/types@npm:~13.2.0": + version: 13.2.0 + resolution: "@stoplight/types@npm:13.2.0" dependencies: "@types/json-schema": ^7.0.4 utility-types: ^3.10.0 - checksum: fe4a09df6e1c2f0cdb53f474b180cc7b8184e814e1ac4427d199642f10958335f597060530a908c0e5800ba2569d077afe124a51deaee466255ce942e1e03941 + checksum: 902fd852552698f21189d4c9c2cf32136a69c5c494b6f92e3d929c8b9dd5c113fbef13aeb9d6dab386aa0f5205733998e4e4436ec19e8a165886e548c1dfc011 languageName: node linkType: hard @@ -2810,10 +2810,10 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.6, @types/json-schema@npm:^7.0.7": - version: 7.0.7 - resolution: "@types/json-schema@npm:7.0.7" - checksum: ea3b409235862d28122751158f4054e729e31ad844bd7b8b23868f38c518047b1c0e8e4e7cc293e02c31a2fb8cfc8a4506c2de2a745cf78b218e064fb8898cd4 +"@types/json-schema@npm:^7.0.11, @types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.6, @types/json-schema@npm:^7.0.7": + version: 7.0.11 + resolution: "@types/json-schema@npm:7.0.11" + checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d languageName: node linkType: hard @@ -3553,9 +3553,9 @@ __metadata: linkType: hard "async@npm:^3.0.1": - version: 3.1.0 - resolution: "async@npm:3.1.0" - checksum: 2602938fbd317c7311807934ab49e3f26ef88d71d2c19f7bbd84bcaadd4c98f564c57caa6b4a4563527ffc6929b0be8142cca7240def8bf4e946bce376d2cade + version: 3.2.3 + resolution: "async@npm:3.2.3" + checksum: c4bee57ab2249af3dc83ca3ef9acfa8e822c0d5e5aa41bae3eaf7f673648343cd64ecd7d26091ffd357f3f044428b17b5f00098494b6cf8b6b3e9681f0636ca1 languageName: node linkType: hard @@ -5262,8 +5262,8 @@ __metadata: linkType: hard "engine.io@npm:~4.1.0": - version: 4.1.1 - resolution: "engine.io@npm:4.1.1" + version: 4.1.2 + resolution: "engine.io@npm:4.1.2" dependencies: accepts: ~1.3.4 base64id: 2.0.0 @@ -5272,7 +5272,7 @@ __metadata: debug: ~4.3.1 engine.io-parser: ~4.0.0 ws: ~7.4.2 - checksum: 773fc7be6ecc2b8af95f72e6371feaa44957e481e175e614513a92307b55a33fa779d491a918af7f9071c11ad36fd52133b44d09c996baca88b5524d934ce4f7 + checksum: 3b56aa4f13eca1296fa7de631ebc503ee1c16d3b90c8c97a86f36528d6f842c2bcfc065ca65caef5ba6164b372d67c07f812b77c2572642ccd4f245680e21621 languageName: node linkType: hard @@ -6112,12 +6112,12 @@ __metadata: linkType: hard "follow-redirects@npm:^1.0.0": - version: 1.14.1 - resolution: "follow-redirects@npm:1.14.1" + version: 1.15.1 + resolution: "follow-redirects@npm:1.15.1" peerDependenciesMeta: debug: optional: true - checksum: 7381a55bdc6951c5c1ab73a8da99d9fa4c0496ce72dba92cd2ac2babe0e3ebde9b81c5bca889498ad95984bc773d713284ca2bb17f1b1e1416e5f6531e39a488 + checksum: 6aa4e3e3cdfa3b9314801a1cd192ba756a53479d9d8cca65bf4db3a3e8834e62139245cd2f9566147c8dfe2efff1700d3e6aefd103de4004a7b99985e71dd533 languageName: node linkType: hard @@ -9093,12 +9093,12 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:3.0.4, minimatch@npm:^3.0.3, minimatch@npm:^3.0.4": - version: 3.0.4 - resolution: "minimatch@npm:3.0.4" +"minimatch@npm:3.1.2, minimatch@npm:^3.0.3, minimatch@npm:^3.0.4": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" dependencies: brace-expansion: ^1.1.7 - checksum: 66ac295f8a7b59788000ea3749938b0970344c841750abd96694f80269b926ebcafad3deeb3f1da2522978b119e6ae3a5869b63b13a7859a456b3408bd18a078 + checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a languageName: node linkType: hard @@ -9114,9 +9114,9 @@ __metadata: linkType: hard "minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5": - version: 1.2.5 - resolution: "minimist@npm:1.2.5" - checksum: 86706ce5b36c16bfc35c5fe3dbb01d5acdc9a22f2b6cc810b6680656a1d2c0e44a0159c9a3ba51fb072bb5c203e49e10b51dcd0eec39c481f4c42086719bae52 + version: 1.2.6 + resolution: "minimist@npm:1.2.6" + checksum: d15428cd1e11eb14e1233bcfb88ae07ed7a147de251441d61158619dfb32c4d7e9061d09cab4825fdee18ecd6fce323228c8c47b5ba7cd20af378ca4048fb3fb languageName: node linkType: hard @@ -11562,13 +11562,13 @@ __metadata: linkType: hard "simple-get@npm:^3.0.3": - version: 3.1.0 - resolution: "simple-get@npm:3.1.0" + version: 3.1.1 + resolution: "simple-get@npm:3.1.1" dependencies: decompress-response: ^4.2.0 once: ^1.3.1 simple-concat: ^1.0.0 - checksum: cca91a9ab2b532fa8d367757c196b54e2dfe3325aab0298d66a3e2a45a29a9d335d1a3fb41f036dad14000f78baddd4170fbf9621d72869791d2912baf9469aa + checksum: 80195e70bf171486e75c31e28e5485468195cc42f85940f8b45c4a68472160144d223eb4d07bc82ef80cb974b7c401db021a540deb2d34ac4b3b8883da2d6401 languageName: node linkType: hard @@ -12807,9 +12807,9 @@ __metadata: linkType: hard "urijs@npm:^1.19.6": - version: 1.19.7 - resolution: "urijs@npm:1.19.7" - checksum: faf178c0ebad4d9eb255c2ed181a1249c496c70383f53383f40ecf783b8b51c84b51503f309b8508048bdc98347f766513ef16692a096888b310b5e1c08c1e46 + version: 1.19.11 + resolution: "urijs@npm:1.19.11" + checksum: f9b95004560754d30fd7dbee44b47414d662dc9863f1cf5632a7c7983648df11d23c0be73b9b4f9554463b61d5b0a520b70df9e1ee963ebb4af02e6da2cc80f3 languageName: node linkType: hard