feat(OAS): sanitize circular reference for Redocly (#3198)

### What

Add OAS build step to patch known circular references that prevent Redocly from rendering the API documentation.

### Why

We've encountered crashing and loading issues with Redocly when the OAS contained circular references. We have been working around the limitation by omitting some known problematic $ref in our source OAS. We wish to move away from this strategy in order to always explicitly include $ref in our OAS.

### How

We are introducing a custom Redocly CLI plugin that will replace `$ref` by `type: object` base on a configurable set of instructions. These instructions can be modified in `docs-util/redocly/config.yaml`

We are adding a `redocly bundle` step in the current OAS build process in order to sanitize problematic circular references.

We updated the redocly-cli package version in order to ensure that plugins are supported.

### Test

We will use [Cart.payment](fd5c185159/packages/medusa/src/models/cart.ts (L72-L74)) to ensure that the new process is properly sanitizing.

* Run `yarn openapi:generate`
* Open `docs/api/store/components/schemas/Cart.yaml`
  * Expect the `payment` property to have been sanitized to `type: object`
* Run `yarn redocly preview-docs docs/api/store/openapi.yaml --config=docs-util/redocly/config.yaml`
* Visit http://127.0.0.1:8080/#tag/Cart/operation/GetCartsCart
  * In the response, expect cart.payment to not list the properties of the Payment schema.
This commit is contained in:
Patrick
2023-02-08 08:01:03 -05:00
committed by GitHub
parent b9bda3bf4e
commit 53532df8d5
7 changed files with 511 additions and 32 deletions

View File

@@ -0,0 +1,5 @@
---
"@medusajs/medusa": patch
---
feat(OAS): sanitize circular reference for Redocly

View File

@@ -0,0 +1,97 @@
plugins:
- "./plugins/plugin.js"
# Allows to replace a $ref with `type: object` in order to avoid infinite loops
# when Redocly attempts to render circular references.
decorators:
plugin/circular-patch:
verbose: true
schemas:
Address:
- Customer
Cart:
- Customer
- Order
- Payment
ClaimItem:
- ClaimOrder
ClaimOrder:
- Fulfillment
- Order
- Return
Customer:
- Order
DraftOrder:
- Cart
- Order
Fulfillment:
- ClaimOrder
- Order
- Swap
GiftCard:
- Order
GiftCardTransaction:
- GiftCard
- Order
LineItem:
- Cart
- ClaimOrder
- Order
- OrderEdit
- Swap
Order:
- Cart
- ClaimOrder
- Customer
- DraftOrder
- Fulfillment
- OrderEdit
- Payment
- Refund
- Return
- Swap
OrderEdit:
- Order
Payment:
- Cart
- Order
- Swap
Refund:
- Order
- Payment
Return:
- ClaimOrder
- Order
- Swap
ShippingMethod:
- Cart
- ClaimOrder
- Order
- Payment
- Return
- Swap
Swap:
- Cart
- Fulfillment
- Order
- Payment
- Return
# Similar config to /www/docs/docusaurus.config.js > redocusaurus
# Allows to emulate rendering of API public documentation when using `yarn redocly preview-docs openapi.yaml`
theme.openapi:
theme:
colors:
primary:
dart: "#242526"
sidebar:
width: "250px"
disableSearch: true
expandResponses: "200,204"
generatedPayloadSamplesMaxDepth: 4
hideDownloadButton: true
hideRequestPayloadSample: true
nativeScrollbars: true
requiredPropsFirst: true
showObjectSchemaExamples: true
sortTagsAlphabetically: true

View File

@@ -0,0 +1,87 @@
module.exports = CircularPatch
/**
* Since ref() is triggered upon reaching a $ref OAS line (leaf),
* we want to inverse `schemas` instructions in order to optimize iterators.
*/
function preparePatches(schemas) {
const patches = []
const patchesObj = {}
for (const schemaToPatch in schemas) {
for (const schemaName of schemas[schemaToPatch]) {
if (!patchesObj[schemaName]) {
patchesObj[schemaName] = {
schemaName,
schemaPointer: `#/components/schemas/${schemaName}`,
schemaToPatchPointers: [],
}
}
const schemaToPatchPointer = `#/components/schemas/${schemaToPatch}`
if (
!patchesObj[schemaName].schemaToPatchPointers.includes(
schemaToPatchPointer
)
) {
patchesObj[schemaName].schemaToPatchPointers.push(schemaToPatchPointer)
}
}
}
for (const key in patchesObj) {
patches.push(patchesObj[key])
}
return patches
}
function applyPatch(node, schemaName) {
delete node["$ref"]
node.type = "object"
if (!node.description && schemaName) {
node.description = `${schemaName} object.`
}
}
function CircularPatch({ schemas = {}, verbose = false }) {
const logs = []
const patches = preparePatches(schemas)
const refPathPrefix = "#/components/schemas/"
const refPathPrefixLength = refPathPrefix.length
const refPathPrefixRegex = /#\/components\/schemas\/\w+/
return {
ref(ref, ctx, resolved) {
if (
ctx.type.name.toLowerCase() !== "schema" ||
!resolved?.location?.pointer
) {
return
}
for (const patch of patches) {
if (resolved.location.pointer !== patch.schemaPointer) {
continue
}
const ctxSchemaPointer =
ctx.location.pointer.match(refPathPrefixRegex)[0]
if (!patch.schemaToPatchPointers.includes(ctxSchemaPointer)) {
continue
}
applyPatch(ref)
if (verbose) {
logs.push(
`${ctxSchemaPointer.substring(refPathPrefixLength)} patch $ref to ${
patch.schemaName
}`
)
}
}
},
Root: {
leave() {
if (verbose) {
logs.sort()
for (const log of logs) {
console.debug(log)
}
}
},
},
}
}

View File

@@ -0,0 +1,14 @@
const CircularPatch = require("./decorators/circular-patch")
const id = "plugin"
const decorators = {
oas3: {
"circular-patch": CircularPatch,
},
}
module.exports = {
id,
decorators,
}

View File

@@ -19,7 +19,7 @@
"@babel/preset-react": "^7.18.6",
"@babel/register": "^7.11.5",
"@babel/runtime": "^7.11.2",
"@redocly/cli": "latest",
"@redocly/cli": "1.0.0-beta.123",
"@typescript-eslint/eslint-plugin": "^5.36.2",
"@typescript-eslint/parser": "^5.36.2",
"axios": "^0.21.4",

View File

@@ -56,7 +56,11 @@ swaggerInline(
if (!isDryRun) {
fs.writeFileSync("./docs/api/store-spec3.yaml", gen)
exec(
"rm -rf docs/api/store/ && yarn run -- redocly split docs/api/store-spec3.yaml --outDir=docs/api/store/",
[
"rm -rf docs/api/store/",
"yarn run -- redocly bundle docs/api/store-spec3.yaml -o docs/api/store-spec3.yaml --config=docs-util/redocly/config.yaml",
"yarn run -- redocly split docs/api/store-spec3.yaml --outDir=docs/api/store/",
].join(" && "),
(error, stdout, stderr) => {
if (error) {
throw new Error(`error: ${error.message}`)
@@ -123,7 +127,11 @@ swaggerInline(
if (!isDryRun) {
fs.writeFileSync("./docs/api/admin-spec3.yaml", gen)
exec(
"rm -rf docs/api/admin/ && yarn run -- redocly split docs/api/admin-spec3.yaml --outDir=docs/api/admin/",
[
"rm -rf docs/api/admin/",
"yarn run -- redocly bundle docs/api/admin-spec3.yaml -o docs/api/admin-spec3.yaml --config=docs-util/redocly/config.yaml",
"yarn run -- redocly split docs/api/admin-spec3.yaml --outDir=docs/api/admin/",
].join(" && "),
(error, stdout, stderr) => {
if (error) {
throw new Error(`error: ${error.message}`)

326
yarn.lock
View File

@@ -408,7 +408,7 @@ __metadata:
languageName: node
linkType: hard
"@babel/helper-annotate-as-pure@npm:^7.18.6":
"@babel/helper-annotate-as-pure@npm:^7.16.0, @babel/helper-annotate-as-pure@npm:^7.18.6":
version: 7.18.6
resolution: "@babel/helper-annotate-as-pure@npm:7.18.6"
dependencies:
@@ -582,7 +582,7 @@ __metadata:
languageName: node
linkType: hard
"@babel/helper-module-imports@npm:^7.0.0, @babel/helper-module-imports@npm:^7.0.0-beta.49, @babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.12.13, @babel/helper-module-imports@npm:^7.18.6":
"@babel/helper-module-imports@npm:^7.0.0, @babel/helper-module-imports@npm:^7.0.0-beta.49, @babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.12.13, @babel/helper-module-imports@npm:^7.16.0, @babel/helper-module-imports@npm:^7.18.6":
version: 7.18.6
resolution: "@babel/helper-module-imports@npm:7.18.6"
dependencies:
@@ -2092,7 +2092,7 @@ __metadata:
languageName: node
linkType: hard
"@babel/traverse@npm:^7.20.10, @babel/traverse@npm:^7.20.12, @babel/traverse@npm:^7.20.13":
"@babel/traverse@npm:^7.20.10, @babel/traverse@npm:^7.20.12, @babel/traverse@npm:^7.20.13, @babel/traverse@npm:^7.4.5":
version: 7.20.13
resolution: "@babel/traverse@npm:7.20.13"
dependencies:
@@ -2503,7 +2503,7 @@ __metadata:
languageName: node
linkType: hard
"@emotion/is-prop-valid@npm:0.8.8":
"@emotion/is-prop-valid@npm:0.8.8, @emotion/is-prop-valid@npm:^0.8.8":
version: 0.8.8
resolution: "@emotion/is-prop-valid@npm:0.8.8"
dependencies:
@@ -2567,14 +2567,14 @@ __metadata:
languageName: node
linkType: hard
"@emotion/stylis@npm:0.8.5":
"@emotion/stylis@npm:0.8.5, @emotion/stylis@npm:^0.8.4":
version: 0.8.5
resolution: "@emotion/stylis@npm:0.8.5"
checksum: f109e3f11cb0d48e8658aaa23578c5bcfe35e297819cfb089a3de6ba8dc0f89b0960474922690c6028df5d2e1895b4967f2fb280642c030054c312f1e137ce26
languageName: node
linkType: hard
"@emotion/unitless@npm:0.7.5":
"@emotion/unitless@npm:0.7.5, @emotion/unitless@npm:^0.7.4":
version: 0.7.5
resolution: "@emotion/unitless@npm:0.7.5"
checksum: 4d0d94f53cb97b4481bbfa394953e1899a0b877644642ba9dd7247c27eb8c48e14e22aeb11411d7d9874685ad85dd5fb5b50eb78c6d8840eb56a84b92dcef2f4
@@ -5859,44 +5859,49 @@ __metadata:
languageName: node
linkType: hard
"@redocly/ajv@npm:^8.6.4":
version: 8.6.4
resolution: "@redocly/ajv@npm:8.6.4"
"@redocly/ajv@npm:^8.11.0":
version: 8.11.0
resolution: "@redocly/ajv@npm:8.11.0"
dependencies:
fast-deep-equal: ^3.1.1
json-schema-traverse: ^1.0.0
require-from-string: ^2.0.2
uri-js: ^4.2.2
checksum: 07ffbd7480962506e696b675e4fb4b53d188e0871312a75be2d569f3ea081ed9982db6d4575f3c955adcad4742c2af45eb01dc5968937467658bec5500d6a47b
checksum: 7ee77a8304b54189e903c30248282f81638e2bb7dcf8b7cb80e078966999c4de4eb6dabe6ac8406b5c8fe7a1443540e2bd0009d975ac285d38c2426157bc774d
languageName: node
linkType: hard
"@redocly/cli@npm:latest":
version: 1.0.0-beta.105
resolution: "@redocly/cli@npm:1.0.0-beta.105"
"@redocly/cli@npm:1.0.0-beta.123":
version: 1.0.0-beta.123
resolution: "@redocly/cli@npm:1.0.0-beta.123"
dependencies:
"@redocly/openapi-core": 1.0.0-beta.105
"@redocly/openapi-core": 1.0.0-beta.123
assert-node-version: ^1.0.3
chokidar: ^3.5.1
colorette: ^1.2.0
glob: ^7.1.6
glob-promise: ^3.4.0
handlebars: ^4.7.6
mobx: ^6.3.2
portfinder: ^1.0.26
react: ^17.0.1
react-dom: ^17.0.1
redoc: ~2.0.0
simple-websocket: ^9.0.0
styled-components: 5.3.3
yargs: 17.0.1
bin:
openapi: bin/cli.js
redocly: bin/cli.js
checksum: 1431b538c7e541cdbcf27784942a32f834f6430cf7385e3dae21f764bde4fb097ab6b69e209c3ee0ba01b2aca07f4edab3a4d46b7670677cb64aba42fc45d01e
checksum: dfc2e86894c48acecc3f40f4fd114d21863eb58a7ed7796cdc95926fa47b0d11067ba08838d6b9459f47056b06c9b25ea5c7cfb940e2878336901726528f0f2c
languageName: node
linkType: hard
"@redocly/openapi-core@npm:1.0.0-beta.105":
version: 1.0.0-beta.105
resolution: "@redocly/openapi-core@npm:1.0.0-beta.105"
"@redocly/openapi-core@npm:1.0.0-beta.123, @redocly/openapi-core@npm:^1.0.0-beta.104":
version: 1.0.0-beta.123
resolution: "@redocly/openapi-core@npm:1.0.0-beta.123"
dependencies:
"@redocly/ajv": ^8.6.4
"@redocly/ajv": ^8.11.0
"@types/node": ^14.11.8
colorette: ^1.2.0
js-levenshtein: ^1.1.6
@@ -5906,7 +5911,7 @@ __metadata:
node-fetch: ^2.6.1
pluralize: ^8.0.0
yaml-ast-parser: 0.0.43
checksum: e7ba983158815ead9bf40f813bef5beef6646564e31a50cde50400d19b56194a7af0ce50225080422efe63240167b572846bb894cb18a9c2972648784acf9b7c
checksum: c19938ea966e96da688a3a5ab61d84d761c82c5c29e6a56513fdc07b393d8159fe925c1835ed0504ad5c460bf067179d5ba4fff9a2990d3f856fc95fe615c2e9
languageName: node
linkType: hard
@@ -10842,6 +10847,21 @@ __metadata:
languageName: node
linkType: hard
"babel-plugin-styled-components@npm:>= 1.12.0":
version: 2.0.7
resolution: "babel-plugin-styled-components@npm:2.0.7"
dependencies:
"@babel/helper-annotate-as-pure": ^7.16.0
"@babel/helper-module-imports": ^7.16.0
babel-plugin-syntax-jsx: ^6.18.0
lodash: ^4.17.11
picomatch: ^2.3.0
peerDependencies:
styled-components: ">= 2"
checksum: 1c639742fb177f36648077a44fd473fe050aa5c664a16ecaa8e366426c44520c2a0011682b90f5b62f3c4317c22938410a6044b7cd99eaba831c00d41a2395c1
languageName: node
linkType: hard
"babel-plugin-syntax-jsx@npm:^6.18.0":
version: 6.18.0
resolution: "babel-plugin-syntax-jsx@npm:6.18.0"
@@ -11991,6 +12011,13 @@ __metadata:
languageName: node
linkType: hard
"camelize@npm:^1.0.0":
version: 1.0.1
resolution: "camelize@npm:1.0.1"
checksum: 4c9ac55efd356d37ac483bad3093758236ab686192751d1c9daa43188cc5a07b09bd431eb7458a4efd9ca22424bba23253e7b353feb35d7c749ba040de2385fb
languageName: node
linkType: hard
"can-use-dom@npm:^0.1.0":
version: 0.1.0
resolution: "can-use-dom@npm:0.1.0"
@@ -12338,6 +12365,13 @@ __metadata:
languageName: node
linkType: hard
"classnames@npm:^2.3.1":
version: 2.3.2
resolution: "classnames@npm:2.3.2"
checksum: cd50ead57b4f97436aaa9f9885c6926323efc7c2bea8e3d4eb10e4e972aa6a1cfca1c7a0e06f8a199ca7498d4339e30bb6002e589e61c9f21248cbf3e8b0b18d
languageName: node
linkType: hard
"clean-css@npm:^4.2.3":
version: 4.2.4
resolution: "clean-css@npm:4.2.4"
@@ -12573,6 +12607,13 @@ __metadata:
languageName: node
linkType: hard
"clsx@npm:^1.1.0":
version: 1.2.1
resolution: "clsx@npm:1.2.1"
checksum: 34dead8bee24f5e96f6e7937d711978380647e936a22e76380290e35486afd8634966ce300fc4b74a32f3762c7d4c0303f442c3e259f4ce02374eb0c82834f27
languageName: node
linkType: hard
"cluster-key-slot@npm:^1.1.0":
version: 1.1.0
resolution: "cluster-key-slot@npm:1.1.0"
@@ -13534,6 +13575,13 @@ __metadata:
languageName: node
linkType: hard
"css-color-keywords@npm:^1.0.0":
version: 1.0.0
resolution: "css-color-keywords@npm:1.0.0"
checksum: af205a86c68e0051846ed91eb3e30b4517e1904aac040013ff1d742019b3f9369ba5658ba40901dbbc121186fc4bf0e75a814321cc3e3182fbb2feb81c6d9cb7
languageName: node
linkType: hard
"css-declaration-sorter@npm:^6.3.0":
version: 6.3.0
resolution: "css-declaration-sorter@npm:6.3.0"
@@ -13621,6 +13669,17 @@ __metadata:
languageName: node
linkType: hard
"css-to-react-native@npm:^3.0.0":
version: 3.1.0
resolution: "css-to-react-native@npm:3.1.0"
dependencies:
camelize: ^1.0.0
css-color-keywords: ^1.0.0
postcss-value-parser: ^4.0.2
checksum: 30e91d063b8c57cab84ca0e16750d64a8e497c65673c793c7270e258dcd5af773d70542f8db07a14e645249619a9479020f4f890f78ff27d1bfc4610c67ad11f
languageName: node
linkType: hard
"css-tree@npm:^1.1.2, css-tree@npm:^1.1.3":
version: 1.1.3
resolution: "css-tree@npm:1.1.3"
@@ -13995,6 +14054,13 @@ __metadata:
languageName: node
linkType: hard
"decko@npm:^1.2.0":
version: 1.2.0
resolution: "decko@npm:1.2.0"
checksum: bae2187734b6faa9db1cf53b04bb107f79a55735d85c7511f941d7fd1cac36991ad2048dee8451dcbcb4efa23a46e5dfd46f71a51585457cd5b912869b5d346b
languageName: node
linkType: hard
"decode-uri-component@npm:^0.2.0":
version: 0.2.0
resolution: "decode-uri-component@npm:0.2.0"
@@ -14551,6 +14617,13 @@ __metadata:
languageName: node
linkType: hard
"dompurify@npm:^2.2.8":
version: 2.4.3
resolution: "dompurify@npm:2.4.3"
checksum: 4c93f5bc8855bbe7dcb33487c0b252a00309fbd8a6d0ec280abbc3af695b43d1bf7f526c2f323fa697314b0b3de3511c756005dddc6ed90d1a1440a3d6ff89d9
languageName: node
linkType: hard
"domutils@npm:^2.5.2, domutils@npm:^2.8.0":
version: 2.8.0
resolution: "domutils@npm:2.8.0"
@@ -16096,7 +16169,7 @@ __metadata:
languageName: node
linkType: hard
"eventemitter3@npm:^4.0.0, eventemitter3@npm:^4.0.4":
"eventemitter3@npm:^4.0.0, eventemitter3@npm:^4.0.4, eventemitter3@npm:^4.0.7":
version: 4.0.7
resolution: "eventemitter3@npm:4.0.7"
checksum: 5f6d97cbcbac47be798e6355e3a7639a84ee1f7d9b199a07017f1d2f1e2fe236004d14fa5dfaeba661f94ea57805385e326236a6debbc7145c8877fbc0297c6b
@@ -17119,6 +17192,13 @@ __metadata:
languageName: node
linkType: hard
"foreach@npm:^2.0.4":
version: 2.0.6
resolution: "foreach@npm:2.0.6"
checksum: dc79f83997ac986dadbc95b4035ce8b86699fb654eb85446b0ad779fe69d567fc9894075e460243ca8bc20adb8fd178ad203aef66dc3c620ac78b18a4cb7059c
languageName: node
linkType: hard
"foreground-child@npm:^2.0.0":
version: 2.0.0
resolution: "foreground-child@npm:2.0.0"
@@ -19006,7 +19086,7 @@ __metadata:
languageName: node
linkType: hard
"hoist-non-react-statics@npm:^3.3.0":
"hoist-non-react-statics@npm:^3.0.0, hoist-non-react-statics@npm:^3.3.0":
version: 3.3.2
resolution: "hoist-non-react-statics@npm:3.3.2"
dependencies:
@@ -22869,6 +22949,15 @@ __metadata:
languageName: node
linkType: hard
"json-pointer@npm:0.6.2, json-pointer@npm:^0.6.2":
version: 0.6.2
resolution: "json-pointer@npm:0.6.2"
dependencies:
foreach: ^2.0.4
checksum: 47f6103032c0340b3392cb650e0ec817f785eccb553407da13fae85bc535483c9b359d7e756de4ed73130172c28d2b02f8beb53a700a98b12e72c7bf70e734b7
languageName: node
linkType: hard
"json-schema-traverse@npm:^0.4.1":
version: 0.4.1
resolution: "json-schema-traverse@npm:0.4.1"
@@ -24266,6 +24355,13 @@ __metadata:
languageName: node
linkType: hard
"mark.js@npm:^8.11.1":
version: 8.11.1
resolution: "mark.js@npm:8.11.1"
checksum: 5e69e776db61abdd857b5cbb7070c8a3b1b0e5c12bf077fcd5a8c6f17b1f85ed65275aba5662b57136d1b9f82b54bb34d4ef4220f7703c9a7ab806ae1e208cff
languageName: node
linkType: hard
"markdown-escapes@npm:^1.0.0":
version: 1.0.4
resolution: "markdown-escapes@npm:1.0.4"
@@ -24312,6 +24408,15 @@ __metadata:
languageName: node
linkType: hard
"marked@npm:^4.0.15":
version: 4.2.12
resolution: "marked@npm:4.2.12"
bin:
marked: bin/marked.js
checksum: ce8a2d0def715480f23ade1ee72ad74c9cdfe614442da88dac22049500566cf3e6a1fa41e70c4061bb378beba9896bb4bd542f58aa4a30c1f431e553a461ffe6
languageName: node
linkType: hard
"marked@npm:^4.0.18":
version: 4.0.18
resolution: "marked@npm:4.0.18"
@@ -25931,6 +26036,45 @@ __metadata:
languageName: node
linkType: hard
"mobx-react-lite@npm:^3.4.0":
version: 3.4.0
resolution: "mobx-react-lite@npm:3.4.0"
peerDependencies:
mobx: ^6.1.0
react: ^16.8.0 || ^17 || ^18
peerDependenciesMeta:
react-dom:
optional: true
react-native:
optional: true
checksum: 7aa64fb8740d48de23c370385331063f0a0821a87ed7a1eb0324305e8ef2f5173806c3e5ff2bfb7696e5b80faf19de11e2d3c0b64268df21895d4eec4816e325
languageName: node
linkType: hard
"mobx-react@npm:^7.2.0":
version: 7.6.0
resolution: "mobx-react@npm:7.6.0"
dependencies:
mobx-react-lite: ^3.4.0
peerDependencies:
mobx: ^6.1.0
react: ^16.8.0 || ^17 || ^18
peerDependenciesMeta:
react-dom:
optional: true
react-native:
optional: true
checksum: 60f619edb999b9c66a86baa7ab5cf8b1f3651c85c16f2aa8adf3c0c553d52bc0ec083bbd42e8fe0c785f2435a7b1afdf20f103553b80bbf6d28616f160baa144
languageName: node
linkType: hard
"mobx@npm:^6.3.2":
version: 6.7.0
resolution: "mobx@npm:6.7.0"
checksum: 91c09333073a6103d62cfcce133817402723eead9500a85ace8f39404b86ffdba19e9fc792fc626a9c872eeeae8437c445f80eedf6914f7f950b83d44f795b03
languageName: node
linkType: hard
"moment-timezone@npm:^0.5.31":
version: 0.5.34
resolution: "moment-timezone@npm:0.5.34"
@@ -27167,6 +27311,16 @@ __metadata:
languageName: node
linkType: hard
"openapi-sampler@npm:^1.3.0":
version: 1.3.1
resolution: "openapi-sampler@npm:1.3.1"
dependencies:
"@types/json-schema": ^7.0.7
json-pointer: 0.6.2
checksum: f394298c62decd027f418671e65c1aaee98be206788f4ba575c3d4e383c41d05a10d81968aad8d51f52f4aaa6acbdb0f97d0d192da06c8d7424e772cd13d2814
languageName: node
linkType: hard
"opencollective-postinstall@npm:^2.0.0":
version: 2.0.3
resolution: "opencollective-postinstall@npm:2.0.3"
@@ -27811,6 +27965,13 @@ __metadata:
languageName: node
linkType: hard
"path-browserify@npm:^1.0.1":
version: 1.0.1
resolution: "path-browserify@npm:1.0.1"
checksum: 8b8c3fd5c66bd340272180590ae4ff139769e9ab79522e2eb82e3d571a89b8117c04147f65ad066dccfb42fcad902e5b7d794b3d35e0fd840491a8ddbedf8c66
languageName: node
linkType: hard
"path-case@npm:^3.0.4":
version: 3.0.4
resolution: "path-case@npm:3.0.4"
@@ -27965,6 +28126,13 @@ __metadata:
languageName: node
linkType: hard
"perfect-scrollbar@npm:^1.5.5":
version: 1.5.5
resolution: "perfect-scrollbar@npm:1.5.5"
checksum: 10f0c3a1205328b22e232be4ee9f0e832e96fb5b6c524d1d04e11f97ad910018c1c0659af145e0ae0dc2b41e67a96df12787de5366ff5ba86034339071ca722b
languageName: node
linkType: hard
"performance-now@npm:^2.1.0":
version: 2.1.0
resolution: "performance-now@npm:2.1.0"
@@ -28255,7 +28423,7 @@ __metadata:
languageName: node
linkType: hard
"polished@npm:^4.2.2":
"polished@npm:^4.1.3, polished@npm:^4.2.2":
version: 4.2.2
resolution: "polished@npm:4.2.2"
dependencies:
@@ -28780,7 +28948,7 @@ __metadata:
languageName: node
linkType: hard
"postcss-value-parser@npm:^4.1.0, postcss-value-parser@npm:^4.2.0":
"postcss-value-parser@npm:^4.0.2, postcss-value-parser@npm:^4.1.0, postcss-value-parser@npm:^4.2.0":
version: 4.2.0
resolution: "postcss-value-parser@npm:4.2.0"
checksum: f4142a4f56565f77c1831168e04e3effd9ffcc5aebaf0f538eee4b2d465adfd4b85a44257bb48418202a63806a7da7fe9f56c330aebb3cac898e46b4cbf49161
@@ -29114,7 +29282,7 @@ __metadata:
languageName: node
linkType: hard
"prop-types@npm:^15.0.0, prop-types@npm:^15.6.0, prop-types@npm:^15.6.1, prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1":
"prop-types@npm:^15.0.0, prop-types@npm:^15.5.0, prop-types@npm:^15.6.0, prop-types@npm:^15.6.1, prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1":
version: 15.8.1
resolution: "prop-types@npm:15.8.1"
dependencies:
@@ -29611,7 +29779,7 @@ __metadata:
languageName: node
linkType: hard
"react-dom@npm:^17.0.2":
"react-dom@npm:^17.0.1, react-dom@npm:^17.0.2":
version: 17.0.2
resolution: "react-dom@npm:17.0.2"
dependencies:
@@ -29836,6 +30004,18 @@ __metadata:
languageName: node
linkType: hard
"react-tabs@npm:^3.2.2":
version: 3.2.3
resolution: "react-tabs@npm:3.2.3"
dependencies:
clsx: ^1.1.0
prop-types: ^15.5.0
peerDependencies:
react: ^16.3.0 || ^17.0.0-0
checksum: 1891471b3708ceb3292c05fa51cc9ea7fb40c2f85b9c7494d368d563d73cd6c4ae6e65e06c42fc9595f637885f42685a64581a54832a1675526f2631a35b8d3b
languageName: node
linkType: hard
"react-textarea-autosize@npm:^7.1.0":
version: 7.1.2
resolution: "react-textarea-autosize@npm:7.1.2"
@@ -29872,7 +30052,7 @@ __metadata:
languageName: node
linkType: hard
"react@npm:^17.0.2":
"react@npm:^17.0.1, react@npm:^17.0.2":
version: 17.0.2
resolution: "react@npm:17.0.2"
dependencies:
@@ -30101,6 +30281,42 @@ __metadata:
languageName: node
linkType: hard
"redoc@npm:~2.0.0":
version: 2.0.0
resolution: "redoc@npm:2.0.0"
dependencies:
"@redocly/openapi-core": ^1.0.0-beta.104
classnames: ^2.3.1
decko: ^1.2.0
dompurify: ^2.2.8
eventemitter3: ^4.0.7
json-pointer: ^0.6.2
lunr: ^2.3.9
mark.js: ^8.11.1
marked: ^4.0.15
mobx-react: ^7.2.0
openapi-sampler: ^1.3.0
path-browserify: ^1.0.1
perfect-scrollbar: ^1.5.5
polished: ^4.1.3
prismjs: ^1.27.0
prop-types: ^15.7.2
react-tabs: ^3.2.2
slugify: ~1.4.7
stickyfill: ^1.1.1
style-loader: ^3.3.1
swagger2openapi: ^7.0.6
url-template: ^2.0.8
peerDependencies:
core-js: ^3.1.4
mobx: ^6.0.4
react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0
styled-components: ^4.1.1 || ^5.1.1
checksum: 85efe6fa97aa9932c6cea72f726086c8af14f5058b67aeccf011111548a96b55b5c31237d28c0a5a16934d223117982e80ea81cc9a39879b23b5acfa1b18df04
languageName: node
linkType: hard
"redux-thunk@npm:^2.4.0":
version: 2.4.1
resolution: "redux-thunk@npm:2.4.1"
@@ -30931,7 +31147,7 @@ __metadata:
"@changesets/cli": ^2.26.0
"@linear/sdk": ^1.22.0
"@octokit/core": ^4.0.5
"@redocly/cli": latest
"@redocly/cli": 1.0.0-beta.123
"@typescript-eslint/eslint-plugin": ^5.36.2
"@typescript-eslint/parser": ^5.36.2
axios: ^0.21.4
@@ -31825,6 +32041,13 @@ __metadata:
languageName: node
linkType: hard
"slugify@npm:~1.4.7":
version: 1.4.7
resolution: "slugify@npm:1.4.7"
checksum: 27d31bac7bd28a7a702ab7b18996d2a41086d81a97cdc5487f131d7cedb009a745bcd10c8b263e48deb9f055e6c5a6b0bdb37f1156d5dd29b66f8ba981945302
languageName: node
linkType: hard
"smart-buffer@npm:^4.2.0":
version: 4.2.0
resolution: "smart-buffer@npm:4.2.0"
@@ -32351,6 +32574,13 @@ __metadata:
languageName: node
linkType: hard
"stickyfill@npm:^1.1.1":
version: 1.1.1
resolution: "stickyfill@npm:1.1.1"
checksum: 8f11804fd3bba852cf3277dc4d6366a2bd592d3f7f3d9ab30b7adab4190a20e1296960b5107257081645b0d28afcbbab9f80e347cc425f2cd72b0a4f6917b4ab
languageName: node
linkType: hard
"store2@npm:^2.12.0, store2@npm:^2.7.1":
version: 2.13.2
resolution: "store2@npm:2.13.2"
@@ -32812,6 +33042,15 @@ __metadata:
languageName: node
linkType: hard
"style-loader@npm:^3.3.1":
version: 3.3.1
resolution: "style-loader@npm:3.3.1"
peerDependencies:
webpack: ^5.0.0
checksum: b325f4ce5d0ee9797878d9db42a5c45ef6d757ad42de85bc550ef90c2fb78b762bbdff3214ddf1f4c8e1307fe1879fc47ea34ee48f8f56191309f8fc28f4d2b6
languageName: node
linkType: hard
"style-to-object@npm:0.3.0, style-to-object@npm:^0.3.0":
version: 0.3.0
resolution: "style-to-object@npm:0.3.0"
@@ -32821,6 +33060,28 @@ __metadata:
languageName: node
linkType: hard
"styled-components@npm:5.3.3":
version: 5.3.3
resolution: "styled-components@npm:5.3.3"
dependencies:
"@babel/helper-module-imports": ^7.0.0
"@babel/traverse": ^7.4.5
"@emotion/is-prop-valid": ^0.8.8
"@emotion/stylis": ^0.8.4
"@emotion/unitless": ^0.7.4
babel-plugin-styled-components: ">= 1.12.0"
css-to-react-native: ^3.0.0
hoist-non-react-statics: ^3.0.0
shallowequal: ^1.1.0
supports-color: ^5.5.0
peerDependencies:
react: ">= 16.8.0"
react-dom: ">= 16.8.0"
react-is: ">= 16.8.0"
checksum: 0fda77406c668a16c753f0778850a90d5fbeae419791dac533e3f67e77f8c767d89022626aafa169fffe8b0873e15bf71126b2bab945dc98af6079d8b90e7488
languageName: node
linkType: hard
"stylehacks@npm:^5.1.0":
version: 5.1.0
resolution: "stylehacks@npm:5.1.0"
@@ -32984,7 +33245,7 @@ __metadata:
languageName: node
linkType: hard
"swagger2openapi@npm:^7.0.8":
"swagger2openapi@npm:^7.0.6, swagger2openapi@npm:^7.0.8":
version: 7.0.8
resolution: "swagger2openapi@npm:7.0.8"
dependencies:
@@ -34918,6 +35179,13 @@ __metadata:
languageName: node
linkType: hard
"url-template@npm:^2.0.8":
version: 2.0.8
resolution: "url-template@npm:2.0.8"
checksum: 56a15057eacbcf05d52b0caed8279c8451b3dd9d32856a1fdd91c6dc84dcb1646f12bafc756b7ade62ca5b1564da8efd7baac5add35868bafb43eb024c62805b
languageName: node
linkType: hard
"url@npm:0.10.3":
version: 0.10.3
resolution: "url@npm:0.10.3"