slicejs-web-framework 2.4.8 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.worktrees/bundling-v2-precompiled-registrars/LICENSE +21 -0
- package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/ContextManager/ContextManager.js +369 -0
- package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/ContextManager/ContextManagerDebugger.js +297 -0
- package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/Controller/Controller.js +972 -0
- package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/Debugger/Debugger.css +620 -0
- package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/Debugger/Debugger.html +73 -0
- package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/Debugger/Debugger.js +1548 -0
- package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/EventManager/EventManager.js +338 -0
- package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/EventManager/EventManagerDebugger.js +361 -0
- package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/Logger/Log.js +10 -0
- package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/Logger/Logger.js +146 -0
- package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/Router/Router.js +721 -0
- package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/StylesManager/StylesManager.js +78 -0
- package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/StylesManager/ThemeManager/ThemeManager.js +84 -0
- package/.worktrees/bundling-v2-precompiled-registrars/Slice/Slice.js +504 -0
- package/.worktrees/bundling-v2-precompiled-registrars/Slice/tests/bundle-v2-runtime-contract.test.js +268 -0
- package/.worktrees/bundling-v2-precompiled-registrars/Slice/tests/router-loading-finally.test.js +68 -0
- package/.worktrees/bundling-v2-precompiled-registrars/api/index.js +286 -0
- package/.worktrees/bundling-v2-precompiled-registrars/api/middleware/securityMiddleware.js +253 -0
- package/.worktrees/bundling-v2-precompiled-registrars/package.json +37 -0
- package/.worktrees/bundling-v2-precompiled-registrars/sliceConfig.schema.json +109 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/App/index.html +22 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/App/index.js +23 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/App/style.css +40 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/AppComponents/HomePage/HomePage.css +201 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/AppComponents/HomePage/HomePage.html +37 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/AppComponents/HomePage/HomePage.js +210 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/AppComponents/Playground/Playground.css +12 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/AppComponents/Playground/Playground.html +0 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/AppComponents/Playground/Playground.js +111 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Service/FetchManager/FetchManager.js +133 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Service/IndexedDbManager/IndexedDbManager.js +141 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Service/LocalStorageManager/LocalStorageManager.js +45 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Button/Button.css +47 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Button/Button.html +5 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Button/Button.js +93 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Card/Card.css +68 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Card/Card.html +7 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Card/Card.js +107 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Checkbox/Checkbox.css +87 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Checkbox/Checkbox.html +8 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Checkbox/Checkbox.js +86 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/CodeVisualizer/CodeVisualizer.css +130 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/CodeVisualizer/CodeVisualizer.html +4 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/CodeVisualizer/CodeVisualizer.js +262 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Details/Details.css +70 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Details/Details.html +9 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Details/Details.js +76 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/DropDown/DropDown.css +60 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/DropDown/DropDown.html +5 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/DropDown/DropDown.js +63 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Grid/Grid.css +7 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Grid/Grid.html +1 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Grid/Grid.js +57 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Icon/Icon.css +510 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Icon/Icon.html +1 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Icon/Icon.js +89 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Icon/slc.eot +0 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Icon/slc.json +555 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Icon/slc.styl +507 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Icon/slc.svg +1485 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Icon/slc.symbol.svg +1059 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Icon/slc.ttf +0 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Icon/slc.woff +0 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Icon/slc.woff2 +0 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Input/Input.css +91 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Input/Input.html +4 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Input/Input.js +215 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Layout/Layout.css +0 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Layout/Layout.html +0 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Layout/Layout.js +49 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Link/Link.css +8 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Link/Link.html +1 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Link/Link.js +63 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Loading/Loading.css +56 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Loading/Loading.html +83 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Loading/Loading.js +38 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/MultiRoute/MultiRoute.js +93 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Navbar/Navbar.css +115 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Navbar/Navbar.html +44 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Navbar/Navbar.js +141 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/NotFound/NotFound.css +117 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/NotFound/NotFound.html +24 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/NotFound/NotFound.js +16 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Route/Route.js +93 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Select/Select.css +84 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Select/Select.html +8 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Select/Select.js +195 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Switch/Switch.css +76 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Switch/Switch.html +8 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Switch/Switch.js +102 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/TreeItem/TreeItem.css +36 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/TreeItem/TreeItem.html +1 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/TreeItem/TreeItem.js +126 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/TreeView/TreeView.css +8 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/TreeView/TreeView.html +1 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/TreeView/TreeView.js +48 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Components/components.js +27 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Styles/sliceStyles.css +34 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Themes/Dark.css +42 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Themes/Light.css +31 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/Themes/Slice.css +47 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/images/Slice.js-logo.png +0 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/images/favicon.ico +0 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/images/im2/Slice.js-logo.png +0 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/routes.js +16 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/sliceConfig.json +73 -0
- package/.worktrees/bundling-v2-precompiled-registrars/src/testing.js +888 -0
- package/.worktrees/public-env-browser-exposure/LICENSE +21 -0
- package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/ContextManager/ContextManager.js +369 -0
- package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/ContextManager/ContextManagerDebugger.js +297 -0
- package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/Controller/Controller.js +972 -0
- package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/Debugger/Debugger.css +620 -0
- package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/Debugger/Debugger.html +73 -0
- package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/Debugger/Debugger.js +1548 -0
- package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/EventManager/EventManager.js +338 -0
- package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/EventManager/EventManagerDebugger.js +361 -0
- package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/Logger/Log.js +10 -0
- package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/Logger/Logger.js +146 -0
- package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/Router/Router.js +721 -0
- package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/StylesManager/StylesManager.js +78 -0
- package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/StylesManager/ThemeManager/ThemeManager.js +84 -0
- package/.worktrees/public-env-browser-exposure/Slice/Slice.js +533 -0
- package/.worktrees/public-env-browser-exposure/Slice/tests/bundle-v2-runtime-contract.test.js +268 -0
- package/.worktrees/public-env-browser-exposure/Slice/tests/public-env-runtime-accessors.test.js +44 -0
- package/.worktrees/public-env-browser-exposure/Slice/tests/router-loading-finally.test.js +68 -0
- package/.worktrees/public-env-browser-exposure/api/index.js +286 -0
- package/.worktrees/public-env-browser-exposure/api/middleware/securityMiddleware.js +253 -0
- package/.worktrees/public-env-browser-exposure/api/tests/public-env-resolver.test.js +193 -0
- package/.worktrees/public-env-browser-exposure/api/utils/publicEnvResolver.js +117 -0
- package/.worktrees/public-env-browser-exposure/package.json +37 -0
- package/.worktrees/public-env-browser-exposure/sliceConfig.schema.json +109 -0
- package/.worktrees/public-env-browser-exposure/src/App/index.html +22 -0
- package/.worktrees/public-env-browser-exposure/src/App/index.js +23 -0
- package/.worktrees/public-env-browser-exposure/src/App/style.css +40 -0
- package/.worktrees/public-env-browser-exposure/src/Components/AppComponents/HomePage/HomePage.css +201 -0
- package/.worktrees/public-env-browser-exposure/src/Components/AppComponents/HomePage/HomePage.html +37 -0
- package/.worktrees/public-env-browser-exposure/src/Components/AppComponents/HomePage/HomePage.js +210 -0
- package/.worktrees/public-env-browser-exposure/src/Components/AppComponents/Playground/Playground.css +12 -0
- package/.worktrees/public-env-browser-exposure/src/Components/AppComponents/Playground/Playground.html +0 -0
- package/.worktrees/public-env-browser-exposure/src/Components/AppComponents/Playground/Playground.js +111 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Service/FetchManager/FetchManager.js +133 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Service/IndexedDbManager/IndexedDbManager.js +141 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Service/LocalStorageManager/LocalStorageManager.js +45 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Button/Button.css +47 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Button/Button.html +5 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Button/Button.js +93 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Card/Card.css +68 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Card/Card.html +7 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Card/Card.js +107 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Checkbox/Checkbox.css +87 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Checkbox/Checkbox.html +8 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Checkbox/Checkbox.js +86 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/CodeVisualizer/CodeVisualizer.css +130 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/CodeVisualizer/CodeVisualizer.html +4 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/CodeVisualizer/CodeVisualizer.js +262 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Details/Details.css +70 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Details/Details.html +9 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Details/Details.js +76 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/DropDown/DropDown.css +60 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/DropDown/DropDown.html +5 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/DropDown/DropDown.js +63 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Grid/Grid.css +7 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Grid/Grid.html +1 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Grid/Grid.js +57 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Icon/Icon.css +510 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Icon/Icon.html +1 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Icon/Icon.js +89 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Icon/slc.eot +0 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Icon/slc.json +555 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Icon/slc.styl +507 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Icon/slc.svg +1485 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Icon/slc.symbol.svg +1059 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Icon/slc.ttf +0 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Icon/slc.woff +0 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Icon/slc.woff2 +0 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Input/Input.css +91 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Input/Input.html +4 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Input/Input.js +215 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Layout/Layout.css +0 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Layout/Layout.html +0 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Layout/Layout.js +49 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Link/Link.css +8 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Link/Link.html +1 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Link/Link.js +63 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Loading/Loading.css +56 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Loading/Loading.html +83 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Loading/Loading.js +38 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/MultiRoute/MultiRoute.js +93 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Navbar/Navbar.css +115 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Navbar/Navbar.html +44 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Navbar/Navbar.js +141 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/NotFound/NotFound.css +117 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/NotFound/NotFound.html +24 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/NotFound/NotFound.js +16 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Route/Route.js +93 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Select/Select.css +84 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Select/Select.html +8 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Select/Select.js +195 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Switch/Switch.css +76 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Switch/Switch.html +8 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/Switch/Switch.js +102 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/TreeItem/TreeItem.css +36 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/TreeItem/TreeItem.html +1 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/TreeItem/TreeItem.js +126 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/TreeView/TreeView.css +8 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/TreeView/TreeView.html +1 -0
- package/.worktrees/public-env-browser-exposure/src/Components/Visual/TreeView/TreeView.js +48 -0
- package/.worktrees/public-env-browser-exposure/src/Components/components.js +27 -0
- package/.worktrees/public-env-browser-exposure/src/Styles/sliceStyles.css +34 -0
- package/.worktrees/public-env-browser-exposure/src/Themes/Dark.css +42 -0
- package/.worktrees/public-env-browser-exposure/src/Themes/Light.css +31 -0
- package/.worktrees/public-env-browser-exposure/src/Themes/Slice.css +47 -0
- package/.worktrees/public-env-browser-exposure/src/images/Slice.js-logo.png +0 -0
- package/.worktrees/public-env-browser-exposure/src/images/favicon.ico +0 -0
- package/.worktrees/public-env-browser-exposure/src/images/im2/Slice.js-logo.png +0 -0
- package/.worktrees/public-env-browser-exposure/src/routes.js +16 -0
- package/.worktrees/public-env-browser-exposure/src/sliceConfig.json +73 -0
- package/.worktrees/public-env-browser-exposure/src/testing.js +888 -0
- package/Slice/Components/Structural/Controller/Controller.js +51 -29
- package/Slice/Components/Structural/Router/Router.js +25 -24
- package/Slice/Slice.js +79 -46
- package/Slice/tests/bundle-v2-runtime-contract.test.js +268 -0
- package/Slice/tests/public-env-runtime-accessors.test.js +44 -0
- package/Slice/tests/router-loading-finally.test.js +68 -0
- package/api/index.js +12 -12
- package/api/tests/public-env-resolver.test.js +193 -0
- package/api/utils/publicEnvResolver.js +117 -0
- package/package.json +1 -1
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
|
|
4
|
+
import Router from '../Components/Structural/Router/Router.js';
|
|
5
|
+
|
|
6
|
+
test('handleRoute stops loading when build throws on error path', async () => {
|
|
7
|
+
const originalSlice = globalThis.slice;
|
|
8
|
+
const originalDocument = globalThis.document;
|
|
9
|
+
|
|
10
|
+
const targetElement = {
|
|
11
|
+
innerHTML: 'existing',
|
|
12
|
+
appendChild() {},
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
try {
|
|
16
|
+
globalThis.document = {
|
|
17
|
+
querySelector(selector) {
|
|
18
|
+
if (selector === '#app') {
|
|
19
|
+
return targetElement;
|
|
20
|
+
}
|
|
21
|
+
return null;
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const loadingCalls = [];
|
|
26
|
+
|
|
27
|
+
globalThis.slice = {
|
|
28
|
+
loading: {
|
|
29
|
+
start() {
|
|
30
|
+
loadingCalls.push('start');
|
|
31
|
+
},
|
|
32
|
+
stop() {
|
|
33
|
+
loadingCalls.push('stop');
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
controller: {
|
|
37
|
+
getComponent() {
|
|
38
|
+
return null;
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
build: async () => {
|
|
42
|
+
throw new Error('boom');
|
|
43
|
+
},
|
|
44
|
+
router: {
|
|
45
|
+
activeRoute: null,
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const router = new Router([]);
|
|
50
|
+
|
|
51
|
+
await assert.rejects(
|
|
52
|
+
() =>
|
|
53
|
+
router.handleRoute(
|
|
54
|
+
{
|
|
55
|
+
component: 'Dashboard',
|
|
56
|
+
parentRoute: null,
|
|
57
|
+
},
|
|
58
|
+
{}
|
|
59
|
+
),
|
|
60
|
+
/boom/
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
assert.deepEqual(loadingCalls, ['start', 'stop']);
|
|
64
|
+
} finally {
|
|
65
|
+
globalThis.slice = originalSlice;
|
|
66
|
+
globalThis.document = originalDocument;
|
|
67
|
+
}
|
|
68
|
+
});
|
package/api/index.js
CHANGED
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
sliceFrameworkProtection,
|
|
10
10
|
suspiciousRequestLogger
|
|
11
11
|
} from './middleware/securityMiddleware.js';
|
|
12
|
+
import { createPublicEnvProvider } from './utils/publicEnvResolver.js';
|
|
12
13
|
|
|
13
14
|
const __filename = fileURLToPath(import.meta.url);
|
|
14
15
|
const __dirname = dirname(__filename);
|
|
@@ -22,6 +23,10 @@ const args = process.argv.slice(2);
|
|
|
22
23
|
|
|
23
24
|
const runMode = process.env.NODE_ENV === 'production' ? 'production' : 'development';
|
|
24
25
|
const folderDeployed = runMode === 'production' ? 'dist' : 'src';
|
|
26
|
+
const publicEnvProvider = createPublicEnvProvider({
|
|
27
|
+
mode: runMode,
|
|
28
|
+
envFilePath: path.join(__dirname, '..', '.env')
|
|
29
|
+
});
|
|
25
30
|
|
|
26
31
|
// Obtener puerto desde process.env.PORT con fallback a sliceConfig.json
|
|
27
32
|
const PORT = process.env.PORT || sliceConfig.server?.port || 3001;
|
|
@@ -90,18 +95,13 @@ app.use((req, res, next) => {
|
|
|
90
95
|
// RUNTIME MODE ENDPOINT
|
|
91
96
|
// ==============================================
|
|
92
97
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
100
|
-
// Explicit 404 so the SPA fallback doesn't return 200 for this dev-only endpoint.
|
|
101
|
-
app.get('/slice-env.json', (req, res) => {
|
|
102
|
-
res.status(404).json({ error: 'Not found' });
|
|
103
|
-
});
|
|
104
|
-
}
|
|
98
|
+
app.get('/slice-env.json', (req, res) => {
|
|
99
|
+
const payload = publicEnvProvider.getPayload();
|
|
100
|
+
res.setHeader('Cache-Control', 'no-store');
|
|
101
|
+
res.setHeader('Pragma', 'no-cache');
|
|
102
|
+
res.setHeader('Expires', '0');
|
|
103
|
+
res.json(payload);
|
|
104
|
+
});
|
|
105
105
|
|
|
106
106
|
// ==============================================
|
|
107
107
|
// ARCHIVOS ESTÁTICOS (DESPUÉS DE SEGURIDAD)
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { mkdtemp, rm, writeFile } from 'node:fs/promises';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { tmpdir } from 'node:os';
|
|
6
|
+
|
|
7
|
+
const resolverModulePath = new URL('../utils/publicEnvResolver.js', import.meta.url);
|
|
8
|
+
|
|
9
|
+
async function withTempEnvFile(contents, callback) {
|
|
10
|
+
const dir = await mkdtemp(path.join(tmpdir(), 'slice-public-env-'));
|
|
11
|
+
const envFilePath = path.join(dir, '.env');
|
|
12
|
+
|
|
13
|
+
try {
|
|
14
|
+
await writeFile(envFilePath, contents, 'utf8');
|
|
15
|
+
await callback(envFilePath);
|
|
16
|
+
} finally {
|
|
17
|
+
await rm(dir, { recursive: true, force: true });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
test('resolvePublicEnv filters only SLICE_PUBLIC_ keys', async () => {
|
|
22
|
+
const { resolvePublicEnv } = await import(resolverModulePath.href);
|
|
23
|
+
|
|
24
|
+
await withTempEnvFile(
|
|
25
|
+
['SLICE_PUBLIC_FROM_FILE=file-visible', 'PRIVATE_KEY=hidden-file-value', 'SLICE_API_URL=hidden-file-api-url'].join('\n'),
|
|
26
|
+
async (envFilePath) => {
|
|
27
|
+
const payload = resolvePublicEnv({
|
|
28
|
+
mode: 'development',
|
|
29
|
+
envFilePath,
|
|
30
|
+
processEnv: {
|
|
31
|
+
SLICE_PUBLIC_FROM_PROCESS: 'process-visible',
|
|
32
|
+
SECRET_TOKEN: 'hidden-process-token',
|
|
33
|
+
NODE_ENV: 'development',
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
assert.equal(payload.mode, 'development');
|
|
38
|
+
assert.deepEqual(payload.env, {
|
|
39
|
+
SLICE_PUBLIC_FROM_FILE: 'file-visible',
|
|
40
|
+
SLICE_PUBLIC_FROM_PROCESS: 'process-visible',
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test('resolvePublicEnv uses process.env values over .env values', async () => {
|
|
47
|
+
const { resolvePublicEnv } = await import(resolverModulePath.href);
|
|
48
|
+
|
|
49
|
+
await withTempEnvFile('SLICE_PUBLIC_API_URL=https://from-file.example', async (envFilePath) => {
|
|
50
|
+
const payload = resolvePublicEnv({
|
|
51
|
+
mode: 'development',
|
|
52
|
+
envFilePath,
|
|
53
|
+
processEnv: {
|
|
54
|
+
SLICE_PUBLIC_API_URL: 'https://from-process.example',
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
assert.equal(payload.mode, 'development');
|
|
59
|
+
assert.equal(payload.env.SLICE_PUBLIC_API_URL, 'https://from-process.example');
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test('resolvePublicEnv warns about suspicious public key names without exposing values', async () => {
|
|
64
|
+
const { resolvePublicEnv } = await import(resolverModulePath.href);
|
|
65
|
+
const warnings = [];
|
|
66
|
+
const logger = {
|
|
67
|
+
warn: (...args) => warnings.push(args.map(String).join(' ')),
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
await withTempEnvFile('SLICE_PUBLIC_API_KEY=super-secret-value', async (envFilePath) => {
|
|
71
|
+
const payload = resolvePublicEnv({
|
|
72
|
+
mode: 'development',
|
|
73
|
+
envFilePath,
|
|
74
|
+
processEnv: {},
|
|
75
|
+
logger,
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
assert.equal(payload.mode, 'development');
|
|
79
|
+
assert.equal(payload.env.SLICE_PUBLIC_API_KEY, 'super-secret-value');
|
|
80
|
+
assert.equal(warnings.length, 1);
|
|
81
|
+
assert.match(warnings[0], /SLICE_PUBLIC_API_KEY/);
|
|
82
|
+
assert.doesNotMatch(warnings[0], /super-secret-value/);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test('resolvePublicEnv warns once when suspicious key appears in .env and processEnv', async () => {
|
|
87
|
+
const { resolvePublicEnv } = await import(resolverModulePath.href);
|
|
88
|
+
const warnings = [];
|
|
89
|
+
const logger = {
|
|
90
|
+
warn: (...args) => warnings.push(args.map(String).join(' ')),
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
await withTempEnvFile('SLICE_PUBLIC_API_KEY=from-file-secret', async (envFilePath) => {
|
|
94
|
+
const payload = resolvePublicEnv({
|
|
95
|
+
mode: 'development',
|
|
96
|
+
envFilePath,
|
|
97
|
+
processEnv: {
|
|
98
|
+
SLICE_PUBLIC_API_KEY: 'from-process-secret',
|
|
99
|
+
},
|
|
100
|
+
logger,
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
assert.equal(payload.env.SLICE_PUBLIC_API_KEY, 'from-process-secret');
|
|
104
|
+
assert.equal(warnings.length, 1);
|
|
105
|
+
assert.match(warnings[0], /SLICE_PUBLIC_API_KEY/);
|
|
106
|
+
assert.doesNotMatch(warnings[0], /from-file-secret|from-process-secret/);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test('resolvePublicEnv parses first key when .env starts with BOM', async () => {
|
|
111
|
+
const { resolvePublicEnv } = await import(resolverModulePath.href);
|
|
112
|
+
|
|
113
|
+
await withTempEnvFile('\uFEFFSLICE_PUBLIC_TITLE=Slice App', async (envFilePath) => {
|
|
114
|
+
const payload = resolvePublicEnv({
|
|
115
|
+
mode: 'development',
|
|
116
|
+
envFilePath,
|
|
117
|
+
processEnv: {},
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
assert.equal(payload.env.SLICE_PUBLIC_TITLE, 'Slice App');
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test('resolvePublicEnv strips inline comments for unquoted values', async () => {
|
|
125
|
+
const { resolvePublicEnv } = await import(resolverModulePath.href);
|
|
126
|
+
|
|
127
|
+
await withTempEnvFile('SLICE_PUBLIC_ORIGIN=https://slice.dev # dev origin', async (envFilePath) => {
|
|
128
|
+
const payload = resolvePublicEnv({
|
|
129
|
+
mode: 'development',
|
|
130
|
+
envFilePath,
|
|
131
|
+
processEnv: {},
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
assert.equal(payload.env.SLICE_PUBLIC_ORIGIN, 'https://slice.dev');
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
test('resolvePublicEnv strips trailing comments after quoted values', async () => {
|
|
139
|
+
const { resolvePublicEnv } = await import(resolverModulePath.href);
|
|
140
|
+
|
|
141
|
+
await withTempEnvFile('SLICE_PUBLIC_X="value" # comment', async (envFilePath) => {
|
|
142
|
+
const payload = resolvePublicEnv({
|
|
143
|
+
mode: 'development',
|
|
144
|
+
envFilePath,
|
|
145
|
+
processEnv: {},
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
assert.equal(payload.env.SLICE_PUBLIC_X, 'value');
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
test('createPublicEnvProvider caches in production and recomputes in development', async () => {
|
|
153
|
+
const { createPublicEnvProvider } = await import(resolverModulePath.href);
|
|
154
|
+
|
|
155
|
+
await withTempEnvFile('SLICE_PUBLIC_COUNTER=from-file', async (envFilePath) => {
|
|
156
|
+
let processValue = 'first-value';
|
|
157
|
+
const processEnv = {
|
|
158
|
+
get SLICE_PUBLIC_COUNTER() {
|
|
159
|
+
return processValue;
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
const productionProvider = createPublicEnvProvider({
|
|
164
|
+
mode: 'production',
|
|
165
|
+
envFilePath,
|
|
166
|
+
processEnv,
|
|
167
|
+
});
|
|
168
|
+
assert.equal(typeof productionProvider.getPayload, 'function');
|
|
169
|
+
|
|
170
|
+
const firstProduction = productionProvider.getPayload();
|
|
171
|
+
processValue = 'second-value';
|
|
172
|
+
const secondProduction = productionProvider.getPayload();
|
|
173
|
+
|
|
174
|
+
assert.equal(firstProduction.mode, 'production');
|
|
175
|
+
assert.equal(firstProduction.env.SLICE_PUBLIC_COUNTER, 'first-value');
|
|
176
|
+
assert.equal(secondProduction.env.SLICE_PUBLIC_COUNTER, 'first-value');
|
|
177
|
+
|
|
178
|
+
const developmentProvider = createPublicEnvProvider({
|
|
179
|
+
mode: 'development',
|
|
180
|
+
envFilePath,
|
|
181
|
+
processEnv,
|
|
182
|
+
});
|
|
183
|
+
assert.equal(typeof developmentProvider.getPayload, 'function');
|
|
184
|
+
|
|
185
|
+
const firstDevelopment = developmentProvider.getPayload();
|
|
186
|
+
processValue = 'third-value';
|
|
187
|
+
const secondDevelopment = developmentProvider.getPayload();
|
|
188
|
+
|
|
189
|
+
assert.equal(firstDevelopment.mode, 'development');
|
|
190
|
+
assert.equal(firstDevelopment.env.SLICE_PUBLIC_COUNTER, 'second-value');
|
|
191
|
+
assert.equal(secondDevelopment.env.SLICE_PUBLIC_COUNTER, 'third-value');
|
|
192
|
+
});
|
|
193
|
+
});
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
2
|
+
|
|
3
|
+
const PUBLIC_PREFIX = 'SLICE_PUBLIC_';
|
|
4
|
+
const SUSPICIOUS_TERMS = ['SECRET', 'TOKEN', 'PASSWORD', 'PRIVATE', 'API_KEY', 'ACCESS_KEY', 'CREDENTIAL'];
|
|
5
|
+
|
|
6
|
+
function parseEnvFile(envFilePath) {
|
|
7
|
+
if (!envFilePath || !existsSync(envFilePath)) {
|
|
8
|
+
return {};
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const fileContent = readFileSync(envFilePath, 'utf8').replace(/^\uFEFF/, '');
|
|
12
|
+
const parsed = {};
|
|
13
|
+
const lines = fileContent.split(/\r?\n/);
|
|
14
|
+
|
|
15
|
+
for (const rawLine of lines) {
|
|
16
|
+
const line = rawLine.trim();
|
|
17
|
+
|
|
18
|
+
if (!line || line.startsWith('#')) {
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const equalsIndex = line.indexOf('=');
|
|
23
|
+
if (equalsIndex === -1) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
let key = line.slice(0, equalsIndex).trim();
|
|
28
|
+
if (!key) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (key.startsWith('export ')) {
|
|
33
|
+
key = key.slice('export '.length).trim();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
let value = line.slice(equalsIndex + 1).trim();
|
|
37
|
+
|
|
38
|
+
const quotedWithOptionalCommentMatch = value.match(/^(["'])(.*?)\1(?:\s+#.*)?$/);
|
|
39
|
+
|
|
40
|
+
if (quotedWithOptionalCommentMatch) {
|
|
41
|
+
value = quotedWithOptionalCommentMatch[2];
|
|
42
|
+
} else {
|
|
43
|
+
value = value.replace(/\s+#.*$/, '').trimEnd();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
parsed[key] = value;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return parsed;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function warnSuspiciousKey(key, logger, warnedKeys) {
|
|
53
|
+
const upperKey = key.toUpperCase();
|
|
54
|
+
const isSuspicious = SUSPICIOUS_TERMS.some((term) => upperKey.includes(term));
|
|
55
|
+
|
|
56
|
+
if (isSuspicious && !warnedKeys.has(key) && logger && typeof logger.warn === 'function') {
|
|
57
|
+
logger.warn(`[slice-env] Suspicious public environment key detected: ${key}`);
|
|
58
|
+
warnedKeys.add(key);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function buildPublicPayload({ envFromFile, processEnv, logger }) {
|
|
63
|
+
const env = {};
|
|
64
|
+
const warnedKeys = new Set();
|
|
65
|
+
|
|
66
|
+
for (const [key, value] of Object.entries(envFromFile)) {
|
|
67
|
+
if (key.startsWith(PUBLIC_PREFIX)) {
|
|
68
|
+
env[key] = String(value ?? '');
|
|
69
|
+
warnSuspiciousKey(key, logger, warnedKeys);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
for (const [key, value] of Object.entries(processEnv || {})) {
|
|
74
|
+
if (key.startsWith(PUBLIC_PREFIX)) {
|
|
75
|
+
env[key] = String(value ?? '');
|
|
76
|
+
warnSuspiciousKey(key, logger, warnedKeys);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return env;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function resolvePublicEnv({ mode, envFilePath, processEnv = process.env, logger = console }) {
|
|
84
|
+
const envFromFile = parseEnvFile(envFilePath);
|
|
85
|
+
const env = buildPublicPayload({
|
|
86
|
+
envFromFile,
|
|
87
|
+
processEnv,
|
|
88
|
+
logger,
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
return {
|
|
92
|
+
mode,
|
|
93
|
+
env,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export function createPublicEnvProvider({ mode, envFilePath, processEnv = process.env, logger = console }) {
|
|
98
|
+
if (mode === 'production') {
|
|
99
|
+
let cachedPayload;
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
getPayload() {
|
|
103
|
+
if (!cachedPayload) {
|
|
104
|
+
cachedPayload = resolvePublicEnv({ mode, envFilePath, processEnv, logger });
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return cachedPayload;
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return {
|
|
113
|
+
getPayload() {
|
|
114
|
+
return resolvePublicEnv({ mode, envFilePath, processEnv, logger });
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
}
|