@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,1078 @@
1
+ /**
2
+ * Canonical schema for the .env cascade — pure data, no logic
3
+ * ([#581](https://github.com/Omega-JS-Stack/omega/issues/581)).
4
+ *
5
+ * The omega.json5 sibling of schema.js: ONE place that says which env keys
6
+ * OMEGA needs, who owns each, which targets read it, whether OMEGA mints it
7
+ * or a human pastes it from a third party, whether it is required, and what
8
+ * it does. Everything that used to hand-keep its own list derives from here —
9
+ * the manager's mint lane (the keys with a `generated` function), its
10
+ * canonical .env grouping, the per-verb target delivery (composeTargetEnv in
11
+ * env.js), and the backend's env reader (libraries/env.js), which refuses to
12
+ * boot without a required key.
13
+ *
14
+ * Entry format mirrors schema.js's rule objects:
15
+ *
16
+ * {
17
+ * name: 'OMEGA_ADMIN_KEY', // the env var (SCREAMING_SNAKE)
18
+ * match: /^CONNECTIONS_.+$/, // …or a pattern, for dynamic families
19
+ * owner: 'workspace', // the manager service that owns it
20
+ * // ('backend' = the framework itself)
21
+ * targets: ['backend'], // the targets whose runtime READS it
22
+ * group: 'omega', // its ENV_GROUPS bucket (file order)
23
+ * generated: () => randomBytes(32)…, // the function that MINTS a value
24
+ * default: 'value', // …or a static default, where one applies
25
+ * secret: true, // never printed, never in omega.json5
26
+ * required: true, // absent = the backend refuses to boot
27
+ * deliverAs: 'GOOGLE_ANALYTICS_SECRET', // the name it lands under in the
28
+ * // target's composed .env (see below)
29
+ * delivery: { backend: 'env' }, // HOW it reaches each target
30
+ * publicAtRest: true, // …and, for a bake, that anyone who
31
+ * // unpacks the app may read it
32
+ * requiredWhen: 'analytics.providers.google.id', // the config path that
33
+ * // makes it mandatory
34
+ * machineLocal: true, // a developer-machine value (a local
35
+ * // path): never published to CI
36
+ * description: 'What the key drives.',
37
+ * }
38
+ *
39
+ * `generated:` is the mint switch: the manager writes those keys into a brand
40
+ * .env (at onboard and on every manage that finds one missing) because no
41
+ * dashboard exists to paste them from. Everything else is a third-party
42
+ * credential a human provides. A key is minted OR defaulted, never both, and
43
+ * only a key OMEGA can produce may be `required` — refusing every boot over a
44
+ * secret nobody can mint would be a hostage note, not a guard.
45
+ *
46
+ * `targets:` is the composition domain: composeTargetEnv (env.js) composes a
47
+ * target's own .env from the company/brand layers' keys whose targets include
48
+ * it — the backend's is the ONLY one that ships with a deploy artifact and so
49
+ * cannot walk up to the brand layer at runtime. Every other target reads brand
50
+ * values through the runtime cascade, so their `targets` entries are mostly
51
+ * documentation.
52
+ *
53
+ * `group:` picks the .env section the key renders into. A group with
54
+ * `file: false` never reaches a brand .env at all — the backend resolves those
55
+ * keys some other way (from config at boot, from the target's own .env, from
56
+ * the developer's own shell) — so they are neither rendered as placeholders
57
+ * nor composed from the brand layer.
58
+ *
59
+ * `deliverAs:` is the RENAME on delivery: the key is written into a brand .env
60
+ * under its own name (the per-target GA4 secrets are `GOOGLE_ANALYTICS_SECRET_
61
+ * <TARGET>` there, because one brand holds one per stream) and reaches its
62
+ * target under `deliverAs` (`GOOGLE_ANALYTICS_SECRET` — a target only ever has
63
+ * one stream). applyDeliverAs (env.js) is the one place it happens, on every
64
+ * verb: composed into dist/.env for the backend, loaded into process.env at
65
+ * CLI boot for the others. Absent = delivered under its own name.
66
+ *
67
+ * A key that must differ between a local run and a deployed one is NOT a second
68
+ * entry here ([#586](https://github.com/Omega-JS-Stack/omega/issues/586)): one
69
+ * key, and the brand's `.env.<environment>` overlay carries the other value.
70
+ * The schema declares WHAT a brand supplies, never which environment supplies
71
+ * it — env.js's cascade owns that.
72
+ *
73
+ * `delivery:` is HOW the key reaches each target it names — the declaration
74
+ * that replaced three unrelated hand-kept lists
75
+ * ([#627](https://github.com/Omega-JS-Stack/omega/issues/627)):
76
+ *
77
+ * - `'env'` — read from the composed .env at runtime (the backend, the one
78
+ * target whose artifact ships an env file).
79
+ * - `'ci'` — the generated workflow injects it into the runner env for the
80
+ * build step.
81
+ * - `'bake'` — the build writes the value INTO the shipped artifact, because
82
+ * a packaged app (desktop, extension) runs with no .env. A bake
83
+ * implies its `'ci'` half: the workflow injects, then the build
84
+ * bakes. Anyone who unpacks the app can read a baked value, so
85
+ * a baking entry must declare `publicAtRest: true` — the
86
+ * renderer REFUSES to bake a `secret: true` entry without it.
87
+ *
88
+ * A target absent from `delivery` gets nothing: no workflow line, no bake, no
89
+ * repo secret. env-delivery.js is the ONE reader — every workflow secrets
90
+ * block, bake list and push-secrets set derives from these declarations, so a
91
+ * new key is one entry here and nothing else.
92
+ *
93
+ * `requiredWhen:` is the CONDITIONAL requirement
94
+ * ([#626](https://github.com/Omega-JS-Stack/omega/issues/626)): a dotted
95
+ * omega.json5 path whose truthy value makes the key mandatory (a GA4
96
+ * Measurement ID with no Measurement Protocol secret ships a build that sends
97
+ * no events, silently). One-directional and PRESENCE ONLY — never a check on
98
+ * the value's shape. checkEnvRules (env-rules.js) is the ONE evaluator of it
99
+ * and of `required`; consumers decide the severity.
100
+ */
101
+ const { randomBytes, randomUUID } = require('node:crypto');
102
+
103
+ // The three ways a key reaches a target (#627) — see the header.
104
+ const DELIVERY_MODES = ['env', 'ci', 'bake'];
105
+
106
+ // One entry per .env section, in canonical file order — the manager's
107
+ // canonical-order lane renders from this list. `comment` is the boxed header,
108
+ // `notes` are the plain comment lines under it, `file: false` marks a group
109
+ // that is schema-only (see the header).
110
+ const ENV_GROUPS = [
111
+ // The license leads the file: it is the one key a human pastes before anything
112
+ // else runs, so it is the first line a brand owner reads (#320, Ian 2026-09-09).
113
+ {
114
+ id: 'license',
115
+ comment: 'OMEGA license — your omegajs.dev account API key; a keyless brand runs with payments gated and omega attribution shown',
116
+ },
117
+ {
118
+ id: 'omega',
119
+ comment: 'Omega keys (auto-generated — minted at scaffold, and by manage when absent; rotate by replacing the value)',
120
+ notes: [
121
+ 'Admin key: grants admin on your backend. Webhook key: authenticates third-party',
122
+ 'webhook deliveries. Namespace: the brand UUID namespace for deterministic ids.',
123
+ 'Unsubscribe key: signs the unsubscribe link in every email the backend sends.',
124
+ ],
125
+ },
126
+ { id: 'github', comment: 'GitHub (repo + seo services) — `gh auth login` works instead of a token' },
127
+ { id: 'cloudflare', comment: 'Cloudflare (edge service + every DNS-writing flow) — API token with Zone edit' },
128
+ { id: 'namecheap', comment: 'Namecheap registrar (domain service)' },
129
+ { id: 'google-oauth', comment: 'Google OAuth client (cloud, analytics, search, advertising services)' },
130
+ { id: 'captcha', comment: "Classic reCAPTCHA keys — the brand's own, from its GCP reCAPTCHA console (captcha service)" },
131
+ {
132
+ id: 'pixels',
133
+ comment: 'Pixel access tokens (analytics service; the names @omega.js/backend reads)',
134
+ notes: [
135
+ 'One token per platform: it CREATES the pixel on the ad account',
136
+ '(analytics.providers.{meta,tiktok}.accountId) and signs the conversions it sends.',
137
+ 'Meta: a Business Manager system-user token with ads_management — an interactive',
138
+ '`omega manage` walks you to the page, pastes it in here, and discovers the ad',
139
+ 'account itself. TikTok: set its advertiser id in config first.',
140
+ ],
141
+ },
142
+ { id: 'monitoring', comment: 'Error monitoring (monitoring service, Sentry provider) — a personal auth token with project+team write scopes' },
143
+ { id: 'email-marketing', comment: 'Email marketing (campaigns + newsletter services: SendGrid + Beehiiv)' },
144
+ { id: 'payment', comment: 'Payment providers (payment service; public halves live in omega.json5)' },
145
+ { id: 'service-accounts', comment: 'Operator service accounts (forms/chat/email/server/assets services) — paths to service-account JSON files' },
146
+ { id: 'apple', comment: 'Apple signing (certificates service — desktop/mobile targets)' },
147
+ {
148
+ id: 'desktop-publishing',
149
+ comment: 'Windows signing + Snap Store publishing (desktop target) — the Apple half is its own section above',
150
+ notes: [
151
+ 'Windows: the EV token PIN, the cert thumbprint path and signtool, read by the',
152
+ 'windows-sign CI job. Linux: the snapcraft credentials blob (`snapcraft export-login -`).',
153
+ ],
154
+ },
155
+ {
156
+ id: 'extension-stores',
157
+ comment: 'Extension store publishing (extension target: Chrome Web Store, Firefox Add-ons, Edge Add-ons)',
158
+ },
159
+ { id: 'fontawesome', comment: 'Font Awesome Pro (icons) — path to the local Pro package dir' },
160
+ { id: 'backend-services', comment: 'Backend service keys (composed into targets/backend/dist/.env by the env composer)' },
161
+ {
162
+ id: 'testing',
163
+ comment: 'Test-lane credentials (every target) — optional; a suite that needs one skips without it',
164
+ },
165
+ {
166
+ id: 'machine',
167
+ comment: 'Auto-generated and persisted on the first real run — machine-owned, leave unset',
168
+ notes: [
169
+ 'The GA4 Measurement Protocol secrets are per target (the analytics service resolves',
170
+ "one per stream; the composer delivers each target its own GOOGLE_ANALYTICS_SECRET), and the",
171
+ 'VAPID private key is the half the Firebase console only ever shows you once.',
172
+ ],
173
+ },
174
+ {
175
+ id: 'runtime',
176
+ file: false,
177
+ comment: 'Resolved at runtime, never hand-written into a brand .env',
178
+ },
179
+ ];
180
+
181
+ const ENV_SCHEMA = [
182
+ // ── omega — the keys OMEGA mints for itself ──────────────────────────────
183
+ {
184
+ name: 'OMEGA_ADMIN_KEY',
185
+ owner: 'workspace',
186
+ targets: ['backend', 'desktop'],
187
+ group: 'omega',
188
+ generated: () => randomBytes(32).toString('base64url'),
189
+ secret: true,
190
+ required: true,
191
+ delivery: { backend: 'env' },
192
+ description: 'Grants admin on the brand backend: the header every privileged call carries, and the seed the connection state cipher derives from.',
193
+ },
194
+ {
195
+ name: 'OMEGA_WEBHOOK_KEY',
196
+ owner: 'workspace',
197
+ targets: ['backend'],
198
+ group: 'omega',
199
+ generated: () => randomBytes(32).toString('base64url'),
200
+ secret: true,
201
+ required: true,
202
+ delivery: { backend: 'env' },
203
+ description: 'Authenticates third-party webhook deliveries (payments, marketing) — the `key` query parameter every webhook route compares.',
204
+ },
205
+ {
206
+ name: 'OMEGA_NAMESPACE',
207
+ owner: 'workspace',
208
+ targets: ['backend'],
209
+ group: 'omega',
210
+ generated: () => randomUUID(),
211
+ secret: true,
212
+ required: true,
213
+ delivery: { backend: 'env' },
214
+ description: "The brand's UUID namespace — every deterministic id the backend mints (uuid route, analytics client ids) derives from it.",
215
+ },
216
+ {
217
+ name: 'UNSUBSCRIBE_HMAC_KEY',
218
+ owner: 'workspace',
219
+ targets: ['backend'],
220
+ group: 'omega',
221
+ generated: () => randomBytes(32).toString('hex'),
222
+ secret: true,
223
+ required: true,
224
+ delivery: { backend: 'env' },
225
+ description: 'Signs the unsubscribe link in every email the backend sends, and verifies the signature when a recipient follows one.',
226
+ },
227
+
228
+ // ── the OMEGA license — issued by omegajs.dev, pasted by a human ─────────
229
+ {
230
+ name: 'OMEGA_LICENSE_KEY',
231
+ owner: 'workspace',
232
+ targets: ['web', 'desktop', 'extension'],
233
+ group: 'license',
234
+ secret: true,
235
+ required: false,
236
+ delivery: { web: 'ci', desktop: 'ci', extension: 'ci' },
237
+ description: 'The omegajs.dev account API key that licenses this brand: a deploy checks it with the omega backend and bakes the verdict into the artifact — payments live and no omega attribution, or payments gated and attribution shown. It travels CLI → server at deploy time ONLY: every delivery is `ci` (the three targets whose deploys build on a runner), it never bakes, and the backend — which deploys straight from the CLI — takes no delivery at all, so it can never land in the .env the functions artifact ships with.',
238
+ },
239
+
240
+ // ── third-party credentials, by owning service ───────────────────────────
241
+ {
242
+ name: 'GH_TOKEN',
243
+ owner: 'repo',
244
+ targets: ['web', 'backend', 'desktop'],
245
+ group: 'github',
246
+ secret: true,
247
+ required: false,
248
+ delivery: { web: 'ci', backend: 'env', desktop: 'ci' },
249
+ description: 'GitHub token for repo + seo work and the backend\'s content/admin routes (blog commits, workflow dispatch); the web target publishes CI secrets with it and the desktop target cuts releases and mirrors downloads with it. `gh auth login` serves the manager instead; the deployed backend needs the token.',
250
+ },
251
+ {
252
+ name: 'CLOUDFLARE_TOKEN',
253
+ owner: 'edge',
254
+ targets: ['web', 'backend'],
255
+ group: 'cloudflare',
256
+ secret: true,
257
+ required: false,
258
+ delivery: { web: 'ci', backend: 'env' },
259
+ description: 'Cloudflare API token with Zone edit — the edge service and every DNS-writing flow, plus the backend\'s cache-purge calls. The web build workflow\'s post-publish purge step reads it from the runner env, so the publish lane pushes it as a repo secret.',
260
+ },
261
+ {
262
+ name: 'NAMECHEAP_USERNAME',
263
+ owner: 'domain',
264
+ targets: [],
265
+ group: 'namecheap',
266
+ secret: false,
267
+ required: false,
268
+ description: 'Namecheap account the domain service registers and configures domains through.',
269
+ },
270
+ {
271
+ name: 'NAMECHEAP_API_KEY',
272
+ owner: 'domain',
273
+ targets: [],
274
+ group: 'namecheap',
275
+ secret: true,
276
+ required: false,
277
+ description: 'Namecheap API key paired with NAMECHEAP_USERNAME (the API also allowlists the calling IP).',
278
+ },
279
+ {
280
+ name: 'GOOGLE_CLIENT_ID',
281
+ owner: 'cloud',
282
+ targets: [],
283
+ group: 'google-oauth',
284
+ secret: false,
285
+ required: false,
286
+ description: 'OAuth client the manager authenticates Google APIs with (cloud, analytics, search, advertising services).',
287
+ },
288
+ {
289
+ name: 'GOOGLE_CLIENT_SECRET',
290
+ owner: 'cloud',
291
+ targets: [],
292
+ group: 'google-oauth',
293
+ secret: true,
294
+ required: false,
295
+ description: 'Secret half of GOOGLE_CLIENT_ID.',
296
+ },
297
+ {
298
+ name: 'RECAPTCHA_SITE_KEY',
299
+ owner: 'captcha',
300
+ targets: ['web'],
301
+ group: 'captcha',
302
+ secret: false,
303
+ required: false,
304
+ delivery: { web: 'ci' },
305
+ description: "Public half of the brand's classic reCAPTCHA pair — the web target renders it into forms.",
306
+ },
307
+ {
308
+ name: 'RECAPTCHA_SECRET_KEY',
309
+ owner: 'captcha',
310
+ targets: ['backend'],
311
+ group: 'captcha',
312
+ secret: true,
313
+ required: false,
314
+ requiredWhen: 'captcha.providers.recaptcha.siteKey',
315
+ delivery: { backend: 'env' },
316
+ description: 'Secret half of the reCAPTCHA pair — the backend verifies submitted tokens with it.',
317
+ },
318
+ {
319
+ name: 'HCAPTCHA_SECRET',
320
+ owner: 'captcha',
321
+ targets: ['backend'],
322
+ group: 'captcha',
323
+ secret: true,
324
+ required: false,
325
+ delivery: { backend: 'env' },
326
+ description: 'hCaptcha secret for brands on hCaptcha instead of reCAPTCHA — the backend verifies form submissions with it.',
327
+ },
328
+ {
329
+ name: 'META_ACCESS_TOKEN',
330
+ owner: 'analytics',
331
+ targets: ['backend'],
332
+ group: 'pixels',
333
+ secret: true,
334
+ required: false,
335
+ delivery: { backend: 'env' },
336
+ description: 'Business Manager system-user token with ads_management: creates the Meta pixel and signs the conversions the backend sends.',
337
+ },
338
+ {
339
+ name: 'TIKTOK_ACCESS_TOKEN',
340
+ owner: 'analytics',
341
+ targets: ['backend'],
342
+ group: 'pixels',
343
+ secret: true,
344
+ required: false,
345
+ delivery: { backend: 'env' },
346
+ description: 'TikTok Business token: creates the pixel on the advertiser account and signs the events the backend sends.',
347
+ },
348
+ {
349
+ name: 'SENTRY_AUTH_TOKEN',
350
+ owner: 'monitoring',
351
+ targets: [],
352
+ group: 'monitoring',
353
+ secret: true,
354
+ required: false,
355
+ requiredWhen: 'monitoring.providers.sentry.dsn',
356
+ description: 'Personal Sentry auth token with project+team write scopes — the monitoring service provisions projects and uploads source maps with it.',
357
+ },
358
+ {
359
+ name: 'SENDGRID_API_KEY',
360
+ owner: 'campaigns',
361
+ targets: ['backend'],
362
+ group: 'email-marketing',
363
+ secret: true,
364
+ required: false,
365
+ delivery: { backend: 'env' },
366
+ description: 'SendGrid API key — every transactional and campaign email the backend sends, and the contact lists the campaigns service reconciles.',
367
+ },
368
+ {
369
+ name: 'BEEHIIV_API_KEY',
370
+ owner: 'newsletter',
371
+ targets: ['backend'],
372
+ group: 'email-marketing',
373
+ secret: true,
374
+ required: false,
375
+ delivery: { backend: 'env' },
376
+ description: 'Beehiiv API key — newsletter subscriptions and the publication the newsletter service reconciles.',
377
+ },
378
+ {
379
+ name: 'STRIPE_SECRET_KEY',
380
+ owner: 'payment',
381
+ targets: ['backend'],
382
+ group: 'payment',
383
+ secret: true,
384
+ required: false,
385
+ delivery: { backend: 'env' },
386
+ description: 'Stripe secret key — the backend creates checkout sessions, subscriptions, and refunds with it.',
387
+ },
388
+ {
389
+ name: 'PAYPAL_CLIENT_SECRET',
390
+ owner: 'payment',
391
+ targets: ['backend'],
392
+ group: 'payment',
393
+ secret: true,
394
+ required: false,
395
+ delivery: { backend: 'env' },
396
+ description: 'Secret half of the PayPal app credentials (the client id is public and lives in omega.json5).',
397
+ },
398
+ {
399
+ name: 'CHARGEBEE_API_KEY',
400
+ owner: 'payment',
401
+ targets: ['backend'],
402
+ group: 'payment',
403
+ secret: true,
404
+ required: false,
405
+ delivery: { backend: 'env' },
406
+ description: 'Chargebee API key for the brand site (the site name is public and lives in omega.json5).',
407
+ },
408
+ {
409
+ name: 'COINBASE_COMMERCE_API_KEY',
410
+ owner: 'payment',
411
+ targets: ['backend'],
412
+ group: 'payment',
413
+ secret: true,
414
+ required: false,
415
+ delivery: { backend: 'env' },
416
+ description: 'Coinbase Commerce API key — the backend creates hosted crypto charges with it. The provider has no public half at all, so payment.providers.coinbase carries only its `enabled` switch.',
417
+ },
418
+ {
419
+ name: 'SLAPFORM_SERVICE_ACCOUNT',
420
+ owner: 'forms',
421
+ targets: [],
422
+ group: 'service-accounts',
423
+ secret: true,
424
+ required: false,
425
+ description: 'Path to the Slapform service-account JSON the forms service authenticates with.',
426
+ },
427
+ {
428
+ name: 'CHATSY_SERVICE_ACCOUNT',
429
+ owner: 'chat',
430
+ targets: [],
431
+ group: 'service-accounts',
432
+ secret: true,
433
+ required: false,
434
+ description: 'Path to the Chatsy service-account JSON the chat service authenticates with.',
435
+ },
436
+ {
437
+ name: 'REPLYIFY_SERVICE_ACCOUNT',
438
+ owner: 'email',
439
+ targets: [],
440
+ group: 'service-accounts',
441
+ secret: true,
442
+ required: false,
443
+ description: 'Path to the Replyify service-account JSON the email service authenticates with.',
444
+ },
445
+ {
446
+ name: 'SERVER_SERVICE_ACCOUNT',
447
+ owner: 'server',
448
+ targets: [],
449
+ group: 'service-accounts',
450
+ secret: true,
451
+ required: false,
452
+ description: 'Path to the server service-account JSON the server service authenticates with.',
453
+ },
454
+ {
455
+ name: 'MRLOGO_SERVICE_ACCOUNT',
456
+ owner: 'assets',
457
+ targets: [],
458
+ group: 'service-accounts',
459
+ secret: true,
460
+ required: false,
461
+ description: 'Path to the Mr. Logo service-account JSON the assets service generates brand artwork through.',
462
+ },
463
+ {
464
+ name: 'APPLE_API_ISSUER',
465
+ owner: 'certificates',
466
+ targets: ['desktop'],
467
+ group: 'apple',
468
+ secret: false,
469
+ required: false,
470
+ delivery: { desktop: 'ci' },
471
+ description: 'App Store Connect API issuer id — notarization of the desktop build.',
472
+ },
473
+ {
474
+ name: 'APPLE_API_KEY_ID',
475
+ owner: 'certificates',
476
+ targets: ['desktop'],
477
+ group: 'apple',
478
+ secret: false,
479
+ required: false,
480
+ delivery: { desktop: 'ci' },
481
+ description: 'App Store Connect API key id — also names the .p8 file the certificates service places (AuthKey_<id>.p8).',
482
+ },
483
+ {
484
+ name: 'APPLE_TEAM_ID',
485
+ owner: 'certificates',
486
+ targets: ['desktop'],
487
+ group: 'apple',
488
+ secret: false,
489
+ required: false,
490
+ delivery: { desktop: 'ci' },
491
+ description: 'Apple Developer team id the desktop build signs under.',
492
+ },
493
+ {
494
+ name: 'CSC_LINK',
495
+ owner: 'certificates',
496
+ targets: ['desktop'],
497
+ group: 'apple',
498
+ secret: false,
499
+ required: false,
500
+ delivery: { desktop: 'ci' },
501
+ description: 'Path to the macOS Developer ID signing certificate (.p12) electron-builder signs with — unset, the build derives it from a delivered config/certs/developer-id-application.p12, then falls back to the Keychain.',
502
+ },
503
+ {
504
+ name: 'APPLE_API_KEY',
505
+ owner: 'certificates',
506
+ targets: ['desktop'],
507
+ group: 'apple',
508
+ secret: false,
509
+ required: false,
510
+ delivery: { desktop: 'ci' },
511
+ description: 'Path to the App Store Connect API key (.p8) notarization uses — unset, the build derives it from a delivered config/certs/AuthKey_<APPLE_API_KEY_ID>.p8.',
512
+ },
513
+
514
+ // ── desktop-publishing — the Windows + Linux halves of a desktop release ──
515
+ {
516
+ name: 'WIN_EV_TOKEN_PATH',
517
+ owner: 'certificates',
518
+ targets: ['desktop'],
519
+ group: 'desktop-publishing',
520
+ secret: false,
521
+ required: false,
522
+ delivery: { desktop: 'ci' },
523
+ description: 'Thumbprint/path of the EV code-signing certificate on the self-hosted Windows runner (platforms.win.signing.strategy = self-hosted).',
524
+ },
525
+ {
526
+ name: 'WIN_CSC_KEY_PASSWORD',
527
+ owner: 'certificates',
528
+ targets: ['desktop'],
529
+ group: 'desktop-publishing',
530
+ secret: true,
531
+ required: false,
532
+ delivery: { desktop: 'ci' },
533
+ description: 'SafeNet token PIN the Windows signing job unlocks the EV token with.',
534
+ },
535
+ {
536
+ name: 'SIGNTOOL_PATH',
537
+ owner: 'certificates',
538
+ targets: ['desktop'],
539
+ group: 'desktop-publishing',
540
+ secret: false,
541
+ required: false,
542
+ delivery: { desktop: 'ci' },
543
+ description: 'Path to signtool.exe on the Windows runner.',
544
+ },
545
+ // The cloud signing providers (platforms.win.signing.strategy = cloud): the
546
+ // windows-sign job injects all three sets and the configured provider is the
547
+ // one that consumes its own ([#627](https://github.com/Omega-JS-Stack/omega/issues/627)).
548
+ {
549
+ name: 'AZURE_TENANT_ID',
550
+ owner: 'certificates',
551
+ targets: ['desktop'],
552
+ group: 'desktop-publishing',
553
+ secret: true,
554
+ required: false,
555
+ delivery: { desktop: 'ci' },
556
+ description: 'Azure Trusted Signing: the directory (tenant) the signing account lives in.',
557
+ },
558
+ {
559
+ name: 'AZURE_CLIENT_ID',
560
+ owner: 'certificates',
561
+ targets: ['desktop'],
562
+ group: 'desktop-publishing',
563
+ secret: true,
564
+ required: false,
565
+ delivery: { desktop: 'ci' },
566
+ description: 'Azure Trusted Signing: the app registration the signing job authenticates as.',
567
+ },
568
+ {
569
+ name: 'AZURE_CLIENT_SECRET',
570
+ owner: 'certificates',
571
+ targets: ['desktop'],
572
+ group: 'desktop-publishing',
573
+ secret: true,
574
+ required: false,
575
+ delivery: { desktop: 'ci' },
576
+ description: 'Azure Trusted Signing: the client secret of AZURE_CLIENT_ID.',
577
+ },
578
+ {
579
+ name: 'AZURE_TRUSTED_SIGNING_ENDPOINT',
580
+ owner: 'certificates',
581
+ targets: ['desktop'],
582
+ group: 'desktop-publishing',
583
+ secret: true,
584
+ required: false,
585
+ delivery: { desktop: 'ci' },
586
+ description: 'Azure Trusted Signing: the regional endpoint the signing account was created in.',
587
+ },
588
+ {
589
+ name: 'SSLCOM_USERNAME',
590
+ owner: 'certificates',
591
+ targets: ['desktop'],
592
+ group: 'desktop-publishing',
593
+ secret: true,
594
+ required: false,
595
+ delivery: { desktop: 'ci' },
596
+ description: 'SSL.com eSigner account the cloud signing job authenticates with.',
597
+ },
598
+ {
599
+ name: 'SSLCOM_PASSWORD',
600
+ owner: 'certificates',
601
+ targets: ['desktop'],
602
+ group: 'desktop-publishing',
603
+ secret: true,
604
+ required: false,
605
+ delivery: { desktop: 'ci' },
606
+ description: 'Password of the SSL.com eSigner account.',
607
+ },
608
+ {
609
+ name: 'SSLCOM_CREDENTIAL_ID',
610
+ owner: 'certificates',
611
+ targets: ['desktop'],
612
+ group: 'desktop-publishing',
613
+ secret: true,
614
+ required: false,
615
+ delivery: { desktop: 'ci' },
616
+ description: 'SSL.com eSigner credential id naming which certificate in the account signs.',
617
+ },
618
+ {
619
+ name: 'DIGICERT_API_KEY',
620
+ owner: 'certificates',
621
+ targets: ['desktop'],
622
+ group: 'desktop-publishing',
623
+ secret: true,
624
+ required: false,
625
+ delivery: { desktop: 'ci' },
626
+ description: 'DigiCert KeyLocker API key the cloud signing job authenticates with.',
627
+ },
628
+ {
629
+ name: 'DIGICERT_KEYPAIR_ALIAS',
630
+ owner: 'certificates',
631
+ targets: ['desktop'],
632
+ group: 'desktop-publishing',
633
+ secret: true,
634
+ required: false,
635
+ delivery: { desktop: 'ci' },
636
+ description: 'DigiCert KeyLocker keypair alias naming which certificate in the account signs.',
637
+ },
638
+ {
639
+ name: 'SNAPCRAFT_STORE_CREDENTIALS',
640
+ owner: 'certificates',
641
+ targets: ['desktop'],
642
+ group: 'desktop-publishing',
643
+ secret: true,
644
+ required: false,
645
+ requiredWhen: 'platforms.linux.snap.enabled',
646
+ delivery: { desktop: 'ci' },
647
+ description: 'Snap Store credentials blob (`snapcraft export-login -`) the Linux publish job uses — required only when platforms.linux.snap.enabled.',
648
+ },
649
+
650
+ // ── extension-stores — one credential set per browser store ──────────────
651
+ {
652
+ name: 'CHROME_EXTENSION_ID',
653
+ owner: 'certificates',
654
+ targets: ['extension'],
655
+ group: 'extension-stores',
656
+ secret: false,
657
+ required: false,
658
+ delivery: { extension: 'ci' },
659
+ description: 'Chrome Web Store item id the publish verb uploads to.',
660
+ },
661
+ {
662
+ name: 'CHROME_CLIENT_ID',
663
+ owner: 'certificates',
664
+ targets: ['extension'],
665
+ group: 'extension-stores',
666
+ secret: false,
667
+ required: false,
668
+ delivery: { extension: 'ci' },
669
+ description: 'OAuth client id of the Chrome Web Store API credential.',
670
+ },
671
+ {
672
+ name: 'CHROME_CLIENT_SECRET',
673
+ owner: 'certificates',
674
+ targets: ['extension'],
675
+ group: 'extension-stores',
676
+ secret: true,
677
+ required: false,
678
+ delivery: { extension: 'ci' },
679
+ description: 'OAuth client secret of the Chrome Web Store API credential.',
680
+ },
681
+ {
682
+ name: 'CHROME_REFRESH_TOKEN',
683
+ owner: 'certificates',
684
+ targets: ['extension'],
685
+ group: 'extension-stores',
686
+ secret: true,
687
+ required: false,
688
+ delivery: { extension: 'ci' },
689
+ description: 'Refresh token the Chrome Web Store API credential mints its access tokens from.',
690
+ },
691
+ {
692
+ name: 'FIREFOX_EXTENSION_ID',
693
+ owner: 'certificates',
694
+ targets: ['extension'],
695
+ group: 'extension-stores',
696
+ secret: false,
697
+ required: false,
698
+ delivery: { extension: 'ci' },
699
+ description: 'Firefox Add-ons id the publish verb uploads to.',
700
+ },
701
+ {
702
+ name: 'FIREFOX_API_KEY',
703
+ owner: 'certificates',
704
+ targets: ['extension'],
705
+ group: 'extension-stores',
706
+ secret: false,
707
+ required: false,
708
+ delivery: { extension: 'ci' },
709
+ description: 'Firefox Add-ons API key (JWT issuer) from addons.mozilla.org.',
710
+ },
711
+ {
712
+ name: 'FIREFOX_API_SECRET',
713
+ owner: 'certificates',
714
+ targets: ['extension'],
715
+ group: 'extension-stores',
716
+ secret: true,
717
+ required: false,
718
+ delivery: { extension: 'ci' },
719
+ description: 'Firefox Add-ons API secret the JWT is signed with.',
720
+ },
721
+ {
722
+ name: 'EDGE_PRODUCT_ID',
723
+ owner: 'certificates',
724
+ targets: ['extension'],
725
+ group: 'extension-stores',
726
+ secret: false,
727
+ required: false,
728
+ delivery: { extension: 'ci' },
729
+ description: 'Microsoft Edge Add-ons product id the publish verb uploads to.',
730
+ },
731
+ {
732
+ name: 'EDGE_CLIENT_ID',
733
+ owner: 'certificates',
734
+ targets: ['extension'],
735
+ group: 'extension-stores',
736
+ secret: false,
737
+ required: false,
738
+ delivery: { extension: 'ci' },
739
+ description: 'Edge Add-ons API client id.',
740
+ },
741
+ {
742
+ name: 'EDGE_API_KEY',
743
+ owner: 'certificates',
744
+ targets: ['extension'],
745
+ group: 'extension-stores',
746
+ secret: true,
747
+ required: false,
748
+ delivery: { extension: 'ci' },
749
+ description: 'Edge Add-ons API key the publish request authenticates with.',
750
+ },
751
+
752
+ // ── testing — the credentials an opt-in test lane needs ──────────────────
753
+ {
754
+ name: 'OMEGA_TEST_FIREBASE_ADMIN_KEY',
755
+ owner: 'backend',
756
+ targets: ['web', 'backend', 'desktop', 'extension'],
757
+ group: 'testing',
758
+ secret: true,
759
+ required: false,
760
+ delivery: { web: 'ci', backend: 'env' },
761
+ description: 'Path to a service-account JSON the extended test lanes mint custom tokens with — absent, those suites skip with a reason (GOOGLE_APPLICATION_CREDENTIALS is the fallthrough).',
762
+ },
763
+ {
764
+ name: 'OMEGA_TEST_USER_UID',
765
+ owner: 'backend',
766
+ targets: ['web', 'backend', 'desktop', 'extension'],
767
+ group: 'testing',
768
+ secret: false,
769
+ required: false,
770
+ delivery: { web: 'ci', backend: 'env' },
771
+ description: "Uid the extended test lanes sign in as — each framework's suite defaults to its own (`desktop-test-user` and siblings).",
772
+ },
773
+ {
774
+ name: 'OMEGA_FONTAWESOME_ROOT',
775
+ owner: 'assets',
776
+ targets: ['web', 'desktop', 'extension'],
777
+ group: 'fontawesome',
778
+ secret: false,
779
+ required: false,
780
+ delivery: { web: 'ci', desktop: 'ci', extension: 'ci' },
781
+ machineLocal: true,
782
+ description: "Filesystem path to the developer's local Font Awesome Pro package — machine-local, so it never travels to CI (the free set is the fallthrough).",
783
+ },
784
+
785
+ // ── backend service keys ─────────────────────────────────────────────────
786
+ // ONE key per AI provider ([#639](https://github.com/Omega-JS-Stack/omega/issues/639)):
787
+ // the OMEGA_-prefixed twins are gone. A company-wide key is the COMPANY
788
+ // layer of the .env cascade under the SAME name — never a second key name.
789
+ {
790
+ name: 'OPENAI_API_KEY',
791
+ owner: 'backend',
792
+ targets: ['web', 'backend', 'extension'],
793
+ group: 'backend-services',
794
+ secret: true,
795
+ required: false,
796
+ delivery: { web: 'ci', backend: 'env' },
797
+ description: 'The OpenAI key wherever the backend calls OpenAI, and what the shared translation engine needs when translation.providers names chatgpt (the default "claude" provider needs none) — the brand .env wins, a company .env serves every brand that sets none.',
798
+ },
799
+ {
800
+ name: 'ANTHROPIC_API_KEY',
801
+ owner: 'backend',
802
+ targets: ['backend'],
803
+ group: 'backend-services',
804
+ secret: true,
805
+ required: false,
806
+ delivery: { backend: 'env' },
807
+ description: 'The Anthropic key wherever the backend calls Anthropic — the brand .env wins, a company .env serves every brand that sets none.',
808
+ },
809
+ {
810
+ name: 'NEVERBOUNCE_API_KEY',
811
+ owner: 'backend',
812
+ targets: ['backend'],
813
+ group: 'backend-services',
814
+ secret: true,
815
+ required: false,
816
+ delivery: { backend: 'env' },
817
+ description: 'NeverBounce API key — the first-choice email-validation provider on signup and marketing sync.',
818
+ },
819
+ {
820
+ name: 'ZEROBOUNCE_API_KEY',
821
+ owner: 'backend',
822
+ targets: ['backend'],
823
+ group: 'backend-services',
824
+ secret: true,
825
+ required: false,
826
+ delivery: { backend: 'env' },
827
+ description: 'ZeroBounce API key — the email-validation provider used when NeverBounce is unset.',
828
+ },
829
+ {
830
+ match: /^CONNECTIONS_[A-Z0-9_]+_CLIENT_(ID|SECRET)$/,
831
+ owner: 'backend',
832
+ targets: ['backend'],
833
+ group: 'backend-services',
834
+ secret: true,
835
+ required: false,
836
+ delivery: { backend: 'env' },
837
+ description: "Per-provider OAuth client credentials for the backend's user-connection routes (CONNECTIONS_<PROVIDER>_CLIENT_ID / _CLIENT_SECRET) — pasted into the brand .env from each provider's console; the provider set is open, so the family is a pattern.",
838
+ },
839
+
840
+ // ── machine-owned: written by a service on its first real run ────────────
841
+ {
842
+ name: 'ACCOUNT_PASSWORD_SEED',
843
+ owner: 'account',
844
+ targets: [],
845
+ group: 'machine',
846
+ secret: true,
847
+ required: false,
848
+ description: 'Seed the account service derives every brand-owned account password from — generated on the first run that needs one.',
849
+ },
850
+ {
851
+ name: 'CSC_KEY_PASSWORD',
852
+ owner: 'certificates',
853
+ targets: ['desktop'],
854
+ group: 'machine',
855
+ secret: true,
856
+ required: false,
857
+ delivery: { desktop: 'ci' },
858
+ description: "Password of the desktop signing certificate the certificates service created — electron-builder reads it at package time.",
859
+ },
860
+ {
861
+ name: 'VAPID_PRIVATE_KEY',
862
+ owner: 'cloud',
863
+ targets: [],
864
+ group: 'machine',
865
+ secret: true,
866
+ required: false,
867
+ description: 'Private half of the Web Push key pair — the Firebase console shows it once, so the cloud service persists it here (the public half lives in omega.json5).',
868
+ },
869
+ {
870
+ name: 'GOOGLE_ANALYTICS_SECRET_WEB',
871
+ owner: 'analytics',
872
+ targets: ['web'],
873
+ group: 'machine',
874
+ secret: true,
875
+ required: false,
876
+ requiredWhen: 'analytics.providers.google.id',
877
+ delivery: { web: 'ci' },
878
+ deliverAs: 'GOOGLE_ANALYTICS_SECRET',
879
+ description: "Measurement Protocol secret of the web target's GA4 stream — delivered as GOOGLE_ANALYTICS_SECRET on every verb (composed into dist/.env for backend, loaded into process.env for the others).",
880
+ },
881
+ {
882
+ name: 'GOOGLE_ANALYTICS_SECRET_BACKEND',
883
+ owner: 'analytics',
884
+ targets: ['backend'],
885
+ group: 'machine',
886
+ secret: true,
887
+ required: false,
888
+ requiredWhen: 'analytics.providers.google.id',
889
+ delivery: { backend: 'env' },
890
+ deliverAs: 'GOOGLE_ANALYTICS_SECRET',
891
+ description: "Measurement Protocol secret of the backend target's GA4 stream — delivered as GOOGLE_ANALYTICS_SECRET on every verb (composed into dist/.env for backend, loaded into process.env for the others).",
892
+ },
893
+ {
894
+ name: 'GOOGLE_ANALYTICS_SECRET_DESKTOP',
895
+ owner: 'analytics',
896
+ targets: ['desktop'],
897
+ group: 'machine',
898
+ secret: true,
899
+ publicAtRest: true,
900
+ required: false,
901
+ requiredWhen: 'analytics.providers.google.id',
902
+ delivery: { desktop: 'bake' },
903
+ deliverAs: 'GOOGLE_ANALYTICS_SECRET',
904
+ description: "Measurement Protocol secret of the desktop target's GA4 stream — delivered as GOOGLE_ANALYTICS_SECRET on every verb (composed into dist/.env for backend, loaded into process.env for the others).",
905
+ },
906
+ {
907
+ name: 'GOOGLE_ANALYTICS_SECRET_EXTENSION',
908
+ owner: 'analytics',
909
+ targets: ['extension'],
910
+ group: 'machine',
911
+ secret: true,
912
+ publicAtRest: true,
913
+ required: false,
914
+ requiredWhen: 'analytics.providers.google.id',
915
+ delivery: { extension: 'bake' },
916
+ deliverAs: 'GOOGLE_ANALYTICS_SECRET',
917
+ description: "Measurement Protocol secret of the extension target's GA4 stream — delivered as GOOGLE_ANALYTICS_SECRET on every verb (composed into dist/.env for backend, loaded into process.env for the others).",
918
+ },
919
+ {
920
+ name: 'GOOGLE_ANALYTICS_SECRET_MOBILE',
921
+ owner: 'analytics',
922
+ targets: ['mobile'],
923
+ group: 'machine',
924
+ secret: true,
925
+ required: false,
926
+ // No requiredWhen: MAM is parked (hard rule 4) — nothing mints, delivers or reads this key, so a rule here could only warn forever.
927
+ deliverAs: 'GOOGLE_ANALYTICS_SECRET',
928
+ description: "Measurement Protocol secret of the mobile target's GA4 stream — delivered as GOOGLE_ANALYTICS_SECRET on every verb (composed into dist/.env for backend, loaded into process.env for the others).",
929
+ },
930
+
931
+ // ── runtime-resolved: never hand-written into a brand .env ───────────────
932
+ {
933
+ name: 'GOOGLE_ANALYTICS_SECRET',
934
+ owner: 'analytics',
935
+ targets: ['web', 'backend', 'desktop', 'extension'],
936
+ group: 'runtime',
937
+ secret: true,
938
+ required: false,
939
+ description: "A target's own Measurement Protocol secret — the delivery renames the brand-level GOOGLE_ANALYTICS_SECRET_<TARGET> to this name (deliverAs), so it is never composed from a brand key of the same name.",
940
+ },
941
+ {
942
+ name: 'PAYPAL_CLIENT_ID',
943
+ owner: 'payment',
944
+ targets: ['backend'],
945
+ group: 'runtime',
946
+ secret: false,
947
+ required: false,
948
+ description: 'Public PayPal client id — the backend publishes it into its own env from payment.providers.paypal.clientId at boot.',
949
+ },
950
+ {
951
+ name: 'CHARGEBEE_SITE',
952
+ owner: 'payment',
953
+ targets: ['backend'],
954
+ group: 'runtime',
955
+ secret: false,
956
+ required: false,
957
+ description: 'Public Chargebee site name — the backend publishes it into its own env from payment.providers.chargebee.site at boot.',
958
+ },
959
+ {
960
+ name: 'OMEGA_LICENSE_STATUS',
961
+ owner: 'workspace',
962
+ targets: ['backend'],
963
+ group: 'runtime',
964
+ secret: false,
965
+ required: false,
966
+ description: "The deploy-time license verdict (#320), written into dist/.env by the backend deploy itself — `licensed` or `keyless`. It is COMPUTED, never supplied: the runtime group renders no brand .env line, so nothing composes one down from the brand layer. The payment provider libraries refuse live processing on `keyless`; absent (every local lane, the emulator, a test) is today's behavior exactly.",
967
+ },
968
+ {
969
+ name: 'CLAUDE_CODE_OAUTH_TOKEN',
970
+ owner: 'backend',
971
+ targets: ['backend'],
972
+ group: 'runtime',
973
+ secret: true,
974
+ required: false,
975
+ description: "Developer tooling credential (`claude setup-token`) the claude-code AI provider falls back to — deliberately never composed into a brand's target .env.",
976
+ },
977
+ ];
978
+
979
+ /** The groups that render into a real .env file, in canonical file order. */
980
+ function envFileGroups() {
981
+ return ENV_GROUPS.filter((group) => group.file !== false);
982
+ }
983
+
984
+ /**
985
+ * The entry that governs a name — an exact match first, then the dynamic
986
+ * families' patterns. Undefined for a name the schema does not know.
987
+ *
988
+ * @param {string} name - The env var name.
989
+ * @returns {object|undefined} The schema entry.
990
+ */
991
+ function envSchemaEntry(name) {
992
+ return ENV_SCHEMA.find((entry) => entry.name === name)
993
+ || ENV_SCHEMA.find((entry) => entry.match instanceof RegExp && entry.match.test(name));
994
+ }
995
+
996
+ /**
997
+ * Whether a key is a developer-machine value (`machineLocal: true`) that no
998
+ * CI-secrets publisher may send ([#454](https://github.com/Omega-JS-Stack/omega/issues/454)).
999
+ *
1000
+ * @param {string} name - The env var name.
1001
+ * @returns {boolean}
1002
+ */
1003
+ function isMachineLocal(name) {
1004
+ const entry = envSchemaEntry(name);
1005
+ return Boolean(entry && entry.machineLocal);
1006
+ }
1007
+
1008
+ /**
1009
+ * The NAMED keys a target reads, in schema order — the rendering lane's list
1010
+ * (which placeholders a brand .env carries, in which section). Pattern
1011
+ * families are excluded because they have no fixed name to render.
1012
+ *
1013
+ * NOT the delivery filter: composeTargetEnv (env.js) is, and it honors the
1014
+ * pattern families and `deliverAs` this list cannot express
1015
+ * ([#678](https://github.com/Omega-JS-Stack/omega/issues/678)).
1016
+ *
1017
+ * @param {string} target - Target name ('backend', 'web', …).
1018
+ * @returns {string[]} Env var names.
1019
+ */
1020
+ function envKeysForTarget(target) {
1021
+ const fileGroups = new Set(envFileGroups().map((group) => group.id));
1022
+
1023
+ return ENV_SCHEMA
1024
+ .filter((entry) => entry.name && fileGroups.has(entry.group) && entry.targets.includes(target))
1025
+ .map((entry) => entry.name);
1026
+ }
1027
+
1028
+ /**
1029
+ * The keys OMEGA mints for itself: name → the function that produces a value.
1030
+ * The manager's onboard stub and its manage-time mint both render from this.
1031
+ *
1032
+ * @returns {Object<string, function(): string>} Name → generator.
1033
+ */
1034
+ function generatedEnvKeys() {
1035
+ return Object.fromEntries(ENV_SCHEMA
1036
+ .filter((entry) => typeof entry.generated === 'function')
1037
+ .map((entry) => [entry.name, entry.generated]));
1038
+ }
1039
+
1040
+ /**
1041
+ * The keys a target refuses to run without — the backend's boot guard.
1042
+ *
1043
+ * @param {string} target - Target name.
1044
+ * @returns {string[]} Env var names.
1045
+ */
1046
+ function requiredEnvKeys(target) {
1047
+ return ENV_SCHEMA
1048
+ .filter((entry) => entry.name && entry.required && entry.targets.includes(target))
1049
+ .map((entry) => entry.name);
1050
+ }
1051
+
1052
+ /**
1053
+ * Group id → its keys in schema order, every declared group present.
1054
+ *
1055
+ * @returns {Object<string, string[]>} Group id → env var names.
1056
+ */
1057
+ function envKeysByGroup() {
1058
+ const byGroup = Object.fromEntries(ENV_GROUPS.map((group) => [group.id, []]));
1059
+
1060
+ for (const entry of ENV_SCHEMA) {
1061
+ if (entry.name) byGroup[entry.group].push(entry.name);
1062
+ }
1063
+
1064
+ return byGroup;
1065
+ }
1066
+
1067
+ module.exports = {
1068
+ ENV_SCHEMA,
1069
+ ENV_GROUPS,
1070
+ DELIVERY_MODES,
1071
+ envFileGroups,
1072
+ envSchemaEntry,
1073
+ isMachineLocal,
1074
+ envKeysForTarget,
1075
+ generatedEnvKeys,
1076
+ requiredEnvKeys,
1077
+ envKeysByGroup,
1078
+ };