@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,291 @@
|
|
|
1
|
+
# Translation
|
|
2
|
+
|
|
3
|
+
AI translation for OMEGA consumers — one engine, config-driven, with a
|
|
4
|
+
**committed** per-string cache. Shipped cp96 (Ian directive 2026-07-11),
|
|
5
|
+
replacing both legacy systems: UJM's OpenAI-only gulp task with the
|
|
6
|
+
`cache-uj-translation` GitHub-branch cache, and BXM's Claude-only task with a
|
|
7
|
+
gitignored `.cache/` (which re-translated everything on any change and on
|
|
8
|
+
every fresh clone).
|
|
9
|
+
|
|
10
|
+
## Config (shared `translation` section of omega.json5)
|
|
11
|
+
|
|
12
|
+
```json5
|
|
13
|
+
translation: {
|
|
14
|
+
enabled: true, // optional master switch (default true)
|
|
15
|
+
default: 'en', // source language (default 'en')
|
|
16
|
+
languages: ['es', 'fr'],// target codes — EMPTY/ABSENT = translation off
|
|
17
|
+
providers: { claude: {} },// the engine is a KEY (#425): claude | chatgpt. Absent block = claude
|
|
18
|
+
model: null, // optional override for the chosen engine (claude → 'sonnet' alias, chatgpt → 'gpt-5.4-nano')
|
|
19
|
+
exclude: [], // web only: BRAND page routes/folders to skip (the framework's own default pages are already excluded — #605)
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Shared section (typically brand-level; `SHARED_SECTIONS` includes it, so
|
|
24
|
+
every target inherits it through the merge chain). Language codes
|
|
25
|
+
validate against the SSOT in `@omega.js/devkit/translate` (`LANGUAGE_NAMES`,
|
|
26
|
+
~32 codes) — an unknown code is a hard config error naming the supported set.
|
|
27
|
+
The same SSOT carries `LANGUAGE_LOCALES` + `ogLocale(code)`, the one code →
|
|
28
|
+
Open Graph `language_TERRITORY` map (`es` → `es_ES`).
|
|
29
|
+
|
|
30
|
+
## Providers
|
|
31
|
+
|
|
32
|
+
| Provider | Rides | Credentials |
|
|
33
|
+
|----------|-------|-------------|
|
|
34
|
+
| `claude` (default) | the locally-installed Claude Code via `@anthropic-ai/claude-agent-sdk` | **none** — local auth |
|
|
35
|
+
| `chatgpt` | OpenAI Responses API (native fetch) | `OPENAI_API_KEY` via the .env cascade |
|
|
36
|
+
|
|
37
|
+
The claude provider runs **hermetic** sessions: `settingSources: []` (no user
|
|
38
|
+
CLAUDE.md/hooks — they pollute mechanical output; a stop-hook reply actually
|
|
39
|
+
leaked into a canary before this was locked down), a custom translator system
|
|
40
|
+
prompt instead of the CLI persona, and NO `maxTurns` cap (a plain reply
|
|
41
|
+
already counts as the final turn — `maxTurns: 1` reports `error_max_turns`
|
|
42
|
+
even though the text arrived).
|
|
43
|
+
|
|
44
|
+
**Enabling translation on web means installing the SDK (#37).** `@omega.js/web`
|
|
45
|
+
does NOT ship `@anthropic-ai/claude-agent-sdk`: translation is opt-in and the
|
|
46
|
+
SDK is heavy, so a web brand that turns it on installs it in the target itself
|
|
47
|
+
(`npm install @anthropic-ai/claude-agent-sdk`); `@omega.js/extension` still
|
|
48
|
+
declares it. The SDK is lazy-required at the first claude call, so a brand
|
|
49
|
+
without translation never pays for it, and a brand that enabled translation
|
|
50
|
+
without the SDK gets a hard error naming the package and that install command,
|
|
51
|
+
never a silent skip. The `chatgpt` provider needs no SDK at all (native fetch
|
|
52
|
+
plus `OPENAI_API_KEY`).
|
|
53
|
+
|
|
54
|
+
**The manage cycle provisions it (#168).** Nobody types that install in a
|
|
55
|
+
managed brand: the manager's workspace service reconciles it like every other
|
|
56
|
+
brand file. A web app whose RESOLVED config translates with the `claude`
|
|
57
|
+
provider gets `@anthropic-ai/claude-agent-sdk` written into its package.json
|
|
58
|
+
`dependencies` (at the range `@omega.js/web` declares as its optional peer,
|
|
59
|
+
read from the installed web package), followed by one `npm install` at the
|
|
60
|
+
brand root. Converge-to-config, so: already declared (in `dependencies` or
|
|
61
|
+
`devDependencies`) = zero-mutation no-op that never overwrites a
|
|
62
|
+
consumer-chosen spec, `--dry-run` plans without writing, translation off or
|
|
63
|
+
provider `chatgpt` leaves the target untouched, and turning translation back OFF
|
|
64
|
+
never REMOVES the dep (uninstalling on a config flip is riskier than leaving
|
|
65
|
+
it). Only web targets are provisioned, since backend and extension declare the
|
|
66
|
+
SDK as a real dependency of the framework. The loud error above stays the backstop
|
|
67
|
+
for hand-managed brands (`packages/manager/src/services/workspace/ensure/translation-sdk.js`,
|
|
68
|
+
pinned by `packages/manager/test/workspace-translation-sdk.test.js`).
|
|
69
|
+
|
|
70
|
+
## Engine protocol (`@omega.js/devkit/translate`)
|
|
71
|
+
|
|
72
|
+
`translateStrings({ strings, language, languageName, brand, extraRules, send })`
|
|
73
|
+
→ positionally-aligned translations:
|
|
74
|
+
|
|
75
|
+
- **JSON array in → same-length JSON array out**, batches of 25.
|
|
76
|
+
- **Batches fly concurrently**, `CONCURRENCY` wide (the constant at the top of
|
|
77
|
+
`packages/devkit/src/translate/engine.js`, currently 5 —
|
|
78
|
+
[#604](https://github.com/Omega-JS-Stack/omega/issues/604)). A batch is one
|
|
79
|
+
model call and the model's latency dominates it, so a serial pass paid that
|
|
80
|
+
latency once per 25 strings and one language took minutes it never needed.
|
|
81
|
+
Results are stitched back in BATCH order, never completion order, and
|
|
82
|
+
everything below still happens per batch, unchanged. Raise it only as far as
|
|
83
|
+
the providers' rate limits allow.
|
|
84
|
+
- **Duplicates are deduped before batching** ([#529](https://github.com/Omega-JS-Stack/omega/issues/529)):
|
|
85
|
+
a page sends its title and description once per meta tag (`<title>`,
|
|
86
|
+
`og:title`, `twitter:title`), so the same string used to ride a batch three
|
|
87
|
+
times over — three times the AI spend, and adjacent twins are what a model
|
|
88
|
+
merges. Each unique string is translated ONCE and the translation is fanned
|
|
89
|
+
back to every occurrence. Occurrences key on the exact source string,
|
|
90
|
+
whitespace included, so a batch is 25 UNIQUE strings.
|
|
91
|
+
- The `OMEGA-TRANSLATION-CONTROL` sentinel is appended to EVERY batch and must
|
|
92
|
+
return unchanged at its exact position — alignment proof per batch.
|
|
93
|
+
- Validation failures (parse, length, sentinel) retry up to 2× then throw.
|
|
94
|
+
- An ALIGNMENT failure (length or sentinel) that survives the retries splits the
|
|
95
|
+
batch in half and re-asks each half, down to one string
|
|
96
|
+
([#523](https://github.com/Omega-JS-Stack/omega/issues/523)): a model that
|
|
97
|
+
merges a pair of strings does it every time, so retrying the same array can
|
|
98
|
+
only fail the same way — the playground's ship-the-docs page came back
|
|
99
|
+
25-for-26 on all six attempts, in both languages, and shipped untranslated.
|
|
100
|
+
A single string that still will not come back whole throws, and the caller
|
|
101
|
+
skips that page-language pair whole (never half-translated).
|
|
102
|
+
- Original leading/trailing whitespace is re-applied to every translation.
|
|
103
|
+
- Rules baked into the system prompt: preserve HTML/URLs/placeholders
|
|
104
|
+
(`$1`, `{name}`, `{{ value }}`), never translate the brand name.
|
|
105
|
+
|
|
106
|
+
## The committed cache (`<app>/translations/`)
|
|
107
|
+
|
|
108
|
+
`translations/{lang}/{namespace}.json` maps `sha256(source)[:12]` → translated
|
|
109
|
+
string. Committed to git — that's the whole point:
|
|
110
|
+
|
|
111
|
+
- **Incremental**: editing one source string changes one hash → exactly one
|
|
112
|
+
re-translation. Everything else is a cache hit (zero provider calls).
|
|
113
|
+
- **Survives clones/CI**: a warm cache builds a fully-translated site with NO
|
|
114
|
+
AI credentials (kills the BXM parked finding where fresh clones burned live
|
|
115
|
+
Claude calls).
|
|
116
|
+
- **Human-overridable**: hand-edit a translation VALUE in the cache file and
|
|
117
|
+
it sticks for as long as the source is unchanged (the value is the
|
|
118
|
+
translation; the key only changes when the SOURCE changes).
|
|
119
|
+
- Maps are pruned to the current source set on save — no stale entries.
|
|
120
|
+
|
|
121
|
+
`@omega.js/web` ships a second cache in exactly this shape for its OWN default
|
|
122
|
+
pages, inside the package ([below](#framework-shipped-default-page-translations-621)).
|
|
123
|
+
|
|
124
|
+
## Web (`@omega.js/web`)
|
|
125
|
+
|
|
126
|
+
`omega build` translates everything by default (Ian's #24 final call): warm
|
|
127
|
+
strings come from the committed cache instantly, cold strings translate live
|
|
128
|
+
through the provider — a build ships the COMPLETE translated site whenever
|
|
129
|
+
the provider delivers, and a warm cache means zero provider calls. A provider
|
|
130
|
+
FAILURE skips that page-language pair whole, warning loudly with the page and
|
|
131
|
+
the language (the build still exits 0): no half-translated copy ever ships
|
|
132
|
+
behind full language chrome.
|
|
133
|
+
`omega build --cached-only` skips cold page-language pairs WHOLE instead (no
|
|
134
|
+
mixed-language copies, hreflang stays honest; the warning lists them) for
|
|
135
|
+
provider-free builds.
|
|
136
|
+
`omega translate` still runs the live pass standalone against an existing
|
|
137
|
+
dist/ and exits 1 on failures. `OMEGA_TRANSLATE_ONLY=<route>` limits any of
|
|
138
|
+
these to one page (canary/debug).
|
|
139
|
+
|
|
140
|
+
Per page × language: text nodes/`<title>`/meta/attribute copy translate
|
|
141
|
+
(cache-first), then the copy lands at `dist/{lang}/...` with `<html lang dir>`
|
|
142
|
+
(RTL-aware), canonical + `og:url` + `og:locale` localized, internal links
|
|
143
|
+
rewritten to `/{lang}/...`, and hreflang + `og:locale:alternate` tags
|
|
144
|
+
stitched into BOTH the copy and the original — naming only the languages
|
|
145
|
+
actually PRODUCED for that page (a pair skipped cold or failed is never
|
|
146
|
+
advertised, on the copies as on the originals), so hreflang never lies.
|
|
147
|
+
`og:locale` carries Open Graph's `language_TERRITORY` form (`en_US`,
|
|
148
|
+
`es_ES`) from the devkit language SSOT's locale map — on translated copies
|
|
149
|
+
and on the source pages the head include renders. Cache namespace:
|
|
150
|
+
`pages/{route}` (`pages/home` for `/`).
|
|
151
|
+
|
|
152
|
+
On a site served under a base path ([#355](https://github.com/Omega-JS-Stack/omega/issues/355)),
|
|
153
|
+
link rewriting composes **prefix, then language**: the pass reads the mount
|
|
154
|
+
point off the `<html data-omega-path-prefix>` stamp the build wrote (so
|
|
155
|
+
`omega translate` standalone sees it too), takes the route from underneath it,
|
|
156
|
+
and mounts the language segment after it — `/workkit/es/pricing`, never
|
|
157
|
+
`/es/workkit/pricing` ([#359](https://github.com/Omega-JS-Stack/omega/issues/359)).
|
|
158
|
+
Exclusions are matched on that same underneath-the-prefix route. ABSOLUTE URLs
|
|
159
|
+
(canonical, `og:url`, hreflang alternates, the sitemap entries) are built from
|
|
160
|
+
`brand.url`, which for a mounted site already carries the path — nothing
|
|
161
|
+
prefixes them twice.
|
|
162
|
+
|
|
163
|
+
Never sent to the PROVIDER, and the framework owns the list
|
|
164
|
+
([#605](https://github.com/Omega-JS-Stack/omega/issues/605)): every one of its
|
|
165
|
+
OWN default pages whose layout says it is plumbing rather than marketing copy —
|
|
166
|
+
the auth flows, the `/app` shell, the account/payment/portal screens, the legal
|
|
167
|
+
boilerplate, `404`, and the redirect stubs (`/login`, `/account`, `/cancel`, …).
|
|
168
|
+
Those pages still get their `/{lang}/` copies — from the translations PACKAGED
|
|
169
|
+
with `@omega.js/web`, at no cost to the brand (next section).
|
|
170
|
+
The list is DERIVED from the packaged defaults tree
|
|
171
|
+
(`packages/web/defaults/pages/**`, read by `src/translate/default-routes.js`),
|
|
172
|
+
never typed out, so a default page that moves or arrives cannot drift out of it,
|
|
173
|
+
and each excluded route guards its subtree too. On top of that: socials
|
|
174
|
+
redirects (config `socials` keys), the `admin`/`test`/`team`/`updates` folders,
|
|
175
|
+
every known language-code folder, plus config `translation.exclude` — which is
|
|
176
|
+
for the BRAND's own pages, and only those. A brand that lists `signin` or
|
|
177
|
+
`account` is listing something the framework already skips.
|
|
178
|
+
Element opt-out: `data-omega-no-translate`. Collector fixes vs UJM:
|
|
179
|
+
`aria-describedby`/`aria-labelledby` are NOT collected (ID refs), `value`
|
|
180
|
+
only on button-type inputs (hidden-input tokens stay intact).
|
|
181
|
+
|
|
182
|
+
### Framework-shipped default-page translations ([#621](https://github.com/Omega-JS-Stack/omega/issues/621))
|
|
183
|
+
|
|
184
|
+
The default pages above render the SAME chrome on every brand, so the framework
|
|
185
|
+
translates them ONCE and ships the result: `packages/web/translations/{lang}/pages/{route}.json`,
|
|
186
|
+
the identical `{lang}/{namespace}.json` shape as a consumer's own cache (same
|
|
187
|
+
loader, same `sha256(source)[:12]` keys, same prune-on-save, hand-fixable the
|
|
188
|
+
same way), committed to the package and published under `files`.
|
|
189
|
+
|
|
190
|
+
The keys are brand-NEUTRAL. The generator renders with a fixture brand and
|
|
191
|
+
replaces every occurrence of it with the sentinel `__OMEGA_BRAND__` before
|
|
192
|
+
hashing; the read-through replaces the CONSUMER's `brand.name` with the same
|
|
193
|
+
token before the lookup and puts it back on the way out, so "Sign in to MiniCo"
|
|
194
|
+
and "Sign in to Acme" are one packaged entry (`src/translate/packaged-defaults.js`).
|
|
195
|
+
|
|
196
|
+
Consumer side, on every pass — `omega build`, `--cached-only`, `omega translate`
|
|
197
|
+
alike, since it never touches a provider:
|
|
198
|
+
|
|
199
|
+
- Each default route gets its `dist/{lang}/…` copy with the same localized
|
|
200
|
+
chrome, hreflang and sitemap entry as any other page. Link rewriting is the
|
|
201
|
+
same pass too, which means links OUT to brand pages gain the language segment
|
|
202
|
+
while links between two default routes (signin → signup) do not — those routes
|
|
203
|
+
are excluded from rewriting, and that is unchanged from #605.
|
|
204
|
+
- A string the package does not carry (copy the brand overrode, a page the
|
|
205
|
+
framework has not regenerated for) stays in the source language and is
|
|
206
|
+
COUNTED — one log line per route names the miss count. Never guessed at.
|
|
207
|
+
- A brand whose NAME is a word the chrome itself uses ("Sign") still gets every
|
|
208
|
+
string that does not interpolate the brand — the lookup falls back to the raw
|
|
209
|
+
key when the sentinel-normalized one misses. The strings that DO interpolate
|
|
210
|
+
it (`Sign in to Sign`) miss, and stay in the source language.
|
|
211
|
+
- A route the package carries nothing for gets NO copy, so hreflang keeps
|
|
212
|
+
telling the truth. That is how the legal boilerplate stays one language:
|
|
213
|
+
`terms`/`privacy`/`cookies` are deliberately not generated.
|
|
214
|
+
- A configured language the package does not ship is one log line for the whole
|
|
215
|
+
run, not an error — those routes stay in the source language.
|
|
216
|
+
- A route the brand named in `translation.exclude` is left alone entirely.
|
|
217
|
+
|
|
218
|
+
**Shipped set: `es`, `fa`.** Regenerating, or extending the set, is one command
|
|
219
|
+
in `packages/web` (the ONLY place the framework's own pages ever reach a
|
|
220
|
+
provider):
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
npm run translate:defaults # the shipped set
|
|
224
|
+
npm run translate:defaults -- --languages es,fa,de # …plus a new one
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
It renders the defaults tree through the real production build against a
|
|
228
|
+
throwaway consumer (no brand repo involved), harvests with the same collector
|
|
229
|
+
the pass uses, translates ONLY the strings the packaged cache is missing —
|
|
230
|
+
across all routes at once, so the header/footer chrome every default page
|
|
231
|
+
repeats is paid for exactly once — and writes the files back. Idempotent: a
|
|
232
|
+
re-run costs nothing, adding a language costs only that language. A provider
|
|
233
|
+
failure, or a translation that dropped the sentinel, STOPS the run and writes
|
|
234
|
+
nothing.
|
|
235
|
+
|
|
236
|
+
`dist/sitemap.xml` (emitted by the build in the source language only) is
|
|
237
|
+
rewritten afterwards so it tells the same story: every PRODUCED copy joins it
|
|
238
|
+
as its own `<url>`, and each entry of a translated set — source and copies
|
|
239
|
+
alike — carries the full `xhtml:link rel="alternate"` list (`x-default` at the
|
|
240
|
+
source language) plus the source entry's `lastmod`/`changefreq`/`priority`.
|
|
241
|
+
Entries stay in loc byte order. The language-prefixed entries are owned by that
|
|
242
|
+
pass: each run drops them all and re-emits only what it produced, so a skipped
|
|
243
|
+
or failed pair is listed nowhere.
|
|
244
|
+
|
|
245
|
+
The visitor-facing **language switcher** is the footer dropup in the shared
|
|
246
|
+
base footer include (`_includes/frontend/sections/footer.html`, the base layer
|
|
247
|
+
every theme inherits). It renders CLIENT-SIDE from the page's own
|
|
248
|
+
`link[rel="alternate"][hreflang]` tags — the produced-only SSOT above — so the
|
|
249
|
+
menu can never offer a copy that was not written: `core/js/core/language-switcher.js`
|
|
250
|
+
drops `x-default`, labels each row with its native name (`Intl.DisplayNames` in
|
|
251
|
+
that language's own locale, upper-cased code as the fallback), marks
|
|
252
|
+
`documentElement.lang` as current, and leaves the mount empty and hidden when
|
|
253
|
+
fewer than two languages exist. Selecting a language is a plain link to that
|
|
254
|
+
alternate's href — never a redirect or a negotiation.
|
|
255
|
+
|
|
256
|
+
Not here yet: no default homepage exists in the D8 set, so brand sites
|
|
257
|
+
translate their own `index` when they add one.
|
|
258
|
+
|
|
259
|
+
## Extension (`@omega.js/extension`)
|
|
260
|
+
|
|
261
|
+
Build-mode gulp `translate` task (setup/dev builds only deploy):
|
|
262
|
+
|
|
263
|
+
- **messages**: per-KEY incremental — unique `message` values without a cache
|
|
264
|
+
entry translate (CWS limits ride the prompt as extra rules; violations warn
|
|
265
|
+
with the file path to shorten). `dist/_locales/{lang}/messages.json` is
|
|
266
|
+
COMPOSED from the EN source + cache (English fallback per missing key, so
|
|
267
|
+
the file is always complete; developer `description` fields stay English).
|
|
268
|
+
- **description**: whole-document per language →
|
|
269
|
+
`translations/{lang}/description.md`, first line
|
|
270
|
+
`<!-- omega:source <hash> -->` (stripped on read; source edit →
|
|
271
|
+
re-translate). The package task ships them as store assets
|
|
272
|
+
(`packaged/assets/description/{lang}.md`).
|
|
273
|
+
|
|
274
|
+
Languages/provider come from resolved config — the old hardcoded 16-language
|
|
275
|
+
list in `gulp/config/locales.js` is gone (only the CWS `limits` remain there).
|
|
276
|
+
|
|
277
|
+
## Testing
|
|
278
|
+
|
|
279
|
+
- devkit `test/translate.test.js` — engine protocol, providers, cache,
|
|
280
|
+
language SSOT, settings reader (fake `send`).
|
|
281
|
+
- web `test/translate.test.js` — handcrafted dist through the real pipeline:
|
|
282
|
+
copies/chrome/links/exclusions/alternates/cache/override/only-filter, the
|
|
283
|
+
produced-languages-only alternates, and the loud failure skip.
|
|
284
|
+
- web `test/language-switcher.test.js` — the switcher's DOM read (x-default
|
|
285
|
+
dropped, duplicates collapsed, current marked, escaping) and the built footer
|
|
286
|
+
mount in classy and newsflash.
|
|
287
|
+
- extension `build/translate.test.js` — compose + description marker glue.
|
|
288
|
+
- Live canary (cp96, local Claude): omega-brand `/about` → es (102 strings,
|
|
289
|
+
rerun 0 calls) and the extension's 4 messages (2 unique) + 2,703-char
|
|
290
|
+
description → es, both idempotent; artifacts committed under each target's
|
|
291
|
+
`translations/`.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Dependency updates (`omega update`)
|
|
2
|
+
|
|
3
|
+
One shared implementation (`@omega.js/devkit/update`) behind every framework's `omega update` verb (aliases: `outdated`, `out` — npu's muscle memory), thin wiring in web/desktop/extension (router commands), backend (colon-style command class), and the manager (brand-root fan-out). Semantics mirror Ian's `npu out` (node-power-user): report first, apply deliberately, and never trust a brand-new release.
|
|
4
|
+
|
|
5
|
+
## The report (default — no flags)
|
|
6
|
+
|
|
7
|
+
For each dependency of the target's `package.json` (prod + dev, grouped):
|
|
8
|
+
|
|
9
|
+
| Column | Meaning |
|
|
10
|
+
|---|---|
|
|
11
|
+
| Current | the base version in `package.json` (`^1.2.3` → `1.2.3`) |
|
|
12
|
+
| Installed | the physical `node_modules` copy (nearest, climbing — npm hoists in brand monorepos) |
|
|
13
|
+
| Wanted | highest published version satisfying the range (npm-outdated semantics) |
|
|
14
|
+
| Latest | the registry `dist-tags.latest` |
|
|
15
|
+
| Bump | `patch` / `minor` / `major` — Current → Latest classification |
|
|
16
|
+
| Released | Latest's publish date + age in days |
|
|
17
|
+
| Status | `QUARANTINED` when Latest is younger than `--min-age` days (default **7**) and not already installed |
|
|
18
|
+
|
|
19
|
+
Only rows needing attention print; a fully-current tree reports one line. Rows sort prod-first.
|
|
20
|
+
|
|
21
|
+
**Quarantine (supply-chain caution, npu's `--min-age` semantics):** a release published < 7 days ago may be a compromised publish — it is flagged and **excluded from `--apply`**. `--min-age N` changes the window; `--min-age 0` or `--force-fresh` disables it. Unpublished packages (the pre-publish `@omega.js/*` set) report `not on the registry (unpublished?)` instead of a version row.
|
|
22
|
+
|
|
23
|
+
**`file:`/`link:`/git specs are SKIPPED** with a dim note — they have no registry story. In the local era every brand's `@omega.js/*` dep is a `file:` spec, so the verb never touches the linked frameworks.
|
|
24
|
+
|
|
25
|
+
## Applying (`--apply`)
|
|
26
|
+
|
|
27
|
+
- Default tier is **non-breaking**: each dep rides to its highest same-major version (npu's minor tier) — quarantined targets are held and listed.
|
|
28
|
+
- **Majors are never auto-applied**: breaking jumps are listed as held; `--apply --major` opts in explicitly.
|
|
29
|
+
- Installs run through **`npu install`** when npu is on the machine (Socket supply-chain firewall); otherwise plain `npm install` with a loud warning. Dev deps install with `--save-dev` in their own pass.
|
|
30
|
+
|
|
31
|
+
## The @omega.js family is pinned, and `omega update` is its ONE mover ([#794](https://github.com/Omega-JS-Stack/omega/issues/794))
|
|
32
|
+
|
|
33
|
+
Every `@omega.js/*` spec the manager writes into a brand is an EXACT pin, never a
|
|
34
|
+
caret: `"@omega.js/manager": "0.1.0"` at the brand root, `"@omega.js/<framework>":
|
|
35
|
+
"0.1.0"` in each target, all at the manager's own version (the family ships
|
|
36
|
+
lockstep — [publishing.md](publishing.md)). A caret would let one target float
|
|
37
|
+
ahead alone on somebody's `npm update`, which is how a brand ends up serving two
|
|
38
|
+
copies of `@omega.js/client` and validating one omega.json5 with two validators.
|
|
39
|
+
|
|
40
|
+
Pinned, the only thing that moves a brand is `omega update --apply` at the brand
|
|
41
|
+
ROOT (a bare run reports and installs nothing), and it moves every target — and
|
|
42
|
+
the root's own manager pin — together. `--apply` installs an `@omega.js/*` dep with
|
|
43
|
+
`--save-exact`, in its own command per dep group, so the mover never un-pins
|
|
44
|
+
what it just moved (npm's default save-prefix would write `^<version>` back);
|
|
45
|
+
every other dependency keeps npm's default prefix, because the pin is the
|
|
46
|
+
FAMILY's rule and not a rule for the whole tree.
|
|
47
|
+
|
|
48
|
+
The manager's boot check enforces the other half: a brand whose installed
|
|
49
|
+
versions have drifted is refused before any service or dev leg runs
|
|
50
|
+
([../manager/brand.md](../manager/brand.md)). The local era is untouched — a
|
|
51
|
+
`file:` spec has no registry story, so the verb skips it and the boot check
|
|
52
|
+
exempts it. `omega i live` (the publish-day flip back off `file:` specs) writes
|
|
53
|
+
the same exact pin ([local-dev.md](local-dev.md) § API surface).
|
|
54
|
+
|
|
55
|
+
## Brand root
|
|
56
|
+
|
|
57
|
+
`omega update` at a brand root (manager) fans out over the brand's targets — cp251's deploy fan-out shape: same target discovery, same `--target=<target|dir>` picker ([#780](https://github.com/Omega-JS-Stack/omega/issues/780)), every other flag forwarded verbatim, each target answering through its own framework's `update` verb. Unlike deploy, targets are **independent**: one failing target never blocks the rest (any failure still exits 1). The brand-root shell `package.json` rides the walk as its LAST leg ([#794](https://github.com/Omega-JS-Stack/omega/issues/794)), scoped to the one `@omega.js/*` dependency it carries — `@omega.js/manager` — and run in-process through the same devkit implementation (there is no framework bin at the root to spawn; it would dispatch straight back into this command). A brand's own root tooling is never touched, and a picked run (`--target=`) skips the root, because the picker names targets. Without that leg a manager-behind brand could never heal itself: the boot check would refuse every verb, and the fix it names would move every target except the one that was wrong.
|
|
58
|
+
|
|
59
|
+
## Testing
|
|
60
|
+
|
|
61
|
+
Registry lookups, the clock, npu detection, and exec are all injectable — the devkit suite (`packages/devkit/test/update.test.js`) runs entirely offline against fixture packuments with a frozen clock; the manager fan-out test spawns fake framework bins; framework structure tests pin the wiring. The live path is the thin defaults (native `fetch` of the full packument — the abbreviated form carries no publish times).
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Templating
|
|
2
|
+
|
|
3
|
+
HTML views go through a two-step `{{ }}` token replacement during the `gulp/html` task. Same convention as EM and UJM.
|
|
4
|
+
|
|
5
|
+
## How it works
|
|
6
|
+
|
|
7
|
+
1. Your view file (`src/views/<component>/index.html`) is templated first — `{{ brand.name }}` etc. resolve against the page-vars object.
|
|
8
|
+
2. The result is injected into [src/config/page-template.html](../src/config/page-template.html) (the framework's outer HTML shell).
|
|
9
|
+
3. The outer template is processed again with the same vars.
|
|
10
|
+
4. Output written to `dist/views/<component>/index.html`.
|
|
11
|
+
|
|
12
|
+
## Available variables
|
|
13
|
+
|
|
14
|
+
| Token | Source | Example |
|
|
15
|
+
|---|---|---|
|
|
16
|
+
| `{{ brand.name }}` | `config/omega.json5` → `brand.name` | `Tabblar` |
|
|
17
|
+
| `{{ brand.url }}` | `config/omega.json5` → `brand.url` | `https://tabblar.com` |
|
|
18
|
+
| `{{ brand.id }}` | `config/omega.json5` → `brand.id` | `tabblar` |
|
|
19
|
+
| `{{ page.name }}` | Component name (e.g. `popup`, `pages/dashboard`) | `popup` |
|
|
20
|
+
| `{{ page.path }}` | Full view path | `views/popup/index.html` |
|
|
21
|
+
| `{{ page.title }}` | Page title — defaults to brand name | `Tabblar` |
|
|
22
|
+
| `{{ theme.appearance }}` | Theme appearance: `dark` or `light` | `dark` |
|
|
23
|
+
| `{{ cacheBust }}` | Cache-busting timestamp (build time) | `1715568000` |
|
|
24
|
+
| `{{ version }}` | `package.json#version` | `1.1.10` |
|
|
25
|
+
| `{{ environment }}` | `'production'` or `'development'` | `production` |
|
|
26
|
+
|
|
27
|
+
## Example usage
|
|
28
|
+
|
|
29
|
+
```html
|
|
30
|
+
<!-- src/views/popup/index.html -->
|
|
31
|
+
<!doctype html>
|
|
32
|
+
<html>
|
|
33
|
+
<head><title>{{ page.title }}</title></head>
|
|
34
|
+
<body>
|
|
35
|
+
<h1>Welcome to {{ brand.name }}</h1>
|
|
36
|
+
<a href="{{ brand.url }}/pricing?ref=ext">Upgrade to Premium</a>
|
|
37
|
+
<p>Version {{ version }}</p>
|
|
38
|
+
</body>
|
|
39
|
+
</html>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Page template
|
|
43
|
+
|
|
44
|
+
[src/config/page-template.html](../src/config/page-template.html) is the outer shell that wraps every view. It contains:
|
|
45
|
+
- `<!doctype html>` + `<html>` boilerplate
|
|
46
|
+
- `<meta>` tags (viewport, charset)
|
|
47
|
+
- A `{{ content }}` slot where the per-component HTML is injected
|
|
48
|
+
- `<link rel="stylesheet">` for the component's `.bundle.css`
|
|
49
|
+
- `<script>` for the component's `.bundle.js`
|
|
50
|
+
- Cache-busting query params via `{{ cacheBust }}`
|
|
51
|
+
|
|
52
|
+
Consumers don't author this — @omega.js/extension owns it. If you need to customize per-view, override directly in `src/views/<component>/index.html` (@omega.js/extension detects when a view provides its own full `<html>` and skips wrapping).
|
|
53
|
+
|
|
54
|
+
## Customizing page vars
|
|
55
|
+
|
|
56
|
+
The page-vars object is built by [src/gulp/tasks/html.js](../src/gulp/tasks/html.js). To add a new variable for consumer templates, edit the `buildPageVars()` helper there. Vars added are available in BOTH the view file AND the outer page-template.html.
|
|
57
|
+
|
|
58
|
+
## Why two passes?
|
|
59
|
+
|
|
60
|
+
Pass 1 lets a view interpolate something into the outer template. For example, a view can do `<!-- omega:page-title --> Custom Title <!-- /omega:page-title -->` (a future feature) and have the value flow into `{{ page.title }}` for the outer template's `<title>`. The pattern keeps simple cases simple (`{{ brand.name }}` Just Works) while leaving room for view → shell metadata flow.
|
|
61
|
+
|
|
62
|
+
## See also
|
|
63
|
+
|
|
64
|
+
- [build-system.md](build-system.md) — gulp pipeline including the html task
|
|
65
|
+
- [css.md](css.md) — how the page template references compiled CSS bundles
|
|
66
|
+
- [themes.md](themes.md) — `{{ theme.appearance }}` derivation
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# Test Framework — Boot Layer
|
|
2
|
+
|
|
3
|
+
The `boot` layer spawns headless Chromium with the **consumer's actual built extension** loaded as unpacked, then runs `inspect` callbacks against the live runtime. Replaces shell-level "did the extension load?" smoke tests with deterministic, signal-driven pass/fail.
|
|
4
|
+
|
|
5
|
+
## What boot tests verify
|
|
6
|
+
|
|
7
|
+
Things that ONLY break when the whole pipeline assembles correctly:
|
|
8
|
+
- The packaged manifest is valid strict JSON (no JSON5 leakage)
|
|
9
|
+
- All referenced files (background.service_worker, content scripts, popup HTML) exist on disk
|
|
10
|
+
- The service worker boots without errors
|
|
11
|
+
- `chrome.runtime.id` is assigned (extension successfully registered)
|
|
12
|
+
- The popup page loads via `chrome-extension://<id>/<popup_path>`
|
|
13
|
+
- Messages between popup and background round-trip
|
|
14
|
+
|
|
15
|
+
If a boot test passes, the extension at minimum *loads* in a real Chrome — that alone catches a class of bugs unit tests can't (missing assets, manifest schema drift, file path typos).
|
|
16
|
+
|
|
17
|
+
## Test file shape
|
|
18
|
+
|
|
19
|
+
```js
|
|
20
|
+
module.exports = {
|
|
21
|
+
layer: 'boot',
|
|
22
|
+
description: 'extension loads + popup renders',
|
|
23
|
+
timeout: 20000,
|
|
24
|
+
inspect: async ({ extension, page, expect, projectRoot }) => {
|
|
25
|
+
expect(extension.manifest.manifest_version).toBe(3);
|
|
26
|
+
await page.goto(extension.popupUrl, { waitUntil: 'domcontentloaded' });
|
|
27
|
+
const html = await page.content();
|
|
28
|
+
expect(html).toContain('<html');
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Or as a group:
|
|
34
|
+
|
|
35
|
+
```js
|
|
36
|
+
module.exports = {
|
|
37
|
+
type: 'group',
|
|
38
|
+
layer: 'boot',
|
|
39
|
+
description: 'extension boots end-to-end',
|
|
40
|
+
tests: [
|
|
41
|
+
{
|
|
42
|
+
description: 'extension has a valid ID',
|
|
43
|
+
inspect: async ({ extension, expect }) => {
|
|
44
|
+
expect(extension.id).toMatch(/^[a-z]{32}$/);
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
description: 'service worker came up',
|
|
49
|
+
inspect: async ({ extension, expect }) => {
|
|
50
|
+
expect(extension.swTarget).not.toBeNull();
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
};
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## The `inspect` callback args
|
|
58
|
+
|
|
59
|
+
```js
|
|
60
|
+
inspect: async ({ extension, page, expect, projectRoot }) => { /* ... */ }
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
| Arg | Type | Description |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| `extension.id` | string | The extension's chrome-extension://`<id>` ID — random per launch, 32-char a-z |
|
|
66
|
+
| `extension.manifest` | object | Parsed manifest.json |
|
|
67
|
+
| `extension.popupUrl` | string\|null | `chrome-extension://<id>/<manifest.action.default_popup>` or null |
|
|
68
|
+
| `extension.optionsUrl` | string\|null | `chrome-extension://<id>/<manifest.options_ui.page>` or null |
|
|
69
|
+
| `extension.swTarget` | Puppeteer Target | The service worker target (may be null if extension has no SW) |
|
|
70
|
+
| `page` | Puppeteer Page | A fresh tab — use `page.goto`, `page.evaluate`, `page.$eval`, etc. |
|
|
71
|
+
| `expect` | function | Jest-compatible matcher (same surface as other layers) |
|
|
72
|
+
| `projectRoot` | string | Absolute path to the consumer project |
|
|
73
|
+
|
|
74
|
+
Each boot test gets a **fresh** `page` (closed at the end of the test). The browser + extension load are shared across all boot tests in a single `npx omega test` invocation (one Chromium boot per run, amortized across tests).
|
|
75
|
+
|
|
76
|
+
## Extension-directory discovery
|
|
77
|
+
|
|
78
|
+
The runner looks for the consumer's Chrome-loadable build in this order:
|
|
79
|
+
|
|
80
|
+
1. `OMEGA_TEST_BOOT_DIR` env var (absolute path) — full override
|
|
81
|
+
2. `<consumer>/packaged/chromium/raw/` — default. This is what @omega.js/extension's gulp pipeline produces. Strict JSON manifest, all bundles compiled, locale files in place. Same dir a developer points "Load unpacked" at.
|
|
82
|
+
3. `<consumer>/dist/` — for non-standard pipelines (and the framework's own fixture extension, which is authored as strict JSON)
|
|
83
|
+
|
|
84
|
+
**A directory qualifies only when its `manifest.json` is STRICT JSON** — what Chrome can actually parse. Existence alone used to qualify, and the intermediate `<consumer>/dist/` (JSON5, the framework-authored source style) exists after any dev run or `omega clean`, so an unbuilt project loaded that copy and hard-failed every boot test instead of skipping ([#575](https://github.com/Omega-JS-Stack/omega/issues/575)). A JSON5 `dist/` is passed over and named in the skip.
|
|
85
|
+
|
|
86
|
+
An explicitly named `OMEGA_TEST_BOOT_DIR` is a decision, not a fallback, so a manifest Chrome can't parse THERE is still an actionable failure:
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
✗ boot tests aborted: dist/manifest.json is not strict JSON.
|
|
90
|
+
Chrome requires manifest.json to have no comments, no trailing commas, no single quotes.
|
|
91
|
+
Parser error: Expected property name or '}' in JSON at position 4
|
|
92
|
+
OMEGA_TEST_BOOT_DIR names this directory explicitly — point it at a
|
|
93
|
+
packaged/<browser>/raw/ output, or unset it and run `npm run build`.
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Most consumers don't need to think about this — `npm run build && npx omega test` works.
|
|
97
|
+
|
|
98
|
+
## OMEGA_TEST_BOOT_PROJECT vs OMEGA_TEST_BOOT_DIR
|
|
99
|
+
|
|
100
|
+
| Env | Purpose |
|
|
101
|
+
|---|---|
|
|
102
|
+
| `OMEGA_TEST_BOOT_PROJECT` | Root of a different project to use instead of cwd. Auto-set when @omega.js/extension tests itself (points at the in-tree fixture under `src/test/fixtures/consumer-extension`). |
|
|
103
|
+
| `OMEGA_TEST_BOOT_DIR` | Absolute path of the directory holding `manifest.json` — short-circuits the discovery order entirely. Use for monorepo layouts or custom output dirs. |
|
|
104
|
+
|
|
105
|
+
## What happens when the extension can't load
|
|
106
|
+
|
|
107
|
+
Chromium silently rejects extensions with malformed manifests (no chrome-extension:// target ever appears, no error in console). The runner detects this and surfaces likely causes:
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
✗ Boot aborted — Chromium loaded but no chrome-extension target appeared.
|
|
111
|
+
Likely cause: the extension failed to load. Common reasons:
|
|
112
|
+
- manifest.json missing required field (e.g. manifest_version: 3)
|
|
113
|
+
- default_locale is set but _locales/<locale>/messages.json is missing
|
|
114
|
+
- __MSG_*__ placeholders used without default_locale + _locales/
|
|
115
|
+
- referenced files (background.service_worker, content_scripts) don't exist on disk
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
This catches real ship-breakers (broken locale references, missing bundles) before users see them.
|
|
119
|
+
|
|
120
|
+
## Skipping the build before boot tests
|
|
121
|
+
|
|
122
|
+
Boot tests assume `packaged/chromium/raw/` exists. They don't auto-trigger `npm run build` (that would slow the test loop). If no candidate carries a strict-JSON manifest, you get:
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
○ boot tests skipped (no strict-JSON manifest.json found in any of:
|
|
126
|
+
/path/to/project/packaged/chromium/raw
|
|
127
|
+
/path/to/project/dist
|
|
128
|
+
/path/to/project/dist/manifest.json exists but is not strict JSON (the intermediate JSON5 source Chrome refuses)
|
|
129
|
+
— run `npm run build` first to produce packaged/chromium/raw/)
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
In CI, run build then test in separate steps so failures are isolated.
|
|
133
|
+
|
|
134
|
+
## Why this exists
|
|
135
|
+
|
|
136
|
+
Build-layer tests can verify "the manifest source is well-formed." Background-layer tests can verify "@omega.js/extension's framework code works inside a SW." But neither catches "the consumer's actual pipeline assembles into a Chrome-loadable extension." Boot tests do.
|
|
137
|
+
|
|
138
|
+
In @omega.js/extension's own self-tests, the boot layer points at a hand-authored fixture extension (`src/test/fixtures/consumer-extension/`) — a known-good minimal MV3 extension. That validates the framework's boot runner is working; consumer projects then point it at their own packaged output to validate THEIR pipeline.
|
|
139
|
+
|
|
140
|
+
## See also
|
|
141
|
+
|
|
142
|
+
- [test-framework.md](test-framework.md) — overall harness, layers, ctx, expect API
|
|
143
|
+
- [environment-detection.md](environment-detection.md) — `Manager.isTesting()` and friends
|