@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,162 @@
1
+ /**
2
+ * Test-scope grammar (C5) — ONE parser for `omega test` targets across every
3
+ * framework, so scoping means the same thing in a web app, a backend, a
4
+ * desktop app, and an extension:
5
+ *
6
+ * npx omega test → PROJECT tests only (consumer context)
7
+ * npx omega test pages/ → project tests under pages/
8
+ * npx omega test project:pages/ → same, explicit (`brand:` = alias)
9
+ * npx omega test framework: → the framework's own suite
10
+ * npx omega test framework:routes/ → framework suite, scoped
11
+ * npx omega test full: → both sources
12
+ * npx omega test full:auth → both sources, path-scoped
13
+ *
14
+ * `omega:` and `mgr:` are universal framework aliases; each framework also
15
+ * answers to its own id (`backend:`, `desktop:`, `extension:`, `web:`) via
16
+ * `frameworkAliases`. Bare paths bind to the PROJECT source — reaching the
17
+ * framework suite is always an explicit choice (Ian 2026-07-11: bare runs
18
+ * from a brand must never drag the framework corpus in).
19
+ *
20
+ * Framework SELF context (running inside the framework package itself —
21
+ * `selfTest: true`) flips the no-target default to the framework suite, so
22
+ * each package's own `npm test` keeps meaning "run my suite".
23
+ */
24
+
25
+ const UNIVERSAL_FRAMEWORK_ALIASES = ['framework', 'omega', 'mgr'];
26
+ const PROJECT_ALIASES = ['project', 'brand'];
27
+ const FULL_ALIASES = ['full'];
28
+
29
+ // Per-framework id prefixes, keyed by package name. The SSOT for "which
30
+ // prefixes does each framework answer to": framework runners pass their own
31
+ // entry as `frameworkAliases`, and the manager's brand-root `test` fan-out
32
+ // routes `web:`/`desktop:`/… targets to the target owning that framework.
33
+ // Legacy short ids (ujm/em/bxm) retired with cp262's legacy-name sweep.
34
+ const FRAMEWORK_IDS = {
35
+ '@omega.js/web': ['web'],
36
+ '@omega.js/backend': ['backend'],
37
+ '@omega.js/desktop': ['desktop'],
38
+ '@omega.js/extension': ['extension'],
39
+ };
40
+
41
+ /**
42
+ * Parse `omega test` positional targets into sources + per-source path filters.
43
+ *
44
+ * @param {string[]} rawTargets - Positional targets (may be empty)
45
+ * @param {Object} [options]
46
+ * @param {string[]} [options.frameworkAliases] - Extra framework prefixes for
47
+ * this framework (e.g. ['backend'], ['desktop'], ['extension'], ['web'])
48
+ * @param {boolean} [options.selfTest] - True when running inside the framework
49
+ * package itself (no consumer project)
50
+ * @returns {{
51
+ * sources: string[], // subset of ['framework', 'project']
52
+ * filters: { framework: string[], project: string[] }, // prefix-stripped path filters per source
53
+ * invalid: string[], // unrecognized `<word>:` prefixes (likely typos)
54
+ * }}
55
+ */
56
+ function parseTestScope(rawTargets, options = {}) {
57
+ const frameworkAliases = new Set([
58
+ ...UNIVERSAL_FRAMEWORK_ALIASES,
59
+ ...(options.frameworkAliases || []),
60
+ ]);
61
+
62
+ const sources = new Set();
63
+ const filters = { framework: [], project: [] };
64
+ const invalid = [];
65
+
66
+ for (const raw of rawTargets || []) {
67
+ const target = String(raw).trim();
68
+ if (!target) continue;
69
+
70
+ const match = target.match(/^([a-z-]+):(.*)$/);
71
+
72
+ if (!match) {
73
+ // Bare path — binds to the PROJECT source.
74
+ sources.add('project');
75
+ filters.project.push(target);
76
+ continue;
77
+ }
78
+
79
+ const [, prefix, pathPart] = match;
80
+
81
+ if (frameworkAliases.has(prefix)) {
82
+ sources.add('framework');
83
+ if (pathPart) filters.framework.push(pathPart);
84
+ } else if (PROJECT_ALIASES.includes(prefix)) {
85
+ sources.add('project');
86
+ if (pathPart) filters.project.push(pathPart);
87
+ } else if (FULL_ALIASES.includes(prefix)) {
88
+ sources.add('framework');
89
+ sources.add('project');
90
+ if (pathPart) {
91
+ filters.framework.push(pathPart);
92
+ filters.project.push(pathPart);
93
+ }
94
+ } else {
95
+ // Unknown prefix — surface it rather than silently matching nothing.
96
+ invalid.push(target);
97
+ }
98
+ }
99
+
100
+ // No targets (or only invalid ones): consumer default = project only;
101
+ // framework self context = the framework's own suite.
102
+ if (sources.size === 0) {
103
+ sources.add(options.selfTest ? 'framework' : 'project');
104
+ }
105
+
106
+ return {
107
+ sources: ['framework', 'project'].filter((s) => sources.has(s)),
108
+ filters,
109
+ invalid,
110
+ };
111
+ }
112
+
113
+ /**
114
+ * Did the run ask for test files BY NAME? A path filter (`build/x`,
115
+ * `project:x`, `desktop:x`, `full:x`) names files; a bare run, or a bare
116
+ * source prefix, asks for a source. Only the first kind can be a typo, so
117
+ * only the first kind fails when it selects nothing
118
+ * ([#814](https://github.com/Omega-JS-Stack/omega/issues/814)).
119
+ *
120
+ * @param {{filters: {framework: string[], project: string[]}}} scope - A parseTestScope() result
121
+ * @returns {boolean} True when at least one path filter was given
122
+ */
123
+ function isPathTargeted(scope) {
124
+ return scope.filters.framework.length > 0 || scope.filters.project.length > 0;
125
+ }
126
+
127
+ /**
128
+ * The ONE line every framework prints when a named target selects zero test
129
+ * files: the same sentence in a web app, a backend, a desktop app and an
130
+ * extension ([#814](https://github.com/Omega-JS-Stack/omega/issues/814)).
131
+ *
132
+ * @param {string} target - The target as the caller spelled it
133
+ * @returns {string} The message (the caller adds its own log tag)
134
+ */
135
+ function noMatchMessage(target) {
136
+ return `No test file matches "${target}".`;
137
+ }
138
+
139
+ // A brand-root run fans ONE target out over every target, where a target that
140
+ // does not carry that path is a legitimate no-op rather than a typo. The
141
+ // manager sets this signal on the runs it forwards and reads the exit code
142
+ // below to tell a miss from a failure
143
+ // ([#814](https://github.com/Omega-JS-Stack/omega/issues/814)). Its presence is
144
+ // the whole signal, the way OMEGA_CASE_RUNNER's is.
145
+ const FANOUT_ENV = 'OMEGA_TEST_FANOUT';
146
+
147
+ // The exit code a no-match answers with under that signal: distinct, so the
148
+ // fan-out counts misses without confusing them with failures. A standalone run
149
+ // stays 1, the code every human and every CI already reads as "this failed".
150
+ const NO_MATCH_EXIT_CODE = 3;
151
+
152
+ /**
153
+ * The exit code a no-match run ends on, given its environment.
154
+ *
155
+ * @param {object} [env] - The environment to read (defaults to process.env)
156
+ * @returns {number} NO_MATCH_EXIT_CODE inside a brand-root fan-out, else 1
157
+ */
158
+ function noMatchExitCode(env = process.env) {
159
+ return env[FANOUT_ENV] ? NO_MATCH_EXIT_CODE : 1;
160
+ }
161
+
162
+ module.exports = { parseTestScope, isPathTargeted, noMatchMessage, noMatchExitCode, NO_MATCH_EXIT_CODE, FANOUT_ENV, UNIVERSAL_FRAMEWORK_ALIASES, PROJECT_ALIASES, FULL_ALIASES, FRAMEWORK_IDS };
@@ -0,0 +1,84 @@
1
+ /**
2
+ * The committed translation cache — per-string maps keyed by a hash of the
3
+ * SOURCE string, stored as reviewable JSON in the consumer's `translations/`
4
+ * directory (committed to git, replacing both the legacy gitignored `.cache/`
5
+ * and the cache-uj-translation GitHub-branch flow). A source edit changes the
6
+ * hash → cache miss → only that string re-translates; a human can hand-fix a
7
+ * translation VALUE and it sticks for as long as the source is unchanged.
8
+ *
9
+ * Layout: <rootDir>/<lang>/<namespace>.json → { "<hash12>": "translation" }
10
+ * (namespace = a page path for web, 'messages'/'description' for extension).
11
+ */
12
+ const path = require('node:path');
13
+ const crypto = require('node:crypto');
14
+ const jetpack = require('fs-jetpack');
15
+
16
+ /**
17
+ * Cache key for a source string.
18
+ * @param {string} source - the source-language string
19
+ * @returns {string} 12-hex-char sha256 prefix
20
+ */
21
+ function hashKey(source) {
22
+ return crypto.createHash('sha256').update(source).digest('hex').slice(0, 12);
23
+ }
24
+
25
+ /**
26
+ * Resolve a namespace's cache file path.
27
+ * @param {string} rootDir - translations root (e.g. <consumer>/translations)
28
+ * @param {string} lang - language code
29
+ * @param {string} namespace - cache namespace (slashes allowed)
30
+ * @returns {string}
31
+ */
32
+ function cachePath(rootDir, lang, namespace) {
33
+ return path.join(rootDir, lang, `${namespace}.json`);
34
+ }
35
+
36
+ /**
37
+ * Load a namespace's hash → translation map ({} when absent/corrupt).
38
+ * @param {string} rootDir - translations root
39
+ * @param {string} lang - language code
40
+ * @param {string} namespace - cache namespace
41
+ * @returns {object}
42
+ */
43
+ function loadCache(rootDir, lang, namespace) {
44
+ const file = cachePath(rootDir, lang, namespace);
45
+
46
+ if (!jetpack.exists(file)) {
47
+ return {};
48
+ }
49
+
50
+ try {
51
+ return JSON.parse(jetpack.read(file)) || {};
52
+ } catch (e) {
53
+ return {};
54
+ }
55
+ }
56
+
57
+ /**
58
+ * Save a namespace's map, pruned to the CURRENT source strings so stale
59
+ * entries never accumulate. No-op delete when the map is empty.
60
+ * @param {string} rootDir - translations root
61
+ * @param {string} lang - language code
62
+ * @param {string} namespace - cache namespace
63
+ * @param {object} map - hash → translation
64
+ * @param {string[]} [currentSources] - prune to these sources' hashes
65
+ */
66
+ function saveCache(rootDir, lang, namespace, map, currentSources) {
67
+ let pruned = map;
68
+
69
+ if (currentSources) {
70
+ const keep = new Set(currentSources.map(hashKey));
71
+ pruned = Object.fromEntries(Object.entries(map).filter(([key]) => keep.has(key)));
72
+ }
73
+
74
+ const file = cachePath(rootDir, lang, namespace);
75
+
76
+ if (!Object.keys(pruned).length) {
77
+ jetpack.remove(file);
78
+ return;
79
+ }
80
+
81
+ jetpack.write(file, `${JSON.stringify(pruned, null, 2)}\n`);
82
+ }
83
+
84
+ module.exports = { hashKey, cachePath, loadCache, saveCache };
@@ -0,0 +1,243 @@
1
+ /**
2
+ * The translation engine — one provider-agnostic protocol for translating a
3
+ * batch of strings: JSON array in → same-length JSON array out, with a control
4
+ * sentinel appended to every batch to prove alignment, automatic batching,
5
+ * validation retries, and a HALVING re-ask for a batch the model keeps
6
+ * collapsing. Frameworks feed it strings (page text nodes, extension messages)
7
+ * and get positionally-aligned translations back.
8
+ */
9
+
10
+ // Alignment sentinel — appended to every batch, must return unchanged
11
+ const CONTROL = 'OMEGA-TRANSLATION-CONTROL';
12
+
13
+ const BATCH_SIZE = 25;
14
+ const MAX_RETRIES = 2;
15
+
16
+ // How many batches are in flight at once (#604). A batch is one model call and
17
+ // the model's latency dominates it, so a serial pass paid that latency once per
18
+ // 25 strings — a language took minutes it never needed to. Raise it only as far
19
+ // as the providers' rate limits allow.
20
+ const CONCURRENCY = 5;
21
+
22
+ const SYSTEM_PROMPT = `<role>
23
+ Professional translator. Return ONLY a valid JSON array — no commentary, no markdown fences, no wrapping.
24
+ </role>
25
+
26
+ <task>
27
+ Translate the input JSON array of strings into the target language.
28
+ The output array MUST have the EXACT same length as the input array.
29
+ </task>
30
+
31
+ <rules>
32
+ - Input: a JSON array of strings. Output: a JSON array of translated strings of the SAME length.
33
+ - DO NOT add, remove, merge, or reorder elements.
34
+ - Consider adjacent strings for context — they come from the same document.
35
+ - Preserve leading and trailing whitespace in each string.
36
+ - Keep HTML tags, attributes, URLs, and email addresses verbatim — never translate them.
37
+ - Preserve placeholder tokens exactly (e.g. $1, $2, %s, {name}, {{ value }}).
38
+ - Keep brand names, product names, and company names in their original language.
39
+ - Never translate the brand name "{brand}".
40
+ - The control string "${CONTROL}" must be returned unchanged at its exact position.
41
+ {extraRules}
42
+ </rules>
43
+
44
+ <example lang="es">
45
+ Input: ["Welcome to {brand}", "Get started today", "${CONTROL}"]
46
+ Output: ["Bienvenido a {brand}", "Comienza hoy", "${CONTROL}"]
47
+ </example>`;
48
+
49
+ /**
50
+ * Parse the provider's response into a JSON array (strips accidental fences).
51
+ * @param {string} text - raw provider response
52
+ * @returns {Array} parsed array
53
+ */
54
+ function parseArrayResponse(text) {
55
+ const cleaned = (text || '').trim().replace(/^```json?\n?|\n?```$/g, '');
56
+ const parsed = JSON.parse(cleaned);
57
+
58
+ if (!Array.isArray(parsed)) {
59
+ throw new Error(`translation result is not an array (got ${typeof parsed})`);
60
+ }
61
+
62
+ return parsed;
63
+ }
64
+
65
+ /**
66
+ * Re-apply the original string's leading/trailing whitespace to a translation
67
+ * (models trim despite instructions; surrounding markup relies on it).
68
+ * @param {string} original - source string
69
+ * @param {string} translated - translated string
70
+ * @returns {string}
71
+ */
72
+ function preserveWhitespace(original, translated) {
73
+ const leading = original.match(/^\s*/)[0];
74
+ const trailing = original.match(/\s*$/)[0];
75
+
76
+ return `${leading}${String(translated).trim()}${trailing}`;
77
+ }
78
+
79
+ /**
80
+ * An alignment failure — the batch came back, but not one-for-one. Marked so
81
+ * the caller can tell it from a provider that never answered at all.
82
+ * @param {string} message
83
+ * @returns {Error}
84
+ */
85
+ function alignmentError(message) {
86
+ const error = new Error(message);
87
+ error.alignment = true;
88
+ return error;
89
+ }
90
+
91
+ /**
92
+ * Translate one batch (with the control sentinel and validation retries).
93
+ * @param {object} ctx - { send, system, language, languageName }
94
+ * @param {string[]} batch - strings to translate
95
+ * @param {number} attempt - current attempt (0-based)
96
+ * @returns {Promise<{ result: string[], usage: object }>}
97
+ */
98
+ async function translateBatch(ctx, batch, attempt) {
99
+ const payload = [...batch, CONTROL];
100
+ const user = `Target language: ${ctx.language} (${ctx.languageName})\nArray length: ${payload.length}\n\n${JSON.stringify(payload)}`;
101
+
102
+ const { text, usage } = await ctx.send({ system: ctx.system, user });
103
+
104
+ try {
105
+ const parsed = parseArrayResponse(text);
106
+
107
+ if (parsed.length !== payload.length) {
108
+ throw alignmentError(`length mismatch: expected ${payload.length}, got ${parsed.length}`);
109
+ }
110
+
111
+ if (parsed[parsed.length - 1] !== CONTROL) {
112
+ throw alignmentError('control sentinel missing or altered at the last position');
113
+ }
114
+
115
+ return { result: parsed.slice(0, -1), usage };
116
+ } catch (e) {
117
+ if (attempt < MAX_RETRIES) {
118
+ return translateBatch(ctx, batch, attempt + 1);
119
+ }
120
+
121
+ // A batch a model MERGES is deterministic (#523): the playground's
122
+ // ship-the-docs page came back 25-for-26 on all six attempts, in two
123
+ // languages — re-asking the same array can only fail the same way. Halving
124
+ // it separates whatever pair collapsed, and each half is asked in full,
125
+ // so nothing is guessed at and the page stops shipping untranslated.
126
+ if (e.alignment && batch.length > 1) {
127
+ return splitBatch(ctx, batch);
128
+ }
129
+
130
+ throw new Error(`translation failed after ${MAX_RETRIES + 1} attempts: ${e.message}`);
131
+ }
132
+ }
133
+
134
+ /**
135
+ * Re-ask a collapsing batch in halves, bottoming out at one string (a single
136
+ * string plus the sentinel is unambiguous — a provider that still drops it is
137
+ * broken, and the caller skips the page-language pair whole).
138
+ * @param {object} ctx - { send, system, language, languageName }
139
+ * @param {string[]} batch - the batch that would not come back aligned
140
+ * @returns {Promise<{ result: string[], usage: object }>}
141
+ */
142
+ async function splitBatch(ctx, batch) {
143
+ const middle = Math.ceil(batch.length / 2);
144
+ const result = [];
145
+ const usage = { input: 0, output: 0 };
146
+
147
+ for (const half of [batch.slice(0, middle), batch.slice(middle)]) {
148
+ const outcome = await translateBatch(ctx, half, 0);
149
+ result.push(...outcome.result);
150
+ usage.input += outcome.usage?.input || 0;
151
+ usage.output += outcome.usage?.output || 0;
152
+ }
153
+
154
+ return { result, usage };
155
+ }
156
+
157
+ /**
158
+ * Run a worker over every item with at most CONCURRENCY of them in flight,
159
+ * returning results in the ITEMS' order — never completion order.
160
+ * @param {Array} items - the work items
161
+ * @param {Function} worker - (item) → Promise
162
+ * @returns {Promise<Array>} results, positionally aligned with items
163
+ */
164
+ async function mapLimited(items, worker) {
165
+ const results = new Array(items.length);
166
+ let next = 0;
167
+
168
+ const drain = async () => {
169
+ while (next < items.length) {
170
+ const index = next++;
171
+ results[index] = await worker(items[index]);
172
+ }
173
+ };
174
+
175
+ await Promise.all(Array.from({ length: Math.min(CONCURRENCY, items.length) }, drain));
176
+
177
+ return results;
178
+ }
179
+
180
+ /**
181
+ * Translate an array of strings, batching + validating along the way.
182
+ * @param {object} options
183
+ * @param {string[]} options.strings - source strings
184
+ * @param {string} options.language - target language code (e.g. 'es')
185
+ * @param {string} options.languageName - English name of the target language
186
+ * @param {Function} options.send - provider send ({ system, user }) → { text, usage }
187
+ * @param {string} [options.brand] - brand name to keep untranslated
188
+ * @param {string} [options.extraRules] - extra rule lines for the system prompt
189
+ * @returns {Promise<{ result: string[], usage: { input: number, output: number } }>}
190
+ * result is positionally aligned with options.strings, original whitespace preserved
191
+ */
192
+ async function translateStrings(options) {
193
+ const { strings, language, languageName, send, brand, extraRules } = options;
194
+
195
+ if (!strings.length) {
196
+ return { result: [], usage: { input: 0, output: 0 } };
197
+ }
198
+
199
+ const system = SYSTEM_PROMPT
200
+ .split('{brand}').join(brand || 'the brand')
201
+ .replace('{extraRules}', extraRules ? `${extraRules.trim()}\n` : '');
202
+
203
+ const ctx = { send, system, language, languageName };
204
+ const translated = [];
205
+ const usage = { input: 0, output: 0 };
206
+
207
+ // Dedupe before batching (#529): a page sends its title and description once
208
+ // per meta tag, so the same string rode a batch three times over — three
209
+ // times the AI spend, and adjacent twins are exactly what a model merges.
210
+ // Each unique string is translated ONCE and fanned back below.
211
+ const unique = [];
212
+ const position = new Map();
213
+ for (const string of strings) {
214
+ if (!position.has(string)) {
215
+ position.set(string, unique.length);
216
+ unique.push(string);
217
+ }
218
+ }
219
+
220
+ const batches = [];
221
+ for (let i = 0; i < unique.length; i += BATCH_SIZE) {
222
+ batches.push(unique.slice(i, i + BATCH_SIZE));
223
+ }
224
+
225
+ // Batches fly CONCURRENCY-wide (#604) and are stitched back in BATCH order:
226
+ // the sentinel, the alignment checks, and the #523 split backstop all stay
227
+ // per batch, so what a batch does on its own is exactly what it always did.
228
+ const outcomes = await mapLimited(batches, (batch) => translateBatch(ctx, batch, 0));
229
+
230
+ outcomes.forEach((outcome, i) => {
231
+ translated.push(...outcome.result.map((text, j) => preserveWhitespace(batches[i][j], text)));
232
+ usage.input += outcome.usage?.input || 0;
233
+ usage.output += outcome.usage?.output || 0;
234
+ });
235
+
236
+ // Occurrences are keyed on the exact source string, whitespace included, so
237
+ // every one of them gets back the translation its own text asked for.
238
+ const result = strings.map((string) => translated[position.get(string)]);
239
+
240
+ return { result, usage };
241
+ }
242
+
243
+ module.exports = { translateStrings, preserveWhitespace, CONTROL, BATCH_SIZE, CONCURRENCY };
@@ -0,0 +1,49 @@
1
+ /**
2
+ * @omega.js/devkit/translate — the shared OMEGA translation system: language
3
+ * SSOT, provider abstraction (claude via local Claude Code / chatgpt via
4
+ * OpenAI), the batch translation engine, and the committed per-string cache.
5
+ * Config contract (shared `translation` section of omega.json5):
6
+ * { enabled, default, languages, providers: { claude|chatgpt: {} }, model, exclude }
7
+ */
8
+ const { chosenProvider } = require('../../config/index.js');
9
+ const { LANGUAGE_NAMES, LANGUAGE_LOCALES, RTL_LANGUAGES, isRTL, languageName, ogLocale, assertKnownLanguages } = require('./languages.js');
10
+ const { PROVIDERS, DEFAULT_MODELS, resolveProvider } = require('./providers.js');
11
+ const { translateStrings, preserveWhitespace, CONTROL, BATCH_SIZE, CONCURRENCY } = require('./engine.js');
12
+ const { hashKey, cachePath, loadCache, saveCache } = require('./cache.js');
13
+
14
+ /**
15
+ * Read + validate the `translation` section of a resolved config.
16
+ * @param {object} config - resolved omega.json5 config
17
+ * @returns {{ enabled: boolean, default: string, languages: string[], provider: string, model: string|null, exclude: string[] }}
18
+ * enabled is false when the section is off or lists no languages
19
+ */
20
+ function resolveTranslationSettings(config) {
21
+ const section = config?.translation || {};
22
+ const languages = section.languages || [];
23
+
24
+ assertKnownLanguages(languages);
25
+
26
+ return {
27
+ enabled: section.enabled !== false && languages.length > 0,
28
+ default: section.default || 'en',
29
+ languages,
30
+ // The engine is a KEY under translation.providers (#425); no block at all
31
+ // means claude, the no-API-key default.
32
+ provider: chosenProvider(section.providers) || 'claude',
33
+ model: section.model || null,
34
+ exclude: section.exclude || [],
35
+ };
36
+ }
37
+
38
+ module.exports = {
39
+ // languages
40
+ LANGUAGE_NAMES, LANGUAGE_LOCALES, RTL_LANGUAGES, isRTL, languageName, ogLocale, assertKnownLanguages,
41
+ // providers
42
+ PROVIDERS, DEFAULT_MODELS, resolveProvider,
43
+ // engine
44
+ translateStrings, preserveWhitespace, CONTROL, BATCH_SIZE, CONCURRENCY,
45
+ // cache
46
+ hashKey, cachePath, loadCache, saveCache,
47
+ // config
48
+ resolveTranslationSettings,
49
+ };
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Language SSOT for the OMEGA translation system — the code → English-name
3
+ * map every framework validates against, plus the RTL set. Brand configs pick
4
+ * target codes in `translation.languages`; frameworks never carry their own
5
+ * language lists.
6
+ */
7
+
8
+ // Supported target languages (ISO 639-1 codes → English names). The names are
9
+ // sent to the AI provider so the model knows exactly which variant is meant.
10
+ const LANGUAGE_NAMES = {
11
+ ar: 'Arabic',
12
+ bn: 'Bengali',
13
+ cs: 'Czech',
14
+ da: 'Danish',
15
+ de: 'German',
16
+ el: 'Greek',
17
+ es: 'Spanish',
18
+ fa: 'Persian (Farsi)',
19
+ fi: 'Finnish',
20
+ fr: 'French',
21
+ he: 'Hebrew',
22
+ hi: 'Hindi',
23
+ hu: 'Hungarian',
24
+ id: 'Indonesian',
25
+ it: 'Italian',
26
+ ja: 'Japanese',
27
+ ko: 'Korean',
28
+ ms: 'Malay',
29
+ nl: 'Dutch',
30
+ no: 'Norwegian',
31
+ pl: 'Polish',
32
+ pt: 'Portuguese',
33
+ ro: 'Romanian',
34
+ ru: 'Russian',
35
+ sv: 'Swedish',
36
+ th: 'Thai',
37
+ tl: 'Tagalog/Filipino',
38
+ tr: 'Turkish',
39
+ uk: 'Ukrainian',
40
+ ur: 'Urdu',
41
+ vi: 'Vietnamese',
42
+ zh: 'Chinese (Simplified)',
43
+ };
44
+
45
+ // Open Graph locales (`language_TERRITORY` — the og:locale convention) for the
46
+ // supported set plus the common source languages. One territory per language:
47
+ // the most widely used one, matching Facebook's locale list (Norwegian is
48
+ // `nb_NO` there, Portuguese `pt_PT`).
49
+ const LANGUAGE_LOCALES = {
50
+ ar: 'ar_AR',
51
+ bn: 'bn_IN',
52
+ cs: 'cs_CZ',
53
+ da: 'da_DK',
54
+ de: 'de_DE',
55
+ el: 'el_GR',
56
+ en: 'en_US',
57
+ es: 'es_ES',
58
+ fa: 'fa_IR',
59
+ fi: 'fi_FI',
60
+ fr: 'fr_FR',
61
+ he: 'he_IL',
62
+ hi: 'hi_IN',
63
+ hu: 'hu_HU',
64
+ id: 'id_ID',
65
+ it: 'it_IT',
66
+ ja: 'ja_JP',
67
+ ko: 'ko_KR',
68
+ ms: 'ms_MY',
69
+ nl: 'nl_NL',
70
+ no: 'nb_NO',
71
+ pl: 'pl_PL',
72
+ pt: 'pt_PT',
73
+ ro: 'ro_RO',
74
+ ru: 'ru_RU',
75
+ sv: 'sv_SE',
76
+ th: 'th_TH',
77
+ tl: 'tl_PH',
78
+ tr: 'tr_TR',
79
+ uk: 'uk_UA',
80
+ ur: 'ur_PK',
81
+ vi: 'vi_VN',
82
+ zh: 'zh_CN',
83
+ };
84
+
85
+ // Right-to-left languages (drives <html dir="rtl"> on translated pages)
86
+ const RTL_LANGUAGES = ['ar', 'he', 'fa', 'ur', 'ps', 'sd', 'ku', 'yi', 'ckb', 'dv'];
87
+
88
+ /**
89
+ * Whether a language renders right-to-left.
90
+ * @param {string} code - language code
91
+ * @returns {boolean}
92
+ */
93
+ function isRTL(code) {
94
+ return RTL_LANGUAGES.includes(code);
95
+ }
96
+
97
+ /**
98
+ * English name for a language code.
99
+ * @param {string} code - language code
100
+ * @returns {string} the name, or the code itself if unknown
101
+ */
102
+ function languageName(code) {
103
+ return LANGUAGE_NAMES[code] || code;
104
+ }
105
+
106
+ /**
107
+ * Open Graph locale for a language code — `es` → `es_ES`. Target codes are
108
+ * validated by assertKnownLanguages, but the SOURCE language is free-form
109
+ * config, so an unmapped code falls back to the code itself (a bare code is
110
+ * what og:locale carried before this map existed).
111
+ * @param {string} code - language code
112
+ * @returns {string} the language_TERRITORY locale, or the code if unmapped
113
+ */
114
+ function ogLocale(code) {
115
+ return LANGUAGE_LOCALES[code] || code;
116
+ }
117
+
118
+ /**
119
+ * Assert every code is a supported target language.
120
+ * @param {string[]} codes - language codes from config
121
+ * @throws {Error} naming the unknown codes and the supported set
122
+ */
123
+ function assertKnownLanguages(codes) {
124
+ const unknown = (codes || []).filter((code) => !LANGUAGE_NAMES[code]);
125
+
126
+ if (unknown.length) {
127
+ throw new Error(
128
+ `Unknown translation language(s): ${unknown.join(', ')}. `
129
+ + `Supported codes: ${Object.keys(LANGUAGE_NAMES).join(', ')}`
130
+ );
131
+ }
132
+ }
133
+
134
+ module.exports = { LANGUAGE_NAMES, LANGUAGE_LOCALES, RTL_LANGUAGES, isRTL, languageName, ogLocale, assertKnownLanguages };