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.
Files changed (229) hide show
  1. package/.worktrees/bundling-v2-precompiled-registrars/LICENSE +21 -0
  2. package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/ContextManager/ContextManager.js +369 -0
  3. package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/ContextManager/ContextManagerDebugger.js +297 -0
  4. package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/Controller/Controller.js +972 -0
  5. package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/Debugger/Debugger.css +620 -0
  6. package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/Debugger/Debugger.html +73 -0
  7. package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/Debugger/Debugger.js +1548 -0
  8. package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/EventManager/EventManager.js +338 -0
  9. package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/EventManager/EventManagerDebugger.js +361 -0
  10. package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/Logger/Log.js +10 -0
  11. package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/Logger/Logger.js +146 -0
  12. package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/Router/Router.js +721 -0
  13. package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/StylesManager/StylesManager.js +78 -0
  14. package/.worktrees/bundling-v2-precompiled-registrars/Slice/Components/Structural/StylesManager/ThemeManager/ThemeManager.js +84 -0
  15. package/.worktrees/bundling-v2-precompiled-registrars/Slice/Slice.js +504 -0
  16. package/.worktrees/bundling-v2-precompiled-registrars/Slice/tests/bundle-v2-runtime-contract.test.js +268 -0
  17. package/.worktrees/bundling-v2-precompiled-registrars/Slice/tests/router-loading-finally.test.js +68 -0
  18. package/.worktrees/bundling-v2-precompiled-registrars/api/index.js +286 -0
  19. package/.worktrees/bundling-v2-precompiled-registrars/api/middleware/securityMiddleware.js +253 -0
  20. package/.worktrees/bundling-v2-precompiled-registrars/package.json +37 -0
  21. package/.worktrees/bundling-v2-precompiled-registrars/sliceConfig.schema.json +109 -0
  22. package/.worktrees/bundling-v2-precompiled-registrars/src/App/index.html +22 -0
  23. package/.worktrees/bundling-v2-precompiled-registrars/src/App/index.js +23 -0
  24. package/.worktrees/bundling-v2-precompiled-registrars/src/App/style.css +40 -0
  25. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/AppComponents/HomePage/HomePage.css +201 -0
  26. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/AppComponents/HomePage/HomePage.html +37 -0
  27. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/AppComponents/HomePage/HomePage.js +210 -0
  28. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/AppComponents/Playground/Playground.css +12 -0
  29. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/AppComponents/Playground/Playground.html +0 -0
  30. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/AppComponents/Playground/Playground.js +111 -0
  31. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Service/FetchManager/FetchManager.js +133 -0
  32. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Service/IndexedDbManager/IndexedDbManager.js +141 -0
  33. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Service/LocalStorageManager/LocalStorageManager.js +45 -0
  34. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Button/Button.css +47 -0
  35. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Button/Button.html +5 -0
  36. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Button/Button.js +93 -0
  37. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Card/Card.css +68 -0
  38. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Card/Card.html +7 -0
  39. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Card/Card.js +107 -0
  40. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Checkbox/Checkbox.css +87 -0
  41. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Checkbox/Checkbox.html +8 -0
  42. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Checkbox/Checkbox.js +86 -0
  43. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/CodeVisualizer/CodeVisualizer.css +130 -0
  44. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/CodeVisualizer/CodeVisualizer.html +4 -0
  45. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/CodeVisualizer/CodeVisualizer.js +262 -0
  46. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Details/Details.css +70 -0
  47. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Details/Details.html +9 -0
  48. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Details/Details.js +76 -0
  49. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/DropDown/DropDown.css +60 -0
  50. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/DropDown/DropDown.html +5 -0
  51. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/DropDown/DropDown.js +63 -0
  52. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Grid/Grid.css +7 -0
  53. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Grid/Grid.html +1 -0
  54. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Grid/Grid.js +57 -0
  55. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Icon/Icon.css +510 -0
  56. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Icon/Icon.html +1 -0
  57. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Icon/Icon.js +89 -0
  58. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Icon/slc.eot +0 -0
  59. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Icon/slc.json +555 -0
  60. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Icon/slc.styl +507 -0
  61. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Icon/slc.svg +1485 -0
  62. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Icon/slc.symbol.svg +1059 -0
  63. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Icon/slc.ttf +0 -0
  64. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Icon/slc.woff +0 -0
  65. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Icon/slc.woff2 +0 -0
  66. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Input/Input.css +91 -0
  67. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Input/Input.html +4 -0
  68. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Input/Input.js +215 -0
  69. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Layout/Layout.css +0 -0
  70. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Layout/Layout.html +0 -0
  71. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Layout/Layout.js +49 -0
  72. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Link/Link.css +8 -0
  73. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Link/Link.html +1 -0
  74. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Link/Link.js +63 -0
  75. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Loading/Loading.css +56 -0
  76. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Loading/Loading.html +83 -0
  77. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Loading/Loading.js +38 -0
  78. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/MultiRoute/MultiRoute.js +93 -0
  79. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Navbar/Navbar.css +115 -0
  80. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Navbar/Navbar.html +44 -0
  81. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Navbar/Navbar.js +141 -0
  82. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/NotFound/NotFound.css +117 -0
  83. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/NotFound/NotFound.html +24 -0
  84. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/NotFound/NotFound.js +16 -0
  85. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Route/Route.js +93 -0
  86. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Select/Select.css +84 -0
  87. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Select/Select.html +8 -0
  88. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Select/Select.js +195 -0
  89. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Switch/Switch.css +76 -0
  90. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Switch/Switch.html +8 -0
  91. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/Switch/Switch.js +102 -0
  92. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/TreeItem/TreeItem.css +36 -0
  93. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/TreeItem/TreeItem.html +1 -0
  94. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/TreeItem/TreeItem.js +126 -0
  95. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/TreeView/TreeView.css +8 -0
  96. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/TreeView/TreeView.html +1 -0
  97. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/Visual/TreeView/TreeView.js +48 -0
  98. package/.worktrees/bundling-v2-precompiled-registrars/src/Components/components.js +27 -0
  99. package/.worktrees/bundling-v2-precompiled-registrars/src/Styles/sliceStyles.css +34 -0
  100. package/.worktrees/bundling-v2-precompiled-registrars/src/Themes/Dark.css +42 -0
  101. package/.worktrees/bundling-v2-precompiled-registrars/src/Themes/Light.css +31 -0
  102. package/.worktrees/bundling-v2-precompiled-registrars/src/Themes/Slice.css +47 -0
  103. package/.worktrees/bundling-v2-precompiled-registrars/src/images/Slice.js-logo.png +0 -0
  104. package/.worktrees/bundling-v2-precompiled-registrars/src/images/favicon.ico +0 -0
  105. package/.worktrees/bundling-v2-precompiled-registrars/src/images/im2/Slice.js-logo.png +0 -0
  106. package/.worktrees/bundling-v2-precompiled-registrars/src/routes.js +16 -0
  107. package/.worktrees/bundling-v2-precompiled-registrars/src/sliceConfig.json +73 -0
  108. package/.worktrees/bundling-v2-precompiled-registrars/src/testing.js +888 -0
  109. package/.worktrees/public-env-browser-exposure/LICENSE +21 -0
  110. package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/ContextManager/ContextManager.js +369 -0
  111. package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/ContextManager/ContextManagerDebugger.js +297 -0
  112. package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/Controller/Controller.js +972 -0
  113. package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/Debugger/Debugger.css +620 -0
  114. package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/Debugger/Debugger.html +73 -0
  115. package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/Debugger/Debugger.js +1548 -0
  116. package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/EventManager/EventManager.js +338 -0
  117. package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/EventManager/EventManagerDebugger.js +361 -0
  118. package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/Logger/Log.js +10 -0
  119. package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/Logger/Logger.js +146 -0
  120. package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/Router/Router.js +721 -0
  121. package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/StylesManager/StylesManager.js +78 -0
  122. package/.worktrees/public-env-browser-exposure/Slice/Components/Structural/StylesManager/ThemeManager/ThemeManager.js +84 -0
  123. package/.worktrees/public-env-browser-exposure/Slice/Slice.js +533 -0
  124. package/.worktrees/public-env-browser-exposure/Slice/tests/bundle-v2-runtime-contract.test.js +268 -0
  125. package/.worktrees/public-env-browser-exposure/Slice/tests/public-env-runtime-accessors.test.js +44 -0
  126. package/.worktrees/public-env-browser-exposure/Slice/tests/router-loading-finally.test.js +68 -0
  127. package/.worktrees/public-env-browser-exposure/api/index.js +286 -0
  128. package/.worktrees/public-env-browser-exposure/api/middleware/securityMiddleware.js +253 -0
  129. package/.worktrees/public-env-browser-exposure/api/tests/public-env-resolver.test.js +193 -0
  130. package/.worktrees/public-env-browser-exposure/api/utils/publicEnvResolver.js +117 -0
  131. package/.worktrees/public-env-browser-exposure/package.json +37 -0
  132. package/.worktrees/public-env-browser-exposure/sliceConfig.schema.json +109 -0
  133. package/.worktrees/public-env-browser-exposure/src/App/index.html +22 -0
  134. package/.worktrees/public-env-browser-exposure/src/App/index.js +23 -0
  135. package/.worktrees/public-env-browser-exposure/src/App/style.css +40 -0
  136. package/.worktrees/public-env-browser-exposure/src/Components/AppComponents/HomePage/HomePage.css +201 -0
  137. package/.worktrees/public-env-browser-exposure/src/Components/AppComponents/HomePage/HomePage.html +37 -0
  138. package/.worktrees/public-env-browser-exposure/src/Components/AppComponents/HomePage/HomePage.js +210 -0
  139. package/.worktrees/public-env-browser-exposure/src/Components/AppComponents/Playground/Playground.css +12 -0
  140. package/.worktrees/public-env-browser-exposure/src/Components/AppComponents/Playground/Playground.html +0 -0
  141. package/.worktrees/public-env-browser-exposure/src/Components/AppComponents/Playground/Playground.js +111 -0
  142. package/.worktrees/public-env-browser-exposure/src/Components/Service/FetchManager/FetchManager.js +133 -0
  143. package/.worktrees/public-env-browser-exposure/src/Components/Service/IndexedDbManager/IndexedDbManager.js +141 -0
  144. package/.worktrees/public-env-browser-exposure/src/Components/Service/LocalStorageManager/LocalStorageManager.js +45 -0
  145. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Button/Button.css +47 -0
  146. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Button/Button.html +5 -0
  147. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Button/Button.js +93 -0
  148. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Card/Card.css +68 -0
  149. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Card/Card.html +7 -0
  150. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Card/Card.js +107 -0
  151. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Checkbox/Checkbox.css +87 -0
  152. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Checkbox/Checkbox.html +8 -0
  153. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Checkbox/Checkbox.js +86 -0
  154. package/.worktrees/public-env-browser-exposure/src/Components/Visual/CodeVisualizer/CodeVisualizer.css +130 -0
  155. package/.worktrees/public-env-browser-exposure/src/Components/Visual/CodeVisualizer/CodeVisualizer.html +4 -0
  156. package/.worktrees/public-env-browser-exposure/src/Components/Visual/CodeVisualizer/CodeVisualizer.js +262 -0
  157. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Details/Details.css +70 -0
  158. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Details/Details.html +9 -0
  159. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Details/Details.js +76 -0
  160. package/.worktrees/public-env-browser-exposure/src/Components/Visual/DropDown/DropDown.css +60 -0
  161. package/.worktrees/public-env-browser-exposure/src/Components/Visual/DropDown/DropDown.html +5 -0
  162. package/.worktrees/public-env-browser-exposure/src/Components/Visual/DropDown/DropDown.js +63 -0
  163. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Grid/Grid.css +7 -0
  164. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Grid/Grid.html +1 -0
  165. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Grid/Grid.js +57 -0
  166. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Icon/Icon.css +510 -0
  167. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Icon/Icon.html +1 -0
  168. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Icon/Icon.js +89 -0
  169. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Icon/slc.eot +0 -0
  170. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Icon/slc.json +555 -0
  171. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Icon/slc.styl +507 -0
  172. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Icon/slc.svg +1485 -0
  173. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Icon/slc.symbol.svg +1059 -0
  174. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Icon/slc.ttf +0 -0
  175. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Icon/slc.woff +0 -0
  176. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Icon/slc.woff2 +0 -0
  177. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Input/Input.css +91 -0
  178. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Input/Input.html +4 -0
  179. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Input/Input.js +215 -0
  180. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Layout/Layout.css +0 -0
  181. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Layout/Layout.html +0 -0
  182. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Layout/Layout.js +49 -0
  183. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Link/Link.css +8 -0
  184. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Link/Link.html +1 -0
  185. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Link/Link.js +63 -0
  186. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Loading/Loading.css +56 -0
  187. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Loading/Loading.html +83 -0
  188. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Loading/Loading.js +38 -0
  189. package/.worktrees/public-env-browser-exposure/src/Components/Visual/MultiRoute/MultiRoute.js +93 -0
  190. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Navbar/Navbar.css +115 -0
  191. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Navbar/Navbar.html +44 -0
  192. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Navbar/Navbar.js +141 -0
  193. package/.worktrees/public-env-browser-exposure/src/Components/Visual/NotFound/NotFound.css +117 -0
  194. package/.worktrees/public-env-browser-exposure/src/Components/Visual/NotFound/NotFound.html +24 -0
  195. package/.worktrees/public-env-browser-exposure/src/Components/Visual/NotFound/NotFound.js +16 -0
  196. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Route/Route.js +93 -0
  197. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Select/Select.css +84 -0
  198. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Select/Select.html +8 -0
  199. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Select/Select.js +195 -0
  200. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Switch/Switch.css +76 -0
  201. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Switch/Switch.html +8 -0
  202. package/.worktrees/public-env-browser-exposure/src/Components/Visual/Switch/Switch.js +102 -0
  203. package/.worktrees/public-env-browser-exposure/src/Components/Visual/TreeItem/TreeItem.css +36 -0
  204. package/.worktrees/public-env-browser-exposure/src/Components/Visual/TreeItem/TreeItem.html +1 -0
  205. package/.worktrees/public-env-browser-exposure/src/Components/Visual/TreeItem/TreeItem.js +126 -0
  206. package/.worktrees/public-env-browser-exposure/src/Components/Visual/TreeView/TreeView.css +8 -0
  207. package/.worktrees/public-env-browser-exposure/src/Components/Visual/TreeView/TreeView.html +1 -0
  208. package/.worktrees/public-env-browser-exposure/src/Components/Visual/TreeView/TreeView.js +48 -0
  209. package/.worktrees/public-env-browser-exposure/src/Components/components.js +27 -0
  210. package/.worktrees/public-env-browser-exposure/src/Styles/sliceStyles.css +34 -0
  211. package/.worktrees/public-env-browser-exposure/src/Themes/Dark.css +42 -0
  212. package/.worktrees/public-env-browser-exposure/src/Themes/Light.css +31 -0
  213. package/.worktrees/public-env-browser-exposure/src/Themes/Slice.css +47 -0
  214. package/.worktrees/public-env-browser-exposure/src/images/Slice.js-logo.png +0 -0
  215. package/.worktrees/public-env-browser-exposure/src/images/favicon.ico +0 -0
  216. package/.worktrees/public-env-browser-exposure/src/images/im2/Slice.js-logo.png +0 -0
  217. package/.worktrees/public-env-browser-exposure/src/routes.js +16 -0
  218. package/.worktrees/public-env-browser-exposure/src/sliceConfig.json +73 -0
  219. package/.worktrees/public-env-browser-exposure/src/testing.js +888 -0
  220. package/Slice/Components/Structural/Controller/Controller.js +51 -29
  221. package/Slice/Components/Structural/Router/Router.js +25 -24
  222. package/Slice/Slice.js +79 -46
  223. package/Slice/tests/bundle-v2-runtime-contract.test.js +268 -0
  224. package/Slice/tests/public-env-runtime-accessors.test.js +44 -0
  225. package/Slice/tests/router-loading-finally.test.js +68 -0
  226. package/api/index.js +12 -12
  227. package/api/tests/public-env-resolver.test.js +193 -0
  228. package/api/utils/publicEnvResolver.js +117 -0
  229. package/package.json +1 -1
