@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,391 @@
|
|
|
1
|
+
// Chromium-runner — launches Puppeteer with the BXM harness extension loaded,
|
|
2
|
+
// runs background-layer suites in the SW context via CDP Runtime.evaluate, then
|
|
3
|
+
// runs view-layer suites in tabs pointed at popup/options/sidepanel pages.
|
|
4
|
+
//
|
|
5
|
+
// Communication channel: each injected test wraps its events as
|
|
6
|
+
// console.log('__BXM_TEST__' + JSON.stringify(evt))
|
|
7
|
+
// from inside the SW / tab. The runner subscribes to `Runtime.consoleAPICalled`
|
|
8
|
+
// (for SW) and Puppeteer's `page.on('console')` (for tabs) and parses those
|
|
9
|
+
// lines exactly like EM's electron runner parses stdout. Same JSON-line
|
|
10
|
+
// protocol — different transport.
|
|
11
|
+
//
|
|
12
|
+
// Test source is shipped as a string. Each test's `run` function body is
|
|
13
|
+
// extracted at load-time and wrapped as `(async (ctx) => { <body> })(ctx)`
|
|
14
|
+
// inside an outer harness that constructs `ctx` + `expect` from inline
|
|
15
|
+
// assert.js source. The body has no closure to its file — it must `require`
|
|
16
|
+
// nothing and rely only on `ctx` + globals (`chrome`, `globalThis`).
|
|
17
|
+
|
|
18
|
+
const path = require('path');
|
|
19
|
+
const fs = require('fs');
|
|
20
|
+
const chalk = require('chalk').default;
|
|
21
|
+
const { waitForTarget } = require('./helpers.js');
|
|
22
|
+
|
|
23
|
+
// Inline the source of assert.js so we can build it into the injected harness
|
|
24
|
+
// payload. The runner reads it from disk once at module-load time. Resolved through
|
|
25
|
+
// devkit (NOT ../assert.js, which is now a CommonJS re-export shim — its source would
|
|
26
|
+
// leave a bare `module.exports = require(...)` in the browser context).
|
|
27
|
+
const ASSERT_SRC = fs.readFileSync(require.resolve('../../vendor/devkit/test/assert.js'), 'utf8');
|
|
28
|
+
|
|
29
|
+
async function runChromiumTests({ backgroundSuiteFiles, viewSuiteFiles, filter, projectRoot, frameworkDistRoot }) {
|
|
30
|
+
let puppeteer;
|
|
31
|
+
try {
|
|
32
|
+
puppeteer = require('puppeteer');
|
|
33
|
+
} catch (e) {
|
|
34
|
+
const skipped = backgroundSuiteFiles.length + viewSuiteFiles.length;
|
|
35
|
+
console.log(chalk.yellow(` ○ background + view tests skipped (puppeteer not installed)`));
|
|
36
|
+
return { passed: 0, failed: 0, skipped };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const harnessExt = path.join(frameworkDistRoot, 'test', 'harness', 'extension');
|
|
40
|
+
if (!fs.existsSync(path.join(harnessExt, 'manifest.json'))) {
|
|
41
|
+
console.log(chalk.yellow(` ○ background + view tests skipped (harness extension not built at ${harnessExt})`));
|
|
42
|
+
return { passed: 0, failed: 0, skipped: backgroundSuiteFiles.length + viewSuiteFiles.length };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const counts = { passed: 0, failed: 0, skipped: 0 };
|
|
46
|
+
|
|
47
|
+
// Chromium-with-extensions requires the "new" headless mode (--headless=new in CLI
|
|
48
|
+
// terms). MV3 SWs don't start in old headless. Puppeteer sets it for us when we
|
|
49
|
+
// pass headless: 'new'.
|
|
50
|
+
const browser = await puppeteer.launch({
|
|
51
|
+
headless: 'new',
|
|
52
|
+
args: [
|
|
53
|
+
`--disable-extensions-except=${harnessExt}`,
|
|
54
|
+
`--load-extension=${harnessExt}`,
|
|
55
|
+
'--no-sandbox',
|
|
56
|
+
'--disable-dev-shm-usage',
|
|
57
|
+
],
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
try {
|
|
61
|
+
// Locate the SW target. Chromium spawns it asynchronously; poll for up to 5s.
|
|
62
|
+
const swTarget = await waitForTarget(browser, (t) => t.type() === 'service_worker' && t.url().includes('background.js'), 5000);
|
|
63
|
+
if (!swTarget) {
|
|
64
|
+
console.log(chalk.red(` ✗ Harness service worker never came up — aborting browser layer.`));
|
|
65
|
+
const total = backgroundSuiteFiles.length + viewSuiteFiles.length;
|
|
66
|
+
return { passed: 0, failed: total, skipped: 0 };
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Background suites first.
|
|
70
|
+
if (backgroundSuiteFiles.length > 0) {
|
|
71
|
+
const r = await runBackgroundSuites({
|
|
72
|
+
browser,
|
|
73
|
+
swTarget,
|
|
74
|
+
suiteFiles: backgroundSuiteFiles,
|
|
75
|
+
filter,
|
|
76
|
+
});
|
|
77
|
+
counts.passed += r.passed;
|
|
78
|
+
counts.failed += r.failed;
|
|
79
|
+
counts.skipped += r.skipped;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// View suites next — popup/options/sidepanel are all loaded as plain
|
|
83
|
+
// chrome-extension:// pages. Same Chromium instance, fresh tab per suite.
|
|
84
|
+
if (viewSuiteFiles.length > 0) {
|
|
85
|
+
const extId = swTarget.url().split('/')[2]; // chrome-extension://<id>/background.js
|
|
86
|
+
const r = await runViewSuites({
|
|
87
|
+
browser,
|
|
88
|
+
extId,
|
|
89
|
+
suiteFiles: viewSuiteFiles,
|
|
90
|
+
filter,
|
|
91
|
+
});
|
|
92
|
+
counts.passed += r.passed;
|
|
93
|
+
counts.failed += r.failed;
|
|
94
|
+
counts.skipped += r.skipped;
|
|
95
|
+
}
|
|
96
|
+
} finally {
|
|
97
|
+
try { await browser.close(); } catch (_) { /* ignore */ }
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return counts;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// ─── Background layer ────────────────────────────────────────────────────────
|
|
104
|
+
|
|
105
|
+
async function runBackgroundSuites({ browser, swTarget, suiteFiles, filter }) {
|
|
106
|
+
const counts = { passed: 0, failed: 0, skipped: 0 };
|
|
107
|
+
|
|
108
|
+
// Attach a CDP session to the SW so we can Runtime.evaluate inside it.
|
|
109
|
+
// Puppeteer's WorkerTarget exposes `.worker()` for accessing the underlying
|
|
110
|
+
// Worker handle.
|
|
111
|
+
const worker = await swTarget.worker();
|
|
112
|
+
if (!worker) {
|
|
113
|
+
console.log(chalk.red(` ✗ Could not attach to harness service worker.`));
|
|
114
|
+
return { passed: 0, failed: suiteFiles.length, skipped: 0 };
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Subscribe to console output from the SW. Each '__BXM_TEST__...' line is a
|
|
118
|
+
// structured test event. Anything else is incidental SW logging — surface it
|
|
119
|
+
// in OMEGA_TEST_DEBUG mode.
|
|
120
|
+
const consoleHandler = (msg) => {
|
|
121
|
+
const text = msg.text();
|
|
122
|
+
if (text.startsWith('__BXM_TEST__')) {
|
|
123
|
+
handleConsoleLine(text, counts);
|
|
124
|
+
} else if (process.env.OMEGA_TEST_DEBUG) {
|
|
125
|
+
process.stdout.write(chalk.gray(` [sw:${msg.type()}] ${text}\n`));
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
worker.on('console', consoleHandler);
|
|
129
|
+
|
|
130
|
+
try {
|
|
131
|
+
for (const file of suiteFiles) {
|
|
132
|
+
let mod;
|
|
133
|
+
try {
|
|
134
|
+
delete require.cache[require.resolve(file)];
|
|
135
|
+
mod = require(file);
|
|
136
|
+
} catch (e) {
|
|
137
|
+
console.log(chalk.red(` ✗ ${file}: Failed to load: ${e.message}`));
|
|
138
|
+
counts.failed += 1;
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
if (Array.isArray(mod)) mod = { type: 'group', tests: mod };
|
|
142
|
+
if (mod.layer !== 'background') continue;
|
|
143
|
+
|
|
144
|
+
const suiteName = mod.description || path.basename(file);
|
|
145
|
+
console.log(chalk.cyan(` ⤷ ${suiteName}`));
|
|
146
|
+
|
|
147
|
+
if (mod.skip) {
|
|
148
|
+
const count = Array.isArray(mod.tests) ? mod.tests.length : 1;
|
|
149
|
+
console.log(chalk.yellow(` ○ ${suiteName}`) + chalk.gray(` (skipped)`));
|
|
150
|
+
counts.skipped += count;
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const isSuite = mod.type === 'suite' || mod.type === 'group' || Array.isArray(mod.tests);
|
|
155
|
+
const tests = isSuite ? (mod.tests || []) : [{ name: suiteName, run: mod.run, timeout: mod.timeout }];
|
|
156
|
+
const isGroup = mod.type === 'group';
|
|
157
|
+
const stopOnFailure = !isGroup && isSuite && mod.stopOnFailure !== false;
|
|
158
|
+
|
|
159
|
+
// Build a single payload that runs every test in the suite sequentially
|
|
160
|
+
// inside the SW. Shared `state` lives inside the SW for the lifetime of
|
|
161
|
+
// the suite. The runner emits one __BXM_TEST__ event per test.
|
|
162
|
+
const payload = buildSuitePayload({ suiteName, tests, filter, stopOnFailure, timeout: mod.timeout });
|
|
163
|
+
try {
|
|
164
|
+
await worker.evaluate(payload);
|
|
165
|
+
} catch (e) {
|
|
166
|
+
// worker.evaluate rejects on syntax errors / top-level throws inside
|
|
167
|
+
// the SW. The injected harness traps per-test errors itself; a
|
|
168
|
+
// rejection here means the wrapper code itself broke.
|
|
169
|
+
console.log(chalk.red(` ✗ ${suiteName}: harness threw: ${e.message}`));
|
|
170
|
+
counts.failed += tests.length;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
} finally {
|
|
174
|
+
worker.off('console', consoleHandler);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return counts;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// ─── View layer ───────────────────────────────────────────────────────────────
|
|
181
|
+
|
|
182
|
+
async function runViewSuites({ browser, extId, suiteFiles, filter }) {
|
|
183
|
+
const counts = { passed: 0, failed: 0, skipped: 0 };
|
|
184
|
+
|
|
185
|
+
for (const file of suiteFiles) {
|
|
186
|
+
let mod;
|
|
187
|
+
try {
|
|
188
|
+
delete require.cache[require.resolve(file)];
|
|
189
|
+
mod = require(file);
|
|
190
|
+
} catch (e) {
|
|
191
|
+
console.log(chalk.red(` ✗ ${file}: Failed to load: ${e.message}`));
|
|
192
|
+
counts.failed += 1;
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
if (Array.isArray(mod)) mod = { type: 'group', tests: mod };
|
|
196
|
+
if (mod.layer !== 'view') continue;
|
|
197
|
+
|
|
198
|
+
const suiteName = mod.description || path.basename(file);
|
|
199
|
+
const context = mod.context || 'popup'; // popup | options | sidepanel
|
|
200
|
+
console.log(chalk.cyan(` ⤷ ${suiteName} (${context})`));
|
|
201
|
+
|
|
202
|
+
if (mod.skip) {
|
|
203
|
+
const count = Array.isArray(mod.tests) ? mod.tests.length : 1;
|
|
204
|
+
console.log(chalk.yellow(` ○ ${suiteName}`) + chalk.gray(` (skipped)`));
|
|
205
|
+
counts.skipped += count;
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
const isSuite = mod.type === 'suite' || mod.type === 'group' || Array.isArray(mod.tests);
|
|
210
|
+
const tests = isSuite ? (mod.tests || []) : [{ name: suiteName, run: mod.run, timeout: mod.timeout }];
|
|
211
|
+
const isGroup = mod.type === 'group';
|
|
212
|
+
const stopOnFailure = !isGroup && isSuite && mod.stopOnFailure !== false;
|
|
213
|
+
|
|
214
|
+
const url = `chrome-extension://${extId}/${context}.html`;
|
|
215
|
+
const page = await browser.newPage();
|
|
216
|
+
const consoleHandler = (msg) => {
|
|
217
|
+
const text = msg.text();
|
|
218
|
+
if (text.startsWith('__BXM_TEST__')) {
|
|
219
|
+
handleConsoleLine(text, counts);
|
|
220
|
+
} else if (process.env.OMEGA_TEST_DEBUG) {
|
|
221
|
+
process.stdout.write(chalk.gray(` [tab:${msg.type()}] ${text}\n`));
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
page.on('console', consoleHandler);
|
|
225
|
+
|
|
226
|
+
try {
|
|
227
|
+
await page.goto(url, { waitUntil: 'domcontentloaded' });
|
|
228
|
+
const payload = buildSuitePayload({ suiteName, tests, filter, stopOnFailure, timeout: mod.timeout });
|
|
229
|
+
await page.evaluate(payload);
|
|
230
|
+
} catch (e) {
|
|
231
|
+
console.log(chalk.red(` ✗ ${suiteName}: harness threw: ${e.message}`));
|
|
232
|
+
counts.failed += tests.length;
|
|
233
|
+
} finally {
|
|
234
|
+
page.off('console', consoleHandler);
|
|
235
|
+
try { await page.close(); } catch (_) { /* ignore */ }
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
return counts;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// ─── Suite payload builder ────────────────────────────────────────────────────
|
|
243
|
+
|
|
244
|
+
// Build a single string of JavaScript that, when evaluated inside the SW or a tab,
|
|
245
|
+
// runs all `tests` sequentially and emits __BXM_TEST__ events per result.
|
|
246
|
+
//
|
|
247
|
+
// Why string-payload vs function-passing? Puppeteer can pass functions, but
|
|
248
|
+
// `worker.evaluate(fn, ...args)` serializes args via JSON (no functions). So
|
|
249
|
+
// every test function body must be string-ified and rebuilt inside the target
|
|
250
|
+
// context. We do that here.
|
|
251
|
+
function buildSuitePayload({ suiteName, tests, filter, stopOnFailure, timeout: suiteTimeout }) {
|
|
252
|
+
// MV3 service workers have a strict CSP that forbids `eval`, `new Function`,
|
|
253
|
+
// `new AsyncFunction` — anything that compiles a string into code at runtime.
|
|
254
|
+
// So we CANNOT rebuild test functions from a string inside the SW.
|
|
255
|
+
//
|
|
256
|
+
// Instead: bake each test's source as a literal async-function expression
|
|
257
|
+
// directly into the payload at runner build-time. The CSP allows that because
|
|
258
|
+
// the SW only sees pre-compiled code arriving via the top-level Runtime.evaluate
|
|
259
|
+
// (which CDP exempts from CSP) — no inner `eval` happens.
|
|
260
|
+
//
|
|
261
|
+
// Each test becomes an entry like:
|
|
262
|
+
// { name: 'foo', timeout: 30000, fn: async (ctx, expect, state) => { /* body */ } }
|
|
263
|
+
// and is called via `await tests[i].fn(ctx, expect, state)`.
|
|
264
|
+
const inlinedTests = tests
|
|
265
|
+
.filter((t) => !filter || t.name.includes(filter) || suiteName.includes(filter))
|
|
266
|
+
.map((t) => {
|
|
267
|
+
const body = extractFnBody(t.run);
|
|
268
|
+
const skip = t.skip ? JSON.stringify(t.skip) : 'false';
|
|
269
|
+
const tout = t.timeout || suiteTimeout || 30000;
|
|
270
|
+
return ` { name: ${JSON.stringify(t.name)}, skip: ${skip}, timeout: ${tout}, fn: async (ctx, expect, state) => {\n${body}\n} },`;
|
|
271
|
+
})
|
|
272
|
+
.join('\n');
|
|
273
|
+
|
|
274
|
+
// assert.js declares `function expect(...) { ... }` at the top level. We strip its
|
|
275
|
+
// `module.exports = expect` line (no `module` in the browser) and keep the function
|
|
276
|
+
// declaration available as the local `expect`.
|
|
277
|
+
return `
|
|
278
|
+
(async function () {
|
|
279
|
+
'use strict';
|
|
280
|
+
${ASSERT_SRC.replace(/module\.exports\s*=\s*expect;?/, '')}
|
|
281
|
+
|
|
282
|
+
function emit(evt) {
|
|
283
|
+
console.log('__BXM_TEST__' + JSON.stringify(evt));
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
class SkipError extends Error { constructor(reason) { super(reason); this.name = 'SkipError'; } }
|
|
287
|
+
|
|
288
|
+
const suiteName = ${JSON.stringify(suiteName)};
|
|
289
|
+
const stopOnFail = ${JSON.stringify(!!stopOnFailure)};
|
|
290
|
+
const tests = [
|
|
291
|
+
${inlinedTests}
|
|
292
|
+
];
|
|
293
|
+
|
|
294
|
+
emit({ event: 'suite-start', name: suiteName });
|
|
295
|
+
|
|
296
|
+
const state = {};
|
|
297
|
+
let passed = 0, failed = 0, skipped = 0;
|
|
298
|
+
|
|
299
|
+
for (let i = 0; i < tests.length; i++) {
|
|
300
|
+
const t = tests[i];
|
|
301
|
+
if (t.skip) {
|
|
302
|
+
const reason = typeof t.skip === 'string' ? t.skip : 'skipped';
|
|
303
|
+
emit({ event: 'skip', name: suiteName + ' → ' + t.name, reason });
|
|
304
|
+
skipped += 1;
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
const ctx = {
|
|
309
|
+
expect,
|
|
310
|
+
state,
|
|
311
|
+
layer: 'browser',
|
|
312
|
+
skip(reason) { throw new SkipError(reason || 'skipped at runtime'); },
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
const start = Date.now();
|
|
316
|
+
try {
|
|
317
|
+
await Promise.race([
|
|
318
|
+
t.fn(ctx, expect, state),
|
|
319
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Test timeout')), t.timeout)),
|
|
320
|
+
]);
|
|
321
|
+
const duration = Date.now() - start;
|
|
322
|
+
emit({ event: 'result', name: t.name, passed: true, duration });
|
|
323
|
+
passed += 1;
|
|
324
|
+
} catch (e) {
|
|
325
|
+
const duration = Date.now() - start;
|
|
326
|
+
if (e && e.name === 'SkipError') {
|
|
327
|
+
emit({ event: 'skip', name: suiteName + ' → ' + t.name, reason: e.message });
|
|
328
|
+
skipped += 1;
|
|
329
|
+
continue;
|
|
330
|
+
}
|
|
331
|
+
emit({ event: 'result', name: t.name, passed: false, duration, error: (e && e.message) || String(e) });
|
|
332
|
+
failed += 1;
|
|
333
|
+
if (stopOnFail) {
|
|
334
|
+
const rem = tests.length - i - 1;
|
|
335
|
+
if (rem > 0) { emit({ event: 'suite-stopped', name: suiteName, remaining: rem }); skipped += rem; }
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
emit({ event: 'suite-end', name: suiteName, passed, failed, skipped });
|
|
342
|
+
})();
|
|
343
|
+
`;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
347
|
+
|
|
348
|
+
function handleConsoleLine(text, counts) {
|
|
349
|
+
let evt;
|
|
350
|
+
try { evt = JSON.parse(text.slice('__BXM_TEST__'.length)); } catch (_) { return; }
|
|
351
|
+
if (evt.event === 'result') {
|
|
352
|
+
if (evt.passed) {
|
|
353
|
+
console.log(chalk.green(` ✓ ${evt.name}`) + chalk.gray(` (${evt.duration}ms)`));
|
|
354
|
+
counts.passed += 1;
|
|
355
|
+
} else {
|
|
356
|
+
console.log(chalk.red(` ✗ ${evt.name}`) + chalk.gray(` (${evt.duration}ms)`));
|
|
357
|
+
if (evt.error) console.log(chalk.red(` ${evt.error}`));
|
|
358
|
+
counts.failed += 1;
|
|
359
|
+
}
|
|
360
|
+
} else if (evt.event === 'skip') {
|
|
361
|
+
console.log(chalk.yellow(` ○ ${evt.name}`) + chalk.gray(` (skipped: ${evt.reason})`));
|
|
362
|
+
counts.skipped += 1;
|
|
363
|
+
} else if (evt.event === 'suite-stopped') {
|
|
364
|
+
console.log(chalk.yellow(` Skipping ${evt.remaining} remaining test(s) in suite`));
|
|
365
|
+
} else if (evt.event === 'suite-end' || evt.event === 'suite-start') {
|
|
366
|
+
// No-op — suite framing already printed by the parent before evaluate().
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// Extract the body of a function as a string. Handles arrow / async arrow /
|
|
371
|
+
// named function / async named function forms. Used to ship test bodies into
|
|
372
|
+
// the SW/tab via Runtime.evaluate.
|
|
373
|
+
function extractFnBody(fn) {
|
|
374
|
+
if (typeof fn !== 'function') return 'throw new Error("test has no run() function");';
|
|
375
|
+
const src = fn.toString();
|
|
376
|
+
// Arrow with block body
|
|
377
|
+
let m = src.match(/^\s*(?:async\s+)?\([^)]*\)\s*=>\s*\{([\s\S]*)\}\s*$/);
|
|
378
|
+
if (m) return m[1];
|
|
379
|
+
// Arrow with expression body
|
|
380
|
+
m = src.match(/^\s*(?:async\s+)?\([^)]*\)\s*=>\s*([\s\S]+)$/);
|
|
381
|
+
if (m) return `return ${m[1].trim()};`;
|
|
382
|
+
// Named / anonymous function
|
|
383
|
+
m = src.match(/^\s*(?:async\s+)?function\s*[a-zA-Z0-9_]*\s*\([^)]*\)\s*\{([\s\S]*)\}\s*$/);
|
|
384
|
+
if (m) return m[1];
|
|
385
|
+
// Method shorthand
|
|
386
|
+
m = src.match(/^[^(]*\([^)]*\)\s*\{([\s\S]*)\}\s*$/);
|
|
387
|
+
if (m) return m[1];
|
|
388
|
+
return `return (${src}).call(null, ctx);`;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
module.exports = { runChromiumTests };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helpers for the extension test runners (boot.js + chromium.js).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Resolve a Puppeteer target matching predicate: existing targets first, then
|
|
7
|
+
* `targetcreated` events, resolving null on timeout.
|
|
8
|
+
* @param {object} browser - Puppeteer Browser
|
|
9
|
+
* @param {(target: object) => boolean} predicate
|
|
10
|
+
* @param {number} timeoutMs
|
|
11
|
+
* @returns {Promise<object|null>}
|
|
12
|
+
*/
|
|
13
|
+
async function waitForTarget(browser, predicate, timeoutMs) {
|
|
14
|
+
const found = browser.targets().find(predicate);
|
|
15
|
+
if (found) return found;
|
|
16
|
+
return new Promise((resolve) => {
|
|
17
|
+
const done = (t) => { browser.off('targetcreated', handle); resolve(t); };
|
|
18
|
+
const handle = (t) => { if (predicate(t)) done(t); };
|
|
19
|
+
browser.on('targetcreated', handle);
|
|
20
|
+
setTimeout(() => done(null), timeoutMs);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
module.exports = { waitForTarget };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// Background-layer test for chrome.runtime.onMessage / sendMessage. The harness
|
|
2
|
+
// SW (src/test/harness/extension/background.js) ships a ping handler that
|
|
3
|
+
// returns { pong: true, ts }. This test verifies the round-trip works inside
|
|
4
|
+
// the SW context, which is the same primitive BXM consumers use for
|
|
5
|
+
// popup ↔ background messaging.
|
|
6
|
+
|
|
7
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
8
|
+
|
|
9
|
+
module.exports = defineCases({
|
|
10
|
+
type: 'suite',
|
|
11
|
+
layer: 'background',
|
|
12
|
+
description: 'background SW — runtime.sendMessage round-trip',
|
|
13
|
+
tests: [
|
|
14
|
+
{
|
|
15
|
+
name: 'chrome.runtime.sendMessage works (SW → SW self-message)',
|
|
16
|
+
run: async (ctx) => {
|
|
17
|
+
// A SW can't sendMessage to itself directly — Chrome treats own-extension
|
|
18
|
+
// messages from background to background as no-op (no listener context).
|
|
19
|
+
// So this test just verifies the API surface exists + onMessage was
|
|
20
|
+
// registered by the harness without throwing.
|
|
21
|
+
ctx.expect(typeof chrome.runtime.sendMessage).toBe('function');
|
|
22
|
+
ctx.expect(typeof chrome.runtime.onMessage).toBe('object');
|
|
23
|
+
ctx.expect(typeof chrome.runtime.onMessage.addListener).toBe('function');
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'a new listener can be added + removed',
|
|
28
|
+
run: async (ctx) => {
|
|
29
|
+
const handler = () => {};
|
|
30
|
+
chrome.runtime.onMessage.addListener(handler);
|
|
31
|
+
ctx.expect(chrome.runtime.onMessage.hasListener(handler)).toBe(true);
|
|
32
|
+
chrome.runtime.onMessage.removeListener(handler);
|
|
33
|
+
ctx.expect(chrome.runtime.onMessage.hasListener(handler)).toBe(false);
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: 'chrome.runtime.getURL produces a valid chrome-extension:// URL',
|
|
38
|
+
run: async (ctx) => {
|
|
39
|
+
const url = chrome.runtime.getURL('popup.html');
|
|
40
|
+
ctx.expect(url).toMatch(/^chrome-extension:\/\/[a-z]{32}\/popup\.html$/);
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// Background-layer test for chrome.storage.local round-trip. This exercises
|
|
2
|
+
// the storage-permission grant (which has to be declared in the harness
|
|
3
|
+
// manifest) and the actual SW-side storage API that BXM consumers use.
|
|
4
|
+
|
|
5
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
6
|
+
|
|
7
|
+
module.exports = defineCases({
|
|
8
|
+
type: 'suite',
|
|
9
|
+
layer: 'background',
|
|
10
|
+
description: 'background SW — chrome.storage.local round-trip',
|
|
11
|
+
tests: [
|
|
12
|
+
{
|
|
13
|
+
name: 'set returns without throwing',
|
|
14
|
+
run: async (ctx) => {
|
|
15
|
+
await chrome.storage.local.set({ bxmTestKey: 'hello' });
|
|
16
|
+
ctx.expect(true).toBe(true); // reached only if set() didn't throw
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'get returns the just-set value',
|
|
21
|
+
run: async (ctx) => {
|
|
22
|
+
const out = await chrome.storage.local.get('bxmTestKey');
|
|
23
|
+
ctx.expect(out.bxmTestKey).toBe('hello');
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'remove clears the key',
|
|
28
|
+
run: async (ctx) => {
|
|
29
|
+
await chrome.storage.local.remove('bxmTestKey');
|
|
30
|
+
const out = await chrome.storage.local.get('bxmTestKey');
|
|
31
|
+
ctx.expect(out.bxmTestKey).toBeUndefined();
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'multiple keys round-trip together',
|
|
36
|
+
run: async (ctx) => {
|
|
37
|
+
await chrome.storage.local.set({ k1: 1, k2: 'two', k3: [1, 2, 3] });
|
|
38
|
+
const out = await chrome.storage.local.get(['k1', 'k2', 'k3']);
|
|
39
|
+
ctx.expect(out.k1).toBe(1);
|
|
40
|
+
ctx.expect(out.k2).toBe('two');
|
|
41
|
+
ctx.expect(out.k3).toEqual([1, 2, 3]);
|
|
42
|
+
await chrome.storage.local.clear();
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
});
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// Background-layer smoke — verifies the test harness actually executes
|
|
2
|
+
// inside a real MV3 service worker context with `chrome` + `self` globals
|
|
3
|
+
// wired up. If this fails, no other background-layer test can be trusted.
|
|
4
|
+
|
|
5
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
6
|
+
|
|
7
|
+
module.exports = defineCases({
|
|
8
|
+
type: 'suite',
|
|
9
|
+
layer: 'background',
|
|
10
|
+
description: 'background SW — context smoke',
|
|
11
|
+
tests: [
|
|
12
|
+
{
|
|
13
|
+
name: 'chrome global is defined',
|
|
14
|
+
run: async (ctx) => {
|
|
15
|
+
ctx.expect(typeof chrome).toBe('object');
|
|
16
|
+
ctx.expect(chrome).not.toBeNull();
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'chrome.runtime.id is a non-empty string',
|
|
21
|
+
run: async (ctx) => {
|
|
22
|
+
ctx.expect(typeof chrome.runtime.id).toBe('string');
|
|
23
|
+
ctx.expect(chrome.runtime.id.length).toBeGreaterThan(0);
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'chrome.runtime.getManifest reports manifest_version 3',
|
|
28
|
+
run: async (ctx) => {
|
|
29
|
+
const m = chrome.runtime.getManifest();
|
|
30
|
+
ctx.expect(m.manifest_version).toBe(3);
|
|
31
|
+
ctx.expect(m.name).toBe('BXM Test Harness');
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'OMEGA_TEST_MODE is wired on globalThis (harness sets it on boot)',
|
|
36
|
+
run: async (ctx) => {
|
|
37
|
+
ctx.expect(globalThis.OMEGA_TEST_MODE).toBe(true);
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: 'service worker globals (self, fetch, Promise) are present',
|
|
42
|
+
run: async (ctx) => {
|
|
43
|
+
ctx.expect(typeof self).toBe('object');
|
|
44
|
+
ctx.expect(typeof fetch).toBe('function');
|
|
45
|
+
ctx.expect(typeof Promise).toBe('function');
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
});
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// Boot-layer test for the OMEGA_BUILD_JSON bake
|
|
2
|
+
// ([#743](https://github.com/Omega-JS-Stack/omega/issues/743)).
|
|
3
|
+
//
|
|
4
|
+
// The build-lane suite proves the emitted bundles carry the snapshot. This one
|
|
5
|
+
// proves the artifact a BROWSER loads resolves it — in the two contexts that
|
|
6
|
+
// used to reach it by two different mechanisms:
|
|
7
|
+
//
|
|
8
|
+
// - the service worker, which read `/build.js` through an importScripts() call
|
|
9
|
+
// - a page, which read it from a `<script src="/build.js">` tag the page
|
|
10
|
+
// template emitted ahead of the page's own bundle
|
|
11
|
+
//
|
|
12
|
+
// Neither file is in the artifact any more, so a lane that only asserted the
|
|
13
|
+
// global would pass on a build that still shipped the old file. The absence is
|
|
14
|
+
// asserted from inside the extension, over the extension's own origin — the one
|
|
15
|
+
// place a leftover `/build.js` would still be fetchable.
|
|
16
|
+
|
|
17
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
18
|
+
|
|
19
|
+
// What every context should agree on. `brand.id` is the one key every brand's
|
|
20
|
+
// snapshot has and the SW reads on its first line (background.js `this.brand`).
|
|
21
|
+
const READ_BRAND = () => (globalThis.OMEGA_BUILD_JSON || {}).config?.brand?.id ?? null;
|
|
22
|
+
|
|
23
|
+
module.exports = defineCases({
|
|
24
|
+
type: 'group',
|
|
25
|
+
layer: 'boot',
|
|
26
|
+
description: 'OMEGA_BUILD_JSON — baked into the bundles, no /build.js in the artifact (#743)',
|
|
27
|
+
tests: [
|
|
28
|
+
{
|
|
29
|
+
description: 'the packaged service worker resolves OMEGA_BUILD_JSON.config.brand',
|
|
30
|
+
inspect: async ({ extension, expect }) => {
|
|
31
|
+
expect(extension.swTarget).not.toBeNull();
|
|
32
|
+
const worker = await extension.swTarget.worker();
|
|
33
|
+
|
|
34
|
+
// `self` is what background.js reads; globalThis is the same object in a
|
|
35
|
+
// service worker, and the banner assigns both.
|
|
36
|
+
const fromSelf = await worker.evaluate(() => (self.OMEGA_BUILD_JSON || {}).config?.brand?.id ?? null);
|
|
37
|
+
expect(typeof fromSelf).toBe('string');
|
|
38
|
+
expect(fromSelf.length > 0).toBe(true);
|
|
39
|
+
|
|
40
|
+
const fromGlobal = await worker.evaluate(READ_BRAND);
|
|
41
|
+
expect(fromGlobal).toBe(fromSelf);
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
description: 'the packaged popup resolves the SAME snapshot from its own bundle',
|
|
46
|
+
inspect: async ({ extension, page, expect }) => {
|
|
47
|
+
const worker = await extension.swTarget.worker();
|
|
48
|
+
const inWorker = await worker.evaluate(READ_BRAND);
|
|
49
|
+
|
|
50
|
+
await page.goto(extension.popupUrl, { waitUntil: 'load' });
|
|
51
|
+
const inPage = await page.evaluate(() => (window.OMEGA_BUILD_JSON || {}).config?.brand?.id ?? null);
|
|
52
|
+
|
|
53
|
+
// Every bundle carries its OWN copy — the promise is that they agree.
|
|
54
|
+
expect(inPage).toBe(inWorker);
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
description: 'no /build.js and no /build.json are reachable on the extension origin',
|
|
59
|
+
inspect: async ({ extension, page, expect }) => {
|
|
60
|
+
await page.goto(extension.popupUrl, { waitUntil: 'domcontentloaded' });
|
|
61
|
+
|
|
62
|
+
const reachable = await page.evaluate(async (id) => {
|
|
63
|
+
const probe = async (file) => {
|
|
64
|
+
try {
|
|
65
|
+
const response = await fetch(`chrome-extension://${id}/${file}`);
|
|
66
|
+
return response.ok;
|
|
67
|
+
} catch (e) {
|
|
68
|
+
// chrome refuses a fetch for a path the extension does not ship
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
return { js: await probe('build.js'), json: await probe('build.json') };
|
|
73
|
+
}, extension.id);
|
|
74
|
+
|
|
75
|
+
expect(reachable.js).toBe(false);
|
|
76
|
+
expect(reachable.json).toBe(false);
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
});
|