@omega.js/desktop 0.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 (818) hide show
  1. package/LICENSE +98 -0
  2. package/README.md +166 -0
  3. package/bin/omega +2 -0
  4. package/bin/omega-desktop +2 -0
  5. package/bin/omg +2 -0
  6. package/dist/assets/css/core/_fontawesome.scss +146 -0
  7. package/dist/assets/css/core/_initialize.scss +38 -0
  8. package/dist/assets/css/omega-desktop.scss +39 -0
  9. package/dist/assets/css/shell/_index.scss +207 -0
  10. package/dist/assets/css/tokens/_index.scss +166 -0
  11. package/dist/assets/js/bootstrap.bundle.js +1 -0
  12. package/dist/assets/js/core/app-shell.js +136 -0
  13. package/dist/assets/themes/_template/README.md +115 -0
  14. package/dist/assets/themes/_template/_config.scss +60 -0
  15. package/dist/assets/themes/_template/_theme.js +14 -0
  16. package/dist/assets/themes/_template/_theme.scss +28 -0
  17. package/dist/assets/themes/_template/css/base/_root.scss +19 -0
  18. package/dist/assets/themes/_template/css/components/_components.scss +23 -0
  19. package/dist/assets/themes/base/README.md +5 -0
  20. package/dist/assets/themes/base/_components/data/org-chart/component.html +33 -0
  21. package/dist/assets/themes/base/_components/data/org-chart/component.json5 +33 -0
  22. package/dist/assets/themes/base/_components/data/org-chart/component.scss +183 -0
  23. package/dist/assets/themes/base/_components/heading/masthead/component.html +22 -0
  24. package/dist/assets/themes/base/_components/heading/masthead/component.json5 +30 -0
  25. package/dist/assets/themes/base/_components/heading/section-head/component.html +18 -0
  26. package/dist/assets/themes/base/_components/heading/section-head/component.json5 +27 -0
  27. package/dist/assets/themes/base/_components/pricing/features/component.html +29 -0
  28. package/dist/assets/themes/base/_components/pricing/features/component.json5 +30 -0
  29. package/dist/assets/themes/base/_hero/orbit/index.html +30 -0
  30. package/dist/assets/themes/base/_hero/orbit/script.js +33 -0
  31. package/dist/assets/themes/base/_hero/orbit/style.scss +133 -0
  32. package/dist/assets/themes/base/_includes/admin/sections/sidebar.html +3 -0
  33. package/dist/assets/themes/base/_includes/admin/sections/topbar.html +3 -0
  34. package/dist/assets/themes/base/_includes/backend/sections/sidebar.html +3 -0
  35. package/dist/assets/themes/base/_includes/backend/sections/topbar.html +3 -0
  36. package/dist/assets/themes/base/_includes/frontend/components/connection-card.html +49 -0
  37. package/dist/assets/themes/base/_includes/frontend/components/post-card.html +54 -0
  38. package/dist/assets/themes/base/_includes/frontend/sections/account-connections.html +42 -0
  39. package/dist/assets/themes/base/_includes/frontend/sections/account-section-header.html +11 -0
  40. package/dist/assets/themes/base/_includes/frontend/sections/footer.html +154 -0
  41. package/dist/assets/themes/base/_includes/frontend/sections/nav.html +276 -0
  42. package/dist/assets/themes/base/_includes/global/sections/account.html +72 -0
  43. package/dist/assets/themes/base/_includes/global/sections/app-sidebar.html +248 -0
  44. package/dist/assets/themes/base/_includes/global/sections/app-topbar.html +228 -0
  45. package/dist/assets/themes/base/_includes/global/sections/page-header.html +99 -0
  46. package/dist/assets/themes/base/_layouts/admin/core/minimal-viewport-locked.html +22 -0
  47. package/dist/assets/themes/base/_layouts/admin/core/minimal.html +23 -0
  48. package/dist/assets/themes/base/_layouts/backend/core/base.html +57 -0
  49. package/dist/assets/themes/base/_layouts/backend/core/minimal-viewport-locked.html +32 -0
  50. package/dist/assets/themes/base/_layouts/backend/core/minimal.html +32 -0
  51. package/dist/assets/themes/base/_layouts/backend/pages/dashboard/index.html +230 -0
  52. package/dist/assets/themes/base/_layouts/frontend/core/base.html +31 -0
  53. package/dist/assets/themes/base/_layouts/frontend/core/cover.html +40 -0
  54. package/dist/assets/themes/base/_layouts/frontend/core/minimal.html +47 -0
  55. package/dist/assets/themes/base/_layouts/frontend/pages/404.html +54 -0
  56. package/dist/assets/themes/base/_layouts/frontend/pages/about.html +144 -0
  57. package/dist/assets/themes/base/_layouts/frontend/pages/account/index.html +2104 -0
  58. package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/alternative.html +319 -0
  59. package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/index.html +186 -0
  60. package/dist/assets/themes/base/_layouts/frontend/pages/app.html +142 -0
  61. package/dist/assets/themes/base/_layouts/frontend/pages/auth/reset.html +53 -0
  62. package/dist/assets/themes/base/_layouts/frontend/pages/auth/signin.html +90 -0
  63. package/dist/assets/themes/base/_layouts/frontend/pages/auth/signup.html +141 -0
  64. package/dist/assets/themes/base/_layouts/frontend/pages/auth/token.html +44 -0
  65. package/dist/assets/themes/base/_layouts/frontend/pages/blog/categories/category.html +88 -0
  66. package/dist/assets/themes/base/_layouts/frontend/pages/blog/categories/index.html +88 -0
  67. package/dist/assets/themes/base/_layouts/frontend/pages/blog/index.html +255 -0
  68. package/dist/assets/themes/base/_layouts/frontend/pages/blog/post.html +261 -0
  69. package/dist/assets/themes/base/_layouts/frontend/pages/blog/tags/index.html +84 -0
  70. package/dist/assets/themes/base/_layouts/frontend/pages/blog/tags/tag.html +88 -0
  71. package/dist/assets/themes/base/_layouts/frontend/pages/collection/category.html +72 -0
  72. package/dist/assets/themes/base/_layouts/frontend/pages/collection/document.html +54 -0
  73. package/dist/assets/themes/base/_layouts/frontend/pages/collection/index.html +84 -0
  74. package/dist/assets/themes/base/_layouts/frontend/pages/connections/callback.html +55 -0
  75. package/dist/assets/themes/base/_layouts/frontend/pages/contact.html +214 -0
  76. package/dist/assets/themes/base/_layouts/frontend/pages/download.html +793 -0
  77. package/dist/assets/themes/base/_layouts/frontend/pages/extension/index.html +253 -0
  78. package/dist/assets/themes/base/_layouts/frontend/pages/extension/installed.html +198 -0
  79. package/dist/assets/themes/base/_layouts/frontend/pages/feedback.html +171 -0
  80. package/dist/assets/themes/base/_layouts/frontend/pages/index.html +66 -0
  81. package/dist/assets/themes/base/_layouts/frontend/pages/legal/document.html +78 -0
  82. package/dist/assets/themes/base/_layouts/frontend/pages/payment/checkout.html +459 -0
  83. package/dist/assets/themes/base/_layouts/frontend/pages/payment/confirmation.html +131 -0
  84. package/dist/assets/themes/base/_layouts/frontend/pages/portal/email-preferences.html +104 -0
  85. package/dist/assets/themes/base/_layouts/frontend/pages/pricing.html +596 -0
  86. package/dist/assets/themes/base/_layouts/frontend/pages/status.html +361 -0
  87. package/dist/assets/themes/base/_layouts/frontend/pages/team/index.html +210 -0
  88. package/dist/assets/themes/base/_layouts/frontend/pages/team/member.html +125 -0
  89. package/dist/assets/themes/base/_layouts/frontend/pages/updates/index.html +119 -0
  90. package/dist/assets/themes/base/_layouts/frontend/pages/updates/update.html +118 -0
  91. package/dist/assets/themes/base/_sections/about/hero/section.html +68 -0
  92. package/dist/assets/themes/base/_sections/about/hero/section.json5 +58 -0
  93. package/dist/assets/themes/base/_sections/about/letter/section.html +60 -0
  94. package/dist/assets/themes/base/_sections/about/letter/section.json5 +56 -0
  95. package/dist/assets/themes/base/_sections/about/photo-band/section.html +24 -0
  96. package/dist/assets/themes/base/_sections/about/photo-band/section.json5 +23 -0
  97. package/dist/assets/themes/base/_sections/about/principles/section.html +17 -0
  98. package/dist/assets/themes/base/_sections/about/principles/section.json5 +34 -0
  99. package/dist/assets/themes/base/_sections/about/timeline/section.html +20 -0
  100. package/dist/assets/themes/base/_sections/about/timeline/section.json5 +34 -0
  101. package/dist/assets/themes/base/_sections/marketing/bento/section.html +91 -0
  102. package/dist/assets/themes/base/_sections/marketing/bento/section.json5 +152 -0
  103. package/dist/assets/themes/base/_sections/marketing/cta/section.html +44 -0
  104. package/dist/assets/themes/base/_sections/marketing/cta/section.json5 +47 -0
  105. package/dist/assets/themes/base/_sections/marketing/faq/section.html +52 -0
  106. package/dist/assets/themes/base/_sections/marketing/faq/section.json5 +68 -0
  107. package/dist/assets/themes/base/_sections/marketing/hero/section.html +349 -0
  108. package/dist/assets/themes/base/_sections/marketing/hero/section.json5 +335 -0
  109. package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.html +38 -0
  110. package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.js +86 -0
  111. package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.json5 +29 -0
  112. package/dist/assets/themes/base/_sections/marketing/pricing-cards/section.html +115 -0
  113. package/dist/assets/themes/base/_sections/marketing/pricing-cards/section.json5 +72 -0
  114. package/dist/assets/themes/base/_sections/marketing/product-demo/section.html +62 -0
  115. package/dist/assets/themes/base/_sections/marketing/product-demo/section.js +44 -0
  116. package/dist/assets/themes/base/_sections/marketing/product-demo/section.json5 +52 -0
  117. package/dist/assets/themes/base/_sections/marketing/prose/section.html +22 -0
  118. package/dist/assets/themes/base/_sections/marketing/prose/section.json5 +41 -0
  119. package/dist/assets/themes/base/_sections/marketing/showcase/section.html +35 -0
  120. package/dist/assets/themes/base/_sections/marketing/showcase/section.json5 +52 -0
  121. package/dist/assets/themes/base/_sections/marketing/stats/section.html +32 -0
  122. package/dist/assets/themes/base/_sections/marketing/stats/section.json5 +44 -0
  123. package/dist/assets/themes/base/_sections/marketing/testimonials/section.html +54 -0
  124. package/dist/assets/themes/base/_sections/marketing/testimonials/section.json5 +70 -0
  125. package/dist/assets/themes/base/_sections/marketing/trusted-by/section.html +30 -0
  126. package/dist/assets/themes/base/_sections/marketing/trusted-by/section.json5 +38 -0
  127. package/dist/assets/themes/base/_sections/verts/unit/section.html +7 -0
  128. package/dist/assets/themes/base/_sections/verts/unit/section.js +22 -0
  129. package/dist/assets/themes/base/_sections/verts/unit/section.json5 +24 -0
  130. package/dist/assets/themes/base/_sections/verts/unit/section.scss +24 -0
  131. package/dist/assets/themes/base/_theme.js +13 -0
  132. package/dist/assets/themes/base/_theme.scss +4 -0
  133. package/dist/assets/themes/bootstrap/_theme.js +16 -0
  134. package/dist/assets/themes/bootstrap/_theme.scss +11 -0
  135. package/dist/assets/themes/bootstrap/js/index.esm.js +19 -0
  136. package/dist/assets/themes/bootstrap/js/index.umd.js +34 -0
  137. package/dist/assets/themes/bootstrap/js/src/alert.js +87 -0
  138. package/dist/assets/themes/bootstrap/js/src/base-component.js +86 -0
  139. package/dist/assets/themes/bootstrap/js/src/button.js +72 -0
  140. package/dist/assets/themes/bootstrap/js/src/carousel.js +474 -0
  141. package/dist/assets/themes/bootstrap/js/src/collapse.js +297 -0
  142. package/dist/assets/themes/bootstrap/js/src/dom/data.js +55 -0
  143. package/dist/assets/themes/bootstrap/js/src/dom/event-handler.js +317 -0
  144. package/dist/assets/themes/bootstrap/js/src/dom/manipulator.js +71 -0
  145. package/dist/assets/themes/bootstrap/js/src/dom/selector-engine.js +126 -0
  146. package/dist/assets/themes/bootstrap/js/src/dropdown.js +458 -0
  147. package/dist/assets/themes/bootstrap/js/src/modal.js +378 -0
  148. package/dist/assets/themes/bootstrap/js/src/offcanvas.js +282 -0
  149. package/dist/assets/themes/bootstrap/js/src/popover.js +97 -0
  150. package/dist/assets/themes/bootstrap/js/src/scrollspy.js +296 -0
  151. package/dist/assets/themes/bootstrap/js/src/tab.js +315 -0
  152. package/dist/assets/themes/bootstrap/js/src/toast.js +224 -0
  153. package/dist/assets/themes/bootstrap/js/src/tooltip.js +632 -0
  154. package/dist/assets/themes/bootstrap/js/src/util/backdrop.js +151 -0
  155. package/dist/assets/themes/bootstrap/js/src/util/component-functions.js +35 -0
  156. package/dist/assets/themes/bootstrap/js/src/util/config.js +65 -0
  157. package/dist/assets/themes/bootstrap/js/src/util/focustrap.js +115 -0
  158. package/dist/assets/themes/bootstrap/js/src/util/index.js +306 -0
  159. package/dist/assets/themes/bootstrap/js/src/util/sanitizer.js +117 -0
  160. package/dist/assets/themes/bootstrap/js/src/util/scrollbar.js +114 -0
  161. package/dist/assets/themes/bootstrap/js/src/util/swipe.js +146 -0
  162. package/dist/assets/themes/bootstrap/js/src/util/template-factory.js +160 -0
  163. package/dist/assets/themes/bootstrap/overrides/_accordion.scss +21 -0
  164. package/dist/assets/themes/bootstrap/overrides/_avatars.scss +51 -0
  165. package/dist/assets/themes/bootstrap/overrides/_blog-images.scss +45 -0
  166. package/dist/assets/themes/bootstrap/overrides/_buttons-adaptive.scss +141 -0
  167. package/dist/assets/themes/bootstrap/overrides/_color-shades.scss +25 -0
  168. package/dist/assets/themes/bootstrap/overrides/_cursor-utilities.scss +13 -0
  169. package/dist/assets/themes/bootstrap/overrides/_index.scss +30 -0
  170. package/dist/assets/themes/bootstrap/overrides/_links.scss +26 -0
  171. package/dist/assets/themes/bootstrap/overrides/_soft-colors.scss +99 -0
  172. package/dist/assets/themes/bootstrap/overrides/_spacing-extended.scss +74 -0
  173. package/dist/assets/themes/bootstrap/overrides/_spinners.scss +22 -0
  174. package/dist/assets/themes/bootstrap/overrides/_typography-utilities.scss +40 -0
  175. package/dist/assets/themes/bootstrap/scss/_accordion.scss +153 -0
  176. package/dist/assets/themes/bootstrap/scss/_alert.scss +68 -0
  177. package/dist/assets/themes/bootstrap/scss/_badge.scss +38 -0
  178. package/dist/assets/themes/bootstrap/scss/_breadcrumb.scss +40 -0
  179. package/dist/assets/themes/bootstrap/scss/_button-group.scss +147 -0
  180. package/dist/assets/themes/bootstrap/scss/_buttons.scss +216 -0
  181. package/dist/assets/themes/bootstrap/scss/_card.scss +238 -0
  182. package/dist/assets/themes/bootstrap/scss/_carousel.scss +226 -0
  183. package/dist/assets/themes/bootstrap/scss/_close.scss +66 -0
  184. package/dist/assets/themes/bootstrap/scss/_containers.scss +41 -0
  185. package/dist/assets/themes/bootstrap/scss/_dropdown.scss +250 -0
  186. package/dist/assets/themes/bootstrap/scss/_forms.scss +9 -0
  187. package/dist/assets/themes/bootstrap/scss/_functions.scss +302 -0
  188. package/dist/assets/themes/bootstrap/scss/_grid.scss +39 -0
  189. package/dist/assets/themes/bootstrap/scss/_helpers.scss +12 -0
  190. package/dist/assets/themes/bootstrap/scss/_images.scss +42 -0
  191. package/dist/assets/themes/bootstrap/scss/_list-group.scss +199 -0
  192. package/dist/assets/themes/bootstrap/scss/_maps.scss +174 -0
  193. package/dist/assets/themes/bootstrap/scss/_mixins.scss +42 -0
  194. package/dist/assets/themes/bootstrap/scss/_modal.scss +240 -0
  195. package/dist/assets/themes/bootstrap/scss/_nav.scss +197 -0
  196. package/dist/assets/themes/bootstrap/scss/_navbar.scss +289 -0
  197. package/dist/assets/themes/bootstrap/scss/_offcanvas.scss +147 -0
  198. package/dist/assets/themes/bootstrap/scss/_pagination.scss +109 -0
  199. package/dist/assets/themes/bootstrap/scss/_placeholders.scss +51 -0
  200. package/dist/assets/themes/bootstrap/scss/_popover.scss +196 -0
  201. package/dist/assets/themes/bootstrap/scss/_progress.scss +68 -0
  202. package/dist/assets/themes/bootstrap/scss/_reboot.scss +611 -0
  203. package/dist/assets/themes/bootstrap/scss/_root.scss +187 -0
  204. package/dist/assets/themes/bootstrap/scss/_spinners.scss +85 -0
  205. package/dist/assets/themes/bootstrap/scss/_tables.scss +171 -0
  206. package/dist/assets/themes/bootstrap/scss/_toasts.scss +73 -0
  207. package/dist/assets/themes/bootstrap/scss/_tooltip.scss +119 -0
  208. package/dist/assets/themes/bootstrap/scss/_transitions.scss +27 -0
  209. package/dist/assets/themes/bootstrap/scss/_type.scss +106 -0
  210. package/dist/assets/themes/bootstrap/scss/_utilities.scss +806 -0
  211. package/dist/assets/themes/bootstrap/scss/_variables-dark.scss +102 -0
  212. package/dist/assets/themes/bootstrap/scss/_variables.scss +1753 -0
  213. package/dist/assets/themes/bootstrap/scss/bootstrap-grid.scss +62 -0
  214. package/dist/assets/themes/bootstrap/scss/bootstrap-reboot.scss +10 -0
  215. package/dist/assets/themes/bootstrap/scss/bootstrap-utilities.scss +19 -0
  216. package/dist/assets/themes/bootstrap/scss/bootstrap.scss +52 -0
  217. package/dist/assets/themes/bootstrap/scss/forms/_floating-labels.scss +97 -0
  218. package/dist/assets/themes/bootstrap/scss/forms/_form-check.scss +189 -0
  219. package/dist/assets/themes/bootstrap/scss/forms/_form-control.scss +214 -0
  220. package/dist/assets/themes/bootstrap/scss/forms/_form-range.scss +91 -0
  221. package/dist/assets/themes/bootstrap/scss/forms/_form-select.scss +80 -0
  222. package/dist/assets/themes/bootstrap/scss/forms/_form-text.scss +11 -0
  223. package/dist/assets/themes/bootstrap/scss/forms/_input-group.scss +132 -0
  224. package/dist/assets/themes/bootstrap/scss/forms/_labels.scss +36 -0
  225. package/dist/assets/themes/bootstrap/scss/forms/_validation.scss +12 -0
  226. package/dist/assets/themes/bootstrap/scss/helpers/_clearfix.scss +3 -0
  227. package/dist/assets/themes/bootstrap/scss/helpers/_color-bg.scss +7 -0
  228. package/dist/assets/themes/bootstrap/scss/helpers/_colored-links.scss +30 -0
  229. package/dist/assets/themes/bootstrap/scss/helpers/_focus-ring.scss +5 -0
  230. package/dist/assets/themes/bootstrap/scss/helpers/_icon-link.scss +25 -0
  231. package/dist/assets/themes/bootstrap/scss/helpers/_position.scss +36 -0
  232. package/dist/assets/themes/bootstrap/scss/helpers/_ratio.scss +26 -0
  233. package/dist/assets/themes/bootstrap/scss/helpers/_stacks.scss +15 -0
  234. package/dist/assets/themes/bootstrap/scss/helpers/_stretched-link.scss +15 -0
  235. package/dist/assets/themes/bootstrap/scss/helpers/_text-truncation.scss +7 -0
  236. package/dist/assets/themes/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
  237. package/dist/assets/themes/bootstrap/scss/helpers/_vr.scss +8 -0
  238. package/dist/assets/themes/bootstrap/scss/mixins/_alert.scss +18 -0
  239. package/dist/assets/themes/bootstrap/scss/mixins/_backdrop.scss +14 -0
  240. package/dist/assets/themes/bootstrap/scss/mixins/_banner.scss +7 -0
  241. package/dist/assets/themes/bootstrap/scss/mixins/_border-radius.scss +78 -0
  242. package/dist/assets/themes/bootstrap/scss/mixins/_box-shadow.scss +18 -0
  243. package/dist/assets/themes/bootstrap/scss/mixins/_breakpoints.scss +127 -0
  244. package/dist/assets/themes/bootstrap/scss/mixins/_buttons.scss +70 -0
  245. package/dist/assets/themes/bootstrap/scss/mixins/_caret.scss +69 -0
  246. package/dist/assets/themes/bootstrap/scss/mixins/_clearfix.scss +9 -0
  247. package/dist/assets/themes/bootstrap/scss/mixins/_color-mode.scss +21 -0
  248. package/dist/assets/themes/bootstrap/scss/mixins/_color-scheme.scss +7 -0
  249. package/dist/assets/themes/bootstrap/scss/mixins/_container.scss +11 -0
  250. package/dist/assets/themes/bootstrap/scss/mixins/_deprecate.scss +10 -0
  251. package/dist/assets/themes/bootstrap/scss/mixins/_forms.scss +163 -0
  252. package/dist/assets/themes/bootstrap/scss/mixins/_gradients.scss +47 -0
  253. package/dist/assets/themes/bootstrap/scss/mixins/_grid.scss +151 -0
  254. package/dist/assets/themes/bootstrap/scss/mixins/_image.scss +16 -0
  255. package/dist/assets/themes/bootstrap/scss/mixins/_list-group.scss +26 -0
  256. package/dist/assets/themes/bootstrap/scss/mixins/_lists.scss +7 -0
  257. package/dist/assets/themes/bootstrap/scss/mixins/_pagination.scss +10 -0
  258. package/dist/assets/themes/bootstrap/scss/mixins/_reset-text.scss +17 -0
  259. package/dist/assets/themes/bootstrap/scss/mixins/_resize.scss +6 -0
  260. package/dist/assets/themes/bootstrap/scss/mixins/_table-variants.scss +24 -0
  261. package/dist/assets/themes/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  262. package/dist/assets/themes/bootstrap/scss/mixins/_transition.scss +26 -0
  263. package/dist/assets/themes/bootstrap/scss/mixins/_utilities.scss +97 -0
  264. package/dist/assets/themes/bootstrap/scss/mixins/_visually-hidden.scss +38 -0
  265. package/dist/assets/themes/bootstrap/scss/tests/jasmine.js +16 -0
  266. package/dist/assets/themes/bootstrap/scss/tests/mixins/_auto-import-of-variables-dark.test.scss +7 -0
  267. package/dist/assets/themes/bootstrap/scss/tests/mixins/_color-modes.test.scss +69 -0
  268. package/dist/assets/themes/bootstrap/scss/tests/mixins/_media-query-color-mode-full.test.scss +8 -0
  269. package/dist/assets/themes/bootstrap/scss/tests/mixins/_utilities.test.scss +393 -0
  270. package/dist/assets/themes/bootstrap/scss/tests/sass-true/register.js +14 -0
  271. package/dist/assets/themes/bootstrap/scss/tests/sass-true/runner.js +17 -0
  272. package/dist/assets/themes/bootstrap/scss/tests/utilities/_api.test.scss +75 -0
  273. package/dist/assets/themes/bootstrap/scss/utilities/_api.scss +47 -0
  274. package/dist/assets/themes/bootstrap/scss/vendor/_rfs.scss +348 -0
  275. package/dist/assets/themes/classy/README.md +89 -0
  276. package/dist/assets/themes/classy/_config.scss +245 -0
  277. package/dist/assets/themes/classy/_theme.js +31 -0
  278. package/dist/assets/themes/classy/_theme.scss +57 -0
  279. package/dist/assets/themes/classy/css/app/_panels.scss +183 -0
  280. package/dist/assets/themes/classy/css/base/_fonts.scss +79 -0
  281. package/dist/assets/themes/classy/css/base/_no-raise.scss +49 -0
  282. package/dist/assets/themes/classy/css/base/_root.scss +113 -0
  283. package/dist/assets/themes/classy/css/base/_typography.scss +154 -0
  284. package/dist/assets/themes/classy/css/base/_utilities.scss +284 -0
  285. package/dist/assets/themes/classy/css/components/_alerts.scss +51 -0
  286. package/dist/assets/themes/classy/css/components/_badges.scss +46 -0
  287. package/dist/assets/themes/classy/css/components/_buttons.scss +175 -0
  288. package/dist/assets/themes/classy/css/components/_cards.scss +41 -0
  289. package/dist/assets/themes/classy/css/components/_dropdowns.scss +48 -0
  290. package/dist/assets/themes/classy/css/components/_forms.scss +171 -0
  291. package/dist/assets/themes/classy/css/components/_receipt.scss +45 -0
  292. package/dist/assets/themes/classy/css/layout/_footer.scss +298 -0
  293. package/dist/assets/themes/classy/css/layout/_general.scss +209 -0
  294. package/dist/assets/themes/classy/css/layout/_nav.scss +154 -0
  295. package/dist/assets/themes/classy/css/layout/_shell.scss +458 -0
  296. package/dist/assets/themes/classy/css/marketing/_bento.scss +238 -0
  297. package/dist/assets/themes/classy/css/marketing/_content.scss +1328 -0
  298. package/dist/assets/themes/classy/css/marketing/_downloads.scss +246 -0
  299. package/dist/assets/themes/classy/css/marketing/_hero.scss +311 -0
  300. package/dist/assets/themes/classy/css/marketing/_sections.scss +649 -0
  301. package/dist/assets/themes/classy/css/pages/404/index.scss +67 -0
  302. package/dist/assets/themes/classy/css/pages/_auth.scss +235 -0
  303. package/dist/assets/themes/classy/css/pages/admin/firebase/index.scss +22 -0
  304. package/dist/assets/themes/classy/css/pages/blog/[slug].scss +56 -0
  305. package/dist/assets/themes/classy/css/pages/cookies.scss +2 -0
  306. package/dist/assets/themes/classy/css/pages/dashboard/account/index.scss +31 -0
  307. package/dist/assets/themes/classy/css/pages/feedback/index.scss +39 -0
  308. package/dist/assets/themes/classy/css/pages/legal/_document.scss +192 -0
  309. package/dist/assets/themes/classy/css/pages/payment/checkout/index.scss +585 -0
  310. package/dist/assets/themes/classy/css/pages/payment/confirmation/index.scss +9 -0
  311. package/dist/assets/themes/classy/css/pages/privacy.scss +2 -0
  312. package/dist/assets/themes/classy/css/pages/status/index.scss +164 -0
  313. package/dist/assets/themes/classy/css/pages/terms.scss +2 -0
  314. package/dist/assets/themes/classy/css/pages/updates/index.scss +128 -0
  315. package/dist/assets/themes/classy/fonts/inter-italic-latin-ext.woff2 +0 -0
  316. package/dist/assets/themes/classy/fonts/inter-italic-latin.woff2 +0 -0
  317. package/dist/assets/themes/classy/fonts/inter-normal-latin-ext.woff2 +0 -0
  318. package/dist/assets/themes/classy/fonts/inter-normal-latin.woff2 +0 -0
  319. package/dist/assets/themes/classy/fonts/newsreader-italic-latin-ext.woff2 +0 -0
  320. package/dist/assets/themes/classy/fonts/newsreader-italic-latin.woff2 +0 -0
  321. package/dist/assets/themes/classy/fonts/newsreader-normal-latin-ext.woff2 +0 -0
  322. package/dist/assets/themes/classy/fonts/newsreader-normal-latin.woff2 +0 -0
  323. package/dist/assets/themes/classy/js/hero-demo-form.js +56 -0
  324. package/dist/assets/themes/neobrutalism/README.md +118 -0
  325. package/dist/assets/themes/neobrutalism/_config.scss +139 -0
  326. package/dist/assets/themes/neobrutalism/_layouts/frontend/core/base.html +30 -0
  327. package/dist/assets/themes/neobrutalism/_layouts/frontend/pages/index.html +275 -0
  328. package/dist/assets/themes/neobrutalism/_theme.js +24 -0
  329. package/dist/assets/themes/neobrutalism/_theme.scss +61 -0
  330. package/dist/assets/themes/neobrutalism/css/base/_mixins.scss +46 -0
  331. package/dist/assets/themes/neobrutalism/css/base/_root.scss +169 -0
  332. package/dist/assets/themes/neobrutalism/css/base/_typography.scss +61 -0
  333. package/dist/assets/themes/neobrutalism/css/base/_utilities.scss +89 -0
  334. package/dist/assets/themes/neobrutalism/css/components/_billing-toggle.scss +74 -0
  335. package/dist/assets/themes/neobrutalism/css/components/_buttons.scss +148 -0
  336. package/dist/assets/themes/neobrutalism/css/components/_cards.scss +47 -0
  337. package/dist/assets/themes/neobrutalism/css/components/_forms.scss +88 -0
  338. package/dist/assets/themes/neobrutalism/css/components/_marketing.scss +244 -0
  339. package/dist/assets/themes/neobrutalism/css/layout/_general.scss +213 -0
  340. package/dist/assets/themes/neobrutalism/css/layout/_navigation.scss +171 -0
  341. package/dist/assets/themes/neobrutalism/css/pages/index.scss +203 -0
  342. package/dist/assets/themes/neobrutalism/css/pages/pricing/index.scss +58 -0
  343. package/dist/assets/themes/neobrutalism/css/pages/test/libraries/layers/index.scss +7 -0
  344. package/dist/assets/themes/neobrutalism/js/pages/test/libraries/layers/index.js +9 -0
  345. package/dist/assets/themes/newsflash/README.md +117 -0
  346. package/dist/assets/themes/newsflash/_components/heading/lede/component.html +14 -0
  347. package/dist/assets/themes/newsflash/_components/heading/lede/component.json5 +23 -0
  348. package/dist/assets/themes/newsflash/_components/heading/rule-head/component.html +17 -0
  349. package/dist/assets/themes/newsflash/_components/heading/rule-head/component.json5 +23 -0
  350. package/dist/assets/themes/newsflash/_components/news/byline/component.html +12 -0
  351. package/dist/assets/themes/newsflash/_components/news/byline/component.json5 +18 -0
  352. package/dist/assets/themes/newsflash/_components/news/story-card/component.html +25 -0
  353. package/dist/assets/themes/newsflash/_components/news/story-card/component.json5 +21 -0
  354. package/dist/assets/themes/newsflash/_config.scss +147 -0
  355. package/dist/assets/themes/newsflash/_layouts/frontend/core/base.html +51 -0
  356. package/dist/assets/themes/newsflash/_layouts/frontend/pages/blog/index.html +299 -0
  357. package/dist/assets/themes/newsflash/_layouts/frontend/pages/blog/post.html +235 -0
  358. package/dist/assets/themes/newsflash/_layouts/frontend/pages/index.html +328 -0
  359. package/dist/assets/themes/newsflash/_sections/marketing/desks/section.html +39 -0
  360. package/dist/assets/themes/newsflash/_sections/marketing/desks/section.json5 +49 -0
  361. package/dist/assets/themes/newsflash/_sections/marketing/newsletter-cta/section.html +103 -0
  362. package/dist/assets/themes/newsflash/_sections/marketing/newsletter-cta/section.json5 +50 -0
  363. package/dist/assets/themes/newsflash/_sections/marketing/rundown/section.html +28 -0
  364. package/dist/assets/themes/newsflash/_sections/marketing/rundown/section.json5 +40 -0
  365. package/dist/assets/themes/newsflash/_theme.js +24 -0
  366. package/dist/assets/themes/newsflash/_theme.scss +70 -0
  367. package/dist/assets/themes/newsflash/css/base/_fonts.scss +80 -0
  368. package/dist/assets/themes/newsflash/css/base/_mixins.scss +51 -0
  369. package/dist/assets/themes/newsflash/css/base/_root.scss +257 -0
  370. package/dist/assets/themes/newsflash/css/base/_typography.scss +49 -0
  371. package/dist/assets/themes/newsflash/css/base/_utilities.scss +122 -0
  372. package/dist/assets/themes/newsflash/css/components/_badges.scss +65 -0
  373. package/dist/assets/themes/newsflash/css/components/_billing-toggle.scss +61 -0
  374. package/dist/assets/themes/newsflash/css/components/_buttons.scss +139 -0
  375. package/dist/assets/themes/newsflash/css/components/_cards.scss +47 -0
  376. package/dist/assets/themes/newsflash/css/components/_editorial.scss +173 -0
  377. package/dist/assets/themes/newsflash/css/components/_forms.scss +75 -0
  378. package/dist/assets/themes/newsflash/css/components/_infinite-scroll.scss +102 -0
  379. package/dist/assets/themes/newsflash/css/components/_panels.scss +156 -0
  380. package/dist/assets/themes/newsflash/css/components/_ticker.scss +67 -0
  381. package/dist/assets/themes/newsflash/css/layout/_general.scss +330 -0
  382. package/dist/assets/themes/newsflash/css/layout/_navigation.scss +168 -0
  383. package/dist/assets/themes/newsflash/css/pages/404/index.scss +79 -0
  384. package/dist/assets/themes/newsflash/css/pages/blog/[slug].scss +186 -0
  385. package/dist/assets/themes/newsflash/css/pages/blog/index.scss +17 -0
  386. package/dist/assets/themes/newsflash/css/pages/index.scss +157 -0
  387. package/dist/assets/themes/newsflash/css/pages/pricing/index.scss +55 -0
  388. package/dist/assets/themes/newsflash/css/pages/test/libraries/layers/index.scss +7 -0
  389. package/dist/assets/themes/newsflash/fonts/fraunces-italic-latin-ext.woff2 +0 -0
  390. package/dist/assets/themes/newsflash/fonts/fraunces-italic-latin.woff2 +0 -0
  391. package/dist/assets/themes/newsflash/fonts/fraunces-normal-latin-ext.woff2 +0 -0
  392. package/dist/assets/themes/newsflash/fonts/fraunces-normal-latin.woff2 +0 -0
  393. package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-italic-latin-ext.woff2 +0 -0
  394. package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-italic-latin.woff2 +0 -0
  395. package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-normal-latin-ext.woff2 +0 -0
  396. package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-normal-latin.woff2 +0 -0
  397. package/dist/assets/themes/newsflash/js/pages/blog/[slug].js +29 -0
  398. package/dist/assets/themes/newsflash/js/pages/test/libraries/layers/index.js +9 -0
  399. package/dist/build.js +249 -0
  400. package/dist/cli-run.js +34 -0
  401. package/dist/cli.js +49 -0
  402. package/dist/commands/build.js +32 -0
  403. package/dist/commands/cdp/capture.js +91 -0
  404. package/dist/commands/cdp/client.js +140 -0
  405. package/dist/commands/cdp/eval.js +20 -0
  406. package/dist/commands/cdp/quit.js +84 -0
  407. package/dist/commands/cdp/relaunch.js +62 -0
  408. package/dist/commands/cdp/shot.js +20 -0
  409. package/dist/commands/cdp/status.js +38 -0
  410. package/dist/commands/cdp/theme.js +21 -0
  411. package/dist/commands/cdp.js +53 -0
  412. package/dist/commands/clean.js +34 -0
  413. package/dist/commands/deploy.js +75 -0
  414. package/dist/commands/finalize-release.js +238 -0
  415. package/dist/commands/install.js +37 -0
  416. package/dist/commands/launch.js +150 -0
  417. package/dist/commands/lib/dependencies.js +35 -0
  418. package/dist/commands/lib/deploy-precheck.js +117 -0
  419. package/dist/commands/lib/ensure-target.js +300 -0
  420. package/dist/commands/logs.js +185 -0
  421. package/dist/commands/package.js +31 -0
  422. package/dist/commands/publish.js +34 -0
  423. package/dist/commands/push-secrets.js +141 -0
  424. package/dist/commands/release.js +286 -0
  425. package/dist/commands/runner.js +1874 -0
  426. package/dist/commands/sign-windows.js +563 -0
  427. package/dist/commands/test.js +121 -0
  428. package/dist/commands/update.js +21 -0
  429. package/dist/commands/validate-certs.js +238 -0
  430. package/dist/commands/version.js +9 -0
  431. package/dist/config/page-template.html +35 -0
  432. package/dist/defaults/.github/workflows/build.yml +276 -0
  433. package/dist/defaults/AGENTS.md +109 -0
  434. package/dist/defaults/CHANGELOG.md +15 -0
  435. package/dist/defaults/CLAUDE.md +1 -0
  436. package/dist/defaults/_.gitignore +24 -0
  437. package/dist/defaults/_mas/README.md +49 -0
  438. package/dist/defaults/_mas/entitlements.mas.inherit.plist +12 -0
  439. package/dist/defaults/_mas/entitlements.mas.loginhelper.plist +8 -0
  440. package/dist/defaults/_mas/entitlements.mas.plist +33 -0
  441. package/dist/defaults/config/certs/.gitkeep +0 -0
  442. package/dist/defaults/config/certs/README.md +60 -0
  443. package/dist/defaults/config/icons/macos/dmg.png +0 -0
  444. package/dist/defaults/config/icons/macos/icon.png +0 -0
  445. package/dist/defaults/config/icons/macos/tray.png +0 -0
  446. package/dist/defaults/config/icons/windows/icon.png +0 -0
  447. package/dist/defaults/config/omega.json5 +279 -0
  448. package/dist/defaults/docs/README.md +17 -0
  449. package/dist/defaults/gulpfile.js +6 -0
  450. package/dist/defaults/hooks/build/post.js +9 -0
  451. package/dist/defaults/hooks/build/pre.js +9 -0
  452. package/dist/defaults/hooks/notarize/post.js +16 -0
  453. package/dist/defaults/hooks/release/post.js +9 -0
  454. package/dist/defaults/hooks/release/pre.js +9 -0
  455. package/dist/defaults/src/assets/js/components/about/index.js +10 -0
  456. package/dist/defaults/src/assets/js/components/main/index.js +14 -0
  457. package/dist/defaults/src/assets/js/components/settings/index.js +10 -0
  458. package/dist/defaults/src/assets/scss/main.scss +34 -0
  459. package/dist/defaults/src/assets/scss/pages/about.scss +3 -0
  460. package/dist/defaults/src/assets/scss/pages/main.scss +4 -0
  461. package/dist/defaults/src/assets/scss/pages/settings.scss +3 -0
  462. package/dist/defaults/src/integrations/context-menu/index.js +60 -0
  463. package/dist/defaults/src/integrations/menu/index.js +58 -0
  464. package/dist/defaults/src/integrations/tray/index.js +60 -0
  465. package/dist/defaults/src/main.js +78 -0
  466. package/dist/defaults/src/preload.js +15 -0
  467. package/dist/defaults/src/views/about/index.html +3 -0
  468. package/dist/defaults/src/views/main/index.html +8 -0
  469. package/dist/defaults/src/views/settings/index.html +3 -0
  470. package/dist/defaults/test/README.md +41 -0
  471. package/dist/defaults/test/_init.js +10 -0
  472. package/dist/gulp/main.js +144 -0
  473. package/dist/gulp/tasks/audit.js +82 -0
  474. package/dist/gulp/tasks/build-config.js +445 -0
  475. package/dist/gulp/tasks/bundle.js +451 -0
  476. package/dist/gulp/tasks/defaults.js +20 -0
  477. package/dist/gulp/tasks/distribute.js +8 -0
  478. package/dist/gulp/tasks/html.js +95 -0
  479. package/dist/gulp/tasks/package-quick.js +102 -0
  480. package/dist/gulp/tasks/package.js +53 -0
  481. package/dist/gulp/tasks/release.js +57 -0
  482. package/dist/gulp/tasks/sass.js +82 -0
  483. package/dist/gulp/tasks/serve.js +191 -0
  484. package/dist/hooks/notarize.js +70 -0
  485. package/dist/index.js +14 -0
  486. package/dist/lib/_menu-mixin.js +199 -0
  487. package/dist/lib/analytics.js +360 -0
  488. package/dist/lib/app-state.js +220 -0
  489. package/dist/lib/auth-flow.js +160 -0
  490. package/dist/lib/auth-persistence.js +207 -0
  491. package/dist/lib/auto-updater.js +752 -0
  492. package/dist/lib/client-bridge.js +371 -0
  493. package/dist/lib/context-menu.js +302 -0
  494. package/dist/lib/context.js +162 -0
  495. package/dist/lib/deep-link.js +370 -0
  496. package/dist/lib/fontawesome.js +203 -0
  497. package/dist/lib/ipc.js +169 -0
  498. package/dist/lib/logger-lite.js +259 -0
  499. package/dist/lib/logger.js +4 -0
  500. package/dist/lib/menu.js +521 -0
  501. package/dist/lib/protocol.js +85 -0
  502. package/dist/lib/remote-config.js +224 -0
  503. package/dist/lib/remote-scripts.js +158 -0
  504. package/dist/lib/restart-manager/index.js +550 -0
  505. package/dist/lib/restart-manager/install.js +353 -0
  506. package/dist/lib/restart-manager/protocol.js +274 -0
  507. package/dist/lib/sign-helpers/auto-unlock.js +95 -0
  508. package/dist/lib/sign-helpers/entitlements.js +98 -0
  509. package/dist/lib/sign-helpers/resolve-icons.js +171 -0
  510. package/dist/lib/sign-helpers/sign-events.js +75 -0
  511. package/dist/lib/sign-helpers/update-info.js +186 -0
  512. package/dist/lib/startup.js +214 -0
  513. package/dist/lib/storage.js +193 -0
  514. package/dist/lib/templating.js +85 -0
  515. package/dist/lib/theme.js +173 -0
  516. package/dist/lib/tray.js +414 -0
  517. package/dist/lib/usage.js +141 -0
  518. package/dist/lib/window-manager.js +509 -0
  519. package/dist/main.js +542 -0
  520. package/dist/omega-bin.js +6 -0
  521. package/dist/preload.js +241 -0
  522. package/dist/renderer.js +456 -0
  523. package/dist/test/assert.js +4 -0
  524. package/dist/test/fixtures/consumer-app/config/omega.json5 +39 -0
  525. package/dist/test/fixtures/consumer-app/package.json +13 -0
  526. package/dist/test/fixtures/consumer-app/src/assets/js/components/main/index.js +11 -0
  527. package/dist/test/fixtures/consumer-app/src/assets/scss/main.scss +3 -0
  528. package/dist/test/fixtures/consumer-app/src/main.js +17 -0
  529. package/dist/test/fixtures/consumer-app/src/preload.js +4 -0
  530. package/dist/test/fixtures/consumer-app/src/views/main/index.html +4 -0
  531. package/dist/test/harness/boot-entry.js +237 -0
  532. package/dist/test/harness/main-entry.js +494 -0
  533. package/dist/test/harness/package.json +6 -0
  534. package/dist/test/harness/renderer-entry.js +173 -0
  535. package/dist/test/harness/renderer-preload.js +310 -0
  536. package/dist/test/harness/renderer.html +12 -0
  537. package/dist/test/index.js +65 -0
  538. package/dist/test/runner.js +99 -0
  539. package/dist/test/runners/boot.js +414 -0
  540. package/dist/test/runners/electron.js +92 -0
  541. package/dist/test/runners/render-event.js +46 -0
  542. package/dist/test/suites/boot/build-isolation.test.js +54 -0
  543. package/dist/test/suites/boot/consumer-app-boots.test.js +99 -0
  544. package/dist/test/suites/boot/restart-manager.test.js +38 -0
  545. package/dist/test/suites/boot/storage-bundled.test.js +59 -0
  546. package/dist/test/suites/boot/theme.test.js +68 -0
  547. package/dist/test/suites/boot/view-suite.test.js +47 -0
  548. package/dist/test/suites/build/attach-log-file.test.js +99 -0
  549. package/dist/test/suites/build/audit.test.js +271 -0
  550. package/dist/test/suites/build/boot-fixture.test.js +48 -0
  551. package/dist/test/suites/build/build-config.test.js +457 -0
  552. package/dist/test/suites/build/build-verbs.test.js +156 -0
  553. package/dist/test/suites/build/build-workflow-jobs.test.js +55 -0
  554. package/dist/test/suites/build/cdp.test.js +89 -0
  555. package/dist/test/suites/build/cli.test.js +135 -0
  556. package/dist/test/suites/build/config-schema.test.js +133 -0
  557. package/dist/test/suites/build/defaults-scaffold.test.js +192 -0
  558. package/dist/test/suites/build/deliver-certs.test.js +95 -0
  559. package/dist/test/suites/build/derive-signing-env.test.js +122 -0
  560. package/dist/test/suites/build/electron-node-version.test.js +49 -0
  561. package/dist/test/suites/build/electron-targets.test.js +92 -0
  562. package/dist/test/suites/build/ensure-target.test.js +131 -0
  563. package/dist/test/suites/build/entitlements.test.js +107 -0
  564. package/dist/test/suites/build/env-delivery.test.js +166 -0
  565. package/dist/test/suites/build/env-watch.test.js +86 -0
  566. package/dist/test/suites/build/exports.test.js +63 -0
  567. package/dist/test/suites/build/finalize-release.test.js +152 -0
  568. package/dist/test/suites/build/format-fetch-error.test.js +85 -0
  569. package/dist/test/suites/build/framework-deps.test.js +173 -0
  570. package/dist/test/suites/build/get-config.test.js +137 -0
  571. package/dist/test/suites/build/github-utils.test.js +54 -0
  572. package/dist/test/suites/build/icon-sheet.test.js +62 -0
  573. package/dist/test/suites/build/license-stamp.test.js +63 -0
  574. package/dist/test/suites/build/logger-lite.test.js +148 -0
  575. package/dist/test/suites/build/logs-command.test.js +226 -0
  576. package/dist/test/suites/build/manager.test.js +193 -0
  577. package/dist/test/suites/build/menu-mixin.test.js +130 -0
  578. package/dist/test/suites/build/merge-line-files.test.js +230 -0
  579. package/dist/test/suites/build/omega-shell.test.js +94 -0
  580. package/dist/test/suites/build/omega-tokens.test.js +64 -0
  581. package/dist/test/suites/build/project-scripts-deps.test.js +90 -0
  582. package/dist/test/suites/build/push-secrets.test.js +226 -0
  583. package/dist/test/suites/build/release-pipeline.test.js +365 -0
  584. package/dist/test/suites/build/renderer-auth-bridge.test.js +158 -0
  585. package/dist/test/suites/build/renderer-entry-key.test.js +37 -0
  586. package/dist/test/suites/build/renderer-node-shims.test.js +125 -0
  587. package/dist/test/suites/build/resolve-icons.test.js +296 -0
  588. package/dist/test/suites/build/resolve-signing-cert.test.js +342 -0
  589. package/dist/test/suites/build/restart-manager-install.test.js +178 -0
  590. package/dist/test/suites/build/restart-manager-protocol.test.js +158 -0
  591. package/dist/test/suites/build/run-consumer-hook.test.js +137 -0
  592. package/dist/test/suites/build/runner.test.js +2599 -0
  593. package/dist/test/suites/build/sanitize-signing-env.test.js +98 -0
  594. package/dist/test/suites/build/sanitize-url.test.js +78 -0
  595. package/dist/test/suites/build/secure-remote-url.test.js +42 -0
  596. package/dist/test/suites/build/sentry.test.js +89 -0
  597. package/dist/test/suites/build/serve-resolve-electron.test.js +58 -0
  598. package/dist/test/suites/build/setup-scripts.test.js +172 -0
  599. package/dist/test/suites/build/sign-events.test.js +90 -0
  600. package/dist/test/suites/build/sign-windows-e2e.test.js +302 -0
  601. package/dist/test/suites/build/sign-windows.test.js +313 -0
  602. package/dist/test/suites/build/strip-dev-blocks.test.js +116 -0
  603. package/dist/test/suites/build/templating.test.js +95 -0
  604. package/dist/test/suites/build/test-discovery.test.js +64 -0
  605. package/dist/test/suites/build/test-stealth.test.js +83 -0
  606. package/dist/test/suites/build/test-target-no-match.test.js +119 -0
  607. package/dist/test/suites/build/update-info.test.js +224 -0
  608. package/dist/test/suites/build/url-helpers.test.js +289 -0
  609. package/dist/test/suites/build/validate-certs.test.js +103 -0
  610. package/dist/test/suites/build/validate-config.test.js +90 -0
  611. package/dist/test/suites/build/verb-logs.test.js +43 -0
  612. package/dist/test/suites/build/wave5-pins.test.js +35 -0
  613. package/dist/test/suites/main/analytics.test.js +364 -0
  614. package/dist/test/suites/main/app-state.test.js +197 -0
  615. package/dist/test/suites/main/auth-flow.test.js +196 -0
  616. package/dist/test/suites/main/auth-persistence.test.js +167 -0
  617. package/dist/test/suites/main/auto-updater.test.js +1138 -0
  618. package/dist/test/suites/main/boot-sequence.test.js +77 -0
  619. package/dist/test/suites/main/client-bridge.integration.test.js +134 -0
  620. package/dist/test/suites/main/client-bridge.test.js +249 -0
  621. package/dist/test/suites/main/context-menu.test.js +365 -0
  622. package/dist/test/suites/main/context.test.js +155 -0
  623. package/dist/test/suites/main/deep-link.test.js +288 -0
  624. package/dist/test/suites/main/epipe-handler.test.js +40 -0
  625. package/dist/test/suites/main/fontawesome.test.js +147 -0
  626. package/dist/test/suites/main/harness-cdp.test.js +49 -0
  627. package/dist/test/suites/main/ipc.test.js +165 -0
  628. package/dist/test/suites/main/menu.test.js +419 -0
  629. package/dist/test/suites/main/protocol.test.js +77 -0
  630. package/dist/test/suites/main/remote-config.test.js +189 -0
  631. package/dist/test/suites/main/remote-scripts.test.js +276 -0
  632. package/dist/test/suites/main/restart-manager.test.js +328 -0
  633. package/dist/test/suites/main/startup-paths-and-ua.test.js +99 -0
  634. package/dist/test/suites/main/startup.test.js +129 -0
  635. package/dist/test/suites/main/stealth-window.test.js +74 -0
  636. package/dist/test/suites/main/storage.test.js +89 -0
  637. package/dist/test/suites/main/theme.test.js +137 -0
  638. package/dist/test/suites/main/tray.test.js +322 -0
  639. package/dist/test/suites/main/truncate-on-boot.test.js +22 -0
  640. package/dist/test/suites/main/url-helpers.test.js +429 -0
  641. package/dist/test/suites/main/usage.test.js +127 -0
  642. package/dist/test/suites/main/window-bounds.test.js +169 -0
  643. package/dist/test/suites/main/window-manager.test.js +233 -0
  644. package/dist/test/suites/renderer/analytics-bridge.test.js +128 -0
  645. package/dist/test/suites/renderer/cross-context-helpers.test.js +131 -0
  646. package/dist/test/suites/renderer/fontawesome.test.js +190 -0
  647. package/dist/test/suites/renderer/round-trip.test.js +107 -0
  648. package/dist/test/suites/renderer/theme.test.js +118 -0
  649. package/dist/test/suites/renderer/tooltips.test.js +166 -0
  650. package/dist/test/suites/renderer/verts.test.js +100 -0
  651. package/dist/test/suites/renderer/window-em-surface.test.js +107 -0
  652. package/dist/test/utils/dist-snapshot.js +36 -0
  653. package/dist/test/utils/extended-mode-warning.js +13 -0
  654. package/dist/utils/app-root.js +28 -0
  655. package/dist/utils/attach-log-file.js +4 -0
  656. package/dist/utils/build-pipeline.js +58 -0
  657. package/dist/utils/deliver-certs.js +69 -0
  658. package/dist/utils/derive-signing-env.js +56 -0
  659. package/dist/utils/dist-root.js +21 -0
  660. package/dist/utils/electron-node-version.js +48 -0
  661. package/dist/utils/electron-targets.js +72 -0
  662. package/dist/utils/format-fetch-error.js +38 -0
  663. package/dist/utils/github.js +73 -0
  664. package/dist/utils/load-consumer-file.js +26 -0
  665. package/dist/utils/merge-line-files.js +5 -0
  666. package/dist/utils/mode-helpers.js +147 -0
  667. package/dist/utils/resolve-signing-cert.js +175 -0
  668. package/dist/utils/run-consumer-hook.js +38 -0
  669. package/dist/utils/runner-env.js +687 -0
  670. package/dist/utils/safe-install.js +4 -0
  671. package/dist/utils/sanitize-signing-env.js +45 -0
  672. package/dist/utils/sanitize-url.js +28 -0
  673. package/dist/utils/secure-remote-url.js +25 -0
  674. package/dist/utils/stealth-window.js +37 -0
  675. package/dist/utils/test-stealth.js +29 -0
  676. package/dist/utils/url-helpers.js +169 -0
  677. package/dist/vendor/account/engine.js +182 -0
  678. package/dist/vendor/account/features.js +220 -0
  679. package/dist/vendor/account/index.js +53 -0
  680. package/dist/vendor/account/schema.js +272 -0
  681. package/dist/vendor/account/subscription.js +38 -0
  682. package/dist/vendor/analytics/adapters/ga4.js +26 -0
  683. package/dist/vendor/analytics/adapters/meta.js +26 -0
  684. package/dist/vendor/analytics/adapters/resolve.js +130 -0
  685. package/dist/vendor/analytics/adapters/tiktok.js +27 -0
  686. package/dist/vendor/analytics/catalog.js +908 -0
  687. package/dist/vendor/analytics/consent.js +49 -0
  688. package/dist/vendor/analytics/core.js +141 -0
  689. package/dist/vendor/analytics/identity.js +136 -0
  690. package/dist/vendor/analytics/index.js +170 -0
  691. package/dist/vendor/analytics/logger.js +40 -0
  692. package/dist/vendor/analytics/transports/browser.js +110 -0
  693. package/dist/vendor/config/company.js +31 -0
  694. package/dist/vendor/config/defaults.js +173 -0
  695. package/dist/vendor/config/demo.js +18 -0
  696. package/dist/vendor/config/desktop-artifacts.js +110 -0
  697. package/dist/vendor/config/edit.js +769 -0
  698. package/dist/vendor/config/env-delivery.js +145 -0
  699. package/dist/vendor/config/env-rules.js +93 -0
  700. package/dist/vendor/config/env-schema.js +1078 -0
  701. package/dist/vendor/config/env.js +445 -0
  702. package/dist/vendor/config/hooks.js +97 -0
  703. package/dist/vendor/config/index.js +237 -0
  704. package/dist/vendor/config/instances.js +208 -0
  705. package/dist/vendor/config/load.js +490 -0
  706. package/dist/vendor/config/merge.js +68 -0
  707. package/dist/vendor/config/order.js +139 -0
  708. package/dist/vendor/config/ports.js +374 -0
  709. package/dist/vendor/config/providers.js +32 -0
  710. package/dist/vendor/config/repo.js +142 -0
  711. package/dist/vendor/config/retired-keys.js +430 -0
  712. package/dist/vendor/config/schema.js +1610 -0
  713. package/dist/vendor/config/secrets.js +50 -0
  714. package/dist/vendor/config/seed.js +34 -0
  715. package/dist/vendor/config/site-global.js +205 -0
  716. package/dist/vendor/config/validate.js +554 -0
  717. package/dist/vendor/config/winback.js +61 -0
  718. package/dist/vendor/devkit/actions-secrets.js +145 -0
  719. package/dist/vendor/devkit/attach-log-file.js +262 -0
  720. package/dist/vendor/devkit/bundle.js +292 -0
  721. package/dist/vendor/devkit/certs.js +199 -0
  722. package/dist/vendor/devkit/ci-workflows.js +520 -0
  723. package/dist/vendor/devkit/clean-dirs.js +28 -0
  724. package/dist/vendor/devkit/cli-router.js +156 -0
  725. package/dist/vendor/devkit/defaults-engine.js +372 -0
  726. package/dist/vendor/devkit/deploy-precheck.js +54 -0
  727. package/dist/vendor/devkit/deploy-record.js +180 -0
  728. package/dist/vendor/devkit/deploy.js +286 -0
  729. package/dist/vendor/devkit/empty-modules-plugin.js +64 -0
  730. package/dist/vendor/devkit/env-watch.js +132 -0
  731. package/dist/vendor/devkit/framework-deps.js +46 -0
  732. package/dist/vendor/devkit/license.js +155 -0
  733. package/dist/vendor/devkit/local.js +1905 -0
  734. package/dist/vendor/devkit/logger.js +128 -0
  735. package/dist/vendor/devkit/merge-line-files.js +296 -0
  736. package/dist/vendor/devkit/npm-registry.js +52 -0
  737. package/dist/vendor/devkit/omega-bin.js +345 -0
  738. package/dist/vendor/devkit/prompt.js +187 -0
  739. package/dist/vendor/devkit/safe-install.js +18 -0
  740. package/dist/vendor/devkit/scaffold-guard.js +96 -0
  741. package/dist/vendor/devkit/stop-signals.js +28 -0
  742. package/dist/vendor/devkit/strip-dev-blocks-plugin.js +29 -0
  743. package/dist/vendor/devkit/strip-dev-blocks.js +32 -0
  744. package/dist/vendor/devkit/target-dependencies.js +137 -0
  745. package/dist/vendor/devkit/target-secrets.js +165 -0
  746. package/dist/vendor/devkit/test/assert.js +120 -0
  747. package/dist/vendor/devkit/test/define-cases.js +104 -0
  748. package/dist/vendor/devkit/test/extended-mode-warning.js +22 -0
  749. package/dist/vendor/devkit/test/runner-core.js +554 -0
  750. package/dist/vendor/devkit/test/scope.js +162 -0
  751. package/dist/vendor/devkit/update.js +569 -0
  752. package/dist/vendor/monitoring/core.js +180 -0
  753. package/dist/vendor/monitoring/env.js +49 -0
  754. package/dist/vendor/monitoring/index.js +28 -0
  755. package/dist/vendor/monitoring/logger.js +39 -0
  756. package/dist/vendor/monitoring/main.js +99 -0
  757. package/dist/vendor/monitoring/preload.js +45 -0
  758. package/dist/vendor/monitoring/renderer.js +87 -0
  759. package/docs/analytics.md +140 -0
  760. package/docs/app-state.md +92 -0
  761. package/docs/audit.md +69 -0
  762. package/docs/auto-updater.md +243 -0
  763. package/docs/boot-sequence.md +39 -0
  764. package/docs/build-system.md +161 -0
  765. package/docs/cdp-debugging.md +169 -0
  766. package/docs/client-bridge.md +267 -0
  767. package/docs/common-mistakes.md +21 -0
  768. package/docs/config-schema.md +120 -0
  769. package/docs/context-menu.md +112 -0
  770. package/docs/context.md +81 -0
  771. package/docs/css.md +84 -0
  772. package/docs/deep-link.md +178 -0
  773. package/docs/environment-detection.md +104 -0
  774. package/docs/fontawesome.md +107 -0
  775. package/docs/hooks.md +87 -0
  776. package/docs/icons.md +79 -0
  777. package/docs/index.md +279 -0
  778. package/docs/installer-options.md +162 -0
  779. package/docs/ipc.md +61 -0
  780. package/docs/lib-modules.md +53 -0
  781. package/docs/logging.md +229 -0
  782. package/docs/menu.md +160 -0
  783. package/docs/releasing.md +229 -0
  784. package/docs/remote-config.md +118 -0
  785. package/docs/remote-scripts.md +144 -0
  786. package/docs/restart-manager.md +144 -0
  787. package/docs/runner.md +253 -0
  788. package/docs/sentry.md +97 -0
  789. package/docs/shared/agent-docs.md +89 -0
  790. package/docs/shared/analytics.md +612 -0
  791. package/docs/shared/brands.md +51 -0
  792. package/docs/shared/breaking-changes.md +497 -0
  793. package/docs/shared/config.md +1387 -0
  794. package/docs/shared/deploys.md +215 -0
  795. package/docs/shared/icons.md +201 -0
  796. package/docs/shared/local-dev.md +147 -0
  797. package/docs/shared/logging.md +202 -0
  798. package/docs/shared/monitoring.md +153 -0
  799. package/docs/shared/publishing.md +183 -0
  800. package/docs/shared/rulings.md +34 -0
  801. package/docs/shared/testing.md +147 -0
  802. package/docs/shared/theming.md +604 -0
  803. package/docs/shared/translation.md +291 -0
  804. package/docs/shared/updates.md +61 -0
  805. package/docs/signing.md +267 -0
  806. package/docs/startup.md +142 -0
  807. package/docs/storage.md +59 -0
  808. package/docs/templating.md +101 -0
  809. package/docs/test-boot-layer.md +157 -0
  810. package/docs/test-framework.md +357 -0
  811. package/docs/themes.md +135 -0
  812. package/docs/tooltips.md +99 -0
  813. package/docs/tray.md +164 -0
  814. package/docs/usage.md +58 -0
  815. package/docs/verts.md +62 -0
  816. package/docs/windows.md +149 -0
  817. package/package.json +184 -0
  818. package/scripts/sync-nvmrc.js +100 -0
