@omega.js/extension 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 (684) hide show
  1. package/LICENSE +98 -0
  2. package/README.md +194 -0
  3. package/bin/omega +2 -0
  4. package/bin/omega-extension +2 -0
  5. package/bin/omg +2 -0
  6. package/dist/assets/css/bundles/.gitkeep +0 -0
  7. package/dist/assets/css/components/content/index.scss +5 -0
  8. package/dist/assets/css/components/options/index.scss +9 -0
  9. package/dist/assets/css/components/pages/index.scss +5 -0
  10. package/dist/assets/css/components/popup/index.scss +9 -0
  11. package/dist/assets/css/core/_animations.scss +64 -0
  12. package/dist/assets/css/core/_fontawesome.scss +146 -0
  13. package/dist/assets/css/core/_initialize.scss +23 -0
  14. package/dist/assets/css/core/_utilities.scss +80 -0
  15. package/dist/assets/css/omega-extension.scss +43 -0
  16. package/dist/assets/css/shell/_index.scss +207 -0
  17. package/dist/assets/css/tokens/_index.scss +166 -0
  18. package/dist/assets/js/core/app-shell.js +136 -0
  19. package/dist/assets/js/libs/initialize-tooltips.js +31 -0
  20. package/dist/assets/js/libs/recaptcha.js +94 -0
  21. package/dist/assets/js/main.js +4 -0
  22. package/dist/assets/themes/_template/README.md +115 -0
  23. package/dist/assets/themes/_template/_config.scss +60 -0
  24. package/dist/assets/themes/_template/_theme.js +14 -0
  25. package/dist/assets/themes/_template/_theme.scss +28 -0
  26. package/dist/assets/themes/_template/css/base/_root.scss +19 -0
  27. package/dist/assets/themes/_template/css/components/_components.scss +23 -0
  28. package/dist/assets/themes/base/README.md +5 -0
  29. package/dist/assets/themes/base/_components/data/org-chart/component.html +33 -0
  30. package/dist/assets/themes/base/_components/data/org-chart/component.json5 +33 -0
  31. package/dist/assets/themes/base/_components/data/org-chart/component.scss +183 -0
  32. package/dist/assets/themes/base/_components/heading/masthead/component.html +22 -0
  33. package/dist/assets/themes/base/_components/heading/masthead/component.json5 +30 -0
  34. package/dist/assets/themes/base/_components/heading/section-head/component.html +18 -0
  35. package/dist/assets/themes/base/_components/heading/section-head/component.json5 +27 -0
  36. package/dist/assets/themes/base/_components/pricing/features/component.html +29 -0
  37. package/dist/assets/themes/base/_components/pricing/features/component.json5 +30 -0
  38. package/dist/assets/themes/base/_hero/orbit/index.html +30 -0
  39. package/dist/assets/themes/base/_hero/orbit/script.js +33 -0
  40. package/dist/assets/themes/base/_hero/orbit/style.scss +133 -0
  41. package/dist/assets/themes/base/_includes/admin/sections/sidebar.html +3 -0
  42. package/dist/assets/themes/base/_includes/admin/sections/topbar.html +3 -0
  43. package/dist/assets/themes/base/_includes/backend/sections/sidebar.html +3 -0
  44. package/dist/assets/themes/base/_includes/backend/sections/topbar.html +3 -0
  45. package/dist/assets/themes/base/_includes/frontend/components/connection-card.html +49 -0
  46. package/dist/assets/themes/base/_includes/frontend/components/post-card.html +54 -0
  47. package/dist/assets/themes/base/_includes/frontend/sections/account-connections.html +42 -0
  48. package/dist/assets/themes/base/_includes/frontend/sections/account-section-header.html +11 -0
  49. package/dist/assets/themes/base/_includes/frontend/sections/footer.html +154 -0
  50. package/dist/assets/themes/base/_includes/frontend/sections/nav.html +276 -0
  51. package/dist/assets/themes/base/_includes/global/sections/account.html +72 -0
  52. package/dist/assets/themes/base/_includes/global/sections/app-sidebar.html +248 -0
  53. package/dist/assets/themes/base/_includes/global/sections/app-topbar.html +228 -0
  54. package/dist/assets/themes/base/_includes/global/sections/page-header.html +99 -0
  55. package/dist/assets/themes/base/_layouts/admin/core/minimal-viewport-locked.html +22 -0
  56. package/dist/assets/themes/base/_layouts/admin/core/minimal.html +23 -0
  57. package/dist/assets/themes/base/_layouts/backend/core/base.html +57 -0
  58. package/dist/assets/themes/base/_layouts/backend/core/minimal-viewport-locked.html +32 -0
  59. package/dist/assets/themes/base/_layouts/backend/core/minimal.html +32 -0
  60. package/dist/assets/themes/base/_layouts/backend/pages/dashboard/index.html +230 -0
  61. package/dist/assets/themes/base/_layouts/frontend/core/base.html +31 -0
  62. package/dist/assets/themes/base/_layouts/frontend/core/cover.html +40 -0
  63. package/dist/assets/themes/base/_layouts/frontend/core/minimal.html +47 -0
  64. package/dist/assets/themes/base/_layouts/frontend/pages/404.html +54 -0
  65. package/dist/assets/themes/base/_layouts/frontend/pages/about.html +144 -0
  66. package/dist/assets/themes/base/_layouts/frontend/pages/account/index.html +2104 -0
  67. package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/alternative.html +319 -0
  68. package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/index.html +186 -0
  69. package/dist/assets/themes/base/_layouts/frontend/pages/app.html +142 -0
  70. package/dist/assets/themes/base/_layouts/frontend/pages/auth/reset.html +53 -0
  71. package/dist/assets/themes/base/_layouts/frontend/pages/auth/signin.html +90 -0
  72. package/dist/assets/themes/base/_layouts/frontend/pages/auth/signup.html +141 -0
  73. package/dist/assets/themes/base/_layouts/frontend/pages/auth/token.html +44 -0
  74. package/dist/assets/themes/base/_layouts/frontend/pages/blog/categories/category.html +88 -0
  75. package/dist/assets/themes/base/_layouts/frontend/pages/blog/categories/index.html +88 -0
  76. package/dist/assets/themes/base/_layouts/frontend/pages/blog/index.html +255 -0
  77. package/dist/assets/themes/base/_layouts/frontend/pages/blog/post.html +261 -0
  78. package/dist/assets/themes/base/_layouts/frontend/pages/blog/tags/index.html +84 -0
  79. package/dist/assets/themes/base/_layouts/frontend/pages/blog/tags/tag.html +88 -0
  80. package/dist/assets/themes/base/_layouts/frontend/pages/collection/category.html +72 -0
  81. package/dist/assets/themes/base/_layouts/frontend/pages/collection/document.html +54 -0
  82. package/dist/assets/themes/base/_layouts/frontend/pages/collection/index.html +84 -0
  83. package/dist/assets/themes/base/_layouts/frontend/pages/connections/callback.html +55 -0
  84. package/dist/assets/themes/base/_layouts/frontend/pages/contact.html +214 -0
  85. package/dist/assets/themes/base/_layouts/frontend/pages/download.html +793 -0
  86. package/dist/assets/themes/base/_layouts/frontend/pages/extension/index.html +253 -0
  87. package/dist/assets/themes/base/_layouts/frontend/pages/extension/installed.html +198 -0
  88. package/dist/assets/themes/base/_layouts/frontend/pages/feedback.html +171 -0
  89. package/dist/assets/themes/base/_layouts/frontend/pages/index.html +66 -0
  90. package/dist/assets/themes/base/_layouts/frontend/pages/legal/document.html +78 -0
  91. package/dist/assets/themes/base/_layouts/frontend/pages/payment/checkout.html +459 -0
  92. package/dist/assets/themes/base/_layouts/frontend/pages/payment/confirmation.html +131 -0
  93. package/dist/assets/themes/base/_layouts/frontend/pages/portal/email-preferences.html +104 -0
  94. package/dist/assets/themes/base/_layouts/frontend/pages/pricing.html +596 -0
  95. package/dist/assets/themes/base/_layouts/frontend/pages/status.html +361 -0
  96. package/dist/assets/themes/base/_layouts/frontend/pages/team/index.html +210 -0
  97. package/dist/assets/themes/base/_layouts/frontend/pages/team/member.html +125 -0
  98. package/dist/assets/themes/base/_layouts/frontend/pages/updates/index.html +119 -0
  99. package/dist/assets/themes/base/_layouts/frontend/pages/updates/update.html +118 -0
  100. package/dist/assets/themes/base/_sections/about/hero/section.html +68 -0
  101. package/dist/assets/themes/base/_sections/about/hero/section.json5 +58 -0
  102. package/dist/assets/themes/base/_sections/about/letter/section.html +60 -0
  103. package/dist/assets/themes/base/_sections/about/letter/section.json5 +56 -0
  104. package/dist/assets/themes/base/_sections/about/photo-band/section.html +24 -0
  105. package/dist/assets/themes/base/_sections/about/photo-band/section.json5 +23 -0
  106. package/dist/assets/themes/base/_sections/about/principles/section.html +17 -0
  107. package/dist/assets/themes/base/_sections/about/principles/section.json5 +34 -0
  108. package/dist/assets/themes/base/_sections/about/timeline/section.html +20 -0
  109. package/dist/assets/themes/base/_sections/about/timeline/section.json5 +34 -0
  110. package/dist/assets/themes/base/_sections/marketing/bento/section.html +91 -0
  111. package/dist/assets/themes/base/_sections/marketing/bento/section.json5 +152 -0
  112. package/dist/assets/themes/base/_sections/marketing/cta/section.html +44 -0
  113. package/dist/assets/themes/base/_sections/marketing/cta/section.json5 +47 -0
  114. package/dist/assets/themes/base/_sections/marketing/faq/section.html +52 -0
  115. package/dist/assets/themes/base/_sections/marketing/faq/section.json5 +68 -0
  116. package/dist/assets/themes/base/_sections/marketing/hero/section.html +349 -0
  117. package/dist/assets/themes/base/_sections/marketing/hero/section.json5 +335 -0
  118. package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.html +38 -0
  119. package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.js +86 -0
  120. package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.json5 +29 -0
  121. package/dist/assets/themes/base/_sections/marketing/pricing-cards/section.html +115 -0
  122. package/dist/assets/themes/base/_sections/marketing/pricing-cards/section.json5 +72 -0
  123. package/dist/assets/themes/base/_sections/marketing/product-demo/section.html +62 -0
  124. package/dist/assets/themes/base/_sections/marketing/product-demo/section.js +44 -0
  125. package/dist/assets/themes/base/_sections/marketing/product-demo/section.json5 +52 -0
  126. package/dist/assets/themes/base/_sections/marketing/prose/section.html +22 -0
  127. package/dist/assets/themes/base/_sections/marketing/prose/section.json5 +41 -0
  128. package/dist/assets/themes/base/_sections/marketing/showcase/section.html +35 -0
  129. package/dist/assets/themes/base/_sections/marketing/showcase/section.json5 +52 -0
  130. package/dist/assets/themes/base/_sections/marketing/stats/section.html +32 -0
  131. package/dist/assets/themes/base/_sections/marketing/stats/section.json5 +44 -0
  132. package/dist/assets/themes/base/_sections/marketing/testimonials/section.html +54 -0
  133. package/dist/assets/themes/base/_sections/marketing/testimonials/section.json5 +70 -0
  134. package/dist/assets/themes/base/_sections/marketing/trusted-by/section.html +30 -0
  135. package/dist/assets/themes/base/_sections/marketing/trusted-by/section.json5 +38 -0
  136. package/dist/assets/themes/base/_sections/verts/unit/section.html +7 -0
  137. package/dist/assets/themes/base/_sections/verts/unit/section.js +22 -0
  138. package/dist/assets/themes/base/_sections/verts/unit/section.json5 +24 -0
  139. package/dist/assets/themes/base/_sections/verts/unit/section.scss +24 -0
  140. package/dist/assets/themes/base/_theme.js +13 -0
  141. package/dist/assets/themes/base/_theme.scss +4 -0
  142. package/dist/assets/themes/bootstrap/_theme.js +16 -0
  143. package/dist/assets/themes/bootstrap/_theme.scss +11 -0
  144. package/dist/assets/themes/bootstrap/js/index.esm.js +19 -0
  145. package/dist/assets/themes/bootstrap/js/index.umd.js +34 -0
  146. package/dist/assets/themes/bootstrap/js/src/alert.js +87 -0
  147. package/dist/assets/themes/bootstrap/js/src/base-component.js +86 -0
  148. package/dist/assets/themes/bootstrap/js/src/button.js +72 -0
  149. package/dist/assets/themes/bootstrap/js/src/carousel.js +474 -0
  150. package/dist/assets/themes/bootstrap/js/src/collapse.js +297 -0
  151. package/dist/assets/themes/bootstrap/js/src/dom/data.js +55 -0
  152. package/dist/assets/themes/bootstrap/js/src/dom/event-handler.js +317 -0
  153. package/dist/assets/themes/bootstrap/js/src/dom/manipulator.js +71 -0
  154. package/dist/assets/themes/bootstrap/js/src/dom/selector-engine.js +126 -0
  155. package/dist/assets/themes/bootstrap/js/src/dropdown.js +458 -0
  156. package/dist/assets/themes/bootstrap/js/src/modal.js +378 -0
  157. package/dist/assets/themes/bootstrap/js/src/offcanvas.js +282 -0
  158. package/dist/assets/themes/bootstrap/js/src/popover.js +97 -0
  159. package/dist/assets/themes/bootstrap/js/src/scrollspy.js +296 -0
  160. package/dist/assets/themes/bootstrap/js/src/tab.js +315 -0
  161. package/dist/assets/themes/bootstrap/js/src/toast.js +224 -0
  162. package/dist/assets/themes/bootstrap/js/src/tooltip.js +632 -0
  163. package/dist/assets/themes/bootstrap/js/src/util/backdrop.js +151 -0
  164. package/dist/assets/themes/bootstrap/js/src/util/component-functions.js +35 -0
  165. package/dist/assets/themes/bootstrap/js/src/util/config.js +65 -0
  166. package/dist/assets/themes/bootstrap/js/src/util/focustrap.js +115 -0
  167. package/dist/assets/themes/bootstrap/js/src/util/index.js +306 -0
  168. package/dist/assets/themes/bootstrap/js/src/util/sanitizer.js +117 -0
  169. package/dist/assets/themes/bootstrap/js/src/util/scrollbar.js +114 -0
  170. package/dist/assets/themes/bootstrap/js/src/util/swipe.js +146 -0
  171. package/dist/assets/themes/bootstrap/js/src/util/template-factory.js +160 -0
  172. package/dist/assets/themes/bootstrap/overrides/_accordion.scss +21 -0
  173. package/dist/assets/themes/bootstrap/overrides/_avatars.scss +51 -0
  174. package/dist/assets/themes/bootstrap/overrides/_blog-images.scss +45 -0
  175. package/dist/assets/themes/bootstrap/overrides/_buttons-adaptive.scss +141 -0
  176. package/dist/assets/themes/bootstrap/overrides/_color-shades.scss +25 -0
  177. package/dist/assets/themes/bootstrap/overrides/_cursor-utilities.scss +13 -0
  178. package/dist/assets/themes/bootstrap/overrides/_index.scss +30 -0
  179. package/dist/assets/themes/bootstrap/overrides/_links.scss +26 -0
  180. package/dist/assets/themes/bootstrap/overrides/_soft-colors.scss +99 -0
  181. package/dist/assets/themes/bootstrap/overrides/_spacing-extended.scss +74 -0
  182. package/dist/assets/themes/bootstrap/overrides/_spinners.scss +22 -0
  183. package/dist/assets/themes/bootstrap/overrides/_typography-utilities.scss +40 -0
  184. package/dist/assets/themes/bootstrap/scss/_accordion.scss +153 -0
  185. package/dist/assets/themes/bootstrap/scss/_alert.scss +68 -0
  186. package/dist/assets/themes/bootstrap/scss/_badge.scss +38 -0
  187. package/dist/assets/themes/bootstrap/scss/_breadcrumb.scss +40 -0
  188. package/dist/assets/themes/bootstrap/scss/_button-group.scss +147 -0
  189. package/dist/assets/themes/bootstrap/scss/_buttons.scss +216 -0
  190. package/dist/assets/themes/bootstrap/scss/_card.scss +238 -0
  191. package/dist/assets/themes/bootstrap/scss/_carousel.scss +226 -0
  192. package/dist/assets/themes/bootstrap/scss/_close.scss +66 -0
  193. package/dist/assets/themes/bootstrap/scss/_containers.scss +41 -0
  194. package/dist/assets/themes/bootstrap/scss/_dropdown.scss +250 -0
  195. package/dist/assets/themes/bootstrap/scss/_forms.scss +9 -0
  196. package/dist/assets/themes/bootstrap/scss/_functions.scss +302 -0
  197. package/dist/assets/themes/bootstrap/scss/_grid.scss +39 -0
  198. package/dist/assets/themes/bootstrap/scss/_helpers.scss +12 -0
  199. package/dist/assets/themes/bootstrap/scss/_images.scss +42 -0
  200. package/dist/assets/themes/bootstrap/scss/_list-group.scss +199 -0
  201. package/dist/assets/themes/bootstrap/scss/_maps.scss +174 -0
  202. package/dist/assets/themes/bootstrap/scss/_mixins.scss +42 -0
  203. package/dist/assets/themes/bootstrap/scss/_modal.scss +240 -0
  204. package/dist/assets/themes/bootstrap/scss/_nav.scss +197 -0
  205. package/dist/assets/themes/bootstrap/scss/_navbar.scss +289 -0
  206. package/dist/assets/themes/bootstrap/scss/_offcanvas.scss +147 -0
  207. package/dist/assets/themes/bootstrap/scss/_pagination.scss +109 -0
  208. package/dist/assets/themes/bootstrap/scss/_placeholders.scss +51 -0
  209. package/dist/assets/themes/bootstrap/scss/_popover.scss +196 -0
  210. package/dist/assets/themes/bootstrap/scss/_progress.scss +68 -0
  211. package/dist/assets/themes/bootstrap/scss/_reboot.scss +611 -0
  212. package/dist/assets/themes/bootstrap/scss/_root.scss +187 -0
  213. package/dist/assets/themes/bootstrap/scss/_spinners.scss +85 -0
  214. package/dist/assets/themes/bootstrap/scss/_tables.scss +171 -0
  215. package/dist/assets/themes/bootstrap/scss/_toasts.scss +73 -0
  216. package/dist/assets/themes/bootstrap/scss/_tooltip.scss +119 -0
  217. package/dist/assets/themes/bootstrap/scss/_transitions.scss +27 -0
  218. package/dist/assets/themes/bootstrap/scss/_type.scss +106 -0
  219. package/dist/assets/themes/bootstrap/scss/_utilities.scss +806 -0
  220. package/dist/assets/themes/bootstrap/scss/_variables-dark.scss +102 -0
  221. package/dist/assets/themes/bootstrap/scss/_variables.scss +1753 -0
  222. package/dist/assets/themes/bootstrap/scss/bootstrap-grid.scss +62 -0
  223. package/dist/assets/themes/bootstrap/scss/bootstrap-reboot.scss +10 -0
  224. package/dist/assets/themes/bootstrap/scss/bootstrap-utilities.scss +19 -0
  225. package/dist/assets/themes/bootstrap/scss/bootstrap.scss +52 -0
  226. package/dist/assets/themes/bootstrap/scss/forms/_floating-labels.scss +97 -0
  227. package/dist/assets/themes/bootstrap/scss/forms/_form-check.scss +189 -0
  228. package/dist/assets/themes/bootstrap/scss/forms/_form-control.scss +214 -0
  229. package/dist/assets/themes/bootstrap/scss/forms/_form-range.scss +91 -0
  230. package/dist/assets/themes/bootstrap/scss/forms/_form-select.scss +80 -0
  231. package/dist/assets/themes/bootstrap/scss/forms/_form-text.scss +11 -0
  232. package/dist/assets/themes/bootstrap/scss/forms/_input-group.scss +132 -0
  233. package/dist/assets/themes/bootstrap/scss/forms/_labels.scss +36 -0
  234. package/dist/assets/themes/bootstrap/scss/forms/_validation.scss +12 -0
  235. package/dist/assets/themes/bootstrap/scss/helpers/_clearfix.scss +3 -0
  236. package/dist/assets/themes/bootstrap/scss/helpers/_color-bg.scss +7 -0
  237. package/dist/assets/themes/bootstrap/scss/helpers/_colored-links.scss +30 -0
  238. package/dist/assets/themes/bootstrap/scss/helpers/_focus-ring.scss +5 -0
  239. package/dist/assets/themes/bootstrap/scss/helpers/_icon-link.scss +25 -0
  240. package/dist/assets/themes/bootstrap/scss/helpers/_position.scss +36 -0
  241. package/dist/assets/themes/bootstrap/scss/helpers/_ratio.scss +26 -0
  242. package/dist/assets/themes/bootstrap/scss/helpers/_stacks.scss +15 -0
  243. package/dist/assets/themes/bootstrap/scss/helpers/_stretched-link.scss +15 -0
  244. package/dist/assets/themes/bootstrap/scss/helpers/_text-truncation.scss +7 -0
  245. package/dist/assets/themes/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
  246. package/dist/assets/themes/bootstrap/scss/helpers/_vr.scss +8 -0
  247. package/dist/assets/themes/bootstrap/scss/mixins/_alert.scss +18 -0
  248. package/dist/assets/themes/bootstrap/scss/mixins/_backdrop.scss +14 -0
  249. package/dist/assets/themes/bootstrap/scss/mixins/_banner.scss +7 -0
  250. package/dist/assets/themes/bootstrap/scss/mixins/_border-radius.scss +78 -0
  251. package/dist/assets/themes/bootstrap/scss/mixins/_box-shadow.scss +18 -0
  252. package/dist/assets/themes/bootstrap/scss/mixins/_breakpoints.scss +127 -0
  253. package/dist/assets/themes/bootstrap/scss/mixins/_buttons.scss +70 -0
  254. package/dist/assets/themes/bootstrap/scss/mixins/_caret.scss +69 -0
  255. package/dist/assets/themes/bootstrap/scss/mixins/_clearfix.scss +9 -0
  256. package/dist/assets/themes/bootstrap/scss/mixins/_color-mode.scss +21 -0
  257. package/dist/assets/themes/bootstrap/scss/mixins/_color-scheme.scss +7 -0
  258. package/dist/assets/themes/bootstrap/scss/mixins/_container.scss +11 -0
  259. package/dist/assets/themes/bootstrap/scss/mixins/_deprecate.scss +10 -0
  260. package/dist/assets/themes/bootstrap/scss/mixins/_forms.scss +163 -0
  261. package/dist/assets/themes/bootstrap/scss/mixins/_gradients.scss +47 -0
  262. package/dist/assets/themes/bootstrap/scss/mixins/_grid.scss +151 -0
  263. package/dist/assets/themes/bootstrap/scss/mixins/_image.scss +16 -0
  264. package/dist/assets/themes/bootstrap/scss/mixins/_list-group.scss +26 -0
  265. package/dist/assets/themes/bootstrap/scss/mixins/_lists.scss +7 -0
  266. package/dist/assets/themes/bootstrap/scss/mixins/_pagination.scss +10 -0
  267. package/dist/assets/themes/bootstrap/scss/mixins/_reset-text.scss +17 -0
  268. package/dist/assets/themes/bootstrap/scss/mixins/_resize.scss +6 -0
  269. package/dist/assets/themes/bootstrap/scss/mixins/_table-variants.scss +24 -0
  270. package/dist/assets/themes/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  271. package/dist/assets/themes/bootstrap/scss/mixins/_transition.scss +26 -0
  272. package/dist/assets/themes/bootstrap/scss/mixins/_utilities.scss +97 -0
  273. package/dist/assets/themes/bootstrap/scss/mixins/_visually-hidden.scss +38 -0
  274. package/dist/assets/themes/bootstrap/scss/tests/jasmine.js +16 -0
  275. package/dist/assets/themes/bootstrap/scss/tests/mixins/_auto-import-of-variables-dark.test.scss +7 -0
  276. package/dist/assets/themes/bootstrap/scss/tests/mixins/_color-modes.test.scss +69 -0
  277. package/dist/assets/themes/bootstrap/scss/tests/mixins/_media-query-color-mode-full.test.scss +8 -0
  278. package/dist/assets/themes/bootstrap/scss/tests/mixins/_utilities.test.scss +393 -0
  279. package/dist/assets/themes/bootstrap/scss/tests/sass-true/register.js +14 -0
  280. package/dist/assets/themes/bootstrap/scss/tests/sass-true/runner.js +17 -0
  281. package/dist/assets/themes/bootstrap/scss/tests/utilities/_api.test.scss +75 -0
  282. package/dist/assets/themes/bootstrap/scss/utilities/_api.scss +47 -0
  283. package/dist/assets/themes/bootstrap/scss/vendor/_rfs.scss +348 -0
  284. package/dist/assets/themes/classy/README.md +89 -0
  285. package/dist/assets/themes/classy/_config.scss +245 -0
  286. package/dist/assets/themes/classy/_theme.js +31 -0
  287. package/dist/assets/themes/classy/_theme.scss +57 -0
  288. package/dist/assets/themes/classy/css/app/_panels.scss +183 -0
  289. package/dist/assets/themes/classy/css/base/_fonts.scss +79 -0
  290. package/dist/assets/themes/classy/css/base/_no-raise.scss +49 -0
  291. package/dist/assets/themes/classy/css/base/_root.scss +113 -0
  292. package/dist/assets/themes/classy/css/base/_typography.scss +154 -0
  293. package/dist/assets/themes/classy/css/base/_utilities.scss +284 -0
  294. package/dist/assets/themes/classy/css/components/_alerts.scss +51 -0
  295. package/dist/assets/themes/classy/css/components/_badges.scss +46 -0
  296. package/dist/assets/themes/classy/css/components/_buttons.scss +175 -0
  297. package/dist/assets/themes/classy/css/components/_cards.scss +41 -0
  298. package/dist/assets/themes/classy/css/components/_dropdowns.scss +48 -0
  299. package/dist/assets/themes/classy/css/components/_forms.scss +171 -0
  300. package/dist/assets/themes/classy/css/components/_receipt.scss +45 -0
  301. package/dist/assets/themes/classy/css/layout/_footer.scss +298 -0
  302. package/dist/assets/themes/classy/css/layout/_general.scss +209 -0
  303. package/dist/assets/themes/classy/css/layout/_nav.scss +154 -0
  304. package/dist/assets/themes/classy/css/layout/_shell.scss +458 -0
  305. package/dist/assets/themes/classy/css/marketing/_bento.scss +238 -0
  306. package/dist/assets/themes/classy/css/marketing/_content.scss +1328 -0
  307. package/dist/assets/themes/classy/css/marketing/_downloads.scss +246 -0
  308. package/dist/assets/themes/classy/css/marketing/_hero.scss +311 -0
  309. package/dist/assets/themes/classy/css/marketing/_sections.scss +649 -0
  310. package/dist/assets/themes/classy/css/pages/404/index.scss +67 -0
  311. package/dist/assets/themes/classy/css/pages/_auth.scss +235 -0
  312. package/dist/assets/themes/classy/css/pages/admin/firebase/index.scss +22 -0
  313. package/dist/assets/themes/classy/css/pages/blog/[slug].scss +56 -0
  314. package/dist/assets/themes/classy/css/pages/cookies.scss +2 -0
  315. package/dist/assets/themes/classy/css/pages/dashboard/account/index.scss +31 -0
  316. package/dist/assets/themes/classy/css/pages/feedback/index.scss +39 -0
  317. package/dist/assets/themes/classy/css/pages/legal/_document.scss +192 -0
  318. package/dist/assets/themes/classy/css/pages/payment/checkout/index.scss +585 -0
  319. package/dist/assets/themes/classy/css/pages/payment/confirmation/index.scss +9 -0
  320. package/dist/assets/themes/classy/css/pages/privacy.scss +2 -0
  321. package/dist/assets/themes/classy/css/pages/status/index.scss +164 -0
  322. package/dist/assets/themes/classy/css/pages/terms.scss +2 -0
  323. package/dist/assets/themes/classy/css/pages/updates/index.scss +128 -0
  324. package/dist/assets/themes/classy/fonts/inter-italic-latin-ext.woff2 +0 -0
  325. package/dist/assets/themes/classy/fonts/inter-italic-latin.woff2 +0 -0
  326. package/dist/assets/themes/classy/fonts/inter-normal-latin-ext.woff2 +0 -0
  327. package/dist/assets/themes/classy/fonts/inter-normal-latin.woff2 +0 -0
  328. package/dist/assets/themes/classy/fonts/newsreader-italic-latin-ext.woff2 +0 -0
  329. package/dist/assets/themes/classy/fonts/newsreader-italic-latin.woff2 +0 -0
  330. package/dist/assets/themes/classy/fonts/newsreader-normal-latin-ext.woff2 +0 -0
  331. package/dist/assets/themes/classy/fonts/newsreader-normal-latin.woff2 +0 -0
  332. package/dist/assets/themes/classy/js/hero-demo-form.js +56 -0
  333. package/dist/assets/themes/neobrutalism/README.md +118 -0
  334. package/dist/assets/themes/neobrutalism/_config.scss +139 -0
  335. package/dist/assets/themes/neobrutalism/_layouts/frontend/core/base.html +30 -0
  336. package/dist/assets/themes/neobrutalism/_layouts/frontend/pages/index.html +275 -0
  337. package/dist/assets/themes/neobrutalism/_theme.js +24 -0
  338. package/dist/assets/themes/neobrutalism/_theme.scss +61 -0
  339. package/dist/assets/themes/neobrutalism/css/base/_mixins.scss +46 -0
  340. package/dist/assets/themes/neobrutalism/css/base/_root.scss +169 -0
  341. package/dist/assets/themes/neobrutalism/css/base/_typography.scss +61 -0
  342. package/dist/assets/themes/neobrutalism/css/base/_utilities.scss +89 -0
  343. package/dist/assets/themes/neobrutalism/css/components/_billing-toggle.scss +74 -0
  344. package/dist/assets/themes/neobrutalism/css/components/_buttons.scss +148 -0
  345. package/dist/assets/themes/neobrutalism/css/components/_cards.scss +47 -0
  346. package/dist/assets/themes/neobrutalism/css/components/_forms.scss +88 -0
  347. package/dist/assets/themes/neobrutalism/css/components/_marketing.scss +244 -0
  348. package/dist/assets/themes/neobrutalism/css/layout/_general.scss +213 -0
  349. package/dist/assets/themes/neobrutalism/css/layout/_navigation.scss +171 -0
  350. package/dist/assets/themes/neobrutalism/css/pages/index.scss +203 -0
  351. package/dist/assets/themes/neobrutalism/css/pages/pricing/index.scss +58 -0
  352. package/dist/assets/themes/neobrutalism/css/pages/test/libraries/layers/index.scss +7 -0
  353. package/dist/assets/themes/neobrutalism/js/pages/test/libraries/layers/index.js +9 -0
  354. package/dist/assets/themes/newsflash/README.md +117 -0
  355. package/dist/assets/themes/newsflash/_components/heading/lede/component.html +14 -0
  356. package/dist/assets/themes/newsflash/_components/heading/lede/component.json5 +23 -0
  357. package/dist/assets/themes/newsflash/_components/heading/rule-head/component.html +17 -0
  358. package/dist/assets/themes/newsflash/_components/heading/rule-head/component.json5 +23 -0
  359. package/dist/assets/themes/newsflash/_components/news/byline/component.html +12 -0
  360. package/dist/assets/themes/newsflash/_components/news/byline/component.json5 +18 -0
  361. package/dist/assets/themes/newsflash/_components/news/story-card/component.html +25 -0
  362. package/dist/assets/themes/newsflash/_components/news/story-card/component.json5 +21 -0
  363. package/dist/assets/themes/newsflash/_config.scss +147 -0
  364. package/dist/assets/themes/newsflash/_layouts/frontend/core/base.html +51 -0
  365. package/dist/assets/themes/newsflash/_layouts/frontend/pages/blog/index.html +299 -0
  366. package/dist/assets/themes/newsflash/_layouts/frontend/pages/blog/post.html +235 -0
  367. package/dist/assets/themes/newsflash/_layouts/frontend/pages/index.html +328 -0
  368. package/dist/assets/themes/newsflash/_sections/marketing/desks/section.html +39 -0
  369. package/dist/assets/themes/newsflash/_sections/marketing/desks/section.json5 +49 -0
  370. package/dist/assets/themes/newsflash/_sections/marketing/newsletter-cta/section.html +103 -0
  371. package/dist/assets/themes/newsflash/_sections/marketing/newsletter-cta/section.json5 +50 -0
  372. package/dist/assets/themes/newsflash/_sections/marketing/rundown/section.html +28 -0
  373. package/dist/assets/themes/newsflash/_sections/marketing/rundown/section.json5 +40 -0
  374. package/dist/assets/themes/newsflash/_theme.js +24 -0
  375. package/dist/assets/themes/newsflash/_theme.scss +70 -0
  376. package/dist/assets/themes/newsflash/css/base/_fonts.scss +80 -0
  377. package/dist/assets/themes/newsflash/css/base/_mixins.scss +51 -0
  378. package/dist/assets/themes/newsflash/css/base/_root.scss +257 -0
  379. package/dist/assets/themes/newsflash/css/base/_typography.scss +49 -0
  380. package/dist/assets/themes/newsflash/css/base/_utilities.scss +122 -0
  381. package/dist/assets/themes/newsflash/css/components/_badges.scss +65 -0
  382. package/dist/assets/themes/newsflash/css/components/_billing-toggle.scss +61 -0
  383. package/dist/assets/themes/newsflash/css/components/_buttons.scss +139 -0
  384. package/dist/assets/themes/newsflash/css/components/_cards.scss +47 -0
  385. package/dist/assets/themes/newsflash/css/components/_editorial.scss +173 -0
  386. package/dist/assets/themes/newsflash/css/components/_forms.scss +75 -0
  387. package/dist/assets/themes/newsflash/css/components/_infinite-scroll.scss +102 -0
  388. package/dist/assets/themes/newsflash/css/components/_panels.scss +156 -0
  389. package/dist/assets/themes/newsflash/css/components/_ticker.scss +67 -0
  390. package/dist/assets/themes/newsflash/css/layout/_general.scss +330 -0
  391. package/dist/assets/themes/newsflash/css/layout/_navigation.scss +168 -0
  392. package/dist/assets/themes/newsflash/css/pages/404/index.scss +79 -0
  393. package/dist/assets/themes/newsflash/css/pages/blog/[slug].scss +186 -0
  394. package/dist/assets/themes/newsflash/css/pages/blog/index.scss +17 -0
  395. package/dist/assets/themes/newsflash/css/pages/index.scss +157 -0
  396. package/dist/assets/themes/newsflash/css/pages/pricing/index.scss +55 -0
  397. package/dist/assets/themes/newsflash/css/pages/test/libraries/layers/index.scss +7 -0
  398. package/dist/assets/themes/newsflash/fonts/fraunces-italic-latin-ext.woff2 +0 -0
  399. package/dist/assets/themes/newsflash/fonts/fraunces-italic-latin.woff2 +0 -0
  400. package/dist/assets/themes/newsflash/fonts/fraunces-normal-latin-ext.woff2 +0 -0
  401. package/dist/assets/themes/newsflash/fonts/fraunces-normal-latin.woff2 +0 -0
  402. package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-italic-latin-ext.woff2 +0 -0
  403. package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-italic-latin.woff2 +0 -0
  404. package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-normal-latin-ext.woff2 +0 -0
  405. package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-normal-latin.woff2 +0 -0
  406. package/dist/assets/themes/newsflash/js/pages/blog/[slug].js +29 -0
  407. package/dist/assets/themes/newsflash/js/pages/test/libraries/layers/index.js +9 -0
  408. package/dist/background.js +684 -0
  409. package/dist/build.js +268 -0
  410. package/dist/cli-run.js +25 -0
  411. package/dist/cli.js +30 -0
  412. package/dist/commands/build.js +67 -0
  413. package/dist/commands/clean.js +29 -0
  414. package/dist/commands/deploy.js +97 -0
  415. package/dist/commands/install.js +58 -0
  416. package/dist/commands/lib/dependencies.js +33 -0
  417. package/dist/commands/lib/deploy-precheck.js +57 -0
  418. package/dist/commands/lib/ensure-target.js +151 -0
  419. package/dist/commands/lib/push-secrets.js +60 -0
  420. package/dist/commands/migrate.js +77 -0
  421. package/dist/commands/test.js +110 -0
  422. package/dist/commands/update.js +21 -0
  423. package/dist/commands/version.js +12 -0
  424. package/dist/config/manifest.json +117 -0
  425. package/dist/config/page-template.html +21 -0
  426. package/dist/content.js +37 -0
  427. package/dist/defaults/.github/workflows/publish.yml +86 -0
  428. package/dist/defaults/.nvmrc +1 -0
  429. package/dist/defaults/.vscode/settings.json +8 -0
  430. package/dist/defaults/AGENTS.md +113 -0
  431. package/dist/defaults/CHANGELOG.md +15 -0
  432. package/dist/defaults/CLAUDE.md +1 -0
  433. package/dist/defaults/_.gitignore +75 -0
  434. package/dist/defaults/config/description.md +46 -0
  435. package/dist/defaults/config/messages.json +20 -0
  436. package/dist/defaults/config/omega.json5 +64 -0
  437. package/dist/defaults/docs/README.md +17 -0
  438. package/dist/defaults/gulpfile.js +6 -0
  439. package/dist/defaults/hooks/build/post.js +8 -0
  440. package/dist/defaults/hooks/build/pre.js +8 -0
  441. package/dist/defaults/src/assets/css/bundles/.gitkeep +0 -0
  442. package/dist/defaults/src/assets/css/components/content/index.scss +11 -0
  443. package/dist/defaults/src/assets/css/components/offscreen/index.scss +4 -0
  444. package/dist/defaults/src/assets/css/components/options/index.scss +14 -0
  445. package/dist/defaults/src/assets/css/components/pages/index.scss +10 -0
  446. package/dist/defaults/src/assets/css/components/popup/index.scss +10 -0
  447. package/dist/defaults/src/assets/css/components/sidepanel/index.scss +6 -0
  448. package/dist/defaults/src/assets/css/main.scss +32 -0
  449. package/dist/defaults/src/assets/images/.gitkeep +0 -0
  450. package/dist/defaults/src/assets/js/components/background/index.js +25 -0
  451. package/dist/defaults/src/assets/js/components/content/index.js +22 -0
  452. package/dist/defaults/src/assets/js/components/offscreen/index.js +25 -0
  453. package/dist/defaults/src/assets/js/components/options/index.js +22 -0
  454. package/dist/defaults/src/assets/js/components/pages/index.js +22 -0
  455. package/dist/defaults/src/assets/js/components/popup/index.js +22 -0
  456. package/dist/defaults/src/assets/js/components/sidepanel/index.js +20 -0
  457. package/dist/defaults/src/assets/vendor/.gitkeep +0 -0
  458. package/dist/defaults/src/manifest.json +131 -0
  459. package/dist/defaults/src/views/offscreen/index.html +3 -0
  460. package/dist/defaults/src/views/options/index.html +8 -0
  461. package/dist/defaults/src/views/pages/index.html +10 -0
  462. package/dist/defaults/src/views/popup/index.html +4 -0
  463. package/dist/defaults/src/views/sidepanel/index.html +4 -0
  464. package/dist/defaults/test/README.md +41 -0
  465. package/dist/defaults/test/_init.js +10 -0
  466. package/dist/defaults/test/boot/externally-connectable.test.js +28 -0
  467. package/dist/gulp/config/locales.js +12 -0
  468. package/dist/gulp/main.js +78 -0
  469. package/dist/gulp/tasks/_.js +18 -0
  470. package/dist/gulp/tasks/audit.js +222 -0
  471. package/dist/gulp/tasks/bundle.js +687 -0
  472. package/dist/gulp/tasks/defaults.js +281 -0
  473. package/dist/gulp/tasks/distribute.js +172 -0
  474. package/dist/gulp/tasks/fontawesome.js +25 -0
  475. package/dist/gulp/tasks/html.js +163 -0
  476. package/dist/gulp/tasks/icons.js +126 -0
  477. package/dist/gulp/tasks/package.js +742 -0
  478. package/dist/gulp/tasks/publish.js +417 -0
  479. package/dist/gulp/tasks/sass.js +252 -0
  480. package/dist/gulp/tasks/serve.js +103 -0
  481. package/dist/gulp/tasks/translate.js +252 -0
  482. package/dist/gulp/tasks/utils/build-json.js +43 -0
  483. package/dist/gulp/tasks/utils/template-transform.js +50 -0
  484. package/dist/gulp/templates/BUILD_INSTRUCTIONS.md +69 -0
  485. package/dist/index.js +46 -0
  486. package/dist/lib/affiliatizer.js +224 -0
  487. package/dist/lib/analytics.js +26 -0
  488. package/dist/lib/auth-helpers.js +213 -0
  489. package/dist/lib/extension.js +116 -0
  490. package/dist/lib/icons.js +36 -0
  491. package/dist/lib/logger-lite.js +35 -0
  492. package/dist/lib/logger.js +4 -0
  493. package/dist/lib/messaging.js +48 -0
  494. package/dist/lib/safe-install.js +4 -0
  495. package/dist/lib/theme.js +73 -0
  496. package/dist/lib/verts.js +68 -0
  497. package/dist/offscreen.js +31 -0
  498. package/dist/omega-bin.js +6 -0
  499. package/dist/options.js +80 -0
  500. package/dist/page.js +80 -0
  501. package/dist/popup.js +80 -0
  502. package/dist/sidepanel.js +80 -0
  503. package/dist/test/assert.js +4 -0
  504. package/dist/test/fixtures/consumer-extension/dist/background.js +23 -0
  505. package/dist/test/fixtures/consumer-extension/dist/manifest.json +20 -0
  506. package/dist/test/fixtures/consumer-extension/dist/options.html +10 -0
  507. package/dist/test/fixtures/consumer-extension/dist/popup.bundle.js +5 -0
  508. package/dist/test/fixtures/consumer-extension/dist/popup.html +12 -0
  509. package/dist/test/harness/extension/background.js +26 -0
  510. package/dist/test/harness/extension/manifest.json +27 -0
  511. package/dist/test/harness/extension/options.html +12 -0
  512. package/dist/test/harness/extension/popup.html +12 -0
  513. package/dist/test/harness/extension/sidepanel.html +12 -0
  514. package/dist/test/index.js +63 -0
  515. package/dist/test/runner.js +99 -0
  516. package/dist/test/runners/boot.js +221 -0
  517. package/dist/test/runners/chromium.js +391 -0
  518. package/dist/test/runners/helpers.js +24 -0
  519. package/dist/test/suites/background/messaging.test.js +44 -0
  520. package/dist/test/suites/background/storage.test.js +46 -0
  521. package/dist/test/suites/background/sw-context.test.js +49 -0
  522. package/dist/test/suites/boot/build-json-bake.test.js +80 -0
  523. package/dist/test/suites/boot/extension-loads.test.js +58 -0
  524. package/dist/test/suites/build/affiliatizer.test.js +64 -0
  525. package/dist/test/suites/build/app-launch.test.js +65 -0
  526. package/dist/test/suites/build/attach-log-file.test.js +99 -0
  527. package/dist/test/suites/build/auth-emulator-gate.test.js +118 -0
  528. package/dist/test/suites/build/auth-triggers.test.js +71 -0
  529. package/dist/test/suites/build/boot-discovery.test.js +134 -0
  530. package/dist/test/suites/build/boot-timeout.test.js +92 -0
  531. package/dist/test/suites/build/build-error-notification.test.js +122 -0
  532. package/dist/test/suites/build/build-json-bake.test.js +302 -0
  533. package/dist/test/suites/build/build-verb.test.js +138 -0
  534. package/dist/test/suites/build/bundle-targets.test.js +66 -0
  535. package/dist/test/suites/build/cache-warming.test.js +44 -0
  536. package/dist/test/suites/build/cli.test.js +150 -0
  537. package/dist/test/suites/build/default-boot-test.test.js +100 -0
  538. package/dist/test/suites/build/defaults-scaffold.test.js +287 -0
  539. package/dist/test/suites/build/deploy-dispatch.test.js +76 -0
  540. package/dist/test/suites/build/distribute-task.test.js +111 -0
  541. package/dist/test/suites/build/ensure-target.test.js +141 -0
  542. package/dist/test/suites/build/env-delivery.test.js +239 -0
  543. package/dist/test/suites/build/env-watch.test.js +86 -0
  544. package/dist/test/suites/build/expect.test.js +48 -0
  545. package/dist/test/suites/build/exports.test.js +53 -0
  546. package/dist/test/suites/build/extension-fallback.test.js +82 -0
  547. package/dist/test/suites/build/framework-deps.test.js +176 -0
  548. package/dist/test/suites/build/global-handlers.test.js +70 -0
  549. package/dist/test/suites/build/icon-sheet.test.js +74 -0
  550. package/dist/test/suites/build/logger-lite.test.js +61 -0
  551. package/dist/test/suites/build/manager.test.js +249 -0
  552. package/dist/test/suites/build/mode-helpers.test.js +136 -0
  553. package/dist/test/suites/build/omega-shell.test.js +103 -0
  554. package/dist/test/suites/build/omega-tokens.test.js +76 -0
  555. package/dist/test/suites/build/package-task.test.js +831 -0
  556. package/dist/test/suites/build/setup-scripts.test.js +172 -0
  557. package/dist/test/suites/build/strip-dev-blocks.test.js +122 -0
  558. package/dist/test/suites/build/template-replace.test.js +116 -0
  559. package/dist/test/suites/build/test-discovery.test.js +64 -0
  560. package/dist/test/suites/build/test-target-no-match.test.js +119 -0
  561. package/dist/test/suites/build/theme-resolve.test.js +115 -0
  562. package/dist/test/suites/build/translate.test.js +85 -0
  563. package/dist/test/suites/build/url-helpers.test.js +119 -0
  564. package/dist/test/suites/build/verb-logs.test.js +43 -0
  565. package/dist/test/suites/build/verts-binding.test.js +67 -0
  566. package/dist/test/suites/build/wakeup-ping.test.js +90 -0
  567. package/dist/test/suites/build/wave5-messenger.test.js +80 -0
  568. package/dist/test/suites/view/options-and-sidepanel.test.js +16 -0
  569. package/dist/test/suites/view/popup-context.test.js +53 -0
  570. package/dist/test/suites/view/sidepanel.test.js +16 -0
  571. package/dist/test/utils/extended-mode-warning.js +13 -0
  572. package/dist/utils/attach-log-file.js +4 -0
  573. package/dist/utils/mode-helpers.js +117 -0
  574. package/dist/utils/url-helpers.js +69 -0
  575. package/dist/vendor/account/engine.js +182 -0
  576. package/dist/vendor/account/features.js +220 -0
  577. package/dist/vendor/account/index.js +53 -0
  578. package/dist/vendor/account/schema.js +272 -0
  579. package/dist/vendor/account/subscription.js +38 -0
  580. package/dist/vendor/config/company.js +31 -0
  581. package/dist/vendor/config/defaults.js +173 -0
  582. package/dist/vendor/config/demo.js +18 -0
  583. package/dist/vendor/config/desktop-artifacts.js +110 -0
  584. package/dist/vendor/config/edit.js +769 -0
  585. package/dist/vendor/config/env-delivery.js +145 -0
  586. package/dist/vendor/config/env-rules.js +93 -0
  587. package/dist/vendor/config/env-schema.js +1078 -0
  588. package/dist/vendor/config/env.js +445 -0
  589. package/dist/vendor/config/hooks.js +97 -0
  590. package/dist/vendor/config/index.js +237 -0
  591. package/dist/vendor/config/instances.js +208 -0
  592. package/dist/vendor/config/load.js +490 -0
  593. package/dist/vendor/config/merge.js +68 -0
  594. package/dist/vendor/config/order.js +139 -0
  595. package/dist/vendor/config/ports.js +374 -0
  596. package/dist/vendor/config/providers.js +32 -0
  597. package/dist/vendor/config/repo.js +142 -0
  598. package/dist/vendor/config/retired-keys.js +430 -0
  599. package/dist/vendor/config/schema.js +1610 -0
  600. package/dist/vendor/config/secrets.js +50 -0
  601. package/dist/vendor/config/seed.js +34 -0
  602. package/dist/vendor/config/site-global.js +205 -0
  603. package/dist/vendor/config/validate.js +554 -0
  604. package/dist/vendor/config/winback.js +61 -0
  605. package/dist/vendor/devkit/actions-secrets.js +145 -0
  606. package/dist/vendor/devkit/attach-log-file.js +262 -0
  607. package/dist/vendor/devkit/bundle.js +292 -0
  608. package/dist/vendor/devkit/ci-workflows.js +520 -0
  609. package/dist/vendor/devkit/clean-dirs.js +28 -0
  610. package/dist/vendor/devkit/cli-router.js +156 -0
  611. package/dist/vendor/devkit/defaults-engine.js +372 -0
  612. package/dist/vendor/devkit/deploy-precheck.js +54 -0
  613. package/dist/vendor/devkit/deploy-record.js +180 -0
  614. package/dist/vendor/devkit/deploy.js +286 -0
  615. package/dist/vendor/devkit/empty-modules-plugin.js +64 -0
  616. package/dist/vendor/devkit/env-watch.js +132 -0
  617. package/dist/vendor/devkit/framework-deps.js +46 -0
  618. package/dist/vendor/devkit/icons.js +178 -0
  619. package/dist/vendor/devkit/license.js +155 -0
  620. package/dist/vendor/devkit/local.js +1905 -0
  621. package/dist/vendor/devkit/logger.js +128 -0
  622. package/dist/vendor/devkit/merge-line-files.js +296 -0
  623. package/dist/vendor/devkit/npm-registry.js +52 -0
  624. package/dist/vendor/devkit/omega-bin.js +345 -0
  625. package/dist/vendor/devkit/safe-install.js +18 -0
  626. package/dist/vendor/devkit/scaffold-guard.js +96 -0
  627. package/dist/vendor/devkit/strip-dev-blocks-plugin.js +29 -0
  628. package/dist/vendor/devkit/strip-dev-blocks.js +32 -0
  629. package/dist/vendor/devkit/target-dependencies.js +137 -0
  630. package/dist/vendor/devkit/target-secrets.js +165 -0
  631. package/dist/vendor/devkit/test/assert.js +120 -0
  632. package/dist/vendor/devkit/test/define-cases.js +104 -0
  633. package/dist/vendor/devkit/test/extended-mode-warning.js +22 -0
  634. package/dist/vendor/devkit/test/runner-core.js +554 -0
  635. package/dist/vendor/devkit/test/scope.js +162 -0
  636. package/dist/vendor/devkit/translate/cache.js +84 -0
  637. package/dist/vendor/devkit/translate/engine.js +243 -0
  638. package/dist/vendor/devkit/translate/index.js +49 -0
  639. package/dist/vendor/devkit/translate/languages.js +134 -0
  640. package/dist/vendor/devkit/translate/providers.js +188 -0
  641. package/dist/vendor/devkit/update.js +569 -0
  642. package/docs/affiliatizer.md +81 -0
  643. package/docs/audit.md +67 -0
  644. package/docs/auth.md +149 -0
  645. package/docs/build-system.md +176 -0
  646. package/docs/cdp-debugging.md +42 -0
  647. package/docs/cli.md +73 -0
  648. package/docs/common-mistakes.md +10 -0
  649. package/docs/components.md +87 -0
  650. package/docs/css.md +133 -0
  651. package/docs/defaults.md +72 -0
  652. package/docs/environment-detection.md +79 -0
  653. package/docs/extension.md +93 -0
  654. package/docs/hooks.md +111 -0
  655. package/docs/icons.md +47 -0
  656. package/docs/index.md +291 -0
  657. package/docs/logging.md +33 -0
  658. package/docs/managers.md +100 -0
  659. package/docs/offscreen.md +57 -0
  660. package/docs/publishing.md +182 -0
  661. package/docs/shared/agent-docs.md +89 -0
  662. package/docs/shared/analytics.md +612 -0
  663. package/docs/shared/brands.md +51 -0
  664. package/docs/shared/breaking-changes.md +497 -0
  665. package/docs/shared/config.md +1387 -0
  666. package/docs/shared/deploys.md +215 -0
  667. package/docs/shared/icons.md +201 -0
  668. package/docs/shared/local-dev.md +147 -0
  669. package/docs/shared/logging.md +202 -0
  670. package/docs/shared/monitoring.md +153 -0
  671. package/docs/shared/publishing.md +183 -0
  672. package/docs/shared/rulings.md +34 -0
  673. package/docs/shared/testing.md +147 -0
  674. package/docs/shared/theming.md +604 -0
  675. package/docs/shared/translation.md +291 -0
  676. package/docs/shared/updates.md +61 -0
  677. package/docs/templating.md +66 -0
  678. package/docs/test-boot-layer.md +143 -0
  679. package/docs/test-framework.md +411 -0
  680. package/docs/themes.md +89 -0
  681. package/docs/translations.md +73 -0
  682. package/docs/verts.md +67 -0
  683. package/docs/xss-prevention.md +95 -0
  684. package/package.json +159 -0
