@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,76 @@
1
+ // Build-layer test for commands/deploy.js's dispatch address (#799): the repo a
2
+ // CI dispatch targets comes from the brand's config, never the git remote of
3
+ // whatever repo the target sits in. Inside a brand nested in another repo (a
4
+ // brand inside the framework monorepo) the remote is the ENCLOSING repo, so the
5
+ // dispatch went to a workflow that was never there.
6
+
7
+ const path = require('path');
8
+ const fs = require('fs');
9
+ const os = require('os');
10
+ const defineCases = require('../../../vendor/devkit/test/define-cases.js');
11
+
12
+ const deployPath = path.join(__dirname, '..', '..', '..', 'commands', 'deploy.js');
13
+
14
+ // A brand monorepo with one extension target: config/omega.json5 at the root,
15
+ // the target under targets/, which is what the config walk looks for.
16
+ function stageBrand(config) {
17
+ const brandRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-brand-'));
18
+ const targetDir = path.join(brandRoot, 'targets', 'extension');
19
+ fs.mkdirSync(path.join(brandRoot, 'config'), { recursive: true });
20
+ fs.mkdirSync(targetDir, { recursive: true });
21
+ fs.writeFileSync(path.join(brandRoot, 'config', 'omega.json5'), JSON.stringify(config));
22
+ return { brandRoot, targetDir };
23
+ }
24
+
25
+ function inTarget(targetDir, run) {
26
+ const previous = process.cwd();
27
+ process.chdir(targetDir);
28
+ try {
29
+ return run();
30
+ } finally {
31
+ process.chdir(previous);
32
+ }
33
+ }
34
+
35
+ module.exports = defineCases({
36
+ type: 'suite',
37
+ layer: 'build',
38
+ description: 'deploy — the CI dispatch address comes from config',
39
+ tests: [
40
+ {
41
+ name: 'dispatch address: the CONFIG names the repo, never the enclosing checkout (#799)',
42
+ run: (ctx) => {
43
+ const { dispatchAddress } = require(deployPath);
44
+ const { brandRoot, targetDir } = stageBrand({
45
+ brand: { id: 'acme', name: 'Acme', url: 'https://acme.test' },
46
+ repo: { providers: { github: { org: 'Acme-Org' } } },
47
+ targets: { extension: {} },
48
+ });
49
+
50
+ try {
51
+ // The name is the derived `<brand.id>-omega` default (#809): the config
52
+ // declares an org and no repo of its own.
53
+ ctx.expect(inTarget(targetDir, dispatchAddress)).toEqual({ owner: 'Acme-Org', repo: 'acme-omega' });
54
+ } finally {
55
+ fs.rmSync(brandRoot, { recursive: true, force: true });
56
+ }
57
+ },
58
+ },
59
+ {
60
+ name: 'dispatch address: a config that names no repo REFUSES instead of dispatching somewhere (#799)',
61
+ run: (ctx) => {
62
+ const { dispatchAddress } = require(deployPath);
63
+ const { brandRoot, targetDir } = stageBrand({
64
+ brand: { id: 'acme', name: 'Acme', url: 'https://acme.test' },
65
+ targets: { extension: {} },
66
+ });
67
+
68
+ try {
69
+ ctx.expect(() => inTarget(targetDir, dispatchAddress)).toThrow(/brand repo to dispatch on/);
70
+ } finally {
71
+ fs.rmSync(brandRoot, { recursive: true, force: true });
72
+ }
73
+ },
74
+ },
75
+ ],
76
+ });
@@ -0,0 +1,111 @@
1
+ // Build-layer tests for gulp/tasks/distribute.js — the static-image lane (#259).
2
+ //
3
+ // distribute used to exclude `src/**/*.{jpg,jpeg,png,gif,svg,webp}` "because
4
+ // imagemin handles them", but no imagemin task exists in this framework: a
5
+ // consumer's images never reached dist/ and every project needed a build:pre
6
+ // hook to copy them by hand. Images now copy as-is; the exclusions that DO have
7
+ // an owning task (bundle, sass, the html task) stay.
8
+ //
9
+ // The task module reads its project from cwd at REQUIRE time, so each test
10
+ // stages a temp project, chdirs into it, and requires the task fresh — the same
11
+ // model as package-task.test.js.
12
+
13
+ const path = require('path');
14
+ const fs = require('fs');
15
+ const os = require('os');
16
+ const defineCases = require('../../../vendor/devkit/test/define-cases.js');
17
+
18
+ const SRC = path.join(__dirname, '..', '..', '..');
19
+ const TASK_PATH = path.join(SRC, 'gulp', 'tasks', 'distribute.js');
20
+
21
+ // Stage a temp extension project. `files` is a relative-path → contents map.
22
+ function stageProject(files) {
23
+ const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-distribute-task-'));
24
+
25
+ fs.writeFileSync(path.join(tmp, 'package.json'), `{ "name": "staged-ext", "version": "3.1.4" }`);
26
+
27
+ for (const [relative, contents] of Object.entries(files || {})) {
28
+ const full = path.join(tmp, relative);
29
+ fs.mkdirSync(path.dirname(full), { recursive: true });
30
+ fs.writeFileSync(full, contents);
31
+ }
32
+
33
+ return tmp;
34
+ }
35
+
36
+ // Run `fn(task)` with cwd pinned to `dir` and the task module loaded fresh.
37
+ async function inProject(dir, fn) {
38
+ const oldCwd = process.cwd();
39
+ const flush = () => {
40
+ for (const key of Object.keys(require.cache)) {
41
+ if (key.startsWith(SRC + path.sep)) delete require.cache[key];
42
+ }
43
+ };
44
+
45
+ flush();
46
+ try {
47
+ process.chdir(dir);
48
+ return await fn(require(TASK_PATH));
49
+ } finally {
50
+ process.chdir(oldCwd);
51
+ flush();
52
+ }
53
+ }
54
+
55
+ module.exports = defineCases({
56
+ type: 'group',
57
+ layer: 'build',
58
+ description: 'distribute task — the static-image lane',
59
+ tests: [
60
+ {
61
+ name: 'consumer images reach dist/ byte-for-byte (no build:pre copy hook needed)',
62
+ run: async (ctx) => {
63
+ // A real PNG header — proves the bytes survive the stream untouched
64
+ const png = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x01]);
65
+ const tmp = stageProject({
66
+ 'src/manifest.json': `{ manifest_version: 3, name: 'Staged' }`,
67
+ 'src/assets/images/mascot.png': png,
68
+ 'src/assets/images/logo.svg': '<svg xmlns="http://www.w3.org/2000/svg"></svg>',
69
+ });
70
+
71
+ try {
72
+ await inProject(tmp, async (task) => {
73
+ await task.distribute();
74
+
75
+ const mascot = path.join(tmp, 'dist', 'assets', 'images', 'mascot.png');
76
+ ctx.expect(fs.existsSync(mascot)).toBe(true);
77
+ ctx.expect(fs.readFileSync(mascot).equals(png)).toBe(true);
78
+ ctx.expect(fs.existsSync(path.join(tmp, 'dist', 'assets', 'images', 'logo.svg'))).toBe(true);
79
+ });
80
+ } finally {
81
+ fs.rmSync(tmp, { recursive: true, force: true });
82
+ }
83
+ },
84
+ },
85
+ {
86
+ name: 'the exclusions with an owning task stay excluded (js, scss, views html)',
87
+ run: async (ctx) => {
88
+ const tmp = stageProject({
89
+ 'src/manifest.json': `{ manifest_version: 3, name: 'Staged' }`,
90
+ 'src/assets/js/components/popup/index.js': `// the bundle task owns this\n`,
91
+ 'src/assets/css/main.scss': `// the sass task owns this\n`,
92
+ 'src/views/popup/index.html': `<!-- the html task owns this -->\n`,
93
+ });
94
+
95
+ try {
96
+ await inProject(tmp, async (task) => {
97
+ await task.distribute();
98
+
99
+ ctx.expect(fs.existsSync(path.join(tmp, 'dist', 'assets', 'js', 'components', 'popup', 'index.js'))).toBe(false);
100
+ ctx.expect(fs.existsSync(path.join(tmp, 'dist', 'assets', 'css', 'main.scss'))).toBe(false);
101
+ ctx.expect(fs.existsSync(path.join(tmp, 'dist', 'views', 'popup', 'index.html'))).toBe(false);
102
+ // …and the manifest, which no other task copies, still lands
103
+ ctx.expect(fs.existsSync(path.join(tmp, 'dist', 'manifest.json'))).toBe(true);
104
+ });
105
+ } finally {
106
+ fs.rmSync(tmp, { recursive: true, force: true });
107
+ }
108
+ },
109
+ },
110
+ ],
111
+ });
@@ -0,0 +1,141 @@
1
+ // ensure-target + deploy-precheck — the two halves `omega setup` used to be
2
+ // ([#675](https://github.com/Omega-JS-Stack/omega/issues/675)): the local half
3
+ // runs on every verb and is idempotent, the network half is a deploy precheck
4
+ // with one opt-out flag.
5
+ //
6
+ // The fixture is a real consumer manifest that already satisfies the peer
7
+ // dependencies, so nothing installs — a satisfied target installing nothing is
8
+ // exactly what makes ensureTarget safe on every verb.
9
+
10
+ const path = require('path');
11
+ const fs = require('fs');
12
+ const os = require('os');
13
+ const jetpack = require('fs-jetpack');
14
+
15
+ const SRC = path.join(__dirname, '..', '..', '..');
16
+ const Manager = require(path.join(SRC, 'build.js'));
17
+ const { ensureTarget } = require(path.join(SRC, 'commands', 'lib', 'ensure-target.js'));
18
+ const { deployPrecheck } = require(path.join(SRC, 'commands', 'lib', 'deploy-precheck.js'));
19
+ const cli = require(path.join(SRC, 'cli.js'));
20
+ const defineCases = require('../../../vendor/devkit/test/define-cases.js');
21
+
22
+ const package = Manager.getPackage('main');
23
+
24
+ // A consumer whose peer deps are already satisfied — the steady state.
25
+ function stageConsumer() {
26
+ const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-ensure-'));
27
+ const devDependencies = { [package.name]: `^${package.version}` };
28
+ for (const [name, ver] of Object.entries(package.peerDependencies || {})) {
29
+ devDependencies[name] = ver;
30
+ }
31
+ jetpack.write(path.join(tmp, 'package.json'), `${JSON.stringify({ name: 'staged-app', version: '1.0.0', devDependencies }, null, 2)}\n`);
32
+ return tmp;
33
+ }
34
+
35
+ module.exports = defineCases({
36
+ type: 'group',
37
+ layer: 'build',
38
+ description: 'ensure-target — the local half every verb runs (#675)',
39
+ tests: [
40
+ {
41
+ name: 'writes on a fresh target, no-op on the rerun',
42
+ run: async (ctx) => {
43
+ const tmp = stageConsumer();
44
+
45
+ try {
46
+ const first = await ensureTarget({ projectDir: tmp });
47
+
48
+ ctx.expect(first.written.length > 0).toBe(true);
49
+ ctx.expect(first.changed.some((line) => line.startsWith('package.json'))).toBe(true);
50
+ // No `.env` scaffolds ([#678](https://github.com/Omega-JS-Stack/omega/issues/678)):
51
+ // a target .env is a human-only override; keys live in the brand root .env.
52
+ ctx.expect(jetpack.exists(path.join(tmp, '.env'))).toBe(false);
53
+
54
+ const manifest = jetpack.read(path.join(tmp, 'package.json'), 'json');
55
+ ctx.expect(manifest.private).toBe(true);
56
+ // The synced scripts never mention the retired command
57
+ ctx.expect(JSON.stringify(manifest.scripts).includes('omega setup')).toBe(false);
58
+
59
+ // The rerun adds nothing and syncs nothing. (One caveat, pre-existing
60
+ // and named in `merged`: config/omega.json5 is copied verbatim on the
61
+ // fresh pass and re-emitted in the defaults-merge's normalized form on
62
+ // the next one, so it converges on pass three.)
63
+ const second = await ensureTarget({ projectDir: tmp });
64
+ ctx.expect(second.written).toEqual([]);
65
+ ctx.expect(second.changed).toEqual([]);
66
+
67
+ const third = await ensureTarget({ projectDir: tmp });
68
+ ctx.expect(third).toEqual({ written: [], merged: [], changed: [] });
69
+ } finally {
70
+ fs.rmSync(tmp, { recursive: true, force: true });
71
+ }
72
+ },
73
+ },
74
+ {
75
+ name: 'refuses a workspace root, loudly, without writing a single file (#699)',
76
+ run: async (ctx) => {
77
+ // The accident: `omega deploy` at a workspace root scaffolded a whole
78
+ // extension target into it — src/, hooks/, workflows, rewritten root
79
+ // scripts — before failing anyway. Parity with the same case in
80
+ // @omega.js/desktop's suite (#706).
81
+ const tmp = stageConsumer();
82
+ const manifestPath = path.join(tmp, 'package.json');
83
+ const manifest = jetpack.read(manifestPath, 'json');
84
+ manifest.workspaces = ['packages/*'];
85
+ jetpack.write(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
86
+ const before = jetpack.read(manifestPath);
87
+
88
+ try {
89
+ let refusal = null;
90
+ try {
91
+ await ensureTarget({ projectDir: tmp });
92
+ } catch (e) {
93
+ refusal = e;
94
+ }
95
+
96
+ ctx.expect(refusal).toBeTruthy();
97
+ ctx.expect(refusal.message).toMatch(/refusing to scaffold into/);
98
+ ctx.expect(refusal.message).toMatch(/declares "workspaces"/);
99
+ ctx.expect(refusal.message.includes(tmp)).toBe(true);
100
+
101
+ // Nothing scaffolded, and the manifest is byte-identical.
102
+ ctx.expect(jetpack.list(tmp)).toEqual(['package.json']);
103
+ ctx.expect(jetpack.read(manifestPath)).toBe(before);
104
+ } finally {
105
+ fs.rmSync(tmp, { recursive: true, force: true });
106
+ }
107
+ },
108
+ },
109
+ {
110
+ name: 'deploy precheck: --no-secrets skips every step, bare deploy runs it',
111
+ run: async (ctx) => {
112
+ const quiet = { log() {}, warn() {}, error() {} };
113
+ const ran = [];
114
+ const steps = [{ name: 'framework-freshness', run: () => { ran.push('framework-freshness'); } }];
115
+
116
+ const skipped = await deployPrecheck({ projectDir: '/tmp/x', options: { secrets: false }, logger: quiet, steps });
117
+ ctx.expect(skipped).toEqual({ skipped: 'opt-out' });
118
+ ctx.expect(ran).toEqual([]);
119
+
120
+ const result = await deployPrecheck({ projectDir: '/tmp/x', options: {}, logger: quiet, steps });
121
+ ctx.expect(ran).toEqual(['framework-freshness']);
122
+ ctx.expect(result.ran).toEqual(ran);
123
+ },
124
+ },
125
+ {
126
+ name: 'cli: no `setup` command, a bare invocation resolves to help, migrate stays its own command',
127
+ run: (ctx) => {
128
+ const { commandsDir, aliases, defaultCommand } = cli.config;
129
+
130
+ ctx.expect(defaultCommand).toBe('help');
131
+ ctx.expect('setup' in aliases).toBe(false);
132
+ ctx.expect(jetpack.exists(path.join(commandsDir, 'setup.js'))).toBe(false);
133
+
134
+ // The one-time hook-layout migration is a deliberate verb, not a step
135
+ // every build repeats.
136
+ ctx.expect(Boolean(aliases.migrate)).toBe(true);
137
+ ctx.expect(jetpack.exists(path.join(commandsDir, 'migrate.js'))).toBeTruthy();
138
+ },
139
+ },
140
+ ],
141
+ });
@@ -0,0 +1,239 @@
1
+ // The env schema is the ONE declaration of how a key reaches the extension
2
+ // ([#627](https://github.com/Omega-JS-Stack/omega/issues/627)): the publish
3
+ // workflow's secrets block, the build's bake list, and `omega deploy`'s
4
+ // push-secrets step all read `delivery: { extension: … }` and nothing else.
5
+ // Before this, each of the three carried its own hand-kept list and they drifted
6
+ // (the #582 fix had to be made in the workflow by hand, one key at a time).
7
+ //
8
+ // Offline by construction: the scaffold writes into a temp dir and the `gh`/
9
+ // `git` boundaries are injected — no network, no real repo.
10
+
11
+ const path = require('path');
12
+ const fs = require('fs');
13
+ const os = require('os');
14
+
15
+ const { publishSecretKeys, bakeKeys, renderSecretsBlock, WORKFLOW_OWNED_KEYS } = require('../../../vendor/config/env-delivery.js');
16
+
17
+ const SRC = path.join(__dirname, '..', '..', '..');
18
+ const { scaffoldDefaults } = require(path.join(SRC, 'gulp', 'tasks', 'defaults.js'));
19
+ // The bake seam is the BUNDLE's since #743 — the snapshot is baked into every
20
+ // emitted bundle, so the schema's bake list and its guard live with it.
21
+ const bundleTask = require(path.join(SRC, 'gulp', 'tasks', 'bundle.js'));
22
+ const { publishEnvSecrets } = require(path.join(SRC, 'commands', 'lib', 'push-secrets.js'));
23
+ const { STEPS } = require(path.join(SRC, 'commands', 'lib', 'deploy-precheck.js'));
24
+ const defineCases = require('../../../vendor/devkit/test/define-cases.js');
25
+
26
+ const quiet = { log() {}, warn() {}, error() {} };
27
+
28
+ /** A temp target dir, optionally with a local-level .env. */
29
+ function tmpTarget(env) {
30
+ const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-env-delivery-'));
31
+ if (env !== undefined) fs.writeFileSync(path.join(tmp, '.env'), env);
32
+ return tmp;
33
+ }
34
+
35
+ /** Declare the brand's own GitHub repo — the publish precondition. */
36
+ function declareRepo(dir, slug) {
37
+ fs.mkdirSync(path.join(dir, 'config'), { recursive: true });
38
+ fs.writeFileSync(path.join(dir, 'config', 'omega.json5'), [
39
+ '{',
40
+ " brand: { id: 'my-brand', name: 'My Brand', url: 'https://my.brand' },",
41
+ ` repo: { providers: { github: { repo: '${slug}' } } },`,
42
+ ' targets: { extension: {} },',
43
+ '}',
44
+ ].join('\n'));
45
+ }
46
+
47
+ module.exports = defineCases({
48
+ type: 'group',
49
+ layer: 'build',
50
+ description: 'env delivery (#627) — the workflow block, the bake list, and push-secrets from ONE schema',
51
+ tests: [
52
+ {
53
+ name: 'the publish workflow renders the schema block — every CI key, no token left (#627, #582)',
54
+ run: (ctx) => {
55
+ const tmp = tmpTarget();
56
+
57
+ try {
58
+ scaffoldDefaults({ outputDir: tmp });
59
+ const workflow = fs.readFileSync(path.join(tmp, '.github', 'workflows', 'publish.yml'), 'utf8');
60
+
61
+ ctx.expect(workflow.includes('[ githubSecrets ]')).toBe(false);
62
+ for (const key of publishSecretKeys('extension').filter((k) => !WORKFLOW_OWNED_KEYS.includes(k))) {
63
+ ctx.expect(workflow).toContain(`\n ${key}: \${{ secrets.${key} }}`);
64
+ }
65
+
66
+ // #582's pin, now schema-derived: a dispatched CI run has no `.env`,
67
+ // so the Measurement Protocol secret only reaches the build through
68
+ // this block — without it every published extension baked an empty
69
+ // secret and sent no events, silently.
70
+ ctx.expect(workflow).toContain('GOOGLE_ANALYTICS_SECRET: ${{ secrets.GOOGLE_ANALYTICS_SECRET }}');
71
+
72
+ // GITHUB_TOKEN is the runner's own, not a schema key — still literal.
73
+ ctx.expect(workflow).toContain('GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}');
74
+ } finally {
75
+ fs.rmSync(tmp, { recursive: true, force: true });
76
+ }
77
+ },
78
+ },
79
+ {
80
+ name: 'the rendered block is the config renderer\'s, byte for byte',
81
+ run: (ctx) => {
82
+ const tmp = tmpTarget();
83
+
84
+ try {
85
+ scaffoldDefaults({ outputDir: tmp });
86
+ const workflow = fs.readFileSync(path.join(tmp, '.github', 'workflows', 'publish.yml'), 'utf8');
87
+
88
+ ctx.expect(workflow).toContain(` ${renderSecretsBlock('extension', { indent: ' ' })}\n`);
89
+ } finally {
90
+ fs.rmSync(tmp, { recursive: true, force: true });
91
+ }
92
+ },
93
+ },
94
+ {
95
+ name: 'the build bakes exactly the schema\'s bake list, valued from the build env',
96
+ run: (ctx) => {
97
+ // The hardcoded `process.env.GOOGLE_ANALYTICS_SECRET` read is gone: the
98
+ // key set is the schema's, so a new baked key is one schema entry.
99
+ ctx.expect(bundleTask.BAKED_KEYS).toEqual(bakeKeys('extension'));
100
+ ctx.expect(bundleTask.BAKED_KEYS).toEqual(['GOOGLE_ANALYTICS_SECRET']);
101
+
102
+ const saved = process.env.GOOGLE_ANALYTICS_SECRET;
103
+ try {
104
+ process.env.GOOGLE_ANALYTICS_SECRET = 'fixture-mp-secret';
105
+ ctx.expect(bundleTask.readBakedEnv().GOOGLE_ANALYTICS_SECRET).toBe('fixture-mp-secret');
106
+
107
+ delete process.env.GOOGLE_ANALYTICS_SECRET;
108
+ // Absent is the empty string, never undefined — the baked snapshot is
109
+ // JSON and a missing key would read as "no analytics config at all".
110
+ ctx.expect(bundleTask.readBakedEnv().GOOGLE_ANALYTICS_SECRET).toBe('');
111
+ } finally {
112
+ if (saved === undefined) delete process.env.GOOGLE_ANALYTICS_SECRET;
113
+ else process.env.GOOGLE_ANALYTICS_SECRET = saved;
114
+ }
115
+ },
116
+ },
117
+ {
118
+ name: 'the bake REFUSES a configured stream with no secret in build mode, warns in development (#626)',
119
+ run: (ctx) => {
120
+ // #582's failure mode, guarded at the seam it happens: a CI publish
121
+ // runs with no `.env`, so a brand with a GA4 stream id and no
122
+ // Measurement Protocol secret baked an empty string and shipped an
123
+ // extension that sent no events — silently, forever.
124
+ const configured = { analytics: { providers: { google: { id: 'G-FIXTURE' } } } };
125
+ let thrown = null;
126
+ try {
127
+ bundleTask.readBakedEnv({}, { config: configured, build: true, logger: quiet });
128
+ } catch (e) {
129
+ thrown = e;
130
+ }
131
+
132
+ ctx.expect(thrown === null).toBe(false);
133
+ // The BRAND-level key a human sets, and the config path that owes it.
134
+ ctx.expect(thrown.message).toContain('GOOGLE_ANALYTICS_SECRET_EXTENSION');
135
+ ctx.expect(thrown.message).toContain('analytics.providers.google.id');
136
+
137
+ // Development warns and keeps going — a half-configured brand is a
138
+ // normal step on the way to a configured one.
139
+ const said = [];
140
+ const loud = { log() {}, warn: (m) => said.push(m), error() {} };
141
+ const baked = bundleTask.readBakedEnv({}, { config: configured, build: false, logger: loud });
142
+ ctx.expect(baked.GOOGLE_ANALYTICS_SECRET).toBe('');
143
+ ctx.expect(said.join('\n')).toContain('GOOGLE_ANALYTICS_SECRET_EXTENSION');
144
+
145
+ // The secret under its DELIVERED name is the value the build holds.
146
+ ctx.expect(bundleTask.readBakedEnv({ GOOGLE_ANALYTICS_SECRET: 'shh' }, { config: configured, build: true, logger: quiet }).GOOGLE_ANALYTICS_SECRET)
147
+ .toBe('shh');
148
+
149
+ // No stream configured, nothing owed.
150
+ ctx.expect(bundleTask.readBakedEnv({}, { config: {}, build: true, logger: quiet }).GOOGLE_ANALYTICS_SECRET).toBe('');
151
+ },
152
+ },
153
+ {
154
+ name: 'push-secrets publishes the schema set, valued from the composed env, on stdin',
155
+ run: (ctx) => {
156
+ const tmp = tmpTarget('CHROME_CLIENT_ID=chrome-id\nGOOGLE_ANALYTICS_SECRET_EXTENSION=mp-secret\nMY_CUSTOM_THING=custom\n');
157
+ declareRepo(tmp, 'acme/ext');
158
+ const gh = [];
159
+
160
+ try {
161
+ const result = publishEnvSecrets({
162
+ targetDir: tmp,
163
+ logger: quiet,
164
+ env: {},
165
+ gitExecFn: () => 'git@github.com:acme/ext.git\n',
166
+ execFn: (file, args, options) => { gh.push({ file, args, input: options.input }); return ''; },
167
+ });
168
+
169
+ // The brand-level GOOGLE_ANALYTICS_SECRET_EXTENSION lands under its
170
+ // DELIVERED name; the undeclared key is nobody's secret.
171
+ ctx.expect(result.published).toEqual(['CHROME_CLIENT_ID', 'GOOGLE_ANALYTICS_SECRET']);
172
+ ctx.expect(gh.map((c) => c.args.join(' '))).toEqual([
173
+ 'auth status',
174
+ 'secret set CHROME_CLIENT_ID --repo acme/ext',
175
+ 'secret set GOOGLE_ANALYTICS_SECRET --repo acme/ext',
176
+ ]);
177
+ ctx.expect(gh.slice(1).map((c) => c.input)).toEqual(['chrome-id', 'mp-secret']);
178
+ } finally {
179
+ fs.rmSync(tmp, { recursive: true, force: true });
180
+ }
181
+ },
182
+ },
183
+ {
184
+ name: 'push-secrets skips LOUDLY on CI, an empty cascade, no remote, and a stranger\'s repo',
185
+ run: (ctx) => {
186
+ const noGh = () => { throw new Error('gh must not run'); };
187
+ const messages = [];
188
+ const loud = { log: (m) => messages.push(m), warn: (m) => messages.push(m), error: (m) => messages.push(m) };
189
+
190
+ const empty = tmpTarget('MY_CUSTOM_THING=custom\n');
191
+ declareRepo(empty, 'acme/ext');
192
+
193
+ try {
194
+ ctx.expect(publishEnvSecrets({ targetDir: empty, logger: loud, env: { CI: 'true' }, execFn: noGh, gitExecFn: noGh }))
195
+ .toEqual({ skipped: 'ci' });
196
+
197
+ ctx.expect(publishEnvSecrets({ targetDir: empty, logger: loud, env: {}, execFn: noGh, gitExecFn: noGh }))
198
+ .toEqual({ skipped: 'no-secrets' });
199
+
200
+ const keyed = tmpTarget('CHROME_CLIENT_ID=chrome-id\n');
201
+ declareRepo(keyed, 'acme/ext');
202
+ ctx.expect(publishEnvSecrets({
203
+ targetDir: keyed,
204
+ logger: loud,
205
+ env: {},
206
+ execFn: noGh,
207
+ gitExecFn: () => { throw new Error('fatal: no such remote'); },
208
+ })).toEqual({ skipped: 'no-remote' });
209
+
210
+ // The enclosing checkout is not the brand's repo — never arm a
211
+ // stranger's Actions with this brand's store credentials.
212
+ ctx.expect(publishEnvSecrets({
213
+ targetDir: keyed,
214
+ logger: loud,
215
+ env: {},
216
+ execFn: noGh,
217
+ gitExecFn: () => 'git@github.com:Omega-JS-Stack/omega.git\n',
218
+ })).toEqual({ skipped: 'repo-mismatch' });
219
+
220
+ fs.rmSync(keyed, { recursive: true, force: true });
221
+
222
+ const said = messages.join('\n');
223
+ ctx.expect(said).toContain('CI already has the repo secrets');
224
+ ctx.expect(said).toContain('no keys composed for this target');
225
+ ctx.expect(said).toContain('no GitHub remote');
226
+ ctx.expect(said).toContain("this brand's repo is acme/ext");
227
+ } finally {
228
+ fs.rmSync(empty, { recursive: true, force: true });
229
+ }
230
+ },
231
+ },
232
+ {
233
+ name: 'the deploy precheck runs push-secrets after the freshness check (#680)',
234
+ run: (ctx) => {
235
+ ctx.expect(STEPS.map((step) => step.name)).toEqual(['framework-freshness', 'push-secrets']);
236
+ },
237
+ },
238
+ ],
239
+ });
@@ -0,0 +1,86 @@
1
+ // The dev lane treats the whole `.env` chain as a watch input
2
+ // ([#681](https://github.com/Omega-JS-Stack/omega/issues/681)).
3
+ //
4
+ // The backend's stage watch already did — an edit to the brand root's .env
5
+ // re-stages and the running emulator sees it — while the extension's gulp read
6
+ // the cascade once at boot and never noticed an edit. This pins the PATH
7
+ // RESOLUTION the `serve` task wires up (the same level the backend's
8
+ // stage-watch test pins): every layer of the chain, and each layer's
9
+ // `.env.<environment>` overlay (#586).
10
+ //
11
+ // Offline by construction: temp dirs and path resolution only, and the watcher
12
+ // is closed before the case returns.
13
+
14
+ const path = require('path');
15
+ const fs = require('fs');
16
+ const os = require('os');
17
+ const jetpack = require('fs-jetpack');
18
+
19
+ const SRC = path.join(__dirname, '..', '..', '..');
20
+ const serveTask = require(path.join(SRC, 'gulp', 'tasks', 'serve.js'));
21
+ const defineCases = require('../../../vendor/devkit/test/define-cases.js');
22
+
23
+ // An extension target inside a brand monorepo, with a company root above it:
24
+ // <root>/company/.env, <root>/brand/.env, <root>/brand/targets/extension/.
25
+ function seedBrand() {
26
+ const root = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'extension-env-watch-')));
27
+ const companyRoot = path.join(root, 'company');
28
+ const brandRoot = path.join(root, 'brand');
29
+ const targetDir = path.join(brandRoot, 'targets', 'extension');
30
+
31
+ jetpack.write(path.join(companyRoot, '.env'), '');
32
+ jetpack.write(path.join(brandRoot, '.omega', 'company.json'), JSON.stringify({ root: companyRoot }));
33
+ jetpack.write(path.join(brandRoot, 'config', 'omega.json5'), '{ brand: { id: "fixture" }, targets: { extension: {} } }');
34
+ jetpack.dir(targetDir);
35
+
36
+ return { root, companyRoot, brandRoot, targetDir };
37
+ }
38
+
39
+ module.exports = defineCases({
40
+ type: 'group',
41
+ layer: 'build',
42
+ description: 'env-watch (#681) — the dev lane watches every layer of the .env chain',
43
+ tests: [
44
+ {
45
+ name: 'the serve watcher lists company, brand and target — overlays included',
46
+ run: (ctx) => {
47
+ const { root, companyRoot, brandRoot, targetDir } = seedBrand();
48
+ const watcher = serveTask.watchEnvSources(targetDir, { environment: 'development' });
49
+
50
+ try {
51
+ ctx.expect(watcher.inputs.map((input) => input.path)).toEqual([
52
+ path.join(companyRoot, '.env'),
53
+ path.join(companyRoot, '.env.development'),
54
+ path.join(brandRoot, '.env'),
55
+ path.join(brandRoot, '.env.development'),
56
+ path.join(targetDir, '.env'),
57
+ path.join(targetDir, '.env.development'),
58
+ ]);
59
+ ctx.expect(watcher.inputs.map((input) => input.layer)).toEqual([
60
+ 'company', 'company', 'brand', 'brand', 'target', 'target',
61
+ ]);
62
+ } finally {
63
+ watcher.close();
64
+ fs.rmSync(root, { recursive: true, force: true });
65
+ }
66
+ },
67
+ },
68
+ {
69
+ name: 'a standalone target watches only its own .env layer',
70
+ run: (ctx) => {
71
+ const root = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'extension-env-watch-solo-')));
72
+ const watcher = serveTask.watchEnvSources(root, { environment: 'development' });
73
+
74
+ try {
75
+ ctx.expect(watcher.inputs.map((input) => input.path)).toEqual([
76
+ path.join(root, '.env'),
77
+ path.join(root, '.env.development'),
78
+ ]);
79
+ } finally {
80
+ watcher.close();
81
+ fs.rmSync(root, { recursive: true, force: true });
82
+ }
83
+ },
84
+ },
85
+ ],
86
+ });