@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,302 @@
1
+ // End-to-end tests for the Windows signer — the REAL signtool, against the REAL
2
+ // EV token, on the box that has them ([#337](https://github.com/Omega-JS-Stack/omega/issues/337)).
3
+ // sign-windows.test.js proves everything around signtool (command lines, retry
4
+ // policy, env keys) anywhere; this file proves the part only the signing box can
5
+ // answer: that a copy of where.exe comes back signed, that verify agrees, that
6
+ // the event log has the trail, and that the `windows-sign` job's own command
7
+ // entry lands a signed file in release/signed.
8
+ //
9
+ // Nothing here is mocked, so nothing here runs off Windows: every case gates on
10
+ // the platform, on signtool being reachable, on a configured token, and on the
11
+ // project signing HERE rather than in the cloud — a Windows dev box missing any
12
+ // of those skips instead of failing. The one case that runs everywhere pins the
13
+ // gate itself.
14
+ //
15
+ // On the box these drive the REAL EV token — a real signature, a real PIN
16
+ // against a lockout counter — so they are an `--extended` lane, asked for
17
+ // deliberately: `npx omega test --extended desktop:build/sign-windows-e2e`.
18
+ // The bare lane skips them wherever it runs, the box included.
19
+
20
+ const fs = require('fs');
21
+ const os = require('os');
22
+ const path = require('path');
23
+ const { spawnSync } = require('child_process');
24
+ const jetpack = require('fs-jetpack');
25
+ const defineCases = require('../../../vendor/devkit/test/define-cases.js');
26
+
27
+ const signerPath = path.join(__dirname, '..', '..', '..', 'commands', 'sign-windows.js');
28
+ const eventsPath = path.join(__dirname, '..', '..', '..', 'lib', 'sign-helpers', 'sign-events.js');
29
+ const signWindows = require(signerPath);
30
+ const Manager = new (require(path.join(__dirname, '..', '..', '..', 'build.js')))();
31
+
32
+ const NOT_WINDOWS = 'Windows-only: signtool + the EV token live on the signing box';
33
+ const NO_SIGNTOOL = 'signtool is not reachable — install the Windows SDK / VS Build Tools, or set SIGNTOOL_PATH';
34
+ const CLOUD = 'strategy=cloud — the windows-sign job runs on hosted windows-latest, not against this box\'s token';
35
+ const NOT_EXTENDED = 'extended tests skipped — pass --extended or set TEST_EXTENDED_MODE=true';
36
+
37
+ // Why this run cannot sign for real, or null when it can. Pure: the platform,
38
+ // the environment, whether signtool was found, and the configured signing
39
+ // strategy all arrive as arguments, so the gate is provable on a Mac even
40
+ // though nothing it guards is.
41
+ function gateReason(platform, env, hasSigntool, strategy) {
42
+ if (platform !== 'win32') return NOT_WINDOWS;
43
+ if (!hasSigntool) return NO_SIGNTOOL;
44
+
45
+ // A cloud-strategy project sends its windows-sign job to a hosted
46
+ // windows-latest that calls a provider's CLI — signtool and the token here
47
+ // are not the path it takes, so these cases have nothing to prove. Decided
48
+ // BEFORE the token: a cloud box is not supposed to have one.
49
+ if (strategy === 'cloud') return CLOUD;
50
+
51
+ try {
52
+ signWindows.resolveSigntoolEnv(env);
53
+ } catch (e) {
54
+ return `no EV token configured on this box: ${e.message}`;
55
+ }
56
+
57
+ return null;
58
+ }
59
+
60
+ // Only ever called on Windows (the platform arm short-circuits first), where an
61
+ // explicit SIGNTOOL_PATH is the binary itself and anything else has to be on PATH.
62
+ function signtoolOnPath(env) {
63
+ env = env || process.env;
64
+ if (env.SIGNTOOL_PATH) return jetpack.exists(env.SIGNTOOL_PATH) === 'file';
65
+ return spawnSync('where', ['signtool'], { encoding: 'utf8' }).status === 0;
66
+ }
67
+
68
+ function currentGate() {
69
+ // Extended mode FIRST: these cases sign for real against the EV token, so the
70
+ // opt-in decides before anything about the box does. Read from the
71
+ // environment at call time, never a module const, so the gate case can take
72
+ // the variable away and prove this arm.
73
+ const extended = process.env.TEST_EXTENDED_MODE === 'true' || process.env.TEST_EXTENDED_MODE === '1';
74
+ if (!extended) return NOT_EXTENDED;
75
+
76
+ // The strategy comes from the project's own config — the same call the signer
77
+ // makes — and is only worth resolving where the rest of the gate has passed.
78
+ if (process.platform !== 'win32') return gateReason(process.platform, process.env, false, null);
79
+ return gateReason(process.platform, process.env, signtoolOnPath(process.env), Manager.getWindowsSignStrategy());
80
+ }
81
+
82
+ // The signer, loaded with its event log pointed inside this suite's scratch
83
+ // tree. sign-events resolves that path ONCE, at require time, so the redirect
84
+ // has to happen before the signer pulls it in — otherwise a test run appends to
85
+ // the box's real signing trail and `runner monitor` shows test events as job
86
+ // history. Suite cleanup restores the process-wide instances.
87
+ function signerFor(ctx) {
88
+ if (ctx.state.signer) return ctx.state.signer;
89
+
90
+ const scratch = fs.mkdtempSync(path.join(os.tmpdir(), 'omega-sign-e2e-'));
91
+ ctx.state.scratch = scratch;
92
+ ctx.state.logPath = path.join(scratch, 'events', 'omega-signing.log');
93
+ ctx.state.origSignLog = process.env.OMEGA_SIGN_LOG;
94
+ process.env.OMEGA_SIGN_LOG = ctx.state.logPath;
95
+
96
+ delete require.cache[require.resolve(eventsPath)];
97
+ delete require.cache[require.resolve(signerPath)];
98
+ ctx.state.signer = require(signerPath);
99
+
100
+ return ctx.state.signer;
101
+ }
102
+
103
+ function readEvents(logPath) {
104
+ if (!jetpack.exists(logPath)) return [];
105
+ return String(jetpack.read(logPath) || '')
106
+ .split('\n')
107
+ .filter(Boolean)
108
+ .map((line) => JSON.parse(line));
109
+ }
110
+
111
+ module.exports = defineCases({
112
+ type: 'suite',
113
+ layer: 'build',
114
+ description: 'sign-windows (e2e) — real signtool against the EV token [Windows only]',
115
+ cleanup: (ctx) => {
116
+ // Nothing was loaded when every case skipped — leave the environment alone.
117
+ if (!ctx.state.scratch) return;
118
+
119
+ if (ctx.state.origSignLog === undefined) delete process.env.OMEGA_SIGN_LOG;
120
+ else process.env.OMEGA_SIGN_LOG = ctx.state.origSignLog;
121
+
122
+ delete require.cache[require.resolve(eventsPath)];
123
+ delete require.cache[require.resolve(signerPath)];
124
+ require(signerPath);
125
+
126
+ jetpack.remove(ctx.state.scratch);
127
+ },
128
+ tests: [
129
+ {
130
+ name: 'the gate names why a run cannot sign — platform, signtool, the strategy, the token',
131
+ run: (ctx) => {
132
+ // The only case that runs everywhere: it asserts the skip reasons the
133
+ // rest of this suite reports, so a Mac run proves the gate rather than
134
+ // proving nothing.
135
+ const token = { WIN_EV_TOKEN_PATH: 'f'.repeat(40) };
136
+
137
+ ctx.expect(gateReason('darwin', token, true, 'self-hosted')).toBe(NOT_WINDOWS);
138
+ ctx.expect(gateReason('linux', token, true, 'self-hosted')).toBe(NOT_WINDOWS);
139
+
140
+ // On Windows the box still has to have the tool and the cert.
141
+ ctx.expect(gateReason('win32', token, false, 'self-hosted')).toBe(NO_SIGNTOOL);
142
+ ctx.expect(gateReason('win32', {}, true, 'self-hosted')).toMatch(/WIN_EV_TOKEN_PATH/);
143
+ ctx.expect(gateReason('win32', { WIN_EV_TOKEN_PATH: 'C:\\certs\\ev.pfx' }, true, 'self-hosted')).toMatch(/WIN_CSC_KEY_PASSWORD/);
144
+
145
+ // A cloud project signs on hosted windows-latest, so even a fully
146
+ // equipped box skips rather than proving a path CI never takes here —
147
+ // and a cloud box with no token at all says the same thing, since the
148
+ // strategy is decided before the token it was never meant to hold.
149
+ ctx.expect(gateReason('win32', token, true, 'cloud')).toBe(CLOUD);
150
+ ctx.expect(gateReason('win32', token, true, 'cloud')).toMatch(/cloud/);
151
+ ctx.expect(gateReason('win32', {}, true, 'cloud')).toBe(CLOUD);
152
+
153
+ // Windows + signtool + a configured token, signing on this box, is the
154
+ // one combination that runs — self-hosted and local both sign here.
155
+ ctx.expect(gateReason('win32', token, true, 'self-hosted')).toBeNull();
156
+ ctx.expect(gateReason('win32', token, true, 'local')).toBeNull();
157
+
158
+ // And before any of that: these five drive the REAL token, so the bare
159
+ // lane never reaches them. currentGate reads the opt-in at call time,
160
+ // which is what lets this case take it away and see the reason change.
161
+ const origExtended = process.env.TEST_EXTENDED_MODE;
162
+ try {
163
+ delete process.env.TEST_EXTENDED_MODE;
164
+ ctx.expect(currentGate()).toBe(NOT_EXTENDED);
165
+ } finally {
166
+ if (origExtended === undefined) delete process.env.TEST_EXTENDED_MODE;
167
+ else process.env.TEST_EXTENDED_MODE = origExtended;
168
+ }
169
+
170
+ // And every OTHER case in this file asks the gate before it does
171
+ // anything: on the box these drive the real token, so an ungated one
172
+ // would sign (or fail a PIN) whenever the lane runs.
173
+ const source = require('fs').readFileSync(__filename, 'utf8');
174
+ // Needles assembled so this case's own text is not one of their hits.
175
+ const cases = source.split(`\n ${'name'}: `).slice(1);
176
+ ctx.expect(cases.length).toBe(6);
177
+ for (const body of cases.slice(1)) {
178
+ if (!body.includes(`if (reason) ctx.${'skip'}(reason)`)) {
179
+ throw new Error(`an e2e case does not gate before it signs: ${body.slice(0, 120)}`);
180
+ }
181
+ }
182
+ },
183
+ },
184
+ {
185
+ name: 'signs an unsigned exe through the real signtool path',
186
+ timeout: 120000,
187
+ run: async (ctx) => {
188
+ const reason = currentGate();
189
+ if (reason) ctx.skip(reason);
190
+
191
+ const signer = signerFor(ctx);
192
+ const inDir = path.join(ctx.state.scratch, 'in');
193
+ const outDir = path.join(ctx.state.scratch, 'out');
194
+ jetpack.dir(inDir);
195
+
196
+ // The same sample binary `--smoke` signs, from the signer's own helper.
197
+ const target = signer.copySampleExe(path.join(inDir, 'omega-sign-e2e.exe'));
198
+ const before = fs.readFileSync(target);
199
+
200
+ await signer.signWithSigntool([target], inDir, outDir);
201
+
202
+ const signedPath = path.join(outDir, 'omega-sign-e2e.exe');
203
+ ctx.expect(fs.existsSync(signedPath)).toBe(true);
204
+
205
+ // A signature is appended to the PE, so the output is bigger than the
206
+ // input and never byte-identical to it — the input is left untouched.
207
+ const after = fs.readFileSync(signedPath);
208
+ ctx.expect(after.length).toBeGreaterThan(before.length);
209
+ ctx.expect(after.equals(before)).toBe(false);
210
+ ctx.expect(fs.readFileSync(target).equals(before)).toBe(true);
211
+
212
+ ctx.state.unsignedPath = target;
213
+ ctx.state.signedPath = signedPath;
214
+ },
215
+ },
216
+ {
217
+ name: 'signtool verify reports the signed copy as signed',
218
+ timeout: 60000,
219
+ run: async (ctx) => {
220
+ const reason = currentGate();
221
+ if (reason) ctx.skip(reason);
222
+
223
+ const result = await ctx.state.signer.verifyOnly([ctx.state.signedPath]);
224
+
225
+ ctx.expect(result.signed).toBe(1);
226
+ ctx.expect(result.unsigned).toBe(0);
227
+ ctx.expect(result.total).toBe(1);
228
+ },
229
+ },
230
+ {
231
+ name: 'signtool verify rejects the unsigned original',
232
+ timeout: 60000,
233
+ run: async (ctx) => {
234
+ const reason = currentGate();
235
+ if (reason) ctx.skip(reason);
236
+
237
+ // The other half of the proof: verify has to say no to the copy that was
238
+ // never signed, or a green verify means nothing.
239
+ const result = await ctx.state.signer.verifyOnly([ctx.state.unsignedPath]);
240
+
241
+ ctx.expect(result.signed).toBe(0);
242
+ ctx.expect(result.unsigned).toBe(1);
243
+ },
244
+ },
245
+ {
246
+ name: 'the sign-events log carries the attempt trail for that file',
247
+ run: (ctx) => {
248
+ const reason = currentGate();
249
+ if (reason) ctx.skip(reason);
250
+
251
+ const events = readEvents(ctx.state.logPath).filter((e) => e.file === 'omega-sign-e2e.exe');
252
+ const names = events.map((e) => e.event);
253
+
254
+ ctx.expect(names).toContain('sign-start');
255
+ ctx.expect(names).toContain('sign-attempt');
256
+ ctx.expect(names).toContain('sign-done');
257
+ ctx.expect(names).not.toContain('sign-fail');
258
+
259
+ const attempts = events.filter((e) => e.event === 'sign-attempt');
260
+ ctx.expect(attempts[0].attempt).toBe(1);
261
+ ctx.expect(attempts[0].of).toBe(signWindows.SIGN_ATTEMPTS);
262
+
263
+ const start = events.find((e) => e.event === 'sign-start');
264
+ ctx.expect(start.mode).toBe(signWindows.resolveSigntoolEnv().useThumbprint ? 'thumbprint' : 'pfx');
265
+ ctx.expect(typeof start.ts).toBe('string');
266
+ },
267
+ },
268
+ {
269
+ name: 'one windows-sign job end to end: --in release --out release/signed',
270
+ timeout: 180000,
271
+ run: async (ctx) => {
272
+ const reason = currentGate();
273
+ if (reason) ctx.skip(reason);
274
+
275
+ // What the CI job runs is `npx omega sign-windows --in release --out
276
+ // release/signed` (src/defaults/.github/workflows/build.yml). The runner
277
+ // itself only hosts the job — there is no runner-side entry to call — so
278
+ // this drives the command module the CLI dispatches to, with the flags
279
+ // parsed the way the router hands them over.
280
+ const signer = signerFor(ctx);
281
+ const releaseDir = path.join(ctx.state.scratch, 'job', 'release');
282
+ const signedDir = path.join(releaseDir, 'signed');
283
+ jetpack.dir(releaseDir);
284
+ signer.copySampleExe(path.join(releaseDir, 'omega-runner-job.exe'));
285
+
286
+ await signer({ _: ['sign-windows'], in: releaseDir, out: signedDir });
287
+
288
+ const signedPath = path.join(signedDir, 'omega-runner-job.exe');
289
+ ctx.expect(fs.existsSync(signedPath)).toBe(true);
290
+
291
+ const result = await signer.verifyOnly([signedPath]);
292
+ ctx.expect(result.signed).toBe(1);
293
+
294
+ // The job's own bookends, which is what `runner monitor` renders per job.
295
+ const events = readEvents(ctx.state.logPath);
296
+ const jobEvents = events.filter((e) => e.event === 'job-end');
297
+ ctx.expect(events.map((e) => e.event)).toContain('job-end');
298
+ ctx.expect(jobEvents[jobEvents.length - 1].ok).toBe(true);
299
+ },
300
+ },
301
+ ],
302
+ });
@@ -0,0 +1,313 @@
1
+ // Build-layer tests for the Windows signer. signtool only exists on Windows, so
2
+ // what we prove here is everything AROUND it: the exact command line each cert
3
+ // mode produces, which env keys are read, and the retry policy on the sign call.
4
+
5
+ const path = require('path');
6
+ const fs = require('fs');
7
+ const defineCases = require('../../../vendor/devkit/test/define-cases.js');
8
+
9
+ const signWindows = require(path.join(__dirname, '..', '..', '..', 'commands', 'sign-windows.js'));
10
+
11
+ module.exports = defineCases({
12
+ type: 'group',
13
+ layer: 'build',
14
+ description: 'sign-windows — signtool command construction + retry policy',
15
+ tests: [
16
+ {
17
+ name: 'this suite can never sign for real: every signWithRetry call injects its exec',
18
+ run: (ctx) => {
19
+ // The box runs this lane too. `signWithRetry` shells out to signtool by
20
+ // DEFAULT, so a case that forgets `exec:` would drive the real EV token
21
+ // (and its PIN retries) on the signing box — the deliberate signing
22
+ // lives in sign-windows-e2e.test.js, gated. This pins the invariant.
23
+ const fs = require('fs');
24
+ const source = fs.readFileSync(__filename, 'utf8');
25
+ // The needle is assembled so this case's own text is not one of its hits.
26
+ const calls = source.split(`signWithRetry${'('}`).slice(1);
27
+ ctx.expect(calls.length).toBeGreaterThan(0);
28
+ for (const call of calls) {
29
+ const body = call.slice(0, call.indexOf('});'));
30
+ if (!body.includes('exec:')) {
31
+ throw new Error(`a signWithRetry call in this suite does not inject exec — it would run the real signtool:\n${body.slice(0, 200)}`);
32
+ }
33
+ }
34
+ },
35
+ },
36
+ {
37
+ name: 'the box log is never written from a test run unless its home is a scratch',
38
+ run: async (ctx) => {
39
+ // `sign-windows` tees to `<runner home>/logs/runner.log`. On the box that
40
+ // IS the file to write; from a test process pointed at a real home it is
41
+ // the box's own record, and a test may not touch it — so the tee target
42
+ // resolves to null and nothing attaches.
43
+ const os = require('os');
44
+ const jetpack = require('fs-jetpack');
45
+ const signer = require(path.join(__dirname, '..', '..', '..', 'commands', 'sign-windows.js'));
46
+
47
+ const scratch = fs.mkdtempSync(path.join(os.tmpdir(), 'omega-sign-home-'));
48
+ const realish = path.join(os.homedir(), `omega-runner-fake-${process.pid}`);
49
+ const origHome = process.env.OMEGA_RUNNER_HOME;
50
+ const origMarker = process.env.OMEGA_TEST_RUNNER;
51
+ try {
52
+ // Pure half: the decision, with the home coming from the passed env and
53
+ // the "is this a test" answer coming from process.env, always.
54
+ process.env.OMEGA_TEST_RUNNER = '1';
55
+ ctx.expect(signer.boxLogTarget({ OMEGA_RUNNER_HOME: scratch }, 'darwin')).toBe(path.join(scratch, 'logs', 'runner.log'));
56
+ ctx.expect(signer.boxLogTarget({ OMEGA_RUNNER_HOME: realish }, 'darwin')).toBeNull();
57
+ ctx.expect(signer.boxLogTarget({}, 'darwin')).toBeNull(); // no box home off Windows
58
+ delete process.env.OMEGA_TEST_RUNNER;
59
+ ctx.expect(signer.boxLogTarget({ OMEGA_RUNNER_HOME: realish }, 'darwin')).toBe(path.join(realish, 'logs', 'runner.log'));
60
+ process.env.OMEGA_TEST_MODE = 'true'; // the devkit/boot marker counts too
61
+ ctx.expect(signer.boxLogTarget({ OMEGA_RUNNER_HOME: realish }, 'darwin')).toBeNull();
62
+ delete process.env.OMEGA_TEST_MODE;
63
+
64
+ // And the command itself: pointed at a real home from a test run, it
65
+ // leaves no runner.log behind (it refuses --smoke off Windows).
66
+ process.env.OMEGA_TEST_RUNNER = '1';
67
+ process.env.OMEGA_RUNNER_HOME = realish;
68
+ let threw;
69
+ try {
70
+ await signer({ smoke: true });
71
+ } catch (e) { threw = e; }
72
+ ctx.expect(threw).toBeDefined();
73
+ ctx.expect(jetpack.exists(path.join(realish, 'logs', 'runner.log'))).toBe(false);
74
+ } finally {
75
+ if (origHome === undefined) delete process.env.OMEGA_RUNNER_HOME; else process.env.OMEGA_RUNNER_HOME = origHome;
76
+ if (origMarker === undefined) delete process.env.OMEGA_TEST_RUNNER; else process.env.OMEGA_TEST_RUNNER = origMarker;
77
+ jetpack.remove(scratch);
78
+ jetpack.remove(realish);
79
+ }
80
+ },
81
+ },
82
+ {
83
+ name: 'a 40-hex value is a thumbprint, a path is not',
84
+ run: (ctx) => {
85
+ ctx.expect(signWindows.isThumbprint('a'.repeat(40))).toBe(true);
86
+ ctx.expect(signWindows.isThumbprint(`AB CD ${'e'.repeat(36)}`)).toBe(true); // signtool copy/paste spacing
87
+ ctx.expect(signWindows.isThumbprint('C:\\certs\\ev.pfx')).toBe(false);
88
+ ctx.expect(signWindows.isThumbprint('')).toBe(false);
89
+ ctx.expect(signWindows.isThumbprint(undefined)).toBe(false);
90
+ },
91
+ },
92
+ {
93
+ name: 'thumbprint mode signs with /sha1 and never puts the PIN on the command line',
94
+ run: (ctx) => {
95
+ const cmd = signWindows.buildSignCommand({
96
+ signtool: 'C:\\sdk\\signtool.exe',
97
+ tokenRef: `AA BB ${'c'.repeat(36)}`,
98
+ password: 'hunter2',
99
+ timestampUrl: 'http://timestamp.sectigo.com',
100
+ outPath: 'C:\\out\\App Setup.exe',
101
+ });
102
+
103
+ ctx.expect(cmd).toBe(`"C:\\sdk\\signtool.exe" sign /sha1 AABB${'c'.repeat(36)}`
104
+ + ' /tr "http://timestamp.sectigo.com" /td sha256 /fd sha256 "C:\\out\\App Setup.exe" 2>&1');
105
+ // SafeNet holds the PIN in thumbprint mode — it must never reach argv.
106
+ ctx.expect(cmd).not.toContain('hunter2');
107
+ },
108
+ },
109
+ {
110
+ name: 'pfx mode signs with /f + /p',
111
+ run: (ctx) => {
112
+ const cmd = signWindows.buildSignCommand({
113
+ signtool: 'signtool',
114
+ tokenRef: 'C:\\certs\\ev.pfx',
115
+ password: 'hunter2',
116
+ timestampUrl: 'http://timestamp.digicert.com',
117
+ outPath: 'C:\\out\\App.exe',
118
+ });
119
+
120
+ ctx.expect(cmd).toBe('"signtool" sign /f "C:\\certs\\ev.pfx" /p "hunter2"'
121
+ + ' /tr "http://timestamp.digicert.com" /td sha256 /fd sha256 "C:\\out\\App.exe" 2>&1');
122
+ },
123
+ },
124
+ {
125
+ name: 'the sign command redirects stderr into stdout so the classifier sees signtool text',
126
+ run: (ctx) => {
127
+ // signtool writes its diagnosis to stderr; execute() surfaces whichever
128
+ // stream it captured. Without 2>&1 a wrong PIN can arrive as a bare exit
129
+ // code, which the classifier reads as transient and retries.
130
+ const cmd = signWindows.buildSignCommand({
131
+ signtool: 'signtool', tokenRef: 'f'.repeat(40), timestampUrl: 'http://ts', outPath: 'C:\\out\\App.exe',
132
+ });
133
+ ctx.expect(cmd.endsWith(' 2>&1')).toBe(true);
134
+ // verify parses its own output and stays untouched.
135
+ ctx.expect(signWindows.buildVerifyCommand({ signtool: 'signtool', outPath: 'C:\\out\\App.exe' }))
136
+ .not.toContain('2>&1');
137
+ },
138
+ },
139
+ {
140
+ name: 'verify is one shape, /pa, single-shot',
141
+ run: (ctx) => {
142
+ ctx.expect(signWindows.buildVerifyCommand({ signtool: 'signtool', outPath: 'C:\\out\\App.exe' }))
143
+ .toBe('"signtool" verify /pa "C:\\out\\App.exe"');
144
+ },
145
+ },
146
+ {
147
+ name: 'WIN_EV_TOKEN_PATH is the ONE cert-reference key — WIN_CSC_LINK is not read',
148
+ run: (ctx) => {
149
+ let threw;
150
+ try {
151
+ signWindows.resolveSigntoolEnv({ WIN_CSC_LINK: 'C:\\certs\\ev.pfx', WIN_CSC_KEY_PASSWORD: 'hunter2' });
152
+ } catch (e) { threw = e; }
153
+
154
+ ctx.expect(threw).toBeDefined();
155
+ ctx.expect(threw.message).toMatch(/WIN_EV_TOKEN_PATH/);
156
+ ctx.expect(threw.message).not.toMatch(/WIN_CSC_LINK/);
157
+ },
158
+ },
159
+ {
160
+ name: 'signtool path + timestamp url come from env with documented defaults',
161
+ run: (ctx) => {
162
+ const bare = signWindows.resolveSigntoolEnv({ WIN_EV_TOKEN_PATH: 'f'.repeat(40) });
163
+ ctx.expect(bare.signtool).toBe('signtool');
164
+ ctx.expect(bare.timestampUrl).toBe('http://timestamp.sectigo.com');
165
+ ctx.expect(bare.useThumbprint).toBe(true);
166
+
167
+ const set = signWindows.resolveSigntoolEnv({
168
+ WIN_EV_TOKEN_PATH: 'f'.repeat(40),
169
+ SIGNTOOL_PATH: 'C:\\sdk\\signtool.exe',
170
+ WIN_TIMESTAMP_URL: 'http://timestamp.digicert.com',
171
+ });
172
+ ctx.expect(set.signtool).toBe('C:\\sdk\\signtool.exe');
173
+ ctx.expect(set.timestampUrl).toBe('http://timestamp.digicert.com');
174
+ },
175
+ },
176
+ {
177
+ name: 'a .pfx without WIN_CSC_KEY_PASSWORD refuses; a thumbprint without one is fine',
178
+ run: (ctx) => {
179
+ let threw;
180
+ try {
181
+ signWindows.resolveSigntoolEnv({ WIN_EV_TOKEN_PATH: 'C:\\certs\\ev.pfx' });
182
+ } catch (e) { threw = e; }
183
+ ctx.expect(threw).toBeDefined();
184
+ ctx.expect(threw.message).toMatch(/WIN_CSC_KEY_PASSWORD/);
185
+
186
+ // Thumbprint mode: SafeNet owns the PIN, so no password is required here.
187
+ ctx.expect(signWindows.resolveSigntoolEnv({ WIN_EV_TOKEN_PATH: 'f'.repeat(40) }).password).toBe(undefined);
188
+ },
189
+ },
190
+ {
191
+ name: 'a timestamp-server failure is retried three times, then throws',
192
+ run: async (ctx) => {
193
+ const events = [];
194
+ const slept = [];
195
+ let calls = 0;
196
+
197
+ let threw;
198
+ try {
199
+ await signWindows.signWithRetry('signtool sign ...', {
200
+ file: 'App.exe',
201
+ exec: () => { calls += 1; throw new Error('SignTool Error: The timestamp signature could not be verified'); },
202
+ sleep: (ms) => { slept.push(ms); return Promise.resolve(); },
203
+ emit: (event, data) => events.push({ event, ...data }),
204
+ });
205
+ } catch (e) { threw = e; }
206
+
207
+ ctx.expect(calls).toBe(3);
208
+ ctx.expect(threw.message).toMatch(/timestamp signature/);
209
+ // Two backoffs between three attempts, and every attempt on the event log.
210
+ ctx.expect(slept.length).toBe(2);
211
+ ctx.expect(slept.every((ms) => ms > 0)).toBe(true);
212
+ ctx.expect(events.filter((e) => e.event === 'sign-attempt').map((e) => e.attempt)).toEqual([1, 2, 3]);
213
+ ctx.expect(events.filter((e) => e.event === 'sign-retry').length).toBe(2);
214
+ },
215
+ },
216
+ {
217
+ name: 'the first attempt succeeding is the only attempt',
218
+ run: async (ctx) => {
219
+ const events = [];
220
+ let calls = 0;
221
+
222
+ await signWindows.signWithRetry('signtool sign ...', {
223
+ file: 'App.exe',
224
+ exec: () => { calls += 1; return Promise.resolve('Successfully signed'); },
225
+ sleep: () => { throw new Error('should not back off on success'); },
226
+ emit: (event, data) => events.push({ event, ...data }),
227
+ });
228
+
229
+ ctx.expect(calls).toBe(1);
230
+ ctx.expect(events.map((e) => e.event)).toEqual(['sign-attempt']);
231
+ },
232
+ },
233
+ {
234
+ name: 'a wrong PIN or a missing cert stops after ONE attempt (never walk the token to a lockout)',
235
+ run: async (ctx) => {
236
+ for (const message of [
237
+ 'SignTool Error: The specified network password is not correct.',
238
+ 'SignTool Error: No certificates were found that met all the given criteria.',
239
+ ]) {
240
+ const events = [];
241
+ let calls = 0;
242
+ let threw;
243
+ try {
244
+ await signWindows.signWithRetry('signtool sign ...', {
245
+ file: 'App.exe',
246
+ exec: () => { calls += 1; throw new Error(message); },
247
+ sleep: () => { throw new Error('should not back off on a non-transient failure'); },
248
+ emit: (event, data) => events.push({ event, ...data }),
249
+ });
250
+ } catch (e) { threw = e; }
251
+
252
+ ctx.expect(calls).toBe(1);
253
+ ctx.expect(threw.message).toBe(message);
254
+ ctx.expect(events.filter((e) => e.event === 'sign-retry').length).toBe(0);
255
+ }
256
+ },
257
+ },
258
+ {
259
+ name: 'every signtool attempt gets its OWN SafeNet PIN watcher, stopped after it',
260
+ run: async (ctx) => {
261
+ // The SafeNet Token Logon dialog reappears on EVERY signtool call, and
262
+ // the watcher returns once it has typed. One watcher around the whole
263
+ // retry loop leaves attempts 2 and 3 facing the dialog unattended.
264
+ const watchers = [];
265
+
266
+ let threw;
267
+ try {
268
+ await signWindows.signWithRetry('signtool sign ...', {
269
+ file: 'App.exe',
270
+ exec: () => { throw new Error('SignTool Error: The timestamp signature could not be verified'); },
271
+ sleep: () => Promise.resolve(),
272
+ emit: () => {},
273
+ startUnlock: () => {
274
+ const watcher = { stopped: false };
275
+ watchers.push(watcher);
276
+ return { stop: () => { watcher.stopped = true; } };
277
+ },
278
+ });
279
+ } catch (e) { threw = e; }
280
+
281
+ ctx.expect(threw).toBeDefined();
282
+ ctx.expect(watchers.length).toBe(3);
283
+ ctx.expect(watchers.every((w) => w.stopped)).toBe(true);
284
+ },
285
+ },
286
+ {
287
+ name: 'the PIN watcher is stopped before the backoff, not held across it',
288
+ run: async (ctx) => {
289
+ const events = [];
290
+ let live = 0;
291
+
292
+ await signWindows.signWithRetry('signtool sign ...', {
293
+ file: 'App.exe',
294
+ exec: () => { events.push(`exec(live=${live})`); return Promise.resolve('ok'); },
295
+ sleep: () => Promise.resolve(),
296
+ emit: () => {},
297
+ startUnlock: () => { live += 1; return { stop: () => { live -= 1; } }; },
298
+ });
299
+
300
+ ctx.expect(events).toEqual(['exec(live=1)']);
301
+ ctx.expect(live).toBe(0);
302
+ },
303
+ },
304
+ {
305
+ name: 'a failure signtool does not name is treated as transient',
306
+ run: (ctx) => {
307
+ ctx.expect(signWindows.isTransientSignFailure(new Error('exit status 1'))).toBe(true);
308
+ ctx.expect(signWindows.isTransientSignFailure(new Error('SignTool Error: No certificates were found'))).toBe(false);
309
+ ctx.expect(signWindows.isTransientSignFailure(new Error('The specified network password is not correct'))).toBe(false);
310
+ },
311
+ },
312
+ ],
313
+ });