@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,115 @@
|
|
|
1
|
+
// Build-layer tests for lib/theme.js — per-framework theme.id resolution (#261).
|
|
2
|
+
//
|
|
3
|
+
// `theme.id` is a SHARED config key, but every framework owns its own theme set:
|
|
4
|
+
// a brand whose website theme is `studymonkey` handed the extension build an id
|
|
5
|
+
// it has no stylesheet for, and the build died on a raw sass "Can't find
|
|
6
|
+
// stylesheet to import" that named neither the config key nor the valid set.
|
|
7
|
+
// Unknown ids now fall back to the extension's default theme with ONE warning.
|
|
8
|
+
|
|
9
|
+
const path = require('path');
|
|
10
|
+
const fs = require('fs');
|
|
11
|
+
const os = require('os');
|
|
12
|
+
|
|
13
|
+
const { resolveThemeId, DEFAULT_THEME_ID } = require('../../../lib/theme.js');
|
|
14
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
15
|
+
|
|
16
|
+
// A themes dir shaped like the framework's own: theme dirs plus the `_template`
|
|
17
|
+
// scaffold, which is not a selectable theme.
|
|
18
|
+
function stageThemes() {
|
|
19
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-themes-'));
|
|
20
|
+
for (const name of ['classy', 'bootstrap', 'newsflash', '_template']) {
|
|
21
|
+
fs.mkdirSync(path.join(tmp, name), { recursive: true });
|
|
22
|
+
}
|
|
23
|
+
return tmp;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Logger that records what it was told (the real ones stamp the identity tag).
|
|
27
|
+
function captureLogger() {
|
|
28
|
+
const warnings = [];
|
|
29
|
+
return { warnings, warn: (message) => warnings.push(message), log: () => {} };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
module.exports = defineCases({
|
|
33
|
+
type: 'group',
|
|
34
|
+
layer: 'build',
|
|
35
|
+
description: 'theme resolution — unknown ids fall back with one actionable warning',
|
|
36
|
+
tests: [
|
|
37
|
+
{
|
|
38
|
+
name: 'a theme this framework ships resolves to itself, silently',
|
|
39
|
+
run: (ctx) => {
|
|
40
|
+
const themesDir = stageThemes();
|
|
41
|
+
const logger = captureLogger();
|
|
42
|
+
|
|
43
|
+
try {
|
|
44
|
+
ctx.expect(resolveThemeId('bootstrap', { themesDir, logger })).toBe('bootstrap');
|
|
45
|
+
ctx.expect(logger.warnings.length).toBe(0);
|
|
46
|
+
} finally {
|
|
47
|
+
fs.rmSync(themesDir, { recursive: true, force: true });
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: 'no theme.id at all resolves to the framework default, silently',
|
|
53
|
+
run: (ctx) => {
|
|
54
|
+
const themesDir = stageThemes();
|
|
55
|
+
const logger = captureLogger();
|
|
56
|
+
|
|
57
|
+
try {
|
|
58
|
+
ctx.expect(resolveThemeId(undefined, { themesDir, logger })).toBe(DEFAULT_THEME_ID);
|
|
59
|
+
ctx.expect(logger.warnings.length).toBe(0);
|
|
60
|
+
} finally {
|
|
61
|
+
fs.rmSync(themesDir, { recursive: true, force: true });
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: 'an unknown id falls back to the default with ONE warning naming the key, the value, and the valid set',
|
|
67
|
+
run: (ctx) => {
|
|
68
|
+
const themesDir = stageThemes();
|
|
69
|
+
const logger = captureLogger();
|
|
70
|
+
|
|
71
|
+
try {
|
|
72
|
+
ctx.expect(resolveThemeId('studymonkey', { themesDir, logger })).toBe(DEFAULT_THEME_ID);
|
|
73
|
+
ctx.expect(logger.warnings.length).toBe(1);
|
|
74
|
+
|
|
75
|
+
const warning = logger.warnings[0];
|
|
76
|
+
ctx.expect(warning).toContain('theme.id');
|
|
77
|
+
ctx.expect(warning).toContain('studymonkey');
|
|
78
|
+
ctx.expect(warning).toContain(DEFAULT_THEME_ID);
|
|
79
|
+
ctx.expect(warning).toContain('bootstrap');
|
|
80
|
+
ctx.expect(warning).toContain('newsflash');
|
|
81
|
+
// `_template` is a scaffold, never an option to offer
|
|
82
|
+
ctx.expect(warning.includes('_template')).toBe(false);
|
|
83
|
+
} finally {
|
|
84
|
+
fs.rmSync(themesDir, { recursive: true, force: true });
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: 'every resolve site sharing the bad id warns ONCE (sass + bundler, one build)',
|
|
90
|
+
run: (ctx) => {
|
|
91
|
+
const themesDir = stageThemes();
|
|
92
|
+
const logger = captureLogger();
|
|
93
|
+
|
|
94
|
+
try {
|
|
95
|
+
resolveThemeId('brand-only-theme', { themesDir, logger });
|
|
96
|
+
resolveThemeId('brand-only-theme', { themesDir, logger });
|
|
97
|
+
resolveThemeId('brand-only-theme', { themesDir, logger });
|
|
98
|
+
ctx.expect(logger.warnings.length).toBe(1);
|
|
99
|
+
} finally {
|
|
100
|
+
fs.rmSync(themesDir, { recursive: true, force: true });
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
name: 'an unreadable themes dir judges nothing: the id passes through unwarned',
|
|
106
|
+
run: (ctx) => {
|
|
107
|
+
const logger = captureLogger();
|
|
108
|
+
const missing = path.join(os.tmpdir(), 'extension-themes-does-not-exist');
|
|
109
|
+
|
|
110
|
+
ctx.expect(resolveThemeId('classy', { themesDir: missing, logger })).toBe('classy');
|
|
111
|
+
ctx.expect(logger.warnings.length).toBe(0);
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
],
|
|
115
|
+
});
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// Build-layer tests for the translation glue — the engine/cache/providers live
|
|
2
|
+
// in @omega.js/devkit/translate (unit-tested there); these cover the
|
|
3
|
+
// extension-specific pieces: composing a locale's messages.json from the
|
|
4
|
+
// committed per-string cache (EN fallback for gaps, developer descriptions
|
|
5
|
+
// kept in English) and the description source-hash marker round-trip.
|
|
6
|
+
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
const os = require('os');
|
|
10
|
+
const jetpack = require('fs-jetpack');
|
|
11
|
+
|
|
12
|
+
const { composeMessages, readTranslatedDescription } = require('../../../gulp/tasks/translate.js');
|
|
13
|
+
const { hashKey, saveCache } = require('../../../vendor/devkit/translate/index.js');
|
|
14
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
15
|
+
|
|
16
|
+
const EN_MESSAGES = {
|
|
17
|
+
appName: { message: 'OMEGA', description: 'The name of the extension.' },
|
|
18
|
+
appNameShort: { message: 'OMEGA', description: 'The short name of the extension.' },
|
|
19
|
+
btnTooltip: { message: 'Click to open', description: 'Tooltip for the button.' },
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
module.exports = defineCases({
|
|
23
|
+
type: 'group',
|
|
24
|
+
layer: 'build',
|
|
25
|
+
description: 'translation glue (devkit engine consumers)',
|
|
26
|
+
tests: [
|
|
27
|
+
{
|
|
28
|
+
name: 'composeMessages: cache hits land, gaps fall back to English, descriptions stay English',
|
|
29
|
+
run: (ctx) => {
|
|
30
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-translate-'));
|
|
31
|
+
|
|
32
|
+
// Cache carries a translation for the shared "OMEGA" string only
|
|
33
|
+
saveCache(tmp, 'es', 'messages', { [hashKey('OMEGA')]: 'OMEGA·es' });
|
|
34
|
+
|
|
35
|
+
const composed = composeMessages(EN_MESSAGES, 'es', tmp);
|
|
36
|
+
|
|
37
|
+
// Shared source string → both keys get the cached translation
|
|
38
|
+
ctx.expect(composed.appName.message).toBe('OMEGA·es');
|
|
39
|
+
ctx.expect(composed.appNameShort.message).toBe('OMEGA·es');
|
|
40
|
+
// No cache entry → English fallback (file always complete)
|
|
41
|
+
ctx.expect(composed.btnTooltip.message).toBe('Click to open');
|
|
42
|
+
// Developer-facing descriptions never translate
|
|
43
|
+
ctx.expect(composed.appName.description).toBe('The name of the extension.');
|
|
44
|
+
|
|
45
|
+
jetpack.remove(tmp);
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: 'source edit invalidates: a changed EN message misses the old cache entry',
|
|
50
|
+
run: (ctx) => {
|
|
51
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-translate-'));
|
|
52
|
+
saveCache(tmp, 'es', 'messages', { [hashKey('Old tooltip')]: 'Vieja' });
|
|
53
|
+
|
|
54
|
+
const composed = composeMessages(
|
|
55
|
+
{ btnTooltip: { message: 'New tooltip', description: 'd' } },
|
|
56
|
+
'es',
|
|
57
|
+
tmp
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
ctx.expect(composed.btnTooltip.message).toBe('New tooltip');
|
|
61
|
+
|
|
62
|
+
jetpack.remove(tmp);
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: 'readTranslatedDescription: strips the source marker, null when absent',
|
|
67
|
+
run: (ctx) => {
|
|
68
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-translate-'));
|
|
69
|
+
|
|
70
|
+
jetpack.write(
|
|
71
|
+
path.join(tmp, 'es', 'description.md'),
|
|
72
|
+
`<!-- omega:source ${'a'.repeat(12)} -->\n# La Descripción\n\nHola.`
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
const content = readTranslatedDescription('es', tmp);
|
|
76
|
+
ctx.expect(content.startsWith('# La Descripción')).toBeTruthy();
|
|
77
|
+
ctx.expect(content.includes('omega:source')).toBe(false);
|
|
78
|
+
|
|
79
|
+
ctx.expect(readTranslatedDescription('fr', tmp)).toBe(null);
|
|
80
|
+
|
|
81
|
+
jetpack.remove(tmp);
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
});
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// Build-layer test for utils/url-helpers.js — verifies getApiUrl() resolves the
|
|
2
|
+
// LOCAL hosting port from every channel a context can have, in precedence
|
|
3
|
+
// order: the OMEGA_*_PORT env vars (build-time Node + the test harness), then
|
|
4
|
+
// the `dev.ports` block the build bakes into OMEGA_BUILD_JSON (the ONLY channel a
|
|
5
|
+
// browser context has — [#744](https://github.com/Omega-JS-Stack/omega/issues/744)),
|
|
6
|
+
// then the classic defaults.
|
|
7
|
+
|
|
8
|
+
const path = require('path');
|
|
9
|
+
|
|
10
|
+
const helpers = require(path.join(__dirname, '..', '..', '..', 'utils', 'url-helpers.js'));
|
|
11
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
12
|
+
|
|
13
|
+
function withEnv(overrides, fn) {
|
|
14
|
+
const originals = {};
|
|
15
|
+
for (const [k, v] of Object.entries(overrides)) {
|
|
16
|
+
originals[k] = process.env[k];
|
|
17
|
+
if (v === null) delete process.env[k];
|
|
18
|
+
else process.env[k] = v;
|
|
19
|
+
}
|
|
20
|
+
try { return fn(); } finally {
|
|
21
|
+
for (const [k, v] of Object.entries(originals)) {
|
|
22
|
+
if (v === undefined) delete process.env[k];
|
|
23
|
+
else process.env[k] = v;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// The shape getApiUrl() sees at runtime: a context Manager carrying the parsed
|
|
29
|
+
// baked config plus mode-helpers' getEnvironment().
|
|
30
|
+
function fakeManager(environment, ports) {
|
|
31
|
+
return {
|
|
32
|
+
getEnvironment: () => environment,
|
|
33
|
+
config: {
|
|
34
|
+
brand: { url: 'https://playground.omegajs.dev' },
|
|
35
|
+
...(ports ? { dev: { ports } } : {}),
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Neither env channel published — the state every browser context is in.
|
|
41
|
+
const NO_ENV = { OMEGA_HOSTING_PORT: null, OMEGA_HTTPS_PORT: null };
|
|
42
|
+
|
|
43
|
+
module.exports = defineCases({
|
|
44
|
+
type: 'suite',
|
|
45
|
+
layer: 'build',
|
|
46
|
+
description: 'utils/url-helpers — getApiUrl resolves env → baked dev.ports → classic',
|
|
47
|
+
tests: [
|
|
48
|
+
{
|
|
49
|
+
name: 'exports { attachTo, getApiUrl }',
|
|
50
|
+
run: (ctx) => {
|
|
51
|
+
ctx.expect(typeof helpers.attachTo).toBe('function');
|
|
52
|
+
ctx.expect(typeof helpers.getApiUrl).toBe('function');
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: 'a BUMPED baked dev.ports.hosting is the api base in testing',
|
|
57
|
+
run: (ctx) => {
|
|
58
|
+
withEnv(NO_ENV, () => {
|
|
59
|
+
const manager = fakeManager('testing', { hosting: 5012, auth: 9109 });
|
|
60
|
+
ctx.expect(helpers.getApiUrl.call(manager)).toBe('http://localhost:5012');
|
|
61
|
+
});
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: 'a BUMPED baked dev.ports.hosting is the api base in development too',
|
|
66
|
+
run: (ctx) => {
|
|
67
|
+
withEnv(NO_ENV, () => {
|
|
68
|
+
const manager = fakeManager('development', { hosting: 5012 });
|
|
69
|
+
ctx.expect(helpers.getApiUrl.call(manager)).toBe('http://localhost:5012');
|
|
70
|
+
});
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: 'OMEGA_HOSTING_PORT wins over the baked value',
|
|
75
|
+
run: (ctx) => {
|
|
76
|
+
withEnv({ ...NO_ENV, OMEGA_HOSTING_PORT: '5022' }, () => {
|
|
77
|
+
const manager = fakeManager('testing', { hosting: 5012 });
|
|
78
|
+
ctx.expect(helpers.getApiUrl.call(manager)).toBe('http://localhost:5022');
|
|
79
|
+
});
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
name: 'neither channel → the classic hosting port 5002',
|
|
84
|
+
run: (ctx) => {
|
|
85
|
+
withEnv(NO_ENV, () => {
|
|
86
|
+
ctx.expect(helpers.getApiUrl.call(fakeManager('testing'))).toBe('http://localhost:5002');
|
|
87
|
+
ctx.expect(helpers.getApiUrl.call(fakeManager('development'))).toBe('http://localhost:5002');
|
|
88
|
+
});
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
name: 'OMEGA_HTTPS_PORT means the mkcert proxy is up — https, not hosting',
|
|
93
|
+
run: (ctx) => {
|
|
94
|
+
withEnv({ ...NO_ENV, OMEGA_HTTPS_PORT: '5003' }, () => {
|
|
95
|
+
const manager = fakeManager('testing', { hosting: 5012 });
|
|
96
|
+
ctx.expect(helpers.getApiUrl.call(manager)).toBe('https://localhost:5003');
|
|
97
|
+
});
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
name: 'a baked dev.ports.https does the same for a browser context',
|
|
102
|
+
run: (ctx) => {
|
|
103
|
+
withEnv(NO_ENV, () => {
|
|
104
|
+
const manager = fakeManager('testing', { https: 5003, hosting: 5443 });
|
|
105
|
+
ctx.expect(helpers.getApiUrl.call(manager)).toBe('https://localhost:5003');
|
|
106
|
+
});
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
name: 'production ignores every local channel — api.<brand host>',
|
|
111
|
+
run: (ctx) => {
|
|
112
|
+
withEnv({ ...NO_ENV, OMEGA_HOSTING_PORT: '5022' }, () => {
|
|
113
|
+
const manager = fakeManager('production', { hosting: 5012 });
|
|
114
|
+
ctx.expect(helpers.getApiUrl.call(manager)).toBe('https://api.playground.omegajs.dev');
|
|
115
|
+
});
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
});
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// Build-layer test for the verb log lane (#197): `omega test` tees its whole
|
|
2
|
+
// run to <projectRoot>/logs/test.log, ANSI-stripped.
|
|
3
|
+
//
|
|
4
|
+
// This is the integration pin, and it needs no fixture: THIS process IS the
|
|
5
|
+
// `omega test` run, so a line written from here must already be in the file the
|
|
6
|
+
// verb opened. That also guards the regression the isolated-tee fix was for —
|
|
7
|
+
// a suite that clobbers the singleton mid-run would leave the marker (written
|
|
8
|
+
// after those suites) out of the file.
|
|
9
|
+
|
|
10
|
+
const path = require('path');
|
|
11
|
+
const fs = require('fs');
|
|
12
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
13
|
+
|
|
14
|
+
module.exports = defineCases({
|
|
15
|
+
type: 'suite',
|
|
16
|
+
layer: 'build',
|
|
17
|
+
description: 'verb logs — the live run is teed to logs/test.log',
|
|
18
|
+
tests: [
|
|
19
|
+
{
|
|
20
|
+
name: 'the running `omega test` writes this line to logs/test.log, ANSI stripped',
|
|
21
|
+
run: (ctx) => {
|
|
22
|
+
// The tee deliberately declines under a runner (the runner captures its
|
|
23
|
+
// own output and wants no logs/ left in the workspace).
|
|
24
|
+
if (process.env.CI === 'true' || process.env.GITHUB_ACTIONS === 'true') {
|
|
25
|
+
ctx.skip('the tee is a no-op in CI by design');
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const logPath = path.join(process.cwd(), 'logs', 'test.log');
|
|
30
|
+
ctx.expect(fs.existsSync(logPath)).toBe(true);
|
|
31
|
+
|
|
32
|
+
// Colored on the terminal; the file must hold the bare text.
|
|
33
|
+
const marker = `verb-log marker ${process.pid}`;
|
|
34
|
+
console.log(`\x1B[36m${marker}\x1B[0m`);
|
|
35
|
+
|
|
36
|
+
const line = fs.readFileSync(logPath, 'utf8')
|
|
37
|
+
.split('\n')
|
|
38
|
+
.find((entry) => entry.includes(marker));
|
|
39
|
+
ctx.expect(line).toBe(marker);
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
});
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// Build-layer pin for the verts auto-bind (ads-system phase 4): every page
|
|
2
|
+
// surface (popup/options/sidepanel/page) wires lib/verts.js after
|
|
3
|
+
// omega.initialize(), the binder pins the house lane (extension surfaces
|
|
4
|
+
// never run AdSense — store policy + MV3 CSP), the build-JSON allowlist
|
|
5
|
+
// carries advertising/company through to the client, and content/background/
|
|
6
|
+
// offscreen deliberately do NOT bind. Surface files are browser-context ES
|
|
7
|
+
// modules (window/chrome at module scope), so this pins the SOURCE text
|
|
8
|
+
// rather than importing them — same model as cache-warming.test.js. The
|
|
9
|
+
// binder's runtime behavior (lazy mount, ladder, no-fill) is pinned in
|
|
10
|
+
// @omega.js/client's own suite (client test/verts.test.js).
|
|
11
|
+
|
|
12
|
+
const fs = require('fs');
|
|
13
|
+
const path = require('path');
|
|
14
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
15
|
+
|
|
16
|
+
const ROOT = path.join(__dirname, '..', '..', '..');
|
|
17
|
+
const read = (...segments) => fs.readFileSync(path.join(ROOT, ...segments), 'utf8');
|
|
18
|
+
|
|
19
|
+
const SURFACES = ['popup.js', 'options.js', 'sidepanel.js', 'page.js'];
|
|
20
|
+
const NON_SURFACES = ['content.js', 'background.js', 'offscreen.js'];
|
|
21
|
+
const VERTS_LIB = read('lib', 'verts.js');
|
|
22
|
+
// The build snapshot is baked in by the bundle task ([#743](https://github.com/Omega-JS-Stack/omega/issues/743)).
|
|
23
|
+
const BUNDLE_TASK = read('gulp', 'tasks', 'bundle.js');
|
|
24
|
+
|
|
25
|
+
module.exports = defineCases({
|
|
26
|
+
type: 'suite',
|
|
27
|
+
layer: 'build',
|
|
28
|
+
description: 'verts auto-bind — surface wiring + house-lane pin + build-JSON plumbing',
|
|
29
|
+
tests: [
|
|
30
|
+
{
|
|
31
|
+
name: 'every page surface imports and calls wireAds after omega.initialize()',
|
|
32
|
+
run: (ctx) => {
|
|
33
|
+
for (const surface of SURFACES) {
|
|
34
|
+
const source = read(surface);
|
|
35
|
+
ctx.expect(source).toMatch(/import \{ wireAds \} from '\.\/lib\/verts\.js';/);
|
|
36
|
+
// The call sits inside initialize(), after the client boot
|
|
37
|
+
ctx.expect(/await this\.omega\.initialize\(configuration\);[\s\S]*wireAds\(\);/.test(source)).toBe(true);
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'content/background/offscreen do NOT auto-bind (host-DOM / no-DOM contexts)',
|
|
43
|
+
run: (ctx) => {
|
|
44
|
+
for (const context of NON_SURFACES) {
|
|
45
|
+
ctx.expect(read(context).includes('wireAds')).toBe(false);
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'the binder pins the house lane — mount() type override, no AdSense path',
|
|
51
|
+
run: (ctx) => {
|
|
52
|
+
ctx.expect(VERTS_LIB).toMatch(/omega\.verts\(\)\.mount\(\$el, \{ type: 'house' \}\);/);
|
|
53
|
+
// The wiring marks bound hosts for observability (tests + debugging)
|
|
54
|
+
ctx.expect(VERTS_LIB).toMatch(/data-omega-vert-bound/);
|
|
55
|
+
// Live binding: new [data-omega-vert] elements mount on arrival
|
|
56
|
+
ctx.expect(VERTS_LIB).toMatch(/new MutationObserver\(/);
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: 'build-JSON allowlist carries advertising + company to the client',
|
|
61
|
+
run: (ctx) => {
|
|
62
|
+
ctx.expect(BUNDLE_TASK).toMatch(/advertising: config\.advertising \|\| \{\},/);
|
|
63
|
+
ctx.expect(BUNDLE_TASK).toMatch(/company: config\.company \|\| \{\},/);
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
});
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// Build-layer pin for the extension's wakeup ping
|
|
2
|
+
// ([#644](https://github.com/Omega-JS-Stack/omega/issues/644)).
|
|
3
|
+
//
|
|
4
|
+
// Every surface (popup/options/sidepanel/page) opens by calling
|
|
5
|
+
// syncWithBackground(), and background answers a sync that needs a token by
|
|
6
|
+
// POSTing /omega/user/token — the extension's first backend call, on a function
|
|
7
|
+
// that is cold on the first surface a user opens. The ping goes out before the
|
|
8
|
+
// auth settle, so the cold start burns down while Firebase comes up.
|
|
9
|
+
//
|
|
10
|
+
// auth-helpers.js is a browser-context ES module, but a transport-free one: it
|
|
11
|
+
// takes its context as an argument, so this imports the REAL function rather
|
|
12
|
+
// than pinning its source (the model auth-triggers.test.js had to use for the
|
|
13
|
+
// DOM-bound halves of the same file).
|
|
14
|
+
|
|
15
|
+
const path = require('path');
|
|
16
|
+
const { pathToFileURL } = require('url');
|
|
17
|
+
|
|
18
|
+
const { WAKEUP_ROUTE } = require('@omega.js/client/modules/request.js');
|
|
19
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
20
|
+
|
|
21
|
+
const AUTH_HELPERS = pathToFileURL(path.join(__dirname, '..', '..', '..', 'lib', 'auth-helpers.js')).href;
|
|
22
|
+
|
|
23
|
+
// A surface's context: the omega singleton and the runtime messaging channel,
|
|
24
|
+
// with everything the sync touches recorded in the order it happened.
|
|
25
|
+
function makeContext({ needsSync = false } = {}) {
|
|
26
|
+
const requests = [];
|
|
27
|
+
const timeline = [];
|
|
28
|
+
|
|
29
|
+
return {
|
|
30
|
+
requests,
|
|
31
|
+
timeline,
|
|
32
|
+
context: {
|
|
33
|
+
extension: {
|
|
34
|
+
runtime: {
|
|
35
|
+
lastError: null,
|
|
36
|
+
sendMessage: (message, callback) => {
|
|
37
|
+
timeline.push(message.command);
|
|
38
|
+
callback({ needsSync });
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
omega: {
|
|
43
|
+
request: async (url, options = {}) => {
|
|
44
|
+
requests.push({ url, options });
|
|
45
|
+
timeline.push(options.wakeup ? 'wakeup' : url);
|
|
46
|
+
},
|
|
47
|
+
auth: () => ({
|
|
48
|
+
listen: (options, callback) => {
|
|
49
|
+
timeline.push('auth-settle');
|
|
50
|
+
callback({ user: null });
|
|
51
|
+
},
|
|
52
|
+
}),
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
module.exports = defineCases({
|
|
59
|
+
type: 'suite',
|
|
60
|
+
layer: 'build',
|
|
61
|
+
description: 'wakeup ping — a surface warms the backend before it waits on auth (#644)',
|
|
62
|
+
tests: [
|
|
63
|
+
{
|
|
64
|
+
name: 'syncWithBackground fires exactly one wakeup, aimed at the shared route',
|
|
65
|
+
run: async (ctx) => {
|
|
66
|
+
const { syncWithBackground } = await import(AUTH_HELPERS);
|
|
67
|
+
const { context, requests } = makeContext();
|
|
68
|
+
|
|
69
|
+
await syncWithBackground(context);
|
|
70
|
+
|
|
71
|
+
ctx.expect(requests.length).toBe(1);
|
|
72
|
+
ctx.expect(requests[0].url).toBe(WAKEUP_ROUTE);
|
|
73
|
+
ctx.expect(requests[0].options.wakeup).toBe(true);
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
name: 'the ping goes out BEFORE the auth settle and the background round trip',
|
|
78
|
+
run: async (ctx) => {
|
|
79
|
+
const { syncWithBackground } = await import(AUTH_HELPERS);
|
|
80
|
+
const { context, timeline } = makeContext();
|
|
81
|
+
|
|
82
|
+
await syncWithBackground(context);
|
|
83
|
+
|
|
84
|
+
ctx.expect(timeline[0]).toBe('wakeup');
|
|
85
|
+
ctx.expect(timeline[1]).toBe('auth-settle');
|
|
86
|
+
ctx.expect(timeline[2]).toBe('omega:syncAuth');
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
});
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// Build-layer coverage for wave-5 F7: `manager.messenger` was documented as
|
|
2
|
+
// "wired automatically" but every context assigned null and lib/messaging.js
|
|
3
|
+
// was never instantiated. Behavioral test for the Messaging class + source
|
|
4
|
+
// pins proving each DOM context constructs it (the context Managers are
|
|
5
|
+
// ES modules the bundler owns — not requireable from Node, hence the pins).
|
|
6
|
+
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
10
|
+
|
|
11
|
+
const SRC = path.join(__dirname, '..', '..', '..');
|
|
12
|
+
const CONTEXTS = ['popup', 'options', 'sidepanel', 'page', 'content'];
|
|
13
|
+
|
|
14
|
+
module.exports = defineCases({
|
|
15
|
+
type: 'group',
|
|
16
|
+
layer: 'build',
|
|
17
|
+
description: 'lib/messaging + per-context messenger wiring (wave-5 F7)',
|
|
18
|
+
tests: [
|
|
19
|
+
{
|
|
20
|
+
name: 'Messaging registers an onMessage listener and send() targets runtime.sendMessage',
|
|
21
|
+
run: async (ctx) => {
|
|
22
|
+
const extPath = require.resolve(path.join(SRC, 'lib', 'extension.js'));
|
|
23
|
+
const msgPath = require.resolve(path.join(SRC, 'lib', 'messaging.js'));
|
|
24
|
+
const listeners = [];
|
|
25
|
+
const sent = [];
|
|
26
|
+
global.chrome = {
|
|
27
|
+
runtime: {
|
|
28
|
+
onMessage: { addListener: (fn) => listeners.push(fn) },
|
|
29
|
+
sendMessage: async (msg) => { sent.push(msg); },
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
delete require.cache[extPath];
|
|
33
|
+
delete require.cache[msgPath];
|
|
34
|
+
try {
|
|
35
|
+
const Messaging = require(msgPath);
|
|
36
|
+
const messenger = new Messaging({ sender: 'popup' });
|
|
37
|
+
ctx.expect(listeners.length).toBe(1);
|
|
38
|
+
|
|
39
|
+
messenger.send({ destination: 'background', command: 'ping', payload: { a: 1 } });
|
|
40
|
+
ctx.expect(sent.length).toBe(1);
|
|
41
|
+
ctx.expect(sent[0].sender).toBe('popup');
|
|
42
|
+
ctx.expect(sent[0].destination).toBe('background');
|
|
43
|
+
|
|
44
|
+
// The degenerate `!init || !init` check claimed to validate sender —
|
|
45
|
+
// now it actually does.
|
|
46
|
+
let threw = null;
|
|
47
|
+
try { new Messaging({}); } catch (e) { threw = e; }
|
|
48
|
+
ctx.expect(threw).not.toBeNull();
|
|
49
|
+
} finally {
|
|
50
|
+
delete global.chrome;
|
|
51
|
+
delete require.cache[extPath];
|
|
52
|
+
delete require.cache[msgPath];
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
// wave-5 (history-lens catch): openAuthPage was the un-flipped half of
|
|
58
|
+
// the F9 pair — it still built the sign-in URL from authDomain while
|
|
59
|
+
// background.js watched the brand.url host; the round trip could never
|
|
60
|
+
// complete. Both ends now speak brand.url.
|
|
61
|
+
name: 'openAuthPage derives the sign-in URL from brand.url, never authDomain (source pin)',
|
|
62
|
+
run: (ctx) => {
|
|
63
|
+
const source = fs.readFileSync(path.join(SRC, 'lib', 'auth-helpers.js'), 'utf8');
|
|
64
|
+
const fnSource = source.slice(source.indexOf('export function openAuthPage'));
|
|
65
|
+
ctx.expect(fnSource.includes('brand?.url')).toBe(true);
|
|
66
|
+
// The old read, gone (comments may still NAME authDomain to warn it off)
|
|
67
|
+
ctx.expect(fnSource.includes('config?.authDomain')).toBe(false);
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: 'every DOM context constructs Messaging with its own sender (source pin)',
|
|
72
|
+
run: (ctx) => {
|
|
73
|
+
for (const name of CONTEXTS) {
|
|
74
|
+
const source = fs.readFileSync(path.join(SRC, `${name}.js`), 'utf8');
|
|
75
|
+
ctx.expect(source.includes(`new Messaging({ sender: '${name}' })`)).toBe(true);
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// View-layer test that the same Manager surface is reachable from the options
|
|
2
|
+
// page. Confirms that view tests can target ANY of popup / options / sidepanel
|
|
3
|
+
// just by setting the `context` field — same `ctx.expect / state / skip` API
|
|
4
|
+
// applies. (Sidepanel is exercised separately in sidepanel.test.js.)
|
|
5
|
+
|
|
6
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
7
|
+
|
|
8
|
+
module.exports = defineCases({
|
|
9
|
+
layer: 'view',
|
|
10
|
+
context: 'options',
|
|
11
|
+
description: 'view/options — DOM + context attribute',
|
|
12
|
+
run: async (ctx) => {
|
|
13
|
+
ctx.expect(document.body.dataset.omegaContext).toBe('options');
|
|
14
|
+
ctx.expect(document.title).toContain('Options');
|
|
15
|
+
},
|
|
16
|
+
});
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// View-layer smoke for the popup page. Verifies the test code is executing
|
|
2
|
+
// inside a tab that has loaded popup.html (chrome-extension://<id>/popup.html),
|
|
3
|
+
// has DOM + chrome.* APIs, and matches the harness's expected page shape.
|
|
4
|
+
|
|
5
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
6
|
+
|
|
7
|
+
module.exports = defineCases({
|
|
8
|
+
type: 'suite',
|
|
9
|
+
layer: 'view',
|
|
10
|
+
context: 'popup',
|
|
11
|
+
description: 'view/popup — DOM + chrome surface',
|
|
12
|
+
tests: [
|
|
13
|
+
{
|
|
14
|
+
name: 'document is present and body has data-omega-context="popup"',
|
|
15
|
+
run: async (ctx) => {
|
|
16
|
+
ctx.expect(typeof document).toBe('object');
|
|
17
|
+
ctx.expect(document.body.dataset.omegaContext).toBe('popup');
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: 'page title matches the harness popup.html',
|
|
22
|
+
run: async (ctx) => {
|
|
23
|
+
ctx.expect(document.title).toContain('Popup');
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'chrome.* APIs are exposed in extension-page context',
|
|
28
|
+
run: async (ctx) => {
|
|
29
|
+
ctx.expect(typeof chrome).toBe('object');
|
|
30
|
+
ctx.expect(typeof chrome.runtime).toBe('object');
|
|
31
|
+
ctx.expect(typeof chrome.runtime.id).toBe('string');
|
|
32
|
+
ctx.expect(typeof chrome.storage).toBe('object');
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: 'window globals (fetch, URL) are available',
|
|
37
|
+
run: async (ctx) => {
|
|
38
|
+
ctx.expect(typeof fetch).toBe('function');
|
|
39
|
+
ctx.expect(typeof URL).toBe('function');
|
|
40
|
+
const u = new URL('https://example.com/path?q=1');
|
|
41
|
+
ctx.expect(u.searchParams.get('q')).toBe('1');
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: 'popup ↔ background messaging round-trip',
|
|
46
|
+
run: async (ctx) => {
|
|
47
|
+
const reply = await chrome.runtime.sendMessage({ type: 'extension:test:ping' });
|
|
48
|
+
ctx.expect(reply.pong).toBe(true);
|
|
49
|
+
ctx.expect(typeof reply.ts).toBe('number');
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
});
|