@@ -0,0 +1,414 @@
1
+ // Boot-runner — spawns electron with the consumer's actual built main bundle, runs
2
+ // inspect functions against the live manager, then quits cleanly.
3
+ //
4
+ // Differences from runners/electron.js:
5
+ // - electron.js spawns electron with `harness/main-entry.js` and tests @omega.js/desktop lib code in isolation.
6
+ // - boot.js spawns electron with the consumer's built `main.bundle.js` (the real production
7
+ // boot path), then injects `harness/boot-entry.js` via --require to drive inspection.
8
+ //
9
+ // The build + boot happen in a STAGED target root (`<project>/.omega/test-app`), never the
10
+ // project's own dist/ (#110) — a concurrent `npm start` watcher writes dist/, and two
11
+ // writers on one tree means either side can load a half-written bundle. See stageTestApp().
12
+ //
13
+ // Why both? `main` layer tests cover individual lib behavior fast. `boot` layer covers
14
+ // integration — does the consumer's actual main.js boot end-to-end with their config + scaffolds?
15
+ // Replaces shell-level `npm start && sleep && kill` smoke tests with deterministic, signal-driven
16
+ // pass/fail.
17
+ //
18
+ // This lane also carries the renderer suites that name a project view (`view: '<name>'`):
19
+ // they need the built app a boot run already produces, so `harness/boot-entry.js` opens each
20
+ // view in a real window of the booted app once the inspect tests are done. They arrive here
21
+ // as `suites` (whole modules), never flattened into `tests`.
22
+
23
+ const path = require('path');
24
+ const fs = require('fs');
25
+ const os = require('os');
26
+ const { spawn, spawnSync } = require('child_process');
27
+ const chalk = require('chalk').default;
28
+ const distSnapshot = require('../utils/dist-snapshot.js');
29
+ const { renderEvent } = require('./render-event.js');
30
+
31
+ async function runBootTests({ tests, suites, projectRoot, frameworkDistRoot }) {
32
+ suites = suites || [];
33
+
34
+ if (tests.length === 0 && suites.length === 0) {
35
+ return { passed: 0, failed: 0, skipped: 0 };
36
+ }
37
+
38
+ // OMEGA_TEST_BOOT_PROJECT — boot a different project root than the CWD. Auto-set to the
39
+ // bundled fixture when @omega.js/desktop self-tests (see commands/test.js); set it explicitly to boot a
40
+ // real consumer (e.g. deployment-playground-desktop) without cd-ing into it. Mirrors
41
+ // BXM's OMEGA_TEST_BOOT_PROJECT / UJM's UJ_TEST_BOOT_PROJECT.
42
+ const effectiveRoot = process.env.OMEGA_TEST_BOOT_PROJECT
43
+ ? path.resolve(process.env.OMEGA_TEST_BOOT_PROJECT)
44
+ : projectRoot;
45
+
46
+ // The bundled fixture ships as SOURCE only (no node_modules). Symlink the two deps the
47
+ // build + boot path resolves by EXPLICIT path: @omega.js/desktop (the gulpfile path +
48
+ // esbuild's `require('@omega.js/desktop/main')`) and electron (the runner's binary lookup
49
+ // + the spawned bundle's `require('electron')`). Everything else (gulp, esbuild,
50
+ // etc.) resolves through the upward node_modules walk because the fixture lives inside the
51
+ // @omega.js/desktop repo. No-op for a real consumer that already has its own node_modules. The links are
52
+ // tracked and ALWAYS removed in the finally — the @omega.js/desktop link points at the @omega.js/desktop
53
+ // repo root, which CONTAINS the fixture, so leaving it behind forms an infinite directory
54
+ // cycle inside dist/ that crashes the next prepare-package tree walk (ENAMETOOLONG) and
55
+ // with it `npm publish`.
56
+ const createdLinks = ensureFixtureDeps(effectiveRoot, path.resolve(frameworkDistRoot, '..'));
57
+
58
+ try {
59
+ return await bootProject({ tests, suites, effectiveRoot, frameworkDistRoot });
60
+ } finally {
61
+ removeFixtureDeps(createdLinks);
62
+ }
63
+ }
64
+
65
+ // Build + spawn + inspect — the actual boot run against effectiveRoot.
66
+ async function bootProject({ tests, suites, effectiveRoot, frameworkDistRoot }) {
67
+ // Serialize the view suites BEFORE anything is built: a run whose every suite is skipped
68
+ // (and that has no inspect tests) has nothing to build an app for.
69
+ const { viewSuites, skipEvents } = prepareViewSuites(suites);
70
+
71
+ if (tests.length === 0 && viewSuites.length === 0) {
72
+ const counts = { passed: 0, failed: 0, skipped: 0 };
73
+ skipEvents.forEach((evt) => renderEvent(evt, counts));
74
+ return counts;
75
+ }
76
+
77
+ // Every test a failed build or a missing electron accounts for: the flat inspect list plus
78
+ // every test inside a view suite.
79
+ const testCount = tests.length + viewSuites.reduce((total, suite) => total + suite.tests.length, 0);
80
+
81
+ // Locate electron. Resolve like Node would from the project root (walks up node_modules
82
+ // chains), so hoisted installs (npm workspaces) are found — not just <root>/node_modules.
83
+ let electronBin;
84
+ try {
85
+ electronBin = require(require.resolve('electron', { paths: [effectiveRoot] }));
86
+ } catch (e) {
87
+ const msg = ` ○ boot tests skipped (electron not installed in ${effectiveRoot})`;
88
+ console.log(chalk.yellow(msg));
89
+ return { passed: 0, failed: 0, skipped: testCount };
90
+ }
91
+
92
+ // Stage the boot-test target root and record the project's real dist/ before anything
93
+ // builds — the boot layer asserts that fingerprint is unchanged afterwards (#110).
94
+ const testApp = stageTestApp(effectiveRoot);
95
+ const distSnapshotBefore = distSnapshot(path.join(effectiveRoot, 'dist'));
96
+
97
+ // Always rebuild before boot tests. Boot tests run against the consumer's actual
98
+ // production main bundle; if it's stale, tests pass against outdated code.
99
+ // Always-build is ~10s slower than a staleness check, but a staleness heuristic
100
+ // (mtime comparison) can be defeated by editor backdating, git restores, or
101
+ // file copies — and a silently-stale test is worse than a slow one.
102
+ // Set OMEGA_TEST_SKIP_BUILD=1 to opt out (CI scenarios where build ran in a separate step).
103
+ if (process.env.OMEGA_TEST_SKIP_BUILD !== '1') {
104
+ console.log(chalk.gray(` Building bundle for boot tests...`));
105
+ // A fresh build gets a fresh output: leftovers from a prior run (a deleted
106
+ // view, a renamed bundle) would otherwise survive and keep existence-style
107
+ // assertions green. SKIP_BUILD keeps the staged output — that is its point.
108
+ fs.rmSync(testApp.distRoot, { recursive: true, force: true });
109
+ const buildResult = runGulpBuild(effectiveRoot, testApp.distRoot);
110
+ if (buildResult !== 0) {
111
+ console.log(chalk.red(` ✗ Boot tests aborted — gulp build failed (exit ${buildResult}).`));
112
+ return { passed: 0, failed: testCount, skipped: 0 };
113
+ }
114
+ } else if (!fs.existsSync(testApp.bundlePath)) {
115
+ // Loud, not skipped: the test output is private to the boot runner, so an absent
116
+ // bundle means the build step the operator promised never ran. Booting anything
117
+ // else (the project's dist/, a stale tree) would silently test the wrong bundle.
118
+ console.log(chalk.red(` ✗ Boot tests aborted — OMEGA_TEST_SKIP_BUILD=1 but no test build at ${testApp.bundlePath}. Run the boot tests once without it (or build with OMEGA_BUILD_OUTPUT=${testApp.distRoot}).`));
119
+ return { passed: 0, failed: testCount, skipped: 0 };
120
+ }
121
+
122
+ // Write the spec file. Each test's `inspect` function body is extracted as a string
123
+ // and shipped to the harness for reconstitution. Same trick as runners/electron.js
124
+ // uses for renderer suites.
125
+ const spec = {
126
+ projectRoot: effectiveRoot,
127
+ appRoot: testApp.appRoot,
128
+ frameworkDistRoot,
129
+ distSnapshotBefore,
130
+ tests: tests.map((t) => ({
131
+ description: t.description,
132
+ timeout: t.timeout,
133
+ inspectSource: extractFnBody(t.inspect),
134
+ })),
135
+ viewSuites,
136
+ };
137
+
138
+ const specFile = path.join(os.tmpdir(), `desktop-boot-spec-${process.pid}-${Date.now()}.json`);
139
+ fs.writeFileSync(specFile, JSON.stringify(spec));
140
+
141
+ const bootEntry = path.join(frameworkDistRoot, 'test', 'harness', 'boot-entry.js');
142
+
143
+ // Tell the consumer's main.js to publish the manager + run the boot harness.
144
+ // Three env vars are picked up by @omega.js/desktop's main.js after init completes:
145
+ // OMEGA_TEST_BOOT — gate; "1" turns on harness loading
146
+ // OMEGA_TEST_BOOT_HARNESS — absolute path to harness module (resolved here so it works
147
+ // even though main.js is esbuild-bundled into the consumer bundle)
148
+ // OMEGA_TEST_BOOT_SPEC — JSON file with the test definitions
149
+ // Argv would be cleaner but Electron rejects unknown CLI flags.
150
+ const childEnv = Object.assign({}, process.env, {
151
+ OMEGA_TEST_MODE: 'true', // canonical signal — manager.isTesting() picks it up
152
+ OMEGA_TEST_BOOT: '1', // boot-runner-specific dispatch marker (main.js reads this to load the harness instead of doing normal init)
153
+ OMEGA_TEST_BOOT_HARNESS: bootEntry,
154
+ OMEGA_TEST_BOOT_SPEC: specFile,
155
+ // Tray on macOS pops a real menubar icon; suppress to keep the test invisible.
156
+ OMEGA_TEST_HEADLESS: '1',
157
+ // Suppress dev-mode dock-bounce / startup item changes during the test.
158
+ NODE_ENV: process.env.NODE_ENV || 'test',
159
+ });
160
+ // Defensive scrub at the spawn (friction 17c) — the CLI boundary strips it,
161
+ // but paths that bypass the boundary must not boot Electron as plain node.
162
+ delete childEnv.ELECTRON_RUN_AS_NODE;
163
+
164
+ // Args passed to electron:
165
+ // testApp.appRoot — the staged target root (package.json#main = dist/main.bundle.js,
166
+ // its dist/ being the isolated test build). Electron loads it exactly the way it
167
+ // loads a real project dir, so packaged-app semantics — app name/version from
168
+ // package.json, appRoot-relative view/preload/icon lookups — are unchanged.
169
+ //
170
+ // We don't use `--require <bootEntry>` because Electron rejects unknown CLI flags. Instead,
171
+ // @omega.js/desktop's main.js detects OMEGA_TEST_BOOT and `require()`s the boot harness itself after init.
172
+ const args = [testApp.appRoot];
173
+
174
+ return new Promise((resolve) => {
175
+ const child = spawn(electronBin, args, {
176
+ cwd: effectiveRoot,
177
+ env: childEnv,
178
+ stdio: ['ignore', 'pipe', 'pipe'],
179
+ });
180
+
181
+ let buffer = '';
182
+ const counts = { passed: 0, failed: 0, skipped: 0 };
183
+
184
+ // Suites the module skipped whole: reported before the run they never join.
185
+ skipEvents.forEach((evt) => renderEvent(evt, counts));
186
+
187
+ child.stdout.on('data', (chunk) => {
188
+ buffer += chunk.toString();
189
+ let nl;
190
+ while ((nl = buffer.indexOf('\n')) >= 0) {
191
+ const line = buffer.slice(0, nl);
192
+ buffer = buffer.slice(nl + 1);
193
+ if (line.startsWith('__EM_TEST__')) {
194
+ renderEvent(JSON.parse(line.slice('__EM_TEST__'.length)), counts);
195
+ } else if (process.env.OMEGA_TEST_DEBUG && line.trim().length > 0) {
196
+ process.stdout.write(chalk.gray(` ${line}\n`));
197
+ }
198
+ }
199
+ });
200
+
201
+ child.stderr.on('data', (chunk) => {
202
+ if (process.env.OMEGA_TEST_DEBUG) {
203
+ process.stderr.write(chalk.gray(`[boot:stderr] ${chunk.toString()}`));
204
+ }
205
+ });
206
+
207
+ child.on('error', (err) => {
208
+ console.log(chalk.red(` ✗ Failed to spawn boot harness: ${err.message}`));
209
+ counts.failed += 1;
210
+ cleanup();
211
+ resolve(counts);
212
+ });
213
+
214
+ child.on('exit', () => {
215
+ cleanup();
216
+ resolve(counts);
217
+ });
218
+
219
+ function cleanup() {
220
+ try { fs.unlinkSync(specFile); } catch (_) { /* ignore */ }
221
+ }
222
+ });
223
+ }
224
+
225
+ // Serialize the boot-bound renderer suites (`view: '<name>'`) for the spec file, the same
226
+ // shape main-entry.js ships to the harness page (plus the view name). A suite the module
227
+ // skipped whole runs nothing and reports its test count as skipped, exactly as the harness
228
+ // renderer lane does.
229
+ //
230
+ // Returns { viewSuites, skipEvents }: the suites to run, and the skip events the caller
231
+ // renders once it has a counts object.
232
+ function prepareViewSuites(suites) {
233
+ const viewSuites = [];
234
+ const skipEvents = [];
235
+
236
+ for (const { file, mod } of suites) {
237
+ const description = mod.description || path.basename(file);
238
+
239
+ if (mod.skip) {
240
+ const reason = typeof mod.skip === 'string' ? mod.skip : 'skipped';
241
+ const count = Array.isArray(mod.tests) ? mod.tests.length : 1;
242
+ skipEvents.push({ event: 'skip', name: description, reason, count });
243
+ continue;
244
+ }
245
+
246
+ viewSuites.push({
247
+ description,
248
+ isGroup: mod.type === 'group',
249
+ timeout: mod.timeout,
250
+ view: mod.view,
251
+ tests: (mod.tests || []).map((t) => ({
252
+ name: t.name,
253
+ skip: t.skip,
254
+ timeout: t.timeout,
255
+ runSource: extractFnBody(t.run),
256
+ })),
257
+ });
258
+ }
259
+
260
+ return { viewSuites, skipEvents };
261
+ }
262
+
263
+ // Extract the body of a function as a string. Same impl style as main-entry.js's
264
+ // extractFnBody — handles arrow fns, async fns, and regular fns.
265
+ function extractFnBody(fn) {
266
+ // Same degradation as main-entry.js: a test without a function reports as one failed
267
+ // test instead of ending the whole run with a stack trace naming neither file nor test.
268
+ if (typeof fn !== 'function') return 'throw new Error("test has no run() function");';
269
+ const src = String(fn);
270
+ // Try arrow: `(args) => { ... }` or `args => expr`
271
+ let m = src.match(/^\s*(?:async\s+)?\([^)]*\)\s*=>\s*\{([\s\S]*)\}\s*$/);
272
+ if (m) return m[1];
273
+ m = src.match(/^\s*(?:async\s+)?\([^)]*\)\s*=>\s*([\s\S]*?)\s*$/);
274
+ if (m) return `return ${m[1]};`;
275
+ // Regular fn: `function (args) { ... }` or `function name(args) { ... }`
276
+ m = src.match(/^\s*(?:async\s+)?function[^(]*\([^)]*\)\s*\{([\s\S]*)\}\s*$/);
277
+ if (m) return m[1];
278
+ // Method shorthand: `inspect(args) { ... }`
279
+ m = src.match(/^[^(]*\([^)]*\)\s*\{([\s\S]*)\}\s*$/);
280
+ if (m) return m[1];
281
+ throw new Error(`Could not extract body from function: ${src.slice(0, 80)}...`);
282
+ }
283
+
284
+ // Shell out to the same gulp pipeline `npm run build` uses. This produces a fresh
285
+ // main.bundle.js (+ preload + renderer bundles) using the consumer's current source.
286
+ // OMEGA_BUILD_OUTPUT redirects every output path (utils/dist-root.js — the one seam) into
287
+ // the staged test app, so the project's dist/ is never written. Output is streamed inline
288
+ // so the user sees progress for the ~10s build cost.
289
+ function runGulpBuild(projectRoot, outputRoot) {
290
+ const gulpfile = path.join(projectRoot, 'node_modules', '@omega.js/desktop', 'dist', 'gulp', 'main.js');
291
+ const result = spawnSync('npx', ['gulp', '--cwd', projectRoot, '--gulpfile', gulpfile, 'build'], {
292
+ cwd: projectRoot,
293
+ env: Object.assign({}, process.env, { OMEGA_BUILD_MODE: 'true', OMEGA_BUILD_OUTPUT: outputRoot }),
294
+ stdio: 'inherit',
295
+ });
296
+ return result.status == null ? 1 : result.status;
297
+ }
298
+
299
+ // Stage the target root the boot tests build into and boot from: `<project>/.omega/test-app`
300
+ // (gitignored). It is a real Electron target dir, not a bare output folder:
301
+ // - package.json — the project's own, verbatim except `main`, which is pinned at the
302
+ // test build's bundle. Electron derives the app name, version and therefore the
303
+ // userData path from it, so booting the staged root resolves exactly what booting
304
+ // the project does.
305
+ // - src / config — symlinks back to the project's. Runtime lookups resolved against
306
+ // `app.getAppPath()` (src/integrations/*, the unbundled config fallback) keep finding
307
+ // the consumer's real files even though the target dir moved.
308
+ // - dist/ — the isolated build output (OMEGA_BUILD_OUTPUT), so `<appRoot>/dist/views`,
309
+ // `<appRoot>/dist/preload.bundle.js` and the tray's icon lookup need no runtime change.
310
+ // package.json and the symlinks are rewritten on every run; dist/ is cleared by the
311
+ // runner before each build (and deliberately kept under OMEGA_TEST_SKIP_BUILD).
312
+ function stageTestApp(projectRoot) {
313
+ const appRoot = path.join(projectRoot, '.omega', 'test-app');
314
+ const distRoot = path.join(appRoot, 'dist');
315
+
316
+ fs.mkdirSync(appRoot, { recursive: true });
317
+
318
+ let pkg = {};
319
+ try {
320
+ pkg = JSON.parse(fs.readFileSync(path.join(projectRoot, 'package.json'), 'utf8'));
321
+ } catch (e) {
322
+ // A project without a readable package.json can't be built either — the gulp build
323
+ // below surfaces a far clearer error than anything we'd throw here.
324
+ }
325
+ pkg.main = 'dist/main.bundle.js';
326
+ fs.writeFileSync(path.join(appRoot, 'package.json'), `${JSON.stringify(pkg, null, 2)}\n`);
327
+
328
+ const linkType = process.platform === 'win32' ? 'junction' : 'dir';
329
+ for (const name of ['src', 'config']) {
330
+ const target = path.join(projectRoot, name);
331
+ const linkPath = path.join(appRoot, name);
332
+
333
+ try { fs.unlinkSync(linkPath); } catch (e) { /* absent, or a Windows junction (rmdir below) */ }
334
+ try { fs.rmdirSync(linkPath); } catch (e) { /* already gone */ }
335
+
336
+ if (!fs.existsSync(target)) continue;
337
+
338
+ try {
339
+ fs.symlinkSync(target, linkPath, linkType);
340
+ } catch (e) {
341
+ if (process.env.OMEGA_TEST_DEBUG) {
342
+ console.log(chalk.gray(` [boot] could not link ${name}: ${e.message}`));
343
+ }
344
+ }
345
+ }
346
+
347
+ return { appRoot, distRoot, bundlePath: path.join(distRoot, 'main.bundle.js') };
348
+ }
349
+
350
+ // Symlink the deps the bundled fixture's build + boot path resolves by EXPLICIT path
351
+ // (not the upward node_modules walk):
352
+ // - @omega.js/desktop → the @omega.js/desktop repo root, so `<root>/node_modules/@omega.js/desktop/dist/gulp/main.js`
353
+ // (the gulpfile path) resolves AND esbuild's `require('@omega.js/desktop/main')` resolves.
354
+ // - electron → @omega.js/desktop's own electron, so the runner's `require('<root>/node_modules/electron')`
355
+ // binary lookup + the spawned bundle's `require('electron')` resolve.
356
+ // Creates only what's MISSING — a no-op for a real consumer (OMEGA_TEST_BOOT_PROJECT pointed at
357
+ // an installed app already has both). Returns the link paths it created so the caller can
358
+ // remove exactly those (and ONLY those) after the run. Runtime-only; the fixture .gitignore
359
+ // is belt-and-suspenders for crashed runs.
360
+ function ensureFixtureDeps(effectiveRoot, emRoot) {
361
+ const nodeModules = path.join(effectiveRoot, 'node_modules');
362
+ const linkType = process.platform === 'win32' ? 'junction' : 'dir';
363
+ // Resolve electron's actual install dir from emRoot (walks up node_modules chains, so
364
+ // hoisted workspace installs work) instead of assuming emRoot/node_modules/electron.
365
+ let electronDir = path.join(emRoot, 'node_modules', 'electron');
366
+ try {
367
+ electronDir = path.dirname(require.resolve('electron/package.json', { paths: [emRoot] }));
368
+ } catch (e) {
369
+ // fall through with the legacy path; the existsSync guard below handles absence
370
+ }
371
+ const links = [
372
+ ['@omega.js/desktop', emRoot],
373
+ ['electron', electronDir],
374
+ ];
375
+ const created = [];
376
+
377
+ for (const [name, target] of links) {
378
+ const linkPath = path.join(nodeModules, name);
379
+ if (fs.existsSync(linkPath)) continue; // real consumer already has it, or a prior run linked it
380
+ if (!fs.existsSync(target)) continue; // can't link what isn't there
381
+
382
+ try {
383
+ // The link's PARENT, not just node_modules — a scoped name like
384
+ // @omega.js/desktop needs its node_modules/@omega.js dir to exist first
385
+ fs.mkdirSync(path.dirname(linkPath), { recursive: true });
386
+ fs.symlinkSync(target, linkPath, linkType);
387
+ created.push(linkPath);
388
+ } catch (e) {
389
+ // Best-effort — if it mattered, the gulp build / electron lookup below surfaces a
390
+ // far clearer error than anything we'd throw here.
391
+ if (process.env.OMEGA_TEST_DEBUG) {
392
+ console.log(chalk.gray(` [boot] could not link ${name}: ${e.message}`));
393
+ }
394
+ }
395
+ }
396
+
397
+ return created;
398
+ }
399
+
400
+ // Remove the symlinks ensureFixtureDeps created THIS run — never anything else, so a real
401
+ // consumer's node_modules is untouched (nothing was created for it). Removal is required,
402
+ // not just tidy: a leftover @omega.js/desktop → repo-root link inside dist/ is an infinite
403
+ // directory cycle that breaks the next prepare-package walk (`npm run prepare`/`npm publish`).
404
+ function removeFixtureDeps(links) {
405
+ for (const linkPath of links) {
406
+ try {
407
+ fs.unlinkSync(linkPath); // POSIX symlinks
408
+ } catch (_) {
409
+ try { fs.rmdirSync(linkPath); } catch (_) { /* Windows junctions; best-effort */ }
410
+ }
411
+ }
412
+ }
413
+
414
+ module.exports = { runBootTests };
@@ -0,0 +1,92 @@
1
+ // Electron-runner — spawns electron with the main-process harness, parses JSON-line stream,
2
+ // renders @omega.js/backend-style output to console. Returns aggregate counts.
3
+
4
+ const path = require('path');
5
+ const { spawn } = require('child_process');
6
+ const chalk = require('chalk').default;
7
+ const { renderEvent } = require('./render-event.js');
8
+
9
+ function runElectronTests({ harnessEntry, suiteFiles, rendererSuiteFiles, filter, projectRoot }) {
10
+ rendererSuiteFiles = rendererSuiteFiles || [];
11
+ return new Promise((resolve, reject) => {
12
+ let electronBin;
13
+ try {
14
+ // Resolve like Node would from the project root (walks up node_modules chains),
15
+ // so hoisted installs (npm workspaces) are found — not just projectRoot/node_modules.
16
+ electronBin = require(require.resolve('electron', { paths: [projectRoot] }));
17
+ } catch (e) {
18
+ const msg = ` ○ main + renderer tests skipped (electron not installed in ${projectRoot})`;
19
+ console.log(chalk.yellow(msg));
20
+ const skipCount = (suiteFiles || []).length + rendererSuiteFiles.length;
21
+ return resolve({ passed: 0, failed: 0, skipped: skipCount });
22
+ }
23
+
24
+ // Pass the harness DIRECTORY (not the entry file) as the app.
25
+ // The harness dir has its own package.json with main: main-entry.js, which Electron uses.
26
+ // This avoids Electron picking up the consumer's package.json main field.
27
+ const harnessDir = path.dirname(harnessEntry);
28
+ const args = [
29
+ harnessDir,
30
+ '--',
31
+ '--suites', JSON.stringify(suiteFiles || []),
32
+ '--renderer-suites', JSON.stringify(rendererSuiteFiles),
33
+ ];
34
+ if (filter) {
35
+ args.push('--filter', filter);
36
+ }
37
+
38
+ const childEnv = Object.assign({}, process.env, {
39
+ OMEGA_TEST_MODE: 'true', // canonical signal — manager.isTesting() picks it up
40
+ ELECTRON_NO_ATTACH_CONSOLE: '1',
41
+ NODE_OPTIONS: '',
42
+ });
43
+ // Defensive scrub at the spawn (friction 17c) — the CLI boundary strips it,
44
+ // but paths that bypass the boundary must not boot Electron as plain node.
45
+ delete childEnv.ELECTRON_RUN_AS_NODE;
46
+
47
+ const child = spawn(electronBin, args, {
48
+ cwd: projectRoot,
49
+ env: childEnv,
50
+ stdio: ['ignore', 'pipe', 'pipe'],
51
+ });
52
+
53
+ let buffer = '';
54
+ const counts = { passed: 0, failed: 0, skipped: 0 };
55
+
56
+ child.stdout.on('data', (chunk) => {
57
+ buffer += chunk.toString();
58
+ let nl;
59
+ while ((nl = buffer.indexOf('\n')) >= 0) {
60
+ const line = buffer.slice(0, nl);
61
+ buffer = buffer.slice(nl + 1);
62
+ if (line.startsWith('__EM_TEST__')) {
63
+ renderEvent(JSON.parse(line.slice('__EM_TEST__'.length)), counts);
64
+ } else if (line.trim().length > 0) {
65
+ // Pass-through other electron stdout (logger lines from @omega.js/desktop init, etc.)
66
+ // Indent so they don't disrupt the layout.
67
+ process.stdout.write(chalk.gray(` ${line}\n`));
68
+ }
69
+ }
70
+ });
71
+
72
+ // Always consume stderr (otherwise the pipe fills and the child blocks).
73
+ // Default: silent. Set OMEGA_TEST_DEBUG=1 to see what electron is logging.
74
+ child.stderr.on('data', (chunk) => {
75
+ if (process.env.OMEGA_TEST_DEBUG) {
76
+ const text = chunk.toString();
77
+ process.stderr.write(chalk.gray(`[stderr] ${text}`));
78
+ }
79
+ });
80
+
81
+ child.on('exit', (code, signal) => {
82
+ if (process.env.OMEGA_TEST_DEBUG) {
83
+ console.log(chalk.gray(`[harness exit code=${code} signal=${signal}]`));
84
+ }
85
+ });
86
+
87
+ child.on('error', (err) => reject(err));
88
+ child.on('exit', (_code) => resolve(counts));
89
+ });
90
+ }
91
+
92
+ module.exports = { runElectronTests };
@@ -0,0 +1,46 @@
1
+ // Harness-event rendering: the ONE home of "what a `__EM_TEST__` envelope looks like on
2
+ // screen" and of the counts it folds into.
3
+ //
4
+ // Both runners parse the same JSON-line protocol (runners/electron.js from the spawned
5
+ // harness, runners/boot.js from the booted consumer bundle), and the boot lane now carries
6
+ // the full renderer envelope too (suite-start / skip / suite-stopped), so the rendering
7
+ // lives here instead of once per runner.
8
+
9
+ const chalk = require('chalk').default;
10
+
11
+ /**
12
+ * Render one harness event and fold it into the run's counts.
13
+ * @param {object} evt - A parsed `__EM_TEST__` envelope from a harness.
14
+ * @param {object} counts - `{ passed, failed, skipped }`, mutated in place.
15
+ * @returns {void}
16
+ */
17
+ function renderEvent(evt, counts) {
18
+ if (evt.event === 'suite-start') {
19
+ console.log(chalk.cyan(` ⤷ ${evt.name}`));
20
+ } else if (evt.event === 'result') {
21
+ const indent = evt.suite ? ' ' : ' ';
22
+ if (evt.passed) {
23
+ console.log(chalk.green(`${indent}✓ ${evt.name}`) + chalk.gray(` (${evt.duration}ms)`));
24
+ counts.passed += 1;
25
+ } else {
26
+ console.log(chalk.red(`${indent}✗ ${evt.name}`) + chalk.gray(` (${evt.duration}ms)`));
27
+ if (evt.error) console.log(chalk.red(`${indent} ${evt.error}`));
28
+ counts.failed += 1;
29
+ }
30
+ } else if (evt.event === 'skip') {
31
+ const indent = evt.name && evt.name.includes(' → ') ? ' ' : ' ';
32
+ const count = evt.count || 1;
33
+ console.log(chalk.yellow(`${indent}○ ${evt.name}`) + chalk.gray(` (skipped: ${evt.reason})`));
34
+ counts.skipped += count;
35
+ } else if (evt.event === 'suite-stopped') {
36
+ console.log(chalk.yellow(` Skipping ${evt.remaining} remaining test(s) in suite`));
37
+ } else if (evt.event === 'cleanup-warn') {
38
+ console.log(chalk.yellow(` ⚠ Cleanup warning (${evt.name}): ${evt.message}`));
39
+ } else if (evt.event === 'fatal') {
40
+ console.log(chalk.red(` ✗ Harness fatal: ${evt.message}`));
41
+ if (evt.stack) console.log(chalk.gray(` ${evt.stack.split('\n').slice(0, 3).join('\n ')}`));
42
+ counts.failed += 1;
43
+ }
44
+ }
45
+
46
+ module.exports = { renderEvent };
@@ -0,0 +1,54 @@
1
+ // #110 — the boot-test build must never write the project's real dist/.
2
+ //
3
+ // `npm start`'s watcher owns dist/. When the boot runner built there too, a concurrent dev
4
+ // app and boot-test run interleaved writes and either side could load a half-written
5
+ // bundle — a race that presents as a code bug. The runner now builds into a staged app
6
+ // root (`<project>/.omega/test-app`) and boots THAT.
7
+ //
8
+ // The proof is taken across the real run: the runner fingerprints `<project>/dist` (path +
9
+ // size + mtime per file) before the build and ships it in the boot spec as
10
+ // `distSnapshotBefore`; this test re-fingerprints the same tree from inside the booted app.
11
+ // An untouched tree — including one that never existed — matches exactly.
12
+
13
+ const defineCases = require('../../../vendor/devkit/test/define-cases.js');
14
+
15
+ module.exports = defineCases({
16
+ type: 'group',
17
+ layer: 'boot',
18
+ description: 'boot build isolation — the project dist/ is never written',
19
+ timeout: 15000,
20
+ tests: [
21
+ {
22
+ description: 'the boot build left the project\'s real dist/ byte-for-byte unchanged',
23
+ inspect: async ({ expect, projectRoot, frameworkDistRoot, distSnapshotBefore }) => {
24
+ const path = require('path');
25
+ const distSnapshot = require(path.join(frameworkDistRoot, 'test', 'utils', 'dist-snapshot.js'));
26
+
27
+ const before = distSnapshotBefore.split('\n').filter(Boolean);
28
+ const after = distSnapshot(path.join(projectRoot, 'dist')).split('\n').filter(Boolean);
29
+
30
+ // Compare both directions so a deletion counts as a touch too, and report the
31
+ // file names rather than two multi-megabyte fingerprints.
32
+ const beforeSet = new Set(before);
33
+ const afterSet = new Set(after);
34
+ const touched = [...after.filter((line) => !beforeSet.has(line)), ...before.filter((line) => !afterSet.has(line))]
35
+ .map((line) => line.split('\t')[0]);
36
+
37
+ expect([...new Set(touched)].sort().join(', ')).toBe('');
38
+ },
39
+ },
40
+
41
+ {
42
+ description: 'the app booted from the staged test root, whose dist/ holds the build',
43
+ inspect: async ({ expect, projectRoot, appRoot }) => {
44
+ const fs = require('fs');
45
+ const path = require('path');
46
+ const { app } = require('electron');
47
+
48
+ expect(appRoot).toBe(path.join(projectRoot, '.omega', 'test-app'));
49
+ expect(app.getAppPath()).toBe(appRoot);
50
+ expect(fs.existsSync(path.join(appRoot, 'dist', 'main.bundle.js'))).toBe(true);
51
+ },
52
+ },
53
+ ],
54
+ });