@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,417 @@
|
|
|
1
|
+
// Libraries
|
|
2
|
+
const Manager = new (require('../../build.js'));
|
|
3
|
+
const logger = Manager.logger('publish');
|
|
4
|
+
const chromeLogger = Manager.logger('publish:chrome');
|
|
5
|
+
const firefoxLogger = Manager.logger('publish:firefox');
|
|
6
|
+
const edgeLogger = Manager.logger('publish:edge');
|
|
7
|
+
const argv = Manager.getArguments();
|
|
8
|
+
const { series } = require('gulp');
|
|
9
|
+
const jetpack = require('fs-jetpack');
|
|
10
|
+
const path = require('path');
|
|
11
|
+
const { execute } = require('node-powertools');
|
|
12
|
+
|
|
13
|
+
// Load package
|
|
14
|
+
const project = Manager.getPackage('project');
|
|
15
|
+
|
|
16
|
+
// Helper to parse browser filter from --browser flag or OMEGA_BROWSER env var
|
|
17
|
+
// Returns array of browser names to publish to, or null for all
|
|
18
|
+
function getBrowserFilter() {
|
|
19
|
+
// Check env var first (works across npm && chains), then CLI arg
|
|
20
|
+
const browser = process.env.OMEGA_BROWSER || argv.browser;
|
|
21
|
+
|
|
22
|
+
// If true or undefined, publish to all
|
|
23
|
+
if (browser === true || browser === undefined) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// If false, publish to none
|
|
28
|
+
if (browser === false) {
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// If string, parse comma-separated list
|
|
33
|
+
if (typeof browser === 'string') {
|
|
34
|
+
return browser.split(',').map((b) => b.trim().toLowerCase());
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Paths for each target
|
|
41
|
+
const PATHS = {
|
|
42
|
+
chromium: {
|
|
43
|
+
zip: path.join(process.cwd(), 'packaged', 'chromium', 'extension.zip'),
|
|
44
|
+
raw: path.join(process.cwd(), 'packaged', 'chromium', 'raw'),
|
|
45
|
+
},
|
|
46
|
+
firefox: {
|
|
47
|
+
zip: path.join(process.cwd(), 'packaged', 'firefox', 'extension.zip'),
|
|
48
|
+
raw: path.join(process.cwd(), 'packaged', 'firefox', 'raw'),
|
|
49
|
+
},
|
|
50
|
+
opera: {
|
|
51
|
+
zip: path.join(process.cwd(), 'packaged', 'opera', 'extension.zip'),
|
|
52
|
+
raw: path.join(process.cwd(), 'packaged', 'opera', 'raw'),
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
// Helper to check if a credential is valid (not empty or placeholder)
|
|
57
|
+
function isValidCredential(value) {
|
|
58
|
+
return value && !value.startsWith('your-');
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Store configurations - all credentials come from .env file
|
|
62
|
+
const STORES = {
|
|
63
|
+
chrome: {
|
|
64
|
+
name: 'Chrome Web Store',
|
|
65
|
+
submitUrl: 'https://chrome.google.com/webstore/devconsole',
|
|
66
|
+
apiUrl: 'https://developer.chrome.com/docs/webstore/using_webstore_api/',
|
|
67
|
+
enabled: () => isValidCredential(process.env.CHROME_EXTENSION_ID) && isValidCredential(process.env.CHROME_CLIENT_ID),
|
|
68
|
+
},
|
|
69
|
+
firefox: {
|
|
70
|
+
name: 'Firefox Add-ons',
|
|
71
|
+
submitUrl: 'https://addons.mozilla.org/en-US/developers/addon/submit/distribution',
|
|
72
|
+
apiUrl: 'https://addons.mozilla.org/developers/addon/api/key/',
|
|
73
|
+
enabled: () => isValidCredential(process.env.FIREFOX_API_KEY) && isValidCredential(process.env.FIREFOX_API_SECRET),
|
|
74
|
+
},
|
|
75
|
+
edge: {
|
|
76
|
+
name: 'Microsoft Edge Add-ons',
|
|
77
|
+
submitUrl: 'https://partner.microsoft.com/dashboard/microsoftedge/',
|
|
78
|
+
apiUrl: 'https://learn.microsoft.com/en-us/microsoft-edge/extensions-chromium/publish/api/using-addons-api',
|
|
79
|
+
enabled: () => isValidCredential(process.env.EDGE_PRODUCT_ID) && isValidCredential(process.env.EDGE_CLIENT_ID),
|
|
80
|
+
},
|
|
81
|
+
opera: {
|
|
82
|
+
name: 'Opera Add-ons',
|
|
83
|
+
submitUrl: 'https://addons.opera.com/developer/',
|
|
84
|
+
apiUrl: null,
|
|
85
|
+
enabled: () => false, // No API available
|
|
86
|
+
},
|
|
87
|
+
brave: {
|
|
88
|
+
name: 'Brave (via Chrome Web Store)',
|
|
89
|
+
submitUrl: 'https://chrome.google.com/webstore/devconsole',
|
|
90
|
+
apiUrl: null,
|
|
91
|
+
enabled: () => false, // Uses Chrome Web Store - no separate store
|
|
92
|
+
note: 'Brave uses Chrome Web Store directly. Publishing to Chrome makes extension available in Brave.',
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
// Main publish task
|
|
97
|
+
async function publish(complete) {
|
|
98
|
+
// Check if publish mode is enabled
|
|
99
|
+
if (!process.env.OMEGA_IS_PUBLISH) {
|
|
100
|
+
logger.log('Skipping publish (OMEGA_IS_PUBLISH not set)');
|
|
101
|
+
return complete();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Check for local packages
|
|
105
|
+
const allDeps = JSON.stringify(project.dependencies || {}) + JSON.stringify(project.devDependencies || {});
|
|
106
|
+
if (allDeps.includes('file:')) {
|
|
107
|
+
throw new Error('Please remove local packages before publishing!');
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Log
|
|
111
|
+
logger.log('Starting publish...');
|
|
112
|
+
|
|
113
|
+
// Check if zips exist for each target
|
|
114
|
+
const missingZips = Object.entries(PATHS)
|
|
115
|
+
.filter(([, paths]) => !jetpack.exists(paths.zip))
|
|
116
|
+
.map(([target]) => target);
|
|
117
|
+
|
|
118
|
+
if (missingZips.length > 0) {
|
|
119
|
+
logger.error(`Extension zips not found for: ${missingZips.join(', ')}. Run build first.`);
|
|
120
|
+
return complete();
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Log version
|
|
124
|
+
logger.log(`Publishing version ${project.version}`);
|
|
125
|
+
|
|
126
|
+
// Get browser filter from --browser flag
|
|
127
|
+
const browserFilter = getBrowserFilter();
|
|
128
|
+
|
|
129
|
+
// Log filter if applied
|
|
130
|
+
if (browserFilter) {
|
|
131
|
+
logger.log(`Browser filter: ${browserFilter.join(', ') || 'none'}`);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Get enabled stores (filtered by --browser flag if provided)
|
|
135
|
+
const enabledStores = Object.entries(STORES)
|
|
136
|
+
.filter(([key, store]) => {
|
|
137
|
+
// Check if store is enabled via credentials
|
|
138
|
+
if (!store.enabled()) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// If no filter, include all enabled stores
|
|
143
|
+
if (!browserFilter) {
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Check if this store is in the filter
|
|
148
|
+
return browserFilter.includes(key);
|
|
149
|
+
})
|
|
150
|
+
.map(([key]) => key);
|
|
151
|
+
|
|
152
|
+
// If no stores to publish to
|
|
153
|
+
if (enabledStores.length === 0) {
|
|
154
|
+
// Check if it's because of filter or missing credentials
|
|
155
|
+
if (browserFilter && browserFilter.length > 0) {
|
|
156
|
+
logger.error(`No matching stores for --browser=${browserFilter.join(',')}. Available: chrome, firefox, edge`);
|
|
157
|
+
} else {
|
|
158
|
+
logger.error('No stores configured for publishing. Add credentials to .env file');
|
|
159
|
+
logger.log('');
|
|
160
|
+
logger.log('Store URLs and API documentation:');
|
|
161
|
+
Object.entries(STORES).forEach(([, store]) => {
|
|
162
|
+
logger.log(` ${store.name}:`);
|
|
163
|
+
logger.log(` Submit: ${store.submitUrl}`);
|
|
164
|
+
if (store.apiUrl) {
|
|
165
|
+
logger.log(` API: ${store.apiUrl}`);
|
|
166
|
+
} else if (store.note) {
|
|
167
|
+
logger.log(` Note: ${store.note}`);
|
|
168
|
+
} else {
|
|
169
|
+
logger.log(` API: N/A (manual submission only)`);
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
throw new Error('No stores configured for publishing');
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
logger.log(`Publishing to: ${enabledStores.join(', ')}`);
|
|
177
|
+
|
|
178
|
+
// Track results
|
|
179
|
+
const results = {
|
|
180
|
+
success: [],
|
|
181
|
+
failed: [],
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
// Run publish tasks in parallel
|
|
185
|
+
const publishTasks = enabledStores.map(async (store) => {
|
|
186
|
+
try {
|
|
187
|
+
switch (store) {
|
|
188
|
+
case 'chrome':
|
|
189
|
+
await publishToChrome();
|
|
190
|
+
break;
|
|
191
|
+
case 'firefox':
|
|
192
|
+
await publishToFirefox();
|
|
193
|
+
break;
|
|
194
|
+
case 'edge':
|
|
195
|
+
await publishToEdge();
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
logger.log(`[${store}] Published successfully`);
|
|
199
|
+
results.success.push(store);
|
|
200
|
+
} catch (e) {
|
|
201
|
+
logger.error(`[${store}] Publish failed: ${e.message}`);
|
|
202
|
+
results.failed.push(store);
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
await Promise.all(publishTasks);
|
|
207
|
+
|
|
208
|
+
// Log completion and show all store URLs
|
|
209
|
+
logger.log('');
|
|
210
|
+
logger.log('Store URLs:');
|
|
211
|
+
Object.entries(STORES).forEach(([key, store]) => {
|
|
212
|
+
let status = '○ Manual';
|
|
213
|
+
if (results.success.includes(key)) {
|
|
214
|
+
status = '✓ Published';
|
|
215
|
+
} else if (results.failed.includes(key)) {
|
|
216
|
+
status = '✗ Failed';
|
|
217
|
+
} else if (store.note) {
|
|
218
|
+
status = '○ ' + store.note.split('.')[0]; // First sentence of note
|
|
219
|
+
}
|
|
220
|
+
logger.log(` ${store.name}: ${status}`);
|
|
221
|
+
logger.log(` Submit: ${store.submitUrl}`);
|
|
222
|
+
if (store.apiUrl) {
|
|
223
|
+
logger.log(` API: ${store.apiUrl}`);
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
// Throw error if any failed
|
|
228
|
+
if (results.failed.length > 0) {
|
|
229
|
+
throw new Error(`Publish failed for: ${results.failed.join(', ')}`);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Log
|
|
233
|
+
logger.log('');
|
|
234
|
+
logger.log('Publish finished!');
|
|
235
|
+
|
|
236
|
+
// Complete
|
|
237
|
+
return complete();
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Publish to Chrome Web Store
|
|
241
|
+
async function publishToChrome() {
|
|
242
|
+
// Get credentials from env
|
|
243
|
+
const extensionId = process.env.CHROME_EXTENSION_ID;
|
|
244
|
+
const clientId = process.env.CHROME_CLIENT_ID;
|
|
245
|
+
const clientSecret = process.env.CHROME_CLIENT_SECRET;
|
|
246
|
+
const refreshToken = process.env.CHROME_REFRESH_TOKEN;
|
|
247
|
+
|
|
248
|
+
// Validate
|
|
249
|
+
if (!extensionId || !clientId || !clientSecret || !refreshToken) {
|
|
250
|
+
throw new Error('Missing Chrome credentials. Set CHROME_EXTENSION_ID, CHROME_CLIENT_ID, CHROME_CLIENT_SECRET, CHROME_REFRESH_TOKEN in .env');
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
chromeLogger.log('Uploading to Chrome Web Store...');
|
|
254
|
+
|
|
255
|
+
// Use chrome-webstore-upload-cli with chromium build
|
|
256
|
+
const command = [
|
|
257
|
+
'npx chrome-webstore-upload-cli',
|
|
258
|
+
`--source "${PATHS.chromium.zip}"`,
|
|
259
|
+
`--extension-id "${extensionId}"`,
|
|
260
|
+
`--client-id "${clientId}"`,
|
|
261
|
+
`--client-secret "${clientSecret}"`,
|
|
262
|
+
`--refresh-token "${refreshToken}"`,
|
|
263
|
+
].join(' ');
|
|
264
|
+
|
|
265
|
+
await execute(command);
|
|
266
|
+
|
|
267
|
+
chromeLogger.log('Upload complete');
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// Publish to Firefox Add-ons
|
|
271
|
+
async function publishToFirefox() {
|
|
272
|
+
// Get credentials from env
|
|
273
|
+
const extensionId = process.env.FIREFOX_EXTENSION_ID;
|
|
274
|
+
const apiKey = process.env.FIREFOX_API_KEY;
|
|
275
|
+
const apiSecret = process.env.FIREFOX_API_SECRET;
|
|
276
|
+
const channel = process.env.FIREFOX_CHANNEL || 'listed';
|
|
277
|
+
|
|
278
|
+
// Validate
|
|
279
|
+
if (!apiKey || !apiSecret) {
|
|
280
|
+
throw new Error('Missing Firefox credentials. Set FIREFOX_API_KEY, FIREFOX_API_SECRET in .env');
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// Log what we're doing
|
|
284
|
+
if (extensionId) {
|
|
285
|
+
firefoxLogger.log(`Updating existing add-on: ${extensionId}`);
|
|
286
|
+
} else {
|
|
287
|
+
firefoxLogger.log('Creating new add-on (no FIREFOX_EXTENSION_ID set)');
|
|
288
|
+
firefoxLogger.log('After publish, add FIREFOX_EXTENSION_ID to .env for future updates');
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Use web-ext sign with firefox build
|
|
292
|
+
// --approval-timeout=0 to skip waiting for approval (can take minutes to hours)
|
|
293
|
+
// --artifacts-dir to prevent leaving web-ext-artifacts folder in project root
|
|
294
|
+
const artifactsDir = path.join(process.cwd(), '.temp', 'web-ext-artifacts');
|
|
295
|
+
const command = [
|
|
296
|
+
'npx web-ext sign',
|
|
297
|
+
`--source-dir "${PATHS.firefox.raw}"`,
|
|
298
|
+
`--artifacts-dir "${artifactsDir}"`,
|
|
299
|
+
`--api-key "${apiKey}"`,
|
|
300
|
+
`--api-secret "${apiSecret}"`,
|
|
301
|
+
`--channel "${channel}"`,
|
|
302
|
+
'--approval-timeout 0', // Don't wait for approval - it can take hours
|
|
303
|
+
extensionId ? `--id "${extensionId}"` : '',
|
|
304
|
+
].filter(Boolean).join(' ');
|
|
305
|
+
|
|
306
|
+
await execute(command);
|
|
307
|
+
|
|
308
|
+
// Clean up artifacts dir
|
|
309
|
+
jetpack.remove(artifactsDir);
|
|
310
|
+
|
|
311
|
+
firefoxLogger.log('Upload complete (approval may take time)');
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// Publish to Microsoft Edge Add-ons
|
|
315
|
+
async function publishToEdge() {
|
|
316
|
+
// Get credentials from env
|
|
317
|
+
const productId = process.env.EDGE_PRODUCT_ID;
|
|
318
|
+
const clientId = process.env.EDGE_CLIENT_ID;
|
|
319
|
+
const apiKey = process.env.EDGE_API_KEY;
|
|
320
|
+
|
|
321
|
+
// Validate
|
|
322
|
+
if (!productId || !clientId || !apiKey) {
|
|
323
|
+
throw new Error('Missing Edge credentials. Set EDGE_PRODUCT_ID, EDGE_CLIENT_ID, EDGE_API_KEY in .env');
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// Helper for Edge API requests
|
|
327
|
+
const edgeHeaders = {
|
|
328
|
+
'Authorization': `ApiKey ${apiKey}`,
|
|
329
|
+
'X-ClientID': clientId,
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
// Helper to parse Edge API response (handles empty bodies)
|
|
333
|
+
async function parseEdgeResponse(response, label) {
|
|
334
|
+
const text = await response.text();
|
|
335
|
+
edgeLogger.log(`${label} - Status: ${response.status}, Body: ${text || '(empty)'}`);
|
|
336
|
+
|
|
337
|
+
if (!text) {
|
|
338
|
+
return { status: response.status, data: null };
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
try {
|
|
342
|
+
return { status: response.status, data: JSON.parse(text) };
|
|
343
|
+
} catch (e) {
|
|
344
|
+
return { status: response.status, data: text };
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// Step 1: Upload the package first
|
|
349
|
+
edgeLogger.log('Uploading to Microsoft Edge Add-ons...');
|
|
350
|
+
|
|
351
|
+
const zipBuffer = jetpack.read(PATHS.chromium.zip, 'buffer');
|
|
352
|
+
const uploadUrl = `https://api.addons.microsoftedge.microsoft.com/v1/products/${productId}/submissions/draft/package`;
|
|
353
|
+
|
|
354
|
+
const uploadResponse = await fetch(uploadUrl, {
|
|
355
|
+
method: 'POST',
|
|
356
|
+
headers: {
|
|
357
|
+
...edgeHeaders,
|
|
358
|
+
'Content-Type': 'application/zip',
|
|
359
|
+
},
|
|
360
|
+
body: zipBuffer,
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
const upload = await parseEdgeResponse(uploadResponse, 'Upload response');
|
|
364
|
+
|
|
365
|
+
if (!uploadResponse.ok) {
|
|
366
|
+
throw new Error(`Edge upload error: ${upload.status} - ${JSON.stringify(upload.data)}`);
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
edgeLogger.log('Package uploaded, submitting for review...');
|
|
370
|
+
|
|
371
|
+
// Step 2: Submit for review - this is where we'll get InProgressSubmission if there's a pending review
|
|
372
|
+
const publishUrl = `https://api.addons.microsoftedge.microsoft.com/v1/products/${productId}/submissions`;
|
|
373
|
+
const publishResponse = await fetch(publishUrl, {
|
|
374
|
+
method: 'POST',
|
|
375
|
+
headers: {
|
|
376
|
+
...edgeHeaders,
|
|
377
|
+
'Content-Type': 'application/json',
|
|
378
|
+
},
|
|
379
|
+
body: JSON.stringify({
|
|
380
|
+
notes: `Automated publish of version ${project.version}`,
|
|
381
|
+
}),
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
const publish = await parseEdgeResponse(publishResponse, 'Publish response');
|
|
385
|
+
|
|
386
|
+
// Check for HTTP errors (4xx, 5xx)
|
|
387
|
+
if (!publishResponse.ok) {
|
|
388
|
+
// Check if it's a 409 Conflict or similar indicating in-progress submission
|
|
389
|
+
if (publish.status === 409) {
|
|
390
|
+
throw new Error('Extension already has a pending submission in review. Wait for it to complete before publishing again.');
|
|
391
|
+
}
|
|
392
|
+
throw new Error(`Edge publish error: ${publish.status} - ${JSON.stringify(publish.data)}`);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// Check for API-level failures (HTTP 200/202 but status: "Failed" in body)
|
|
396
|
+
if (publish.data && typeof publish.data === 'object') {
|
|
397
|
+
if (publish.data.status === 'Failed') {
|
|
398
|
+
if (publish.data.errorCode === 'InProgressSubmission') {
|
|
399
|
+
throw new Error('Extension already has a pending submission in review. Wait for it to complete before publishing again.');
|
|
400
|
+
}
|
|
401
|
+
if (publish.data.errorCode === 'UnpublishInProgress') {
|
|
402
|
+
throw new Error('Extension is being unpublished. Wait for unpublish to complete before publishing.');
|
|
403
|
+
}
|
|
404
|
+
throw new Error(`Edge publish failed: ${publish.data.message || publish.data.errorCode || 'Unknown error'}`);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
// HTTP 202 Accepted means submission was queued successfully
|
|
409
|
+
if (publish.status === 202) {
|
|
410
|
+
edgeLogger.log('Submission accepted and queued for review');
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
edgeLogger.log('Upload complete');
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// Export task
|
|
417
|
+
module.exports = series(publish);
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
// Libraries
|
|
2
|
+
const Manager = new (require('../../build.js'));
|
|
3
|
+
const logger = Manager.logger('sass');
|
|
4
|
+
const watcherLogger = Manager.logger('sass:watcher');
|
|
5
|
+
const { src, dest, watch, series } = require('gulp');
|
|
6
|
+
const glob = require('glob').globSync;
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const jetpack = require('fs-jetpack');
|
|
9
|
+
const compiler = require('gulp-sass')(require('sass'));
|
|
10
|
+
const cleanCSS = require('gulp-clean-css');
|
|
11
|
+
const rename = require('gulp-rename');
|
|
12
|
+
const filter = require('gulp-filter').default;
|
|
13
|
+
const { resolveThemeId } = require('../../lib/theme.js');
|
|
14
|
+
|
|
15
|
+
// Load package
|
|
16
|
+
const package = Manager.getPackage('main');
|
|
17
|
+
const project = Manager.getPackage('project');
|
|
18
|
+
const config = Manager.getConfig('project');
|
|
19
|
+
const rootPathPackage = Manager.getRootPath('main');
|
|
20
|
+
const rootPathProject = Manager.getRootPath('project');
|
|
21
|
+
|
|
22
|
+
// Themes are per-framework (#261) — a shared theme.id naming a WEB theme falls
|
|
23
|
+
// back to the extension's default instead of dying on a raw sass import error.
|
|
24
|
+
const themesDir = path.resolve(rootPathPackage, 'dist/assets/themes');
|
|
25
|
+
const themeId = resolveThemeId(config.theme?.id, { themesDir, logger });
|
|
26
|
+
|
|
27
|
+
// Define bundle files separately for easier tracking
|
|
28
|
+
const bundleFiles = [
|
|
29
|
+
// Main bundles (if any exist in bundles/ directory)
|
|
30
|
+
`${rootPathPackage}/dist/assets/css/bundles/*.scss`,
|
|
31
|
+
|
|
32
|
+
// Project bundles
|
|
33
|
+
'src/assets/css/bundles/*.scss',
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
// Glob
|
|
37
|
+
const input = [
|
|
38
|
+
// Bundle files (if any exist)
|
|
39
|
+
...bundleFiles,
|
|
40
|
+
|
|
41
|
+
// Project entry point (main.scss)
|
|
42
|
+
'src/assets/css/main.scss',
|
|
43
|
+
|
|
44
|
+
// Component-specific CSS
|
|
45
|
+
`${rootPathPackage}/dist/assets/css/components/**/*.scss`,
|
|
46
|
+
'src/assets/css/components/**/*.scss',
|
|
47
|
+
];
|
|
48
|
+
|
|
49
|
+
// Additional files to watch (but not compile as entry points)
|
|
50
|
+
const watchInput = [
|
|
51
|
+
// Watch the paths we're compiling
|
|
52
|
+
...input,
|
|
53
|
+
|
|
54
|
+
// Core CSS - watch for changes but don't compile as entry points
|
|
55
|
+
`${rootPathPackage}/dist/assets/css/**/*.scss`,
|
|
56
|
+
|
|
57
|
+
// Theme CSS - watch for changes but don't compile as entry points
|
|
58
|
+
`${rootPathPackage}/dist/assets/themes/**/*.scss`,
|
|
59
|
+
'src/assets/themes/**/*.scss',
|
|
60
|
+
];
|
|
61
|
+
|
|
62
|
+
const output = 'dist/assets/css';
|
|
63
|
+
const delay = 250;
|
|
64
|
+
const compiled = {};
|
|
65
|
+
|
|
66
|
+
// Configuration
|
|
67
|
+
const MAIN_BUNDLE_COMPONENT_PARTIALS = false; // Set to true to merge components into _component-specific.scss, false to compile separately
|
|
68
|
+
|
|
69
|
+
// SASS Compilation Task
|
|
70
|
+
function sass(complete) {
|
|
71
|
+
// Log
|
|
72
|
+
logger.log('Starting...');
|
|
73
|
+
Manager.logMemory(logger, 'Start');
|
|
74
|
+
|
|
75
|
+
// Generate component-specific scss
|
|
76
|
+
generateComponentScss();
|
|
77
|
+
|
|
78
|
+
// Compile
|
|
79
|
+
const stream = src(input, { sourcemaps: true })
|
|
80
|
+
// Skip files based on configuration
|
|
81
|
+
.pipe(filter(file => !shouldSkip(file.path), { restore: true }))
|
|
82
|
+
// Compile SASS
|
|
83
|
+
.pipe(compiler({
|
|
84
|
+
loadPaths: [
|
|
85
|
+
// So we can use "@use 'omega-extension' as *;"
|
|
86
|
+
path.resolve(rootPathPackage, 'dist/assets/css'),
|
|
87
|
+
|
|
88
|
+
// So we can use "@use 'theme' as *;" which resolves to the active theme
|
|
89
|
+
path.resolve(themesDir, themeId),
|
|
90
|
+
|
|
91
|
+
// So we can load _component-specific.scss from the project's dist
|
|
92
|
+
path.resolve(rootPathProject, 'dist/assets/css'),
|
|
93
|
+
|
|
94
|
+
// Allow importing from node_modules (e.g., @import '@fortawesome/fontawesome-free/css/all.min.css')
|
|
95
|
+
path.resolve(rootPathProject, 'node_modules'),
|
|
96
|
+
],
|
|
97
|
+
// Suppress deprecation warnings
|
|
98
|
+
quietDeps: true,
|
|
99
|
+
// Only show warnings once
|
|
100
|
+
verbose: false
|
|
101
|
+
})
|
|
102
|
+
.on('error', (error) => Manager.reportBuildError(Object.assign(error, { plugin: 'SASS' }), complete)));
|
|
103
|
+
|
|
104
|
+
// Process
|
|
105
|
+
return stream
|
|
106
|
+
.pipe(cleanCSS({
|
|
107
|
+
format: Manager.actLikeProduction() ? 'compressed' : 'beautify',
|
|
108
|
+
}))
|
|
109
|
+
.pipe(rename((file) => {
|
|
110
|
+
// Get list of expected bundle names from the bundle files glob
|
|
111
|
+
// These are files that should be in the root CSS directory
|
|
112
|
+
let bundleFilesFound = [];
|
|
113
|
+
try {
|
|
114
|
+
bundleFilesFound = glob(bundleFiles);
|
|
115
|
+
} catch (e) {
|
|
116
|
+
// Directory doesn't exist, that's ok
|
|
117
|
+
}
|
|
118
|
+
const bundleNames = bundleFilesFound.map(f => path.basename(f, '.scss'));
|
|
119
|
+
bundleNames.push('main'); // main.scss is always a root bundle
|
|
120
|
+
|
|
121
|
+
// Check if this is a root-level bundle
|
|
122
|
+
const baseName = file.basename;
|
|
123
|
+
const isBundle = bundleNames.includes(baseName);
|
|
124
|
+
|
|
125
|
+
// Check
|
|
126
|
+
if (isBundle) {
|
|
127
|
+
// Root-level bundles (main, or any future bundle in bundles/ directory)
|
|
128
|
+
// Keep in root directory
|
|
129
|
+
file.dirname = '.';
|
|
130
|
+
} else {
|
|
131
|
+
// Component files: special handling for pages vs other components
|
|
132
|
+
//
|
|
133
|
+
// ⚠️ CRITICAL: The 'pages' directory is treated differently!
|
|
134
|
+
//
|
|
135
|
+
// Pages directory can have MULTIPLE files (index, pricing, login, etc.)
|
|
136
|
+
// - pages/index.scss → components/pages/index.bundle.css ✓
|
|
137
|
+
// - pages/pricing.scss → components/pages/pricing.bundle.css ✓
|
|
138
|
+
// - pages/login.scss → components/pages/login.bundle.css ✓
|
|
139
|
+
//
|
|
140
|
+
// Other components only have ONE file (index.html), so we strip /index:
|
|
141
|
+
// - popup/index.scss → components/popup.bundle.css ✓
|
|
142
|
+
// - options/index.scss → components/options.bundle.css ✓
|
|
143
|
+
// - sidepanel/index.scss → components/sidepanel.bundle.css ✓
|
|
144
|
+
//
|
|
145
|
+
// ❌ DO NOT GENERATE: components/pages.bundle.css
|
|
146
|
+
// ✓ DO GENERATE: components/pages/index.bundle.css, components/pages/pricing.bundle.css, etc.
|
|
147
|
+
|
|
148
|
+
const isInPages = file.dirname.includes(`${path.sep}pages${path.sep}`)
|
|
149
|
+
|| file.dirname.endsWith(`${path.sep}pages`)
|
|
150
|
+
|| file.dirname === 'pages';
|
|
151
|
+
|
|
152
|
+
if (file.basename === 'index' && !isInPages) {
|
|
153
|
+
// For non-pages components: strip /index
|
|
154
|
+
// components/popup/index.scss -> components/popup.bundle.css
|
|
155
|
+
const parts = file.dirname.split(path.sep);
|
|
156
|
+
const parentDir = parts[parts.length - 1];
|
|
157
|
+
file.basename = parentDir;
|
|
158
|
+
parts.pop();
|
|
159
|
+
file.dirname = parts.join(path.sep);
|
|
160
|
+
}
|
|
161
|
+
// For pages or non-index files: keep full path
|
|
162
|
+
// components/pages/index.scss -> components/pages/index.bundle.css
|
|
163
|
+
// components/pages/pricing.scss -> components/pages/pricing.bundle.css
|
|
164
|
+
|
|
165
|
+
// Add components/ prefix if not already there
|
|
166
|
+
if (!file.dirname.startsWith('components/') && !file.dirname.startsWith('components\\')) {
|
|
167
|
+
file.dirname = `components/${file.dirname}`;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Add bundle to the name
|
|
172
|
+
file.basename += '.bundle';
|
|
173
|
+
|
|
174
|
+
// Track the full output path
|
|
175
|
+
const fullPath = path.resolve(output, file.dirname, `${file.basename}${file.extname}`);
|
|
176
|
+
compiled[fullPath] = true;
|
|
177
|
+
}))
|
|
178
|
+
.pipe(dest(output, { sourcemaps: '.' }))
|
|
179
|
+
.on('finish', () => {
|
|
180
|
+
// Log
|
|
181
|
+
logger.log('Finished!');
|
|
182
|
+
|
|
183
|
+
// Trigger rebuild
|
|
184
|
+
Manager.triggerRebuild(compiled);
|
|
185
|
+
|
|
186
|
+
// Complete
|
|
187
|
+
return complete();
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Watcher Task
|
|
192
|
+
function sassWatcher(complete) {
|
|
193
|
+
// Quit if in build mode
|
|
194
|
+
if (Manager.isBuildMode()) {
|
|
195
|
+
watcherLogger.log('Skipping watcher in build mode');
|
|
196
|
+
return complete();
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Log
|
|
200
|
+
watcherLogger.log('Watching for changes...');
|
|
201
|
+
|
|
202
|
+
// Watch for changes
|
|
203
|
+
watch(watchInput, { delay: delay, dot: true }, sass)
|
|
204
|
+
.on('change', (path) => {
|
|
205
|
+
watcherLogger.log(`File changed (${path})`);
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
// Complete
|
|
209
|
+
return complete();
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
function generateComponentScss() {
|
|
213
|
+
// Only generate _component-specific.scss if we're skipping component partials
|
|
214
|
+
if (!MAIN_BUNDLE_COMPONENT_PARTIALS) {
|
|
215
|
+
// When compiling components separately, create an empty file with a comment
|
|
216
|
+
const outputPath = path.resolve(rootPathProject, 'dist/assets/css/_component-specific.scss');
|
|
217
|
+
const content = `/*
|
|
218
|
+
AUTO-GENERATED COMPONENT-SPECIFIC SCSS
|
|
219
|
+
Components are now compiled separately when MAIN_BUNDLE_COMPONENT_PARTIALS = false
|
|
220
|
+
Find compiled component CSS in dist/assets/css/components/
|
|
221
|
+
*/
|
|
222
|
+
|
|
223
|
+
`;
|
|
224
|
+
|
|
225
|
+
jetpack.write(outputPath, content);
|
|
226
|
+
Manager.triggerRebuild(outputPath);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// TODO: Implement merged component partials if needed in the future
|
|
231
|
+
// This would be similar to UJ's page-specific merging
|
|
232
|
+
logger.log('Merged component partials not yet implemented');
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
function isComponentPartial(file) {
|
|
236
|
+
return file.includes('/assets/css/components/') && file.endsWith('index.scss');
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function shouldSkip(file) {
|
|
240
|
+
// Skip component partials only if MAIN_BUNDLE_COMPONENT_PARTIALS is true
|
|
241
|
+
if (MAIN_BUNDLE_COMPONENT_PARTIALS && isComponentPartial(file)) {
|
|
242
|
+
return true;
|
|
243
|
+
}
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Default Task
|
|
248
|
+
// Export
|
|
249
|
+
module.exports = series(
|
|
250
|
+
sass,
|
|
251
|
+
sassWatcher
|
|
252
|
+
);
|