@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,139 @@
1
+ /**
2
+ * Canonical top-level key order for brand omega.json5 files — "omega
3
+ * reorders the keys so the order is consistent" (Ian), with comments
4
+ * traveling alongside their keys. Applied on every config writeback and
5
+ * exposed standalone.
6
+ *
7
+ * The order is the legacy omega-manager brand-config order extended with
8
+ * the new-world sections. Unknown keys keep their relative order after the
9
+ * known ones. Only the TOP level is ordered — nested layout stays exactly
10
+ * as authored.
11
+ *
12
+ * Loss-proof by construction: the root object's inner region is cut into
13
+ * contiguous TILES, one per top-level entry — each tile runs from the end
14
+ * of the previous entry's last line to the end of its own last line, so
15
+ * leading comment blocks, blank lines, and same-line trailing comments all
16
+ * belong to exactly one tile. Reordering permutes whole tiles and never
17
+ * synthesizes text (beyond trailing commas, which JSON5 allows everywhere).
18
+ * The result must JSON5-parse to data deep-equal to the input or this
19
+ * throws and the caller writes nothing.
20
+ */
21
+ const { isDeepStrictEqual } = require('node:util');
22
+ const JSON5 = require('json5');
23
+
24
+ const { parseRoot } = require('./edit.js');
25
+
26
+ // `targets` goes LAST (Ian 2026-07-14) — it's the per-target override layer,
27
+ // so it reads best after every shared section it can override.
28
+ // The de-branding rekey (#23) collapsed several vendor-named top-level keys
29
+ // into role-shaped homes — `repo`, `edge`, `captcha`, `search`, `forms`,
30
+ // `inbound` — and folded `firebase`/`gcp` into `cloud`. Only the TOP level is
31
+ // ordered, so each fold is one entry here; the nesting under it is authored.
32
+ // Every SHARED_SCHEMA top-level key belongs here — the drift guard in
33
+ // test/order.test.js fails the moment the schema grows one this list misses
34
+ // (#503: socials, github, directory, ports, client had drifted out), and its
35
+ // REVERSE guard fails on a key that is neither schema-known nor a named
36
+ // manager-owned block (#484 retired `testing`: no schema rule, and the testing
37
+ // service reads no config at all, so converters were carrying a dead key).
38
+ const CANONICAL_TOP_LEVEL_ORDER = [
39
+ 'enabled', 'parent', 'brand', 'url', 'company', 'socials', 'account', 'local', 'ports',
40
+ 'repo', 'github', 'domain',
41
+ 'edge', 'cloud', 'captcha', 'analytics',
42
+ 'monitoring', 'advertising', 'features', 'payment', 'connections', 'sponsorships',
43
+ 'marketing', 'blog', 'devlog', 'reviews', 'seo', 'search',
44
+ 'dataRequest', 'forms', 'inbound',
45
+ 'server', 'assets', 'directory',
46
+ 'certificates', 'theme', 'ai', 'translation', 'client', 'migrations', 'targets',
47
+ ];
48
+
49
+ /**
50
+ * Reorder a brand omega.json5 source's top-level keys into canonical order,
51
+ * comments riding with their keys. Returns the source unchanged when there
52
+ * is nothing to reorder (or when the file's shape rules out safe tiling —
53
+ * multiple entries on one line).
54
+ *
55
+ * @param {string} source - omega.json5 text (must parse).
56
+ * @returns {string} Reordered source with identical data.
57
+ */
58
+ function applyCanonicalOrder(source) {
59
+ const original = JSON5.parse(source);
60
+
61
+ // Every entry needs a trailing comma before tiles can be permuted — the
62
+ // original last entry may lack one and would break mid-file. Insert from
63
+ // the end so offsets stay valid, then re-parse.
64
+ let text = source;
65
+ const scan = parseRoot(text);
66
+ if (scan.entries.length < 2) {
67
+ return source;
68
+ }
69
+ const missingCommas = scan.entries
70
+ .filter((entry) => !entry.hasComma)
71
+ .sort((a, b) => b.valueNode.end - a.valueNode.end);
72
+ for (const entry of missingCommas) {
73
+ text = `${text.slice(0, entry.valueNode.end)},${text.slice(entry.valueNode.end)}`;
74
+ }
75
+
76
+ const root = parseRoot(text);
77
+
78
+ // Prefix: everything through the end of the line the '{' sits on
79
+ const firstNewline = text.indexOf('\n', root.start);
80
+ if (firstNewline === -1) {
81
+ return source; // single-line root — nothing to tile
82
+ }
83
+ const prefixEnd = firstNewline + 1;
84
+
85
+ const lineEndAfter = (pos) => {
86
+ const nl = text.indexOf('\n', pos);
87
+ return nl === -1 ? pos : nl + 1;
88
+ };
89
+
90
+ const tiles = [];
91
+ let cursor = prefixEnd;
92
+ for (const entry of root.entries) {
93
+ const end = lineEndAfter(entry.commaEnd);
94
+ if (end <= cursor) {
95
+ return source; // two entries share a line — tiling would tear it
96
+ }
97
+ tiles.push({ key: entry.key, text: text.slice(cursor, end) });
98
+ cursor = end;
99
+ }
100
+
101
+ // Tail: anything between the last entry's line and the closing brace's
102
+ // line (detached trailing comments) stays where it is
103
+ const braceLineStart = text.lastIndexOf('\n', root.closeStart - 1) + 1;
104
+ const tail = text.slice(cursor, Math.max(cursor, braceLineStart));
105
+
106
+ const rank = (key) => {
107
+ // `targets` is last by POLICY — even unknown keys (which rank after the
108
+ // known ones, relative order kept) never sort past it.
109
+ if (key === 'targets') {
110
+ return Number.MAX_SAFE_INTEGER;
111
+ }
112
+ const index = CANONICAL_TOP_LEVEL_ORDER.indexOf(key);
113
+ return index === -1 ? CANONICAL_TOP_LEVEL_ORDER.length : index;
114
+ };
115
+ const ordered = [...tiles].sort((a, b) => rank(a.key) - rank(b.key));
116
+
117
+ if (ordered.every((tile, index) => tile === tiles[index]) && text === source) {
118
+ return source; // already canonical, nothing inserted
119
+ }
120
+
121
+ const result = text.slice(0, prefixEnd)
122
+ + ordered.map((tile) => tile.text).join('')
123
+ + tail
124
+ + text.slice(Math.max(cursor, braceLineStart));
125
+
126
+ let parsed;
127
+ try {
128
+ parsed = JSON5.parse(result);
129
+ } catch (e) {
130
+ throw new Error(`Canonical reorder produced unparseable output — nothing written: ${e.message}`);
131
+ }
132
+ if (!isDeepStrictEqual(parsed, original)) {
133
+ throw new Error('Canonical reorder changed the config data — nothing written');
134
+ }
135
+
136
+ return result;
137
+ }
138
+
139
+ module.exports = { applyCanonicalOrder, CANONICAL_TOP_LEVEL_ORDER };
@@ -0,0 +1,374 @@
1
+ /**
2
+ * Port auto-allocation (N7) — classic defaults, probe at boot, bump-if-taken.
3
+ *
4
+ * The allocator is boot-time only: when the classic defaults are free (the
5
+ * single-brand case) resolution returns them untouched and dev behaves
6
+ * exactly as it always has. When a port is taken (a second brand's stack is
7
+ * up), that port bumps +1 until free — per port, with a shared claimed-set so
8
+ * two names never land on the same number.
9
+ *
10
+ * The RESOLVED map publishes two ways (the CLI that booted the stack owns
11
+ * both): a ports file (`<projectDir>/.temp/ports.json`, pid-stamped, deleted
12
+ * on clean shutdown) for sibling processes of the same brand, and
13
+ * `OMEGA_<NAME>_PORT` env vars injected into spawned children for URL
14
+ * getters. Browser code receives `dev.ports` via the injected dev config —
15
+ * it can read neither env nor files.
16
+ *
17
+ * A port is not always the whole fact: the website's dev ORIGIN carries a
18
+ * protocol too (mkcert HTTPS by default), and a sibling reading `website:
19
+ * 4000` cannot guess it. The publisher writes the resolved origin string
20
+ * beside the map in the same file, and `readSiblingOrigin` reads it back
21
+ * ([#262](https://github.com/Omega-JS-Stack/omega/issues/262)).
22
+ *
23
+ * Under local HTTPS the map carries two hosting entries: `https` is the
24
+ * public origin (the mkcert proxy) and `hosting` is the proxy's INTERNAL
25
+ * plain-http port. A consumer process targets `https`, never `hosting`
26
+ * ([#795](https://github.com/Omega-JS-Stack/omega/issues/795)).
27
+ *
28
+ * Explicit pins (config `ports` section) never bump: a pinned port that is
29
+ * busy is a hard error naming the pin, because the user asked for exactly
30
+ * that port.
31
+ */
32
+
33
+ const fs = require('fs');
34
+ const net = require('net');
35
+ const path = require('path');
36
+ const { findBrandRoot } = require('./load.js');
37
+
38
+ // The classic defaults every framework has always used — allocation starts
39
+ // here, and single-brand dev never leaves them.
40
+ const CLASSIC_PORTS = {
41
+ auth: 9099,
42
+ functions: 5001,
43
+ firestore: 8080,
44
+ database: 9000,
45
+ hosting: 5002,
46
+ storage: 9199,
47
+ pubsub: 8085,
48
+ ui: 4050,
49
+ website: 4000,
50
+ livereload: 35729,
51
+ cdp: 9222,
52
+ };
53
+
54
+ const PORTS_FILE = 'ports.json';
55
+
56
+ // The dev website origin every surface assumes when no live website published
57
+ // one — the classic port, over the protocol `omega dev` speaks by default (the
58
+ // mkcert proxy). An assumption, and every fallback says so out loud (#262).
59
+ const CLASSIC_DEV_ORIGIN = `https://localhost:${CLASSIC_PORTS.website}`;
60
+
61
+ /**
62
+ * Attempt one bind (the probe primitive). On macOS/BSD, wildcard and
63
+ * specific-address listeners COEXIST on the same port — so no single bind
64
+ * can see every listener; isPortFree composes four.
65
+ * @param {object} listenOptions - net listen options ({ port } = wildcard).
66
+ * @param {boolean} [ignoreMissingFamily] - Treat address-family-unavailable
67
+ * errors (no IPv6 on this host) as free rather than busy.
68
+ * @returns {Promise<boolean>} True when the bind succeeded.
69
+ */
70
+ function bindProbe(listenOptions, ignoreMissingFamily = false) {
71
+ return new Promise((resolve) => {
72
+ const server = net.createServer();
73
+ server.once('error', (error) => {
74
+ if (ignoreMissingFamily && ['EADDRNOTAVAIL', 'EAFNOSUPPORT', 'EINVAL'].includes(error.code)) {
75
+ return resolve(true);
76
+ }
77
+ resolve(false);
78
+ });
79
+ server.listen(listenOptions, () => {
80
+ server.close(() => resolve(true));
81
+ });
82
+ });
83
+ }
84
+
85
+ /**
86
+ * Is this port free for a dev server to take? Bind-probe, not connect-probe
87
+ * — and FOUR binds, because on macOS/BSD specific-address and wildcard
88
+ * listeners coexist per port, and so do the two wildcard families: a
89
+ * 127.0.0.1 probe misses an IPv6-wildcard listener (`*:port`), a wildcard
90
+ * probe misses a 127.0.0.1-specific one, a `localhost` server can sit on ::1
91
+ * alone, and the bare-`{ port }` bind lands on the IPv6 wildcard `::`, which
92
+ * coexists with a foreign `0.0.0.0` holder (Docker, `nc -l`, any
93
+ * non-loopback dev server). Free means all of 127.0.0.1, ::1 (when the host
94
+ * has IPv6), 0.0.0.0, and the `::` wildcard bind succeed — matching what
95
+ * firebase-tools' own connect-probe will conclude at boot.
96
+ * @param {number} port - Port to probe.
97
+ * @returns {Promise<boolean>} True when the port is free.
98
+ */
99
+ async function isPortFree(port) {
100
+ return (await bindProbe({ port, host: '127.0.0.1' }))
101
+ && (await bindProbe({ port, host: '::1' }, true))
102
+ && (await bindProbe({ port, host: '0.0.0.0' }))
103
+ && (await bindProbe({ port }));
104
+ }
105
+
106
+ /**
107
+ * Resolve a port map: each wanted port keeps its value when free, bumps +1
108
+ * until free when taken. Pinned ports (explicit config) never bump — busy
109
+ * pin throws.
110
+ *
111
+ * @param {object} options
112
+ * @param {object} options.wanted - Name → desired port (usually the classic
113
+ * defaults or a brand's firebase.json values).
114
+ * @param {object} [options.pins] - Name → explicitly-configured port (config
115
+ * `ports` section). Pinned names use the pin verbatim; busy → throw.
116
+ * @param {Set<number>} [options.claimed] - Ports already claimed in this
117
+ * process run (shared across resolvePorts calls for multi-family boots).
118
+ * @returns {Promise<{ ports: object, bumped: string[] }>} Resolved map + the
119
+ * names that moved off their wanted value.
120
+ */
121
+ async function resolvePorts({ wanted, pins = {}, claimed = new Set() }) {
122
+ const ports = {};
123
+ const bumped = [];
124
+
125
+ for (const [name, wantedPort] of Object.entries(wanted)) {
126
+ const pin = pins[name];
127
+
128
+ if (typeof pin === 'number') {
129
+ if (claimed.has(pin) || !(await isPortFree(pin))) {
130
+ throw new Error(`Port ${pin} (pinned via config ports.${name}) is already in use — free it or change the pin`);
131
+ }
132
+ ports[name] = pin;
133
+ claimed.add(pin);
134
+ continue;
135
+ }
136
+
137
+ let candidate = wantedPort;
138
+ while (claimed.has(candidate) || !(await isPortFree(candidate))) {
139
+ candidate += 1;
140
+ }
141
+
142
+ if (candidate !== wantedPort) {
143
+ bumped.push(name);
144
+ }
145
+ ports[name] = candidate;
146
+ claimed.add(candidate);
147
+ }
148
+
149
+ return { ports, bumped };
150
+ }
151
+
152
+ /**
153
+ * Publish the resolved map for sibling processes of the same brand.
154
+ * @param {string} projectDir - The project directory (owns `.temp/`).
155
+ * @param {object} ports - Resolved name → port map.
156
+ * @param {object} [facts] - Resolved non-port facts published beside the map
157
+ * ({ origin }, the website's resolved dev origin — protocol included).
158
+ * @returns {string} The file path written.
159
+ */
160
+ function writePortsFile(projectDir, ports, facts = {}) {
161
+ const dir = path.join(projectDir, '.temp');
162
+ fs.mkdirSync(dir, { recursive: true });
163
+ const file = path.join(dir, PORTS_FILE);
164
+ fs.writeFileSync(file, JSON.stringify({ ports, ...facts, pid: process.pid, startedAt: new Date().toISOString() }, null, 2));
165
+ return file;
166
+ }
167
+
168
+ /**
169
+ * Read a live ports file's WHOLE payload (the map plus the facts published
170
+ * beside it). Returns null when absent, unparseable, or stale (the writing
171
+ * process is no longer running).
172
+ * @param {string} projectDir - The project directory.
173
+ * @returns {object|null} The parsed payload, or null.
174
+ */
175
+ function readPortsData(projectDir) {
176
+ const file = path.join(projectDir, '.temp', PORTS_FILE);
177
+
178
+ let parsed;
179
+ try {
180
+ parsed = JSON.parse(fs.readFileSync(file, 'utf8'));
181
+ } catch (error) {
182
+ return null;
183
+ }
184
+
185
+ if (!parsed || typeof parsed !== 'object' || !parsed.ports) {
186
+ return null;
187
+ }
188
+
189
+ // Stale check: the allocator deletes the file on clean shutdown, so a
190
+ // surviving file with a dead pid is a crash leftover — ignore it.
191
+ if (parsed.pid) {
192
+ try {
193
+ process.kill(parsed.pid, 0);
194
+ } catch (error) {
195
+ return null;
196
+ }
197
+ }
198
+
199
+ return parsed;
200
+ }
201
+
202
+ /**
203
+ * Read a live ports file. Returns null when absent, unparseable, or stale
204
+ * (the writing process is no longer running).
205
+ * @param {string} projectDir - The project directory.
206
+ * @returns {object|null} The resolved name → port map, or null.
207
+ */
208
+ function readPortsFile(projectDir) {
209
+ const data = readPortsData(projectDir);
210
+ return data ? data.ports : null;
211
+ }
212
+
213
+ /**
214
+ * Remove the ports file (clean shutdown).
215
+ * @param {string} projectDir - The project directory.
216
+ */
217
+ function clearPortsFile(projectDir) {
218
+ try {
219
+ fs.unlinkSync(path.join(projectDir, '.temp', PORTS_FILE));
220
+ } catch (error) {
221
+ // Absent is fine.
222
+ }
223
+ }
224
+
225
+ /**
226
+ * Merge the live ports files of the sibling targets in the same brand — a
227
+ * running backend's resolved emulator map, as the website/desktop/extension
228
+ * target beside it sees it. Dead-pid leftovers are ignored by readPortsFile; the
229
+ * caller's OWN target dir is skipped (a previous run of the same process).
230
+ *
231
+ * Read at USE time, never once at boot: the ports file is pid-stamped and
232
+ * deleted on shutdown, so a boot-time read races the sibling that has not
233
+ * booted yet and goes stale the moment an emulator restarts on new numbers
234
+ * ([#300](https://github.com/Omega-JS-Stack/omega/issues/300)).
235
+ *
236
+ * No brand root (standalone consumer) → empty map, and the caller falls back
237
+ * to the classic ports.
238
+ * @param {string} targetDir - The reading target's root (its own file is skipped).
239
+ * @returns {object} Merged name → port map.
240
+ */
241
+ function readSiblingPorts(targetDir) {
242
+ const merged = {};
243
+
244
+ for (const dir of siblingTargetDirs(targetDir)) {
245
+ Object.assign(merged, readPortsFile(dir) || {});
246
+ }
247
+
248
+ return merged;
249
+ }
250
+
251
+ /**
252
+ * The resolved dev WEBSITE ORIGIN a sibling target of the same brand published —
253
+ * protocol and port together, because a port alone cannot say whether the dev
254
+ * server speaks TLS (mkcert is the default) and every client that links to the
255
+ * website in dev needs the whole origin
256
+ * ([#262](https://github.com/Omega-JS-Stack/omega/issues/262)).
257
+ *
258
+ * Read at USE time like readSiblingPorts, and null when no sibling is live —
259
+ * the caller falls back to the classic assumption and says so.
260
+ * @param {string} targetDir - The reading target's root (its own file is skipped).
261
+ * @returns {string|null} The published origin, or null.
262
+ */
263
+ function readSiblingOrigin(targetDir) {
264
+ for (const dir of siblingTargetDirs(targetDir)) {
265
+ const origin = readPortsData(dir)?.origin;
266
+ if (origin) {
267
+ return origin;
268
+ }
269
+ }
270
+
271
+ return null;
272
+ }
273
+
274
+ /**
275
+ * The sibling target dirs of the target that asks: every `targets/<name>` of
276
+ * the same brand except its own. No brand root (standalone consumer) → none.
277
+ * @param {string} targetDir - The reading target's root.
278
+ * @returns {string[]} Absolute sibling target dirs.
279
+ */
280
+ function siblingTargetDirs(targetDir) {
281
+ const brandRoot = findBrandRoot(targetDir);
282
+ if (!brandRoot) {
283
+ return [];
284
+ }
285
+
286
+ const targetsDir = path.join(brandRoot, 'targets');
287
+ const dirs = [];
288
+
289
+ for (const entry of fs.existsSync(targetsDir) ? fs.readdirSync(targetsDir, { withFileTypes: true }) : []) {
290
+ if (!entry.isDirectory() || entry.name.startsWith('.')) {
291
+ continue;
292
+ }
293
+ const dir = path.join(targetsDir, entry.name);
294
+ if (path.resolve(dir) === path.resolve(targetDir)) {
295
+ continue;
296
+ }
297
+ dirs.push(dir);
298
+ }
299
+
300
+ return dirs;
301
+ }
302
+
303
+ /**
304
+ * Env-var name for a port ('auth' → 'OMEGA_AUTH_PORT').
305
+ * @param {string} name - Port name.
306
+ * @returns {string} Env var name.
307
+ */
308
+ function envName(name) {
309
+ return `OMEGA_${name.toUpperCase()}_PORT`;
310
+ }
311
+
312
+ /**
313
+ * Resolved map → the OMEGA_*_PORT env block to inject into spawned children.
314
+ * @param {object} ports - Resolved name → port map.
315
+ * @returns {object} Env var name → string port.
316
+ */
317
+ function portsToEnv(ports) {
318
+ const env = {};
319
+ for (const [name, port] of Object.entries(ports)) {
320
+ env[envName(name)] = String(port);
321
+ }
322
+ return env;
323
+ }
324
+
325
+ /**
326
+ * Read a port from the environment (`OMEGA_<NAME>_PORT`).
327
+ * @param {string} name - Port name ('auth', 'hosting', ...).
328
+ * @param {object} [env] - Env object (defaults to process.env).
329
+ * @returns {number|null} The port, or null when unset/invalid.
330
+ */
331
+ function envPort(name, env = process.env) {
332
+ const raw = env[envName(name)];
333
+ const port = Number.parseInt(raw, 10);
334
+ return Number.isInteger(port) && port > 0 ? port : null;
335
+ }
336
+
337
+ /**
338
+ * Every `OMEGA_<NAME>_PORT` in an environment as a resolved map — the inverse
339
+ * of portsToEnv, for a spawned child reading the whole map its parent
340
+ * injected rather than one name at a time.
341
+ * @param {object} [env] - Env object (defaults to process.env).
342
+ * @returns {object} Name → port map (lowercased names, invalid values dropped).
343
+ */
344
+ function envPorts(env = process.env) {
345
+ const ports = {};
346
+ for (const key of Object.keys(env)) {
347
+ const match = /^OMEGA_([A-Z0-9]+)_PORT$/.exec(key);
348
+ if (!match) {
349
+ continue;
350
+ }
351
+ const name = match[1].toLowerCase();
352
+ const port = envPort(name, env);
353
+ if (port) {
354
+ ports[name] = port;
355
+ }
356
+ }
357
+ return ports;
358
+ }
359
+
360
+ module.exports = {
361
+ CLASSIC_PORTS,
362
+ CLASSIC_DEV_ORIGIN,
363
+ isPortFree,
364
+ resolvePorts,
365
+ writePortsFile,
366
+ readPortsFile,
367
+ clearPortsFile,
368
+ readSiblingPorts,
369
+ readSiblingOrigin,
370
+ envName,
371
+ portsToEnv,
372
+ envPort,
373
+ envPorts,
374
+ };
@@ -0,0 +1,32 @@
1
+ /**
2
+ * The `role.providers.<provider>` shape (#425) — every role names its vendors
3
+ * the same way, so "which provider did the brand pick?" is ONE question with
4
+ * one answer here instead of a hand-rolled read per service.
5
+ *
6
+ * The tri-state is unchanged, it just moved into key presence:
7
+ * - no `providers` block, or an empty one → nothing chosen (the role's
8
+ * service skips, exactly what a null `provider` used to mean)
9
+ * - `{ namecheap: {…} }` → chosen, with its settings
10
+ * - `{ namecheap: false }` → deliberately disabled
11
+ *
12
+ * Roles that can only ever have one live provider (domain's registrar,
13
+ * translation's engine, devlog's writer) read the chosen one through this;
14
+ * roles that run several at once (payment, analytics) iterate the block
15
+ * themselves — presence per vendor is the whole gate there.
16
+ */
17
+
18
+ /**
19
+ * The chosen provider key in a `providers` block.
20
+ *
21
+ * @param {object} [providers] - A role's `providers` map
22
+ * @returns {string|null} - The provider name, or null when none is chosen
23
+ */
24
+ function chosenProvider(providers) {
25
+ if (!providers || typeof providers !== 'object' || Array.isArray(providers)) {
26
+ return null;
27
+ }
28
+
29
+ return Object.keys(providers).find((name) => providers[name] !== false) || null;
30
+ }
31
+
32
+ module.exports = { chosenProvider };
@@ -0,0 +1,142 @@
1
+ /**
2
+ * @omega.js/config repo — the SINGLE derivation of the brand's GitHub repo
3
+ * (owner + name), shared by every surface that targets the brand repo (web
4
+ * `omega deploy --direct`, the manager's github service setup/repo/pages,
5
+ * the backend CMS routes that commit posts).
6
+ *
7
+ * One optional key: `repo.providers.github.repo` (or, on a backend load, the
8
+ * target-overlaid `targets.backend.github.repo`, which wins) — either a bare name
9
+ * ("omega-brand") or an "owner/name" slug ("itw-creative-works/omega-brand").
10
+ * Defaults: name falls to `<brand.id>-omega`, owner falls to `repo.providers.github.org`.
11
+ * That name is the `<brand.id>-<role>` repo rule (Ian 2026-09-07,
12
+ * [#809](https://github.com/Omega-JS-Stack/omega/issues/809)): every repo a brand
13
+ * owns is its id plus the role it plays, `omega` for the source monorepo beside
14
+ * the `releases` one below, so nobody types a repo name to get the right one.
15
+ * The slug's owner slot carries the legacy omega-manager orgMain/orgWebsite
16
+ * split (Ian 2026-07-19): most ITW brands house the brand repo under the paid
17
+ * company org (itw-creative-works) while `repo.providers.github.org` keeps
18
+ * naming the brand's own org for org-profile reconciliation. The retired `repoWebsite` URL key
19
+ * (2026-07-19, Ian: "we no longer need it — that was for when the website
20
+ * lived NOT in the monorepo") is superseded by this slug: one repo per
21
+ * brand, named by the brand.
22
+ *
23
+ * Born from the 2026-07-18 launch-night collision: the bare brand-id
24
+ * fallback resolved brand "omega" to Omega-JS-Stack/omega — the framework
25
+ * MONOREPO — instead of the brand repo.
26
+ */
27
+
28
+ /**
29
+ * Parse a `repo.providers.github.repo` value: "owner/name" slug or bare "name".
30
+ *
31
+ * @param {string} value - e.g. "itw-creative-works/omega-brand" or "omega-brand"
32
+ * @returns {{ owner: string, name: string }} owner is '' for bare names.
33
+ */
34
+ function parseRepoSlug(value) {
35
+ const trimmed = (value || '').trim();
36
+ if (!trimmed) return { owner: '', name: '' };
37
+ const slash = trimmed.indexOf('/');
38
+ if (slash === -1) return { owner: '', name: trimmed };
39
+ return { owner: trimmed.slice(0, slash), name: trimmed.slice(slash + 1) };
40
+ }
41
+
42
+ /**
43
+ * The github keys the derivation reads: the shared `repo.providers.github`
44
+ * block, overlaid by the target's own `github` entry (a backend load composes
45
+ * `targets.backend.github` — the CMS's content identity — onto the top level,
46
+ * and per the merge chain the target wins).
47
+ *
48
+ * @param {object} config - Composed omega config (brand + local layers).
49
+ * @returns {object} Merged `{ org, repo, … }` keys.
50
+ */
51
+ function githubKeys(config) {
52
+ return { ...(config?.repo?.providers?.github || {}), ...(config?.github || {}) };
53
+ }
54
+
55
+ /**
56
+ * The brand repo's bare name (no owner): a typed slug or bare name, else the
57
+ * `<brand.id>-omega` default of the `<brand.id>-<role>` rule.
58
+ *
59
+ * @param {object} config - Composed omega config (brand + local layers).
60
+ * @returns {string} Repo name ('' when nothing in the chain resolves).
61
+ */
62
+ function brandRepoName(config) {
63
+ const github = githubKeys(config);
64
+ // The id half is trimmed like a typed slug: the role suffix is appended to
65
+ // it, so untrimmed whitespace would sit INSIDE the composed name.
66
+ const id = (config?.brand?.id || '').trim();
67
+
68
+ return parseRepoSlug(github.repo).name
69
+ || (id ? `${id}-omega` : '');
70
+ }
71
+
72
+ /**
73
+ * The brand repo's owner (GitHub org or user).
74
+ *
75
+ * @param {object} config - Composed omega config (brand + local layers).
76
+ * @returns {string} Owner ('' when nothing in the chain resolves).
77
+ */
78
+ function brandRepoOwner(config) {
79
+ const github = githubKeys(config);
80
+ return parseRepoSlug(github.repo).owner || github.org || '';
81
+ }
82
+
83
+ /**
84
+ * The brand repo as ONE finished value: owner, name, and the "owner/name" slug
85
+ * the GitHub API takes. This is the form a FRAMEWORK hands to consumer code —
86
+ * @omega.js/backend exposes it as `config.resolved.github` ([#290](https://github.com/Omega-JS-Stack/omega/issues/290)),
87
+ * because a brand target cannot require this private package and must never
88
+ * re-derive the merge rules for itself.
89
+ *
90
+ * @param {object} config - Composed omega config (brand + local layers).
91
+ * @returns {{ owner: string, name: string, repo: string }} `repo` is the slug, '' unless BOTH halves resolve (half an address addresses nothing).
92
+ */
93
+ function brandRepo(config) {
94
+ const owner = brandRepoOwner(config);
95
+ const name = brandRepoName(config);
96
+
97
+ return { owner, name, repo: owner && name ? `${owner}/${name}` : '' };
98
+ }
99
+
100
+ /**
101
+ * The releases keys the derivation reads: the desktop target's own `releases`
102
+ * block, overlaid by the top-level one a desktop-resolved config carries (the
103
+ * merge chain overlays `targets.desktop` onto the top level, so the overlay is
104
+ * the resolved value). Both shapes are live: the site global reads a raw config,
105
+ * where the block sits under the target, while every desktop verb reads the
106
+ * resolved one.
107
+ *
108
+ * @param {object} config - Composed omega config (raw or desktop-resolved).
109
+ * @returns {object} Merged `{ enabled, owner, repo }` keys.
110
+ */
111
+ function releasesKeys(config) {
112
+ const target = config?.targets?.desktop;
113
+ const entry = target && typeof target === 'object' && !Array.isArray(target) ? target.releases : undefined;
114
+
115
+ return { ...(entry || {}), ...(config?.releases || {}) };
116
+ }
117
+
118
+ /**
119
+ * The brand's ONE public releases repo: where the versioned `v<x.y.z>` releases
120
+ * that feed electron-updater live, and where the website's versionless
121
+ * `/releases/latest/download/<asset>` links point ([#620](https://github.com/Omega-JS-Stack/omega/issues/620),
122
+ * [#799](https://github.com/Omega-JS-Stack/omega/issues/799)). One repo per
123
+ * brand, named after it: `<brand.id>-releases` by default, under the brand
124
+ * repo's own owner, so a brand that declares nothing still has an address.
125
+ *
126
+ * This is the ONE home of that rule. Every reader takes it from here (the site
127
+ * global's download links, @omega.js/desktop's electron-builder publish block,
128
+ * its release-repo provisioning, its finalize-release upload), so the feed a
129
+ * shipped app polls and the URL a download button carries can never disagree.
130
+ *
131
+ * @param {object} config - Composed omega config (raw or desktop-resolved).
132
+ * @returns {{ owner: string, name: string, repo: string }} `repo` is the slug, '' unless BOTH halves resolve (half an address addresses nothing).
133
+ */
134
+ function releasesRepo(config) {
135
+ const releases = releasesKeys(config);
136
+ const owner = releases.owner || brandRepoOwner(config);
137
+ const name = releases.repo || (config?.brand?.id ? `${config.brand.id}-releases` : '');
138
+
139
+ return { owner, name, repo: owner && name ? `${owner}/${name}` : '' };
140
+ }
141
+
142
+ module.exports = { parseRepoSlug, brandRepoName, brandRepoOwner, brandRepo, releasesRepo };