@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.
- package/LICENSE +98 -0
- package/README.md +194 -0
- package/bin/omega +2 -0
- package/bin/omega-extension +2 -0
- package/bin/omg +2 -0
- package/dist/assets/css/bundles/.gitkeep +0 -0
- package/dist/assets/css/components/content/index.scss +5 -0
- package/dist/assets/css/components/options/index.scss +9 -0
- package/dist/assets/css/components/pages/index.scss +5 -0
- package/dist/assets/css/components/popup/index.scss +9 -0
- package/dist/assets/css/core/_animations.scss +64 -0
- package/dist/assets/css/core/_fontawesome.scss +146 -0
- package/dist/assets/css/core/_initialize.scss +23 -0
- package/dist/assets/css/core/_utilities.scss +80 -0
- package/dist/assets/css/omega-extension.scss +43 -0
- package/dist/assets/css/shell/_index.scss +207 -0
- package/dist/assets/css/tokens/_index.scss +166 -0
- package/dist/assets/js/core/app-shell.js +136 -0
- package/dist/assets/js/libs/initialize-tooltips.js +31 -0
- package/dist/assets/js/libs/recaptcha.js +94 -0
- package/dist/assets/js/main.js +4 -0
- package/dist/assets/themes/_template/README.md +115 -0
- package/dist/assets/themes/_template/_config.scss +60 -0
- package/dist/assets/themes/_template/_theme.js +14 -0
- package/dist/assets/themes/_template/_theme.scss +28 -0
- package/dist/assets/themes/_template/css/base/_root.scss +19 -0
- package/dist/assets/themes/_template/css/components/_components.scss +23 -0
- package/dist/assets/themes/base/README.md +5 -0
- package/dist/assets/themes/base/_components/data/org-chart/component.html +33 -0
- package/dist/assets/themes/base/_components/data/org-chart/component.json5 +33 -0
- package/dist/assets/themes/base/_components/data/org-chart/component.scss +183 -0
- package/dist/assets/themes/base/_components/heading/masthead/component.html +22 -0
- package/dist/assets/themes/base/_components/heading/masthead/component.json5 +30 -0
- package/dist/assets/themes/base/_components/heading/section-head/component.html +18 -0
- package/dist/assets/themes/base/_components/heading/section-head/component.json5 +27 -0
- package/dist/assets/themes/base/_components/pricing/features/component.html +29 -0
- package/dist/assets/themes/base/_components/pricing/features/component.json5 +30 -0
- package/dist/assets/themes/base/_hero/orbit/index.html +30 -0
- package/dist/assets/themes/base/_hero/orbit/script.js +33 -0
- package/dist/assets/themes/base/_hero/orbit/style.scss +133 -0
- package/dist/assets/themes/base/_includes/admin/sections/sidebar.html +3 -0
- package/dist/assets/themes/base/_includes/admin/sections/topbar.html +3 -0
- package/dist/assets/themes/base/_includes/backend/sections/sidebar.html +3 -0
- package/dist/assets/themes/base/_includes/backend/sections/topbar.html +3 -0
- package/dist/assets/themes/base/_includes/frontend/components/connection-card.html +49 -0
- package/dist/assets/themes/base/_includes/frontend/components/post-card.html +54 -0
- package/dist/assets/themes/base/_includes/frontend/sections/account-connections.html +42 -0
- package/dist/assets/themes/base/_includes/frontend/sections/account-section-header.html +11 -0
- package/dist/assets/themes/base/_includes/frontend/sections/footer.html +154 -0
- package/dist/assets/themes/base/_includes/frontend/sections/nav.html +276 -0
- package/dist/assets/themes/base/_includes/global/sections/account.html +72 -0
- package/dist/assets/themes/base/_includes/global/sections/app-sidebar.html +248 -0
- package/dist/assets/themes/base/_includes/global/sections/app-topbar.html +228 -0
- package/dist/assets/themes/base/_includes/global/sections/page-header.html +99 -0
- package/dist/assets/themes/base/_layouts/admin/core/minimal-viewport-locked.html +22 -0
- package/dist/assets/themes/base/_layouts/admin/core/minimal.html +23 -0
- package/dist/assets/themes/base/_layouts/backend/core/base.html +57 -0
- package/dist/assets/themes/base/_layouts/backend/core/minimal-viewport-locked.html +32 -0
- package/dist/assets/themes/base/_layouts/backend/core/minimal.html +32 -0
- package/dist/assets/themes/base/_layouts/backend/pages/dashboard/index.html +230 -0
- package/dist/assets/themes/base/_layouts/frontend/core/base.html +31 -0
- package/dist/assets/themes/base/_layouts/frontend/core/cover.html +40 -0
- package/dist/assets/themes/base/_layouts/frontend/core/minimal.html +47 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/404.html +54 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/about.html +144 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/account/index.html +2104 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/alternative.html +319 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/index.html +186 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/app.html +142 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/auth/reset.html +53 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/auth/signin.html +90 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/auth/signup.html +141 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/auth/token.html +44 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/blog/categories/category.html +88 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/blog/categories/index.html +88 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/blog/index.html +255 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/blog/post.html +261 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/blog/tags/index.html +84 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/blog/tags/tag.html +88 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/collection/category.html +72 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/collection/document.html +54 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/collection/index.html +84 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/connections/callback.html +55 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/contact.html +214 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/download.html +793 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/extension/index.html +253 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/extension/installed.html +198 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/feedback.html +171 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/index.html +66 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/legal/document.html +78 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/payment/checkout.html +459 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/payment/confirmation.html +131 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/portal/email-preferences.html +104 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/pricing.html +596 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/status.html +361 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/team/index.html +210 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/team/member.html +125 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/updates/index.html +119 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/updates/update.html +118 -0
- package/dist/assets/themes/base/_sections/about/hero/section.html +68 -0
- package/dist/assets/themes/base/_sections/about/hero/section.json5 +58 -0
- package/dist/assets/themes/base/_sections/about/letter/section.html +60 -0
- package/dist/assets/themes/base/_sections/about/letter/section.json5 +56 -0
- package/dist/assets/themes/base/_sections/about/photo-band/section.html +24 -0
- package/dist/assets/themes/base/_sections/about/photo-band/section.json5 +23 -0
- package/dist/assets/themes/base/_sections/about/principles/section.html +17 -0
- package/dist/assets/themes/base/_sections/about/principles/section.json5 +34 -0
- package/dist/assets/themes/base/_sections/about/timeline/section.html +20 -0
- package/dist/assets/themes/base/_sections/about/timeline/section.json5 +34 -0
- package/dist/assets/themes/base/_sections/marketing/bento/section.html +91 -0
- package/dist/assets/themes/base/_sections/marketing/bento/section.json5 +152 -0
- package/dist/assets/themes/base/_sections/marketing/cta/section.html +44 -0
- package/dist/assets/themes/base/_sections/marketing/cta/section.json5 +47 -0
- package/dist/assets/themes/base/_sections/marketing/faq/section.html +52 -0
- package/dist/assets/themes/base/_sections/marketing/faq/section.json5 +68 -0
- package/dist/assets/themes/base/_sections/marketing/hero/section.html +349 -0
- package/dist/assets/themes/base/_sections/marketing/hero/section.json5 +335 -0
- package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.html +38 -0
- package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.js +86 -0
- package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.json5 +29 -0
- package/dist/assets/themes/base/_sections/marketing/pricing-cards/section.html +115 -0
- package/dist/assets/themes/base/_sections/marketing/pricing-cards/section.json5 +72 -0
- package/dist/assets/themes/base/_sections/marketing/product-demo/section.html +62 -0
- package/dist/assets/themes/base/_sections/marketing/product-demo/section.js +44 -0
- package/dist/assets/themes/base/_sections/marketing/product-demo/section.json5 +52 -0
- package/dist/assets/themes/base/_sections/marketing/prose/section.html +22 -0
- package/dist/assets/themes/base/_sections/marketing/prose/section.json5 +41 -0
- package/dist/assets/themes/base/_sections/marketing/showcase/section.html +35 -0
- package/dist/assets/themes/base/_sections/marketing/showcase/section.json5 +52 -0
- package/dist/assets/themes/base/_sections/marketing/stats/section.html +32 -0
- package/dist/assets/themes/base/_sections/marketing/stats/section.json5 +44 -0
- package/dist/assets/themes/base/_sections/marketing/testimonials/section.html +54 -0
- package/dist/assets/themes/base/_sections/marketing/testimonials/section.json5 +70 -0
- package/dist/assets/themes/base/_sections/marketing/trusted-by/section.html +30 -0
- package/dist/assets/themes/base/_sections/marketing/trusted-by/section.json5 +38 -0
- package/dist/assets/themes/base/_sections/verts/unit/section.html +7 -0
- package/dist/assets/themes/base/_sections/verts/unit/section.js +22 -0
- package/dist/assets/themes/base/_sections/verts/unit/section.json5 +24 -0
- package/dist/assets/themes/base/_sections/verts/unit/section.scss +24 -0
- package/dist/assets/themes/base/_theme.js +13 -0
- package/dist/assets/themes/base/_theme.scss +4 -0
- package/dist/assets/themes/bootstrap/_theme.js +16 -0
- package/dist/assets/themes/bootstrap/_theme.scss +11 -0
- package/dist/assets/themes/bootstrap/js/index.esm.js +19 -0
- package/dist/assets/themes/bootstrap/js/index.umd.js +34 -0
- package/dist/assets/themes/bootstrap/js/src/alert.js +87 -0
- package/dist/assets/themes/bootstrap/js/src/base-component.js +86 -0
- package/dist/assets/themes/bootstrap/js/src/button.js +72 -0
- package/dist/assets/themes/bootstrap/js/src/carousel.js +474 -0
- package/dist/assets/themes/bootstrap/js/src/collapse.js +297 -0
- package/dist/assets/themes/bootstrap/js/src/dom/data.js +55 -0
- package/dist/assets/themes/bootstrap/js/src/dom/event-handler.js +317 -0
- package/dist/assets/themes/bootstrap/js/src/dom/manipulator.js +71 -0
- package/dist/assets/themes/bootstrap/js/src/dom/selector-engine.js +126 -0
- package/dist/assets/themes/bootstrap/js/src/dropdown.js +458 -0
- package/dist/assets/themes/bootstrap/js/src/modal.js +378 -0
- package/dist/assets/themes/bootstrap/js/src/offcanvas.js +282 -0
- package/dist/assets/themes/bootstrap/js/src/popover.js +97 -0
- package/dist/assets/themes/bootstrap/js/src/scrollspy.js +296 -0
- package/dist/assets/themes/bootstrap/js/src/tab.js +315 -0
- package/dist/assets/themes/bootstrap/js/src/toast.js +224 -0
- package/dist/assets/themes/bootstrap/js/src/tooltip.js +632 -0
- package/dist/assets/themes/bootstrap/js/src/util/backdrop.js +151 -0
- package/dist/assets/themes/bootstrap/js/src/util/component-functions.js +35 -0
- package/dist/assets/themes/bootstrap/js/src/util/config.js +65 -0
- package/dist/assets/themes/bootstrap/js/src/util/focustrap.js +115 -0
- package/dist/assets/themes/bootstrap/js/src/util/index.js +306 -0
- package/dist/assets/themes/bootstrap/js/src/util/sanitizer.js +117 -0
- package/dist/assets/themes/bootstrap/js/src/util/scrollbar.js +114 -0
- package/dist/assets/themes/bootstrap/js/src/util/swipe.js +146 -0
- package/dist/assets/themes/bootstrap/js/src/util/template-factory.js +160 -0
- package/dist/assets/themes/bootstrap/overrides/_accordion.scss +21 -0
- package/dist/assets/themes/bootstrap/overrides/_avatars.scss +51 -0
- package/dist/assets/themes/bootstrap/overrides/_blog-images.scss +45 -0
- package/dist/assets/themes/bootstrap/overrides/_buttons-adaptive.scss +141 -0
- package/dist/assets/themes/bootstrap/overrides/_color-shades.scss +25 -0
- package/dist/assets/themes/bootstrap/overrides/_cursor-utilities.scss +13 -0
- package/dist/assets/themes/bootstrap/overrides/_index.scss +30 -0
- package/dist/assets/themes/bootstrap/overrides/_links.scss +26 -0
- package/dist/assets/themes/bootstrap/overrides/_soft-colors.scss +99 -0
- package/dist/assets/themes/bootstrap/overrides/_spacing-extended.scss +74 -0
- package/dist/assets/themes/bootstrap/overrides/_spinners.scss +22 -0
- package/dist/assets/themes/bootstrap/overrides/_typography-utilities.scss +40 -0
- package/dist/assets/themes/bootstrap/scss/_accordion.scss +153 -0
- package/dist/assets/themes/bootstrap/scss/_alert.scss +68 -0
- package/dist/assets/themes/bootstrap/scss/_badge.scss +38 -0
- package/dist/assets/themes/bootstrap/scss/_breadcrumb.scss +40 -0
- package/dist/assets/themes/bootstrap/scss/_button-group.scss +147 -0
- package/dist/assets/themes/bootstrap/scss/_buttons.scss +216 -0
- package/dist/assets/themes/bootstrap/scss/_card.scss +238 -0
- package/dist/assets/themes/bootstrap/scss/_carousel.scss +226 -0
- package/dist/assets/themes/bootstrap/scss/_close.scss +66 -0
- package/dist/assets/themes/bootstrap/scss/_containers.scss +41 -0
- package/dist/assets/themes/bootstrap/scss/_dropdown.scss +250 -0
- package/dist/assets/themes/bootstrap/scss/_forms.scss +9 -0
- package/dist/assets/themes/bootstrap/scss/_functions.scss +302 -0
- package/dist/assets/themes/bootstrap/scss/_grid.scss +39 -0
- package/dist/assets/themes/bootstrap/scss/_helpers.scss +12 -0
- package/dist/assets/themes/bootstrap/scss/_images.scss +42 -0
- package/dist/assets/themes/bootstrap/scss/_list-group.scss +199 -0
- package/dist/assets/themes/bootstrap/scss/_maps.scss +174 -0
- package/dist/assets/themes/bootstrap/scss/_mixins.scss +42 -0
- package/dist/assets/themes/bootstrap/scss/_modal.scss +240 -0
- package/dist/assets/themes/bootstrap/scss/_nav.scss +197 -0
- package/dist/assets/themes/bootstrap/scss/_navbar.scss +289 -0
- package/dist/assets/themes/bootstrap/scss/_offcanvas.scss +147 -0
- package/dist/assets/themes/bootstrap/scss/_pagination.scss +109 -0
- package/dist/assets/themes/bootstrap/scss/_placeholders.scss +51 -0
- package/dist/assets/themes/bootstrap/scss/_popover.scss +196 -0
- package/dist/assets/themes/bootstrap/scss/_progress.scss +68 -0
- package/dist/assets/themes/bootstrap/scss/_reboot.scss +611 -0
- package/dist/assets/themes/bootstrap/scss/_root.scss +187 -0
- package/dist/assets/themes/bootstrap/scss/_spinners.scss +85 -0
- package/dist/assets/themes/bootstrap/scss/_tables.scss +171 -0
- package/dist/assets/themes/bootstrap/scss/_toasts.scss +73 -0
- package/dist/assets/themes/bootstrap/scss/_tooltip.scss +119 -0
- package/dist/assets/themes/bootstrap/scss/_transitions.scss +27 -0
- package/dist/assets/themes/bootstrap/scss/_type.scss +106 -0
- package/dist/assets/themes/bootstrap/scss/_utilities.scss +806 -0
- package/dist/assets/themes/bootstrap/scss/_variables-dark.scss +102 -0
- package/dist/assets/themes/bootstrap/scss/_variables.scss +1753 -0
- package/dist/assets/themes/bootstrap/scss/bootstrap-grid.scss +62 -0
- package/dist/assets/themes/bootstrap/scss/bootstrap-reboot.scss +10 -0
- package/dist/assets/themes/bootstrap/scss/bootstrap-utilities.scss +19 -0
- package/dist/assets/themes/bootstrap/scss/bootstrap.scss +52 -0
- package/dist/assets/themes/bootstrap/scss/forms/_floating-labels.scss +97 -0
- package/dist/assets/themes/bootstrap/scss/forms/_form-check.scss +189 -0
- package/dist/assets/themes/bootstrap/scss/forms/_form-control.scss +214 -0
- package/dist/assets/themes/bootstrap/scss/forms/_form-range.scss +91 -0
- package/dist/assets/themes/bootstrap/scss/forms/_form-select.scss +80 -0
- package/dist/assets/themes/bootstrap/scss/forms/_form-text.scss +11 -0
- package/dist/assets/themes/bootstrap/scss/forms/_input-group.scss +132 -0
- package/dist/assets/themes/bootstrap/scss/forms/_labels.scss +36 -0
- package/dist/assets/themes/bootstrap/scss/forms/_validation.scss +12 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_clearfix.scss +3 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_color-bg.scss +7 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_colored-links.scss +30 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_focus-ring.scss +5 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_icon-link.scss +25 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_position.scss +36 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_ratio.scss +26 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_stacks.scss +15 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_stretched-link.scss +15 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_text-truncation.scss +7 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_vr.scss +8 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_alert.scss +18 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_backdrop.scss +14 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_banner.scss +7 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_border-radius.scss +78 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_box-shadow.scss +18 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_breakpoints.scss +127 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_buttons.scss +70 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_caret.scss +69 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_clearfix.scss +9 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_color-mode.scss +21 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_color-scheme.scss +7 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_container.scss +11 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_deprecate.scss +10 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_forms.scss +163 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_gradients.scss +47 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_grid.scss +151 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_image.scss +16 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_list-group.scss +26 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_lists.scss +7 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_pagination.scss +10 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_reset-text.scss +17 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_resize.scss +6 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_table-variants.scss +24 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_text-truncate.scss +8 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_transition.scss +26 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_utilities.scss +97 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_visually-hidden.scss +38 -0
- package/dist/assets/themes/bootstrap/scss/tests/jasmine.js +16 -0
- package/dist/assets/themes/bootstrap/scss/tests/mixins/_auto-import-of-variables-dark.test.scss +7 -0
- package/dist/assets/themes/bootstrap/scss/tests/mixins/_color-modes.test.scss +69 -0
- package/dist/assets/themes/bootstrap/scss/tests/mixins/_media-query-color-mode-full.test.scss +8 -0
- package/dist/assets/themes/bootstrap/scss/tests/mixins/_utilities.test.scss +393 -0
- package/dist/assets/themes/bootstrap/scss/tests/sass-true/register.js +14 -0
- package/dist/assets/themes/bootstrap/scss/tests/sass-true/runner.js +17 -0
- package/dist/assets/themes/bootstrap/scss/tests/utilities/_api.test.scss +75 -0
- package/dist/assets/themes/bootstrap/scss/utilities/_api.scss +47 -0
- package/dist/assets/themes/bootstrap/scss/vendor/_rfs.scss +348 -0
- package/dist/assets/themes/classy/README.md +89 -0
- package/dist/assets/themes/classy/_config.scss +245 -0
- package/dist/assets/themes/classy/_theme.js +31 -0
- package/dist/assets/themes/classy/_theme.scss +57 -0
- package/dist/assets/themes/classy/css/app/_panels.scss +183 -0
- package/dist/assets/themes/classy/css/base/_fonts.scss +79 -0
- package/dist/assets/themes/classy/css/base/_no-raise.scss +49 -0
- package/dist/assets/themes/classy/css/base/_root.scss +113 -0
- package/dist/assets/themes/classy/css/base/_typography.scss +154 -0
- package/dist/assets/themes/classy/css/base/_utilities.scss +284 -0
- package/dist/assets/themes/classy/css/components/_alerts.scss +51 -0
- package/dist/assets/themes/classy/css/components/_badges.scss +46 -0
- package/dist/assets/themes/classy/css/components/_buttons.scss +175 -0
- package/dist/assets/themes/classy/css/components/_cards.scss +41 -0
- package/dist/assets/themes/classy/css/components/_dropdowns.scss +48 -0
- package/dist/assets/themes/classy/css/components/_forms.scss +171 -0
- package/dist/assets/themes/classy/css/components/_receipt.scss +45 -0
- package/dist/assets/themes/classy/css/layout/_footer.scss +298 -0
- package/dist/assets/themes/classy/css/layout/_general.scss +209 -0
- package/dist/assets/themes/classy/css/layout/_nav.scss +154 -0
- package/dist/assets/themes/classy/css/layout/_shell.scss +458 -0
- package/dist/assets/themes/classy/css/marketing/_bento.scss +238 -0
- package/dist/assets/themes/classy/css/marketing/_content.scss +1328 -0
- package/dist/assets/themes/classy/css/marketing/_downloads.scss +246 -0
- package/dist/assets/themes/classy/css/marketing/_hero.scss +311 -0
- package/dist/assets/themes/classy/css/marketing/_sections.scss +649 -0
- package/dist/assets/themes/classy/css/pages/404/index.scss +67 -0
- package/dist/assets/themes/classy/css/pages/_auth.scss +235 -0
- package/dist/assets/themes/classy/css/pages/admin/firebase/index.scss +22 -0
- package/dist/assets/themes/classy/css/pages/blog/[slug].scss +56 -0
- package/dist/assets/themes/classy/css/pages/cookies.scss +2 -0
- package/dist/assets/themes/classy/css/pages/dashboard/account/index.scss +31 -0
- package/dist/assets/themes/classy/css/pages/feedback/index.scss +39 -0
- package/dist/assets/themes/classy/css/pages/legal/_document.scss +192 -0
- package/dist/assets/themes/classy/css/pages/payment/checkout/index.scss +585 -0
- package/dist/assets/themes/classy/css/pages/payment/confirmation/index.scss +9 -0
- package/dist/assets/themes/classy/css/pages/privacy.scss +2 -0
- package/dist/assets/themes/classy/css/pages/status/index.scss +164 -0
- package/dist/assets/themes/classy/css/pages/terms.scss +2 -0
- package/dist/assets/themes/classy/css/pages/updates/index.scss +128 -0
- package/dist/assets/themes/classy/fonts/inter-italic-latin-ext.woff2 +0 -0
- package/dist/assets/themes/classy/fonts/inter-italic-latin.woff2 +0 -0
- package/dist/assets/themes/classy/fonts/inter-normal-latin-ext.woff2 +0 -0
- package/dist/assets/themes/classy/fonts/inter-normal-latin.woff2 +0 -0
- package/dist/assets/themes/classy/fonts/newsreader-italic-latin-ext.woff2 +0 -0
- package/dist/assets/themes/classy/fonts/newsreader-italic-latin.woff2 +0 -0
- package/dist/assets/themes/classy/fonts/newsreader-normal-latin-ext.woff2 +0 -0
- package/dist/assets/themes/classy/fonts/newsreader-normal-latin.woff2 +0 -0
- package/dist/assets/themes/classy/js/hero-demo-form.js +56 -0
- package/dist/assets/themes/neobrutalism/README.md +118 -0
- package/dist/assets/themes/neobrutalism/_config.scss +139 -0
- package/dist/assets/themes/neobrutalism/_layouts/frontend/core/base.html +30 -0
- package/dist/assets/themes/neobrutalism/_layouts/frontend/pages/index.html +275 -0
- package/dist/assets/themes/neobrutalism/_theme.js +24 -0
- package/dist/assets/themes/neobrutalism/_theme.scss +61 -0
- package/dist/assets/themes/neobrutalism/css/base/_mixins.scss +46 -0
- package/dist/assets/themes/neobrutalism/css/base/_root.scss +169 -0
- package/dist/assets/themes/neobrutalism/css/base/_typography.scss +61 -0
- package/dist/assets/themes/neobrutalism/css/base/_utilities.scss +89 -0
- package/dist/assets/themes/neobrutalism/css/components/_billing-toggle.scss +74 -0
- package/dist/assets/themes/neobrutalism/css/components/_buttons.scss +148 -0
- package/dist/assets/themes/neobrutalism/css/components/_cards.scss +47 -0
- package/dist/assets/themes/neobrutalism/css/components/_forms.scss +88 -0
- package/dist/assets/themes/neobrutalism/css/components/_marketing.scss +244 -0
- package/dist/assets/themes/neobrutalism/css/layout/_general.scss +213 -0
- package/dist/assets/themes/neobrutalism/css/layout/_navigation.scss +171 -0
- package/dist/assets/themes/neobrutalism/css/pages/index.scss +203 -0
- package/dist/assets/themes/neobrutalism/css/pages/pricing/index.scss +58 -0
- package/dist/assets/themes/neobrutalism/css/pages/test/libraries/layers/index.scss +7 -0
- package/dist/assets/themes/neobrutalism/js/pages/test/libraries/layers/index.js +9 -0
- package/dist/assets/themes/newsflash/README.md +117 -0
- package/dist/assets/themes/newsflash/_components/heading/lede/component.html +14 -0
- package/dist/assets/themes/newsflash/_components/heading/lede/component.json5 +23 -0
- package/dist/assets/themes/newsflash/_components/heading/rule-head/component.html +17 -0
- package/dist/assets/themes/newsflash/_components/heading/rule-head/component.json5 +23 -0
- package/dist/assets/themes/newsflash/_components/news/byline/component.html +12 -0
- package/dist/assets/themes/newsflash/_components/news/byline/component.json5 +18 -0
- package/dist/assets/themes/newsflash/_components/news/story-card/component.html +25 -0
- package/dist/assets/themes/newsflash/_components/news/story-card/component.json5 +21 -0
- package/dist/assets/themes/newsflash/_config.scss +147 -0
- package/dist/assets/themes/newsflash/_layouts/frontend/core/base.html +51 -0
- package/dist/assets/themes/newsflash/_layouts/frontend/pages/blog/index.html +299 -0
- package/dist/assets/themes/newsflash/_layouts/frontend/pages/blog/post.html +235 -0
- package/dist/assets/themes/newsflash/_layouts/frontend/pages/index.html +328 -0
- package/dist/assets/themes/newsflash/_sections/marketing/desks/section.html +39 -0
- package/dist/assets/themes/newsflash/_sections/marketing/desks/section.json5 +49 -0
- package/dist/assets/themes/newsflash/_sections/marketing/newsletter-cta/section.html +103 -0
- package/dist/assets/themes/newsflash/_sections/marketing/newsletter-cta/section.json5 +50 -0
- package/dist/assets/themes/newsflash/_sections/marketing/rundown/section.html +28 -0
- package/dist/assets/themes/newsflash/_sections/marketing/rundown/section.json5 +40 -0
- package/dist/assets/themes/newsflash/_theme.js +24 -0
- package/dist/assets/themes/newsflash/_theme.scss +70 -0
- package/dist/assets/themes/newsflash/css/base/_fonts.scss +80 -0
- package/dist/assets/themes/newsflash/css/base/_mixins.scss +51 -0
- package/dist/assets/themes/newsflash/css/base/_root.scss +257 -0
- package/dist/assets/themes/newsflash/css/base/_typography.scss +49 -0
- package/dist/assets/themes/newsflash/css/base/_utilities.scss +122 -0
- package/dist/assets/themes/newsflash/css/components/_badges.scss +65 -0
- package/dist/assets/themes/newsflash/css/components/_billing-toggle.scss +61 -0
- package/dist/assets/themes/newsflash/css/components/_buttons.scss +139 -0
- package/dist/assets/themes/newsflash/css/components/_cards.scss +47 -0
- package/dist/assets/themes/newsflash/css/components/_editorial.scss +173 -0
- package/dist/assets/themes/newsflash/css/components/_forms.scss +75 -0
- package/dist/assets/themes/newsflash/css/components/_infinite-scroll.scss +102 -0
- package/dist/assets/themes/newsflash/css/components/_panels.scss +156 -0
- package/dist/assets/themes/newsflash/css/components/_ticker.scss +67 -0
- package/dist/assets/themes/newsflash/css/layout/_general.scss +330 -0
- package/dist/assets/themes/newsflash/css/layout/_navigation.scss +168 -0
- package/dist/assets/themes/newsflash/css/pages/404/index.scss +79 -0
- package/dist/assets/themes/newsflash/css/pages/blog/[slug].scss +186 -0
- package/dist/assets/themes/newsflash/css/pages/blog/index.scss +17 -0
- package/dist/assets/themes/newsflash/css/pages/index.scss +157 -0
- package/dist/assets/themes/newsflash/css/pages/pricing/index.scss +55 -0
- package/dist/assets/themes/newsflash/css/pages/test/libraries/layers/index.scss +7 -0
- package/dist/assets/themes/newsflash/fonts/fraunces-italic-latin-ext.woff2 +0 -0
- package/dist/assets/themes/newsflash/fonts/fraunces-italic-latin.woff2 +0 -0
- package/dist/assets/themes/newsflash/fonts/fraunces-normal-latin-ext.woff2 +0 -0
- package/dist/assets/themes/newsflash/fonts/fraunces-normal-latin.woff2 +0 -0
- package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-italic-latin-ext.woff2 +0 -0
- package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-italic-latin.woff2 +0 -0
- package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-normal-latin-ext.woff2 +0 -0
- package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-normal-latin.woff2 +0 -0
- package/dist/assets/themes/newsflash/js/pages/blog/[slug].js +29 -0
- package/dist/assets/themes/newsflash/js/pages/test/libraries/layers/index.js +9 -0
- package/dist/background.js +684 -0
- package/dist/build.js +268 -0
- package/dist/cli-run.js +25 -0
- package/dist/cli.js +30 -0
- package/dist/commands/build.js +67 -0
- package/dist/commands/clean.js +29 -0
- package/dist/commands/deploy.js +97 -0
- package/dist/commands/install.js +58 -0
- package/dist/commands/lib/dependencies.js +33 -0
- package/dist/commands/lib/deploy-precheck.js +57 -0
- package/dist/commands/lib/ensure-target.js +151 -0
- package/dist/commands/lib/push-secrets.js +60 -0
- package/dist/commands/migrate.js +77 -0
- package/dist/commands/test.js +110 -0
- package/dist/commands/update.js +21 -0
- package/dist/commands/version.js +12 -0
- package/dist/config/manifest.json +117 -0
- package/dist/config/page-template.html +21 -0
- package/dist/content.js +37 -0
- package/dist/defaults/.github/workflows/publish.yml +86 -0
- package/dist/defaults/.nvmrc +1 -0
- package/dist/defaults/.vscode/settings.json +8 -0
- package/dist/defaults/AGENTS.md +113 -0
- package/dist/defaults/CHANGELOG.md +15 -0
- package/dist/defaults/CLAUDE.md +1 -0
- package/dist/defaults/_.gitignore +75 -0
- package/dist/defaults/config/description.md +46 -0
- package/dist/defaults/config/messages.json +20 -0
- package/dist/defaults/config/omega.json5 +64 -0
- package/dist/defaults/docs/README.md +17 -0
- package/dist/defaults/gulpfile.js +6 -0
- package/dist/defaults/hooks/build/post.js +8 -0
- package/dist/defaults/hooks/build/pre.js +8 -0
- package/dist/defaults/src/assets/css/bundles/.gitkeep +0 -0
- package/dist/defaults/src/assets/css/components/content/index.scss +11 -0
- package/dist/defaults/src/assets/css/components/offscreen/index.scss +4 -0
- package/dist/defaults/src/assets/css/components/options/index.scss +14 -0
- package/dist/defaults/src/assets/css/components/pages/index.scss +10 -0
- package/dist/defaults/src/assets/css/components/popup/index.scss +10 -0
- package/dist/defaults/src/assets/css/components/sidepanel/index.scss +6 -0
- package/dist/defaults/src/assets/css/main.scss +32 -0
- package/dist/defaults/src/assets/images/.gitkeep +0 -0
- package/dist/defaults/src/assets/js/components/background/index.js +25 -0
- package/dist/defaults/src/assets/js/components/content/index.js +22 -0
- package/dist/defaults/src/assets/js/components/offscreen/index.js +25 -0
- package/dist/defaults/src/assets/js/components/options/index.js +22 -0
- package/dist/defaults/src/assets/js/components/pages/index.js +22 -0
- package/dist/defaults/src/assets/js/components/popup/index.js +22 -0
- package/dist/defaults/src/assets/js/components/sidepanel/index.js +20 -0
- package/dist/defaults/src/assets/vendor/.gitkeep +0 -0
- package/dist/defaults/src/manifest.json +131 -0
- package/dist/defaults/src/views/offscreen/index.html +3 -0
- package/dist/defaults/src/views/options/index.html +8 -0
- package/dist/defaults/src/views/pages/index.html +10 -0
- package/dist/defaults/src/views/popup/index.html +4 -0
- package/dist/defaults/src/views/sidepanel/index.html +4 -0
- package/dist/defaults/test/README.md +41 -0
- package/dist/defaults/test/_init.js +10 -0
- package/dist/defaults/test/boot/externally-connectable.test.js +28 -0
- package/dist/gulp/config/locales.js +12 -0
- package/dist/gulp/main.js +78 -0
- package/dist/gulp/tasks/_.js +18 -0
- package/dist/gulp/tasks/audit.js +222 -0
- package/dist/gulp/tasks/bundle.js +687 -0
- package/dist/gulp/tasks/defaults.js +281 -0
- package/dist/gulp/tasks/distribute.js +172 -0
- package/dist/gulp/tasks/fontawesome.js +25 -0
- package/dist/gulp/tasks/html.js +163 -0
- package/dist/gulp/tasks/icons.js +126 -0
- package/dist/gulp/tasks/package.js +742 -0
- package/dist/gulp/tasks/publish.js +417 -0
- package/dist/gulp/tasks/sass.js +252 -0
- package/dist/gulp/tasks/serve.js +103 -0
- package/dist/gulp/tasks/translate.js +252 -0
- package/dist/gulp/tasks/utils/build-json.js +43 -0
- package/dist/gulp/tasks/utils/template-transform.js +50 -0
- package/dist/gulp/templates/BUILD_INSTRUCTIONS.md +69 -0
- package/dist/index.js +46 -0
- package/dist/lib/affiliatizer.js +224 -0
- package/dist/lib/analytics.js +26 -0
- package/dist/lib/auth-helpers.js +213 -0
- package/dist/lib/extension.js +116 -0
- package/dist/lib/icons.js +36 -0
- package/dist/lib/logger-lite.js +35 -0
- package/dist/lib/logger.js +4 -0
- package/dist/lib/messaging.js +48 -0
- package/dist/lib/safe-install.js +4 -0
- package/dist/lib/theme.js +73 -0
- package/dist/lib/verts.js +68 -0
- package/dist/offscreen.js +31 -0
- package/dist/omega-bin.js +6 -0
- package/dist/options.js +80 -0
- package/dist/page.js +80 -0
- package/dist/popup.js +80 -0
- package/dist/sidepanel.js +80 -0
- package/dist/test/assert.js +4 -0
- package/dist/test/fixtures/consumer-extension/dist/background.js +23 -0
- package/dist/test/fixtures/consumer-extension/dist/manifest.json +20 -0
- package/dist/test/fixtures/consumer-extension/dist/options.html +10 -0
- package/dist/test/fixtures/consumer-extension/dist/popup.bundle.js +5 -0
- package/dist/test/fixtures/consumer-extension/dist/popup.html +12 -0
- package/dist/test/harness/extension/background.js +26 -0
- package/dist/test/harness/extension/manifest.json +27 -0
- package/dist/test/harness/extension/options.html +12 -0
- package/dist/test/harness/extension/popup.html +12 -0
- package/dist/test/harness/extension/sidepanel.html +12 -0
- package/dist/test/index.js +63 -0
- package/dist/test/runner.js +99 -0
- package/dist/test/runners/boot.js +221 -0
- package/dist/test/runners/chromium.js +391 -0
- package/dist/test/runners/helpers.js +24 -0
- package/dist/test/suites/background/messaging.test.js +44 -0
- package/dist/test/suites/background/storage.test.js +46 -0
- package/dist/test/suites/background/sw-context.test.js +49 -0
- package/dist/test/suites/boot/build-json-bake.test.js +80 -0
- package/dist/test/suites/boot/extension-loads.test.js +58 -0
- package/dist/test/suites/build/affiliatizer.test.js +64 -0
- package/dist/test/suites/build/app-launch.test.js +65 -0
- package/dist/test/suites/build/attach-log-file.test.js +99 -0
- package/dist/test/suites/build/auth-emulator-gate.test.js +118 -0
- package/dist/test/suites/build/auth-triggers.test.js +71 -0
- package/dist/test/suites/build/boot-discovery.test.js +134 -0
- package/dist/test/suites/build/boot-timeout.test.js +92 -0
- package/dist/test/suites/build/build-error-notification.test.js +122 -0
- package/dist/test/suites/build/build-json-bake.test.js +302 -0
- package/dist/test/suites/build/build-verb.test.js +138 -0
- package/dist/test/suites/build/bundle-targets.test.js +66 -0
- package/dist/test/suites/build/cache-warming.test.js +44 -0
- package/dist/test/suites/build/cli.test.js +150 -0
- package/dist/test/suites/build/default-boot-test.test.js +100 -0
- package/dist/test/suites/build/defaults-scaffold.test.js +287 -0
- package/dist/test/suites/build/deploy-dispatch.test.js +76 -0
- package/dist/test/suites/build/distribute-task.test.js +111 -0
- package/dist/test/suites/build/ensure-target.test.js +141 -0
- package/dist/test/suites/build/env-delivery.test.js +239 -0
- package/dist/test/suites/build/env-watch.test.js +86 -0
- package/dist/test/suites/build/expect.test.js +48 -0
- package/dist/test/suites/build/exports.test.js +53 -0
- package/dist/test/suites/build/extension-fallback.test.js +82 -0
- package/dist/test/suites/build/framework-deps.test.js +176 -0
- package/dist/test/suites/build/global-handlers.test.js +70 -0
- package/dist/test/suites/build/icon-sheet.test.js +74 -0
- package/dist/test/suites/build/logger-lite.test.js +61 -0
- package/dist/test/suites/build/manager.test.js +249 -0
- package/dist/test/suites/build/mode-helpers.test.js +136 -0
- package/dist/test/suites/build/omega-shell.test.js +103 -0
- package/dist/test/suites/build/omega-tokens.test.js +76 -0
- package/dist/test/suites/build/package-task.test.js +831 -0
- package/dist/test/suites/build/setup-scripts.test.js +172 -0
- package/dist/test/suites/build/strip-dev-blocks.test.js +122 -0
- package/dist/test/suites/build/template-replace.test.js +116 -0
- package/dist/test/suites/build/test-discovery.test.js +64 -0
- package/dist/test/suites/build/test-target-no-match.test.js +119 -0
- package/dist/test/suites/build/theme-resolve.test.js +115 -0
- package/dist/test/suites/build/translate.test.js +85 -0
- package/dist/test/suites/build/url-helpers.test.js +119 -0
- package/dist/test/suites/build/verb-logs.test.js +43 -0
- package/dist/test/suites/build/verts-binding.test.js +67 -0
- package/dist/test/suites/build/wakeup-ping.test.js +90 -0
- package/dist/test/suites/build/wave5-messenger.test.js +80 -0
- package/dist/test/suites/view/options-and-sidepanel.test.js +16 -0
- package/dist/test/suites/view/popup-context.test.js +53 -0
- package/dist/test/suites/view/sidepanel.test.js +16 -0
- package/dist/test/utils/extended-mode-warning.js +13 -0
- package/dist/utils/attach-log-file.js +4 -0
- package/dist/utils/mode-helpers.js +117 -0
- package/dist/utils/url-helpers.js +69 -0
- package/dist/vendor/account/engine.js +182 -0
- package/dist/vendor/account/features.js +220 -0
- package/dist/vendor/account/index.js +53 -0
- package/dist/vendor/account/schema.js +272 -0
- package/dist/vendor/account/subscription.js +38 -0
- package/dist/vendor/config/company.js +31 -0
- package/dist/vendor/config/defaults.js +173 -0
- package/dist/vendor/config/demo.js +18 -0
- package/dist/vendor/config/desktop-artifacts.js +110 -0
- package/dist/vendor/config/edit.js +769 -0
- package/dist/vendor/config/env-delivery.js +145 -0
- package/dist/vendor/config/env-rules.js +93 -0
- package/dist/vendor/config/env-schema.js +1078 -0
- package/dist/vendor/config/env.js +445 -0
- package/dist/vendor/config/hooks.js +97 -0
- package/dist/vendor/config/index.js +237 -0
- package/dist/vendor/config/instances.js +208 -0
- package/dist/vendor/config/load.js +490 -0
- package/dist/vendor/config/merge.js +68 -0
- package/dist/vendor/config/order.js +139 -0
- package/dist/vendor/config/ports.js +374 -0
- package/dist/vendor/config/providers.js +32 -0
- package/dist/vendor/config/repo.js +142 -0
- package/dist/vendor/config/retired-keys.js +430 -0
- package/dist/vendor/config/schema.js +1610 -0
- package/dist/vendor/config/secrets.js +50 -0
- package/dist/vendor/config/seed.js +34 -0
- package/dist/vendor/config/site-global.js +205 -0
- package/dist/vendor/config/validate.js +554 -0
- package/dist/vendor/config/winback.js +61 -0
- package/dist/vendor/devkit/actions-secrets.js +145 -0
- package/dist/vendor/devkit/attach-log-file.js +262 -0
- package/dist/vendor/devkit/bundle.js +292 -0
- package/dist/vendor/devkit/ci-workflows.js +520 -0
- package/dist/vendor/devkit/clean-dirs.js +28 -0
- package/dist/vendor/devkit/cli-router.js +156 -0
- package/dist/vendor/devkit/defaults-engine.js +372 -0
- package/dist/vendor/devkit/deploy-precheck.js +54 -0
- package/dist/vendor/devkit/deploy-record.js +180 -0
- package/dist/vendor/devkit/deploy.js +286 -0
- package/dist/vendor/devkit/empty-modules-plugin.js +64 -0
- package/dist/vendor/devkit/env-watch.js +132 -0
- package/dist/vendor/devkit/framework-deps.js +46 -0
- package/dist/vendor/devkit/icons.js +178 -0
- package/dist/vendor/devkit/license.js +155 -0
- package/dist/vendor/devkit/local.js +1905 -0
- package/dist/vendor/devkit/logger.js +128 -0
- package/dist/vendor/devkit/merge-line-files.js +296 -0
- package/dist/vendor/devkit/npm-registry.js +52 -0
- package/dist/vendor/devkit/omega-bin.js +345 -0
- package/dist/vendor/devkit/safe-install.js +18 -0
- package/dist/vendor/devkit/scaffold-guard.js +96 -0
- package/dist/vendor/devkit/strip-dev-blocks-plugin.js +29 -0
- package/dist/vendor/devkit/strip-dev-blocks.js +32 -0
- package/dist/vendor/devkit/target-dependencies.js +137 -0
- package/dist/vendor/devkit/target-secrets.js +165 -0
- package/dist/vendor/devkit/test/assert.js +120 -0
- package/dist/vendor/devkit/test/define-cases.js +104 -0
- package/dist/vendor/devkit/test/extended-mode-warning.js +22 -0
- package/dist/vendor/devkit/test/runner-core.js +554 -0
- package/dist/vendor/devkit/test/scope.js +162 -0
- package/dist/vendor/devkit/translate/cache.js +84 -0
- package/dist/vendor/devkit/translate/engine.js +243 -0
- package/dist/vendor/devkit/translate/index.js +49 -0
- package/dist/vendor/devkit/translate/languages.js +134 -0
- package/dist/vendor/devkit/translate/providers.js +188 -0
- package/dist/vendor/devkit/update.js +569 -0
- package/docs/affiliatizer.md +81 -0
- package/docs/audit.md +67 -0
- package/docs/auth.md +149 -0
- package/docs/build-system.md +176 -0
- package/docs/cdp-debugging.md +42 -0
- package/docs/cli.md +73 -0
- package/docs/common-mistakes.md +10 -0
- package/docs/components.md +87 -0
- package/docs/css.md +133 -0
- package/docs/defaults.md +72 -0
- package/docs/environment-detection.md +79 -0
- package/docs/extension.md +93 -0
- package/docs/hooks.md +111 -0
- package/docs/icons.md +47 -0
- package/docs/index.md +291 -0
- package/docs/logging.md +33 -0
- package/docs/managers.md +100 -0
- package/docs/offscreen.md +57 -0
- package/docs/publishing.md +182 -0
- package/docs/shared/agent-docs.md +89 -0
- package/docs/shared/analytics.md +612 -0
- package/docs/shared/brands.md +51 -0
- package/docs/shared/breaking-changes.md +497 -0
- package/docs/shared/config.md +1387 -0
- package/docs/shared/deploys.md +215 -0
- package/docs/shared/icons.md +201 -0
- package/docs/shared/local-dev.md +147 -0
- package/docs/shared/logging.md +202 -0
- package/docs/shared/monitoring.md +153 -0
- package/docs/shared/publishing.md +183 -0
- package/docs/shared/rulings.md +34 -0
- package/docs/shared/testing.md +147 -0
- package/docs/shared/theming.md +604 -0
- package/docs/shared/translation.md +291 -0
- package/docs/shared/updates.md +61 -0
- package/docs/templating.md +66 -0
- package/docs/test-boot-layer.md +143 -0
- package/docs/test-framework.md +411 -0
- package/docs/themes.md +89 -0
- package/docs/translations.md +73 -0
- package/docs/verts.md +67 -0
- package/docs/xss-prevention.md +95 -0
- package/package.json +159 -0
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
# Test Framework
|
|
2
|
+
|
|
3
|
+
Built-in test framework for both @omega.js/extension itself and consumer projects. Jest-like assertion syntax (`expect(actual).toBe(expected)`), four layers, @omega.js/backend/EM-style output.
|
|
4
|
+
|
|
5
|
+
## Running tests
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npx omega test # consumer: runs YOUR project suites (bare runs never include the framework corpus)
|
|
9
|
+
npx omega test --layer build # only build-layer suites (plain Node, fast)
|
|
10
|
+
npx omega test --layer background # only background-layer suites (real MV3 SW)
|
|
11
|
+
npx omega test --layer view # only view-layer suites (popup/options/sidepanel)
|
|
12
|
+
npx omega test --layer boot # only boot-layer suites (real consumer extension)
|
|
13
|
+
npx omega test --filter "messaging" # only suites/tests whose name contains "messaging"
|
|
14
|
+
npx omega test --extended # run extended suites against REAL external services (Firebase, etc.) — normal mode skips them in-source, never mocks them
|
|
15
|
+
TEST_EXTENDED_MODE=true npx omega test # same as --extended (the shared, unprefixed env var across all OMEGA frameworks)
|
|
16
|
+
npx omega test --reporter json # pretty output + machine-readable {"event":"summary",...} line
|
|
17
|
+
OMEGA_TEST_DEBUG=1 npx omega test # see Chromium/SW stderr (otherwise drained silently)
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
In @omega.js/extension itself, `npm test` does the same.
|
|
21
|
+
|
|
22
|
+
All test output is also teed (ANSI-stripped) to `<projectRoot>/logs/test.log`, truncated fresh on each run — same pattern as EM's `test.log` and @omega.js/backend's `test.log`. Grep it after a run instead of scrolling terminal output.
|
|
23
|
+
|
|
24
|
+
### Selecting which tests run
|
|
25
|
+
|
|
26
|
+
`npx omega test` takes two independent selectors that compose:
|
|
27
|
+
|
|
28
|
+
1. **The positional target** selects which test **files** run, by source + path.
|
|
29
|
+
2. **`--filter=<substring>`** matches test **names/descriptions** within the already-selected files.
|
|
30
|
+
|
|
31
|
+
#### Positional target — select files by source + path
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# Project suites only (the consumer default — the framework corpus needs an explicit prefix)
|
|
35
|
+
npx omega test
|
|
36
|
+
|
|
37
|
+
# ONLY project tests (all of them)
|
|
38
|
+
npx omega test project:
|
|
39
|
+
|
|
40
|
+
# Only project tests matching a path
|
|
41
|
+
npx omega test project:custom-test
|
|
42
|
+
|
|
43
|
+
# ONLY framework tests (mgr: is the universal cross-framework alias)
|
|
44
|
+
npx omega test mgr:
|
|
45
|
+
|
|
46
|
+
# ONLY framework tests (extension-specific aliases — equivalent to mgr:)
|
|
47
|
+
npx omega test extension:
|
|
48
|
+
npx omega test framework:
|
|
49
|
+
|
|
50
|
+
# Framework tests matching a path
|
|
51
|
+
npx omega test mgr:build/config
|
|
52
|
+
npx omega test extension:build/config
|
|
53
|
+
|
|
54
|
+
# Bare path (no prefix) — PROJECT tests matched by path
|
|
55
|
+
npx omega test build/config
|
|
56
|
+
|
|
57
|
+
# Both sources — always an explicit choice
|
|
58
|
+
npx omega test full:
|
|
59
|
+
npx omega test full:build/config
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
The source prefix is standardized across all four OMEGA frameworks:
|
|
63
|
+
|
|
64
|
+
| Target | Selects |
|
|
65
|
+
|---|---|
|
|
66
|
+
| *(none)* | Project suites only (framework self-test context flips this to the framework suite) |
|
|
67
|
+
| `project:` | ONLY project tests (all of them) |
|
|
68
|
+
| `project:<path>` | Only project tests matching `<path>` |
|
|
69
|
+
| `mgr:` | ONLY framework tests (`mgr:` is the universal alias for "the manager's own tests") |
|
|
70
|
+
| `extension:` / `framework:` | ONLY framework tests (extension-specific aliases, equivalent to `mgr:`) |
|
|
71
|
+
| `mgr:<path>` / `extension:<path>` | Framework tests matching `<path>` |
|
|
72
|
+
| `<path>` (bare) | PROJECT tests matched by `<path>` |
|
|
73
|
+
| `full:` / `full:<path>` | BOTH sources — the only way a consumer run includes the framework suite |
|
|
74
|
+
|
|
75
|
+
A source-prefixed target excludes the other source entirely; the path part (if any) matches by relative path prefix (relative to each source's `test/` root).
|
|
76
|
+
|
|
77
|
+
A target that names a path and matches NO file is a hard error: the run prints `No test file matches "<target>"` and exits 1, so a typo'd path, or a suite renamed out from under a target, can never run silently green ([#814](https://github.com/Omega-JS-Stack/omega/issues/814)). A run that named no file (bare, or a bare source prefix) still exits 0 when there is nothing to run. Inside a brand-root fan-out the manager sets `OMEGA_TEST_FANOUT=1` on every forwarded run, and the same miss answers with exit 3 instead: a path another target carries is a no-op here, and the brand run fails only when EVERY target missed ([docs/shared/testing.md](../../../docs/shared/testing.md#brand-root-cp94b)).
|
|
78
|
+
|
|
79
|
+
#### `--filter` — match test names/descriptions
|
|
80
|
+
|
|
81
|
+
`--filter` is **orthogonal** to the positional target: it matches a substring against test **names/descriptions** within the files the target already selected. They compose.
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# All suites, but only tests whose name contains "messaging"
|
|
85
|
+
npx omega test --filter "messaging"
|
|
86
|
+
|
|
87
|
+
# Project files only, then only tests named "*storage*" within them
|
|
88
|
+
npx omega test project: --filter "storage"
|
|
89
|
+
|
|
90
|
+
# Combine the target with extended mode
|
|
91
|
+
TEST_EXTENDED_MODE=true npx omega test build/config
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Layers
|
|
95
|
+
|
|
96
|
+
| Layer | Runs in | Use for |
|
|
97
|
+
|---|---|---|
|
|
98
|
+
| `build` | Plain Node, fast (~ms) | `Manager.getConfig/getManifest/getPackage`, CLI alias resolution, schema/manifest validation, build helpers, `lib/*.js` regex maps + utilities |
|
|
99
|
+
| `background` | Real MV3 service worker via Puppeteer + CDP | Background boot sequence, Firebase auth wiring, messaging listeners, `chrome.runtime.onMessage` handlers |
|
|
100
|
+
| `view` | Chromium tab loading harness extension's popup.html / options.html / sidepanel.html | DOM bindings, Manager surface, @omega.js/client integration, popup ↔ background messaging |
|
|
101
|
+
| `boot` | Real headless Chromium with the **consumer's** `packaged/<browser>/raw/` loaded as unpacked | End-to-end smoke: does the consumer's actual extension boot? Manifest validates? SW comes up? Popup renders? |
|
|
102
|
+
|
|
103
|
+
`all` (default) runs build → background → view → boot.
|
|
104
|
+
|
|
105
|
+
## NEVER mock — test against the real harness
|
|
106
|
+
|
|
107
|
+
Every layer hands your test the **real** runtime, never a hand-rolled fake:
|
|
108
|
+
|
|
109
|
+
- **No `mockManager`, no fake `chrome`/`browser` objects, no stubbed background/popup contexts.** `background`-layer tests run inside a real MV3 service worker with the real `chrome.*` API; `view`-layer tests run inside a real Chromium tab with the real DOM and real `chrome.runtime` messaging; `boot`-layer tests load the consumer's real packaged extension. Use what the harness gives you (`ctx`, `ctx.manager`, `ctx.page`, the `inspect` callback's `{ extension, page }`, and the browser globals `chrome` / `document` / `window`) — do not reconstruct any of it.
|
|
110
|
+
- **Pure functions (zero I/O) are the only thing you call directly.** A regex map in `lib/*.js`, a string formatter, a config-shape validator — `require` it and assert on its output in a `build`-layer test. That is not mocking; it is calling a pure function. Anything that touches real I/O (storage, messaging, the SW lifecycle, the DOM, the network) runs against the real harness, not a substitute.
|
|
111
|
+
|
|
112
|
+
### Real external APIs are GATED, NOT mocked
|
|
113
|
+
|
|
114
|
+
Tests that hit a real external service (Firebase, push, any network call) live in **extended suites** and are gated behind extended mode (`npx omega test --extended` or `TEST_EXTENDED_MODE=true`):
|
|
115
|
+
|
|
116
|
+
- **Normal mode** (`npx omega test`) **SKIPS** these calls **in-source** — guard them with `ctx.skip(reason)` (or an early return) so the test no-ops when extended mode is off. The external API is **skipped in-source, NOT mocked.** Never stand up a fake Firebase / fake fetch to make a normal-mode run go green.
|
|
117
|
+
- **Extended mode** (`npx omega test --extended`) runs the same code against the **real** service.
|
|
118
|
+
- **Anything an extended test creates externally MUST be cleaned up by the test** — delete the doc/user/record it created (use the suite/group `cleanup: async (ctx) => { ... }` hook, which runs after the last test). Leave no residue in the real backend.
|
|
119
|
+
|
|
120
|
+
### Extended mode (`TEST_EXTENDED_MODE`)
|
|
121
|
+
|
|
122
|
+
Extended mode is the opt-in for tests that hit REAL external services (Firebase via @omega.js/client, push, any network call from the background SW / popup / content scripts) instead of skipping them.
|
|
123
|
+
|
|
124
|
+
- **Skipped by default.** `npx omega test` runs fast and offline-safe — external calls no-op in-source.
|
|
125
|
+
- **Opt in** with `npx omega test --extended` (CLI shorthand) or `TEST_EXTENDED_MODE=true npx omega test` (env var). `TEST_EXTENDED_MODE=1` is also accepted.
|
|
126
|
+
- **Shared, unprefixed name across all OMEGA frameworks.** All four OMEGA frameworks read the SAME `TEST_EXTENDED_MODE` env var (the canonical name is @omega.js/backend's) — no `BXM_`-prefixed variant.
|
|
127
|
+
- **Propagates to every spawned test environment.** The command sets `process.env.TEST_EXTENDED_MODE = 'true'`, which is visible to the in-process Node runner and inherited by Puppeteer's Chromium (background / view / boot layers) since `puppeteer.launch()` inherits `process.env`.
|
|
128
|
+
- **The warning prints.** When on, the command logs `Test mode: extended (real external APIs)` plus a `⚠️` banner (teed to `logs/test.log`); when off it logs `normal (external APIs skipped)`.
|
|
129
|
+
- **Tests gate on `process.env.TEST_EXTENDED_MODE`.** Guard external-service tests with `if (process.env.TEST_EXTENDED_MODE !== 'true') ctx.skip('extended mode off');` (or an early return) so they no-op in normal mode.
|
|
130
|
+
|
|
131
|
+
### The ONLY two exceptions where a narrow stub is allowed
|
|
132
|
+
|
|
133
|
+
Mock **nothing** by default. There are exactly two cases where the real dependency genuinely cannot run in the test environment — and even then, stub the *smallest possible seam* (one method / one module), restore it immediately, and comment *why*:
|
|
134
|
+
|
|
135
|
+
1. **A side effect that would destroy the test run itself.** If invoking the real thing would kill or corrupt the harness — a process-exit, a destructive clean/wipe, or a *recursive re-invocation of a CLI command* (running the real `test`/`clean`/`setup` command from inside a test re-enters the runner) — you may stub *that one module/call* to a no-op, assert the dispatch logic, then restore. (Example: `cli.test.js` stubs the real command modules so testing CLI dispatch doesn't actually run them.)
|
|
136
|
+
2. **A real dependency the test environment can't provide.** When the real object only exists from infra you can't stand up in a `build`-layer unit test, a unit test may hand a minimal stub to verify a narrow side effect — but a real-harness layer (`background`/`view`/`boot`) MUST still cover the wired path where one exists.
|
|
137
|
+
|
|
138
|
+
If you can run it for real, you must. These exceptions are not a license to unit-test in isolation when a real-harness layer would work.
|
|
139
|
+
|
|
140
|
+
## Test coverage — every surface gets a test (HARD RULE)
|
|
141
|
+
|
|
142
|
+
A feature is not done when it works — it's done when every surface it exposes is covered in the layer that owns that surface:
|
|
143
|
+
|
|
144
|
+
| Coverage | Layer | Proves |
|
|
145
|
+
|---|---|---|
|
|
146
|
+
| **Logic** | `build` / `background` | The feature's functions do the right thing when called directly (real Manager, real `chrome.*`, real storage/messaging) |
|
|
147
|
+
| **UI** | `view` | The feature's interface is WIRED — a real event on the real DOM triggers the behavior and the visible result appears |
|
|
148
|
+
| **End-to-end** | `boot` | The feature survives in the consumer's actual packaged extension (extend the boot suite's `inspect` assertions) |
|
|
149
|
+
|
|
150
|
+
**Skipping a layer is the exception, not the default.** A layer may be skipped ONLY when the feature genuinely has no surface there — a pure build-time utility has no UI; a CSS-only tweak has no logic to call. Convenience is never a reason: "the logic test already covers it" does NOT excuse the UI test — logic tests prove the logic, UI tests prove the wiring (a button can come unhooked while every logic test stays green), boot tests prove the packaging. When in doubt, write the test.
|
|
151
|
+
|
|
152
|
+
## `OMEGA_TEST_MODE=true` — the canonical "we're in tests" signal
|
|
153
|
+
|
|
154
|
+
Both @omega.js/extension test runners set `OMEGA_TEST_MODE=true` in spawned child envs. That powers `manager.isTesting()` (and `Manager.isTesting()` static) — the cross-context helper anything in @omega.js/extension/consumer code should check when behavior needs to differ in tests. See [environment-detection.md](environment-detection.md).
|
|
155
|
+
|
|
156
|
+
Consumers writing their own tests get this automatically when running through `npx omega test`. To set it manually in another runner:
|
|
157
|
+
|
|
158
|
+
```json
|
|
159
|
+
"test": "OMEGA_TEST_MODE=true vitest"
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Test discovery
|
|
163
|
+
|
|
164
|
+
- **Framework defaults**: `<@omega.js/extension>/dist/test/suites/**/*.js`
|
|
165
|
+
- **Consumer suites**: `<cwd>/test/**/*.js`
|
|
166
|
+
|
|
167
|
+
**The underscore convention** (`DISCOVERY_IGNORE` in `src/test/runner.js`): `_`-prefixed FILES (`test/_init.js`, `test/page/_helper.js`) and everything under a `_`-prefixed DIRECTORY at **any depth** (`test/_fixtures/**`, `test/boot/_private/**`) are excluded from suite discovery. Put shared helpers, fixture data, and non-test support files in `_`-prefixed paths — e.g. `test/_fixtures/`, `test/_helpers/`. The runner still specifically loads `test/_init.js` as the lifecycle hook. Matches the same convention in @omega.js/backend/EM/UJM. Files load alphabetically.
|
|
168
|
+
|
|
169
|
+
**Framework's boot suites are scoped to @omega.js/extension self-test runs only.** When a consumer runs `npx omega test`, the framework's `dist/test/suites/boot/**` is excluded from discovery (those tests assert on @omega.js/extension's internal fixture extension). Consumers write their own boot tests under `<cwd>/test/boot/`. See [test-boot-layer.md](test-boot-layer.md).
|
|
170
|
+
|
|
171
|
+
## `test/_init.js` — pre-test lifecycle hook
|
|
172
|
+
|
|
173
|
+
The runner loads an optional `test/_init.js` from **both** test roots — the framework (`<@omega.js/extension>/test/_init.js`) and the consumer project (`<cwd>/test/_init.js`) — and runs it **once, before any suite** (it is NOT itself run as a test; the `_`-prefix keeps it out of discovery). Mirrors the same hook in @omega.js/backend/EM/UJM so all four frameworks share one shape.
|
|
174
|
+
|
|
175
|
+
The module **must export a function** — `module.exports = (ctx) => ({ ... })` — called with `{ projectRoot }` and returning the hook object. It may declare:
|
|
176
|
+
|
|
177
|
+
- `async setup({ projectRoot })` — runs once before the suites, e.g. to scaffold a fixture file the boot layer needs.
|
|
178
|
+
|
|
179
|
+
There is **no `cleanup` hook** and **no `accounts` field** (unlike @omega.js/backend — these frameworks have no auth/user system): tests clean up after themselves, so there is nothing project-level to tear down.
|
|
180
|
+
|
|
181
|
+
```javascript
|
|
182
|
+
// <cwd>/test/_init.js
|
|
183
|
+
const fs = require('fs');
|
|
184
|
+
const path = require('path');
|
|
185
|
+
|
|
186
|
+
module.exports = ({ projectRoot }) => ({
|
|
187
|
+
async setup() {
|
|
188
|
+
// Seed any fixture a suite needs before it runs.
|
|
189
|
+
fs.mkdirSync(path.join(projectRoot, '.temp'), { recursive: true });
|
|
190
|
+
},
|
|
191
|
+
});
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Test file shapes
|
|
195
|
+
|
|
196
|
+
Three forms — pick whichever fits.
|
|
197
|
+
|
|
198
|
+
### Suite (sequential, share state, stop on first failure)
|
|
199
|
+
|
|
200
|
+
```js
|
|
201
|
+
module.exports = {
|
|
202
|
+
type: 'suite',
|
|
203
|
+
layer: 'background',
|
|
204
|
+
description: 'storage round-trip',
|
|
205
|
+
cleanup: async (ctx) => { /* runs after the last test */ },
|
|
206
|
+
tests: [
|
|
207
|
+
{
|
|
208
|
+
name: 'set returns without throwing',
|
|
209
|
+
run: async (ctx) => {
|
|
210
|
+
await chrome.storage.local.set({ k: 'v' });
|
|
211
|
+
ctx.expect(true).toBe(true);
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
name: 'get returns the just-set value',
|
|
216
|
+
run: async (ctx) => {
|
|
217
|
+
const out = await chrome.storage.local.get('k');
|
|
218
|
+
ctx.expect(out.k).toBe('v');
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
],
|
|
222
|
+
};
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Tests share `ctx.state` across the suite. If one fails, remaining tests are skipped (`stopOnFailure: false` to disable).
|
|
226
|
+
|
|
227
|
+
### Group (sequential, share state, run all regardless of failures)
|
|
228
|
+
|
|
229
|
+
```js
|
|
230
|
+
module.exports = {
|
|
231
|
+
type: 'group',
|
|
232
|
+
layer: 'build',
|
|
233
|
+
description: 'config defaults',
|
|
234
|
+
tests: [ /* same shape as suite */ ],
|
|
235
|
+
};
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Standalone (single test per file)
|
|
239
|
+
|
|
240
|
+
```js
|
|
241
|
+
module.exports = {
|
|
242
|
+
layer: 'build',
|
|
243
|
+
description: 'manifest_version is 3',
|
|
244
|
+
run: (ctx) => {
|
|
245
|
+
const m = Manager.getManifest();
|
|
246
|
+
ctx.expect(m.manifest_version).toBe(3);
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### Array form (treated as a group)
|
|
252
|
+
|
|
253
|
+
```js
|
|
254
|
+
module.exports = [
|
|
255
|
+
{ name: 'test 1', run: (ctx) => { /* ... */ } },
|
|
256
|
+
{ name: 'test 2', run: (ctx) => { /* ... */ } },
|
|
257
|
+
];
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## The `ctx` object
|
|
261
|
+
|
|
262
|
+
Every `run` / `cleanup` callback receives `ctx`:
|
|
263
|
+
|
|
264
|
+
- `ctx.expect` — Jest-compatible assertion library
|
|
265
|
+
- `ctx.state` — shared object across tests in a suite/group
|
|
266
|
+
- `ctx.skip(reason)` — throw to skip the current test at runtime
|
|
267
|
+
- `ctx.layer` — current layer name (`'build' | 'background' | 'view' | 'boot'`)
|
|
268
|
+
- `ctx.manager` — present on background-layer tests (the framework Manager instance)
|
|
269
|
+
- `ctx.page` — present on view-layer tests (the loaded tab's window)
|
|
270
|
+
|
|
271
|
+
Boot-layer tests use `inspect: async ({ extension, page, expect, projectRoot }) => { ... }` instead of `run`. See [test-boot-layer.md](test-boot-layer.md).
|
|
272
|
+
|
|
273
|
+
## `expect()` matchers
|
|
274
|
+
|
|
275
|
+
Same Jest-compatible surface across all layers:
|
|
276
|
+
|
|
277
|
+
```js
|
|
278
|
+
ctx.expect(actual).toBe(expected); // strict ===
|
|
279
|
+
ctx.expect(actual).toEqual(expected); // deep equality
|
|
280
|
+
ctx.expect(actual).toBeTruthy() / .toBeFalsy()
|
|
281
|
+
ctx.expect(actual).toBeDefined() / .toBeUndefined()
|
|
282
|
+
ctx.expect(actual).toBeNull()
|
|
283
|
+
ctx.expect(actual).toContain(item); // string or array
|
|
284
|
+
ctx.expect(actual).toHaveProperty('key')
|
|
285
|
+
ctx.expect(actual).toMatch(/regex/)
|
|
286
|
+
ctx.expect(actual).toBeInstanceOf(Class)
|
|
287
|
+
ctx.expect(actual).toBeGreaterThan(n) / .toBeLessThan(n)
|
|
288
|
+
await ctx.expect(fn).toThrow(/regex/) // async — fn may be async
|
|
289
|
+
ctx.expect(actual).not.toBe(expected) // negation: every matcher
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
## Consumer pattern — use the public Manager API
|
|
293
|
+
|
|
294
|
+
Don't `require('json5')` or other transitive @omega.js/extension deps directly from consumer tests — they're not in your `package.json` and the resolution path is fragile. Instead use @omega.js/extension's public API:
|
|
295
|
+
|
|
296
|
+
```js
|
|
297
|
+
const Manager = require('@omega.js/extension/build');
|
|
298
|
+
|
|
299
|
+
// Parsed JSON5 — same logic the framework uses internally
|
|
300
|
+
const config = Manager.getConfig();
|
|
301
|
+
const manifest = Manager.getManifest();
|
|
302
|
+
|
|
303
|
+
// Borrow any of @omega.js/extension's bundled deps without listing them yourself
|
|
304
|
+
const JSON5 = Manager.require('json5');
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
This is the same pattern EM and @omega.js/backend consumers use — assert on framework API output rather than re-implementing parsing/loading in every test.
|
|
308
|
+
|
|
309
|
+
## Build-layer example
|
|
310
|
+
|
|
311
|
+
```js
|
|
312
|
+
// test/build/config.test.js
|
|
313
|
+
const Manager = require('@omega.js/extension/build');
|
|
314
|
+
|
|
315
|
+
module.exports = {
|
|
316
|
+
type: 'suite',
|
|
317
|
+
layer: 'build',
|
|
318
|
+
description: 'config has required brand fields',
|
|
319
|
+
tests: [
|
|
320
|
+
{
|
|
321
|
+
name: 'brand.id is set',
|
|
322
|
+
run: (ctx) => {
|
|
323
|
+
ctx.expect(Manager.getConfig().brand.id).toBeTruthy();
|
|
324
|
+
},
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
name: 'cloud.config.projectId matches brand.id',
|
|
328
|
+
run: (ctx) => {
|
|
329
|
+
const cfg = Manager.getConfig();
|
|
330
|
+
ctx.expect(cfg.cloud.config.projectId).toBe(cfg.brand.id);
|
|
331
|
+
},
|
|
332
|
+
},
|
|
333
|
+
],
|
|
334
|
+
};
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
## Background-layer example
|
|
338
|
+
|
|
339
|
+
```js
|
|
340
|
+
// test/background/messaging.test.js
|
|
341
|
+
module.exports = {
|
|
342
|
+
type: 'suite',
|
|
343
|
+
layer: 'background',
|
|
344
|
+
description: 'chrome.runtime.* surface in real SW',
|
|
345
|
+
tests: [
|
|
346
|
+
{
|
|
347
|
+
name: 'chrome.runtime.id is a non-empty string',
|
|
348
|
+
run: async (ctx) => {
|
|
349
|
+
ctx.expect(typeof chrome.runtime.id).toBe('string');
|
|
350
|
+
ctx.expect(chrome.runtime.id.length).toBeGreaterThan(0);
|
|
351
|
+
},
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
name: 'storage.local round-trip',
|
|
355
|
+
run: async (ctx) => {
|
|
356
|
+
await chrome.storage.local.set({ k: 'v' });
|
|
357
|
+
const out = await chrome.storage.local.get('k');
|
|
358
|
+
ctx.expect(out.k).toBe('v');
|
|
359
|
+
},
|
|
360
|
+
},
|
|
361
|
+
],
|
|
362
|
+
};
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
## View-layer example
|
|
366
|
+
|
|
367
|
+
```js
|
|
368
|
+
// test/view/popup.test.js
|
|
369
|
+
module.exports = {
|
|
370
|
+
type: 'suite',
|
|
371
|
+
layer: 'view',
|
|
372
|
+
context: 'popup', // popup | options | sidepanel — which HTML to open
|
|
373
|
+
description: 'popup DOM + chrome surface',
|
|
374
|
+
tests: [
|
|
375
|
+
{
|
|
376
|
+
name: 'document body has data-omega-context="popup"',
|
|
377
|
+
run: async (ctx) => {
|
|
378
|
+
ctx.expect(document.body.dataset.bxmContext).toBe('popup');
|
|
379
|
+
},
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
name: 'popup ↔ background messaging round-trip',
|
|
383
|
+
run: async (ctx) => {
|
|
384
|
+
const reply = await chrome.runtime.sendMessage({ type: 'extension:test:ping' });
|
|
385
|
+
ctx.expect(reply.pong).toBe(true);
|
|
386
|
+
},
|
|
387
|
+
},
|
|
388
|
+
],
|
|
389
|
+
};
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
For boot-layer (`inspect: async ({ extension, page, expect }) => { ... }`) tests, see [test-boot-layer.md](test-boot-layer.md).
|
|
393
|
+
|
|
394
|
+
## How browser-layer tests are shipped to the SW/tab
|
|
395
|
+
|
|
396
|
+
MV3 service workers have a strict CSP that forbids `eval` / `new Function` / `new AsyncFunction`. So we can't rebuild test functions from a string inside the SW.
|
|
397
|
+
|
|
398
|
+
Instead: each test's source is **baked as a literal async-function expression** directly into the payload at runner build-time, then evaluated as top-level Runtime.evaluate (CDP-exempt from CSP). No inner `eval` happens inside the SW. Tests communicate results back via `console.log('__BXM_TEST__' + JSON.stringify(evt))`, which the Node-side runner parses via CDP `Runtime.consoleAPICalled`.
|
|
399
|
+
|
|
400
|
+
You don't have to think about this — write tests in normal JS — but it's why test bodies must be **self-contained**: they can't close over their file's module scope. Use `ctx`, `expect`, `state`, and the browser globals (`chrome`, `document`, `window`) only.
|
|
401
|
+
|
|
402
|
+
## Why a custom harness instead of Jest / Vitest?
|
|
403
|
+
|
|
404
|
+
Browser-context code (background SW, popup DOM, content script) only runs inside Chromium. This is exactly why @omega.js/extension does not let you mock: a faked `chrome.runtime` (Jest's jsdom can't reproduce it faithfully) or a stubbed API (`webextension-polyfill` provides one, but it doesn't catch real SW lifecycle bugs) passes tests while shipping broken extensions. Puppeteer gives a real Chromium with real `chrome.*` APIs, so the harness is the real thing — not a substitute you assert against. See [NEVER mock](#never-mock--test-against-the-real-harness).
|
|
405
|
+
|
|
406
|
+
Same trade-off EM ran into with Electron — tests must run inside the real runtime, so the framework owns the runner.
|
|
407
|
+
|
|
408
|
+
## See also
|
|
409
|
+
|
|
410
|
+
- [test-boot-layer.md](test-boot-layer.md) — boot layer deep-dive (loads consumer's actual packaged extension)
|
|
411
|
+
- [environment-detection.md](environment-detection.md) — `Manager.isTesting()` / `isDevelopment()` / etc.
|
package/docs/themes.md
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Themes
|
|
2
|
+
|
|
3
|
+
@omega.js/extension ships two themes plus a template for new ones. Themes vendor their own SCSS + JS + Bootstrap-compatible variable system.
|
|
4
|
+
|
|
5
|
+
## Available themes
|
|
6
|
+
|
|
7
|
+
| Theme | Source | What it provides |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| `bootstrap` | `dist/assets/themes/bootstrap/` (vendored from @omega.js/web) | Pure Bootstrap 5.3+. Use when you want unopinionated Bootstrap. |
|
|
10
|
+
| `classy` | `dist/assets/themes/classy/` (vendored from @omega.js/web) | Bootstrap 5 + custom design system (colors, typography, components). The "branded" theme. |
|
|
11
|
+
| `_template` | `dist/assets/themes/_template/` (vendored from @omega.js/web) | Template for creating new themes. Underscore prefix excludes it from production builds. |
|
|
12
|
+
|
|
13
|
+
## Activating a theme
|
|
14
|
+
|
|
15
|
+
Set in `config/omega.json5`:
|
|
16
|
+
|
|
17
|
+
```jsonc
|
|
18
|
+
{
|
|
19
|
+
theme: {
|
|
20
|
+
id: 'classy', // 'bootstrap' | 'classy' | '<your-theme>'
|
|
21
|
+
appearance: 'dark', // 'dark' | 'light' (optional — drives {{ theme.appearance }})
|
|
22
|
+
},
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The bundler's `__theme__` alias resolves to the package's `dist/assets/themes/<id>/` so consumer JS can do `import '__theme__/_theme.js'` and get the right theme's entry point. SCSS gets the same via the `theme` load-path entry (see [css.md](css.md)).
|
|
27
|
+
|
|
28
|
+
### theme.id is shared; the theme SET is per-framework
|
|
29
|
+
|
|
30
|
+
`theme.id` is a shared omega.json5 key, but each framework ships its own themes — a brand whose WEBSITE theme is a consumer-local id has nothing under the extension's `dist/assets/themes/<id>/`. Both resolve sites (the sass load path and the bundler's `__theme__`) go through [src/lib/theme.js](../src/lib/theme.js): an id this framework doesn't ship falls back to `classy` with ONE warning naming `theme.id`, the unknown value, and the extension's valid themes — never a raw sass `Can't find stylesheet to import` ([#261](https://github.com/Omega-JS-Stack/omega/issues/261)). Give the extension its own theme without touching the brand's:
|
|
31
|
+
|
|
32
|
+
```jsonc
|
|
33
|
+
{
|
|
34
|
+
targets: {
|
|
35
|
+
extension: { theme: { id: 'classy' } },
|
|
36
|
+
},
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Theme structure
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
dist/assets/themes/<theme-id>/ (vendored — the SSOT is @omega.js/web/themes/)
|
|
44
|
+
├── _config.scss # Theme variables (with !default so consumers can override)
|
|
45
|
+
├── _theme.scss # Theme entry — @forward + @use
|
|
46
|
+
├── scss/ # Theme-specific SCSS (components, utilities)
|
|
47
|
+
└── js/ # Theme-specific JS (e.g. Bootstrap's modal/popper init)
|
|
48
|
+
└── _theme.js # Theme JS entry (exposes Bootstrap globals to window.bootstrap)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Creating a new theme
|
|
52
|
+
|
|
53
|
+
1. Copy `_template/` into your CONSUMER project's theme dir (or add the theme to @omega.js/web's `themes/` — the one tree every target vendors)
|
|
54
|
+
2. Rename the directory (remove the `_` prefix — that's only for the template).
|
|
55
|
+
3. Customize `_config.scss` — variables like `$primary`, `$font-family-base`, etc.
|
|
56
|
+
4. Add theme-specific styles under `scss/`.
|
|
57
|
+
5. Update `_theme.scss` to forward your overrides.
|
|
58
|
+
6. Activate via `config/omega.json5` → `theme.id: 'my-theme'`.
|
|
59
|
+
|
|
60
|
+
## Overriding theme variables
|
|
61
|
+
|
|
62
|
+
In a consumer's `src/assets/css/main.scss`:
|
|
63
|
+
|
|
64
|
+
```scss
|
|
65
|
+
// Override before @use to take effect
|
|
66
|
+
@use 'omega-extension' as * with (
|
|
67
|
+
$primary: #2563EB,
|
|
68
|
+
$secondary: #FFA500,
|
|
69
|
+
);
|
|
70
|
+
@use 'theme' as *;
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
`!default` flags on theme variables let `with (...)` overrides win.
|
|
74
|
+
|
|
75
|
+
## `{{ theme.appearance }}`
|
|
76
|
+
|
|
77
|
+
If `config.theme.appearance === 'dark'`, the HTML page template adds `class="dark"` (or `data-bs-theme="dark"`, depending on theme) to `<html>`. Theme SCSS can then key off `:root.dark` / `[data-bs-theme="dark"]` for dark-mode variants.
|
|
78
|
+
|
|
79
|
+
Consumer views can use `{{ theme.appearance }}` in their HTML to apply per-page tweaks. See [templating.md](templating.md).
|
|
80
|
+
|
|
81
|
+
## Why not Tailwind?
|
|
82
|
+
|
|
83
|
+
Themes are SCSS-first because @omega.js/extension's roots are Bootstrap-based and most @omega.js/extension consumers already use Bootstrap-style class names (`.btn`, `.card`, `.modal`). Tailwind requires a build step (PostCSS + content scanning) that would complicate the lean gulp pipeline. If a future theme wants Tailwind, add it to @omega.js/web's `themes/` and wire its own build hook.
|
|
84
|
+
|
|
85
|
+
## See also
|
|
86
|
+
|
|
87
|
+
- [css.md](css.md) — SCSS load paths and component overrides
|
|
88
|
+
- [components.md](components.md) — component view + styles + script structure
|
|
89
|
+
- [build-system.md](build-system.md) — sass/esbuild pipeline
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Translations
|
|
2
|
+
|
|
3
|
+
`npm run build` automatically translates `config/messages.json` (and `config/description.md`) to the languages set in `translation.languages` (omega.json5). Only missing translations are generated — existing translations live in the committed `translations/` cache and are preserved.
|
|
4
|
+
|
|
5
|
+
## Languages produced
|
|
6
|
+
|
|
7
|
+
Exactly the codes listed in `translation.languages` — there is no fixed set. Unset means translation is OFF (the build logs one skip line). The shared contract, including the supported-code list, is docs/shared/translation.md in the Omega repo.
|
|
8
|
+
|
|
9
|
+
(Output written to `dist/_locales/<lang>/messages.json`, then packaged to `packaged/<browser>/raw/_locales/`.)
|
|
10
|
+
|
|
11
|
+
## How it works
|
|
12
|
+
|
|
13
|
+
[src/gulp/tasks/translate.js](../src/gulp/tasks/translate.js):
|
|
14
|
+
|
|
15
|
+
1. Reads `config/messages.json` (source of truth — author all your strings here).
|
|
16
|
+
2. For each configured language, loads the committed cache at `translations/<lang>/messages.json` (source-string hash → translated message).
|
|
17
|
+
3. Sends ONLY the uncached strings to the translation provider (per-key incremental).
|
|
18
|
+
4. Saves the results back into the cache, then composes `dist/_locales/<lang>/messages.json` from source + cache — a miss falls back to English so the file is always complete.
|
|
19
|
+
|
|
20
|
+
`config/description.md` translates the same way, whole-document, cached as `translations/<lang>/description.md` with a source-hash marker — editing the source retranslates it.
|
|
21
|
+
|
|
22
|
+
Existing translations are NEVER overwritten — once a string is translated, it stays until the source string changes. Edit the cache file directly if you want to change a translation.
|
|
23
|
+
|
|
24
|
+
## What gets translated
|
|
25
|
+
|
|
26
|
+
Keys with a `message` field:
|
|
27
|
+
|
|
28
|
+
```jsonc
|
|
29
|
+
{
|
|
30
|
+
appName: {
|
|
31
|
+
message: 'Tabblar — Workspace & Tab Manager',
|
|
32
|
+
description: 'The name of the extension.'
|
|
33
|
+
},
|
|
34
|
+
appDescription: {
|
|
35
|
+
message: 'Powerful tab and workspace manager...',
|
|
36
|
+
description: 'The description of the extension.'
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Only the `message` values are sent for translation; the `description` field stays English (it documents the key for maintainers and the store review).
|
|
42
|
+
|
|
43
|
+
## What the scaffold seeds
|
|
44
|
+
|
|
45
|
+
`config/messages.json` is scaffolded once (never overwritten) with the brand already rendered in: `appName`, `appNameShort` and `btnTooltip` from `brand.name`, and `appDescription` from `brand.description` when it fits the 200-character Chrome Web Store cap — a longer or absent description falls back to "The official <brand> browser extension." ([#573](https://github.com/Omega-JS-Stack/omega/issues/573)). Edit any of them afterward; setup will not touch them again.
|
|
46
|
+
|
|
47
|
+
## Manifest `__MSG_*__` placeholders
|
|
48
|
+
|
|
49
|
+
`src/manifest.json` references locale keys via `__MSG_<key>__`:
|
|
50
|
+
|
|
51
|
+
```jsonc
|
|
52
|
+
{
|
|
53
|
+
name: '__MSG_appName__',
|
|
54
|
+
description: '__MSG_appDescription__',
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Chrome resolves these at install time using the user's browser locale, falling back to `default_locale` (set in the manifest).
|
|
59
|
+
|
|
60
|
+
The [test-framework.md](test-framework.md) ships a `locales.test.js` pattern that verifies every `__MSG_*__` placeholder in your manifest has a definition in `messages.json` — catches drift between manifest and i18n catalog before users see broken store listings.
|
|
61
|
+
|
|
62
|
+
## Disabling translations
|
|
63
|
+
|
|
64
|
+
Leave `translation.languages` unset (or empty) in omega.json5 — translation is opt-in and off by default.
|
|
65
|
+
|
|
66
|
+
## Cost / API key
|
|
67
|
+
|
|
68
|
+
The default provider is `claude`: it rides the locally-installed Claude Code via `@anthropic-ai/claude-agent-sdk` (declared by this framework), billed to your Claude subscription — no API key. `translation.provider: 'chatgpt'` uses the OpenAI API instead (needs `OPENAI_API_KEY`). Either way the cost is one-time per language per changed string — typically pennies.
|
|
69
|
+
|
|
70
|
+
## See also
|
|
71
|
+
|
|
72
|
+
- [build-system.md](build-system.md) — gulp pipeline including translate task
|
|
73
|
+
- [publishing.md](publishing.md) — auto-publishing to Chrome / Firefox / Edge stores
|
package/docs/verts.md
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Verts — the `data-omega-vert` auto-bind
|
|
2
|
+
|
|
3
|
+
@omega.js/extension page surfaces auto-bind the OMEGA verts (ads) system (monorepo
|
|
4
|
+
`docs/web/ads-system.md`, phase 4): drop a `[data-omega-vert]` element into a
|
|
5
|
+
popup/options/sidepanel/page view and the surface Manager hands it to
|
|
6
|
+
`@omega.js/client`'s verts module — zero consumer JS, same element vocabulary
|
|
7
|
+
as the web `verts/unit` section and @omega.js/desktop.
|
|
8
|
+
|
|
9
|
+
```html
|
|
10
|
+
<div data-omega-vert data-omega-vert-size="banner"></div>
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## What the wiring does
|
|
14
|
+
|
|
15
|
+
`lib/verts.js wireAds()` (called by each page-surface Manager's `initialize()`
|
|
16
|
+
after `omega.initialize()`) binds every `[data-omega-vert]` element present at
|
|
17
|
+
boot AND inserted later (MutationObserver), marking bound hosts
|
|
18
|
+
`data-omega-vert-bound="house"`. Everything after the bind lives in the client
|
|
19
|
+
module (`@omega.js/client/modules/verts.js`): lazy arming near the viewport, a
|
|
20
|
+
sandboxed iframe to the resolved in-house source's `/omega/verts/serve`,
|
|
21
|
+
origin-validated postMessage, host-owned rotation + staleness recovery, and
|
|
22
|
+
no-fill collapse (the host hides itself).
|
|
23
|
+
|
|
24
|
+
**Content scripts, background, and offscreen do NOT auto-bind.** Content
|
|
25
|
+
scripts follow the `lib/icons.js` rule — scanning a HOST page's DOM would
|
|
26
|
+
mount verts into arbitrary websites; background/offscreen have no user-facing
|
|
27
|
+
DOM.
|
|
28
|
+
|
|
29
|
+
## House/company lane ONLY — no AdSense
|
|
30
|
+
|
|
31
|
+
Extension surfaces never run the AdSense provider lane (store policy — and
|
|
32
|
+
the scaffolded MV3 `extension_pages` CSP blocks the remote script anyway).
|
|
33
|
+
The wiring pins `type: 'house'` on every mount — the pin wins over the
|
|
34
|
+
element's `data-omega-vert` type, so even a shared omega.json5 that carries
|
|
35
|
+
`advertising.providers.adsense` (the web target uses it) can only
|
|
36
|
+
ever reach the house/company inventory here. Pinned by the build-layer
|
|
37
|
+
`verts-binding` suite.
|
|
38
|
+
|
|
39
|
+
## Config
|
|
40
|
+
|
|
41
|
+
The `advertising` and `company` sections of `config/omega.json5` ride the
|
|
42
|
+
build snapshot (`OMEGA_BUILD_JSON`, baked into every bundle) into every surface:
|
|
43
|
+
|
|
44
|
+
```json5
|
|
45
|
+
advertising: {
|
|
46
|
+
providers: {
|
|
47
|
+
inhouse: { source: 'company' }, // 'self' | 'company' | full URL
|
|
48
|
+
},
|
|
49
|
+
tags: ['music', 'audio-tools'], // contextual targeting inputs
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
No `advertising` key (or no resolvable inhouse source) → bound units collapse
|
|
54
|
+
quietly. Nothing else to configure.
|
|
55
|
+
|
|
56
|
+
## Element vocabulary
|
|
57
|
+
|
|
58
|
+
| Attribute | Meaning |
|
|
59
|
+
|---|---|
|
|
60
|
+
| `data-omega-vert` | binds the element (type value is ignored in extensions — house pin) |
|
|
61
|
+
| `data-omega-vert-size` | size preset (`banner`/`leaderboard`/`rectangle`/…) or raw px max-height |
|
|
62
|
+
| `data-omega-vert-id` | pin a specific vert |
|
|
63
|
+
| `data-omega-vert-tags` | comma-separated contextual tags for this unit |
|
|
64
|
+
| `data-omega-vert-bound` | set by the wiring (`"house"`) once bound — observability/debugging |
|
|
65
|
+
|
|
66
|
+
Units emit `omega-vert:fill` / `omega-vert:no-fill` / `omega-vert:click` /
|
|
67
|
+
`omega-vert:reload` CustomEvents on the host (bubbling) for app-side hooks.
|