diff --git a/misc/config_tools/build.cmd b/misc/config_tools/build.cmd index cbf60464b..55eea863a 100644 --- a/misc/config_tools/build.cmd +++ b/misc/config_tools/build.cmd @@ -4,6 +4,6 @@ python scenario_config/jsonschema/converter.py xmllint --xinclude schema/datachecks.xsd > schema/allchecks.xsd python -m build rem pip install .\dist\acrn_config_tools-3.0-py3-none-any.whl --force-reinstall -del .\configurator\thirdLib\acrn_config_tools-3.0-py3-none-any.whl -python .\configurator\thirdLib\manager.py install +del .\configurator\packages\configurator\thirdLib\acrn_config_tools-3.0-py3-none-any.whl +python .\configurator\packages\configurator\thirdLib\manager.py install echo build and install success diff --git a/misc/config_tools/configurator/README.md b/misc/config_tools/configurator/README.md index bc6b201ff..37d58a291 100644 --- a/misc/config_tools/configurator/README.md +++ b/misc/config_tools/configurator/README.md @@ -86,7 +86,7 @@ xmllint --xinclude schema/datachecks.xsd > schema/allchecks.xsd python -m build cd configurator -python thirdLib/manager.py install +python packages/configurator/thirdLib/manager.py install yarn build ``` diff --git a/misc/config_tools/configurator/__init__.py b/misc/config_tools/configurator/__init__.py index e69de29bb..6bb846f9e 100644 --- a/misc/config_tools/configurator/__init__.py +++ b/misc/config_tools/configurator/__init__.py @@ -0,0 +1,3 @@ +# Do Not Delete +# This file be used in configurator's wasm python env +# See: https://stackoverflow.com/questions/42791179/why-does-pip-install-not-include-my-package-data-files diff --git a/misc/config_tools/configurator/package.json b/misc/config_tools/configurator/package.json index bb64acc10..3c976fcdb 100644 --- a/misc/config_tools/configurator/package.json +++ b/misc/config_tools/configurator/package.json @@ -1,5 +1,4 @@ { - "name": "acrn-configurator", "private": true, "version": "0.3.0", "author": { @@ -8,34 +7,13 @@ "url": "https://github.com/Weiyi-Feng" }, "description": "ACRN Configurator", + "workspaces": [ + "packages/configurator", + "packages/vue-json-schema-form/**" + ], "scripts": { - "dev": "vite", - "build": "vite build", - "preview": "vite preview", - "tauri": "tauri" + "dev": "yarn workspace acrn-configurator dev", + "build": "yarn workspace acrn-configurator build" }, - "dependencies": { - "@lljj/vue3-form-naive": "^1.12.2", - "@popperjs/core": "^2.11.5", - "@rollup/plugin-replace": "^4.0.0", - "@tauri-apps/api": "^1.0.0-rc.3", - "@vicons/fa": "^0.12.0", - "@vicons/utils": "^0.1.4", - "ajv-i18n": "^4.2.0", - "bootstrap": "^5.1.3", - "bootstrap-vue-3": "^0.1.10", - "js-base64": "^3.7.2", - "lodash": "^4.17.21", - "naive-ui": "^2.28.1", - "node-fetch": "2", - "sass": "^1.50.0", - "vfonts": "^0.0.3", - "vue": "^3.2.25", - "vue-router": "4" - }, - "devDependencies": { - "@tauri-apps/cli": "^1.0.0-rc.8", - "@vitejs/plugin-vue": "^2.3.1", - "vite": "^2.9.2" - } -} + "dependencies": {} +} \ No newline at end of file diff --git a/misc/config_tools/configurator/index.html b/misc/config_tools/configurator/packages/configurator/index.html similarity index 100% rename from misc/config_tools/configurator/index.html rename to misc/config_tools/configurator/packages/configurator/index.html diff --git a/misc/config_tools/configurator/packages/configurator/package.json b/misc/config_tools/configurator/packages/configurator/package.json new file mode 100644 index 000000000..a96761dbc --- /dev/null +++ b/misc/config_tools/configurator/packages/configurator/package.json @@ -0,0 +1,42 @@ +{ + "name": "acrn-configurator", + "private": true, + "version": "0.3.0", + "author": { + "name": "Feng, Weiyi", + "email": "weiyix.feng@intel.com", + "url": "https://github.com/Weiyi-Feng" + }, + "description": "ACRN Configurator", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "tauri": "tauri" + }, + "dependencies": { + "@lljj/vue3-form-naive": "^1.12.2", + "@popperjs/core": "^2.11.5", + "@rollup/plugin-replace": "^4.0.0", + "@tauri-apps/api": "^1.0.0-rc.4", + "@vicons/fa": "^0.12.0", + "@vicons/utils": "^0.1.4", + "ajv-i18n": "^4.2.0", + "bootstrap": "^5.1.3", + "bootstrap-vue-3": "^0.1.10", + "js-base64": "^3.7.2", + "lodash": "^4.17.21", + "naive-ui": "^2.28.1", + "node-fetch": "2", + "sass": "^1.50.0", + "vfonts": "^0.0.3", + "vue": "^3.2.25", + "vue-router": "4" + }, + "devDependencies": { + "@tauri-apps/cli": "^1.0.0-rc.9", + "@types/node": "^16.11.33", + "@vitejs/plugin-vue": "^2.3.1", + "vite": "^2.9.2" + } +} diff --git a/misc/config_tools/configurator/public/favicon.ico b/misc/config_tools/configurator/packages/configurator/public/favicon.ico similarity index 100% rename from misc/config_tools/configurator/public/favicon.ico rename to misc/config_tools/configurator/packages/configurator/public/favicon.ico diff --git a/misc/config_tools/configurator/src-tauri/.gitignore b/misc/config_tools/configurator/packages/configurator/src-tauri/.gitignore similarity index 100% rename from misc/config_tools/configurator/src-tauri/.gitignore rename to misc/config_tools/configurator/packages/configurator/src-tauri/.gitignore diff --git a/misc/config_tools/configurator/src-tauri/Cargo.lock b/misc/config_tools/configurator/packages/configurator/src-tauri/Cargo.lock similarity index 98% rename from misc/config_tools/configurator/src-tauri/Cargo.lock rename to misc/config_tools/configurator/packages/configurator/src-tauri/Cargo.lock index a3c3b78d8..6e82b12f3 100644 --- a/misc/config_tools/configurator/src-tauri/Cargo.lock +++ b/misc/config_tools/configurator/packages/configurator/src-tauri/Cargo.lock @@ -185,9 +185,9 @@ dependencies = [ [[package]] name = "attohttpc" -version = "0.18.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e69e13a99a7e6e070bb114f7ff381e58c7ccc188630121fc4c2fe4bcf24cd072" +checksum = "262c3f7f5d61249d8c00e5546e2685cd15ebeeb1bc0f3cc5449350a1cb07319e" dependencies = [ "flate2", "http", @@ -351,7 +351,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74f89d248799e3f15f91b70917f65381062a01bb8e222700ea0e5a7ff9785f9c" dependencies = [ "byteorder", - "uuid", + "uuid 0.8.2", ] [[package]] @@ -387,12 +387,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - [[package]] name = "cocoa" version = "0.24.0" @@ -1572,9 +1566,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.16" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if", ] @@ -2605,18 +2599,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.136" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.136" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" dependencies = [ "proc-macro2", "quote", @@ -2625,9 +2619,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.79" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95" +checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" dependencies = [ "itoa 1.0.1", "ryu", @@ -2954,9 +2948,9 @@ dependencies = [ [[package]] name = "tao" -version = "0.7.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b6a3359088d4c4735a13f933202f4ecd91f5991b41a8eb757f2449c044ce925" +checksum = "3765f329d831aa461cd3f0f94b065a9fe37560fd7f8099d5bcf3e95c923071f0" dependencies = [ "bitflags", "cairo-rs", @@ -3018,16 +3012,14 @@ dependencies = [ [[package]] name = "tauri" -version = "1.0.0-rc.6" +version = "1.0.0-rc.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6d514a34b3f9a07e2002d95e1371b42a446636e3d571a59e974b21d6acf3007" +checksum = "537978045ca229b9c1bb51ea85bc807b9d109a119721134fc5da24f94fd3074a" dependencies = [ "anyhow", "attohttpc", "bincode", - "cfg_aliases", "dirs-next", - "either", "embed_plist", "flate2", "futures", @@ -3035,9 +3027,9 @@ dependencies = [ "glib", "glob", "gtk", + "heck 0.4.0", "http", "ignore", - "memchr", "notify-rust", "once_cell", "open", @@ -3064,15 +3056,15 @@ dependencies = [ "thiserror", "tokio", "url", - "uuid", + "uuid 1.0.0", "windows 0.30.0", ] [[package]] name = "tauri-build" -version = "1.0.0-rc.5" +version = "1.0.0-rc.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede6462a4692e2fd5030497ad576264dc90eea5fa337182492e77291d45fc78b" +checksum = "7e6448e80778032b4f9dd86b5efc8214d5bfc81a11efa502bb5211b05d422b14" dependencies = [ "anyhow", "cargo_toml", @@ -3083,9 +3075,9 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "1.0.0-rc.4" +version = "1.0.0-rc.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54193ebdb010e85824301ce5f0940742b680d66376203f6425d549d2f32ad499" +checksum = "e4c2e553c2ceaf30f1feabc76abebbd5f9eddb99b643de0078e38037e43e3c2f" dependencies = [ "base64", "brotli", @@ -3099,15 +3091,15 @@ dependencies = [ "sha2", "tauri-utils", "thiserror", - "uuid", + "uuid 1.0.0", "walkdir", ] [[package]] name = "tauri-macros" -version = "1.0.0-rc.4" +version = "1.0.0-rc.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8b867ef4703cb8e50f128ee3c941895d94c01e0ebd9007a7b45ecca52516dbf" +checksum = "d3e8af1367b1e1224edfa4117c88fe19717970fabfbc2555e957e077f0469248" dependencies = [ "heck 0.4.0", "proc-macro2", @@ -3119,9 +3111,9 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "0.3.4" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b289ac8eafc52a36425fcaf3de23febd0b2606d3cce2b39ac412a1817fae537" +checksum = "27653d24a0d7e2c8e04838e975acbf7a5628746d8d60a916d33a9ccf8a06c4ea" dependencies = [ "gtk", "http", @@ -3131,22 +3123,22 @@ dependencies = [ "serde_json", "tauri-utils", "thiserror", - "uuid", + "uuid 1.0.0", "webview2-com", "windows 0.30.0", ] [[package]] name = "tauri-runtime-wry" -version = "0.3.5" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8bf16e0476a8249aa2c75e7b49ec4c059be5fb27d9f6514e30ed327e8e9fa2" +checksum = "53d9b0922c27ea8a1430a2bbf666fe7789645dffb9d317f8d2dfca1a5dff2271" dependencies = [ "gtk", "rand 0.8.5", "tauri-runtime", "tauri-utils", - "uuid", + "uuid 1.0.0", "webview2-com", "windows 0.30.0", "wry", @@ -3154,9 +3146,9 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "1.0.0-rc.4" +version = "1.0.0-rc.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a67fcf8fdd1340de4e75c01966fceab03057a8b0e97864eb39a21e420deed503" +checksum = "a485f9fc0f381d3da0818c4260b3a04be86dc1844a12edaff68afb07bc55d735" dependencies = [ "brotli", "ctor", @@ -3165,13 +3157,13 @@ dependencies = [ "html5ever", "json-patch", "kuchiki", + "memchr", "phf 0.10.1", "proc-macro2", "quote", "serde", "serde_json", "serde_with", - "serialize-to-javascript", "thiserror", "url", "walkdir", @@ -3417,6 +3409,12 @@ name = "uuid" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" + +[[package]] +name = "uuid" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cfcd319456c4d6ea10087ed423473267e1a071f3bc0aa89f80d60997843c6f0" dependencies = [ "getrandom 0.2.6", ] @@ -3916,9 +3914,9 @@ dependencies = [ [[package]] name = "wry" -version = "0.14.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fd09ffc86ecea0a0d5f50cc8e4a8121a1bfc0b0825a160f86ac39e86979344c" +checksum = "20b69cff9f50bab10b42e51bac9c2cf695484059f1b19e911754477ae703ef42" dependencies = [ "block", "cocoa", diff --git a/misc/config_tools/configurator/src-tauri/Cargo.toml b/misc/config_tools/configurator/packages/configurator/src-tauri/Cargo.toml similarity index 74% rename from misc/config_tools/configurator/src-tauri/Cargo.toml rename to misc/config_tools/configurator/packages/configurator/src-tauri/Cargo.toml index e7206d0d6..af1f85a85 100644 --- a/misc/config_tools/configurator/src-tauri/Cargo.toml +++ b/misc/config_tools/configurator/packages/configurator/src-tauri/Cargo.toml @@ -12,16 +12,16 @@ rust-version = "1.57" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [build-dependencies] -tauri-build = { version = "1.0.0-rc.5", features = [] } +tauri-build = { version = "1.0.0-rc.7", features = [] } [dependencies] -serde_json = "1.0" -serde = { version = "1.0", features = ["derive"] } -tauri = { version = "1.0.0-rc.6", features = ["api-all", "devtools"] } -log = "0.4" -glob = "0.3" -dirs = "4.0" -itertools = "0.10" +serde_json = "1.0.81" +serde = { version = "1.0.137", features = ["derive"] } +tauri = { version = "1.0.0-rc.8", features = ["api-all", "devtools"] } +log = "0.4.17" +glob = "0.3.0" +dirs = "4.0.0" +itertools = "0.10.3" [features] # by default Tauri runs in production mode diff --git a/misc/config_tools/configurator/src-tauri/build.rs b/misc/config_tools/configurator/packages/configurator/src-tauri/build.rs similarity index 100% rename from misc/config_tools/configurator/src-tauri/build.rs rename to misc/config_tools/configurator/packages/configurator/src-tauri/build.rs diff --git a/misc/config_tools/configurator/src-tauri/icons/128x128.png b/misc/config_tools/configurator/packages/configurator/src-tauri/icons/128x128.png similarity index 100% rename from misc/config_tools/configurator/src-tauri/icons/128x128.png rename to misc/config_tools/configurator/packages/configurator/src-tauri/icons/128x128.png diff --git a/misc/config_tools/configurator/src-tauri/icons/128x128@2x.png b/misc/config_tools/configurator/packages/configurator/src-tauri/icons/128x128@2x.png similarity index 100% rename from misc/config_tools/configurator/src-tauri/icons/128x128@2x.png rename to misc/config_tools/configurator/packages/configurator/src-tauri/icons/128x128@2x.png diff --git a/misc/config_tools/configurator/src-tauri/icons/32x32.png b/misc/config_tools/configurator/packages/configurator/src-tauri/icons/32x32.png similarity index 100% rename from misc/config_tools/configurator/src-tauri/icons/32x32.png rename to misc/config_tools/configurator/packages/configurator/src-tauri/icons/32x32.png diff --git a/misc/config_tools/configurator/src-tauri/icons/Square107x107Logo.png b/misc/config_tools/configurator/packages/configurator/src-tauri/icons/Square107x107Logo.png similarity index 100% rename from misc/config_tools/configurator/src-tauri/icons/Square107x107Logo.png rename to misc/config_tools/configurator/packages/configurator/src-tauri/icons/Square107x107Logo.png diff --git a/misc/config_tools/configurator/src-tauri/icons/Square142x142Logo.png b/misc/config_tools/configurator/packages/configurator/src-tauri/icons/Square142x142Logo.png similarity index 100% rename from misc/config_tools/configurator/src-tauri/icons/Square142x142Logo.png rename to misc/config_tools/configurator/packages/configurator/src-tauri/icons/Square142x142Logo.png diff --git a/misc/config_tools/configurator/src-tauri/icons/Square150x150Logo.png b/misc/config_tools/configurator/packages/configurator/src-tauri/icons/Square150x150Logo.png similarity index 100% rename from misc/config_tools/configurator/src-tauri/icons/Square150x150Logo.png rename to misc/config_tools/configurator/packages/configurator/src-tauri/icons/Square150x150Logo.png diff --git a/misc/config_tools/configurator/src-tauri/icons/Square284x284Logo.png b/misc/config_tools/configurator/packages/configurator/src-tauri/icons/Square284x284Logo.png similarity index 100% rename from misc/config_tools/configurator/src-tauri/icons/Square284x284Logo.png rename to misc/config_tools/configurator/packages/configurator/src-tauri/icons/Square284x284Logo.png diff --git a/misc/config_tools/configurator/src-tauri/icons/Square30x30Logo.png b/misc/config_tools/configurator/packages/configurator/src-tauri/icons/Square30x30Logo.png similarity index 100% rename from misc/config_tools/configurator/src-tauri/icons/Square30x30Logo.png rename to misc/config_tools/configurator/packages/configurator/src-tauri/icons/Square30x30Logo.png diff --git a/misc/config_tools/configurator/src-tauri/icons/Square310x310Logo.png b/misc/config_tools/configurator/packages/configurator/src-tauri/icons/Square310x310Logo.png similarity index 100% rename from misc/config_tools/configurator/src-tauri/icons/Square310x310Logo.png rename to misc/config_tools/configurator/packages/configurator/src-tauri/icons/Square310x310Logo.png diff --git a/misc/config_tools/configurator/src-tauri/icons/Square44x44Logo.png b/misc/config_tools/configurator/packages/configurator/src-tauri/icons/Square44x44Logo.png similarity index 100% rename from misc/config_tools/configurator/src-tauri/icons/Square44x44Logo.png rename to misc/config_tools/configurator/packages/configurator/src-tauri/icons/Square44x44Logo.png diff --git a/misc/config_tools/configurator/src-tauri/icons/Square71x71Logo.png b/misc/config_tools/configurator/packages/configurator/src-tauri/icons/Square71x71Logo.png similarity index 100% rename from misc/config_tools/configurator/src-tauri/icons/Square71x71Logo.png rename to misc/config_tools/configurator/packages/configurator/src-tauri/icons/Square71x71Logo.png diff --git a/misc/config_tools/configurator/src-tauri/icons/Square89x89Logo.png b/misc/config_tools/configurator/packages/configurator/src-tauri/icons/Square89x89Logo.png similarity index 100% rename from misc/config_tools/configurator/src-tauri/icons/Square89x89Logo.png rename to misc/config_tools/configurator/packages/configurator/src-tauri/icons/Square89x89Logo.png diff --git a/misc/config_tools/configurator/src-tauri/icons/StoreLogo.png b/misc/config_tools/configurator/packages/configurator/src-tauri/icons/StoreLogo.png similarity index 100% rename from misc/config_tools/configurator/src-tauri/icons/StoreLogo.png rename to misc/config_tools/configurator/packages/configurator/src-tauri/icons/StoreLogo.png diff --git a/misc/config_tools/configurator/src-tauri/icons/icon.icns b/misc/config_tools/configurator/packages/configurator/src-tauri/icons/icon.icns similarity index 100% rename from misc/config_tools/configurator/src-tauri/icons/icon.icns rename to misc/config_tools/configurator/packages/configurator/src-tauri/icons/icon.icns diff --git a/misc/config_tools/configurator/src-tauri/icons/icon.ico b/misc/config_tools/configurator/packages/configurator/src-tauri/icons/icon.ico similarity index 100% rename from misc/config_tools/configurator/src-tauri/icons/icon.ico rename to misc/config_tools/configurator/packages/configurator/src-tauri/icons/icon.ico diff --git a/misc/config_tools/configurator/src-tauri/icons/icon.png b/misc/config_tools/configurator/packages/configurator/src-tauri/icons/icon.png similarity index 100% rename from misc/config_tools/configurator/src-tauri/icons/icon.png rename to misc/config_tools/configurator/packages/configurator/src-tauri/icons/icon.png diff --git a/misc/config_tools/configurator/src-tauri/rustfmt.toml b/misc/config_tools/configurator/packages/configurator/src-tauri/rustfmt.toml similarity index 100% rename from misc/config_tools/configurator/src-tauri/rustfmt.toml rename to misc/config_tools/configurator/packages/configurator/src-tauri/rustfmt.toml diff --git a/misc/config_tools/configurator/src-tauri/src/configurator.rs b/misc/config_tools/configurator/packages/configurator/src-tauri/src/configurator.rs similarity index 100% rename from misc/config_tools/configurator/src-tauri/src/configurator.rs rename to misc/config_tools/configurator/packages/configurator/src-tauri/src/configurator.rs diff --git a/misc/config_tools/configurator/src-tauri/src/main.rs b/misc/config_tools/configurator/packages/configurator/src-tauri/src/main.rs similarity index 100% rename from misc/config_tools/configurator/src-tauri/src/main.rs rename to misc/config_tools/configurator/packages/configurator/src-tauri/src/main.rs diff --git a/misc/config_tools/configurator/src-tauri/tauri.conf.json b/misc/config_tools/configurator/packages/configurator/src-tauri/tauri.conf.json similarity index 52% rename from misc/config_tools/configurator/src-tauri/tauri.conf.json rename to misc/config_tools/configurator/packages/configurator/src-tauri/tauri.conf.json index d2b99d2da..60e75c038 100644 --- a/misc/config_tools/configurator/src-tauri/tauri.conf.json +++ b/misc/config_tools/configurator/packages/configurator/src-tauri/tauri.conf.json @@ -1 +1 @@ -{"package":{"productName":"acrn-configurator","version":"../package.json"},"build":{"distDir":"../build","devPath":"http://localhost:3000","beforeDevCommand":"","beforeBuildCommand":""},"tauri":{"bundle":{"active":true,"targets":"all","identifier":"com.projectacrn.configurator","icon":["icons/32x32.png","icons/128x128.png","icons/128x128@2x.png","icons/icon.icns","icons/icon.ico"],"resources":[],"externalBin":[],"copyright":"","category":"DeveloperTool","shortDescription":"","longDescription":"","deb":{"depends":[],"useBootstrapper":false},"macOS":{"frameworks":[],"useBootstrapper":false,"exceptionDomain":"","signingIdentity":null,"providerShortName":null,"entitlements":null},"windows":{"certificateThumbprint":null,"digestAlgorithm":"sha256","timestampUrl":""}},"updater":{"active":false},"allowlist":{"all":true},"windows":[{"title":"ACRN Configurator","width":1366,"height":768,"resizable":true,"fullscreen":false,"decorations":false}],"security":{"csp":null}}} \ No newline at end of file +{"package":{"productName":"acrn-configurator","version":"../package.json"},"build":{"distDir":"../build","devPath":"http://localhost:3000","beforeDevCommand":"","beforeBuildCommand":""},"tauri":{"bundle":{"active":true,"targets":"all","identifier":"com.projectacrn.configurator","icon":["icons/32x32.png","icons/128x128.png","icons/128x128@2x.png","icons/icon.icns","icons/icon.ico"],"resources":[],"externalBin":[],"copyright":"","category":"DeveloperTool","shortDescription":"","longDescription":"","deb":{"depends":[]},"macOS":{"frameworks":[],"exceptionDomain":"","signingIdentity":null,"providerShortName":null,"entitlements":null},"windows":{"certificateThumbprint":null,"digestAlgorithm":"sha256","timestampUrl":""}},"updater":{"active":false},"allowlist":{"all":true},"windows":[{"title":"ACRN Configurator","width":1366,"height":768,"resizable":true,"fullscreen":false,"decorations":false}],"security":{"csp":null}}} \ No newline at end of file diff --git a/misc/config_tools/configurator/src-tauri/tauri.json b/misc/config_tools/configurator/packages/configurator/src-tauri/tauri.json similarity index 93% rename from misc/config_tools/configurator/src-tauri/tauri.json rename to misc/config_tools/configurator/packages/configurator/src-tauri/tauri.json index bb9b7b0da..165e20f8c 100644 --- a/misc/config_tools/configurator/src-tauri/tauri.json +++ b/misc/config_tools/configurator/packages/configurator/src-tauri/tauri.json @@ -28,12 +28,10 @@ "shortDescription": "", "longDescription": "", "deb": { - "depends": [], - "useBootstrapper": false + "depends": [] }, "macOS": { "frameworks": [], - "useBootstrapper": false, "exceptionDomain": "", "signingIdentity": null, "providerShortName": null, diff --git a/misc/config_tools/configurator/src-tauri/types/config.ts b/misc/config_tools/configurator/packages/configurator/src-tauri/types/config.ts similarity index 100% rename from misc/config_tools/configurator/src-tauri/types/config.ts rename to misc/config_tools/configurator/packages/configurator/src-tauri/types/config.ts diff --git a/misc/config_tools/configurator/src-tauri/types/schema.json b/misc/config_tools/configurator/packages/configurator/src-tauri/types/schema.json similarity index 100% rename from misc/config_tools/configurator/src-tauri/types/schema.json rename to misc/config_tools/configurator/packages/configurator/src-tauri/types/schema.json diff --git a/misc/config_tools/configurator/src/App.vue b/misc/config_tools/configurator/packages/configurator/src/App.vue similarity index 100% rename from misc/config_tools/configurator/src/App.vue rename to misc/config_tools/configurator/packages/configurator/src/App.vue diff --git a/misc/config_tools/configurator/src/assets/css/index.scss b/misc/config_tools/configurator/packages/configurator/src/assets/css/index.scss similarity index 100% rename from misc/config_tools/configurator/src/assets/css/index.scss rename to misc/config_tools/configurator/packages/configurator/src/assets/css/index.scss diff --git a/misc/config_tools/configurator/src/assets/images/ACRN_Logo.svg b/misc/config_tools/configurator/packages/configurator/src/assets/images/ACRN_Logo.svg similarity index 100% rename from misc/config_tools/configurator/src/assets/images/ACRN_Logo.svg rename to misc/config_tools/configurator/packages/configurator/src/assets/images/ACRN_Logo.svg diff --git a/misc/config_tools/configurator/src/assets/images/Plus.svg b/misc/config_tools/configurator/packages/configurator/src/assets/images/Plus.svg similarity index 100% rename from misc/config_tools/configurator/src/assets/images/Plus.svg rename to misc/config_tools/configurator/packages/configurator/src/assets/images/Plus.svg diff --git a/misc/config_tools/configurator/src/assets/images/back_arrow_icon.svg b/misc/config_tools/configurator/packages/configurator/src/assets/images/back_arrow_icon.svg similarity index 100% rename from misc/config_tools/configurator/src/assets/images/back_arrow_icon.svg rename to misc/config_tools/configurator/packages/configurator/src/assets/images/back_arrow_icon.svg diff --git a/misc/config_tools/configurator/src/assets/images/dropdown_arrow.svg b/misc/config_tools/configurator/packages/configurator/src/assets/images/dropdown_arrow.svg similarity index 100% rename from misc/config_tools/configurator/src/assets/images/dropdown_arrow.svg rename to misc/config_tools/configurator/packages/configurator/src/assets/images/dropdown_arrow.svg diff --git a/misc/config_tools/configurator/src/assets/images/top_pattern.png b/misc/config_tools/configurator/packages/configurator/src/assets/images/top_pattern.png similarity index 100% rename from misc/config_tools/configurator/src/assets/images/top_pattern.png rename to misc/config_tools/configurator/packages/configurator/src/assets/images/top_pattern.png diff --git a/misc/config_tools/configurator/src/assets/schema/scenario.json b/misc/config_tools/configurator/packages/configurator/src/assets/schema/scenario.json similarity index 96% rename from misc/config_tools/configurator/src/assets/schema/scenario.json rename to misc/config_tools/configurator/packages/configurator/src/assets/schema/scenario.json index 4059c4e5e..e4909d816 100644 --- a/misc/config_tools/configurator/src/assets/schema/scenario.json +++ b/misc/config_tools/configurator/packages/configurator/src/assets/schema/scenario.json @@ -16,7 +16,12 @@ "enum": [ "y", "n" - ] + ], + "ui:widget": "b-form-checkbox", + "ui:options": { + "value": "y", + "unchecked-value": "n" + } }, "EnablementType": { "type": "string", @@ -599,6 +604,7 @@ "properties": { "size": { "type": "integer", + "minimum": 0, "default": 256, "title": "Memory size (MB)", "description": "
\n

\n Specify the physical memory size allocated to this VM in megabytes.\n

\n
\n" @@ -739,18 +745,18 @@ "properties": { "pci_dev": { "items": { - "type": "string" + "type": "string", + "enum": { + "type": "dynamicEnum", + "function": "get_enum", + "source": "board_xml", + "selector": "//device[class]/@description", + "sorted": "lambda s: (s.split(' ', maxsplit=1)[-1].split(':')[0], s.split(' ')[0])" + } }, "type": "array", "title": "PCI device assignment", - "description": "
\n

\n Select the PCI devices you want to assign to this virtual machine.\n

\n
\n", - "enum": { - "type": "dynamicEnum", - "function": "get_enum", - "source": "board_xml", - "selector": "//device[class]/@description", - "sorted": "lambda s: (s.split(' ', maxsplit=1)[-1].split(':')[0], s.split(' ')[0])" - } + "description": "
\n

\n Select the PCI devices you want to assign to this virtual machine.\n

\n
\n" } } }, @@ -1050,6 +1056,8 @@ }, "MAX_PT_IRQ_ENTRIES": { "type": "integer", + "minimum": 1, + "maximum": 1024, "default": 256, "title": "Max passthrough IRQ entries", "description": "
\n

\n Specify the maximum number of interrupt request (IRQ) entries from all passthrough devices.\n

\n
\n" @@ -1339,7 +1347,7 @@ "gpu": { "type": "string", "title": "Virtio GPU device", - "description": "
\n
\n
\n The virtio GPU device presents a GPU device to the VM.\n
\n
\n

\n This feature enables you to view the VM's GPU output in the Service VM.\n

\n
\n
\n
\n" + "description": "
\n

\n The virtio GPU device presents a GPU device to the VM.\nThis feature enables you to view the VM's GPU output in the Service VM.\n

\n
\n" } }, "title": "Virt-IO devices", @@ -1630,6 +1638,7 @@ "properties": { "size": { "type": "integer", + "minimum": 0, "default": 256, "title": "Memory size (MB)", "description": "
\n

\n Specify the physical memory size allocated to this VM in megabytes.\n

\n
\n" @@ -1811,7 +1820,7 @@ "gpu": { "type": "string", "title": "Virtio GPU device", - "description": "
\n
\n
\n The virtio GPU device presents a GPU device to the VM.\n
\n
\n

\n This feature enables you to view the VM's GPU output in the Service VM.\n

\n
\n
\n
\n" + "description": "
\n

\n The virtio GPU device presents a GPU device to the VM.\nThis feature enables you to view the VM's GPU output in the Service VM.\n

\n
\n" } }, "title": "Virt-IO devices", @@ -1824,6 +1833,7 @@ "properties": { "size": { "type": "integer", + "minimum": 0, "default": 256, "title": "Memory size (MB)", "description": "
\n

\n Specify the physical memory size allocated to this VM in megabytes.\n

\n
\n" @@ -1975,7 +1985,7 @@ "gpu": { "type": "string", "title": "Virtio GPU device", - "description": "
\n
\n
\n The virtio GPU device presents a GPU device to the VM.\n
\n
\n

\n This feature enables you to view the VM's GPU output in the Service VM.\n

\n
\n
\n
\n" + "description": "
\n

\n The virtio GPU device presents a GPU device to the VM.\nThis feature enables you to view the VM's GPU output in the Service VM.\n

\n
\n" } }, "title": "Virt-IO devices", @@ -2181,7 +2191,7 @@ "gpu": { "type": "string", "title": "Virtio GPU device", - "description": "
\n
\n
\n The virtio GPU device presents a GPU device to the VM.\n
\n
\n

\n This feature enables you to view the VM's GPU output in the Service VM.\n

\n
\n
\n
\n" + "description": "
\n

\n The virtio GPU device presents a GPU device to the VM.\nThis feature enables you to view the VM's GPU output in the Service VM.\n

\n
\n" } }, "title": "Virt-IO devices", @@ -2501,6 +2511,8 @@ }, "MAX_PT_IRQ_ENTRIES": { "type": "integer", + "minimum": 1, + "maximum": 1024, "default": 256, "title": "Max passthrough IRQ entries", "description": "
\n

\n Specify the maximum number of interrupt request (IRQ) entries from all passthrough devices.\n

\n
\n" diff --git a/misc/config_tools/configurator/src/components/common/Banner.vue b/misc/config_tools/configurator/packages/configurator/src/components/common/Banner.vue similarity index 100% rename from misc/config_tools/configurator/src/components/common/Banner.vue rename to misc/config_tools/configurator/packages/configurator/src/components/common/Banner.vue diff --git a/misc/config_tools/configurator/src/components/common/ControlBar.vue b/misc/config_tools/configurator/packages/configurator/src/components/common/ControlBar.vue similarity index 100% rename from misc/config_tools/configurator/src/components/common/ControlBar.vue rename to misc/config_tools/configurator/packages/configurator/src/components/common/ControlBar.vue diff --git a/misc/config_tools/configurator/src/components/common/Footer.vue b/misc/config_tools/configurator/packages/configurator/src/components/common/Footer.vue similarity index 100% rename from misc/config_tools/configurator/src/components/common/Footer.vue rename to misc/config_tools/configurator/packages/configurator/src/components/common/Footer.vue diff --git a/misc/config_tools/configurator/src/lib/acrn.ts b/misc/config_tools/configurator/packages/configurator/src/lib/acrn.ts similarity index 94% rename from misc/config_tools/configurator/src/lib/acrn.ts rename to misc/config_tools/configurator/packages/configurator/src/lib/acrn.ts index 547060514..ebbd63878 100644 --- a/misc/config_tools/configurator/src/lib/acrn.ts +++ b/misc/config_tools/configurator/packages/configurator/src/lib/acrn.ts @@ -1,6 +1,5 @@ import {dialog, invoke} from "@tauri-apps/api"; import JSON2XML from "./json2xml" -import scenarioSchema from "../assets/schema/scenario.json"; import {OpenDialogOptions} from "@tauri-apps/api/dialog"; enum HistoryType { @@ -34,6 +33,10 @@ class PythonObject { generateLaunchScript(boardXMLText, scenarioXMLText) { return this.api('generateLaunchScript', boardXMLText, scenarioXMLText) } + + populateDefaultValues(scenarioXMLText) { + return this.api('populateDefaultValues', scenarioXMLText) + } } class Configurator { @@ -93,13 +96,8 @@ class Configurator { loadBoard(path: String) { return this.readFile(path) .then((fileContent) => { - let params = JSON.stringify({ - boardXML: fileContent, - scenarioSchema: scenarioSchema - }) return this.pythonObject.loadBoard(fileContent) }) - } loadScenario(path: String): Object { diff --git a/misc/config_tools/configurator/src/lib/json2xml.js b/misc/config_tools/configurator/packages/configurator/src/lib/json2xml.js similarity index 100% rename from misc/config_tools/configurator/src/lib/json2xml.js rename to misc/config_tools/configurator/packages/configurator/src/lib/json2xml.js diff --git a/misc/config_tools/configurator/packages/configurator/src/main.js b/misc/config_tools/configurator/packages/configurator/src/main.js new file mode 100644 index 000000000..a2af09598 --- /dev/null +++ b/misc/config_tools/configurator/packages/configurator/src/main.js @@ -0,0 +1,59 @@ +const isTauri = !!window.__TAURI_IPC__; + +if (isTauri) { + let openCount = 0 + + function openDevTools() { + openCount++; + console.log(`openCount ${openCount} of 5`) + if (openCount >= 5) { + invoke('open_devtools', {}) + } + } + + window.openDevTools = openDevTools; +} else { + (async () => { + // Patch Browser function to mock Tauri env + let mockJS = await import('../tests/mock'); + mockJS.default(); + })() +} + +import {createApp} from 'vue'; +import App from './App.vue'; + +import router from "./router"; +import {invoke} from "@tauri-apps/api/tauri"; +import BootstrapVue3 from 'bootstrap-vue-3' +import naive from 'naive-ui'; + +const app = createApp(App); +app.use(BootstrapVue3); +app.use(naive); +app.use(router); +app.config.unwrapInjectedRef = true + + +async function main() { + console.log("Pyodide Load Begin") + let t1 = Date.now(); + let WASMPythonLoader = await import('./pyodide'); + await WASMPythonLoader.default() + let t2 = Date.now(); + console.log("Pyodide Load Time: " + (t2 - t1) + "ms") + + async function setWindowSystemInfo() { + let homeDir = await invoke("get_home"); + let pathSplit = homeDir.indexOf("\\") > 0 ? "\\" : "/"; + window.systemInfo = { + homeDir, pathSplit + } + } + + await setWindowSystemInfo(); + + app.mount('#app') +} + +main(); diff --git a/misc/config_tools/configurator/src/pages/Config.vue b/misc/config_tools/configurator/packages/configurator/src/pages/Config.vue similarity index 89% rename from misc/config_tools/configurator/src/pages/Config.vue rename to misc/config_tools/configurator/packages/configurator/src/pages/Config.vue index 1e6416bc2..d38bd94ab 100644 --- a/misc/config_tools/configurator/src/pages/Config.vue +++ b/misc/config_tools/configurator/packages/configurator/src/pages/Config.vue @@ -32,15 +32,18 @@ - + +
+ +
+
@@ -80,7 +83,7 @@ import Banner from '../components/common/Banner.vue'; import Board from "./Config/Board.vue"; import Scenario from "./Config/Scenario.vue"; import TabBox from "./Config/ConfigForm/TabBox.vue"; -import ConfigForm from "./Config/ConfigForm/ConfigForm.vue"; +import ConfigForm from "./Config/ConfigForm.vue"; import configurator from "../lib/acrn"; @@ -90,6 +93,7 @@ export default { props: ['WorkingFolder'], mounted() { this.updateCurrentFormSchema() + window.getCurrentScenarioData = this.getCurrentScenarioData }, data() { return { @@ -119,7 +123,6 @@ export default { this.updateCurrentFormSchema() }, updateCurrentFormSchema() { - console.log(this.schemas) if (this.activeVMID === -1) { this.currentFormSchema = this.schemas.HV } else { @@ -140,8 +143,10 @@ export default { this.updateCurrentFormSchema() this.updateCurrentFormData() }, + getCurrentScenarioData() { + return this.scenario + }, updateCurrentFormData() { - console.log(this.scenario) if (this.activeVMID === -1) { this.currentFormData = this.scenario.hv; } @@ -249,6 +254,17 @@ export default { "acrn-config": JSON.parse(JSON.stringify(this.scenario)) } ); + console.log(scenarioXMLData) + // get scenario Defaults + let scenarioWithDefault = configurator.pythonObject.populateDefaultValues(scenarioXMLData) + console.log(scenarioWithDefault) + // write defaults to frontend + this.scenario = scenarioWithDefault.json['acrn-config'] + this.updateCurrentFormData() + // get scenario XML with defaults + scenarioXMLData = scenarioWithDefault.xml + debugger + // begin write down and verify configurator.writeFile(this.WorkingFolder + 'scenario.xml', scenarioXMLData) .then(() => { step = 1 @@ -279,5 +295,11 @@ export default { diff --git a/misc/config_tools/configurator/src/pages/Config/Board.vue b/misc/config_tools/configurator/packages/configurator/src/pages/Config/Board.vue similarity index 96% rename from misc/config_tools/configurator/src/pages/Config/Board.vue rename to misc/config_tools/configurator/packages/configurator/src/pages/Config/Board.vue index 2797582ea..6341f3ad1 100644 --- a/misc/config_tools/configurator/src/pages/Config/Board.vue +++ b/misc/config_tools/configurator/packages/configurator/src/pages/Config/Board.vue @@ -77,7 +77,7 @@ export default { default: {} } }, - emits:['boardUpdate'], + emits: ['boardUpdate'], data() { return { boardHistory: [], @@ -88,7 +88,10 @@ export default { }, mounted() { this.getBoardHistory() - //Todo: auto load board + .then(() => { + this.importBoard() + }) + // Todo: auto load board }, computed: { imported() { @@ -123,7 +126,7 @@ export default { if (filepath.length > 0) { configurator.loadBoard(filepath) .then(({scenarioJSONSchema, boardInfo}) => { - this.$emit('boardUpdate', boardInfo,scenarioJSONSchema); + this.$emit('boardUpdate', boardInfo, scenarioJSONSchema); let boardFileNewPath = this.WorkingFolder + boardInfo.name; // Todo: use rust command writeBoard to fix bugs. configurator.writeFile(boardFileNewPath, boardInfo.content) diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigForm/ConfigForm.vue b/misc/config_tools/configurator/packages/configurator/src/pages/Config/ConfigForm.vue similarity index 84% rename from misc/config_tools/configurator/src/pages/Config/ConfigForm/ConfigForm.vue rename to misc/config_tools/configurator/packages/configurator/src/pages/Config/ConfigForm.vue index d8f4c47ae..5b42f1562 100644 --- a/misc/config_tools/configurator/src/pages/Config/ConfigForm/ConfigForm.vue +++ b/misc/config_tools/configurator/packages/configurator/src/pages/Config/ConfigForm.vue @@ -56,7 +56,7 @@ import VueForm, {i18n} from "@lljj/vue3-form-naive" import {Icon} from "@vicons/utils"; import {Minus} from "@vicons/fa" import localizeEn from 'ajv-i18n/localize/en'; - +import IVSHMEM_REGION from "./ConfigForm/CustomWidget/IVSHMEM_REGION.vue"; i18n.useLocal(localizeEn); export default { @@ -77,7 +77,28 @@ export default { "labelWidth": "300px", "labelSuffix": ":" }, - uiSchema: {} + uiSchema: { + "FEATURES": { + "IVSHMEM": { + "ui:title": "InterVM shared memory", + "IVSHMEM_REGION": { + "ui:title": "", + "ui:sortable": false, + "ui:field": IVSHMEM_REGION, + } + } + }, + "vuart_connections": { + "vuart_connection": { + "ui:sortable": false, + "items": { + "endpoint": { + "ui:sortable": false + } + } + } + } + } }; }, methods: { diff --git a/misc/config_tools/configurator/packages/configurator/src/pages/Config/ConfigForm/CustomWidget/IVSHMEM_REGION.vue b/misc/config_tools/configurator/packages/configurator/src/pages/Config/ConfigForm/CustomWidget/IVSHMEM_REGION.vue new file mode 100644 index 000000000..938acc481 --- /dev/null +++ b/misc/config_tools/configurator/packages/configurator/src/pages/Config/ConfigForm/CustomWidget/IVSHMEM_REGION.vue @@ -0,0 +1,240 @@ + + + + + \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigForm/TabBox.vue b/misc/config_tools/configurator/packages/configurator/src/pages/Config/ConfigForm/TabBox.vue similarity index 100% rename from misc/config_tools/configurator/src/pages/Config/ConfigForm/TabBox.vue rename to misc/config_tools/configurator/packages/configurator/src/pages/Config/ConfigForm/TabBox.vue diff --git a/misc/config_tools/configurator/src/pages/Config/NewBoard.vue b/misc/config_tools/configurator/packages/configurator/src/pages/Config/NewBoard.vue similarity index 100% rename from misc/config_tools/configurator/src/pages/Config/NewBoard.vue rename to misc/config_tools/configurator/packages/configurator/src/pages/Config/NewBoard.vue diff --git a/misc/config_tools/configurator/src/pages/Config/Scenario.vue b/misc/config_tools/configurator/packages/configurator/src/pages/Config/Scenario.vue similarity index 88% rename from misc/config_tools/configurator/src/pages/Config/Scenario.vue rename to misc/config_tools/configurator/packages/configurator/src/pages/Config/Scenario.vue index 43a105adf..cf8294781 100644 --- a/misc/config_tools/configurator/src/pages/Config/Scenario.vue +++ b/misc/config_tools/configurator/packages/configurator/src/pages/Config/Scenario.vue @@ -27,7 +27,7 @@
-
@@ -62,20 +62,27 @@ export default { } }, mounted() { - this.getScenarioHistory() + this.getScenarioHistory().then(() => { + // delay 2s for board loading + setTimeout(() => { + this.loadScenario(true) + }, 2000); + }) // Todo: auto load scenario }, methods: { newScenario(data) { this.$emit('scenarioUpdate', data) }, - loadScenario() { + loadScenario(auto = false) { if (this.currentSelectedScenario.length > 0) { configurator.loadScenario(this.currentSelectedScenario) .then((scenarioConfig) => { console.log(scenarioConfig) this.$emit('scenarioUpdate', scenarioConfig['acrn-config']) - alert(`Scenario ${this.currentSelectedScenario} loaded success!`) + if (!auto) { + alert(`Scenario ${this.currentSelectedScenario} loaded success!`) + } }).catch((err) => { console.log(err) alert(`Failed to open ${this.currentSelectedScenario}, file may not exist`) @@ -96,7 +103,7 @@ export default { }) }, getScenarioHistory() { - configurator.getHistory("Scenario") + return configurator.getHistory("Scenario") .then((scenarioHistory) => { this.scenarioHistory = scenarioHistory if (this.scenarioHistory.length > 0) { diff --git a/misc/config_tools/configurator/src/pages/Config/Scenario/NewScenario.vue b/misc/config_tools/configurator/packages/configurator/src/pages/Config/Scenario/NewScenario.vue similarity index 100% rename from misc/config_tools/configurator/src/pages/Config/Scenario/NewScenario.vue rename to misc/config_tools/configurator/packages/configurator/src/pages/Config/Scenario/NewScenario.vue diff --git a/misc/config_tools/configurator/src/pages/Welcome.vue b/misc/config_tools/configurator/packages/configurator/src/pages/Welcome.vue similarity index 100% rename from misc/config_tools/configurator/src/pages/Welcome.vue rename to misc/config_tools/configurator/packages/configurator/src/pages/Welcome.vue diff --git a/misc/config_tools/configurator/src/pages/Welcome/NewConfiguration.vue b/misc/config_tools/configurator/packages/configurator/src/pages/Welcome/NewConfiguration.vue similarity index 100% rename from misc/config_tools/configurator/src/pages/Welcome/NewConfiguration.vue rename to misc/config_tools/configurator/packages/configurator/src/pages/Welcome/NewConfiguration.vue diff --git a/misc/config_tools/configurator/src/pages/Welcome/UseExisting.vue b/misc/config_tools/configurator/packages/configurator/src/pages/Welcome/UseExisting.vue similarity index 100% rename from misc/config_tools/configurator/src/pages/Welcome/UseExisting.vue rename to misc/config_tools/configurator/packages/configurator/src/pages/Welcome/UseExisting.vue diff --git a/misc/config_tools/configurator/packages/configurator/src/pyodide.js b/misc/config_tools/configurator/packages/configurator/src/pyodide.js new file mode 100644 index 000000000..b35ff1e94 --- /dev/null +++ b/misc/config_tools/configurator/packages/configurator/src/pyodide.js @@ -0,0 +1,37 @@ +import {loadPyodide} from "/thirdLib/pyodide/pyodide"; +import scenarioJSONSchema from './assets/schema/scenario.json'; + +window.__dynamic__load__scenario__from__pyodide__ = () => { + return JSON.stringify(scenarioJSONSchema) +} + + +export default async function () { + let pyodide = await loadPyodide({ + indexURL: '/thirdLib/pyodide/' + }); + await pyodide.loadPackage(['micropip', 'lxml', 'beautifulsoup4']) + await pyodide.runPythonAsync(` + import micropip + await micropip.install([ + './thirdLib/xmltodict-0.12.0-py2.py3-none-any.whl', + './thirdLib/elementpath-2.4.0-py3-none-any.whl', + './thirdLib/defusedxml-0.7.1-py2.py3-none-any.whl', + './thirdLib/xmlschema-1.9.2-py3-none-any.whl', + './thirdLib/acrn_config_tools-3.0-py3-none-any.whl' + ]) + `) + + function test() { + let result = pyodide.runPython(` + import sys + sys.version + `) + console.log(result); + } + + test() + + // pyodide load success + window.pyodide = pyodide; +} \ No newline at end of file diff --git a/misc/config_tools/configurator/src/router.js b/misc/config_tools/configurator/packages/configurator/src/router.js similarity index 100% rename from misc/config_tools/configurator/src/router.js rename to misc/config_tools/configurator/packages/configurator/src/router.js diff --git a/misc/config_tools/configurator/packages/configurator/tests/data/data.json b/misc/config_tools/configurator/packages/configurator/tests/data/data.json new file mode 100644 index 000000000..0c11dc6d5 --- /dev/null +++ b/misc/config_tools/configurator/packages/configurator/tests/data/data.json @@ -0,0 +1,15 @@ +{ + "history": { + "WorkingFolder": [], + "Board": [ + "C:\\Users\\Axel\\acrn-work\\MyConfiguration\\nuc11tnbi5.board.xml" + ], + "Scenario": [ + "C:\\Users\\Axel\\acrn-work\\MyConfiguration\\scenario.xml" + ] + }, + "files": { + "C:\\Users\\Axel\\acrn-work\\MyConfiguration\\nuc11tnbi5.board.xml": "\n \n\tBIOS Information\n\tVendor: Intel Corp.\n\tVersion: TNTGL357.0042.2020.1221.1743\n\tRelease Date: 12/21/2020\n\tBIOS Revision: 5.19\n\t\n \n\tBase Board Information\n\tManufacturer: Intel Corporation\n\tProduct Name: NUC11TNBi5\n\tVersion: M11904-403\n\t\n \n\t00:00.0 Host bridge: Intel Corporation 11th Gen Core Processor Host Bridge/DRAM Registers (rev 01)\n\t00:02.0 VGA compatible controller: Intel Corporation TigerLake-LP GT2 [Iris Xe Graphics] (rev 01)\n\tRegion 0: Memory at 603c000000 (64-bit, non-prefetchable) [size=16M]\n\tRegion 2: Memory at 4000000000 (64-bit, prefetchable) [size=256M]\n\tRegion 0: Memory at 0000004010000000 (64-bit, non-prefetchable)\n\tRegion 2: Memory at 0000004020000000 (64-bit, prefetchable)\n\t00:06.0 PCI bridge: Intel Corporation 11th Gen Core Processor PCIe Controller (rev 01)\n\t00:07.0 PCI bridge: Intel Corporation Tiger Lake-LP Thunderbolt 4 PCI Express Root Port #1 (rev 01)\n\t00:07.2 PCI bridge: Intel Corporation Tiger Lake-LP Thunderbolt 4 PCI Express Root Port #2 (rev 01)\n\t00:08.0 System peripheral: Intel Corporation GNA Scoring Accelerator module (rev 01)\n\tRegion 0: Memory at 603d1b3000 (64-bit, non-prefetchable) [disabled] [size=4K]\n\t00:0d.0 USB controller: Intel Corporation Tiger Lake-LP Thunderbolt 4 USB Controller (rev 01)\n\tRegion 0: Memory at 603d190000 (64-bit, non-prefetchable) [size=64K]\n\t00:0d.2 USB controller: Intel Corporation Tiger Lake-LP Thunderbolt 4 NHI #0 (rev 01)\n\tRegion 0: Memory at 603d140000 (64-bit, non-prefetchable) [size=256K]\n\tRegion 2: Memory at 603d1b2000 (64-bit, non-prefetchable) [size=4K]\n\t00:0d.3 USB controller: Intel Corporation Tiger Lake-LP Thunderbolt 4 NHI #1 (rev 01)\n\tRegion 0: Memory at 603d100000 (64-bit, non-prefetchable) [size=256K]\n\tRegion 2: Memory at 603d1b1000 (64-bit, non-prefetchable) [size=4K]\n\t00:14.0 USB controller: Intel Corporation Tiger Lake-LP USB 3.2 Gen 2x1 xHCI Host Controller (rev 20)\n\tRegion 0: Memory at 603d180000 (64-bit, non-prefetchable) [size=64K]\n\t00:14.2 RAM memory: Intel Corporation Tiger Lake-LP Shared SRAM (rev 20)\n\tRegion 0: Memory at 603d1a8000 (64-bit, non-prefetchable) [disabled] [size=16K]\n\tRegion 2: Memory at 603d1b0000 (64-bit, non-prefetchable) [disabled] [size=4K]\n\t00:14.3 Network controller: Intel Corporation Wi-Fi 6 AX201 (rev 20)\n\tRegion 0: Memory at 603d1a4000 (64-bit, non-prefetchable) [size=16K]\n\t00:15.0 Serial bus controller: Intel Corporation Tiger Lake-LP Serial IO I2C Controller #0 (rev 20)\n\tRegion 0: Memory at 4017000000 (64-bit, non-prefetchable) [virtual] [size=4K]\n\t00:15.1 Serial bus controller: Intel Corporation Tiger Lake-LP Serial IO I2C Controller #1 (rev 20)\n\tRegion 0: Memory at 4017001000 (64-bit, non-prefetchable) [virtual] [size=4K]\n\t00:16.0 Communication controller: Intel Corporation Tiger Lake-LP Management Engine Interface (rev 20)\n\tRegion 0: Memory at 603d1ad000 (64-bit, non-prefetchable) [size=4K]\n\t00:17.0 SATA controller: Intel Corporation Device a0d3 (rev 20)\n\tRegion 0: Memory at 6a500000 (32-bit, non-prefetchable) [size=8K]\n\tRegion 1: Memory at 6a503000 (32-bit, non-prefetchable) [size=256]\n\tRegion 5: Memory at 6a502000 (32-bit, non-prefetchable) [size=2K]\n\t00:1d.0 PCI bridge: Intel Corporation Device a0b1 (rev 20)\n\t00:1f.0 ISA bridge: Intel Corporation Tiger Lake-LP LPC Controller (rev 20)\n\t00:1f.3 Audio device: Intel Corporation Tiger Lake-LP Smart Sound Technology Audio Controller (rev 20)\n\tRegion 0: Memory at 603d1a0000 (64-bit, non-prefetchable) [size=16K]\n\tRegion 4: Memory at 603d000000 (64-bit, non-prefetchable) [size=1M]\n\t00:1f.4 SMBus: Intel Corporation Tiger Lake-LP SMBus Controller (rev 20)\n\tRegion 0: Memory at 603d1ac000 (64-bit, non-prefetchable) [size=256]\n\t00:1f.5 Serial bus controller: Intel Corporation Tiger Lake-LP SPI Controller (rev 20)\n\tRegion 0: Memory at 4f800000 (32-bit, non-prefetchable) [size=4K]\n\t01:00.0 Non-Volatile memory controller: Silicon Motion, Inc. SM2263EN/SM2263XT SSD Controller (rev 03)\n\tRegion 0: Memory at 6a400000 (64-bit, non-prefetchable) [size=16K]\n\t58:00.0 Ethernet controller: Intel Corporation Ethernet Controller I225-LM (rev 03)\n\tRegion 0: Memory at 6a200000 (32-bit, non-prefetchable) [size=1M]\n\tRegion 3: Memory at 6a300000 (32-bit, non-prefetchable) [size=16K]\n\t\n \n\t00:00.0 0600: 8086:9a14 (rev 01)\n\t00:02.0 0300: 8086:9a49 (rev 01)\n\t00:06.0 0604: 8086:9a09 (rev 01)\n\t00:07.0 0604: 8086:9a25 (rev 01)\n\t00:07.2 0604: 8086:9a27 (rev 01)\n\t00:08.0 0880: 8086:9a11 (rev 01)\n\t00:0d.0 0c03: 8086:9a13 (rev 01)\n\t00:0d.2 0c03: 8086:9a1b (rev 01)\n\t00:0d.3 0c03: 8086:9a1d (rev 01)\n\t00:14.0 0c03: 8086:a0ed (rev 20)\n\t00:14.2 0500: 8086:a0ef (rev 20)\n\t00:14.3 0280: 8086:a0f0 (rev 20)\n\t00:15.0 0c80: 8086:a0e8 (rev 20)\n\t00:15.1 0c80: 8086:a0e9 (rev 20)\n\t00:16.0 0780: 8086:a0e0 (rev 20)\n\t00:17.0 0106: 8086:a0d3 (rev 20)\n\t00:1d.0 0604: 8086:a0b1 (rev 20)\n\t00:1f.0 0601: 8086:a082 (rev 20)\n\t00:1f.3 0403: 8086:a0c8 (rev 20)\n\t00:1f.4 0c05: 8086:a0a3 (rev 20)\n\t00:1f.5 0c80: 8086:a0a4 (rev 20)\n\t01:00.0 0108: 126f:2263 (rev 03)\n\t58:00.0 0200: 8086:15f2 (rev 03)\n\t\n \n\t#define WAKE_VECTOR_32 0x40CD000CUL\n\t#define WAKE_VECTOR_64 0x40CD0018UL\n\t\n \n\t#define RESET_REGISTER_ADDRESS 0xCF9UL\n\t#define RESET_REGISTER_SPACE_ID SPACE_SYSTEM_IO\n\t#define RESET_REGISTER_VALUE 0x6U\n\t\n \n\t#define PM1A_EVT_SPACE_ID SPACE_SYSTEM_IO\n\t#define PM1A_EVT_BIT_WIDTH 0x20U\n\t#define PM1A_EVT_BIT_OFFSET 0x0U\n\t#define PM1A_EVT_ADDRESS 0x1800UL\n\t#define PM1A_EVT_ACCESS_SIZE 0x2U\n\t#define PM1B_EVT_SPACE_ID SPACE_SYSTEM_IO\n\t#define PM1B_EVT_BIT_WIDTH 0x0U\n\t#define PM1B_EVT_BIT_OFFSET 0x0U\n\t#define PM1B_EVT_ADDRESS 0x0UL\n\t#define PM1B_EVT_ACCESS_SIZE 0x2U\n\t#define PM1A_CNT_SPACE_ID SPACE_SYSTEM_IO\n\t#define PM1A_CNT_BIT_WIDTH 0x10U\n\t#define PM1A_CNT_BIT_OFFSET 0x0U\n\t#define PM1A_CNT_ADDRESS 0x1804UL\n\t#define PM1A_CNT_ACCESS_SIZE 0x2U\n\t#define PM1B_CNT_SPACE_ID SPACE_SYSTEM_IO\n\t#define PM1B_CNT_BIT_WIDTH 0x0U\n\t#define PM1B_CNT_BIT_OFFSET 0x0U\n\t#define PM1B_CNT_ADDRESS 0x0UL\n\t#define PM1B_CNT_ACCESS_SIZE 0x2U\n\t\n \n\t#define S3_PKG_VAL_PM1A 0x5U\n\t#define S3_PKG_VAL_PM1B 0U\n\t#define S3_PKG_RESERVED 0x0U\n\t\n \n\t#define S5_PKG_VAL_PM1A 0x7U\n\t#define S5_PKG_VAL_PM1B 0U\n\t#define S5_PKG_RESERVED 0x0U\n\t\n \n\t#define DRHD_COUNT 4U\n\n\t#define DRHD0_DEV_CNT 0x1U\n\t#define DRHD0_SEGMENT 0x0U\n\t#define DRHD0_FLAGS 0x0U\n\t#define DRHD0_REG_BASE 0xFED90000UL\n\t#define DRHD0_IGNORE true\n\t#define DRHD0_DEVSCOPE0_TYPE 0x1U\n\t#define DRHD0_DEVSCOPE0_ID 0x0U\n\t#define DRHD0_DEVSCOPE0_BUS 0x0U\n\t#define DRHD0_DEVSCOPE0_PATH 0x10U\n\n\t#define DRHD1_DEV_CNT 0x1U\n\t#define DRHD1_SEGMENT 0x0U\n\t#define DRHD1_FLAGS 0x0U\n\t#define DRHD1_REG_BASE 0xFED85000UL\n\t#define DRHD1_IGNORE false\n\t#define DRHD1_DEVSCOPE0_TYPE 0x2U\n\t#define DRHD1_DEVSCOPE0_ID 0x0U\n\t#define DRHD1_DEVSCOPE0_BUS 0x0U\n\t#define DRHD1_DEVSCOPE0_PATH 0x38U\n\n\t#define DRHD2_DEV_CNT 0x1U\n\t#define DRHD2_SEGMENT 0x0U\n\t#define DRHD2_FLAGS 0x0U\n\t#define DRHD2_REG_BASE 0xFED86000UL\n\t#define DRHD2_IGNORE false\n\t#define DRHD2_DEVSCOPE0_TYPE 0x2U\n\t#define DRHD2_DEVSCOPE0_ID 0x0U\n\t#define DRHD2_DEVSCOPE0_BUS 0x0U\n\t#define DRHD2_DEVSCOPE0_PATH 0x3aU\n\n\t#define DRHD3_DEV_CNT 0x2U\n\t#define DRHD3_SEGMENT 0x0U\n\t#define DRHD3_FLAGS 0x1U\n\t#define DRHD3_REG_BASE 0xFED91000UL\n\t#define DRHD3_IGNORE false\n\t#define DRHD3_DEVSCOPE0_TYPE 0x3U\n\t#define DRHD3_DEVSCOPE0_ID 0x2U\n\t#define DRHD3_DEVSCOPE0_BUS 0x0U\n\t#define DRHD3_DEVSCOPE0_PATH 0xf7U\n\t#define DRHD3_DEVSCOPE1_TYPE 0x4U\n\t#define DRHD3_DEVSCOPE1_ID 0x0U\n\t#define DRHD3_DEVSCOPE1_BUS 0x0U\n\t#define DRHD3_DEVSCOPE1_PATH 0xf6U\n\n\t\n \n\t\"11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz\"\n\t\n \n\t{{SPACE_FFixedHW, 0x00U, 0x00U, 0x00U, 0x00UL}, 0x01U, 0x01U, 0x00U},\t/* C1 */\n\t{{SPACE_SYSTEM_IO, 0x08U, 0x00U, 0x00U, 0x1816UL}, 0x02U, 0xFDU, 0x00U},\t/* C2 */\n\t{{SPACE_SYSTEM_IO, 0x08U, 0x00U, 0x00U, 0x1819UL}, 0x03U, 0x418U, 0x00U},\t/* C3 */\n\t\n \n\t{0x961UL, 0x00UL, 0x0AUL, 0x0AUL, 0x002A00UL, 0x002A00UL},\t/* P0 */\n\t{0x960UL, 0x00UL, 0x0AUL, 0x0AUL, 0x001800UL, 0x001800UL},\t/* P1 */\n\t{0x8FCUL, 0x00UL, 0x0AUL, 0x0AUL, 0x001700UL, 0x001700UL},\t/* P2 */\n\t{0x834UL, 0x00UL, 0x0AUL, 0x0AUL, 0x001500UL, 0x001500UL},\t/* P3 */\n\t{0x7D0UL, 0x00UL, 0x0AUL, 0x0AUL, 0x001400UL, 0x001400UL},\t/* P4 */\n\t{0x708UL, 0x00UL, 0x0AUL, 0x0AUL, 0x001200UL, 0x001200UL},\t/* P5 */\n\t{0x6A4UL, 0x00UL, 0x0AUL, 0x0AUL, 0x001100UL, 0x001100UL},\t/* P6 */\n\t{0x5DCUL, 0x00UL, 0x0AUL, 0x0AUL, 0x000F00UL, 0x000F00UL},\t/* P7 */\n\t{0x578UL, 0x00UL, 0x0AUL, 0x0AUL, 0x000E00UL, 0x000E00UL},\t/* P8 */\n\t{0x514UL, 0x00UL, 0x0AUL, 0x0AUL, 0x000D00UL, 0x000D00UL},\t/* P9 */\n\t{0x44CUL, 0x00UL, 0x0AUL, 0x0AUL, 0x000B00UL, 0x000B00UL},\t/* P10 */\n\t{0x384UL, 0x00UL, 0x0AUL, 0x0AUL, 0x000900UL, 0x000900UL},\t/* P11 */\n\t{0x320UL, 0x00UL, 0x0AUL, 0x0AUL, 0x000800UL, 0x000800UL},\t/* P12 */\n\t{0x2BCUL, 0x00UL, 0x0AUL, 0x0AUL, 0x000700UL, 0x000700UL},\t/* P13 */\n\t{0x1F4UL, 0x00UL, 0x0AUL, 0x0AUL, 0x000500UL, 0x000500UL},\t/* P14 */\n\t{0x190UL, 0x00UL, 0x0AUL, 0x0AUL, 0x000400UL, 0x000400UL},\t/* P15 */\n\t\n \n\t/* PCI mmcfg base of MCFG */\n\t#define DEFAULT_PCI_MMCFG_BASE 0xc0000000UL\n\t\n \n\tTPM2\n\t\n \n\trdt resources supported: L2\n\trdt resource clos max: 8\n\trdt resource mask max: '0xfffff'\n\t\n \n\t00000000-00000fff : Reserved\n\t00001000-0009efff : System RAM\n\t0009f000-000fffff : Reserved\n\t 000a0000-000bffff : PCI Bus 0000:00\n\t 00000000-00000000 : PCI Bus 0000:00\n\t 00000000-00000000 : PCI Bus 0000:00\n\t 00000000-00000000 : PCI Bus 0000:00\n\t 00000000-00000000 : PCI Bus 0000:00\n\t 000e0000-000fffff : PCI Bus 0000:00\n\t 000f0000-000fffff : System ROM\n\t00100000-2ed24fff : System RAM\n\t2ed25000-2ed25fff : Reserved\n\t2ed26000-33a96fff : System RAM\n\t33a97000-33a97fff : Reserved\n\t33a98000-3812cfff : System RAM\n\t3812d000-40b47fff : Reserved\n\t40b48000-40c13fff : ACPI Tables\n\t40c14000-40cd3fff : ACPI Non-volatile Storage\n\t40cd4000-417fefff : Reserved\n\t417ff000-417fffff : System RAM\n\t41800000-47ffffff : Reserved\n\t48e00000-4f7fffff : Reserved\n\t 4b800000-4f7fffff : Graphics Stolen Memory\n\t4f800000-bfffffff : PCI Bus 0000:00\n\t 4f800000-4f800fff : 0000:00:1f.5\n\t 50000000-5c1fffff : PCI Bus 0000:2d\n\t 5e000000-6a1fffff : PCI Bus 0000:02\n\t 6a200000-6a3fffff : PCI Bus 0000:58\n\t 6a200000-6a2fffff : 0000:58:00.0\n\t 6a200000-6a2fffff : igc\n\t 6a300000-6a303fff : 0000:58:00.0\n\t 6a300000-6a303fff : igc\n\t 6a400000-6a4fffff : PCI Bus 0000:01\n\t 6a400000-6a403fff : 0000:01:00.0\n\t 6a400000-6a403fff : nvme\n\t 6a500000-6a501fff : 0000:00:17.0\n\t 6a500000-6a501fff : ahci\n\t 6a502000-6a5027ff : 0000:00:17.0\n\t 6a502000-6a5027ff : ahci\n\t 6a503000-6a5030ff : 0000:00:17.0\n\t 6a503000-6a5030ff : ahci\n\tc0000000-cfffffff : PCI MMCONFIG 0000 [bus 00-ff]\n\t c0000000-cfffffff : Reserved\n\tfd000000-fd68ffff : pnp 00:05\n\tfd690000-fd69ffff : INT34C5:00\n\t fd690000-fd69ffff : INT34C5:00 INT34C5:00\n\tfd6a0000-fd6affff : INT34C5:00\n\t fd6a0000-fd6affff : INT34C5:00 INT34C5:00\n\tfd6b0000-fd6cffff : pnp 00:05\n\tfd6d0000-fd6dffff : INT34C5:00\n\t fd6d0000-fd6dffff : INT34C5:00 INT34C5:00\n\tfd6e0000-fd6effff : INT34C5:00\n\t fd6e0000-fd6effff : INT34C5:00 INT34C5:00\n\tfd6f0000-fdffffff : pnp 00:05\n\tfe000000-fe010fff : Reserved\n\tfe04c000-fe04ffff : pnp 00:05\n\tfe050000-fe0affff : pnp 00:05\n\tfe0d0000-fe0fffff : pnp 00:05\n\tfe200000-fe7fffff : pnp 00:05\n\tfec00000-fec00fff : Reserved\n\t fec00000-fec003ff : IOAPIC 0\n\tfed00000-fed00fff : Reserved\n\t fed00000-fed003ff : HPET 0\n\t fed00000-fed003ff : PNP0103:00\n\tfed20000-fed7ffff : Reserved\n\t fed40000-fed44fff : MSFT0101:00\n\t fed40000-fed44fff : MSFT0101:00\n\tfed85000-fed85fff : dmar1\n\tfed86000-fed86fff : dmar2\n\tfed90000-fed90fff : dmar0\n\tfed91000-fed91fff : dmar3\n\tfeda0000-feda0fff : pnp 00:04\n\tfeda1000-feda1fff : pnp 00:04\n\tfedc0000-fedc7fff : pnp 00:04\n\tfee00000-fee00fff : Local APIC\n\t fee00000-fee00fff : Reserved\n\tff000000-ffffffff : Reserved\n\t ff000000-ffffffff : pnp 00:05\n\t100000000-4b07fffff : System RAM\n\t 426e00000-427e02666 : Kernel code\n\t 428000000-428a40fff : Kernel rodata\n\t 428c00000-428f6e27f : Kernel data\n\t 429268000-4297fffff : Kernel bss\n\t4b0800000-4b3ffffff : RAM buffer\n\t4000000000-7fffffffff : PCI Bus 0000:00\n\t 4000000000-400fffffff : 0000:00:02.0\n\t 4010000000-4016ffffff : 0000:00:02.0\n\t 4017000000-4017000fff : 0000:00:15.0\n\t 4017000000-40170001ff : lpss_dev\n\t 4017000000-40170001ff : i2c_designware.0 lpss_dev\n\t 4017000200-40170002ff : lpss_priv\n\t 4017000800-4017000fff : idma64.0\n\t 4017000800-4017000fff : idma64.0 idma64.0\n\t 4017001000-4017001fff : 0000:00:15.1\n\t 4017001000-40170011ff : lpss_dev\n\t 4017001000-40170011ff : i2c_designware.1 lpss_dev\n\t 4017001200-40170012ff : lpss_priv\n\t 4017001800-4017001fff : idma64.1\n\t 4017001800-4017001fff : idma64.1 idma64.1\n\t 4020000000-40ffffffff : 0000:00:02.0\n\t 6000000000-601bffffff : PCI Bus 0000:2d\n\t 6020000000-603bffffff : PCI Bus 0000:02\n\t 603c000000-603cffffff : 0000:00:02.0\n\t 603d000000-603d0fffff : 0000:00:1f.3\n\t 603d000000-603d0fffff : ICH HD audio\n\t 603d100000-603d13ffff : 0000:00:0d.3\n\t 603d100000-603d13ffff : thunderbolt\n\t 603d140000-603d17ffff : 0000:00:0d.2\n\t 603d140000-603d17ffff : thunderbolt\n\t 603d180000-603d18ffff : 0000:00:14.0\n\t 603d180000-603d18ffff : xhci-hcd\n\t 603d190000-603d19ffff : 0000:00:0d.0\n\t 603d190000-603d19ffff : xhci-hcd\n\t 603d1a0000-603d1a3fff : 0000:00:1f.3\n\t 603d1a0000-603d1a3fff : ICH HD audio\n\t 603d1a4000-603d1a7fff : 0000:00:14.3\n\t 603d1a4000-603d1a7fff : iwlwifi\n\t 603d1a8000-603d1abfff : 0000:00:14.2\n\t 603d1ac000-603d1ac0ff : 0000:00:1f.4\n\t 603d1ad000-603d1adfff : 0000:00:16.0\n\t 603d1ad000-603d1adfff : mei_me\n\t 603d1b0000-603d1b0fff : 0000:00:14.2\n\t 603d1b1000-603d1b1fff : 0000:00:0d.3\n\t 603d1b2000-603d1b2fff : 0000:00:0d.2\n\t 603d1b3000-603d1b3fff : 0000:00:08.0\n\t\n \n\t/dev/nvme0n1p2: TYPE=\"ext4\"\n\t/dev/sda3: TYPE=\"ext4\"\n\t\n \n\tseri:/dev/ttyS0 type:portio base:0x3F8 irq:4\n\t\n \n\t3, 5, 6, 7, 10, 11, 12, 13, 15\n\t\n \n\t16003752 kB\n\t\n \n\t0, 1, 2, 3\n\t\n \n\t16\n\t\n \n \n 0x6\n 0x8c\n Reserved\n 0x0\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 0x1b\n 39\n 48\n \n \n \n \n 0\n 0x0\n 0x0\n 0x6\n 0x8c\n 0x1\n Reserved\n 0x0\n \n \n \n \n 1\n 0x2\n 0x2\n 0x6\n 0x8c\n 0x1\n Reserved\n 0x0\n \n \n \n \n 2\n 0x4\n 0x4\n 0x6\n 0x8c\n 0x1\n Reserved\n 0x0\n \n \n \n \n 3\n 0x6\n 0x6\n 0x6\n 0x8c\n 0x1\n Reserved\n 0x0\n \n \n \n \n \n \n 49152\n 64\n 12\n 64\n 1\n 1\n 0\n 0\n 0\n 0\n \n 0x0\n \n \n \n 32768\n 64\n 8\n 64\n 1\n 1\n 0\n 0\n 0\n 0\n \n 0x0\n \n \n \n 49152\n 64\n 12\n 64\n 1\n 1\n 0\n 0\n 0\n 0\n \n 0x2\n \n \n \n 32768\n 64\n 8\n 64\n 1\n 1\n 0\n 0\n 0\n 0\n \n 0x2\n \n \n \n 49152\n 64\n 12\n 64\n 1\n 1\n 0\n 0\n 0\n 0\n \n 0x4\n \n \n \n 32768\n 64\n 8\n 64\n 1\n 1\n 0\n 0\n 0\n 0\n \n 0x4\n \n \n \n 49152\n 64\n 12\n 64\n 1\n 1\n 0\n 0\n 0\n 0\n \n 0x6\n \n \n \n 32768\n 64\n 8\n 64\n 1\n 1\n 0\n 0\n 0\n 0\n \n 0x6\n \n \n \n 1310720\n 64\n 20\n 1024\n 1\n 1\n 0\n 0\n 0\n 0\n \n 0x0\n \n \n 20\n 8\n \n \n \n \n 1310720\n 64\n 20\n 1024\n 1\n 1\n 0\n 0\n 0\n 0\n \n 0x2\n \n \n 20\n 8\n \n \n \n \n 1310720\n 64\n 20\n 1024\n 1\n 1\n 0\n 0\n 0\n 0\n \n 0x4\n \n \n 20\n 8\n \n \n \n \n 1310720\n 64\n 20\n 1024\n 1\n 1\n 0\n 0\n 0\n 0\n \n 0x6\n \n \n 20\n 8\n \n \n \n \n 8388608\n 64\n 8\n 16384\n 1\n 1\n 0\n 0\n 0\n 1\n \n 0x0\n 0x2\n 0x4\n 0x6\n \n \n \n \n \n \n \n \n \n \n \n
0xfec00000
\n 0x0\n 120\n
\n
\n \n \n \\AMW0\n 0\n 5b821a5c414d5730085f4849440d504e503043313400085f55494400\n \n \n \\CHUB\n 5b82165c43485542085f53544100085f4849440c25d4339b\n \n n\n n\n n\n \n \n \n \\PSM_\n 0\n 5b8242055c50534d5f085f53544100085f4849440c25d43420085f55494400085f535452112f0a2c50006f007700650072002000530068006100720069006e00670020004d0061006e0061006700650072000000\n \n n\n n\n n\n \n \n \n \\_SB_\n \n 0x8086\n 0x9a14\n 0x8086\n 0x3002\n 0x060000\n \\_SB_.PC00\n PNP0A03\n 0\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.CLP0\n INT3472\n 0\n 5b824b065c2f035f53425f50433030434c5030085f53544100085f4849440d494e543334373200085f4349440d494e543334373200085f55494400085f41445200085f43525311260a238e1e00010001020000010600801a06004d005c5f53422e504330302e49324333007900\n \n n\n n\n n\n \n \n \\_SB_.PC00.I2C3\n \n \n \\_SB_.PC00.PEG1\n 5b82205c2f035f53425f5043303050454731085f53544100085f4144520c00000100\n \n n\n n\n n\n \n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.PEG1.PEGP\n 5b821a5c2f045f53425f504330305045473150454750085f41445200\n \n \n \n \\_SB_.PC00.PEG2\n 5b82205c2f035f53425f5043303050454732085f53544100085f4144520c01000100\n \n n\n n\n n\n \n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.PEG2.PEGP\n 5b821a5c2f045f53425f504330305045473250454750085f41445200\n \n \n \n \\_SB_.PC00.PEG3\n 5b82205c2f035f53425f5043303050454733085f53544100085f4144520c02000100\n \n n\n n\n n\n \n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.PEG3.PEGP\n 5b821a5c2f045f53425f504330305045473350454750085f41445200\n \n \n \n 0x8086\n 0x9a49\n 0x8086\n 0x3002\n 0x030000\n \\_SB_.PC00.GFX0\n 5b821a5c2f035f53425f5043303047465830085f4144520c00000200\n \n \n \n \n \n \n \n 1\n \n \n \n \n \n \n \n 7\n 7\n 0\n \n 0x0\n 0x2\n 0x1\n \n 1\n 0x9a49\n 0x553\n \n \n \\_SB_.PC00.GFX0.DD06\n 5b821b5c2f045f53425f504330304746583044443036085f4144520a06\n \n \n \\_SB_.PC00.GFX0.DD07\n 5b821b5c2f045f53425f504330304746583044443037085f4144520a07\n \n \n \\_SB_.PC00.GFX0.DD08\n 5b821b5c2f045f53425f504330304746583044443038085f4144520a08\n \n \n \\_SB_.PC00.GFX0.DD09\n 5b821b5c2f045f53425f504330304746583044443039085f4144520a09\n \n \n \\_SB_.PC00.GFX0.DD0A\n 5b821b5c2f045f53425f504330304746583044443041085f4144520a0a\n \n \n \\_SB_.PC00.GFX0.DD0B\n 5b821b5c2f045f53425f504330304746583044443042085f4144520a0b\n \n \n \\_SB_.PC00.GFX0.DD0C\n 5b821b5c2f045f53425f504330304746583044443043085f4144520a0c\n \n \n \\_SB_.PC00.GFX0.DD0D\n 5b821b5c2f045f53425f504330304746583044443044085f4144520a0d\n \n \n \\_SB_.PC00.GFX0.DD0E\n 5b821b5c2f045f53425f504330304746583044443045085f4144520a0e\n \n \n \\_SB_.PC00.GFX0.DD0F\n 5b821b5c2f045f53425f504330304746583044443046085f4144520a0f\n \n \n \\_SB_.PC00.GFX0.DD1F\n 5b821b5c2f045f53425f504330304746583044443146085f4144520a1f\n \n \n \\_SB_.PC00.GFX0.DD01\n 5b821c5c2f045f53425f504330304746583044443031085f4144520b0003\n \n \n \\_SB_.PC00.GFX0.DD02\n 5b821c5c2f045f53425f504330304746583044443032085f4144520b0103\n \n \n \\_SB_.PC00.GFX0.DD03\n 5b821c5c2f045f53425f504330304746583044443033085f4144520b0203\n \n \n \\_SB_.PC00.GFX0.DD04\n 5b821c5c2f045f53425f504330304746583044443034085f4144520b0303\n \n \n \\_SB_.PC00.GFX0.DD05\n 5b821c5c2f045f53425f504330304746583044443035085f4144520b0403\n \n \n \\_SB_.PC00.GFX0.DD2F\n 5b821b5c2f045f53425f504330304746583044443246085f4144520a1f\n \n \n \n \\_SB_.PC00.TCPU\n 5b821a5c2f035f53425f5043303054435055085f4144520c00000400\n \n \n \\_SB_.PC00.IPU0\n 5b821a5c2f035f53425f5043303049505530085f4144520c00000500\n \n \n 0x8086\n 0x9a09\n 0x060400\n \\_SB_.PC00.PEG0\n 5b82215c2f035f53425f5043303050454730085f5354410a0f085f4144520c00000600\n \n y\n y\n y\n \n \n \n \n \n 1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 0x126f\n 0x2263\n 0x126f\n 0x2263\n 0x010802\n \n \n \n \n 8\n \n \n \n \n \n \n 16\n 1\n 0x1000000\n 1\n 0x0\n \n \n \n \n \n \n \n \n \\_SB_.PC00.PEG0.PEGP\n 5b8241065c2f045f53425f504330305045473050454750085f414452005b8050434358020a090a045b8115504343580150495858085343435808424343580814235041484308a01a934243435801a01293534343580a06a009935049585801a401a400\n \\_SB_.PC00.PEG0.PEGP.MINI\n \n \\_SB_.PC00.PEG0.PEGP.MINI\n 5b824f045c2f055f53425f5043303050454730504547504d494e49155c2f055f53425f50433030504547305045475050414843080014135f53544108a00850414843a40a0fa103a400085f4144520bffff\n \n n\n n\n n\n \n \\_SB_.PC00.PEG0.PEGP\n \n \n \n \n 0x8086\n 0x9a25\n 0x060400\n \\_SB_.PC00.TRP1\n 5b82215c2f035f53425f5043303054525031085f5354410a0f085f4144520c00000700\n \n y\n y\n y\n \n \n \n \n \n \n 1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.TRP1.PXSX\n 5b821a5c2f045f53425f504330305452503150585358085f41445200\n \n \n \n \\_SB_.PC00.TRP0\n 5b82205c2f035f53425f5043303054525030085f53544100085f4144520c01000700\n \n n\n n\n n\n \n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.TRP0.PXSX\n 5b821a5c2f045f53425f504330305452503050585358085f41445200\n \n \n \n 0x8086\n 0x9a27\n 0x060400\n \\_SB_.PC00.TRP2\n 5b82215c2f035f53425f5043303054525032085f5354410a0f085f4144520c02000700\n \n y\n y\n y\n \n \n \n \n \n \n 1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.TRP2.PXSX\n 5b821a5c2f045f53425f504330305452503250585358085f41445200\n \n \n \n \\_SB_.PC00.TRP3\n 5b82205c2f035f53425f5043303054525033085f53544100085f4144520c03000700\n \n n\n n\n n\n \n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.TRP3.PXSX\n 5b821a5c2f045f53425f504330305452503350585358085f41445200\n \n \n \n 0x8086\n 0x9a11\n 0x8086\n 0x3002\n 0x088000\n \\_SB_.PC00.GNA0\n 5b821a5c2f035f53425f50433030474e4130085f4144520c00000800\n \n \n \n 1\n \n \n \n \n \n \n 0x8086\n 0x9a13\n 0x0000\n 0x0000\n 0x0c0330\n \\_SB_.PC00.TXHC\n 5b824f055c2f035f53425f5043303054584843085f5354410a0f085f53545211370a34490043004c0020004e006f0072007400680020005800480043004900200063006f006e00740072006f006c006c00650072000000085f4144520c00000d00\n \n y\n y\n y\n \n \n \n \n 8\n \n \n \n \n \n \n \\_SB_.PC00.TXHC.RHUB\n 5b821a5c2f045f53425f504330305458484352485542085f41445200\n \n \\_SB_.PC00.TXHC.RHUB.HS01\n 5b821e5c2f055f53425f50433030545848435248554248533031085f41445201\n \n \n \\_SB_.PC00.TXHC.RHUB.SS01\n 5b821f5c2f055f53425f50433030545848435248554253533031085f4144520a02\n \n \n \\_SB_.PC00.TXHC.RHUB.SS02\n 5b821f5c2f055f53425f50433030545848435248554253533032085f4144520a03\n \n \n \\_SB_.PC00.TXHC.RHUB.SS03\n 5b821f5c2f055f53425f50433030545848435248554253533033085f4144520a04\n \n \n \\_SB_.PC00.TXHC.RHUB.SS04\n 5b821f5c2f055f53425f50433030545848435248554253533034085f4144520a05\n \n \n \n \n 0x8086\n 0x9a1b\n 0x2222\n 0x1111\n 0x0c0340\n \\_SB_.PC00.TDM0\n 5b824b055c2f035f53425f5043303054444d30085f5354410a0f085f53545211330a30490043004c002000540042005400200044004d0041003000200063006f006e00740072006f006c006c00650072000000085f4144520c02000d00\n \n y\n y\n y\n \n \n \n \n \n \n 1\n \n \n \n 16\n 5\n 0xfa20000\n 0\n 0x2000000\n \n \n \n 0x8086\n 0x9a1d\n 0x2222\n 0x1111\n 0x0c0340\n \\_SB_.PC00.TDM1\n 5b824b055c2f035f53425f5043303054444d31085f5354410a0f085f53545211330a30490043004c002000540042005400200044004d0041003100200063006f006e00740072006f006c006c00650072000000085f4144520c03000d00\n \n y\n y\n y\n \n \n \n \n \n \n 1\n \n \n \n 16\n 5\n 0xfa20000\n 0\n 0x2000000\n \n \n \n \\_SB_.PC00.I2C6\n 5b821a5c2f035f53425f5043303049324336085f4144520c00001000\n \n \n \\_SB_.PC00.I2C7\n 5b821a5c2f035f53425f5043303049324337085f4144520c01001000\n \n \n \\_SB_.PC00.THC0\n 5b821a5c2f035f53425f5043303054484330085f4144520c06001000\n \n \\_SB_.PC00.THC0.TLC1\n 5b82215c2f045f53425f5043303054484330544c4331085f5354410a0f085f41445201\n \n y\n y\n y\n \n \n \n \\_SB_.PC00.THC0.TLC2\n 5b82225c2f045f53425f5043303054484330544c4332085f5354410a0f085f4144520a02\n \n y\n y\n y\n \n \n \n \\_SB_.PC00.THC0.TLC3\n 5b82225c2f045f53425f5043303054484330544c4333085f5354410a0f085f4144520a03\n \n y\n y\n y\n \n \n \n \n \\_SB_.PC00.THC1\n 5b821a5c2f035f53425f5043303054484331085f4144520c07001000\n \n \\_SB_.PC00.THC1.TLC1\n 5b82215c2f045f53425f5043303054484331544c4331085f5354410a0f085f41445201\n \n y\n y\n y\n \n \n \n \\_SB_.PC00.THC1.TLC2\n 5b82225c2f045f53425f5043303054484331544c4332085f5354410a0f085f4144520a02\n \n y\n y\n y\n \n \n \n \\_SB_.PC00.THC1.TLC3\n 5b82225c2f045f53425f5043303054484331544c4333085f5354410a0f085f4144520a03\n \n y\n y\n y\n \n \n \n \n \\_SB_.PC00.UA03\n 5b821a5c2f035f53425f5043303055413033085f4144520c00001100\n \n \n \\_SB_.PC00.UA04\n 5b821a5c2f035f53425f5043303055413034085f4144520c01001100\n \n \n \\_SB_.PC00.UA05\n 5b821a5c2f035f53425f5043303055413035085f4144520c02001100\n \n \n \\_SB_.PC00.UA06\n 5b821a5c2f035f53425f5043303055413036085f4144520c03001100\n \n \n \\_SB_.PC00.ISHD\n 5b821a5c2f035f53425f5043303049534844085f4144520c00001200\n \n \n \\_SB_.PC00.SPI2\n 5b821a5c2f035f53425f5043303053504932085f4144520c06001200\n \n \\_SB_.PC00.SPI2.FPNT\n 5b82295c2f045f53425f504330305350493246504e54085f53544100085f4849440d44554d593030303000\n \n n\n n\n n\n \n \n \n \n \\_SB_.PC00.SPI3\n 5b821a5c2f035f53425f5043303053504933085f4144520c00001300\n \n \n \\_SB_.PC00.SPI4\n 5b821a5c2f035f53425f5043303053504934085f4144520c01001300\n \n \n \\_SB_.PC00.SPI5\n 5b821a5c2f035f53425f5043303053504935085f4144520c02001300\n \n \n \\_SB_.PC00.SPI6\n 5b821a5c2f035f53425f5043303053504936085f4144520c03001300\n \n \n 0x8086\n 0xa0ed\n 0x8086\n 0x3002\n 0x0c0330\n \\_SB_.PC00.XHCI\n 5b821a5c2f035f53425f5043303058484349085f4144520c00001400\n \n \n \n \n 8\n \n \n \n \n \n \n \\_SB_.PC00.XHCI.RHUB\n 5b821a5c2f045f53425f504330305848434952485542085f41445200\n \n \\_SB_.PC00.XHCI.RHUB.HS01\n 5b821e5c2f055f53425f50433030584843495248554248533031085f41445201\n \n \n \\_SB_.PC00.XHCI.RHUB.HS02\n 5b821f5c2f055f53425f50433030584843495248554248533032085f4144520a02\n \n \n \\_SB_.PC00.XHCI.RHUB.HS03\n 5b821f5c2f055f53425f50433030584843495248554248533033085f4144520a03\n \n \n \\_SB_.PC00.XHCI.RHUB.HS04\n 5b821f5c2f055f53425f50433030584843495248554248533034085f4144520a04\n \n \\_SB_.PC00.XHCI.RHUB.HS04.PRT1\n 5b82225c2f065f53425f5043303058484349524855424853303450525431085f41445201\n \n \n \\_SB_.PC00.XHCI.RHUB.HS04.PRT2\n 5b82235c2f065f53425f5043303058484349524855424853303450525432085f4144520a02\n \n \n \n \\_SB_.PC00.XHCI.RHUB.HS05\n 5b821f5c2f055f53425f50433030584843495248554248533035085f4144520a05\n \n \n \\_SB_.PC00.XHCI.RHUB.HS06\n 5b821f5c2f055f53425f50433030584843495248554248533036085f4144520a06\n \n \n \\_SB_.PC00.XHCI.RHUB.HS07\n 5b821f5c2f055f53425f50433030584843495248554248533037085f4144520a07\n \n \n \\_SB_.PC00.XHCI.RHUB.HS08\n 5b821f5c2f055f53425f50433030584843495248554248533038085f4144520a08\n \n \n \\_SB_.PC00.XHCI.RHUB.HS09\n 5b821f5c2f055f53425f50433030584843495248554248533039085f4144520a09\n \n \n \\_SB_.PC00.XHCI.RHUB.HS10\n 5b821f5c2f055f53425f50433030584843495248554248533130085f4144520a0a\n \n \n \\_SB_.PC00.XHCI.RHUB.HS11\n 5b821f5c2f055f53425f50433030584843495248554248533131085f4144520a0b\n \n \n \\_SB_.PC00.XHCI.RHUB.HS12\n 5b821f5c2f055f53425f50433030584843495248554248533132085f4144520a0c\n \n \n \\_SB_.PC00.XHCI.RHUB.SS01\n 5b821f5c2f055f53425f50433030584843495248554253533031085f4144520a0d\n \n \n \\_SB_.PC00.XHCI.RHUB.SS02\n 5b821f5c2f055f53425f50433030584843495248554253533032085f4144520a0e\n \n \n \\_SB_.PC00.XHCI.RHUB.SS03\n 5b821f5c2f055f53425f50433030584843495248554253533033085f4144520a0f\n \n \n \\_SB_.PC00.XHCI.RHUB.SS04\n 5b821f5c2f055f53425f50433030584843495248554253533034085f4144520a10\n \n \n \\_SB_.PC00.XHCI.RHUB.SS05\n 5b821f5c2f055f53425f50433030584843495248554253533035085f4144520a11\n \n \n \\_SB_.PC00.XHCI.RHUB.SS06\n 5b821f5c2f055f53425f50433030584843495248554253533036085f4144520a12\n \n \n \\_SB_.PC00.XHCI.RHUB.USR1\n 5b821f5c2f055f53425f50433030584843495248554255535231085f4144520a0b\n \n \n \\_SB_.PC00.XHCI.RHUB.USR2\n 5b821f5c2f055f53425f50433030584843495248554255535232085f4144520a0c\n \n \n \n \n \\_SB_.PC00.XDCI\n 5b8244055c2f035f53425f5043303058444349085f53545211330a30490043004c00200050004300480020005800440043004900200063006f006e00740072006f006c006c00650072000000085f4144520c01001400\n \n \n 0x8086\n 0xa0ef\n 0x0000\n 0x0000\n 0x050000\n \n \n \n \n \n 0x8086\n 0xa0f0\n 0x8086\n 0x0074\n 0x028000\n \\_SB_.PC00.CNVW\n 5b821a5c2f035f53425f50433030434e5657085f4144520c03001400\n \n \n \n \n 1\n \n \n \n \n 16\n 1\n 0x10000000\n 1\n 0x0\n \n \n \n \n \n 0x8086\n 0xa0e8\n 0x8086\n 0x3002\n 0x0c8000\n \\_SB_.PC00.I2C0\n 5b821a5c2f035f53425f5043303049324330085f4144520c00001500\n \n \n \n \n \\_SB_.PC00.I2C2.TPL1\n \\_SB_.PC00.I2C0.TPL1\n \\_SB_.PC00.I2C3.TPD0\n \\_SB_.PC00.I2C1.TPD0\n \\_SB_.PC00.I2C2.TPD0\n \\_SB_.PC00.I2C1.TPL1\n \\_SB_.PC00.I2C0.TPD0\n \\_SB_.PC00.I2C1.UCM1\n \\_SB_.PC00.I2C3.TPL1\n \n \\_SB_.PC00.I2C0.TPD0\n PNP0C50\n 5b824c065c2f045f53425f504330304932433054504430085f53544100085f4849440d504e503043353000085f4349440d504e503043353000085f435253112f0a2c8e1e00010001020000010600801a060000005c5f53422e504330302e49324330008906001501760000007900\n \n n\n n\n n\n \n \n \n \\_SB_.PC00.I2C0\n \n \n \\_SB_.PC00.I2C0.TPL1\n PNP0C50\n 5b824d065c2f045f53425f504330304932433054504c31085f53544100085f4849440d585858583030303000085f4349440d504e503043353000085f435253112f0a2c8e1e00010001020000010600801a060000005c5f53422e504330302e49324330008906000101760000007900\n \n n\n n\n n\n \n \n \n \\_SB_.PC00.I2C0\n \n \n \n 0x8086\n 0xa0e9\n 0x8086\n 0x3002\n 0x0c8000\n \\_SB_.PC00.I2C1\n 5b821a5c2f035f53425f5043303049324331085f4144520c01001500\n \n \n \n \n \\_SB_.PC00.FLM0\n \n \\_SB_.PC00.I2C1.TPD0\n PNP0C50\n 5b824c065c2f045f53425f504330304932433154504430085f53544100085f4849440d504e503043353000085f4349440d504e503043353000085f435253112f0a2c8e1e00010001020000010600801a060000005c5f53422e504330302e49324330008906001501760000007900\n \n n\n n\n n\n \n \n \n \\_SB_.PC00.I2C0\n \n \n \\_SB_.PC00.I2C1.TPL1\n PNP0C50\n 5b824d065c2f045f53425f504330304932433154504c31085f53544100085f4849440d585858583030303000085f4349440d504e503043353000085f435253112f0a2c8e1e00010001020000010600801a060000005c5f53422e504330302e49324330008906000101760000007900\n \n n\n n\n n\n \n \n \n \\_SB_.PC00.I2C0\n \n \n \\_SB_.PC00.I2C1.UCM1\n 0\n 5b8247085c2f045f53425f504330304932433155434d31085f5354410a0f085f4849440d494e543335313500085f55494400085f4352531141050a4d8e1e00010001020000010600801a060021005c5f53422e504330302e49324330008e1e00010001020000010600801a060025005c5f53422e504330302e49324330008906000701760000007900\n \n y\n y\n y\n \n \n \n \n \\_SB_.PC00.I2C0\n \n \n \n \\_SB_.PC00.I2C2\n 5b821a5c2f035f53425f5043303049324332085f4144520c02001500\n \\_SB_.PC00.I2C2.CAM0\n \\_SB_.PC00.LNK2\n \\_SB_.PC00.FLM1\n \\_SB_.PC00.I2C2.PMIC\n \\_SB_.PC00.FLM2\n \n \\_SB_.PC00.I2C2.CAM0\n INT3471\n 0\n 5b8247115c2f045f53425f504330304932433243414d30085f53544100085f4849440d494e543334373100085f4349440d494e543334373100085f5549440d3000085f41445200085f435253114c0c0ac88e1e00010001020000010600801a060010005c5f53422e504330302e49324332008e1e00010001020000010600801a06000e005c5f53422e504330302e49324332008e1e00010001020000010600801a060050005c5f53422e504330302e49324332008e1e00010001020000010600801a060051005c5f53422e504330302e49324332008e1e00010001020000010600801a060052005c5f53422e504330302e49324332008e1e00010001020000010600801a060053005c5f53422e504330302e49324332007900\n \n n\n n\n n\n \n \n \n \n \n \n \n \\_SB_.PC00.I2C2\n \n \n \\_SB_.PC00.I2C2.PMIC\n INT3472\n 0\n 5b8241075c2f045f53425f5043303049324332504d4943085f53544100085f4849440d494e543334373200085f4349440d494e543334373200085f5549440d3000085f41445200085f43525311260a238e1e00010001020000010600801a06004c005c5f53422e504330302e49324332007900\n \n n\n n\n n\n \n \n \\_SB_.PC00.I2C2\n \n \n \\_SB_.PC00.I2C2.TPD0\n PNP0C50\n 5b824c065c2f045f53425f504330304932433254504430085f53544100085f4849440d504e503043353000085f4349440d504e503043353000085f435253112f0a2c8e1e00010001020000010600801a060000005c5f53422e504330302e49324330008906001501760000007900\n \n n\n n\n n\n \n \n \n \\_SB_.PC00.I2C0\n \n \n \\_SB_.PC00.I2C2.TPL1\n PNP0C50\n 5b824d065c2f045f53425f504330304932433254504c31085f53544100085f4849440d585858583030303000085f4349440d504e503043353000085f435253112f0a2c8e1e00010001020000010600801a060000005c5f53422e504330302e49324330008906000101760000007900\n \n n\n n\n n\n \n \n \n \\_SB_.PC00.I2C0\n \n \n \n \\_SB_.PC00.I2C3\n 5b821a5c2f035f53425f5043303049324333085f4144520c03001500\n \\_SB_.PC00.LNK5\n \\_SB_.PC00.CLP0\n \\_SB_.PC00.FLM4\n \\_SB_.PC00.CLP4\n \\_SB_.PC00.LNK1\n \\_SB_.PC00.CLP1\n \\_SB_.PC00.LNK4\n \\_SB_.PC00.CLP2\n \\_SB_.PC00.CLP5\n \\_SB_.PC00.LNK3\n \\_SB_.PC00.FLM5\n \\_SB_.PC00.FLM3\n \\_SB_.PC00.CLP3\n \\_SB_.PC00.LNK0\n \n \\_SB_.PC00.I2C3.TPD0\n PNP0C50\n 5b824c065c2f045f53425f504330304932433354504430085f53544100085f4849440d504e503043353000085f4349440d504e503043353000085f435253112f0a2c8e1e00010001020000010600801a060000005c5f53422e504330302e49324330008906001501760000007900\n \n n\n n\n n\n \n \n \n \\_SB_.PC00.I2C0\n \n \n \\_SB_.PC00.I2C3.TPL1\n PNP0C50\n 5b824d065c2f045f53425f504330304932433354504c31085f53544100085f4849440d585858583030303000085f4349440d504e503043353000085f435253112f0a2c8e1e00010001020000010600801a060000005c5f53422e504330302e49324330008906000101760000007900\n \n n\n n\n n\n \n \n \n \\_SB_.PC00.I2C0\n \n \n \n 0x8086\n 0xa0e0\n 0x8086\n 0x3002\n 0x078000\n \\_SB_.PC00.HECI\n 5b821a5c2f035f53425f5043303048454349085f4144520c00001600\n \n \n \n \n 1\n \n \n \n \n \n \\_SB_.PC00.HEC3\n 5b821a5c2f035f53425f5043303048454333085f4144520c04001600\n \n \n 0x8086\n 0xa0d3\n 0x8086\n 0x3002\n 0x010601\n \\_SB_.PC00.SAT0\n 5b821a5c2f035f53425f5043303053415430085f4144520c00001700\n \n \n \n \n \n \n \n \n 1\n \n \n \n \n \\_SB_.PC00.SAT0.PRT0\n 5b821c5c2f045f53425f504330305341543050525430085f4144520bffff\n \n \n \\_SB_.PC00.SAT0.PRT1\n 5b821e5c2f045f53425f504330305341543050525431085f4144520cffff0100\n \n \n \\_SB_.PC00.SAT0.PRT2\n 5b821e5c2f045f53425f504330305341543050525432085f4144520cffff0200\n \n \n \\_SB_.PC00.SAT0.PRT3\n 5b821e5c2f045f53425f504330305341543050525433085f4144520cffff0300\n \n \n \\_SB_.PC00.SAT0.PRT4\n 5b821e5c2f045f53425f504330305341543050525434085f4144520cffff0400\n \n \n \\_SB_.PC00.SAT0.PRT5\n 5b821e5c2f045f53425f504330305341543050525435085f4144520cffff0500\n \n \n \\_SB_.PC00.SAT0.VOL0\n 5b821e5c2f045f53425f5043303053415430564f4c30085f4144520cffff8000\n \n \n \\_SB_.PC00.SAT0.VOL1\n 5b821e5c2f045f53425f5043303053415430564f4c31085f4144520cffff8100\n \n \n \\_SB_.PC00.SAT0.VOL2\n 5b821e5c2f045f53425f5043303053415430564f4c32085f4144520cffff8200\n \n \n \\_SB_.PC00.SAT0.NVM1\n 5b821e5c2f045f53425f50433030534154304e564d31085f4144520cffffc100\n \n \n \\_SB_.PC00.SAT0.NVM2\n 5b821e5c2f045f53425f50433030534154304e564d32085f4144520cffffc200\n \n \n \\_SB_.PC00.SAT0.NVM3\n 5b821e5c2f045f53425f50433030534154304e564d33085f4144520cffffc300\n \n \n \n \\_SB_.PC00.I2C4\n 5b821a5c2f035f53425f5043303049324334085f4144520c00001900\n \\_SB_.PC00.I2C4.CAM1\n \n \\_SB_.PC00.I2C4.CAM1\n INT3474\n 0\n 5b8241075c2f045f53425f504330304932433443414d31085f53544100085f4849440d494e543334373400085f4349440d494e543334373400085f5549440d3000085f41445200085f43525311260a238e1e00010001020000010600801a060036005c5f53422e504330302e49324334007900\n \n n\n n\n n\n \n \n \\_SB_.PC00.I2C4\n \n \n \n \\_SB_.PC00.I2C5\n 5b821a5c2f035f53425f5043303049324335085f4144520c01001900\n \\_SB_.PC00.I2C5.PA01\n \\_SB_.PC00.I2C5.PA04\n \\_SB_.PC00.I2C5.PA03\n \\_SB_.PC00.I2C5.PA02\n \n \\_SB_.PC00.I2C5.PA01\n 1\n 5b824c055c2f045f53425f504330304932433550413031085f53544100085f4849440d4d4348503139333000085f55494401085f43525311260a238e1e00010001020000010600801a060018005c5f53422e504330302e49324335007900\n \n n\n n\n n\n \n \n \\_SB_.PC00.I2C5\n \n \n \\_SB_.PC00.I2C5.PA02\n 2\n 5b824d055c2f045f53425f504330304932433550413032085f53544100085f4849440d4d4348503139333000085f5549440a02085f43525311260a238e1e00010001020000010600801a060011005c5f53422e504330302e49324335007900\n \n n\n n\n n\n \n \n \\_SB_.PC00.I2C5\n \n \n \\_SB_.PC00.I2C5.PA03\n 3\n 5b824d055c2f045f53425f504330304932433550413033085f53544100085f4849440d4d4348503139333000085f5549440a03085f43525311260a238e1e00010001020000010600801a06001e005c5f53422e504330302e49324335007900\n \n n\n n\n n\n \n \n \\_SB_.PC00.I2C5\n \n \n \\_SB_.PC00.I2C5.PA04\n 4\n 5b824d055c2f045f53425f504330304932433550413034085f53544100085f4849440d4d4348503139333000085f5549440a04085f43525311260a238e1e00010001020000010600801a060000005c5f53422e504330302e49324335007900\n \n n\n n\n n\n \n \n \\_SB_.PC00.I2C5\n \n \n \n \\_SB_.PC00.UA02\n 5b821a5c2f035f53425f5043303055413032085f4144520c02001900\n \n \n \\_SB_.PC00.RP17\n 5b821a5c2f035f53425f5043303052503137085f4144520c00001b00\n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.RP17.PXSX\n 5b821a5c2f045f53425f504330305250313750585358085f41445200\n \n \n \n \\_SB_.PC00.RP18\n 5b821a5c2f035f53425f5043303052503138085f4144520c01001b00\n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.RP18.PXSX\n 5b821a5c2f045f53425f504330305250313850585358085f41445200\n \n \n \n \\_SB_.PC00.RP19\n 5b821a5c2f035f53425f5043303052503139085f4144520c02001b00\n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.RP19.PXSX\n 5b821a5c2f045f53425f504330305250313950585358085f41445200\n \n \n \n \\_SB_.PC00.RP20\n 5b821a5c2f035f53425f5043303052503230085f4144520c03001b00\n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.RP20.PXSX\n 5b821a5c2f045f53425f504330305250323050585358085f41445200\n \n \n \n \\_SB_.PC00.RP21\n 5b821a5c2f035f53425f5043303052503231085f4144520c04001b00\n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.RP21.PXSX\n 5b821a5c2f045f53425f504330305250323150585358085f41445200\n \n \n \n \\_SB_.PC00.RP22\n 5b821a5c2f035f53425f5043303052503232085f4144520c05001b00\n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.RP22.PXSX\n 5b821a5c2f045f53425f504330305250323250585358085f41445200\n \n \n \n \\_SB_.PC00.RP23\n 5b821a5c2f035f53425f5043303052503233085f4144520c06001b00\n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.RP23.PXSX\n 5b821a5c2f045f53425f504330305250323350585358085f41445200\n \n \n \n \\_SB_.PC00.RP24\n 5b821a5c2f035f53425f5043303052503234085f4144520c07001b00\n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.RP24.PXSX\n 5b821a5c2f045f53425f504330305250323450585358085f41445200\n \n \n \n \\_SB_.PC00.RP01\n 5b821a5c2f035f53425f5043303052503031085f4144520c00001c00\n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.RP01.PXSX\n 5b821a5c2f045f53425f504330305250303150585358085f41445200\n \n \n \n \\_SB_.PC00.RP02\n 5b821a5c2f035f53425f5043303052503032085f4144520c01001c00\n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.RP02.PXSX\n 5b821a5c2f045f53425f504330305250303250585358085f41445200\n \n \n \n \\_SB_.PC00.RP03\n 5b821a5c2f035f53425f5043303052503033085f4144520c02001c00\n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.RP03.PXSX\n 5b821a5c2f045f53425f504330305250303350585358085f41445200\n \n \n \n \\_SB_.PC00.RP04\n 5b821a5c2f035f53425f5043303052503034085f4144520c03001c00\n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.RP04.PXSX\n 5b821a5c2f045f53425f504330305250303450585358085f41445200\n \n \n \n \\_SB_.PC00.RP05\n 5b821a5c2f035f53425f5043303052503035085f4144520c04001c00\n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.RP05.PXSX\n 5b821a5c2f045f53425f504330305250303550585358085f41445200\n \n \n \n \\_SB_.PC00.RP06\n 5b821a5c2f035f53425f5043303052503036085f4144520c05001c00\n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.RP06.PXSX\n 5b821a5c2f045f53425f504330305250303650585358085f41445200\n \n \n \n \\_SB_.PC00.RP07\n 5b821a5c2f035f53425f5043303052503037085f4144520c06001c00\n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.RP07.PXSX\n 5b821a5c2f045f53425f504330305250303750585358085f41445200\n \n \n \n \\_SB_.PC00.RP08\n 5b821a5c2f035f53425f5043303052503038085f4144520c07001c00\n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.RP08.PXSX\n 5b821a5c2f045f53425f504330305250303850585358085f41445200\n \n \n \n 0x8086\n 0xa0b1\n 0x060400\n \\_SB_.PC00.RP10\n 5b821a5c2f035f53425f5043303052503130085f4144520c00001d00\n \n \n \n \n 1\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 0x8086\n 0x15f2\n 0x8086\n 0x3002\n 0x020000\n \n \n \n \n \n 1\n \n \n \n \n 5\n 7\n 0x30000\n 1\n 0x0\n \n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.RP10.PXSX\n 5b821a5c2f045f53425f504330305250313050585358085f41445200\n \n \n \n \\_SB_.PC00.RP09\n 5b821a5c2f035f53425f5043303052503039085f4144520c01001d00\n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.RP09.PXSX\n 5b821a5c2f045f53425f504330305250303950585358085f41445200\n \n \n \n \\_SB_.PC00.RP11\n 5b821a5c2f035f53425f5043303052503131085f4144520c02001d00\n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.RP11.PXSX\n 5b821a5c2f045f53425f504330305250313150585358085f41445200\n \n \n \n \\_SB_.PC00.RP12\n 5b821a5c2f035f53425f5043303052503132085f4144520c03001d00\n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.RP12.PXSX\n 5b821a5c2f045f53425f504330305250313250585358085f41445200\n \n \n \n \\_SB_.PC00.RP13\n 5b821a5c2f035f53425f5043303052503133085f4144520c04001d00\n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.RP13.PXSX\n 5b821a5c2f045f53425f504330305250313350585358085f41445200\n \n \n \n \\_SB_.PC00.RP14\n 5b821a5c2f035f53425f5043303052503134085f4144520c05001d00\n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.RP14.PXSX\n 5b821a5c2f045f53425f504330305250313450585358085f41445200\n \n \n \n \\_SB_.PC00.RP15\n 5b821a5c2f035f53425f5043303052503135085f4144520c06001d00\n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.RP15.PXSX\n 5b821a5c2f045f53425f504330305250313550585358085f41445200\n \n \n \n \\_SB_.PC00.RP16\n 5b821a5c2f035f53425f5043303052503136085f4144520c07001d00\n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.RP16.PXSX\n 5b821a5c2f045f53425f504330305250313650585358085f41445200\n \n \n \n \\_SB_.PC00.UA00\n 5b821a5c2f035f53425f5043303055413030085f4144520c00001e00\n \\_SB_.PC00.UA00.BTH0\n \n \\_SB_.PC00.UA00.BTH0\n 5b82400a5c2f045f53425f504330305541303042544830085f53544100085f4849440d494e543333453100085f4352531141070a6d8e2200010003023500010a0000c201002000200000c05c5f53422e504330302e55413030008c200001010100020000000000001700001900230000004d005c5f53422e47504930008c2000010001001300000000000017000019002300000000005c5f53422e47504930007900\n \n n\n n\n n\n \n \n \n \n \\_SB_.PC00.UA00\n \\_SB_.GPI0\n \n \n \n \\_SB_.PC00.UA01\n 5b821a5c2f035f53425f5043303055413031085f4144520c01001e00\n \n \n \\_SB_.PC00.SPI0\n 5b821a5c2f035f53425f5043303053504930085f4144520c02001e00\n \n \n \\_SB_.PC00.SPI1\n 5b821a5c2f035f53425f5043303053504931085f4144520c03001e00\n \n \\_SB_.PC00.SPI1.FPNT\n 5b82295c2f045f53425f504330305350493146504e54085f53544100085f4849440d44554d593030303000\n \n n\n n\n n\n \n \n \n \n 0x8086\n 0xa082\n 0x8086\n 0x3002\n 0x060100\n \\_SB_.PC00.LPCB\n 5b821a5c2f035f53425f504330304c504342085f4144520c00001f00\n \n \\_SB_.PC00.LPCB.CWDT\n PNP0C02\n 5b8248045c2f045f53425f504330304c50434243574454085f5354410a0f085f4849440d494e54433130323800085f4349440c41d00c02085f435253110d0a0a47015418541804047900\n \n y\n y\n y\n \n \n \n \n \\_SB_.PC00.LPCB.HPET\n 0\n 5b8243045c2f045f53425f504330304c50434248504554085f5354410a0f085f4849440c41d00103085f55494400085f43525311110a0e860900010000d0fe000400007900\n \n y\n y\n y\n \n \n \n \n \\_SB_.PC00.LPCB.H_EC\n 1\n 5b8247045c2f045f53425f504330304c504342485f4543085f5354410a0b085f4849440c41d00c09085f55494401085f43525311150a12470162006200000147016600660000017900\n \n y\n y\n y\n \n \n \n \n \\_SB_.PC00.LPCB.H_EC.BAT0\n 0\n 5b822e5c2f055f53425f504330304c504342485f454342415430085f53544100085f4849440c41d00c0a085f55494400\n \n n\n n\n n\n \n \n \n \\_SB_.PC00.LPCB.H_EC.BAT1\n 1\n 5b822e5c2f055f53425f504330304c504342485f454342415431085f53544100085f4849440c41d00c0a085f55494401\n \n n\n n\n n\n \n \n \n \\_SB_.PC00.LPCB.H_EC.BAT2\n 2\n 5b822f5c2f055f53425f504330304c504342485f454342415432085f53544100085f4849440c41d00c0a085f5549440a02\n \n n\n n\n n\n \n \n \n \n \\_SB_.PC00.LPCB.IPIC\n 5b82440b5c2f045f53425f504330304c50434249504943085f4849440b41d0085f4352531141090a8d47012000200001024701240024000102470128002800010247012c002c00010247013000300001024701340034000102470138003800010247013c003c0001024701a000a00001024701a400a40001024701a800a80001024701ac00ac0001024701b000b00001024701b400b40001024701b800b80001024701bc00bc0001024701d004d00401022204007900\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.LPCB.LDRC\n 2\n 5b8242095c2f045f53425f504330304c5043424c445243085f4849440c41d00c02085f5549440a02085f4352531146060a6247012e002e00010247014e004e00010247016100610001014701630063000101470165006500010147016700670001014701700070000101470180008000010147019200920001014701b200b2000102470180068006012047014e164e1601027900\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.LPCB.MATH\n 5b823a5c2f045f53425f504330304c5043424d415448085f53544100085f4849440c41d00c04085f43525311100a0d4701f000f00001012200207900\n \n n\n n\n n\n \n \n \n \n \n \\_SB_.PC00.LPCB.RTC_\n 5b823a5c2f045f53425f504330304c5043425254435f085f53544100085f4849440c41d00b00085f43525311100a0d47017000700001082200017900\n \n n\n n\n n\n \n \n \n \n \n \\_SB_.PC00.LPCB.SIO1\n 0\n 5b8248065c2f045f53425f504330304c50434253494f31085f4849440c41d00c02085f55494400085f435253113d0a3a47010000000000004701000a000a00104701100a100a00204701300a300a00204701500a500a00204701700a700a00104701800a800a00107900\n \n \n \n \n \n \n \n \n \n \\_SB_.PC00.LPCB.SSMF\n 1\n 5b822a5c2f045f53425f504330304c50434253534d46085f53544100085f4849440c41d00c08085f55494401\n \n n\n n\n n\n \n \n \n \\_SB_.PC00.LPCB.TIMR\n 5b823c5c2f045f53425f504330304c50434254494d52085f4849440c41d00100085f43525311180a15470140004000010447015000500010042201007900\n \n \n \n \n \n \\_SB_.PC00.LPCB.UAR1\n 0\n 5b8245045c2f045f53425f504330304c50434255415231085f5354410a0f085f4849440c41d00501085f55494400085f43525311130a104701f803f80301082210002a00007900\n \n y\n y\n y\n \n \n \n \n \n \n \n 0x8086\n 0xa0c8\n 0x8086\n 0x3002\n 0x040300\n \\_SB_.PC00.HDAS\n 5b821a5c2f035f53425f5043303048444153085f4144520c03001f00\n \n \n \n \n \n \n 1\n \n \n \n \\_SB_.PC00.HDAS.IDA_\n 5b821a5c2f045f53425f50433030484441534944415f085f41445200\n \n \n \\_SB_.PC00.HDAS.SNDW\n PRP00001\n PNP0A05\n 5b8241045c2f045f53425f5043303048444153534e4457085f5354410a0b085f4349441215020d5052503030303031000d504e503041303500085f4144520c00000040\n \n y\n y\n y\n \n \n \\_SB_.PC00.HDAS.SNDW.SWD4\n 5b82265c2f055f53425f5043303048444153534e445753574434085f4144520e0000075d02100000\n \n \n \\_SB_.PC00.HDAS.SNDW.SWD0\n 5b82265c2f055f53425f5043303048444153534e445753574430085f4144520e0001075d02100000\n \n \n \\_SB_.PC00.HDAS.SNDW.SWD5\n 5b82265c2f055f53425f5043303048444153534e445753574435085f4144520e0000075d02100100\n \n \n \\_SB_.PC00.HDAS.SNDW.SWD1\n 5b82265c2f055f53425f5043303048444153534e445753574431085f4144520e0001075d02100100\n \n \n \\_SB_.PC00.HDAS.SNDW.SWD6\n 5b82265c2f055f53425f5043303048444153534e445753574436085f4144520e0000075d02100200\n \n \n \\_SB_.PC00.HDAS.SNDW.SWD2\n 5b82265c2f055f53425f5043303048444153534e445753574432085f4144520e0001075d02100200\n \n \n \\_SB_.PC00.HDAS.SNDW.SWD7\n 5b82265c2f055f53425f5043303048444153534e445753574437085f4144520e0000075d02100300\n \n \n \\_SB_.PC00.HDAS.SNDW.SWD3\n 5b82265c2f055f53425f5043303048444153534e445753574433085f4144520e0001075d02100300\n \n \n \n \\_SB_.PC00.HDAS.UAOL\n PRP00001\n PNP0A05\n 5b8241045c2f045f53425f504330304844415355414f4c085f5354410a0b085f4349441215020d5052503030303031000d504e503041303500085f4144520c00000050\n \n y\n y\n y\n \n \n \n \n 0x8086\n 0xa0a3\n 0x8086\n 0x3002\n 0x0c0500\n \\_SB_.PC00.SBUS\n 5b821a5c2f035f53425f5043303053425553085f4144520c04001f00\n \n \n \n \n \n 0x8086\n 0xa0a4\n 0x8086\n 0x3002\n 0x0c8000\n \n \n \n \\_SB_.PC00.PTHT\n 5b82205c2f035f53425f5043303050544854085f53544100085f4144520c07001f00\n \n n\n n\n n\n \n \n \n \\_SB_.PC00.CLP1\n INT3472\n 1\n 5b824b065c2f035f53425f50433030434c5031085f53544100085f4849440d494e543334373200085f4349440d494e543334373200085f55494401085f41445200085f43525311260a238e1e00010001020000010600801a060049005c5f53422e504330302e49324333007900\n \n n\n n\n n\n \n \n \\_SB_.PC00.I2C3\n \n \n \\_SB_.PC00.CLP2\n INT3472\n 2\n 5b824c065c2f035f53425f50433030434c5032085f53544100085f4849440d494e543334373200085f4349440d494e543334373200085f5549440a02085f41445200085f43525311260a238e1e00010001020000010600801a060049005c5f53422e504330302e49324333007900\n \n n\n n\n n\n \n \n \\_SB_.PC00.I2C3\n \n \n \\_SB_.PC00.CLP3\n INT3472\n 3\n 5b824c065c2f035f53425f50433030434c5033085f53544100085f4849440d494e543334373200085f4349440d494e543334373200085f5549440a03085f41445200085f43525311260a238e1e00010001020000010600801a060049005c5f53422e504330302e49324333007900\n \n n\n n\n n\n \n \n \\_SB_.PC00.I2C3\n \n \n \\_SB_.PC00.CLP4\n INT3472\n 4\n 5b824c065c2f035f53425f50433030434c5034085f53544100085f4849440d494e543334373200085f4349440d494e543334373200085f5549440a04085f41445200085f43525311260a238e1e00010001020000010600801a060049005c5f53422e504330302e49324333007900\n \n n\n n\n n\n \n \n \\_SB_.PC00.I2C3\n \n \n \\_SB_.PC00.CLP5\n INT3472\n 5\n 5b824c065c2f035f53425f50433030434c5035085f53544100085f4849440d494e543334373200085f4349440d494e543334373200085f5549440a05085f41445200085f43525311260a238e1e00010001020000010600801a060049005c5f53422e504330302e49324333007900\n \n n\n n\n n\n \n \n \\_SB_.PC00.I2C3\n \n \n \\_SB_.PC00.DOCK\n PNP0C15\n 2\n 5b82365c2f035f53425f50433030444f434b085f53544100085f4849440d414243443030303000085f4349440c41d00c15085f5549440a02\n \n n\n n\n n\n \n \n \n \\_SB_.PC00.DSC0\n INT3472\n 0\n 5b824a045c2f035f53425f5043303044534330085f53544100085f4849440d494e543334373200085f4349440d494e543334373200085f55494400085f41445200085f43525311050a027900\n \n n\n n\n n\n \n \n \n \\_SB_.PC00.DSC1\n INT3472\n 1\n 5b8241095c2f035f53425f5043303044534331085f53544100085f4849440d494e543334373200085f4349440d494e543334373200085f55494401085f41445200085f435253114c040a488c200001010100020000000000001700001900230000008d005c5f53422e47504930008c200001010100020000000000001700001900230000008f005c5f53422e47504930007900\n \n n\n n\n n\n \n \n \n \\_SB_.GPI0\n \n \n \\_SB_.PC00.DSC2\n INT3472\n 2\n 5b8242095c2f035f53425f5043303044534332085f53544100085f4849440d494e543334373200085f4349440d494e543334373200085f5549440a02085f41445200085f435253114c040a488c20000101010002000000000000170000190023000000b6005c5f53422e47504930008c20000101010002000000000000170000190023000000ab005c5f53422e47504930007900\n \n n\n n\n n\n \n \n \n \\_SB_.GPI0\n \n \n \\_SB_.PC00.DSC3\n INT3472\n 3\n 5b8242095c2f035f53425f5043303044534333085f53544100085f4849440d494e543334373200085f4349440d494e543334373200085f5549440a03085f41445200085f435253114c040a488c20000101010002000000000000170000190023000000b6005c5f53422e47504930008c20000101010002000000000000170000190023000000ab005c5f53422e47504930007900\n \n n\n n\n n\n \n \n \n \\_SB_.GPI0\n \n \n \\_SB_.PC00.DSC4\n INT3472\n 4\n 5b8242095c2f035f53425f5043303044534334085f53544100085f4849440d494e543334373200085f4349440d494e543334373200085f5549440a04085f41445200085f435253114c040a488c20000101010002000000000000170000190023000000b6005c5f53422e47504930008c20000101010002000000000000170000190023000000ab005c5f53422e47504930007900\n \n n\n n\n n\n \n \n \n \\_SB_.GPI0\n \n \n \\_SB_.PC00.DSC5\n INT3472\n 5\n 5b8242095c2f035f53425f5043303044534335085f53544100085f4849440d494e543334373200085f4349440d494e543334373200085f5549440a05085f41445200085f435253114c040a488c20000101010002000000000000170000190023000000b6005c5f53422e47504930008c20000101010002000000000000170000190023000000ab005c5f53422e47504930007900\n \n n\n n\n n\n \n \n \n \\_SB_.GPI0\n \n \n \\_SB_.PC00.FLM0\n PWRC0000\n 0\n 5b8241095c2f035f53425f50433030464c4d30085f53544100085f4849440d505752433030303000085f4349440d505752433030303000085f55494400085f41445200085f435253114a040a468c20000101010002000000000000170000190023000000a5005c5f53422e47504930008e1e00010001020000010600801a060067005c5f53422e504330302e49324331007900\n \n n\n n\n n\n \n \n \n \\_SB_.GPI0\n \\_SB_.PC00.I2C1\n \n \n \\_SB_.PC00.FLM1\n PWRC0000\n 0\n 5b8241095c2f035f53425f50433030464c4d31085f53544100085f4849440d505752433030303000085f4349440d505752433030303000085f55494400085f41445200085f435253114a040a468c20000101010002000000000000170000190023000000a3005c5f53422e47504930008e1e00010001020000010600801a060067005c5f53422e504330302e49324332007900\n \n n\n n\n n\n \n \n \n \\_SB_.PC00.I2C2\n \\_SB_.GPI0\n \n \n \\_SB_.PC00.FLM2\n TXNW3643\n 0\n 5b8241095c2f035f53425f50433030464c4d32085f53544100085f4849440d54584e573336343300085f4349440d54584e573336343300085f55494400085f41445200085f435253114a040a468c20000101010002000000000000170000190023000000b2005c5f53422e47504930008e1e00010001020000010600801a060063005c5f53422e504330302e49324332007900\n \n n\n n\n n\n \n \n \n \\_SB_.PC00.I2C2\n \\_SB_.GPI0\n \n \n \\_SB_.PC00.FLM3\n PWRC0000\n 0\n 5b8241095c2f035f53425f50433030464c4d33085f53544100085f4849440d505752433030303000085f4349440d505752433030303000085f55494400085f41445200085f435253114a040a468c20000101010002000000000000170000190023000000a3005c5f53422e47504930008e1e00010001020000010600801a060067005c5f53422e504330302e49324333007900\n \n n\n n\n n\n \n \n \n \\_SB_.PC00.I2C3\n \\_SB_.GPI0\n \n \n \\_SB_.PC00.FLM4\n PWRC0000\n 0\n 5b8241095c2f035f53425f50433030464c4d34085f53544100085f4849440d505752433030303000085f4349440d505752433030303000085f55494400085f41445200085f435253114a040a468c20000101010002000000000000170000190023000000a3005c5f53422e47504930008e1e00010001020000010600801a060067005c5f53422e504330302e49324333007900\n \n n\n n\n n\n \n \n \n \\_SB_.PC00.I2C3\n \\_SB_.GPI0\n \n \n \\_SB_.PC00.FLM5\n PWRC0000\n 0\n 5b8241095c2f035f53425f50433030464c4d35085f53544100085f4849440d505752433030303000085f4349440d505752433030303000085f55494400085f41445200085f435253114a040a468c20000101010002000000000000170000190023000000a3005c5f53422e47504930008e1e00010001020000010600801a060067005c5f53422e504330302e49324333007900\n \n n\n n\n n\n \n \n \n \\_SB_.PC00.I2C3\n \\_SB_.GPI0\n \n \n \\_SB_.PC00.LNK0\n SONY362A\n 0\n 5b824f085c2f035f53425f504330304c4e4b30085f53544100085f4849440d534f4e593336324100085f4349440d534f4e593336324100085f55494400085f41445200085f4352531148040a448e1e00010001020000010600801a06001a005c5f53422e504330302e49324333008e1e00010001020000010600801a06000c005c5f53422e504330302e49324333007900\n \n n\n n\n n\n \n \n \n \\_SB_.PC00.I2C3\n \n \n \\_SB_.PC00.LNK1\n SONY488A\n 1\n 5b824d065c2f035f53425f504330304c4e4b31085f53544100085f4849440d534f4e593438384100085f4349440d534f4e593438384100085f55494401085f41445200085f43525311260a238e1e00010001020000010600801a060037005c5f53422e504330302e49324333007900\n \n n\n n\n n\n \n \n \\_SB_.PC00.I2C3\n \n \n \\_SB_.PC00.LNK2\n SONY362A\n 2\n 5b824e065c2f035f53425f504330304c4e4b32085f53544100085f4849440d534f4e593336324100085f4349440d534f4e593336324100085f5549440a02085f41445200085f43525311260a238e1e00010001020000010600801a06001a005c5f53422e504330302e49324332007900\n \n n\n n\n n\n \n \n \\_SB_.PC00.I2C2\n \n \n \\_SB_.PC00.LNK3\n INT33BE\n 3\n 5b8242115c2f035f53425f504330304c4e4b33085f53544100085f4849440d494e543333424500085f4349440d494e543333424500085f5549440a03085f41445200085f435253114c0c0ac88e1e00010001020000010600801a060010005c5f53422e504330302e49324333008e1e00010001020000010600801a06000c005c5f53422e504330302e49324333008e1e00010001020000010600801a060050005c5f53422e504330302e49324333008e1e00010001020000010600801a060051005c5f53422e504330302e49324333008e1e00010001020000010600801a060052005c5f53422e504330302e49324333008e1e00010001020000010600801a060053005c5f53422e504330302e49324333007900\n \n n\n n\n n\n \n \n \n \n \n \n \n \\_SB_.PC00.I2C3\n \n \n \\_SB_.PC00.LNK4\n INT33BE\n 4\n 5b8242115c2f035f53425f504330304c4e4b34085f53544100085f4849440d494e543333424500085f4349440d494e543333424500085f5549440a04085f41445200085f435253114c0c0ac88e1e00010001020000010600801a060010005c5f53422e504330302e49324333008e1e00010001020000010600801a06000c005c5f53422e504330302e49324333008e1e00010001020000010600801a060050005c5f53422e504330302e49324333008e1e00010001020000010600801a060051005c5f53422e504330302e49324333008e1e00010001020000010600801a060052005c5f53422e504330302e49324333008e1e00010001020000010600801a060053005c5f53422e504330302e49324333007900\n \n n\n n\n n\n \n \n \n \n \n \n \n \\_SB_.PC00.I2C3\n \n \n \\_SB_.PC00.LNK5\n INT33BE\n 5\n 5b8242115c2f035f53425f504330304c4e4b35085f53544100085f4849440d494e543333424500085f4349440d494e543333424500085f5549440a05085f41445200085f435253114c0c0ac88e1e00010001020000010600801a060010005c5f53422e504330302e49324333008e1e00010001020000010600801a06000c005c5f53422e504330302e49324333008e1e00010001020000010600801a060050005c5f53422e504330302e49324333008e1e00010001020000010600801a060051005c5f53422e504330302e49324333008e1e00010001020000010600801a060052005c5f53422e504330302e49324333008e1e00010001020000010600801a060053005c5f53422e504330302e49324333007900\n \n n\n n\n n\n \n \n \n \n \n \n \n \\_SB_.PC00.I2C3\n \n \n \\_SB_.PC00.PDRC\n 1\n 5b82205c2f035f53425f5043303050445243085f4849440c41d00c02085f55494401\n \n \n \n \n \n \n \n \n \n \n \n \n \n \\_SB_.AWAC\n 5b82215c2e5f53425f41574143085f5354410a0f085f4849440d414350493030304500\n \n y\n y\n y\n \n \n \n \\_SB_.COEX\n 5b824d045c2e5f53425f434f4558085f53544100085f4849440c25d43519085f535452112b0a2843006f004500780069007300740065006e006300650020004d0061006e0061006700650072000000\n \n n\n n\n n\n \n \n \n \\_SB_.EPC_\n 5b824c085c2e5f53425f4550435f085f53544100085f4849440c25d40e0c085f53545211310a2e45006e0063006c0061007600650020005000610067006500200043006100630068006500200031002e0030000000085f43525311330a308a2b0000010100000000000000000000000000000000ffffffffffffffff000000000000000000000000000000007900\n \n n\n n\n n\n \n \n \n \n \\_SB_.GPI0\n 5b8245065c2e5f53425f47504930085f5354410a0f085f4849440d494e543334433500085f435253113e0a3b8906000d010e0000008609000100006efd000001008609000100006dfd000001008609000100006afd0000010086090001000069fd000001007900\n \n y\n y\n y\n \n \n \n \n \n \n \\_SB_.PC00.DSC3\n \\_SB_.PC00.FLM4\n \\_SB_.PC00.UA00.BTH0\n \\_SB_.PC00.FLM5\n \\_SB_.PC00.DSC1\n \\_SB_.PC00.DSC2\n \\_SB_.PC00.FLM1\n \\_SB_.PC00.FLM2\n \\_SB_.PC00.DSC5\n \\_SB_.PC00.FLM0\n \\_SB_.PC00.FLM3\n \\_SB_.PC00.DSC4\n \n \n \\_SB_.HIDD\n 5b82205c2e5f53425f48494444085f53544100085f4849440d494e54433130353100\n \n n\n n\n n\n \n \n \n \\_SB_.IOTR\n IoTraps\n 5b82365c2e5f53425f494f5452085f4849440c41d00c02085f5549440d496f547261707300085f435253110d0a0a47010020002001ff7900\n \n \n \n \\_SB_.LID0\n 5b821b5c2e5f53425f4c494430085f53544100085f4849440c41d00c0d\n \n n\n n\n n\n \n \n \n \\_SB_.LNKA\n 1\n 5b82315c2e5f53425f4c4e4b41085f5354410a09085f4849440c41d00c0f085f55494401085f43525311090a06238b00187900\n \n y\n n\n y\n \n \n \n \n \\_SB_.LNKB\n 2\n 5b82325c2e5f53425f4c4e4b42085f5354410a09085f4849440c41d00c0f085f5549440a02085f43525311090a06238a00187900\n \n y\n n\n y\n \n \n \n \n \\_SB_.LNKC\n 3\n 5b82325c2e5f53425f4c4e4b43085f5354410a09085f4849440c41d00c0f085f5549440a03085f43525311090a06238b00187900\n \n y\n n\n y\n \n \n \n \n \\_SB_.LNKD\n 4\n 5b82325c2e5f53425f4c4e4b44085f5354410a09085f4849440c41d00c0f085f5549440a04085f43525311090a06238b00187900\n \n y\n n\n y\n \n \n \n \n \\_SB_.LNKE\n 5\n 5b82325c2e5f53425f4c4e4b45085f5354410a09085f4849440c41d00c0f085f5549440a05085f43525311090a06238b00187900\n \n y\n n\n y\n \n \n \n \n \\_SB_.LNKF\n 6\n 5b82325c2e5f53425f4c4e4b46085f5354410a09085f4849440c41d00c0f085f5549440a06085f43525311090a06238b00187900\n \n y\n n\n y\n \n \n \n \n \\_SB_.LNKG\n 7\n 5b82325c2e5f53425f4c4e4b47085f5354410a09085f4849440c41d00c0f085f5549440a07085f43525311090a06238b00187900\n \n y\n n\n y\n \n \n \n \n \\_SB_.LNKH\n 8\n 5b82325c2e5f53425f4c4e4b48085f5354410a09085f4849440c41d00c0f085f5549440a08085f43525311090a06238b00187900\n \n y\n n\n y\n \n \n \n \n \\_SB_.PAGD\n 5b82215c2e5f53425f50414744085f5354410a0f085f4849440d414350493030304300\n \n y\n y\n y\n \n \n \n \\_SB_.PEPD\n PNP0D80\n 1\n 5b82305c2e5f53425f50455044085f5354410a0f085f4849440d494e543333413100085f4349440c41d00d80085f55494401\n \n y\n y\n y\n \n \n \n \\_SB_.PRRE\n PCHRESV\n 5b824b0a5c2e5f53425f50525245085f5354410a0b085f4849440c41d00c02085f5549440d5043485245535600085f435253114a070a7686090001000000fe000002008609000100c004fe0040000086090001000005fe000006008609000100000dfe0000030086090001000020fe0000600086090000000000ff0000000147010018001801ff86090001000000fd000069008609000100006bfd000002008609000100006ffd000091007900\n \n y\n y\n y\n \n \n \n \n \n \n \n \n \n \n \n \n \n \\_SB_.PTHH\n 5b8244045c2e5f53425f50544848085f53544100085f4849440d494e54433130303100085f435253111d0a1a86090001000010fe0000100086090001000080fc000080007900\n \n n\n n\n n\n \n \n \n \n \n \\_SB_.PTID\n PNP0C02\n 5b82265c2e5f53425f50544944085f5354410a0f085f4849440c25d4340e085f4349440c41d00c02\n \n y\n y\n y\n \n \n \n \\_SB_.PWRB\n 5b821c5c2e5f53425f50575242085f5354410a0f085f4849440c41d00c0c\n \n y\n y\n y\n \n \n \n \\_SB_.SLPB\n 5b821c5c2e5f53425f534c5042085f5354410a0b085f4849440c41d00c0e\n \n y\n y\n y\n \n \n \n \\_SB_.TPM_\n 1\n 5b8246065c2e5f53425f54504d5f085f5354410a0f085f4849440d4d5346543031303100085f55494401085f53545211210a1e540050004d00200032002e00300020004400650076006900630065000000085f43525311110a0e860900010000d4fe005000007900\n \n y\n y\n y\n \n \n \n 0xfed40040\n \n \n 0x7\n 0x0\n 0x0\n 0x0\n 0x0\n 0x0\n 0x0\n 0x0\n 0x0\n 0x0\n 0x0\n 0x0\n 0x0\n \n \n 0x10000\n 0x40c9f000\n \n \n \n \\_SB_.URSC\n 5\n 5b822e5c2e5f53425f55525343085f5354410a0b085f4849440c41d00c02085f5549440a05085f43525311050a027900\n \n y\n y\n y\n \n \n \n \\_SB_.WFDE\n SampleDev\n 5b82295c2e5f53425f57464445085f4849440d504e503043313400085f5549440d53616d706c6544657600\n \n \n \\_SB_.WFTE\n TestDev\n 5b82275c2e5f53425f57465445085f4849440d504e503043313400085f5549440d5465737444657600\n \n \n \n \\_TZ_\n \n \\_TZ_.FAN0\n 0\n 5b821b5c2e5f545a5f46414e30085f4849440c41d00c0b085f55494400\n \n \n \\_TZ_.FAN1\n 1\n 5b821b5c2e5f545a5f46414e31085f4849440c41d00c0b085f55494401\n \n \n \\_TZ_.FAN2\n 2\n 5b821c5c2e5f545a5f46414e32085f4849440c41d00c0b085f5549440a02\n \n \n \\_TZ_.FAN3\n 3\n 5b821c5c2e5f545a5f46414e33085f4849440c41d00c0b085f5549440a03\n \n \n \\_TZ_.FAN4\n 4\n 5b821c5c2e5f545a5f46414e34085f4849440c41d00c0b085f5549440a04\n \n \n \n \n \n \n Sleep Button\n PNP0C0E/button/input0\n \n \n Power Button\n PNP0C0C/button/input0\n \n \n Power Button\n LNXPWRBN/button/input0\n \n \n Video Bus\n LNXVIDEO/video/input0\n \n \n HDA Intel PCH HDMI/DP,pcm=3\n ALSA\n \n \n HDA Intel PCH HDMI/DP,pcm=7\n ALSA\n \n \n HDA Intel PCH HDMI/DP,pcm=8\n ALSA\n \n \n HDA Intel PCH HDMI/DP,pcm=9\n ALSA\n \n \n HDA Intel PCH HDMI/DP,pcm=10\n ALSA\n \n \n HDA Intel PCH HDMI/DP,pcm=11\n ALSA\n \n \n HDA Intel PCH HDMI/DP,pcm=12\n ALSA\n \n \n HDA Intel PCH HDMI/DP,pcm=13\n ALSA\n \n \n HDA Intel PCH HDMI/DP,pcm=14\n ALSA\n \n \n HDA Intel PCH HDMI/DP,pcm=15\n ALSA\n \n \n HDA Intel PCH HDMI/DP,pcm=16\n ALSA\n \n \n HDA Intel PCH HDMI/DP,pcm=17\n ALSA\n \n \n \n \n /dev/ttyS0\n 4\n \n \n /dev/ttyS1\n 0\n \n \n /dev/ttyS2\n 0\n \n \n /dev/ttyS3\n 0\n \n \n /dev/ttyS4\n 0\n \n \n /dev/ttyS5\n 0\n \n \n /dev/ttyS6\n 0\n \n \n /dev/ttyS7\n 0\n \n \n /dev/ttyS8\n 0\n \n \n /dev/ttyS9\n 0\n \n \n /dev/ttyS10\n 0\n \n \n /dev/ttyS11\n 0\n \n \n /dev/ttyS12\n 0\n \n \n /dev/ttyS13\n 0\n \n \n /dev/ttyS14\n 0\n \n \n /dev/ttyS15\n 0\n \n \n /dev/ttyS16\n 0\n \n \n /dev/ttyS17\n 0\n \n \n /dev/ttyS18\n 0\n \n \n /dev/ttyS19\n 0\n \n \n /dev/ttyS20\n 0\n \n \n /dev/ttyS21\n 0\n \n \n /dev/ttyS22\n 0\n \n \n /dev/ttyS23\n 0\n \n \n /dev/ttyS24\n 0\n \n \n /dev/ttyS25\n 0\n \n \n /dev/ttyS26\n 0\n \n \n /dev/ttyS27\n 0\n \n \n /dev/ttyS28\n 0\n \n \n /dev/ttyS29\n 0\n \n \n /dev/ttyS30\n 0\n \n \n /dev/ttyS31\n 0\n \n \n \n
\n", + "C:\\Users\\Axel\\acrn-work\\MyConfiguration\\scenario.xml": "\n \n \n debug\n /dev/ttyS0\n 5\n 5\n 3\n \n \n y\n SCHED_BVT\n y\n y\n n\n n\n \n n\n y\n n\n \n y\n n\n y\n n\n n\n \n \n \n 0x2000\n \n \n 16\n 1\n 96\n 120\n 256\n \n 16\n \n \n 0x00000010\n \n \n \n Connection_1\n legacy\n \n ACRN_Service_VM\n 0x3F\n \n \n POST_STD_VM1\n 0x3F\n \n \n \n Connection_2\n pci\n \n ACRN_Service_VM\n 00:10.0\n \n \n POST_RT_VM1\n 00:10.0\n \n \n \n \n \n SERVICE_VM\n ACRN_Service_VM\n \n 0\n \n \n KERNEL_BZIMAGE\n Linux_bzImage\n \n rw rootwait root=/dev/nvme0n1p2 console=tty0 console=ttyS0 consoleblank=0 no_timer_check quiet loglevel=3\n i915.nuclear_pageflip=1 swiotlb=131072\n \n COM Port 1\n \n \n POST_LAUNCHED_VM\n STANDARD_VM\n POST_STD_VM1\n \n \n 0\n \n \n 1\n \n \n \n 0\n 0\n \n \n 4096\n \n COM Port 1\n \n 00:02.0 VGA compatible controller: Intel Corporation TigerLake-LP GT2 [Iris Xe Graphics] (rev 01)\n \n n\n Windows OS\n y\n n\n \n \n \n \n WaaG\n \n \n ./win10-ltsc.img\n \n \n \n POST_LAUNCHED_VM\n RTVM\n POST_RT_VM1\n y\n \n \n 2\n y\n \n \n 3\n y\n \n \n \n 0\n 0\n \n \n 1024\n \n COM Port 1\n n\n Non-Windows OS\n y\n n\n \n \n \n Virtio console\n stdio\n \n \n RT\n \n \n ./core-image-weston-intel-corei7-64.wic\n \n \n \n POST_LAUNCHED_VM\n STANDARD_VM\n POST_STD_VM2\n \n \n 0\n \n \n 1\n \n \n \n 0\n 0\n \n \n 512\n \n COM Port 1\n n\n Non-Windows OS\n y\n n\n \n \n \n Virtio console\n stdio\n \n \n YaaG3\n \n \n ./YaaG.img\n \n \n \n POST_LAUNCHED_VM\n STANDARD_VM\n POST_STD_VM3\n \n \n 0\n \n \n 1\n \n \n \n 0\n 0\n \n \n 512\n \n COM Port 1\n n\n Non-Windows OS\n y\n n\n \n \n \n Virtio console\n stdio\n \n \n YaaG4\n \n \n ./YaaG.img\n \n \n \n POST_LAUNCHED_VM\n STANDARD_VM\n POST_STD_VM4\n \n \n 0\n \n \n 1\n \n \n \n 0\n 0\n \n \n 512\n \n COM Port 1\n n\n Non-Windows OS\n y\n n\n \n \n \n Virtio console\n stdio\n \n \n YaaG5\n \n \n ./YaaG.img\n \n \n \n POST_LAUNCHED_VM\n STANDARD_VM\n POST_STD_VM5\n \n \n 0\n \n \n 1\n \n \n \n 0\n 0\n \n \n 512\n \n COM Port 1\n n\n Non-Windows OS\n y\n n\n \n \n \n Virtio console\n stdio\n \n \n YaaG6\n \n \n ./YaaG.img\n \n \n\n" + } +} \ No newline at end of file diff --git a/misc/config_tools/configurator/packages/configurator/tests/mock.js b/misc/config_tools/configurator/packages/configurator/tests/mock.js new file mode 100644 index 000000000..fb361b351 --- /dev/null +++ b/misc/config_tools/configurator/packages/configurator/tests/mock.js @@ -0,0 +1,33 @@ +import {mockIPC} from "@tauri-apps/api/mocks"; +import mockData from './data/data.json'; + +export default function mock() { + + const origin_confirm = window.confirm; + window.confirm = async (message) => origin_confirm(message); + + // mock custom tauri command + mockIPC(async (cmd, args) => { + const packageInfo = await import('../package.json'); + + function handle() { + switch (cmd) { + case 'get_home': + return 'C:\\Users\\Axel' + case 'get_history': + return JSON.stringify(mockData.history[args.historyType]) + case 'acrn_read': + return mockData.files[args.filePath] + default: + if (args?.message?.cmd === "getAppVersion") { + return packageInfo.version; + } + + console.log(cmd, args) + return {} + } + } + + return handle() + }) +} \ No newline at end of file diff --git a/misc/config_tools/configurator/thirdLib/.gitignore b/misc/config_tools/configurator/packages/configurator/thirdLib/.gitignore similarity index 100% rename from misc/config_tools/configurator/thirdLib/.gitignore rename to misc/config_tools/configurator/packages/configurator/thirdLib/.gitignore diff --git a/misc/config_tools/configurator/thirdLib/library.json b/misc/config_tools/configurator/packages/configurator/thirdLib/library.json similarity index 97% rename from misc/config_tools/configurator/thirdLib/library.json rename to misc/config_tools/configurator/packages/configurator/thirdLib/library.json index c6a9806fa..96f068731 100644 --- a/misc/config_tools/configurator/thirdLib/library.json +++ b/misc/config_tools/configurator/packages/configurator/thirdLib/library.json @@ -13,7 +13,7 @@ "install": [ { "type": "copy", - "from": "../../dist/acrn_config_tools-3.0-py3-none-any.whl", + "from": "../../../../dist/acrn_config_tools-3.0-py3-none-any.whl", "to": "acrn_config_tools-3.0-py3-none-any.whl" } ] diff --git a/misc/config_tools/configurator/thirdLib/manager.py b/misc/config_tools/configurator/packages/configurator/thirdLib/manager.py similarity index 96% rename from misc/config_tools/configurator/thirdLib/manager.py rename to misc/config_tools/configurator/packages/configurator/thirdLib/manager.py index 12bfe1f8b..830e15d2e 100644 --- a/misc/config_tools/configurator/thirdLib/manager.py +++ b/misc/config_tools/configurator/packages/configurator/thirdLib/manager.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """ -misc/config_tools/configurator/thirdLib/manager.py -depend on misc/config_tools/configurator/thirdLib/library.json +misc/config_tools/configurator/packages/configurator/thirdLib/manager.py +depend on misc/config_tools/configurator/packages/configurator/thirdLib/library.json """ import argparse import os diff --git a/misc/config_tools/configurator/thirdLib/tauri-plugin.ts b/misc/config_tools/configurator/packages/configurator/thirdLib/tauri-plugin.ts similarity index 75% rename from misc/config_tools/configurator/thirdLib/tauri-plugin.ts rename to misc/config_tools/configurator/packages/configurator/thirdLib/tauri-plugin.ts index 3ceb6d6a8..77177f755 100644 --- a/misc/config_tools/configurator/thirdLib/tauri-plugin.ts +++ b/misc/config_tools/configurator/packages/configurator/thirdLib/tauri-plugin.ts @@ -1,21 +1,12 @@ const fs = require('fs') const path = require('path') -import type {ConfigEnv, Plugin, ResolvedConfig} from "vite"; -// @ts-ignore +import type {Plugin, ResolvedConfig} from "vite"; import replace from "@rollup/plugin-replace"; // @ts-ignore import cli from "@tauri-apps/cli" -import Config from "../src-tauri/types/config" -// @ts-ignore -import tauriConf from "../src-tauri/tauri.json"; - - -interface Options { - config?: (c: Config, e: ConfigEnv) => Config; -} function copyFolder(copiedPath, resultPath, direct) { if (!direct) { @@ -68,17 +59,11 @@ function copyFolder(copiedPath, resultPath, direct) { } -export default (options?: Options): Plugin => { - let tauriConfig: Config = {...tauriConf}; +export default (): Plugin => { let viteConfig: ResolvedConfig; const tauri = (mode: "dev" | "build"): Promise => { - // Generate `tauri.conf.json` by `tauri.json`. - console.log("Generate `tauri.conf.json` by `tauri.json`.") - let filePath = path.resolve(__dirname, '..', 'src-tauri', 'tauri.conf.json') - let config = JSON.stringify(tauriConfig) try { - fs.writeFileSync(filePath, config) return cli.run([mode], 'tauri') } catch (err) { console.error(err) @@ -96,7 +81,6 @@ export default (options?: Options): Plugin => { server?.httpServer?.on("listening", () => { if (!process.env.TAURI_SERVE) { process.env.TAURI_SERVE = "true"; - delete tauriConfig["$schema"] tauri('dev').finally() } }); @@ -104,19 +88,12 @@ export default (options?: Options): Plugin => { closeBundle() { if (!process.env.TAURI_BUILD) { process.env.TAURI_BUILD = "true"; - delete tauriConfig["$schema"] copyFolder('../thirdLib', '../build/thirdLib', false) tauri('build').finally() } }, config(viteConfig, env) { process.env.IS_TAURI = "true"; - if (options && options.config) { - options.config(tauriConfig, env); - } - if (env.command === "build") { - viteConfig.base = "/"; - } }, configResolved(resolvedConfig) { viteConfig = resolvedConfig; diff --git a/misc/config_tools/configurator/vite.config.js b/misc/config_tools/configurator/packages/configurator/vite.config.js similarity index 76% rename from misc/config_tools/configurator/vite.config.js rename to misc/config_tools/configurator/packages/configurator/vite.config.js index e137d79b9..58e828a18 100644 --- a/misc/config_tools/configurator/vite.config.js +++ b/misc/config_tools/configurator/packages/configurator/vite.config.js @@ -8,6 +8,9 @@ import tauri from "./thirdLib/tauri-plugin"; export default defineConfig({ base: './', plugins: [vue(), tauri()], + resolve: { + extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'] + }, build: { outDir: path.resolve(__dirname, 'build') } diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/LICENSE.vue-json-schema-form b/misc/config_tools/configurator/packages/vue-json-schema-form/LICENSE.vue-json-schema-form new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/LICENSE.vue-json-schema-form @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/utils/CHANGELOG.md b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/CHANGELOG.md new file mode 100644 index 000000000..2ab9fb9e2 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/CHANGELOG.md @@ -0,0 +1,223 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [1.12.2](https://github.com/lljj-x/vue-json-schema-form/compare/v1.12.1...v1.12.2) (2022-04-11) + + +### Bug Fixes + +* **lib:** ui:hidden 透传到widget组件 ([f63094e](https://github.com/lljj-x/vue-json-schema-form/commit/f63094ee85659d1fea45bd789321817c08664ffa)), closes [#170](https://github.com/lljj-x/vue-json-schema-form/issues/170) + + + + + +# [1.12.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.11.0...v1.12.0) (2022-03-08) + + +### Bug Fixes + +* **lib:** 添加严格模式配置,更精准计算anyOf 默认值 ([10cdc08](https://github.com/lljj-x/vue-json-schema-form/commit/10cdc089087d83d8fe08e1fd379b7a1aaad0cd5d)), closes [#152](https://github.com/lljj-x/vue-json-schema-form/issues/152) + + +### Features + +* **lib:** 优化样式 ([e53291b](https://github.com/lljj-x/vue-json-schema-form/commit/e53291b8395fdceb971f15f72c9e809cdee8ec7e)) + + + + + +# [1.11.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.10.0...v1.11.0) (2022-02-19) + + +### Bug Fixes + +* **lib:** 添加严格模式配置,更精准计算anyOf 默认值 ([2cd65bb](https://github.com/lljj-x/vue-json-schema-form/commit/2cd65bb5f275a021f1cc368e4c63387163c94d57)), closes [#157](https://github.com/lljj-x/vue-json-schema-form/issues/157) + + + + + +## [1.9.5](https://github.com/lljj-x/vue-json-schema-form/compare/v1.9.4...v1.9.5) (2021-11-21) + + +### Bug Fixes + +* **lib:** 修复inline 布局样式问题 ([65a7143](https://github.com/lljj-x/vue-json-schema-form/commit/65a7143fc19105f9096afc24a25107c0ef27ac5f)), closes [#122](https://github.com/lljj-x/vue-json-schema-form/issues/122) + + + + + +## [1.9.3](https://github.com/lljj-x/vue-json-schema-form/compare/v1.9.2...v1.9.3) (2021-10-10) + + +### Bug Fixes + +* **lib:** allOf merge 相同类型直接使用左边 ([c0bd0cd](https://github.com/lljj-x/vue-json-schema-form/commit/c0bd0cde9f15b4ca928fec84b4831a5cb459aa43)), closes [#116](https://github.com/lljj-x/vue-json-schema-form/issues/116) + + + + + +## [1.9.2](https://github.com/lljj-x/vue-json-schema-form/compare/v1.9.1...v1.9.2) (2021-09-25) + + +### Bug Fixes + +* **lib:** 修复anyof 默认值计算可能丢失属性 ([44bcb44](https://github.com/lljj-x/vue-json-schema-form/commit/44bcb44af63a37847cd3df5614fad2f26bdf307d)), closes [#108](https://github.com/lljj-x/vue-json-schema-form/issues/108) +* **lib:** 修复anyOf嵌套object 可能丢失部分校验规则的问题 ([5c06294](https://github.com/lljj-x/vue-json-schema-form/commit/5c06294d9a9c978bda1c3724710cfd4ba478af5b)) + + + + + +## [1.9.1](https://github.com/lljj-x/vue-json-schema-form/compare/v1.9.0...v1.9.1) (2021-09-22) + +**Note:** Version bump only for package @lljj/vjsf-utils + + + + + +# [1.9.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.7.0...v1.9.0) (2021-09-06) + + +### Features + +* **vue2:** vue2 添加 widgetListeners 配置 ([50348c2](https://github.com/lljj-x/vue-json-schema-form/commit/50348c27e72813ea16fdcfcea46e6450ccf06018)), closes [#45](https://github.com/lljj-x/vue-json-schema-form/issues/45) + + + + + +# [1.8.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.7.0...v1.8.0) (2021-09-06) + + +### Features + +* **vue2:** vue2 添加 widgetListeners 配置 ([50348c2](https://github.com/lljj-x/vue-json-schema-form/commit/50348c27e72813ea16fdcfcea46e6450ccf06018)), closes [#45](https://github.com/lljj-x/vue-json-schema-form/issues/45) + + + + + +# [1.7.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.6.4...v1.7.0) (2021-08-29) + + +### Features + +* **lib:** 支持配置 slots ([27f1501](https://github.com/lljj-x/vue-json-schema-form/commit/27f1501eda01eabd4a723656be56904e9cb0f069)), closes [#45](https://github.com/lljj-x/vue-json-schema-form/issues/45) + + + + + +## [1.6.3](https://github.com/lljj-x/vue-json-schema-form/compare/v1.6.2...v1.6.3) (2021-07-12) + +**Note:** Version bump only for package @lljj/vjsf-utils + + + + + +## [1.6.2](https://github.com/lljj-x/vue-json-schema-form/compare/v1.6.1...v1.6.2) (2021-05-31) + +**Note:** Version bump only for package @lljj/vjsf-utils + + + + + +# [1.3.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.2.1...v1.3.0) (2021-04-15) + + +### Bug Fixes + +* **core:** 修复 anyof 后代存在 $ref可能无法回填的问题 ([4dd046b](https://github.com/lljj-x/vue-json-schema-form/commit/4dd046bee0e5c3589f2bfa64ba0d90ed7869067a)), closes [#59](https://github.com/lljj-x/vue-json-schema-form/issues/59) + + +### Features + +* **core:** widget 节点直接配置onChange ([2d2264b](https://github.com/lljj-x/vue-json-schema-form/commit/2d2264b004c3b6586e225c563bf03ca52fc5e53a)) + + + + + +## [1.2.1](https://github.com/lljj-x/vue-json-schema-form/compare/v1.2.0...v1.2.1) (2021-04-11) + + +### Bug Fixes + +* **lib:** 修复anyOf下多级对象初始值计算错误问题 ([6dd9780](https://github.com/lljj-x/vue-json-schema-form/commit/6dd97804573aa55001c2715da4a6ffcc5ee897b9)), closes [#57](https://github.com/lljj-x/vue-json-schema-form/issues/57) + + + + + +# [1.2.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.1.3...v1.2.0) (2021-03-30) + + +### Features + +* **lib:** 添加 fallback-label 参数 ([cd2d8c3](https://github.com/lljj-x/vue-json-schema-form/commit/cd2d8c3ed72b9bc03e44eb5b86eb1b18fe67c34c)), closes [#45](https://github.com/lljj-x/vue-json-schema-form/issues/45) + + + + + +## [1.1.3](https://github.com/lljj-x/vue-json-schema-form/compare/v1.1.2...v1.1.3) (2021-03-18) + +**Note:** Version bump only for package @lljj/vjsf-utils + + + + + +# [1.1.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.0.2...v1.1.0) (2021-03-06) + + +### Features + +* **vue3-ant:** 更新初始化 ([71a2810](https://github.com/lljj-x/vue-json-schema-form/commit/71a281045af11f215333050396aa546dd5e78b88)), closes [#27](https://github.com/lljj-x/vue-json-schema-form/issues/27) [#27](https://github.com/lljj-x/vue-json-schema-form/issues/27) [#27](https://github.com/lljj-x/vue-json-schema-form/issues/27) [#40](https://github.com/lljj-x/vue-json-schema-form/issues/40) + + + + + +## [1.0.2](https://github.com/lljj-x/vue-json-schema-form/compare/v1.0.1...v1.0.2) (2021-01-31) + + +### Bug Fixes + +* **style:** 修复p标签等自带边距导致的样式问题  ([7b7e43e](https://github.com/lljj-x/vue-json-schema-form/commit/7b7e43eaa06c14a436b34c38d6d69aad27d67512)) + + + + + +## [0.6.1](https://github.com/lljj-x/vue-json-schema-form/compare/v0.6.0...v0.6.1) (2021-01-19) + +**Note:** Version bump only for package @lljj/vjsf-utils + + + + + +# [0.6.0](https://github.com/lljj-x/vue-json-schema-form/compare/v0.5.0...v0.6.0) (2021-01-19) + + +### Bug Fixes + +* **lib:** 修复 anyOf 类型,编辑时不能匹配正确选项 ([d747722](https://github.com/lljj-x/vue-json-schema-form/commit/d7477227d004e47c2b186c3eb956e4c83d7077ad)), closes [#31](https://github.com/lljj-x/vue-json-schema-form/issues/31) +* **lib:** 解决打包后包含es6代码问题 ([f03352e](https://github.com/lljj-x/vue-json-schema-form/commit/f03352eb129c45963ad41e3e91eebe102c303913)), closes [#29](https://github.com/lljj-x/vue-json-schema-form/issues/29) + + +### Features + +* **iview:** 添加iview i-switch 组件转换 ([8fae70c](https://github.com/lljj-x/vue-json-schema-form/commit/8fae70cb28f7fd02073d6d4318861b7f08f6199b)) +* **vue3:** 完成 vue3 form组件 ([1c5deba](https://github.com/lljj-x/vue-json-schema-form/commit/1c5debae4cb92f3f54de64d8f38c98396022a344)) diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/utils/README.md b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/README.md new file mode 100644 index 000000000..fc900ab85 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/README.md @@ -0,0 +1,40 @@ +# @lljj/vjsf-utils +表单基础通用工具类,具体的参数可参见源码 + +## @lljj/vjsf-utils/i18n + 管理当前多语言 + + +## @lljj/vjsf-utils/schema/getDefaultFormState +根据 jsonSchema 和 formData,计算当前schema value + +## @lljj/vjsf-utils/schema/validate + +```js +import { + ajvValidateFormData, + validateFormDataAndTransformMsg, + isValid +} from '@lljj/vjsf-utils/schema/validate'; + +// 直接调用 ajv 验证schema,返回格式化后的结果 +ajvValidateFormData(...args); + +// 校验数据并处理多语言(只处理当前节点) +validateFormDataAndTransformMsg(...args); + +// 返回数据是否校验成功 +isValid(...args); + +// 返回数据是否校验成功 +isValid(...args); +``` + +## @lljj/vjsf-utils/arrayUtils +数组相关的工具类 + +## @lljj/vjsf-utils/formUtils +表单相关的工具类 + +## @lljj/vjsf-utils/vueUtils +Vue相关的工具类 diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/utils/arrayUtils.js b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/arrayUtils.js new file mode 100644 index 000000000..a303eb543 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/arrayUtils.js @@ -0,0 +1,53 @@ +/** + * Created by Liu.Jun on 2020/4/25 10:53. + */ + +// 通过 index 上移 +export function moveUpAt(target, index) { + if (index === 0) return false; + const item = target[index]; + const newItems = [item, target[index - 1]]; + return target.splice(index - 1, 2, ...newItems); +} + +// 通过 index 下移动 +export function moveDownAt(target, index) { + if (index === target.length - 1) return false; + const item = target[index]; + const newItems = [target[index + 1], item]; + return target.splice(index, 2, ...newItems); +} + +// 移除 +export function removeAt(target, index) { + // 移除数组中指定位置的元素,返回布尔表示成功与否 + return !!target.splice(index, 1).length; +} + +// 数组填充对象 +export function fillObj(target, data) { + // 简单复制 异常直接抛错 + try { + if (typeof data === 'object') { + return target.fill(null).map(() => JSON.parse(JSON.stringify(data))); + } + } catch (e) { + // nothing ... + } + + // 默认返回一个 undefined + return undefined; +} + +// 切割分为多个数组 +export function cutOff(target, cutOffPointIndex) { + return target.reduce((preVal, curVal, curIndex) => { + preVal[curIndex > cutOffPointIndex ? 1 : 0].push(curVal); + return preVal; + }, [[], []]); +} + +// 数组交集 +export function intersection(arr1, arr2) { + return arr1.filter(item => arr2.includes(item)); +} diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/utils/components/FieldGroupWrap.vue b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/components/FieldGroupWrap.vue new file mode 100644 index 000000000..a1ae1c442 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/components/FieldGroupWrap.vue @@ -0,0 +1,64 @@ + + + diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/utils/formUtils.js b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/formUtils.js new file mode 100644 index 000000000..ad07af762 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/formUtils.js @@ -0,0 +1,430 @@ +import retrieveSchema from './schema/retriev'; +import { getPathVal } from './vueUtils'; + +import { getSchemaType, isObject } from './utils'; + +// 通用的处理表达式方法 +// 这里打破 JSON Schema 规范 +const regExpression = /{{(.*)}}/; +function handleExpression(rootFormData, curNodePath, expression, fallBack) { + // 未配置 + if (undefined === expression) { + return undefined; + } + + // 配置了 mustache 表达式 + const matchExpression = regExpression.exec(expression); + regExpression.lastIndex = 0; // 重置索引 + if (matchExpression) { + const code = matchExpression[1].trim(); + + // eslint-disable-next-line no-new-func + const fn = new Function('parentFormData', 'rootFormData', `return ${code}`); + + return fn(getPathVal(rootFormData, curNodePath, 1), rootFormData); + } + + // 回退 + return fallBack(); +} + +export function replaceArrayIndex({ schema, uiSchema } = {}, index) { + const itemUiOptions = getUiOptions({ + schema, + uiSchema, + containsSpec: false + }); + + return ['title', 'description'].reduce((preVal, curItem) => { + if (itemUiOptions[curItem]) { + preVal[`ui:${curItem}`] = String(itemUiOptions[curItem]).replace(/\$index/g, index + 1); + } + return preVal; + }, {}); +} + +// 是否为 hidden Widget +export function isHiddenWidget({ + schema = {}, + uiSchema = {}, + curNodePath = '', + rootFormData = {} +}) { + const widget = uiSchema['ui:widget'] || schema['ui:widget']; + const hiddenExpression = uiSchema['ui:hidden'] || schema['ui:hidden']; + + // 支持配置 ui:hidden 表达式 + return widget === 'HiddenWidget' + || widget === 'hidden' + || !!handleExpression(rootFormData, curNodePath, hiddenExpression, () => { + // 配置了函数 function + if (typeof hiddenExpression === 'function') { + return hiddenExpression(getPathVal(rootFormData, curNodePath, 1), rootFormData); + } + + // 配置了常量 ?? + return hiddenExpression; + }); +} + +// 解析当前节点 ui field +export function getUiField(FIELDS_MAP, { + schema = {}, + uiSchema = {}, +}) { + const field = schema['ui:field'] || uiSchema['ui:field']; + + // vue 组件,或者已注册的组件名 + if (typeof field === 'function' || typeof field === 'object' || typeof field === 'string') { + return { + field, + fieldProps: uiSchema['ui:fieldProps'] || schema['ui:fieldProps'], // 自定义field ,支持传入额外的 props + }; + } + + // 类型默认 field + const fieldCtor = FIELDS_MAP[getSchemaType(schema)]; + if (fieldCtor) { + return { + field: fieldCtor + }; + } + + // 如果包含 oneOf anyOf 返回空不异常 + // SchemaField 会附加onyOf anyOf信息 + if (!fieldCtor && (schema.anyOf || schema.oneOf)) { + return { + field: null + }; + } + + // 不支持的类型 + throw new Error(`不支持的field类型 ${schema.type}`); +} + +// 解析用户配置的 uiSchema options +export function getUserUiOptions({ + schema = {}, + uiSchema = {}, + curNodePath, // undefined 不处理 表达式 + rootFormData = {} +}) { + // 支持 uiSchema配置在 schema文件中 + return Object.assign({}, ...[schema, uiSchema].map(itemSchema => Object.keys(itemSchema) + .reduce((options, key) => { + const value = itemSchema[key]; + // options 内外合并 + if (key === 'ui:options' && isObject(value)) { + return { ...options, ...value }; + } + + // https://github.com/lljj-x/vue-json-schema-form/issues/170 + // ui:hidden需要作为内置属性使用,不能直接透传给widget组件,如果组件需要只能在ui:options 中使用hidden传递 + if (key !== 'ui:hidden' && key.indexOf('ui:') === 0) { + // 只对 ui:xxx 配置形式支持表达式 + return { + ...options, + [key.substring(3)]: curNodePath === undefined ? value : handleExpression(rootFormData, curNodePath, value, () => value) + }; + } + + return options; + }, {}))); +} + +// 解析当前节点的ui options参数 +export function getUiOptions({ + schema = {}, + uiSchema = {}, + containsSpec = true, + curNodePath, + rootFormData, +}) { + const spec = {}; + if (containsSpec) { + spec.readonly = !!schema.readOnly; + if (undefined !== schema.multipleOf) { + // 组件计数器步长 + spec.step = schema.multipleOf; + } + if (schema.minimum || schema.minimum === 0) { + spec.min = schema.minimum; + } + if (schema.maximum || schema.maximum === 0) { + spec.max = schema.maximum; + } + + if (schema.minLength || schema.minLength === 0) { + spec.minlength = schema.minLength; + } + if (schema.maxLength || schema.maxLength === 0) { + spec.maxlength = schema.maxLength; + } + + if (schema.format === 'date-time' || schema.format === 'date') { + // 数组类型 时间区间 + // 打破了schema的规范,type array 配置了 format + if (schema.type === 'array') { + spec.isRange = true; + spec.isNumberValue = !(schema.items && schema.items.type === 'string'); + } else { + // 字符串 ISO 时间 + spec.isNumberValue = !(schema.type === 'string'); + } + } + } + + if (schema.title) spec.title = schema.title; + if (schema.description) spec.description = schema.description; + + // 计算ui配置 + return { + ...spec, + + // 用户配置最高优先级 + ...getUserUiOptions({ + schema, + uiSchema, + curNodePath, + rootFormData + }) + }; +} + +// 获取当前节点的ui 配置 (options + widget) +// 处理成 Widget 组件需要的格式 +export function getWidgetConfig({ + schema = {}, + uiSchema = {}, + curNodePath, + rootFormData, +}, fallback = null) { + const uiOptions = getUiOptions({ + schema, + uiSchema, + curNodePath, + rootFormData, + }); + + // 没有配置 Widget ,各个Field组件根据类型判断 + if (!uiOptions.widget && fallback) { + Object.assign(uiOptions, fallback({ + schema, + uiSchema + })); + } + + const { + widget, + title: label, + labelWidth, + description, + attrs: widgetAttrs, + class: widgetClass, + style: widgetStyle, + widgetListeners, + fieldAttrs, + fieldStyle, + fieldClass, + emptyValue, + width, + getWidget, + renderScopedSlots, + renderChildren, + onChange, + ...uiProps + } = uiOptions; + + return { + widget, + label, + labelWidth, + description, + widgetAttrs, + widgetClass, + widgetStyle, + fieldAttrs, + width, + fieldStyle, + fieldClass, + emptyValue, + getWidget, + renderScopedSlots, + renderChildren, + onChange, + widgetListeners, + uiProps + }; +} + +// 解析用户配置的 errorSchema options +export function getUserErrOptions({ + schema = {}, + uiSchema = {}, + errorSchema = {} +}) { + return Object.assign({}, ...[schema, uiSchema, errorSchema].map(itemSchema => Object.keys(itemSchema) + .reduce((options, key) => { + const value = itemSchema[key]; + // options 内外合并 + if (key === 'err:options' && isObject(value)) { + return { ...options, ...value }; + } + + if (key.indexOf('err:') === 0) { + return { ...options, [key.substring(4)]: value }; + } + + return options; + }, {}))); +} + +// ui:order object-> properties 排序 +export function orderProperties(properties, order) { + if (!Array.isArray(order)) { + return properties; + } + + const arrayToHash = arr => arr.reduce((prev, curr) => { + prev[curr] = true; + return prev; + }, {}); + const errorPropList = arr => (arr.length > 1 + ? `properties '${arr.join("', '")}'` + : `property '${arr[0]}'`); + const propertyHash = arrayToHash(properties); + const orderFiltered = order.filter( + prop => prop === '*' || propertyHash[prop] + ); + const orderHash = arrayToHash(orderFiltered); + + const rest = properties.filter(prop => !orderHash[prop]); + const restIndex = orderFiltered.indexOf('*'); + if (restIndex === -1) { + if (rest.length) { + throw new Error( + `uiSchema order list does not contain ${errorPropList(rest)}` + ); + } + return orderFiltered; + } + if (restIndex !== orderFiltered.lastIndexOf('*')) { + throw new Error('uiSchema order list contains more than one wildcard item'); + } + + const complete = [...orderFiltered]; + complete.splice(restIndex, 1, ...rest); + return complete; +} + +/** + * 单个匹配 + * 常量,或者只有一个枚举 + */ +export function isConstant(schema) { + return ( + (Array.isArray(schema.enum) && schema.enum.length === 1) + || schema.hasOwnProperty('const') + ); +} + +export function toConstant(schema) { + if (Array.isArray(schema.enum) && schema.enum.length === 1) { + return schema.enum[0]; + } if (schema.hasOwnProperty('const')) { + return schema.const; + } + throw new Error('schema cannot be inferred as a constant'); +} + +/** + * 是否为选择列表 + * 枚举 或者 oneOf anyOf 每项都只有一个固定常量值 + * @param _schema + * @param rootSchema + * @returns {boolean|*} + */ +export function isSelect(_schema, rootSchema = {}) { + const schema = retrieveSchema(_schema, rootSchema); + const altSchemas = schema.oneOf || schema.anyOf; + if (Array.isArray(schema.enum)) { + return true; + } if (Array.isArray(altSchemas)) { + return altSchemas.every(altSchemasItem => isConstant(altSchemasItem)); + } + return false; +} + +// items 都为一个对象 +export function isFixedItems(schema) { + return ( + Array.isArray(schema.items) + && schema.items.length > 0 + && schema.items.every(item => isObject(item)) + ); +} + +// 是否为多选 +export function isMultiSelect(schema, rootSchema = {}) { + if (!schema.uniqueItems || !schema.items) { + return false; + } + return isSelect(schema.items, rootSchema); +} + +// array additionalItems +// https://json-schema.org/understanding-json-schema/reference/array.html#tuple-validation +export function allowAdditionalItems(schema) { + if (schema.additionalItems === true) { + console.warn('additionalItems=true is currently not supported'); + } + return isObject(schema.additionalItems); +} + +// 下拉选项 +export function optionsList(schema, uiSchema, curNodePath, rootFormData) { + // enum + if (schema.enum) { + const uiOptions = getUserUiOptions({ + schema, + uiSchema, + curNodePath, + rootFormData + }); + + // ui配置 enumNames 优先 + const enumNames = uiOptions.enumNames || schema.enumNames; + return schema.enum.map((value, i) => { + const label = (enumNames && enumNames[i]) || String(value); + return { label, value }; + }); + } + + // oneOf | anyOf + const altSchemas = schema.oneOf || schema.anyOf; + const altUiSchemas = uiSchema.oneOf || uiSchema.anyOf; + return altSchemas.map((curSchema, i) => { + const uiOptions = (altUiSchemas && altUiSchemas[i]) ? getUserUiOptions({ + schema: curSchema, + uiSchema: altUiSchemas[i], + curNodePath, + rootFormData + }) : {}; + const value = toConstant(curSchema); + const label = uiOptions.title || curSchema.title || String(value); + return { label, value }; + }); + +} + +export function fallbackLabel(oriLabel, isFallback, curNodePath) { + if (oriLabel) return oriLabel; + if (isFallback) { + const backLabel = curNodePath.split('.').pop(); + + // 过滤纯数字字符串 + if (backLabel && (backLabel !== `${Number(backLabel)}`)) return backLabel; + } + + return ''; +} diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/utils/i18n/index.js b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/i18n/index.js new file mode 100644 index 000000000..1c3135f9a --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/i18n/index.js @@ -0,0 +1,19 @@ +/** + * Created by Liu.Jun on 2020/4/30 11:22. + */ + +// 使用 ajv-i18n 这里只为初始化默认可以设置语言 +// 也可以自己使用官方的语言包 +// https://github.com/epoberezkin/ajv-i18n/tree/master/localize + +import localizeZh from './localize/zh'; + +export default { + $$currentLocalizeFn: localizeZh, + getCurrentLocalize() { + return this.$$currentLocalizeFn; + }, + useLocal(fn) { + this.$$currentLocalizeFn = fn; + } +}; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/utils/i18n/localize/zh.js b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/i18n/localize/zh.js new file mode 100644 index 000000000..21b4283be --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/i18n/localize/zh.js @@ -0,0 +1,152 @@ +// https://github.com/epoberezkin/ajv-i18n +export default function localizeZh(errors) { + if (!(errors && errors.length)) return; + for (let i = 0; i < errors.length; i += 1) { + const e = errors[i]; + let out; + let n; + let cond; + switch (e.keyword) { + case '$ref': + out = `无法找到引用${e.params.ref}`; + break; + case 'additionalItems': + out = ''; + n = e.params.limit; + out += `不允许超过${n}个元素`; + break; + case 'additionalProperties': + out = '不允许有额外的属性'; + break; + case 'anyOf': + out = '数据应为 anyOf 所指定的其中一个'; + break; + case 'const': + out = '应当等于常量'; + break; + case 'contains': + out = '应当包含一个有效项'; + break; + case 'custom': + out = `应当通过 "${e.keyword} 关键词校验"`; + break; + case 'dependencies': + out = ''; + n = e.params.depsCount; + out += `应当拥有属性${e.params.property}的依赖属性${e.params.deps}`; + break; + case 'enum': + out = '应当是预设定的枚举值之一'; + break; + case 'exclusiveMaximum': + out = ''; + cond = `${e.params.comparison} ${e.params.limit}`; + out += `应当为 ${cond}`; + break; + case 'exclusiveMinimum': + out = ''; + cond = `${e.params.comparison} ${e.params.limit}`; + out += `应当为 ${cond}`; + break; + case 'false schema': + out = '布尔模式出错'; + break; + case 'format': + out = `应当匹配格式 "${e.params.format}"`; + break; + case 'formatExclusiveMaximum': + out = 'formatExclusiveMaximum 应当是布尔值'; + break; + case 'formatExclusiveMinimum': + out = 'formatExclusiveMinimum 应当是布尔值'; + break; + case 'formatMaximum': + out = ''; + cond = `${e.params.comparison} ${e.params.limit}`; + out += `应当是 ${cond}`; + break; + case 'formatMinimum': + out = ''; + cond = `${e.params.comparison} ${e.params.limit}`; + out += `应当是 ${cond}`; + break; + case 'if': + out = `应当匹配模式 "${e.params.failingKeyword}" `; + break; + case 'maximum': + out = ''; + cond = `${e.params.comparison} ${e.params.limit}`; + out += `应当为 ${cond}`; + break; + case 'maxItems': + out = ''; + n = e.params.limit; + out += `不应多于 ${n} 个项`; + break; + case 'maxLength': + out = ''; + n = e.params.limit; + out += `不应多于 ${n} 个字符`; + break; + case 'maxProperties': + out = ''; + n = e.params.limit; + out += `不应有多于 ${n} 个属性`; + break; + case 'minimum': + out = ''; + cond = `${e.params.comparison} ${e.params.limit}`; + out += `应当为 ${cond}`; + break; + case 'minItems': + out = ''; + n = e.params.limit; + out += `不应少于 ${n} 个项`; + break; + case 'minLength': + out = ''; + n = e.params.limit; + out += `不应少于 ${n} 个字符`; + break; + case 'minProperties': + out = ''; + n = e.params.limit; + out += `不应有少于 ${n} 个属性`; + break; + case 'multipleOf': + out = `应当是 ${e.params.multipleOf} 的整数倍`; + break; + case 'not': + out = '不应当匹配 "not" schema'; + break; + case 'oneOf': + out = '只能匹配一个 "oneOf" 中的 schema'; + break; + case 'pattern': + out = `应当匹配模式 "${e.params.pattern}"`; + break; + case 'patternRequired': + out = `应当有属性匹配模式 ${e.params.missingPattern}`; + break; + case 'propertyNames': + out = `属性名 '${e.params.propertyName}' 无效`; + break; + case 'required': + out = `应当有必需属性 ${e.params.missingProperty}`; + break; + case 'switch': + out = `由于 ${e.params.caseIndex} 失败,未通过 "switch" 校验, `; + break; + case 'type': + out = `应当是 ${e.params.type} 类型`; + break; + case 'uniqueItems': + out = `不应当含有重复项 (第 ${e.params.j} 项与第 ${e.params.i} 项是重复的)`; + break; + default: + // eslint-disable-next-line no-continue + continue; + } + e.message = out; + } +} diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/utils/icons/IconCaretDown.vue b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/icons/IconCaretDown.vue new file mode 100644 index 000000000..78e1e98ef --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/icons/IconCaretDown.vue @@ -0,0 +1,9 @@ + diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/utils/icons/IconCaretUp.vue b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/icons/IconCaretUp.vue new file mode 100644 index 000000000..1b50db0f6 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/icons/IconCaretUp.vue @@ -0,0 +1,11 @@ + diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/utils/icons/IconClose.vue b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/icons/IconClose.vue new file mode 100644 index 000000000..b52968860 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/icons/IconClose.vue @@ -0,0 +1,13 @@ + diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/utils/icons/IconInfo.vue b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/icons/IconInfo.vue new file mode 100644 index 000000000..78a40111f --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/icons/IconInfo.vue @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/utils/icons/IconPlus.vue b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/icons/IconPlus.vue new file mode 100644 index 000000000..b0a7ca1ed --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/icons/IconPlus.vue @@ -0,0 +1,22 @@ + diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/utils/icons/IconQuestion.vue b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/icons/IconQuestion.vue new file mode 100644 index 000000000..db70cef39 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/icons/IconQuestion.vue @@ -0,0 +1,16 @@ + diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/utils/icons/index.js b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/icons/index.js new file mode 100644 index 000000000..4a10e0bd7 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/icons/index.js @@ -0,0 +1,19 @@ +/** + * Created by Liu.Jun on 2021/3/6 2:58 下午. + */ + +import IconCaretDown from './IconCaretDown.vue'; +import IconCaretUp from './IconCaretUp.vue'; +import IconClose from './IconClose.vue'; +import IconPlus from './IconPlus.vue'; +import IconQuestion from './IconQuestion.vue'; +import IconInfo from "./IconInfo.vue"; + +export { + IconCaretDown, + IconCaretUp, + IconClose, + IconPlus, + IconQuestion, + IconInfo +}; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/utils/package.json b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/package.json new file mode 100644 index 000000000..ff3c0faca --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/package.json @@ -0,0 +1,29 @@ +{ + "name": "@lljj/vjsf-utils", + "version": "1.12.2", + "description": "vue json schema form 使用的基础utils工具类", + "private": false, + "publishConfig": { + "access": "public" + }, + "keywords": [ + "@lljj/vjsf-utils", + "vue", + "vuejs", + "form", + "jsonSchema" + ], + "dependencies": { + "ajv": "^6.10.2" + }, + "repository": "https://github.com/lljj-x/vue-json-schema-form", + "homepage": "https://github.com/lljj-x/vue-json-schema-form", + "license": "Apache-2.0", + "author": "Liu.Jun", + "browserslist": [ + "> 1%", + "last 2 versions", + "not ie <= 8" + ], + "gitHead": "92795075169c879e1c1fabfe26f1d3c10b861060" +} diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/utils/schema/findSchemaDefinition.js b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/schema/findSchemaDefinition.js new file mode 100644 index 000000000..402ec0a2c --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/schema/findSchemaDefinition.js @@ -0,0 +1,29 @@ +// $ref 引用 +function getPathVal(obj, pathStr) { + const pathArr = pathStr.split('/'); + for (let i = 0; i < pathArr.length; i += 1) { + if (obj === undefined) return undefined; + obj = pathArr[i] === '' ? obj : obj[pathArr[i]]; + } + return obj; +} + +// 找到ref引用的schema +export default function findSchemaDefinition($ref, rootSchema = {}) { + const origRef = $ref; + if ($ref.startsWith('#')) { + // Decode URI fragment representation. + $ref = decodeURIComponent($ref.substring(1)); + } else { + throw new Error(`Could not find a definition for ${origRef}.`); + } + const current = getPathVal(rootSchema, $ref); + + if (current === undefined) { + throw new Error(`Could not find a definition for ${origRef}.`); + } + if (current.hasOwnProperty('$ref')) { + return findSchemaDefinition(current.$ref, rootSchema); + } + return current; +} diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/utils/schema/getDefaultFormState.js b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/schema/getDefaultFormState.js new file mode 100644 index 000000000..a00fc18ff --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/schema/getDefaultFormState.js @@ -0,0 +1,256 @@ +/** + * 根据schema计算出formData的初始值 + * 源码来自:react-jsonschema-form 做了细节调整,重写了allOf实现逻辑 + * https://github.com/rjsf-team/react-jsonschema-form/blob/master/packages/core/src/utils.js#L283 + */ + +import { getSchemaType, isObject, mergeObjects } from '../utils'; +import findSchemaDefinition from './findSchemaDefinition'; +import { getMatchingOption } from './validate'; +import { fillObj } from '../arrayUtils'; +import { isFixedItems, isMultiSelect } from '../formUtils'; +import retrieveSchema, { /* resolveDependencies, */ resolveAllOf } from './retriev'; + +/** + * When merging defaults and form data, we want to merge in this specific way: + * - objects are deeply merged + * - arrays are merged in such a way that: + * - when the array is set in form data, only array entries set in form data + * are deeply merged; additional entries from the defaults are ignored + * - when the array is not set in form data, the default is copied over + * - scalars are overwritten/set by form data + */ +function mergeDefaultsWithFormData(defaults, formData) { + if (Array.isArray(formData)) { + if (!Array.isArray(defaults)) { + defaults = []; + } + return formData.map((value, idx) => { + if (defaults[idx]) { + return mergeDefaultsWithFormData(defaults[idx], value); + } + return value; + }); + } if (isObject(formData)) { + const acc = Object.assign({}, defaults); // Prevent mutation of source object. + return Object.keys(formData).reduce((preAcc, key) => { + preAcc[key] = mergeDefaultsWithFormData( + defaults ? defaults[key] : {}, + formData[key] + ); + return preAcc; + }, acc); + } + return formData; +} + +function computeDefaults( + _schema, + parentDefaults, + rootSchema, + rawFormData = {}, + includeUndefinedValues = false, + haveAllFields = false +) { + let schema = isObject(_schema) ? _schema : {}; + const formData = isObject(rawFormData) ? rawFormData : {}; + + // allOf 处理合并数据 + if ('allOf' in schema) { + schema = resolveAllOf(schema, rootSchema, formData); + } + + // Compute the defaults recursively: give highest priority to deepest nodes. + let defaults = parentDefaults; + if (isObject(defaults) && isObject(schema.default)) { + // For object defaults, only override parent defaults that are defined in + // schema.default. + defaults = mergeObjects(defaults, schema.default); + } else if ('default' in schema) { + // Use schema defaults for this node. + defaults = schema.default; + } else if ('$ref' in schema) { + // Use referenced schema defaults for this node. + const refSchema = findSchemaDefinition(schema.$ref, rootSchema); + return computeDefaults( + refSchema, + defaults, + rootSchema, + formData, + includeUndefinedValues, + haveAllFields + ); + } else if /* ('dependencies' in schema) { + const resolvedSchema = resolveDependencies(schema, rootSchema, formData); + return computeDefaults( + resolvedSchema, + defaults, + rootSchema, + formData, + includeUndefinedValues, + haveAllFields + ); + } else if */ (isFixedItems(schema)) { + defaults = schema.items.map((itemSchema, idx) => computeDefaults( + itemSchema, + Array.isArray(parentDefaults) ? parentDefaults[idx] : undefined, + rootSchema, + formData, + includeUndefinedValues, + haveAllFields + )); + } else if ('oneOf' in schema) { + const matchSchema = retrieveSchema( + schema.oneOf[getMatchingOption(formData, schema.oneOf, rootSchema, haveAllFields)], + rootSchema, + formData + ); + + schema = mergeObjects(schema, matchSchema); + delete schema.oneOf; + + // if (schema.properties && matchSchema.properties) { + // // 对象 oneOf 需要合并原属性和 oneOf 属性 + // const mergeSchema = mergeObjects(schema, matchSchema); + // delete mergeSchema.oneOf; + // schema = mergeSchema; + // } else { + // schema = matchSchema; + // } + } else if ('anyOf' in schema) { + const matchSchema = retrieveSchema( + schema.anyOf[getMatchingOption(formData, schema.anyOf, rootSchema, haveAllFields)], + rootSchema, + formData + ); + + schema = mergeObjects(schema, matchSchema); + delete schema.anyOf; + + // if (schema.properties && matchSchema.properties) { + // // 对象 anyOf 需要合并原属性和 anyOf 属性 + // const mergeSchema = mergeObjects(schema, matchSchema); + // delete mergeSchema.anyOf; + // schema = mergeSchema; + // } else { + // schema = matchSchema; + // } + } + // Not defaults defined for this node, fallback to generic typed ones. + if (typeof defaults === 'undefined') { + defaults = schema.default; + } + // eslint-disable-next-line default-case + switch (getSchemaType(schema)) { + case 'null': + return null; + + // We need to recur for object schema inner default values. + case 'object': + return Object.keys(schema.properties || {}).reduce((acc, key) => { + // Compute the defaults for this node, with the parent defaults we might + // have from a previous run: defaults[key]. + const computedDefault = computeDefaults( + schema.properties[key], + (defaults || {})[key], + rootSchema, + (formData || {})[key], + includeUndefinedValues, + haveAllFields + ); + if (includeUndefinedValues || computedDefault !== undefined) { + acc[key] = computedDefault; + } + return acc; + }, {}); + + case 'array': + // Inject defaults into existing array defaults + if (Array.isArray(defaults)) { + defaults = defaults.map((item, idx) => computeDefaults( + schema.items[idx] || schema.additionalItems || {}, + item, + rootSchema, + {}, + includeUndefinedValues, + haveAllFields + )); + } + + // Deeply inject defaults into already existing form data + if (Array.isArray(rawFormData)) { + defaults = rawFormData.map((item, idx) => computeDefaults( + schema.items, + (defaults || {})[idx], + rootSchema, + item, + {}, + includeUndefinedValues, + haveAllFields + )); + } + if (schema.minItems) { + if (!isMultiSelect(schema, rootSchema)) { + const defaultsLength = defaults ? defaults.length : 0; + if (schema.minItems > defaultsLength) { + const defaultEntries = defaults || []; + // populate the array with the defaults + const fillerSchema = Array.isArray(schema.items) + ? schema.additionalItems + : schema.items; + + const fillerEntries = fillObj( + new Array(schema.minItems - defaultsLength), computeDefaults( + fillerSchema, fillerSchema.defaults, rootSchema, {}, includeUndefinedValues, haveAllFields + ) + ); + return defaultEntries.concat(fillerEntries); + } + } else { + return defaults || []; + } + } + + // undefined 默认一个空数组 + defaults = defaults === undefined ? [] : defaults; + } + return defaults; +} + + +// 获取默认form data +export default function getDefaultFormState( + _schema, + formData, + rootSchema = {}, + includeUndefinedValues = true, + haveAllFields = false +) { + if (!isObject(_schema)) { + throw new Error(`Invalid schema: ${_schema}`); + } + const schema = retrieveSchema(_schema, rootSchema, formData); + + const defaults = computeDefaults( + schema, + _schema.default, + rootSchema, + formData, + includeUndefinedValues, + haveAllFields + ); + + if (typeof formData === 'undefined') { + // No form data? Use schema defaults. + return defaults; + } + + // 传入formData时,合并传入数据 + if (isObject(formData) || Array.isArray(formData)) { + return mergeDefaultsWithFormData(defaults, formData); + } + if (formData === 0 || formData === false || formData === '') { + return formData; + } + return formData || defaults; +} diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/utils/schema/retriev.js b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/schema/retriev.js new file mode 100644 index 000000000..d12bbc2fa --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/schema/retriev.js @@ -0,0 +1,424 @@ +/** + * @param schema + * @param rootSchema + * @param formData + * @returns {{properties: *}|{}|{properties: *}|{}|{properties: *}|{additionalProperties}|*|{}|{allOf}} + * 源码来自:react-jsonschema-form + * 做了细节和模块调整 + * 重写了allOf实现逻辑(解决使用allOf必须根节点同时存在,以及对json-schema-merge-allof依赖包过大) + * 移除对lodash 、json-schema-merge-allof、jsonpointer 等依赖重新实现 + * https://github.com/rjsf-team/react-jsonschema-form/blob/master/packages/core/src/utils.js#L621 + */ + +import findSchemaDefinition from './findSchemaDefinition'; +import { intersection } from '../arrayUtils'; + +import { + /* guessType, mergeSchemas, */ isObject, scm +} from '../utils'; + +// import { getMatchingOption, isValid } from './validate'; + +// 自动添加分割线 + +// export const ADDITIONAL_PROPERTY_FLAG = '__additional_property'; + +// resolve Schema - dependencies +// https://json-schema.org/understanding-json-schema/reference/object.html#dependencies +/* +export function resolveDependencies(schema, rootSchema, formData) { + // 从源模式中删除依赖项。 + const { dependencies = {} } = schema; + let { ...resolvedSchema } = schema; + if ('oneOf' in resolvedSchema) { + resolvedSchema = resolvedSchema.oneOf[ + getMatchingOption(formData, resolvedSchema.oneOf, rootSchema) + ]; + } else if ('anyOf' in resolvedSchema) { + resolvedSchema = resolvedSchema.anyOf[ + getMatchingOption(formData, resolvedSchema.anyOf, rootSchema) + ]; + } + return processDependencies( + dependencies, + resolvedSchema, + rootSchema, + formData + ); +} +*/ + +// 处理依赖关系 dependencies +// https://json-schema.org/understanding-json-schema/reference/object.html#dependencies +/* + +function processDependencies( + dependencies, + resolvedSchema, + rootSchema, + formData +) { + // Process dependencies updating the local schema properties as appropriate. + for (const dependencyKey in dependencies) { + // Skip this dependency if its trigger property is not present. + if (formData[dependencyKey] === undefined) { + // eslint-disable-next-line no-continue + continue; + } + // Skip this dependency if it is not included in the schema (such as when dependencyKey is itself a hidden dependency.) + if ( + resolvedSchema.properties + && !(dependencyKey in resolvedSchema.properties) + ) { + // eslint-disable-next-line no-continue + continue; + } + const { + [dependencyKey]: dependencyValue, + ...remainingDependencies + } = dependencies; + if (Array.isArray(dependencyValue)) { + resolvedSchema = withDependentProperties(resolvedSchema, dependencyValue); + } else if (isObject(dependencyValue)) { + resolvedSchema = withDependentSchema( + resolvedSchema, + rootSchema, + formData, + dependencyKey, + dependencyValue + ); + } + return processDependencies( + remainingDependencies, + resolvedSchema, + rootSchema, + formData + ); + } + return resolvedSchema; +} +*/ + +// 属性依赖 +// https://json-schema.org/understanding-json-schema/reference/object.html#property-dependencies + +/* +function withDependentProperties(schema, additionallyRequired) { + if (!additionallyRequired) { + return schema; + } + const required = Array.isArray(schema.required) + ? Array.from(new Set([...schema.required, ...additionallyRequired])) + : additionallyRequired; + return { ...schema, required }; +} +*/ + +// schema 依赖 +// https://json-schema.org/understanding-json-schema/reference/object.html#schema-dependencies +/* +function withDependentSchema( + schema, + rootSchema, + formData, + dependencyKey, + dependencyValue +) { + const { oneOf, ...dependentSchema } = retrieveSchema( + dependencyValue, + rootSchema, + formData + ); + schema = mergeSchemas(schema, dependentSchema); + // Since it does not contain oneOf, we return the original schema. + if (oneOf === undefined) { + return schema; + } if (!Array.isArray(oneOf)) { + throw new Error(`invalid: it is some ${typeof oneOf} instead of an array`); + } + // Resolve $refs inside oneOf. + const resolvedOneOf = oneOf.map(subschema => (subschema.hasOwnProperty('$ref') + ? resolveReference(subschema, rootSchema, formData) + : subschema)); + return withExactlyOneSubschema( + schema, + rootSchema, + formData, + dependencyKey, + resolvedOneOf + ); +} + +function withExactlyOneSubschema( + schema, + rootSchema, + formData, + dependencyKey, + oneOf +) { + // eslint-disable-next-line array-callback-return,consistent-return + const validSubschemas = oneOf.filter((subschema) => { + if (!subschema.properties) { + return false; + } + const { [dependencyKey]: conditionPropertySchema } = subschema.properties; + if (conditionPropertySchema) { + const conditionSchema = { + type: 'object', + properties: { + [dependencyKey]: conditionPropertySchema, + }, + }; + + return isValid(conditionSchema, formData); + } + }); + if (validSubschemas.length !== 1) { + console.warn( + "ignoring oneOf in dependencies because there isn't exactly one subschema that is valid" + ); + return schema; + } + const subschema = validSubschemas[0]; + const { + // eslint-disable-next-line no-unused-vars + [dependencyKey]: conditionPropertySchema, + ...dependentSubschema + } = subschema.properties; + const dependentSchema = { ...subschema, properties: dependentSubschema }; + return mergeSchemas( + schema, + retrieveSchema(dependentSchema, rootSchema, formData) + ); +} +*/ + +// resolve Schema - $ref +// https://json-schema.org/understanding-json-schema/structuring.html#using-id-with-ref +function resolveReference(schema, rootSchema, formData) { + // Retrieve the referenced schema definition. + const $refSchema = findSchemaDefinition(schema.$ref, rootSchema); + // Drop the $ref property of the source schema. + // eslint-disable-next-line no-unused-vars + const { $ref, ...localSchema } = schema; + // Update referenced schema definition with local schema properties. + return retrieveSchema( + { ...$refSchema, ...localSchema }, + rootSchema, + formData + ); +} + + +// 深度递归合并 合并allOf的每2项 +function mergeSchemaAllOf(...args) { + if (args.length < 2) return args[0]; + + let preVal = {}; + const copyArgs = [...args]; + while (copyArgs.length >= 2) { + const obj1 = isObject(copyArgs[0]) ? copyArgs[0] : {}; + const obj2 = isObject(copyArgs[1]) ? copyArgs[1] : {}; + + preVal = Object.assign({}, obj1); + Object.keys(obj2).reduce((acc, key) => { + const left = obj1[key]; + const right = obj2[key]; + + // 左右一边为object + if (isObject(left) || isObject(right)) { + + // 两边同时为object + if (isObject(left) && isObject(right)) { + acc[key] = mergeSchemaAllOf(left, right); + } else { + // 其中一边为 object + const [objTypeData, baseTypeData] = isObject(left) ? [left, right] : [right, left]; + + if (key === 'additionalProperties') { + // 适配类型: 一边配置了对象一边没配置或者true false + // { + // additionalProperties: { + // type: 'string', + // }, + // additionalProperties: false + // } + acc[key] = baseTypeData === true ? objTypeData : false; // default false + } else { + acc[key] = objTypeData; + } + } + // 一边为array + } else if (Array.isArray(left) || Array.isArray(right)) { + + // 同为数组取交集 + if (Array.isArray(left) && Array.isArray(right)) { + + // 数组里面嵌套对象不支持 因为我不知道该怎么合并 + if (isObject(left[0]) || isObject(right[0])) { + throw new Error('暂不支持如上数组对象元素合并'); + } + + // 交集 + const intersectionArray = intersection([].concat(left), [].concat(right)); + + // 没有交集 + if (intersectionArray.length <= 0) { + throw new Error('无法合并如上数据'); + } + + if (intersectionArray.length === 0 && key === 'type') { + // 自己取出值 + acc[key] = intersectionArray[0]; + } else { + acc[key] = intersectionArray; + } + } else { + // 其中一边为 Array + // 查找包含关系 + const [arrayTypeData, baseTypeData] = Array.isArray(left) ? [left, right] : [right, left]; + // 空值直接合并另一边 + if (baseTypeData === undefined) { + acc[key] = arrayTypeData; + } else { + if (!arrayTypeData.includes(baseTypeData)) { + throw new Error('无法合并如下数据'); + } + acc[key] = baseTypeData; + } + } + } else if (left !== undefined && right !== undefined) { + // 两边都不是 undefined - 基础数据类型 string number boolean... + if (key === 'maxLength' || key === 'maximum' || key === 'maxItems' || key === 'exclusiveMaximum' || key === 'maxProperties') { + acc[key] = Math.min(left, right); + } else if (key === 'minLength' || key === 'minimum' || key === 'minItems' || key === 'exclusiveMinimum' || key === 'minProperties') { + acc[key] = Math.max(left, right); + } else if (key === 'multipleOf') { + // 获取最小公倍数 + acc[key] = scm(left, right); + } else { + // if (left !== right) { + // throw new Error('无法合并如下数据'); + // } + acc[key] = left; + } + } else { + // 一边为undefined + acc[key] = left === undefined ? right : left; + } + return acc; + }, preVal); + + // 先进先出 + copyArgs.splice(0, 2, preVal); + } + + return preVal; +} + +// resolve Schema - allOf +export function resolveAllOf(schema, rootSchema, formData) { + // allOf item中可能存在 $ref + const resolvedAllOfRefSchema = { + ...schema, + allOf: schema.allOf.map(allOfItem => retrieveSchema(allOfItem, rootSchema, formData)), + }; + + try { + const { allOf, ...originProperties } = resolvedAllOfRefSchema; + return mergeSchemaAllOf(originProperties, ...allOf); + } catch (e) { + console.error(`无法合并allOf,丢弃allOf配置继续渲染: \n${e}`); + // eslint-disable-next-line no-unused-vars + const { allOf: errAllOf, ...resolvedSchemaWithoutAllOf } = resolvedAllOfRefSchema; + return resolvedSchemaWithoutAllOf; + } +} + +// resolve Schema +function resolveSchema(schema, rootSchema = {}, formData = {}) { + // allOf 、$ref、dependencies 可能被同时配置 + + // allOf + if (schema.hasOwnProperty('allOf')) { + schema = resolveAllOf(schema, rootSchema, formData); + } + + // $ref + if (schema.hasOwnProperty('$ref')) { + schema = resolveReference(schema, rootSchema, formData); + } + + // dependencies + /* + if (schema.hasOwnProperty('dependencies')) { + const resolvedSchema = resolveDependencies(schema, rootSchema, formData); + schema = retrieveSchema(resolvedSchema, rootSchema, formData); + } + */ + + // additionalProperties + /* + const hasAdditionalProperties = schema.hasOwnProperty('additionalProperties') && schema.additionalProperties !== false; + if (hasAdditionalProperties) { + return stubExistingAdditionalProperties( + schema, + rootSchema, + formData + ); + } + */ + + return schema; +} + +// 这个函数将为formData中的每个键创建新的“属性”项 +// 查找到附加属性统一到properties[key]格式 并且打上标准 +/* function stubExistingAdditionalProperties( + schema, + rootSchema = {}, + formData = {} +) { + // clone the schema so we don't ruin the consumer's original + schema = { + ...schema, + properties: { ...schema.properties }, + }; + + Object.keys(formData).forEach((key) => { + if (schema.properties.hasOwnProperty(key)) { + // No need to stub, our schema already has the property + return; + } + + let additionalProperties; + if (schema.additionalProperties.hasOwnProperty('$ref')) { + additionalProperties = retrieveSchema( + { $ref: schema.additionalProperties.$ref }, + rootSchema, + formData + ); + } else if (schema.additionalProperties.hasOwnProperty('type')) { + additionalProperties = { ...schema.additionalProperties }; + } else { + additionalProperties = { type: guessType(formData[key]) }; + } + + // The type of our new key should match the additionalProperties value; + // 把追加进去的属性设置为标准 schema格式,同时打上标志 + schema.properties[key] = additionalProperties; + // Set our additional property flag so we know it was dynamically added + schema.properties[key][ADDITIONAL_PROPERTY_FLAG] = true; + }); + + return schema; +} */ + +// 索引当前节点 +export default function retrieveSchema(schema, rootSchema = {}, formData = {}) { + if (!isObject(schema)) { + return {}; + } + + return resolveSchema(schema, rootSchema, formData); +} diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/utils/schema/validate.js b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/schema/validate.js new file mode 100644 index 000000000..79e1bfe8e --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/schema/validate.js @@ -0,0 +1,335 @@ +import Ajv from 'ajv'; +import i18n from '../i18n'; +import retrieveSchema from './retriev'; + +import { + isObject, deepEquals +} from '../utils'; +import { getUserErrOptions } from '../formUtils'; + +let ajv = createAjvInstance(); + +let formerCustomFormats = null; +let formerMetaSchema = null; + +// 创建实例 +function createAjvInstance() { + const ajvInstance = new Ajv({ + errorDataPath: 'property', + allErrors: true, + multipleOfPrecision: 8, + schemaId: 'auto', + unknownFormats: 'ignore', + }); + + // 添加base-64 format + ajvInstance.addFormat( + 'data-url', + /^data:([a-z]+\/[a-z0-9-+.]+)?;(?:name=(.*);)?base64,(.*)$/ + ); + + // 添加color format + ajvInstance.addFormat( + 'color', + // eslint-disable-next-line max-len + /^(#?([0-9A-Fa-f]{3}){1,2}\b|aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow|(rgb\(\s*\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b\s*,\s*\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b\s*,\s*\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b\s*\))|(rgb\(\s*(\d?\d%|100%)+\s*,\s*(\d?\d%|100%)+\s*,\s*(\d?\d%|100%)+\s*\)))$/ + ); + return ajvInstance; +} + +/** + * 将错误输出从ajv转换为jsonschema使用的格式 + * At some point, components should be updated to support ajv. + */ +function transformAjvErrors(errors = []) { + if (errors === null) { + return []; + } + + return errors.map((e) => { + const { + dataPath, keyword, message, params, schemaPath + } = e; + const property = `${dataPath}`; + + // put data in expected format + return { + name: keyword, + property, + message, + params, // specific to ajv + stack: `${property} ${message}`.trim(), + schemaPath, + }; + }); +} + +/** + * 通过 schema校验formData并返回错误信息 + * @param formData 校验的数据 + * @param schema + * @param transformErrors function - 转换错误, 如个性化的配置 + * @param additionalMetaSchemas 数组 添加 ajv metaSchema + * @param customFormats 添加 ajv 自定义 formats + * @returns {{errors: ([]|{stack: string, schemaPath: *, name: *, property: string, message: *, params: *}[])}} + */ +export function ajvValidateFormData({ + formData, + schema, + transformErrors, + additionalMetaSchemas = [], + customFormats = {} +} = {}) { + const hasNewMetaSchemas = !deepEquals(formerMetaSchema, additionalMetaSchemas); + const hasNewFormats = !deepEquals(formerCustomFormats, customFormats); + + // 变更了 Meta或者调整了format配置重置新的实例 + if (hasNewMetaSchemas || hasNewFormats) { + ajv = createAjvInstance(); + } + + // 添加更多要验证的模式 + if ( + additionalMetaSchemas + && hasNewMetaSchemas + && Array.isArray(additionalMetaSchemas) + ) { + ajv.addMetaSchema(additionalMetaSchemas); + formerMetaSchema = additionalMetaSchemas; + } + + // 注册自定义的 formats - 没有变更只会注册一次 - 否则重新创建实例 + if (customFormats && hasNewFormats && isObject(customFormats)) { + Object.keys(customFormats).forEach((formatName) => { + ajv.addFormat(formatName, customFormats[formatName]); + }); + + formerCustomFormats = customFormats; + } + + let validationError = null; + try { + ajv.validate(schema, formData); + } catch (err) { + validationError = err; + } + + // ajv 默认多语言处理 + i18n.getCurrentLocalize()(ajv.errors); + + let errors = transformAjvErrors(ajv.errors); + + // 清除错误 + ajv.errors = null; + + // 处理异常 + const noProperMetaSchema = validationError + && validationError.message + && typeof validationError.message === 'string' + && validationError.message.includes('no schema with key or ref '); + + if (noProperMetaSchema) { + errors = [ + ...errors, + { + stack: validationError.message, + }, + ]; + } + + // 转换错误, 如传入自定义的错误 + if (typeof transformErrors === 'function') { + errors = transformErrors(errors); + } + + return { + errors + }; +} + +// 校验formData 并转换错误信息 +export function validateFormDataAndTransformMsg({ + formData, + schema, + uiSchema, + transformErrors, + additionalMetaSchemas = [], + customFormats = {}, + errorSchema = {}, + required = false, + propPath = '', + isOnlyFirstError = true, // 只取第一条错误信息 +} = {}) { + // 是否过滤根节点错误 固定只能根 + const filterRootNodeError = true; + + // 校验required信息 isEmpty 校验 + // 如果数组类型针对配置了 format 的特殊处理 + const emptyArray = (schema.type === 'array' && Array.isArray(formData) && formData.length === 0); + const isEmpty = formData === undefined || emptyArray; + + if (required) { + if (isEmpty) { + const requireErrObj = { + keyword: 'required', + params: { + missingProperty: propPath + } + }; + + // 用户设置校验信息 + const errSchemaMsg = getUserErrOptions({ + schema, + uiSchema, + errorSchema + }).required; + if (errSchemaMsg) { + requireErrObj.message = errSchemaMsg; + } else { + // 处理多语言require提示信息 (ajv 修改原引用) + i18n.getCurrentLocalize()([requireErrObj]); + } + return [requireErrObj]; + } + } else if (isEmpty && !emptyArray) { + // 非required 为空 校验通过 + return []; + } + + // 校验ajv错误信息 + let ajvErrors = ajvValidateFormData({ + formData, + schema, + transformErrors, + additionalMetaSchemas, + customFormats, + }).errors; + + // 过滤顶级错误 + if (filterRootNodeError) { + ajvErrors = ajvErrors.filter( + item => (item.property === '' + && (!item.schemaPath.includes('#/anyOf/') && !item.schemaPath.includes('#/oneOf/'))) + || item.name === 'additionalProperties' + ); + } + + const userErrOptions = getUserErrOptions({ + schema, + uiSchema, + errorSchema + }); + + return (isOnlyFirstError && ajvErrors.length > 0 ? [ajvErrors[0]] : ajvErrors).reduce((preErrors, errorItem) => { + // 优先获取 errorSchema 配置 + errorItem.message = userErrOptions[errorItem.name] !== undefined ? userErrOptions[errorItem.name] : errorItem.message; + preErrors.push(errorItem); + return preErrors; + }, []); +} + +/** + * 根据模式验证数据,如果数据有效则返回true,否则返回* false。如果模式无效,那么这个函数将返回* false。 + * @param schema + * @param data + * @returns {boolean|PromiseLike} + */ +export function isValid(schema, data) { + try { + return ajv.validate(schema, data); + } catch (e) { + return false; + } +} + +// ajv valida +export function ajvValid(schema, data) { + return ajv.validate(schema, data); +} + +// 如果查找不到 +// return -1 +export function getMatchingIndex(formData, options, rootSchema, haveAllFields = false) { + // eslint-disable-next-line no-plusplus + for (let i = 0; i < options.length; i++) { + const option = retrieveSchema(options[i], rootSchema, formData); + + // If the schema describes an object then we need to add slightly more + // strict matching to the schema, because unless the schema uses the + // "requires" keyword, an object will match the schema as long as it + // doesn't have matching keys with a conflicting type. To do this we use an + // "anyOf" with an array of requires. This augmentation expresses that the + // schema should match if any of the keys in the schema are present on the + // object and pass validation. + if (option.properties) { + // Create an "anyOf" schema that requires at least one of the keys in the + // "properties" object + const requiresAnyOf = { + // 如果后代节点存在 $ref 需要正常引用 + ...(rootSchema.definitions ? { + definitions: rootSchema.definitions + } : {}), + anyOf: Object.keys(option.properties).map(key => ({ + required: [key], + })), + }; + + let augmentedSchema; + + // If the "anyOf" keyword already exists, wrap the augmentation in an "allOf" + if (option.anyOf) { + // Create a shallow clone of the option + const { ...shallowClone } = option; + + if (!shallowClone.allOf) { + shallowClone.allOf = []; + } else { + // If "allOf" already exists, shallow clone the array + shallowClone.allOf = shallowClone.allOf.slice(); + } + + shallowClone.allOf.push(requiresAnyOf); + + augmentedSchema = shallowClone; + } else { + augmentedSchema = Object.assign({}, option, requiresAnyOf); + } + + // Remove the "required" field as it's likely that not all fields have + // been filled in yet, which will mean that the schema is not valid + + // 如果编辑回填数据的场景 可直接使用 required 判断 + if (!haveAllFields) delete augmentedSchema.required; + + + if (isValid(augmentedSchema, formData)) { + return i; + } + } else if (isValid(options[i], formData)) { + return i; + } + } + + // 尝试查找const 配置 + if (options[0] && options[0].properties) { + const constProperty = Object.keys(options[0].properties).find(k => options[0].properties[k].const); + if (constProperty) { + // eslint-disable-next-line no-plusplus + for (let i = 0; i < options.length; i++) { + if ( + options[i].properties + && options[i].properties[constProperty] + && options[i].properties[constProperty].const === formData[constProperty]) { + return i; + } + } + } + } + return -1; +} + +// oneOf anyOf 通过formData的值来找到当前匹配项索引 +export function getMatchingOption(formData, options, rootSchema, haveAllFields = false) { + const index = getMatchingIndex(formData, options, rootSchema, haveAllFields); + return index === -1 ? 0 : index; +} diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/utils/style/baseForm.scss b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/style/baseForm.scss new file mode 100644 index 000000000..17f440688 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/style/baseForm.scss @@ -0,0 +1,322 @@ +.genFromComponent { + font-size: 14px; + line-height: 1; + word-wrap: break-word; + word-break: break-word; + padding: 0; + margin: 0; + a, + p, + li, + ul, + h1, + h2, + h3, + p { + font-size: 14px; + } + .genFormIcon { + width: 12px; + height: 12px; + vertical-align: top; + } + .genFormBtn { + display: inline-block; + line-height: 1; + white-space: nowrap; + cursor: pointer; + background: #fff; + border: 1px solid #dcdfe6; + color: #606266; + -webkit-appearance: none; + text-align: center; + box-sizing: border-box; + outline: none; + margin: 0; + transition: .1s; + font-weight: 500; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + padding: 12px 20px; + font-size: 14px; + border-radius: 4px; + &.is-plain{ + &:focus, &:hover { + background: #fff; + border-color: #409eff; + color: #409eff; + } + } + } + .hiddenWidget { + display: none; + } + .fieldGroupWrap+.fieldGroupWrap { + .fieldGroupWrap_title { + margin-top: 20px; + } + } + .fieldGroupWrap_title { + position: relative; + display: block; + width: 100%; + line-height: 26px; + margin-bottom: 8px; + font-size: 15px; + font-weight: bold; + border: 0; + } + .fieldGroupWrap_des { + font-size: 12px; + line-height: 20px; + margin-bottom: 10px; + color: rgb(153, 153, 153); + } + .genFromWidget_des { + padding: 0; + margin-top: 0; + margin-bottom: 2px; + font-size: 12px; + line-height: 20px; + color: #999; + text-align: left; + width: 100%; + flex-shrink: 0; + } + .formItemErrorBox { + margin: 0 auto; + color: #ff5757; + padding-top: 2px; + position: absolute; + top: 100%; + left: 0; + display: -webkit-box !important; + line-height: 16px; + text-overflow: ellipsis; + overflow: hidden; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; + white-space: normal; + font-size: 12px; + text-align: left; + } + .genFormIcon-qs { + fill: #606266; + vertical-align: middle; + display: inline-block; + width: 16px; + height: 16px; + margin-left: 2px; + margin-top: -2px; + cursor: pointer; + } + .genFormItemRequired { + &:before { + content: "*"; + color: #f56c6c; + margin-right: 4px; + } + } + + /* oneOf anyOf - appendCombining_box*/ + .appendCombining_box { + margin-bottom: 22px; + .appendCombining_box { + margin-bottom: 10px; + } + padding: 10px; + background: rgba(242,242,242,0.8); + box-shadow: 0 3px 1px -2px rgba(0,0,0,0.2), 0 0 3px 1px rgba(0,0,0,0.1); + } + + /* validateWidget 单独的校验不属于输入框的*/ + .validateWidget { + margin-bottom: 0 !important; + width: 100% !important; + flex-basis: 100% !important; + padding: 0 !important; + .formItemErrorBox { + padding: 5px 0; + position: relative; + } + } + + /* type array */ + .arrayField:not(.genFormItem){ + margin-bottom: 22px; + .arrayField { + margin-bottom: 10px; + } + } + .arrayOrderList { + background: rgba(242,242,242,0.8); + box-shadow: 0 3px 1px -2px rgba(0,0,0,0.2), 0 0 3px 1px rgba(0,0,0,0.1); + } + .arrayOrderList_item { + position: relative; + padding: 25px 10px 12px; + border-radius: 2px; + margin-bottom: 6px; + display: flex; + align-items: center; + } + .arrayOrderList_bottomAddBtn { + text-align: right; + padding: 15px 10px; + margin-bottom: 10px; + } + .bottomAddBtn { + width: 40%; + min-width: 10px; + max-width: 180px; + /*box-shadow: 0 3px 1px -2px rgba(0,0,0,0.2), 0 2px 2px 1px rgba(0,0,0,0.1);*/ + } + .arrayListItem_content { + padding-top: 15px; + flex: 1; + margin: 0 auto; + box-shadow: 0 -1px 0 0 rgba(0,0,0,0.05); + } + + .arrayListItem_index, .arrayListItem_operateTool{ + position: absolute; + height: 25px; + } + .arrayListItem_index { + top: 6px; + line-height: 18px; + height: 18px; + padding: 0 6px; + background-color: rgba(0,0,0,.28); + color: #fff; + font-size: 12px; + border-radius: 2px; + } + .arrayListItem_operateTool { + width: 75px; + right: 9px; + top: -1px; + text-align: right; + font-size: 0; + } + .arrayListItem_btn { + vertical-align: top; + display: inline-block; + padding: 6px; + margin: 0; + font-size: 0; + -webkit-appearance: none; + appearance: none; + outline: none; + border: none; + cursor: pointer; + text-align: center; + background: transparent; + color: #666; + &:hover { + opacity: 0.6; + } + &[disabled] { + color: #999999; + opacity: 0.3 !important; + cursor: not-allowed; + } + } + .arrayListItem_orderBtn-top { + background-color: #f0f9eb; + } + .arrayListItem_orderBtn-bottom { + background-color: #f0f9eb; + } + .arrayListItem_btn-delete { + background-color: #fef0f0; + } + + .formFooter_item { + text-align: right; + border-top: 1px solid rgba(0, 0, 0, 0.08); + padding-top: 10px; + } + + &.formInlineFooter { + &>.fieldGroupWrap{ + display: inline-block; + margin-right: 10px; + } + } + + /*.arrayListItem_content .genFormItem { + &:last-child { + margin-bottom: 0; + } + }*/ + &.formInline { + /*.genFormItem { + display: inline-block; + margin-right: 10px; + vertical-align: top; + }*/ + .validateWidget { + margin-right: 0; + } + .formFooter_item { + border-top: none; + padding-top: 0; + } + } +} + +/*popover 弹出可能appendtobody*/ +.genFromWidget_des_mini { + font-size: 14px; + line-height: 1.5715; +} + +/* 适配多列布局 */ +:root { + --width-column-gutter : 10px; +} + +.layoutColumn { + .layoutColumn_w100 { + width: 100% !important; + flex-basis: 100% !important;; + } + .fieldGroupWrap_box { + width: 100%; + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: flex-start; + justify-content: flex-start; + align-content: flex-start; + &>div { + width: 100%; + flex-basis: 100%; + } + &>.genFormItem{ + flex-grow: 0; + flex-shrink: 0; + box-sizing: border-box; + padding-right: var(--width-column-gutter); + } + } + &.layoutColumn-1 { + .fieldGroupWrap_box>.genFormItem { + padding-right: 0; + } + } + &.layoutColumn-2 { + .fieldGroupWrap_box>.genFormItem { + width: 50%; + flex-basis: 50%; + } + } + &.layoutColumn-3 { + .fieldGroupWrap_box>.genFormItem{ + width: 33.333%; + flex-basis: 33.333%; + } + } +} diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/utils/utils.js b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/utils.js new file mode 100644 index 000000000..815845cc0 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/utils.js @@ -0,0 +1,346 @@ +/** + * Created by Liu.Jun on 2020/4/17 17:05. + */ + +// is object +export function isObject(object) { + return Object.prototype.toString.call(object) === '[object Object]'; +} + +// is arguments +function isArguments(object) { + return Object.prototype.toString.call(object) === '[object Arguments]'; +} + +// 定义的数据推导出schema 类型 +export const guessType = function guessType(value) { + if (Array.isArray(value)) { + return 'array'; + } if (typeof value === 'string') { + return 'string'; + } if (value == null) { + return 'null'; + } if (typeof value === 'boolean') { + return 'boolean'; + // eslint-disable-next-line no-restricted-globals + } if (!isNaN(value)) { + return 'number'; + } if (typeof value === 'object') { + return 'object'; + } + // Default to string if we can't figure it out + return 'string'; +}; + +export function union(arr1, arr2) { + return [...new Set([...arr1, ...arr2])]; +} + +// Recursively merge deeply nested schemas. +// The difference between mergeSchemas and mergeObjects +// is that mergeSchemas only concats arrays for +// values under the "required" keyword, and when it does, +// it doesn't include duplicate values. +export function mergeSchemas(obj1, obj2) { + const acc = Object.assign({}, obj1); // Prevent mutation of source object. + // eslint-disable-next-line no-shadow + return Object.keys(obj2).reduce((acc, key) => { + const left = obj1 ? obj1[key] : {}; + const right = obj2[key]; + if (obj1 && obj1.hasOwnProperty(key) && isObject(right)) { + acc[key] = mergeSchemas(left, right); + } else if ( + obj1 + && obj2 + && (getSchemaType(obj1) === 'object' || getSchemaType(obj2) === 'object') + && key === 'required' + && Array.isArray(left) + && Array.isArray(right) + ) { + // Don't include duplicate values when merging + // "required" fields. + acc[key] = union(left, right); + } else { + acc[key] = right; + } + return acc; + }, acc); +} + +// 合并对象数据 +export function mergeObjects(obj1, obj2, concatArrays = false) { + // Recursively merge deeply nested objects. + const preAcc = Object.assign({}, obj1); // Prevent mutation of source object. + if (!isObject(obj2)) return preAcc; + + return Object.keys(obj2).reduce((acc, key) => { + const left = obj1 ? obj1[key] : {}; + const right = obj2[key]; + if (obj1 && obj1.hasOwnProperty(key) && isObject(right)) { + acc[key] = mergeObjects(left, right, concatArrays); + } else if (concatArrays && Array.isArray(left) && Array.isArray(right)) { + acc[key] = left.concat(right); + } else { + acc[key] = right; + } + return acc; + }, preAcc); +} + +// 获取给定 schema 类型。 +export function getSchemaType(schema) { + const { type } = schema; + + // 通过const 申明的常量 做类型推断 + if (!type && schema.const) { + return guessType(schema.const); + } + + // 枚举默认字符串 + if (!type && schema.enum) { + return 'string'; + } + + // items 推断为 array 类型 + if (!type && (schema.items)) { + return 'array'; + } + + // anyOf oneOf 不申明 type 字段 + if (!type && (schema.properties || schema.additionalProperties)) { + return 'object'; + } + + if (type instanceof Array && type.length === 2 && type.includes('null')) { + return type.find(curType => curType !== 'null'); + } + + return type; +} + +// 深度相等对比 +export function deepEquals(a, b, ca = [], cb = []) { + // Partially extracted from node-deeper and adapted to exclude comparison + // checks for functions. + // https://github.com/othiym23/node-deeper + if (a === b) { + return true; + } if (typeof a === 'function' || typeof b === 'function') { + // Assume all functions are equivalent + // see https://github.com/mozilla-services/react-jsonschema-form/issues/255 + return true; + } if (typeof a !== 'object' || typeof b !== 'object') { + return false; + } if (a === null || b === null) { + return false; + } if (a instanceof Date && b instanceof Date) { + return a.getTime() === b.getTime(); + } if (a instanceof RegExp && b instanceof RegExp) { + return ( + a.source === b.source + && a.global === b.global + && a.multiline === b.multiline + && a.lastIndex === b.lastIndex + && a.ignoreCase === b.ignoreCase + ); + } if (isArguments(a) || isArguments(b)) { + if (!(isArguments(a) && isArguments(b))) { + return false; + } + const slice = Array.prototype.slice; + return deepEquals(slice.call(a), slice.call(b), ca, cb); + } + if (a.constructor !== b.constructor) { + return false; + } + + const ka = Object.keys(a); + const kb = Object.keys(b); + // don't bother with stack acrobatics if there's nothing there + if (ka.length === 0 && kb.length === 0) { + return true; + } + if (ka.length !== kb.length) { + return false; + } + + let cal = ca.length; + // eslint-disable-next-line no-plusplus + while (cal--) { + if (ca[cal] === a) { + return cb[cal] === b; + } + } + ca.push(a); + cb.push(b); + + ka.sort(); + kb.sort(); + // eslint-disable-next-line no-plusplus + for (let j = ka.length - 1; j >= 0; j--) { + if (ka[j] !== kb[j]) { + return false; + } + } + + let key; + // eslint-disable-next-line no-plusplus + for (let k = ka.length - 1; k >= 0; k--) { + key = ka[k]; + if (!deepEquals(a[key], b[key], ca, cb)) { + return false; + } + } + + ca.pop(); + cb.pop(); + + return true; +} + +// 只保证同时生成不重复 +export const genId = (function genIdFn() { + let preKey = `${+new Date()}`; + let key = 0; + return () => { + const curTimestamp = `${+new Date()}`; + if (curTimestamp === preKey) { + key += 1; + } else { + // 重置 key + key = 0; + } + + preKey = curTimestamp; + return `${preKey}x${key}`; + }; +}()); + +// 空对象 +export function isEmptyObject(obj) { + if (!obj) return true; + + for (const key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + return false; + } + } + return true; +} + +// 过滤和转换对象的key +export function filterObject(obj, filterFn) { + return Object.entries(obj).reduce((preVal, [key, value]) => { + const newKey = filterFn(key, value); + if (undefined !== newKey) { + preVal[newKey] = value; + } + return preVal; + }, {}); +} + +const f = s => `0${s}`.substr(-2); +export function parseDateString(dateString, includeTime = true) { + if (!dateString) { + return { + year: -1, + month: -1, + day: -1, + hour: includeTime ? -1 : 0, + minute: includeTime ? -1 : 0, + second: includeTime ? -1 : 0, + }; + } + const date = new Date(dateString); + if (Number.isNaN(date.getTime())) { + throw new Error(`Unable to parse date ${dateString}`); + } + return { + year: date.getFullYear(), + month: f(date.getMonth() + 1), // oh you, javascript. + day: f(date.getDate()), + hour: f(includeTime ? date.getHours() : 0), + minute: f(includeTime ? date.getMinutes() : 0), + second: f(includeTime ? date.getSeconds() : 0), + }; +} + +export function toDateString( + { + year, month, day, hour = 0, minute = 0, second = 0 + }, + time = true +) { + const utcTime = Date.UTC(year, month - 1, day, hour, minute, second); + const datetime = new Date(utcTime).toJSON(); + return time ? datetime : datetime.slice(0, 10); +} + +export function pad(num, size) { + let s = String(num); + while (s.length < size) { + s = `0${s}`; + } + return s; +} + +// dataUrl 转 Blob文件对象 +export function dataURItoBlob(dataURI) { + // Split metadata from data + const splitted = dataURI.split(','); + // Split params + const params = splitted[0].split(';'); + // Get mime-type from params + const type = params[0].replace('data:', ''); + // Filter the name property from params + const properties = params.filter(param => param.split('=')[0] === 'name'); + // Look for the name and use unknown if no name property. + let name; + if (properties.length !== 1) { + name = 'unknown'; + } else { + // Because we filtered out the other property, + // we only have the name case here. + name = properties[0].split('=')[1]; + } + + // Built the Uint8Array Blob parameter from the base64 string. + const binary = atob(splitted[1]); + const array = []; + // eslint-disable-next-line no-plusplus + for (let i = 0; i < binary.length; i++) { + array.push(binary.charCodeAt(i)); + } + // Create the blob object + const blob = new window.Blob([new Uint8Array(array)], { type }); + + return { blob, name }; +} + +// 字符串首字母小写 +export function lowerCase(str) { + if (undefined === str) return str; + return String(str).replace(/^./, s => s.toLocaleLowerCase()); +} + +// 最大公约数 +export function gcd(a, b) { + if (b === 0) return a; + return gcd(b, a % b); +} + +// 最小公倍数 +export function scm(a, b) { + return (a * b) / gcd(a, b); +} + +// 打开新页面 +export function openNewPage(url, target = '_blank') { + const a = document.createElement('a'); + a.style.display = 'none'; + a.target = target; + a.href = url; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); +} diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/utils/vue3Utils.js b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/vue3Utils.js new file mode 100644 index 000000000..189ac2461 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/vue3Utils.js @@ -0,0 +1,59 @@ +/** + * Created by Liu.Jun on 2020/4/25 14:45. + */ + +import { defineComponent, h, resolveComponent as _resolveComponent } from 'vue'; + +export { + nodePath2ClassName, isRootNodePath, computedCurPath, getPathVal, path2prop +} from './vueUtils'; + +// 内部使用 . ,配置数据key不能出现. +const pathSeparator = '.'; + +// 删除当前path值 +export function deletePathVal(vueData, name) { + delete vueData[name]; +} + +// 设置当前path值 +export function setPathVal(obj, path, value) { + const pathArr = path.split(pathSeparator); + for (let i = 0; i < pathArr.length; i += 1) { + if (pathArr.length - i < 2) { + // 倒数第一个数据 + obj[pathArr[pathArr.length - 1]] = value; + break; + } + obj = obj[pathArr[i]]; + } +} + +export function resolveComponent(component) { + if (typeof component === 'string') return _resolveComponent(component); + + return component; +} + +// 转换antdv、naive等非moduleValue的v-model组件 +export const modelValueComponent = (component, { + model = 'value' +} = {}) => defineComponent({ + inheritAttrs: false, + setup(props, { attrs, slots }) { + return () => { + const { + modelValue: value, + 'onUpdate:modelValue': onUpdateValue, + ...otherAttrs + } = attrs; + + // eg: 'a-input' + return h(resolveComponent(component), { + [model]: value, + [`onUpdate:${model}`]: onUpdateValue, + ...otherAttrs + }, slots); + }; + } +}); diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/utils/vueUtils.js b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/vueUtils.js new file mode 100644 index 000000000..211eda051 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/utils/vueUtils.js @@ -0,0 +1,40 @@ +/** + * Created by Liu.Jun on 2020/4/25 14:45. + */ + + +// 内部使用 . ,配置数据key不能出现. +const pathSeparator = '.'; + +// nodePath 转css类名 +export function nodePath2ClassName(path) { + const rootPathName = '__pathRoot'; + return path ? `${rootPathName}.${path}`.replace(/\./g, '_') : rootPathName; +} + +// 是否为根节点 +export function isRootNodePath(path) { + return path === ''; +} + +// 计算当前节点path +export function computedCurPath(prePath, curKey) { + return prePath === '' ? curKey : [prePath, curKey].join(pathSeparator); +} + +// 获取当前path值 +export function getPathVal(obj, path, leftDeviation = 0) { + const pathArr = path.split(pathSeparator); + + for (let i = 0; i < pathArr.length - leftDeviation; i += 1) { + // 错误路径或者undefined中断查找 + if (obj === undefined) return undefined; + obj = pathArr[i] === '' ? obj : obj[pathArr[i]]; + } + return obj; +} + +// path 等于props +export function path2prop(path) { + return path; +} diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/.eslintignore b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/.eslintignore new file mode 100644 index 000000000..3a49fcc6d --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/.eslintignore @@ -0,0 +1,3 @@ +/**/node_modules/* +/**/dist/* +/**/*.css diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/CHANGELOG.md b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/CHANGELOG.md new file mode 100644 index 000000000..fcd227ccf --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/CHANGELOG.md @@ -0,0 +1,287 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [1.12.2](https://github.com/lljj-x/vue-json-schema-form/compare/v1.12.1...v1.12.2) (2022-04-11) + +**Note:** Version bump only for package @lljj/vue3-form-core + + + + + +## [1.12.1](https://github.com/lljj-x/vue-json-schema-form/compare/v1.12.0...v1.12.1) (2022-04-05) + + +### Bug Fixes + +* **lib:** anyOf onChange 参数 ([60cac99](https://github.com/lljj-x/vue-json-schema-form/commit/60cac995779c1eeb90b23f2cfeeb5deb8c350feb)), closes [#166](https://github.com/lljj-x/vue-json-schema-form/issues/166) + + + + + +# [1.12.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.11.0...v1.12.0) (2022-03-08) + + +### Features + +* **lib:** 优化样式 ([e53291b](https://github.com/lljj-x/vue-json-schema-form/commit/e53291b8395fdceb971f15f72c9e809cdee8ec7e)) + + + + + +# [1.11.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.10.0...v1.11.0) (2022-02-19) + + +### Bug Fixes + +* **lib:** 添加严格模式配置,更精准计算anyOf 默认值 ([2cd65bb](https://github.com/lljj-x/vue-json-schema-form/commit/2cd65bb5f275a021f1cc368e4c63387163c94d57)), closes [#157](https://github.com/lljj-x/vue-json-schema-form/issues/157) + + +### Features + +* **lib:** 阻止表单默认submit事件 ([a882181](https://github.com/lljj-x/vue-json-schema-form/commit/a882181d65a9a152f8017e55367100658464aeba)), closes [#150](https://github.com/lljj-x/vue-json-schema-form/issues/150) + + + + + +# [1.10.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.9.5...v1.10.0) (2021-11-28) + + +### Features + +* **lib:** 添加 $$uiFormRef 属性,可在mounted 之直接访问子组件实例 ([08c6c4f](https://github.com/lljj-x/vue-json-schema-form/commit/08c6c4f2d247b4881e88fa380de8980c31cc5cd7)), closes [#127](https://github.com/lljj-x/vue-json-schema-form/issues/127) + + + + + +## [1.9.5](https://github.com/lljj-x/vue-json-schema-form/compare/v1.9.4...v1.9.5) (2021-11-21) + + +### Bug Fixes + +* **lib:** 修复inline 布局样式问题 ([65a7143](https://github.com/lljj-x/vue-json-schema-form/commit/65a7143fc19105f9096afc24a25107c0ef27ac5f)), closes [#122](https://github.com/lljj-x/vue-json-schema-form/issues/122) + + + + + +## [1.9.4](https://github.com/lljj-x/vue-json-schema-form/compare/v1.9.3...v1.9.4) (2021-11-02) + +**Note:** Version bump only for package @lljj/vue3-form-core + + + + + +## [1.9.3](https://github.com/lljj-x/vue-json-schema-form/compare/v1.9.2...v1.9.3) (2021-10-10) + +**Note:** Version bump only for package @lljj/vue3-form-core + + + + + +## [1.9.2](https://github.com/lljj-x/vue-json-schema-form/compare/v1.9.1...v1.9.2) (2021-09-25) + + +### Bug Fixes + +* **lib:** 修复antd表单不实时校验 ([5452491](https://github.com/lljj-x/vue-json-schema-form/commit/5452491354acf9884cd37691e766c0007c82f88a)) +* **lib:** 修复anyOf嵌套object 可能丢失部分校验规则的问题 ([5c06294](https://github.com/lljj-x/vue-json-schema-form/commit/5c06294d9a9c978bda1c3724710cfd4ba478af5b)) + + + + + +## [1.9.1](https://github.com/lljj-x/vue-json-schema-form/compare/v1.9.0...v1.9.1) (2021-09-22) + + +### Bug Fixes + +* **anyof:** 新值为object类型直接覆盖 ([d2f9791](https://github.com/lljj-x/vue-json-schema-form/commit/d2f9791ce7d35228edd07257049607177a95fc84)), closes [#77](https://github.com/lljj-x/vue-json-schema-form/issues/77) +* 修复select组件无法实时校验 ([85d9545](https://github.com/lljj-x/vue-json-schema-form/commit/85d95451b56b9d985ca7094118fbfaca87342322)), closes [#105](https://github.com/lljj-x/vue-json-schema-form/issues/105) + + + + + +# [1.9.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.7.0...v1.9.0) (2021-09-06) + + +### Features + +* **vue3-core:** 允许传递props至formFooter ([60ee613](https://github.com/lljj-x/vue-json-schema-form/commit/60ee613bda30b818adccd98ad73949ff111df74c)) + + +### Performance Improvements + +* **vue3-core:** 优化 okBtnProps 的实现方式 ([adfe93e](https://github.com/lljj-x/vue-json-schema-form/commit/adfe93e58a9e8fedc2b0c26484be5691ccc3f65a)) + + + + + +# [1.8.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.7.0...v1.8.0) (2021-09-06) + + +### Features + +* **vue3-core:** 允许传递props至formFooter ([60ee613](https://github.com/lljj-x/vue-json-schema-form/commit/60ee613bda30b818adccd98ad73949ff111df74c)) + + +### Performance Improvements + +* **vue3-core:** 优化 okBtnProps 的实现方式 ([adfe93e](https://github.com/lljj-x/vue-json-schema-form/commit/adfe93e58a9e8fedc2b0c26484be5691ccc3f65a)) + + + + + +# [1.7.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.6.4...v1.7.0) (2021-08-29) + + +### Features + +* **lib:** 支持配置 slots ([27f1501](https://github.com/lljj-x/vue-json-schema-form/commit/27f1501eda01eabd4a723656be56904e9cb0f069)), closes [#45](https://github.com/lljj-x/vue-json-schema-form/issues/45) + + + + + +## [1.6.3](https://github.com/lljj-x/vue-json-schema-form/compare/v1.6.2...v1.6.3) (2021-07-12) + +**Note:** Version bump only for package @lljj/vue3-form-core + + + + + +## [1.6.2](https://github.com/lljj-x/vue-json-schema-form/compare/v1.6.1...v1.6.2) (2021-05-31) + +**Note:** Version bump only for package @lljj/vue3-form-core + + + + + +# [1.6.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.5.0...v1.6.0) (2021-05-22) + + +### Features + +* **lib:** form-mounted event 添加formData 参数 ([c54202c](https://github.com/lljj-x/vue-json-schema-form/commit/c54202c27304add9636a7062c05c80c60fc200a6)) + + + + + +# [1.5.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.4.0...v1.5.0) (2021-05-09) + + +### Features + +* **lib:** 优化anyOf切换选项值的复用,修复vue3 anyOf无法切换选项 ([6159160](https://github.com/lljj-x/vue-json-schema-form/commit/6159160d1727165e706343187aca129360dc011f)) + + + + + +# [1.4.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.3.0...v1.4.0) (2021-04-22) + + +### Features + +* **lib:** 调整 widget onChange prop参数格式,添加 formData参数 ([4c441fc](https://github.com/lljj-x/vue-json-schema-form/commit/4c441fce239ade40b10a42bf361c3ee920a044ed)), closes [#45](https://github.com/lljj-x/vue-json-schema-form/issues/45) + + + + + +# [1.3.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.2.1...v1.3.0) (2021-04-15) + + +### Features + +* **core:** widget 节点直接配置onChange ([2d2264b](https://github.com/lljj-x/vue-json-schema-form/commit/2d2264b004c3b6586e225c563bf03ca52fc5e53a)) + + + + + +## [1.2.1](https://github.com/lljj-x/vue-json-schema-form/compare/v1.2.0...v1.2.1) (2021-04-11) + +**Note:** Version bump only for package @lljj/vue3-form-core + + + + + +# [1.2.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.1.3...v1.2.0) (2021-03-30) + + +### Features + +* **lib:** 添加 fallback-label 参数 ([cd2d8c3](https://github.com/lljj-x/vue-json-schema-form/commit/cd2d8c3ed72b9bc03e44eb5b86eb1b18fe67c34c)), closes [#45](https://github.com/lljj-x/vue-json-schema-form/issues/45) + + + + + +## [1.1.3](https://github.com/lljj-x/vue-json-schema-form/compare/v1.1.2...v1.1.3) (2021-03-18) + +**Note:** Version bump only for package @lljj/vue3-form-core + + + + + +## [1.1.2](https://github.com/lljj-x/vue-json-schema-form/compare/v1.1.1...v1.1.2) (2021-03-07) + + +### Bug Fixes + +* **vue3-antd:** 修复form label 双冒号问题 ([5b4f16c](https://github.com/lljj-x/vue-json-schema-form/commit/5b4f16c3c1a4f4b784c2fd5c1fbe7eec40cf8d7b)), closes [#46](https://github.com/lljj-x/vue-json-schema-form/issues/46) + + + + + +# [1.1.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.0.2...v1.1.0) (2021-03-06) + + +### Features + +* **vue3-ant:** 更新初始化 ([71a2810](https://github.com/lljj-x/vue-json-schema-form/commit/71a281045af11f215333050396aa546dd5e78b88)), closes [#27](https://github.com/lljj-x/vue-json-schema-form/issues/27) [#27](https://github.com/lljj-x/vue-json-schema-form/issues/27) [#27](https://github.com/lljj-x/vue-json-schema-form/issues/27) [#40](https://github.com/lljj-x/vue-json-schema-form/issues/40) + + + + + +## [1.0.2](https://github.com/lljj-x/vue-json-schema-form/compare/v1.0.1...v1.0.2) (2021-01-31) + + +### Bug Fixes + +* **style:** 修复p标签等自带边距导致的样式问题  ([7b7e43e](https://github.com/lljj-x/vue-json-schema-form/commit/7b7e43eaa06c14a436b34c38d6d69aad27d67512)) + + + + + +## [0.6.1](https://github.com/lljj-x/vue-json-schema-form/compare/v0.6.0...v0.6.1) (2021-01-19) + +**Note:** Version bump only for package @lljj/vue3-form-core + + + + + +# [0.6.0](https://github.com/lljj-x/vue-json-schema-form/compare/v0.5.0...v0.6.0) (2021-01-19) + +**Note:** Version bump only for package @lljj/vue3-form-core diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/README.md b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/README.md new file mode 100644 index 000000000..48e2be472 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/README.md @@ -0,0 +1,124 @@ +# @lljj/vue3-form-core +vue3 版本核心,可以基于此适配不同的 vue3 ui库。 + +适配的核心就是对应类型为自己的组件库,且处理默认 `props` 与自己组件库 props 之间的转换 + +> 适配方案可参见 [@lljj/vue3-form-element](https://github.com/lljj-x/vue-json-schema-form/tree/master/packages/lib/vue3/vue3-form-element) 、[@lljj/vue3-form-ant](https://github.com/lljj-x/vue-json-schema-form/tree/master/packages/lib/vue3/vue3-form-ant) + + +## 兼容性 +npm 包直接为 es6+ 源码,需要在构建 lib 时通过babe转义 + +如配置 rollup babel plugin: + +```js +babel({ + exclude: /node_modules\/(?!(@lljj)\/).*/, // 忽略跳过 @lljj + extensions: ['.js', '.vue'], +}) +``` + +## 安装 + +```ssh +## npm +npm install --save @lljj/vue3-form-core + +## yarn +yarn add @lljj/vue3-form-core +``` + +## 使用方法 + +按如下格式,配置对应组件在当前组件库中的映射关系,可以直接配置全局组件名或者组件构造函数,`默认组件 props 为elementUi格式,如果props格式不同需要中间组件来做转换`; + +```js +import createVue2Core from '@lljj/vue3-form-core'; + +const globalOptions = { + // widget组件和现有组件库映射关系 + WIDGET_MAP: { + // 默认按schema type 映射默认widget组件 + types: { + // type boolean + boolean: 'el-switch', + + // type string + string: 'el-input', + + // type number + number: 'el-input-number', + + // type integer + integer: 'el-input-number', + }, + + // 按 schema format 映射默认widget组件,优先级高于 types + formats: { + // format: color + color: 'el-color-picker', + + // format: time + time: TimePickerWidget, // 格式 20:20:39+00:00 + + // format: date + date: DatePickerWidget, // 格式 2018-11-13 + + // format: date-time + 'date-time': DateTimePickerWidget, // 格式 2018-11-13T20:20:39+00:00 + }, + + // 一些公共常用类型 + common: { + // select option + select: SelectWidget, + + // radio + radioGroup: RadioWidget, + + // checkout + checkboxGroup: CheckboxesWidget, + }, + + // 这里配置一些 为当前ui库适配过的组件,会在运行时自动注册为全局组件,不注册为全局也可不配置 + // Vue3 只有在组件内才能获取到当前的app,所以注册时机是在 form组件setup中,且只会注册一次。 + widgetComponents: { + CheckboxesWidget, + RadioWidget, + SelectWidget, + TimePickerWidget, + DatePickerWidget, + DateTimePickerWidget + } + }, + + // 其它表单相关组件映射关系 + COMPONENT_MAP: { + // form组件 + form: 'el-form', + + // formItem 组件 + formItem: 'el-form-item', + + // button 组件 + button: 'el-button', + + // popover,用在formLable 左右布局时鼠标移入显示description + popover: 'el-popover' + }, + HELPERS: { + // 是否mini显示 description + isMiniDes(formProps) { + return formProps && ['left', 'right'].includes(formProps.labselPosition); + } + } +}; + +const mySchemaForm = createVue2Core(globalOptions); + +``` + +适配一个新的ui框架只需要适配如上的组件即可 + +## License +Apache-2.0 diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/package.json b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/package.json new file mode 100644 index 000000000..afa7e166b --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/package.json @@ -0,0 +1,29 @@ +{ + "name": "@lljj/vue3-form-core", + "version": "1.12.2", + "description": "基于 Vue3 、JsonSchema快速构建一个带完整校验的form表单,vue3版本基础框架", + "main": "src/index.js", + "module": "src/index.js", + "keywords": [ + "vue", + "vuejs", + "form", + "jsonSchema" + ], + "publishConfig": { + "access": "public" + }, + "dependencies": { + "@lljj/vjsf-utils": "1.12.2" + }, + "repository": "https://github.com/lljj-x/vue-json-schema-form", + "homepage": "https://github.com/lljj-x/vue-json-schema-form", + "license": "Apache-2.0", + "author": "Liu.Jun", + "browserslist": [ + "> 1%", + "last 2 versions", + "not ie <= 8" + ], + "gitHead": "92795075169c879e1c1fabfe26f1d3c10b861060" +} diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/FIELDS_MAP.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/FIELDS_MAP.js new file mode 100644 index 000000000..980a31744 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/FIELDS_MAP.js @@ -0,0 +1,46 @@ +/** + * Created by Liu.Jun on 2020/4/20 9:55 下午. + */ + +// eslint-disable-next-line import/no-cycle +import ObjectField from './fields/ObjectField'; + +// eslint-disable-next-line import/no-cycle +import StringField from './fields/StringField'; + +// eslint-disable-next-line import/no-cycle +import NumberField from './fields/NumberField'; + +// eslint-disable-next-line import/no-cycle +import IntegerField from './fields/IntegerField'; + +// eslint-disable-next-line import/no-cycle +import BooleanField from './fields/BooleanField'; + +// eslint-disable-next-line import/no-cycle +import ArrayField from './fields/ArrayField'; + +// eslint-disable-next-line import/no-cycle +import AnyOfField from './fields/combiningSchemas/AnyOfField'; + +// eslint-disable-next-line import/no-cycle +import OneOfField from './fields/combiningSchemas/OneOfField'; + +// 默认类型使用field映射关系 +const FIELDS_MAPS = { + array: ArrayField, + boolean: BooleanField, + integer: IntegerField, + number: NumberField, + object: ObjectField, + string: StringField, + null: { + render() { + return null; + } + }, + anyOf: AnyOfField, + oneOf: OneOfField +}; + +export default FIELDS_MAPS; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/components/FormFooter.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/components/FormFooter.js new file mode 100644 index 000000000..01443951e --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/components/FormFooter.js @@ -0,0 +1,67 @@ +/** + * Created by Liu.Jun on 2020/12/27 9:53 下午. + */ + +import { h } from 'vue'; + +import { resolveComponent } from '@lljj/vjsf-utils/vue3Utils'; + +export default { + name: 'FormFooter', + props: { + okBtn: { + type: String, + default: '保存' + }, + okBtnProps: { + type: Object, + default: () => ({}) + }, + cancelBtn: { + type: String, + default: '取消' + }, + formItemAttrs: { + type: Object, + default: () => ({}) + }, + globalOptions: { + type: Object, + default: () => ({}) + } + }, + emits: ['cancel', 'submit'], + setup(props, { emit }) { + // globalOptions 不需要响应式 + const { globalOptions: { COMPONENT_MAP } } = props; + + return () => h(resolveComponent(COMPONENT_MAP.formItem), { + class: { + formFooter_item: true + }, + ...props.formItemAttrs + }, { + default: () => [ + h(resolveComponent(COMPONENT_MAP.button), { + onClick() { + emit('cancel'); + } + }, { + default: () => props.cancelBtn + }), + h(resolveComponent(COMPONENT_MAP.button), { + style: { + marginLeft: '10px' + }, + type: 'primary', + onClick() { + emit('submit'); + }, + ...props.okBtnProps + }, { + default: () => props.okBtn + }) + ] + }); + } +}; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/components/Widget.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/components/Widget.js new file mode 100644 index 000000000..4a8db7550 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/components/Widget.js @@ -0,0 +1,365 @@ +/** + * Created by Liu.Jun on 2020/4/23 11:24. + */ + +import { + computed, h, ref, watch, inject +} from 'vue'; + +import { IconInfo } from '@lljj/vjsf-utils/icons'; + +import { validateFormDataAndTransformMsg } from '@lljj/vjsf-utils/schema/validate'; +import { fallbackLabel } from '@lljj/vjsf-utils/formUtils'; + +import { + isRootNodePath, path2prop, getPathVal, setPathVal, resolveComponent +} from '@lljj/vjsf-utils/vue3Utils'; + +export default { + name: 'Widget', + props: { + // 是否同步formData的值,默认表单元素都需要 + // oneOf anyOf 中的select属于formData之外的数据 + isFormData: { + type: Boolean, + default: true + }, + // isFormData = false时需要传入当前 value 否则会通过 curNodePath 自动计算 + curValue: { + type: null, + default: 0 + }, + schema: { + type: Object, + default: () => ({}) + }, + uiSchema: { + type: Object, + default: () => ({}) + }, + errorSchema: { + type: Object, + default: () => ({}) + }, + customFormats: { + type: Object, + default: () => ({}) + }, + // 自定义校验 + customRule: { + type: Function, + default: null + }, + widget: { + type: [String, Function, Object], + default: null + }, + required: { + type: Boolean, + default: false + }, + // 解决 JSON Schema和实际输入元素中空字符串 required 判定的差异性 + // 元素输入为 '' 使用 emptyValue 的值 + emptyValue: { + type: null, + default: undefined + }, + rootFormData: { + type: null + }, + curNodePath: { + type: String, + default: '' + }, + label: { + type: String, + default: '' + }, + // width -> formItem width + width: { + type: String, + default: '' + }, + labelWidth: { + type: String, + default: '' + }, + description: { + type: String, + default: '' + }, + // Widget attrs + widgetAttrs: { + type: Object, + default: () => ({}) + }, + // Widget className + widgetClass: { + type: Object, + default: () => ({}) + }, + // Widget style + widgetStyle: { + type: Object, + default: () => ({}) + }, + // Field attrs + fieldAttrs: { + type: Object, + default: () => ({}) + }, + // Field className + fieldClass: { + type: Object, + default: () => ({}) + }, + // Field style + fieldStyle: { + type: Object, + default: () => ({}) + }, + // props + uiProps: { + type: Object, + default: () => ({}) + }, + formProps: null, + getWidget: null, + renderScopedSlots: null, // 作用域插槽 + globalOptions: null, // 全局配置 + onChange: null + }, + emits: ['otherDataChange'], + inheritAttrs: true, + setup(props, { emit }) { + const genFormProvide = inject('genFormProvide'); + const widgetValue = computed({ + get() { + if (props.isFormData) return getPathVal(props.rootFormData, props.curNodePath); + + return props.curValue; + }, + set(value) { + // 大多组件删除为空值会重置为null。 + const trueValue = (value === '' || value === null) ? props.emptyValue : value; + if (props.isFormData) { + setPathVal(props.rootFormData, props.curNodePath, trueValue); + } else { + emit('otherDataChange', trueValue); + } + } + }); + + // 枚举类型默认值为第一个选项 + if (props.uiProps.enumOptions + && props.uiProps.enumOptions.length > 0 + && widgetValue.value === undefined + && widgetValue.value !== props.uiProps.enumOptions[0] + ) { + // array 渲染为多选框时默认为空数组 + if (props.schema.items) { + widgetValue.value = []; + } else if (props.required) { + widgetValue.value = props.uiProps.enumOptions[0].value; + } + } + + // 获取到widget组件实例 + const widgetRef = ref(null); + // 提供一种特殊的配置 允许直接访问到 widget vm + if (typeof props.getWidget === 'function') { + watch(widgetRef, () => { + props.getWidget.call(null, widgetRef.value); + }); + } + + return () => { + // 判断是否为根节点 + const isRootNode = isRootNodePath(props.curNodePath); + + const isMiniDes = props.formProps && props.formProps.isMiniDes; + const miniDesModel = isMiniDes || props.globalOptions.HELPERS.isMiniDes(props.formProps); + + const descriptionVNode = (props.description) ? h( + 'div', + { + innerHTML: props.description, + class: { + genFromWidget_des: true, + genFromWidget_des_mini: miniDesModel + } + }, + ) : null; + + const { COMPONENT_MAP } = props.globalOptions; + const miniDescriptionVNode = (miniDesModel && descriptionVNode) ? h(resolveComponent(COMPONENT_MAP.popover), { + style: { + margin: '0 2px', + fontSize: '16px', + cursor: 'pointer' + }, + placement: 'top', + trigger: 'hover' + }, { + default: () => descriptionVNode, + reference: () => h(IconInfo) + }) : null; + + // form-item style + const formItemStyle = { + ...props.fieldStyle, + ...(props.width ? { + width: props.width, + flexBasis: props.width, + paddingRight: '10px' + } : {}) + }; + + // 运行配置回退到 属性名 + const label = fallbackLabel(props.label, (props.widget && genFormProvide.value.fallbackLabel), props.curNodePath); + return h( + resolveComponent(COMPONENT_MAP.formItem), + { + class: { + ...props.fieldClass, + genFormItem: true + }, + style: formItemStyle, + ...props.fieldAttrs, + + ...props.labelWidth ? { labelWidth: props.labelWidth } : {}, + ...props.isFormData ? { + // 这里对根节点打特殊标志,绕过elementUi无prop属性不校验 + prop: isRootNode ? '__$$root' : path2prop(props.curNodePath), + rules: [ + { + validator(rule, value, callback) { + if (isRootNode) value = props.rootFormData; + + // 校验是通过对schema逐级展开校验 这里只捕获根节点错误 + const errors = validateFormDataAndTransformMsg({ + formData: value, + schema: props.schema, + uiSchema: props.uiSchema, + customFormats: props.customFormats, + errorSchema: props.errorSchema, + required: props.required, + propPath: path2prop(props.curNodePath) + }); + + // 存在校验不通过字段 + if (errors.length > 0) { + if (callback) return callback(errors[0].message); + return Promise.reject(errors[0].message); + } + + // customRule 如果存在自定义校验 + const curCustomRule = props.customRule; + if (curCustomRule && (typeof curCustomRule === 'function')) { + return curCustomRule({ + field: props.curNodePath, + value, + rootFormData: props.rootFormData, + callback + }); + } + + // 校验成功 + if (callback) return callback(); + return Promise.resolve(); + }, + trigger: 'change' + } + ] + } : {}, + }, + { + // 错误只能显示一行,多余... + error: slotProps => (slotProps.error ? h('div', { + class: { + formItemErrorBox: true + }, + title: slotProps.error + }, [slotProps.error]) : null), + + // label + /* + TODO:这里slot如果从无到有会导致无法正常渲染出元素 怀疑是vue3 bug + 如果使用 error 的形式渲染,ElementPlus label labelWrap 未做判断,使用 slots.default?.() 会得到 undefined + */ + ...label ? { + label: () => h('span', { + class: { + genFormLabel: true, + genFormItemRequired: props.required, + }, + }, [ + ...miniDescriptionVNode ? [miniDescriptionVNode] : [], + `${label}`, + `${(props.formProps && props.formProps.labelSuffix) || ''}` + ]) + } : {}, + + // default + default: otherAttrs => [ + // description + // 非mini模式显示 description + ...(!miniDesModel && descriptionVNode) ? [descriptionVNode] : [], + + ...props.widget ? [ + h( // 关键输入组件 + resolveComponent(props.widget), + { + style: props.widgetStyle, + class: props.widgetClass, + + ...props.widgetAttrs, + ...props.uiProps, + modelValue: widgetValue.value, // v-model + ref: widgetRef, + 'onUpdate:modelValue': function updateModelValue(event) { + const preVal = widgetValue.value; + if (preVal !== event) { + widgetValue.value = event; + if (props.onChange) { + props.onChange({ + curVal: event, + preVal, + parentFormData: getPathVal(props.rootFormData, props.curNodePath, 1), + rootFormData: props.rootFormData + }); + } + } + }, + ...otherAttrs ? (() => Object.keys(otherAttrs).reduce((pre, k) => { + pre[k] = otherAttrs[k]; + + // 保证ui配置同名方法 ui方法先执行 + [ + props.widgetAttrs[k], + props.uiProps[k] + ].forEach((uiConfFn) => { + if (uiConfFn && typeof uiConfFn === 'function') { + pre[k] = (...args) => { + uiConfFn(...args); + pre[k](...args); + }; + } + }); + + return pre; + }, {}))() : {} + }, + { + ...(props.renderScopedSlots ? ( + typeof props.renderScopedSlots === 'function' ? props.renderScopedSlots() : props.renderScopedSlots + ) : {}) + } + ) + ] : [] + ] + } + ); + }; + } +}; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/ArrayField/arrayTypes/ArrayFieldMultiSelect.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/ArrayField/arrayTypes/ArrayFieldMultiSelect.js new file mode 100644 index 000000000..38a734223 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/ArrayField/arrayTypes/ArrayFieldMultiSelect.js @@ -0,0 +1,57 @@ +/** + * Created by Liu.Jun on 2020/4/24 11:56. + */ + +import { h } from 'vue'; + +import { + getWidgetConfig, optionsList +} from '@lljj/vjsf-utils/formUtils'; +import retrieveSchema from '@lljj/vjsf-utils/schema/retriev'; +import vueProps from '../../props'; + +import Widget from '../../../components/Widget'; + +export default { + name: 'ArrayFieldMultiSelect', + props: { + ...vueProps + }, + setup(props, { attrs }) { + return () => { + const { + schema, rootSchema, uiSchema, curNodePath, rootFormData, globalOptions + } = props; + + // 这里需要索引当前节点,通过到schemaField组件的会统一处理 + const itemsSchema = retrieveSchema(schema.items, rootSchema); + + const enumOptions = optionsList(itemsSchema, uiSchema, curNodePath, rootFormData); + + const widgetConfig = getWidgetConfig({ + schema, + uiSchema, + curNodePath, + rootFormData + }, () => ({ + widget: globalOptions.WIDGET_MAP.common.checkboxGroup + })); + + // 存在枚举数据列表 传入 enumOptions + widgetConfig.uiProps.multiple = true; + + if (enumOptions && !widgetConfig.uiProps.enumOptions) { + widgetConfig.uiProps.enumOptions = enumOptions; + } + + return h( + Widget, + { + ...attrs, + ...props, + ...widgetConfig + } + ); + }; + } +}; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/ArrayField/arrayTypes/ArrayFieldNormal.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/ArrayField/arrayTypes/ArrayFieldNormal.js new file mode 100644 index 000000000..8b4661fb4 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/ArrayField/arrayTypes/ArrayFieldNormal.js @@ -0,0 +1,108 @@ +/** + * Created by Liu.Jun on 2020/4/24 11:56. + */ + +import { h } from 'vue'; + +import { computedCurPath } from '@lljj/vjsf-utils/vue3Utils'; +import { getUiOptions, replaceArrayIndex } from '@lljj/vjsf-utils/formUtils'; + +import FieldGroupWrap from '@lljj/vjsf-utils/components/FieldGroupWrap'; +import SchemaField from '../../SchemaField'; +import ArrayOrderList from '../components/ArrayOrderList'; + +import vueProps from '../../props'; + +export default { + name: 'ArrayFieldNormal', + props: { + ...vueProps, + itemsFormData: { + type: Array, + } + }, + setup(props, { attrs }) { + return () => { + const { + schema, uiSchema, curNodePath, rootFormData, itemsFormData, errorSchema, globalOptions + } = props; + + const { + title, + description, + addable, + showIndexNumber, + sortable, + removable, + showTitle, + showDescription, + fieldClass, + fieldAttrs, + fieldStyle, + } = getUiOptions({ + schema, + uiSchema, + curNodePath, + rootFormData, + }); + + const arrayItemsVNodeList = itemsFormData.map((item, index) => { + const tempUiSchema = replaceArrayIndex({ + schema: schema.items, + uiSchema: uiSchema.items + }, index); + + return { + key: item.key, + vNode: h( + SchemaField, + { + key: item.key, + ...props, + schema: schema.items, + required: !([].concat(schema.items.type).includes('null')), + uiSchema: { + ...uiSchema.items, + ...tempUiSchema, // 处理过 $index 的标识 + }, + errorSchema: errorSchema.items, + curNodePath: computedCurPath(curNodePath, index) + } + ) + }; + }); + + return h( + FieldGroupWrap, + { + title, + description, + showTitle, + showDescription, + curNodePath, + class: fieldClass, + attrs: fieldAttrs, + style: fieldStyle, + }, + { + default() { + return h( + ArrayOrderList, + { + ...attrs, + vNodeList: arrayItemsVNodeList, + showIndexNumber, + addable, + sortable, + removable, + maxItems: schema.maxItems, + minItems: schema.minItems, + globalOptions + } + ); + } + } + ); + }; + } +}; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/ArrayField/arrayTypes/ArrayFieldSpecialFormat.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/ArrayField/arrayTypes/ArrayFieldSpecialFormat.js new file mode 100644 index 000000000..e307c600b --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/ArrayField/arrayTypes/ArrayFieldSpecialFormat.js @@ -0,0 +1,36 @@ +/** + * Created by Liu.Jun on 2020/9/16 10:25. + */ + +import { h } from 'vue'; +import { getWidgetConfig } from '@lljj/vjsf-utils/formUtils'; +import vueProps from '../../props'; +import Widget from '../../../components/Widget'; + +export default { + name: 'ArrayFieldSpecialFormat', + props: vueProps, + setup(props, { attrs }) { + const { + schema, uiSchema, curNodePath, rootFormData, globalOptions + } = props; + const widgetConfig = getWidgetConfig({ + schema: { + 'ui:widget': globalOptions.WIDGET_MAP.formats[schema.format], + ...schema + }, + uiSchema, + curNodePath, + rootFormData + }); + + return () => h( + Widget, + { + ...attrs, + ...props, + ...widgetConfig + } + ); + } +}; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/ArrayField/arrayTypes/ArrayFieldTuple.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/ArrayField/arrayTypes/ArrayFieldTuple.js new file mode 100644 index 000000000..9f4be0bb8 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/ArrayField/arrayTypes/ArrayFieldTuple.js @@ -0,0 +1,167 @@ +/** + * Created by Liu.Jun on 2020/4/24 11:56. + */ + +import { h } from 'vue'; + +import { allowAdditionalItems, getUiOptions, replaceArrayIndex } from '@lljj/vjsf-utils/formUtils'; +import getDefaultFormState from '@lljj/vjsf-utils/schema/getDefaultFormState'; +import { computedCurPath } from '@lljj/vjsf-utils/vue3Utils'; +import { cutOff } from '@lljj/vjsf-utils/arrayUtils'; +import FieldGroupWrap from '@lljj/vjsf-utils/components/FieldGroupWrap'; +import vueProps from '../../props'; + +import SchemaField from '../../SchemaField'; +import ArrayOrderList from '../components/ArrayOrderList'; + +export default { + name: 'ArrayFieldTuple', + props: { + ...vueProps, + itemsFormData: { + type: Array, + default: () => [] + } + }, + emits: ['arrayOperate'], + setup(props, { emit, attrs }) { + // 兼容数据 长度不足的的场景 + const fixItemsFormData = () => { + const isNoArray = !Array.isArray(props.itemsFormData); + if (isNoArray || props.itemsFormData.length < props.schema.items.length) { + // 这里需要补齐默认数据,计算出需要的数据 + const curSchemaState = getDefaultFormState(props.schema, undefined, props.rootSchema); + + if (isNoArray) { + // 数据修复 - 重置一个新的值 + emit('arrayOperate', { + command: 'setNewTarget', + data: { + newTarget: curSchemaState + } + }); + } else { + // 修复数据 - 追加不足的数据 + emit('arrayOperate', { + command: 'batchPush', + data: { + pushArray: curSchemaState.slice(props.itemsFormData.length) + } + }); + } + } + }; + fixItemsFormData(); + + return () => { + if (!Array.isArray(props.itemsFormData)) return null; + + const { + schema, uiSchema, errorSchema, curNodePath, globalOptions + } = props; + + const { + title, + description, + addable, + showIndexNumber, + sortable, + removable, + showTitle, + showDescription, + fieldClass, + fieldAttrs, + fieldStyle, + } = getUiOptions({ + schema, + uiSchema, + curNodePath, + rootFormData: props.rootFormData, + }); + + // 拆分为 tuple 和 additional + const cutOfArr = cutOff(props.itemsFormData, props.schema.items.length - 1); + + const tupleVNodeArr = cutOfArr[0].map((item, index) => h( + SchemaField, + { + key: item.key, + ...props, + required: !([].concat(schema.items[index].type).includes('null')), + schema: schema.items[index], + uiSchema: uiSchema.items ? uiSchema.items[index] : {}, + errorSchema: errorSchema.items ? errorSchema.items[index] : {}, + curNodePath: computedCurPath(curNodePath, index) + } + )); + + // 通过order组件做可排序处理 + const additionalVNodeArr = cutOfArr[1].map((item, index) => { + const tempUiSchema = replaceArrayIndex({ + schema: schema.additionalItems, + uiSchema: uiSchema.additionalItems + }, index); + + return { + key: item.key, + vNode: h( + SchemaField, + { + key: item.key, + ...props, + schema: schema.additionalItems, + required: !([].concat(schema.additionalItems.type).includes('null')), + uiSchema: { + ...uiSchema.additionalItems, + ...tempUiSchema + }, + errorSchema: errorSchema.additionalItems, + curNodePath: computedCurPath(props.curNodePath, index + schema.items.length) + } + ) + }; + }); + + // 是否可添加同时受限于 additionalItems 属性 + const trueAddable = (addable === undefined ? true : addable) && allowAdditionalItems(props.schema); + + // 默认循环固定配置的数据 长度外的使用ArrayOrderList渲染 + return h( + FieldGroupWrap, + { + title, + description, + showTitle, + showDescription, + curNodePath, + ...fieldAttrs, + class: fieldClass, + style: fieldStyle, + }, + { + default: () => [ + // 先显示Tuple固定项 + ...tupleVNodeArr, + + // additional items + h( + ArrayOrderList, + { + onArrayOperate: (...args) => emit('arrayOperate', ...args), + vNodeList: additionalVNodeArr, + tupleItemsLength: schema.items.length, + addable: trueAddable, + showIndexNumber, + sortable, + removable, + maxItems: schema.maxItems, + minItems: schema.minItems, + globalOptions, + } + ) + ] + } + ); + }; + } +}; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/ArrayField/components/ArrayOrderList.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/ArrayField/components/ArrayOrderList.js new file mode 100644 index 000000000..eec57fb52 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/ArrayField/components/ArrayOrderList.js @@ -0,0 +1,252 @@ +/** + * Created by Liu.Jun on 2020/4/24 16:47. + */ + +import { + IconCaretUp, IconCaretDown, IconClose, IconPlus +} from '@lljj/vjsf-utils/icons'; +import { h, computed } from 'vue'; + +// 支持数字排序 ,新增 ,删除等操作 +export default { + name: 'ArrayOrderList', + emits: ['arrayOperate'], + props: { + // 需要被排序的VNode list + vNodeList: { + type: Array, + default: [] + }, + // tuple类型的数组,需要固定前值 + tupleItemsLength: { + type: Number, + default: 0 + }, + addable: { + // 是否启用添加 + type: Boolean, + default: true + }, + showIndexNumber: { + // 是否显示当前序号 + type: Boolean, + default: false + }, + sortable: { + // 是否可排序 + type: Boolean, + default: true + }, + removable: { + // 是否可移除 + type: Boolean, + default: true + }, + maxItems: { + // 最多添加个数 + }, + minItems: { + // 最少添加个数 + }, + globalOptions: null + }, + setup(props, { emit }) { + // 是否可添加 + const canAdd = computed(() => { + const { addable, maxItems, vNodeList } = props; + // 配置不可添加 + if (!addable) return false; + + // 配置了最大个数 + if (maxItems !== undefined) { + return vNodeList.length < maxItems; + } + return true; + }); + + // 是否可移除 + const canRemove = computed(() => { + const { removable, minItems, vNodeList } = props; + // 配置不可移除 + if (!removable) return false; + + if (minItems !== undefined) { + return vNodeList.length > minItems; + } + + return true; + }); + + return () => { + // 没有数据,且不能添加不渲染该组件 + if (props.vNodeList.length <= 0 && !props.addable) return null; + + // 是否可继续添加元素 + return h( + 'div', + { + class: { + arrayOrderList: true + } + }, + props.vNodeList.map(({ key, vNode: VNodeItem }, index) => { + const trueIndex = props.tupleItemsLength + index; + const indexNumber = index + 1; + return h( + 'div', + { + key, + class: { + arrayOrderList_item: true + } + }, + [ + props.showIndexNumber ? h('div', { + class: { + arrayListItem_index: true + } + }, indexNumber) : null, + h( + 'div', + { + class: { + arrayListItem_operateTool: true + } + }, + [ + h( + 'button', + { + // 配置不可排序不显示排序按钮 + style: { + ...(!props.sortable ? { + display: 'none' + } : {}) + }, + class: { + arrayListItem_btn: true, + 'arrayListItem_orderBtn-top': true + }, + type: 'button', + disabled: !props.sortable || index === 0, + onClick: () => { + emit('arrayOperate', { + command: 'moveUp', + data: { + index: trueIndex + } + }); + } + }, + [h(IconCaretUp)] + ), + h( + 'button', + { + // 配置不可排序不显示排序按钮 + style: { + ...(!props.sortable ? { + display: 'none' + } : {}) + }, + class: { + arrayListItem_btn: true, + 'arrayListItem_orderBtn-bottom': true + }, + + type: 'button', + disabled: !props.sortable || index === props.vNodeList.length - 1, + onClick: () => { + emit('arrayOperate', { + command: 'moveDown', + data: { + index: trueIndex + } + }); + } + }, + [h(IconCaretDown)] + ), + h( + 'button', + { + // 配置不可移除不显示移除按钮 + style: { + ...(!props.removable ? { + display: 'none' + } : {}) + }, + class: { + arrayListItem_btn: true, + 'arrayListItem_btn-delete': true + }, + type: 'button', + disabled: !canRemove.value, + onClick: () => { + emit('arrayOperate', { + command: 'remove', + data: { + index: trueIndex + } + }); + } + }, + [h(IconClose)] + ) + ] + ), + h( + 'div', + { + class: { + arrayListItem_content: true + } + }, + [VNodeItem] + ) + ] + ); + }).concat([ + h( + 'p', + { + style: { + ...(!canAdd.value ? { + display: 'none' + } : {}) + }, + class: { + arrayOrderList_bottomAddBtn: true, + } + }, + [ + h( + 'button', + { + class: { + bottomAddBtn: true, + 'is-plain': true, + genFormBtn: true + }, + type: 'button', + onClick: () => { + emit('arrayOperate', { + command: 'add' + }); + } + }, + [ + h(IconPlus, { + style: { marginRight: '5px' } + }), + props.maxItems ? `( ${props.vNodeList.length} / ${props.maxItems} )` : '' + ] + ), + ] + ), + ]) + ); + }; + + } +}; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/ArrayField/index.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/ArrayField/index.js new file mode 100644 index 000000000..f5bf60354 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/ArrayField/index.js @@ -0,0 +1,215 @@ +/** + * Created by Liu.Jun on 2020/4/24 11:23. + */ + + +import { + ref, computed, h, watch, toRaw +} from 'vue'; + +import getDefaultFormState from '@lljj/vjsf-utils/schema/getDefaultFormState'; + +import { + allowAdditionalItems, isFixedItems, isMultiSelect +} from '@lljj/vjsf-utils/formUtils'; +import { getPathVal, setPathVal } from '@lljj/vjsf-utils/vue3Utils'; +import { genId, lowerCase } from '@lljj/vjsf-utils/utils'; + +import * as arrayMethods from '@lljj/vjsf-utils/arrayUtils'; +import Widget from '../../components/Widget'; + +import vueProps from '../props'; + +import ArrayFieldNormal from './arrayTypes/ArrayFieldNormal'; +import ArrayFieldMultiSelect from './arrayTypes/ArrayFieldMultiSelect'; +import ArrayFieldTuple from './arrayTypes/ArrayFieldTuple'; +import ArrayFieldSpecialFormat from './arrayTypes/ArrayFieldSpecialFormat'; + +export default { + name: 'ArrayField', + props: vueProps, + setup(props) { + // 获取当前的值 + const getCurFormData = () => { + const { rootFormData, curNodePath } = props; + const value = getPathVal(rootFormData, curNodePath); + + if (Array.isArray(value)) return value; + + console.error('error: type array,值必须为 array 类型'); + + return []; + }; + + // 通过维护一份key,一份值 来解决list key的问题 + const formKeys = ref(getCurFormData().map(() => genId())); + + // 当前 formData + const curFormData = computed(() => getCurFormData()); + watch(curFormData, (newVal, oldVal) => { + // 引用类型,当值不相等,说明是被重新赋值 + // 这里应该对比原始值 + if (newVal !== oldVal && toRaw(newVal) !== toRaw(oldVal) && Array.isArray(newVal)) { + formKeys.value = newVal.map(() => genId()); + } + }, { + deep: true + }); + + // 处理了key的formData + const itemsFormData = computed(() => curFormData.value.map((item, index) => ({ + key: formKeys.value[index], + value: item + }))); + + // 获取一个新item + const getNewFormDataRow = () => { + const { schema, rootSchema } = props; + let itemSchema = schema.items; + + // https://json-schema.org/understanding-json-schema/reference/array.html#tuple-validation + // 数组为项的集合搭配additionalItems属性需要特殊处理 + if (isFixedItems(schema) && allowAdditionalItems(schema)) { + itemSchema = schema.additionalItems; + } + return getDefaultFormState(itemSchema, undefined, rootSchema); + }; + + const handleArrayOperate = ({ + command, + data + }) => { + // 统一处理数组数据的 新增,删除,排序等变更 + const strategyMap = { + moveUp(target, { index }) { + arrayMethods.moveUpAt(target, index); + }, + moveDown(target, { index }) { + arrayMethods.moveDownAt(target, index); + }, + remove(target, { index }) { + arrayMethods.removeAt(target, index); + }, + add(target, { newRowData }) { + target.push(newRowData); + }, + batchPush(target, { pushArray }) { + pushArray.forEach((item) => { + target.push(item); + }); + }, + setNewTarget(target, { formData, nodePath, newTarget }) { + setPathVal(formData, nodePath, newTarget); + } + }; + + const curStrategy = strategyMap[command]; + if (curStrategy) { + let formDataPrams = data; + let keysParams = data; + + if (command === 'add') { + // 单个添加 + formDataPrams = { newRowData: getNewFormDataRow() }; + keysParams = { newRowData: genId() }; + } else if (command === 'batchPush') { + // 批量添加 + keysParams = { + pushArray: formDataPrams.pushArray.map(item => genId()) + }; + } else if (command === 'setNewTarget') { + // 设置 + formDataPrams = { + formData: props.rootFormData, + nodePath: props.curNodePath, + newTarget: formDataPrams.newTarget + }; + keysParams = { + formData: formKeys, + nodePath: 'value', + newTarget: formDataPrams.newTarget.map(item => genId()) + }; + } + + // 同步修改 formData keys + curStrategy.apply(null, [formKeys.value, keysParams]); + + // 修改formData数据 + curStrategy.apply(null, [curFormData.value, formDataPrams]); + } else { + throw new Error(`错误 - 未知的操作:[${command}]`); + } + }; + + return () => { + const { + schema, + uiSchema, + rootSchema, + rootFormData, + curNodePath, + globalOptions + } = props; + + if (!schema.hasOwnProperty('items')) { + throw new Error(`[${schema}] 请先定义 items属性`); + } + + // 多选类型 + if (isMultiSelect(schema, rootSchema)) { + // item 为枚举固定值 + return h(ArrayFieldMultiSelect, { + ...props, + class: { + [lowerCase(ArrayFieldMultiSelect.name)]: true + } + }); + } + + // 特殊处理 date datetime time url-upload + // array 支持配置 ui:widget + // 时间日期区间 或者 ui:widget 特殊配置 + if (schema.format || schema['ui:widget'] || uiSchema['ui:widget']) { + return h(ArrayFieldSpecialFormat, { + ...props, + class: { + [lowerCase(ArrayFieldSpecialFormat.name)]: true + } + }); + } + + // https://json-schema.org/understanding-json-schema/reference/array.html#list-validation + // https://json-schema.org/understanding-json-schema/reference/array.html#tuple-validation + const CurrentField = isFixedItems(schema) ? ArrayFieldTuple : ArrayFieldNormal; + + return h('div', [ + h(CurrentField, { + itemsFormData: itemsFormData.value, + ...props, + onArrayOperate: handleArrayOperate, + class: { + [lowerCase(CurrentField.name)]: true + } + }), + + // 插入一个Widget,校验 array - maxItems. minItems. uniqueItems 等items外的属性校验 + props.needValidFieldGroup ? h(Widget, { + key: 'validateWidget-array', + class: { + validateWidget: true, + 'validateWidget-array': true + }, + schema: Object.entries(schema).reduce((preVal, [key, value]) => { + if (key !== 'items') preVal[key] = value; + return preVal; + }, {}), + uiSchema, + errorSchema: props.errorSchema, + curNodePath, + rootFormData, + globalOptions + }) : null + ]); + }; + }, +}; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/BooleanField/index.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/BooleanField/index.js new file mode 100644 index 000000000..6f03c24f4 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/BooleanField/index.js @@ -0,0 +1,47 @@ +/** + * Created by Liu.Jun on 2020/4/23 10:50. + */ + +import { h } from 'vue'; +import { getWidgetConfig, optionsList } from '@lljj/vjsf-utils/formUtils'; + +import Widget from '../../components/Widget'; +import vueProps from '../props'; + +export default { + name: 'BooleanField', + props: vueProps, + setup(props, { attrs }) { + return () => { + const { + schema, uiSchema, curNodePath, rootFormData, globalOptions + } = props; + + // Bool 会默认传入枚举类型选项 true false + const enumOptions = optionsList({ + enumNames: schema.enumNames || ['true', 'false'], + enum: schema.enum || [true, false] + }, uiSchema, curNodePath, rootFormData); + + const widgetConfig = getWidgetConfig({ + schema, + uiSchema, + curNodePath, + rootFormData + }, () => ({ + widget: globalOptions.WIDGET_MAP.types.boolean + })); + + widgetConfig.uiProps.enumOptions = widgetConfig.uiProps.enumOptions || enumOptions; + + return h( + Widget, + { + ...attrs, + ...props, + ...widgetConfig + } + ); + }; + } +}; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/IntegerField/index.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/IntegerField/index.js new file mode 100644 index 000000000..e64751dd9 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/IntegerField/index.js @@ -0,0 +1,19 @@ +/** + * Created by Liu.Jun on 2020/4/21 9:24. + * IntegerField 复用StringField + */ + +import { h } from 'vue'; +import vueProps from '../props'; +import StringField from '../StringField'; + +export default { + name: 'IntegerField', + props: vueProps, + setup(props, { attrs }) { + return () => h(StringField, { + ...props, + ...attrs + }); + } +}; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/NumberField/index.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/NumberField/index.js new file mode 100644 index 000000000..673d54159 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/NumberField/index.js @@ -0,0 +1,19 @@ +/** + * Created by Liu.Jun on 2020/4/21 9:24. + * NumberField 复用StringField + */ + +import { h } from 'vue'; +import vueProps from '../props'; +import StringField from '../StringField'; + +export default { + name: 'NumberField', + props: vueProps, + setup(props, { attrs }) { + return () => h(StringField, { + ...props, + ...attrs + }); + } +}; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/ObjectField/index.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/ObjectField/index.js new file mode 100644 index 000000000..0fcee4a08 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/ObjectField/index.js @@ -0,0 +1,128 @@ +/** + * Created by Liu.Jun on 2020/4/21 9:24. + */ + +import { h } from 'vue'; + +import { orderProperties, getUiOptions } from '@lljj/vjsf-utils/formUtils'; +import { computedCurPath, getPathVal } from '@lljj/vjsf-utils/vue3Utils'; +import { isObject } from '@lljj/vjsf-utils/utils'; +import FieldGroupWrap from '@lljj/vjsf-utils/components/FieldGroupWrap'; +import vueProps from '../props'; +import Widget from '../../components/Widget'; + +// eslint-disable-next-line import/no-cycle +import SchemaField from '../SchemaField'; + +export default { + name: 'ObjectField', + props: vueProps, + setup(props) { + // required + const isRequired = name => Array.isArray(props.schema.required) && !!~props.schema.required.indexOf(name); + + // 存在 dependencies 配置,需要当前属性是否存在依赖关系 和当前属性是否正在被依赖 + // tip: 判断依赖关系需要使用了 formData 的值来做判断,所以当用户输入的时候会触发整个对象树重新渲染 + // TODO: 每个属性都需要单独来遍历 dependencies 属性可以优化一点点点点点(可通过 key value 反转值加个缓存来计算) + const isDependOn = (name) => { + let isDependency = false; // 是否是一个被依赖项 + let curDependent = false; // 当前是否触发依赖 + + if (isObject(props.schema.dependencies)) { + curDependent = Object.entries(props.schema.dependencies).some(([key, value]) => { + + // 是否和当前属性存在依赖关系 + const tempDependency = !!(Array.isArray(value) && ~value.indexOf(name)); + + // 是否是一个被依赖项 + isDependency = isDependency || tempDependency; + + // 当前需要依赖 + return tempDependency && getPathVal(props.rootFormData, props.curNodePath)[key] !== undefined; + }); + } + + return { + isDependency, + curDependent + }; + }; + + return () => { + const curNodePath = props.curNodePath; + const { + title, description, showTitle, showDescription, order, fieldClass, fieldAttrs, fieldStyle, onlyShowIfDependent + } = getUiOptions({ + schema: props.schema, + uiSchema: props.uiSchema, + curNodePath, + rootFormData: props.rootFormData + }); + + const properties = Object.keys(props.schema.properties || {}); + const orderedProperties = orderProperties(properties, order); + + // 递归参数 + const propertiesVNodeList = orderedProperties.map((name) => { + const required = isRequired(name); + const { isDependency, curDependent } = isDependOn(name); + + // onlyShowWhenDependent 只渲染被依赖的属性 + return (isDependency && onlyShowIfDependent && !curDependent) ? null : h( + SchemaField, + { + key: name, + ...props, + schema: props.schema.properties[name], + uiSchema: props.uiSchema[name], + errorSchema: props.errorSchema[name], + required: required || curDependent, + curNodePath: computedCurPath(curNodePath, name) + } + ); + }); + + return h( + FieldGroupWrap, + { + title, + description, + showTitle, + showDescription, + curNodePath, + class: { ...fieldClass }, + style: fieldStyle, + ...fieldAttrs + }, + { + default: () => [ + ...propertiesVNodeList, + + // 插入一个Widget,校验 object组 - minProperties. maxProperties. oneOf 等需要外层校验的数据 + ...props.needValidFieldGroup ? [ + h(Widget, { + key: 'validateWidget-object', + class: { + validateWidget: true, + 'validateWidget-object': true + }, + schema: Object.entries(props.schema).reduce((preVal, [key, value]) => { + if ( + props.schema.additionalProperties === false + || !['properties', 'id', '$id'].includes(key) + ) preVal[key] = value; + return preVal; + }, {}), + uiSchema: props.uiSchema, + errorSchema: props.errorSchema, + curNodePath, + rootFormData: props.rootFormData, + globalOptions: props.globalOptions + }) + ] : [] + ] + } + ); + }; + } +}; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/SchemaField/index.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/SchemaField/index.js new file mode 100644 index 000000000..393b6fe64 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/SchemaField/index.js @@ -0,0 +1,77 @@ +/** + * Created by Liu.Jun on 2020/4/20 9:55 下午. + */ + +import { h } from 'vue'; + +import { getUiField, isHiddenWidget, isSelect } from '@lljj/vjsf-utils/formUtils'; +import { nodePath2ClassName, resolveComponent } from '@lljj/vjsf-utils/vue3Utils'; +import { lowerCase } from '@lljj/vjsf-utils/utils'; +import retrieveSchema from '@lljj/vjsf-utils/schema/retriev'; + +import FIELDS_MAP from '../../FIELDS_MAP'; +import vueProps from '../props'; + +export default { + name: 'SchemaField', + props: vueProps, + setup(props) { + return () => { + // 目前不支持schema依赖和additionalProperties 展示不需要传递formData + // const schema = retrieveSchema(props.schema, props.rootSchema, formData); + const schema = retrieveSchema(props.schema, props.rootSchema); + + // 当前参数 + const curProps = { ...props, schema }; + + // 空数据 + if (Object.keys(schema).length === 0) return null; + + // 获取节点Ui配置渲染field组件 + const { field: fieldComponent, fieldProps } = getUiField(FIELDS_MAP, curProps); + + // hidden + const hiddenWidget = isHiddenWidget({ + schema, + uiSchema: props.uiSchema, + curNodePath: props.curNodePath, + rootFormData: props.rootFormData + }); + + const pathClassName = nodePath2ClassName(props.curNodePath); + + if (schema.anyOf && schema.anyOf.length > 0 && !isSelect(schema)) { + // anyOf + return h(resolveComponent(FIELDS_MAP.anyOf), { + class: { + [`${pathClassName}-anyOf`]: true, + fieldItem: true, + anyOfField: true + }, + ...curProps + }); + } if (schema.oneOf && schema.oneOf.length > 0 && !isSelect(schema)) { + // oneOf + return h(resolveComponent(FIELDS_MAP.oneOf), { + class: { + [`${pathClassName}-oneOf`]: true, + fieldItem: true, + oneOfField: true + }, + ...curProps + }); + } + + return (fieldComponent && !hiddenWidget) ? h(resolveComponent(fieldComponent), { + ...curProps, + fieldProps, + class: { + [lowerCase(fieldComponent.name) || fieldComponent]: true, + hiddenWidget, + fieldItem: true, + [pathClassName]: true + } + }) : null; + }; + } +}; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/StringField/index.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/StringField/index.js new file mode 100644 index 000000000..2245c91e0 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/StringField/index.js @@ -0,0 +1,55 @@ +/** + * Created by Liu.Jun on 2020/4/21 9:24. + */ + +import { h, computed } from 'vue'; + +import { getWidgetConfig, isSelect, optionsList } from '@lljj/vjsf-utils/formUtils'; +import vueProps from '../props'; +import Widget from '../../components/Widget'; + +export default { + name: 'StringField', + props: vueProps, + setup(props, { attrs }) { + const widgetConfig = computed(() => { + // 可能是枚举数据使用select组件,否则使用 input + const enumOptions = isSelect(props.schema) + && optionsList(props.schema, props.uiSchema, props.curNodePath, props.rootFormData); + + const tempWidgetConfig = getWidgetConfig({ + schema: props.schema, + uiSchema: props.uiSchema, + curNodePath: props.curNodePath, + rootFormData: props.rootFormData, + }, () => { + const isNumber = props.schema.type === 'number' || props.schema.type === 'integer'; + + return { + widget: enumOptions + ? props.globalOptions.WIDGET_MAP.common.select + : ( + props.globalOptions.WIDGET_MAP.formats[props.schema.format] + || (isNumber ? props.globalOptions.WIDGET_MAP.types.number : props.globalOptions.WIDGET_MAP.types.string) + ) + }; + }); + + // 存在枚举数据列表 传入 enumOptions + if (enumOptions && !tempWidgetConfig.uiProps.enumOptions) { + tempWidgetConfig.uiProps.enumOptions = enumOptions; + } + + return tempWidgetConfig; + }); + + return () => h( + Widget, + { + ...props, + ...attrs, + ...widgetConfig.value + } + ); + } +}; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/combiningSchemas/AnyOfField/index.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/combiningSchemas/AnyOfField/index.js new file mode 100644 index 000000000..c8bc05106 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/combiningSchemas/AnyOfField/index.js @@ -0,0 +1,17 @@ +/** + * Created by Liu.Jun on 2020/5/19 9:49 下午. + */ + +import { h } from 'vue'; +import SelectLinkageField from '../SelectLinkageField'; + +export default { + name: 'AnyOfField', + setup(props, { attrs, slots }) { + return () => h(SelectLinkageField, { + ...attrs, + combiningType: 'anyOf', + selectList: attrs.schema.anyOf + }, slots); + } +}; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/combiningSchemas/OneOfField/index.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/combiningSchemas/OneOfField/index.js new file mode 100644 index 000000000..14061f7c8 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/combiningSchemas/OneOfField/index.js @@ -0,0 +1,17 @@ +/** + * Created by Liu.Jun on 2020/5/19 9:49 下午. + */ + +import { h } from 'vue'; +import SelectLinkageField from '../SelectLinkageField'; + +export default { + name: 'oneOfField', + setup(props, { attrs, slots }) { + return () => h(SelectLinkageField, { + ...attrs, + combiningType: 'oneOf', + selectList: attrs.schema.oneOf + }, slots); + } +}; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/combiningSchemas/SelectLinkageField/index.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/combiningSchemas/SelectLinkageField/index.js new file mode 100644 index 000000000..70e88a4cc --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/combiningSchemas/SelectLinkageField/index.js @@ -0,0 +1,289 @@ +/** + * Created by Liu.Jun on 2020/5/19 10:15 下午. + */ + + +import { ref, watch, h } from 'vue'; +import { + getPathVal, setPathVal, deletePathVal, nodePath2ClassName +} from '@lljj/vjsf-utils/vue3Utils'; +import { + isEmptyObject, filterObject, isObject, getSchemaType +} from '@lljj/vjsf-utils/utils'; + +import { + getWidgetConfig, getUiOptions, getUserErrOptions +} from '@lljj/vjsf-utils/formUtils'; + +import retrieveSchema from '@lljj/vjsf-utils/schema/retriev'; +import getDefaultFormState from '@lljj/vjsf-utils/schema/getDefaultFormState'; +import { getMatchingOption } from '@lljj/vjsf-utils/schema/validate'; + +import vueProps from '../../props'; +import Widget from '../../../components/Widget'; +import SchemaField from '../../SchemaField'; + +export default { + name: 'SelectLinkageField', + props: { + ...vueProps, + combiningType: { + type: String, + default: 'anyOf' // anyOf oneOf + }, + selectList: { + type: Array, + require: true + } + }, + setup(props) { + const computedCurSelectIndexByFormData = (formData) => { + const index = getMatchingOption(formData, props.selectList, props.rootSchema, true); + return index || 0; + }; + + // 当前选中 option 项 + const curSelectIndex = ref(computedCurSelectIndexByFormData(getPathVal(props.rootFormData, props.curNodePath))); + + // 下拉选项 VNode + const getSelectBoxVNode = () => { + // 下拉选项参数 + const selectWidgetConfig = getWidgetConfig({ + schema: props.schema[`${props.combiningType}Select`] || {}, // 扩展 oneOfSelect,anyOfSelect字段 + uiSchema: props.uiSchema[`${props.combiningType}Select`] || {}, // 通过 uiSchema['oneOf'] 配置ui信息 + curNodePath: props.curNodePath, + rootFormData: props.rootFormData, + }, () => ({ + // 枚举参数 + widget: 'SelectWidget' + })); + + // title description 回退到 schema 配置,但这里不使用 uiSchema配置 + // select ui配置需要使用 (oneOf|anyOf)Select + selectWidgetConfig.label = selectWidgetConfig.label || props.schema.title; + selectWidgetConfig.description = selectWidgetConfig.description || props.schema.description; + + // 下拉列表枚举值 + if (!selectWidgetConfig.uiProps.enumOptions) { + const uiSchemaSelectList = props.uiSchema[props.combiningType] || []; + selectWidgetConfig.uiProps.enumOptions = props.selectList.map((option, index) => { + const curUiOptions = getUiOptions({ + schema: option, + uiSchema: uiSchemaSelectList[index], + containsSpec: false, + // curNodePath: props.curNodePath, + // rootFormData: props.rootFormData, + }); + return { + label: curUiOptions.title || `选项 ${index + 1}`, + value: index, + }; + }); + } + + // oneOf option 渲染 + // 选择框 VNode + return h( + Widget, + { + key: `fieldSelect_${props.combiningType}`, + class: { + [`fieldSelect_${props.combiningType}`]: true + }, + isFormData: false, + curValue: curSelectIndex.value, + curNodePath: props.curNodePath, + rootFormData: props.rootFormData, + globalOptions: props.globalOptions, + ...selectWidgetConfig, + onOtherDataChange: (event) => { + curSelectIndex.value = event; + } + } + ); + }; + + // 对象 切换了select + // 如果object 类型 option有添加属性 这里做移除 + // 对新option计算默认值 + watch(curSelectIndex, (newVal, oldVal) => { + const curFormData = getPathVal(props.rootFormData, props.curNodePath); + + // 计算出 新选项默认值 + const newOptionData = getDefaultFormState(props.selectList[newVal], undefined, props.rootSchema); + + const hasOwn = Object.prototype.hasOwnProperty; + + // 移除旧key + if (isObject(curFormData)) { + const oldSelectSchema = retrieveSchema( + props.selectList[oldVal], + props.rootSchema + ); + if (getSchemaType(oldSelectSchema) === 'object') { + // 移除旧schema添加的属性 + // Object.keys(oldSelectSchema.properties) + for (const key in oldSelectSchema.properties) { + if ( + hasOwn.call(oldSelectSchema.properties, key) + && !hasOwn.call(newOptionData, key) + ) { + deletePathVal(curFormData, key); + } + } + } + } + + // 设置新值 + if (isObject(newOptionData)) { + Object.entries(newOptionData).forEach(([key, value]) => { + if ( + value !== undefined + && ( + curFormData[key] === undefined + || props.selectList[newVal].properties[key].const !== undefined + || isObject(value) + ) + ) { + // 这里没找到一个比较合理的新旧值合并方式 + // + // 1. 如果anyOf里面同名属性中的schema包含了 const 配置,产生了新的值这里做覆盖处理 + // 2. 其它场景保留同名key的旧的值 + setPathVal(curFormData, key, value); + } + }); + } else { + setPathVal(props.rootFormData, props.curNodePath, newOptionData || curFormData); + } + }); + + return () => { + const { curNodePath } = props; + const pathClassName = nodePath2ClassName(curNodePath); + + // is object + const isTypeObject = (props.schema.type === 'object' || props.schema.properties); + + // 选择附加的节点 + const childrenVNodeList = [getSelectBoxVNode()]; + + // 当前option内容 + let curSelectSchema = props.selectList[curSelectIndex.value]; + + // 当前选中节点合并schema + if (curSelectSchema) { + // 覆盖父级的属性 + const { + // eslint-disable-next-line no-unused-vars + properties, + // eslint-disable-next-line no-unused-vars + [props.combiningType]: combiningType, + // eslint-disable-next-line no-unused-vars + [`${props.combiningType}Select`]: combiningTypeSelect, + ...parentSchema + } = props.schema; + + curSelectSchema = Object.assign({}, parentSchema, curSelectSchema); + } + + // object类型但没有附加属性 + const isObjectEmptyAttachProperties = isTypeObject && isEmptyObject(curSelectSchema && curSelectSchema.properties); + + if (curSelectSchema && !isObjectEmptyAttachProperties) { + // 当前节点的ui err配置,用来支持所有选项的统一配置 + // 取出 oneOf anyOf 同级配置,然后再合并到 当前选中的schema中 + const userUiOptions = filterObject(getUiOptions({ + schema: props.schema, + uiSchema: props.uiSchema, + containsSpec: false, + curNodePath, + rootFormData: props.rootFormData, + }), key => (key === props.combiningType ? undefined : `ui:${key}`)); + + const userErrOptions = filterObject(getUserErrOptions({ + schema: props.schema, + uiSchema: props.uiSchema, + errorSchema: props.errorSchema + }), key => (key === props.combiningType ? undefined : `err:${key}`)); + + childrenVNodeList.push( + h( + SchemaField, + { + key: `appendSchema_${props.combiningType}`, + ...props, + schema: { + 'ui:showTitle': false, // 默认不显示title + 'ui:showDescription': false, // 默认不显示描述 + ...curSelectSchema, + }, + required: props.required, + uiSchema: { + ...userUiOptions, // 合并oneOf 级的配置 + ...((props.uiSchema[props.combiningType] || [])[curSelectIndex.value]) + }, + errorSchema: { + ...userErrOptions, // 合并oneOf 级的配置 + ...((props.errorSchema[props.combiningType] || [])[curSelectIndex.value]) + }, + // needValidFieldGroup: false // 单独校验,这里无需处理 + } + ) + ); + } + + // object 需要保持原有属性,如果存在原有属性这里单独渲染 + let originVNode = null; + if (isTypeObject && !isEmptyObject(props.schema.properties)) { + const { + // eslint-disable-next-line no-unused-vars + title, description, properties, ...optionSchema + } = curSelectSchema; + + // object 原始项渲染也需要合并anyOf的内容 + const origSchema = Object.assign({}, props.schema, optionSchema); + delete origSchema[props.combiningType]; + + originVNode = h(SchemaField, { + key: `origin_${props.combiningType}`, + class: { + [`${props.combiningType}_originBox`]: true, + [`${pathClassName}-originBox`]: true + }, + ...props, + schema: origSchema, + // needValidFieldGroup: false // 单独校验,这里无需处理 + }); + } + + // oneOf 校验 VNode + childrenVNodeList.push( + h(Widget, { + key: `validateWidget-${props.combiningType}`, + class: { + validateWidget: true, + [`validateWidget-${props.combiningType}`]: true + }, + schema: props.schema, + uiSchema: props.uiSchema, + errorSchema: props.errorSchema, + curNodePath: props.curNodePath, + rootFormData: props.rootFormData, + globalOptions: props.globalOptions + }) + ); + + return h('div', [ + originVNode, + h('div', { + key: `appendBox_${props.combiningType}`, + class: { + appendCombining_box: true, + [`${props.combiningType}_appendBox`]: true, + [`${pathClassName}-appendBox`]: true + } + }, childrenVNodeList) + ]); + }; + } +}; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/props.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/props.js new file mode 100644 index 000000000..35387a679 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/fields/props.js @@ -0,0 +1,65 @@ +/** + * Created by Liu.Jun on 2020/4/22 18:58. + */ + +// 递归参数,统一props +export default { + formProps: { + type: null + }, + // 全局的配置,用于 初始化差异,适配不同的ui框架 + globalOptions: { + type: null + }, + // 当前节点schema + schema: { + type: Object, + default: () => ({}) + }, + // 当前节点Ui Schema + uiSchema: { + type: Object, + default: () => ({}) + }, + // 当前节点Error Schema + errorSchema: { + type: Object, + default: () => ({}) + }, + // 自定义校验 + customRule: { + type: Function, + default: null + }, + // 自定义校验规则 + customFormats: { + type: Object, + default: () => ({}) + }, + // 根节点 Schema + rootSchema: { + type: Object, + default: () => ({}) + }, + // 根节点的数据 + rootFormData: { + type: null, + default: () => ({}) + }, + // 当前节点路径 + curNodePath: { + type: String, + default: '' + }, + // 是否必填 + required: { + type: Boolean, + default: false + }, + // 是否需要校验数据组 + // object array 类型默认会最后追加一个校验组件校验整体数据 + needValidFieldGroup: { + type: Boolean, + default: true + } +}; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/index.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/index.js new file mode 100644 index 000000000..4d6504ad7 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/index.js @@ -0,0 +1,209 @@ +/** + * Created by Liu.Jun on 2020/4/16 17:32. + */ + +import { + getCurrentInstance, watch, ref, computed, h, provide +} from 'vue'; + +import { resolveComponent } from '@lljj/vjsf-utils/vue3Utils'; + +// 生成form表单默认数据 +import getDefaultFormState from '@lljj/vjsf-utils/schema/getDefaultFormState'; +import { deepEquals } from '@lljj/vjsf-utils/utils'; + +// 基础公共样式 +import '@lljj/vjsf-utils/style/baseForm.scss'; + +import vueProps from './props'; + +// 默认表单底部 +import FormFooter from './components/FormFooter.js'; + +import SchemaField from './fields/SchemaField'; +import fieldProps from './fields/props'; + +export { + fieldProps, + SchemaField +}; + +export default function createForm(globalOptions = {}) { + const Form = { + name: 'VueForm', + props: vueProps, + emits: ['update:modelValue', 'change', 'cancel', 'submit', 'validation-failed', 'form-mounted'], + setup(props, { slots, emit }) { + // global components + const internalInstance = getCurrentInstance(); + if (!Form.installed && globalOptions.WIDGET_MAP.widgetComponents) { + Object.entries(globalOptions.WIDGET_MAP.widgetComponents).forEach( + ([componentName, component]) => internalInstance.appContext.app.component(componentName, component) + ); + + // 只注册一次 + Form.installed = true; + } + + // 使用provide 传递跨组件数据 + provide('genFormProvide', computed(() => ({ + fallbackLabel: props.fallbackLabel + }))); + + // rootFormData + const rootFormData = ref(getDefaultFormState(props.schema, props.modelValue, props.schema, props.strictMode)); + const footerParams = computed(() => ({ + show: true, + okBtn: '保存', + okBtnProps: {}, + cancelBtn: '取消', + ...props.formFooter + })); + + // form组件实例,不需要响应式 + let formRef = null; + + // 更新formData + const emitFormDataChange = (newValue, oldValue) => { + // 支持v-model ,引用类型 + emit('update:modelValue', newValue); + + // change 事件,引用类型修改属性 newValue + emit('change', { + newValue, + oldValue + }); + }; + + // 更新props + const willReceiveProps = (newVal, oldVal) => { + if (!deepEquals(newVal, oldVal)) { + const tempVal = getDefaultFormState(props.schema, props.modelValue, props.schema, props.strictMode); + if (!deepEquals(rootFormData.value, tempVal)) { + rootFormData.value = tempVal; + } + } + }; + + // emit v-model,同步值 + watch(rootFormData, (newValue, oldValue) => { + emitFormDataChange(newValue, oldValue); + }, { + deep: true + }); + + // schema 被重新赋值 + watch(() => props.schema, (newVal, oldVal) => { + willReceiveProps(newVal, oldVal); + }); + + // model value 变更 + watch(() => props.modelValue, (newVal, oldVal) => { + willReceiveProps(newVal, oldVal); + }); + + // 保持v-model双向数据及时性 + emitFormDataChange(rootFormData.value, props.modelValue); + + const getDefaultSlot = () => { + if (slots.default) { + return slots.default({ + formData: rootFormData, + formRefFn: () => formRef + }); + } + + if (footerParams.value.show) { + return h(FormFooter, { + globalOptions, + okBtn: footerParams.value.okBtn, + okBtnProps: footerParams.value.okBtnProps, + cancelBtn: footerParams.value.cancelBtn, + formItemAttrs: footerParams.value.formItemAttrs, + onCancel() { + emit('cancel'); + }, + onSubmit() { + // 优先获取组件 $$validate 方法,方便对 validate方法转换 + (formRef.$$validate || formRef.validate)((isValid, resData) => { + if (isValid) { + return emit('submit', rootFormData); + } + console.warn(resData); + return emit('validation-failed', resData); + }); + } + }); + } + + return []; + }; + + return () => { + const { + layoutColumn = 1, inlineFooter, ...otherFormProps + } = props.formProps; + const schemaProps = { + schema: props.schema, + uiSchema: props.uiSchema, + errorSchema: props.errorSchema, + customFormats: props.customFormats, + customRule: props.customRule, + rootSchema: props.schema, + rootFormData: rootFormData.value, // 根节点的数据 + curNodePath: '', // 当前节点路径 + globalOptions, // 全局配置,差异化ui框架 + formProps: { + labelSuffix: ':', + labelPosition: 'top', + ...otherFormProps, + } + }; + + const inline = otherFormProps.inline; + return h( + resolveComponent(globalOptions.COMPONENT_MAP.form), + { + class: { + genFromComponent: true, + formInlineFooter: inlineFooter, + formInline: inline, + [`genFromComponent_${props.schema.id}Form`]: !!props.schema.id, + layoutColumn: !inline, + [`layoutColumn-${layoutColumn}`]: !inline + }, + setFormRef: (form) => { + formRef = form; + internalInstance.ctx.$$uiFormRef = formRef; + + emit('form-mounted', form, { + formData: rootFormData.value + }); + }, + // 阻止form默认submit + onSubmit(e) { + e.preventDefault(); + }, + model: rootFormData, + ...schemaProps.formProps + }, + { + default: () => [ + h( + SchemaField, + schemaProps + ), + getDefaultSlot(), + ] + } + ); + }; + }, + }; + + Form.install = (vueApp, options = {}) => { + vueApp.component(options.name || Form.name, Form); + }; + + return Form; +} diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/props.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/props.js new file mode 100644 index 000000000..2fbb6a80a --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-core/src/props.js @@ -0,0 +1,56 @@ +/** + * Created by Liu.Jun on 2020/4/16 10:47 下午. + */ + +export default { + formFooter: { + type: Object, + default: () => ({ + show: true, + okBtn: '保存', + cancelBtn: '取消', + }), + }, + modelValue: { + type: null, + default: () => ({}), + required: true + }, + fallbackLabel: { + type: Boolean, + default: false, + }, + strictMode: { + type: Boolean, + default: false, + }, + formProps: { + type: Object, + default: () => ({}), + }, + schema: { + type: Object, + default: () => ({}), + required: true + }, + // 重置ui样式 + uiSchema: { + type: Object, + default: () => ({}) + }, + // 自定义校验规则 + customFormats: { + type: Object, + default: () => ({}) + }, + // 自定义校验 + customRule: { + type: Function, + default: null + }, + // 重置自定义错误 + errorSchema: { + type: Object, + default: () => ({}) + } +}; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/CHANGELOG.md b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/CHANGELOG.md new file mode 100644 index 000000000..07a2e7c0e --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/CHANGELOG.md @@ -0,0 +1,272 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [1.12.2](https://github.com/lljj-x/vue-json-schema-form/compare/v1.12.1...v1.12.2) (2022-04-11) + +**Note:** Version bump only for package @lljj/vue3-form-naive + + + + + +## [1.12.1](https://github.com/lljj-x/vue-json-schema-form/compare/v1.12.0...v1.12.1) (2022-04-05) + +**Note:** Version bump only for package @lljj/vue3-form-naive + + + + + +# [1.12.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.11.0...v1.12.0) (2022-03-08) + + +### Bug Fixes + +* **lib:** 添加严格模式配置,更精准计算anyOf 默认值 ([10cdc08](https://github.com/lljj-x/vue-json-schema-form/commit/10cdc089087d83d8fe08e1fd379b7a1aaad0cd5d)), closes [#152](https://github.com/lljj-x/vue-json-schema-form/issues/152) +* **ts:** 修复类型定义文件 ([18a7058](https://github.com/lljj-x/vue-json-schema-form/commit/18a70581d4471055a9d1c78eef6e012f37ddd8cb)) + + +### Features + +* **lib:** 添加vue3 naiveui支持 ([a159c78](https://github.com/lljj-x/vue-json-schema-form/commit/a159c78eb1a9156aa042a0cf82a350c46e035dcc)), closes [#152](https://github.com/lljj-x/vue-json-schema-form/issues/152) + + + + + +# [1.11.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.10.0...v1.11.0) (2022-02-19) + +**Note:** Version bump only for package @lljj/vue3-form-element + + + + + +# [1.10.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.9.5...v1.10.0) (2021-11-28) + + +### Features + +* **lib:** 添加 $$uiFormRef 属性,可在mounted 之直接访问子组件实例 ([08c6c4f](https://github.com/lljj-x/vue-json-schema-form/commit/08c6c4f2d247b4881e88fa380de8980c31cc5cd7)), closes [#127](https://github.com/lljj-x/vue-json-schema-form/issues/127) + + + + + +## [1.9.5](https://github.com/lljj-x/vue-json-schema-form/compare/v1.9.4...v1.9.5) (2021-11-21) + +**Note:** Version bump only for package @lljj/vue3-form-element + + + + + +## [1.9.4](https://github.com/lljj-x/vue-json-schema-form/compare/v1.9.3...v1.9.4) (2021-11-02) + +**Note:** Version bump only for package @lljj/vue3-form-element + + + + + +## [1.9.3](https://github.com/lljj-x/vue-json-schema-form/compare/v1.9.2...v1.9.3) (2021-10-10) + + +### Bug Fixes + +* **lib:** allOf merge 相同类型直接使用左边 ([c0bd0cd](https://github.com/lljj-x/vue-json-schema-form/commit/c0bd0cde9f15b4ca928fec84b4831a5cb459aa43)), closes [#116](https://github.com/lljj-x/vue-json-schema-form/issues/116) + + + + + +## [1.9.2](https://github.com/lljj-x/vue-json-schema-form/compare/v1.9.1...v1.9.2) (2021-09-25) + +**Note:** Version bump only for package @lljj/vue3-form-element + + + + + +## [1.9.1](https://github.com/lljj-x/vue-json-schema-form/compare/v1.9.0...v1.9.1) (2021-09-22) + +**Note:** Version bump only for package @lljj/vue3-form-element + + + + + +# [1.9.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.7.0...v1.9.0) (2021-09-06) + +**Note:** Version bump only for package @lljj/vue3-form-element + + + + + +# [1.8.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.7.0...v1.8.0) (2021-09-06) + +**Note:** Version bump only for package @lljj/vue3-form-element + + + + + +# [1.7.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.6.4...v1.7.0) (2021-08-29) + + +### Features + +* **lib:** 支持配置 slots ([27f1501](https://github.com/lljj-x/vue-json-schema-form/commit/27f1501eda01eabd4a723656be56904e9cb0f069)), closes [#45](https://github.com/lljj-x/vue-json-schema-form/issues/45) + + + + + +## [1.6.3](https://github.com/lljj-x/vue-json-schema-form/compare/v1.6.2...v1.6.3) (2021-07-12) + +**Note:** Version bump only for package @lljj/vue3-form-element + + + + + +## [1.6.2](https://github.com/lljj-x/vue-json-schema-form/compare/v1.6.1...v1.6.2) (2021-05-31) + +**Note:** Version bump only for package @lljj/vue3-form-element + + + + + +## [1.6.1](https://github.com/lljj-x/vue-json-schema-form/compare/v1.6.0...v1.6.1) (2021-05-26) + + +### Bug Fixes + +* **lib:** 修复 d.ts 申明文件错误 ([860c3b4](https://github.com/lljj-x/vue-json-schema-form/commit/860c3b42a38ac3e76b2e16c3d74a45c7cd95dfa1)) + + + + + +# [1.6.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.5.0...v1.6.0) (2021-05-22) + + +### Features + +* **lib:** form-mounted event 添加formData 参数 ([c54202c](https://github.com/lljj-x/vue-json-schema-form/commit/c54202c27304add9636a7062c05c80c60fc200a6)) + + + + + +# [1.5.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.4.0...v1.5.0) (2021-05-09) + + +### Features + +* **lib:** 优化anyOf切换选项值的复用,修复vue3 anyOf无法切换选项 ([6159160](https://github.com/lljj-x/vue-json-schema-form/commit/6159160d1727165e706343187aca129360dc011f)) + + + + + +# [1.4.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.3.0...v1.4.0) (2021-04-22) + + +### Features + +* **lib:** 调整 widget onChange prop参数格式,添加 formData参数 ([4c441fc](https://github.com/lljj-x/vue-json-schema-form/commit/4c441fce239ade40b10a42bf361c3ee920a044ed)), closes [#45](https://github.com/lljj-x/vue-json-schema-form/issues/45) + + + + + +# [1.3.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.2.1...v1.3.0) (2021-04-15) + + +### Features + +* **core:** widget 节点直接配置onChange ([2d2264b](https://github.com/lljj-x/vue-json-schema-form/commit/2d2264b004c3b6586e225c563bf03ca52fc5e53a)) + + + + + +## [1.2.1](https://github.com/lljj-x/vue-json-schema-form/compare/v1.2.0...v1.2.1) (2021-04-11) + + +### Bug Fixes + +* **lib:** 修复anyOf下多级对象初始值计算错误问题 ([6dd9780](https://github.com/lljj-x/vue-json-schema-form/commit/6dd97804573aa55001c2715da4a6ffcc5ee897b9)), closes [#57](https://github.com/lljj-x/vue-json-schema-form/issues/57) + + + + + +# [1.2.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.1.3...v1.2.0) (2021-03-30) + + +### Features + +* **lib:** 添加 fallback-label 参数 ([cd2d8c3](https://github.com/lljj-x/vue-json-schema-form/commit/cd2d8c3ed72b9bc03e44eb5b86eb1b18fe67c34c)), closes [#45](https://github.com/lljj-x/vue-json-schema-form/issues/45) + + + + + +## [1.1.3](https://github.com/lljj-x/vue-json-schema-form/compare/v1.1.2...v1.1.3) (2021-03-18) + +**Note:** Version bump only for package @lljj/vue3-form-element + + + + + +## [1.1.2](https://github.com/lljj-x/vue-json-schema-form/compare/v1.1.1...v1.1.2) (2021-03-07) + + +### Bug Fixes + +* **vue3-antd:** 修复form label 双冒号问题 ([5b4f16c](https://github.com/lljj-x/vue-json-schema-form/commit/5b4f16c3c1a4f4b784c2fd5c1fbe7eec40cf8d7b)), closes [#46](https://github.com/lljj-x/vue-json-schema-form/issues/46) + + + + + +# [1.1.0](https://github.com/lljj-x/vue-json-schema-form/compare/v1.0.2...v1.1.0) (2021-03-06) + + +### Features + +* **vue3-ant:** 更新初始化 ([71a2810](https://github.com/lljj-x/vue-json-schema-form/commit/71a281045af11f215333050396aa546dd5e78b88)), closes [#27](https://github.com/lljj-x/vue-json-schema-form/issues/27) [#27](https://github.com/lljj-x/vue-json-schema-form/issues/27) [#27](https://github.com/lljj-x/vue-json-schema-form/issues/27) [#40](https://github.com/lljj-x/vue-json-schema-form/issues/40) + + + + + +## [1.0.2](https://github.com/lljj-x/vue-json-schema-form/compare/v1.0.1...v1.0.2) (2021-01-31) + + +### Bug Fixes + +* **style:** 修复p标签等自带边距导致的样式问题  ([7b7e43e](https://github.com/lljj-x/vue-json-schema-form/commit/7b7e43eaa06c14a436b34c38d6d69aad27d67512)) + + + + + +## [0.6.1](https://github.com/lljj-x/vue-json-schema-form/compare/v0.6.0...v0.6.1) (2021-01-19) + +**Note:** Version bump only for package @lljj/vue3-form-element + + + + + +# [0.6.0](https://github.com/lljj-x/vue-json-schema-form/compare/v0.5.0...v0.6.0) (2021-01-19) + +**Note:** Version bump only for package @lljj/vue3-form-element diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/README.md b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/README.md new file mode 100644 index 000000000..f6e77b908 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/README.md @@ -0,0 +1,73 @@ +# @lljj/vue3-form-naive + +基于 [NaiveUi](https://www.naiveui.com/zh-CN/os-theme) 、Vue3、 [JSON Schema](https://json-schema.org/understanding-json-schema/index.html) 生成表单 + +> 通过 [@lljj/vue3-form-core](https://github.com/lljj-x/vue-json-schema-form/tree/master/packages/lib/vue3/vue3-core) 适配 NaiveUi 库 + +## 安装 + +```ssh +## npm +npm install --save @lljj/vue3-form-naive + +## yarn +yarn add @lljj/vue3-form-naive +``` + +## 使用 +```html + + +``` + +```js +// 使用 +import VueForm from '@lljj/vue3-form-naive'; + +export default { + name: 'Demo', + components: { + VueForm + }, + data() { + return { + formData: {}, + schema: { + type: 'object', + required: [ + 'userName', + 'age', + ], + properties: { + userName: { + type: 'string', + title: '用户名', + default: 'Liu.Jun', + }, + age: { + type: 'number', + title: '年龄' + }, + bio: { + type: 'string', + title: '签名', + minLength: 10, + default: '知道的越多、就知道的越少', + 'ui:options': { + placeholder: '请输入你的签名', + type: 'textarea', + rows: 1 + } + } + } + } + }; + } +}; +``` + +## License +Apache-2.0 diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/package.json b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/package.json new file mode 100644 index 000000000..c5d688d46 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/package.json @@ -0,0 +1,36 @@ +{ + "name": "@lljj/vue3-form-naive", + "version": "1.12.2", + "description": "基于 Vue3 、Naive、JsonSchema快速构建一个带完整校验的form表单", + "main": "src/index.js", + "module": "src/index.js", + "keywords": [ + "vue", + "vuejs", + "naive ui", + "form", + "jsonSchema" + ], + "dependencies": { + "@lljj/vjsf-utils": "1.12.2", + "@lljj/vue3-form-core": "1.12.2" + }, + "typings": "types/index.d.ts", + "files": [ + "dist/*.js", + "types/*.d.ts" + ], + "repository": "https://github.com/lljj-x/vue-json-schema-form", + "homepage": "https://github.com/lljj-x/vue-json-schema-form", + "license": "Apache-2.0", + "publishConfig": { + "access": "public" + }, + "author": "Liu.Jun", + "browserslist": [ + "> 1%", + "last 2 versions", + "not ie <= 8" + ], + "gitHead": "92795075169c879e1c1fabfe26f1d3c10b861060" +} diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/CheckboxesWidget/index.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/CheckboxesWidget/index.js new file mode 100644 index 000000000..62544b9a9 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/CheckboxesWidget/index.js @@ -0,0 +1,40 @@ +/** + * Created by Liu.Jun on 2021/2/23 10:21 下午. + */ + +import { h } from 'vue'; +import { resolveComponent, modelValueComponent } from '@lljj/vjsf-utils/vue3Utils'; + +const baseComponent = { + name: 'CheckboxesWidget', + props: { + enumOptions: { + default: () => [], + type: [Array] + } + }, + setup(props, { attrs }) { + return () => h(resolveComponent('n-checkbox-group'), attrs, { + default() { + return h(resolveComponent('n-space'), { + itemStyle: 'display: flex' + }, { + default() { + return props.enumOptions.map((item, index) => h(resolveComponent('n-checkbox'), { + key: index, + value: item.value + }, { + default: () => item.label + })); + } + }); + } + }); + } +}; + +const moduleValeComponent = modelValueComponent(baseComponent, { + model: 'value' +}); + +export default moduleValeComponent; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/CheckboxesWidget/readme.md b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/CheckboxesWidget/readme.md new file mode 100644 index 000000000..5c449d9ef --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/CheckboxesWidget/readme.md @@ -0,0 +1,15 @@ +### 文件说明 +> 默认widget直接使用element的组件,这里附加一些不能直接满足场景而使用的组件 + +### 组件说明 +单文件夹为单个组件,组件需要统一为v-model双向绑定值 + +#### CheckboxesWidget +说明:多选列表,接受value 和 enumOptions参数 +> value - array,选中的值 +> enumOptions - Array ,下拉选项 + +示例: +```js +console.log(1); +``` diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/DatePickerWidget/index.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/DatePickerWidget/index.js new file mode 100644 index 000000000..1b1c9904a --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/DatePickerWidget/index.js @@ -0,0 +1,34 @@ +/** + * Created by Liu.Jun on 2021/2/23 10:21 下午. + */ + +import { h } from 'vue'; +import { resolveComponent } from '@lljj/vjsf-utils/vue3Utils'; + +const baseComponent = { + name: 'DatePickerWidget', + inheritAttrs: false, + setup(props, { attrs }) { + return () => { + const { + isNumberValue, isRange, modelValue, 'onUpdate:modelValue': onUpdateFormattedValue, ...otherAttrs + } = attrs; + const trueValue = isRange ? (modelValue && modelValue.length === 0 ? null : modelValue) : modelValue; + + return h(resolveComponent('n-date-picker'), { + type: isRange ? 'daterange' : 'date', + ...otherAttrs, + ...isNumberValue ? { + value: trueValue, + onUpdateValue: onUpdateFormattedValue + } : { + valueFormat: isNumberValue ? 'T' : 'yyyy-MM-dd', + formattedValue: trueValue, + onUpdateFormattedValue, + } + }); + }; + } +}; + +export default baseComponent; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/DateTimePickerWidget/index.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/DateTimePickerWidget/index.js new file mode 100644 index 000000000..1fc9e4e14 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/DateTimePickerWidget/index.js @@ -0,0 +1,34 @@ +/** + * Created by Liu.Jun on 2021/2/23 10:21 下午. + */ + +import { h } from 'vue'; +import { resolveComponent } from '@lljj/vjsf-utils/vue3Utils'; + +const baseComponent = { + name: 'DatePickerWidget', + inheritAttrs: false, + setup(props, { attrs }) { + return () => { + const { + isNumberValue, isRange, modelValue, 'onUpdate:modelValue': onUpdateFormattedValue, ...otherAttrs + } = attrs; + const trueValue = isRange ? (modelValue && modelValue.length === 0 ? null : modelValue) : modelValue; + + return h(resolveComponent('n-date-picker'), { + type: isRange ? 'datetimerange' : 'datetime', + ...otherAttrs, + ...isNumberValue ? { + value: trueValue, + onUpdateValue: onUpdateFormattedValue + } : { + valueFormat: isNumberValue ? 'T' : 'yyyy-MM-dd\'T\'HH:mm:ss.SSS\'Z\'', + formattedValue: trueValue, + onUpdateFormattedValue, + } + }); + }; + } +}; + +export default baseComponent; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/RadioWidget/index.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/RadioWidget/index.js new file mode 100644 index 000000000..420e34ae8 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/RadioWidget/index.js @@ -0,0 +1,34 @@ +/** + * Created by Liu.Jun on 2021/2/23 10:21 下午. + */ + +import { h } from 'vue'; +import { modelValueComponent, resolveComponent } from '@lljj/vjsf-utils/vue3Utils'; + +const baseComponent = { + name: 'RadioWidget', + props: { + enumOptions: { + default: () => [], + type: [Array] + } + }, + setup(props, { attrs }) { + return () => h(resolveComponent('n-radio-group'), attrs, { + default() { + return props.enumOptions.map((item, index) => h(resolveComponent('n-radio'), { + key: index, + value: item.value + }, { + default: () => item.label + })); + } + }); + } +}; + +const moduleValeComponent = modelValueComponent(baseComponent, { + model: 'value' +}); + +export default moduleValeComponent; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/SelectWidget/index.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/SelectWidget/index.js new file mode 100644 index 000000000..8fc5f4f91 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/SelectWidget/index.js @@ -0,0 +1,28 @@ +/** + * Created by Liu.Jun on 2021/2/23 10:21 下午. + */ + +import { h } from 'vue'; +import { modelValueComponent, resolveComponent } from '@lljj/vjsf-utils/vue3Utils'; + +const baseComponent = { + name: 'SelectWidget', + props: { + enumOptions: { + default: () => [], + type: [Array] + } + }, + setup(props, { attrs }) { + return () => h(resolveComponent('n-select'), { + options: props.enumOptions, + ...attrs, + }); + } +}; + +const moduleValeComponent = modelValueComponent(baseComponent, { + model: 'value' +}); + +export default moduleValeComponent; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/TimePickerWidget/index.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/TimePickerWidget/index.js new file mode 100644 index 000000000..c528fb4b9 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/TimePickerWidget/index.js @@ -0,0 +1,27 @@ +/** + * Created by Liu.Jun on 2021/2/23 10:21 下午. + */ + +import { h } from 'vue'; +import { resolveComponent } from '@lljj/vjsf-utils/vue3Utils'; + +const baseComponent = { + name: 'TimePickerWidget', + inheritAttrs: false, + setup(props, { attrs }) { + return () => { + const { + modelValue, 'onUpdate:modelValue': onUpdateFormattedValue, ...otherAttrs + } = attrs; + + return h(resolveComponent('n-time-picker'), { + ...otherAttrs, + valueFormat: 'HH:mm:ss', + formattedValue: modelValue, + onUpdateFormattedValue, + }); + }; + } +}; + +export default baseComponent; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/UploadWidget/index.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/UploadWidget/index.js new file mode 100644 index 000000000..f7855ece2 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/UploadWidget/index.js @@ -0,0 +1,139 @@ +/** + * Created by Liu.Jun on 2020/11/26 10:01 下午. + */ + +import { h, ref, getCurrentInstance } from 'vue'; +import { resolveComponent } from '@lljj/vjsf-utils/vue3Utils'; + +// mock +// https://run.mocky.io/v3/518d7af7-204f-45ab-9628-a6e121dab8ca + +export default { + name: 'UploadWidget', + props: { + modelValue: { + default: null, + type: [String, Array] + }, + responseFileUrl: { + default: () => res => (res ? (res.url || (res.data && res.data.url)) : ''), + type: [Function] + }, + btnText: { + type: String, + default: '点击上传' + }, + // 传入 VNode + slots: { + type: null, + default: null + } + }, + setup(props, { attrs, emit }) { + // 设置默认 fileList + const curModelValue = props.modelValue; + const isArrayValue = Array.isArray(curModelValue); + + const defaultFileList = attrs.fileList || (() => { + if (isArrayValue) { + return curModelValue.map((item, index) => ({ + id: String(index), + status: 'finished', + name: `已上传文件(${index + 1})`, + url: item + })); + } + if (curModelValue) { + return [{ + id: '1', + status: 'finished', + name: '已上传文件', + url: curModelValue + }]; + } + + return []; + })(); + + // fileList + const fileListRef = ref(defaultFileList); + + const getUrl = (eventTarget) => { + let resJson = {}; + try { + resJson = JSON.parse(eventTarget.response); + } catch (e) { + // nothing.. + } + + return ((props.responseFileUrl(resJson)) || resJson.url) || ''; + }; + + const emitValue = (emitFileList) => { + // v-model + let curValue; + + if (isArrayValue) { + curValue = emitFileList.length ? emitFileList.reduce((pre, item) => { + const url = item.url; + if (url) pre.push(url); + return pre; + }, []) : []; + } else { + const fileItem = emitFileList[emitFileList.length - 1]; + const url = fileItem && fileItem.url; + if (url) { + curValue = url; + } + } + + emit('update:modelValue', curValue); + }; + + const globalProperties = getCurrentInstance().appContext.config.globalProperties; + + return () => { + // eslint-disable-next-line no-unused-vars + const { 'onUpdate:modelValue': onUpdate, ...otherAttrs } = attrs; + const data = { + fileList: fileListRef.value, + 'on-error': () => { + if (globalProperties.$message) { + globalProperties.$message.error('文件上传失败'); + } + }, + ...otherAttrs, + 'onUpdate:fileList': (fileList) => { + emitValue(fileList); + }, + 'on-change': ({ fileList }) => { + fileListRef.value = fileList; + }, + 'on-finish': ({ + file, + event + }) => { + // 用户注册的 onSuccess + file.url = getUrl(event.target); + return file; + } + }; + + if (!isArrayValue) data.max = 1; + + const childVNode = { + default: () => h( + resolveComponent('n-button'), + { + type: 'primary' + }, + { + default: () => props.btnText + } + ), + ...(props.slots || {}), + }; + return h(resolveComponent('n-upload'), data, childVNode); + }; + } +}; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/WIDGET_MAP.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/WIDGET_MAP.js new file mode 100644 index 000000000..7e83546a7 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/WIDGET_MAP.js @@ -0,0 +1,40 @@ +/** + * Created by Liu.Jun on 2020/4/21 18:23. + */ + +// widget 组件对应elementUi 配置表 +import widgetComponents from './index'; + +const { + CheckboxesWidget, + RadioWidget, + SelectWidget, + TimePickerWidget, + DatePickerWidget, + DateTimePickerWidget, + InputWidget, + SwitchWidget, + InputNumberWidget, + ColorWidget +} = widgetComponents; + +export default { + types: { + boolean: SwitchWidget, + string: InputWidget, + number: InputNumberWidget, + integer: InputNumberWidget, + }, + formats: { + color: ColorWidget, + time: TimePickerWidget, // 20:20:39+00:00 + date: DatePickerWidget, // 2018-11-13 + 'date-time': DateTimePickerWidget, // 2018-11-13T20:20:39+00:00 + }, + common: { + select: SelectWidget, + radioGroup: RadioWidget, + checkboxGroup: CheckboxesWidget, + }, + widgetComponents +}; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/index.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/index.js new file mode 100644 index 000000000..c12a09096 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/config/widgets/index.js @@ -0,0 +1,32 @@ +/** + * Created by Liu.Jun on 2020/5/17 10:41 下午. + */ + +import { modelValueComponent } from '@lljj/vjsf-utils/vue3Utils'; +import CheckboxesWidget from './CheckboxesWidget'; +import RadioWidget from './RadioWidget'; +import SelectWidget from './SelectWidget'; +import DatePickerWidget from './DatePickerWidget'; +import DateTimePickerWidget from './DateTimePickerWidget'; +import TimePickerWidget from './TimePickerWidget'; +import UploadWidget from './UploadWidget'; + +const widgetComponents = { + CheckboxesWidget, + RadioWidget, + SelectWidget, + TimePickerWidget, + DatePickerWidget, + DateTimePickerWidget, + UploadWidget, + InputWidget: modelValueComponent('n-input'), + ColorWidget: modelValueComponent('n-color-picker'), + TextAreaWidget: modelValueComponent('n-textarea'), + InputNumberWidget: modelValueComponent('n-input-number'), + AutoCompleteWidget: modelValueComponent('n-auto-complete'), + SliderWidget: modelValueComponent('n-slider'), + RateWidget: modelValueComponent('n-rate'), + SwitchWidget: modelValueComponent('n-switch'), +}; + +export default widgetComponents; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/index.js b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/index.js new file mode 100644 index 000000000..39002bc8c --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/index.js @@ -0,0 +1,130 @@ +/** + * Created by Liu.Jun on 2019/11/29 11:25. + */ + +import { + h, ref, onMounted, defineComponent +} from 'vue'; + +import createVue3Core, { fieldProps, SchemaField } from '@lljj/vue3-form-core'; + + +import i18n from '@lljj/vjsf-utils/i18n'; +import * as vueUtils from '@lljj/vjsf-utils/vue3Utils'; +import * as formUtils from '@lljj/vjsf-utils/formUtils'; +import * as schemaValidate from '@lljj/vjsf-utils/schema/validate'; +import getDefaultFormState from '@lljj/vjsf-utils/schema/getDefaultFormState'; +import WIDGET_MAP from './config/widgets/WIDGET_MAP.js'; + +import './style.scss'; + +const globalOptions = { + WIDGET_MAP, + COMPONENT_MAP: { + form: defineComponent({ + inheritAttrs: false, + setup(props, { attrs, slots }) { + // 处理 labelPosition 参数和 label-placement 之间的关系 + const labelPositionMap = { + top: { + labelAlign: 'left', + labelPlacement: 'top', + }, + left: { + labelAlign: 'left', + labelPlacement: 'left', + }, + right: { + labelAlign: 'right', + labelPlacement: 'left', + } + }; + + const formRef = ref(null); + if (attrs.setFormRef) { + onMounted(() => { + // form组件实例上重置一个 validate 方法 + formRef.value.$$validate = (callBack) => { + formRef.value.validate((errors) => { + if (errors) { + return callBack(false, errors); + } + + return callBack(true); + }); + }; + + attrs.setFormRef(formRef.value); + }); + } + + return () => { + const { + // eslint-disable-next-line no-unused-vars + setFormRef, labelPosition, model, ...otherAttrs + } = attrs; + + return h(vueUtils.resolveComponent('n-form'), { + ref: formRef, + model: model.value, // 不会自动解包 + ...labelPositionMap[labelPosition || 'top'], + ...otherAttrs + }, slots); + }; + } + }), + formItem: defineComponent({ + inheritAttrs: false, + setup(props, { attrs, slots }) { + return () => { + const { prop, rules, ...originAttrs } = attrs; + const childAttrs = { + ...originAttrs, + path: prop, + rule: (rules || []).map(validateRule => ({ + trigger: validateRule.trigger, + asyncValidator(rule, value, callback) { + return validateRule.validator(rule, value, callback); + } + })), + }; + return h(vueUtils.resolveComponent('n-form-item'), childAttrs, slots); + }; + } + }), + button: 'n-button', + // popover: , + popover: defineComponent({ + setup(props, { attrs, slots }) { + return () => h(vueUtils.resolveComponent('n-popover'), attrs, { + trigger: slots.reference, + default: slots.default, + }); + } + }), + }, + HELPERS: { + // 是否mini显示 description + isMiniDes(formProps) { + return formProps && ['left', 'right'].includes(formProps.labelPosition); + } + } +}; + +const JsonSchemaForm = createVue3Core(globalOptions); + +export default JsonSchemaForm; + +const modelValueComponent = vueUtils.modelValueComponent; + +export { + globalOptions, + SchemaField, + getDefaultFormState, + fieldProps, + vueUtils, + formUtils, + schemaValidate, + i18n, + modelValueComponent +}; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/style.scss b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/style.scss new file mode 100644 index 000000000..ddf3cbc33 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/src/style.scss @@ -0,0 +1,36 @@ +/* element plus 重置样式*/ +.genFromComponent { + .n-form-item-blank { + flex-wrap: wrap; + } + + /*如果引起问题可以覆盖*/ + .n-form-item.n-form-item--top-labelled { + grid-template-rows: none; + } + + .formFooter_item { + .n-form-item-blank { + justify-content: flex-end; + } + } + + .n-form-item-feedback--error { + .n-form-item-feedback__line { + display: -webkit-box!important; + text-overflow: ellipsis; + overflow: hidden; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + white-space: normal; + text-align: left; + line-height: 1.2; + font-size: 12px; + } + } + .validateWidget { + .n-form-item-blank, .n-form-item-feedback-wrapper{ + min-height: auto; + } + } +} diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/fieldProps.d.ts b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/fieldProps.d.ts new file mode 100644 index 000000000..2ed7fd0af --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/fieldProps.d.ts @@ -0,0 +1,32 @@ +declare namespace fieldProps { + + /** 当前节点schema */ + export const schema:object + + /** 当前节点 uiSchema */ + + export const uiSchema:object + + /** 当前节点 errorSchema */ + export const errorSchema:object + + /** 自定义校验规则 */ + export const customFormats:object + + /** 根节点 schema */ + export const rootSchema:object + + /** 根节点 formData */ + export const rootFormData:object + + /** 当前节点 路径 */ + export const curNodePath:string + + /** 是否为必填 */ + export const required:boolean + + /** 是否需要校验数据组 */ + export const needValidFieldGroup:boolean +} + +export default fieldProps; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/formUtils.d.ts b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/formUtils.d.ts new file mode 100644 index 000000000..691090ed3 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/formUtils.d.ts @@ -0,0 +1,46 @@ +interface Options { + schema: object, + uiSchema: object +} + +declare namespace formUtils { + + /** 解析当前节点 ui field */ + function getUiField(schemaOption: Options): object | null; + + /** 解析用户配置的 uiSchema options */ + function getUserUiOptions(schemaOption: Options): object; + + /** 解析当前节点的ui options参数 */ + function getUiOptions(schemaOption: Options): object; + + /** 获取当前节点的ui 配置 (options + widget) */ + function getWidgetConfig(schemaOption: Options): object; + + /** 获取当前节点的ui 配置 (options + widget) */ + function getUserErrOptions(schemaOption: Options): object; + + /** ui:order object-> properties 排序 */ + function orderProperties(properties: object, order): object; + + /** 当前schema 值是否为常量 */ + function isConstant(schema: object): boolean; + + function toConstant(schema: object): object | null; + + /** 是否为选择列表 **/ + function isSelect(_schema: object, rootSchema: object): boolean; + + /** type array items 都为一个对象 **/ + function isFixedItems(schema: object): boolean; + + /** 是否为多选 **/ + function isMultiSelect(schema: object, rootSchema: object): boolean; + + function allowAdditionalItems(schemaOption: Options): boolean; + + /** 下拉选项 **/ + function optionsList(schemaOption: Options); +} + +export default formUtils; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/getDefaultFormState.d.ts b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/getDefaultFormState.d.ts new file mode 100644 index 000000000..06e4fbef8 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/getDefaultFormState.d.ts @@ -0,0 +1,8 @@ +declare function getDefaultFormState( + schema: object, + formData: object, + rootSchema: object, + includeUndefinedValues?: boolean, +): any; + +export default getDefaultFormState; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/globalOptions.d.ts b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/globalOptions.d.ts new file mode 100644 index 000000000..1871d1a77 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/globalOptions.d.ts @@ -0,0 +1,17 @@ +interface HELPERS { + isMiniDes: (formProps: object) => boolean; +} + +declare namespace globalOptions { + + /** WIDGET_MAP 配置 */ + export const WIDGET_MAP:object + + /** COMPONENT_MAP 配置 */ + export const COMPONENT_MAP:object + + /** HELPERS 配置 */ + export const HELPERS: HELPERS +} + +export default globalOptions; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/i18n.d.ts b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/i18n.d.ts new file mode 100644 index 000000000..806437982 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/i18n.d.ts @@ -0,0 +1,7 @@ +declare namespace i18n { + function getCurrentLocalize(): object; + + function useLocal(fn): object; +} + +export default i18n; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/index.d.ts b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/index.d.ts new file mode 100644 index 000000000..ec7d24baf --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/index.d.ts @@ -0,0 +1,24 @@ +import JsonSchemaForm from './vueForm'; +import getDefaultFormState from './getDefaultFormState'; +import modelValueComponent from './modelValueComponent'; +import fieldProps from './fieldProps'; +import vueUtils from './vueUtils'; +import formUtils from './formUtils'; +import schemaValidate from './schemaValidate'; +import i18n from './i18n'; +import globalOptions from './globalOptions'; + +export default JsonSchemaForm; + +export { + globalOptions, + getDefaultFormState, + fieldProps, + vueUtils, + formUtils, + schemaValidate, + i18n, + modelValueComponent +}; + +export class SchemaField {} diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/modelValueComponent.d.ts b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/modelValueComponent.d.ts new file mode 100644 index 000000000..39ab49a9d --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/modelValueComponent.d.ts @@ -0,0 +1,8 @@ +declare function modelValueComponent( + baseComponent: object | String | Function, + options?: { + model?: String + } +): any; + +export default modelValueComponent; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/schemaValidate.d.ts b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/schemaValidate.d.ts new file mode 100644 index 000000000..6550830a2 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/schemaValidate.d.ts @@ -0,0 +1,18 @@ +declare namespace schemaValidate { + /** schema通过ajv校验formData并返回错误信息 */ + function ajvValidateFormData(options: object): object; + + /** 校验formData 并转换错误信息 */ + function validateFormDataAndTransformMsg(options: object): object; + + /** schema 是否通过校验 */ + function isValid(schema: object, data: any): boolean; + + /** ajv validate 方法 */ + function ajvValid(schema: object, data: any): boolean; + + /** oneOf anyOf 通过formData的值来找到当前匹配项索引 */ + function getMatchingOption(formData: object, options: object, rootSchema: object): boolean; +} + +export default schemaValidate; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/vueForm.d.ts b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/vueForm.d.ts new file mode 100644 index 000000000..5d7de94e1 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/vueForm.d.ts @@ -0,0 +1,29 @@ +import Vue from 'vue'; + +declare class VueForm extends Vue { + /** formFooter 配置 */ + formFooter: object + + /** value / v-model */ + value: object + + /** 传递给form的props */ + formProps: object + + /** schema 配置 */ + schema: object + + /** uiSchema 配置 */ + uiSchema: object + + /** 重置自定义错误 */ + errorSchema: object + + /** 自定义校验规则 */ + customFormats: object + + /** 自定义校验规则 */ + customRule: null +} + +export default VueForm; diff --git a/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/vueUtils.d.ts b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/vueUtils.d.ts new file mode 100644 index 000000000..4bdbfba91 --- /dev/null +++ b/misc/config_tools/configurator/packages/vue-json-schema-form/vue3/vue3-form-naive/types/vueUtils.d.ts @@ -0,0 +1,25 @@ +declare namespace vueUtils { + + /** nodePath 转css类名 */ + function nodePath2ClassName(path: string): string; + + /** 是否为根节点 */ + function isRootNodePath(path: string): boolean; + + /** 计算当前节点path */ + function computedCurPath(prePath: string, curKey: string): string; + + /** 计算当前节点name */ + function deletePathVal(vueData: object, name: string): void; + + /** 设置当前path值 */ + function setPathVal(vueData: object, path: string, value: any): void; + + /** 设置当前path值 */ + function getPathVal(vueData: object, path: string): object; + + /** 设置当前path值 */ + function path2prop(path: string): string; +} + +export default vueUtils; diff --git a/misc/config_tools/configurator/pyodide/loadScenario.py b/misc/config_tools/configurator/pyodide/loadScenario.py index 897e2eabc..2c7a6d443 100644 --- a/misc/config_tools/configurator/pyodide/loadScenario.py +++ b/misc/config_tools/configurator/pyodide/loadScenario.py @@ -5,7 +5,18 @@ import json import xmltodict -from . import convert_result, nuc11_scenario, scenario_json_schema +from . import convert_result, nuc11_scenario, IS_WEB + +if IS_WEB: + # load js function from + # misc/config_tools/configurator/packages/configurator/src/pyodide.js + # by pyodide js library + # noinspection PyUnresolvedReferences + from js import __dynamic__load__scenario__from__pyodide__ + + scenario_json_schema = __dynamic__load__scenario__from__pyodide__() +else: + from . import scenario_json_schema def get_array_and_int_keys(): diff --git a/misc/config_tools/configurator/pyodide/populateDefaultValues.py b/misc/config_tools/configurator/pyodide/populateDefaultValues.py new file mode 100644 index 000000000..dcc94eb38 --- /dev/null +++ b/misc/config_tools/configurator/pyodide/populateDefaultValues.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2022 Intel Corporation. +# +# SPDX-License-Identifier: BSD-3-Clause +# + +__package__ = 'configurator.pyodide' + +from pathlib import Path +from tempfile import TemporaryDirectory +from xml.etree.ElementTree import tostring + +from scenario_config.pipeline import PipelineObject, PipelineEngine +from scenario_config.xml_loader import XMLLoadStage +from scenario_config.default_populator import DefaultValuePopulatingStage + +from .pyodide import write_temp_file, nuc11_scenario, scenario_xml_schema_path, convert_result +from .loadScenario import load_scenario_xml + + +def main(scenario): + pipeline = PipelineEngine(["schema_path", "scenario_path"]) + pipeline.add_stages([ + XMLLoadStage("schema"), + XMLLoadStage("scenario"), + DefaultValuePopulatingStage(), + ]) + with TemporaryDirectory() as tmpdir: + write_temp_file(tmpdir, { + 'scenario.xml': scenario + }) + scenario_file_path = Path(tmpdir) / 'scenario.xml' + + obj = PipelineObject( + scenario_path=scenario_file_path, + schema_path=scenario_xml_schema_path, + ) + pipeline.run(obj) + result = tostring(obj.get("scenario_etree").getroot()) + result = result.decode() + result = convert_result({ + 'xml': result, + 'json': load_scenario_xml(result) + }) + return result + + +def test(): + main(nuc11_scenario) + + +if __name__ == '__main__': + test() diff --git a/misc/config_tools/configurator/pyodide/pyodide.py b/misc/config_tools/configurator/pyodide/pyodide.py index 6a1484dc8..25fec06a3 100644 --- a/misc/config_tools/configurator/pyodide/pyodide.py +++ b/misc/config_tools/configurator/pyodide/pyodide.py @@ -20,7 +20,7 @@ def file_text(path): # path define config_tools_dir = Path(__file__).absolute().parent.parent.parent -configurator_dir = config_tools_dir / 'configurator' +configurator_dir = config_tools_dir / 'configurator' / 'packages' / 'configurator' schema_dir = config_tools_dir / 'schema' scenario_xml_schema_path = schema_dir / 'sliced.xsd' datachecks_xml_schema_path = schema_dir / 'allchecks.xsd' @@ -32,11 +32,11 @@ nuc11_board = file_text(nuc11_folder / 'nuc11tnbi5.xml') nuc11_scenario = file_text(nuc11_folder / 'shared_launch_6user_vm.xml') scenario_json_schema = file_text(configurator_dir / 'src' / 'assets' / 'schema' / 'scenario.json') -debug = sys.platform != 'emscripten' +IS_WEB = sys.platform == 'emscripten' def convert_result(result): - if debug: + if not IS_WEB: print(json.dumps(result, indent=' ')) return json.dumps(result) diff --git a/misc/config_tools/configurator/pyodide/tests.py b/misc/config_tools/configurator/pyodide/tests.py index 9ef904e48..c4eb5178c 100644 --- a/misc/config_tools/configurator/pyodide/tests.py +++ b/misc/config_tools/configurator/pyodide/tests.py @@ -5,6 +5,7 @@ from .loadBoard import test as load_board_test from .loadScenario import test as load_scenario_test from .generateLaunchScript import test as generate_launch_script_test from .validateScenario import test as validate_scenario_test +from .populateDefaultValues import test as populate_default_values def main(): @@ -12,6 +13,7 @@ def main(): load_scenario_test() generate_launch_script_test() validate_scenario_test() + populate_default_values() def test(): diff --git a/misc/config_tools/configurator/src/main.js b/misc/config_tools/configurator/src/main.js deleted file mode 100644 index c556c3317..000000000 --- a/misc/config_tools/configurator/src/main.js +++ /dev/null @@ -1,111 +0,0 @@ -const isTauri = !!window.__TAURI_IPC__; - -if (isTauri) { - let openCount = 0 - - function openDevTools() { - openCount++; - console.log(`openCount ${openCount} of 5`) - if (openCount >= 5) { - invoke('open_devtools', {}) - } - } - - window.openDevTools = openDevTools; -} - -import {createApp} from 'vue' -import App from './App.vue' -import {loadPyodide} from "/thirdLib/pyodide/pyodide"; - -import router from "./router"; -import {invoke} from "@tauri-apps/api/tauri"; -import {mockIPC} from "@tauri-apps/api/mocks"; -import BootstrapVue3 from 'bootstrap-vue-3' -import naive from 'naive-ui'; - -const app = createApp(App); -app.use(BootstrapVue3); -app.use(naive); -app.use(router); -app.config.unwrapInjectedRef = true - -if (!isTauri) { - // Patch Browser function to mock Tauri env - const origin_confirm = window.confirm; - window.confirm = async (message) => origin_confirm(message); - - // mock custom tauri command - let tempData = { - history: {WorkingFolder: [], Board: [], Scenario: []} - } - mockIPC(async (cmd, args) => { - if (cmd === 'get_home') { - return 'C:\\Users\\Axel' - } - if (cmd === 'dialogOpenFolder') { - return 'C:\\acrn' - } - if (cmd === 'get_history') { - return JSON.stringify(tempData.history[args.historyType]) - } - if (cmd === 'add_history') { - return tempData.history[args.historyType].push(args.path) - } - if (args?.message?.cmd === "getAppVersion") { - const packageInfo = await import('../package.json'); - return packageInfo.version; - } - - console.log(cmd, args) - return {} - }) -} - -async function main() { - console.log("Pyodide Load Begin") - let t1 = Date.now(); - let pyodide = await loadPyodide({ - indexURL: '/thirdLib/pyodide/' - }); - await pyodide.loadPackage(['micropip', 'lxml', 'beautifulsoup4']) - await pyodide.runPythonAsync(` - import micropip - await micropip.install([ - './thirdLib/xmltodict-0.12.0-py2.py3-none-any.whl', - './thirdLib/elementpath-2.4.0-py3-none-any.whl', - './thirdLib/defusedxml-0.7.1-py2.py3-none-any.whl', - './thirdLib/xmlschema-1.9.2-py3-none-any.whl', - './thirdLib/acrn_config_tools-3.0-py3-none-any.whl' - ]) - `) - - function test() { - let result = pyodide.runPython(` - import sys - sys.version - `) - console.log(result); - } - - test() - - // pyodide load success - window.pyodide = pyodide; - let t2 = Date.now(); - console.log("Pyodide Load Time: " + (t2 - t1) + "ms") - - let homeDir = await invoke("get_home"); - let pathSplit = "/"; - if (homeDir.indexOf("\\") > 0) { - pathSplit = "\\" - } - - window.systemInfo = { - homeDir, pathSplit - } - - app.mount('#app') -} - -main(); diff --git a/misc/config_tools/configurator/yarn.lock b/misc/config_tools/configurator/yarn.lock index cb8c52e96..523d9f710 100644 --- a/misc/config_tools/configurator/yarn.lock +++ b/misc/config_tools/configurator/yarn.lock @@ -22,27 +22,10 @@ resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== -"@lljj/vjsf-utils@1.12.2": - version "1.12.2" - resolved "https://registry.yarnpkg.com/@lljj/vjsf-utils/-/vjsf-utils-1.12.2.tgz#b5420465d5482eade6cbe568a502abc23a1d6298" - integrity sha512-chyBkvCGMy/yh+3cow8BK+NWu3Ly/Kwkeb490qo3DE3J0XIMXahBFQ15w8UTbn5ZCvsNdy8tEONC2q/NXTxIjQ== - dependencies: - ajv "^6.10.2" - -"@lljj/vue3-form-core@1.12.2": - version "1.12.2" - resolved "https://registry.yarnpkg.com/@lljj/vue3-form-core/-/vue3-form-core-1.12.2.tgz#0b757e9ce3378a6a246f454d66ea8113cac7293e" - integrity sha512-b61ILRrr8YNqD3x0LgT/DfMycuFsibrN2nG0+xG/55piVVskHjxD/smy/UXHqsNDwZrUsho2d30PU77+n1PfBQ== - dependencies: - "@lljj/vjsf-utils" "1.12.2" - -"@lljj/vue3-form-naive@^1.12.2": - version "1.12.2" - resolved "https://registry.yarnpkg.com/@lljj/vue3-form-naive/-/vue3-form-naive-1.12.2.tgz#f6f954130e9f8c5901ce96f9e0768d7ef38e7062" - integrity sha512-GFYVr4e6XUkgLlwyvto0rNfoNAxHNj3TmXHUFc0EyltYqqMHTwVE3g2mAMtaiHi77N/m1vHlnvdN0dlt6xwhjw== - dependencies: - "@lljj/vjsf-utils" "1.12.2" - "@lljj/vue3-form-core" "1.12.2" +"@juggle/resize-observer@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.3.1.tgz#b50a781709c81e10701004214340f25475a171a0" + integrity sha512-zMM9Ds+SawiUkakS7y94Ymqx+S0ORzpG3frZirN3l+UlXUmSUR7hF4wxCVqW+ei94JzV5kt0uXBcoOEAuiydrw== "@popperjs/core@^2.11.5": version "2.11.5" @@ -66,72 +49,72 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@tauri-apps/api@^1.0.0-rc.3": - version "1.0.0-rc.3" - resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-1.0.0-rc.3.tgz#e80ddbe832bf003537d94801d508a7f7e25ac48b" - integrity sha512-/ZbyBjuUoU6mYm8RzibIUvVuJ31ZwYA2+fTRl7FF4LVFhzCVJ1YI1BS5ohGb2GsLNmLpfeo7kDHaIhV2uaOchQ== +"@tauri-apps/api@^1.0.0-rc.4": + version "1.0.0-rc.4" + resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-1.0.0-rc.4.tgz#454ef7b15237f3d5752bbfc09c8997a00b1e8a9b" + integrity sha512-1HaUsx8+TzFHDoQ+Mmd6RWaMsPyZlurQHgACDt+il5e/ui6pDkumVXaS92SnY5XOcS4gBC0BkgjVfkWgcm/Oww== dependencies: - type-fest "2.12.1" + type-fest "2.12.2" -"@tauri-apps/cli-darwin-arm64@1.0.0-rc.8": - version "1.0.0-rc.8" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.0.0-rc.8.tgz#84eac830714d1819c72f4e3d7e334bee3719d673" - integrity sha512-sbV4fkd3YBlX0gEBldEVmN/NbBdHzrn8wCRRiFaNBocDWC6Ji6DNvpp1Vy1xgY0RgtGOisGD+3+HelmKP4Mh/A== +"@tauri-apps/cli-darwin-arm64@1.0.0-rc.9": + version "1.0.0-rc.9" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.0.0-rc.9.tgz#8786ce2eacbad4b69eaa8e4e0b7ae16819923b11" + integrity sha512-cpcSRyVOh3n5GsCdKtVQpLJ36yx7h+KY868l7KhPnM5EL1cQbFwYzD/VHlzFvfrpS19YvPBB/AHln4rll5iWvw== -"@tauri-apps/cli-darwin-x64@1.0.0-rc.8": - version "1.0.0-rc.8" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.0.0-rc.8.tgz#675b8cdbf2a0ade23159e964ac3a1e5dd767ffcf" - integrity sha512-VmuYbBZKKal/YxSTbzHTaM04C9zUlTXq7ePoXc1PRAa/Xafo16N37OGzhzBlsKHrvh6BtPp9ZWk5UhHIDiJBsw== +"@tauri-apps/cli-darwin-x64@1.0.0-rc.9": + version "1.0.0-rc.9" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.0.0-rc.9.tgz#b4aa98ebf26018b3e9013ea4ce16a294f2cb8c4f" + integrity sha512-ku8QpMNrfqyCk2adLdVB+zzaCb7T0/RgVvaqEZqK54WW4blUxkeKHbKqZ/SKRdxTkghHbgJIoBtlk1A5GUbAwg== -"@tauri-apps/cli-linux-arm-gnueabihf@1.0.0-rc.8": - version "1.0.0-rc.8" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.0.0-rc.8.tgz#b7ecece513c7ba828c0e794eca4f3125f83f2cf6" - integrity sha512-2VKkS1c2pK56sgtGxtsm9nKKWefG7dgPnynTuCoEngkgQfNIlZ1ns/eAIZpBmwhvOMOw2OesKvK9ZQo0/lE/IA== +"@tauri-apps/cli-linux-arm-gnueabihf@1.0.0-rc.9": + version "1.0.0-rc.9" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.0.0-rc.9.tgz#d77c329168eaa2a5d66b9648deda8d98783d781d" + integrity sha512-Qlwm4eWo0uCeL3kmowfaLghPehYTYvnM4fH6cRZndzs6/abqsFdghmEmhP5mn34/RAnHXAUANItqlgk6L7C4iw== -"@tauri-apps/cli-linux-arm64-gnu@1.0.0-rc.8": - version "1.0.0-rc.8" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.0.0-rc.8.tgz#6c08741be40d0148da16b26d568c1595e3b99332" - integrity sha512-jykbrTJyx0uJhhL/3PPYGx5ETqEzacJ3YChnHzVClSzPkrdoGC61/xY9dMD9ZFJsLMJkV4VJj8sGRd1OPKCa/w== +"@tauri-apps/cli-linux-arm64-gnu@1.0.0-rc.9": + version "1.0.0-rc.9" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.0.0-rc.9.tgz#ecf229e8176b55046d64c2fab9c831fa0fe39a77" + integrity sha512-Rr4S902dYjRnDCu141f5Cz3JxwKxX/ax7LiMhSifQu5o2wSiezmZ20VRHBwW1UuZxvGV+hxTuZVnfD6NKQdWdA== -"@tauri-apps/cli-linux-arm64-musl@1.0.0-rc.8": - version "1.0.0-rc.8" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.0.0-rc.8.tgz#70fdfbf5e4fe4d42bc5984a7bc8914d08a3dcbf6" - integrity sha512-HAIm8BKpLIWkvYgxoRzDIaqWIW3UtH2HO1qDd0aov5FTx/9dtCTtylpvd/6mWs5LGaEmsLoSokfJloI2sMZ/WQ== +"@tauri-apps/cli-linux-arm64-musl@1.0.0-rc.9": + version "1.0.0-rc.9" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.0.0-rc.9.tgz#10a6052d9a6bd720da5ffb1a98bc862564d7a93f" + integrity sha512-MxqjspY2aS/nxtvBMT8TExZfDWDEsUvQRHHY/2KoBYpqpzucW6WXRGmeOvS1GeA3vnub2/Kq5i32jGRDT1tvrA== -"@tauri-apps/cli-linux-x64-gnu@1.0.0-rc.8": - version "1.0.0-rc.8" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.0.0-rc.8.tgz#bf21f03128e1d6f8ae4d4e043ac2620d8489a69d" - integrity sha512-fnPrkX6Uy9Qz2vqnT3D3sgbJzXTR4arNUIQl8HIYi2YCZZVmDWczz4x4++ilZWwk0I3a7d612/WzTeBzQjn3kg== +"@tauri-apps/cli-linux-x64-gnu@1.0.0-rc.9": + version "1.0.0-rc.9" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.0.0-rc.9.tgz#34891286ffe0eba1c0602baaa5c3f198f5247a0a" + integrity sha512-LD7KnJuH1mYFwQfcALPttBnaSG6pgO87Z6nY3xXJjo+A4ttPHcmIBaNdXCTjAmib/umD0nD8k95Hw9iJFYTuiA== -"@tauri-apps/cli-linux-x64-musl@1.0.0-rc.8": - version "1.0.0-rc.8" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.0.0-rc.8.tgz#647286cb6826d0ff1503a9d6d88959ab8f5de4fb" - integrity sha512-kHrpBsJFRAwqFL7xnsrKdNxnYjzI/J9/Dr7T3rl+IIPbi1sIojh6DydxFOYepnuoINA6zWYQJpo0FQeASJsXrw== +"@tauri-apps/cli-linux-x64-musl@1.0.0-rc.9": + version "1.0.0-rc.9" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.0.0-rc.9.tgz#32e6550964e559b158d4b9c83b3a7e3c3d58abee" + integrity sha512-ifocAxBYhk7qrO5x1mizxx/yABvkmyia0kw9eXUn7d5a30HoBcl/A9t+w+7c4B/n/D+gxEMSr6CPaIZv7KnTog== -"@tauri-apps/cli-win32-ia32-msvc@1.0.0-rc.8": - version "1.0.0-rc.8" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.0.0-rc.8.tgz#69fff6f746631345649d2abf788e9f0954eb7ce8" - integrity sha512-y8uT7AaIZVdLAWL4pxj/GXitwWn828er23yniOvTo1mJMCZsSFdwiOGiRSXI6OZsVCOPiJmvqq7eWaskQKYA0A== +"@tauri-apps/cli-win32-ia32-msvc@1.0.0-rc.9": + version "1.0.0-rc.9" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.0.0-rc.9.tgz#01f5c7f1f9a359ea7f6d203dd03d8b98cf8bdcb6" + integrity sha512-ClDYF4CstoccPMVkIHyvy1jzlWXIYZX2mjKB6z18MdJ0O7Je8TC115K30lqXtSdPuKX35xWDcWU2b/gllcUUzA== -"@tauri-apps/cli-win32-x64-msvc@1.0.0-rc.8": - version "1.0.0-rc.8" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.0.0-rc.8.tgz#bf58e24c42fccf098f78dc51e43f5cd7b7ff6842" - integrity sha512-PiDr/iAKoL9nQSiWHkUSjRVHbvCJaa7Xj3P9UnGkjJQ9LGTr7AYZdLk4zISegF+/fZnOmaqUdZW9yWPPyJAzPw== +"@tauri-apps/cli-win32-x64-msvc@1.0.0-rc.9": + version "1.0.0-rc.9" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.0.0-rc.9.tgz#4136d9837efb3c1bf56340d3b5abf56c10b8c7a5" + integrity sha512-hJjnpl864OhpIp2lTMTW4ad2Aia5/Tbf7k8GJILzUY/XkBhZjNIgZORa8bDcnZRCTU+RDgMFc+AoKtDIircjnA== -"@tauri-apps/cli@^1.0.0-rc.8": - version "1.0.0-rc.8" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-1.0.0-rc.8.tgz#ee8c9a587739853bd5f8a46a456a43ae594610f6" - integrity sha512-FWpNwbgGMPgDb41oO7wdBhBsBE6FMG9yHKbtbrkJ/8d/hWcT6e3UUTfFL9cR2VGdp1pdWlul5+BKH0PTf8rB9w== +"@tauri-apps/cli@^1.0.0-rc.9": + version "1.0.0-rc.9" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-1.0.0-rc.9.tgz#727159fa07bb2829b27abc3540324adfcff59f7a" + integrity sha512-j+HZ65wdfFrMwisYeQpdZnldONevBPHjAo9v9Impf0irUU2UR5nwyvyArHTaWCvNeqEs+YV4XXHsfm2xVpnaug== optionalDependencies: - "@tauri-apps/cli-darwin-arm64" "1.0.0-rc.8" - "@tauri-apps/cli-darwin-x64" "1.0.0-rc.8" - "@tauri-apps/cli-linux-arm-gnueabihf" "1.0.0-rc.8" - "@tauri-apps/cli-linux-arm64-gnu" "1.0.0-rc.8" - "@tauri-apps/cli-linux-arm64-musl" "1.0.0-rc.8" - "@tauri-apps/cli-linux-x64-gnu" "1.0.0-rc.8" - "@tauri-apps/cli-linux-x64-musl" "1.0.0-rc.8" - "@tauri-apps/cli-win32-ia32-msvc" "1.0.0-rc.8" - "@tauri-apps/cli-win32-x64-msvc" "1.0.0-rc.8" + "@tauri-apps/cli-darwin-arm64" "1.0.0-rc.9" + "@tauri-apps/cli-darwin-x64" "1.0.0-rc.9" + "@tauri-apps/cli-linux-arm-gnueabihf" "1.0.0-rc.9" + "@tauri-apps/cli-linux-arm64-gnu" "1.0.0-rc.9" + "@tauri-apps/cli-linux-arm64-musl" "1.0.0-rc.9" + "@tauri-apps/cli-linux-x64-gnu" "1.0.0-rc.9" + "@tauri-apps/cli-linux-x64-musl" "1.0.0-rc.9" + "@tauri-apps/cli-win32-ia32-msvc" "1.0.0-rc.9" + "@tauri-apps/cli-win32-x64-msvc" "1.0.0-rc.9" "@types/estree@0.0.39": version "0.0.39" @@ -158,15 +141,20 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.182.tgz#05301a4d5e62963227eaafe0ce04dd77c54ea5c2" integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q== +"@types/node@^16.11.33": + version "16.11.33" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.33.tgz#566713b1b626f781c5c58fe3531307283e00720c" + integrity sha512-0PJ0vg+JyU0MIan58IOIFRtSvsb7Ri+7Wltx2qAg94eMOrpg4+uuP3aUHCpxXc1i0jCXiC+zIamSZh3l9AbcQA== + "@types/node@~14.14.31": version "14.14.45" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.45.tgz#ec2dfb5566ff814d061aef7e141575aedba245cf" integrity sha512-DssMqTV9UnnoxDWu959sDLZzfvqCF0qDNRjaWeYSui9xkFe61kKo4l1TWNTQONpuXEm+gLMRvdlzvNHBamzmEw== "@types/node@~17.0.5": - version "17.0.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.25.tgz#527051f3c2f77aa52e5dc74e45a3da5fb2301448" - integrity sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w== + version "17.0.29" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.29.tgz#7f2e1159231d4a077bb660edab0fde373e375a3d" + integrity sha512-tx5jMmMFwx7wBwq/V7OohKDVb/JwJU5qCVkeLMh1//xycAJ/ESuw9aJ9SEtlCZDYi2pBfe4JkisSoAtbOsBNAA== "@vicons/fa@^0.12.0": version "0.12.0" @@ -328,9 +316,9 @@ anymatch@~3.1.2: picomatch "^2.0.4" async-validator@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-4.0.7.tgz#034a0fd2103a6b2ebf010da75183bec299247afe" - integrity sha512-Pj2IR7u8hmUEDOwB++su6baaRi+QvsgajuFB9j95foM1N2gy5HM4z60hfusIO0fBPG5uLAEl6yCJr1jNSVugEQ== + version "4.1.1" + resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-4.1.1.tgz#3cd1437faa2de64743f7d56649dd904c946a18fe" + integrity sha512-p4DO/JXwjs8klJyJL8Q2oM4ks5fUTze/h5k10oPPKMiLe1fj3G1QMzPHNmN1Py4ycOk7WlO2DcGXv1qiESJCZA== binary-extensions@^2.0.0: version "2.2.0" @@ -338,9 +326,9 @@ binary-extensions@^2.0.0: integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== bootstrap-vue-3@^0.1.10: - version "0.1.10" - resolved "https://registry.yarnpkg.com/bootstrap-vue-3/-/bootstrap-vue-3-0.1.10.tgz#45f2d5071c9a0af477bf14c662ba303e503e333b" - integrity sha512-r5zd5DIzclFpR16s6nwFRkZlrLoTANbZ9OWFFGoKLGcHOnL+WFuR8HULUB5QEyKdH5mf9ltTBCEsX/mFRq2S1w== + version "0.1.11" + resolved "https://registry.yarnpkg.com/bootstrap-vue-3/-/bootstrap-vue-3-0.1.11.tgz#50f1ac1f05247e7bddbdd20c51a71089eced682c" + integrity sha512-Cb9AmbGwVNxSD63mxehtWc0O4maSLXsUy0SjIl3rzwPGFU4AePqR2xmmRKLfRU234vzu+gNySMUwU64f/Yrnow== dependencies: core-js "3.x.x" @@ -392,9 +380,9 @@ color-name@~1.1.4: integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== core-js@3.x.x: - version "3.22.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.22.1.tgz#1936e4f1da82675fe22ae10ee60ef638cd9752fd" - integrity sha512-l6CwCLq7XgITOQGhv1dIUmwCFoqFjyQ6zQHUCQlS0xKmb9d6OHIg8jDiEoswhaettT21BSF5qKr6kbvE+aKwxw== + version "3.22.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.22.2.tgz#3ea0a245b0895fa39d1faa15fe75d91ade504a01" + integrity sha512-Z5I2vzDnEIqO2YhELVMFcL1An2CIsFe9Q7byZhs8c/QxummxZlAHw33TUHbIte987LkisOgL0LwQ1P9D6VISnA== css-render@^0.13.2: version "0.13.9" @@ -439,131 +427,131 @@ diff-sequences@^27.5.1: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== -esbuild-android-64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.36.tgz#fc5f95ce78c8c3d790fa16bc71bd904f2bb42aa1" - integrity sha512-jwpBhF1jmo0tVCYC/ORzVN+hyVcNZUWuozGcLHfod0RJCedTDTvR4nwlTXdx1gtncDqjk33itjO+27OZHbiavw== +esbuild-android-64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.38.tgz#5b94a1306df31d55055f64a62ff6b763a47b7f64" + integrity sha512-aRFxR3scRKkbmNuGAK+Gee3+yFxkTJO/cx83Dkyzo4CnQl/2zVSurtG6+G86EQIZ+w+VYngVyK7P3HyTBKu3nw== -esbuild-android-arm64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.36.tgz#44356fbb9f8de82a5cdf11849e011dfb3ad0a8a8" - integrity sha512-/hYkyFe7x7Yapmfv4X/tBmyKnggUmdQmlvZ8ZlBnV4+PjisrEhAvC3yWpURuD9XoB8Wa1d5dGkTsF53pIvpjsg== +esbuild-android-arm64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.38.tgz#78acc80773d16007de5219ccce544c036abd50b8" + integrity sha512-L2NgQRWuHFI89IIZIlpAcINy9FvBk6xFVZ7xGdOwIm8VyhX1vNCEqUJO3DPSSy945Gzdg98cxtNt8Grv1CsyhA== -esbuild-darwin-64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.36.tgz#3d9324b21489c70141665c2e740d6e84f16f725d" - integrity sha512-kkl6qmV0dTpyIMKagluzYqlc1vO0ecgpviK/7jwPbRDEv5fejRTaBBEE2KxEQbTHcLhiiDbhG7d5UybZWo/1zQ== +esbuild-darwin-64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.38.tgz#e02b1291f629ebdc2aa46fabfacc9aa28ff6aa46" + integrity sha512-5JJvgXkX87Pd1Og0u/NJuO7TSqAikAcQQ74gyJ87bqWRVeouky84ICoV4sN6VV53aTW+NE87qLdGY4QA2S7KNA== -esbuild-darwin-arm64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.36.tgz#2a8040c2e465131e5281034f3c72405e643cb7b2" - integrity sha512-q8fY4r2Sx6P0Pr3VUm//eFYKVk07C5MHcEinU1BjyFnuYz4IxR/03uBbDwluR6ILIHnZTE7AkTUWIdidRi1Jjw== +esbuild-darwin-arm64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.38.tgz#01eb6650ec010b18c990e443a6abcca1d71290a9" + integrity sha512-eqF+OejMI3mC5Dlo9Kdq/Ilbki9sQBw3QlHW3wjLmsLh+quNfHmGMp3Ly1eWm981iGBMdbtSS9+LRvR2T8B3eQ== -esbuild-freebsd-64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.36.tgz#d82c387b4d01fe9e8631f97d41eb54f2dbeb68a3" - integrity sha512-Hn8AYuxXXRptybPqoMkga4HRFE7/XmhtlQjXFHoAIhKUPPMeJH35GYEUWGbjteai9FLFvBAjEAlwEtSGxnqWww== +esbuild-freebsd-64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.38.tgz#790b8786729d4aac7be17648f9ea8e0e16475b5e" + integrity sha512-epnPbhZUt93xV5cgeY36ZxPXDsQeO55DppzsIgWM8vgiG/Rz+qYDLmh5ts3e+Ln1wA9dQ+nZmVHw+RjaW3I5Ig== -esbuild-freebsd-arm64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.36.tgz#e8ce2e6c697da6c7ecd0cc0ac821d47c5ab68529" - integrity sha512-S3C0attylLLRiCcHiJd036eDEMOY32+h8P+jJ3kTcfhJANNjP0TNBNL30TZmEdOSx/820HJFgRrqpNAvTbjnDA== +esbuild-freebsd-arm64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.38.tgz#b66340ab28c09c1098e6d9d8ff656db47d7211e6" + integrity sha512-/9icXUYJWherhk+y5fjPI5yNUdFPtXHQlwP7/K/zg8t8lQdHVj20SqU9/udQmeUo5pDFHMYzcEFfJqgOVeKNNQ== -esbuild-linux-32@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.36.tgz#a4a261e2af91986ea62451f2db712a556cb38a15" - integrity sha512-Eh9OkyTrEZn9WGO4xkI3OPPpUX7p/3QYvdG0lL4rfr73Ap2HAr6D9lP59VMF64Ex01LhHSXwIsFG/8AQjh6eNw== +esbuild-linux-32@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.38.tgz#7927f950986fd39f0ff319e92839455912b67f70" + integrity sha512-QfgfeNHRFvr2XeHFzP8kOZVnal3QvST3A0cgq32ZrHjSMFTdgXhMhmWdKzRXP/PKcfv3e2OW9tT9PpcjNvaq6g== -esbuild-linux-64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.36.tgz#4a9500f9197e2c8fcb884a511d2c9d4c2debde72" - integrity sha512-vFVFS5ve7PuwlfgoWNyRccGDi2QTNkQo/2k5U5ttVD0jRFaMlc8UQee708fOZA6zTCDy5RWsT5MJw3sl2X6KDg== +esbuild-linux-64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.38.tgz#4893d07b229d9cfe34a2b3ce586399e73c3ac519" + integrity sha512-uuZHNmqcs+Bj1qiW9k/HZU3FtIHmYiuxZ/6Aa+/KHb/pFKr7R3aVqvxlAudYI9Fw3St0VCPfv7QBpUITSmBR1Q== -esbuild-linux-arm64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.36.tgz#c91c21e25b315464bd7da867365dd1dae14ca176" - integrity sha512-24Vq1M7FdpSmaTYuu1w0Hdhiqkbto1I5Pjyi+4Cdw5fJKGlwQuw+hWynTcRI/cOZxBcBpP21gND7W27gHAiftw== +esbuild-linux-arm64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.38.tgz#8442402e37d0b8ae946ac616784d9c1a2041056a" + integrity sha512-HlMGZTEsBrXrivr64eZ/EO0NQM8H8DuSENRok9d+Jtvq8hOLzrxfsAT9U94K3KOGk2XgCmkaI2KD8hX7F97lvA== -esbuild-linux-arm@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.36.tgz#90e23bca2e6e549affbbe994f80ba3bb6c4d934a" - integrity sha512-NhgU4n+NCsYgt7Hy61PCquEz5aevI6VjQvxwBxtxrooXsxt5b2xtOUXYZe04JxqQo+XZk3d1gcr7pbV9MAQ/Lg== +esbuild-linux-arm@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.38.tgz#d5dbf32d38b7f79be0ec6b5fb2f9251fd9066986" + integrity sha512-FiFvQe8J3VKTDXG01JbvoVRXQ0x6UZwyrU4IaLBZeq39Bsbatd94Fuc3F1RGqPF5RbIWW7RvkVQjn79ejzysnA== -esbuild-linux-mips64le@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.36.tgz#40e11afb08353ff24709fc89e4db0f866bc131d2" - integrity sha512-hZUeTXvppJN+5rEz2EjsOFM9F1bZt7/d2FUM1lmQo//rXh1RTFYzhC0txn7WV0/jCC7SvrGRaRz0NMsRPf8SIA== +esbuild-linux-mips64le@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.38.tgz#95081e42f698bbe35d8ccee0e3a237594b337eb5" + integrity sha512-qd1dLf2v7QBiI5wwfil9j0HG/5YMFBAmMVmdeokbNAMbcg49p25t6IlJFXAeLzogv1AvgaXRXvgFNhScYEUXGQ== -esbuild-linux-ppc64le@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.36.tgz#9e8a588c513d06cc3859f9dcc52e5fdfce8a1a5e" - integrity sha512-1Bg3QgzZjO+QtPhP9VeIBhAduHEc2kzU43MzBnMwpLSZ890azr4/A9Dganun8nsqD/1TBcqhId0z4mFDO8FAvg== +esbuild-linux-ppc64le@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.38.tgz#dceb0a1b186f5df679618882a7990bd422089b47" + integrity sha512-mnbEm7o69gTl60jSuK+nn+pRsRHGtDPfzhrqEUXyCl7CTOCLtWN2bhK8bgsdp6J/2NyS/wHBjs1x8aBWwP2X9Q== -esbuild-linux-riscv64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.36.tgz#e578c09b23b3b97652e60e3692bfda628b541f06" - integrity sha512-dOE5pt3cOdqEhaufDRzNCHf5BSwxgygVak9UR7PH7KPVHwSTDAZHDoEjblxLqjJYpc5XaU9+gKJ9F8mp9r5I4A== +esbuild-linux-riscv64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.38.tgz#61fb8edb75f475f9208c4a93ab2bfab63821afd2" + integrity sha512-+p6YKYbuV72uikChRk14FSyNJZ4WfYkffj6Af0/Tw63/6TJX6TnIKE+6D3xtEc7DeDth1fjUOEqm+ApKFXbbVQ== -esbuild-linux-s390x@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.36.tgz#3c9dab40d0d69932ffded0fd7317bb403626c9bc" - integrity sha512-g4FMdh//BBGTfVHjF6MO7Cz8gqRoDPzXWxRvWkJoGroKA18G9m0wddvPbEqcQf5Tbt2vSc1CIgag7cXwTmoTXg== +esbuild-linux-s390x@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.38.tgz#34c7126a4937406bf6a5e69100185fd702d12fe0" + integrity sha512-0zUsiDkGJiMHxBQ7JDU8jbaanUY975CdOW1YDrurjrM0vWHfjv9tLQsW9GSyEb/heSK1L5gaweRjzfUVBFoybQ== -esbuild-netbsd-64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.36.tgz#e27847f6d506218291619b8c1e121ecd97628494" - integrity sha512-UB2bVImxkWk4vjnP62ehFNZ73lQY1xcnL5ZNYF3x0AG+j8HgdkNF05v67YJdCIuUJpBuTyCK8LORCYo9onSW+A== +esbuild-netbsd-64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.38.tgz#322ea9937d9e529183ee281c7996b93eb38a5d95" + integrity sha512-cljBAApVwkpnJZfnRVThpRBGzCi+a+V9Ofb1fVkKhtrPLDYlHLrSYGtmnoTVWDQdU516qYI8+wOgcGZ4XIZh0Q== -esbuild-openbsd-64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.36.tgz#c94c04c557fae516872a586eae67423da6d2fabb" - integrity sha512-NvGB2Chf8GxuleXRGk8e9zD3aSdRO5kLt9coTQbCg7WMGXeX471sBgh4kSg8pjx0yTXRt0MlrUDnjVYnetyivg== +esbuild-openbsd-64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.38.tgz#1ca29bb7a2bf09592dcc26afdb45108f08a2cdbd" + integrity sha512-CDswYr2PWPGEPpLDUO50mL3WO/07EMjnZDNKpmaxUPsrW+kVM3LoAqr/CE8UbzugpEiflYqJsGPLirThRB18IQ== -esbuild-sunos-64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.36.tgz#9b79febc0df65a30f1c9bd63047d1675511bf99d" - integrity sha512-VkUZS5ftTSjhRjuRLp+v78auMO3PZBXu6xl4ajomGenEm2/rGuWlhFSjB7YbBNErOchj51Jb2OK8lKAo8qdmsQ== +esbuild-sunos-64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.38.tgz#c9446f7d8ebf45093e7bb0e7045506a88540019b" + integrity sha512-2mfIoYW58gKcC3bck0j7lD3RZkqYA7MmujFYmSn9l6TiIcAMpuEvqksO+ntBgbLep/eyjpgdplF7b+4T9VJGOA== -esbuild-windows-32@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.36.tgz#910d11936c8d2122ffdd3275e5b28d8a4e1240ec" - integrity sha512-bIar+A6hdytJjZrDxfMBUSEHHLfx3ynoEZXx/39nxy86pX/w249WZm8Bm0dtOAByAf4Z6qV0LsnTIJHiIqbw0w== +esbuild-windows-32@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.38.tgz#f8e9b4602fd0ccbd48e5c8d117ec0ba4040f2ad1" + integrity sha512-L2BmEeFZATAvU+FJzJiRLFUP+d9RHN+QXpgaOrs2klshoAm1AE6Us4X6fS9k33Uy5SzScn2TpcgecbqJza1Hjw== -esbuild-windows-64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.36.tgz#21b4ce8b42a4efc63f4b58ec617f1302448aad26" - integrity sha512-+p4MuRZekVChAeueT1Y9LGkxrT5x7YYJxYE8ZOTcEfeUUN43vktSn6hUNsvxzzATrSgq5QqRdllkVBxWZg7KqQ== +esbuild-windows-64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.38.tgz#280f58e69f78535f470905ce3e43db1746518107" + integrity sha512-Khy4wVmebnzue8aeSXLC+6clo/hRYeNIm0DyikoEqX+3w3rcvrhzpoix0S+MF9vzh6JFskkIGD7Zx47ODJNyCw== -esbuild-windows-arm64@0.14.36: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.36.tgz#ba21546fecb7297667d0052d00150de22c044b24" - integrity sha512-fBB4WlDqV1m18EF/aheGYQkQZHfPHiHJSBYzXIo8yKehek+0BtBwo/4PNwKGJ5T0YK0oc8pBKjgwPbzSrPLb+Q== +esbuild-windows-arm64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.38.tgz#d97e9ac0f95a4c236d9173fa9f86c983d6a53f54" + integrity sha512-k3FGCNmHBkqdJXuJszdWciAH77PukEyDsdIryEHn9cKLQFxzhT39dSumeTuggaQcXY57UlmLGIkklWZo2qzHpw== esbuild@^0.14.27: - version "0.14.36" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.36.tgz#0023a73eab57886ac5605df16ee421e471a971b3" - integrity sha512-HhFHPiRXGYOCRlrhpiVDYKcFJRdO0sBElZ668M4lh2ER0YgnkLxECuFe7uWCf23FrcLc59Pqr7dHkTqmRPDHmw== + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.38.tgz#99526b778cd9f35532955e26e1709a16cca2fb30" + integrity sha512-12fzJ0fsm7gVZX1YQ1InkOE5f9Tl7cgf6JPYXRJtPIoE0zkWAbHdPHVPPaLi9tYAcEBqheGzqLn/3RdTOyBfcA== optionalDependencies: - esbuild-android-64 "0.14.36" - esbuild-android-arm64 "0.14.36" - esbuild-darwin-64 "0.14.36" - esbuild-darwin-arm64 "0.14.36" - esbuild-freebsd-64 "0.14.36" - esbuild-freebsd-arm64 "0.14.36" - esbuild-linux-32 "0.14.36" - esbuild-linux-64 "0.14.36" - esbuild-linux-arm "0.14.36" - esbuild-linux-arm64 "0.14.36" - esbuild-linux-mips64le "0.14.36" - esbuild-linux-ppc64le "0.14.36" - esbuild-linux-riscv64 "0.14.36" - esbuild-linux-s390x "0.14.36" - esbuild-netbsd-64 "0.14.36" - esbuild-openbsd-64 "0.14.36" - esbuild-sunos-64 "0.14.36" - esbuild-windows-32 "0.14.36" - esbuild-windows-64 "0.14.36" - esbuild-windows-arm64 "0.14.36" + esbuild-android-64 "0.14.38" + esbuild-android-arm64 "0.14.38" + esbuild-darwin-64 "0.14.38" + esbuild-darwin-arm64 "0.14.38" + esbuild-freebsd-64 "0.14.38" + esbuild-freebsd-arm64 "0.14.38" + esbuild-linux-32 "0.14.38" + esbuild-linux-64 "0.14.38" + esbuild-linux-arm "0.14.38" + esbuild-linux-arm64 "0.14.38" + esbuild-linux-mips64le "0.14.38" + esbuild-linux-ppc64le "0.14.38" + esbuild-linux-riscv64 "0.14.38" + esbuild-linux-s390x "0.14.38" + esbuild-netbsd-64 "0.14.38" + esbuild-openbsd-64 "0.14.38" + esbuild-sunos-64 "0.14.38" + esbuild-windows-32 "0.14.38" + esbuild-windows-64 "0.14.38" + esbuild-windows-arm64 "0.14.38" estree-walker@^1.0.1: version "1.0.1" @@ -644,9 +632,9 @@ is-binary-path@~2.1.0: binary-extensions "^2.0.0" is-core-module@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" - integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== + version "2.9.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== dependencies: has "^1.0.3" @@ -720,9 +708,9 @@ magic-string@^0.25.7: sourcemap-codec "^1.4.8" naive-ui@^2.28.1: - version "2.28.1" - resolved "https://registry.yarnpkg.com/naive-ui/-/naive-ui-2.28.1.tgz#73739f6bedfaf96a1cb47ed3ec87f5c96554c458" - integrity sha512-wgQ0uebfeZGmOkh2iKCDZI0ycK9IhGkkyfGPya6/Yfs9sDytloknh7Aapk1bhVe5uMsyMQyhHNQoByWgENdxbA== + version "2.28.2" + resolved "https://registry.yarnpkg.com/naive-ui/-/naive-ui-2.28.2.tgz#266995e5f1e2c126b3de3152da1c3ed55009b207" + integrity sha512-7vRmTZ+2L8Bo62FAfQHLiQPm4HO1u/sPo/4qy2Iy48UrtCh5FhoxbnCxQO+pRqVNafmnY8TDB+qJ3WiGGYmg1A== dependencies: "@css-render/plugin-bem" "^0.15.9" "@css-render/vue3-ssr" "^0.15.9" @@ -741,7 +729,7 @@ naive-ui@^2.28.1: vdirs "^0.1.8" vfonts "^0.0.3" vooks "^0.2.12" - vueuc "^0.4.29" + vueuc "^0.4.32" nanoid@^3.3.1: version "3.3.3" @@ -810,11 +798,6 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -resize-observer-polyfill@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" - integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== - resolve@^1.22.0: version "1.22.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" @@ -832,9 +815,9 @@ rollup@^2.59.0: fsevents "~2.3.2" sass@^1.50.0: - version "1.50.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.50.0.tgz#3e407e2ebc53b12f1e35ce45efb226ea6063c7c8" - integrity sha512-cLsD6MEZ5URXHStxApajEh7gW189kkjn4Rc8DQweMyF+o5HF5nfEz8QYLMlPsTOD88DknatTmBWkOcw5/LnJLQ== + version "1.51.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.51.0.tgz#25ea36cf819581fe1fe8329e8c3a4eaaf70d2845" + integrity sha512-haGdpTgywJTvHC2b91GSq+clTKGbtkkZmVAb82jZQN/wTy6qs8DdFm2lhEQbEwrY0QDRgSQ3xDurqM977C3noA== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -891,10 +874,10 @@ treemate@^0.3.11: resolved "https://registry.yarnpkg.com/treemate/-/treemate-0.3.11.tgz#7d52f8f69ab9ce326f8d139e0a3d1ffb25e48222" integrity sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg== -type-fest@2.12.1: - version "2.12.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.12.1.tgz#d2be8f50bf5f8f0a5fd916d29bf3e98c17e960be" - integrity sha512-AiknQSEqKVGDDjtZqeKrUoTlcj7FKhupmnVUgz6KoOKtvMwRGE6hUNJ/nVear+h7fnUPO1q/htSkYKb1pyntkQ== +type-fest@2.12.2: + version "2.12.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.12.2.tgz#80a53614e6b9b475eb9077472fb7498dc7aa51d0" + integrity sha512-qt6ylCGpLjZ7AaODxbpyBZSs9fCI9SkL3Z9q2oxMBQhs/uyY+VD8jHA8ULCGmWQJlBgqvO3EJeAngOHD8zQCrQ== uri-js@^4.2.2: version "4.4.1" @@ -916,9 +899,9 @@ vfonts@^0.0.3: integrity sha512-nguyw8L6Un8eelg1vQ31vIU2ESxqid7EYmy8V+MDeMaHBqaRSkg3dTBToC1PR00D89UzS/SLkfYPnx0Wf23IQQ== vite@^2.9.2: - version "2.9.5" - resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.5.tgz#08ef37ac7a6d879c96f328b791732c9a00ea25ea" - integrity sha512-dvMN64X2YEQgSXF1lYabKXw3BbN6e+BL67+P3Vy4MacnY+UzT1AfkHiioFSi9+uiDUiaDy7Ax/LQqivk6orilg== + version "2.9.6" + resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.6.tgz#29f1b33193b0de9e155d67ba0dd097501c3c3281" + integrity sha512-3IffdrByHW95Yjv0a13TQOQfJs7L5dVlSPuTt432XLbRMriWbThqJN2k/IS6kXn5WY4xBLhK9XoaWay1B8VzUw== dependencies: esbuild "^0.14.27" postcss "^8.4.12" @@ -952,15 +935,15 @@ vue@^3.2.25: "@vue/server-renderer" "3.2.33" "@vue/shared" "3.2.33" -vueuc@^0.4.29: - version "0.4.29" - resolved "https://registry.yarnpkg.com/vueuc/-/vueuc-0.4.29.tgz#64ebba9e3dd6d6ad0ede5043c48d31631697346a" - integrity sha512-OlypOEll6YoTKnZx2aPml6orygNuzv+kwIztERzYiXPhCOE7/QMGQQek8NI/mDkb25vlglvm54n91ypYPMx8UQ== +vueuc@^0.4.32: + version "0.4.32" + resolved "https://registry.yarnpkg.com/vueuc/-/vueuc-0.4.32.tgz#6c239280c36816424e7ebf42c6151fff821211ff" + integrity sha512-Bmiuhn7g5O+dzW3eX2EghsG7CiocpLwRtgbX7aiILja9K0wjxVYrJqMOiYwCxB6pvO91JDywwINpFshMZru9/g== dependencies: "@css-render/vue3-ssr" "^0.15.7" + "@juggle/resize-observer" "^3.3.1" css-render "^0.15.7" evtd "^0.2.2" - resize-observer-polyfill "^1.5.1" seemly "^0.3.1" vdirs "^0.1.4" vooks "^0.2.4" diff --git a/misc/config_tools/scenario_config/default_populator.py b/misc/config_tools/scenario_config/default_populator.py index bc55b26f1..fdb19754d 100755 --- a/misc/config_tools/scenario_config/default_populator.py +++ b/misc/config_tools/scenario_config/default_populator.py @@ -58,6 +58,11 @@ class DefaultValuePopulator(ScenarioTransformer): return [new_node] + def fill_empty_node(self, xsd_element_node, xml_parent_node, xml_empty_node): + default_value = self.get_default_value(xsd_element_node, xml_parent_node) + if default_value is not None: + xml_empty_node.text = default_value + class DefaultValuePopulatingStage(PipelineStage): uses = {"schema_etree", "scenario_etree"} provides = {"scenario_etree"} diff --git a/misc/config_tools/scenario_config/jsonschema/converter.py b/misc/config_tools/scenario_config/jsonschema/converter.py index 052441db9..1272a8739 100644 --- a/misc/config_tools/scenario_config/jsonschema/converter.py +++ b/misc/config_tools/scenario_config/jsonschema/converter.py @@ -26,6 +26,7 @@ open(output_file, 'w', encoding='utf-8').write(json_schema) """ __package__ = 'scenario_config.jsonschema' + import os import json import re @@ -144,6 +145,12 @@ class XS2JS: json_schema["definitions"] = self._get_definitions() return json_schema + def convert_widget_config(self, annotation, js_ele): + if '@acrn:widget' in annotation: + js_ele['ui:widget'] = annotation['@acrn:widget'] + if '@acrn:widget-options' in annotation: + js_ele['ui:options'] = {eval(k): eval(v) for k, v in [kv.split('=') for kv in annotation['@acrn:widget-options'].split(',')]} + def xst2jst(self, type_name) -> str: """convert xml schema type name to json schema type name""" if type_name in self.xst2jst_mapping: @@ -188,6 +195,10 @@ class XS2JS: enum_names.append(enum_name) js_st["enumNames"] = enum_names + # widget and its options + if 'xs:annotation' in obj: + self.convert_widget_config(obj['xs:annotation'], js_st) + js_st.update(self.xsa2jsa(restriction)) return js_st elif 'xs:union' in obj: @@ -337,6 +348,9 @@ class XS2JS: else: js_ele['enum'] = dynamic_enum + # widget and its options + self.convert_widget_config(element['xs:annotation'], js_ele) + properties[name] = js_ele # build result @@ -375,7 +389,7 @@ def main(): config_tools = config_tools.parent schema_file = config_tools / 'schema' / 'sliced.xsd' - json_schema_file = config_tools / 'configurator' / 'src' / 'assets' / 'schema' / 'scenario.json' + json_schema_file = config_tools / 'configurator' / 'packages' / 'configurator' / 'src' / 'assets' / 'schema' / 'scenario.json' # Convert XSD to JSON Schema # Todo: turn off it diff --git a/misc/config_tools/scenario_config/scenario_transformer.py b/misc/config_tools/scenario_config/scenario_transformer.py index cec23de2c..ad0539514 100644 --- a/misc/config_tools/scenario_config/scenario_transformer.py +++ b/misc/config_tools/scenario_config/scenario_transformer.py @@ -68,7 +68,10 @@ class ScenarioTransformer: self.add_and_transform_missing_node(xsd_element_node, xml_node, new_node_index=index) else: while len(children) > 0 and children[0][1].tag == element_name: - self.transform_node(xsd_element_node, children.pop(0)[1]) + xml_child_node = children.pop(0)[1] + if self.complex_type_of_element(xsd_element_node, xml_child_node) is None and not xml_child_node.text: + self.fill_empty_node(xsd_element_node, xml_node, xml_child_node) + self.transform_node(xsd_element_node, xml_child_node) def transform_all(self, xsd_all_node, xml_node): for xsd_element_node in xsd_all_node.findall("xs:element", namespaces=self.xpath_ns): @@ -83,6 +86,8 @@ class ScenarioTransformer: self.add_and_transform_missing_node(xsd_element_node, xml_node) else: for xml_child_node in xml_children: + if self.complex_type_of_element(xsd_element_node, xml_child_node) is None and not xml_child_node.text: + self.fill_empty_node(xsd_element_node, xml_node, xml_child_node) self.transform_node(xsd_element_node, xml_child_node) def add_and_transform_missing_node(self, xsd_element_node, xml_parent_node, new_node_index=None): @@ -92,6 +97,9 @@ class ScenarioTransformer: def add_missing_nodes(self, xsd_element_node, xml_parent_node, new_node_index): return [] + def fill_empty_node(self, xsd_element_node, xml_parent_node, xml_empty_node): + pass + def transform(self, xml_etree): self.xml_etree = xml_etree diff --git a/misc/config_tools/schema/types.xsd b/misc/config_tools/schema/types.xsd index 36a4aae09..4ad2077c8 100644 --- a/misc/config_tools/schema/types.xsd +++ b/misc/config_tools/schema/types.xsd @@ -4,7 +4,7 @@ xmlns:acrn="https://projectacrn.org"> - + A Boolean value, written as ``y`` or ``n``. diff --git a/misc/config_tools/setup.cfg b/misc/config_tools/setup.cfg index 287e3ba5a..abdd1d3cd 100644 --- a/misc/config_tools/setup.cfg +++ b/misc/config_tools/setup.cfg @@ -29,4 +29,4 @@ where = . schema = *, */*, */*/*, */*/*/*, */*/*/*/* launch_config = *, */*, */*/*, */*/*/*, */*/*/*/* data = *, */*, */*/*, */*/*/*, */*/*/*/* -configurator = src/assets/schema/scenario.json +configurator = packages/configurator/src/assets/schema/scenario.json diff --git a/misc/packaging/gen_acrn_deb.py b/misc/packaging/gen_acrn_deb.py index 7cfb315fc..aa4cfddc1 100644 --- a/misc/packaging/gen_acrn_deb.py +++ b/misc/packaging/gen_acrn_deb.py @@ -209,7 +209,7 @@ def create_configurator_deb(build_dir): add_cmd_list(cmd_list, 'python3 converter.py', scenario_config_path / "jsonschema") add_cmd_list(cmd_list, 'bash -c "xmllint --xinclude schema/datachecks.xsd > schema/allchecks.xsd"', config_tools_path) add_cmd_list(cmd_list, 'python3 -m build', config_tools_path) - add_cmd_list(cmd_list, 'python3 thirdLib/manager.py install', configurator_path) + add_cmd_list(cmd_list, 'python3 packages/configurator/thirdLib/manager.py install', configurator_path) add_cmd_list(cmd_list, 'yarn', configurator_path) add_cmd_list(cmd_list, 'yarn build', configurator_path) run_cmd_list(cmd_list)