@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,684 @@
|
|
|
1
|
+
// Libraries
|
|
2
|
+
import extension from './lib/extension.js';
|
|
3
|
+
import LoggerLite from './lib/logger-lite.js';
|
|
4
|
+
import { attachTo as attachModeHelpers } from './utils/mode-helpers.js';
|
|
5
|
+
import { attachTo as attachUrlHelpers } from './utils/url-helpers.js';
|
|
6
|
+
import { createRequest } from '@omega.js/client/modules/request.js';
|
|
7
|
+
|
|
8
|
+
// Firebase (static imports - a service worker cannot fetch code at runtime under MV3, so dynamic import() is not an option)
|
|
9
|
+
import { initializeApp, getApp } from 'firebase/app';
|
|
10
|
+
import { getAuth, signInWithCustomToken, onAuthStateChanged, connectAuthEmulator } from 'firebase/auth';
|
|
11
|
+
|
|
12
|
+
// Variables
|
|
13
|
+
const serviceWorker = self;
|
|
14
|
+
|
|
15
|
+
// Install-lane logger. MODULE level, not an instance property: the install
|
|
16
|
+
// listener is registered by setupGlobalHandlers(), which runs bare at top
|
|
17
|
+
// level before any Manager exists — `this` is undefined in there.
|
|
18
|
+
const installLogger = new LoggerLite('install');
|
|
19
|
+
|
|
20
|
+
// Cache warming is DISABLED (same call as the web SW — page speed wins,
|
|
21
|
+
// nothing reads it): this cache is write-only — one caches.open, zero reads
|
|
22
|
+
// anywhere in the extension, and no context even sends 'update-cache' today.
|
|
23
|
+
// The machinery stays wired (updateCache + the message command) so this
|
|
24
|
+
// single flag re-enables it if an offline lane ever lands.
|
|
25
|
+
const CACHE_WARMING_ENABLED = false;
|
|
26
|
+
|
|
27
|
+
// Auth emulator port for TESTING builds. An extension context has no
|
|
28
|
+
// `process.env`, so the resolved map arrives BAKED in OMEGA_BUILD_JSON's
|
|
29
|
+
// `config.dev.ports` ([#300](https://github.com/Omega-JS-Stack/omega/issues/300));
|
|
30
|
+
// the classic default is the fallback for a build made with no stack up (mirrors
|
|
31
|
+
// url-helpers' classic-5002 hosting note).
|
|
32
|
+
const AUTH_EMULATOR_PORT = 9099;
|
|
33
|
+
|
|
34
|
+
// ⚠️⚠️⚠️ CRITICAL: Setup global listeners BEFORE any async operations ⚠️⚠️⚠️
|
|
35
|
+
// https://stackoverflow.com/questions/78270541/cant-catch-fcm-notificationclick-event-in-service-worker-using-firebase-messa
|
|
36
|
+
// Note: ES6 static imports above are fine - they're hoisted and bundled by the build.
|
|
37
|
+
setupGlobalHandlers();
|
|
38
|
+
|
|
39
|
+
// Class
|
|
40
|
+
class Manager {
|
|
41
|
+
constructor() {
|
|
42
|
+
// Properties
|
|
43
|
+
this.extension = null;
|
|
44
|
+
this.logger = null;
|
|
45
|
+
this.authLogger = null;
|
|
46
|
+
this.serviceWorker = null;
|
|
47
|
+
|
|
48
|
+
// Load the snapshot the bundle baked in (#743 — the banner assigns it onto
|
|
49
|
+
// self/globalThis ahead of this file's own code, so it is always already there).
|
|
50
|
+
this.config = serviceWorker.OMEGA_BUILD_JSON?.config || {};
|
|
51
|
+
|
|
52
|
+
// Defaults
|
|
53
|
+
this.version = this.config?.version || 'unknown';
|
|
54
|
+
this.brand = this.config?.brand || { name: 'unknown' };
|
|
55
|
+
this.brand.id = this.config?.brand?.id || 'extension';
|
|
56
|
+
this.environment = this.config?.omega?.environment || 'production';
|
|
57
|
+
this.libraries = {
|
|
58
|
+
firebase: null,
|
|
59
|
+
firebaseAuth: null,
|
|
60
|
+
messaging: false,
|
|
61
|
+
promoServer: false,
|
|
62
|
+
};
|
|
63
|
+
this.cache = {
|
|
64
|
+
breaker: this.config?.omega?.cache_breaker || new Date().getTime(),
|
|
65
|
+
name: ''
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Initialize
|
|
70
|
+
async initialize() {
|
|
71
|
+
// Set properties
|
|
72
|
+
this.extension = extension;
|
|
73
|
+
this.logger = new LoggerLite('background');
|
|
74
|
+
this.authLogger = new LoggerLite('auth');
|
|
75
|
+
this.serviceWorker = serviceWorker;
|
|
76
|
+
|
|
77
|
+
// Parse config file
|
|
78
|
+
this.parseConfiguration();
|
|
79
|
+
|
|
80
|
+
// Setup instance-specific message handlers
|
|
81
|
+
this.setupInstanceHandlers();
|
|
82
|
+
|
|
83
|
+
// Initialize Firebase
|
|
84
|
+
this.initializeFirebase();
|
|
85
|
+
|
|
86
|
+
// Setup auth token listener (for cross-runtime auth)
|
|
87
|
+
this.setupAuthTokenListener();
|
|
88
|
+
|
|
89
|
+
// Initialize Firebase auth on startup (restores persisted session if any)
|
|
90
|
+
this.initializeAuth();
|
|
91
|
+
|
|
92
|
+
// Setup livereload
|
|
93
|
+
this.setupLiveReload();
|
|
94
|
+
|
|
95
|
+
// Log
|
|
96
|
+
this.logger.log('Initialized!', this.version, this.cache.name, this);
|
|
97
|
+
this.logger.log('Config loaded from OMEGA_BUILD_JSON:', this.config);
|
|
98
|
+
|
|
99
|
+
// Return manager instance
|
|
100
|
+
return this;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Parse configuration
|
|
104
|
+
parseConfiguration() {
|
|
105
|
+
try {
|
|
106
|
+
// Set cache name
|
|
107
|
+
this.cache.name = `${this.brand.id}-${this.cache.breaker}`;
|
|
108
|
+
} catch (e) {
|
|
109
|
+
this.logger.error('Error parsing configuration', e);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Setup instance-specific message handlers
|
|
114
|
+
setupInstanceHandlers() {
|
|
115
|
+
// Send messages: https://stackoverflow.com/questions/35725594/how-do-i-pass-data-like-a-user-id-to-a-web-worker-for-fetching-additional-push
|
|
116
|
+
// more messaging: http://craig-russell.co.uk/2016/01/29/background-messaging.html#.XSKpRZNKiL8
|
|
117
|
+
serviceWorker.addEventListener('message', (event) => {
|
|
118
|
+
// Get the data
|
|
119
|
+
const data = event.data || {};
|
|
120
|
+
|
|
121
|
+
// Parse the data
|
|
122
|
+
const command = data.command || '';
|
|
123
|
+
const payload = data.payload || {};
|
|
124
|
+
|
|
125
|
+
// Quit if no command
|
|
126
|
+
if (!command) return;
|
|
127
|
+
|
|
128
|
+
// Log
|
|
129
|
+
this.logger.log('message', command, payload, event);
|
|
130
|
+
|
|
131
|
+
// Handle commands
|
|
132
|
+
if (command === 'update-cache') {
|
|
133
|
+
const pages = payload.pages || [];
|
|
134
|
+
this.updateCache(pages)
|
|
135
|
+
.then(() => {
|
|
136
|
+
event.ports[0]?.postMessage({ status: 'success' });
|
|
137
|
+
})
|
|
138
|
+
.catch(error => {
|
|
139
|
+
event.ports[0]?.postMessage({ status: 'error', error: error.message });
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
// Listen for runtime messages (from popup, options, pages, etc.)
|
|
145
|
+
this.extension.runtime.onMessage.addListener((message, _sender, sendResponse) => {
|
|
146
|
+
// Handle auth sync requests - contexts ask background for auth state on load
|
|
147
|
+
if (message.command === 'omega:syncAuth') {
|
|
148
|
+
this.handleSyncAuth(message, sendResponse);
|
|
149
|
+
return true; // Keep channel open for async response
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Handle sign-out requests from contexts
|
|
153
|
+
if (message.command === 'omega:signOut') {
|
|
154
|
+
this.handleSignOut(sendResponse);
|
|
155
|
+
return true; // Keep channel open for async response
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
// Log
|
|
160
|
+
this.logger.log('Set up message handlers');
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Handle auth sync request from other contexts (popup, page, options, sidepanel)
|
|
164
|
+
// Compares context's UID with background's UID and provides fresh token only if different
|
|
165
|
+
async handleSyncAuth(message, sendResponse) {
|
|
166
|
+
try {
|
|
167
|
+
const contextUid = message.contextUid || null; // UID from asking context (or null)
|
|
168
|
+
|
|
169
|
+
// Get or initialize Firebase auth
|
|
170
|
+
const auth = this.getFirebaseAuth();
|
|
171
|
+
const bgUser = auth.currentUser;
|
|
172
|
+
const bgUid = bgUser?.uid || null;
|
|
173
|
+
|
|
174
|
+
this.authLogger.log('syncAuth: Comparing UIDs - context:', contextUid, 'background:', bgUid);
|
|
175
|
+
|
|
176
|
+
// Already in sync (both null, or same UID)
|
|
177
|
+
if (contextUid === bgUid) {
|
|
178
|
+
this.authLogger.log('syncAuth: Already in sync');
|
|
179
|
+
sendResponse({ needsSync: false });
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Context is signed in but background is not → context should sign out
|
|
184
|
+
if (!bgUser && contextUid) {
|
|
185
|
+
this.authLogger.log('syncAuth: Background signed out, telling context to sign out');
|
|
186
|
+
sendResponse({ needsSync: true, signOut: true });
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Background is signed in, context is not (or different user) → provide token
|
|
191
|
+
this.authLogger.log('syncAuth: Fetching fresh custom token for context...', bgUser.email);
|
|
192
|
+
|
|
193
|
+
// Fetch a fresh custom token from the /user/token route via the shared
|
|
194
|
+
// request layer (uid defaults server-side to the authenticated caller).
|
|
195
|
+
// getApiUrl() throws when brand.url is missing — a misconfigured
|
|
196
|
+
// brand should fail loudly, never call a foreign host.
|
|
197
|
+
const request = createRequest({
|
|
198
|
+
getApiUrl: () => this.getApiUrl(),
|
|
199
|
+
getIdToken: (force) => bgUser.getIdToken(force),
|
|
200
|
+
});
|
|
201
|
+
const data = await request('/omega/user/token', { method: 'POST', body: {} });
|
|
202
|
+
|
|
203
|
+
// Check for token in response ({ token } at the top level)
|
|
204
|
+
if (!data.token) {
|
|
205
|
+
throw new Error('No token in server response');
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
this.authLogger.log('syncAuth: Got fresh custom token, sending to context');
|
|
209
|
+
|
|
210
|
+
// Send user info and fresh custom token
|
|
211
|
+
sendResponse({
|
|
212
|
+
needsSync: true,
|
|
213
|
+
customToken: data.token,
|
|
214
|
+
user: {
|
|
215
|
+
uid: bgUser.uid,
|
|
216
|
+
email: bgUser.email,
|
|
217
|
+
displayName: bgUser.displayName,
|
|
218
|
+
photoURL: bgUser.photoURL,
|
|
219
|
+
emailVerified: bgUser.emailVerified,
|
|
220
|
+
},
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
} catch (error) {
|
|
224
|
+
this.authLogger.error('syncAuth error:', error.message);
|
|
225
|
+
sendResponse({ needsSync: false, error: error.message });
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Handle sign-out request from a context
|
|
230
|
+
// Signs out background's Firebase and broadcasts to all other contexts
|
|
231
|
+
async handleSignOut(sendResponse) {
|
|
232
|
+
try {
|
|
233
|
+
this.authLogger.log('handleSignOut: Signing out background Firebase...');
|
|
234
|
+
|
|
235
|
+
// Sign out background's Firebase
|
|
236
|
+
if (this.libraries.firebaseAuth?.currentUser) {
|
|
237
|
+
await this.libraries.firebaseAuth.signOut();
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Broadcast to all contexts
|
|
241
|
+
await this.broadcastSignOut();
|
|
242
|
+
|
|
243
|
+
this.authLogger.log('handleSignOut: Complete');
|
|
244
|
+
sendResponse({ success: true });
|
|
245
|
+
} catch (error) {
|
|
246
|
+
this.authLogger.error('handleSignOut error:', error.message);
|
|
247
|
+
sendResponse({ success: false, error: error.message });
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// Broadcast sign-out to all open extension contexts
|
|
252
|
+
async broadcastSignOut() {
|
|
253
|
+
try {
|
|
254
|
+
const clients = await self.clients.matchAll({ type: 'all' });
|
|
255
|
+
|
|
256
|
+
this.authLogger.log(`Broadcasting sign-out to ${clients.length} clients...`);
|
|
257
|
+
|
|
258
|
+
for (const client of clients) {
|
|
259
|
+
client.postMessage({ command: 'omega:signOut' });
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
this.authLogger.log('Sign-out broadcast complete');
|
|
263
|
+
} catch (error) {
|
|
264
|
+
this.authLogger.error('Error broadcasting sign-out:', error.message);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Initialize Firebase
|
|
269
|
+
initializeFirebase() {
|
|
270
|
+
// Get Firebase config
|
|
271
|
+
const firebaseConfig = this.config?.cloud?.config;
|
|
272
|
+
|
|
273
|
+
// Check if Firebase config is available
|
|
274
|
+
if (!firebaseConfig) {
|
|
275
|
+
this.logger.log('Firebase config not available yet, skipping Firebase initialization');
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// Check if already initialized
|
|
280
|
+
if (this.libraries.firebase) {
|
|
281
|
+
this.logger.log('Firebase already initialized');
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Log
|
|
286
|
+
this.logger.log('Initializing Firebase');
|
|
287
|
+
|
|
288
|
+
// Initialize app (libraries were already imported at the top if uncommented)
|
|
289
|
+
// firebase.initializeApp(firebaseConfig);
|
|
290
|
+
|
|
291
|
+
// Initialize messaging
|
|
292
|
+
// this.libraries.messaging = firebase.messaging();
|
|
293
|
+
|
|
294
|
+
// Attach firebase to Manager
|
|
295
|
+
// this.libraries.firebase = firebase;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// Update cache — disabled by CACHE_WARMING_ENABLED (see top of file)
|
|
299
|
+
updateCache(pages) {
|
|
300
|
+
if (!CACHE_WARMING_ENABLED) {
|
|
301
|
+
return Promise.resolve();
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// Set default pages to cache
|
|
305
|
+
const defaults = [
|
|
306
|
+
'/',
|
|
307
|
+
'/assets/css/main.bundle.css',
|
|
308
|
+
'/assets/js/main.bundle.js',
|
|
309
|
+
];
|
|
310
|
+
|
|
311
|
+
// Ensure pages is an array
|
|
312
|
+
pages = pages || [];
|
|
313
|
+
|
|
314
|
+
// Merge with additional pages
|
|
315
|
+
const pagesToCache = [...new Set([...defaults, ...pages])];
|
|
316
|
+
|
|
317
|
+
// Open cache and add pages
|
|
318
|
+
return caches.open(this.cache.name)
|
|
319
|
+
.then(cache => cache.addAll(pagesToCache))
|
|
320
|
+
.then(() => this.logger.log('Cached resources:', pagesToCache))
|
|
321
|
+
.catch(error => this.logger.error('Failed to cache resources:', error));
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
// Setup auth token listener (monitors tabs for auth tokens from website)
|
|
325
|
+
setupAuthTokenListener() {
|
|
326
|
+
// DEBUG: Log the full config to see what we have
|
|
327
|
+
this.authLogger.log('setupAuthTokenListener called');
|
|
328
|
+
this.authLogger.log('this.config:', this.config);
|
|
329
|
+
this.authLogger.log('OMEGA_BUILD_JSON:', serviceWorker.OMEGA_BUILD_JSON);
|
|
330
|
+
|
|
331
|
+
// The sign-in round trip lands on the BRAND site (/token redirects with
|
|
332
|
+
// ?authToken=…), so match the brand.url host — never authDomain, which
|
|
333
|
+
// is an auth concern that must stay free to change independently.
|
|
334
|
+
const brandUrl = this.config?.brand?.url;
|
|
335
|
+
|
|
336
|
+
// Skip if no brand url configured
|
|
337
|
+
if (!brandUrl) {
|
|
338
|
+
this.authLogger.log('No brand.url configured, skipping auth token listener');
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
const brandHost = new URL(brandUrl).hostname;
|
|
343
|
+
|
|
344
|
+
// Log
|
|
345
|
+
this.authLogger.log(`Setting up auth token listener for domain: ${brandHost}`);
|
|
346
|
+
|
|
347
|
+
// Listen for tab URL changes
|
|
348
|
+
this.extension.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
|
|
349
|
+
// Only process when URL changes and is complete
|
|
350
|
+
if (changeInfo.status !== 'complete' || !tab.url) {
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// Parse the URL
|
|
355
|
+
let tabUrl;
|
|
356
|
+
try {
|
|
357
|
+
tabUrl = new URL(tab.url);
|
|
358
|
+
} catch (e) {
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// Log every tab update for auth domain matching
|
|
363
|
+
this.authLogger.log(`Tab updated: ${tabUrl.hostname} (looking for: ${brandHost})`);
|
|
364
|
+
|
|
365
|
+
// Check if this is our brand site
|
|
366
|
+
if (tabUrl.hostname !== brandHost) {
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// Log - we found our domain
|
|
371
|
+
this.authLogger.log(`Auth domain matched! Checking for authToken param...`);
|
|
372
|
+
|
|
373
|
+
// Check for authToken param
|
|
374
|
+
const authToken = tabUrl.searchParams.get('authToken');
|
|
375
|
+
if (!authToken) {
|
|
376
|
+
this.authLogger.log(`No authToken param found in URL: ${tabUrl.href}`);
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
// Get source tab ID to restore after auth
|
|
381
|
+
const authSourceTabId = tabUrl.searchParams.get('authSourceTabId');
|
|
382
|
+
|
|
383
|
+
// Log
|
|
384
|
+
this.authLogger.log('Auth token detected in tab:', tabId);
|
|
385
|
+
|
|
386
|
+
// Handle the auth token
|
|
387
|
+
this.handleAuthToken(authToken, tabId, authSourceTabId ? parseInt(authSourceTabId, 10) : null);
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
// Initialize Firebase auth on startup
|
|
392
|
+
// Firebase Auth persists sessions in IndexedDB - we just need to initialize it
|
|
393
|
+
initializeAuth() {
|
|
394
|
+
// Get Firebase config
|
|
395
|
+
const firebaseConfig = this.config?.cloud?.config;
|
|
396
|
+
if (!firebaseConfig) {
|
|
397
|
+
this.authLogger.log('Firebase config not available, skipping auth initialization');
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// Initialize Firebase auth - it will auto-restore from IndexedDB if session exists
|
|
402
|
+
this.authLogger.log('Initializing Firebase Auth (will restore persisted session if any)...');
|
|
403
|
+
const auth = this.getFirebaseAuth();
|
|
404
|
+
|
|
405
|
+
// Check if already signed in (Firebase restored from IndexedDB)
|
|
406
|
+
if (auth.currentUser) {
|
|
407
|
+
this.authLogger.log('Firebase restored session from persistence:', auth.currentUser.email);
|
|
408
|
+
} else {
|
|
409
|
+
this.authLogger.log('No persisted Firebase session found');
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// Get or initialize Firebase auth (reuse existing instance)
|
|
414
|
+
getFirebaseAuth() {
|
|
415
|
+
// Return existing instance if available
|
|
416
|
+
if (this.libraries.firebaseAuth) {
|
|
417
|
+
return this.libraries.firebaseAuth;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
// Get Firebase config
|
|
421
|
+
const firebaseConfig = this.config?.cloud?.config;
|
|
422
|
+
if (!firebaseConfig) {
|
|
423
|
+
throw new Error('Firebase config not available');
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
// Try to get existing app or create new one
|
|
427
|
+
try {
|
|
428
|
+
this.libraries.firebase = getApp('omega-auth');
|
|
429
|
+
} catch (e) {
|
|
430
|
+
this.libraries.firebase = initializeApp(firebaseConfig, 'omega-auth');
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// Get auth and set up state listener (only once)
|
|
434
|
+
this.libraries.firebaseAuth = getAuth(this.libraries.firebase);
|
|
435
|
+
|
|
436
|
+
// A TESTING build talks to the LOCAL stack, never real auth — the same
|
|
437
|
+
// call getApiUrl() makes when it maps testing to localhost, and the same
|
|
438
|
+
// move @omega.js/client makes for emulator runs. Only a build baked with
|
|
439
|
+
// OMEGA_TEST_MODE=true reaches here; dev and production are untouched.
|
|
440
|
+
if (this.isTesting()) {
|
|
441
|
+
const port = this.config?.dev?.ports?.auth || AUTH_EMULATOR_PORT;
|
|
442
|
+
this.authLogger.log(`Testing build — connecting auth to the emulator on :${port}`);
|
|
443
|
+
connectAuthEmulator(this.libraries.firebaseAuth, `http://localhost:${port}`, { disableWarnings: true });
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
// Set up auth state change listener (background is source of truth)
|
|
447
|
+
onAuthStateChanged(this.libraries.firebaseAuth, (user) => {
|
|
448
|
+
this.handleAuthStateChange(user);
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
return this.libraries.firebaseAuth;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
// Handle Firebase auth state changes (source of truth for all contexts)
|
|
455
|
+
// No storage operations - Web Manager handles auth state internally
|
|
456
|
+
handleAuthStateChange(user) {
|
|
457
|
+
this.authLogger.log('Auth state changed:', user?.email || 'signed out');
|
|
458
|
+
// Nothing else to do - contexts sync via messages, @omega.js/client handles UI
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
// Handle auth token from website (custom token from /token page)
|
|
462
|
+
async handleAuthToken(token, tabId, authSourceTabId = null) {
|
|
463
|
+
try {
|
|
464
|
+
// Log
|
|
465
|
+
this.authLogger.log('Processing auth token...');
|
|
466
|
+
|
|
467
|
+
// Get or initialize Firebase auth
|
|
468
|
+
const auth = this.getFirebaseAuth();
|
|
469
|
+
|
|
470
|
+
// Sign in with custom token
|
|
471
|
+
this.authLogger.log('Calling signInWithCustomToken...');
|
|
472
|
+
const userCredential = await signInWithCustomToken(auth, token);
|
|
473
|
+
const user = userCredential.user;
|
|
474
|
+
|
|
475
|
+
// Log
|
|
476
|
+
this.authLogger.log('Signed in successfully:', user.email);
|
|
477
|
+
|
|
478
|
+
// Broadcast token to all open extension contexts so they can sign in immediately
|
|
479
|
+
// Token is NOT stored - it expires in 1 hour and is only needed for initial sign-in
|
|
480
|
+
this.broadcastAuthToken(token);
|
|
481
|
+
|
|
482
|
+
// Note: onAuthStateChanged will fire and store user info (without token) in storage
|
|
483
|
+
// This allows UI to show auth state, but token is never persisted
|
|
484
|
+
|
|
485
|
+
// Close the auth tab
|
|
486
|
+
await this.extension.tabs.remove(tabId);
|
|
487
|
+
this.authLogger.log('Auth tab closed');
|
|
488
|
+
|
|
489
|
+
// Reactivate the source tab if provided
|
|
490
|
+
if (authSourceTabId) {
|
|
491
|
+
try {
|
|
492
|
+
await this.extension.tabs.update(authSourceTabId, { active: true });
|
|
493
|
+
this.authLogger.log('Restored source tab:', authSourceTabId);
|
|
494
|
+
} catch (e) {
|
|
495
|
+
// Tab may have been closed, ignore
|
|
496
|
+
this.authLogger.log('Could not restore source tab (may be closed):', authSourceTabId);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
} catch (error) {
|
|
501
|
+
this.authLogger.error('Error handling auth token:', error);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
// Broadcast auth token to all open extension contexts
|
|
506
|
+
// Used during initial sign-in to immediately sync all open popups, pages, etc.
|
|
507
|
+
async broadcastAuthToken(token) {
|
|
508
|
+
try {
|
|
509
|
+
// Get all clients (extension pages, popups, etc.)
|
|
510
|
+
const clients = await self.clients.matchAll({ type: 'all' });
|
|
511
|
+
|
|
512
|
+
this.authLogger.log(`Broadcasting token to ${clients.length} clients...`);
|
|
513
|
+
|
|
514
|
+
// Send token to each client
|
|
515
|
+
for (const client of clients) {
|
|
516
|
+
client.postMessage({
|
|
517
|
+
command: 'omega:signInWithToken',
|
|
518
|
+
token: token,
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
this.authLogger.log('Token broadcast complete');
|
|
523
|
+
} catch (error) {
|
|
524
|
+
this.authLogger.error('Error broadcasting token:', error.message);
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
// Setup livereload
|
|
529
|
+
setupLiveReload() {
|
|
530
|
+
// Dev-only feature — skip in testing and production (environment is one of
|
|
531
|
+
// 'development' | 'testing' | 'production').
|
|
532
|
+
if (this.environment !== 'development') return;
|
|
533
|
+
|
|
534
|
+
// Get port from config or use default
|
|
535
|
+
const port = this.config?.omega?.liveReloadPort || 35729;
|
|
536
|
+
|
|
537
|
+
// Setup livereload
|
|
538
|
+
const address = `ws://localhost:${port}/livereload`;
|
|
539
|
+
let connection;
|
|
540
|
+
let isReconnecting = false; // Flag to track reconnections
|
|
541
|
+
|
|
542
|
+
// Log
|
|
543
|
+
this.logger.log(`Setting up live reload on ${address}...`);
|
|
544
|
+
|
|
545
|
+
// Function to establish a connection
|
|
546
|
+
const connect = () => {
|
|
547
|
+
connection = new WebSocket(address);
|
|
548
|
+
|
|
549
|
+
// Log connection
|
|
550
|
+
this.logger.log(`Reload connecting to ${address}...`);
|
|
551
|
+
|
|
552
|
+
// Log connection errors
|
|
553
|
+
connection.onerror = (e) => {
|
|
554
|
+
this.logger.error('Reload connection got error:', e);
|
|
555
|
+
};
|
|
556
|
+
|
|
557
|
+
// Log when set up correctly
|
|
558
|
+
connection.onopen = () => {
|
|
559
|
+
this.logger.log('Reload connection set up!');
|
|
560
|
+
|
|
561
|
+
// Reload the extension only on reconnections
|
|
562
|
+
if (isReconnecting) {
|
|
563
|
+
// reload();
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
// Reset the reconnection flag
|
|
567
|
+
isReconnecting = false;
|
|
568
|
+
};
|
|
569
|
+
|
|
570
|
+
// Handle connection close and attempt to reconnect
|
|
571
|
+
connection.onclose = () => {
|
|
572
|
+
// Set time
|
|
573
|
+
const seconds = 1;
|
|
574
|
+
|
|
575
|
+
// Log
|
|
576
|
+
this.logger.log(`Reload connection closed. Attempting to reconnect in ${seconds} second(s)...`);
|
|
577
|
+
|
|
578
|
+
// Set the reconnection flag
|
|
579
|
+
isReconnecting = true;
|
|
580
|
+
|
|
581
|
+
// Reconnect
|
|
582
|
+
setTimeout(connect, seconds * 1000); // Retry
|
|
583
|
+
};
|
|
584
|
+
|
|
585
|
+
// Handle incoming messages
|
|
586
|
+
connection.onmessage = (event) => {
|
|
587
|
+
if (!event.data) {
|
|
588
|
+
return;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
// Get data
|
|
592
|
+
const data = JSON.parse(event.data);
|
|
593
|
+
|
|
594
|
+
// Log
|
|
595
|
+
this.logger.log('Reload connection got message:', data);
|
|
596
|
+
|
|
597
|
+
// Handle reload command
|
|
598
|
+
if (data && data.command === 'reload') {
|
|
599
|
+
reload();
|
|
600
|
+
}
|
|
601
|
+
};
|
|
602
|
+
};
|
|
603
|
+
|
|
604
|
+
const reload = () => {
|
|
605
|
+
this.logger.log('Reloading extension...');
|
|
606
|
+
setTimeout(() => {
|
|
607
|
+
this.extension.runtime.reload();
|
|
608
|
+
}, 1000);
|
|
609
|
+
};
|
|
610
|
+
|
|
611
|
+
// Start the initial connection
|
|
612
|
+
connect();
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
// Helper: Setup global listeners
|
|
617
|
+
// This is called at top-level before any async operations to ensure listeners are registered first
|
|
618
|
+
function setupGlobalHandlers() {
|
|
619
|
+
// Force service worker to use the latest version
|
|
620
|
+
serviceWorker.addEventListener('install', (event) => {
|
|
621
|
+
serviceWorker.skipWaiting();
|
|
622
|
+
});
|
|
623
|
+
|
|
624
|
+
// Handle extension install/update
|
|
625
|
+
extension.runtime.onInstalled.addListener((details) => {
|
|
626
|
+
// Only open tab on fresh install (not updates)
|
|
627
|
+
if (details.reason !== 'install') {
|
|
628
|
+
return;
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
// Get website URL from config
|
|
632
|
+
const config = serviceWorker.OMEGA_BUILD_JSON?.config || {};
|
|
633
|
+
const website = config?.brand?.url;
|
|
634
|
+
|
|
635
|
+
// Skip if no website configured
|
|
636
|
+
if (!website) {
|
|
637
|
+
installLogger.log('No website configured, skipping install page');
|
|
638
|
+
return;
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
// Open the installed page
|
|
642
|
+
const installedUrl = `${website}/extension/installed`;
|
|
643
|
+
installLogger.log('Opening install page:', installedUrl);
|
|
644
|
+
|
|
645
|
+
extension.tabs.create({ url: installedUrl });
|
|
646
|
+
});
|
|
647
|
+
|
|
648
|
+
serviceWorker.addEventListener('activate', (event) => {
|
|
649
|
+
event.waitUntil(serviceWorker.clients.claim());
|
|
650
|
+
});
|
|
651
|
+
|
|
652
|
+
// Handle clicks on notifications
|
|
653
|
+
// ⚠️ MUST be registered before any async operations
|
|
654
|
+
serviceWorker.addEventListener('notificationclick', (event) => {
|
|
655
|
+
// Get the properties of the notification
|
|
656
|
+
const notification = event.notification;
|
|
657
|
+
const data = (notification.data && notification.data.FCM_MSG ? notification.data.FCM_MSG.data : null) || {};
|
|
658
|
+
const payload = (notification.data && notification.data.FCM_MSG ? notification.data.FCM_MSG.notification : null) || {};
|
|
659
|
+
|
|
660
|
+
// Get the click action
|
|
661
|
+
const clickAction = payload.click_action || data.click_action || '/';
|
|
662
|
+
|
|
663
|
+
// Log
|
|
664
|
+
console.log('notificationclick event', event);
|
|
665
|
+
console.log('notificationclick data', data);
|
|
666
|
+
console.log('notificationclick payload', payload);
|
|
667
|
+
console.log('notificationclick clickAction', clickAction);
|
|
668
|
+
|
|
669
|
+
// Handle the click
|
|
670
|
+
event.waitUntil(
|
|
671
|
+
clients.openWindow(clickAction)
|
|
672
|
+
);
|
|
673
|
+
|
|
674
|
+
// Close the notification
|
|
675
|
+
notification.close();
|
|
676
|
+
});
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
// Cross-context helpers — Manager.isTesting() / isDevelopment() / getApiUrl() / etc.
|
|
680
|
+
attachModeHelpers(Manager);
|
|
681
|
+
attachUrlHelpers(Manager);
|
|
682
|
+
|
|
683
|
+
// Export
|
|
684
|
+
export default Manager;
|