diff --git a/.pnp.cjs b/.pnp.cjs
index 9385c0b86..a4e7390d5 100755
--- a/.pnp.cjs
+++ b/.pnp.cjs
@@ -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": [
diff --git a/.yarn/cache/a-sync-waterfall-npm-1.0.1-f6b6b49568-534948b50d.zip b/.yarn/cache/a-sync-waterfall-npm-1.0.1-f6b6b49568-534948b50d.zip
new file mode 100644
index 000000000..d49013a94
Binary files /dev/null and b/.yarn/cache/a-sync-waterfall-npm-1.0.1-f6b6b49568-534948b50d.zip differ
diff --git a/.yarn/cache/babel-plugin-import-npm-1.13.3-498736f60a-1be664a34f.zip b/.yarn/cache/babel-plugin-import-npm-1.13.3-498736f60a-1be664a34f.zip
deleted file mode 100644
index a753f5ea9..000000000
Binary files a/.yarn/cache/babel-plugin-import-npm-1.13.3-498736f60a-1be664a34f.zip and /dev/null differ
diff --git a/.yarn/cache/commander-npm-5.1.0-7e939e7832-0b7fec1712.zip b/.yarn/cache/commander-npm-5.1.0-7e939e7832-0b7fec1712.zip
new file mode 100644
index 000000000..ceec307a3
Binary files /dev/null and b/.yarn/cache/commander-npm-5.1.0-7e939e7832-0b7fec1712.zip differ
diff --git a/.yarn/cache/highlight.js-npm-9.18.5-571500f48d-a8afdb3958.zip b/.yarn/cache/highlight.js-npm-9.18.5-571500f48d-a8afdb3958.zip
deleted file mode 100644
index 8197ac201..000000000
Binary files a/.yarn/cache/highlight.js-npm-9.18.5-571500f48d-a8afdb3958.zip and /dev/null differ
diff --git a/.yarn/cache/nunjucks-npm-3.2.3-ae8b5fd14c-9d0125acf9.zip b/.yarn/cache/nunjucks-npm-3.2.3-ae8b5fd14c-9d0125acf9.zip
new file mode 100644
index 000000000..dcae2b372
Binary files /dev/null and b/.yarn/cache/nunjucks-npm-3.2.3-ae8b5fd14c-9d0125acf9.zip differ
diff --git a/.yarn/cache/react-syntax-highlight-npm-15.3.1-d7cccdaa21-cada9bec5d.zip b/.yarn/cache/react-syntax-highlight-npm-15.3.1-d7cccdaa21-cada9bec5d.zip
deleted file mode 100644
index e8ca1487b..000000000
Binary files a/.yarn/cache/react-syntax-highlight-npm-15.3.1-d7cccdaa21-cada9bec5d.zip and /dev/null differ
diff --git a/packages/server/src/components/Block.js b/packages/api/src/context/createApiContext.js
similarity index 65%
rename from packages/server/src/components/Block.js
rename to packages/api/src/context/createApiContext.js
index 7fce78c15..b116ba2fa 100644
--- a/packages/server/src/components/Block.js
+++ b/packages/api/src/context/createApiContext.js
@@ -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 (
- <>
-
{JSON.stringify(pageConfig)}
-
- >
- );
-};
+async function createApiContext({ buildDirectory }) {
+ const readConfigFile = createReadConfigFile({ buildDirectory });
+ return {
+ authorize: () => true,
+ readConfigFile,
+ };
+}
-export default Block;
+export default createApiContext;
diff --git a/packages/api/src/context/readConfigFile.js b/packages/api/src/context/readConfigFile.js
index beb710e42..0e68b579f 100644
--- a/packages/api/src/context/readConfigFile.js
+++ b/packages/api/src/context/readConfigFile.js
@@ -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) {
diff --git a/packages/api/src/index.js b/packages/api/src/index.js
index 6a64ac3a6..2454b483a 100644
--- a/packages/api/src/index.js
+++ b/packages/api/src/index.js
@@ -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,
};
diff --git a/packages/blocks/blocks-basic/package.json b/packages/blocks/blocks-basic/package.json
index ee0298d51..7da2d9a6a 100644
--- a/packages/blocks/blocks-basic/package.json
+++ b/packages/blocks/blocks-basic/package.json
@@ -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/*"
],
diff --git a/packages/build/src/utils/files/readConfigFile.js b/packages/build/src/utils/files/readConfigFile.js
index d9efd43c5..f0ff95641 100644
--- a/packages/build/src/utils/files/readConfigFile.js
+++ b/packages/build/src/utils/files/readConfigFile.js
@@ -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) {
diff --git a/packages/build/src/utils/files/readConfigFile.test.js b/packages/build/src/utils/files/readConfigFile.test.js
index cc6533dd2..ec80b1e86 100644
--- a/packages/build/src/utils/files/readConfigFile.test.js
+++ b/packages/build/src/utils/files/readConfigFile.test.js
@@ -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,
};
});
diff --git a/packages/engine/src/Actions.js b/packages/engine/src/Actions.js
index be09d62c9..7fa0284e4 100644
--- a/packages/engine/src/Actions.js
+++ b/packages/engine/src/Actions.js
@@ -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,
diff --git a/packages/engine/src/Blocks.js b/packages/engine/src/Blocks.js
index 875bbf534..083b4e4f1 100644
--- a/packages/engine/src/Blocks.js
+++ b/packages/engine/src/Blocks.js
@@ -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)}`;
diff --git a/packages/engine/src/Events.js b/packages/engine/src/Events.js
index 1a02d707c..436aa5907 100644
--- a/packages/engine/src/Events.js
+++ b/packages/engine/src/Events.js
@@ -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;
};
diff --git a/packages/engine/src/Requests.js b/packages/engine/src/Requests.js
index 30d6e0ea1..e93f4b355 100644
--- a/packages/engine/src/Requests.js
+++ b/packages/engine/src/Requests.js
@@ -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,
});
diff --git a/packages/engine/src/getContext.js b/packages/engine/src/getContext.js
index 571e740bd..0573ced03 100644
--- a/packages/engine/src/getContext.js
+++ b/packages/engine/src/getContext.js
@@ -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;
diff --git a/packages/node-utils/src/cachedPromises.js b/packages/helpers/src/cachedPromises.js
similarity index 100%
rename from packages/node-utils/src/cachedPromises.js
rename to packages/helpers/src/cachedPromises.js
diff --git a/packages/helpers/src/index.js b/packages/helpers/src/index.js
index 4427bef06..ba1281471 100644
--- a/packages/helpers/src/index.js
+++ b/packages/helpers/src/index.js
@@ -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,
diff --git a/packages/layout/package.json b/packages/layout/package.json
index f2de2657e..6539f5550 100644
--- a/packages/layout/package.json
+++ b/packages/layout/package.json
@@ -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"
diff --git a/packages/node-utils/package.json b/packages/node-utils/package.json
index f1d058a68..c19fdc230 100644
--- a/packages/node-utils/package.json
+++ b/packages/node-utils/package.json
@@ -26,7 +26,10 @@
"url": "https://github.com/lowdefy/lowdefy.git"
},
"type": "module",
- "exports": "./dist/index.js",
+ "exports": {
+ ".": "./dist/index.js",
+ "./*": "./dist/*"
+ },
"files": [
"dist/*"
],
diff --git a/packages/node-utils/src/index.js b/packages/node-utils/src/index.js
index 0aac9ec5d..c16a77f58 100644
--- a/packages/node-utils/src/index.js
+++ b/packages/node-utils/src/index.js
@@ -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,
diff --git a/packages/nunjucks/package.json b/packages/nunjucks/package.json
index d91328022..ff5a238b6 100644
--- a/packages/nunjucks/package.json
+++ b/packages/nunjucks/package.json
@@ -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",
diff --git a/packages/operators/src/webParser.js b/packages/operators/src/webParser.js
index 28803f463..cc089fdff 100644
--- a/packages/operators/src/webParser.js
+++ b/packages/operators/src/webParser.js
@@ -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];
diff --git a/packages/server/next.config.js b/packages/server/next.config.js
index 3634828f7..5f45d3652 100644
--- a/packages/server/next.config.js
+++ b/packages/server/next.config.js
@@ -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,
diff --git a/packages/server/package.json b/packages/server/package.json
index 6c7683f7a..0fd19af86 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -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",
diff --git a/packages/server/src/components/Blocks.js b/packages/server/src/components/Blocks.js
deleted file mode 100644
index bb85b0984..000000000
--- a/packages/server/src/components/Blocks.js
+++ /dev/null
@@ -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;
diff --git a/packages/server/src/components/PageContext.js b/packages/server/src/components/Context.js
similarity index 80%
rename from packages/server/src/components/PageContext.js
rename to packages/server/src/components/Context.js
index f7cd7a7df..aea330777 100644
--- a/packages/server/src/components/PageContext.js
+++ b/packages/server/src/components/Context.js
@@ -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 = () => Loading...
;
-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 ;
+ if (context.id !== config.id) return ;
return children(context);
diff --git a/packages/server/src/components/LowdefyContext.js b/packages/server/src/components/LowdefyContext.js
index 34018dd05..05f6d9a7d 100644
--- a/packages/server/src/components/LowdefyContext.js
+++ b/packages/server/src/components/LowdefyContext.js
@@ -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)}>;
};
diff --git a/packages/server/src/components/Page.js b/packages/server/src/components/Page.js
index 06043293d..5997a5804 100644
--- a/packages/server/src/components/Page.js
+++ b/packages/server/src/components/Page.js
@@ -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) => }
-
+
+ {(context) => (
+
+ )}
+
);
};
diff --git a/packages/server/src/components/block/Block.js b/packages/server/src/components/block/Block.js
new file mode 100644
index 000000000..003585cb2
--- /dev/null
+++ b/packages/server/src/components/block/Block.js
@@ -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 (
+
+ }>
+
+ {(loaded) =>
+ !loaded ? (
+
+ ) : (
+
+ )
+ }
+
+
+
+ );
+};
+
+export default Block;
diff --git a/packages/server/src/components/block/CategorySwitch.js b/packages/server/src/components/block/CategorySwitch.js
new file mode 100644
index 000000000..d12d91c44
--- /dev/null
+++ b/packages/server/src/components/block/CategorySwitch.js
@@ -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 ;
+ const Component = lowdefy._internal.blockComponents[block.type];
+ switch (block.meta.category) {
+ case 'list':
+ return (
+
+ );
+ case 'container':
+ return (
+
+ );
+ case 'input':
+ return (
+
+
+
+ );
+ default:
+ return (
+
+
+
+ );
+ }
+};
+
+export default CategorySwitch;
diff --git a/packages/server/src/components/block/Container.js b/packages/server/src/components/block/Container.js
new file mode 100644
index 000000000..0b72348f2
--- /dev/null
+++ b/packages/server/src/components/block/Container.js
@@ -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) => (
+
+ {areas[areaKey].blocks.map((bl) => (
+
+ ))}
+
+ );
+ });
+ return (
+
+
+
+ );
+};
+
+export default Container;
diff --git a/packages/server/src/components/block/List.js b/packages/server/src/components/block/List.js
new file mode 100644
index 000000000..89c129547
--- /dev/null
+++ b/packages/server/src/components/block/List.js
@@ -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) => (
+
+ {SBlock.areas[areaKey].blocks.map((bl) => (
+
+ ))}
+
+ );
+ });
+ contentList.push({ ...content });
+ });
+ return (
+
+
+
+ );
+};
+
+export default List;
diff --git a/packages/server/src/components/block/LoadingBlock.js b/packages/server/src/components/block/LoadingBlock.js
new file mode 100644
index 000000000..73480d185
--- /dev/null
+++ b/packages/server/src/components/block/LoadingBlock.js
@@ -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 }) => (
+ LoadingBlock
+ //
+ //
+ //
+);
+
+export default LoadingBlock;
diff --git a/packages/server/src/components/block/MountEvents.js b/packages/server/src/components/block/MountEvents.js
new file mode 100644
index 000000000..9f968b70d
--- /dev/null
+++ b/packages/server/src/components/block/MountEvents.js
@@ -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;
diff --git a/packages/server/src/components/getPageContext.js b/packages/server/src/components/getPageContext.js
deleted file mode 100644
index a7fa69448..000000000
--- a/packages/server/src/components/getPageContext.js
+++ /dev/null
@@ -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;
diff --git a/packages/server/src/pages/[pageId].js b/packages/server/src/pages/[pageId].js
index 5a6d7fc16..24e4a2496 100644
--- a/packages/server/src/pages/[pageId].js
+++ b/packages/server/src/pages/[pageId].js
@@ -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) {
diff --git a/packages/server/src/plugins/blocks.js b/packages/server/src/plugins/blocks.js
index 405b3ad53..ccc9a3ed9 100644
--- a/packages/server/src/plugins/blocks.js
+++ b/packages/server/src/plugins/blocks.js
@@ -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;
diff --git a/yarn.lock b/yarn.lock
index 3f5bedb46..0c631889d 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -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: