diff --git a/.pnp.cjs b/.pnp.cjs index a0d2b457c0..c3c838de98 100644 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -107,7 +107,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@babel/preset-env", "virtual:81cc2531fc6bda045c87d6c3b21351574209a7d87ba11b639412d754d2fbdd0831d00d35ee7d39be3226e871d899842f300a82fbfbdd17e263ce302a51c65de6#npm:7.19.1"],\ ["@babel/preset-react", "virtual:81cc2531fc6bda045c87d6c3b21351574209a7d87ba11b639412d754d2fbdd0831d00d35ee7d39be3226e871d899842f300a82fbfbdd17e263ce302a51c65de6#npm:7.22.15"],\ ["@babel/preset-typescript", "virtual:81cc2531fc6bda045c87d6c3b21351574209a7d87ba11b639412d754d2fbdd0831d00d35ee7d39be3226e871d899842f300a82fbfbdd17e263ce302a51c65de6#npm:7.18.6"],\ - ["@blueprintjs/eslint-plugin", "npm:2.1.2"],\ + ["@blueprintjs/eslint-plugin", "npm:6.1.0"],\ ["@types/is-ci", "npm:3.0.4"],\ ["@types/jest", "npm:29.5.11"],\ ["@types/lodash-es", "npm:4.17.12"],\ @@ -3532,41 +3532,46 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@blueprintjs/colors", [\ - ["npm:4.1.8", {\ - "packageLocation": "./.yarn/cache/@blueprintjs-colors-npm-4.1.8-423f99131d-a9fb3363d1.zip/node_modules/@blueprintjs/colors/",\ + ["npm:5.0.9", {\ + "packageLocation": "./.yarn/cache/@blueprintjs-colors-npm-5.0.9-546285c27d-58246ca9a7.zip/node_modules/@blueprintjs/colors/",\ "packageDependencies": [\ - ["@blueprintjs/colors", "npm:4.1.8"]\ + ["@blueprintjs/colors", "npm:5.0.9"],\ + ["tslib", "npm:2.6.2"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@blueprintjs/core", [\ - ["npm:4.11.5", {\ - "packageLocation": "./.yarn/cache/@blueprintjs-core-npm-4.11.5-3f2c334c30-0ce0d2236c.zip/node_modules/@blueprintjs/core/",\ + ["npm:5.8.1", {\ + "packageLocation": "./.yarn/cache/@blueprintjs-core-npm-5.8.1-97817e2227-938bc0bf64.zip/node_modules/@blueprintjs/core/",\ "packageDependencies": [\ - ["@blueprintjs/core", "npm:4.11.5"]\ + ["@blueprintjs/core", "npm:5.8.1"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:4.11.5", {\ - "packageLocation": "./.yarn/__virtual__/@blueprintjs-core-virtual-32f2cc5aa9/0/cache/@blueprintjs-core-npm-4.11.5-3f2c334c30-0ce0d2236c.zip/node_modules/@blueprintjs/core/",\ + ["npm:5.8.2", {\ + "packageLocation": "./.yarn/cache/@blueprintjs-core-npm-5.8.2-0b8a2ac3e1-f8480389af.zip/node_modules/@blueprintjs/core/",\ "packageDependencies": [\ - ["@blueprintjs/core", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:4.11.5"],\ - ["@blueprintjs/colors", "npm:4.1.8"],\ - ["@blueprintjs/icons", "npm:4.9.0"],\ - ["@juggle/resize-observer", "npm:3.4.0"],\ - ["@types/dom4", "npm:2.0.2"],\ + ["@blueprintjs/core", "npm:5.8.2"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:5.8.1", {\ + "packageLocation": "./.yarn/__virtual__/@blueprintjs-core-virtual-12f0dbd532/0/cache/@blueprintjs-core-npm-5.8.1-97817e2227-938bc0bf64.zip/node_modules/@blueprintjs/core/",\ + "packageDependencies": [\ + ["@blueprintjs/core", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:5.8.1"],\ + ["@blueprintjs/colors", "npm:5.0.9"],\ + ["@blueprintjs/icons", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:5.7.0"],\ + ["@popperjs/core", "npm:2.11.8"],\ ["@types/react", "npm:18.0.20"],\ ["@types/react-dom", null],\ ["classnames", "npm:2.3.1"],\ - ["dom4", "npm:2.1.6"],\ ["normalize.css", "npm:8.0.1"],\ - ["popper.js", "npm:1.16.1"],\ ["react", "npm:18.2.0"],\ ["react-dom", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:18.2.0"],\ - ["react-popper", "virtual:32f2cc5aa91e2c93a34690720c76f42ce6200c553152bd83f798c20ed52a4382372f74822a568b08017b047641b45bd82532c25cb928b49314e24467477ea2c3#npm:1.3.11"],\ - ["react-transition-group", "virtual:32f2cc5aa91e2c93a34690720c76f42ce6200c553152bd83f798c20ed52a4382372f74822a568b08017b047641b45bd82532c25cb928b49314e24467477ea2c3#npm:4.4.5"],\ - ["tslib", "npm:2.3.1"]\ + ["react-popper", "virtual:12f0dbd532a540be73fd452f90d2fe8d5c4fdf973bab4973c5d08fba1a179ff60e1642c42ed0011f693478d5adba909c1bab5c64e53e6b1e34accd86be561caf#npm:2.3.0"],\ + ["react-transition-group", "virtual:12f0dbd532a540be73fd452f90d2fe8d5c4fdf973bab4973c5d08fba1a179ff60e1642c42ed0011f693478d5adba909c1bab5c64e53e6b1e34accd86be561caf#npm:4.4.5"],\ + ["tslib", "npm:2.6.2"]\ ],\ "packagePeers": [\ "@types/react-dom",\ @@ -3576,25 +3581,72 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:44580d8410e4d971649da315cde171126d24493e1706e560c93a65d81b96bdf88f24e77459a8c3c6c0369c524d18da458ce73c9d13e099ef95b8c7c66d89e62a#npm:4.11.5", {\ - "packageLocation": "./.yarn/__virtual__/@blueprintjs-core-virtual-34db86cdb7/0/cache/@blueprintjs-core-npm-4.11.5-3f2c334c30-0ce0d2236c.zip/node_modules/@blueprintjs/core/",\ + ["virtual:3e15f123fa60f3a21c3200c61f0f4cd2cc2baa7e0bc47b9e21f659b954501f75b22b15f0ee46445729b25a6c108b0bbb87ad967a4afcee6a9d133905b2da674c#npm:5.8.2", {\ + "packageLocation": "./.yarn/__virtual__/@blueprintjs-core-virtual-52afeed0dc/0/cache/@blueprintjs-core-npm-5.8.2-0b8a2ac3e1-f8480389af.zip/node_modules/@blueprintjs/core/",\ "packageDependencies": [\ - ["@blueprintjs/core", "virtual:44580d8410e4d971649da315cde171126d24493e1706e560c93a65d81b96bdf88f24e77459a8c3c6c0369c524d18da458ce73c9d13e099ef95b8c7c66d89e62a#npm:4.11.5"],\ - ["@blueprintjs/colors", "npm:4.1.8"],\ - ["@blueprintjs/icons", "npm:4.9.0"],\ - ["@juggle/resize-observer", "npm:3.4.0"],\ - ["@types/dom4", "npm:2.0.2"],\ + ["@blueprintjs/core", "virtual:3e15f123fa60f3a21c3200c61f0f4cd2cc2baa7e0bc47b9e21f659b954501f75b22b15f0ee46445729b25a6c108b0bbb87ad967a4afcee6a9d133905b2da674c#npm:5.8.2"],\ + ["@blueprintjs/colors", "npm:5.0.9"],\ + ["@blueprintjs/icons", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:5.7.0"],\ + ["@popperjs/core", "npm:2.11.8"],\ + ["@types/react", "npm:18.0.20"],\ + ["@types/react-dom", "npm:18.2.18"],\ + ["classnames", "npm:2.3.1"],\ + ["normalize.css", "npm:8.0.1"],\ + ["react", "npm:18.2.0"],\ + ["react-dom", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:18.2.0"],\ + ["react-popper", "virtual:d2059c01bad8c87a960b7c316c717ff4d401763b53ca0bcceba53192f92d96077662942ff5d2f83d3edd879296685f5879e2141a8e458aa09fbc478e496ca744#npm:2.3.0"],\ + ["react-transition-group", "virtual:d2059c01bad8c87a960b7c316c717ff4d401763b53ca0bcceba53192f92d96077662942ff5d2f83d3edd879296685f5879e2141a8e458aa09fbc478e496ca744#npm:4.4.5"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/react-dom",\ + "@types/react",\ + "react-dom",\ + "react"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:44580d8410e4d971649da315cde171126d24493e1706e560c93a65d81b96bdf88f24e77459a8c3c6c0369c524d18da458ce73c9d13e099ef95b8c7c66d89e62a#npm:5.8.1", {\ + "packageLocation": "./.yarn/__virtual__/@blueprintjs-core-virtual-4a7ecb2d28/0/cache/@blueprintjs-core-npm-5.8.1-97817e2227-938bc0bf64.zip/node_modules/@blueprintjs/core/",\ + "packageDependencies": [\ + ["@blueprintjs/core", "virtual:44580d8410e4d971649da315cde171126d24493e1706e560c93a65d81b96bdf88f24e77459a8c3c6c0369c524d18da458ce73c9d13e099ef95b8c7c66d89e62a#npm:5.8.1"],\ + ["@blueprintjs/colors", "npm:5.0.9"],\ + ["@blueprintjs/icons", "virtual:4a7ecb2d289a88e991260955c9429422d3abc1273bae01d27f77ddb8fc42a083b71948cb5721b8c2e132d36234a6167fd53f454f3365c9b4e0b733b8fc8f74d0#npm:5.7.0"],\ + ["@popperjs/core", "npm:2.11.8"],\ ["@types/react", null],\ ["@types/react-dom", null],\ ["classnames", "npm:2.3.1"],\ - ["dom4", "npm:2.1.6"],\ ["normalize.css", "npm:8.0.1"],\ - ["popper.js", "npm:1.16.1"],\ ["react", "npm:18.2.0"],\ ["react-dom", "virtual:b977a69fb19c4d0f85f8b91df4d5bbb0d247e9cfda57636e95b33f40dfc5a05b68c27a163035a0eb7204d129d5e24e42811c10b0902ee38cf8cf4debee72619b#npm:18.2.0"],\ - ["react-popper", "virtual:34db86cdb776b05939f8ab1da6245aed232b9dae3750065b50f25c364657d6668761675ddb233bf4d168aca38f30d98aa9dbeee9dc812eafe7555a2dcc450a8d#npm:1.3.11"],\ - ["react-transition-group", "virtual:34db86cdb776b05939f8ab1da6245aed232b9dae3750065b50f25c364657d6668761675ddb233bf4d168aca38f30d98aa9dbeee9dc812eafe7555a2dcc450a8d#npm:4.4.5"],\ - ["tslib", "npm:2.3.1"]\ + ["react-popper", "virtual:4a7ecb2d289a88e991260955c9429422d3abc1273bae01d27f77ddb8fc42a083b71948cb5721b8c2e132d36234a6167fd53f454f3365c9b4e0b733b8fc8f74d0#npm:2.3.0"],\ + ["react-transition-group", "virtual:4a7ecb2d289a88e991260955c9429422d3abc1273bae01d27f77ddb8fc42a083b71948cb5721b8c2e132d36234a6167fd53f454f3365c9b4e0b733b8fc8f74d0#npm:4.4.5"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/react-dom",\ + "@types/react",\ + "react-dom",\ + "react"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:5.8.1", {\ + "packageLocation": "./.yarn/__virtual__/@blueprintjs-core-virtual-d2059c01ba/0/cache/@blueprintjs-core-npm-5.8.1-97817e2227-938bc0bf64.zip/node_modules/@blueprintjs/core/",\ + "packageDependencies": [\ + ["@blueprintjs/core", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:5.8.1"],\ + ["@blueprintjs/colors", "npm:5.0.9"],\ + ["@blueprintjs/icons", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:5.7.0"],\ + ["@popperjs/core", "npm:2.11.8"],\ + ["@types/react", "npm:18.0.20"],\ + ["@types/react-dom", "npm:18.2.18"],\ + ["classnames", "npm:2.3.1"],\ + ["normalize.css", "npm:8.0.1"],\ + ["react", "npm:18.2.0"],\ + ["react-dom", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:18.2.0"],\ + ["react-popper", "virtual:d2059c01bad8c87a960b7c316c717ff4d401763b53ca0bcceba53192f92d96077662942ff5d2f83d3edd879296685f5879e2141a8e458aa09fbc478e496ca744#npm:2.3.0"],\ + ["react-transition-group", "virtual:d2059c01bad8c87a960b7c316c717ff4d401763b53ca0bcceba53192f92d96077662942ff5d2f83d3edd879296685f5879e2141a8e458aa09fbc478e496ca744#npm:4.4.5"],\ + ["tslib", "npm:2.6.2"]\ ],\ "packagePeers": [\ "@types/react-dom",\ @@ -3605,53 +3657,146 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["@blueprintjs/eslint-plugin", [\ - ["npm:2.1.2", {\ - "packageLocation": "./.yarn/cache/@blueprintjs-eslint-plugin-npm-2.1.2-461eb5c970-cf3fb5279a.zip/node_modules/@blueprintjs/eslint-plugin/",\ + ["@blueprintjs/datetime", [\ + ["npm:5.2.11", {\ + "packageLocation": "./.yarn/cache/@blueprintjs-datetime-npm-5.2.11-9c709ae380-c69470e3c0.zip/node_modules/@blueprintjs/datetime/",\ "packageDependencies": [\ - ["@blueprintjs/eslint-plugin", "npm:2.1.2"],\ - ["@typescript-eslint/utils", "virtual:461eb5c970e9ea6eed2b0236655dfbb10de4d3bc66c90c9df5e3d0caba575590af5c25a89462ba87db765657595adf2cecff67801e41ccd982ffb0364d172431#npm:5.32.0"],\ - ["eslint", "npm:8.26.0"],\ - ["tslib", "npm:2.4.0"]\ + ["@blueprintjs/datetime", "npm:5.2.11"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:5.2.11", {\ + "packageLocation": "./.yarn/__virtual__/@blueprintjs-datetime-virtual-3e15f123fa/0/cache/@blueprintjs-datetime-npm-5.2.11-9c709ae380-c69470e3c0.zip/node_modules/@blueprintjs/datetime/",\ + "packageDependencies": [\ + ["@blueprintjs/datetime", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:5.2.11"],\ + ["@blueprintjs/core", "virtual:3e15f123fa60f3a21c3200c61f0f4cd2cc2baa7e0bc47b9e21f659b954501f75b22b15f0ee46445729b25a6c108b0bbb87ad967a4afcee6a9d133905b2da674c#npm:5.8.2"],\ + ["@blueprintjs/icons", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:5.7.0"],\ + ["@blueprintjs/select", "virtual:3e15f123fa60f3a21c3200c61f0f4cd2cc2baa7e0bc47b9e21f659b954501f75b22b15f0ee46445729b25a6c108b0bbb87ad967a4afcee6a9d133905b2da674c#npm:5.0.23"],\ + ["@types/react", "npm:18.0.20"],\ + ["@types/react-dom", "npm:18.2.18"],\ + ["classnames", "npm:2.3.1"],\ + ["date-fns", "npm:2.30.0"],\ + ["date-fns-tz", "virtual:3e15f123fa60f3a21c3200c61f0f4cd2cc2baa7e0bc47b9e21f659b954501f75b22b15f0ee46445729b25a6c108b0bbb87ad967a4afcee6a9d133905b2da674c#npm:2.0.0"],\ + ["lodash", "npm:4.17.21"],\ + ["react", "npm:18.2.0"],\ + ["react-day-picker", "virtual:3e15f123fa60f3a21c3200c61f0f4cd2cc2baa7e0bc47b9e21f659b954501f75b22b15f0ee46445729b25a6c108b0bbb87ad967a4afcee6a9d133905b2da674c#npm:7.4.9"],\ + ["react-dom", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:18.2.0"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/react-dom",\ + "@types/react",\ + "react-dom",\ + "react"\ ],\ "linkType": "HARD"\ }]\ ]],\ - ["@blueprintjs/icons", [\ - ["npm:4.9.0", {\ - "packageLocation": "./.yarn/cache/@blueprintjs-icons-npm-4.9.0-5eb1e40a09-43d9f1b315.zip/node_modules/@blueprintjs/icons/",\ + ["@blueprintjs/datetime2", [\ + ["npm:2.2.9", {\ + "packageLocation": "./.yarn/cache/@blueprintjs-datetime2-npm-2.2.9-a95144ba37-ef35243cad.zip/node_modules/@blueprintjs/datetime2/",\ "packageDependencies": [\ - ["@blueprintjs/icons", "npm:4.9.0"],\ - ["change-case", "npm:4.1.2"],\ + ["@blueprintjs/datetime2", "npm:2.2.9"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:2.2.9", {\ + "packageLocation": "./.yarn/__virtual__/@blueprintjs-datetime2-virtual-329252a27e/0/cache/@blueprintjs-datetime2-npm-2.2.9-a95144ba37-ef35243cad.zip/node_modules/@blueprintjs/datetime2/",\ + "packageDependencies": [\ + ["@blueprintjs/datetime2", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:2.2.9"],\ + ["@blueprintjs/core", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:5.8.1"],\ + ["@blueprintjs/datetime", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:5.2.11"],\ + ["@blueprintjs/icons", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:5.7.0"],\ + ["@types/react", "npm:18.0.20"],\ + ["@types/react-dom", "npm:18.2.18"],\ ["classnames", "npm:2.3.1"],\ - ["tslib", "npm:2.3.1"]\ + ["date-fns", "npm:2.30.0"],\ + ["react", "npm:18.2.0"],\ + ["react-day-picker", "virtual:329252a27e49932f69418975d73c05dc01d5c3fc89f87c6c327886996920188474fa5405912dbf955a4470276069c982eafb2f34c316d3bed64564007da84a8e#npm:8.10.0"],\ + ["react-dom", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:18.2.0"],\ + ["react-innertext", "virtual:329252a27e49932f69418975d73c05dc01d5c3fc89f87c6c327886996920188474fa5405912dbf955a4470276069c982eafb2f34c316d3bed64564007da84a8e#npm:1.1.5"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/react-dom",\ + "@types/react",\ + "react-dom",\ + "react"\ ],\ "linkType": "HARD"\ }]\ ]],\ - ["@blueprintjs/popover2", [\ - ["npm:1.8.0", {\ - "packageLocation": "./.yarn/cache/@blueprintjs-popover2-npm-1.8.0-f9e6fd492f-59635cbd75.zip/node_modules/@blueprintjs/popover2/",\ + ["@blueprintjs/eslint-plugin", [\ + ["npm:6.1.0", {\ + "packageLocation": "./.yarn/cache/@blueprintjs-eslint-plugin-npm-6.1.0-522d490a83-27171db159.zip/node_modules/@blueprintjs/eslint-plugin/",\ + "packageDependencies": [\ + ["@blueprintjs/eslint-plugin", "npm:6.1.0"],\ + ["@typescript-eslint/utils", "virtual:522d490a837c6b5c29b46fb3fd649aa53767db279f4a13866253f327c8c4b894b4c7e7acfef85a033a4e26b9712ca986662d2c7a942f0212e84b97f588d40b5a#npm:6.18.1"],\ + ["eslint", "npm:8.56.0"],\ + ["tslib", "npm:2.4.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@blueprintjs/icons", [\ + ["npm:5.7.0", {\ + "packageLocation": "./.yarn/cache/@blueprintjs-icons-npm-5.7.0-a4d3151607-d8a938a168.zip/node_modules/@blueprintjs/icons/",\ "packageDependencies": [\ - ["@blueprintjs/popover2", "npm:1.8.0"]\ + ["@blueprintjs/icons", "npm:5.7.0"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:1.8.0", {\ - "packageLocation": "./.yarn/__virtual__/@blueprintjs-popover2-virtual-56c14ef97d/0/cache/@blueprintjs-popover2-npm-1.8.0-f9e6fd492f-59635cbd75.zip/node_modules/@blueprintjs/popover2/",\ + ["virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:5.7.0", {\ + "packageLocation": "./.yarn/__virtual__/@blueprintjs-icons-virtual-b563ae3c95/0/cache/@blueprintjs-icons-npm-5.7.0-a4d3151607-d8a938a168.zip/node_modules/@blueprintjs/icons/",\ "packageDependencies": [\ - ["@blueprintjs/popover2", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:1.8.0"],\ - ["@blueprintjs/core", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:4.11.5"],\ - ["@juggle/resize-observer", "npm:3.4.0"],\ - ["@popperjs/core", "npm:2.11.6"],\ + ["@blueprintjs/icons", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:5.7.0"],\ ["@types/react", "npm:18.0.20"],\ ["@types/react-dom", null],\ + ["change-case", "npm:4.1.2"],\ + ["classnames", "npm:2.3.1"],\ + ["react", "npm:18.2.0"],\ + ["react-dom", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:18.2.0"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/react-dom",\ + "@types/react",\ + "react-dom",\ + "react"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:4a7ecb2d289a88e991260955c9429422d3abc1273bae01d27f77ddb8fc42a083b71948cb5721b8c2e132d36234a6167fd53f454f3365c9b4e0b733b8fc8f74d0#npm:5.7.0", {\ + "packageLocation": "./.yarn/__virtual__/@blueprintjs-icons-virtual-1ed9351d83/0/cache/@blueprintjs-icons-npm-5.7.0-a4d3151607-d8a938a168.zip/node_modules/@blueprintjs/icons/",\ + "packageDependencies": [\ + ["@blueprintjs/icons", "virtual:4a7ecb2d289a88e991260955c9429422d3abc1273bae01d27f77ddb8fc42a083b71948cb5721b8c2e132d36234a6167fd53f454f3365c9b4e0b733b8fc8f74d0#npm:5.7.0"],\ + ["@types/react", null],\ + ["@types/react-dom", null],\ + ["change-case", "npm:4.1.2"],\ + ["classnames", "npm:2.3.1"],\ + ["react", "npm:18.2.0"],\ + ["react-dom", "virtual:b977a69fb19c4d0f85f8b91df4d5bbb0d247e9cfda57636e95b33f40dfc5a05b68c27a163035a0eb7204d129d5e24e42811c10b0902ee38cf8cf4debee72619b#npm:18.2.0"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/react-dom",\ + "@types/react",\ + "react-dom",\ + "react"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:5.7.0", {\ + "packageLocation": "./.yarn/__virtual__/@blueprintjs-icons-virtual-ad15175117/0/cache/@blueprintjs-icons-npm-5.7.0-a4d3151607-d8a938a168.zip/node_modules/@blueprintjs/icons/",\ + "packageDependencies": [\ + ["@blueprintjs/icons", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:5.7.0"],\ + ["@types/react", "npm:18.0.20"],\ + ["@types/react-dom", "npm:18.2.18"],\ + ["change-case", "npm:4.1.2"],\ ["classnames", "npm:2.3.1"],\ - ["dom4", "npm:2.1.6"],\ ["react", "npm:18.2.0"],\ ["react-dom", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:18.2.0"],\ - ["react-popper", "virtual:56c14ef97d126830200f0959510c0270d57f62d38fa81021665704ca1b3a8f9e4e122de58693631c88ce65a37a7bc2b54337d4fc7f18aea91d3b7997f216e804#npm:2.3.0"],\ - ["tslib", "npm:2.3.1"]\ + ["tslib", "npm:2.6.2"]\ ],\ "packagePeers": [\ "@types/react-dom",\ @@ -3663,25 +3808,53 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@blueprintjs/select", [\ - ["npm:4.5.1", {\ - "packageLocation": "./.yarn/cache/@blueprintjs-select-npm-4.5.1-df326c51e2-29d8360720.zip/node_modules/@blueprintjs/select/",\ + ["npm:5.0.22", {\ + "packageLocation": "./.yarn/cache/@blueprintjs-select-npm-5.0.22-f8c2863de7-dfde636033.zip/node_modules/@blueprintjs/select/",\ "packageDependencies": [\ - ["@blueprintjs/select", "npm:4.5.1"]\ + ["@blueprintjs/select", "npm:5.0.22"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:4.5.1", {\ - "packageLocation": "./.yarn/__virtual__/@blueprintjs-select-virtual-9d9370ed37/0/cache/@blueprintjs-select-npm-4.5.1-df326c51e2-29d8360720.zip/node_modules/@blueprintjs/select/",\ + ["npm:5.0.23", {\ + "packageLocation": "./.yarn/cache/@blueprintjs-select-npm-5.0.23-41413e5d03-dca93f736e.zip/node_modules/@blueprintjs/select/",\ "packageDependencies": [\ - ["@blueprintjs/select", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:4.5.1"],\ - ["@blueprintjs/core", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:4.11.5"],\ - ["@blueprintjs/popover2", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:1.8.0"],\ + ["@blueprintjs/select", "npm:5.0.23"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:3e15f123fa60f3a21c3200c61f0f4cd2cc2baa7e0bc47b9e21f659b954501f75b22b15f0ee46445729b25a6c108b0bbb87ad967a4afcee6a9d133905b2da674c#npm:5.0.23", {\ + "packageLocation": "./.yarn/__virtual__/@blueprintjs-select-virtual-7b867869d6/0/cache/@blueprintjs-select-npm-5.0.23-41413e5d03-dca93f736e.zip/node_modules/@blueprintjs/select/",\ + "packageDependencies": [\ + ["@blueprintjs/select", "virtual:3e15f123fa60f3a21c3200c61f0f4cd2cc2baa7e0bc47b9e21f659b954501f75b22b15f0ee46445729b25a6c108b0bbb87ad967a4afcee6a9d133905b2da674c#npm:5.0.23"],\ + ["@blueprintjs/core", "virtual:3e15f123fa60f3a21c3200c61f0f4cd2cc2baa7e0bc47b9e21f659b954501f75b22b15f0ee46445729b25a6c108b0bbb87ad967a4afcee6a9d133905b2da674c#npm:5.8.2"],\ + ["@blueprintjs/icons", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:5.7.0"],\ ["@types/react", "npm:18.0.20"],\ - ["@types/react-dom", null],\ + ["@types/react-dom", "npm:18.2.18"],\ ["classnames", "npm:2.3.1"],\ ["react", "npm:18.2.0"],\ ["react-dom", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:18.2.0"],\ - ["tslib", "npm:2.3.1"]\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/react-dom",\ + "@types/react",\ + "react-dom",\ + "react"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:5.0.22", {\ + "packageLocation": "./.yarn/__virtual__/@blueprintjs-select-virtual-7ca21e3e53/0/cache/@blueprintjs-select-npm-5.0.22-f8c2863de7-dfde636033.zip/node_modules/@blueprintjs/select/",\ + "packageDependencies": [\ + ["@blueprintjs/select", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:5.0.22"],\ + ["@blueprintjs/core", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:5.8.1"],\ + ["@blueprintjs/icons", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:5.7.0"],\ + ["@types/react", "npm:18.0.20"],\ + ["@types/react-dom", "npm:18.2.18"],\ + ["classnames", "npm:2.3.1"],\ + ["react", "npm:18.2.0"],\ + ["react-dom", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:18.2.0"],\ + ["tslib", "npm:2.6.2"]\ ],\ "packagePeers": [\ "@types/react-dom",\ @@ -4026,22 +4199,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@eslint/eslintrc", [\ - ["npm:1.3.3", {\ - "packageLocation": "./.yarn/cache/@eslint-eslintrc-npm-1.3.3-9e3a462140-f03e9d6727.zip/node_modules/@eslint/eslintrc/",\ - "packageDependencies": [\ - ["@eslint/eslintrc", "npm:1.3.3"],\ - ["ajv", "npm:6.12.6"],\ - ["debug", "virtual:6251d782ea0db30c21f0f319066656716c470667e40e117968e3ee896b0149dbd84beab1c1d4067d27f9cefc387fad785c8016e1253c05537454f9884ad265e8#npm:4.3.4"],\ - ["espree", "npm:9.4.0"],\ - ["globals", "npm:13.15.0"],\ - ["ignore", "npm:5.2.4"],\ - ["import-fresh", "npm:3.3.0"],\ - ["js-yaml", "npm:4.1.0"],\ - ["minimatch", "npm:3.1.2"],\ - ["strip-json-comments", "npm:3.1.1"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:2.1.4", {\ "packageLocation": "./.yarn/cache/@eslint-eslintrc-npm-2.1.4-1ff4b5f908-10957c7592.zip/node_modules/@eslint/eslintrc/",\ "packageDependencies": [\ @@ -4148,8 +4305,8 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./packages/commons/react/common-components/",\ "packageDependencies": [\ ["@fern-ui/common-components", "workspace:packages/commons/react/common-components"],\ - ["@blueprintjs/core", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:4.11.5"],\ - ["@blueprintjs/icons", "npm:4.9.0"],\ + ["@blueprintjs/core", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:5.8.1"],\ + ["@blueprintjs/icons", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:5.7.0"],\ ["@fern-ui/loadable", "workspace:packages/commons/loadable"],\ ["@types/jest", "npm:29.5.11"],\ ["@types/node", "npm:18.18.13"],\ @@ -4424,7 +4581,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./packages/commons/react/split-view/",\ "packageDependencies": [\ ["@fern-ui/split-view", "workspace:packages/commons/react/split-view"],\ - ["@blueprintjs/core", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:4.11.5"],\ + ["@blueprintjs/core", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:5.8.1"],\ ["@fern-ui/core-utils", "workspace:packages/commons/core-utils"],\ ["@fern-ui/react-commons", "workspace:packages/commons/react/react-commons"],\ ["@types/jest", "npm:29.5.11"],\ @@ -4454,7 +4611,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./packages/commons/react/toaster/",\ "packageDependencies": [\ ["@fern-ui/toaster", "workspace:packages/commons/react/toaster"],\ - ["@blueprintjs/core", "virtual:44580d8410e4d971649da315cde171126d24493e1706e560c93a65d81b96bdf88f24e77459a8c3c6c0369c524d18da458ce73c9d13e099ef95b8c7c66d89e62a#npm:4.11.5"],\ + ["@blueprintjs/core", "virtual:44580d8410e4d971649da315cde171126d24493e1706e560c93a65d81b96bdf88f24e77459a8c3c6c0369c524d18da458ce73c9d13e099ef95b8c7c66d89e62a#npm:5.8.1"],\ ["@types/jest", "npm:29.5.11"],\ ["@types/node", "npm:18.18.13"],\ ["classnames", "npm:2.5.1"],\ @@ -4477,18 +4634,20 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./packages/ui/app/",\ "packageDependencies": [\ ["@fern-ui/ui", "workspace:packages/ui/app"],\ - ["@blueprintjs/core", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:4.11.5"],\ - ["@blueprintjs/icons", "npm:4.9.0"],\ - ["@blueprintjs/popover2", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:1.8.0"],\ - ["@blueprintjs/select", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:4.5.1"],\ + ["@blueprintjs/core", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:5.8.1"],\ + ["@blueprintjs/datetime", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:5.2.11"],\ + ["@blueprintjs/datetime2", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:2.2.9"],\ + ["@blueprintjs/icons", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:5.7.0"],\ + ["@blueprintjs/select", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:5.0.22"],\ ["@fern-api/fdr-sdk", "npm:0.44.0-1-geb2e930"],\ ["@fern-ui/app-utils", "workspace:packages/commons/app-utils"],\ ["@fern-ui/core-utils", "workspace:packages/commons/core-utils"],\ + ["@fern-ui/loadable", "workspace:packages/commons/loadable"],\ ["@fern-ui/react-commons", "workspace:packages/commons/react/react-commons"],\ ["@fontsource/ibm-plex-mono", "npm:4.5.13"],\ ["@fortawesome/fontawesome-svg-core", "npm:6.4.2"],\ ["@fortawesome/react-fontawesome", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:0.2.0"],\ - ["@headlessui/react", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:1.7.17"],\ + ["@headlessui/react", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:1.7.18"],\ ["@react-hook/size", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:2.1.2"],\ ["@testing-library/react", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:14.0.0"],\ ["@types/jest", "npm:29.5.11"],\ @@ -4496,6 +4655,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@types/marked", "npm:5.0.0"],\ ["@types/node", "npm:18.18.13"],\ ["@types/react", "npm:18.0.20"],\ + ["@types/react-dom", "npm:18.2.18"],\ ["@types/react-syntax-highlighter", "npm:15.5.11"],\ ["@types/react-test-renderer", "npm:18.0.7"],\ ["@types/tinycolor2", "npm:1.4.6"],\ @@ -4659,19 +4819,20 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@headlessui/react", [\ - ["npm:1.7.17", {\ - "packageLocation": "./.yarn/cache/@headlessui-react-npm-1.7.17-c3f120aed0-0cdb67747e.zip/node_modules/@headlessui/react/",\ + ["npm:1.7.18", {\ + "packageLocation": "./.yarn/cache/@headlessui-react-npm-1.7.18-91486d4b37-7463167b4c.zip/node_modules/@headlessui/react/",\ "packageDependencies": [\ - ["@headlessui/react", "npm:1.7.17"]\ + ["@headlessui/react", "npm:1.7.18"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:1.7.17", {\ - "packageLocation": "./.yarn/__virtual__/@headlessui-react-virtual-9f40207272/0/cache/@headlessui-react-npm-1.7.17-c3f120aed0-0cdb67747e.zip/node_modules/@headlessui/react/",\ + ["virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:1.7.18", {\ + "packageLocation": "./.yarn/__virtual__/@headlessui-react-virtual-7e9ad826c3/0/cache/@headlessui-react-npm-1.7.18-91486d4b37-7463167b4c.zip/node_modules/@headlessui/react/",\ "packageDependencies": [\ - ["@headlessui/react", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:1.7.17"],\ + ["@headlessui/react", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:1.7.18"],\ + ["@tanstack/react-virtual", "virtual:7e9ad826c3466cab296fd14f08935adb3b7b77e13a8240d439d8d93281c8443f9919436f251e519cf895183aff1d26c12046b4cbb3109be97c22470e7a981c57#npm:3.0.1"],\ ["@types/react", "npm:18.0.20"],\ - ["@types/react-dom", null],\ + ["@types/react-dom", "npm:18.2.18"],\ ["client-only", "npm:0.0.1"],\ ["react", "npm:18.2.0"],\ ["react-dom", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:18.2.0"]\ @@ -4695,16 +4856,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["minimatch", "npm:3.1.2"]\ ],\ "linkType": "HARD"\ - }],\ - ["npm:0.11.6", {\ - "packageLocation": "./.yarn/cache/@humanwhocodes-config-array-npm-0.11.6-02675b40c5-2fb7288638.zip/node_modules/@humanwhocodes/config-array/",\ - "packageDependencies": [\ - ["@humanwhocodes/config-array", "npm:0.11.6"],\ - ["@humanwhocodes/object-schema", "npm:1.2.1"],\ - ["debug", "virtual:6251d782ea0db30c21f0f319066656716c470667e40e117968e3ee896b0149dbd84beab1c1d4067d27f9cefc387fad785c8016e1253c05537454f9884ad265e8#npm:4.3.4"],\ - ["minimatch", "npm:3.1.2"]\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["@humanwhocodes/module-importer", [\ @@ -4717,13 +4868,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@humanwhocodes/object-schema", [\ - ["npm:1.2.1", {\ - "packageLocation": "./.yarn/cache/@humanwhocodes-object-schema-npm-1.2.1-eb622b5d0e-a824a1ec31.zip/node_modules/@humanwhocodes/object-schema/",\ - "packageDependencies": [\ - ["@humanwhocodes/object-schema", "npm:1.2.1"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:2.0.1", {\ "packageLocation": "./.yarn/cache/@humanwhocodes-object-schema-npm-2.0.1-c23364bbfc-24929487b1.zip/node_modules/@humanwhocodes/object-schema/",\ "packageDependencies": [\ @@ -4732,53 +4876,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["@hypnosphi/create-react-context", [\ - ["npm:0.3.1", {\ - "packageLocation": "./.yarn/cache/@hypnosphi-create-react-context-npm-0.3.1-01f6252b38-d2f069a562.zip/node_modules/@hypnosphi/create-react-context/",\ - "packageDependencies": [\ - ["@hypnosphi/create-react-context", "npm:0.3.1"]\ - ],\ - "linkType": "SOFT"\ - }],\ - ["virtual:7c2cd23a9798c9d292d77dc8d348fe56ecf5d1f82942d7d7af7205964f0eb73202f389056ebcbd6d84fc7903d31349941215e568df75f3c497b3d1e48179bc5e#npm:0.3.1", {\ - "packageLocation": "./.yarn/__virtual__/@hypnosphi-create-react-context-virtual-2ab2ccbf1f/0/cache/@hypnosphi-create-react-context-npm-0.3.1-01f6252b38-d2f069a562.zip/node_modules/@hypnosphi/create-react-context/",\ - "packageDependencies": [\ - ["@hypnosphi/create-react-context", "virtual:7c2cd23a9798c9d292d77dc8d348fe56ecf5d1f82942d7d7af7205964f0eb73202f389056ebcbd6d84fc7903d31349941215e568df75f3c497b3d1e48179bc5e#npm:0.3.1"],\ - ["@types/prop-types", null],\ - ["@types/react", null],\ - ["gud", "npm:1.0.0"],\ - ["prop-types", "npm:15.8.1"],\ - ["react", "npm:18.2.0"],\ - ["warning", "npm:4.0.3"]\ - ],\ - "packagePeers": [\ - "@types/prop-types",\ - "@types/react",\ - "prop-types",\ - "react"\ - ],\ - "linkType": "HARD"\ - }],\ - ["virtual:f2ce7ef60cb11a160b3c967ea69c1605846e12dc183ac7df814a1c6fa8018684a2009731dfbca05c66fa783ae65ed4fef315c42b94daba8e0e18b46e858e3fb2#npm:0.3.1", {\ - "packageLocation": "./.yarn/__virtual__/@hypnosphi-create-react-context-virtual-851c94dad4/0/cache/@hypnosphi-create-react-context-npm-0.3.1-01f6252b38-d2f069a562.zip/node_modules/@hypnosphi/create-react-context/",\ - "packageDependencies": [\ - ["@hypnosphi/create-react-context", "virtual:f2ce7ef60cb11a160b3c967ea69c1605846e12dc183ac7df814a1c6fa8018684a2009731dfbca05c66fa783ae65ed4fef315c42b94daba8e0e18b46e858e3fb2#npm:0.3.1"],\ - ["@types/prop-types", null],\ - ["@types/react", "npm:18.0.20"],\ - ["gud", "npm:1.0.0"],\ - ["prop-types", "npm:15.8.1"],\ - ["react", "npm:18.2.0"],\ - ["warning", "npm:4.0.3"]\ - ],\ - "packagePeers": [\ - "@types/prop-types",\ - "@types/react",\ - "prop-types",\ - "react"\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["@isaacs/cliui", [\ ["npm:8.0.2", {\ "packageLocation": "./.yarn/cache/@isaacs-cliui-npm-8.0.2-f4364666d5-4a473b9b32.zip/node_modules/@isaacs/cliui/",\ @@ -5455,10 +5552,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@popperjs/core", [\ - ["npm:2.11.6", {\ - "packageLocation": "./.yarn/cache/@popperjs-core-npm-2.11.6-5bcdc104bd-47fb328cec.zip/node_modules/@popperjs/core/",\ + ["npm:2.11.8", {\ + "packageLocation": "./.yarn/cache/@popperjs-core-npm-2.11.8-f1692e11a0-e5c69fdebf.zip/node_modules/@popperjs/core/",\ "packageDependencies": [\ - ["@popperjs/core", "npm:2.11.6"]\ + ["@popperjs/core", "npm:2.11.8"]\ ],\ "linkType": "HARD"\ }]\ @@ -5697,6 +5794,42 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["@tanstack/react-virtual", [\ + ["npm:3.0.1", {\ + "packageLocation": "./.yarn/cache/@tanstack-react-virtual-npm-3.0.1-4ec4d04e6c-11534a2310.zip/node_modules/@tanstack/react-virtual/",\ + "packageDependencies": [\ + ["@tanstack/react-virtual", "npm:3.0.1"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:7e9ad826c3466cab296fd14f08935adb3b7b77e13a8240d439d8d93281c8443f9919436f251e519cf895183aff1d26c12046b4cbb3109be97c22470e7a981c57#npm:3.0.1", {\ + "packageLocation": "./.yarn/__virtual__/@tanstack-react-virtual-virtual-685831da85/0/cache/@tanstack-react-virtual-npm-3.0.1-4ec4d04e6c-11534a2310.zip/node_modules/@tanstack/react-virtual/",\ + "packageDependencies": [\ + ["@tanstack/react-virtual", "virtual:7e9ad826c3466cab296fd14f08935adb3b7b77e13a8240d439d8d93281c8443f9919436f251e519cf895183aff1d26c12046b4cbb3109be97c22470e7a981c57#npm:3.0.1"],\ + ["@tanstack/virtual-core", "npm:3.0.0"],\ + ["@types/react", "npm:18.0.20"],\ + ["@types/react-dom", "npm:18.2.18"],\ + ["react", "npm:18.2.0"],\ + ["react-dom", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:18.2.0"]\ + ],\ + "packagePeers": [\ + "@types/react-dom",\ + "@types/react",\ + "react-dom",\ + "react"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@tanstack/virtual-core", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/@tanstack-virtual-core-npm-3.0.0-f5ce10d614-7283d50fc7.zip/node_modules/@tanstack/virtual-core/",\ + "packageDependencies": [\ + ["@tanstack/virtual-core", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@testing-library/dom", [\ ["npm:9.3.3", {\ "packageLocation": "./.yarn/cache/@testing-library-dom-npm-9.3.3-c5d4692db9-34e0a564da.zip/node_modules/@testing-library/dom/",\ @@ -5729,11 +5862,12 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@babel/runtime", "npm:7.22.6"],\ ["@testing-library/dom", "npm:9.3.3"],\ ["@types/react", "npm:18.0.20"],\ - ["@types/react-dom", "npm:18.2.10"],\ + ["@types/react-dom", "npm:18.2.18"],\ ["react", "npm:18.2.0"],\ ["react-dom", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:18.2.0"]\ ],\ "packagePeers": [\ + "@types/react-dom",\ "@types/react",\ "react-dom",\ "react"\ @@ -5905,15 +6039,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["@types/dom4", [\ - ["npm:2.0.2", {\ - "packageLocation": "./.yarn/cache/@types-dom4-npm-2.0.2-a6b70fba70-33af623489.zip/node_modules/@types/dom4/",\ - "packageDependencies": [\ - ["@types/dom4", "npm:2.0.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["@types/emscripten", [\ ["npm:1.39.10", {\ "packageLocation": "./.yarn/cache/@types-emscripten-npm-1.39.10-3b81552c03-1721da7659.zip/node_modules/@types/emscripten/",\ @@ -6246,14 +6371,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@types/react-dom", [\ - ["npm:18.2.10", {\ - "packageLocation": "./.yarn/cache/@types-react-dom-npm-18.2.10-996210477a-ced70643d8.zip/node_modules/@types/react-dom/",\ - "packageDependencies": [\ - ["@types/react-dom", "npm:18.2.10"],\ - ["@types/react", "npm:18.0.20"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:18.2.18", {\ "packageLocation": "./.yarn/cache/@types-react-dom-npm-18.2.18-b316a8af22-8e3da404c9.zip/node_modules/@types/react-dom/",\ "packageDependencies": [\ @@ -6456,7 +6573,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@typescript-eslint/parser", "virtual:81cc2531fc6bda045c87d6c3b21351574209a7d87ba11b639412d754d2fbdd0831d00d35ee7d39be3226e871d899842f300a82fbfbdd17e263ce302a51c65de6#npm:6.18.1"],\ ["@typescript-eslint/scope-manager", "npm:6.18.1"],\ ["@typescript-eslint/type-utils", "virtual:9d24e6fe8b9986932d9ced83d6055e354788dbb2fbba39cefb37535e1869ba891aba6526be5c87912f1e1ca8b7a84e5f20946eb3ba2149d30d8a20b4f9bda2fd#npm:6.18.1"],\ - ["@typescript-eslint/utils", "virtual:9d24e6fe8b9986932d9ced83d6055e354788dbb2fbba39cefb37535e1869ba891aba6526be5c87912f1e1ca8b7a84e5f20946eb3ba2149d30d8a20b4f9bda2fd#npm:6.18.1"],\ + ["@typescript-eslint/utils", "virtual:522d490a837c6b5c29b46fb3fd649aa53767db279f4a13866253f327c8c4b894b4c7e7acfef85a033a4e26b9712ca986662d2c7a942f0212e84b97f588d40b5a#npm:6.18.1"],\ ["@typescript-eslint/visitor-keys", "npm:6.18.1"],\ ["debug", "virtual:6251d782ea0db30c21f0f319066656716c470667e40e117968e3ee896b0149dbd84beab1c1d4067d27f9cefc387fad785c8016e1253c05537454f9884ad265e8#npm:4.3.4"],\ ["eslint", "npm:8.56.0"],\ @@ -6544,7 +6661,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@types/eslint", null],\ ["@types/typescript", null],\ ["@typescript-eslint/typescript-estree", "virtual:94d167706b2852fb4a4c7eca52e7ddf68ddb96ea252bc72547aa7b18a50e3e406b76f661a0dc89866c5ce432daf26140ead22a63251b618cc164e51a02c26130#npm:6.18.1"],\ - ["@typescript-eslint/utils", "virtual:9d24e6fe8b9986932d9ced83d6055e354788dbb2fbba39cefb37535e1869ba891aba6526be5c87912f1e1ca8b7a84e5f20946eb3ba2149d30d8a20b4f9bda2fd#npm:6.18.1"],\ + ["@typescript-eslint/utils", "virtual:522d490a837c6b5c29b46fb3fd649aa53767db279f4a13866253f327c8c4b894b4c7e7acfef85a033a4e26b9712ca986662d2c7a942f0212e84b97f588d40b5a#npm:6.18.1"],\ ["debug", "virtual:6251d782ea0db30c21f0f319066656716c470667e40e117968e3ee896b0149dbd84beab1c1d4067d27f9cefc387fad785c8016e1253c05537454f9884ad265e8#npm:4.3.4"],\ ["eslint", "npm:8.56.0"],\ ["ts-api-utils", "virtual:9d24e6fe8b9986932d9ced83d6055e354788dbb2fbba39cefb37535e1869ba891aba6526be5c87912f1e1ca8b7a84e5f20946eb3ba2149d30d8a20b4f9bda2fd#npm:1.0.2"],\ @@ -6590,10 +6707,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:40058bf9b8529550de7f3cb05b97489d0783524540452a9d978d0a47bae5b6c7625ea97a78e2cbbc3dcc9987a570ccca6515e6589f29046ba4d409ba2d7f2480#npm:6.18.1", {\ - "packageLocation": "./.yarn/__virtual__/@typescript-eslint-typescript-estree-virtual-1064d4a5f7/0/cache/@typescript-eslint-typescript-estree-npm-6.18.1-8c1bf6eb4a-fc5fb8abea.zip/node_modules/@typescript-eslint/typescript-estree/",\ + ["virtual:94d167706b2852fb4a4c7eca52e7ddf68ddb96ea252bc72547aa7b18a50e3e406b76f661a0dc89866c5ce432daf26140ead22a63251b618cc164e51a02c26130#npm:6.18.1", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-typescript-estree-virtual-8a21405250/0/cache/@typescript-eslint-typescript-estree-npm-6.18.1-8c1bf6eb4a-fc5fb8abea.zip/node_modules/@typescript-eslint/typescript-estree/",\ "packageDependencies": [\ - ["@typescript-eslint/typescript-estree", "virtual:40058bf9b8529550de7f3cb05b97489d0783524540452a9d978d0a47bae5b6c7625ea97a78e2cbbc3dcc9987a570ccca6515e6589f29046ba4d409ba2d7f2480#npm:6.18.1"],\ + ["@typescript-eslint/typescript-estree", "virtual:94d167706b2852fb4a4c7eca52e7ddf68ddb96ea252bc72547aa7b18a50e3e406b76f661a0dc89866c5ce432daf26140ead22a63251b618cc164e51a02c26130#npm:6.18.1"],\ ["@types/typescript", null],\ ["@typescript-eslint/types", "npm:6.18.1"],\ ["@typescript-eslint/visitor-keys", "npm:6.18.1"],\ @@ -6602,8 +6719,8 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["is-glob", "npm:4.0.3"],\ ["minimatch", "npm:9.0.3"],\ ["semver", "npm:7.5.4"],\ - ["ts-api-utils", "virtual:1064d4a5f798a21bdaf07cc8da857cdd4ee48471bcc0c3c8923ff6852970360db1128ab452d567e2c11c51d08db9ed569b99b7ac9b93a97edb9cef4e08b6127d#npm:1.0.2"],\ - ["typescript", null]\ + ["ts-api-utils", "virtual:9d24e6fe8b9986932d9ced83d6055e354788dbb2fbba39cefb37535e1869ba891aba6526be5c87912f1e1ca8b7a84e5f20946eb3ba2149d30d8a20b4f9bda2fd#npm:1.0.2"],\ + ["typescript", "patch:typescript@npm%3A4.9.4#~builtin::version=4.9.4&hash=289587"]\ ],\ "packagePeers": [\ "@types/typescript",\ @@ -6611,20 +6728,19 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:94d167706b2852fb4a4c7eca52e7ddf68ddb96ea252bc72547aa7b18a50e3e406b76f661a0dc89866c5ce432daf26140ead22a63251b618cc164e51a02c26130#npm:6.18.1", {\ - "packageLocation": "./.yarn/__virtual__/@typescript-eslint-typescript-estree-virtual-8a21405250/0/cache/@typescript-eslint-typescript-estree-npm-6.18.1-8c1bf6eb4a-fc5fb8abea.zip/node_modules/@typescript-eslint/typescript-estree/",\ + ["virtual:a358a5f6386d1c24dcc38272a222ef0a46369512cc111c081e8ad31e6f58b50b44ebb00d9e756b8de2de3292419dcea4077fe48bff06a71da5601b6c542688e0#npm:5.32.0", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-typescript-estree-virtual-80dbe13b00/0/cache/@typescript-eslint-typescript-estree-npm-5.32.0-16d017bce9-6aee08be5d.zip/node_modules/@typescript-eslint/typescript-estree/",\ "packageDependencies": [\ - ["@typescript-eslint/typescript-estree", "virtual:94d167706b2852fb4a4c7eca52e7ddf68ddb96ea252bc72547aa7b18a50e3e406b76f661a0dc89866c5ce432daf26140ead22a63251b618cc164e51a02c26130#npm:6.18.1"],\ + ["@typescript-eslint/typescript-estree", "virtual:a358a5f6386d1c24dcc38272a222ef0a46369512cc111c081e8ad31e6f58b50b44ebb00d9e756b8de2de3292419dcea4077fe48bff06a71da5601b6c542688e0#npm:5.32.0"],\ ["@types/typescript", null],\ - ["@typescript-eslint/types", "npm:6.18.1"],\ - ["@typescript-eslint/visitor-keys", "npm:6.18.1"],\ + ["@typescript-eslint/types", "npm:5.32.0"],\ + ["@typescript-eslint/visitor-keys", "npm:5.32.0"],\ ["debug", "virtual:6251d782ea0db30c21f0f319066656716c470667e40e117968e3ee896b0149dbd84beab1c1d4067d27f9cefc387fad785c8016e1253c05537454f9884ad265e8#npm:4.3.4"],\ ["globby", "npm:11.1.0"],\ ["is-glob", "npm:4.0.3"],\ - ["minimatch", "npm:9.0.3"],\ - ["semver", "npm:7.5.4"],\ - ["ts-api-utils", "virtual:9d24e6fe8b9986932d9ced83d6055e354788dbb2fbba39cefb37535e1869ba891aba6526be5c87912f1e1ca8b7a84e5f20946eb3ba2149d30d8a20b4f9bda2fd#npm:1.0.2"],\ - ["typescript", "patch:typescript@npm%3A4.9.4#~builtin::version=4.9.4&hash=289587"]\ + ["semver", "npm:7.3.8"],\ + ["tsutils", "virtual:80dbe13b003d4893ed88b84b49b1bc3c77eeb736c51345edd5634322a34acade08d0f0c807486d43d3b599580476a86641389579846227846f513c05d25f2c1c#npm:3.21.0"],\ + ["typescript", null]\ ],\ "packagePeers": [\ "@types/typescript",\ @@ -6632,18 +6748,19 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:f0f2149873700a495a0eae05749d4b902801c989f3db1df63a0538122b8369c989b8980da178a9effd69131e2d2075d99fa9a69470a68e99f24fccd3b7847d3d#npm:5.32.0", {\ - "packageLocation": "./.yarn/__virtual__/@typescript-eslint-typescript-estree-virtual-c63ede9b66/0/cache/@typescript-eslint-typescript-estree-npm-5.32.0-16d017bce9-6aee08be5d.zip/node_modules/@typescript-eslint/typescript-estree/",\ + ["virtual:d2a76697a393500a2055500497520ff73eb7d8e1e73ed3c160203da7403ce66c932e4235c9736ac5b76f7855b72dc213cb8ab1e579152a5ba6e753372f0e3545#npm:6.18.1", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-typescript-estree-virtual-2a425c7f35/0/cache/@typescript-eslint-typescript-estree-npm-6.18.1-8c1bf6eb4a-fc5fb8abea.zip/node_modules/@typescript-eslint/typescript-estree/",\ "packageDependencies": [\ - ["@typescript-eslint/typescript-estree", "virtual:f0f2149873700a495a0eae05749d4b902801c989f3db1df63a0538122b8369c989b8980da178a9effd69131e2d2075d99fa9a69470a68e99f24fccd3b7847d3d#npm:5.32.0"],\ + ["@typescript-eslint/typescript-estree", "virtual:d2a76697a393500a2055500497520ff73eb7d8e1e73ed3c160203da7403ce66c932e4235c9736ac5b76f7855b72dc213cb8ab1e579152a5ba6e753372f0e3545#npm:6.18.1"],\ ["@types/typescript", null],\ - ["@typescript-eslint/types", "npm:5.32.0"],\ - ["@typescript-eslint/visitor-keys", "npm:5.32.0"],\ + ["@typescript-eslint/types", "npm:6.18.1"],\ + ["@typescript-eslint/visitor-keys", "npm:6.18.1"],\ ["debug", "virtual:6251d782ea0db30c21f0f319066656716c470667e40e117968e3ee896b0149dbd84beab1c1d4067d27f9cefc387fad785c8016e1253c05537454f9884ad265e8#npm:4.3.4"],\ ["globby", "npm:11.1.0"],\ ["is-glob", "npm:4.0.3"],\ - ["semver", "npm:7.3.8"],\ - ["tsutils", "virtual:c63ede9b660397b3afa67a4499cc146d605b84467174118eacc0e84c52e54bd43ed2cf170bf6342907bb2a43c736ab9b4899ade9079e9ccb6978c6aedcc3d46d#npm:3.21.0"],\ + ["minimatch", "npm:9.0.3"],\ + ["semver", "npm:7.5.4"],\ + ["ts-api-utils", "virtual:2a425c7f3595b53795016c54cce376fe8ddd9e3a6cb1946e8198f67105b3d5fb170ff3300814dfd5165d6f68b4d5e3408f25ade526243b3c0e5c6142cdab2e70#npm:1.0.2"],\ ["typescript", null]\ ],\ "packagePeers": [\ @@ -6666,38 +6783,19 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [\ ["@typescript-eslint/utils", "npm:6.18.1"]\ ],\ - "linkType": "SOFT"\ - }],\ - ["virtual:461eb5c970e9ea6eed2b0236655dfbb10de4d3bc66c90c9df5e3d0caba575590af5c25a89462ba87db765657595adf2cecff67801e41ccd982ffb0364d172431#npm:5.32.0", {\ - "packageLocation": "./.yarn/__virtual__/@typescript-eslint-utils-virtual-f0f2149873/0/cache/@typescript-eslint-utils-npm-5.32.0-e6be7becb3-cfd88d9350.zip/node_modules/@typescript-eslint/utils/",\ - "packageDependencies": [\ - ["@typescript-eslint/utils", "virtual:461eb5c970e9ea6eed2b0236655dfbb10de4d3bc66c90c9df5e3d0caba575590af5c25a89462ba87db765657595adf2cecff67801e41ccd982ffb0364d172431#npm:5.32.0"],\ - ["@types/eslint", null],\ - ["@types/json-schema", "npm:7.0.11"],\ - ["@typescript-eslint/scope-manager", "npm:5.32.0"],\ - ["@typescript-eslint/types", "npm:5.32.0"],\ - ["@typescript-eslint/typescript-estree", "virtual:f0f2149873700a495a0eae05749d4b902801c989f3db1df63a0538122b8369c989b8980da178a9effd69131e2d2075d99fa9a69470a68e99f24fccd3b7847d3d#npm:5.32.0"],\ - ["eslint", "npm:8.26.0"],\ - ["eslint-scope", "npm:5.1.1"],\ - ["eslint-utils", "virtual:c277e15ec0e2045c627afe7c6881d1c470953aef8322950356243dade72ac04024bc73986d7b8df7a4695dda6baeb1c400992fcdebf4f4f1fdf4df3d4618bb1c#npm:3.0.0"]\ - ],\ - "packagePeers": [\ - "@types/eslint",\ - "eslint"\ - ],\ - "linkType": "HARD"\ + "linkType": "SOFT"\ }],\ - ["virtual:9d24e6fe8b9986932d9ced83d6055e354788dbb2fbba39cefb37535e1869ba891aba6526be5c87912f1e1ca8b7a84e5f20946eb3ba2149d30d8a20b4f9bda2fd#npm:6.18.1", {\ - "packageLocation": "./.yarn/__virtual__/@typescript-eslint-utils-virtual-40058bf9b8/0/cache/@typescript-eslint-utils-npm-6.18.1-6a422bc632-b7265b0cae.zip/node_modules/@typescript-eslint/utils/",\ + ["virtual:522d490a837c6b5c29b46fb3fd649aa53767db279f4a13866253f327c8c4b894b4c7e7acfef85a033a4e26b9712ca986662d2c7a942f0212e84b97f588d40b5a#npm:6.18.1", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-utils-virtual-d2a76697a3/0/cache/@typescript-eslint-utils-npm-6.18.1-6a422bc632-b7265b0cae.zip/node_modules/@typescript-eslint/utils/",\ "packageDependencies": [\ - ["@typescript-eslint/utils", "virtual:9d24e6fe8b9986932d9ced83d6055e354788dbb2fbba39cefb37535e1869ba891aba6526be5c87912f1e1ca8b7a84e5f20946eb3ba2149d30d8a20b4f9bda2fd#npm:6.18.1"],\ + ["@typescript-eslint/utils", "virtual:522d490a837c6b5c29b46fb3fd649aa53767db279f4a13866253f327c8c4b894b4c7e7acfef85a033a4e26b9712ca986662d2c7a942f0212e84b97f588d40b5a#npm:6.18.1"],\ ["@eslint-community/eslint-utils", "virtual:6eec398a4132b5372ea5ffc0bc36d4c81602b7e444a89685d0d958016d8fd53df5c0c97c6a8bf99951469e2c6c06135dd192e9309f6e39b1a4c85e0faabe1f6b#npm:4.4.0"],\ ["@types/eslint", null],\ ["@types/json-schema", "npm:7.0.12"],\ ["@types/semver", "npm:7.5.0"],\ ["@typescript-eslint/scope-manager", "npm:6.18.1"],\ ["@typescript-eslint/types", "npm:6.18.1"],\ - ["@typescript-eslint/typescript-estree", "virtual:40058bf9b8529550de7f3cb05b97489d0783524540452a9d978d0a47bae5b6c7625ea97a78e2cbbc3dcc9987a570ccca6515e6589f29046ba4d409ba2d7f2480#npm:6.18.1"],\ + ["@typescript-eslint/typescript-estree", "virtual:d2a76697a393500a2055500497520ff73eb7d8e1e73ed3c160203da7403ce66c932e4235c9736ac5b76f7855b72dc213cb8ab1e579152a5ba6e753372f0e3545#npm:6.18.1"],\ ["eslint", "npm:8.56.0"],\ ["semver", "npm:7.5.4"]\ ],\ @@ -6715,7 +6813,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@types/json-schema", "npm:7.0.11"],\ ["@typescript-eslint/scope-manager", "npm:5.32.0"],\ ["@typescript-eslint/types", "npm:5.32.0"],\ - ["@typescript-eslint/typescript-estree", "virtual:f0f2149873700a495a0eae05749d4b902801c989f3db1df63a0538122b8369c989b8980da178a9effd69131e2d2075d99fa9a69470a68e99f24fccd3b7847d3d#npm:5.32.0"],\ + ["@typescript-eslint/typescript-estree", "virtual:a358a5f6386d1c24dcc38272a222ef0a46369512cc111c081e8ad31e6f58b50b44ebb00d9e756b8de2de3292419dcea4077fe48bff06a71da5601b6c542688e0#npm:5.32.0"],\ ["eslint", "npm:8.56.0"],\ ["eslint-scope", "npm:5.1.1"],\ ["eslint-utils", "virtual:a358a5f6386d1c24dcc38272a222ef0a46369512cc111c081e8ad31e6f58b50b44ebb00d9e756b8de2de3292419dcea4077fe48bff06a71da5601b6c542688e0#npm:3.0.0"]\ @@ -7053,19 +7151,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:0371ef3614c1182c8fcb05e5954a5fd9c124be4b821bd43f5ef7bdb1bf9603ab5ec16aa2a2a1de93fa397b424774f98f00c5e66d99eec56be0bd9f2a1ab2c75f#npm:5.3.2", {\ - "packageLocation": "./.yarn/__virtual__/acorn-jsx-virtual-c72fe04f43/0/cache/acorn-jsx-npm-5.3.2-d7594599ea-c3d3b2a89c.zip/node_modules/acorn-jsx/",\ - "packageDependencies": [\ - ["acorn-jsx", "virtual:0371ef3614c1182c8fcb05e5954a5fd9c124be4b821bd43f5ef7bdb1bf9603ab5ec16aa2a2a1de93fa397b424774f98f00c5e66d99eec56be0bd9f2a1ab2c75f#npm:5.3.2"],\ - ["@types/acorn", null],\ - ["acorn", "npm:8.8.0"]\ - ],\ - "packagePeers": [\ - "@types/acorn",\ - "acorn"\ - ],\ - "linkType": "HARD"\ - }],\ ["virtual:a50722a5a9326b6a5f12350c494c4db3aa0f4caeac45e3e9e5fe071da20014ecfe738fe2ebe2c9c98abae81a4ea86b42f56d776b3bd5ec37f9ad3670c242b242#npm:5.3.2", {\ "packageLocation": "./.yarn/__virtual__/acorn-jsx-virtual-834321b202/0/cache/acorn-jsx-npm-5.3.2-d7594599ea-c3d3b2a89c.zip/node_modules/acorn-jsx/",\ "packageDependencies": [\ @@ -9044,6 +9129,38 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["date-fns", [\ + ["npm:2.30.0", {\ + "packageLocation": "./.yarn/cache/date-fns-npm-2.30.0-895c790e0f-f7be015232.zip/node_modules/date-fns/",\ + "packageDependencies": [\ + ["date-fns", "npm:2.30.0"],\ + ["@babel/runtime", "npm:7.23.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["date-fns-tz", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/date-fns-tz-npm-2.0.0-9b7996f292-a6553603a9.zip/node_modules/date-fns-tz/",\ + "packageDependencies": [\ + ["date-fns-tz", "npm:2.0.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:3e15f123fa60f3a21c3200c61f0f4cd2cc2baa7e0bc47b9e21f659b954501f75b22b15f0ee46445729b25a6c108b0bbb87ad967a4afcee6a9d133905b2da674c#npm:2.0.0", {\ + "packageLocation": "./.yarn/__virtual__/date-fns-tz-virtual-d9e0fabf7e/0/cache/date-fns-tz-npm-2.0.0-9b7996f292-a6553603a9.zip/node_modules/date-fns-tz/",\ + "packageDependencies": [\ + ["date-fns-tz", "virtual:3e15f123fa60f3a21c3200c61f0f4cd2cc2baa7e0bc47b9e21f659b954501f75b22b15f0ee46445729b25a6c108b0bbb87ad967a4afcee6a9d133905b2da674c#npm:2.0.0"],\ + ["@types/date-fns", null],\ + ["date-fns", "npm:2.30.0"]\ + ],\ + "packagePeers": [\ + "@types/date-fns",\ + "date-fns"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["debug", [\ ["npm:3.2.7", {\ "packageLocation": "./.yarn/cache/debug-npm-3.2.7-754e818c7a-b3d8c59407.zip/node_modules/debug/",\ @@ -9138,19 +9255,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["deep-equal", [\ - ["npm:1.1.1", {\ - "packageLocation": "./.yarn/cache/deep-equal-npm-1.1.1-67ff9c29b9-f92686f2c5.zip/node_modules/deep-equal/",\ - "packageDependencies": [\ - ["deep-equal", "npm:1.1.1"],\ - ["is-arguments", "npm:1.1.1"],\ - ["is-date-object", "npm:1.0.5"],\ - ["is-regex", "npm:1.1.4"],\ - ["object-is", "npm:1.1.5"],\ - ["object-keys", "npm:1.1.1"],\ - ["regexp.prototype.flags", "npm:1.4.3"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:2.2.2", {\ "packageLocation": "./.yarn/cache/deep-equal-npm-2.2.2-11ec0f8326-eb61c35157.zip/node_modules/deep-equal/",\ "packageDependencies": [\ @@ -9431,15 +9535,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["dom4", [\ - ["npm:2.1.6", {\ - "packageLocation": "./.yarn/cache/dom4-npm-2.1.6-c189e2d3c4-c15ad56afb.zip/node_modules/dom4/",\ - "packageDependencies": [\ - ["dom4", "npm:2.1.6"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["domexception", [\ ["npm:4.0.0", {\ "packageLocation": "./.yarn/cache/domexception-npm-4.0.0-5093673f9b-ddbc1268ed.zip/node_modules/domexception/",\ @@ -10076,52 +10171,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["eslint", [\ - ["npm:8.26.0", {\ - "packageLocation": "./.yarn/cache/eslint-npm-8.26.0-c277e15ec0-a2aced939e.zip/node_modules/eslint/",\ - "packageDependencies": [\ - ["eslint", "npm:8.26.0"],\ - ["@eslint/eslintrc", "npm:1.3.3"],\ - ["@humanwhocodes/config-array", "npm:0.11.6"],\ - ["@humanwhocodes/module-importer", "npm:1.0.1"],\ - ["@nodelib/fs.walk", "npm:1.2.8"],\ - ["ajv", "npm:6.12.6"],\ - ["chalk", "npm:4.1.2"],\ - ["cross-spawn", "npm:7.0.3"],\ - ["debug", "virtual:6251d782ea0db30c21f0f319066656716c470667e40e117968e3ee896b0149dbd84beab1c1d4067d27f9cefc387fad785c8016e1253c05537454f9884ad265e8#npm:4.3.4"],\ - ["doctrine", "npm:3.0.0"],\ - ["escape-string-regexp", "npm:4.0.0"],\ - ["eslint-scope", "npm:7.1.1"],\ - ["eslint-utils", "virtual:c277e15ec0e2045c627afe7c6881d1c470953aef8322950356243dade72ac04024bc73986d7b8df7a4695dda6baeb1c400992fcdebf4f4f1fdf4df3d4618bb1c#npm:3.0.0"],\ - ["eslint-visitor-keys", "npm:3.3.0"],\ - ["espree", "npm:9.4.0"],\ - ["esquery", "npm:1.4.0"],\ - ["esutils", "npm:2.0.3"],\ - ["fast-deep-equal", "npm:3.1.3"],\ - ["file-entry-cache", "npm:6.0.1"],\ - ["find-up", "npm:5.0.0"],\ - ["glob-parent", "npm:6.0.2"],\ - ["globals", "npm:13.15.0"],\ - ["grapheme-splitter", "npm:1.0.4"],\ - ["ignore", "npm:5.2.4"],\ - ["import-fresh", "npm:3.3.0"],\ - ["imurmurhash", "npm:0.1.4"],\ - ["is-glob", "npm:4.0.3"],\ - ["is-path-inside", "npm:3.0.3"],\ - ["js-sdsl", "npm:4.1.4"],\ - ["js-yaml", "npm:4.1.0"],\ - ["json-stable-stringify-without-jsonify", "npm:1.0.1"],\ - ["levn", "npm:0.4.1"],\ - ["lodash.merge", "npm:4.6.2"],\ - ["minimatch", "npm:3.1.2"],\ - ["natural-compare", "npm:1.4.0"],\ - ["optionator", "npm:0.9.1"],\ - ["regexpp", "npm:3.2.0"],\ - ["strip-ansi", "npm:6.0.1"],\ - ["strip-json-comments", "npm:3.1.1"],\ - ["text-table", "npm:0.2.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:8.56.0", {\ "packageLocation": "./.yarn/cache/eslint-npm-8.56.0-6eec398a41-883436d1e8.zip/node_modules/eslint/",\ "packageDependencies": [\ @@ -10331,7 +10380,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["eslint-plugin-deprecation", "virtual:81cc2531fc6bda045c87d6c3b21351574209a7d87ba11b639412d754d2fbdd0831d00d35ee7d39be3226e871d899842f300a82fbfbdd17e263ce302a51c65de6#npm:2.0.0"],\ ["@types/eslint", null],\ ["@types/typescript", null],\ - ["@typescript-eslint/utils", "virtual:9d24e6fe8b9986932d9ced83d6055e354788dbb2fbba39cefb37535e1869ba891aba6526be5c87912f1e1ca8b7a84e5f20946eb3ba2149d30d8a20b4f9bda2fd#npm:6.18.1"],\ + ["@typescript-eslint/utils", "virtual:522d490a837c6b5c29b46fb3fd649aa53767db279f4a13866253f327c8c4b894b4c7e7acfef85a033a4e26b9712ca986662d2c7a942f0212e84b97f588d40b5a#npm:6.18.1"],\ ["eslint", "npm:8.56.0"],\ ["tslib", "npm:2.4.0"],\ ["tsutils", "virtual:4dcaee3d48fa8227d1bcf307d2fdba7db00ea5cf20a9a5f8078d9de305771b115a4f9745cf4d4bcb489f9ed417a64a02fd0a5a23e1cbc545d82a462a0fc798c7#npm:3.21.0"],\ @@ -10572,15 +10621,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["npm:7.1.1", {\ - "packageLocation": "./.yarn/cache/eslint-scope-npm-7.1.1-23935eb377-9f6e974ab2.zip/node_modules/eslint-scope/",\ - "packageDependencies": [\ - ["eslint-scope", "npm:7.1.1"],\ - ["esrecurse", "npm:4.3.0"],\ - ["estraverse", "npm:5.3.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:7.2.2", {\ "packageLocation": "./.yarn/cache/eslint-scope-npm-7.2.2-53cb0df8e8-ec97dbf5fb.zip/node_modules/eslint-scope/",\ "packageDependencies": [\ @@ -10612,20 +10652,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "eslint"\ ],\ "linkType": "HARD"\ - }],\ - ["virtual:c277e15ec0e2045c627afe7c6881d1c470953aef8322950356243dade72ac04024bc73986d7b8df7a4695dda6baeb1c400992fcdebf4f4f1fdf4df3d4618bb1c#npm:3.0.0", {\ - "packageLocation": "./.yarn/__virtual__/eslint-utils-virtual-73f86c6b70/0/cache/eslint-utils-npm-3.0.0-630b3a4013-0668fe02f5.zip/node_modules/eslint-utils/",\ - "packageDependencies": [\ - ["eslint-utils", "virtual:c277e15ec0e2045c627afe7c6881d1c470953aef8322950356243dade72ac04024bc73986d7b8df7a4695dda6baeb1c400992fcdebf4f4f1fdf4df3d4618bb1c#npm:3.0.0"],\ - ["@types/eslint", null],\ - ["eslint", "npm:8.26.0"],\ - ["eslint-visitor-keys", "npm:2.1.0"]\ - ],\ - "packagePeers": [\ - "@types/eslint",\ - "eslint"\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["eslint-visitor-keys", [\ @@ -10652,16 +10678,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["espree", [\ - ["npm:9.4.0", {\ - "packageLocation": "./.yarn/cache/espree-npm-9.4.0-0371ef3614-2e3020dde6.zip/node_modules/espree/",\ - "packageDependencies": [\ - ["espree", "npm:9.4.0"],\ - ["acorn", "npm:8.8.0"],\ - ["acorn-jsx", "virtual:0371ef3614c1182c8fcb05e5954a5fd9c124be4b821bd43f5ef7bdb1bf9603ab5ec16aa2a2a1de93fa397b424774f98f00c5e66d99eec56be0bd9f2a1ab2c75f#npm:5.3.2"],\ - ["eslint-visitor-keys", "npm:3.3.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:9.6.1", {\ "packageLocation": "./.yarn/cache/espree-npm-9.6.1-a50722a5a9-eb8c149c7a.zip/node_modules/espree/",\ "packageDependencies": [\ @@ -10683,14 +10699,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["esquery", [\ - ["npm:1.4.0", {\ - "packageLocation": "./.yarn/cache/esquery-npm-1.4.0-f39408b1a7-a0807e17ab.zip/node_modules/esquery/",\ - "packageDependencies": [\ - ["esquery", "npm:1.4.0"],\ - ["estraverse", "npm:5.3.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.5.0", {\ "packageLocation": "./.yarn/cache/esquery-npm-1.5.0-d8f8a06879-aefb0d2596.zip/node_modules/esquery/",\ "packageDependencies": [\ @@ -11008,7 +11016,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@babel/preset-env", "virtual:81cc2531fc6bda045c87d6c3b21351574209a7d87ba11b639412d754d2fbdd0831d00d35ee7d39be3226e871d899842f300a82fbfbdd17e263ce302a51c65de6#npm:7.19.1"],\ ["@babel/preset-react", "virtual:81cc2531fc6bda045c87d6c3b21351574209a7d87ba11b639412d754d2fbdd0831d00d35ee7d39be3226e871d899842f300a82fbfbdd17e263ce302a51c65de6#npm:7.22.15"],\ ["@babel/preset-typescript", "virtual:81cc2531fc6bda045c87d6c3b21351574209a7d87ba11b639412d754d2fbdd0831d00d35ee7d39be3226e871d899842f300a82fbfbdd17e263ce302a51c65de6#npm:7.18.6"],\ - ["@blueprintjs/eslint-plugin", "npm:2.1.2"],\ + ["@blueprintjs/eslint-plugin", "npm:6.1.0"],\ ["@types/is-ci", "npm:3.0.4"],\ ["@types/jest", "npm:29.5.11"],\ ["@types/lodash-es", "npm:4.17.12"],\ @@ -11566,14 +11574,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["npm:13.15.0", {\ - "packageLocation": "./.yarn/cache/globals-npm-13.15.0-c0b0c83a7a-383ade0873.zip/node_modules/globals/",\ - "packageDependencies": [\ - ["globals", "npm:13.15.0"],\ - ["type-fest", "npm:0.20.2"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:13.24.0", {\ "packageLocation": "./.yarn/cache/globals-npm-13.24.0-cc7713139c-56066ef058.zip/node_modules/globals/",\ "packageDependencies": [\ @@ -11681,15 +11681,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["gud", [\ - ["npm:1.0.0", {\ - "packageLocation": "./.yarn/cache/gud-npm-1.0.0-9747ac46ec-3e2eb37cf7.zip/node_modules/gud/",\ - "packageDependencies": [\ - ["gud", "npm:1.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["gzip-size", [\ ["npm:6.0.0", {\ "packageLocation": "./.yarn/cache/gzip-size-npm-6.0.0-d5b52fdbf1-2df97f3596.zip/node_modules/gzip-size/",\ @@ -13638,15 +13629,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["js-sdsl", [\ - ["npm:4.1.4", {\ - "packageLocation": "./.yarn/cache/js-sdsl-npm-4.1.4-334fa1c399-1977cea4ab.zip/node_modules/js-sdsl/",\ - "packageDependencies": [\ - ["js-sdsl", "npm:4.1.4"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["js-tokens", [\ ["npm:4.0.0", {\ "packageLocation": "./.yarn/cache/js-tokens-npm-4.0.0-0ac852e9e2-8a95213a5a.zip/node_modules/js-tokens/",\ @@ -15537,7 +15519,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@swc/helpers", "npm:0.5.2"],\ ["@types/opentelemetry__api", null],\ ["@types/react", "npm:18.0.20"],\ - ["@types/react-dom", null],\ + ["@types/react-dom", "npm:18.2.18"],\ ["@types/sass", null],\ ["busboy", "npm:1.6.0"],\ ["caniuse-lite", "npm:1.0.30001576"],\ @@ -15606,7 +15588,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["next-themes", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:0.2.1"],\ ["@types/next", null],\ ["@types/react", "npm:18.0.20"],\ - ["@types/react-dom", null],\ + ["@types/react-dom", "npm:18.2.18"],\ ["next", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:14.0.4"],\ ["react", "npm:18.2.0"],\ ["react-dom", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:18.2.0"]\ @@ -15944,19 +15926,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["optionator", [\ - ["npm:0.9.1", {\ - "packageLocation": "./.yarn/cache/optionator-npm-0.9.1-577e397aae-dbc6fa0656.zip/node_modules/optionator/",\ - "packageDependencies": [\ - ["optionator", "npm:0.9.1"],\ - ["deep-is", "npm:0.1.4"],\ - ["fast-levenshtein", "npm:2.0.6"],\ - ["levn", "npm:0.4.1"],\ - ["prelude-ls", "npm:1.2.1"],\ - ["type-check", "npm:0.4.0"],\ - ["word-wrap", "npm:1.2.5"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:0.9.3", {\ "packageLocation": "./.yarn/cache/optionator-npm-0.9.3-56c3a4bf80-0928199944.zip/node_modules/optionator/",\ "packageDependencies": [\ @@ -16332,15 +16301,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["popper.js", [\ - ["npm:1.16.1", {\ - "packageLocation": "./.yarn/cache/popper.js-npm-1.16.1-a99192bd83-c56ae5001e.zip/node_modules/popper.js/",\ - "packageDependencies": [\ - ["popper.js", "npm:1.16.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["postcss", [\ ["npm:8.4.31", {\ "packageLocation": "./.yarn/cache/postcss-npm-8.4.31-385051a82b-1d8611341b.zip/node_modules/postcss/",\ @@ -16961,6 +16921,53 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["react-day-picker", [\ + ["npm:7.4.9", {\ + "packageLocation": "./.yarn/cache/react-day-picker-npm-7.4.9-8853eff118-d86e459c0b.zip/node_modules/react-day-picker/",\ + "packageDependencies": [\ + ["react-day-picker", "npm:7.4.9"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["npm:8.10.0", {\ + "packageLocation": "./.yarn/cache/react-day-picker-npm-8.10.0-f78f1a9c78-a265e8c2f3.zip/node_modules/react-day-picker/",\ + "packageDependencies": [\ + ["react-day-picker", "npm:8.10.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:329252a27e49932f69418975d73c05dc01d5c3fc89f87c6c327886996920188474fa5405912dbf955a4470276069c982eafb2f34c316d3bed64564007da84a8e#npm:8.10.0", {\ + "packageLocation": "./.yarn/__virtual__/react-day-picker-virtual-dd60cc2b7d/0/cache/react-day-picker-npm-8.10.0-f78f1a9c78-a265e8c2f3.zip/node_modules/react-day-picker/",\ + "packageDependencies": [\ + ["react-day-picker", "virtual:329252a27e49932f69418975d73c05dc01d5c3fc89f87c6c327886996920188474fa5405912dbf955a4470276069c982eafb2f34c316d3bed64564007da84a8e#npm:8.10.0"],\ + ["@types/date-fns", null],\ + ["@types/react", "npm:18.0.20"],\ + ["date-fns", "npm:2.30.0"],\ + ["react", "npm:18.2.0"]\ + ],\ + "packagePeers": [\ + "@types/date-fns",\ + "@types/react",\ + "date-fns",\ + "react"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:3e15f123fa60f3a21c3200c61f0f4cd2cc2baa7e0bc47b9e21f659b954501f75b22b15f0ee46445729b25a6c108b0bbb87ad967a4afcee6a9d133905b2da674c#npm:7.4.9", {\ + "packageLocation": "./.yarn/__virtual__/react-day-picker-virtual-c988d131ce/0/cache/react-day-picker-npm-7.4.9-8853eff118-d86e459c0b.zip/node_modules/react-day-picker/",\ + "packageDependencies": [\ + ["react-day-picker", "virtual:3e15f123fa60f3a21c3200c61f0f4cd2cc2baa7e0bc47b9e21f659b954501f75b22b15f0ee46445729b25a6c108b0bbb87ad967a4afcee6a9d133905b2da674c#npm:7.4.9"],\ + ["@types/react", "npm:18.0.20"],\ + ["prop-types", "npm:15.8.1"],\ + ["react", "npm:18.2.0"]\ + ],\ + "packagePeers": [\ + "@types/react",\ + "react"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["react-dom", [\ ["npm:18.2.0", {\ "packageLocation": "./.yarn/cache/react-dom-npm-18.2.0-dd675bca1c-7d323310be.zip/node_modules/react-dom/",\ @@ -17060,6 +17067,28 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["react-innertext", [\ + ["npm:1.1.5", {\ + "packageLocation": "./.yarn/cache/react-innertext-npm-1.1.5-50613b71c6-01c9c8a5a4.zip/node_modules/react-innertext/",\ + "packageDependencies": [\ + ["react-innertext", "npm:1.1.5"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:329252a27e49932f69418975d73c05dc01d5c3fc89f87c6c327886996920188474fa5405912dbf955a4470276069c982eafb2f34c316d3bed64564007da84a8e#npm:1.1.5", {\ + "packageLocation": "./.yarn/__virtual__/react-innertext-virtual-8faf6d9082/0/cache/react-innertext-npm-1.1.5-50613b71c6-01c9c8a5a4.zip/node_modules/react-innertext/",\ + "packageDependencies": [\ + ["react-innertext", "virtual:329252a27e49932f69418975d73c05dc01d5c3fc89f87c6c327886996920188474fa5405912dbf955a4470276069c982eafb2f34c316d3bed64564007da84a8e#npm:1.1.5"],\ + ["@types/react", "npm:18.0.20"],\ + ["react", "npm:18.2.0"]\ + ],\ + "packagePeers": [\ + "@types/react",\ + "react"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["react-instantsearch-hooks", [\ ["npm:6.45.0", {\ "packageLocation": "./.yarn/cache/react-instantsearch-hooks-npm-6.45.0-72ffc3d5c8-61bda6fc34.zip/node_modules/react-instantsearch-hooks/",\ @@ -17105,7 +17134,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@babel/runtime", "npm:7.20.13"],\ ["@types/algoliasearch", null],\ ["@types/react", "npm:18.0.20"],\ - ["@types/react-dom", null],\ + ["@types/react-dom", "npm:18.2.18"],\ ["algoliasearch", "npm:4.22.1"],\ ["instantsearch.js", "virtual:5d9c561d1a0bffbe2e9941188cd2a8387053f118e03873d8e5829a4fb7104f12e5b6e5496036320bcceb074976bfdd704931bda92769aab8fc59ea2e8d7533d3#npm:4.56.3"],\ ["react", "npm:18.2.0"],\ @@ -17206,13 +17235,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["react-popper", [\ - ["npm:1.3.11", {\ - "packageLocation": "./.yarn/cache/react-popper-npm-1.3.11-7eb852583d-a0f5994f57.zip/node_modules/react-popper/",\ - "packageDependencies": [\ - ["react-popper", "npm:1.3.11"]\ - ],\ - "linkType": "SOFT"\ - }],\ ["npm:2.3.0", {\ "packageLocation": "./.yarn/cache/react-popper-npm-2.3.0-1045578379-837111c987.zip/node_modules/react-popper/",\ "packageDependencies": [\ @@ -17220,54 +17242,60 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:32f2cc5aa91e2c93a34690720c76f42ce6200c553152bd83f798c20ed52a4382372f74822a568b08017b047641b45bd82532c25cb928b49314e24467477ea2c3#npm:1.3.11", {\ - "packageLocation": "./.yarn/__virtual__/react-popper-virtual-f2ce7ef60c/0/cache/react-popper-npm-1.3.11-7eb852583d-a0f5994f57.zip/node_modules/react-popper/",\ + ["virtual:12f0dbd532a540be73fd452f90d2fe8d5c4fdf973bab4973c5d08fba1a179ff60e1642c42ed0011f693478d5adba909c1bab5c64e53e6b1e34accd86be561caf#npm:2.3.0", {\ + "packageLocation": "./.yarn/__virtual__/react-popper-virtual-d9500c7de6/0/cache/react-popper-npm-2.3.0-1045578379-837111c987.zip/node_modules/react-popper/",\ "packageDependencies": [\ - ["react-popper", "virtual:32f2cc5aa91e2c93a34690720c76f42ce6200c553152bd83f798c20ed52a4382372f74822a568b08017b047641b45bd82532c25cb928b49314e24467477ea2c3#npm:1.3.11"],\ - ["@babel/runtime", "npm:7.20.13"],\ - ["@hypnosphi/create-react-context", "virtual:f2ce7ef60cb11a160b3c967ea69c1605846e12dc183ac7df814a1c6fa8018684a2009731dfbca05c66fa783ae65ed4fef315c42b94daba8e0e18b46e858e3fb2#npm:0.3.1"],\ + ["react-popper", "virtual:12f0dbd532a540be73fd452f90d2fe8d5c4fdf973bab4973c5d08fba1a179ff60e1642c42ed0011f693478d5adba909c1bab5c64e53e6b1e34accd86be561caf#npm:2.3.0"],\ + ["@popperjs/core", "npm:2.11.8"],\ + ["@types/popperjs__core", null],\ ["@types/react", "npm:18.0.20"],\ - ["deep-equal", "npm:1.1.1"],\ - ["popper.js", "npm:1.16.1"],\ - ["prop-types", "npm:15.8.1"],\ + ["@types/react-dom", null],\ ["react", "npm:18.2.0"],\ - ["typed-styles", "npm:0.0.7"],\ + ["react-dom", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:18.2.0"],\ + ["react-fast-compare", "npm:3.2.0"],\ ["warning", "npm:4.0.3"]\ ],\ "packagePeers": [\ + "@popperjs/core",\ + "@types/popperjs__core",\ + "@types/react-dom",\ "@types/react",\ + "react-dom",\ "react"\ ],\ "linkType": "HARD"\ }],\ - ["virtual:34db86cdb776b05939f8ab1da6245aed232b9dae3750065b50f25c364657d6668761675ddb233bf4d168aca38f30d98aa9dbeee9dc812eafe7555a2dcc450a8d#npm:1.3.11", {\ - "packageLocation": "./.yarn/__virtual__/react-popper-virtual-7c2cd23a97/0/cache/react-popper-npm-1.3.11-7eb852583d-a0f5994f57.zip/node_modules/react-popper/",\ + ["virtual:4a7ecb2d289a88e991260955c9429422d3abc1273bae01d27f77ddb8fc42a083b71948cb5721b8c2e132d36234a6167fd53f454f3365c9b4e0b733b8fc8f74d0#npm:2.3.0", {\ + "packageLocation": "./.yarn/__virtual__/react-popper-virtual-0e15155a51/0/cache/react-popper-npm-2.3.0-1045578379-837111c987.zip/node_modules/react-popper/",\ "packageDependencies": [\ - ["react-popper", "virtual:34db86cdb776b05939f8ab1da6245aed232b9dae3750065b50f25c364657d6668761675ddb233bf4d168aca38f30d98aa9dbeee9dc812eafe7555a2dcc450a8d#npm:1.3.11"],\ - ["@babel/runtime", "npm:7.20.13"],\ - ["@hypnosphi/create-react-context", "virtual:7c2cd23a9798c9d292d77dc8d348fe56ecf5d1f82942d7d7af7205964f0eb73202f389056ebcbd6d84fc7903d31349941215e568df75f3c497b3d1e48179bc5e#npm:0.3.1"],\ + ["react-popper", "virtual:4a7ecb2d289a88e991260955c9429422d3abc1273bae01d27f77ddb8fc42a083b71948cb5721b8c2e132d36234a6167fd53f454f3365c9b4e0b733b8fc8f74d0#npm:2.3.0"],\ + ["@popperjs/core", "npm:2.11.8"],\ + ["@types/popperjs__core", null],\ ["@types/react", null],\ - ["deep-equal", "npm:1.1.1"],\ - ["popper.js", "npm:1.16.1"],\ - ["prop-types", "npm:15.8.1"],\ + ["@types/react-dom", null],\ ["react", "npm:18.2.0"],\ - ["typed-styles", "npm:0.0.7"],\ + ["react-dom", "virtual:b977a69fb19c4d0f85f8b91df4d5bbb0d247e9cfda57636e95b33f40dfc5a05b68c27a163035a0eb7204d129d5e24e42811c10b0902ee38cf8cf4debee72619b#npm:18.2.0"],\ + ["react-fast-compare", "npm:3.2.0"],\ ["warning", "npm:4.0.3"]\ ],\ "packagePeers": [\ + "@popperjs/core",\ + "@types/popperjs__core",\ + "@types/react-dom",\ "@types/react",\ + "react-dom",\ "react"\ ],\ "linkType": "HARD"\ }],\ - ["virtual:56c14ef97d126830200f0959510c0270d57f62d38fa81021665704ca1b3a8f9e4e122de58693631c88ce65a37a7bc2b54337d4fc7f18aea91d3b7997f216e804#npm:2.3.0", {\ - "packageLocation": "./.yarn/__virtual__/react-popper-virtual-abe9e7c089/0/cache/react-popper-npm-2.3.0-1045578379-837111c987.zip/node_modules/react-popper/",\ + ["virtual:d2059c01bad8c87a960b7c316c717ff4d401763b53ca0bcceba53192f92d96077662942ff5d2f83d3edd879296685f5879e2141a8e458aa09fbc478e496ca744#npm:2.3.0", {\ + "packageLocation": "./.yarn/__virtual__/react-popper-virtual-4914a846d5/0/cache/react-popper-npm-2.3.0-1045578379-837111c987.zip/node_modules/react-popper/",\ "packageDependencies": [\ - ["react-popper", "virtual:56c14ef97d126830200f0959510c0270d57f62d38fa81021665704ca1b3a8f9e4e122de58693631c88ce65a37a7bc2b54337d4fc7f18aea91d3b7997f216e804#npm:2.3.0"],\ - ["@popperjs/core", "npm:2.11.6"],\ + ["react-popper", "virtual:d2059c01bad8c87a960b7c316c717ff4d401763b53ca0bcceba53192f92d96077662942ff5d2f83d3edd879296685f5879e2141a8e458aa09fbc478e496ca744#npm:2.3.0"],\ + ["@popperjs/core", "npm:2.11.8"],\ ["@types/popperjs__core", null],\ ["@types/react", "npm:18.0.20"],\ - ["@types/react-dom", null],\ + ["@types/react-dom", "npm:18.2.18"],\ ["react", "npm:18.2.0"],\ ["react-dom", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:18.2.0"],\ ["react-fast-compare", "npm:3.2.0"],\ @@ -17368,10 +17396,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:32f2cc5aa91e2c93a34690720c76f42ce6200c553152bd83f798c20ed52a4382372f74822a568b08017b047641b45bd82532c25cb928b49314e24467477ea2c3#npm:4.4.5", {\ - "packageLocation": "./.yarn/__virtual__/react-transition-group-virtual-c04995b1ad/0/cache/react-transition-group-npm-4.4.5-98ea4ef96e-7560284010.zip/node_modules/react-transition-group/",\ + ["virtual:12f0dbd532a540be73fd452f90d2fe8d5c4fdf973bab4973c5d08fba1a179ff60e1642c42ed0011f693478d5adba909c1bab5c64e53e6b1e34accd86be561caf#npm:4.4.5", {\ + "packageLocation": "./.yarn/__virtual__/react-transition-group-virtual-009694544f/0/cache/react-transition-group-npm-4.4.5-98ea4ef96e-7560284010.zip/node_modules/react-transition-group/",\ "packageDependencies": [\ - ["react-transition-group", "virtual:32f2cc5aa91e2c93a34690720c76f42ce6200c553152bd83f798c20ed52a4382372f74822a568b08017b047641b45bd82532c25cb928b49314e24467477ea2c3#npm:4.4.5"],\ + ["react-transition-group", "virtual:12f0dbd532a540be73fd452f90d2fe8d5c4fdf973bab4973c5d08fba1a179ff60e1642c42ed0011f693478d5adba909c1bab5c64e53e6b1e34accd86be561caf#npm:4.4.5"],\ ["@babel/runtime", "npm:7.20.13"],\ ["@types/react", "npm:18.0.20"],\ ["@types/react-dom", null],\ @@ -17389,10 +17417,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:34db86cdb776b05939f8ab1da6245aed232b9dae3750065b50f25c364657d6668761675ddb233bf4d168aca38f30d98aa9dbeee9dc812eafe7555a2dcc450a8d#npm:4.4.5", {\ - "packageLocation": "./.yarn/__virtual__/react-transition-group-virtual-c09ca68a5a/0/cache/react-transition-group-npm-4.4.5-98ea4ef96e-7560284010.zip/node_modules/react-transition-group/",\ + ["virtual:4a7ecb2d289a88e991260955c9429422d3abc1273bae01d27f77ddb8fc42a083b71948cb5721b8c2e132d36234a6167fd53f454f3365c9b4e0b733b8fc8f74d0#npm:4.4.5", {\ + "packageLocation": "./.yarn/__virtual__/react-transition-group-virtual-5f36f6be25/0/cache/react-transition-group-npm-4.4.5-98ea4ef96e-7560284010.zip/node_modules/react-transition-group/",\ "packageDependencies": [\ - ["react-transition-group", "virtual:34db86cdb776b05939f8ab1da6245aed232b9dae3750065b50f25c364657d6668761675ddb233bf4d168aca38f30d98aa9dbeee9dc812eafe7555a2dcc450a8d#npm:4.4.5"],\ + ["react-transition-group", "virtual:4a7ecb2d289a88e991260955c9429422d3abc1273bae01d27f77ddb8fc42a083b71948cb5721b8c2e132d36234a6167fd53f454f3365c9b4e0b733b8fc8f74d0#npm:4.4.5"],\ ["@babel/runtime", "npm:7.20.13"],\ ["@types/react", null],\ ["@types/react-dom", null],\ @@ -17409,6 +17437,27 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "react"\ ],\ "linkType": "HARD"\ + }],\ + ["virtual:d2059c01bad8c87a960b7c316c717ff4d401763b53ca0bcceba53192f92d96077662942ff5d2f83d3edd879296685f5879e2141a8e458aa09fbc478e496ca744#npm:4.4.5", {\ + "packageLocation": "./.yarn/__virtual__/react-transition-group-virtual-6cb13d93a0/0/cache/react-transition-group-npm-4.4.5-98ea4ef96e-7560284010.zip/node_modules/react-transition-group/",\ + "packageDependencies": [\ + ["react-transition-group", "virtual:d2059c01bad8c87a960b7c316c717ff4d401763b53ca0bcceba53192f92d96077662942ff5d2f83d3edd879296685f5879e2141a8e458aa09fbc478e496ca744#npm:4.4.5"],\ + ["@babel/runtime", "npm:7.20.13"],\ + ["@types/react", "npm:18.0.20"],\ + ["@types/react-dom", "npm:18.2.18"],\ + ["dom-helpers", "npm:5.2.1"],\ + ["loose-envify", "npm:1.4.0"],\ + ["prop-types", "npm:15.8.1"],\ + ["react", "npm:18.2.0"],\ + ["react-dom", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:18.2.0"]\ + ],\ + "packagePeers": [\ + "@types/react-dom",\ + "@types/react",\ + "react-dom",\ + "react"\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["react-virtuoso", [\ @@ -17424,7 +17473,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [\ ["react-virtuoso", "virtual:78e90867e46510db2994cf6ed805ab4ba701c55b6d7a2c33f6cc04865dc082c172bef019989477dda8bc6824512d13cb3bcb74ef12bd113a2f6bdcd291ad70f1#npm:4.6.0"],\ ["@types/react", "npm:18.0.20"],\ - ["@types/react-dom", null],\ + ["@types/react-dom", "npm:18.2.18"],\ ["react", "npm:18.2.0"],\ ["react-dom", "virtual:365c5e55d4374302d83e985bf13cdc0e1b9981623dceff55d2afbcfc02ee37332be44cf95e9c81193f89ad56d1cfe060a8b59dd16c83a03bcf51abe82d13ecf2#npm:18.2.0"]\ ],\ @@ -17597,15 +17646,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["regexpp", [\ - ["npm:3.2.0", {\ - "packageLocation": "./.yarn/cache/regexpp-npm-3.2.0-2513f32cfc-a78dc5c715.zip/node_modules/regexpp/",\ - "packageDependencies": [\ - ["regexpp", "npm:3.2.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["regexpu-core", [\ ["npm:5.1.0", {\ "packageLocation": "./.yarn/cache/regexpu-core-npm-5.1.0-ac0a69b941-7b4eb8d182.zip/node_modules/regexpu-core/",\ @@ -19390,10 +19430,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:1064d4a5f798a21bdaf07cc8da857cdd4ee48471bcc0c3c8923ff6852970360db1128ab452d567e2c11c51d08db9ed569b99b7ac9b93a97edb9cef4e08b6127d#npm:1.0.2", {\ - "packageLocation": "./.yarn/__virtual__/ts-api-utils-virtual-04604d99b6/0/cache/ts-api-utils-npm-1.0.2-0fe6a86036-6375e12ba9.zip/node_modules/ts-api-utils/",\ + ["virtual:2a425c7f3595b53795016c54cce376fe8ddd9e3a6cb1946e8198f67105b3d5fb170ff3300814dfd5165d6f68b4d5e3408f25ade526243b3c0e5c6142cdab2e70#npm:1.0.2", {\ + "packageLocation": "./.yarn/__virtual__/ts-api-utils-virtual-9400c9175a/0/cache/ts-api-utils-npm-1.0.2-0fe6a86036-6375e12ba9.zip/node_modules/ts-api-utils/",\ "packageDependencies": [\ - ["ts-api-utils", "virtual:1064d4a5f798a21bdaf07cc8da857cdd4ee48471bcc0c3c8923ff6852970360db1128ab452d567e2c11c51d08db9ed569b99b7ac9b93a97edb9cef4e08b6127d#npm:1.0.2"],\ + ["ts-api-utils", "virtual:2a425c7f3595b53795016c54cce376fe8ddd9e3a6cb1946e8198f67105b3d5fb170ff3300814dfd5165d6f68b4d5e3408f25ade526243b3c0e5c6142cdab2e70#npm:1.0.2"],\ ["@types/typescript", null],\ ["typescript", null]\ ],\ @@ -19526,13 +19566,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["npm:2.3.1", {\ - "packageLocation": "./.yarn/cache/tslib-npm-2.3.1-0e21e18015-de17a98d46.zip/node_modules/tslib/",\ - "packageDependencies": [\ - ["tslib", "npm:2.3.1"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:2.4.0", {\ "packageLocation": "./.yarn/cache/tslib-npm-2.4.0-9cb6dc5030-8c4aa6a3c5.zip/node_modules/tslib/",\ "packageDependencies": [\ @@ -19577,10 +19610,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:c63ede9b660397b3afa67a4499cc146d605b84467174118eacc0e84c52e54bd43ed2cf170bf6342907bb2a43c736ab9b4899ade9079e9ccb6978c6aedcc3d46d#npm:3.21.0", {\ - "packageLocation": "./.yarn/__virtual__/tsutils-virtual-27c0f60cfc/0/cache/tsutils-npm-3.21.0-347e6636c5-1843f4c1b2.zip/node_modules/tsutils/",\ + ["virtual:80dbe13b003d4893ed88b84b49b1bc3c77eeb736c51345edd5634322a34acade08d0f0c807486d43d3b599580476a86641389579846227846f513c05d25f2c1c#npm:3.21.0", {\ + "packageLocation": "./.yarn/__virtual__/tsutils-virtual-bf36395c89/0/cache/tsutils-npm-3.21.0-347e6636c5-1843f4c1b2.zip/node_modules/tsutils/",\ "packageDependencies": [\ - ["tsutils", "virtual:c63ede9b660397b3afa67a4499cc146d605b84467174118eacc0e84c52e54bd43ed2cf170bf6342907bb2a43c736ab9b4899ade9079e9ccb6978c6aedcc3d46d#npm:3.21.0"],\ + ["tsutils", "virtual:80dbe13b003d4893ed88b84b49b1bc3c77eeb736c51345edd5634322a34acade08d0f0c807486d43d3b599580476a86641389579846227846f513c05d25f2c1c#npm:3.21.0"],\ ["@types/typescript", null],\ ["tslib", "npm:1.14.1"],\ ["typescript", null]\ @@ -19696,15 +19729,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["typed-styles", [\ - ["npm:0.0.7", {\ - "packageLocation": "./.yarn/cache/typed-styles-npm-0.0.7-14151fdbae-36a6ad6bee.zip/node_modules/typed-styles/",\ - "packageDependencies": [\ - ["typed-styles", "npm:0.0.7"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["typescript", [\ ["patch:typescript@npm%3A4.9.4#~builtin::version=4.9.4&hash=289587", {\ "packageLocation": "./.yarn/cache/typescript-patch-0887b19144-2160f7ad97.zip/node_modules/typescript/",\ @@ -20460,15 +20484,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["word-wrap", [\ - ["npm:1.2.5", {\ - "packageLocation": "./.yarn/cache/word-wrap-npm-1.2.5-42d00c4b09-f93ba3586f.zip/node_modules/word-wrap/",\ - "packageDependencies": [\ - ["word-wrap", "npm:1.2.5"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["wrap-ansi", [\ ["npm:6.2.0", {\ "packageLocation": "./.yarn/cache/wrap-ansi-npm-6.2.0-439a7246d8-6cd96a4101.zip/node_modules/wrap-ansi/",\ diff --git a/.yarn/cache/@blueprintjs-colors-npm-4.1.8-423f99131d-a9fb3363d1.zip b/.yarn/cache/@blueprintjs-colors-npm-4.1.8-423f99131d-a9fb3363d1.zip deleted file mode 100644 index 6681d3f349..0000000000 Binary files a/.yarn/cache/@blueprintjs-colors-npm-4.1.8-423f99131d-a9fb3363d1.zip and /dev/null differ diff --git a/.yarn/cache/@blueprintjs-colors-npm-5.0.9-546285c27d-58246ca9a7.zip b/.yarn/cache/@blueprintjs-colors-npm-5.0.9-546285c27d-58246ca9a7.zip new file mode 100644 index 0000000000..c2746a7cca Binary files /dev/null and b/.yarn/cache/@blueprintjs-colors-npm-5.0.9-546285c27d-58246ca9a7.zip differ diff --git a/.yarn/cache/@blueprintjs-core-npm-4.11.5-3f2c334c30-0ce0d2236c.zip b/.yarn/cache/@blueprintjs-core-npm-4.11.5-3f2c334c30-0ce0d2236c.zip deleted file mode 100644 index 2b643e4801..0000000000 Binary files a/.yarn/cache/@blueprintjs-core-npm-4.11.5-3f2c334c30-0ce0d2236c.zip and /dev/null differ diff --git a/.yarn/cache/@blueprintjs-core-npm-5.8.1-97817e2227-938bc0bf64.zip b/.yarn/cache/@blueprintjs-core-npm-5.8.1-97817e2227-938bc0bf64.zip new file mode 100644 index 0000000000..5eddb8023b Binary files /dev/null and b/.yarn/cache/@blueprintjs-core-npm-5.8.1-97817e2227-938bc0bf64.zip differ diff --git a/.yarn/cache/@blueprintjs-core-npm-5.8.2-0b8a2ac3e1-f8480389af.zip b/.yarn/cache/@blueprintjs-core-npm-5.8.2-0b8a2ac3e1-f8480389af.zip new file mode 100644 index 0000000000..1801800729 Binary files /dev/null and b/.yarn/cache/@blueprintjs-core-npm-5.8.2-0b8a2ac3e1-f8480389af.zip differ diff --git a/.yarn/cache/@blueprintjs-datetime-npm-5.2.11-9c709ae380-c69470e3c0.zip b/.yarn/cache/@blueprintjs-datetime-npm-5.2.11-9c709ae380-c69470e3c0.zip new file mode 100644 index 0000000000..bd3b650397 Binary files /dev/null and b/.yarn/cache/@blueprintjs-datetime-npm-5.2.11-9c709ae380-c69470e3c0.zip differ diff --git a/.yarn/cache/@blueprintjs-datetime2-npm-2.2.9-a95144ba37-ef35243cad.zip b/.yarn/cache/@blueprintjs-datetime2-npm-2.2.9-a95144ba37-ef35243cad.zip new file mode 100644 index 0000000000..9c031aa1fb Binary files /dev/null and b/.yarn/cache/@blueprintjs-datetime2-npm-2.2.9-a95144ba37-ef35243cad.zip differ diff --git a/.yarn/cache/@blueprintjs-eslint-plugin-npm-2.1.2-461eb5c970-cf3fb5279a.zip b/.yarn/cache/@blueprintjs-eslint-plugin-npm-2.1.2-461eb5c970-cf3fb5279a.zip deleted file mode 100644 index 0bd6cb4f2d..0000000000 Binary files a/.yarn/cache/@blueprintjs-eslint-plugin-npm-2.1.2-461eb5c970-cf3fb5279a.zip and /dev/null differ diff --git a/.yarn/cache/@blueprintjs-eslint-plugin-npm-6.1.0-522d490a83-27171db159.zip b/.yarn/cache/@blueprintjs-eslint-plugin-npm-6.1.0-522d490a83-27171db159.zip new file mode 100644 index 0000000000..4df61fb687 Binary files /dev/null and b/.yarn/cache/@blueprintjs-eslint-plugin-npm-6.1.0-522d490a83-27171db159.zip differ diff --git a/.yarn/cache/@blueprintjs-icons-npm-4.9.0-5eb1e40a09-43d9f1b315.zip b/.yarn/cache/@blueprintjs-icons-npm-4.9.0-5eb1e40a09-43d9f1b315.zip deleted file mode 100644 index 8aa7a79442..0000000000 Binary files a/.yarn/cache/@blueprintjs-icons-npm-4.9.0-5eb1e40a09-43d9f1b315.zip and /dev/null differ diff --git a/.yarn/cache/@blueprintjs-icons-npm-5.7.0-a4d3151607-d8a938a168.zip b/.yarn/cache/@blueprintjs-icons-npm-5.7.0-a4d3151607-d8a938a168.zip new file mode 100644 index 0000000000..40ca91a65c Binary files /dev/null and b/.yarn/cache/@blueprintjs-icons-npm-5.7.0-a4d3151607-d8a938a168.zip differ diff --git a/.yarn/cache/@blueprintjs-popover2-npm-1.8.0-f9e6fd492f-59635cbd75.zip b/.yarn/cache/@blueprintjs-popover2-npm-1.8.0-f9e6fd492f-59635cbd75.zip deleted file mode 100644 index 3088902798..0000000000 Binary files a/.yarn/cache/@blueprintjs-popover2-npm-1.8.0-f9e6fd492f-59635cbd75.zip and /dev/null differ diff --git a/.yarn/cache/@blueprintjs-select-npm-4.5.1-df326c51e2-29d8360720.zip b/.yarn/cache/@blueprintjs-select-npm-4.5.1-df326c51e2-29d8360720.zip deleted file mode 100644 index 0df8678467..0000000000 Binary files a/.yarn/cache/@blueprintjs-select-npm-4.5.1-df326c51e2-29d8360720.zip and /dev/null differ diff --git a/.yarn/cache/@blueprintjs-select-npm-5.0.22-f8c2863de7-dfde636033.zip b/.yarn/cache/@blueprintjs-select-npm-5.0.22-f8c2863de7-dfde636033.zip new file mode 100644 index 0000000000..a829514b0c Binary files /dev/null and b/.yarn/cache/@blueprintjs-select-npm-5.0.22-f8c2863de7-dfde636033.zip differ diff --git a/.yarn/cache/@blueprintjs-select-npm-5.0.23-41413e5d03-dca93f736e.zip b/.yarn/cache/@blueprintjs-select-npm-5.0.23-41413e5d03-dca93f736e.zip new file mode 100644 index 0000000000..0aae4bf344 Binary files /dev/null and b/.yarn/cache/@blueprintjs-select-npm-5.0.23-41413e5d03-dca93f736e.zip differ diff --git a/.yarn/cache/@eslint-eslintrc-npm-1.3.3-9e3a462140-f03e9d6727.zip b/.yarn/cache/@eslint-eslintrc-npm-1.3.3-9e3a462140-f03e9d6727.zip deleted file mode 100644 index 4d1a8efd5e..0000000000 Binary files a/.yarn/cache/@eslint-eslintrc-npm-1.3.3-9e3a462140-f03e9d6727.zip and /dev/null differ diff --git a/.yarn/cache/@headlessui-react-npm-1.7.17-c3f120aed0-0cdb67747e.zip b/.yarn/cache/@headlessui-react-npm-1.7.17-c3f120aed0-0cdb67747e.zip deleted file mode 100644 index a38510bfa1..0000000000 Binary files a/.yarn/cache/@headlessui-react-npm-1.7.17-c3f120aed0-0cdb67747e.zip and /dev/null differ diff --git a/.yarn/cache/@headlessui-react-npm-1.7.18-91486d4b37-7463167b4c.zip b/.yarn/cache/@headlessui-react-npm-1.7.18-91486d4b37-7463167b4c.zip new file mode 100644 index 0000000000..ec59f2be82 Binary files /dev/null and b/.yarn/cache/@headlessui-react-npm-1.7.18-91486d4b37-7463167b4c.zip differ diff --git a/.yarn/cache/@humanwhocodes-config-array-npm-0.11.6-02675b40c5-2fb7288638.zip b/.yarn/cache/@humanwhocodes-config-array-npm-0.11.6-02675b40c5-2fb7288638.zip deleted file mode 100644 index b9612e7b84..0000000000 Binary files a/.yarn/cache/@humanwhocodes-config-array-npm-0.11.6-02675b40c5-2fb7288638.zip and /dev/null differ diff --git a/.yarn/cache/@humanwhocodes-object-schema-npm-1.2.1-eb622b5d0e-a824a1ec31.zip b/.yarn/cache/@humanwhocodes-object-schema-npm-1.2.1-eb622b5d0e-a824a1ec31.zip deleted file mode 100644 index 2b79104af5..0000000000 Binary files a/.yarn/cache/@humanwhocodes-object-schema-npm-1.2.1-eb622b5d0e-a824a1ec31.zip and /dev/null differ diff --git a/.yarn/cache/@hypnosphi-create-react-context-npm-0.3.1-01f6252b38-d2f069a562.zip b/.yarn/cache/@hypnosphi-create-react-context-npm-0.3.1-01f6252b38-d2f069a562.zip deleted file mode 100644 index 26d3979536..0000000000 Binary files a/.yarn/cache/@hypnosphi-create-react-context-npm-0.3.1-01f6252b38-d2f069a562.zip and /dev/null differ diff --git a/.yarn/cache/@popperjs-core-npm-2.11.6-5bcdc104bd-47fb328cec.zip b/.yarn/cache/@popperjs-core-npm-2.11.6-5bcdc104bd-47fb328cec.zip deleted file mode 100644 index e372ae30af..0000000000 Binary files a/.yarn/cache/@popperjs-core-npm-2.11.6-5bcdc104bd-47fb328cec.zip and /dev/null differ diff --git a/.yarn/cache/@popperjs-core-npm-2.11.8-f1692e11a0-e5c69fdebf.zip b/.yarn/cache/@popperjs-core-npm-2.11.8-f1692e11a0-e5c69fdebf.zip new file mode 100644 index 0000000000..a5eef4b227 Binary files /dev/null and b/.yarn/cache/@popperjs-core-npm-2.11.8-f1692e11a0-e5c69fdebf.zip differ diff --git a/.yarn/cache/@tanstack-react-virtual-npm-3.0.1-4ec4d04e6c-11534a2310.zip b/.yarn/cache/@tanstack-react-virtual-npm-3.0.1-4ec4d04e6c-11534a2310.zip new file mode 100644 index 0000000000..1d0a6f7af8 Binary files /dev/null and b/.yarn/cache/@tanstack-react-virtual-npm-3.0.1-4ec4d04e6c-11534a2310.zip differ diff --git a/.yarn/cache/@tanstack-virtual-core-npm-3.0.0-f5ce10d614-7283d50fc7.zip b/.yarn/cache/@tanstack-virtual-core-npm-3.0.0-f5ce10d614-7283d50fc7.zip new file mode 100644 index 0000000000..15ffb94cf7 Binary files /dev/null and b/.yarn/cache/@tanstack-virtual-core-npm-3.0.0-f5ce10d614-7283d50fc7.zip differ diff --git a/.yarn/cache/@types-dom4-npm-2.0.2-a6b70fba70-33af623489.zip b/.yarn/cache/@types-dom4-npm-2.0.2-a6b70fba70-33af623489.zip deleted file mode 100644 index b6c3d61e48..0000000000 Binary files a/.yarn/cache/@types-dom4-npm-2.0.2-a6b70fba70-33af623489.zip and /dev/null differ diff --git a/.yarn/cache/date-fns-npm-2.30.0-895c790e0f-f7be015232.zip b/.yarn/cache/date-fns-npm-2.30.0-895c790e0f-f7be015232.zip new file mode 100644 index 0000000000..f51ffd3ec9 Binary files /dev/null and b/.yarn/cache/date-fns-npm-2.30.0-895c790e0f-f7be015232.zip differ diff --git a/.yarn/cache/date-fns-tz-npm-2.0.0-9b7996f292-a6553603a9.zip b/.yarn/cache/date-fns-tz-npm-2.0.0-9b7996f292-a6553603a9.zip new file mode 100644 index 0000000000..337d3f2fd4 Binary files /dev/null and b/.yarn/cache/date-fns-tz-npm-2.0.0-9b7996f292-a6553603a9.zip differ diff --git a/.yarn/cache/deep-equal-npm-1.1.1-67ff9c29b9-f92686f2c5.zip b/.yarn/cache/deep-equal-npm-1.1.1-67ff9c29b9-f92686f2c5.zip deleted file mode 100644 index d9e0d3ff6b..0000000000 Binary files a/.yarn/cache/deep-equal-npm-1.1.1-67ff9c29b9-f92686f2c5.zip and /dev/null differ diff --git a/.yarn/cache/dom4-npm-2.1.6-c189e2d3c4-c15ad56afb.zip b/.yarn/cache/dom4-npm-2.1.6-c189e2d3c4-c15ad56afb.zip deleted file mode 100644 index 1f8b57044c..0000000000 Binary files a/.yarn/cache/dom4-npm-2.1.6-c189e2d3c4-c15ad56afb.zip and /dev/null differ diff --git a/.yarn/cache/eslint-npm-8.26.0-c277e15ec0-a2aced939e.zip b/.yarn/cache/eslint-npm-8.26.0-c277e15ec0-a2aced939e.zip deleted file mode 100644 index 903e682845..0000000000 Binary files a/.yarn/cache/eslint-npm-8.26.0-c277e15ec0-a2aced939e.zip and /dev/null differ diff --git a/.yarn/cache/eslint-scope-npm-7.1.1-23935eb377-9f6e974ab2.zip b/.yarn/cache/eslint-scope-npm-7.1.1-23935eb377-9f6e974ab2.zip deleted file mode 100644 index fcad723df3..0000000000 Binary files a/.yarn/cache/eslint-scope-npm-7.1.1-23935eb377-9f6e974ab2.zip and /dev/null differ diff --git a/.yarn/cache/espree-npm-9.4.0-0371ef3614-2e3020dde6.zip b/.yarn/cache/espree-npm-9.4.0-0371ef3614-2e3020dde6.zip deleted file mode 100644 index 95a79f462f..0000000000 Binary files a/.yarn/cache/espree-npm-9.4.0-0371ef3614-2e3020dde6.zip and /dev/null differ diff --git a/.yarn/cache/esquery-npm-1.4.0-f39408b1a7-a0807e17ab.zip b/.yarn/cache/esquery-npm-1.4.0-f39408b1a7-a0807e17ab.zip deleted file mode 100644 index abf91d4c4f..0000000000 Binary files a/.yarn/cache/esquery-npm-1.4.0-f39408b1a7-a0807e17ab.zip and /dev/null differ diff --git a/.yarn/cache/globals-npm-13.15.0-c0b0c83a7a-383ade0873.zip b/.yarn/cache/globals-npm-13.15.0-c0b0c83a7a-383ade0873.zip deleted file mode 100644 index b74e2b3511..0000000000 Binary files a/.yarn/cache/globals-npm-13.15.0-c0b0c83a7a-383ade0873.zip and /dev/null differ diff --git a/.yarn/cache/gud-npm-1.0.0-9747ac46ec-3e2eb37cf7.zip b/.yarn/cache/gud-npm-1.0.0-9747ac46ec-3e2eb37cf7.zip deleted file mode 100644 index ed1999de5f..0000000000 Binary files a/.yarn/cache/gud-npm-1.0.0-9747ac46ec-3e2eb37cf7.zip and /dev/null differ diff --git a/.yarn/cache/js-sdsl-npm-4.1.4-334fa1c399-1977cea4ab.zip b/.yarn/cache/js-sdsl-npm-4.1.4-334fa1c399-1977cea4ab.zip deleted file mode 100644 index 95759c5db4..0000000000 Binary files a/.yarn/cache/js-sdsl-npm-4.1.4-334fa1c399-1977cea4ab.zip and /dev/null differ diff --git a/.yarn/cache/optionator-npm-0.9.1-577e397aae-dbc6fa0656.zip b/.yarn/cache/optionator-npm-0.9.1-577e397aae-dbc6fa0656.zip deleted file mode 100644 index 6e6efe345b..0000000000 Binary files a/.yarn/cache/optionator-npm-0.9.1-577e397aae-dbc6fa0656.zip and /dev/null differ diff --git a/.yarn/cache/popper.js-npm-1.16.1-a99192bd83-c56ae5001e.zip b/.yarn/cache/popper.js-npm-1.16.1-a99192bd83-c56ae5001e.zip deleted file mode 100644 index 2f65739c5b..0000000000 Binary files a/.yarn/cache/popper.js-npm-1.16.1-a99192bd83-c56ae5001e.zip and /dev/null differ diff --git a/.yarn/cache/react-day-picker-npm-7.4.9-8853eff118-d86e459c0b.zip b/.yarn/cache/react-day-picker-npm-7.4.9-8853eff118-d86e459c0b.zip new file mode 100644 index 0000000000..e001f42263 Binary files /dev/null and b/.yarn/cache/react-day-picker-npm-7.4.9-8853eff118-d86e459c0b.zip differ diff --git a/.yarn/cache/react-day-picker-npm-8.10.0-f78f1a9c78-a265e8c2f3.zip b/.yarn/cache/react-day-picker-npm-8.10.0-f78f1a9c78-a265e8c2f3.zip new file mode 100644 index 0000000000..d3dbfea82e Binary files /dev/null and b/.yarn/cache/react-day-picker-npm-8.10.0-f78f1a9c78-a265e8c2f3.zip differ diff --git a/.yarn/cache/react-innertext-npm-1.1.5-50613b71c6-01c9c8a5a4.zip b/.yarn/cache/react-innertext-npm-1.1.5-50613b71c6-01c9c8a5a4.zip new file mode 100644 index 0000000000..3b347c2b8d Binary files /dev/null and b/.yarn/cache/react-innertext-npm-1.1.5-50613b71c6-01c9c8a5a4.zip differ diff --git a/.yarn/cache/react-popper-npm-1.3.11-7eb852583d-a0f5994f57.zip b/.yarn/cache/react-popper-npm-1.3.11-7eb852583d-a0f5994f57.zip deleted file mode 100644 index c35b3f7982..0000000000 Binary files a/.yarn/cache/react-popper-npm-1.3.11-7eb852583d-a0f5994f57.zip and /dev/null differ diff --git a/.yarn/cache/regexpp-npm-3.2.0-2513f32cfc-a78dc5c715.zip b/.yarn/cache/regexpp-npm-3.2.0-2513f32cfc-a78dc5c715.zip deleted file mode 100644 index 9dac209df2..0000000000 Binary files a/.yarn/cache/regexpp-npm-3.2.0-2513f32cfc-a78dc5c715.zip and /dev/null differ diff --git a/.yarn/cache/tslib-npm-2.3.1-0e21e18015-de17a98d46.zip b/.yarn/cache/tslib-npm-2.3.1-0e21e18015-de17a98d46.zip deleted file mode 100644 index f2a05ef439..0000000000 Binary files a/.yarn/cache/tslib-npm-2.3.1-0e21e18015-de17a98d46.zip and /dev/null differ diff --git a/.yarn/cache/typed-styles-npm-0.0.7-14151fdbae-36a6ad6bee.zip b/.yarn/cache/typed-styles-npm-0.0.7-14151fdbae-36a6ad6bee.zip deleted file mode 100644 index c31a135bdb..0000000000 Binary files a/.yarn/cache/typed-styles-npm-0.0.7-14151fdbae-36a6ad6bee.zip and /dev/null differ diff --git a/.yarn/cache/word-wrap-npm-1.2.5-42d00c4b09-f93ba3586f.zip b/.yarn/cache/word-wrap-npm-1.2.5-42d00c4b09-f93ba3586f.zip deleted file mode 100644 index ff98ad0d3a..0000000000 Binary files a/.yarn/cache/word-wrap-npm-1.2.5-42d00c4b09-f93ba3586f.zip and /dev/null differ diff --git a/package.json b/package.json index 3d5062cc19..b9f3654009 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "@babel/preset-env": "^7.19.1", "@babel/preset-react": "^7.22.15", "@babel/preset-typescript": "^7.18.6", - "@blueprintjs/eslint-plugin": "^2.1.2", + "@blueprintjs/eslint-plugin": "^6.1.0", "@types/is-ci": "^3.0.4", "@types/jest": "^29.5.11", "@types/lodash-es": "4.17.12", diff --git a/packages/commons/app-utils/src/index.ts b/packages/commons/app-utils/src/index.ts index eb9bce08cf..c934520154 100644 --- a/packages/commons/app-utils/src/index.ts +++ b/packages/commons/app-utils/src/index.ts @@ -8,3 +8,4 @@ export * from "./serialize-node"; export * from "./slug"; export * from "./theme/loadDocsBackgroundImage"; export * from "./theme/loadDocsTypography"; +export * from "./titleCase"; diff --git a/packages/commons/app-utils/src/resolver.ts b/packages/commons/app-utils/src/resolver.ts index e6988fb7fc..8460322498 100644 --- a/packages/commons/app-utils/src/resolver.ts +++ b/packages/commons/app-utils/src/resolver.ts @@ -1,8 +1,7 @@ -import { APIV1Read, DocsV1Read } from "@fern-api/fdr-sdk"; +import { APIV1Read, DocsV1Read, FdrAPI } from "@fern-api/fdr-sdk"; import { isNonNullish, visitDiscriminatedUnion } from "@fern-ui/core-utils"; -import { last, noop, sortBy, startCase } from "lodash-es"; -import title from "title"; -import { SPECIAL_TOKENS } from "./specialTokens"; +import { last, noop, sortBy } from "lodash-es"; +import { titleCase } from "./titleCase"; export function resolveNavigationItems( navigationItems: DocsV1Read.NavigationItem[], @@ -43,7 +42,13 @@ export function resolveNavigationItems( hasMultipleBaseUrls: definition.hasMultipleBaseUrls, slug: [...parentSlugs, api.urlSlug], endpoints: definition.rootPackage.endpoints.map((endpoint) => - resolveEndpointDefinition(endpoint, definition.types, definitionSlug) + resolveEndpointDefinition( + definition.id, + definition.id, + endpoint, + definition.types, + definitionSlug + ) ), webhooks: definition.rootPackage.webhooks.map((webhook) => resolveWebhookDefinition(webhook, definition.types, definitionSlug) @@ -51,6 +56,7 @@ export function resolveNavigationItems( subpackages: definition.rootPackage.subpackages .map((subpackageId) => resolveSubpackage( + api.api, subpackageId, definition.subpackages, definition.types, @@ -81,15 +87,8 @@ export function resolveNavigationItems( return resolvedNavigationItems; } -function formatSubpackageTitle(name: string) { - const titleCased = title(startCase(name), { special: SPECIAL_TOKENS }); - - // regex match "V 2", "V 4", etc. and replace it with "V2", "V4", etc. - const versionedTitle = titleCased.replace(/V\s(\d)/g, "V$1"); - return versionedTitle; -} - function resolveSubpackage( + apiSectionId: FdrAPI.ApiDefinitionId, subpackageId: APIV1Read.SubpackageId, subpackagesMap: Record, types: Record, @@ -100,10 +99,12 @@ function resolveSubpackage( return undefined; } const slug = [...parentSlugs, subpackage.urlSlug]; - const endpoints = subpackage.endpoints.map((endpoint) => resolveEndpointDefinition(endpoint, types, slug)); + const endpoints = subpackage.endpoints.map((endpoint) => + resolveEndpointDefinition(apiSectionId, subpackageId, endpoint, types, slug) + ); const webhooks = subpackage.webhooks.map((webhook) => resolveWebhookDefinition(webhook, types, slug)); const subpackages = subpackage.subpackages - .map((subpackageId) => resolveSubpackage(subpackageId, subpackagesMap, types, slug)) + .map((subpackageId) => resolveSubpackage(apiSectionId, subpackageId, subpackagesMap, types, slug)) .filter(isNonNullish); if (endpoints.length === 0 && webhooks.length === 0 && subpackages.length === 0) { @@ -111,8 +112,9 @@ function resolveSubpackage( } return { ...subpackage, - title: formatSubpackageTitle(subpackage.name), + title: titleCase(subpackage.name), type: "subpackage", + apiSectionId, id: subpackageId, slug, endpoints, @@ -123,6 +125,8 @@ function resolveSubpackage( } function resolveEndpointDefinition( + apiSectionId: FdrAPI.ApiDefinitionId, + apiPackageId: FdrAPI.ApiDefinitionId, endpoint: APIV1Read.EndpointDefinition, types: Record, parentSlugs: string[] @@ -154,6 +158,8 @@ function resolveEndpointDefinition( return { slug: [...parentSlugs, endpoint.urlSlug], ...endpoint, + apiSectionId, + apiPackageId, title: endpoint.name != null ? endpoint.name : stringifyResolvedEndpointPathParts(path), defaultEnvironment: endpoint.environments.find((environment) => environment.id === endpoint.defaultEnvironment), path, @@ -344,6 +350,7 @@ export type ResolvedNavigationItem = | ResolvedNavigationItemPageGroup | ResolvedNavigationItemApiSection | ResolvedNavigationItemSection; + export interface ResolvedNavigationItemPageGroup { type: "pageGroup"; pages: ResolvedPageMetadata[]; @@ -352,7 +359,6 @@ export interface ResolvedNavigationItemPageGroup { export interface ResolvedPageMetadata { id: DocsV1Read.PageId; slug: string[]; - title: string; } @@ -365,12 +371,22 @@ export interface ResolvedNavigationItemApiSection slug: string[]; } +export function isResolvedNavigationItemApiSection( + item: ResolvedNavigationItem +): item is ResolvedNavigationItemApiSection { + return item.type === "apiSection"; +} + export interface ResolvedNavigationItemSection extends Omit { type: "section"; items: ResolvedNavigationItem[]; slug: string[]; } +export function isResolvedNavigationItemSection(item: ResolvedNavigationItem): item is ResolvedNavigationItemSection { + return item.type === "section"; +} + export interface ResolvedWithApiDefinition { endpoints: ResolvedEndpointDefinition[]; webhooks: ResolvedWebhookDefinition[]; @@ -380,6 +396,7 @@ export interface ResolvedWithApiDefinition { export interface ResolvedSubpackage extends APIV1Read.WithDescription, ResolvedWithApiDefinition { type: "subpackage"; + apiSectionId: FdrAPI.ApiDefinitionId; id: APIV1Read.SubpackageId; name: string; title: string; @@ -390,6 +407,8 @@ export type ResolvedApiDefinitionPackage = ResolvedNavigationItemApiSection | Re export interface ResolvedEndpointDefinition extends APIV1Read.WithDescription { id: APIV1Read.EndpointId; + apiSectionId: FdrAPI.ApiDefinitionId; + apiPackageId: FdrAPI.ApiDefinitionId | APIV1Read.SubpackageId; slug: string[]; authed: boolean; availability?: APIV1Read.Availability; @@ -532,8 +551,47 @@ export type ResolvedTypeReference = export type ResolvedHttpRequestBodyShape = APIV1Read.HttpRequestBodyShape.FileUpload | ResolvedTypeReference; +interface ResolvedHttpRequestBodyShapeVisitor { + fileUpload: (shape: APIV1Read.HttpRequestBodyShape.FileUpload) => T; + typeReference: (shape: ResolvedTypeReference) => T; +} + +export function visitResolvedHttpRequestBodyShape( + shape: ResolvedHttpRequestBodyShape, + visitor: ResolvedHttpRequestBodyShapeVisitor +): T { + if (shape.type === "fileUpload") { + return visitor.fileUpload(shape); + } else { + return visitor.typeReference(shape); + } +} + export type ResolvedHttpResponseBodyShape = | APIV1Read.HttpResponseBodyShape.FileDownload | APIV1Read.HttpResponseBodyShape.StreamingText | APIV1Read.HttpResponseBodyShape.StreamCondition | ResolvedTypeReference; + +interface ResolvedHttpResponseBodyShapeVisitor { + fileDownload: (shape: APIV1Read.HttpResponseBodyShape.FileDownload) => T; + streamingText: (shape: APIV1Read.HttpResponseBodyShape.StreamingText) => T; + streamCondition: (shape: APIV1Read.HttpResponseBodyShape.StreamCondition) => T; + typeReference: (shape: ResolvedTypeReference) => T; +} + +export function visitResolvedHttpResponseBodyShape( + shape: ResolvedHttpResponseBodyShape, + visitor: ResolvedHttpResponseBodyShapeVisitor +): T { + switch (shape.type) { + case "fileDownload": + return visitor.fileDownload(shape); + case "streamingText": + return visitor.streamingText(shape); + case "streamCondition": + return visitor.streamCondition(shape); + default: + return visitor.typeReference(shape); + } +} diff --git a/packages/commons/app-utils/src/titleCase.ts b/packages/commons/app-utils/src/titleCase.ts new file mode 100644 index 0000000000..4cc241fc3b --- /dev/null +++ b/packages/commons/app-utils/src/titleCase.ts @@ -0,0 +1,11 @@ +import { startCase } from "lodash-es"; +import title from "title"; +import { SPECIAL_TOKENS } from "./specialTokens"; + +export function titleCase(name: string): string { + const titleCased = title(startCase(name), { special: SPECIAL_TOKENS }); + + // regex match "V 2", "V 4", etc. and replace it with "V2", "V4", etc. + const versionedTitle = titleCased.replace(/V\s(\d)/g, "V$1"); + return versionedTitle; +} diff --git a/packages/commons/react/common-components/package.json b/packages/commons/react/common-components/package.json index 69634b3b05..020136f4bf 100644 --- a/packages/commons/react/common-components/package.json +++ b/packages/commons/react/common-components/package.json @@ -29,8 +29,8 @@ "depcheck": "depcheck" }, "dependencies": { - "@blueprintjs/core": "^4.11.5", - "@blueprintjs/icons": "^4.4.0", + "@blueprintjs/core": "^5.8.1", + "@blueprintjs/icons": "^5.7.0", "@fern-ui/loadable": "workspace:*", "classnames": "^2.5.1", "react": "^18.2.0", diff --git a/packages/commons/react/react-commons/src/index.ts b/packages/commons/react/react-commons/src/index.ts index fe0b295ba4..6805440c3f 100644 --- a/packages/commons/react/react-commons/src/index.ts +++ b/packages/commons/react/react-commons/src/index.ts @@ -13,5 +13,6 @@ export { useKeyboardPress } from "./useKeyboardPress"; export { useLocalTextState, type LocalTextState } from "./useLocalTextState"; export { useMounted } from "./useMounted"; export { useNumericState } from "./useNumericState"; +export { usePrevious } from "./usePrevious"; export { useTimeout } from "./useTimeout"; export { useWhyDidYouUpdate } from "./useWhyDidYouUpdate"; diff --git a/packages/commons/react/react-commons/src/useKeyboardPress.ts b/packages/commons/react/react-commons/src/useKeyboardPress.ts index 49dc81a9eb..876c32b3af 100644 --- a/packages/commons/react/react-commons/src/useKeyboardPress.ts +++ b/packages/commons/react/react-commons/src/useKeyboardPress.ts @@ -3,7 +3,7 @@ import { useEffect } from "react"; type Arrow = "Up" | "Down" | "Right" | "Left"; -type OtherKey = "Enter"; +type OtherKey = "Enter" | "Escape"; export declare namespace useKeyboardPress { export interface Args { diff --git a/packages/commons/react/react-commons/src/usePrevious.ts b/packages/commons/react/react-commons/src/usePrevious.ts new file mode 100644 index 0000000000..c98346acc0 --- /dev/null +++ b/packages/commons/react/react-commons/src/usePrevious.ts @@ -0,0 +1,9 @@ +import { useEffect, useRef } from "react"; + +export function usePrevious(value: T): T { + const ref = useRef(value); + useEffect(() => { + ref.current = value; + }, [value]); + return ref.current; +} diff --git a/packages/commons/react/split-view/package.json b/packages/commons/react/split-view/package.json index a45dd90230..fc04cb9ae9 100644 --- a/packages/commons/react/split-view/package.json +++ b/packages/commons/react/split-view/package.json @@ -29,7 +29,7 @@ "depcheck": "depcheck" }, "dependencies": { - "@blueprintjs/core": "^4.11.5", + "@blueprintjs/core": "^5.8.1", "@fern-ui/core-utils": "workspace:*", "@fern-ui/react-commons": "workspace:*", "classnames": "^2.5.1", diff --git a/packages/commons/react/toaster/package.json b/packages/commons/react/toaster/package.json index 6099fe26aa..2a47541b38 100644 --- a/packages/commons/react/toaster/package.json +++ b/packages/commons/react/toaster/package.json @@ -29,7 +29,7 @@ "depcheck": "depcheck" }, "dependencies": { - "@blueprintjs/core": "^4.11.5", + "@blueprintjs/core": "^5.8.1", "classnames": "^2.5.1", "react": "^18.2.0", "react-dom": "^18.2.0" diff --git a/packages/commons/react/toaster/src/toaster.ts b/packages/commons/react/toaster/src/toaster.ts index 9b3747ac7e..0755358664 100644 --- a/packages/commons/react/toaster/src/toaster.ts +++ b/packages/commons/react/toaster/src/toaster.ts @@ -1,12 +1,12 @@ -import { Intent, Position, Toaster, ToasterInstance, ToasterPosition, ToastProps } from "@blueprintjs/core"; +import { Intent, OverlayToaster, Position, Toaster, ToasterPosition, ToastProps } from "@blueprintjs/core"; import classNames from "classnames"; import styles from "./toaster.module.scss"; const DEFAULT_POSITION = Position.TOP; -const TOASTERS: Partial> = {}; -function getToaster(position: ToasterPosition): ToasterInstance { - return (TOASTERS[position] ??= Toaster.create({ position })); +const TOASTERS: Partial> = {}; +function getToaster(position: ToasterPosition): Toaster { + return (TOASTERS[position] ??= OverlayToaster.create({ position })); } export interface ToastParams extends Pick { diff --git a/packages/ui/app/.depcheckrc.json b/packages/ui/app/.depcheckrc.json index e87c1c82d0..5649b6742e 100644 --- a/packages/ui/app/.depcheckrc.json +++ b/packages/ui/app/.depcheckrc.json @@ -1 +1 @@ -{ "ignores": ["@types/jest", "@types/node", "vite", "@types/react", "@types/react"], "ignore-patterns": ["lib"] } +{ "ignores": ["@types/jest", "@types/node", "vite", "@types/react", "@types/react-dom"], "ignore-patterns": ["lib"] } diff --git a/packages/ui/app/.mrlint.json b/packages/ui/app/.mrlint.json index cdf14ba36c..a9449395ea 100644 --- a/packages/ui/app/.mrlint.json +++ b/packages/ui/app/.mrlint.json @@ -3,7 +3,7 @@ "private": true, "rules": { "depcheck": { - "ignores": ["@types/react"] + "ignores": ["@types/react-dom"] } } } diff --git a/packages/ui/app/package.json b/packages/ui/app/package.json index 242e3a607b..e8c4f8bd9a 100644 --- a/packages/ui/app/package.json +++ b/packages/ui/app/package.json @@ -29,18 +29,20 @@ "depcheck": "depcheck" }, "dependencies": { - "@blueprintjs/core": "^4.11.5", - "@blueprintjs/icons": "^4.4.0", - "@blueprintjs/popover2": "^1.8.0", - "@blueprintjs/select": "^4.4.2", + "@blueprintjs/core": "^5.8.1", + "@blueprintjs/datetime": "^5.2.10", + "@blueprintjs/datetime2": "^2.2.9", + "@blueprintjs/icons": "^5.7.0", + "@blueprintjs/select": "^5.0.22", "@fern-api/fdr-sdk": "0.44.0-1-geb2e930", "@fern-ui/app-utils": "workspace:*", "@fern-ui/core-utils": "workspace:*", + "@fern-ui/loadable": "workspace:*", "@fern-ui/react-commons": "workspace:*", "@fontsource/ibm-plex-mono": "^4.5.13", "@fortawesome/fontawesome-svg-core": "^6.4.2", "@fortawesome/react-fontawesome": "0.2.0", - "@headlessui/react": "^1.7.17", + "@headlessui/react": "^1.7.18", "@react-hook/size": "^2.1.2", "algoliasearch": "^4.22.1", "classnames": "^2.5.1", @@ -72,6 +74,7 @@ "@types/marked": "^5.0.0", "@types/node": "^18.7.18", "@types/react": "^18.0.20", + "@types/react-dom": "^18.2.18", "@types/react-syntax-highlighter": "^15.5.11", "@types/react-test-renderer": "^18.0.7", "@types/tinycolor2": "^1.4.6", diff --git a/packages/ui/app/src/App.tsx b/packages/ui/app/src/App.tsx index dfb19802bb..f33d68a16d 100644 --- a/packages/ui/app/src/App.tsx +++ b/packages/ui/app/src/App.tsx @@ -1,7 +1,8 @@ import { FocusStyleManager } from "@blueprintjs/core"; import "@blueprintjs/core/lib/css/blueprint.css"; +import "@blueprintjs/datetime/lib/css/blueprint-datetime.css"; +import "@blueprintjs/datetime2/lib/css/blueprint-datetime2.css"; import "@blueprintjs/icons/lib/css/blueprint-icons.css"; -import "@blueprintjs/popover2/lib/css/blueprint-popover2.css"; import "@blueprintjs/select/lib/css/blueprint-select.css"; import { DocsV2Read } from "@fern-api/fdr-sdk"; import type { ResolvedPath } from "@fern-ui/app-utils"; diff --git a/packages/ui/app/src/analytics/posthog.ts b/packages/ui/app/src/analytics/posthog.ts index 77fe3a95d2..59e0e294ca 100644 --- a/packages/ui/app/src/analytics/posthog.ts +++ b/packages/ui/app/src/analytics/posthog.ts @@ -29,3 +29,9 @@ export function resetPosthog(): void { posthog.reset(); }); } + +export function capturePosthogEvent(eventName: string, properties?: Record): void { + safeAccessPosthog(() => { + posthog.capture(eventName, properties); + }); +} diff --git a/packages/ui/app/src/api-context/ApiDefinitionContext.ts b/packages/ui/app/src/api-context/ApiDefinitionContext.ts deleted file mode 100644 index 16226a7aaa..0000000000 --- a/packages/ui/app/src/api-context/ApiDefinitionContext.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { APIV1Read, DocsV1Read } from "@fern-api/fdr-sdk"; -import React from "react"; - -export const ApiDefinitionContext = React.createContext({ - apiDefinition: undefined, - apiSection: undefined, - apiSlug: "", - resolveTypeById: () => undefined, - resolveSubpackageById: () => undefined, -}); - -export interface ApiDefinitionContextValue { - apiDefinition: APIV1Read.ApiDefinition | undefined; - apiSection: DocsV1Read.ApiSection | undefined; - apiSlug: string; - resolveTypeById: (typeId: APIV1Read.TypeId) => APIV1Read.TypeDefinition | undefined; - resolveSubpackageById: (subpackageId: APIV1Read.SubpackageId) => APIV1Read.ApiDefinitionSubpackage | undefined; -} diff --git a/packages/ui/app/src/api-context/ApiDefinitionContextProvider.tsx b/packages/ui/app/src/api-context/ApiDefinitionContextProvider.tsx deleted file mode 100644 index fc171321d6..0000000000 --- a/packages/ui/app/src/api-context/ApiDefinitionContextProvider.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import { APIV1Read, DocsV1Read } from "@fern-api/fdr-sdk"; -import React, { useCallback } from "react"; -import { useDocsContext } from "../docs-context/useDocsContext"; -import { ApiDefinitionContext } from "./ApiDefinitionContext"; - -export declare namespace ApiDefinitionContextProvider { - export type Props = React.PropsWithChildren<{ - apiSection: DocsV1Read.ApiSection; - }>; -} - -export const ApiDefinitionContextProvider: React.FC = ({ - apiSection, - children, -}) => { - const { resolveApi } = useDocsContext(); - const apiDefinition = resolveApi(apiSection.api); - const apiSlug = apiSection.skipUrlSlug ? "" : apiSection.urlSlug; - - const resolveSubpackageById = useCallback( - (subpackageId: APIV1Read.SubpackageId): APIV1Read.ApiDefinitionSubpackage | undefined => { - return resolveSubpackage(apiDefinition, subpackageId); - }, - [apiDefinition] - ); - - const resolveTypeById = useCallback( - (typeId: APIV1Read.TypeId): APIV1Read.TypeDefinition | undefined => { - const type = apiDefinition?.types[typeId]; - if (type == null) { - // eslint-disable-next-line no-console - console.error("Type does not exist", typeId, "in apiDefinitionId", apiDefinition?.id); - } - return type; - }, - [apiDefinition] - ); - - return ( - - {children} - - ); -}; - -export function resolveSubpackage( - apiDefinition: APIV1Read.ApiDefinition | undefined, - subpackageId: APIV1Read.SubpackageId -): APIV1Read.ApiDefinitionSubpackage | undefined { - const subpackage = apiDefinition?.subpackages[subpackageId]; - if (subpackage == null) { - // eslint-disable-next-line no-console - console.error("Subpackage does not exist", subpackageId); - } - if (subpackage?.pointsTo != null) { - const resolvedSubpackage = resolveSubpackage(apiDefinition, subpackage.pointsTo); - if (resolvedSubpackage != null) { - return { - ...resolvedSubpackage, - name: subpackage.name, - urlSlug: subpackage.urlSlug, - }; - } - } else { - return subpackage; - } - return undefined; -} diff --git a/packages/ui/app/src/api-context/TypeIdToPackagePathCache.ts b/packages/ui/app/src/api-context/TypeIdToPackagePathCache.ts deleted file mode 100644 index 1574ff83c6..0000000000 --- a/packages/ui/app/src/api-context/TypeIdToPackagePathCache.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { APIV1Read } from "@fern-api/fdr-sdk"; -import { PackagePath } from "../commons/PackagePath"; - -export class TypeIdToPackagePathCache { - private cache: Record = {}; - - constructor( - apiDefinition: APIV1Read.ApiDefinition, - resolveSubpackageById: (subpackageId: APIV1Read.SubpackageId) => APIV1Read.ApiDefinitionSubpackage - ) { - this.addPackageToCache(apiDefinition.rootPackage, resolveSubpackageById, []); - } - - public get(typeId: APIV1Read.TypeId): PackagePath { - const packagePath = this.cache[typeId]; - if (packagePath == null) { - throw new Error("Type ID does not exist: " + typeId); - } - return packagePath; - } - - private addPackageToCache( - package_: APIV1Read.ApiDefinitionPackage, - resolveSubpackageById: (subpackageId: APIV1Read.SubpackageId) => APIV1Read.ApiDefinitionSubpackage, - packagePath: PackagePath - ): void { - for (const typeId of package_.types) { - this.cache[typeId] = packagePath; - } - for (const subpackageId of package_.subpackages) { - const subpackage = resolveSubpackageById(subpackageId); - this.addPackageToCache(subpackage, resolveSubpackageById, [...packagePath, subpackage.name]); - } - } -} diff --git a/packages/ui/app/src/api-context/useApiDefinitionContext.ts b/packages/ui/app/src/api-context/useApiDefinitionContext.ts deleted file mode 100644 index a080bb6160..0000000000 --- a/packages/ui/app/src/api-context/useApiDefinitionContext.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { useContext } from "react"; -import { ApiDefinitionContext, ApiDefinitionContextValue } from "./ApiDefinitionContext"; - -export function useApiDefinitionContext(): ApiDefinitionContextValue { - return useContext(ApiDefinitionContext); -} diff --git a/packages/ui/app/src/api-page/ApiPackageContents.tsx b/packages/ui/app/src/api-page/ApiPackageContents.tsx index 7918fcbf7c..989fb1c37a 100644 --- a/packages/ui/app/src/api-page/ApiPackageContents.tsx +++ b/packages/ui/app/src/api-page/ApiPackageContents.tsx @@ -1,30 +1,34 @@ -import { ResolvedApiDefinitionPackage } from "@fern-ui/app-utils"; +import { ResolvedApiDefinitionPackage, ResolvedNavigationItemApiSection } from "@fern-ui/app-utils"; import { Endpoint } from "./endpoints/Endpoint"; import { ApiSubpackage } from "./subpackages/ApiSubpackage"; import { Webhook } from "./webhooks/Webhook"; export declare namespace ApiPackageContents { export interface Props { - package: ResolvedApiDefinitionPackage; + apiSection: ResolvedNavigationItemApiSection; + apiDefinition: ResolvedApiDefinitionPackage; isLastInParentPackage: boolean; anchorIdParts: string[]; } } export const ApiPackageContents: React.FC = ({ - package: package_, + apiSection, + apiDefinition, isLastInParentPackage, anchorIdParts, }) => { - const { endpoints, webhooks, subpackages } = package_; + const { endpoints, webhooks, subpackages } = apiDefinition; - const subpackageTitle = package_.type === "subpackage" ? package_.title : undefined; + const subpackageTitle = apiDefinition.type === "subpackage" ? apiDefinition.title : undefined; return ( <> {endpoints.map((endpoint, idx) => ( = ({ {subpackages.map((subpackage, idx) => ( diff --git a/packages/ui/app/src/api-page/ApiPage.tsx b/packages/ui/app/src/api-page/ApiPage.tsx index 83aea0257a..cd30abb58a 100644 --- a/packages/ui/app/src/api-page/ApiPage.tsx +++ b/packages/ui/app/src/api-page/ApiPage.tsx @@ -14,10 +14,15 @@ export const ApiPage: React.FC = ({ apiSection }) => { return (
{apiSection.artifacts != null && areApiArtifactsNonEmpty(apiSection.artifacts) && ( - + )} - +
diff --git a/packages/ui/app/src/api-page/artifacts/ApiArtifacts.tsx b/packages/ui/app/src/api-page/artifacts/ApiArtifacts.tsx index 9fc93a6348..8925136360 100644 --- a/packages/ui/app/src/api-page/artifacts/ApiArtifacts.tsx +++ b/packages/ui/app/src/api-page/artifacts/ApiArtifacts.tsx @@ -1,7 +1,6 @@ import { H2 } from "@blueprintjs/core"; import { DocsV1Read } from "@fern-api/fdr-sdk"; -import { joinUrlSlugs } from "@fern-ui/app-utils"; -import { useApiDefinitionContext } from "../../api-context/useApiDefinitionContext"; +import { joinUrlSlugs, ResolvedApiDefinitionPackage } from "@fern-ui/app-utils"; import { API_ARTIFACTS_TITLE } from "../../config"; import { ApiPageMargins } from "../page-margins/ApiPageMargins"; import { useApiPageCenterElement } from "../useApiPageCenterElement"; @@ -15,13 +14,13 @@ import { SdkCardLayout } from "./SdkCardLayout"; export declare namespace ApiArtifacts { export interface Props { + apiDefinition: ResolvedApiDefinitionPackage; apiArtifacts: DocsV1Read.ApiArtifacts; } } -export const ApiArtifacts: React.FC = ({ apiArtifacts }) => { - const { apiSlug } = useApiDefinitionContext(); - const slug = joinUrlSlugs(apiSlug, "client-libraries"); +export const ApiArtifacts: React.FC = ({ apiDefinition, apiArtifacts }) => { + const slug = joinUrlSlugs(...apiDefinition.slug, "client-libraries"); const { setTargetRef } = useApiPageCenterElement({ slug }); diff --git a/packages/ui/app/src/api-page/endpoints/Endpoint.tsx b/packages/ui/app/src/api-page/endpoints/Endpoint.tsx index 5bcb2c4cd4..79bb48a080 100644 --- a/packages/ui/app/src/api-page/endpoints/Endpoint.tsx +++ b/packages/ui/app/src/api-page/endpoints/Endpoint.tsx @@ -1,18 +1,30 @@ import { joinUrlSlugs } from "@fern-api/fdr-sdk"; -import { ResolvedEndpointDefinition } from "@fern-ui/app-utils"; +import { + ResolvedApiDefinitionPackage, + ResolvedEndpointDefinition, + ResolvedNavigationItemApiSection, +} from "@fern-ui/app-utils"; import { useShouldHideFromSsg } from "../../navigation-context/useNavigationContext"; import { useApiPageCenterElement } from "../useApiPageCenterElement"; import { EndpointContent } from "./EndpointContent"; export declare namespace Endpoint { export interface Props { + apiSection: ResolvedNavigationItemApiSection; + apiDefinition: ResolvedApiDefinitionPackage; endpoint: ResolvedEndpointDefinition; subpackageTitle: string | undefined; isLastInApi: boolean; } } -export const Endpoint: React.FC = ({ endpoint, subpackageTitle, isLastInApi }) => { +export const Endpoint: React.FC = ({ + apiSection, + apiDefinition, + endpoint, + subpackageTitle, + isLastInApi, +}) => { const fullSlug = joinUrlSlugs(...endpoint.slug); const route = `/${fullSlug}`; @@ -27,6 +39,8 @@ export const Endpoint: React.FC = ({ endpoint, subpackageTitle, return ( = ({ + apiSection, + apiDefinition, endpoint, subpackageTitle, hideBottomSeparator = false, @@ -107,7 +114,6 @@ export const EndpointContent: React.FC = ({ onChange: setIsInViewport, rootMargin: "100%", }); - const { apiSection, apiDefinition } = useApiDefinitionContext(); const [hoveredRequestPropertyPath, setHoveredRequestPropertyPath] = useState(); const [hoveredResponsePropertyPath, setHoveredResponsePropertyPath] = useState(); const onHoverRequestProperty = useCallback( @@ -167,10 +173,10 @@ export const EndpointContent: React.FC = ({ const curlLines = useMemo( () => - example != null && apiDefinition != null - ? getCurlLines(apiDefinition, endpoint, example, flattenJsonToLines(example.requestBody)) + example != null + ? getCurlLines(apiSection.auth, endpoint, example, flattenJsonToLines(example.requestBody)) : [], - [apiDefinition, endpoint, example] + [apiSection.auth, endpoint, example] ); const selectedExampleClientLineCount = useMemo(() => { return selectedExampleClient.id === "curl" @@ -265,6 +271,9 @@ export const EndpointContent: React.FC = ({ > {isInViewport && example != null && ( = ({ + apiSection, + apiDefinition, + endpoint, example, availableExampleClients, selectedExampleClient, @@ -55,18 +67,25 @@ const UnmemoizedEndpointContentCodeSnippets: React.FC 1 ? ( - { - const client = availableExampleClients.find((c) => c.id === clientId); - if (client != null) { - onClickExampleClient(client); - } - }} - selectedClient={selectedExampleClient} + <> + - ) : undefined + {availableExampleClients.length > 1 ? ( + { + const client = availableExampleClients.find((c) => c.id === clientId); + if (client != null) { + onClickExampleClient(client); + } + }} + selectedClient={selectedExampleClient} + /> + ) : undefined} + } > {selectedExampleClient.id === "curl" ? ( diff --git a/packages/ui/app/src/api-page/endpoints/EndpointContentLeft.tsx b/packages/ui/app/src/api-page/endpoints/EndpointContentLeft.tsx index 300460198d..a5d159adb5 100644 --- a/packages/ui/app/src/api-page/endpoints/EndpointContentLeft.tsx +++ b/packages/ui/app/src/api-page/endpoints/EndpointContentLeft.tsx @@ -1,5 +1,5 @@ -import { APIV1Read, DocsV1Read } from "@fern-api/fdr-sdk"; -import { ResolvedEndpointDefinition } from "@fern-ui/app-utils"; +import { APIV1Read } from "@fern-api/fdr-sdk"; +import { ResolvedEndpointDefinition, ResolvedNavigationItemApiSection } from "@fern-ui/app-utils"; import { useBooleanState } from "@fern-ui/react-commons"; import { camelCase, sortBy, upperFirst } from "lodash-es"; import { memo } from "react"; @@ -22,7 +22,7 @@ export declare namespace EndpointContentLeft { export interface Props { endpoint: ResolvedEndpointDefinition; subpackageTitle: string | undefined; - apiSection: DocsV1Read.ApiSection; + apiSection: ResolvedNavigationItemApiSection; onHoverRequestProperty: (jsonPropertyPath: JsonPropertyPath, hovering: HoveringProps) => void; onHoverResponseProperty: (jsonPropertyPath: JsonPropertyPath, hovering: HoveringProps) => void; selectedError: APIV1Read.ErrorDeclarationV2 | undefined; diff --git a/packages/ui/app/src/api-page/endpoints/EndpointUrl.tsx b/packages/ui/app/src/api-page/endpoints/EndpointUrl.tsx index 31c6c1ceea..cad71fdc8d 100644 --- a/packages/ui/app/src/api-page/endpoints/EndpointUrl.tsx +++ b/packages/ui/app/src/api-page/endpoints/EndpointUrl.tsx @@ -1,11 +1,9 @@ +import { divideEndpointPathToParts, ResolvedEndpointDefinition, type EndpointPathPart } from "@fern-ui/app-utils"; import { visitDiscriminatedUnion } from "@fern-ui/core-utils"; import classNames from "classnames"; import React, { PropsWithChildren, ReactElement, useCallback, useMemo } from "react"; -// import { useApiDefinitionContext } from "../../api-context/useApiDefinitionContext"; -import { divideEndpointPathToParts, ResolvedEndpointDefinition, type EndpointPathPart } from "@fern-ui/app-utils"; import { HttpMethodTag } from "../../commons/HttpMethodTag"; import styles from "./EndpointUrl.module.scss"; -// import { getEndpointEnvironmentUrl } from "./getEndpointEnvironmentUrl"; export declare namespace EndpointUrl { export type Props = React.PropsWithChildren<{ @@ -19,7 +17,6 @@ export const EndpointUrl = React.forwardRef divideEndpointPathToParts(endpoint), [endpoint]); const renderPathParts = useCallback((parts: EndpointPathPart[]) => { diff --git a/packages/ui/app/src/api-page/examples/curl-example/curlUtils.ts b/packages/ui/app/src/api-page/examples/curl-example/curlUtils.ts index ad39f3c694..daed2e394e 100644 --- a/packages/ui/app/src/api-page/examples/curl-example/curlUtils.ts +++ b/packages/ui/app/src/api-page/examples/curl-example/curlUtils.ts @@ -32,7 +32,7 @@ export interface CurlLineJson { export type CurlLine = CurlLineParam | CurlLineJson; export function getCurlLines( - apiDefinition: APIV1Read.ApiDefinition, + auth: APIV1Read.ApiAuth | undefined, endpoint: ResolvedEndpointDefinition, example: APIV1Read.ExampleEndpointCall, jsonLines: JsonLine[] @@ -76,8 +76,8 @@ export function getCurlLines( }); } - if (apiDefinition.auth != null && endpoint.authed) { - visitDiscriminatedUnion(apiDefinition.auth, "type")._visit({ + if (auth != null && endpoint.authed) { + visitDiscriminatedUnion(auth, "type")._visit({ basicAuth: ({ usernameName = "username", passwordName = "password" }) => { parts.push({ type: "param", diff --git a/packages/ui/app/src/api-page/subpackages/ApiSubpackage.tsx b/packages/ui/app/src/api-page/subpackages/ApiSubpackage.tsx index ad86abdae9..afb2ef0f4d 100644 --- a/packages/ui/app/src/api-page/subpackages/ApiSubpackage.tsx +++ b/packages/ui/app/src/api-page/subpackages/ApiSubpackage.tsx @@ -1,28 +1,35 @@ import { joinUrlSlugs } from "@fern-api/fdr-sdk"; -import { ResolvedSubpackage } from "@fern-ui/app-utils"; +import { ResolvedApiDefinitionPackage, ResolvedNavigationItemApiSection } from "@fern-ui/app-utils"; import { ApiPackageContents } from "../ApiPackageContents"; import { ApiPageMargins } from "../page-margins/ApiPageMargins"; import { useApiPageCenterElement } from "../useApiPageCenterElement"; export declare namespace ApiSubpackage { export interface Props { - subpackage: ResolvedSubpackage; + apiSection: ResolvedNavigationItemApiSection; + apiDefinition: ResolvedApiDefinitionPackage; isLastInParentPackage: boolean; anchorIdParts: string[]; } } -export const ApiSubpackage: React.FC = ({ subpackage, isLastInParentPackage, anchorIdParts }) => { - const subpackageSlug = joinUrlSlugs(...subpackage.slug); +export const ApiSubpackage: React.FC = ({ + apiSection, + apiDefinition, + isLastInParentPackage, + anchorIdParts, +}) => { + const subpackageSlug = joinUrlSlugs(...apiDefinition.slug); const { setTargetRef } = useApiPageCenterElement({ slug: subpackageSlug }); return ( <>
- {subpackage != null && ( + {apiSection != null && ( diff --git a/packages/ui/app/src/api-page/types/type-definition/EnumTypeDefinition.tsx b/packages/ui/app/src/api-page/types/type-definition/EnumTypeDefinition.tsx index b1080dcdb7..8631dc3dd6 100644 --- a/packages/ui/app/src/api-page/types/type-definition/EnumTypeDefinition.tsx +++ b/packages/ui/app/src/api-page/types/type-definition/EnumTypeDefinition.tsx @@ -38,7 +38,7 @@ export const EnumTypeDefinition = ({ return ( <> - {elements.length < 5 ? ( + {elements.length < 4 ? (
Allowed values:
diff --git a/packages/ui/app/src/api-playground/ApiPlaygroundButton.tsx b/packages/ui/app/src/api-playground/ApiPlaygroundButton.tsx new file mode 100644 index 0000000000..f51c0e32dd --- /dev/null +++ b/packages/ui/app/src/api-playground/ApiPlaygroundButton.tsx @@ -0,0 +1,24 @@ +import { Play } from "@blueprintjs/icons"; +import { FC } from "react"; +import { ApiPlaygroundSelectionState, useApiPlaygroundContext } from "./ApiPlaygroundContext"; + +export const ApiPlaygroundButton: FC = ({ apiSection, apiDefinition, endpoint }) => { + const { hasPlayground, setSelectionStateAndOpen } = useApiPlaygroundContext(); + + if (!hasPlayground) { + return null; + } + + return ( + + ); +}; diff --git a/packages/ui/app/src/api-playground/ApiPlaygroundContent.tsx b/packages/ui/app/src/api-playground/ApiPlaygroundContent.tsx new file mode 100644 index 0000000000..a89ad654bc --- /dev/null +++ b/packages/ui/app/src/api-playground/ApiPlaygroundContent.tsx @@ -0,0 +1,304 @@ +import { NonIdealState, Spinner } from "@blueprintjs/core"; +import { APIV1Read, joinUrlSlugs } from "@fern-api/fdr-sdk"; +import { ResolvedEndpointDefinition } from "@fern-ui/app-utils"; +import { failed, Loadable, loaded, loading, notStartedLoading, visitLoadable } from "@fern-ui/loadable"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import classNames from "classnames"; +import { useAtom } from "jotai"; +import { atomWithStorage } from "jotai/utils"; +import { isEmpty, round } from "lodash-es"; +import { Dispatch, FC, SetStateAction, useCallback, useState } from "react"; +import { capturePosthogEvent } from "../analytics/posthog"; +import { PlaygroundEndpointForm } from "./PlaygroundEndpointForm"; +import { PlaygroundRequestPreview } from "./PlaygroundRequestPreview"; +import { PlaygroundResponsePreview } from "./PlaygroundResponsePreview"; +import { SecretBearer } from "./PlaygroundSecretsModal"; +import { PlaygroundRequestFormState } from "./types"; +import { useHorizontalSplitPane, useWindowWidth } from "./useSplitPlane"; +import { buildUnredactedHeaders, buildUrl } from "./utils"; + +interface ResponsePayload { + status: number; + time: number; + size: string | null; + body: unknown; +} + +interface ApiPlayroundContentProps { + auth: APIV1Read.ApiAuth | undefined; + endpoint: ResolvedEndpointDefinition; + formState: PlaygroundRequestFormState; + setFormState: Dispatch>; + resetWithExample: () => void; + resetWithoutExample: () => void; + openSecretsModal: () => void; + secrets: SecretBearer[]; +} + +const requestTypeAtom = atomWithStorage<"form" | "curl" | "javascript" | "python">("api-playground-atom-alpha", "curl"); + +export const ApiPlayroundContent: FC = ({ + auth, + endpoint, + formState, + setFormState, + resetWithExample, + resetWithoutExample, + openSecretsModal, + secrets, +}) => { + const [requestType, setRequestType] = useAtom(requestTypeAtom); + const [width, setWidthPercent] = useState(0.5); + const windowWidth = useWindowWidth(); + const setWidth = useCallback( + (width: number) => { + if (windowWidth != null) { + setWidthPercent(width / windowWidth); + } + }, + [windowWidth] + ); + const handleResize = useHorizontalSplitPane(setWidth); + + const [response, setResponse] = useState>(notStartedLoading()); + + const sendRequest = useCallback(async () => { + const startTime = performance.now(); + setResponse(loading()); + try { + capturePosthogEvent("api_playground_request_sent", { + endpointId: endpoint.id, + endpointName: endpoint.name, + method: endpoint.method, + docsRoute: `/${joinUrlSlugs(...endpoint.slug)}`, + }); + const response = await fetch("/api/proxy", { + method: "POST", + headers: buildUnredactedHeaders(auth, endpoint, formState), + body: JSON.stringify({ + url: buildUrl(endpoint, formState), + method: endpoint.method, + headers: buildUnredactedHeaders(auth, endpoint, formState), + body: formState.body, + }), + }); + const loadedResponse: ResponsePayload = await response.json(); + setResponse(loaded(loadedResponse)); + const proxyTime = performance.now() - startTime; + capturePosthogEvent("api_playground_request_received", { + endpointId: endpoint.id, + endpointName: endpoint.name, + method: endpoint.method, + docsRoute: `/${joinUrlSlugs(...endpoint.slug)}`, + response: { + status: loadedResponse.status, + time: loadedResponse.time, + size: loadedResponse.size, + }, + proxy: { + ok: response.ok, + status: response.status, + time: response.headers.get("x-response-time") ?? proxyTime, + }, + }); + } catch (e) { + // eslint-disable-next-line no-console + console.error(e); + setResponse(failed(e)); + capturePosthogEvent("api_playground_request_failed", { + endpointId: endpoint.id, + endpointName: endpoint.name, + method: endpoint.method, + docsRoute: `/${joinUrlSlugs(...endpoint.slug)}`, + }); + } + }, [auth, endpoint, formState]); + + return ( +
+
+
+ Request + +
+ + + + + +
+ + + +
+
+ {requestType !== "form" ? ( + + ) : ( + + )} +
+
+ {response.type !== "notStartedLoading" && endpoint != null && ( +
+ +
+ )} + +
+
+ Response + + {response.type === "loaded" && ( +
+ = 200 && response.value.status < 300, + ["bg-method-delete/10 text-method-delete dark:bg-method-delete-dark/10 dark:text-method-delete-dark"]: + response.value.status > 300, + })} + > + status: {response.value.status} + + + time: {round(response.value.time, 2)}ms + + {!isEmpty(response.value.size) && ( + + size: {response.value.size}b + + )} +
+ )} +
+ {visitLoadable(response, { + loading: () => ( + + Send request +
+ +
+ + ) : ( + + ) + } + /> + ), + loaded: (response) => , + failed: () => Failed, + })} +
+
+ ); +}; diff --git a/packages/ui/app/src/api-playground/ApiPlaygroundContext.tsx b/packages/ui/app/src/api-playground/ApiPlaygroundContext.tsx new file mode 100644 index 0000000000..1107acc8b8 --- /dev/null +++ b/packages/ui/app/src/api-playground/ApiPlaygroundContext.tsx @@ -0,0 +1,325 @@ +import { APIV1Read } from "@fern-api/fdr-sdk"; +import { + ResolvedApiDefinitionPackage, + ResolvedEndpointDefinition, + ResolvedNavigationItemApiSection, +} from "@fern-ui/app-utils"; +import { visitDiscriminatedUnion } from "@fern-ui/core-utils"; +import { useBooleanState } from "@fern-ui/react-commons"; +import { Transition } from "@headlessui/react"; +import { useAtom } from "jotai"; +import { atomWithStorage } from "jotai/utils"; +import { noop } from "lodash-es"; +import { + createContext, + Dispatch, + FC, + Fragment, + PropsWithChildren, + SetStateAction, + useCallback, + useContext, + useEffect, + useState, +} from "react"; +import { capturePosthogEvent } from "../analytics/posthog"; +import { useDocsContext } from "../docs-context/useDocsContext"; +import { ApiPlaygroundDrawer } from "./ApiPlaygroundDrawer"; +import { PlaygroundSecretsModal, SecretBearer } from "./PlaygroundSecretsModal"; +import { PlaygroundRequestFormAuth, PlaygroundRequestFormState } from "./types"; +import { useVerticalSplitPane, useWindowHeight } from "./useSplitPlane"; +import { getDefaultValueForTypes, getDefaultValuesForBody } from "./utils"; + +export interface ApiPlaygroundSelectionState { + apiSection: ResolvedNavigationItemApiSection; + apiDefinition: ResolvedApiDefinitionPackage; + endpoint: ResolvedEndpointDefinition; +} + +const EMPTY_FORM_STATE: PlaygroundRequestFormState = { + auth: undefined, + headers: {}, + pathParameters: {}, + queryParameters: {}, + body: undefined, +}; + +interface ApiPlaygroundContextValue { + hasPlayground: boolean; + selectionState: ApiPlaygroundSelectionState | undefined; + setSelectionStateAndOpen: (state: ApiPlaygroundSelectionState) => void; + expandApiPlayground: () => void; + collapseApiPlayground: () => void; +} + +const ApiPlaygroundContext = createContext({ + hasPlayground: false, + selectionState: undefined, + setSelectionStateAndOpen: noop, + expandApiPlayground: noop, + collapseApiPlayground: noop, +}); + +const playgroundOpenAtom = atomWithStorage("api-playground-is-open", false); +const playgroundHeightAtom = atomWithStorage("api-playground-height", 400); +const playgroundFormStateAtom = atomWithStorage>( + "api-playground-selection-state-alpha", + {} +); +const playgroundFormSecretsAtom = atomWithStorage("api-playground-secrets-alpha", []); + +interface ApiPlaygroundContextProviderProps extends PropsWithChildren { + apiSections: ResolvedNavigationItemApiSection[]; +} + +export const ApiPlaygroundContextProvider: FC = ({ apiSections, children }) => { + const { domain } = useDocsContext(); + const [selectionState, setSelectionState] = useState(); + + const [intermediateHeight, setHeight] = useAtom(playgroundHeightAtom); + const windowHeight = useWindowHeight(); + + const height = + windowHeight != null ? Math.max(Math.min(windowHeight - 64, intermediateHeight), 100) : intermediateHeight; + + const setOffset = useCallback( + (offset: number) => { + windowHeight != null && setHeight(Math.min(windowHeight - 64, windowHeight - offset)); + }, + [setHeight, windowHeight] + ); + + const handleVerticalResize = useVerticalSplitPane(setOffset); + + const [isPlaygroundOpen, setPlaygroundOpen] = useAtom(playgroundOpenAtom); + const [globalFormState, setGlobalFormState] = useAtom(playgroundFormStateAtom); + const [globalFormSecrets, setGlobalFormSecrets] = useAtom(playgroundFormSecretsAtom); + const { + value: isSecretsModalOpen, + setTrue: openSecretsModal, + setFalse: closeSecretsModal, + } = useBooleanState(false); + + const setPlaygroundFormState = useCallback>>( + (newFormState) => { + if (selectionState == null) { + return; + } + setGlobalFormState((currentFormState) => { + return { + ...currentFormState, + [createFormStateKey(selectionState)]: + typeof newFormState === "function" + ? newFormState(currentFormState[createFormStateKey(selectionState)] ?? EMPTY_FORM_STATE) + : newFormState, + }; + }); + }, + [selectionState, setGlobalFormState] + ); + + const playgroundFormState = + selectionState != null + ? globalFormState[createFormStateKey(selectionState)] ?? EMPTY_FORM_STATE + : EMPTY_FORM_STATE; + + const expandApiPlayground = useCallback(() => { + capturePosthogEvent("api_playground_opened"); + return setPlaygroundOpen(true); + }, [setPlaygroundOpen]); + const collapseApiPlayground = useCallback(() => setPlaygroundOpen(false), [setPlaygroundOpen]); + const togglePlayground = useCallback( + (usingKeyboardShortcut: boolean) => { + return setPlaygroundOpen((current) => { + if (!current) { + capturePosthogEvent("api_playground_opened", { usingKeyboardShortcut }); + } + return !current; + }); + }, + [setPlaygroundOpen] + ); + const setSelectionStateAndOpen = useCallback( + (newSelectionState: ApiPlaygroundSelectionState) => { + setSelectionState(newSelectionState); + expandApiPlayground(); + capturePosthogEvent("api_playground_opened", { + endpointId: newSelectionState.endpoint.id, + endpointName: newSelectionState.endpoint.name, + }); + if (globalFormState[createFormStateKey(newSelectionState)] == null) { + setGlobalFormState((currentFormState) => { + return { + ...currentFormState, + [createFormStateKey(newSelectionState)]: getInitialModalFormStateWithExample( + selectionState?.apiSection.auth, + newSelectionState.endpoint, + newSelectionState.endpoint?.examples[0] + ), + }; + }); + } + }, + [expandApiPlayground, globalFormState, selectionState?.apiSection.auth, setGlobalFormState] + ); + const resetWithExample = useCallback(() => { + if (selectionState == null) { + return; + } + setPlaygroundFormState( + getInitialModalFormStateWithExample( + selectionState.apiSection.auth, + selectionState.endpoint, + selectionState.endpoint?.examples[0] + ) + ); + }, [selectionState, setPlaygroundFormState]); + + const resetWithoutExample = useCallback(() => { + if (selectionState == null) { + return; + } + setPlaygroundFormState(getInitialModalFormState(selectionState.apiSection.auth, selectionState.endpoint)); + }, [selectionState, setPlaygroundFormState]); + + useEffect(() => { + // if keyboard press "ctrl + `", open playground + const togglePlaygroundHandler = (e: KeyboardEvent) => { + if (e.ctrlKey && e.key === "`") { + togglePlayground(true); + } + }; + document.addEventListener("keydown", togglePlaygroundHandler, false); + return () => { + document.removeEventListener("keydown", togglePlaygroundHandler, false); + }; + }, [togglePlayground]); + + const handleSelectSecret = useCallback( + (secret: SecretBearer) => { + closeSecretsModal(); + setPlaygroundFormState((currentFormState) => { + if (currentFormState.auth?.type !== "bearerAuth") { + return currentFormState; + } + return { + ...currentFormState, + auth: { + ...currentFormState.auth, + token: secret.token, + }, + }; + }); + }, + [closeSecretsModal, setPlaygroundFormState] + ); + + if (!domain.toLowerCase().includes("cloudflare") && !domain.toLowerCase().includes("cohere")) { + return <>{children}; + } + + return ( + 0, + selectionState, + setSelectionStateAndOpen, + expandApiPlayground, + collapseApiPlayground, + }} + > + {children} + + +
+
+ +
+ + + + + ); +}; + +export function useApiPlaygroundContext(): ApiPlaygroundContextValue { + return useContext(ApiPlaygroundContext); +} + +function getInitialModalFormState( + auth: APIV1Read.ApiAuth | undefined, + endpoint: ResolvedEndpointDefinition | undefined +): PlaygroundRequestFormState { + return { + auth: getInitialAuthState(auth), + headers: getDefaultValueForTypes(endpoint?.headers), + pathParameters: getDefaultValueForTypes(endpoint?.pathParameters), + queryParameters: getDefaultValueForTypes(endpoint?.queryParameters), + body: getDefaultValuesForBody(endpoint?.requestBody?.shape), + }; +} + +function getInitialAuthState(auth: APIV1Read.ApiAuth | undefined): PlaygroundRequestFormAuth | undefined { + if (auth == null) { + return undefined; + } + return visitDiscriminatedUnion(auth, "type")._visit({ + header: (header) => ({ type: "header", headers: { [header.headerWireValue]: "" } }), + bearerAuth: () => ({ type: "bearerAuth", token: "" }), + basicAuth: () => ({ type: "basicAuth", username: "", password: "" }), + _other: () => undefined, + }); +} + +function getInitialModalFormStateWithExample( + auth: APIV1Read.ApiAuth | undefined, + endpoint: ResolvedEndpointDefinition | undefined, + exampleCall: APIV1Read.ExampleEndpointCall | undefined +): PlaygroundRequestFormState { + if (exampleCall == null) { + return getInitialModalFormState(auth, endpoint); + } + return { + auth: getInitialAuthState(auth), + headers: exampleCall.headers, + pathParameters: exampleCall.pathParameters, + queryParameters: exampleCall.queryParameters, + body: exampleCall.requestBody, + }; +} +function createFormStateKey({ apiDefinition, endpoint }: ApiPlaygroundSelectionState) { + const packageId = + apiDefinition.type === "apiSection" ? apiDefinition.api : `${apiDefinition.apiSectionId}/${apiDefinition.id}`; + return `${packageId}/${endpoint.id}`; +} diff --git a/packages/ui/app/src/api-playground/ApiPlaygroundDrawer.tsx b/packages/ui/app/src/api-playground/ApiPlaygroundDrawer.tsx new file mode 100644 index 0000000000..b9f2aa1210 --- /dev/null +++ b/packages/ui/app/src/api-playground/ApiPlaygroundDrawer.tsx @@ -0,0 +1,110 @@ +import { Button, Tooltip } from "@blueprintjs/core"; +import { Cross } from "@blueprintjs/icons"; +import { APIV1Read } from "@fern-api/fdr-sdk"; +import { + ResolvedApiDefinitionPackage, + ResolvedEndpointDefinition, + ResolvedNavigationItemApiSection, +} from "@fern-ui/app-utils"; +import { Dispatch, FC, ReactElement, SetStateAction } from "react"; +import { ApiPlayroundContent } from "./ApiPlaygroundContent"; +import { useApiPlaygroundContext } from "./ApiPlaygroundContext"; +import { ApiPlaygroundEndpointSelector } from "./ApiPlaygroundEndpointSelector"; +import { PlaygroundEndpointRender } from "./PlaygroundEndpointRender"; +import { SecretBearer } from "./PlaygroundSecretsModal"; +import { PlaygroundRequestFormState } from "./types"; + +interface ApiPlaygroundDrawerProps { + navigationItems: ResolvedNavigationItemApiSection[]; + auth: APIV1Read.ApiAuth | undefined; + apiDefinition: ResolvedApiDefinitionPackage | undefined; + endpoint: ResolvedEndpointDefinition | undefined; + formState: PlaygroundRequestFormState; + setFormState: Dispatch>; + resetWithExample: () => void; + resetWithoutExample: () => void; + openSecretsModal: () => void; + secrets: SecretBearer[]; +} + +export const ApiPlaygroundDrawer: FC = ({ + navigationItems, + auth, + apiDefinition, + endpoint, + formState, + setFormState, + resetWithExample, + resetWithoutExample, + openSecretsModal, + secrets, +}): ReactElement => { + const { collapseApiPlayground } = useApiPlaygroundContext(); + + return ( +
+
+ {endpoint != null && ( + <> +
+ +
+
+ + )} + {endpoint != null ? ( + + ) : ( +
+ + + API Playground + + + BETA + + +
+ )} + +
+ + + Sign in to use your API keys + + +
+
+ + {endpoint != null ? ( + + ) : ( +
+ +
+ )} +
+ ); +}; diff --git a/packages/ui/app/src/api-playground/ApiPlaygroundEndpointSelector.tsx b/packages/ui/app/src/api-playground/ApiPlaygroundEndpointSelector.tsx new file mode 100644 index 0000000000..94b5713d67 --- /dev/null +++ b/packages/ui/app/src/api-playground/ApiPlaygroundEndpointSelector.tsx @@ -0,0 +1,254 @@ +import { Button, InputGroup } from "@blueprintjs/core"; +import { Cross, Search } from "@blueprintjs/icons"; +import { + ResolvedApiDefinitionPackage, + ResolvedEndpointDefinition, + ResolvedNavigationItemApiSection, +} from "@fern-ui/app-utils"; +import { isNonNullish } from "@fern-ui/core-utils"; +import { useBooleanState, useKeyboardPress } from "@fern-ui/react-commons"; +import { Transition } from "@headlessui/react"; +import classNames from "classnames"; +import { FC, Fragment, ReactElement, useEffect, useRef, useState } from "react"; +import { HttpMethodTag } from "../commons/HttpMethodTag"; +import { ChevronDownIcon } from "../commons/icons/ChevronDownIcon"; +import { useApiPlaygroundContext } from "./ApiPlaygroundContext"; + +export interface ApiPlaygroundEndpointSelectorProps { + apiDefinition: ResolvedApiDefinitionPackage | undefined; + endpoint: ResolvedEndpointDefinition | undefined; + navigationItems: ResolvedNavigationItemApiSection[]; + popoverPlacement?: "bottom-start" | "bottom" | "bottom-end" | "top-start" | "top" | "top-end"; + placeholderText?: string; + buttonClassName?: string; +} + +function matchesEndpoint(query: string, endpoint: ResolvedEndpointDefinition): boolean { + return ( + endpoint.name?.toLowerCase().includes(query.toLowerCase()) || + endpoint.description?.toLowerCase().includes(query.toLowerCase()) || + endpoint.method.toLowerCase().includes(query.toLowerCase()) + ); +} + +export const ApiPlaygroundEndpointSelector: FC = ({ + apiDefinition, + endpoint, + navigationItems, + popoverPlacement = "bottom", + placeholderText, + buttonClassName, +}) => { + const { setSelectionStateAndOpen } = useApiPlaygroundContext(); + const { value: showDropdown, toggleValue: toggleDropdown, setFalse: closeDropdown } = useBooleanState(false); + + const [filterValue, setFilterValue] = useState(""); + + const selectedItemRef = useRef(null); + + useKeyboardPress({ key: "Escape", onPress: closeDropdown }); + + // click anywhere outside the dropdown to close it + const dropdownRef = useRef(null); + useEffect(() => { + if (!showDropdown) { + return; + } + const listener = (e: MouseEvent) => { + if (dropdownRef.current != null && !dropdownRef.current.contains(e.target as Node)) { + closeDropdown(); + } + }; + + document.addEventListener("click", listener); + + return () => { + document.removeEventListener("click", listener); + }; + }, [closeDropdown, showDropdown]); + + function renderApiDefinitionPackage(apiDefinition: ResolvedApiDefinitionPackage, depth: number = 0) { + const endpoints = apiDefinition.endpoints.filter((endpoint) => matchesEndpoint(filterValue, endpoint)); + const subpackages = apiDefinition.subpackages + .map((subpackage) => renderApiDefinitionPackage(subpackage, depth + 1)) + .filter(isNonNullish); + if (endpoints.length === 0 && subpackages.length === 0) { + return null; + } + return ( +
  • +
    + + {apiDefinition.title} + +
    +
      + {endpoints.map((endpointItem) => ( +
    • { + setSelectionStateAndOpen({ + endpoint: endpointItem, + apiDefinition, + apiSection: + apiDefinition.type === "apiSection" + ? apiDefinition + : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + navigationItems.find((item) => item.api === apiDefinition.apiSectionId)!, + }); + closeDropdown(); + }} + > + + {renderTextWithHighlight(endpointItem.name ?? "", filterValue)} + + + +
    • + ))} + {subpackages} +
    +
  • + ); + } + + const renderedListItems = navigationItems + .map((apiSection) => renderApiDefinitionPackage(apiSection)) + .filter(isNonNullish); + + return ( +
    + + { + selectedItemRef.current?.scrollIntoView({ + block: "center", + inline: "nearest", + }); + }} + > +
    + {popoverPlacement.startsWith("bottom") && ( +
    0, + })} + > + } + data-1p-ignore="true" + autoFocus={true} + value={filterValue} + onValueChange={setFilterValue} + rightElement={ + filterValue.length > 0 && ( +
    + )} +
      {renderedListItems}
    + {popoverPlacement.startsWith("top") && ( +
    0, + })} + > + } + data-1p-ignore="true" + autoFocus={true} + value={filterValue} + onValueChange={setFilterValue} + rightElement={ + filterValue.length > 0 && ( +
    + )} +
    +
    +
    + ); +}; + +function renderTextWithHighlight(text: string, highlight: string): ReactElement[] { + highlight = highlight.trim(); + // Split text on higlight term, include term itself into parts, ignore case + const parts = text.split(new RegExp(`(${highlight})`, "gi")); + return parts.map((part, idx) => + part.toLowerCase() === highlight.toLowerCase() ? ( + + {part} + + ) : ( + {part} + ) + ); +} diff --git a/packages/ui/app/src/api-playground/PasswordInputGroup.tsx b/packages/ui/app/src/api-playground/PasswordInputGroup.tsx new file mode 100644 index 0000000000..c912f91f2d --- /dev/null +++ b/packages/ui/app/src/api-playground/PasswordInputGroup.tsx @@ -0,0 +1,28 @@ +import { Button, InputGroup, InputGroupProps } from "@blueprintjs/core"; +import { EyeOpen, Key } from "@blueprintjs/icons"; +import { useBooleanState } from "@fern-ui/react-commons"; +import { FC } from "react"; + +export const PasswordInputGroup: FC = (props) => { + const showPassword = useBooleanState(false); + return ( + } + {...props} + type={showPassword.value ? "text" : "password"} + rightElement={ + props.value != null && props.value.length > 0 ? ( +
    + ); +}; diff --git a/packages/ui/app/src/api-playground/PlaygroundEndpointForm.tsx b/packages/ui/app/src/api-playground/PlaygroundEndpointForm.tsx new file mode 100644 index 0000000000..e326030827 --- /dev/null +++ b/packages/ui/app/src/api-playground/PlaygroundEndpointForm.tsx @@ -0,0 +1,392 @@ +import { Button, InputGroup } from "@blueprintjs/core"; +import { ArrowTopRight, Cross, GlobeNetwork, Person } from "@blueprintjs/icons"; +import { isApiNode, joinUrlSlugs } from "@fern-api/fdr-sdk"; +import { + ResolvedEndpointDefinition, + ResolvedNavigationItemApiSection, + visitResolvedHttpRequestBodyShape, +} from "@fern-ui/app-utils"; +import { visitDiscriminatedUnion } from "@fern-ui/core-utils"; +import { useBooleanState } from "@fern-ui/react-commons"; +import classNames from "classnames"; +import Link from "next/link"; +import { Dispatch, FC, SetStateAction, useCallback, useEffect, useRef, useState } from "react"; +import { Markdown } from "../api-page/markdown/Markdown"; +import { useNavigationContext } from "../navigation-context"; +import { PasswordInputGroup } from "./PasswordInputGroup"; +import { PlaygroundObjectPropertyForm } from "./PlaygroundObjectPropertyForm"; +import { SecretBearer, SecretSpan } from "./PlaygroundSecretsModal"; +import { PlaygroundTypeReferenceForm } from "./PlaygroundTypeReferenceForm"; +import { PlaygroundRequestFormAuth, PlaygroundRequestFormState } from "./types"; + +interface PlaygroundEndpointFormProps { + auth: ResolvedNavigationItemApiSection["auth"]; + endpoint: ResolvedEndpointDefinition; + formState: PlaygroundRequestFormState | undefined; + setFormState: Dispatch>; + openSecretsModal: () => void; + secrets: SecretBearer[]; +} + +export const PlaygroundEndpointForm: FC = ({ + auth, + endpoint, + formState, + setFormState, + openSecretsModal, + secrets, +}) => { + const { activeNavigatable } = useNavigationContext(); + const setAuthorization = useCallback( + (newAuthValue: PlaygroundRequestFormAuth) => { + setFormState((state) => ({ + ...state, + auth: newAuthValue, + })); + }, + [setFormState] + ); + + const setHeader = useCallback( + (key: string, value: unknown) => { + setFormState((state) => ({ + ...state, + headers: { + ...state.headers, + [key]: typeof value === "function" ? value(state.headers[key]) : value, + }, + })); + }, + [setFormState] + ); + + const setPathParameter = useCallback( + (key: string, value: unknown) => { + setFormState((state) => ({ + ...state, + pathParameters: { + ...state.pathParameters, + [key]: typeof value === "function" ? value(state.pathParameters[key]) : value, + }, + })); + }, + [setFormState] + ); + + const setQueryParameter = useCallback( + (key: string, value: unknown) => { + setFormState((state) => ({ + ...state, + queryParameters: { + ...state.queryParameters, + [key]: typeof value === "function" ? value(state.queryParameters[key]) : value, + }, + })); + }, + [setFormState] + ); + + const setBody = useCallback( + (value: ((old: unknown) => unknown) | unknown) => { + setFormState((state) => ({ + ...state, + body: typeof value === "function" ? value(state.body) : value, + })); + }, + [setFormState] + ); + + const descriptionRef = useRef(null); + const { value: showFullDescription, toggleValue: toggleShowFullDescription } = useBooleanState(false); + const [descriptionIsClamped, setDescriptionIsClamped] = useState(false); + + useEffect(() => { + const descriptionResizeObserver = new ResizeObserver(([e]) => { + if (e != null && !showFullDescription) { + setDescriptionIsClamped(e.target.scrollHeight > e.target.clientHeight); + } + }); + + if (descriptionRef.current != null) { + descriptionResizeObserver.observe(descriptionRef.current); + return () => { + descriptionResizeObserver.disconnect(); + }; + } + return undefined; + }, [showFullDescription]); + + return ( +
    + {endpoint.description != null && endpoint.description.length > 0 && ( +
    +
    + {endpoint.description} +
    + {descriptionIsClamped && ( + + )} +
    + )} + + {endpoint.authed && auth != null && ( +
    +
    Authorization
    +
      + {visitDiscriminatedUnion(auth, "type")._visit({ + bearerAuth: (bearerAuth) => ( +
    • +
      + +
      +
      + {formState?.auth?.type === "bearerAuth" && + secrets.some( + (secret) => + formState?.auth?.type === "bearerAuth" && + formState.auth.token === secret.token + ) ? ( + + +
      +
    • + ), + basicAuth: (basicAuth) => ( + <> +
    • +
      + +
      +
      + + setAuthorization({ + type: "basicAuth", + username: newValue, + password: + formState?.auth?.type === "basicAuth" + ? formState.auth.password + : "", + }) + } + value={ + formState?.auth?.type === "basicAuth" ? formState.auth.username : "" + } + leftIcon={} + rightElement={{"string"}} + /> +
      +
    • + +
    • +
      + +
      + +
      + + setAuthorization({ + type: "basicAuth", + username: + formState?.auth?.type === "basicAuth" + ? formState.auth.username + : "", + password: newValue, + }) + } + value={ + formState?.auth?.type === "basicAuth" ? formState.auth.password : "" + } + /> +
      +
    • + + ), + header: (header) => ( +
    • +
      + +
      +
      + + setAuthorization({ + type: "header", + headers: { [header.headerWireValue]: newValue }, + }) + } + value={ + formState?.auth?.type === "header" + ? formState.auth.headers[header.headerWireValue] + : "" + } + autoComplete="off" + data-1p-ignore="true" + /> +
      +
    • + ), + _other: () => null, + })} +
    +
    + )} + + {endpoint.headers.length > 0 && ( +
    +
    Headers
    +
      + {endpoint.headers.map((header) => ( + + ))} +
    +
    + )} + + {endpoint.pathParameters.length > 0 && ( +
    +
    Path parameters
    +
      + {endpoint.pathParameters.map((pathParameter) => ( + + ))} +
    +
    + )} + + {endpoint.queryParameters.length > 0 && ( +
    +
    Query parameters
    +
      + {endpoint.queryParameters.map((queryParameter) => ( + + ))} +
    +
    + )} + + {endpoint.requestBody != null && ( +
    +
    Body
    + + {visitResolvedHttpRequestBodyShape(endpoint.requestBody.shape, { + fileUpload: () => fileUpload, + typeReference: (shape) => ( + + ), + })} +
    + )} + + + View in API Reference + + +
    + ); +}; diff --git a/packages/ui/app/src/api-playground/PlaygroundEndpointRender.tsx b/packages/ui/app/src/api-playground/PlaygroundEndpointRender.tsx new file mode 100644 index 0000000000..848b6f4fe0 --- /dev/null +++ b/packages/ui/app/src/api-playground/PlaygroundEndpointRender.tsx @@ -0,0 +1,85 @@ +import { ResolvedEndpointDefinition } from "@fern-ui/app-utils"; +import { visitDiscriminatedUnion } from "@fern-ui/core-utils"; +import classNames from "classnames"; +import { isUndefined, omitBy } from "lodash-es"; +import { FC, Fragment } from "react"; +import { CopyToClipboardButton } from "../commons/CopyToClipboardButton"; +import { HttpMethodTag } from "../commons/HttpMethodTag"; +import { PlaygroundRequestFormState } from "./types"; +import { buildUrl, unknownToString } from "./utils"; + +interface PlaygroundEndpointRenderProps { + endpoint: ResolvedEndpointDefinition; + formState: PlaygroundRequestFormState; +} + +export const PlaygroundEndpointRender: FC = ({ endpoint, formState }) => { + const environment = endpoint.defaultEnvironment ?? endpoint.environments[0]; + return ( +
    +
    + {endpoint != null && } + + {environment?.baseUrl} + {endpoint?.path.map((part, idx) => { + return visitDiscriminatedUnion(part, "type")._visit({ + literal: (literal) => {literal.value}, + pathParameter: (pathParameter) => { + const stateValue = unknownToString(formState?.pathParameters[pathParameter.key]); + return ( + 0, + })} + > + {stateValue.length > 0 ? encodeURI(stateValue) : pathParameter.key} + + ); + }, + _other: () => null, + }); + })} + {endpoint != null && + endpoint.queryParameters.length > 0 && + Object.keys(omitBy(formState?.queryParameters, isUndefined)).length > 0 && + endpoint.queryParameters + .filter((queryParameter) => { + const stateValue = formState?.queryParameters[queryParameter.key]; + if (stateValue == null && queryParameter.shape.type === "optional") { + return false; + } + return true; + }) + .map((queryParameter, idx) => { + const stateValue = unknownToString(formState?.queryParameters[queryParameter.key]); + return ( + + {idx === 0 ? "?" : "&"} + + {queryParameter.key} + {"="} + + {encodeURI(stateValue)} + + + ); + })} + +
    + { + return buildUrl(endpoint, formState); + }} + /> +
    + ); +}; diff --git a/packages/ui/app/src/api-playground/PlaygroundEnumForm.tsx b/packages/ui/app/src/api-playground/PlaygroundEnumForm.tsx new file mode 100644 index 0000000000..661acf8f1d --- /dev/null +++ b/packages/ui/app/src/api-playground/PlaygroundEnumForm.tsx @@ -0,0 +1,87 @@ +import { Button, MenuItem, SegmentedControl, Tooltip } from "@blueprintjs/core"; +import { CaretDown } from "@blueprintjs/icons"; +import { Select } from "@blueprintjs/select"; +import { APIV1Read } from "@fern-api/fdr-sdk"; +import { FC, useCallback } from "react"; +import { InfoIcon } from "../commons/icons/InfoIcon"; + +interface PlaygroundEnumFormProps { + enumValues: APIV1Read.EnumValue[]; + onChange: (value: unknown) => void; + value: unknown; +} + +export const PlaygroundEnumForm: FC = ({ enumValues, onChange, value }) => { + const setSelectedValue = useCallback( + (enumValue: APIV1Read.EnumValue) => { + onChange(enumValue.value); + }, + [onChange] + ); + + if (enumValues.length === 0) { + return null; + } + + if (enumValues.length < 3) { + return ( +
    + ({ + label: enumValue.value, + value: enumValue.value, + }))} + value={typeof value === "string" ? value : undefined} + onValueChange={onChange} + small={true} + fill={true} + /> +
    + ); + } + + const activeItem = enumValues.find((enumValue) => enumValue.value === value); + + return ( + + items={enumValues} + itemRenderer={({ value, description }, { ref, handleClick, handleFocus, modifiers }) => + modifiers.matchesPredicate && ( + {value}} + onClick={handleClick} + onFocus={handleFocus} + roleStructure="listoption" + labelElement={ + + + + } + /> + ) + } + itemPredicate={(query, { value }) => value.toLowerCase().includes(query.toLowerCase())} + onItemSelect={setSelectedValue} + activeItem={activeItem} + popoverProps={{ minimal: true, matchTargetWidth: true }} + fill={true} + > +
    + + ))} +
  • +
  • + + )} + {valueAsList.length === 0 && ( +
    + + ))} +
  • +
  • + + )} + {internalState.length === 0 && ( +
    + ); +}; diff --git a/packages/ui/app/src/api-playground/PlaygroundObjectPropertyForm.tsx b/packages/ui/app/src/api-playground/PlaygroundObjectPropertyForm.tsx new file mode 100644 index 0000000000..8fd27ba303 --- /dev/null +++ b/packages/ui/app/src/api-playground/PlaygroundObjectPropertyForm.tsx @@ -0,0 +1,197 @@ +import { Button, Checkbox, Tooltip } from "@blueprintjs/core"; +import { ChevronDown, ChevronUp } from "@blueprintjs/icons"; +import { ResolvedObjectProperty } from "@fern-ui/app-utils"; +import { useBooleanState } from "@fern-ui/react-commons"; +import classNames from "classnames"; +import { isUndefined } from "lodash-es"; +import { ChangeEventHandler, FC, useCallback, useEffect, useState } from "react"; +import { EndpointAvailabilityTag } from "../api-page/endpoints/EndpointAvailabilityTag"; +import { renderTypeShorthand } from "../api-page/types/type-shorthand/TypeShorthand"; +import { PlaygroundTypeReferenceForm } from "./PlaygroundTypeReferenceForm"; +import { castToRecord, getDefaultValueForType, isExpandable } from "./utils"; + +interface PlaygroundObjectPropertyFormProps { + property: ResolvedObjectProperty; + onChange: (key: string, value: unknown) => void; + value: unknown; + expandByDefault?: boolean; +} + +export const PlaygroundObjectPropertyForm: FC = ({ + property, + onChange, + value, + expandByDefault = true, +}) => { + const handleChange = useCallback( + (newValue: unknown) => { + onChange(property.key, newValue); + }, + [onChange, property.key] + ); + + const expandable = isExpandable(property.valueShape, value); + const { + value: expanded, + setTrue: setExpanded, + toggleValue: toggleExpanded, + } = useBooleanState(!expandable || expandByDefault); + + const handleChangeOptional = useCallback>( + (e) => { + if (property.valueShape.type === "optional") { + onChange( + property.key, + e.target.checked ? getDefaultValueForType(property.valueShape.shape) : undefined + ); + setExpanded(); + } + }, + [onChange, property.key, property.valueShape, setExpanded] + ); + + useEffect(() => { + if (!expandable) { + setExpanded(); + } + }, [expandable, setExpanded]); + + const [focused, setFocused] = useState(false); + const handleFocus = useCallback(() => setFocused(true), []); + const handleBlur = useCallback(() => setFocused(false), []); + const [isUnderStack, setIsUnderStack] = useState(false); + const handleOpenStack = useCallback(() => setIsUnderStack(true), []); + const handleCloseStack = useCallback(() => setIsUnderStack(false), []); + + return ( + ( +
  • +
    +
    + +
    +
    + {!isUndefined(value) && !expandable && ( + + )} + + {((property.valueShape.type === "optional" && isUndefined(value)) || expandable) && ( + + {renderTypeShorthand(property.valueShape)} + + )} + + {expandable && (property.valueShape.type === "optional" ? !isUndefined(value) : true) && ( +
    +
    + {!isUndefined(value) && expandable && expanded && ( +
    + +
    + )} +
  • + )} + /> + ); +}; + +interface PlaygroundObjectPropertiesFormProps { + properties: ResolvedObjectProperty[]; + onChange: (value: unknown) => void; + value: unknown; +} + +export const PlaygroundObjectPropertiesForm: FC = ({ + properties, + onChange, + value, +}) => { + const onChangeObjectProperty = useCallback( + (key: string, newValue: unknown) => { + onChange((oldValue: unknown) => { + const oldObject = castToRecord(oldValue); + return { ...oldObject, [key]: typeof newValue === "function" ? newValue(oldObject[key]) : newValue }; + }); + }, + [onChange] + ); + return ( +
      + {properties.map((property) => ( + + ))} +
    + ); +}; diff --git a/packages/ui/app/src/api-playground/PlaygroundRequestPreview.tsx b/packages/ui/app/src/api-playground/PlaygroundRequestPreview.tsx new file mode 100644 index 0000000000..fc1174b74f --- /dev/null +++ b/packages/ui/app/src/api-playground/PlaygroundRequestPreview.tsx @@ -0,0 +1,61 @@ +import { APIV1Read } from "@fern-api/fdr-sdk"; +import { ResolvedEndpointDefinition } from "@fern-ui/app-utils"; +import { useTheme } from "next-themes"; +import { FC } from "react"; +import { FernSyntaxHighlighter } from "../commons/CodeBlockSkeleton"; +import { CopyToClipboardButton } from "../commons/CopyToClipboardButton"; +import { PlaygroundRequestFormState } from "./types"; +import { stringifyCurl, stringifyFetch, stringifyPythonRequests } from "./utils"; + +interface PlaygroundRequestPreviewProps { + auth: APIV1Read.ApiAuth | undefined; + endpoint: ResolvedEndpointDefinition | undefined; + formState: PlaygroundRequestFormState; + requestType: "curl" | "javascript" | "python"; +} + +export const PlaygroundRequestPreview: FC = ({ + auth, + endpoint, + formState, + requestType, +}) => { + const { resolvedTheme: theme } = useTheme(); + return ( +
    + + requestType === "curl" + ? stringifyCurl(auth, endpoint, formState, false) + : requestType === "javascript" + ? stringifyFetch(auth, endpoint, formState, false) + : requestType === "python" + ? stringifyPythonRequests(auth, endpoint, formState, false) + : "" + } + /> +
    + + {requestType === "curl" + ? stringifyCurl(auth, endpoint, formState) + : requestType === "javascript" + ? stringifyFetch(auth, endpoint, formState) + : requestType === "python" + ? stringifyPythonRequests(auth, endpoint, formState) + : ""} + +
    +
    + ); +}; diff --git a/packages/ui/app/src/api-playground/PlaygroundResponsePreview.tsx b/packages/ui/app/src/api-playground/PlaygroundResponsePreview.tsx new file mode 100644 index 0000000000..0bba1e88bf --- /dev/null +++ b/packages/ui/app/src/api-playground/PlaygroundResponsePreview.tsx @@ -0,0 +1,36 @@ +import { useTheme } from "next-themes"; +import { FC } from "react"; +import { FernSyntaxHighlighter } from "../commons/CodeBlockSkeleton"; +import { CopyToClipboardButton } from "../commons/CopyToClipboardButton"; + +interface PlaygroundResponsePreviewProps { + responseBody: unknown; +} + +export const PlaygroundResponsePreview: FC = ({ responseBody }) => { + const { resolvedTheme: theme } = useTheme(); + const responseJson = JSON.stringify(responseBody, null, 2); + return ( +
    + +
    + + {responseJson} + +
    +
    + ); +}; diff --git a/packages/ui/app/src/api-playground/PlaygroundSecretsModal.tsx b/packages/ui/app/src/api-playground/PlaygroundSecretsModal.tsx new file mode 100644 index 0000000000..cf18654452 --- /dev/null +++ b/packages/ui/app/src/api-playground/PlaygroundSecretsModal.tsx @@ -0,0 +1,122 @@ +import { Button, ButtonGroup, mergeRefs, Tooltip } from "@blueprintjs/core"; +import { ArrowRight, Cross, Trash } from "@blueprintjs/icons"; +import { useCopyToClipboard } from "@fern-ui/react-commons"; +import classNames from "classnames"; +import { FC, useState } from "react"; +import { FernModal } from "../components/FernModal"; +import { PasswordInputGroup } from "./PasswordInputGroup"; +import { obfuscateSecret } from "./utils"; + +export interface SecretBearer { + type: "bearer"; + token: string; +} + +interface PlaygroundSecretsModalProps { + secrets: SecretBearer[]; + setSecrets: (secrets: SecretBearer[]) => void; + selectSecret: (secret: SecretBearer) => void; + isOpen: boolean; + onClose: () => void; +} + +export const SecretSpan: FC<{ secret: string } & React.HTMLAttributes> = ({ + secret, + className: parentClassName, + ...props +}) => { + const { copyToClipboard, wasJustCopied } = useCopyToClipboard(secret); + return ( + ( + ( + + {obfuscateSecret(secret)} + + )} + /> + )} + /> + ); +}; + +export const PlaygroundSecretsModal: FC = ({ + secrets, + setSecrets, + onClose, + selectSecret, + isOpen, +}) => { + const [value, setValue] = useState(""); + return ( + + + + + + ); +}; diff --git a/packages/ui/app/src/api-playground/PlaygroundTypeReferenceForm.tsx b/packages/ui/app/src/api-playground/PlaygroundTypeReferenceForm.tsx new file mode 100644 index 0000000000..29597fe303 --- /dev/null +++ b/packages/ui/app/src/api-playground/PlaygroundTypeReferenceForm.tsx @@ -0,0 +1,280 @@ +import { Button, InputGroup, NumericInput, Switch, TextArea } from "@blueprintjs/core"; +import { DateInput3 } from "@blueprintjs/datetime2"; +import { ArrowLeft } from "@blueprintjs/icons"; +import { ResolvedTypeReference } from "@fern-ui/app-utils"; +import { visitDiscriminatedUnion } from "@fern-ui/core-utils"; +import { useBooleanState } from "@fern-ui/react-commons"; +import { Transition } from "@headlessui/react"; +import { FC, PropsWithChildren, useEffect } from "react"; +import { renderTypeShorthand } from "../api-page/types/type-shorthand/TypeShorthand"; +import { PlaygroundDiscriminatedUnionForm } from "./PlaygroundDescriminatedUnionForm"; +import { PlaygroundEnumForm } from "./PlaygroundEnumForm"; +import { PlaygroundListForm } from "./PlaygroundListForm"; +import { PlaygroundMapForm } from "./PlaygroundMapForm"; +import { PlaygroundObjectPropertiesForm } from "./PlaygroundObjectPropertyForm"; +import { PlaygroundUniscriminatedUnionForm } from "./PlaygroundUniscriminatedUnionForm"; + +interface PlaygroundTypeReferenceFormProps { + shape: ResolvedTypeReference; + onChange: (value: unknown) => void; + value?: unknown; + onFocus?: () => void; + onBlur?: () => void; + onOpenStack?: () => void; + onCloseStack?: () => void; + renderAsPanel?: boolean; +} + +interface WithPanelProps { + value: unknown; + typeShape: ResolvedTypeReference; + renderAsPanel: boolean; + onOpenStack?: () => void; + onCloseStack?: () => void; +} + +const WithPanel: FC> = ({ + children, + value, + typeShape, + renderAsPanel, + onOpenStack, + onCloseStack, +}) => { + const { value: isPanelOpen, setTrue: showPanel, setFalse: hidePanel } = useBooleanState(false); + useEffect(() => { + if (isPanelOpen && renderAsPanel) { + onOpenStack?.(); + } else { + onCloseStack?.(); + } + }, [isPanelOpen, onCloseStack, onOpenStack, renderAsPanel]); + if (!renderAsPanel) { + return <>{children}; + } + return ( + <> +
    + + + {JSON.stringify(value)} + + {renderTypeShorthand(typeShape)} + +
    + +
    +
    +
    {children}
    +
    + + ); +}; + +export const PlaygroundTypeReferenceForm: FC = ({ + shape, + onChange, + value, + onBlur, + onFocus, + onOpenStack, + onCloseStack, + renderAsPanel = false, +}) => { + return visitDiscriminatedUnion(shape, "type")._visit({ + object: (object) => ( + + + + ), + enum: ({ values }) => , + undiscriminatedUnion: (undiscriminatedUnion) => ( + + + + ), + discriminatedUnion: (discriminatedUnion) => ( + + + + ), + string: () => ( +
    + {"string"}} + onFocus={onFocus} + onBlur={onBlur} + /> +
    + ), + boolean: () => ( +
    + onChange(e.target.checked)} + className="-mb-1 -mr-2" + /> +
    + ), + integer: () => ( +
    + {"integer"}} + onFocus={onFocus} + onBlur={onBlur} + /> +
    + ), + double: () => ( +
    + {"double"}} + onFocus={onFocus} + onBlur={onBlur} + /> +
    + ), + long: () => ( +
    + {"long"}} + onFocus={onFocus} + onBlur={onBlur} + /> +
    + ), + datetime: () => ( +
    + +
    + ), + uuid: () => ( +
    + {"uuid"}} + onFocus={onFocus} + onBlur={onBlur} + /> +
    + ), + base64: () => ( +
    +