@@ -0,0 +1,92 @@
1
+ // Build-layer tests for the boot layer's per-test timeout default (#262).
2
+ //
3
+ // A boot test drives the consumer's REAL extension, and the first run after a
4
+ // fresh build pays the cold Firebase service-worker init — observed at 20-30s,
5
+ // right on top of the old 20000ms default, so a consumer's boot test only
6
+ // passed once they declared a timeout of their own. The default is the fix; a
7
+ // consumer-side override is not.
8
+ //
9
+ // The cost is a Chromium cold start, so this asserts the CONTRACT (the number
10
+ // and the wiring that carries it) rather than re-running the boot layer.
11
+
12
+ const path = require('path');
13
+ const defineCases = require('../../../vendor/devkit/test/define-cases.js');
14
+
15
+ const RUNNER = path.join(__dirname, '..', '..', 'runner.js');
16
+ const BOOT_SUITES = path.join(__dirname, '..', 'boot');
17
+
18
+ // The observed worst case the default has to clear (#262).
19
+ const OBSERVED_FIRST_RUN_SW_INIT_MS = 30000;
20
+
21
+ module.exports = defineCases({
22
+ type: 'suite',
23
+ layer: 'build',
24
+ description: 'boot-layer timeout default',
25
+ tests: [
26
+ {
27
+ name: 'the default clears a cold first-run Firebase SW init with room to spare',
28
+ run: (ctx) => {
29
+ const { BOOT_DEFAULT_TIMEOUT } = require(RUNNER);
30
+ ctx.expect(BOOT_DEFAULT_TIMEOUT).toBe(45000);
31
+ ctx.expect(BOOT_DEFAULT_TIMEOUT > OBSERVED_FIRST_RUN_SW_INIT_MS).toBe(true);
32
+ },
33
+ },
34
+ {
35
+ name: 'a boot test that declares no timeout is handed the default, through the real runner core',
36
+ run: async (ctx) => {
37
+ const fs = require('fs');
38
+ const os = require('os');
39
+ const { createRunner } = require('../../../vendor/devkit/test/runner-core.js');
40
+ const { BOOT_DEFAULT_TIMEOUT } = require(RUNNER);
41
+
42
+ // A real suites dir with one real boot test, run through the real core:
43
+ // the boot glue is where a test's timeout is resolved, and this is the
44
+ // number a fresh-build run actually races against.
45
+ const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-boot-timeout-'));
46
+ fs.mkdirSync(path.join(tmp, 'suites', 'boot'), { recursive: true });
47
+ fs.writeFileSync(path.join(tmp, 'suites', 'boot', 'no-timeout.test.js'),
48
+ `module.exports = { layer: 'boot', description: 'no timeout declared', inspect: async () => {} };\n`);
49
+
50
+ let handed = null;
51
+ const runner = createRunner({
52
+ title: 'boot timeout probe',
53
+ packageName: '@omega.js/extension',
54
+ targetAlias: 'extension',
55
+ suitesDir: path.join(tmp, 'suites'),
56
+ frameworkTestDir: path.join(tmp, 'framework-tests'),
57
+ bootDefaultTimeout: BOOT_DEFAULT_TIMEOUT,
58
+ boot: { run: async ({ tests }) => { handed = tests; } },
59
+ });
60
+
61
+ // The probe runner reports like any run — its report is not THIS run's,
62
+ // so it stays out of the output.
63
+ const realLog = console.log;
64
+ console.log = () => {};
65
+
66
+ try {
67
+ await runner.run({ layer: 'boot' });
68
+ ctx.expect(handed.length).toBe(1);
69
+ ctx.expect(handed[0].timeout).toBe(BOOT_DEFAULT_TIMEOUT);
70
+ } finally {
71
+ console.log = realLog;
72
+ fs.rmSync(tmp, { recursive: true, force: true });
73
+ }
74
+ },
75
+ },
76
+ {
77
+ name: 'no framework boot test declares a timeout — a fresh build runs on the default',
78
+ run: (ctx) => {
79
+ const fs = require('fs');
80
+
81
+ // The point of raising the default: a boot suite needs no timeout of
82
+ // its own to survive a cold first run.
83
+ for (const file of fs.readdirSync(BOOT_SUITES).filter((name) => name.endsWith('.test.js'))) {
84
+ const mod = require(path.join(BOOT_SUITES, file));
85
+ const tests = Array.isArray(mod) ? mod : (mod.tests || [mod]);
86
+ ctx.expect(mod.timeout).toBe(undefined);
87
+ tests.forEach((t) => ctx.expect(t.timeout).toBe(undefined));
88
+ }
89
+ },
90
+ },
91
+ ],
92
+ });
@@ -0,0 +1,122 @@
1
+ // Build-layer tests for Manager.getBuildErrorNotificationArgs() — the notifly
2
+ // argv the build-error reporter spawns (#104).
3
+ //
4
+ // Build messages routinely carry apostrophes and parentheses ("the app's
5
+ // package.json has no version (Chrome refuses …)"). The reporter used to
6
+ // interpolate the message into a single shell string, which the shell then
7
+ // mangled — the report survived, the notification died with a syntax error.
8
+ // The contract now is an ARGV ARRAY handed to a shell-free spawn, so every
9
+ // character of the message reaches notifly verbatim.
10
+
11
+ const path = require('path');
12
+ const { spawnSync } = require('child_process');
13
+
14
+ const Manager = require(path.join(__dirname, '..', '..', '..', 'build.js'));
15
+ const defineCases = require('../../../vendor/devkit/test/define-cases.js');
16
+
17
+ // The live message from the versionless-manifest package test — apostrophe,
18
+ // parentheses, quotes and a colon in one string.
19
+ const NASTY = `Cannot build the manifest: the extension app's package.json has no "version" (Chrome refuses to load a manifest without one)`;
20
+
21
+ module.exports = defineCases({
22
+ type: 'suite',
23
+ layer: 'build',
24
+ description: 'Manager — build-error notification argv is shell-free',
25
+ tests: [
26
+ {
27
+ name: 'returns an argv array, never a shell string',
28
+ run: (ctx) => {
29
+ const args = Manager.getBuildErrorNotificationArgs('Package', NASTY);
30
+ ctx.expect(Array.isArray(args)).toBe(true);
31
+ ctx.expect(args.every((a) => typeof a === 'string')).toBe(true);
32
+ },
33
+ },
34
+ {
35
+ name: 'an apostrophe-bearing message is ONE verbatim arg (no quoting, no escapes)',
36
+ run: (ctx) => {
37
+ const args = Manager.getBuildErrorNotificationArgs('Package', NASTY);
38
+ const message = args[args.indexOf('--message') + 1];
39
+ ctx.expect(message).toBe(NASTY);
40
+ ctx.expect(message.includes('\\')).toBe(false);
41
+ },
42
+ },
43
+ {
44
+ name: 'title carries the plugin name and the flags notifly expects',
45
+ run: (ctx) => {
46
+ const args = Manager.getBuildErrorNotificationArgs('Bundle', 'boom');
47
+ ctx.expect(args[args.indexOf('--title') + 1]).toBe('Build Error: Bundle');
48
+ // No --appIcon: the old value was a machine-specific absolute path (#126)
49
+ ctx.expect(args.includes('--appIcon')).toBe(false);
50
+ ctx.expect(args.includes('--timeout')).toBe(true);
51
+ ctx.expect(args.includes('--sound')).toBe(true);
52
+ },
53
+ },
54
+ {
55
+ // The end-to-end proof, run against a REAL child process (no shell, no mock):
56
+ // every arg arrives at the child byte-identical, apostrophes and all. The
57
+ // old shell string never got this far — /bin/sh died parsing it.
58
+ name: 'the argv survives a real shell-free spawn byte-identical',
59
+ run: (ctx) => {
60
+ const args = Manager.getBuildErrorNotificationArgs('Package', NASTY);
61
+ const printer = 'process.stdout.write(JSON.stringify(process.argv.slice(1)))';
62
+ const result = spawnSync(process.execPath, ['-e', printer, '--', ...args], { encoding: 'utf8' });
63
+
64
+ ctx.expect(result.status).toBe(0);
65
+ ctx.expect(result.stderr).toBe('');
66
+ ctx.expect(JSON.parse(result.stdout)).toEqual(args);
67
+ },
68
+ },
69
+ {
70
+ // notifly is an optional local nicety: on a machine without it the spawn
71
+ // used to dump a raw `spawn notifly ENOENT` error after the suite (#123).
72
+ // The ENOENT here comes from a REAL spawn of a binary that cannot exist.
73
+ name: 'a real missing-binary ENOENT prints ONE friendly note, no error dump',
74
+ run: (ctx) => {
75
+ const result = spawnSync('omega-notifly-does-not-exist-xyz', ['--title', 'x'], { shell: false });
76
+ ctx.expect(result.error.code).toBe('ENOENT');
77
+
78
+ const warns = [];
79
+ const errors = [];
80
+ const origWarn = console.warn;
81
+ const origError = console.error;
82
+ console.warn = (...args) => warns.push(args.join(' '));
83
+ console.error = (...args) => errors.push(args.join(' '));
84
+ try {
85
+ Manager.reportNotificationFailure(result.error);
86
+ } finally {
87
+ console.warn = origWarn;
88
+ console.error = origError;
89
+ }
90
+
91
+ ctx.expect(warns.length).toBe(1);
92
+ ctx.expect(warns[0]).toContain('notifly not installed — skipping desktop notification');
93
+ ctx.expect(warns[0].includes('ENOENT')).toBe(false);
94
+ ctx.expect(warns[0].includes('spawnSync')).toBe(false);
95
+ ctx.expect(errors.length).toBe(0);
96
+ },
97
+ },
98
+ {
99
+ name: 'every other spawn failure keeps the logged-not-thrown error',
100
+ run: (ctx) => {
101
+ const failure = Object.assign(new Error('permission denied'), { code: 'EACCES' });
102
+
103
+ const warns = [];
104
+ const errors = [];
105
+ const origWarn = console.warn;
106
+ const origError = console.error;
107
+ console.warn = (...args) => warns.push(args.join(' '));
108
+ console.error = (...args) => errors.push(args.join(' '));
109
+ try {
110
+ Manager.reportNotificationFailure(failure);
111
+ } finally {
112
+ console.warn = origWarn;
113
+ console.error = origError;
114
+ }
115
+
116
+ ctx.expect(errors.length).toBe(1);
117
+ ctx.expect(errors[0]).toContain('Failed to send notification');
118
+ ctx.expect(warns.length).toBe(0);
119
+ },
120
+ },
121
+ ],
122
+ });
@@ -0,0 +1,302 @@
1
+ // The OMEGA_BUILD_JSON bake, bundle lane
2
+ // ([#743](https://github.com/Omega-JS-Stack/omega/issues/743)).
3
+ //
4
+ // The snapshot an extension context reads is composed here and BAKED into every
5
+ // emitted bundle two ways — `define` replaces the bare identifier at compile
6
+ // time, `banner` prepends the globalThis/self/window assignment — which is the
7
+ // shape @omega.js/desktop has always used. It used to be a
8
+ // `packaged/<target>/raw/build.js` JSONP file the service worker
9
+ // importScripts()'d and every page loaded with its own <script> tag, plus a
10
+ // `build.json` sidecar nothing read; both files are gone, so what this suite
11
+ // pins is that the artifact still carries the same facts.
12
+ //
13
+ // The composition cases moved here from package-task.test.js with the code:
14
+ // `cloud` reaching the snapshot is what the SW's Firebase auth lives or dies by
15
+ // (#46), the license stamp rides outside `config` (#320), and the dev port map
16
+ // is the ONLY channel a browser context has to a bumped emulator (#300, #262).
17
+ //
18
+ // The task module reads its project (package.json / config / dist) from cwd at
19
+ // REQUIRE time, so each test stages a temp project, chdirs into it, and requires
20
+ // the task fresh — the same model as package-task.test.js's inProject().
21
+
22
+ const path = require('path');
23
+ const fs = require('fs');
24
+ const os = require('os');
25
+ const vm = require('vm');
26
+ const defineCases = require('../../../vendor/devkit/test/define-cases.js');
27
+
28
+ const SRC = path.join(__dirname, '..', '..', '..');
29
+ const TASK_PATH = path.join(SRC, 'gulp', 'tasks', 'bundle.js');
30
+ const { readBakedBuildJson } = require(path.join(SRC, 'gulp', 'tasks', 'utils', 'build-json.js'));
31
+
32
+ // The boot lane loads the in-tree fixture consumer, which stands in for a real
33
+ // built extension — so it carries a checked-in copy of the banner.
34
+ const FIXTURE = path.join(SRC, 'test', 'fixtures', 'consumer-extension', 'dist');
35
+
36
+ // Stage a temp extension project. `files` is a relative-path → contents map
37
+ // written verbatim (the entry points the bundle task discovers, …).
38
+ function stageProject(opts = {}) {
39
+ const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-build-json-'));
40
+
41
+ fs.writeFileSync(path.join(tmp, 'package.json'), opts.pkg ?? `{ "name": "staged-ext", "version": "3.1.4" }`);
42
+
43
+ if (opts.config !== undefined) {
44
+ fs.mkdirSync(path.join(tmp, 'config'), { recursive: true });
45
+ fs.writeFileSync(path.join(tmp, 'config', 'omega.json5'), opts.config);
46
+ }
47
+
48
+ for (const [relative, contents] of Object.entries(opts.files || {})) {
49
+ const full = path.join(tmp, relative);
50
+ fs.mkdirSync(path.dirname(full), { recursive: true });
51
+ fs.writeFileSync(full, contents);
52
+ }
53
+
54
+ return tmp;
55
+ }
56
+
57
+ // Run `fn(task)` with cwd pinned to `dir` and the task module loaded fresh.
58
+ async function inProject(dir, fn) {
59
+ const oldCwd = process.cwd();
60
+ const flush = () => {
61
+ for (const key of Object.keys(require.cache)) {
62
+ if (key.startsWith(SRC + path.sep)) delete require.cache[key];
63
+ }
64
+ };
65
+
66
+ flush();
67
+ try {
68
+ process.chdir(dir);
69
+ return await fn(require(TASK_PATH));
70
+ } finally {
71
+ process.chdir(oldCwd);
72
+ flush();
73
+ }
74
+ }
75
+
76
+ // An entry that reads the snapshot BOTH ways the bake delivers it: the bare
77
+ // identifier the `define` replaces at compile time, and the globals the `banner`
78
+ // assigns at load time (`self` is what background.js reads, `window`/`globalThis`
79
+ // what every page context reads). The global reads are guarded so the body can
80
+ // also be run on its OWN, with no banner in scope — that run is what tells the
81
+ // two mechanisms apart.
82
+ const PROBE_ENTRY = [
83
+ 'globalThis.__fromDefine = OMEGA_BUILD_JSON.config.brand.id;',
84
+ 'try { globalThis.__fromGlobal = globalThis.OMEGA_BUILD_JSON.config.brand.id; } catch (e) { globalThis.__fromGlobal = null; }',
85
+ 'try { globalThis.__fromSelf = self.OMEGA_BUILD_JSON.config.brand.id; } catch (e) { globalThis.__fromSelf = null; }',
86
+ '',
87
+ ].join('\n');
88
+
89
+ // Run an emitted bundle the way a browser would — it is a self-contained iife
90
+ // with no imports and no chrome APIs — and hand back what it set.
91
+ //
92
+ // `banner: false` runs everything BUT the first line, in a scope where nothing
93
+ // has assigned OMEGA_BUILD_JSON. Only the compile-time `define` can answer there,
94
+ // so this is what proves the define is doing work rather than the banner's global
95
+ // quietly covering for it.
96
+ function runBundleFile(file, options = {}) {
97
+ const source = fs.readFileSync(file, 'utf8');
98
+ const scope = {};
99
+ scope.self = scope;
100
+ vm.runInNewContext(options.banner === false ? source.slice(source.indexOf('\n') + 1) : source, scope);
101
+ return scope;
102
+ }
103
+
104
+ module.exports = defineCases({
105
+ type: 'suite',
106
+ layer: 'build',
107
+ description: 'OMEGA_BUILD_JSON bake — composed once, carried by every emitted bundle (#743)',
108
+ timeout: 120000,
109
+ tests: [
110
+ {
111
+ name: 'every emitted bundle carries the snapshot as a define AND as the global (#743)',
112
+ run: async (ctx) => {
113
+ const tmp = stageProject({
114
+ config: `{
115
+ brand: { id: 'staged', name: 'Staged' },
116
+ targets: { extension: {} },
117
+ }`,
118
+ files: {
119
+ // The service worker's entry and a page entry — the two contexts the
120
+ // JSONP file used to reach by two different mechanisms.
121
+ 'src/assets/js/components/background/index.js': PROBE_ENTRY,
122
+ 'src/assets/js/components/popup/index.js': PROBE_ENTRY,
123
+ },
124
+ });
125
+ try {
126
+ await inProject(tmp, async (task) => {
127
+ const failure = await new Promise((resolve) => task.bundleTask(resolve));
128
+ ctx.expect(failure).toBe(undefined);
129
+
130
+ for (const name of ['background', 'popup']) {
131
+ const emitted = path.join(tmp, 'dist', 'assets', 'js', 'components', `${name}.bundle.js`);
132
+ ctx.expect(fs.existsSync(emitted)).toBe(true);
133
+
134
+ // The banner IS the first line — it has to land ahead of the
135
+ // bundle's own code, which is the load order the SW's
136
+ // importScripts('/build.js') used to buy.
137
+ ctx.expect(readBakedBuildJson(emitted).config.brand.id).toBe('staged');
138
+
139
+ // banner: globalThis and self both answer, the two names the
140
+ // page contexts and the service worker read (#743)
141
+ const ran = runBundleFile(emitted);
142
+ ctx.expect(ran.__fromGlobal).toBe('staged');
143
+ ctx.expect(ran.__fromSelf).toBe('staged');
144
+
145
+ // define: the bare identifier became the literal at compile time —
146
+ // it still answers with the banner line withheld, where nothing
147
+ // has assigned the global at all.
148
+ const bare = runBundleFile(emitted, { banner: false });
149
+ ctx.expect(bare.__fromDefine).toBe('staged');
150
+ ctx.expect(bare.__fromGlobal).toBe(null);
151
+ ctx.expect(bare.__fromSelf).toBe(null);
152
+ }
153
+ });
154
+ } finally {
155
+ fs.rmSync(tmp, { recursive: true, force: true });
156
+ }
157
+ },
158
+ },
159
+ {
160
+ // The boot lane is what proves a BROWSER resolves the bake, and it runs
161
+ // against the checked-in fixture rather than a build. That only means
162
+ // anything while the fixture carries the banner this generator emits — so
163
+ // the shape (the IIFE, the three scopes it assigns) is pinned here against
164
+ // the live function. Change buildJsonBanner and this fails until the
165
+ // fixture is regenerated.
166
+ name: 'the boot fixture carries the banner buildJsonBanner emits, per bundle (#743)',
167
+ run: async (ctx) => {
168
+ const task = require(TASK_PATH);
169
+
170
+ for (const file of ['background.js', 'popup.bundle.js']) {
171
+ const full = path.join(FIXTURE, file);
172
+ const firstLine = fs.readFileSync(full, 'utf8').split('\n', 1)[0];
173
+
174
+ ctx.expect(firstLine).toBe(task.buildJsonBanner(readBakedBuildJson(full)).js);
175
+ // Every bundle carries its OWN copy — that is what replaced the single file.
176
+ ctx.expect(readBakedBuildJson(full).config.brand.id).toBe('bxm-fixture');
177
+ }
178
+ },
179
+ },
180
+ {
181
+ name: 'the snapshot carries cloud from config/omega.json5 (#46)',
182
+ run: async (ctx) => {
183
+ const tmp = stageProject({
184
+ config: `{
185
+ brand: { id: 'staged', name: 'Staged' },
186
+ cloud: { config: { apiKey: 'AIza-staged', projectId: 'demo-staged', appId: '1:2:web:3' } },
187
+ targets: { extension: {} },
188
+ }`,
189
+ });
190
+ try {
191
+ await inProject(tmp, async (task) => {
192
+ const buildJson = await task.composeBuildJson();
193
+
194
+ ctx.expect(buildJson.config.cloud.config.apiKey).toBe('AIza-staged');
195
+ ctx.expect(buildJson.config.cloud.config.projectId).toBe('demo-staged');
196
+ // Without it the service worker's Firebase auth never initializes
197
+ ctx.expect(buildJson.config.firebase.app.enabled).toBe(true);
198
+ });
199
+ } finally {
200
+ fs.rmSync(tmp, { recursive: true, force: true });
201
+ }
202
+ },
203
+ },
204
+ {
205
+ name: 'the snapshot records the build\'s license verdict, outside the client config (#320)',
206
+ run: async (ctx) => {
207
+ const tmp = stageProject({
208
+ config: `{ brand: { id: 'staged', name: 'Staged' }, targets: { extension: {} } }`,
209
+ });
210
+ try {
211
+ await inProject(tmp, async (task) => {
212
+ const buildJson = await task.composeBuildJson();
213
+
214
+ // A test run is not a production build, so it never phones home:
215
+ // keyless is what an unlicensed artifact records (spec call 5).
216
+ ctx.expect(buildJson.license).toEqual({ status: 'keyless', payments: 'gated', attribution: 'shown' });
217
+ // A fact about the BUILD — the client contract is untouched.
218
+ ctx.expect(buildJson.config.license).toBeUndefined();
219
+ });
220
+ } finally {
221
+ fs.rmSync(tmp, { recursive: true, force: true });
222
+ }
223
+ },
224
+ },
225
+ {
226
+ name: 'cloud is an empty object when config/omega.json5 declares none',
227
+ run: async (ctx) => {
228
+ const tmp = stageProject({});
229
+ try {
230
+ await inProject(tmp, async (task) => {
231
+ const buildJson = await task.composeBuildJson();
232
+ ctx.expect(buildJson.config.cloud).toEqual({});
233
+ ctx.expect(buildJson.config.firebase.app.enabled).toBe(false);
234
+ });
235
+ } finally {
236
+ fs.rmSync(tmp, { recursive: true, force: true });
237
+ }
238
+ },
239
+ },
240
+ {
241
+ name: 'the bake carries the sibling backend\'s resolved emulator ports, and never in production (#300)',
242
+ run: async (ctx) => {
243
+ // An extension context has no env and no filesystem — the bake is its
244
+ // ONLY channel to a bumped emulator. Stage the target inside a real brand
245
+ // with a live backend ports file beside it.
246
+ const brand = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-dev-ports-brand-'));
247
+ fs.mkdirSync(path.join(brand, 'config'), { recursive: true });
248
+ fs.writeFileSync(path.join(brand, 'config', 'omega.json5'), `{ brand: { id: 'staged', name: 'Staged' } }`);
249
+ fs.mkdirSync(path.join(brand, 'targets', 'backend', '.temp'), { recursive: true });
250
+ fs.writeFileSync(path.join(brand, 'targets', 'backend', '.temp', 'ports.json'), JSON.stringify({
251
+ ports: { auth: 9100, firestore: 8081, hosting: 5003 }, pid: process.pid, startedAt: 'x',
252
+ }));
253
+
254
+ // …and a live WEBSITE publishing its resolved origin beside its port —
255
+ // bumped AND https, the pair a port number alone can never express (#262)
256
+ fs.mkdirSync(path.join(brand, 'targets', 'website', '.temp'), { recursive: true });
257
+ fs.writeFileSync(path.join(brand, 'targets', 'website', '.temp', 'ports.json'), JSON.stringify({
258
+ ports: { website: 4001 }, origin: 'https://localhost:4001', pid: process.pid, startedAt: 'x',
259
+ }));
260
+
261
+ const app = path.join(brand, 'targets', 'extension');
262
+ fs.mkdirSync(app, { recursive: true });
263
+ fs.writeFileSync(path.join(app, 'package.json'), `{ "name": "staged-ext", "version": "3.1.4" }`);
264
+
265
+ // The runner itself exports OMEGA_TEST_MODE, and getEnvironment() reads
266
+ // it BEFORE OMEGA_BUILD_MODE — a "production" bake under omega test is
267
+ // otherwise a testing bake (the auth-emulator-gate bakeConfig idiom).
268
+ // OMEGA_LICENSE_KEY rides the list because a production bake runs the
269
+ // license check (#320): the suite stays offline on a machine that has
270
+ // a real key exported.
271
+ const ENV_KEYS = ['OMEGA_BUILD_MODE', 'OMEGA_TEST_MODE', 'NODE_ENV', 'OMEGA_LICENSE_KEY'];
272
+ const bake = async (mode) => {
273
+ const previous = Object.fromEntries(ENV_KEYS.map((key) => [key, process.env[key]]));
274
+ ENV_KEYS.forEach((key) => delete process.env[key]);
275
+ if (mode === 'production') process.env.OMEGA_BUILD_MODE = 'true';
276
+ try {
277
+ return await inProject(app, async (task) => (await task.composeBuildJson()).config);
278
+ } finally {
279
+ ENV_KEYS.forEach((key) => {
280
+ if (previous[key] === undefined) delete process.env[key]; else process.env[key] = previous[key];
281
+ });
282
+ }
283
+ };
284
+
285
+ try {
286
+ const dev = await bake('development');
287
+ ctx.expect(dev.dev.ports.auth).toBe(9100);
288
+ ctx.expect(dev.dev.ports.firestore).toBe(8081);
289
+ ctx.expect(dev.dev.ports.hosting).toBe(5003);
290
+ // The website's origin is a resolved fact in the same map (#262)
291
+ ctx.expect(dev.dev.origin).toBe('https://localhost:4001');
292
+
293
+ // A packaged build has no local stack to reach — no map ships
294
+ const production = await bake('production');
295
+ ctx.expect(production.dev).toBe(undefined);
296
+ } finally {
297
+ fs.rmSync(brand, { recursive: true, force: true });
298
+ }
299
+ },
300
+ },
301
+ ],
302
+ });
@@ -0,0 +1,138 @@
1
+ // Build-layer tests for the canonical `build` verb ([#81](https://github.com/Omega-JS-Stack/omega/issues/81)
2
+ // parity sweep — desktop had the verb, extension only had the npm script).
3
+ // The synced projectScripts `build` is the thin `omega build` alias, so the
4
+ // verb must run the pipeline ITSELF — clean, then the gulp build task under
5
+ // OMEGA_BUILD_MODE — and never shell back to `npm run build` (that would
6
+ // recurse forever). Mirrors desktop's build-verbs.test.js.
7
+
8
+ const path = require('path');
9
+ const fs = require('fs');
10
+ const defineCases = require('../../../vendor/devkit/test/define-cases.js');
11
+
12
+ const SRC = path.join(__dirname, '..', '..', '..');
13
+ const CLI_PATH = path.join(SRC, 'cli.js');
14
+ const COMMANDS_DIR = path.join(SRC, 'commands');
15
+
16
+ const build = require(path.join(COMMANDS_DIR, 'build.js'));
17
+
18
+ // Record the steps a plan runs, in order, without executing anything real.
19
+ // The step implementations are the seam runPlan already takes as an argument —
20
+ // nothing is faked, we just hand it a recorder instead of the real runners (a
21
+ // real gulp package build has no place in a unit test).
22
+ function recorder(log) {
23
+ const record = (type) => (options, step) => { log.push(step.task ? `${type}:${step.task}` : type); };
24
+ return { clean: record('clean'), gulp: record('gulp') };
25
+ }
26
+
27
+ function stubCommand(name, fn) {
28
+ const file = path.join(COMMANDS_DIR, `${name}.js`);
29
+ require.cache[file] = { id: file, filename: file, loaded: true, children: [], paths: [], exports: fn };
30
+ }
31
+
32
+ function unstub(name) {
33
+ delete require.cache[path.join(COMMANDS_DIR, `${name}.js`)];
34
+ }
35
+
36
+ function freshCli() {
37
+ delete require.cache[CLI_PATH];
38
+ return require(CLI_PATH);
39
+ }
40
+
41
+ async function withEnv(run) {
42
+ const previous = process.env.OMEGA_BUILD_MODE;
43
+ delete process.env.OMEGA_BUILD_MODE;
44
+ try {
45
+ return await run();
46
+ } finally {
47
+ if (previous === undefined) delete process.env.OMEGA_BUILD_MODE;
48
+ else process.env.OMEGA_BUILD_MODE = previous;
49
+ }
50
+ }
51
+
52
+ module.exports = defineCases({
53
+ type: 'suite',
54
+ layer: 'build',
55
+ description: 'build verb — the CLI owns the pipeline and its build-mode flag',
56
+ tests: [
57
+ {
58
+ name: 'positional "build" routes to commands/build.js',
59
+ run: async (ctx) => {
60
+ let invoked = false;
61
+ stubCommand('build', async () => { invoked = true; });
62
+ try {
63
+ const Main = freshCli();
64
+ await new Main().process({ _: ['build'] });
65
+ ctx.expect(invoked).toBe(true);
66
+ } finally {
67
+ unstub('build');
68
+ }
69
+ },
70
+ },
71
+ {
72
+ name: 'alias "-b" routes to the build command, like every sibling CLI',
73
+ run: async (ctx) => {
74
+ let invoked = false;
75
+ stubCommand('build', async () => { invoked = true; });
76
+ try {
77
+ const Main = freshCli();
78
+ await new Main().process({ _: [], b: true });
79
+ ctx.expect(invoked).toBe(true);
80
+ } finally {
81
+ unstub('build');
82
+ }
83
+
84
+ const { aliases } = freshCli().config;
85
+ ctx.expect(aliases.build.includes('-b')).toBe(true);
86
+ ctx.expect(aliases.build.includes('--build')).toBe(true);
87
+ },
88
+ },
89
+ {
90
+ name: 'build: OMEGA_BUILD_MODE + clean → gulp build',
91
+ run: (ctx) => {
92
+ const plan = build.plan({});
93
+ ctx.expect(plan.env.OMEGA_BUILD_MODE).toBe('true');
94
+ ctx.expect(plan.steps.map((s) => (s.task ? `${s.type}:${s.task}` : s.type)))
95
+ .toEqual(['clean', 'gulp:build']);
96
+ },
97
+ },
98
+ {
99
+ name: 'runPlan sets the env flag and runs the steps in order',
100
+ run: async (ctx) => {
101
+ const log = [];
102
+ await withEnv(async () => {
103
+ await build.runPlan(build.plan({}), {}, recorder(log));
104
+ ctx.expect(process.env.OMEGA_BUILD_MODE).toBe('true');
105
+ });
106
+ ctx.expect(log).toEqual(['clean', 'gulp:build']);
107
+ },
108
+ },
109
+ {
110
+ name: 'every plan step type has a runner in the RUNNERS table',
111
+ run: (ctx) => {
112
+ const known = Object.keys(build.RUNNERS);
113
+ for (const step of build.plan({}).steps) {
114
+ ctx.expect(known.includes(step.type)).toBe(true);
115
+ }
116
+ },
117
+ },
118
+ {
119
+ name: 'the verb never shells back to `npm run build` (the recursion the alias would cause)',
120
+ run: (ctx) => {
121
+ // Comments may NAME the forbidden command (the header documents the
122
+ // recursion rule) — the guard polices code only.
123
+ const source = fs.readFileSync(path.join(COMMANDS_DIR, 'build.js'), 'utf8')
124
+ .replace(/\/\/[^\n]*/g, '')
125
+ .replace(/\/\*[\s\S]*?\*\//g, '');
126
+ ctx.expect(/npm run build/.test(source)).toBe(false);
127
+ ctx.expect(source.includes('npm run gulp -- ')).toBe(true);
128
+ },
129
+ },
130
+ {
131
+ name: 'the synced projectScripts build script is the thin `omega build` alias (#748)',
132
+ run: (ctx) => {
133
+ const pkg = JSON.parse(fs.readFileSync(path.join(SRC, '..', 'package.json'), 'utf8'));
134
+ ctx.expect(pkg.projectScripts.build).toBe('omega build');
135
+ },
136
+ },
137
+ ],
138
+ });