@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,58 @@
|
|
|
1
|
+
// Boot-layer test — verifies Chromium can load BXM's fixture consumer
|
|
2
|
+
// extension as unpacked, the manifest validates, the SW comes up, and the
|
|
3
|
+
// popup renders end-to-end. This is the integration equivalent to "did the
|
|
4
|
+
// real consumer extension start without throwing".
|
|
5
|
+
//
|
|
6
|
+
// In BXM's own test run, OMEGA_TEST_BOOT_PROJECT points at the fixture under
|
|
7
|
+
// src/test/fixtures/consumer-extension. In a real consumer's `npx omega test`
|
|
8
|
+
// run, the env var is unset and boot tests target the consumer's own
|
|
9
|
+
// `<cwd>/dist/`.
|
|
10
|
+
|
|
11
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
12
|
+
|
|
13
|
+
module.exports = defineCases({
|
|
14
|
+
type: 'group',
|
|
15
|
+
layer: 'boot',
|
|
16
|
+
description: 'fixture consumer — extension loads + boots',
|
|
17
|
+
tests: [
|
|
18
|
+
{
|
|
19
|
+
description: 'extension has a valid ID and MV3 manifest',
|
|
20
|
+
inspect: async ({ extension, expect }) => {
|
|
21
|
+
expect(extension.id).toMatch(/^[a-z]{32}$/);
|
|
22
|
+
expect(extension.manifest.manifest_version).toBe(3);
|
|
23
|
+
expect(extension.manifest.name).toBe('BXM Fixture Consumer');
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
description: 'manifest exposes a popup URL',
|
|
28
|
+
inspect: async ({ extension, expect }) => {
|
|
29
|
+
expect(extension.popupUrl).toMatch(/^chrome-extension:\/\/[a-z]{32}\/popup\.html$/);
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
description: 'service worker target was discovered',
|
|
34
|
+
inspect: async ({ extension, expect }) => {
|
|
35
|
+
expect(extension.swTarget).not.toBeNull();
|
|
36
|
+
expect(extension.swTarget.type()).toBe('service_worker');
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
description: 'popup.html renders with the expected #main-content element',
|
|
41
|
+
inspect: async ({ extension, page, expect }) => {
|
|
42
|
+
await page.goto(extension.popupUrl, { waitUntil: 'domcontentloaded' });
|
|
43
|
+
const text = await page.$eval('#main-content', (el) => el.textContent);
|
|
44
|
+
expect(text).toContain('Fixture Popup');
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
description: 'background SW responded to a probe message',
|
|
49
|
+
inspect: async ({ extension, page, expect }) => {
|
|
50
|
+
// Open any page that has chrome.runtime access — popup works.
|
|
51
|
+
await page.goto(extension.popupUrl, { waitUntil: 'domcontentloaded' });
|
|
52
|
+
const reply = await page.evaluate(() => chrome.runtime.sendMessage({ type: 'fixture:hello' }));
|
|
53
|
+
expect(reply.ok).toBe(true);
|
|
54
|
+
expect(reply.version).toBe('0.1.0');
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
});
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// Build-layer tests for lib/affiliatizer.js — exercises the pure map data structure
|
|
2
|
+
// (the bulk of its high-value, currently-untested code). `Affiliatizer.initialize()`
|
|
3
|
+
// touches `window.location` / `chrome.storage` and requires a browser context — not
|
|
4
|
+
// testable at this layer. The regex map IS testable: deterministic, no IO, no globals.
|
|
5
|
+
|
|
6
|
+
const path = require('path');
|
|
7
|
+
|
|
8
|
+
const Affiliatizer = require(path.join(__dirname, '..', '..', '..', 'lib', 'affiliatizer.js'));
|
|
9
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
10
|
+
|
|
11
|
+
module.exports = defineCases({
|
|
12
|
+
type: 'suite',
|
|
13
|
+
layer: 'build',
|
|
14
|
+
description: 'lib/affiliatizer — URL-match map',
|
|
15
|
+
tests: [
|
|
16
|
+
{
|
|
17
|
+
name: 'get() returns an array of entries',
|
|
18
|
+
run: (ctx) => {
|
|
19
|
+
const map = Affiliatizer.get();
|
|
20
|
+
ctx.expect(Array.isArray(map)).toBe(true);
|
|
21
|
+
ctx.expect(map.length).toBeGreaterThan(0);
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: 'every entry has { id, match, replace }',
|
|
26
|
+
run: (ctx) => {
|
|
27
|
+
for (const entry of Affiliatizer.get()) {
|
|
28
|
+
ctx.expect(typeof entry.id).toBe('string');
|
|
29
|
+
ctx.expect(entry.match).toBeInstanceOf(RegExp);
|
|
30
|
+
ctx.expect(typeof entry.replace).toBe('object');
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'entry ids are unique',
|
|
36
|
+
run: (ctx) => {
|
|
37
|
+
const ids = Affiliatizer.get().map((e) => e.id);
|
|
38
|
+
const set = new Set(ids);
|
|
39
|
+
ctx.expect(set.size).toBe(ids.length);
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'amazon regex matches amazon.com hostnames',
|
|
44
|
+
run: (ctx) => {
|
|
45
|
+
const amazon = Affiliatizer.get().find((e) => e.id === 'amazon');
|
|
46
|
+
ctx.expect(amazon).toBeDefined();
|
|
47
|
+
ctx.expect(amazon.match.test('www.amazon.com')).toBe(true);
|
|
48
|
+
ctx.expect(amazon.match.test('smile.amazon.com')).toBe(true);
|
|
49
|
+
ctx.expect(amazon.match.test('example.com')).toBe(false);
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'every entry that has replace.href has a valid URL',
|
|
54
|
+
run: (ctx) => {
|
|
55
|
+
for (const entry of Affiliatizer.get()) {
|
|
56
|
+
if (!entry.replace.href) continue;
|
|
57
|
+
let threw = false;
|
|
58
|
+
try { new URL(entry.replace.href); } catch (_) { threw = true; }
|
|
59
|
+
ctx.expect(threw).toBe(false);
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
});
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// Which extension contexts count as a LAUNCH
|
|
2
|
+
// ([#386](https://github.com/Omega-JS-Stack/omega/issues/386), stage E of
|
|
3
|
+
// [#328](https://github.com/Omega-JS-Stack/omega/issues/328) — inventory gap 7:
|
|
4
|
+
// the extension counted nothing about itself).
|
|
5
|
+
//
|
|
6
|
+
// Three of the four client contexts fire `app_launch`: the toolbar popup, the
|
|
7
|
+
// injected page, and the side panel. The OPTIONS page does not — opening
|
|
8
|
+
// settings is maintenance, not a launch, and counting it would inflate the
|
|
9
|
+
// number with visits that are not sessions with the product (Ian's ruling).
|
|
10
|
+
//
|
|
11
|
+
// Static, on the SOURCE: the fire is one call in each context's initialize(),
|
|
12
|
+
// and there is no cheaper way to prove a context does not make it than reading
|
|
13
|
+
// the file the bundle is built from.
|
|
14
|
+
|
|
15
|
+
const fs = require('fs');
|
|
16
|
+
const path = require('path');
|
|
17
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
18
|
+
|
|
19
|
+
const SRC = path.join(__dirname, '..', '..', '..');
|
|
20
|
+
|
|
21
|
+
/** One context's source, with comments blanked — only what RUNS counts. */
|
|
22
|
+
function contextSource(name) {
|
|
23
|
+
return fs.readFileSync(path.join(SRC, `${name}.js`), 'utf8')
|
|
24
|
+
.replace(/\/\*[\s\S]*?\*\//g, (block) => block.replace(/[^\n]/g, ' '))
|
|
25
|
+
.replace(/(^|[^:])\/\/.*$/gm, (match, before) => before + ' '.repeat(match.length - before.length));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
module.exports = defineCases({
|
|
29
|
+
type: 'suite',
|
|
30
|
+
layer: 'build',
|
|
31
|
+
description: 'app_launch — the contexts that count as a launch',
|
|
32
|
+
tests: [
|
|
33
|
+
{
|
|
34
|
+
name: 'the popup, the page and the side panel each fire app_launch once',
|
|
35
|
+
run: (ctx) => {
|
|
36
|
+
for (const name of ['popup', 'page', 'sidepanel']) {
|
|
37
|
+
const source = contextSource(name);
|
|
38
|
+
const fires = source.match(/trackAppLaunch\(\)/g) || [];
|
|
39
|
+
|
|
40
|
+
ctx.expect(fires.length).toBe(1);
|
|
41
|
+
ctx.expect(source.includes("from './lib/analytics.js'")).toBe(true);
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: 'the options page fires nothing — settings is not a launch',
|
|
47
|
+
run: (ctx) => {
|
|
48
|
+
const source = contextSource('options');
|
|
49
|
+
|
|
50
|
+
ctx.expect(source.includes('trackAppLaunch')).toBe(false);
|
|
51
|
+
ctx.expect(source.includes('./lib/analytics.js')).toBe(false);
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: 'the launch helper speaks the CANONICAL event, and never throws at a boot',
|
|
56
|
+
run: (ctx) => {
|
|
57
|
+
const helper = fs.readFileSync(path.join(SRC, 'lib', 'analytics.js'), 'utf8');
|
|
58
|
+
|
|
59
|
+
// The catalog name, through the shared client — no provider, no dialect.
|
|
60
|
+
ctx.expect(helper.includes("omega.analytics().event('app_launch')")).toBe(true);
|
|
61
|
+
ctx.expect(helper.includes('try {')).toBe(true);
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
});
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// Build-layer tests for src/utils/attach-log-file.js — the vendored shim over
|
|
2
|
+
// @omega.js/devkit/attach-log-file. Each test attaches, writes, detaches, then
|
|
3
|
+
// inspects the file. The tee's own contract (both sinks, truncation, crash
|
|
4
|
+
// tails, CI skip) is pinned in devkit; this suite pins that the shim the
|
|
5
|
+
// framework's verbs require IS that tee, through the framework's own paths.
|
|
6
|
+
//
|
|
7
|
+
// CRITICAL: these tests run INSIDE a live `npx omega test` process whose own output is being
|
|
8
|
+
// teed to logs/test.log by the singleton. So they must NOT touch the singleton — exercising
|
|
9
|
+
// attach()/detach() on it would detach the live tee mid-run and truncate logs/test.log. Each
|
|
10
|
+
// test uses its OWN `createTee()` instance, which stacks under the live singleton tee and
|
|
11
|
+
// restores it cleanly on detach.
|
|
12
|
+
//
|
|
13
|
+
// Every attach passes an explicit `env` so the tee's CI skip is never what a
|
|
14
|
+
// green run depends on — the suite behaves the same on a laptop and a runner.
|
|
15
|
+
|
|
16
|
+
const path = require('path');
|
|
17
|
+
const fs = require('fs');
|
|
18
|
+
const os = require('os');
|
|
19
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
20
|
+
|
|
21
|
+
const NO_CI = { env: {} };
|
|
22
|
+
|
|
23
|
+
module.exports = defineCases({
|
|
24
|
+
type: 'suite',
|
|
25
|
+
layer: 'build',
|
|
26
|
+
description: 'attach-log-file — tee stdout/stderr to a file',
|
|
27
|
+
tests: [
|
|
28
|
+
{
|
|
29
|
+
name: 'exports the expected surface',
|
|
30
|
+
run: (ctx) => {
|
|
31
|
+
const mod = require(path.join(__dirname, '..', '..', '..', 'utils', 'attach-log-file.js'));
|
|
32
|
+
ctx.expect(typeof mod).toBe('function');
|
|
33
|
+
ctx.expect(typeof mod.detach).toBe('function');
|
|
34
|
+
ctx.expect(typeof mod.stripAnsi).toBe('function');
|
|
35
|
+
ctx.expect(typeof mod.createTee).toBe('function');
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'stripAnsi removes color escape codes',
|
|
40
|
+
run: (ctx) => {
|
|
41
|
+
const { stripAnsi } = require(path.join(__dirname, '..', '..', '..', 'utils', 'attach-log-file.js'));
|
|
42
|
+
const colored = '\x1B[31mred\x1B[0m and \x1B[32mgreen\x1B[0m';
|
|
43
|
+
ctx.expect(stripAnsi(colored)).toBe('red and green');
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'attach + stdout.write + detach: file contains the writes, ANSI stripped',
|
|
48
|
+
run: (ctx) => {
|
|
49
|
+
const attach = require(path.join(__dirname, '..', '..', '..', 'utils', 'attach-log-file.js'));
|
|
50
|
+
// Isolated instance — stacks under the live test.log tee, never clobbers it.
|
|
51
|
+
const tee = attach.createTee();
|
|
52
|
+
const tmpPath = path.join(os.tmpdir(), `extension-log-${Date.now()}.log`);
|
|
53
|
+
try {
|
|
54
|
+
// attach() returns the DETACH function; the writes themselves are
|
|
55
|
+
// synchronous fd writes, so there is nothing to flush before reading.
|
|
56
|
+
const detach = tee.attach(tmpPath, NO_CI);
|
|
57
|
+
process.stdout.write('hello world\n');
|
|
58
|
+
process.stdout.write('\x1B[31mcolored\x1B[0m line\n');
|
|
59
|
+
detach();
|
|
60
|
+
|
|
61
|
+
const contents = fs.readFileSync(tmpPath, 'utf8');
|
|
62
|
+
ctx.expect(contents).toContain('hello world');
|
|
63
|
+
ctx.expect(contents).toContain('colored line');
|
|
64
|
+
ctx.expect(contents).not.toContain('\x1B[');
|
|
65
|
+
} finally {
|
|
66
|
+
tee.detach();
|
|
67
|
+
try { fs.unlinkSync(tmpPath); } catch (e) {}
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: 'idempotent: attaching twice with the same path returns the same detach',
|
|
73
|
+
run: (ctx) => {
|
|
74
|
+
const attach = require(path.join(__dirname, '..', '..', '..', 'utils', 'attach-log-file.js'));
|
|
75
|
+
const tee = attach.createTee();
|
|
76
|
+
const tmpPath = path.join(os.tmpdir(), `extension-log-idem-${Date.now()}.log`);
|
|
77
|
+
try {
|
|
78
|
+
const d1 = tee.attach(tmpPath, NO_CI);
|
|
79
|
+
const d2 = tee.attach(tmpPath, NO_CI);
|
|
80
|
+
ctx.expect(d1).toBe(d2);
|
|
81
|
+
} finally {
|
|
82
|
+
tee.detach();
|
|
83
|
+
try { fs.unlinkSync(tmpPath); } catch (e) {}
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
name: 'attach with falsy path returns a no-op detach and patches nothing',
|
|
89
|
+
run: (ctx) => {
|
|
90
|
+
const attach = require(path.join(__dirname, '..', '..', '..', 'utils', 'attach-log-file.js'));
|
|
91
|
+
const tee = attach.createTee();
|
|
92
|
+
const priorWrite = process.stdout.write;
|
|
93
|
+
ctx.expect(typeof tee.attach(null, NO_CI)).toBe('function');
|
|
94
|
+
ctx.expect(typeof tee.attach('', NO_CI)).toBe('function');
|
|
95
|
+
ctx.expect(process.stdout.write).toBe(priorWrite);
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
],
|
|
99
|
+
});
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// Build-layer pin for the background SW's auth-emulator gate (#46).
|
|
2
|
+
//
|
|
3
|
+
// The SW connects Firebase Auth to the local emulator ONLY on a testing build.
|
|
4
|
+
// Its whole signal is what the bundle task BAKED into OMEGA_BUILD_JSON: a
|
|
5
|
+
// service worker has no `process.env`, so `Manager.isTesting()` resolves from
|
|
6
|
+
// `config.omega.environment` (mode-helpers step 1). This suite drives that for
|
|
7
|
+
// real — the actual composeBuildJson under each build mode, feeding the actual
|
|
8
|
+
// snapshot into the actual mode-helpers — and then pins that the emulator call
|
|
9
|
+
// sits behind exactly that check. background.js itself is a browser-context ES
|
|
10
|
+
// module, so the call site is pinned by source, same model as
|
|
11
|
+
// cache-warming.test.js / verts-binding.test.js.
|
|
12
|
+
//
|
|
13
|
+
// In a real SW `chrome.runtime.getManifest()` also answers (packed → production,
|
|
14
|
+
// unpacked → development); testing still wins because the config check comes first.
|
|
15
|
+
|
|
16
|
+
const path = require('path');
|
|
17
|
+
const fs = require('fs');
|
|
18
|
+
const os = require('os');
|
|
19
|
+
|
|
20
|
+
const SRC = path.join(__dirname, '..', '..', '..');
|
|
21
|
+
const TASK_PATH = path.join(SRC, 'gulp', 'tasks', 'bundle.js');
|
|
22
|
+
const helpers = require(path.join(SRC, 'utils', 'mode-helpers.js'));
|
|
23
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
24
|
+
const BACKGROUND = fs.readFileSync(path.join(SRC, 'background.js'), 'utf8');
|
|
25
|
+
|
|
26
|
+
// Compose a real snapshot under the given build mode and hand back its `config`
|
|
27
|
+
// blob — exactly what the SW reads out of OMEGA_BUILD_JSON.
|
|
28
|
+
async function bakeConfig(mode) {
|
|
29
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-emulator-gate-'));
|
|
30
|
+
fs.writeFileSync(path.join(tmp, 'package.json'), `{ "name": "gate-ext", "version": "1.0.0" }`);
|
|
31
|
+
|
|
32
|
+
const oldCwd = process.cwd();
|
|
33
|
+
const env = { OMEGA_TEST_MODE: null, OMEGA_BUILD_MODE: null, NODE_ENV: null };
|
|
34
|
+
if (mode === 'testing') env.OMEGA_TEST_MODE = 'true';
|
|
35
|
+
if (mode === 'production') env.OMEGA_BUILD_MODE = 'true';
|
|
36
|
+
|
|
37
|
+
const originals = {};
|
|
38
|
+
for (const [k, v] of Object.entries(env)) {
|
|
39
|
+
originals[k] = process.env[k];
|
|
40
|
+
if (v === null) delete process.env[k]; else process.env[k] = v;
|
|
41
|
+
}
|
|
42
|
+
for (const key of Object.keys(require.cache)) {
|
|
43
|
+
if (key.startsWith(SRC + path.sep)) delete require.cache[key];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
try {
|
|
47
|
+
process.chdir(tmp);
|
|
48
|
+
return (await require(TASK_PATH).composeBuildJson()).config;
|
|
49
|
+
} finally {
|
|
50
|
+
process.chdir(oldCwd);
|
|
51
|
+
for (const [k, v] of Object.entries(originals)) {
|
|
52
|
+
if (v === undefined) delete process.env[k]; else process.env[k] = v;
|
|
53
|
+
}
|
|
54
|
+
for (const key of Object.keys(require.cache)) {
|
|
55
|
+
if (key.startsWith(SRC + path.sep)) delete require.cache[key];
|
|
56
|
+
}
|
|
57
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// The SW's own resolution: no process.env, config-baked signals only.
|
|
62
|
+
function isTestingInServiceWorker(config) {
|
|
63
|
+
const originals = {};
|
|
64
|
+
for (const k of ['OMEGA_TEST_MODE', 'OMEGA_BUILD_MODE', 'NODE_ENV']) {
|
|
65
|
+
originals[k] = process.env[k];
|
|
66
|
+
delete process.env[k];
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
return helpers.isTesting.call({ config });
|
|
70
|
+
} finally {
|
|
71
|
+
for (const [k, v] of Object.entries(originals)) {
|
|
72
|
+
if (v !== undefined) process.env[k] = v;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
module.exports = defineCases({
|
|
78
|
+
type: 'suite',
|
|
79
|
+
layer: 'build',
|
|
80
|
+
description: 'background auth-emulator gate — testing builds only',
|
|
81
|
+
tests: [
|
|
82
|
+
{
|
|
83
|
+
name: 'a testing build bakes environment=testing and the SW resolves isTesting() true',
|
|
84
|
+
run: async (ctx) => {
|
|
85
|
+
const config = await bakeConfig('testing');
|
|
86
|
+
ctx.expect(config.omega.environment).toBe('testing');
|
|
87
|
+
ctx.expect(isTestingInServiceWorker(config)).toBe(true);
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: 'a production build never trips the gate',
|
|
92
|
+
run: async (ctx) => {
|
|
93
|
+
const config = await bakeConfig('production');
|
|
94
|
+
ctx.expect(config.omega.environment).toBe('production');
|
|
95
|
+
ctx.expect(isTestingInServiceWorker(config)).toBe(false);
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'a dev build never trips the gate',
|
|
100
|
+
run: async (ctx) => {
|
|
101
|
+
const config = await bakeConfig('development');
|
|
102
|
+
ctx.expect(config.omega.environment).toBe('development');
|
|
103
|
+
ctx.expect(isTestingInServiceWorker(config)).toBe(false);
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
name: 'the SW calls connectAuthEmulator once, only inside the isTesting() gate',
|
|
108
|
+
run: (ctx) => {
|
|
109
|
+
const calls = BACKGROUND.match(/connectAuthEmulator\(/g) || [];
|
|
110
|
+
ctx.expect(calls.length).toBe(1);
|
|
111
|
+
ctx.expect(/if \(this\.isTesting\(\)\) \{\s*const port = this\.config\?\.dev\?\.ports\?\.auth \|\| AUTH_EMULATOR_PORT;\s*this\.authLogger\.log\([^\n]*\);\s*connectAuthEmulator\(this\.libraries\.firebaseAuth, `http:\/\/localhost:\$\{port\}`/.test(BACKGROUND)).toBe(true);
|
|
112
|
+
// The baked map first (#300 — a SW can't read a bumped OMEGA_AUTH_PORT,
|
|
113
|
+
// so the bake carries it), the classic port as the fallback
|
|
114
|
+
ctx.expect(BACKGROUND).toMatch(/const AUTH_EMULATOR_PORT = 9099;/);
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
],
|
|
118
|
+
});
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// Build-layer pin for the extension's click-trigger wiring (#16).
|
|
2
|
+
//
|
|
3
|
+
// `omega-signin` and `omega-account` are the extension's OWN triggers (only an
|
|
4
|
+
// extension opens a brand page in a tab), registered on @omega.js/client's shared
|
|
5
|
+
// registry instead of the delegated `document` click listener auth-helpers used
|
|
6
|
+
// to roll itself. auth-helpers.js is a browser-context ES module (it imports the
|
|
7
|
+
// client by bare specifier), so the wiring is pinned by SOURCE — the same model
|
|
8
|
+
// as global-handlers / cache-warming / verts-binding.
|
|
9
|
+
//
|
|
10
|
+
// The whole class of regression is covered, not just the rename: a legacy class
|
|
11
|
+
// name anywhere in the source, or a hand-rolled listener coming back, both fail.
|
|
12
|
+
|
|
13
|
+
const path = require('path');
|
|
14
|
+
const fs = require('fs');
|
|
15
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
16
|
+
|
|
17
|
+
const SRC = path.join(__dirname, '..', '..', '..');
|
|
18
|
+
const AUTH_HELPERS = fs.readFileSync(path.join(SRC, 'lib', 'auth-helpers.js'), 'utf8');
|
|
19
|
+
const LEGACY_CLASSES = ['auth-signin-btn', 'auth-signout-btn', 'uj-password-toggle'];
|
|
20
|
+
|
|
21
|
+
module.exports = defineCases({
|
|
22
|
+
type: 'group',
|
|
23
|
+
layer: 'build',
|
|
24
|
+
description: 'click triggers: omega-signin / omega-account ride the shared registry (#16, #122)',
|
|
25
|
+
tests: [
|
|
26
|
+
{
|
|
27
|
+
name: 'setupAuthEventListeners registers the `signin` trigger, no hand-rolled listener',
|
|
28
|
+
run: (ctx) => {
|
|
29
|
+
ctx.expect(AUTH_HELPERS.includes("import { registerTrigger } from '@omega.js/client/modules/triggers.js'")).toBe(true);
|
|
30
|
+
|
|
31
|
+
const fnSource = AUTH_HELPERS.slice(AUTH_HELPERS.indexOf('export function setupAuthEventListeners'));
|
|
32
|
+
ctx.expect(fnSource.includes("registerTrigger('signin'")).toBe(true);
|
|
33
|
+
ctx.expect(fnSource.includes('openAuthPage(context)')).toBe(true);
|
|
34
|
+
// The trigger class is the registry's to spell — never written by hand.
|
|
35
|
+
ctx.expect(fnSource.includes('omega-signin')).toBe(false);
|
|
36
|
+
ctx.expect(fnSource.includes('addEventListener')).toBe(false);
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: 'setupAuthEventListeners registers the `account` trigger, opening /account on the brand site',
|
|
41
|
+
run: (ctx) => {
|
|
42
|
+
const fnSource = AUTH_HELPERS.slice(AUTH_HELPERS.indexOf('export function setupAuthEventListeners'));
|
|
43
|
+
ctx.expect(fnSource.includes("registerTrigger('account'")).toBe(true);
|
|
44
|
+
// Same resolver as signin: brand.url + tabs.create, only the path differs.
|
|
45
|
+
ctx.expect(fnSource.includes("openAuthPage(context, { path: '/account' })")).toBe(true);
|
|
46
|
+
// The trigger class is the registry's to spell — never written by hand.
|
|
47
|
+
ctx.expect(fnSource.includes('omega-account')).toBe(false);
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: 'no legacy trigger class survives anywhere in the extension source',
|
|
52
|
+
run: (ctx) => {
|
|
53
|
+
const offenders = [];
|
|
54
|
+
for (const entry of fs.readdirSync(SRC, { recursive: true, withFileTypes: true })) {
|
|
55
|
+
if (!entry.isFile() || !/\.(js|html)$/.test(entry.name)) { continue; }
|
|
56
|
+
const file = path.join(entry.parentPath, entry.name);
|
|
57
|
+
// The framework's own sources only — `defaults/` is consumer scaffold
|
|
58
|
+
// markup and is swept the same way. Skipped: node_modules (not ours),
|
|
59
|
+
// and this suite tree (it NAMES the retired classes on purpose).
|
|
60
|
+
if (file.includes(`${path.sep}node_modules${path.sep}`)) { continue; }
|
|
61
|
+
if (file.startsWith(path.join(SRC, 'test') + path.sep)) { continue; }
|
|
62
|
+
const contents = fs.readFileSync(file, 'utf8');
|
|
63
|
+
for (const name of LEGACY_CLASSES) {
|
|
64
|
+
if (contents.includes(name)) { offenders.push(`${path.relative(SRC, file)} → ${name}`); }
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
ctx.expect(offenders).toEqual([]);
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
});
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
// Build-layer tests for the boot layer's extension-directory discovery (#575).
|
|
2
|
+
//
|
|
3
|
+
// The boot layer promises a SKIP when the consumer has not built yet
|
|
4
|
+
// (docs/test-boot-layer.md). It discovered by existence alone, so it fell
|
|
5
|
+
// through to `<consumer>/dist/` — which exists after any dev run or `omega
|
|
6
|
+
// clean` — loaded the JSON5 source manifest Chrome cannot parse, and hard-failed
|
|
7
|
+
// every boot test instead. A directory only qualifies when its manifest is
|
|
8
|
+
// STRICT JSON; an explicitly named OMEGA_TEST_BOOT_DIR still fails loudly,
|
|
9
|
+
// because that one is the caller's decision, not a fallback.
|
|
10
|
+
//
|
|
11
|
+
// Discovery is asserted directly (no Chromium): the skip/abort verdicts are
|
|
12
|
+
// reached and returned before puppeteer ever launches.
|
|
13
|
+
|
|
14
|
+
const path = require('path');
|
|
15
|
+
const fs = require('fs');
|
|
16
|
+
const os = require('os');
|
|
17
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
18
|
+
|
|
19
|
+
const BOOT_RUNNER = path.join(__dirname, '..', '..', 'runners', 'boot.js');
|
|
20
|
+
|
|
21
|
+
// One boot test, enough to make the counts meaningful.
|
|
22
|
+
const TESTS = [{ description: 'boot probe', inspect: async () => {} }];
|
|
23
|
+
|
|
24
|
+
const JSON5_MANIFEST = `{
|
|
25
|
+
// the framework-authored source style Chrome refuses
|
|
26
|
+
manifest_version: 3,
|
|
27
|
+
name: 'Staged',
|
|
28
|
+
}
|
|
29
|
+
`;
|
|
30
|
+
const STRICT_MANIFEST = JSON.stringify({ manifest_version: 3, name: 'Staged', version: '1.0.0' }, null, 2);
|
|
31
|
+
|
|
32
|
+
// Stage a consumer project. `manifests` is a relative dir → manifest contents map.
|
|
33
|
+
function stageConsumer(manifests) {
|
|
34
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-boot-discovery-'));
|
|
35
|
+
|
|
36
|
+
for (const [relative, contents] of Object.entries(manifests)) {
|
|
37
|
+
fs.mkdirSync(path.join(tmp, relative), { recursive: true });
|
|
38
|
+
fs.writeFileSync(path.join(tmp, relative, 'manifest.json'), contents);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return tmp;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// The self-test run points OMEGA_TEST_BOOT_PROJECT at the in-tree fixture —
|
|
45
|
+
// neutralize both boot env vars so each case sees only what it staged.
|
|
46
|
+
function withBootEnv(vars, fn) {
|
|
47
|
+
const keys = ['OMEGA_TEST_BOOT_PROJECT', 'OMEGA_TEST_BOOT_DIR'];
|
|
48
|
+
const previous = {};
|
|
49
|
+
keys.forEach((key) => { previous[key] = process.env[key]; delete process.env[key]; });
|
|
50
|
+
Object.entries(vars).forEach(([key, value]) => { process.env[key] = value; });
|
|
51
|
+
|
|
52
|
+
return Promise.resolve()
|
|
53
|
+
.then(fn)
|
|
54
|
+
.finally(() => {
|
|
55
|
+
keys.forEach((key) => {
|
|
56
|
+
if (previous[key] === undefined) delete process.env[key];
|
|
57
|
+
else process.env[key] = previous[key];
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
module.exports = defineCases({
|
|
63
|
+
type: 'suite',
|
|
64
|
+
layer: 'build',
|
|
65
|
+
description: 'boot layer — extension-directory discovery',
|
|
66
|
+
tests: [
|
|
67
|
+
{
|
|
68
|
+
name: 'a JSON5 dist/ manifest never qualifies — the run SKIPS as documented (#575)',
|
|
69
|
+
run: async (ctx) => {
|
|
70
|
+
const { runBootTests, resolveBootDir } = require(BOOT_RUNNER);
|
|
71
|
+
const tmp = stageConsumer({ dist: JSON5_MANIFEST });
|
|
72
|
+
|
|
73
|
+
try {
|
|
74
|
+
await withBootEnv({}, async () => {
|
|
75
|
+
const discovery = resolveBootDir(tmp);
|
|
76
|
+
ctx.expect(discovery.dir).toBe(null);
|
|
77
|
+
// The JSON5 copy is REPORTED, so the skip can say why it was passed over
|
|
78
|
+
ctx.expect(discovery.rejected.length).toBe(1);
|
|
79
|
+
ctx.expect(discovery.rejected[0].dir).toBe(path.join(tmp, 'dist'));
|
|
80
|
+
|
|
81
|
+
const counts = await runBootTests({ tests: TESTS, projectRoot: tmp });
|
|
82
|
+
ctx.expect(counts.skipped).toBe(TESTS.length);
|
|
83
|
+
ctx.expect(counts.failed).toBe(0);
|
|
84
|
+
});
|
|
85
|
+
} finally {
|
|
86
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: 'the packaged strict-JSON manifest wins, and a strict-JSON dist/ still qualifies (#575)',
|
|
92
|
+
run: async (ctx) => {
|
|
93
|
+
const { resolveBootDir } = require(BOOT_RUNNER);
|
|
94
|
+
const both = stageConsumer({ 'packaged/chromium/raw': STRICT_MANIFEST, dist: JSON5_MANIFEST });
|
|
95
|
+
// The framework's own fixture extension has no `packaged/` step — its
|
|
96
|
+
// dist/ is already strict JSON, and it must keep booting.
|
|
97
|
+
const fixtureShape = stageConsumer({ dist: STRICT_MANIFEST });
|
|
98
|
+
|
|
99
|
+
try {
|
|
100
|
+
await withBootEnv({}, async () => {
|
|
101
|
+
ctx.expect(resolveBootDir(both).dir).toBe(path.join(both, 'packaged', 'chromium', 'raw'));
|
|
102
|
+
ctx.expect(resolveBootDir(fixtureShape).dir).toBe(path.join(fixtureShape, 'dist'));
|
|
103
|
+
});
|
|
104
|
+
} finally {
|
|
105
|
+
fs.rmSync(both, { recursive: true, force: true });
|
|
106
|
+
fs.rmSync(fixtureShape, { recursive: true, force: true });
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
name: 'an explicitly named OMEGA_TEST_BOOT_DIR with a JSON5 manifest still FAILS loudly (#575)',
|
|
112
|
+
run: async (ctx) => {
|
|
113
|
+
const { runBootTests, resolveBootDir } = require(BOOT_RUNNER);
|
|
114
|
+
const tmp = stageConsumer({ dist: JSON5_MANIFEST });
|
|
115
|
+
|
|
116
|
+
try {
|
|
117
|
+
await withBootEnv({ OMEGA_TEST_BOOT_DIR: path.join(tmp, 'dist') }, async () => {
|
|
118
|
+
const discovery = resolveBootDir(tmp);
|
|
119
|
+
ctx.expect(discovery.dir).toBe(null);
|
|
120
|
+
// The caller named this directory — a manifest Chrome cannot parse
|
|
121
|
+
// there is an error, never a candidate to walk past
|
|
122
|
+
ctx.expect(discovery.error).toBeInstanceOf(Error);
|
|
123
|
+
|
|
124
|
+
const counts = await runBootTests({ tests: TESTS, projectRoot: tmp });
|
|
125
|
+
ctx.expect(counts.failed).toBe(TESTS.length);
|
|
126
|
+
ctx.expect(counts.skipped).toBe(0);
|
|
127
|
+
});
|
|
128
|
+
} finally {
|
|
129
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
],
|
|
134
|
+
});
|