@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,831 @@
|
|
|
1
|
+
// Build-layer tests for gulp/tasks/package.js — the things a consumer's
|
|
2
|
+
// packaged output lives or dies by (#46):
|
|
3
|
+
//
|
|
4
|
+
// 1. The packaged artifact carries NO build.js / build.json. The snapshot is
|
|
5
|
+
// baked into every bundle since #743 (build-json-bake.test.js owns what it
|
|
6
|
+
// carries); a leftover file here would be a second, staler copy of it.
|
|
7
|
+
// 2. A versionless app FAILS the build (Chrome refuses a manifest with no
|
|
8
|
+
// version — it used to package the raw JSON5 source manifest and finish green).
|
|
9
|
+
// 3. The icon prune drops only icons the build never minted, in BOTH legal
|
|
10
|
+
// shapes of `action.default_icon` (path string, or size→path map).
|
|
11
|
+
// 4. A declared consumer array is AUTHORITATIVE over the framework default —
|
|
12
|
+
// an empty externally_connectable ships no origins (#260).
|
|
13
|
+
// 5. The firefox artifact is a real firefox artifact: chrome-only panel keys
|
|
14
|
+
// translate to sidebar_action, and a missing gecko id derives from the
|
|
15
|
+
// brand config — failing loudly only when there is nothing to derive (#264).
|
|
16
|
+
// 6. The store description assets ship RENDERED brand tokens — a `{{ brand.name }}`
|
|
17
|
+
// that reaches the live listing is the bug (#289).
|
|
18
|
+
// 7. The build hooks resolve the NESTED path setup migrates to, with the flat
|
|
19
|
+
// pre-migration path as a transition fallback — every consumer's hooks were
|
|
20
|
+
// dead, and the miss printed an untagged console.warn (#571).
|
|
21
|
+
//
|
|
22
|
+
// The task module reads its project (package.json / config / dist) from cwd at
|
|
23
|
+
// REQUIRE time, so each test stages a temp project, chdirs into it, and requires
|
|
24
|
+
// the task fresh — the same model as manager.test.js's inDir().
|
|
25
|
+
|
|
26
|
+
const path = require('path');
|
|
27
|
+
const fs = require('fs');
|
|
28
|
+
const os = require('os');
|
|
29
|
+
const JSON5 = require('json5');
|
|
30
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
31
|
+
|
|
32
|
+
const SRC = path.join(__dirname, '..', '..', '..');
|
|
33
|
+
const TASK_PATH = path.join(SRC, 'gulp', 'tasks', 'package.js');
|
|
34
|
+
|
|
35
|
+
// Stage a temp extension project. `files` is a relative-path → contents map
|
|
36
|
+
// written verbatim (dist/manifest.json, the minted icons, …).
|
|
37
|
+
function stageProject(opts = {}) {
|
|
38
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-package-task-'));
|
|
39
|
+
|
|
40
|
+
fs.writeFileSync(path.join(tmp, 'package.json'), opts.pkg ?? `{ "name": "staged-ext", "version": "3.1.4" }`);
|
|
41
|
+
|
|
42
|
+
if (opts.config !== undefined) {
|
|
43
|
+
fs.mkdirSync(path.join(tmp, 'config'), { recursive: true });
|
|
44
|
+
fs.writeFileSync(path.join(tmp, 'config', 'omega.json5'), opts.config);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
for (const [relative, contents] of Object.entries(opts.files || {})) {
|
|
48
|
+
const full = path.join(tmp, relative);
|
|
49
|
+
fs.mkdirSync(path.dirname(full), { recursive: true });
|
|
50
|
+
fs.writeFileSync(full, contents);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return tmp;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Run `fn(task)` with cwd pinned to `dir` and the task module loaded fresh.
|
|
57
|
+
async function inProject(dir, fn) {
|
|
58
|
+
const oldCwd = process.cwd();
|
|
59
|
+
const flush = () => {
|
|
60
|
+
for (const key of Object.keys(require.cache)) {
|
|
61
|
+
if (key.startsWith(SRC + path.sep)) delete require.cache[key];
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
flush();
|
|
66
|
+
try {
|
|
67
|
+
process.chdir(dir);
|
|
68
|
+
return await fn(require(TASK_PATH));
|
|
69
|
+
} finally {
|
|
70
|
+
process.chdir(oldCwd);
|
|
71
|
+
flush();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const MANIFEST = (extra) => `{ manifest_version: 3, name: 'Staged', ${extra} }`;
|
|
76
|
+
|
|
77
|
+
// Set env vars for one test, restoring exactly what was there (an empty string
|
|
78
|
+
// means "declared but empty", the CI-with-no-.env shape) — returns the undo.
|
|
79
|
+
function withEnv(vars) {
|
|
80
|
+
const previous = {};
|
|
81
|
+
for (const [key, value] of Object.entries(vars)) {
|
|
82
|
+
previous[key] = process.env[key];
|
|
83
|
+
process.env[key] = value;
|
|
84
|
+
}
|
|
85
|
+
return () => {
|
|
86
|
+
for (const [key, value] of Object.entries(previous)) {
|
|
87
|
+
if (value === undefined) delete process.env[key];
|
|
88
|
+
else process.env[key] = value;
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// A consumer build hook that records WHICH path the resolver found it at, and
|
|
94
|
+
// the SHAPE of the argument it was handed (#591).
|
|
95
|
+
const HOOK = (which) => `
|
|
96
|
+
const fs = require('fs');
|
|
97
|
+
const path = require('path');
|
|
98
|
+
module.exports = async (ctx) => {
|
|
99
|
+
fs.writeFileSync(path.join(process.cwd(), 'hook-ran.json'), JSON.stringify({
|
|
100
|
+
which: '${which}',
|
|
101
|
+
keys: Object.keys(ctx || {}).sort(),
|
|
102
|
+
projectRoot: ctx && ctx.projectRoot,
|
|
103
|
+
mode: ctx && ctx.mode,
|
|
104
|
+
hasManager: Boolean(ctx && ctx.manager && typeof ctx.manager.getConfig === 'function'),
|
|
105
|
+
}));
|
|
106
|
+
};
|
|
107
|
+
`;
|
|
108
|
+
|
|
109
|
+
module.exports = defineCases({
|
|
110
|
+
type: 'suite',
|
|
111
|
+
layer: 'build',
|
|
112
|
+
description: 'package task — no build.js/build.json sidecar, manifest version guard, icon prune',
|
|
113
|
+
tests: [
|
|
114
|
+
{
|
|
115
|
+
name: 'the packaged artifact carries NO build.js and NO build.json (#743)',
|
|
116
|
+
run: async (ctx) => {
|
|
117
|
+
// The snapshot rides in every bundle's own banner now. A JSONP file
|
|
118
|
+
// beside them would be a second copy of the same facts — regenerated on
|
|
119
|
+
// its own schedule, and the one the service worker used to trust.
|
|
120
|
+
const tmp = stageProject({
|
|
121
|
+
config: `{ brand: { id: 'staged', name: 'Staged' }, targets: { extension: {} } }`,
|
|
122
|
+
files: {
|
|
123
|
+
'dist/manifest.json': MANIFEST(`description: 'a packageable extension'`),
|
|
124
|
+
'dist/assets/js/components/popup.bundle.js': `globalThis.probe = 1;\n`,
|
|
125
|
+
'dist/_locales/en/messages.json': `{ "appName": { "message": "Staged" } }`,
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
try {
|
|
129
|
+
await inProject(tmp, async (task) => {
|
|
130
|
+
const failure = await new Promise((resolve) => task.packageFn(resolve));
|
|
131
|
+
ctx.expect(failure).toBe(undefined);
|
|
132
|
+
|
|
133
|
+
const raw = path.join(tmp, 'packaged', 'chromium', 'raw');
|
|
134
|
+
// The package lane ran for real: the compiled manifest is there…
|
|
135
|
+
ctx.expect(fs.existsSync(path.join(raw, 'manifest.json'))).toBe(true);
|
|
136
|
+
// …and neither JSONP sidecar is.
|
|
137
|
+
ctx.expect(fs.existsSync(path.join(raw, 'build.js'))).toBe(false);
|
|
138
|
+
ctx.expect(fs.existsSync(path.join(raw, 'build.json'))).toBe(false);
|
|
139
|
+
});
|
|
140
|
+
} finally {
|
|
141
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
name: 'the manifest\'s dev origin is the RESOLVED website origin, never a baked literal (#262)',
|
|
147
|
+
run: async (ctx) => {
|
|
148
|
+
// Same staging as the dev.ports test: a brand with a live website app
|
|
149
|
+
// that published a bumped, https origin beside its port.
|
|
150
|
+
const brand = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-dev-origin-brand-'));
|
|
151
|
+
fs.mkdirSync(path.join(brand, 'config'), { recursive: true });
|
|
152
|
+
fs.writeFileSync(path.join(brand, 'config', 'omega.json5'), `{ brand: { id: 'staged', name: 'Staged' } }`);
|
|
153
|
+
fs.mkdirSync(path.join(brand, 'targets', 'website', '.temp'), { recursive: true });
|
|
154
|
+
fs.writeFileSync(path.join(brand, 'targets', 'website', '.temp', 'ports.json'), JSON.stringify({
|
|
155
|
+
ports: { website: 4001 }, origin: 'https://localhost:4001', pid: process.pid, startedAt: 'x',
|
|
156
|
+
}));
|
|
157
|
+
|
|
158
|
+
const app = path.join(brand, 'targets', 'extension');
|
|
159
|
+
fs.mkdirSync(path.join(app, 'dist'), { recursive: true });
|
|
160
|
+
fs.writeFileSync(path.join(app, 'package.json'), `{ "name": "staged-ext", "version": "3.1.4" }`);
|
|
161
|
+
fs.writeFileSync(path.join(app, 'dist', 'manifest.json'), MANIFEST(`description: 'no externally_connectable anywhere'`));
|
|
162
|
+
|
|
163
|
+
try {
|
|
164
|
+
await inProject(app, async (task) => {
|
|
165
|
+
const outputDir = path.join(app, 'out');
|
|
166
|
+
await task.compileManifest(outputDir, 'chromium');
|
|
167
|
+
const m = JSON.parse(fs.readFileSync(path.join(outputDir, 'manifest.json'), 'utf8'));
|
|
168
|
+
// Protocol AND port both follow the live dev server — the old bake
|
|
169
|
+
// said http://localhost:4000 while `omega dev` served https
|
|
170
|
+
ctx.expect(m.externally_connectable.matches).toEqual(['https://localhost:4001/*']);
|
|
171
|
+
});
|
|
172
|
+
} finally {
|
|
173
|
+
fs.rmSync(brand, { recursive: true, force: true });
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
name: 'a versionless app FAILS the package task (no green build, no raw JSON5 manifest)',
|
|
179
|
+
run: async (ctx) => {
|
|
180
|
+
const tmp = stageProject({
|
|
181
|
+
pkg: `{ "name": "versionless-ext" }`,
|
|
182
|
+
files: {
|
|
183
|
+
'dist/manifest.json': MANIFEST(`description: 'no version anywhere'`),
|
|
184
|
+
'dist/assets/js/placeholder.js': `// keeps the redaction walk happy\n`,
|
|
185
|
+
},
|
|
186
|
+
});
|
|
187
|
+
try {
|
|
188
|
+
await inProject(tmp, async (task) => {
|
|
189
|
+
// Drive the real gulp task: it must hand its `complete` callback an error.
|
|
190
|
+
// (The build-error reporter fires for real here — its notifly note in
|
|
191
|
+
// the log is the failure being reported, not a test problem.)
|
|
192
|
+
const failure = await new Promise((resolve) => task.packageFn(resolve));
|
|
193
|
+
ctx.expect(failure).toBeInstanceOf(Error);
|
|
194
|
+
ctx.expect(failure.message).toMatch(/version/);
|
|
195
|
+
ctx.expect(failure.plugin).toBe('Package');
|
|
196
|
+
|
|
197
|
+
// Never compiled: the packaged manifest is still the raw copied source
|
|
198
|
+
const packaged = JSON5.parse(fs.readFileSync(path.join(tmp, 'packaged', 'chromium', 'raw', 'manifest.json'), 'utf8'));
|
|
199
|
+
ctx.expect(packaged.version).toBeUndefined();
|
|
200
|
+
});
|
|
201
|
+
} finally {
|
|
202
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
203
|
+
}
|
|
204
|
+
},
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
name: 'icon prune: string default_icon is dropped when unminted, kept when minted',
|
|
208
|
+
run: async (ctx) => {
|
|
209
|
+
const icon = 'assets/images/icons/icon-48x.png';
|
|
210
|
+
const staged = (files) => stageProject({
|
|
211
|
+
files: Object.assign({ 'dist/manifest.json': MANIFEST(`action: { default_icon: '${icon}' }`) }, files),
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
const missing = staged({});
|
|
215
|
+
const minted = staged({ [`dist/${icon}`]: 'PNG' });
|
|
216
|
+
try {
|
|
217
|
+
await inProject(missing, async (task) => {
|
|
218
|
+
const outputDir = path.join(missing, 'out');
|
|
219
|
+
await task.compileManifest(outputDir, 'chromium');
|
|
220
|
+
const m = JSON.parse(fs.readFileSync(path.join(outputDir, 'manifest.json'), 'utf8'));
|
|
221
|
+
ctx.expect(m.action.default_icon).toBeUndefined();
|
|
222
|
+
ctx.expect(m.version).toBe('3.1.4');
|
|
223
|
+
// the full default ladder is unminted too, so `icons` goes entirely
|
|
224
|
+
ctx.expect(m.icons).toBeUndefined();
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
await inProject(minted, async (task) => {
|
|
228
|
+
const outputDir = path.join(minted, 'out');
|
|
229
|
+
await task.compileManifest(outputDir, 'chromium');
|
|
230
|
+
const m = JSON.parse(fs.readFileSync(path.join(outputDir, 'manifest.json'), 'utf8'));
|
|
231
|
+
ctx.expect(m.action.default_icon).toBe(icon);
|
|
232
|
+
// the 48x default in `icons` survives on the same file
|
|
233
|
+
ctx.expect(m.icons['48']).toBe(icon);
|
|
234
|
+
});
|
|
235
|
+
} finally {
|
|
236
|
+
fs.rmSync(missing, { recursive: true, force: true });
|
|
237
|
+
fs.rmSync(minted, { recursive: true, force: true });
|
|
238
|
+
}
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
name: 'icon prune: object default_icon is pruned PER ENTRY (chrome\'s size→path map)',
|
|
243
|
+
run: async (ctx) => {
|
|
244
|
+
const tmp = stageProject({
|
|
245
|
+
files: {
|
|
246
|
+
'dist/manifest.json': MANIFEST(`action: { default_icon: {
|
|
247
|
+
'48': 'assets/images/icons/icon-48x.png',
|
|
248
|
+
'32': 'assets/images/icons/icon-32x.png',
|
|
249
|
+
'16': 'assets/images/icons/icon-16x.png',
|
|
250
|
+
} }`),
|
|
251
|
+
'dist/assets/images/icons/icon-16x.png': 'PNG',
|
|
252
|
+
},
|
|
253
|
+
});
|
|
254
|
+
try {
|
|
255
|
+
await inProject(tmp, async (task) => {
|
|
256
|
+
const outputDir = path.join(tmp, 'out');
|
|
257
|
+
await task.compileManifest(outputDir, 'chromium');
|
|
258
|
+
const m = JSON.parse(fs.readFileSync(path.join(outputDir, 'manifest.json'), 'utf8'));
|
|
259
|
+
ctx.expect(m.action.default_icon).toEqual({ '16': 'assets/images/icons/icon-16x.png' });
|
|
260
|
+
});
|
|
261
|
+
} finally {
|
|
262
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
263
|
+
}
|
|
264
|
+
},
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
name: 'icon prune: a fully minted object default_icon is untouched',
|
|
268
|
+
run: async (ctx) => {
|
|
269
|
+
const tmp = stageProject({
|
|
270
|
+
files: {
|
|
271
|
+
'dist/manifest.json': MANIFEST(`action: { default_icon: {
|
|
272
|
+
'32': 'assets/images/icons/icon-32x.png',
|
|
273
|
+
'16': 'assets/images/icons/icon-16x.png',
|
|
274
|
+
} }`),
|
|
275
|
+
'dist/assets/images/icons/icon-32x.png': 'PNG',
|
|
276
|
+
'dist/assets/images/icons/icon-16x.png': 'PNG',
|
|
277
|
+
},
|
|
278
|
+
});
|
|
279
|
+
try {
|
|
280
|
+
await inProject(tmp, async (task) => {
|
|
281
|
+
const outputDir = path.join(tmp, 'out');
|
|
282
|
+
await task.compileManifest(outputDir, 'chromium');
|
|
283
|
+
const m = JSON.parse(fs.readFileSync(path.join(outputDir, 'manifest.json'), 'utf8'));
|
|
284
|
+
ctx.expect(m.action.default_icon).toEqual({
|
|
285
|
+
'32': 'assets/images/icons/icon-32x.png',
|
|
286
|
+
'16': 'assets/images/icons/icon-16x.png',
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
} finally {
|
|
290
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
291
|
+
}
|
|
292
|
+
},
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
name: 'pipeline failures re-throw instead of finishing green (malformed locale)',
|
|
296
|
+
run: async (ctx) => {
|
|
297
|
+
// compileLocales: a locale that is not JSON5 makes the parse throw —
|
|
298
|
+
// before #46 the catch logged and returned green.
|
|
299
|
+
const localeTmp = stageProject({
|
|
300
|
+
files: { 'dist/_locales/en/messages.json': '{ not: valid json5 ][' },
|
|
301
|
+
});
|
|
302
|
+
try {
|
|
303
|
+
await inProject(localeTmp, async (task) => {
|
|
304
|
+
let thrown = null;
|
|
305
|
+
await task.compileLocales(path.join(localeTmp, 'out')).catch((e) => { thrown = e; });
|
|
306
|
+
ctx.expect(thrown).toBeInstanceOf(Error);
|
|
307
|
+
});
|
|
308
|
+
} finally {
|
|
309
|
+
fs.rmSync(localeTmp, { recursive: true, force: true });
|
|
310
|
+
}
|
|
311
|
+
},
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
name: 'externally_connectable: an explicitly EMPTY consumer array ships NO origins (#260)',
|
|
315
|
+
run: async (ctx) => {
|
|
316
|
+
const tmp = stageProject({
|
|
317
|
+
files: { 'dist/manifest.json': MANIFEST(`externally_connectable: { matches: [] }`) },
|
|
318
|
+
});
|
|
319
|
+
try {
|
|
320
|
+
await inProject(tmp, async (task) => {
|
|
321
|
+
const outputDir = path.join(tmp, 'out');
|
|
322
|
+
await task.compileManifest(outputDir, 'chromium');
|
|
323
|
+
const m = JSON.parse(fs.readFileSync(path.join(outputDir, 'manifest.json'), 'utf8'));
|
|
324
|
+
// The dev origin the framework default carries never reaches the artifact
|
|
325
|
+
ctx.expect(m.externally_connectable).toBeUndefined();
|
|
326
|
+
});
|
|
327
|
+
} finally {
|
|
328
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
329
|
+
}
|
|
330
|
+
},
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
name: 'externally_connectable: a consumer array REPLACES the default, absent keeps it (#260)',
|
|
334
|
+
run: async (ctx) => {
|
|
335
|
+
const declared = stageProject({
|
|
336
|
+
files: { 'dist/manifest.json': MANIFEST(`externally_connectable: { matches: ['https://example.com/*'] }`) },
|
|
337
|
+
});
|
|
338
|
+
const absent = stageProject({
|
|
339
|
+
files: { 'dist/manifest.json': MANIFEST(`description: 'no externally_connectable anywhere'`) },
|
|
340
|
+
});
|
|
341
|
+
try {
|
|
342
|
+
await inProject(declared, async (task) => {
|
|
343
|
+
const outputDir = path.join(declared, 'out');
|
|
344
|
+
await task.compileManifest(outputDir, 'chromium');
|
|
345
|
+
const m = JSON.parse(fs.readFileSync(path.join(outputDir, 'manifest.json'), 'utf8'));
|
|
346
|
+
ctx.expect(m.externally_connectable.matches).toEqual(['https://example.com/*']);
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
await inProject(absent, async (task) => {
|
|
350
|
+
const outputDir = path.join(absent, 'out');
|
|
351
|
+
await task.compileManifest(outputDir, 'chromium');
|
|
352
|
+
const m = JSON.parse(fs.readFileSync(path.join(outputDir, 'manifest.json'), 'utf8'));
|
|
353
|
+
// No live website published an origin — the classic assumption, over
|
|
354
|
+
// the protocol `omega dev` speaks by default (#262)
|
|
355
|
+
ctx.expect(m.externally_connectable.matches).toEqual(['https://localhost:4000/*']);
|
|
356
|
+
});
|
|
357
|
+
} finally {
|
|
358
|
+
fs.rmSync(declared, { recursive: true, force: true });
|
|
359
|
+
fs.rmSync(absent, { recursive: true, force: true });
|
|
360
|
+
}
|
|
361
|
+
},
|
|
362
|
+
},
|
|
363
|
+
{
|
|
364
|
+
name: 'background.scripts: a declared consumer array REPLACES the framework bundle entry (#260)',
|
|
365
|
+
run: async (ctx) => {
|
|
366
|
+
const declared = stageProject({
|
|
367
|
+
files: {
|
|
368
|
+
'dist/manifest.json': MANIFEST(`
|
|
369
|
+
background: { scripts: ['assets/js/my-background.js'] },
|
|
370
|
+
browser_specific_settings: { gecko: { id: 'staged@example.com' } },
|
|
371
|
+
`),
|
|
372
|
+
},
|
|
373
|
+
});
|
|
374
|
+
const absent = stageProject({
|
|
375
|
+
files: {
|
|
376
|
+
'dist/manifest.json': MANIFEST(`browser_specific_settings: { gecko: { id: 'staged@example.com' } }`),
|
|
377
|
+
},
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
try {
|
|
381
|
+
await inProject(declared, async (task) => {
|
|
382
|
+
const outputDir = path.join(declared, 'out-firefox');
|
|
383
|
+
await task.compileManifest(outputDir, 'firefox');
|
|
384
|
+
const m = JSON.parse(fs.readFileSync(path.join(outputDir, 'manifest.json'), 'utf8'));
|
|
385
|
+
|
|
386
|
+
// The framework's own bundle is NOT unioned back in — a consumer
|
|
387
|
+
// that swaps the background entry ships only what it declared
|
|
388
|
+
ctx.expect(m.background.scripts).toEqual(['assets/js/my-background.js']);
|
|
389
|
+
ctx.expect(m.background.service_worker).toBeUndefined();
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
await inProject(absent, async (task) => {
|
|
393
|
+
const outputDir = path.join(absent, 'out-firefox');
|
|
394
|
+
await task.compileManifest(outputDir, 'firefox');
|
|
395
|
+
const m = JSON.parse(fs.readFileSync(path.join(outputDir, 'manifest.json'), 'utf8'));
|
|
396
|
+
|
|
397
|
+
// Declaring nothing still gets the framework bundle
|
|
398
|
+
ctx.expect(m.background.scripts).toEqual(['assets/js/components/background.bundle.js']);
|
|
399
|
+
});
|
|
400
|
+
} finally {
|
|
401
|
+
fs.rmSync(declared, { recursive: true, force: true });
|
|
402
|
+
fs.rmSync(absent, { recursive: true, force: true });
|
|
403
|
+
}
|
|
404
|
+
},
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
name: 'gecko.data_collection_permissions.required: a declared consumer array REPLACES the default (#260)',
|
|
408
|
+
run: async (ctx) => {
|
|
409
|
+
const tmp = stageProject({
|
|
410
|
+
files: {
|
|
411
|
+
'dist/manifest.json': MANIFEST(`
|
|
412
|
+
browser_specific_settings: {
|
|
413
|
+
gecko: {
|
|
414
|
+
id: 'staged@example.com',
|
|
415
|
+
data_collection_permissions: { required: ['none'] },
|
|
416
|
+
},
|
|
417
|
+
},
|
|
418
|
+
`),
|
|
419
|
+
},
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
try {
|
|
423
|
+
await inProject(tmp, async (task) => {
|
|
424
|
+
const outputDir = path.join(tmp, 'out-firefox');
|
|
425
|
+
await task.compileManifest(outputDir, 'firefox');
|
|
426
|
+
const permissions = JSON.parse(fs.readFileSync(path.join(outputDir, 'manifest.json'), 'utf8'))
|
|
427
|
+
.browser_specific_settings.gecko.data_collection_permissions;
|
|
428
|
+
|
|
429
|
+
// Firefox reads `none` as "collects nothing" — unioning the
|
|
430
|
+
// framework's authenticationInfo back in would declare a data
|
|
431
|
+
// collection the extension does not do
|
|
432
|
+
ctx.expect(permissions.required).toEqual(['none']);
|
|
433
|
+
// The key the consumer left alone still carries the default
|
|
434
|
+
ctx.expect(permissions.optional).toEqual(['technicalAndInteraction']);
|
|
435
|
+
});
|
|
436
|
+
} finally {
|
|
437
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
438
|
+
}
|
|
439
|
+
},
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
name: 'the publish workflow uploads the zips the package task actually writes (#265)',
|
|
443
|
+
run: async (ctx) => {
|
|
444
|
+
const workflow = fs.readFileSync(path.join(SRC, 'defaults', '.github', 'workflows', 'publish.yml'), 'utf8');
|
|
445
|
+
const tmp = stageProject({});
|
|
446
|
+
|
|
447
|
+
try {
|
|
448
|
+
// packageZip writes packaged/<target>/extension.zip, one per target.
|
|
449
|
+
// The release step used to upload packaged/extension.zip — a path no
|
|
450
|
+
// build has ever produced, so the composed run died on its last step.
|
|
451
|
+
ctx.expect(workflow).not.toContain('packaged/extension.zip');
|
|
452
|
+
|
|
453
|
+
const referenced = [...workflow.matchAll(/packaged\/[^\s"']*extension\.zip/g)].map((match) => match[0]);
|
|
454
|
+
ctx.expect(referenced.length).toBeGreaterThan(0);
|
|
455
|
+
|
|
456
|
+
const shellGlob = referenced.find((reference) => reference.includes('*'));
|
|
457
|
+
ctx.expect(shellGlob).toBeDefined();
|
|
458
|
+
|
|
459
|
+
const matcher = new RegExp(`^${shellGlob.replace(/\./g, '\\.').replace(/\*/g, '[^/]+')}$`);
|
|
460
|
+
|
|
461
|
+
await inProject(tmp, async (task) => {
|
|
462
|
+
const targets = Object.keys(task.TARGETS);
|
|
463
|
+
ctx.expect(targets.length).toBeGreaterThan(0);
|
|
464
|
+
|
|
465
|
+
for (const target of targets) {
|
|
466
|
+
ctx.expect(matcher.test(`packaged/${target}/extension.zip`)).toBe(true);
|
|
467
|
+
}
|
|
468
|
+
});
|
|
469
|
+
} finally {
|
|
470
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
471
|
+
}
|
|
472
|
+
},
|
|
473
|
+
},
|
|
474
|
+
{
|
|
475
|
+
name: 'firefox: side_panel maps to sidebar_action, the sidePanel permission is dropped, chromium keeps both (#264)',
|
|
476
|
+
run: async (ctx) => {
|
|
477
|
+
const tmp = stageProject({
|
|
478
|
+
files: {
|
|
479
|
+
'dist/manifest.json': MANIFEST(`
|
|
480
|
+
permissions: ['sidePanel', 'storage'],
|
|
481
|
+
side_panel: { default_path: 'views/sidepanel/index.html' },
|
|
482
|
+
browser_specific_settings: { gecko: { id: 'staged@example.com' } },
|
|
483
|
+
`),
|
|
484
|
+
},
|
|
485
|
+
});
|
|
486
|
+
try {
|
|
487
|
+
await inProject(tmp, async (task) => {
|
|
488
|
+
const firefoxDir = path.join(tmp, 'out-firefox');
|
|
489
|
+
await task.compileManifest(firefoxDir, 'firefox');
|
|
490
|
+
const firefox = JSON.parse(fs.readFileSync(path.join(firefoxDir, 'manifest.json'), 'utf8'));
|
|
491
|
+
|
|
492
|
+
// Chrome-only panel keys are gone; firefox's own key carries the panel
|
|
493
|
+
ctx.expect(firefox.side_panel).toBeUndefined();
|
|
494
|
+
ctx.expect(firefox.sidebar_action.default_panel).toBe('views/sidepanel/index.html');
|
|
495
|
+
ctx.expect(firefox.permissions).toEqual(['storage']);
|
|
496
|
+
// The background translation firefox already did stays intact
|
|
497
|
+
ctx.expect(firefox.background.service_worker).toBeUndefined();
|
|
498
|
+
ctx.expect(firefox.background.scripts).toContain('assets/js/components/background.bundle.js');
|
|
499
|
+
|
|
500
|
+
const chromiumDir = path.join(tmp, 'out-chromium');
|
|
501
|
+
await task.compileManifest(chromiumDir, 'chromium');
|
|
502
|
+
const chromium = JSON.parse(fs.readFileSync(path.join(chromiumDir, 'manifest.json'), 'utf8'));
|
|
503
|
+
|
|
504
|
+
ctx.expect(chromium.side_panel.default_path).toBe('views/sidepanel/index.html');
|
|
505
|
+
ctx.expect(chromium.permissions).toContain('sidePanel');
|
|
506
|
+
ctx.expect(chromium.sidebar_action).toBeUndefined();
|
|
507
|
+
});
|
|
508
|
+
} finally {
|
|
509
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
510
|
+
}
|
|
511
|
+
},
|
|
512
|
+
},
|
|
513
|
+
{
|
|
514
|
+
name: 'firefox: a missing browser_specific_settings.gecko.id FAILS the compile (#264)',
|
|
515
|
+
run: async (ctx) => {
|
|
516
|
+
const tmp = stageProject({
|
|
517
|
+
files: { 'dist/manifest.json': MANIFEST(`description: 'no gecko id anywhere'`) },
|
|
518
|
+
});
|
|
519
|
+
try {
|
|
520
|
+
await inProject(tmp, async (task) => {
|
|
521
|
+
let thrown = null;
|
|
522
|
+
await task.compileManifest(path.join(tmp, 'out-firefox'), 'firefox').catch((e) => { thrown = e; });
|
|
523
|
+
ctx.expect(thrown).toBeInstanceOf(Error);
|
|
524
|
+
// Actionable: names the key and what to put in it
|
|
525
|
+
ctx.expect(thrown.message).toMatch(/browser_specific_settings\.gecko\.id/);
|
|
526
|
+
ctx.expect(fs.existsSync(path.join(tmp, 'out-firefox', 'manifest.json'))).toBe(false);
|
|
527
|
+
|
|
528
|
+
// The same source still packages for chromium — the gate is firefox's alone
|
|
529
|
+
await task.compileManifest(path.join(tmp, 'out-chromium'), 'chromium');
|
|
530
|
+
ctx.expect(fs.existsSync(path.join(tmp, 'out-chromium', 'manifest.json'))).toBe(true);
|
|
531
|
+
});
|
|
532
|
+
} finally {
|
|
533
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
534
|
+
}
|
|
535
|
+
},
|
|
536
|
+
},
|
|
537
|
+
{
|
|
538
|
+
name: 'firefox: a missing gecko id DERIVES from the brand config — url host first, brand id fallback (#264)',
|
|
539
|
+
run: async (ctx) => {
|
|
540
|
+
// A fresh scaffold declares no gecko id but always has brand facts —
|
|
541
|
+
// its first build must produce a working firefox artifact, not a throw.
|
|
542
|
+
const withUrl = stageProject({
|
|
543
|
+
config: `{ brand: { id: 'staged-brand', name: 'Staged', url: 'https://staged.example.com' } }`,
|
|
544
|
+
files: { 'dist/manifest.json': MANIFEST(`description: 'no gecko id declared'`) },
|
|
545
|
+
});
|
|
546
|
+
const idOnly = stageProject({
|
|
547
|
+
config: `{ brand: { id: 'staged-brand', name: 'Staged' } }`,
|
|
548
|
+
files: { 'dist/manifest.json': MANIFEST(`description: 'no gecko id declared'`) },
|
|
549
|
+
});
|
|
550
|
+
|
|
551
|
+
try {
|
|
552
|
+
await inProject(withUrl, async (task) => {
|
|
553
|
+
const outputDir = path.join(withUrl, 'out-firefox');
|
|
554
|
+
await task.compileManifest(outputDir, 'firefox');
|
|
555
|
+
const m = JSON.parse(fs.readFileSync(path.join(outputDir, 'manifest.json'), 'utf8'));
|
|
556
|
+
ctx.expect(m.browser_specific_settings.gecko.id).toBe('extension@staged.example.com');
|
|
557
|
+
});
|
|
558
|
+
|
|
559
|
+
await inProject(idOnly, async (task) => {
|
|
560
|
+
const outputDir = path.join(idOnly, 'out-firefox');
|
|
561
|
+
await task.compileManifest(outputDir, 'firefox');
|
|
562
|
+
const m = JSON.parse(fs.readFileSync(path.join(outputDir, 'manifest.json'), 'utf8'));
|
|
563
|
+
ctx.expect(m.browser_specific_settings.gecko.id).toBe('extension@staged-brand.extension');
|
|
564
|
+
});
|
|
565
|
+
} finally {
|
|
566
|
+
fs.rmSync(withUrl, { recursive: true, force: true });
|
|
567
|
+
fs.rmSync(idOnly, { recursive: true, force: true });
|
|
568
|
+
}
|
|
569
|
+
},
|
|
570
|
+
},
|
|
571
|
+
{
|
|
572
|
+
name: 'store description assets ship RENDERED brand tokens — English and translated (#289)',
|
|
573
|
+
run: async (ctx) => {
|
|
574
|
+
// The scaffolded config/description.md is written with `{{ brand.name }}`
|
|
575
|
+
// tokens; copied verbatim they reach the live store listing unrendered.
|
|
576
|
+
const tmp = stageProject({
|
|
577
|
+
config: `{ brand: { id: 'staged', name: 'Staged Brand', url: 'https://staged.example.com' } }`,
|
|
578
|
+
files: {
|
|
579
|
+
'config/description.md': `{{ brand.name }} makes browsing better.\nGet it at {{ brand.url }}.\n`,
|
|
580
|
+
// A translated variant carries the same tokens through the translator
|
|
581
|
+
'translations/es/description.md': `<!-- omega:source abc123abc123 -->\n{{ brand.name }} mejora tu navegación.\n`,
|
|
582
|
+
},
|
|
583
|
+
});
|
|
584
|
+
try {
|
|
585
|
+
await inProject(tmp, async (task) => {
|
|
586
|
+
await task.deployStoreAssets();
|
|
587
|
+
|
|
588
|
+
const descDir = path.join(tmp, 'packaged', 'assets', 'description');
|
|
589
|
+
|
|
590
|
+
const en = fs.readFileSync(path.join(descDir, 'en.md'), 'utf8');
|
|
591
|
+
ctx.expect(en).toContain('Staged Brand makes browsing better.');
|
|
592
|
+
ctx.expect(en).toContain('Get it at https://staged.example.com.');
|
|
593
|
+
ctx.expect(en).not.toContain('{{');
|
|
594
|
+
|
|
595
|
+
const es = fs.readFileSync(path.join(descDir, 'es.md'), 'utf8');
|
|
596
|
+
ctx.expect(es).toContain('Staged Brand mejora tu navegación.');
|
|
597
|
+
ctx.expect(es).not.toContain('{{');
|
|
598
|
+
// the source marker is still stripped
|
|
599
|
+
ctx.expect(es).not.toContain('omega:source');
|
|
600
|
+
});
|
|
601
|
+
} finally {
|
|
602
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
603
|
+
}
|
|
604
|
+
},
|
|
605
|
+
},
|
|
606
|
+
{
|
|
607
|
+
name: 'homepage_url is baked from brand.url on every target, declared wins, absent ships nothing (#576)',
|
|
608
|
+
run: async (ctx) => {
|
|
609
|
+
const derived = stageProject({
|
|
610
|
+
config: `{ brand: { id: 'staged', name: 'Staged', url: 'https://staged.example.com/extension' } }`,
|
|
611
|
+
files: { 'dist/manifest.json': MANIFEST(`description: 'no homepage_url declared'`) },
|
|
612
|
+
});
|
|
613
|
+
const declared = stageProject({
|
|
614
|
+
config: `{ brand: { id: 'staged', name: 'Staged', url: 'https://staged.example.com' } }`,
|
|
615
|
+
files: { 'dist/manifest.json': MANIFEST(`homepage_url: 'https://staged.example.com/chrome'`) },
|
|
616
|
+
});
|
|
617
|
+
const noBrandUrl = stageProject({
|
|
618
|
+
config: `{ brand: { id: 'staged', name: 'Staged' } }`,
|
|
619
|
+
files: { 'dist/manifest.json': MANIFEST(`browser_specific_settings: { gecko: { id: 'staged@example.com' } }`) },
|
|
620
|
+
});
|
|
621
|
+
|
|
622
|
+
try {
|
|
623
|
+
// Chrome and Firefox both link the store listing's developer site from it
|
|
624
|
+
for (const target of ['chromium', 'firefox']) {
|
|
625
|
+
await inProject(derived, async (task) => {
|
|
626
|
+
const outputDir = path.join(derived, `out-${target}`);
|
|
627
|
+
await task.compileManifest(outputDir, target);
|
|
628
|
+
const m = JSON.parse(fs.readFileSync(path.join(outputDir, 'manifest.json'), 'utf8'));
|
|
629
|
+
ctx.expect(m.homepage_url).toBe('https://staged.example.com/extension');
|
|
630
|
+
});
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
await inProject(declared, async (task) => {
|
|
634
|
+
const outputDir = path.join(declared, 'out');
|
|
635
|
+
await task.compileManifest(outputDir, 'chromium');
|
|
636
|
+
const m = JSON.parse(fs.readFileSync(path.join(outputDir, 'manifest.json'), 'utf8'));
|
|
637
|
+
ctx.expect(m.homepage_url).toBe('https://staged.example.com/chrome');
|
|
638
|
+
});
|
|
639
|
+
|
|
640
|
+
await inProject(noBrandUrl, async (task) => {
|
|
641
|
+
const outputDir = path.join(noBrandUrl, 'out');
|
|
642
|
+
await task.compileManifest(outputDir, 'chromium');
|
|
643
|
+
const m = JSON.parse(fs.readFileSync(path.join(outputDir, 'manifest.json'), 'utf8'));
|
|
644
|
+
ctx.expect(m.homepage_url).toBeUndefined();
|
|
645
|
+
});
|
|
646
|
+
} finally {
|
|
647
|
+
fs.rmSync(derived, { recursive: true, force: true });
|
|
648
|
+
fs.rmSync(declared, { recursive: true, force: true });
|
|
649
|
+
fs.rmSync(noBrandUrl, { recursive: true, force: true });
|
|
650
|
+
}
|
|
651
|
+
},
|
|
652
|
+
},
|
|
653
|
+
{
|
|
654
|
+
name: 'externally_connectable: a build-mode default is the BRAND origin, no dev origin (#583)',
|
|
655
|
+
run: async (ctx) => {
|
|
656
|
+
const tmp = stageProject({
|
|
657
|
+
config: `{ brand: { id: 'staged', name: 'Staged', url: 'https://staged.example.com' } }`,
|
|
658
|
+
files: { 'dist/manifest.json': MANIFEST(`description: 'no externally_connectable anywhere'`) },
|
|
659
|
+
});
|
|
660
|
+
const restore = withEnv({ OMEGA_BUILD_MODE: 'true' });
|
|
661
|
+
|
|
662
|
+
try {
|
|
663
|
+
await inProject(tmp, async (task) => {
|
|
664
|
+
const outputDir = path.join(tmp, 'out');
|
|
665
|
+
await task.compileManifest(outputDir, 'chromium');
|
|
666
|
+
const m = JSON.parse(fs.readFileSync(path.join(outputDir, 'manifest.json'), 'utf8'));
|
|
667
|
+
|
|
668
|
+
// The published extension is reachable from the brand's own site;
|
|
669
|
+
// the localhost dev origin is not in a packaged build
|
|
670
|
+
ctx.expect(m.externally_connectable.matches).toEqual(['https://staged.example.com/*']);
|
|
671
|
+
});
|
|
672
|
+
} finally {
|
|
673
|
+
restore();
|
|
674
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
675
|
+
}
|
|
676
|
+
},
|
|
677
|
+
},
|
|
678
|
+
{
|
|
679
|
+
name: 'externally_connectable: a dev default carries the brand origin AND the dev origin (#583)',
|
|
680
|
+
run: async (ctx) => {
|
|
681
|
+
const tmp = stageProject({
|
|
682
|
+
config: `{ brand: { id: 'staged', name: 'Staged', url: 'https://staged.example.com/' } }`,
|
|
683
|
+
files: { 'dist/manifest.json': MANIFEST(`description: 'no externally_connectable anywhere'`) },
|
|
684
|
+
});
|
|
685
|
+
|
|
686
|
+
try {
|
|
687
|
+
await inProject(tmp, async (task) => {
|
|
688
|
+
const outputDir = path.join(tmp, 'out');
|
|
689
|
+
await task.compileManifest(outputDir, 'chromium');
|
|
690
|
+
const m = JSON.parse(fs.readFileSync(path.join(outputDir, 'manifest.json'), 'utf8'));
|
|
691
|
+
|
|
692
|
+
// A trailing slash in brand.url is normalized to a match pattern
|
|
693
|
+
ctx.expect(m.externally_connectable.matches).toEqual([
|
|
694
|
+
'https://staged.example.com/*',
|
|
695
|
+
'https://localhost:4000/*',
|
|
696
|
+
]);
|
|
697
|
+
});
|
|
698
|
+
} finally {
|
|
699
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
700
|
+
}
|
|
701
|
+
},
|
|
702
|
+
},
|
|
703
|
+
{
|
|
704
|
+
name: 'externally_connectable: a DECLARED consumer value still wins in build mode (#583, #260)',
|
|
705
|
+
run: async (ctx) => {
|
|
706
|
+
const declared = stageProject({
|
|
707
|
+
config: `{ brand: { id: 'staged', name: 'Staged', url: 'https://staged.example.com' } }`,
|
|
708
|
+
files: { 'dist/manifest.json': MANIFEST(`externally_connectable: { matches: ['https://partner.example.com/*'] }`) },
|
|
709
|
+
});
|
|
710
|
+
const emptied = stageProject({
|
|
711
|
+
config: `{ brand: { id: 'staged', name: 'Staged', url: 'https://staged.example.com' } }`,
|
|
712
|
+
files: { 'dist/manifest.json': MANIFEST(`externally_connectable: { matches: [] }`) },
|
|
713
|
+
});
|
|
714
|
+
const restore = withEnv({ OMEGA_BUILD_MODE: 'true' });
|
|
715
|
+
|
|
716
|
+
try {
|
|
717
|
+
await inProject(declared, async (task) => {
|
|
718
|
+
const outputDir = path.join(declared, 'out');
|
|
719
|
+
await task.compileManifest(outputDir, 'chromium');
|
|
720
|
+
const m = JSON.parse(fs.readFileSync(path.join(outputDir, 'manifest.json'), 'utf8'));
|
|
721
|
+
ctx.expect(m.externally_connectable.matches).toEqual(['https://partner.example.com/*']);
|
|
722
|
+
});
|
|
723
|
+
|
|
724
|
+
await inProject(emptied, async (task) => {
|
|
725
|
+
const outputDir = path.join(emptied, 'out');
|
|
726
|
+
await task.compileManifest(outputDir, 'chromium');
|
|
727
|
+
const m = JSON.parse(fs.readFileSync(path.join(outputDir, 'manifest.json'), 'utf8'));
|
|
728
|
+
ctx.expect(m.externally_connectable).toBeUndefined();
|
|
729
|
+
});
|
|
730
|
+
} finally {
|
|
731
|
+
restore();
|
|
732
|
+
fs.rmSync(declared, { recursive: true, force: true });
|
|
733
|
+
fs.rmSync(emptied, { recursive: true, force: true });
|
|
734
|
+
}
|
|
735
|
+
},
|
|
736
|
+
},
|
|
737
|
+
{
|
|
738
|
+
name: 'build hooks run from the NESTED hooks/build/pre.js setup migrates to (#571)',
|
|
739
|
+
run: async (ctx) => {
|
|
740
|
+
const tmp = stageProject({
|
|
741
|
+
files: { 'hooks/build/pre.js': HOOK('nested') },
|
|
742
|
+
});
|
|
743
|
+
try {
|
|
744
|
+
await inProject(tmp, async (task) => {
|
|
745
|
+
await task.hook('build:pre');
|
|
746
|
+
const ran = JSON.parse(fs.readFileSync(path.join(tmp, 'hook-ran.json'), 'utf8'));
|
|
747
|
+
ctx.expect(ran.which).toBe('nested');
|
|
748
|
+
});
|
|
749
|
+
} finally {
|
|
750
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
751
|
+
}
|
|
752
|
+
},
|
|
753
|
+
},
|
|
754
|
+
{
|
|
755
|
+
name: 'build hooks still run from the flat pre-migration hooks/build:pre.js (#571)',
|
|
756
|
+
run: async (ctx) => {
|
|
757
|
+
const tmp = stageProject({
|
|
758
|
+
files: { 'hooks/build:pre.js': HOOK('flat') },
|
|
759
|
+
});
|
|
760
|
+
try {
|
|
761
|
+
await inProject(tmp, async (task) => {
|
|
762
|
+
await task.hook('build:pre');
|
|
763
|
+
const ran = JSON.parse(fs.readFileSync(path.join(tmp, 'hook-ran.json'), 'utf8'));
|
|
764
|
+
ctx.expect(ran.which).toBe('flat');
|
|
765
|
+
});
|
|
766
|
+
} finally {
|
|
767
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
768
|
+
}
|
|
769
|
+
},
|
|
770
|
+
},
|
|
771
|
+
{
|
|
772
|
+
name: 'a build hook receives the ONE OMEGA ctx shape — { manager, projectRoot, mode } (#591)',
|
|
773
|
+
run: async (ctx) => {
|
|
774
|
+
const tmp = stageProject({
|
|
775
|
+
files: { 'hooks/build/pre.js': HOOK('nested') },
|
|
776
|
+
});
|
|
777
|
+
try {
|
|
778
|
+
await inProject(tmp, async (task) => {
|
|
779
|
+
await task.hook('build:pre');
|
|
780
|
+
|
|
781
|
+
const ran = JSON.parse(fs.readFileSync(path.join(tmp, 'hook-ran.json'), 'utf8'));
|
|
782
|
+
ctx.expect(ran.keys).toEqual(['manager', 'mode', 'projectRoot']);
|
|
783
|
+
ctx.expect(ran.projectRoot).toBe(fs.realpathSync(tmp));
|
|
784
|
+
ctx.expect(ran.mode).toBe('development');
|
|
785
|
+
ctx.expect(ran.hasManager).toBe(true);
|
|
786
|
+
});
|
|
787
|
+
} finally {
|
|
788
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
789
|
+
}
|
|
790
|
+
},
|
|
791
|
+
},
|
|
792
|
+
{
|
|
793
|
+
name: 'a build hook run under OMEGA_BUILD_MODE gets mode: production (#591)',
|
|
794
|
+
run: async (ctx) => {
|
|
795
|
+
const tmp = stageProject({
|
|
796
|
+
files: { 'hooks/build/pre.js': HOOK('nested') },
|
|
797
|
+
});
|
|
798
|
+
const restore = withEnv({ OMEGA_BUILD_MODE: 'true' });
|
|
799
|
+
try {
|
|
800
|
+
await inProject(tmp, async (task) => {
|
|
801
|
+
await task.hook('build:pre');
|
|
802
|
+
|
|
803
|
+
const ran = JSON.parse(fs.readFileSync(path.join(tmp, 'hook-ran.json'), 'utf8'));
|
|
804
|
+
ctx.expect(ran.mode).toBe('production');
|
|
805
|
+
});
|
|
806
|
+
} finally {
|
|
807
|
+
restore();
|
|
808
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
809
|
+
}
|
|
810
|
+
},
|
|
811
|
+
},
|
|
812
|
+
{
|
|
813
|
+
name: 'a project with no hook at all logs the miss through the framework logger, never a bare console.warn (#571)',
|
|
814
|
+
run: async (ctx) => {
|
|
815
|
+
const tmp = stageProject({});
|
|
816
|
+
const warned = [];
|
|
817
|
+
const realWarn = console.warn;
|
|
818
|
+
console.warn = (...args) => warned.push(args.join(' '));
|
|
819
|
+
try {
|
|
820
|
+
await inProject(tmp, async (task) => {
|
|
821
|
+
await task.hook('build:post');
|
|
822
|
+
});
|
|
823
|
+
ctx.expect(warned).toEqual([]);
|
|
824
|
+
} finally {
|
|
825
|
+
console.warn = realWarn;
|
|
826
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
827
|
+
}
|
|
828
|
+
},
|
|
829
|
+
},
|
|
830
|
+
],
|
|
831
|
+
});
|