@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,569 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `omega update` core — the ONE dependency-freshness implementation behind
|
|
3
|
+
* every framework's update verb (npu-outdated semantics, Ian's node-power-user
|
|
4
|
+
* tool): per dependency report installed vs wanted vs latest, classify the
|
|
5
|
+
* jump (patch/minor/major), and QUARANTINE releases younger than --min-age
|
|
6
|
+
* days (default 7 — a brand-new publish may be a compromised one; hold it
|
|
7
|
+
* back unless explicitly forced). Report-only by default; --apply installs
|
|
8
|
+
* the non-quarantined, non-breaking set (majors need the explicit --major
|
|
9
|
+
* opt-in) through `npu install` when npu is on the machine, else plain
|
|
10
|
+
* `npm install` with a loud note.
|
|
11
|
+
*
|
|
12
|
+
* `file:`/`link:`/git specs have no registry story (the local era's linked
|
|
13
|
+
* @omega.js packages) — they're skipped with a dim note, never updated.
|
|
14
|
+
*
|
|
15
|
+
* Everything effectful is injectable (registry lookup, clock, exec) so the
|
|
16
|
+
* test suite never touches the network; the live path is the thin defaults.
|
|
17
|
+
*/
|
|
18
|
+
const path = require('node:path');
|
|
19
|
+
const fs = require('node:fs');
|
|
20
|
+
const { execSync } = require('node:child_process');
|
|
21
|
+
|
|
22
|
+
const REGISTRY_BASE = 'https://registry.npmjs.org';
|
|
23
|
+
const DEFAULT_MIN_AGE_DAYS = 7;
|
|
24
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
25
|
+
|
|
26
|
+
// Specs with no registry story: local links, git, tarball URLs, and the
|
|
27
|
+
// bare `owner/repo` GitHub shorthand (never a valid version range).
|
|
28
|
+
const NON_REGISTRY_SPEC = /^(file:|link:|workspace:|portal:|git\+|git:|github:|https?:)/;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Parse a semver-ish version string into comparable parts.
|
|
32
|
+
* @param {string} value - e.g. '1.2.3', 'v1.2.3', '1.2.3-beta.1'
|
|
33
|
+
* @returns {{ major: number, minor: number, patch: number, prerelease: string|null }|null}
|
|
34
|
+
*/
|
|
35
|
+
function parseVersion(value) {
|
|
36
|
+
const match = String(value || '').trim().match(/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/);
|
|
37
|
+
if (!match) return null;
|
|
38
|
+
return {
|
|
39
|
+
major: Number(match[1]),
|
|
40
|
+
minor: Number(match[2]),
|
|
41
|
+
patch: Number(match[3]),
|
|
42
|
+
prerelease: match[4] || null,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Compare two version strings (-1 / 0 / 1). A prerelease sorts BEFORE its
|
|
48
|
+
* release triple; two prereleases compare lexically (enough for max-picking).
|
|
49
|
+
* @param {string} a
|
|
50
|
+
* @param {string} b
|
|
51
|
+
* @returns {number}
|
|
52
|
+
*/
|
|
53
|
+
function compareVersions(a, b) {
|
|
54
|
+
const va = parseVersion(a);
|
|
55
|
+
const vb = parseVersion(b);
|
|
56
|
+
if (!va || !vb) return 0;
|
|
57
|
+
|
|
58
|
+
for (const key of ['major', 'minor', 'patch']) {
|
|
59
|
+
if (va[key] !== vb[key]) return va[key] < vb[key] ? -1 : 1;
|
|
60
|
+
}
|
|
61
|
+
if (va.prerelease === vb.prerelease) return 0;
|
|
62
|
+
if (va.prerelease === null) return 1;
|
|
63
|
+
if (vb.prerelease === null) return -1;
|
|
64
|
+
return va.prerelease < vb.prerelease ? -1 : 1;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Classify the jump between two versions.
|
|
69
|
+
* @param {string} from
|
|
70
|
+
* @param {string} to
|
|
71
|
+
* @returns {'major'|'minor'|'patch'|null} null when equal/unparseable
|
|
72
|
+
*/
|
|
73
|
+
function classifyBump(from, to) {
|
|
74
|
+
const a = parseVersion(from);
|
|
75
|
+
const b = parseVersion(to);
|
|
76
|
+
if (!a || !b || compareVersions(from, to) === 0) return null;
|
|
77
|
+
if (a.major !== b.major) return 'major';
|
|
78
|
+
if (a.minor !== b.minor) return 'minor';
|
|
79
|
+
return 'patch';
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Whether a spec points at the npm registry at all.
|
|
84
|
+
* @param {string} spec - package.json dependency value
|
|
85
|
+
* @returns {boolean}
|
|
86
|
+
*/
|
|
87
|
+
function isRegistrySpec(spec) {
|
|
88
|
+
const value = String(spec || '').trim();
|
|
89
|
+
if (NON_REGISTRY_SPEC.test(value)) return false;
|
|
90
|
+
// GitHub shorthand: owner/repo — a '/' never appears in a version range
|
|
91
|
+
if (value.includes('/')) return false;
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Extract the base version from a range spec ('^1.2.3' → '1.2.3').
|
|
97
|
+
* @param {string} spec
|
|
98
|
+
* @returns {string|null} null when the spec has no single base ('*', 'latest', '1.x')
|
|
99
|
+
*/
|
|
100
|
+
function cleanSpec(spec) {
|
|
101
|
+
const match = String(spec || '').trim().match(/^[\^~=]?\s*v?(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?)$/);
|
|
102
|
+
return match ? match[1] : null;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Highest stable version satisfying a range spec — npm-outdated's "wanted".
|
|
107
|
+
* Understands the specs this ecosystem actually writes: exact, ^, ~, >=,
|
|
108
|
+
* x-ranges ('1.2.x', '1.x', '1'), and '*'/''/'latest'. Anything else → null.
|
|
109
|
+
* @param {string} spec
|
|
110
|
+
* @param {string[]} versions - all published versions
|
|
111
|
+
* @returns {string|null}
|
|
112
|
+
*/
|
|
113
|
+
function resolveWanted(spec, versions) {
|
|
114
|
+
const value = String(spec || '').trim();
|
|
115
|
+
const stable = versions.filter((v) => {
|
|
116
|
+
const parsed = parseVersion(v);
|
|
117
|
+
return parsed && !parsed.prerelease;
|
|
118
|
+
}).sort(compareVersions);
|
|
119
|
+
const max = (list) => (list.length > 0 ? list[list.length - 1] : null);
|
|
120
|
+
|
|
121
|
+
if (value === '*' || value === '' || value === 'latest') return max(stable);
|
|
122
|
+
|
|
123
|
+
const base = cleanSpec(value);
|
|
124
|
+
if (base) {
|
|
125
|
+
const parsed = parseVersion(base);
|
|
126
|
+
const atLeast = stable.filter((v) => compareVersions(v, base) >= 0);
|
|
127
|
+
|
|
128
|
+
if (value.startsWith('^')) {
|
|
129
|
+
// Caret: same major; 0.x pins the minor; 0.0.x pins the patch
|
|
130
|
+
return max(atLeast.filter((v) => {
|
|
131
|
+
const candidate = parseVersion(v);
|
|
132
|
+
if (candidate.major !== parsed.major) return false;
|
|
133
|
+
if (parsed.major === 0 && candidate.minor !== parsed.minor) return false;
|
|
134
|
+
if (parsed.major === 0 && parsed.minor === 0 && candidate.patch !== parsed.patch) return false;
|
|
135
|
+
return true;
|
|
136
|
+
}));
|
|
137
|
+
}
|
|
138
|
+
if (value.startsWith('~')) {
|
|
139
|
+
return max(atLeast.filter((v) => {
|
|
140
|
+
const candidate = parseVersion(v);
|
|
141
|
+
return candidate.major === parsed.major && candidate.minor === parsed.minor;
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
144
|
+
// Exact (with or without '=')
|
|
145
|
+
return versions.includes(base) ? base : null;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (value.startsWith('>=')) {
|
|
149
|
+
const floor = cleanSpec(value.slice(2));
|
|
150
|
+
return floor ? max(stable.filter((v) => compareVersions(v, floor) >= 0)) : null;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// x-ranges: '1', '1.x', '1.2', '1.2.x', '1.2.*' ('1.2.3' exact was handled above)
|
|
154
|
+
const xMatch = value.match(/^(\d+)(?:\.(\d+|[x*]))?(?:\.[x*])?$/);
|
|
155
|
+
if (xMatch) {
|
|
156
|
+
const major = Number(xMatch[1]);
|
|
157
|
+
const minor = xMatch[2] === undefined || /[x*]/.test(xMatch[2]) ? null : Number(xMatch[2]);
|
|
158
|
+
return max(stable.filter((v) => {
|
|
159
|
+
const candidate = parseVersion(v);
|
|
160
|
+
return candidate.major === major && (minor === null || candidate.minor === minor);
|
|
161
|
+
}));
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Highest stable version within a bump tier of `current` — npu's
|
|
169
|
+
* patch/minor/latest targets.
|
|
170
|
+
* @param {string[]} versions
|
|
171
|
+
* @param {string} current
|
|
172
|
+
* @param {'patch'|'minor'|'latest'} tier
|
|
173
|
+
* @returns {string|null}
|
|
174
|
+
*/
|
|
175
|
+
function highestWithin(versions, current, tier) {
|
|
176
|
+
const parsed = parseVersion(current);
|
|
177
|
+
if (!parsed) return null;
|
|
178
|
+
|
|
179
|
+
const candidates = versions.filter((v) => {
|
|
180
|
+
const candidate = parseVersion(v);
|
|
181
|
+
if (!candidate || candidate.prerelease) return false;
|
|
182
|
+
if (compareVersions(v, current) < 0) return false;
|
|
183
|
+
if (tier === 'patch') return candidate.major === parsed.major && candidate.minor === parsed.minor;
|
|
184
|
+
if (tier === 'minor') return candidate.major === parsed.major;
|
|
185
|
+
return true;
|
|
186
|
+
}).sort(compareVersions);
|
|
187
|
+
|
|
188
|
+
return candidates.length > 0 ? candidates[candidates.length - 1] : null;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Find a dependency's physically installed version — nearest node_modules
|
|
193
|
+
* copy walking UP from dir (npm hoists to the brand root in brand monorepos).
|
|
194
|
+
* @param {string} name - package name
|
|
195
|
+
* @param {string} dir - starting directory
|
|
196
|
+
* @returns {string|null}
|
|
197
|
+
*/
|
|
198
|
+
function findInstalledVersion(name, dir) {
|
|
199
|
+
let current = path.resolve(dir);
|
|
200
|
+
for (;;) {
|
|
201
|
+
const manifest = path.join(current, 'node_modules', ...name.split('/'), 'package.json');
|
|
202
|
+
if (fs.existsSync(manifest)) {
|
|
203
|
+
try {
|
|
204
|
+
return JSON.parse(fs.readFileSync(manifest, 'utf8')).version || null;
|
|
205
|
+
} catch (e) {
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const parent = path.dirname(current);
|
|
210
|
+
if (parent === current) return null;
|
|
211
|
+
current = parent;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Live registry lookup — full packument (the abbreviated form has no publish
|
|
217
|
+
* times). The ONE network call of the verb; tests inject a fixture instead.
|
|
218
|
+
* @param {string} name - package name
|
|
219
|
+
* @param {object} [options]
|
|
220
|
+
* @param {function} [options.fetchFn] - injectable fetch
|
|
221
|
+
* @param {string} [options.registryUrl] - registry base URL
|
|
222
|
+
* @returns {Promise<{ latest: string|null, versions: string[], time: object }>}
|
|
223
|
+
*/
|
|
224
|
+
async function fetchPackument(name, options = {}) {
|
|
225
|
+
const fetchFn = options.fetchFn || fetch;
|
|
226
|
+
const base = options.registryUrl || REGISTRY_BASE;
|
|
227
|
+
const response = await fetchFn(`${base}/${name.replace('/', '%2F')}`, {
|
|
228
|
+
headers: { Accept: 'application/json' },
|
|
229
|
+
});
|
|
230
|
+
if (response.status === 404) {
|
|
231
|
+
// Zero publishes so far for @omega.js/* (HARD RULE 2) — a 404 is expected
|
|
232
|
+
// in-monorepo, so say what it means instead of a bare status code
|
|
233
|
+
throw new Error('not on the registry (unpublished?)');
|
|
234
|
+
}
|
|
235
|
+
if (!response.ok) {
|
|
236
|
+
throw new Error(`registry ${response.status} for ${name}`);
|
|
237
|
+
}
|
|
238
|
+
const body = await response.json();
|
|
239
|
+
return {
|
|
240
|
+
latest: body['dist-tags']?.latest || null,
|
|
241
|
+
versions: Object.keys(body.versions || {}),
|
|
242
|
+
time: body.time || {},
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Build the full update report for one target's package.json.
|
|
248
|
+
* @param {object} options
|
|
249
|
+
* @param {string} options.dir - target directory (package.json + node_modules climb)
|
|
250
|
+
* @param {function} options.lookup - async (name) => { latest, versions, time }
|
|
251
|
+
* @param {number} [options.now] - clock (ms epoch; injectable for tests)
|
|
252
|
+
* @param {number} [options.minAge] - quarantine threshold in days (default 7; 0 disables)
|
|
253
|
+
* @returns {Promise<{ project: string, rows: object[], locals: object[] }>}
|
|
254
|
+
*/
|
|
255
|
+
async function buildUpdateReport(options) {
|
|
256
|
+
const dir = options.dir;
|
|
257
|
+
const now = options.now ?? Date.now();
|
|
258
|
+
const minAge = options.minAge ?? DEFAULT_MIN_AGE_DAYS;
|
|
259
|
+
|
|
260
|
+
const manifestPath = path.join(dir, 'package.json');
|
|
261
|
+
if (!fs.existsSync(manifestPath)) {
|
|
262
|
+
throw new Error(`No package.json in ${dir}`);
|
|
263
|
+
}
|
|
264
|
+
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
|
|
265
|
+
|
|
266
|
+
// `only` narrows the manifest to a named set — the brand-root shell rides
|
|
267
|
+
// the fan-out for its @omega.js/manager pin alone (#794), and a brand's own
|
|
268
|
+
// root tooling is none of that leg's business.
|
|
269
|
+
const only = Array.isArray(options.only) ? new Set(options.only) : null;
|
|
270
|
+
const pick = (deps) => (only ? Object.fromEntries(Object.entries(deps).filter(([name]) => only.has(name))) : deps);
|
|
271
|
+
|
|
272
|
+
const groups = [
|
|
273
|
+
['prod', pick(manifest.dependencies || {})],
|
|
274
|
+
['dev', pick(manifest.devDependencies || {})],
|
|
275
|
+
];
|
|
276
|
+
|
|
277
|
+
const locals = [];
|
|
278
|
+
const rows = [];
|
|
279
|
+
|
|
280
|
+
await Promise.all(groups.flatMap(([group, deps]) => Object.entries(deps).map(async ([name, spec]) => {
|
|
281
|
+
if (!isRegistrySpec(spec)) {
|
|
282
|
+
locals.push({ name, group, spec });
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
const installed = findInstalledVersion(name, dir);
|
|
287
|
+
const current = cleanSpec(spec) || installed;
|
|
288
|
+
|
|
289
|
+
const row = {
|
|
290
|
+
name, group, spec, current, installed,
|
|
291
|
+
wanted: null, latest: null, patchTarget: null, minorTarget: null,
|
|
292
|
+
bump: null, publishedAt: null, ageDays: null, quarantined: false, error: null,
|
|
293
|
+
};
|
|
294
|
+
rows.push(row);
|
|
295
|
+
|
|
296
|
+
let packument;
|
|
297
|
+
try {
|
|
298
|
+
packument = await options.lookup(name);
|
|
299
|
+
} catch (e) {
|
|
300
|
+
row.error = e.message;
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
row.wanted = resolveWanted(spec, packument.versions);
|
|
305
|
+
row.latest = packument.latest
|
|
306
|
+
|| resolveWanted('*', packument.versions);
|
|
307
|
+
if (current) {
|
|
308
|
+
row.patchTarget = highestWithin(packument.versions, current, 'patch');
|
|
309
|
+
row.minorTarget = highestWithin(packument.versions, current, 'minor');
|
|
310
|
+
row.bump = row.latest ? classifyBump(current, row.latest) : null;
|
|
311
|
+
}
|
|
312
|
+
row.time = packument.time;
|
|
313
|
+
|
|
314
|
+
// Quarantine display: how fresh is the latest release?
|
|
315
|
+
const publishedAt = packument.time?.[row.latest];
|
|
316
|
+
if (publishedAt) {
|
|
317
|
+
row.publishedAt = new Date(publishedAt);
|
|
318
|
+
row.ageDays = Math.floor((now - row.publishedAt.getTime()) / DAY_MS);
|
|
319
|
+
row.quarantined = minAge > 0 && row.ageDays < minAge && installed !== row.latest;
|
|
320
|
+
}
|
|
321
|
+
})));
|
|
322
|
+
|
|
323
|
+
// Only rows needing attention, prod before dev, alpha within group
|
|
324
|
+
const rank = { prod: 0, dev: 1 };
|
|
325
|
+
const attention = rows
|
|
326
|
+
.filter((row) => row.error || (row.latest && row.latest !== row.current) || (row.installed && row.current && row.installed !== row.current))
|
|
327
|
+
.sort((a, b) => (rank[a.group] - rank[b.group]) || a.name.localeCompare(b.name));
|
|
328
|
+
|
|
329
|
+
locals.sort((a, b) => a.name.localeCompare(b.name));
|
|
330
|
+
|
|
331
|
+
return { project: manifest.name || path.basename(dir), rows: attention, locals };
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Pick the updates an --apply run installs. Default tier is MINOR (highest
|
|
336
|
+
* same-major — npu's non-breaking lane); --major unlocks latest. A target
|
|
337
|
+
* published < minAge days ago is HELD (quarantine) unless already installed.
|
|
338
|
+
* @param {object[]} rows - buildUpdateReport rows
|
|
339
|
+
* @param {object} [options]
|
|
340
|
+
* @param {boolean} [options.major] - allow breaking jumps to latest
|
|
341
|
+
* @param {number} [options.minAge] - quarantine threshold in days (0 disables)
|
|
342
|
+
* @param {number} [options.now] - clock (injectable)
|
|
343
|
+
* @returns {{ updates: object[], quarantined: object[], majorsHeld: object[] }}
|
|
344
|
+
*/
|
|
345
|
+
function selectUpdates(rows, options = {}) {
|
|
346
|
+
const minAge = options.minAge ?? DEFAULT_MIN_AGE_DAYS;
|
|
347
|
+
const now = options.now ?? Date.now();
|
|
348
|
+
|
|
349
|
+
const updates = [];
|
|
350
|
+
const quarantined = [];
|
|
351
|
+
const majorsHeld = [];
|
|
352
|
+
|
|
353
|
+
for (const row of rows) {
|
|
354
|
+
if (row.error || !row.current) continue;
|
|
355
|
+
|
|
356
|
+
const target = options.major ? row.latest : row.minorTarget;
|
|
357
|
+
if (!target || compareVersions(target, row.current) <= 0) {
|
|
358
|
+
// Nothing applicable in-tier; note the held major so the human sees it
|
|
359
|
+
if (!options.major && row.bump === 'major' && row.latest !== row.installed) {
|
|
360
|
+
majorsHeld.push({ name: row.name, from: row.current, to: row.latest });
|
|
361
|
+
}
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// Quarantine the TARGET version by its own publish age
|
|
366
|
+
const publishedAt = row.time?.[target];
|
|
367
|
+
const ageDays = publishedAt ? Math.floor((now - new Date(publishedAt).getTime()) / DAY_MS) : null;
|
|
368
|
+
if (minAge > 0 && ageDays !== null && ageDays < minAge && row.installed !== target) {
|
|
369
|
+
quarantined.push({ name: row.name, from: row.current, to: target, ageDays });
|
|
370
|
+
continue;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
updates.push({ name: row.name, group: row.group, from: row.current, to: target, bump: classifyBump(row.current, target) });
|
|
374
|
+
|
|
375
|
+
if (!options.major && row.bump === 'major' && row.latest !== target) {
|
|
376
|
+
majorsHeld.push({ name: row.name, from: row.current, to: row.latest });
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
return { updates, quarantined, majorsHeld };
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Whether npu (node-power-user — the Socket-firewalled npm wrapper) exists
|
|
385
|
+
* on this machine.
|
|
386
|
+
* @param {object} [options]
|
|
387
|
+
* @param {function} [options.execFn] - injectable exec
|
|
388
|
+
* @returns {boolean}
|
|
389
|
+
*/
|
|
390
|
+
function detectNpu(options = {}) {
|
|
391
|
+
const execFn = options.execFn || ((cmd, opts) => execSync(cmd, opts));
|
|
392
|
+
try {
|
|
393
|
+
execFn('npu --version', { stdio: ['ignore', 'pipe', 'ignore'] });
|
|
394
|
+
return true;
|
|
395
|
+
} catch (e) {
|
|
396
|
+
return false;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
/**
|
|
401
|
+
* Build the install command(s) for a selected update set — one per dep group
|
|
402
|
+
* (npm relocates a dev dep to dependencies without --save-dev). Installs run
|
|
403
|
+
* through `npu install` when npu exists (Socket supply-chain firewall);
|
|
404
|
+
* otherwise plain `npm install` (the caller warns loudly).
|
|
405
|
+
*
|
|
406
|
+
* The @omega.js family rides its own command per group, with `--save-exact`
|
|
407
|
+
* (#794): npm's default save-prefix writes `^<version>`, so the one verb that
|
|
408
|
+
* is ALLOWED to move a brand would have un-pinned the family it just moved.
|
|
409
|
+
* Everything else keeps npm's default prefix — the pin is the family's rule,
|
|
410
|
+
* not a rule for the whole dependency tree.
|
|
411
|
+
* @param {object[]} updates - selectUpdates().updates
|
|
412
|
+
* @param {object} options
|
|
413
|
+
* @param {boolean} options.hasNpu
|
|
414
|
+
* @returns {Array<{ command: string, group: string }>}
|
|
415
|
+
*/
|
|
416
|
+
function buildInstallCommands(updates, options) {
|
|
417
|
+
const bin = options.hasNpu ? 'npu install' : 'npm install';
|
|
418
|
+
const commands = [];
|
|
419
|
+
|
|
420
|
+
for (const [group, flag] of [['prod', ''], ['dev', ' --save-dev']]) {
|
|
421
|
+
const inGroup = updates.filter((update) => update.group === group);
|
|
422
|
+
|
|
423
|
+
for (const [family, extra] of [[false, ''], [true, ' --save-exact']]) {
|
|
424
|
+
const specs = inGroup
|
|
425
|
+
.filter((update) => update.name.startsWith('@omega.js/') === family)
|
|
426
|
+
.map((update) => `${update.name}@${update.to}`);
|
|
427
|
+
if (specs.length > 0) {
|
|
428
|
+
commands.push({ command: `${bin} ${specs.join(' ')}${flag}${extra}`, group });
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
return commands;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
/**
|
|
437
|
+
* Render the report as plain padded-table lines (framework wrappers print
|
|
438
|
+
* them through their own logger; no color dependency in the shared core).
|
|
439
|
+
* @param {{ project: string, rows: object[], locals: object[] }} report
|
|
440
|
+
* @param {object} [options]
|
|
441
|
+
* @param {number} [options.minAge]
|
|
442
|
+
* @returns {string[]}
|
|
443
|
+
*/
|
|
444
|
+
function formatReport(report, options = {}) {
|
|
445
|
+
const minAge = options.minAge ?? DEFAULT_MIN_AGE_DAYS;
|
|
446
|
+
const lines = [];
|
|
447
|
+
|
|
448
|
+
if (report.rows.length === 0) {
|
|
449
|
+
lines.push('All registry dependencies are up to date.');
|
|
450
|
+
} else {
|
|
451
|
+
const header = ['Package', 'Group', 'Current', 'Installed', 'Wanted', 'Latest', 'Bump', 'Released', 'Status'];
|
|
452
|
+
const body = report.rows.map((row) => {
|
|
453
|
+
const released = row.publishedAt
|
|
454
|
+
? `${row.publishedAt.toISOString().split('T')[0]} (${row.ageDays}d)`
|
|
455
|
+
: '-';
|
|
456
|
+
const status = row.error ? `lookup failed: ${row.error}`
|
|
457
|
+
: row.quarantined ? 'QUARANTINED'
|
|
458
|
+
: '';
|
|
459
|
+
return [
|
|
460
|
+
row.name, row.group, row.current || '-', row.installed || '-',
|
|
461
|
+
row.wanted || '-', row.latest || '-', row.bump || '-', released, status,
|
|
462
|
+
];
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
const widths = header.map((cell, index) => Math.max(cell.length, ...body.map((cells) => String(cells[index]).length)));
|
|
466
|
+
const render = (cells) => cells.map((cell, index) => String(cell).padEnd(widths[index])).join(' ').trimEnd();
|
|
467
|
+
lines.push(render(header));
|
|
468
|
+
lines.push(widths.map((width) => '-'.repeat(width)).join(' '));
|
|
469
|
+
for (const cells of body) lines.push(render(cells));
|
|
470
|
+
|
|
471
|
+
if (report.rows.some((row) => row.quarantined)) {
|
|
472
|
+
lines.push(`QUARANTINED = latest published < ${minAge} days ago (held from --apply; --min-age 0 or --force-fresh overrides)`);
|
|
473
|
+
}
|
|
474
|
+
if (report.rows.some((row) => row.bump === 'major')) {
|
|
475
|
+
lines.push('major = breaking — never auto-applied (explicit --major opt-in)');
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
for (const local of report.locals) {
|
|
480
|
+
lines.push(`skipped ${local.name} (${local.spec}) — local spec, no registry story`);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
return lines;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* The one verb body every wrapper calls: report (default), then apply when
|
|
488
|
+
* asked. Flags mirror npu: --apply, --major, --min-age N (default 7, 0
|
|
489
|
+
* disables), --force-fresh (alias for --min-age 0).
|
|
490
|
+
* @param {object} [options]
|
|
491
|
+
* @param {string} [options.dir] - target directory (default cwd)
|
|
492
|
+
* @param {string[]} [options.only] - check just these package names (#794)
|
|
493
|
+
* @param {boolean} [options.apply] - install the selected set
|
|
494
|
+
* @param {boolean} [options.major] - allow breaking jumps (with --apply)
|
|
495
|
+
* @param {number} [options.minAge] - quarantine threshold in days
|
|
496
|
+
* @param {boolean} [options.forceFresh] - disable the age quarantine
|
|
497
|
+
* @param {object} [options.logger] - logger with log/warn (default console)
|
|
498
|
+
* @param {function} [options.lookup] - injectable registry lookup (tests)
|
|
499
|
+
* @param {function} [options.execFn] - injectable exec (tests)
|
|
500
|
+
* @param {number} [options.now] - injectable clock (tests)
|
|
501
|
+
* @param {boolean} [options.hasNpu] - injectable npu detection (tests)
|
|
502
|
+
* @returns {Promise<{ report: object, selection: object|null, commands: object[] }>}
|
|
503
|
+
*/
|
|
504
|
+
async function runUpdate(options = {}) {
|
|
505
|
+
const dir = options.dir || process.cwd();
|
|
506
|
+
const logger = options.logger || console;
|
|
507
|
+
const now = options.now ?? Date.now();
|
|
508
|
+
const minAge = options.forceFresh ? 0 : Number(options.minAge ?? DEFAULT_MIN_AGE_DAYS);
|
|
509
|
+
const lookup = options.lookup || ((name) => fetchPackument(name));
|
|
510
|
+
|
|
511
|
+
const report = await buildUpdateReport({ dir, lookup, now, minAge, only: options.only });
|
|
512
|
+
logger.log(`Dependency report for ${report.project}:`);
|
|
513
|
+
for (const line of formatReport(report, { minAge })) logger.log(line);
|
|
514
|
+
|
|
515
|
+
if (!options.apply) {
|
|
516
|
+
if (report.rows.length > 0) {
|
|
517
|
+
logger.log('Report only — `omega update --apply` installs the non-quarantined, non-breaking set (--major for breaking).');
|
|
518
|
+
}
|
|
519
|
+
return { report, selection: null, commands: [] };
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
const selection = selectUpdates(report.rows, { major: options.major, minAge, now });
|
|
523
|
+
|
|
524
|
+
for (const held of selection.quarantined) {
|
|
525
|
+
logger.warn(`held ${held.name}@${held.to} — published ${held.ageDays}d ago (< ${minAge}d quarantine)`);
|
|
526
|
+
}
|
|
527
|
+
for (const held of selection.majorsHeld) {
|
|
528
|
+
logger.warn(`held ${held.name} ${held.from} → ${held.to} — major (breaking); re-run with --major to include`);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
if (selection.updates.length === 0) {
|
|
532
|
+
logger.log('Nothing to apply.');
|
|
533
|
+
return { report, selection, commands: [] };
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
const hasNpu = options.hasNpu ?? detectNpu({ execFn: options.execFn });
|
|
537
|
+
if (!hasNpu) {
|
|
538
|
+
logger.warn('npu (node-power-user) is NOT on this machine — installing via plain `npm install`, WITHOUT the Socket supply-chain firewall.');
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
const commands = buildInstallCommands(selection.updates, { hasNpu });
|
|
542
|
+
const execFn = options.execFn || ((cmd, opts) => execSync(cmd, opts));
|
|
543
|
+
for (const entry of commands) {
|
|
544
|
+
logger.log(`Running: ${entry.command}`);
|
|
545
|
+
execFn(entry.command, { cwd: dir, stdio: 'inherit' });
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
logger.log(`Applied ${selection.updates.length} update(s).`);
|
|
549
|
+
return { report, selection, commands };
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
module.exports = {
|
|
553
|
+
DEFAULT_MIN_AGE_DAYS,
|
|
554
|
+
parseVersion,
|
|
555
|
+
compareVersions,
|
|
556
|
+
classifyBump,
|
|
557
|
+
isRegistrySpec,
|
|
558
|
+
cleanSpec,
|
|
559
|
+
resolveWanted,
|
|
560
|
+
highestWithin,
|
|
561
|
+
findInstalledVersion,
|
|
562
|
+
fetchPackument,
|
|
563
|
+
buildUpdateReport,
|
|
564
|
+
selectUpdates,
|
|
565
|
+
detectNpu,
|
|
566
|
+
buildInstallCommands,
|
|
567
|
+
formatReport,
|
|
568
|
+
runUpdate,
|
|
569
|
+
};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Affiliatizer — affiliate-link redirects on matched sites
|
|
2
|
+
|
|
3
|
+
The content script rewrites a visit to a partner site into an affiliate URL for
|
|
4
|
+
that partner, so purchases made after the redirect carry a referral credit. It is
|
|
5
|
+
part of the extension framework's monetization surface, alongside the
|
|
6
|
+
house/company verts lane ([docs/verts.md](verts.md)).
|
|
7
|
+
|
|
8
|
+
**Whose credit:** the partner map is a fixed module constant in the framework
|
|
9
|
+
source — it is not brand config, and every consumer brand ships the identical
|
|
10
|
+
list of referral links, which are the FRAMEWORK AUTHOR's. A brand cannot
|
|
11
|
+
currently substitute its own codes; per-brand configurability is tracked as
|
|
12
|
+
[#147](https://github.com/Omega-JS-Stack/omega/issues/147). The store-listing
|
|
13
|
+
disclosure (below) is written in the brand's voice, while the commission it
|
|
14
|
+
discloses is the framework author's.
|
|
15
|
+
|
|
16
|
+
Source: [src/lib/affiliatizer.js](../src/lib/affiliatizer.js), initialized by the
|
|
17
|
+
content-script Manager ([src/content.js](../src/content.js)).
|
|
18
|
+
|
|
19
|
+
## Mechanism
|
|
20
|
+
|
|
21
|
+
1. The content script runs on the visited page and hands the Manager to
|
|
22
|
+
`Affiliatizer.initialize(Manager)`.
|
|
23
|
+
2. The page's `window.location.hostname` is tested against each entry's `match`
|
|
24
|
+
regex in the module's `map` — a hardcoded constant, identical in every build.
|
|
25
|
+
3. On a match, the entry's `replace` is applied to a copy of the current URL —
|
|
26
|
+
`href` (replace the whole URL, what every shipped entry uses), `pathname`, or
|
|
27
|
+
`query` (set individual search params).
|
|
28
|
+
4. The visit timestamp is recorded per partner id in `chrome.storage.local`, and
|
|
29
|
+
the tab is redirected to the built URL (`window.location.href = …`).
|
|
30
|
+
|
|
31
|
+
The shipped map covers Amazon, Factor, Honeygain, JumpTask, Pawns, Capital One
|
|
32
|
+
Shopping, Coupert, Honey, Lolli, PayPal, Rakuten, Upside, and NordVPN. `Affiliatizer.get()`
|
|
33
|
+
returns it; the build-layer suite
|
|
34
|
+
([src/test/suites/build/affiliatizer.test.js](../src/test/suites/build/affiliatizer.test.js))
|
|
35
|
+
pins the map's shape — unique ids, a RegExp `match`, and a parseable URL on every
|
|
36
|
+
entry that carries a `replace.href` (entries without one are not checked).
|
|
37
|
+
|
|
38
|
+
## Default-on, and the storage flag
|
|
39
|
+
|
|
40
|
+
There is nothing to enable: the content script initializes the Affiliatizer on
|
|
41
|
+
every page it runs on, and the resolved status defaults to `allow` when
|
|
42
|
+
`chrome.storage.local`'s `affiliatizer` key holds no status. The same key doubles
|
|
43
|
+
as the per-partner visit ledger:
|
|
44
|
+
|
|
45
|
+
| Value of `affiliatizer` in `chrome.storage.local` | Meaning |
|
|
46
|
+
|---|---|
|
|
47
|
+
| absent / `null` | Default — redirects are active, no partner visited yet |
|
|
48
|
+
| `'block'` | Redirects are off for this browser profile |
|
|
49
|
+
| `'allow'` | Redirects are active (the explicit form of the default) |
|
|
50
|
+
| `{ <partnerId>: { timestamp } }` | The per-partner ledger of the last redirect |
|
|
51
|
+
|
|
52
|
+
## The 24-hour per-site dedupe
|
|
53
|
+
|
|
54
|
+
Before redirecting, the entry's recorded `timestamp` is compared against now: if
|
|
55
|
+
the last redirect for THAT partner was under 24 hours ago, the visit is left
|
|
56
|
+
alone. So a partner site redirects at most once a day per browser profile, and a
|
|
57
|
+
user who navigates back into the site keeps browsing normally.
|
|
58
|
+
|
|
59
|
+
## The query-string control
|
|
60
|
+
|
|
61
|
+
Append `?affiliatizerStatus=<value>` to any URL the content script runs on:
|
|
62
|
+
|
|
63
|
+
| Value | Effect |
|
|
64
|
+
|---|---|
|
|
65
|
+
| `block` | Writes `affiliatizer: 'block'` — no further redirects |
|
|
66
|
+
| `allow` | Writes `affiliatizer: 'allow'` — redirects active again |
|
|
67
|
+
| `reset` | Clears the key, dropping both the status and the 24-hour ledger |
|
|
68
|
+
|
|
69
|
+
Each control also logs through the content Manager's logger, so the state change
|
|
70
|
+
is visible in the page console.
|
|
71
|
+
|
|
72
|
+
## Store-listing disclosure
|
|
73
|
+
|
|
74
|
+
The scaffolded store description carries the affiliate disclosure — the closing
|
|
75
|
+
lines of [src/defaults/config/description.md](../src/defaults/config/description.md)
|
|
76
|
+
name the partners and say "we may earn an affiliate commission" in the brand's
|
|
77
|
+
voice — while the links are the framework's and the commission is the framework
|
|
78
|
+
author's ([#147](https://github.com/Omega-JS-Stack/omega/issues/147)). A consumer
|
|
79
|
+
editing its `config/description.md` keeps that disclosure: Chrome Web Store and
|
|
80
|
+
Firefox AMO both require monetization to be disclosed in the listing. Publishing
|
|
81
|
+
details: [docs/publishing.md](publishing.md).
|