@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,742 @@
|
|
|
1
|
+
// Libraries
|
|
2
|
+
const Manager = new (require('../../build.js'));
|
|
3
|
+
const logger = Manager.logger('package');
|
|
4
|
+
const watcherLogger = Manager.logger('package:watcher');
|
|
5
|
+
const operaLogger = Manager.logger('package:opera');
|
|
6
|
+
const path = require('path');
|
|
7
|
+
const jetpack = require('fs-jetpack');
|
|
8
|
+
const { series, parallel, watch } = require('gulp');
|
|
9
|
+
const { execute, getKeys, template } = require('node-powertools');
|
|
10
|
+
const JSON5 = require('json5');
|
|
11
|
+
const { CLASSIC_DEV_ORIGIN } = require('../../vendor/config/index.js');
|
|
12
|
+
|
|
13
|
+
// Load package
|
|
14
|
+
const project = Manager.getPackage('project');
|
|
15
|
+
const config = Manager.getConfig('project');
|
|
16
|
+
const rootPathPackage = Manager.getRootPath('main');
|
|
17
|
+
|
|
18
|
+
// Glob
|
|
19
|
+
const input = [
|
|
20
|
+
// Files to include
|
|
21
|
+
'dist/**/*',
|
|
22
|
+
|
|
23
|
+
// Files to exclude
|
|
24
|
+
// '!dist/**',
|
|
25
|
+
];
|
|
26
|
+
const output = 'dist';
|
|
27
|
+
const delay = 250;
|
|
28
|
+
|
|
29
|
+
// Build targets with browser-specific configurations
|
|
30
|
+
const TARGETS = {
|
|
31
|
+
chromium: {
|
|
32
|
+
// Chrome, Edge, Brave, etc. - uses service_worker
|
|
33
|
+
adjustManifest: (manifest) => {
|
|
34
|
+
if (manifest.background) {
|
|
35
|
+
delete manifest.background.scripts;
|
|
36
|
+
}
|
|
37
|
+
return manifest;
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
firefox: {
|
|
41
|
+
// Firefox - uses scripts array, no service_worker
|
|
42
|
+
adjustManifest: (manifest) => {
|
|
43
|
+
// Firefox REFUSES an add-on it cannot identify, and an id assigned at
|
|
44
|
+
// submission time can never be updated from a self-hosted build — a
|
|
45
|
+
// packaged, submittable-looking artifact that is dead on arrival (#264).
|
|
46
|
+
// A declared id is authoritative. Missing, it is DERIVED from the brand
|
|
47
|
+
// config (deterministic per brand) so a fresh scaffold builds out of the
|
|
48
|
+
// box; only a project with no brand facts at all still fails loudly.
|
|
49
|
+
if (!manifest.browser_specific_settings?.gecko?.id) {
|
|
50
|
+
let host = null;
|
|
51
|
+
try { host = new URL(config.brand?.url).hostname; } catch (e) { /* no brand url — fall through to brand.id */ }
|
|
52
|
+
host = host || (config.brand?.id ? `${config.brand.id}.extension` : null);
|
|
53
|
+
|
|
54
|
+
if (!host) {
|
|
55
|
+
throw new Error('Cannot package the firefox artifact: browser_specific_settings.gecko.id is missing — declare it in src/manifest.json (e.g. { browser_specific_settings: { gecko: { id: \'my-extension@example.com\' } } })');
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
manifest.browser_specific_settings = manifest.browser_specific_settings || {};
|
|
59
|
+
manifest.browser_specific_settings.gecko = manifest.browser_specific_settings.gecko || {};
|
|
60
|
+
manifest.browser_specific_settings.gecko.id = `extension@${host}`;
|
|
61
|
+
logger.log(`firefox: no gecko id declared; derived ${manifest.browser_specific_settings.gecko.id} from the brand config. Declare browser_specific_settings.gecko.id in src/manifest.json before publishing — the id must stay stable across releases.`);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (manifest.background) {
|
|
65
|
+
if (manifest.background.service_worker) {
|
|
66
|
+
if (!manifest.background.scripts) {
|
|
67
|
+
manifest.background.scripts = [manifest.background.service_worker];
|
|
68
|
+
}
|
|
69
|
+
delete manifest.background.service_worker;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Chrome's side panel is `side_panel` + the `sidePanel` permission;
|
|
74
|
+
// Firefox has neither — it ships the same surface as `sidebar_action`.
|
|
75
|
+
// Shipping the chrome keys packaged fine and left the panel unreachable (#264).
|
|
76
|
+
if (manifest.side_panel) {
|
|
77
|
+
if (manifest.side_panel.default_path && !manifest.sidebar_action) {
|
|
78
|
+
manifest.sidebar_action = {
|
|
79
|
+
default_panel: manifest.side_panel.default_path,
|
|
80
|
+
default_title: manifest.action?.default_title || manifest.name,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
delete manifest.side_panel;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (Array.isArray(manifest.permissions)) {
|
|
87
|
+
manifest.permissions = manifest.permissions.filter((permission) => permission !== 'sidePanel');
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return manifest;
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
opera: {
|
|
94
|
+
// Opera - like chromium but with stricter requirements
|
|
95
|
+
// Opera enforces 12-char limit on short_name INCLUDING placeholder text
|
|
96
|
+
adjustManifest: (manifest) => {
|
|
97
|
+
// Same as chromium for background
|
|
98
|
+
if (manifest.background) {
|
|
99
|
+
delete manifest.background.scripts;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Opera requires static short_name (12 char limit includes placeholder text)
|
|
103
|
+
// __MSG_appNameShort__ is 19 chars, so we must use actual value
|
|
104
|
+
if (manifest.short_name && manifest.short_name.startsWith('__MSG_')) {
|
|
105
|
+
// Try to get the value from default locale
|
|
106
|
+
const localesDir = path.join('dist', '_locales');
|
|
107
|
+
const defaultLocale = manifest.default_locale || 'en';
|
|
108
|
+
const messagesPath = path.join(localesDir, defaultLocale, 'messages.json');
|
|
109
|
+
|
|
110
|
+
if (jetpack.exists(messagesPath)) {
|
|
111
|
+
try {
|
|
112
|
+
const messages = JSON5.parse(jetpack.read(messagesPath));
|
|
113
|
+
// Extract key from __MSG_keyName__
|
|
114
|
+
const key = manifest.short_name.replace(/^__MSG_/, '').replace(/__$/, '');
|
|
115
|
+
if (messages[key]?.message) {
|
|
116
|
+
manifest.short_name = messages[key].message;
|
|
117
|
+
operaLogger.log(`Resolved short_name to "${manifest.short_name}"`);
|
|
118
|
+
}
|
|
119
|
+
} catch (e) {
|
|
120
|
+
operaLogger.warn(`Could not resolve short_name from locale: ${e.message}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return manifest;
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
// Recursively remove empty arrays and objects from an object
|
|
131
|
+
function removeEmptyValues(obj) {
|
|
132
|
+
if (Array.isArray(obj)) {
|
|
133
|
+
return obj;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (obj && typeof obj === 'object') {
|
|
137
|
+
const result = {};
|
|
138
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
139
|
+
// Recursively clean nested objects
|
|
140
|
+
const cleaned = removeEmptyValues(value);
|
|
141
|
+
|
|
142
|
+
// Skip empty arrays
|
|
143
|
+
if (Array.isArray(cleaned) && cleaned.length === 0) {
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Skip empty objects (after cleaning)
|
|
148
|
+
if (cleaned && typeof cleaned === 'object' && !Array.isArray(cleaned) && Object.keys(cleaned).length === 0) {
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
result[key] = cleaned;
|
|
153
|
+
}
|
|
154
|
+
return result;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return obj;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// The origins the framework default lets message this extension. A packaged
|
|
161
|
+
// build needs the BRAND's own origin — it shipped the localhost dev origin
|
|
162
|
+
// alone, so the live site could not message the published extension (#583).
|
|
163
|
+
// The dev origin rides along in dev only. A consumer that DECLARES
|
|
164
|
+
// `externally_connectable` still wins outright (#260) — this is only the default.
|
|
165
|
+
function externallyConnectableOrigins() {
|
|
166
|
+
const origins = [];
|
|
167
|
+
|
|
168
|
+
let brandOrigin = null;
|
|
169
|
+
try { brandOrigin = new URL(config.brand?.url).origin; } catch (e) { /* no brand url — dev origin only */ }
|
|
170
|
+
|
|
171
|
+
if (brandOrigin) {
|
|
172
|
+
origins.push(`${brandOrigin}/*`);
|
|
173
|
+
} else if (Manager.isBuildMode()) {
|
|
174
|
+
logger.warn('externally_connectable: no brand.url in config/omega.json5, so the packaged extension declares no messaging origin — your site will not be able to message it');
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// The dev-website origin is BUILD-TIME-BAKED by design (N7 non-goal: a shipped
|
|
178
|
+
// extension can't probe ports): the origin the LIVE sibling website published,
|
|
179
|
+
// or the classic default when nothing is up (#262).
|
|
180
|
+
if (!Manager.isBuildMode()) {
|
|
181
|
+
origins.push(`${Manager.getDevWebsiteOrigin() || CLASSIC_DEV_ORIGIN}/*`);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
return origins;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Special Compilation Task for manifest.json with default settings
|
|
188
|
+
async function compileManifest(outputDir, target) {
|
|
189
|
+
try {
|
|
190
|
+
const manifestPath = path.join('dist', 'manifest.json');
|
|
191
|
+
const outputPath = path.join(outputDir, 'manifest.json');
|
|
192
|
+
const configPath = path.join(rootPathPackage, 'dist', 'config', 'manifest.json');
|
|
193
|
+
|
|
194
|
+
// Read and parse using JSON5. The framework defaults carry build-time
|
|
195
|
+
// tokens (the same `%%%name%%%` idiom the bundle task's replacements speak) —
|
|
196
|
+
// the messaging origins are resolved facts now, never literals (#262, #583).
|
|
197
|
+
let manifest = JSON5.parse(jetpack.read(manifestPath));
|
|
198
|
+
const defaultConfig = JSON5.parse(template(jetpack.read(configPath), {
|
|
199
|
+
externallyConnectableOrigins: externallyConnectableOrigins()
|
|
200
|
+
.map((origin) => `'${origin}'`)
|
|
201
|
+
.join(', '),
|
|
202
|
+
}, {
|
|
203
|
+
brackets: ['%%%', '%%%'],
|
|
204
|
+
}));
|
|
205
|
+
|
|
206
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
207
|
+
// STEP 1: Apply defaults (shared across all targets)
|
|
208
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
209
|
+
// A declared consumer value is AUTHORITATIVE — the defaults only fill keys
|
|
210
|
+
// the consumer never wrote. Arrays used to UNION with the default, so a
|
|
211
|
+
// framework-default entry could never be removed: an extension declaring an
|
|
212
|
+
// empty `externally_connectable` still shipped the dev origin in every
|
|
213
|
+
// production build (#260). An empty array is a decision, not an omission.
|
|
214
|
+
getKeys(defaultConfig).forEach(key => {
|
|
215
|
+
const defaultValue = key.split('.').reduce((o, k) => (o || {})[k], defaultConfig);
|
|
216
|
+
const userValue = key.split('.').reduce((o, k) => (o || {})[k], manifest);
|
|
217
|
+
|
|
218
|
+
if (userValue === undefined) {
|
|
219
|
+
// Apply default if user value doesn't exist
|
|
220
|
+
key.split('.').reduce((o, k, i, arr) => {
|
|
221
|
+
if (i === arr.length - 1) o[k] = defaultValue;
|
|
222
|
+
else o[k] = o[k] || {};
|
|
223
|
+
return o[k];
|
|
224
|
+
}, manifest);
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
// Add package version to manifest. Chrome REFUSES a manifest with no
|
|
229
|
+
// version — a target whose package.json has none used to build a perfectly
|
|
230
|
+
// normal-looking extension that no browser would load (#46). Fail here.
|
|
231
|
+
if (!project.version) {
|
|
232
|
+
throw new Error('Cannot build the manifest: the extension app\'s package.json has no "version" (Chrome refuses to load a manifest without one)');
|
|
233
|
+
}
|
|
234
|
+
manifest.version = project.version;
|
|
235
|
+
|
|
236
|
+
// Chrome and Firefox both link the store listing's developer-site link from
|
|
237
|
+
// `homepage_url`, and nothing emitted it — the brand's site is right there in
|
|
238
|
+
// the config (#576). A DECLARED value is authoritative; missing, it is
|
|
239
|
+
// derived from the brand config, the same mechanism as the firefox gecko id.
|
|
240
|
+
if (manifest.homepage_url === undefined && config.brand?.url) {
|
|
241
|
+
manifest.homepage_url = config.brand.url;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
245
|
+
// STEP 2: Apply target-specific adjustments
|
|
246
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
247
|
+
const targetConfig = TARGETS[target];
|
|
248
|
+
if (targetConfig?.adjustManifest) {
|
|
249
|
+
manifest = targetConfig.adjustManifest(manifest);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
253
|
+
// STEP 3: Clean up (shared across all targets)
|
|
254
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
255
|
+
// Declare only icons the build actually produced. The defaults name the
|
|
256
|
+
// full size ladder, but the icons task mints nothing without a
|
|
257
|
+
// `config/icon.{png,svg}` — and Chrome REFUSES to load an extension whose
|
|
258
|
+
// manifest points at an icon that isn't there, silently (#46).
|
|
259
|
+
const iconMissing = (relative) => !jetpack.exists(path.join('dist', relative));
|
|
260
|
+
const prunedIcons = [];
|
|
261
|
+
|
|
262
|
+
for (const [size, file] of Object.entries(manifest.icons || {})) {
|
|
263
|
+
if (iconMissing(file)) {
|
|
264
|
+
delete manifest.icons[size];
|
|
265
|
+
prunedIcons.push(file);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// `action.default_icon` is legally EITHER a path string or a size→path map
|
|
270
|
+
// (both shapes ship in dist/config/manifest.json) — prune the map per entry
|
|
271
|
+
// and drop the key only when nothing survives.
|
|
272
|
+
const defaultIcon = manifest.action?.default_icon;
|
|
273
|
+
|
|
274
|
+
if (typeof defaultIcon === 'string') {
|
|
275
|
+
if (iconMissing(defaultIcon)) {
|
|
276
|
+
prunedIcons.push(defaultIcon);
|
|
277
|
+
delete manifest.action.default_icon;
|
|
278
|
+
}
|
|
279
|
+
} else if (defaultIcon && typeof defaultIcon === 'object') {
|
|
280
|
+
for (const [size, file] of Object.entries(defaultIcon)) {
|
|
281
|
+
if (iconMissing(file)) {
|
|
282
|
+
delete defaultIcon[size];
|
|
283
|
+
prunedIcons.push(file);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
if (Object.keys(defaultIcon).length === 0) {
|
|
288
|
+
delete manifest.action.default_icon;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
if (prunedIcons.length > 0) {
|
|
293
|
+
logger.warn(`[${target}] Dropped ${prunedIcons.length} missing icon reference(s) from the manifest — add config/icon.png to ship icons`);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// Remove empty arrays and objects from manifest
|
|
297
|
+
const cleanedManifest = removeEmptyValues(manifest);
|
|
298
|
+
|
|
299
|
+
// Save as regular JSON
|
|
300
|
+
jetpack.write(outputPath, JSON.stringify(cleanedManifest, null, 2));
|
|
301
|
+
|
|
302
|
+
logger.log(`[${target}] Manifest compiled with defaults`);
|
|
303
|
+
} catch (e) {
|
|
304
|
+
// Report, then FAIL the build. A swallowed error here shipped the raw JSON5
|
|
305
|
+
// source manifest as `manifest.json` and finished green — including the
|
|
306
|
+
// versionless case the guard above exists to catch (#46).
|
|
307
|
+
logger.error(`Error compiling manifest`, e);
|
|
308
|
+
throw e;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// Special Compilation Task for _locales
|
|
313
|
+
async function compileLocales(outputDir) {
|
|
314
|
+
try {
|
|
315
|
+
const localesDir = path.join('dist', '_locales');
|
|
316
|
+
const outputLocalesDir = path.join(outputDir, '_locales');
|
|
317
|
+
|
|
318
|
+
// Ensure the directory exists
|
|
319
|
+
jetpack.dir(outputLocalesDir);
|
|
320
|
+
|
|
321
|
+
// Process each locale file
|
|
322
|
+
jetpack.find(localesDir, { matching: '**/*.json' }).forEach(filePath => {
|
|
323
|
+
const relativePath = path.relative(localesDir, filePath);
|
|
324
|
+
const outputPath = path.join(outputLocalesDir, relativePath);
|
|
325
|
+
|
|
326
|
+
// Read and parse using JSON5
|
|
327
|
+
const localeData = JSON5.parse(jetpack.read(filePath));
|
|
328
|
+
|
|
329
|
+
// Save as regular JSON
|
|
330
|
+
jetpack.write(outputPath, JSON.stringify(localeData, null, 2));
|
|
331
|
+
|
|
332
|
+
logger.log(`Locale compiled and saved: ${outputPath}`);
|
|
333
|
+
});
|
|
334
|
+
} catch (e) {
|
|
335
|
+
// Report, then re-throw — a broken locale finishing green loads as a
|
|
336
|
+
// Chrome refusal when default_locale is declared (#46).
|
|
337
|
+
logger.error(`Error compiling locales`, e);
|
|
338
|
+
throw e;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// Package Task for raw - creates builds for all browser targets
|
|
343
|
+
async function packageRaw() {
|
|
344
|
+
// Log
|
|
345
|
+
logger.log(`Starting raw packaging...`);
|
|
346
|
+
|
|
347
|
+
try {
|
|
348
|
+
// Build for each target
|
|
349
|
+
for (const target of Object.keys(TARGETS)) {
|
|
350
|
+
await packageRawForTarget(target);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// Log completion
|
|
354
|
+
logger.log(`Finished raw packaging for all targets`);
|
|
355
|
+
} catch (e) {
|
|
356
|
+
// Report, then re-throw so packageFn's handler fails the gulp task — a
|
|
357
|
+
// half-packaged target is never a green build (#46).
|
|
358
|
+
logger.error(`Error during raw packaging`, e);
|
|
359
|
+
throw e;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// Files to exclude from packaged output (development/source files)
|
|
364
|
+
const PACKAGE_EXCLUDE_PATTERNS = [
|
|
365
|
+
'**/*.scss',
|
|
366
|
+
'**/*.sass',
|
|
367
|
+
'**/*.ts',
|
|
368
|
+
'**/.DS_Store',
|
|
369
|
+
];
|
|
370
|
+
|
|
371
|
+
// Package raw for a specific target (chromium or firefox)
|
|
372
|
+
async function packageRawForTarget(target) {
|
|
373
|
+
logger.log(`[${target}] Starting raw packaging...`);
|
|
374
|
+
|
|
375
|
+
const outputDir = `packaged/${target}/raw`;
|
|
376
|
+
|
|
377
|
+
// Ensure the directory exists (this also cleans it)
|
|
378
|
+
jetpack.dir(outputDir, { empty: true });
|
|
379
|
+
|
|
380
|
+
// Copy files to raw package directory
|
|
381
|
+
await execute(`cp -r dist/* ${outputDir}`);
|
|
382
|
+
|
|
383
|
+
// Remove development/source files that shouldn't be in the package
|
|
384
|
+
const filesToRemove = jetpack.find(outputDir, { matching: PACKAGE_EXCLUDE_PATTERNS });
|
|
385
|
+
filesToRemove.forEach(file => {
|
|
386
|
+
jetpack.remove(file);
|
|
387
|
+
logger.log(`[${target}] Removed dev file: ${path.relative(outputDir, file)}`);
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
// Loop thru outputDir/assets/js all JS files for redactions
|
|
391
|
+
const jsFiles = jetpack.find(path.join(outputDir, 'assets', 'js'), { matching: '*.js' });
|
|
392
|
+
const redactions = getRedactions();
|
|
393
|
+
|
|
394
|
+
jsFiles.forEach(filePath => {
|
|
395
|
+
// Load the content
|
|
396
|
+
let content = jetpack.read(filePath);
|
|
397
|
+
|
|
398
|
+
// Replace keys with their corresponding values
|
|
399
|
+
Object.keys(redactions).forEach(key => {
|
|
400
|
+
const value = redactions[key];
|
|
401
|
+
const regex = new RegExp(key, 'g'); // Create a global regex for the key
|
|
402
|
+
content = content.replace(regex, value);
|
|
403
|
+
|
|
404
|
+
// Log replacement
|
|
405
|
+
logger.log(`[${target}] Redacted ${key} in ${filePath}`);
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
// Write the new content to the file
|
|
409
|
+
jetpack.write(filePath, content);
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
// Compile manifest (target-specific) and locales
|
|
413
|
+
await compileManifest(outputDir, target);
|
|
414
|
+
await compileLocales(outputDir);
|
|
415
|
+
|
|
416
|
+
logger.log(`[${target}] Finished raw packaging`);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
// Create zipped version of raw packages for each target
|
|
420
|
+
async function packageZip() {
|
|
421
|
+
// Log
|
|
422
|
+
logger.log(`Zipping raw packages...`);
|
|
423
|
+
|
|
424
|
+
// Skip if not in build mode
|
|
425
|
+
if (!Manager.isBuildMode()) {
|
|
426
|
+
logger.log(`Skipping zip (not in build mode)`);
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
try {
|
|
431
|
+
// Create zip for each target
|
|
432
|
+
for (const target of Object.keys(TARGETS)) {
|
|
433
|
+
const inputDir = `packaged/${target}/raw`;
|
|
434
|
+
const zipPath = `packaged/${target}/extension.zip`;
|
|
435
|
+
|
|
436
|
+
// Remove existing zip if it exists
|
|
437
|
+
jetpack.remove(zipPath);
|
|
438
|
+
|
|
439
|
+
// Zip contents of raw directory (not the directory itself)
|
|
440
|
+
// This ensures manifest.json is at the root of the zip
|
|
441
|
+
await execute(`cd ${inputDir} && zip -r ../extension.zip .`);
|
|
442
|
+
logger.log(`[${target}] Zipped package created at ${zipPath}`);
|
|
443
|
+
}
|
|
444
|
+
} catch (e) {
|
|
445
|
+
// Report, then re-throw — a build-mode run without its zip artifact is
|
|
446
|
+
// never a green build (#46).
|
|
447
|
+
logger.error(`Error zipping package`, e);
|
|
448
|
+
throw e;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
// Create source code zip for Firefox review
|
|
453
|
+
async function packageSource() {
|
|
454
|
+
const { template } = require('node-powertools');
|
|
455
|
+
const os = require('os');
|
|
456
|
+
|
|
457
|
+
// Log
|
|
458
|
+
logger.log(`Zipping source code...`);
|
|
459
|
+
|
|
460
|
+
try {
|
|
461
|
+
const sourceZipPath = 'packaged/source.zip';
|
|
462
|
+
|
|
463
|
+
// Only in build mode
|
|
464
|
+
if (!Manager.isBuildMode()) {
|
|
465
|
+
logger.log(`Skipping source zip (not in build mode)`);
|
|
466
|
+
return;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
// Remove existing zip if it exists
|
|
470
|
+
jetpack.remove(sourceZipPath);
|
|
471
|
+
|
|
472
|
+
// Get system info
|
|
473
|
+
const platform = os.platform();
|
|
474
|
+
const platformName = {
|
|
475
|
+
darwin: 'macOS',
|
|
476
|
+
win32: 'Windows',
|
|
477
|
+
linux: 'Linux',
|
|
478
|
+
}[platform] || platform;
|
|
479
|
+
|
|
480
|
+
// Read template and replace variables
|
|
481
|
+
const templatePath = path.join(rootPathPackage, 'dist', 'gulp', 'templates', 'BUILD_INSTRUCTIONS.md');
|
|
482
|
+
const templateContent = jetpack.read(templatePath);
|
|
483
|
+
const instructions = template(templateContent, {
|
|
484
|
+
system: {
|
|
485
|
+
platform: platformName,
|
|
486
|
+
release: os.release(),
|
|
487
|
+
arch: os.arch(),
|
|
488
|
+
nodeVersion: process.version,
|
|
489
|
+
},
|
|
490
|
+
});
|
|
491
|
+
|
|
492
|
+
// Create source zip using git archive (respects .gitignore)
|
|
493
|
+
await execute(`git archive --format=zip --output=${sourceZipPath} HEAD`);
|
|
494
|
+
|
|
495
|
+
// Write build instructions to .temp/README.md
|
|
496
|
+
const tempReadmePath = path.join(process.cwd(), '.temp', 'README.md');
|
|
497
|
+
jetpack.write(tempReadmePath, instructions);
|
|
498
|
+
|
|
499
|
+
// Update the zip - replace README.md with build instructions
|
|
500
|
+
await execute(`cd .temp && zip -u ../${sourceZipPath} README.md`);
|
|
501
|
+
|
|
502
|
+
// Clean up temp file
|
|
503
|
+
jetpack.remove(tempReadmePath);
|
|
504
|
+
|
|
505
|
+
logger.log(`Source code zip created at ${sourceZipPath}`);
|
|
506
|
+
} catch (e) {
|
|
507
|
+
// Report, then re-throw — a build-mode run without its source zip is
|
|
508
|
+
// never a green build (#46).
|
|
509
|
+
logger.error(`Error zipping source code`, e);
|
|
510
|
+
throw e;
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
function liveReload() {
|
|
515
|
+
// Log
|
|
516
|
+
logger.log('Reloading live server clients...');
|
|
517
|
+
|
|
518
|
+
// Quit if in build mode
|
|
519
|
+
if (Manager.isBuildMode()) {
|
|
520
|
+
return logger.log('Skipping live reload in build mode');
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
// Quit if no websocket server
|
|
524
|
+
if (!global.websocket) {
|
|
525
|
+
return logger.log('No live reload server found');
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
// Reload each client
|
|
529
|
+
global.websocket.clients.forEach((client) => {
|
|
530
|
+
// Get client IP
|
|
531
|
+
const clientIp = client._socket?.remoteAddress || 'Unknown IP';
|
|
532
|
+
|
|
533
|
+
// Log
|
|
534
|
+
logger.log(`Sending to client at IP: ${clientIp}`);
|
|
535
|
+
|
|
536
|
+
// Send
|
|
537
|
+
client.send(JSON.stringify({ command: 'reload' }))
|
|
538
|
+
})
|
|
539
|
+
|
|
540
|
+
// Complete
|
|
541
|
+
return;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
// Deploy store submission assets to packaged/assets/
|
|
545
|
+
async function deployStoreAssets() {
|
|
546
|
+
const assetsDir = path.join('packaged', 'assets');
|
|
547
|
+
|
|
548
|
+
// Copy 128x128 icon for store submission
|
|
549
|
+
const iconSrc = path.join('dist', 'assets', 'images', 'icons', 'icon-128x.png');
|
|
550
|
+
if (jetpack.exists(iconSrc)) {
|
|
551
|
+
const iconDest = path.join(assetsDir, 'icon', 'icon-128x.png');
|
|
552
|
+
jetpack.dir(path.dirname(iconDest));
|
|
553
|
+
jetpack.copy(iconSrc, iconDest, { overwrite: true });
|
|
554
|
+
logger.log('Store asset: icon-128x.png');
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
// Render brand tokens the same way the html task templates a view — a store
|
|
558
|
+
// listing ships the resolved brand, never a literal `{{ brand.name }}` (#289)
|
|
559
|
+
const renderDescription = (contents, label) => {
|
|
560
|
+
const rendered = template(contents, {
|
|
561
|
+
brand: config.brand || {},
|
|
562
|
+
}, {
|
|
563
|
+
brackets: ['{{', '}}'],
|
|
564
|
+
});
|
|
565
|
+
|
|
566
|
+
// An unresolvable token (typo, missing config key) passes through literally
|
|
567
|
+
// and would ship to the live store listing — say so instead of shipping quiet
|
|
568
|
+
const leftover = rendered.match(/\{\{[^}]*\}\}/g);
|
|
569
|
+
if (leftover) {
|
|
570
|
+
logger.warn(`Store description ${label}: unresolved token(s) ship literally: ${[...new Set(leftover)].join(', ')} — check config/omega.json5`);
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
return rendered;
|
|
574
|
+
};
|
|
575
|
+
|
|
576
|
+
// Write English description (brand tokens rendered)
|
|
577
|
+
const enDescSrc = path.join(process.cwd(), 'config', 'description.md');
|
|
578
|
+
if (jetpack.exists(enDescSrc)) {
|
|
579
|
+
const descDir = path.join(assetsDir, 'description');
|
|
580
|
+
jetpack.dir(descDir);
|
|
581
|
+
jetpack.write(path.join(descDir, 'en.md'), renderDescription(jetpack.read(enDescSrc), 'en'));
|
|
582
|
+
logger.log('Store asset: description/en.md');
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
// Write translated descriptions (committed translations/, source marker stripped)
|
|
586
|
+
const translationsDir = path.join(process.cwd(), 'translations');
|
|
587
|
+
if (jetpack.exists(translationsDir)) {
|
|
588
|
+
const { readTranslatedDescription } = require('./translate.js');
|
|
589
|
+
const descDir = path.join(assetsDir, 'description');
|
|
590
|
+
|
|
591
|
+
let count = 0;
|
|
592
|
+
for (const file of jetpack.find(translationsDir, { matching: '*/description.md' })) {
|
|
593
|
+
const lang = path.basename(path.dirname(file));
|
|
594
|
+
const content = readTranslatedDescription(lang);
|
|
595
|
+
|
|
596
|
+
if (content) {
|
|
597
|
+
jetpack.dir(descDir);
|
|
598
|
+
jetpack.write(path.join(descDir, `${lang}.md`), renderDescription(content, lang));
|
|
599
|
+
count++;
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
if (count > 0) {
|
|
604
|
+
logger.log(`Store asset: ${count} translated descriptions`);
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
// Package Task
|
|
610
|
+
async function packageFn(complete) {
|
|
611
|
+
try {
|
|
612
|
+
// Log
|
|
613
|
+
logger.log('Starting...');
|
|
614
|
+
|
|
615
|
+
// Run build:pre hook
|
|
616
|
+
await hook('build:pre');
|
|
617
|
+
|
|
618
|
+
// Run packageRaw
|
|
619
|
+
await packageRaw();
|
|
620
|
+
|
|
621
|
+
// Run packageZip
|
|
622
|
+
await packageZip();
|
|
623
|
+
|
|
624
|
+
// Run packageSource
|
|
625
|
+
await packageSource();
|
|
626
|
+
|
|
627
|
+
// Deploy store submission assets
|
|
628
|
+
await deployStoreAssets();
|
|
629
|
+
|
|
630
|
+
// Run build:post hook
|
|
631
|
+
await hook('build:post');
|
|
632
|
+
|
|
633
|
+
// Run liveReload
|
|
634
|
+
liveReload();
|
|
635
|
+
|
|
636
|
+
// Log
|
|
637
|
+
logger.log('Finished!');
|
|
638
|
+
|
|
639
|
+
// Complete
|
|
640
|
+
return complete();
|
|
641
|
+
} catch (error) {
|
|
642
|
+
// Handle any errors that occur during package build
|
|
643
|
+
return Manager.reportBuildError(Object.assign(error, { plugin: 'Package' }), complete);
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
// Watcher Task
|
|
648
|
+
function packageFnWatcher(complete) {
|
|
649
|
+
// Quit if in build mode
|
|
650
|
+
if (Manager.isBuildMode()) {
|
|
651
|
+
watcherLogger.log('Skipping watcher in build mode');
|
|
652
|
+
return complete();
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
// Log
|
|
656
|
+
watcherLogger.log('Watching for changes...');
|
|
657
|
+
|
|
658
|
+
// Watch for changes in the dist folder
|
|
659
|
+
watch(input, { delay: delay, dot: true }, packageFn)
|
|
660
|
+
.on('change', function (path) {
|
|
661
|
+
watcherLogger.log(`File ${path} was changed`);
|
|
662
|
+
});
|
|
663
|
+
|
|
664
|
+
// Complete
|
|
665
|
+
return complete();
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
// Export tasks
|
|
669
|
+
module.exports = series(packageFn, packageFnWatcher);
|
|
670
|
+
module.exports.packageFn = packageFn;
|
|
671
|
+
module.exports.compileManifest = compileManifest;
|
|
672
|
+
module.exports.compileLocales = compileLocales;
|
|
673
|
+
module.exports.deployStoreAssets = deployStoreAssets;
|
|
674
|
+
module.exports.hook = hook;
|
|
675
|
+
// The browser targets the package lane builds — the one list the CI workflow's
|
|
676
|
+
// artifact upload is checked against (it ships packaged/<target>/extension.zip).
|
|
677
|
+
module.exports.TARGETS = TARGETS;
|
|
678
|
+
|
|
679
|
+
// Run hooks
|
|
680
|
+
async function hook(file) {
|
|
681
|
+
// Candidate paths, in order: the NESTED form the defaults scaffold writes and
|
|
682
|
+
// setup's migration moves flat files to (`hooks/build/pre.js`), then the flat
|
|
683
|
+
// pre-migration form (`hooks/build:pre.js`) as a transition fallback. Resolving
|
|
684
|
+
// only the flat one left every migrated consumer's hooks dead (#571).
|
|
685
|
+
const candidates = [
|
|
686
|
+
path.join(process.cwd(), 'hooks', `${file.split(':').join(path.sep)}.js`),
|
|
687
|
+
path.join(process.cwd(), 'hooks', `${file}.js`),
|
|
688
|
+
];
|
|
689
|
+
|
|
690
|
+
// Find the first one that exists
|
|
691
|
+
const fullPath = candidates.find((candidate) => jetpack.exists(candidate));
|
|
692
|
+
|
|
693
|
+
// Quit if there is none — a consumer may delete a scaffolded hook, so the
|
|
694
|
+
// miss is an informational line through the framework logger (the bare
|
|
695
|
+
// console.warn it replaces carried no tag and read as build noise, #571)
|
|
696
|
+
if (!fullPath) {
|
|
697
|
+
return logger.log(`No ${file} hook found at ${candidates[0]}`);
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
// Log
|
|
701
|
+
logger.log(`Running hook: ${fullPath}`);
|
|
702
|
+
|
|
703
|
+
// Load hook
|
|
704
|
+
let hook;
|
|
705
|
+
try {
|
|
706
|
+
// Load the hook
|
|
707
|
+
hook = require(fullPath);
|
|
708
|
+
} catch (e) {
|
|
709
|
+
throw new Error(`Error loading hook: ${fullPath} ${e.stack}`);
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
// Execute hook — the ONE hook-argument shape across OMEGA frameworks: the same
|
|
713
|
+
// `{ manager, projectRoot, mode }` ctx @omega.js/desktop hands its lifecycle
|
|
714
|
+
// hooks. This used to pass the package task's internal watch counter while both
|
|
715
|
+
// docs described a build-info object nothing ever built, so a hook written from
|
|
716
|
+
// the docs read `undefined` at its first property (#591). Everything those docs
|
|
717
|
+
// promised is reachable through `manager` (getManifest/getConfig/getPackage).
|
|
718
|
+
try {
|
|
719
|
+
return await hook({
|
|
720
|
+
manager: Manager,
|
|
721
|
+
projectRoot: process.cwd(),
|
|
722
|
+
mode: Manager.isBuildMode() ? 'production' : 'development',
|
|
723
|
+
});
|
|
724
|
+
} catch (e) {
|
|
725
|
+
throw new Error(`Error running hook: ${fullPath} ${e.stack}`);
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
// Get redactions
|
|
730
|
+
function getRedactions() {
|
|
731
|
+
const REDACTED = './REDACTED_REMOTE_CODE';
|
|
732
|
+
|
|
733
|
+
return {
|
|
734
|
+
'https://app.chatsy.ai/resources/script.js': REDACTED + 1,
|
|
735
|
+
// '/https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js\\?[^"\'\\s]*/g': REDACTED + 2,
|
|
736
|
+
'https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js': REDACTED + 2,
|
|
737
|
+
'https://www.google.com/recaptcha/enterprise.js': REDACTED + 3,
|
|
738
|
+
'https://apis.google.com/js/api.js': REDACTED + 4,
|
|
739
|
+
'https://www.google.com/recaptcha/api.js': REDACTED + 5,
|
|
740
|
+
'https://browser.sentry-cdn.com': REDACTED + 6,
|
|
741
|
+
}
|
|
742
|
+
}
|