@@ -0,0 +1,268 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { mkdtemp, rm, writeFile } from 'node:fs/promises';
4
+ import { tmpdir } from 'node:os';
5
+ import path from 'node:path';
6
+ import { register } from 'node:module';
7
+ import { pathToFileURL } from 'node:url';
8
+
9
+ test('validateBundleModule rejects module missing Bundling V2 exports contract', async () => {
10
+ const tempDir = await mkdtemp(path.join(tmpdir(), 'slice-controller-loader-'));
11
+ const loaderPath = path.join(tempDir, 'components-alias-loader.mjs');
12
+ await writeFile(
13
+ loaderPath,
14
+ `export async function resolve(specifier, context, nextResolve) {
15
+ if (specifier === '/Components/components.js') {
16
+ return {
17
+ shortCircuit: true,
18
+ url: 'data:text/javascript,export default {};',
19
+ };
20
+ }
21
+ return nextResolve(specifier, context);
22
+ }
23
+ `,
24
+ 'utf8'
25
+ );
26
+ register(pathToFileURL(loaderPath).href);
27
+
28
+ const controllerModuleUrl = new URL('../Components/Structural/Controller/Controller.js', import.meta.url).href;
29
+ const { default: Controller } = await import(controllerModuleUrl);
30
+ const controller = new Controller();
31
+ const originalWindow = globalThis.window;
32
+
33
+ try {
34
+ globalThis.window = {
35
+ __slicePendingRegistrations: [],
36
+ };
37
+
38
+ assert.equal(
39
+ typeof controller.validateBundleModule,
40
+ 'function',
41
+ 'Controller must expose validateBundleModule for Bundling V2 runtime contract checks'
42
+ );
43
+
44
+ if (typeof controller.validateBundleModule === 'function') {
45
+ await assert.rejects(
46
+ () => Promise.resolve(controller.validateBundleModule({ default: {} }, 'critical.js')),
47
+ /missing bundling v2 exports contract/i
48
+ );
49
+ }
50
+ } finally {
51
+ globalThis.window = originalWindow;
52
+ await rm(tempDir, { recursive: true, force: true });
53
+ }
54
+ });
55
+
56
+ test('loadBundle marks requested bundle key and metadata bundleKey as loaded', async () => {
57
+ const tempDir = await mkdtemp(path.join(tmpdir(), 'slice-controller-loader-'));
58
+ const loaderPath = path.join(tempDir, 'components-alias-loader.mjs');
59
+ await writeFile(
60
+ loaderPath,
61
+ `export async function resolve(specifier, context, nextResolve) {
62
+ if (specifier === '/Components/components.js') {
63
+ return {
64
+ shortCircuit: true,
65
+ url: 'data:text/javascript,export default {};',
66
+ };
67
+ }
68
+ return nextResolve(specifier, context);
69
+ }
70
+ `,
71
+ 'utf8'
72
+ );
73
+ register(pathToFileURL(loaderPath).href);
74
+
75
+ const controllerModuleUrl = new URL('../Components/Structural/Controller/Controller.js', import.meta.url).href;
76
+ const { default: Controller } = await import(controllerModuleUrl);
77
+ const controller = new Controller();
78
+ const originalSlice = globalThis.slice;
79
+
80
+ controller.bundleConfig = {
81
+ bundles: {
82
+ routes: {
83
+ dashboard: {
84
+ file: 'dashboard.js',
85
+ },
86
+ },
87
+ },
88
+ };
89
+
90
+ controller.importBundleOnce = async () => ({});
91
+ controller.validateBundleModule = async () => ({
92
+ metadata: {
93
+ bundleKey: 'routes.dashboard.v2',
94
+ type: 'route',
95
+ },
96
+ registerAll: async () => {},
97
+ });
98
+
99
+ try {
100
+ globalThis.slice = {
101
+ stylesManager: {},
102
+ };
103
+
104
+ await controller.loadBundle('dashboard');
105
+
106
+ assert.equal(controller.loadedBundles.has('dashboard'), true);
107
+ assert.equal(controller.loadedBundles.has('routes.dashboard.v2'), true);
108
+ assert.equal(controller.criticalBundleLoaded, false);
109
+ } finally {
110
+ globalThis.slice = originalSlice;
111
+ await rm(tempDir, { recursive: true, force: true });
112
+ }
113
+ });
114
+
115
+ test('Slice init fails fast with contextual error on invalid Bundling V2 contract path', async () => {
116
+ const tempDir = await mkdtemp(path.join(tmpdir(), 'slice-init-loader-'));
117
+ const loaderPath = path.join(tempDir, 'components-alias-loader.mjs');
118
+ await writeFile(
119
+ loaderPath,
120
+ `export async function resolve(specifier, context, nextResolve) {
121
+ if (specifier === '/Components/components.js') {
122
+ return {
123
+ shortCircuit: true,
124
+ url: 'data:text/javascript,export default {};',
125
+ };
126
+ }
127
+ return nextResolve(specifier, context);
128
+ }
129
+ `,
130
+ 'utf8'
131
+ );
132
+ register(pathToFileURL(loaderPath).href);
133
+
134
+ const originalWindow = globalThis.window;
135
+ const originalDocument = globalThis.document;
136
+ const originalFetch = globalThis.fetch;
137
+ const originalAlert = globalThis.alert;
138
+ const originalSliceDescriptor = Object.getOwnPropertyDescriptor(globalThis, 'slice');
139
+ const originalConsoleLog = console.log;
140
+ const originalConsoleWarn = console.warn;
141
+ const controllerModuleUrl = new URL('../Components/Structural/Controller/Controller.js', import.meta.url).href;
142
+ const { default: Controller } = await import(controllerModuleUrl);
143
+ const originalLoadBundle = Controller.prototype.loadBundle;
144
+
145
+ const loggedMessages = [];
146
+
147
+ try {
148
+ globalThis.window = {
149
+ location: {
150
+ pathname: '/dashboard',
151
+ origin: 'http://localhost',
152
+ },
153
+ };
154
+
155
+ Object.defineProperty(globalThis, 'slice', {
156
+ configurable: true,
157
+ get() {
158
+ return globalThis.window?.slice;
159
+ },
160
+ set(value) {
161
+ if (!globalThis.window) {
162
+ globalThis.window = {};
163
+ }
164
+ globalThis.window.slice = value;
165
+ },
166
+ });
167
+
168
+ Controller.prototype.loadBundle = async () => {
169
+ throw new Error(
170
+ 'Bundle "critical" missing Bundling V2 exports contract: requires SLICE_BUNDLE_META and registerAll'
171
+ );
172
+ };
173
+
174
+ globalThis.document = {
175
+ head: {
176
+ appendChild() {},
177
+ },
178
+ body: {
179
+ appendChild() {},
180
+ },
181
+ createElement() {
182
+ return {
183
+ appendChild() {},
184
+ innerHTML: '',
185
+ id: '',
186
+ };
187
+ },
188
+ createTextNode() {
189
+ return {};
190
+ },
191
+ addEventListener() {},
192
+ };
193
+
194
+ globalThis.alert = () => {};
195
+ console.log = (...args) => {
196
+ loggedMessages.push(args.map(String).join(' '));
197
+ };
198
+ console.warn = () => {};
199
+
200
+ globalThis.fetch = async (url) => {
201
+ if (url === '/sliceConfig.json') {
202
+ return {
203
+ ok: true,
204
+ json: async () => ({
205
+ paths: {
206
+ routesFile: '/routes.js',
207
+ components: {},
208
+ },
209
+ themeManager: { enabled: false },
210
+ stylesManager: { requestedStyles: [] },
211
+ logger: { enabled: false },
212
+ debugger: { enabled: false },
213
+ loading: { enabled: false },
214
+ events: { enabled: false },
215
+ context: { enabled: false },
216
+ }),
217
+ };
218
+ }
219
+
220
+ if (url === '/slice-env.json') {
221
+ return {
222
+ ok: true,
223
+ json: async () => ({ mode: 'production' }),
224
+ };
225
+ }
226
+
227
+ if (url === '/bundles/bundle.config.json') {
228
+ return {
229
+ ok: true,
230
+ json: async () => ({
231
+ production: true,
232
+ bundles: {
233
+ critical: { file: 'critical.js' },
234
+ routes: {},
235
+ },
236
+ routeBundles: {},
237
+ }),
238
+ };
239
+ }
240
+
241
+ throw new Error(`Unexpected fetch URL: ${url}`);
242
+ };
243
+
244
+ const sliceModuleUrl = new URL(`../Slice.js?fail-fast-test=${Date.now()}`, import.meta.url).href;
245
+
246
+ await assert.rejects(() => import(sliceModuleUrl), /Bundling V2 initialization failed/i);
247
+
248
+ assert.equal(
249
+ loggedMessages.some((message) => message.includes('Using individual component loading (no bundles found)')),
250
+ false,
251
+ 'init must not log fallback bundle message on Bundling V2 contract failure'
252
+ );
253
+ } finally {
254
+ Controller.prototype.loadBundle = originalLoadBundle;
255
+ globalThis.window = originalWindow;
256
+ globalThis.document = originalDocument;
257
+ globalThis.fetch = originalFetch;
258
+ globalThis.alert = originalAlert;
259
+ if (originalSliceDescriptor) {
260
+ Object.defineProperty(globalThis, 'slice', originalSliceDescriptor);
261
+ } else {
262
+ delete globalThis.slice;
263
+ }
264
+ console.log = originalConsoleLog;
265
+ console.warn = originalConsoleWarn;
266
+ await rm(tempDir, { recursive: true, force: true });
267
+ }
268
+ });
@@ -0,0 +1,44 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+
4
+ globalThis.alert = () => {};
5
+
6
+ const { default: Slice } = await import('../Slice.js');
7
+
8
+ function createSliceInstance() {
9
+ return new Slice({
10
+ paths: {},
11
+ themeManager: {},
12
+ stylesManager: {},
13
+ logger: {},
14
+ debugger: {},
15
+ loading: {},
16
+ events: {}
17
+ });
18
+ }
19
+
20
+ test('getEnv returns fallback for missing key and stored value for known key', () => {
21
+ const sliceInstance = createSliceInstance();
22
+
23
+ assert.equal(typeof sliceInstance.getEnv, 'function');
24
+ assert.equal(typeof sliceInstance.setPublicEnv, 'function');
25
+ assert.equal(sliceInstance.getEnv('SLICE_PUBLIC_MISSING', 'fallback'), 'fallback');
26
+
27
+ sliceInstance.setPublicEnv({ SLICE_PUBLIC_API_URL: 'https://api.example.com' });
28
+ assert.equal(sliceInstance.getEnv('SLICE_PUBLIC_API_URL'), 'https://api.example.com');
29
+ });
30
+
31
+ test('getPublicEnv returns a copy and only includes SLICE_PUBLIC_ keys', () => {
32
+ const sliceInstance = createSliceInstance();
33
+
34
+ sliceInstance.setPublicEnv({
35
+ SLICE_PUBLIC_FLAG: 'true',
36
+ INTERNAL_SECRET: 'hidden'
37
+ });
38
+
39
+ const snapshot = sliceInstance.getPublicEnv();
40
+ assert.deepEqual(snapshot, { SLICE_PUBLIC_FLAG: 'true' });
41
+
42
+ snapshot.SLICE_PUBLIC_FLAG = 'mutated';
43
+ assert.equal(sliceInstance.getEnv('SLICE_PUBLIC_FLAG'), 'true');
44
+ });
@@ -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
+ });
@@ -0,0 +1,286 @@
1
+ // api/index.js - Seguridad automática sin configuración
2
+ import express from 'express';
3
+ import path from 'path';
4
+ import fs from 'fs';
5
+ import { fileURLToPath } from 'url';
6
+ import { dirname } from 'path';
7
+ import {
8
+ securityMiddleware,
9
+ sliceFrameworkProtection,
10
+ suspiciousRequestLogger
11
+ } from './middleware/securityMiddleware.js';
12
+ import { createPublicEnvProvider } from './utils/publicEnvResolver.js';
13
+
14
+ const __filename = fileURLToPath(import.meta.url);
15
+ const __dirname = dirname(__filename);
16
+ import sliceConfig from '../src/sliceConfig.json' with { type: 'json' };
17
+
18
+ let server;
19
+ const app = express();
20
+
21
+ // Parsear argumentos de línea de comandos
22
+ const args = process.argv.slice(2);
23
+
24
+ const runMode = process.env.NODE_ENV === 'production' ? 'production' : 'development';
25
+ const folderDeployed = runMode === 'production' ? 'dist' : 'src';
26
+ const publicEnvProvider = createPublicEnvProvider({
27
+ mode: runMode,
28
+ envFilePath: path.join(__dirname, '..', '.env')
29
+ });
30
+
31
+ // Obtener puerto desde process.env.PORT con fallback a sliceConfig.json
32
+ const PORT = process.env.PORT || sliceConfig.server?.port || 3001;
33
+
34
+ // ==============================================
35
+ // MIDDLEWARES DE SEGURIDAD (APLICAR PRIMERO)
36
+ // ==============================================
37
+
38
+ // 1. Logger de peticiones sospechosas (solo observación, no bloquea)
39
+ app.use(suspiciousRequestLogger());
40
+
41
+ // 2. Protección del framework - TOTALMENTE AUTOMÁTICA
42
+ // Detecta automáticamente el dominio desde los headers
43
+ // Funciona en localhost, IP, y cualquier dominio
44
+ app.use(sliceFrameworkProtection());
45
+
46
+ // 3. Middleware de seguridad general
47
+ app.use(securityMiddleware({
48
+ allowedExtensions: [
49
+ '.js', '.css', '.html', '.json',
50
+ '.svg', '.png', '.jpg', '.jpeg', '.gif',
51
+ '.woff', '.woff2', '.ttf', '.ico'
52
+ ],
53
+ blockedPaths: [
54
+ '/node_modules',
55
+ '/package.json',
56
+ '/package-lock.json',
57
+ '/.env',
58
+ '/.git',
59
+ '/api/middleware'
60
+ ],
61
+ allowPublicAssets: true
62
+ }));
63
+
64
+ // ==============================================
65
+ // MIDDLEWARES DE APLICACIÓN
66
+ // ==============================================
67
+
68
+ // Middleware global para archivos JavaScript con MIME types correctos
69
+ app.use((req, res, next) => {
70
+ if (req.path.endsWith('.js')) {
71
+ // Forzar headers correctos para TODOS los archivos .js
72
+ res.setHeader('Content-Type', 'application/javascript; charset=utf-8');
73
+ }
74
+ next();
75
+ });
76
+
77
+ // Middleware para parsear JSON y formularios
78
+ app.use(express.json());
79
+ app.use(express.urlencoded({ extended: true }));
80
+
81
+ // Configurar headers de CORS
82
+ app.use((req, res, next) => {
83
+ res.header('Access-Control-Allow-Origin', '*');
84
+ res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
85
+ res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization');
86
+
87
+ if (req.method === 'OPTIONS') {
88
+ res.sendStatus(200);
89
+ } else {
90
+ next();
91
+ }
92
+ });
93
+
94
+ // ==============================================
95
+ // RUNTIME MODE ENDPOINT
96
+ // ==============================================
97
+
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
+
106
+ // ==============================================
107
+ // ARCHIVOS ESTÁTICOS (DESPUÉS DE SEGURIDAD)
108
+ // ==============================================
109
+
110
+ if (runMode === 'production') {
111
+ app.get('/Slice/Slice.js', (req, res) => {
112
+ const slicePath = path.join(__dirname, '..', 'node_modules', 'slicejs-web-framework', 'Slice', 'Slice.js');
113
+ if (fs.existsSync(slicePath)) {
114
+ res.setHeader('Content-Type', 'application/javascript; charset=utf-8');
115
+ return res.send(fs.readFileSync(slicePath, 'utf8'));
116
+ }
117
+ return res.status(404).send('Slice.js not found');
118
+ });
119
+
120
+ app.use('/Slice', (req, res) => res.status(404).send('Not found'));
121
+ app.use('/Components', (req, res) => res.status(404).send('Not found'));
122
+ }
123
+
124
+ // Middleware personalizado para archivos de bundles con MIME types correctos
125
+ // ⚠️ DEBE IR ANTES del middleware general para tener prioridad
126
+ app.use('/bundles/', (req, res, next) => {
127
+ // Solo procesar archivos .js
128
+ if (req.path.endsWith('.js')) {
129
+ const filePath = path.join(__dirname, `../${folderDeployed}`, 'bundles', req.path);
130
+ console.log(`📂 Processing bundle: ${req.path} -> ${filePath}`);
131
+
132
+ // Verificar que el archivo existe
133
+ if (fs.existsSync(filePath)) {
134
+ try {
135
+ // Leer y servir el archivo con headers correctos
136
+ const fileContent = fs.readFileSync(filePath, 'utf8');
137
+ res.setHeader('Content-Type', 'application/javascript; charset=utf-8');
138
+ res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate'); // No cachear para permitir actualizaciones en tiempo real
139
+ res.setHeader('Pragma', 'no-cache');
140
+ res.setHeader('Expires', '0');
141
+ console.log(`✅ Serving bundle: ${req.path} (${fileContent.length} bytes, ${Buffer.byteLength(fileContent, 'utf8')} bytes UTF-8)`);
142
+ return res.send(fileContent);
143
+ } catch (error) {
144
+ console.log(`❌ Error reading bundle file: ${error.message}`);
145
+ return res.status(500).send('Error reading bundle file');
146
+ }
147
+ } else {
148
+ console.log(`❌ Bundle file not found: ${filePath}`);
149
+ return res.status(404).send('Bundle file not found');
150
+ }
151
+ }
152
+
153
+ // Para archivos no .js, continuar con el middleware estático normal
154
+ next();
155
+ });
156
+
157
+ // Servir otros archivos de bundles (JSON, CSS, etc.) con el middleware estático normal
158
+ app.use('/bundles/', express.static(path.join(__dirname, `../${folderDeployed}`, 'bundles')));
159
+ console.log(`📦 Serving bundles from /${folderDeployed}/bundles`);
160
+
161
+ // Servir framework Slice.js (solo development)
162
+ if (runMode === 'development') {
163
+ app.use('/Slice/', express.static(path.join(__dirname, '..', 'node_modules', 'slicejs-web-framework', 'Slice')));
164
+ }
165
+
166
+ // Servir archivos estáticos del proyecto con allowlist
167
+ const publicFolders = Array.isArray(sliceConfig.publicFolders) ? sliceConfig.publicFolders : [];
168
+ const normalizedPublicFolders = publicFolders
169
+ .filter((entry) => typeof entry === 'string')
170
+ .map((entry) => entry.trim())
171
+ .filter((entry) => entry.length > 0)
172
+ .map((entry) => (entry.startsWith('/') ? entry : `/${entry}`));
173
+
174
+ if (runMode === 'development') {
175
+ app.use(express.static(path.join(__dirname, `../${folderDeployed}`)));
176
+ } else {
177
+ app.use('/App', express.static(path.join(__dirname, `../${folderDeployed}`, 'App')));
178
+ app.get('/manifest.json', (req, res) => {
179
+ const manifestPath = path.join(__dirname, `../${folderDeployed}`, 'manifest.json');
180
+ if (fs.existsSync(manifestPath)) {
181
+ res.setHeader('Content-Type', 'application/json; charset=utf-8');
182
+ return res.send(fs.readFileSync(manifestPath, 'utf8'));
183
+ }
184
+ return res.status(404).send('manifest.json not found');
185
+ });
186
+ app.get('/service-worker.js', (req, res) => {
187
+ const workerPath = path.join(__dirname, `../${folderDeployed}`, 'service-worker.js');
188
+ if (fs.existsSync(workerPath)) {
189
+ res.setHeader('Content-Type', 'application/javascript; charset=utf-8');
190
+ return res.send(fs.readFileSync(workerPath, 'utf8'));
191
+ }
192
+ return res.status(404).send('service-worker.js not found');
193
+ });
194
+ app.get('/routes.js', (req, res) => {
195
+ const routesPath = path.join(__dirname, `../${folderDeployed}`, 'routes.js');
196
+ if (fs.existsSync(routesPath)) {
197
+ res.setHeader('Content-Type', 'application/javascript; charset=utf-8');
198
+ return res.send(fs.readFileSync(routesPath, 'utf8'));
199
+ }
200
+ return res.status(404).send('routes.js not found');
201
+ });
202
+ app.get('/sliceConfig.json', (req, res) => {
203
+ const configPath = path.join(__dirname, `../${folderDeployed}`, 'sliceConfig.json');
204
+ if (fs.existsSync(configPath)) {
205
+ res.setHeader('Content-Type', 'application/json; charset=utf-8');
206
+ return res.send(fs.readFileSync(configPath, 'utf8'));
207
+ }
208
+ return res.status(404).send('sliceConfig.json not found');
209
+ });
210
+ for (const folder of normalizedPublicFolders) {
211
+ app.use(folder, express.static(path.join(__dirname, `../${folderDeployed}`, folder)));
212
+ }
213
+ app.use('/bundles/', express.static(path.join(__dirname, `../${folderDeployed}`, 'bundles')));
214
+ app.use('/dist/', express.static(path.join(__dirname, '..', 'dist')));
215
+ }
216
+
217
+ // ==============================================
218
+ // RUTAS DE API
219
+ // ==============================================
220
+
221
+ // Ruta de ejemplo para API
222
+ app.get('/api/status', (req, res) => {
223
+ res.json({
224
+ status: 'ok',
225
+ mode: runMode,
226
+ folder: folderDeployed,
227
+ timestamp: new Date().toISOString(),
228
+ framework: 'Slice.js',
229
+ version: '2.0.0',
230
+ security: {
231
+ enabled: true,
232
+ mode: 'automatic',
233
+ description: 'Zero-config security - works with any domain'
234
+ }
235
+ });
236
+ });
237
+
238
+
239
+ // ==============================================
240
+ // SPA FALLBACK
241
+ // ==============================================
242
+
243
+ // SPA fallback - servir index.html para rutas no encontradas
244
+ app.get('*', (req, res) => {
245
+ const indexPath = path.join(__dirname, `../${folderDeployed}`, "App", 'index.html');
246
+ res.sendFile(indexPath, (err) => {
247
+ if (err) {
248
+ res.status(404).send(`
249
+ <h1>404 - Page Not Found</h1>
250
+ <p>The requested file could not be found in /${folderDeployed}</p>
251
+ <p>Make sure you've run the appropriate build command:</p>
252
+ <ul>
253
+ <li>For development: Files should be in /src</li>
254
+ <li>For production: Run "npm run slice:build" first</li>
255
+ </ul>
256
+ `);
257
+ }
258
+ });
259
+ });
260
+
261
+ // ==============================================
262
+ // INICIO DEL SERVIDOR
263
+ // ==============================================
264
+
265
+ function startServer() {
266
+ server = app.listen(PORT, () => {
267
+ console.log(`🔒 Security middleware: active (zero-config, automatic)`);
268
+ console.log(`🚀 Slice.js server running on port ${PORT}`);
269
+ });
270
+ }
271
+
272
+ // Manejar cierre del proceso
273
+ process.on('SIGINT', () => {
274
+ console.log('\n🛑 Slice server stopped');
275
+ process.exit(0);
276
+ });
277
+
278
+ process.on('SIGTERM', () => {
279
+ console.log('\n🛑 Server terminated');
280
+ process.exit(0);
281
+ });
282
+
283
+ // Iniciar servidor
284
+ startServer();
285
+
286
+ export default app;