feat: Next server rendering blocks

This commit is contained in:
Sam Tolmay 2021-11-11 17:36:14 +02:00
parent 5bdc85b032
commit e625e07a29
No known key found for this signature in database
GPG Key ID: D004126FCD1A6DF0
41 changed files with 715 additions and 696 deletions

472
.pnp.cjs generated
View File

@ -5642,37 +5642,23 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"packageLocation": "./packages/layout/",
"packageDependencies": [
["@lowdefy/layout", "workspace:packages/layout"],
["@babel/cli", "virtual:b6fa685df68481df8aea241d69a5d4ac044afe9a6d5347abc450d1a9a0b048b47a068daa4b51891dcc21a6f39ddd0469d8cb1b5ac2b845697d880ad1457b4396#npm:7.15.7"],
["@babel/core", "npm:7.15.8"],
["@babel/preset-env", "virtual:b6fa685df68481df8aea241d69a5d4ac044afe9a6d5347abc450d1a9a0b048b47a068daa4b51891dcc21a6f39ddd0469d8cb1b5ac2b845697d880ad1457b4396#npm:7.15.8"],
["@babel/preset-react", "virtual:dddca670fd0b7758fb2e1b1a3e18ac7ebd1ecd06ecdd7acec2b78bccf1d35802cb22904bfbb233b16515a81f5cb819421786d20887823d98022b367036c1ad51#npm:7.14.5"],
["@babel/preset-react", "virtual:04055f037dce009b6d437327a3df2c0a05f0436e14e2b705672dd0d1e0a3dfd29d8d62e0db8cb7e152c4b95e36ad3ccd6a68c9e962121dec9e597b25e0481519#npm:7.16.0"],
["@emotion/jest", "virtual:04055f037dce009b6d437327a3df2c0a05f0436e14e2b705672dd0d1e0a3dfd29d8d62e0db8cb7e152c4b95e36ad3ccd6a68c9e962121dec9e597b25e0481519#npm:11.5.0"],
["@lowdefy/block-dev", "workspace:packages/block-dev"],
["@lowdefy/block-utils", "workspace:packages/block-utils"],
["@lowdefy/helpers", "workspace:packages/helpers"],
["@swc/cli", "virtual:4a7337632ff6e9ee5a1c45a62a9ff4cc325a9367b21424babda93e269fe01b671e885bc41bdeebafb83c81f2a8eebbf0102043354a4e58905f61c8c3387cda1e#npm:0.1.51"],
["@swc/core", "npm:1.2.107"],
["@swc/jest", "virtual:4a7337632ff6e9ee5a1c45a62a9ff4cc325a9367b21424babda93e269fe01b671e885bc41bdeebafb83c81f2a8eebbf0102043354a4e58905f61c8c3387cda1e#npm:0.2.5"],
["@testing-library/dom", "npm:8.10.1"],
["@testing-library/react", "virtual:04055f037dce009b6d437327a3df2c0a05f0436e14e2b705672dd0d1e0a3dfd29d8d62e0db8cb7e152c4b95e36ad3ccd6a68c9e962121dec9e597b25e0481519#npm:12.1.2"],
["@testing-library/user-event", "virtual:04055f037dce009b6d437327a3df2c0a05f0436e14e2b705672dd0d1e0a3dfd29d8d62e0db8cb7e152c4b95e36ad3ccd6a68c9e962121dec9e597b25e0481519#npm:13.5.0"],
["antd", "virtual:d549c90a66e2dbf9d17def1c9f39538b909d66de1b505183e68abb1bbd2ae3684ddc299cb1d1031d812d46e521336dfd28859e8111e541eabeab93fcc1911b5b#npm:4.17.0-alpha.7"],
["babel-jest", "virtual:4d3a3f79f60b2294109a713555c084c0489a2a4f97b0d45817e4aa63b6e15e6ef8f5a5dafe41a4ed8f9dc47978495fbbf92e43efd40de2306fb74fb2638214c5#npm:27.3.1"],
["babel-loader", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:8.2.3"],
["babel-plugin-import", "npm:1.13.3"],
["clean-webpack-plugin", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:4.0.0"],
["css-loader", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:6.4.0"],
["html-webpack-plugin", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:5.4.0"],
["jest", "virtual:4a7337632ff6e9ee5a1c45a62a9ff4cc325a9367b21424babda93e269fe01b671e885bc41bdeebafb83c81f2a8eebbf0102043354a4e58905f61c8c3387cda1e#npm:27.3.1"],
["jest-serializer-html", "npm:7.1.0"],
["jest-transform-yaml", "npm:0.1.2"],
["js-yaml", "npm:4.1.0"],
["less", "npm:4.1.2"],
["less-loader", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:10.2.0"],
["process", "npm:0.11.10"],
["react", "npm:18.0.0-alpha-327d5c484-20211106"],
["react-dom", "virtual:04055f037dce009b6d437327a3df2c0a05f0436e14e2b705672dd0d1e0a3dfd29d8d62e0db8cb7e152c4b95e36ad3ccd6a68c9e962121dec9e597b25e0481519#npm:18.0.0-alpha-327d5c484-20211106"],
["react-markdown", "virtual:901d32fbc48074c2b3b637efca6217ea5a6224f6744fd9d90e163f033108983ffbef18bf28bc14de3eed24f567b2dff9f78899fa57e193d0a701625c61651046#npm:5.0.3"],
["react-syntax-highlight", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:15.3.1"],
["style-loader", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:3.3.1"],
["webpack", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:5.59.1"],
["webpack-cli", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:4.9.1"],
["webpack-dev-server", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:4.3.1"],
["yaml-loader", "npm:0.6.0"]
["react-dom", "virtual:04055f037dce009b6d437327a3df2c0a05f0436e14e2b705672dd0d1e0a3dfd29d8d62e0db8cb7e152c4b95e36ad3ccd6a68c9e962121dec9e597b25e0481519#npm:18.0.0-alpha-327d5c484-20211106"]
],
"linkType": "SOFT",
}]
@ -5718,12 +5704,12 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"packageDependencies": [
["@lowdefy/nunjucks", "workspace:packages/nunjucks"],
["@lowdefy/helpers", "workspace:packages/helpers"],
["@swc/cli", "virtual:e63ad9bfa6ec53905cba84fb75f4e50334e3a53802ae3db1253f0c0ffaa0b90dd4a8266023fa69cfaf46281a2d69949c0e5f69029277d4d1fddfbbc9c01e4d03#npm:0.1.51"],
["@swc/cli", "virtual:4a7337632ff6e9ee5a1c45a62a9ff4cc325a9367b21424babda93e269fe01b671e885bc41bdeebafb83c81f2a8eebbf0102043354a4e58905f61c8c3387cda1e#npm:0.1.51"],
["@swc/core", "npm:1.2.107"],
["@swc/jest", "virtual:4a7337632ff6e9ee5a1c45a62a9ff4cc325a9367b21424babda93e269fe01b671e885bc41bdeebafb83c81f2a8eebbf0102043354a4e58905f61c8c3387cda1e#npm:0.2.5"],
["chokidar", "npm:3.5.2"],
["jest", "virtual:4a7337632ff6e9ee5a1c45a62a9ff4cc325a9367b21424babda93e269fe01b671e885bc41bdeebafb83c81f2a8eebbf0102043354a4e58905f61c8c3387cda1e#npm:27.3.1"],
["moment", "npm:2.29.1"]
["moment", "npm:2.29.1"],
["nunjucks", "virtual:e63ad9bfa6ec53905cba84fb75f4e50334e3a53802ae3db1253f0c0ffaa0b90dd4a8266023fa69cfaf46281a2d69949c0e5f69029277d4d1fddfbbc9c01e4d03#npm:3.2.3"]
],
"linkType": "SOFT",
}]
@ -5770,8 +5756,12 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"packageDependencies": [
["@lowdefy/server", "workspace:packages/server"],
["@lowdefy/api", "workspace:packages/api"],
["@lowdefy/block-utils", "workspace:packages/block-utils"],
["@lowdefy/blocks-antd", "workspace:packages/blocks/blocks-antd"],
["@lowdefy/blocks-basic", "workspace:packages/blocks/blocks-basic"],
["@lowdefy/engine", "workspace:packages/engine"],
["@lowdefy/helpers", "workspace:packages/helpers"],
["@lowdefy/node-utils", "workspace:packages/node-utils"],
["@lowdefy/layout", "workspace:packages/layout"],
["@next/eslint-plugin-next", "npm:12.0.2"],
["less", "npm:4.1.2"],
["less-loader", "virtual:003bebd8b7a948d12b44e2c11a621884feb1891eea3645171e827971487f79396db9f7422bc411ccf3f90877e94ec86f5c3da70b96efb5daddb2ee3b35eae5c6#npm:10.2.0"],
@ -6577,27 +6567,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"chokidar"
],
"linkType": "HARD",
}],
["virtual:e63ad9bfa6ec53905cba84fb75f4e50334e3a53802ae3db1253f0c0ffaa0b90dd4a8266023fa69cfaf46281a2d69949c0e5f69029277d4d1fddfbbc9c01e4d03#npm:0.1.51", {
"packageLocation": "./.yarn/__virtual__/@swc-cli-virtual-9c7dbd7e5b/0/cache/@swc-cli-npm-0.1.51-a93f90901e-348bf0aee8.zip/node_modules/@swc/cli/",
"packageDependencies": [
["@swc/cli", "virtual:e63ad9bfa6ec53905cba84fb75f4e50334e3a53802ae3db1253f0c0ffaa0b90dd4a8266023fa69cfaf46281a2d69949c0e5f69029277d4d1fddfbbc9c01e4d03#npm:0.1.51"],
["@swc/core", "npm:1.2.107"],
["@types/chokidar", null],
["@types/swc__core", null],
["chokidar", "npm:3.5.2"],
["commander", "npm:7.2.0"],
["fast-glob", "npm:3.2.7"],
["slash", "npm:3.0.0"],
["source-map", "npm:0.7.3"]
],
"packagePeers": [
"@swc/core",
"@types/chokidar",
"@types/swc__core",
"chokidar"
],
"linkType": "HARD",
}]
]],
["@swc/core", [
@ -7688,23 +7657,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],
"linkType": "SOFT",
}],
["virtual:36c2bdf33be5abed551d78782bb3a5c3c37b72e65c84f819049f6eefc3c639fe3b76bf2a992a0ee5282742eb654fa11e8a7cf1f988c39c2874d4e5989f96a83d#npm:1.1.0", {
"packageLocation": "./.yarn/__virtual__/@webpack-cli-configtest-virtual-2c7b1931f7/0/cache/@webpack-cli-configtest-npm-1.1.0-2b6b2ef3d7-69e7816b5b.zip/node_modules/@webpack-cli/configtest/",
"packageDependencies": [
["@webpack-cli/configtest", "virtual:36c2bdf33be5abed551d78782bb3a5c3c37b72e65c84f819049f6eefc3c639fe3b76bf2a992a0ee5282742eb654fa11e8a7cf1f988c39c2874d4e5989f96a83d#npm:1.1.0"],
["@types/webpack", null],
["@types/webpack-cli", null],
["webpack", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:5.59.1"],
["webpack-cli", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:4.9.1"]
],
"packagePeers": [
"@types/webpack-cli",
"@types/webpack",
"webpack-cli",
"webpack"
],
"linkType": "HARD",
}],
["virtual:9d6de49a7b9ae04604621b26b33097b808a427c088e52b8f45bf16fab7a2582abf56de55debbdbab546a7bbc47bcfcaf80a6c9d790771e5782dae95b4c017aa0#npm:1.1.0", {
"packageLocation": "./.yarn/__virtual__/@webpack-cli-configtest-virtual-8e2d628e23/0/cache/@webpack-cli-configtest-npm-1.1.0-2b6b2ef3d7-69e7816b5b.zip/node_modules/@webpack-cli/configtest/",
"packageDependencies": [
@ -7748,20 +7700,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],
"linkType": "SOFT",
}],
["virtual:36c2bdf33be5abed551d78782bb3a5c3c37b72e65c84f819049f6eefc3c639fe3b76bf2a992a0ee5282742eb654fa11e8a7cf1f988c39c2874d4e5989f96a83d#npm:1.4.0", {
"packageLocation": "./.yarn/__virtual__/@webpack-cli-info-virtual-87455f0076/0/cache/@webpack-cli-info-npm-1.4.0-4a26ccee64-6385b1e2c5.zip/node_modules/@webpack-cli/info/",
"packageDependencies": [
["@webpack-cli/info", "virtual:36c2bdf33be5abed551d78782bb3a5c3c37b72e65c84f819049f6eefc3c639fe3b76bf2a992a0ee5282742eb654fa11e8a7cf1f988c39c2874d4e5989f96a83d#npm:1.4.0"],
["@types/webpack-cli", null],
["envinfo", "npm:7.8.1"],
["webpack-cli", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:4.9.1"]
],
"packagePeers": [
"@types/webpack-cli",
"webpack-cli"
],
"linkType": "HARD",
}],
["virtual:9d6de49a7b9ae04604621b26b33097b808a427c088e52b8f45bf16fab7a2582abf56de55debbdbab546a7bbc47bcfcaf80a6c9d790771e5782dae95b4c017aa0#npm:1.4.0", {
"packageLocation": "./.yarn/__virtual__/@webpack-cli-info-virtual-0ca1a3b309/0/cache/@webpack-cli-info-npm-1.4.0-4a26ccee64-6385b1e2c5.zip/node_modules/@webpack-cli/info/",
"packageDependencies": [
@ -7799,23 +7737,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],
"linkType": "SOFT",
}],
["virtual:36c2bdf33be5abed551d78782bb3a5c3c37b72e65c84f819049f6eefc3c639fe3b76bf2a992a0ee5282742eb654fa11e8a7cf1f988c39c2874d4e5989f96a83d#npm:1.6.0", {
"packageLocation": "./.yarn/__virtual__/@webpack-cli-serve-virtual-8636f92dac/0/cache/@webpack-cli-serve-npm-1.6.0-c7b35aa4ef-050a930b63.zip/node_modules/@webpack-cli/serve/",
"packageDependencies": [
["@webpack-cli/serve", "virtual:36c2bdf33be5abed551d78782bb3a5c3c37b72e65c84f819049f6eefc3c639fe3b76bf2a992a0ee5282742eb654fa11e8a7cf1f988c39c2874d4e5989f96a83d#npm:1.6.0"],
["@types/webpack-cli", null],
["@types/webpack-dev-server", null],
["webpack-cli", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:4.9.1"],
["webpack-dev-server", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:4.3.1"]
],
"packagePeers": [
"@types/webpack-cli",
"@types/webpack-dev-server",
"webpack-cli",
"webpack-dev-server"
],
"linkType": "HARD",
}],
["virtual:9d6de49a7b9ae04604621b26b33097b808a427c088e52b8f45bf16fab7a2582abf56de55debbdbab546a7bbc47bcfcaf80a6c9d790771e5782dae95b4c017aa0#npm:1.6.0", {
"packageLocation": "./.yarn/__virtual__/@webpack-cli-serve-virtual-0c69f9ede1/0/cache/@webpack-cli-serve-npm-1.6.0-c7b35aa4ef-050a930b63.zip/node_modules/@webpack-cli/serve/",
"packageDependencies": [
@ -8040,6 +7961,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["a-sync-waterfall", [
["npm:1.0.1", {
"packageLocation": "./.yarn/cache/a-sync-waterfall-npm-1.0.1-f6b6b49568-534948b50d.zip/node_modules/a-sync-waterfall/",
"packageDependencies": [
["a-sync-waterfall", "npm:1.0.1"]
],
"linkType": "HARD",
}]
]],
["abab", [
["npm:2.0.5", {
"packageLocation": "./.yarn/cache/abab-npm-2.0.5-ae8d5b629e-0ec951b46d.zip/node_modules/abab/",
@ -9267,27 +9197,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],
"linkType": "HARD",
}],
["virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:8.2.3", {
"packageLocation": "./.yarn/__virtual__/babel-loader-virtual-3b798ef48d/0/cache/babel-loader-npm-8.2.3-855681b984-78e1e1a919.zip/node_modules/babel-loader/",
"packageDependencies": [
["babel-loader", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:8.2.3"],
["@babel/core", "npm:7.15.8"],
["@types/babel__core", null],
["@types/webpack", null],
["find-cache-dir", "npm:3.3.2"],
["loader-utils", "npm:1.4.0"],
["make-dir", "npm:3.1.0"],
["schema-utils", "npm:2.7.1"],
["webpack", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:5.59.1"]
],
"packagePeers": [
"@babel/core",
"@types/babel__core",
"@types/webpack",
"webpack"
],
"linkType": "HARD",
}],
["virtual:dddca670fd0b7758fb2e1b1a3e18ac7ebd1ecd06ecdd7acec2b78bccf1d35802cb22904bfbb233b16515a81f5cb819421786d20887823d98022b367036c1ad51#npm:8.2.3", {
"packageLocation": "./.yarn/__virtual__/babel-loader-virtual-2af43e9687/0/cache/babel-loader-npm-8.2.3-855681b984-78e1e1a919.zip/node_modules/babel-loader/",
"packageDependencies": [
@ -9320,17 +9229,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["babel-plugin-import", [
["npm:1.13.3", {
"packageLocation": "./.yarn/cache/babel-plugin-import-npm-1.13.3-498736f60a-1be664a34f.zip/node_modules/babel-plugin-import/",
"packageDependencies": [
["babel-plugin-import", "npm:1.13.3"],
["@babel/helper-module-imports", "npm:7.15.4"],
["@babel/runtime", "npm:7.15.4"]
],
"linkType": "HARD",
}]
]],
["babel-plugin-istanbul", [
["npm:6.1.1", {
"packageLocation": "./.yarn/cache/babel-plugin-istanbul-npm-6.1.1-df824055e4-cb4fd95738.zip/node_modules/babel-plugin-istanbul/",
@ -10541,20 +10439,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],
"linkType": "HARD",
}],
["virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:4.0.0", {
"packageLocation": "./.yarn/__virtual__/clean-webpack-plugin-virtual-2801ccda56/0/cache/clean-webpack-plugin-npm-4.0.0-5a85c794c8-199425e87b.zip/node_modules/clean-webpack-plugin/",
"packageDependencies": [
["clean-webpack-plugin", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:4.0.0"],
["@types/webpack", null],
["del", "npm:4.1.1"],
["webpack", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:5.59.1"]
],
"packagePeers": [
"@types/webpack",
"webpack"
],
"linkType": "HARD",
}],
["virtual:dddca670fd0b7758fb2e1b1a3e18ac7ebd1ecd06ecdd7acec2b78bccf1d35802cb22904bfbb233b16515a81f5cb819421786d20887823d98022b367036c1ad51#npm:4.0.0", {
"packageLocation": "./.yarn/__virtual__/clean-webpack-plugin-virtual-3d7fd34056/0/cache/clean-webpack-plugin-npm-4.0.0-5a85c794c8-199425e87b.zip/node_modules/clean-webpack-plugin/",
"packageDependencies": [
@ -10817,6 +10701,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],
"linkType": "HARD",
}],
["npm:5.1.0", {
"packageLocation": "./.yarn/cache/commander-npm-5.1.0-7e939e7832-0b7fec1712.zip/node_modules/commander/",
"packageDependencies": [
["commander", "npm:5.1.0"]
],
"linkType": "HARD",
}],
["npm:7.2.0", {
"packageLocation": "./.yarn/cache/commander-npm-7.2.0-19178180f8-53501cbeee.zip/node_modules/commander/",
"packageDependencies": [
@ -11401,27 +11292,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],
"linkType": "HARD",
}],
["virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:6.4.0", {
"packageLocation": "./.yarn/__virtual__/css-loader-virtual-7fd4aca2c1/0/cache/css-loader-npm-6.4.0-b541b3e985-e842905fce.zip/node_modules/css-loader/",
"packageDependencies": [
["css-loader", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:6.4.0"],
["@types/webpack", null],
["icss-utils", "virtual:cdc7fe25a42c1c915a3e2cc1d88a6050af31a566c30884dc9e8d0b1aaf72e44c7b8a5b00c55ce4e836b23b713118e647ce0fa2afc6c89d1a011289495565f043#npm:5.1.0"],
["postcss", "npm:8.3.11"],
["postcss-modules-extract-imports", "virtual:cdc7fe25a42c1c915a3e2cc1d88a6050af31a566c30884dc9e8d0b1aaf72e44c7b8a5b00c55ce4e836b23b713118e647ce0fa2afc6c89d1a011289495565f043#npm:3.0.0"],
["postcss-modules-local-by-default", "virtual:cdc7fe25a42c1c915a3e2cc1d88a6050af31a566c30884dc9e8d0b1aaf72e44c7b8a5b00c55ce4e836b23b713118e647ce0fa2afc6c89d1a011289495565f043#npm:4.0.0"],
["postcss-modules-scope", "virtual:cdc7fe25a42c1c915a3e2cc1d88a6050af31a566c30884dc9e8d0b1aaf72e44c7b8a5b00c55ce4e836b23b713118e647ce0fa2afc6c89d1a011289495565f043#npm:3.0.0"],
["postcss-modules-values", "virtual:cdc7fe25a42c1c915a3e2cc1d88a6050af31a566c30884dc9e8d0b1aaf72e44c7b8a5b00c55ce4e836b23b713118e647ce0fa2afc6c89d1a011289495565f043#npm:4.0.0"],
["postcss-value-parser", "npm:4.1.0"],
["semver", "npm:7.3.5"],
["webpack", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:5.59.1"]
],
"packagePeers": [
"@types/webpack",
"webpack"
],
"linkType": "HARD",
}],
["virtual:dddca670fd0b7758fb2e1b1a3e18ac7ebd1ecd06ecdd7acec2b78bccf1d35802cb22904bfbb233b16515a81f5cb819421786d20887823d98022b367036c1ad51#npm:6.4.0", {
"packageLocation": "./.yarn/__virtual__/css-loader-virtual-cdc7fe25a4/0/cache/css-loader-npm-6.4.0-b541b3e985-e842905fce.zip/node_modules/css-loader/",
"packageDependencies": [
@ -14846,13 +14716,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["highlight.js", "npm:10.7.3"]
],
"linkType": "HARD",
}],
["npm:9.18.5", {
"packageLocation": "./.yarn/unplugged/highlight.js-npm-9.18.5-571500f48d/node_modules/highlight.js/",
"packageDependencies": [
["highlight.js", "npm:9.18.5"]
],
"linkType": "HARD",
}]
]],
["history", [
@ -15027,24 +14890,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],
"linkType": "HARD",
}],
["virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:5.4.0", {
"packageLocation": "./.yarn/__virtual__/html-webpack-plugin-virtual-6821d27cf9/0/cache/html-webpack-plugin-npm-5.4.0-190e4589f6-4963e1955d.zip/node_modules/html-webpack-plugin/",
"packageDependencies": [
["html-webpack-plugin", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:5.4.0"],
["@types/html-minifier-terser", "npm:6.0.0"],
["@types/webpack", null],
["html-minifier-terser", "npm:6.0.2"],
["lodash", "npm:4.17.21"],
["pretty-error", "npm:3.0.4"],
["tapable", "npm:2.2.1"],
["webpack", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:5.59.1"]
],
"packagePeers": [
"@types/webpack",
"webpack"
],
"linkType": "HARD",
}],
["virtual:dddca670fd0b7758fb2e1b1a3e18ac7ebd1ecd06ecdd7acec2b78bccf1d35802cb22904bfbb233b16515a81f5cb819421786d20887823d98022b367036c1ad51#npm:5.4.0", {
"packageLocation": "./.yarn/__virtual__/html-webpack-plugin-virtual-fcd86b7f9f/0/cache/html-webpack-plugin-npm-5.4.0-190e4589f6-4963e1955d.zip/node_modules/html-webpack-plugin/",
"packageDependencies": [
@ -17449,24 +17294,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"webpack"
],
"linkType": "HARD",
}],
["virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:10.2.0", {
"packageLocation": "./.yarn/__virtual__/less-loader-virtual-90ae046641/0/cache/less-loader-npm-10.2.0-9c6619a5c0-42a2b56a9d.zip/node_modules/less-loader/",
"packageDependencies": [
["less-loader", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:10.2.0"],
["@types/less", null],
["@types/webpack", null],
["klona", "npm:2.0.4"],
["less", "npm:4.1.2"],
["webpack", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:5.59.1"]
],
"packagePeers": [
"@types/less",
"@types/webpack",
"less",
"webpack"
],
"linkType": "HARD",
}]
]],
["leven", [
@ -19657,6 +19484,31 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["nunjucks", [
["npm:3.2.3", {
"packageLocation": "./.yarn/cache/nunjucks-npm-3.2.3-ae8b5fd14c-9d0125acf9.zip/node_modules/nunjucks/",
"packageDependencies": [
["nunjucks", "npm:3.2.3"]
],
"linkType": "SOFT",
}],
["virtual:e63ad9bfa6ec53905cba84fb75f4e50334e3a53802ae3db1253f0c0ffaa0b90dd4a8266023fa69cfaf46281a2d69949c0e5f69029277d4d1fddfbbc9c01e4d03#npm:3.2.3", {
"packageLocation": "./.yarn/__virtual__/nunjucks-virtual-45061312a7/0/cache/nunjucks-npm-3.2.3-ae8b5fd14c-9d0125acf9.zip/node_modules/nunjucks/",
"packageDependencies": [
["nunjucks", "virtual:e63ad9bfa6ec53905cba84fb75f4e50334e3a53802ae3db1253f0c0ffaa0b90dd4a8266023fa69cfaf46281a2d69949c0e5f69029277d4d1fddfbbc9c01e4d03#npm:3.2.3"],
["@types/chokidar", null],
["a-sync-waterfall", "npm:1.0.1"],
["asap", "npm:2.0.6"],
["chokidar", null],
["commander", "npm:5.1.0"]
],
"packagePeers": [
"@types/chokidar",
"chokidar"
],
"linkType": "HARD",
}]
]],
["nwsapi", [
["npm:2.2.0", {
"packageLocation": "./.yarn/cache/nwsapi-npm-2.2.0-8f05590043-5ef4a9bc0c.zip/node_modules/nwsapi/",
@ -22964,34 +22816,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["react-syntax-highlight", [
["npm:15.3.1", {
"packageLocation": "./.yarn/cache/react-syntax-highlight-npm-15.3.1-d7cccdaa21-cada9bec5d.zip/node_modules/react-syntax-highlight/",
"packageDependencies": [
["react-syntax-highlight", "npm:15.3.1"]
],
"linkType": "SOFT",
}],
["virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:15.3.1", {
"packageLocation": "./.yarn/__virtual__/react-syntax-highlight-virtual-49f1718c5f/0/cache/react-syntax-highlight-npm-15.3.1-d7cccdaa21-cada9bec5d.zip/node_modules/react-syntax-highlight/",
"packageDependencies": [
["react-syntax-highlight", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:15.3.1"],
["@types/react", null],
["@types/react-dom", null],
["highlight.js", "npm:9.18.5"],
["prop-types", "npm:15.7.2"],
["react", "npm:18.0.0-alpha-327d5c484-20211106"],
["react-dom", "virtual:04055f037dce009b6d437327a3df2c0a05f0436e14e2b705672dd0d1e0a3dfd29d8d62e0db8cb7e152c4b95e36ad3ccd6a68c9e962121dec9e597b25e0481519#npm:18.0.0-alpha-327d5c484-20211106"]
],
"packagePeers": [
"@types/react-dom",
"@types/react",
"react-dom",
"react"
],
"linkType": "HARD",
}]
]],
["react-syntax-highlighter", [
["npm:15.4.4", {
"packageLocation": "./.yarn/cache/react-syntax-highlighter-npm-15.4.4-18a389dc78-18de0b279c.zip/node_modules/react-syntax-highlighter/",
@ -24899,19 +24723,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],
"linkType": "HARD",
}],
["virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:3.3.1", {
"packageLocation": "./.yarn/__virtual__/style-loader-virtual-2003c34588/0/cache/style-loader-npm-3.3.1-4bbb6ec77f-470feef680.zip/node_modules/style-loader/",
"packageDependencies": [
["style-loader", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:3.3.1"],
["@types/webpack", null],
["webpack", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:5.59.1"]
],
"packagePeers": [
"@types/webpack",
"webpack"
],
"linkType": "HARD",
}],
["virtual:dddca670fd0b7758fb2e1b1a3e18ac7ebd1ecd06ecdd7acec2b78bccf1d35802cb22904bfbb233b16515a81f5cb819421786d20887823d98022b367036c1ad51#npm:3.3.1", {
"packageLocation": "./.yarn/__virtual__/style-loader-virtual-6eab0032f8/0/cache/style-loader-npm-3.3.1-4bbb6ec77f-470feef680.zip/node_modules/style-loader/",
"packageDependencies": [
@ -25409,37 +25220,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"webpack"
],
"linkType": "HARD",
}],
["virtual:ff7dd4933e0aec384cd97caae1562c0fa533c08c8b5e437b9eabe8a77fb26b0214d54dd5af99747631610ae2e2bcbe33711254b651cc1ac0aa3865234aea5187#npm:5.2.4", {
"packageLocation": "./.yarn/__virtual__/terser-webpack-plugin-virtual-77b200190e/0/cache/terser-webpack-plugin-npm-5.2.4-cc8bd7c055-ddbcdd28f9.zip/node_modules/terser-webpack-plugin/",
"packageDependencies": [
["terser-webpack-plugin", "virtual:ff7dd4933e0aec384cd97caae1562c0fa533c08c8b5e437b9eabe8a77fb26b0214d54dd5af99747631610ae2e2bcbe33711254b651cc1ac0aa3865234aea5187#npm:5.2.4"],
["@swc/core", null],
["@types/esbuild", null],
["@types/swc__core", null],
["@types/uglify-js", null],
["@types/webpack", null],
["esbuild", null],
["jest-worker", "npm:27.3.1"],
["p-limit", "npm:3.1.0"],
["schema-utils", "npm:3.1.1"],
["serialize-javascript", "npm:6.0.0"],
["source-map", "npm:0.6.1"],
["terser", "npm:5.9.0"],
["uglify-js", null],
["webpack", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:5.59.1"]
],
"packagePeers": [
"@swc/core",
"@types/esbuild",
"@types/swc__core",
"@types/uglify-js",
"@types/webpack",
"esbuild",
"uglify-js",
"webpack"
],
"linkType": "HARD",
}]
]],
["test-exclude", [
@ -26702,43 +26482,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],
"linkType": "HARD",
}],
["virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:5.59.1", {
"packageLocation": "./.yarn/__virtual__/webpack-virtual-ff7dd4933e/0/cache/webpack-npm-5.59.1-4496e1cd5a-6a24f71b64.zip/node_modules/webpack/",
"packageDependencies": [
["webpack", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:5.59.1"],
["@types/eslint-scope", "npm:3.7.1"],
["@types/estree", "npm:0.0.50"],
["@types/webpack-cli", null],
["@webassemblyjs/ast", "npm:1.11.1"],
["@webassemblyjs/wasm-edit", "npm:1.11.1"],
["@webassemblyjs/wasm-parser", "npm:1.11.1"],
["acorn", "npm:8.5.0"],
["acorn-import-assertions", "virtual:bb1d7c4b2aab49ae14f02519d8d46de9e4793f1ebd19ee23b76124f9db9d9ca8bec08fb45808252f620b9cf35410eb0ca7a2532357684b305fdec22aabb75ae6#npm:1.8.0"],
["browserslist", "npm:4.17.5"],
["chrome-trace-event", "npm:1.0.3"],
["enhanced-resolve", "npm:5.8.3"],
["es-module-lexer", "npm:0.9.3"],
["eslint-scope", "npm:5.1.1"],
["events", "npm:3.3.0"],
["glob-to-regexp", "npm:0.4.1"],
["graceful-fs", "npm:4.2.8"],
["json-parse-better-errors", "npm:1.0.2"],
["loader-runner", "npm:4.2.0"],
["mime-types", "npm:2.1.33"],
["neo-async", "npm:2.6.2"],
["schema-utils", "npm:3.1.1"],
["tapable", "npm:2.2.1"],
["terser-webpack-plugin", "virtual:ff7dd4933e0aec384cd97caae1562c0fa533c08c8b5e437b9eabe8a77fb26b0214d54dd5af99747631610ae2e2bcbe33711254b651cc1ac0aa3865234aea5187#npm:5.2.4"],
["watchpack", "npm:2.2.0"],
["webpack-cli", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:4.9.1"],
["webpack-sources", "npm:3.2.1"]
],
"packagePeers": [
"@types/webpack-cli",
"webpack-cli"
],
"linkType": "HARD",
}],
["virtual:5530fb2f78bdcac4cb19ba3a563bd7922f9ce4bbd52ce8b4a756e29c4126b22271a917e55c981a4204cf762649c40aa32df13b924608cade4f2850397a837b5b#npm:5.60.0", {
"packageLocation": "./.yarn/__virtual__/webpack-virtual-b8183ce48c/0/cache/webpack-npm-5.60.0-4763b66d54-3c37424516.zip/node_modules/webpack/",
"packageDependencies": [
@ -26900,47 +26643,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],
"linkType": "HARD",
}],
["virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:4.9.1", {
"packageLocation": "./.yarn/__virtual__/webpack-cli-virtual-36c2bdf33b/0/cache/webpack-cli-npm-4.9.1-1b8a5f360f-2aff0349c1.zip/node_modules/webpack-cli/",
"packageDependencies": [
["webpack-cli", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:4.9.1"],
["@discoveryjs/json-ext", "npm:0.5.5"],
["@types/webpack", null],
["@types/webpack-bundle-analyzer", null],
["@types/webpack-cli__generators", null],
["@types/webpack-cli__migrate", null],
["@types/webpack-dev-server", null],
["@webpack-cli/configtest", "virtual:36c2bdf33be5abed551d78782bb3a5c3c37b72e65c84f819049f6eefc3c639fe3b76bf2a992a0ee5282742eb654fa11e8a7cf1f988c39c2874d4e5989f96a83d#npm:1.1.0"],
["@webpack-cli/generators", null],
["@webpack-cli/info", "virtual:36c2bdf33be5abed551d78782bb3a5c3c37b72e65c84f819049f6eefc3c639fe3b76bf2a992a0ee5282742eb654fa11e8a7cf1f988c39c2874d4e5989f96a83d#npm:1.4.0"],
["@webpack-cli/migrate", null],
["@webpack-cli/serve", "virtual:36c2bdf33be5abed551d78782bb3a5c3c37b72e65c84f819049f6eefc3c639fe3b76bf2a992a0ee5282742eb654fa11e8a7cf1f988c39c2874d4e5989f96a83d#npm:1.6.0"],
["colorette", "npm:2.0.16"],
["commander", "npm:7.2.0"],
["execa", "npm:5.1.1"],
["fastest-levenshtein", "npm:1.0.12"],
["import-local", "npm:3.0.3"],
["interpret", "npm:2.2.0"],
["rechoir", "npm:0.7.1"],
["webpack", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:5.59.1"],
["webpack-bundle-analyzer", null],
["webpack-dev-server", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:4.3.1"],
["webpack-merge", "npm:5.8.0"]
],
"packagePeers": [
"@types/webpack-bundle-analyzer",
"@types/webpack-cli__generators",
"@types/webpack-cli__migrate",
"@types/webpack-dev-server",
"@types/webpack",
"@webpack-cli/generators",
"@webpack-cli/migrate",
"webpack-bundle-analyzer",
"webpack-dev-server",
"webpack"
],
"linkType": "HARD",
}],
["virtual:dddca670fd0b7758fb2e1b1a3e18ac7ebd1ecd06ecdd7acec2b78bccf1d35802cb22904bfbb233b16515a81f5cb819421786d20887823d98022b367036c1ad51#npm:4.9.1", {
"packageLocation": "./.yarn/__virtual__/webpack-cli-virtual-9d6de49a7b/0/cache/webpack-cli-npm-4.9.1-1b8a5f360f-2aff0349c1.zip/node_modules/webpack-cli/",
"packageDependencies": [
@ -26991,24 +26693,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],
"linkType": "SOFT",
}],
["virtual:05048fd4ff5baaedc11111d294f7f745baed2d3719a140f98172fdae30def5a186f20856b73a983079af6152e97c85b64b14ccd6b58185c50ef49726edf1c5c4#npm:5.2.1", {
"packageLocation": "./.yarn/__virtual__/webpack-dev-middleware-virtual-c0e806acf1/0/cache/webpack-dev-middleware-npm-5.2.1-8933c4e1b9-06f3ef14ec.zip/node_modules/webpack-dev-middleware/",
"packageDependencies": [
["webpack-dev-middleware", "virtual:05048fd4ff5baaedc11111d294f7f745baed2d3719a140f98172fdae30def5a186f20856b73a983079af6152e97c85b64b14ccd6b58185c50ef49726edf1c5c4#npm:5.2.1"],
["@types/webpack", null],
["colorette", "npm:2.0.16"],
["memfs", "npm:3.3.0"],
["mime-types", "npm:2.1.33"],
["range-parser", "npm:1.2.1"],
["schema-utils", "npm:3.1.1"],
["webpack", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:5.59.1"]
],
"packagePeers": [
"@types/webpack",
"webpack"
],
"linkType": "HARD",
}],
["virtual:5530fb2f78bdcac4cb19ba3a563bd7922f9ce4bbd52ce8b4a756e29c4126b22271a917e55c981a4204cf762649c40aa32df13b924608cade4f2850397a837b5b#npm:5.2.1", {
"packageLocation": "./.yarn/__virtual__/webpack-dev-middleware-virtual-30d942e78d/0/cache/webpack-dev-middleware-npm-5.2.1-8933c4e1b9-06f3ef14ec.zip/node_modules/webpack-dev-middleware/",
"packageDependencies": [
@ -27095,48 +26779,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],
"linkType": "HARD",
}],
["virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:4.3.1", {
"packageLocation": "./.yarn/__virtual__/webpack-dev-server-virtual-05048fd4ff/0/cache/webpack-dev-server-npm-4.3.1-de78d1d07b-ce9d054c3d.zip/node_modules/webpack-dev-server/",
"packageDependencies": [
["webpack-dev-server", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:4.3.1"],
["@types/webpack", null],
["@types/webpack-cli", null],
["ansi-html-community", "npm:0.0.8"],
["bonjour", "npm:3.5.0"],
["chokidar", "npm:3.5.2"],
["colorette", "npm:2.0.16"],
["compression", "npm:1.7.4"],
["connect-history-api-fallback", "npm:1.6.0"],
["del", "npm:6.0.0"],
["express", "npm:4.17.1"],
["graceful-fs", "npm:4.2.8"],
["html-entities", "npm:2.3.2"],
["http-proxy-middleware", "npm:2.0.1"],
["internal-ip", "npm:6.2.0"],
["ipaddr.js", "npm:2.0.1"],
["open", "npm:8.4.0"],
["p-retry", "npm:4.6.1"],
["portfinder", "npm:1.0.28"],
["schema-utils", "npm:3.1.1"],
["selfsigned", "npm:1.10.11"],
["serve-index", "npm:1.9.1"],
["sockjs", "npm:0.3.21"],
["spdy", "npm:4.0.2"],
["strip-ansi", "npm:7.0.1"],
["url", "npm:0.11.0"],
["webpack", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:5.59.1"],
["webpack-cli", "virtual:54dfdd95092c538917b1daf717721dd3beca716f0768958f8123e1439693d909b26a74c88b3fb65b402559e626be2accab32554fb8a3874e699047fe18793f5e#npm:4.9.1"],
["webpack-dev-middleware", "virtual:05048fd4ff5baaedc11111d294f7f745baed2d3719a140f98172fdae30def5a186f20856b73a983079af6152e97c85b64b14ccd6b58185c50ef49726edf1c5c4#npm:5.2.1"],
["ws", "virtual:d418aa2fd3802396a3609011c8ddf4cffd0e5efa5929deb4f0d8555ef5db38841661fb6661806d305a1a3864ea34fb6f13cc13bf523dea3c628a9df083557e85#npm:8.2.3"]
],
"packagePeers": [
"@types/webpack-cli",
"@types/webpack",
"webpack-cli",
"webpack"
],
"linkType": "HARD",
}],
["virtual:b53a04db2373b409d0dea1659b79650c16947c7d2b7dd5333d6e7e6bf5908028be532ed8184cb174bc43e32bc4e7857e66233e00018f041b65ac0c42636866a2#npm:4.3.1", {
"packageLocation": "./.yarn/__virtual__/webpack-dev-server-virtual-5530fb2f78/0/cache/webpack-dev-server-npm-4.3.1-de78d1d07b-ce9d054c3d.zip/node_modules/webpack-dev-server/",
"packageDependencies": [

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -14,17 +14,14 @@
limitations under the License.
*/
import React from 'react';
import createReadConfigFile from './readConfigFile.js';
const Block = ({ pageContext, lowdefy }) => {
const { pageConfig } = pageContext;
const Comp = lowdefy.Components[pageConfig.type];
return (
<>
<div>{JSON.stringify(pageConfig)}</div>
<Comp properties={pageConfig.properties} />
</>
);
};
async function createApiContext({ buildDirectory }) {
const readConfigFile = createReadConfigFile({ buildDirectory });
return {
authorize: () => true,
readConfigFile,
};
}
export default Block;
export default createApiContext;

View File

@ -15,7 +15,8 @@
*/
import path from 'path';
import { cachedPromises, getFileExtension, readFile } from '@lowdefy/node-utils';
import { cachedPromises } from '@lowdefy/helpers';
import { getFileExtension, readFile } from '@lowdefy/node-utils';
function createReadConfigFile({ buildDirectory }) {
async function readConfigFile(filePath) {

View File

@ -14,6 +14,7 @@
limitations under the License.
*/
import createApiContext from './context/createApiContext.js';
import createContext from './context/createContext.js';
import getHomePageId from './routes/rootConfig/getHomePageId.js';
import getPageConfig from './routes/page/getPageConfig.js';
@ -32,8 +33,7 @@ import {
} from './context/errors.js';
export {
AuthenticationError,
ConfigurationError,
createApiContext,
createContext,
getHomePageId,
getPageConfig,
@ -41,8 +41,10 @@ export {
openIdCallback,
openIdLogoutUrl,
request,
RequestError,
rootConfig,
AuthenticationError,
ConfigurationError,
RequestError,
ServerError,
TokenExpiredError,
};

View File

@ -26,7 +26,10 @@
"url": "https://github.com/lowdefy/lowdefy.git"
},
"type": "module",
"exports": "./dist/index.js",
"exports": {
".": "./dist/index.js",
"./blocks/*": "./dist/blocks/*"
},
"files": [
"dist/*"
],

View File

@ -15,7 +15,8 @@
*/
import path from 'path';
import { cachedPromises, readFile } from '@lowdefy/node-utils';
import { cachedPromises } from '@lowdefy/helpers';
import { readFile } from '@lowdefy/node-utils';
function createReadConfigFile({ configDirectory }) {
async function readConfigFile(filePath) {

View File

@ -20,10 +20,8 @@ import { readFile } from '@lowdefy/node-utils';
import createReadConfigFile from './readConfigFile.js';
jest.mock('@lowdefy/node-utils', () => {
const originalModule = jest.requireActual('@lowdefy/node-utils');
return {
readFile: jest.fn(),
cachedPromises: originalModule.cachedPromises,
};
});

View File

@ -133,7 +133,7 @@ class Actions {
index,
};
}
const { output: parsedAction, errors: parserErrors } = this.context.parser.parse({
const { output: parsedAction, errors: parserErrors } = this.context._internal.parser.parse({
actions: responses,
event,
arrayIndices,
@ -164,7 +164,7 @@ class Actions {
});
} catch (error) {
responses[action.id] = { error, index, type: action.type };
const { output: parsedMessages, errors: parserErrors } = this.context.parser.parse({
const { output: parsedMessages, errors: parserErrors } = this.context._internal.parser.parse({
actions: responses,
event,
arrayIndices,
@ -201,7 +201,7 @@ class Actions {
displayMessage({ defaultMessage, duration, hideExplicitly, message, status }) {
let close = () => undefined;
if ((hideExplicitly && message !== false) || (!hideExplicitly && !type.isNone(message))) {
close = this.context.lowdefy.displayMessage({
close = this.context._internal.lowdefy.displayMessage({
content: type.isString(message) ? message : defaultMessage,
duration,
status,

View File

@ -70,7 +70,7 @@ class Blocks {
block.id = this.generateBlockId(block.blockIdPattern);
block.fieldPattern = block.field;
block.blockId = applyArrayIndices(this.arrayIndices, block.blockIdPattern);
this.context.RootBlocks.map[block.blockId] = block;
this.context._internal.RootBlocks.map[block.blockId] = block;
block.field = !type.isNone(block.fieldPattern)
? applyArrayIndices(this.arrayIndices, block.fieldPattern)
: block.blockId;
@ -127,11 +127,11 @@ class Blocks {
this.subBlocks[block.id].unshift(
this.newBlocks({ arrayIndices: this.arrayIndices.concat([0]), block, initState: {} })
);
this.context.State.set(block.field, undefined);
this.context._internal.State.set(block.field, undefined);
// set block and subBlock values undefined, so as not to pass values to new blocks
this.subBlocks[block.id][0].recSetUndefined();
block.update = true;
this.context.update();
this.context._internal.update();
};
block.pushItem = () => {
@ -143,11 +143,11 @@ class Blocks {
})
);
block.update = true;
this.context.update();
this.context._internal.update();
};
block.removeItem = (index) => {
this.context.State.removeItem(block.blockId, index);
this.context._internal.State.removeItem(block.blockId, index);
const lastBlock = this.subBlocks[block.id][this.subBlocks[block.id].length - 1];
lastBlock.recRemoveBlocksFromMap();
const largerBlocks = this.subBlocks[block.id].slice(index + 1);
@ -160,12 +160,12 @@ class Blocks {
this.subBlocks[block.id].splice(index, 1);
block.update = true;
this.context.update();
this.context._internal.update();
};
block.moveItemUp = (index) => {
if (index === 0) return;
this.context.State.swapItems(block.blockId, index - 1, index);
this.context._internal.State.swapItems(block.blockId, index - 1, index);
this.subBlocks[block.id][index - 1].recUpdateArrayIndices(
this.arrayIndices.concat([index - 1]),
this.arrayIndices.concat([index])
@ -176,12 +176,12 @@ class Blocks {
);
swap(this.subBlocks[block.id], index - 1, index);
block.update = true;
this.context.update();
this.context._internal.update();
};
block.moveItemDown = (index) => {
if (index === this.subBlocks[block.id].length - 1) return;
this.context.State.swapItems(block.blockId, index, index + 1);
this.context._internal.State.swapItems(block.blockId, index, index + 1);
this.subBlocks[block.id][index + 1].recUpdateArrayIndices(
this.arrayIndices.concat([index + 1]),
this.arrayIndices.concat([index])
@ -192,16 +192,16 @@ class Blocks {
);
swap(this.subBlocks[block.id], index, index + 1);
block.update = true;
this.context.update();
this.context._internal.update();
};
}
if (get(block, 'meta.category') === 'input') {
block.setValue = (value) => {
block.value = type.enforceType(block.meta.valueType, value);
this.context.State.set(block.field, block.value);
this.context._internal.State.set(block.field, block.value);
block.update = true;
this.context.update();
this.context._internal.update();
};
}
@ -228,7 +228,7 @@ class Blocks {
blockValue = type.isUndefined(block.meta.initValue)
? type.enforceType(block.meta.valueType, null)
: block.meta.initValue;
this.context.State.set(block.field, block.value);
this.context._internal.State.set(block.field, block.value);
}
if (get(block, 'meta.category') === 'list') {
// load list value into list blocks
@ -302,7 +302,7 @@ class Blocks {
if (visibleParent === false) {
block.visibleEval.output = false;
} else {
block.visibleEval = this.context.parser.parse({
block.visibleEval = this.context._internal.parser.parse({
input: block.visible,
location: block.blockId,
arrayIndices: this.arrayIndices,
@ -313,12 +313,12 @@ class Blocks {
}
// only evaluate visible blocks
if (block.visibleEval.output !== false) {
block.propertiesEval = this.context.parser.parse({
block.propertiesEval = this.context._internal.parser.parse({
input: block.properties,
location: block.blockId,
arrayIndices: this.arrayIndices,
});
block.requiredEval = this.context.parser.parse({
block.requiredEval = this.context._internal.parser.parse({
input: block.required,
location: block.blockId,
arrayIndices: this.arrayIndices,
@ -343,7 +343,7 @@ class Blocks {
let validationError = false;
let validationWarning = false;
validation.forEach((test) => {
const parsed = this.context.parser.parse({
const parsed = this.context._internal.parser.parse({
input: test,
location: block.blockId,
arrayIndices: this.arrayIndices,
@ -378,17 +378,17 @@ class Blocks {
block.validationEval.output.status = 'error';
}
block.styleEval = this.context.parser.parse({
block.styleEval = this.context._internal.parser.parse({
input: block.style,
location: block.blockId,
arrayIndices: this.arrayIndices,
});
block.layoutEval = this.context.parser.parse({
block.layoutEval = this.context._internal.parser.parse({
input: block.layout,
location: block.blockId,
arrayIndices: this.arrayIndices,
});
block.areasLayoutEval = this.context.parser.parse({
block.areasLayoutEval = this.context._internal.parser.parse({
input: block.areasLayout,
location: block.blockId,
arrayIndices: this.arrayIndices,
@ -422,11 +422,14 @@ class Blocks {
});
} else {
toSet.add(block.field);
this.context.State.set(block.field, type.enforceType(block.meta.valueType, null));
this.context._internal.State.set(
block.field,
type.enforceType(block.meta.valueType, null)
);
}
} else if (get(block, 'meta.category') === 'input') {
toSet.add(block.field);
this.context.State.set(block.field, block.value);
this.context._internal.State.set(block.field, block.value);
}
} else if (get(block, 'meta.category') === 'container') {
this.subBlocks[block.id].forEach((blockClass) => {
@ -438,7 +441,7 @@ class Blocks {
});
toDelete.forEach((field) => {
if (!toSet.has(field)) {
this.context.State.del(field);
this.context._internal.State.del(field);
}
});
}
@ -471,7 +474,7 @@ class Blocks {
});
this.loopBlocks((block) => {
block.blockId = applyArrayIndices(this.arrayIndices, block.blockIdPattern);
this.context.RootBlocks.map[block.blockId] = block;
this.context._internal.RootBlocks.map[block.blockId] = block;
block.field = !type.isNone(block.fieldPattern)
? applyArrayIndices(this.arrayIndices, block.fieldPattern)
: block.blockId;
@ -510,7 +513,7 @@ class Blocks {
recSetUndefined() {
this.loopBlocks((block) => {
this.context.State.set(block.field, undefined);
this.context._internal.State.set(block.field, undefined);
});
Object.keys(this.subBlocks).forEach((subKey) => {
this.subBlocks[subKey].forEach((subBlock) => {
@ -521,7 +524,7 @@ class Blocks {
recRemoveBlocksFromMap() {
this.loopBlocks((block) => {
delete this.context.RootBlocks.map[block.blockId];
delete this.context._internal.RootBlocks.map[block.blockId];
});
Object.keys(this.subBlocks).forEach((subKey) => {
this.subBlocks[subKey].forEach((subBlock) => {
@ -584,7 +587,7 @@ class Blocks {
value: type.isNone(block.value) ? null : block.value,
visible: block.visibleEval.output,
};
this.context.lowdefy.updateBlock(block.id);
this.context._internal.lowdefy._internal.updateBlock(block.id);
}
});
Object.keys(this.subBlocks).forEach((subKey) => {
@ -603,7 +606,7 @@ class Blocks {
false
);
if (block.loading_prev !== block.loading) {
this.context.lowdefy.updateBlock(block.id);
this.context._internal.lowdefy._internal.updateBlock(block.id);
}
});
Object.keys(this.subBlocks).forEach((subKey) => {
@ -614,7 +617,8 @@ class Blocks {
}
generateBlockId(blockIdPattern) {
return `${this.context.pageId}:${blockIdPattern}:${Math.random()
// TODO: is rootId correct?
return `${this.context.rootId}:${blockIdPattern}:${Math.random()
.toString(36)
.replace(/[^a-z]+/g, '')
.substr(0, 5)}`;

View File

@ -71,10 +71,10 @@ class Events {
}
eventDescription.loading = true;
this.block.update = true;
this.context.update();
this.context._internal.update();
const actionHandle = async () => {
const res = await this.context.Actions.callActions({
const res = await this.context._internal.Actions.callActions({
actions: eventDescription.actions,
arrayIndices: this.arrayIndices,
block: this.block,
@ -86,7 +86,7 @@ class Events {
this.context.eventLog.unshift(res);
eventDescription.loading = false;
this.block.update = true;
this.context.update();
this.context._internal.update();
return res;
};

View File

@ -25,7 +25,7 @@ class Requests {
this.requestConfig = {};
(this.context.rootBlock.requests || []).forEach((request) => {
(this.context._internal.rootBlock.requests || []).forEach((request) => {
this.requestConfig[request.requestId] = request;
});
}
@ -92,7 +92,8 @@ class Requests {
try {
const response = await this.context.lowdefy.callRequest({
pageId: this.context.pageId,
// TODO:
pageId: this.context.rootId,
payload: serializer.serialize(payload),
requestId,
});

View File

@ -59,51 +59,54 @@ const blockData = ({
visible,
});
const getContext = async ({ page, lowdefy }) => {
if (!page) {
async function getContext({ config, lowdefy }) {
if (!config) {
throw new Error('A page must be provided to get context.');
}
const { pageId } = page;
if (lowdefy.contexts[pageId]) {
lowdefy.contexts[pageId].update();
return lowdefy.contexts[pageId];
const { id } = config;
if (lowdefy.contexts[id]) {
lowdefy.contexts[id]._internal.update();
return lowdefy.contexts[id];
}
if (!lowdefy.inputs[pageId]) {
lowdefy.inputs[pageId] = {};
if (!lowdefy.inputs[id]) {
lowdefy.inputs[id] = {};
}
const operatorsSet = new Set([...page.operators, '_not', '_type']);
lowdefy.contexts[pageId] = {
id: pageId,
pageId: pageId,
const operatorsSet = new Set([...config.operators, '_not', '_type']);
const ctx = {
id: id,
// TODO: What about app object?
rootId: config.pageId,
eventLog: [],
requests: {},
operators: [...operatorsSet],
lowdefy,
rootBlock: blockData(page), // filter block to prevent circular structure
state: {},
update: () => {}, // Initialize update since Requests might call it during context creation
_internal: {
lowdefy,
operators: [...operatorsSet],
rootBlock: blockData(config), // filter block to prevent circular structure
update: () => {}, // Initialize update since Requests might call it during context creation
},
};
const ctx = lowdefy.contexts[pageId];
ctx.parser = new WebParser({ context: ctx });
await ctx.parser.init();
ctx.State = new State(ctx);
ctx.Actions = new Actions(ctx);
ctx.Requests = new Requests(ctx);
// TODO: Remove "areas: { root: { blocks: [ctx.rootBlock] } },"
ctx.RootBlocks = new Blocks({
areas: { root: { blocks: [ctx.rootBlock] } },
const _internal = ctx._internal;
_internal.parser = new WebParser({ context: ctx });
await _internal.parser.init();
_internal.State = new State(ctx);
_internal.Actions = new Actions(ctx);
_internal.Requests = new Requests(ctx);
_internal.RootBlocks = new Blocks({
areas: { root: { blocks: [_internal.rootBlock] } },
context: ctx,
});
ctx.RootBlocks.init();
ctx.update = () => {
ctx.RootBlocks.update();
_internal.RootBlocks.init();
_internal.update = () => {
_internal.RootBlocks.update();
};
await ctx.RootBlocks.map[ctx.pageId].triggerEvent({ name: 'onInit' });
ctx.update();
ctx.State.freezeState();
ctx.RootBlocks.map[ctx.pageId].triggerEvent({ name: 'onInitAsync' });
await _internal.RootBlocks.map[ctx.rootId].triggerEvent({ name: 'onInit' });
_internal.update();
_internal.State.freezeState();
_internal.RootBlocks.map[ctx.rootId].triggerEvent({ name: 'onInitAsync' });
lowdefy.contexts[id] = ctx;
return ctx;
};
}
export default getContext;

View File

@ -15,6 +15,7 @@
*/
import applyArrayIndices from './applyArrayIndices.js';
import cachedPromises from './cachedPromises.js';
import get from './get.js';
import mergeObjects from './mergeObjects.js';
import omit from './omit.js';
@ -28,6 +29,7 @@ import urlQuery from './urlQuery.js';
export {
applyArrayIndices,
cachedPromises,
get,
mergeObjects,
omit,

View File

@ -25,15 +25,19 @@
"type": "git",
"url": "https://github.com/lowdefy/lowdefy.git"
},
"main": "dist/index.js",
"type": "module",
"exports": {
".": "./dist/index.js"
},
"files": [
"dist/*"
],
"scripts": {
"build": "babel src --out-dir dist",
"build": "yarn swc",
"clean": "rm -rf dist",
"prepare": "yarn build",
"start": "webpack serve",
"swc": "swc src --out-dir dist --config-file ../../.swcrc --delete-dir-on-start --copy-files",
"test": "jest --coverage"
},
"dependencies": {
@ -44,32 +48,18 @@
"react-dom": "18.0.0-alpha-327d5c484-20211106"
},
"devDependencies": {
"@babel/cli": "7.15.7",
"@babel/core": "7.15.8",
"@babel/preset-env": "7.15.8",
"@babel/preset-react": "7.14.5",
"@babel/preset-react": "7.16.0",
"@emotion/jest": "11.5.0",
"@lowdefy/block-dev": "3.22.0",
"@swc/cli": "0.1.51",
"@swc/core": "1.2.107",
"@swc/jest": "0.2.5",
"@testing-library/dom": "8.10.1",
"@testing-library/react": "12.1.2",
"babel-jest": "27.3.1",
"babel-loader": "8.2.3",
"babel-plugin-import": "1.13.3",
"clean-webpack-plugin": "4.0.0",
"css-loader": "6.4.0",
"html-webpack-plugin": "5.4.0",
"@testing-library/user-event": "13.5.0",
"jest": "27.3.1",
"jest-serializer-html": "7.1.0",
"jest-transform-yaml": "0.1.2",
"js-yaml": "4.1.0",
"less": "4.1.2",
"less-loader": "10.2.0",
"process": "0.11.10",
"react-markdown": "5.0.3",
"react-syntax-highlight": "15.3.1",
"style-loader": "3.3.1",
"webpack": "5.59.1",
"webpack-cli": "4.9.1",
"webpack-dev-server": "4.3.1",
"yaml-loader": "0.6.0"
"jest-transform-yaml": "0.1.2"
},
"publishConfig": {
"access": "public"

View File

@ -26,7 +26,10 @@
"url": "https://github.com/lowdefy/lowdefy.git"
},
"type": "module",
"exports": "./dist/index.js",
"exports": {
".": "./dist/index.js",
"./*": "./dist/*"
},
"files": [
"dist/*"
],

View File

@ -14,7 +14,6 @@
limitations under the License.
*/
import cachedPromises from './cachedPromises.js';
import cleanDirectory from './cleanDirectory.js';
import getConfigFromEnv from './getConfigFromEnv.js';
import getFileExtension, { getFileSubExtension } from './getFileExtension.js';
@ -23,7 +22,6 @@ import readFile from './readFile.js';
import writeFile from './writeFile.js';
export {
cachedPromises,
cleanDirectory,
getConfigFromEnv,
getFileExtension,

View File

@ -41,8 +41,8 @@
},
"dependencies": {
"@lowdefy/helpers": "3.22.0",
"chokidar": "3.5.2",
"moment": "2.29.1"
"moment": "2.29.1",
"nunjucks": "3.2.3"
},
"devDependencies": {
"@swc/cli": "0.1.51",

View File

@ -32,16 +32,16 @@ class WebParser {
}
async init() {
if (!type.isObject(this.context.lowdefy)) {
throw new Error('context.lowdefy must be an object.');
if (!type.isObject(this.context._internal.lowdefy)) {
throw new Error('context._internal.lowdefy must be an object.');
}
if (!type.isArray(this.context.operators)) {
throw new Error('context.operators must be an array.');
if (!type.isArray(this.context._internal.operators)) {
throw new Error('context._internal.operators must be an array.');
}
const operators = this.operators;
const operations = this.operations;
await Promise.all(
this.context.operators.map(async (operator) => {
this.context._internal.operators.map(async (operator) => {
if (operators[operator]) {
const fn = await import(`./${operators[operator]}.js`);
operations[operator] = fn.default;
@ -70,7 +70,7 @@ class WebParser {
throw new Error('Operator parser location must be a string.');
}
const errors = [];
const { inputs, lowdefyGlobal, menus, urlQuery, user } = context.lowdefy;
const { inputs, lowdefyGlobal, menus, urlQuery, user } = context._internal.lowdefy;
const reviver = (_, value) => {
if (type.isObject(value) && Object.keys(value).length === 1) {
const key = Object.keys(value)[0];

View File

@ -14,6 +14,20 @@ const lessConfig = withLess({
module.exports = {
...lessConfig,
reactStrictMode: true,
webpack: (config, { isServer }) => {
if (!isServer) {
config.resolve.fallback = {
buffer: false,
crypto: false,
events: false,
fs: false,
path: false,
process: false,
util: false,
};
}
return config;
},
// productionBrowserSourceMaps: true
// experimental: {
// concurrentFeatures: true,

View File

@ -37,8 +37,12 @@
},
"dependencies": {
"@lowdefy/api": "3.22.0",
"@lowdefy/block-utils": "3.22.0",
"@lowdefy/blocks-antd": "3.22.0",
"@lowdefy/blocks-basic": "3.22.0",
"@lowdefy/engine": "3.22.0",
"@lowdefy/helpers": "3.22.0",
"@lowdefy/node-utils": "3.22.0",
"@lowdefy/layout": "3.22.0",
"next": "12.0.3",
"next-auth": "4.0.0-beta.6",
"react": "18.0.0-alpha-327d5c484-20211106",

View File

@ -1,32 +0,0 @@
/*
Copyright 2020-2021 Lowdefy, Inc
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/* eslint-disable import/no-unresolved */
import dynamic from 'next/dynamic';
// import Button from '@lowdefy/blocks-antd/blocks/Button/Button.js';
// // ------------- GENERATED AT BUILD -------------
const Blocks = {
// Button,
// Label: dynamic(() => import('@lowdefy/blocks-antd/blocks/Label/Label.js'), { suspense: true }),
// TextInput: dynamic(() => import('@lowdefy/blocks-antd/blocks/TextInput/TextInput.js'), {
// suspense: true,
// }),
// Icon: dynamic(() => import('@lowdefy/blocks-antd/blocks/Icon/Icon.js'), { suspense: true }),
};
export default Blocks;

View File

@ -14,14 +14,13 @@
limitations under the License.
*/
import { useEffect, useState } from 'react';
// import getContext from '@lowdefy/engine';
import getPageContext from './getPageContext.js';
import React, { useEffect, useState } from 'react';
import getContext from '@lowdefy/engine';
// import MountEvents from './MountEvents';
const LoadingBlock = () => <div>Loading...</div>;
const Context = ({ children, lowdefy, pageConfig }) => {
const Context = ({ children, lowdefy, config }) => {
const [context, setContext] = useState({});
const [error, setError] = useState(null);
@ -29,15 +28,14 @@ const Context = ({ children, lowdefy, pageConfig }) => {
let mounted = true;
const mount = async () => {
try {
const ctx = await getPageContext({
pageConfig,
const ctx = await getContext({
config,
lowdefy,
});
if (mounted) {
setContext(ctx);
}
} catch (err) {
// ??
setError(err);
}
};
@ -45,12 +43,10 @@ const Context = ({ children, lowdefy, pageConfig }) => {
return () => {
mounted = false;
};
}, [pageConfig, lowdefy]);
}, [config, lowdefy]);
// ??
if (error) throw error;
if (context.id !== pageConfig.pageId) return <LoadingBlock />;
if (context.id !== config.id) return <LoadingBlock />;
return children(context);

View File

@ -14,19 +14,22 @@
limitations under the License.
*/
// import dynamic from 'next/dynamic';
import React from 'react';
import { useSession } from 'next-auth/react';
import Components from './Blocks.js';
import blockComponents from '../plugins/blocks.js';
const LowdefyContext = ({ children }) => {
const { data: session } = useSession();
console.log(session);
const lowdefy = {
Components,
pages: {},
updaters: {},
_internal: {
blockComponents,
updaters: {},
},
contexts: {},
inputs: {},
lowdefyGlobal: {},
};
lowdefy._internal.updateBlock = (blockId) =>
lowdefy._internal.updaters[blockId] && lowdefy._internal.updaters[blockId]();
return <>{children(lowdefy)}</>;
};

View File

@ -15,14 +15,21 @@
*/
import React from 'react';
import PageContext from './PageContext.js';
import Block from './Block.js';
import Context from './Context.js';
import Block from './block/Block.js';
const Page = ({ lowdefy, pageConfig }) => {
return (
<PageContext pageConfig={pageConfig} lowdefy={lowdefy}>
{(pageContext) => <Block pageContext={pageContext} lowdefy={lowdefy} />}
</PageContext>
<Context config={pageConfig} lowdefy={lowdefy}>
{(context) => (
<Block
block={context._internal.RootBlocks.map['home']}
Blocks={context._internal.RootBlocks}
context={context}
lowdefy={lowdefy}
/>
)}
</Context>
);
};

View File

@ -0,0 +1,57 @@
/*
Copyright 2020-2021 Lowdefy, Inc
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import React, { Suspense, useState } from 'react';
import { ErrorBoundary } from '@lowdefy/block-utils';
import CategorySwitch from './CategorySwitch.js';
import LoadingBlock from './LoadingBlock.js';
import MountEvents from './MountEvents.js';
const Block = ({ block, Blocks, context, isRoot, lowdefy }) => {
const [updates, setUpdate] = useState(0);
lowdefy._internal.updaters[block.id] = () => setUpdate(updates + 1);
return (
<ErrorBoundary>
<Suspense fallback={<LoadingBlock block={block} lowdefy={lowdefy} />}>
<MountEvents
asyncEventName="onMountAsync"
context={context}
eventName="onMount"
triggerEvent={block.triggerEvent}
>
{(loaded) =>
!loaded ? (
<LoadingBlock block={block} lowdefy={lowdefy} />
) : (
<CategorySwitch
block={block}
Blocks={Blocks}
context={context}
isRoot={isRoot}
lowdefy={lowdefy}
updates={updates}
/>
)
}
</MountEvents>
</Suspense>
</ErrorBoundary>
);
};
export default Block;

View File

@ -0,0 +1,118 @@
/*
Copyright 2020-2021 Lowdefy, Inc
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import React from 'react';
import { BlockLayout } from '@lowdefy/layout';
import { makeCssClass } from '@lowdefy/block-utils';
import Container from './Container.js';
import List from './List.js';
const CategorySwitch = ({ block, Blocks, context, lowdefy }) => {
if (!block.eval) return null; // Renderer updates before eval is executed for the first time on lists. See #520
if (block.eval.visible === false)
return <div id={`vs-${block.blockId}`} style={{ display: 'none' }} />;
const Component = lowdefy._internal.blockComponents[block.type];
switch (block.meta.category) {
case 'list':
return (
<List
block={block}
Blocks={Blocks}
Component={Component}
context={context}
lowdefy={lowdefy}
/>
);
case 'container':
return (
<Container
block={block}
Blocks={Blocks}
Component={Component}
context={context}
lowdefy={lowdefy}
/>
);
case 'input':
return (
<BlockLayout
id={`bl-${block.blockId}`}
blockStyle={block.eval.style}
highlightBorders={lowdefy.lowdefyGlobal.highlightBorders}
layout={block.eval.layout || {}}
makeCssClass={makeCssClass}
>
<Component
methods={Object.assign(block.methods, {
makeCssClass,
registerEvent: block.registerEvent,
registerMethod: block.registerMethod,
setValue: block.setValue,
triggerEvent: block.triggerEvent,
})}
// TODO: React throws a basePath warning
basePath={lowdefy.basePath}
blockId={block.blockId}
events={block.eval.events}
homePageId={lowdefy.homePageId}
key={block.blockId}
loading={block.loading}
menus={lowdefy.menus}
pageId={lowdefy.pageId}
properties={block.eval.properties}
required={block.eval.required}
user={lowdefy.user}
validation={block.eval.validation}
value={block.value}
/>
</BlockLayout>
);
default:
return (
<BlockLayout
id={`bl-${block.blockId}`}
blockStyle={block.eval.style}
highlightBorders={lowdefy.lowdefyGlobal.highlightBorders}
layout={block.eval.layout || {}}
makeCssClass={makeCssClass}
>
<Component
methods={Object.assign(block.methods, {
makeCssClass,
registerEvent: block.registerEvent,
registerMethod: block.registerMethod,
triggerEvent: block.triggerEvent,
})}
basePath={lowdefy.basePath}
blockId={block.blockId}
events={block.eval.events}
homePageId={lowdefy.homePageId}
key={block.blockId}
loading={block.loading}
menus={lowdefy.menus}
pageId={lowdefy.pageId}
properties={block.eval.properties}
required={block.eval.required}
user={lowdefy.user}
validation={block.eval.validation}
/>
</BlockLayout>
);
}
};
export default CategorySwitch;

View File

@ -0,0 +1,86 @@
/*
Copyright 2020-2021 Lowdefy, Inc
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import React from 'react';
import { Area, BlockLayout, layoutParamsToArea } from '@lowdefy/layout';
import { makeCssClass } from '@lowdefy/block-utils';
import Block from './Block.js';
const Container = ({ block, Blocks, Component, context, lowdefy }) => {
const content = {};
// eslint-disable-next-line prefer-destructuring
const areas = Blocks.subBlocks[block.id][0].areas;
Object.keys(areas).forEach((areaKey) => {
content[areaKey] = (areaStyle) => (
<Area
id={`ar-${block.blockId}-${areaKey}`}
key={`ar-${block.blockId}-${areaKey}`}
area={layoutParamsToArea({
area: block.eval.areas[areaKey] || {},
areaKey,
layout: block.eval.layout || {},
})}
areaStyle={[areaStyle, block.eval.areas[areaKey] && block.eval.areas[areaKey].style]}
highlightBorders={lowdefy.lowdefyGlobal.highlightBorders}
makeCssClass={makeCssClass}
>
{areas[areaKey].blocks.map((bl) => (
<Block
key={`co-${bl.blockId}`}
Blocks={Blocks.subBlocks[block.id][0]}
block={bl}
context={context}
lowdefy={lowdefy}
/>
))}
</Area>
);
});
return (
<BlockLayout
id={`bl-${block.blockId}`}
blockStyle={block.eval.style}
highlightBorders={lowdefy.lowdefyGlobal.highlightBorders}
layout={block.eval.layout || {}}
makeCssClass={makeCssClass}
>
<Component
methods={Object.assign(block.methods, {
makeCssClass,
registerEvent: block.registerEvent,
registerMethod: block.registerMethod,
triggerEvent: block.triggerEvent,
})}
basePath={lowdefy.basePath}
blockId={block.blockId}
content={content}
events={block.eval.events}
homePageId={lowdefy.homePageId}
key={block.blockId}
loading={block.loading}
menus={lowdefy.menus}
pageId={lowdefy.pageId}
properties={block.eval.properties}
required={block.eval.required}
user={lowdefy.user}
validation={block.eval.validation}
/>
</BlockLayout>
);
};
export default Container;

View File

@ -0,0 +1,93 @@
/*
Copyright 2020-2021 Lowdefy, Inc
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import React from 'react';
import { Area, BlockLayout, layoutParamsToArea } from '@lowdefy/layout';
import { makeCssClass } from '@lowdefy/block-utils';
import Block from './Block.js';
const List = ({ block, Blocks, Component, context, lowdefy }) => {
const content = {};
const contentList = [];
Blocks.subBlocks[block.id].forEach((SBlock) => {
Object.keys(SBlock.areas).forEach((areaKey) => {
content[areaKey] = (areaStyle) => (
<Area
id={`ar-${block.blockId}-${SBlock.id}-${areaKey}`}
key={`ar-${block.blockId}-${SBlock.id}-${areaKey}`}
area={layoutParamsToArea({
area: block.eval.areas[areaKey] || {},
areaKey,
layout: block.eval.layout || {},
})}
areaStyle={[areaStyle, block.eval.areas[areaKey] && block.eval.areas[areaKey].style]}
highlightBorders={lowdefy.lowdefyGlobal.highlightBorders}
makeCssClass={makeCssClass}
>
{SBlock.areas[areaKey].blocks.map((bl) => (
<Block
key={`ls-${bl.blockId}`}
Blocks={SBlock}
block={bl}
context={context}
lowdefy={lowdefy}
/>
))}
</Area>
);
});
contentList.push({ ...content });
});
return (
<BlockLayout
id={`bl-${block.blockId}`}
blockStyle={block.eval.style}
highlightBorders={lowdefy.lowdefyGlobal.highlightBorders}
layout={block.eval.layout || {}}
makeCssClass={makeCssClass}
>
<Component
methods={Object.assign(block.methods, {
makeCssClass,
moveItemDown: block.moveItemDown,
moveItemUp: block.moveItemUp,
pushItem: block.pushItem,
registerEvent: block.registerEvent,
registerMethod: block.registerMethod,
removeItem: block.removeItem,
triggerEvent: block.triggerEvent,
unshiftItem: block.unshiftItem,
})}
basePath={lowdefy.basePath}
blockId={block.blockId}
events={block.eval.events}
homePageId={lowdefy.homePageId}
key={block.blockId}
list={contentList}
loading={block.loading}
menus={lowdefy.menus}
pageId={lowdefy.pageId}
properties={block.eval.properties}
required={block.eval.required}
user={lowdefy.user}
validation={block.eval.validation}
/>
</BlockLayout>
);
};
export default List;

View File

@ -0,0 +1,22 @@
import React from 'react';
// import { Loading, makeCssClass } from '@lowdefy/block-utils';
// import { get } from '@lowdefy/helpers';
// import { BlockLayout } from '@lowdefy/layout';
const LoadingBlock = ({ block, lowdefy }) => (
<div>LoadingBlock</div>
// <BlockLayout
// id={`bl-loading-${block.blockId}`}
// blockStyle={get(block, 'eval.style') || get(block, 'meta.loading.style', { default: {} })}
// highlightBorders={lowdefy.lowdefyGlobal.highlightBorders}
// layout={get(block, 'eval.layout') || get(block, 'meta.loading.layout', { default: {} })}
// makeCssClass={makeCssClass}
// >
// <Loading
// properties={get(block, 'meta.loading.properties')}
// type={get(block, 'meta.loading.type')}
// />
// </BlockLayout>
);
export default LoadingBlock;

View File

@ -0,0 +1,48 @@
/*
Copyright 2020-2021 Lowdefy, Inc
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import React, { useEffect, useState } from 'react';
const MountEvents = ({ asyncEventName, context, eventName, triggerEvent, children }) => {
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
let mounted = true;
const mount = async () => {
try {
await triggerEvent({ name: eventName, context });
if (mounted) {
triggerEvent({ name: asyncEventName, context });
setLoading(false);
}
} catch (err) {
setError(err);
}
};
mount();
return () => {
mounted = false;
};
}, [context]);
if (error) throw error;
if (loading) return <>{children(false)}</>;
return <>{children(true)}</>;
};
export default MountEvents;

View File

@ -1,36 +0,0 @@
/*
Copyright 2020-2021 Lowdefy, Inc
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
function getPageContext({ pageConfig, lowdefy }) {
if (!pageConfig) {
throw new Error('A page must be provided to get context.');
}
const { pageId } = pageConfig;
if (lowdefy.pages[pageId]) {
return lowdefy.pages[pageId];
}
lowdefy.pages[pageId] = {
id: pageId,
pageId: pageId,
update: () => {},
pageConfig,
};
const ctx = lowdefy.pages[pageId];
return ctx;
}
export default getPageContext;

View File

@ -14,14 +14,14 @@
limitations under the License.
*/
import getPageConfig from '@lowdefy/api/routes/page/getPageConfig.js';
import createContext from '@lowdefy/api/context/createContext.js';
import createApiContext from '@lowdefy/api/context/createApiContext';
import getPageConfig from '@lowdefy/api/routes/page/getPageConfig';
import Page from '../components/Page.js';
export async function getServerSideProps(context) {
const { pageId } = context.params;
const apiContext = await createContext({});
const apiContext = await createApiContext({ buildDirectory: './.lowdefy/build' });
const pageConfig = await getPageConfig(apiContext, { pageId });
if (!pageConfig) {

View File

@ -14,10 +14,12 @@
limitations under the License.
*/
import Box from '@lowdefy/blocks-basic/blocks/Box/Box.js';
import Html from '@lowdefy/blocks-basic/blocks/Html/Html.js';
const blocks = {
Html
}
Box,
Html,
};
export default blocks;

108
yarn.lock
View File

@ -678,7 +678,7 @@ __metadata:
languageName: node
linkType: hard
"@babel/helper-module-imports@npm:^7.0.0, @babel/helper-module-imports@npm:^7.12.13, @babel/helper-module-imports@npm:^7.14.5, @babel/helper-module-imports@npm:^7.15.4":
"@babel/helper-module-imports@npm:^7.12.13, @babel/helper-module-imports@npm:^7.14.5, @babel/helper-module-imports@npm:^7.15.4":
version: 7.15.4
resolution: "@babel/helper-module-imports@npm:7.15.4"
dependencies:
@ -1945,7 +1945,7 @@ __metadata:
languageName: node
linkType: hard
"@babel/runtime@npm:7.15.4, @babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.10.4, @babel/runtime@npm:^7.11.1, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.8.4":
"@babel/runtime@npm:7.15.4, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.10.4, @babel/runtime@npm:^7.11.1, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.8.4":
version: 7.15.4
resolution: "@babel/runtime@npm:7.15.4"
dependencies:
@ -3477,7 +3477,7 @@ __metadata:
languageName: unknown
linkType: soft
"@lowdefy/blocks-basic@workspace:packages/blocks/blocks-basic":
"@lowdefy/blocks-basic@3.22.0, @lowdefy/blocks-basic@workspace:packages/blocks/blocks-basic":
version: 0.0.0-use.local
resolution: "@lowdefy/blocks-basic@workspace:packages/blocks/blocks-basic"
dependencies:
@ -3837,37 +3837,23 @@ __metadata:
version: 0.0.0-use.local
resolution: "@lowdefy/layout@workspace:packages/layout"
dependencies:
"@babel/cli": 7.15.7
"@babel/core": 7.15.8
"@babel/preset-env": 7.15.8
"@babel/preset-react": 7.14.5
"@babel/preset-react": 7.16.0
"@emotion/jest": 11.5.0
"@lowdefy/block-dev": 3.22.0
"@lowdefy/block-utils": 3.22.0
"@lowdefy/helpers": 3.22.0
"@swc/cli": 0.1.51
"@swc/core": 1.2.107
"@swc/jest": 0.2.5
"@testing-library/dom": 8.10.1
"@testing-library/react": 12.1.2
"@testing-library/user-event": 13.5.0
antd: 4.17.0-alpha.7
babel-jest: 27.3.1
babel-loader: 8.2.3
babel-plugin-import: 1.13.3
clean-webpack-plugin: 4.0.0
css-loader: 6.4.0
html-webpack-plugin: 5.4.0
jest: 27.3.1
jest-serializer-html: 7.1.0
jest-transform-yaml: 0.1.2
js-yaml: 4.1.0
less: 4.1.2
less-loader: 10.2.0
process: 0.11.10
react: 18.0.0-alpha-327d5c484-20211106
react-dom: 18.0.0-alpha-327d5c484-20211106
react-markdown: 5.0.3
react-syntax-highlight: 15.3.1
style-loader: 3.3.1
webpack: 5.59.1
webpack-cli: 4.9.1
webpack-dev-server: 4.3.1
yaml-loader: 0.6.0
languageName: unknown
linkType: soft
@ -3910,9 +3896,9 @@ __metadata:
"@swc/cli": 0.1.51
"@swc/core": 1.2.107
"@swc/jest": 0.2.5
chokidar: 3.5.2
jest: 27.3.1
moment: 2.29.1
nunjucks: 3.2.3
languageName: unknown
linkType: soft
@ -3975,8 +3961,12 @@ __metadata:
resolution: "@lowdefy/server@workspace:packages/server"
dependencies:
"@lowdefy/api": 3.22.0
"@lowdefy/block-utils": 3.22.0
"@lowdefy/blocks-antd": 3.22.0
"@lowdefy/blocks-basic": 3.22.0
"@lowdefy/engine": 3.22.0
"@lowdefy/helpers": 3.22.0
"@lowdefy/node-utils": 3.22.0
"@lowdefy/layout": 3.22.0
"@next/eslint-plugin-next": 12.0.2
less: 4.1.2
less-loader: 10.2.0
@ -5727,6 +5717,13 @@ __metadata:
languageName: node
linkType: hard
"a-sync-waterfall@npm:^1.0.0":
version: 1.0.1
resolution: "a-sync-waterfall@npm:1.0.1"
checksum: 534948b50d6787c2dd5b7e89179b30c0fd96ac80a662d0f92eaa568cfffb36f1eea4aa720e3a21572d8b5f8686940954ac9d8c7667bcc719c1317ae3bdf86fe0
languageName: node
linkType: hard
"abab@npm:^2.0.3, abab@npm:^2.0.5":
version: 2.0.5
resolution: "abab@npm:2.0.5"
@ -6448,7 +6445,7 @@ __metadata:
languageName: node
linkType: hard
"asap@npm:^2.0.0, asap@npm:~2.0.3":
"asap@npm:^2.0.0, asap@npm:^2.0.3, asap@npm:~2.0.3":
version: 2.0.6
resolution: "asap@npm:2.0.6"
checksum: b296c92c4b969e973260e47523207cd5769abd27c245a68c26dc7a0fe8053c55bb04360237cb51cab1df52be939da77150ace99ad331fb7fb13b3423ed73ff3d
@ -6669,16 +6666,6 @@ __metadata:
languageName: node
linkType: hard
"babel-plugin-import@npm:1.13.3":
version: 1.13.3
resolution: "babel-plugin-import@npm:1.13.3"
dependencies:
"@babel/helper-module-imports": ^7.0.0
"@babel/runtime": ^7.0.0
checksum: 1be664a34fa6cdffb08485a7094ff1a3fdfd2e95a7d367afdd7a6dcb51842c0bc717c8fdba65538561a4d3aecc39c123e6de1449c5b1b2aa5b13604c17ca7042
languageName: node
linkType: hard
"babel-plugin-istanbul@npm:^6.0.0":
version: 6.1.1
resolution: "babel-plugin-istanbul@npm:6.1.1"
@ -7908,6 +7895,13 @@ __metadata:
languageName: node
linkType: hard
"commander@npm:^5.1.0":
version: 5.1.0
resolution: "commander@npm:5.1.0"
checksum: 0b7fec1712fbcc6230fcb161d8d73b4730fa91a21dc089515489402ad78810547683f058e2a9835929c212fead1d6a6ade70db28bbb03edbc2829a9ab7d69447
languageName: node
linkType: hard
"commander@npm:^8.1.0":
version: 8.3.0
resolution: "commander@npm:8.3.0"
@ -11278,13 +11272,6 @@ __metadata:
languageName: node
linkType: hard
"highlight.js@npm:^9.12.0":
version: 9.18.5
resolution: "highlight.js@npm:9.18.5"
checksum: a8afdb395869bba8a892dd8891b738d3bd48fe2e5b6843ec3181c93d73f52abf2cab863424caa631442a7bbafac222bafdab3f5a536a69aab9c60d4c1b7f8b77
languageName: node
linkType: hard
"history@npm:^4.9.0":
version: 4.10.1
resolution: "history@npm:4.10.1"
@ -15526,6 +15513,24 @@ __metadata:
languageName: node
linkType: hard
"nunjucks@npm:3.2.3":
version: 3.2.3
resolution: "nunjucks@npm:3.2.3"
dependencies:
a-sync-waterfall: ^1.0.0
asap: ^2.0.3
commander: ^5.1.0
peerDependencies:
chokidar: ^3.3.0
peerDependenciesMeta:
chokidar:
optional: true
bin:
nunjucks-precompile: bin/precompile
checksum: 9d0125acf917166675af2d9b5d525b6d3edaba68ec6f8c92edee8ad05140cfa8aef12feb46f4c3da52ed2836cadfb9d26fbf1fa9d9be6bef4660d03ce1e89dbe
languageName: node
linkType: hard
"nwsapi@npm:^2.2.0":
version: 2.2.0
resolution: "nwsapi@npm:2.2.0"
@ -17889,19 +17894,6 @@ __metadata:
languageName: node
linkType: hard
"react-syntax-highlight@npm:15.3.1":
version: 15.3.1
resolution: "react-syntax-highlight@npm:15.3.1"
dependencies:
highlight.js: ^9.12.0
prop-types: ^15.5.10
peerDependencies:
react: ^15.3.0
react-dom: ^15.3.0
checksum: cada9bec5d596b1df0eb59aec0522e0f241960661554ebd665cbc5c1da760d56a9d734bd11df131e7fdbb31c3f7d6e6e5463a75af7045c611874fd0c7a5c6b7b
languageName: node
linkType: hard
"react-syntax-highlighter@npm:15.4.4":
version: 15.4.4
resolution: "react-syntax-highlighter@npm:15.4.4"
@ -21079,7 +21071,7 @@ resolve@^2.0.0-next.3:
languageName: node
linkType: hard
"webpack-dev-server@npm:*, webpack-dev-server@npm:4.3.1":
"webpack-dev-server@npm:*":
version: 4.3.1
resolution: "webpack-dev-server@npm:4.3.1"
dependencies: