@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,66 @@
|
|
|
1
|
+
// The syntax floor the browser bundles compile to, READ from the manifest
|
|
2
|
+
// ([#738](https://github.com/Omega-JS-Stack/omega/issues/738)).
|
|
3
|
+
//
|
|
4
|
+
// @babel/preset-env guessed a floor from its own browserslist tables; esbuild's
|
|
5
|
+
// `target` states it, and the project already declares it in the one place a
|
|
6
|
+
// browser reads: `minimum_chrome_version` and
|
|
7
|
+
// `browser_specific_settings.gecko.strict_min_version`. A consumer that raises
|
|
8
|
+
// either must move the bundler with it — a hardcoded pair would keep compiling
|
|
9
|
+
// for browsers the extension no longer supports (and, worse, would not compile
|
|
10
|
+
// down for a floor the consumer LOWERED).
|
|
11
|
+
//
|
|
12
|
+
// The two fallbacks are the MV3 minimums, and they are the only constants: an
|
|
13
|
+
// extension declaring nothing still cannot load below them.
|
|
14
|
+
|
|
15
|
+
const path = require('path');
|
|
16
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
17
|
+
|
|
18
|
+
const FRAMEWORK_ROOT = path.join(__dirname, '..', '..', '..', '..');
|
|
19
|
+
const task = require(path.join(FRAMEWORK_ROOT, 'src', 'gulp', 'tasks', 'bundle.js'));
|
|
20
|
+
|
|
21
|
+
// The list webpack's `resolve.fallback` carried, verbatim — the browser answer
|
|
22
|
+
// to Node built-ins a bundled library imports on paths it never runs.
|
|
23
|
+
const RESOLVE_FALLBACK = ['fs', 'path', 'crypto', 'os', 'util', 'assert', 'stream', 'buffer', 'process'];
|
|
24
|
+
|
|
25
|
+
module.exports = defineCases({
|
|
26
|
+
type: 'suite',
|
|
27
|
+
layer: 'build',
|
|
28
|
+
description: 'bundle targets — the syntax floor is read from the manifest, with the MV3 minimums as the floor',
|
|
29
|
+
tests: [
|
|
30
|
+
{
|
|
31
|
+
name: 'a manifest declaring no floors takes the MV3 minimums',
|
|
32
|
+
run: (ctx) => {
|
|
33
|
+
ctx.expect(task.resolveSyntaxTarget({})).toEqual(['chrome88', 'firefox91']);
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
{
|
|
38
|
+
name: "a declared gecko strict_min_version IS the firefox floor",
|
|
39
|
+
run: (ctx) => {
|
|
40
|
+
const manifest = { browser_specific_settings: { gecko: { strict_min_version: '115.0' } } };
|
|
41
|
+
ctx.expect(task.resolveSyntaxTarget(manifest)).toEqual(['chrome88', 'firefox115']);
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
{
|
|
46
|
+
name: 'a declared minimum_chrome_version IS the chrome floor',
|
|
47
|
+
run: (ctx) => {
|
|
48
|
+
ctx.expect(task.resolveSyntaxTarget({ minimum_chrome_version: '110' })).toEqual(['chrome110', 'firefox91']);
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
{
|
|
53
|
+
name: 'a floor that is not a version is ignored — the minimum stands rather than an invented target',
|
|
54
|
+
run: (ctx) => {
|
|
55
|
+
ctx.expect(task.resolveSyntaxTarget({ minimum_chrome_version: 'latest' })).toEqual(['chrome88', 'firefox91']);
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
{
|
|
60
|
+
name: 'the browser Node-builtin shim list is the resolve.fallback list webpack carried',
|
|
61
|
+
run: (ctx) => {
|
|
62
|
+
ctx.expect(task.BROWSER_EMPTY_MODULES).toEqual(RESOLVE_FALLBACK);
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
});
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// Build-layer pin for the background cache-warming flag: the background
|
|
2
|
+
// service worker's page cache is WRITE-ONLY (one caches.open, zero reads
|
|
3
|
+
// anywhere in the extension, and no context sends 'update-cache') — same
|
|
4
|
+
// verdict as the web SW, so updateCache is disabled behind a single
|
|
5
|
+
// re-enable flag. background.js is a browser-context ES module
|
|
6
|
+
// (importScripts at top level), so this pins the SOURCE text rather than
|
|
7
|
+
// importing it.
|
|
8
|
+
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
const path = require('path');
|
|
11
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
12
|
+
|
|
13
|
+
const SOURCE = fs.readFileSync(path.join(__dirname, '..', '..', '..', 'background.js'), 'utf8');
|
|
14
|
+
|
|
15
|
+
module.exports = defineCases({
|
|
16
|
+
type: 'suite',
|
|
17
|
+
layer: 'build',
|
|
18
|
+
description: 'background.js cache warming — disabled behind CACHE_WARMING_ENABLED',
|
|
19
|
+
tests: [
|
|
20
|
+
{
|
|
21
|
+
name: 'the flag is declared off at module scope',
|
|
22
|
+
run: (ctx) => {
|
|
23
|
+
ctx.expect(SOURCE).toMatch(/const CACHE_WARMING_ENABLED = false;/);
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'updateCache early-returns behind the flag (machinery stays wired)',
|
|
28
|
+
run: (ctx) => {
|
|
29
|
+
ctx.expect(SOURCE).toMatch(/updateCache\(pages\) \{\s*if \(!CACHE_WARMING_ENABLED\) \{\s*return Promise\.resolve\(\);/);
|
|
30
|
+
// The message command + the warm path survive for a one-flag re-enable
|
|
31
|
+
ctx.expect(SOURCE).toMatch(/command === 'update-cache'/);
|
|
32
|
+
ctx.expect(SOURCE).toMatch(/caches\.open\(this\.cache\.name\)/);
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: 'the cache stays write-only: exactly one open call, zero reads',
|
|
37
|
+
run: (ctx) => {
|
|
38
|
+
// Call-form regexes — the flag comment mentions caches.open in prose
|
|
39
|
+
ctx.expect((SOURCE.match(/caches\.open\(/g) || []).length).toBe(1);
|
|
40
|
+
ctx.expect(/caches\.match\(|cache\.match\(/.test(SOURCE)).toBe(false);
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
});
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
// Build-layer tests for cli.js alias resolution. We instantiate Main and call
|
|
2
|
+
// process({ _: ['<alias>'] }) — the resolver looks up the alias map and require()s
|
|
3
|
+
// the command module. To avoid actually running the command, we stub each command
|
|
4
|
+
// to a no-op via require.cache injection before calling process().
|
|
5
|
+
|
|
6
|
+
const path = require('path');
|
|
7
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
8
|
+
|
|
9
|
+
const CLI_PATH = path.join(__dirname, '..', '..', '..', 'cli.js');
|
|
10
|
+
const COMMANDS_DIR = path.join(__dirname, '..', '..', '..', 'commands');
|
|
11
|
+
|
|
12
|
+
function stubCommand(name, fn) {
|
|
13
|
+
const file = path.join(COMMANDS_DIR, `${name}.js`);
|
|
14
|
+
require.cache[file] = {
|
|
15
|
+
id: file,
|
|
16
|
+
filename: file,
|
|
17
|
+
loaded: true,
|
|
18
|
+
children: [],
|
|
19
|
+
paths: [],
|
|
20
|
+
exports: fn,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function unstub(name) {
|
|
25
|
+
delete require.cache[path.join(COMMANDS_DIR, `${name}.js`)];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function freshCli() {
|
|
29
|
+
delete require.cache[CLI_PATH];
|
|
30
|
+
return require(CLI_PATH);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
module.exports = defineCases({
|
|
34
|
+
type: 'suite',
|
|
35
|
+
layer: 'build',
|
|
36
|
+
description: 'cli — alias resolution + dispatch',
|
|
37
|
+
tests: [
|
|
38
|
+
{
|
|
39
|
+
name: 'positional "test" routes to commands/test.js',
|
|
40
|
+
run: async (ctx) => {
|
|
41
|
+
let invoked = false;
|
|
42
|
+
stubCommand('test', async () => { invoked = true; });
|
|
43
|
+
try {
|
|
44
|
+
const Main = freshCli();
|
|
45
|
+
await new Main().process({ _: ['test'] });
|
|
46
|
+
ctx.expect(invoked).toBe(true);
|
|
47
|
+
} finally {
|
|
48
|
+
unstub('test');
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'alias "-t" routes to test command',
|
|
54
|
+
run: async (ctx) => {
|
|
55
|
+
let invoked = false;
|
|
56
|
+
stubCommand('test', async () => { invoked = true; });
|
|
57
|
+
try {
|
|
58
|
+
const Main = freshCli();
|
|
59
|
+
await new Main().process({ _: [], t: true });
|
|
60
|
+
ctx.expect(invoked).toBe(true);
|
|
61
|
+
} finally {
|
|
62
|
+
unstub('test');
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: 'positional "clean" routes to commands/clean.js',
|
|
68
|
+
run: async (ctx) => {
|
|
69
|
+
let invoked = false;
|
|
70
|
+
stubCommand('clean', async () => { invoked = true; });
|
|
71
|
+
try {
|
|
72
|
+
const Main = freshCli();
|
|
73
|
+
await new Main().process({ _: ['clean'] });
|
|
74
|
+
ctx.expect(invoked).toBe(true);
|
|
75
|
+
} finally {
|
|
76
|
+
unstub('clean');
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: 'no command prints help and runs nothing (#675 — setup is retired)',
|
|
82
|
+
run: async (ctx) => {
|
|
83
|
+
const Main = freshCli();
|
|
84
|
+
const lines = [];
|
|
85
|
+
const origLog = console.log;
|
|
86
|
+
console.log = (...args) => lines.push(args.join(' '));
|
|
87
|
+
try {
|
|
88
|
+
await new Main().process({ _: [] });
|
|
89
|
+
} finally {
|
|
90
|
+
console.log = origLog;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
ctx.expect(lines.join('\n')).toContain('Usage: omega <command>');
|
|
94
|
+
ctx.expect(lines.join('\n').includes(' setup')).toBe(false);
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: 'unknown command prints the available listing + exit code 1 (no throw — wave-6 D7)',
|
|
99
|
+
run: async (ctx) => {
|
|
100
|
+
const Main = freshCli();
|
|
101
|
+
const errors = [];
|
|
102
|
+
const origError = console.error;
|
|
103
|
+
const origExitCode = process.exitCode;
|
|
104
|
+
console.error = (...args) => errors.push(args.join(' '));
|
|
105
|
+
try {
|
|
106
|
+
await new Main().process({ _: ['totally-not-a-command-xyz'] });
|
|
107
|
+
ctx.expect(errors.join('\n')).toContain('Unknown command "totally-not-a-command-xyz"');
|
|
108
|
+
ctx.expect(errors.join('\n')).toContain('Available:');
|
|
109
|
+
ctx.expect(process.exitCode).toBe(1);
|
|
110
|
+
} finally {
|
|
111
|
+
console.error = origError;
|
|
112
|
+
process.exitCode = origExitCode;
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
name: 'command options are forwarded',
|
|
118
|
+
run: async (ctx) => {
|
|
119
|
+
let received = null;
|
|
120
|
+
stubCommand('test', async (opts) => { received = opts; });
|
|
121
|
+
try {
|
|
122
|
+
const Main = freshCli();
|
|
123
|
+
await new Main().process({ _: ['test'], layer: 'build', filter: 'foo' });
|
|
124
|
+
ctx.expect(received.layer).toBe('build');
|
|
125
|
+
ctx.expect(received.filter).toBe('foo');
|
|
126
|
+
} finally {
|
|
127
|
+
unstub('test');
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
name: 'cli-run disables yargs built-in --help/--version (router owns both)',
|
|
133
|
+
run: (ctx) => {
|
|
134
|
+
// The built-ins printed an empty stub and version "0.0.0" instead of
|
|
135
|
+
// reaching the alias table / the router's generated help (wave-6 D1).
|
|
136
|
+
const source = require('fs').readFileSync(path.join(__dirname, '..', '..', '..', 'cli-run.js'), 'utf8');
|
|
137
|
+
ctx.expect(source.includes('.version(false)')).toBeTruthy();
|
|
138
|
+
ctx.expect(source.includes('.help(false)')).toBeTruthy();
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
name: 'mirrored aliases: -t routes to test, -d routes to deploy (wave-6 D6)',
|
|
143
|
+
run: (ctx) => {
|
|
144
|
+
const { aliases } = freshCli().config;
|
|
145
|
+
ctx.expect(aliases.test.includes('-t')).toBe(true);
|
|
146
|
+
ctx.expect(aliases.deploy.includes('-d')).toBe(true);
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
});
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// Build-layer tests for the boot test the defaults scaffold ships to every
|
|
2
|
+
// consumer (`src/defaults/test/boot/externally-connectable.test.js`, #583).
|
|
3
|
+
//
|
|
4
|
+
// That file runs in EVERY consumer's suite, so its own logic is worth proving:
|
|
5
|
+
// it must fail when the packaged manifest carries no brand origin (the #583
|
|
6
|
+
// bug shape — a published extension the brand site cannot message), pass when
|
|
7
|
+
// it does, and assert nothing at all until the brand declares a url.
|
|
8
|
+
//
|
|
9
|
+
// The scaffolded test reads the consumer's resolved config from cwd, so each
|
|
10
|
+
// case stages a temp project and chdirs into it. Chromium never enters: the
|
|
11
|
+
// `extension` handle its inspect() reads is the manifest, and a plain object
|
|
12
|
+
// is exactly that shape.
|
|
13
|
+
|
|
14
|
+
const path = require('path');
|
|
15
|
+
const fs = require('fs');
|
|
16
|
+
const os = require('os');
|
|
17
|
+
|
|
18
|
+
const DEFAULT_BOOT_TEST = path.join(__dirname, '..', '..', '..', 'defaults', 'test', 'boot', 'externally-connectable.test.js');
|
|
19
|
+
const expect = require('../../assert.js');
|
|
20
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
21
|
+
|
|
22
|
+
// Stage a temp consumer project; `config` is the config/omega.json5 body (omit for none).
|
|
23
|
+
function stageProject(config) {
|
|
24
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-default-boot-'));
|
|
25
|
+
fs.writeFileSync(path.join(tmp, 'package.json'), `{ "name": "staged-ext", "version": "3.1.4" }`);
|
|
26
|
+
|
|
27
|
+
if (config !== undefined) {
|
|
28
|
+
fs.mkdirSync(path.join(tmp, 'config'), { recursive: true });
|
|
29
|
+
fs.writeFileSync(path.join(tmp, 'config', 'omega.json5'), config);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return tmp;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Run the scaffolded boot test's inspect() against a manifest, from `dir`.
|
|
36
|
+
async function inspectFrom(dir, manifest) {
|
|
37
|
+
const oldCwd = process.cwd();
|
|
38
|
+
try {
|
|
39
|
+
process.chdir(dir);
|
|
40
|
+
return await require(DEFAULT_BOOT_TEST).inspect({ extension: { manifest }, expect });
|
|
41
|
+
} finally {
|
|
42
|
+
process.chdir(oldCwd);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const BRAND = `{ brand: { id: 'staged', name: 'Staged', url: 'https://staged.example.com' } }`;
|
|
47
|
+
|
|
48
|
+
module.exports = defineCases({
|
|
49
|
+
type: 'suite',
|
|
50
|
+
layer: 'build',
|
|
51
|
+
description: 'the scaffolded default boot test — externally_connectable',
|
|
52
|
+
tests: [
|
|
53
|
+
{
|
|
54
|
+
name: 'passes when the packaged manifest carries the brand origin (#583)',
|
|
55
|
+
run: async (ctx) => {
|
|
56
|
+
const tmp = stageProject(BRAND);
|
|
57
|
+
try {
|
|
58
|
+
// A dev build carries the dev origin too — the brand origin is what it asserts
|
|
59
|
+
await inspectFrom(tmp, { externally_connectable: { matches: ['https://staged.example.com/*', 'https://localhost:4000/*'] } });
|
|
60
|
+
ctx.expect(true).toBe(true);
|
|
61
|
+
} finally {
|
|
62
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: 'FAILS on the #583 shape — a packaged manifest carrying only the dev origin',
|
|
68
|
+
run: async (ctx) => {
|
|
69
|
+
const tmp = stageProject(BRAND);
|
|
70
|
+
try {
|
|
71
|
+
let thrown = null;
|
|
72
|
+
await inspectFrom(tmp, { externally_connectable: { matches: ['https://localhost:4000/*'] } }).catch((e) => { thrown = e; });
|
|
73
|
+
ctx.expect(thrown).toBeInstanceOf(Error);
|
|
74
|
+
|
|
75
|
+
// …and on a manifest with no externally_connectable at all
|
|
76
|
+
thrown = null;
|
|
77
|
+
await inspectFrom(tmp, { name: 'Staged' }).catch((e) => { thrown = e; });
|
|
78
|
+
ctx.expect(thrown).toBeInstanceOf(Error);
|
|
79
|
+
} finally {
|
|
80
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: 'asserts nothing until the brand declares a url',
|
|
86
|
+
run: async (ctx) => {
|
|
87
|
+
const noUrl = stageProject(`{ brand: { id: 'staged', name: 'Staged' } }`);
|
|
88
|
+
const noConfig = stageProject();
|
|
89
|
+
try {
|
|
90
|
+
await inspectFrom(noUrl, { name: 'Staged' });
|
|
91
|
+
await inspectFrom(noConfig, { name: 'Staged' });
|
|
92
|
+
ctx.expect(true).toBe(true);
|
|
93
|
+
} finally {
|
|
94
|
+
fs.rmSync(noUrl, { recursive: true, force: true });
|
|
95
|
+
fs.rmSync(noConfig, { recursive: true, force: true });
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
});
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
// Build-layer tests for the defaults scaffold — the gulp task's guts now run through
|
|
2
|
+
// the shared devkit defaults engine; these tests run the REAL scaffold (BXM's actual
|
|
3
|
+
// FILE_MAP + site-token transform) into a temp consumer dir and verify the wiring:
|
|
4
|
+
// `_.` renames, omega.json5 defaults merge (consumer keys survive — the setup
|
|
5
|
+
// data-loss regression), preserve-if-exists rules, .nvmrc templating, convergence.
|
|
6
|
+
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
const os = require('os');
|
|
10
|
+
const jetpack = require('fs-jetpack');
|
|
11
|
+
const JSON5 = require('json5');
|
|
12
|
+
|
|
13
|
+
const { scaffoldDefaults } = require('../../../gulp/tasks/defaults.js');
|
|
14
|
+
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
15
|
+
|
|
16
|
+
const SRC = path.join(__dirname, '..', '..', '..');
|
|
17
|
+
|
|
18
|
+
// The defaults task reads the consumer config from cwd at REQUIRE time, so a
|
|
19
|
+
// case that needs a REAL brand config stages one, chdirs in, and requires the
|
|
20
|
+
// task fresh — the same model as package-task.test.js's inProject().
|
|
21
|
+
function scaffoldWithBrand(brand) {
|
|
22
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-defaults-brand-'));
|
|
23
|
+
jetpack.write(path.join(tmp, 'config', 'omega.json5'), `${JSON.stringify({ brand, targets: { extension: {} } }, null, 2)}\n`);
|
|
24
|
+
|
|
25
|
+
const oldCwd = process.cwd();
|
|
26
|
+
const flush = () => {
|
|
27
|
+
for (const key of Object.keys(require.cache)) {
|
|
28
|
+
if (key.startsWith(SRC + path.sep)) delete require.cache[key];
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
flush();
|
|
33
|
+
try {
|
|
34
|
+
process.chdir(tmp);
|
|
35
|
+
require(path.join(SRC, 'gulp', 'tasks', 'defaults.js')).scaffoldDefaults({ outputDir: tmp });
|
|
36
|
+
} finally {
|
|
37
|
+
process.chdir(oldCwd);
|
|
38
|
+
flush();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return tmp;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// The scaffolded config/messages.json is JSON5 — read it the way the build does.
|
|
45
|
+
function readMessages(dir) {
|
|
46
|
+
return JSON5.parse(jetpack.read(path.join(dir, 'config', 'messages.json')));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function readAppDescription(dir) {
|
|
50
|
+
return readMessages(dir).appDescription.message;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
module.exports = defineCases({
|
|
54
|
+
type: 'group',
|
|
55
|
+
layer: 'build',
|
|
56
|
+
description: 'defaults scaffold (devkit engine)',
|
|
57
|
+
tests: [
|
|
58
|
+
{
|
|
59
|
+
name: 'fresh scaffold: `_.` renames land, omega.json5 + the agent-docs chain ship, .nvmrc renders',
|
|
60
|
+
run: (ctx) => {
|
|
61
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-defaults-'));
|
|
62
|
+
scaffoldDefaults({ outputDir: tmp });
|
|
63
|
+
|
|
64
|
+
// No `.env` scaffolds ([#678](https://github.com/Omega-JS-Stack/omega/issues/678)):
|
|
65
|
+
// a target .env is a human-only override; keys live in the brand root
|
|
66
|
+
// .env and every verb delivers them.
|
|
67
|
+
ctx.expect(jetpack.exists(path.join(tmp, '.env'))).toBe(false);
|
|
68
|
+
ctx.expect(jetpack.exists(path.join(tmp, '.gitignore'))).toBeTruthy();
|
|
69
|
+
// The agent-docs chain (#63): AGENTS.md carries the content, CLAUDE.md is
|
|
70
|
+
// the one-line `@AGENTS.md` pointer.
|
|
71
|
+
ctx.expect(jetpack.read(path.join(tmp, 'AGENTS.md'))).toContain('node_modules/@omega.js/AGENTS.md');
|
|
72
|
+
ctx.expect(jetpack.read(path.join(tmp, 'CLAUDE.md')).trim()).toBe('@AGENTS.md');
|
|
73
|
+
ctx.expect(jetpack.exists(path.join(tmp, 'config', 'omega.json5'))).toBeTruthy();
|
|
74
|
+
|
|
75
|
+
// .nvmrc template rendered ({{ versions.node }} → engines.node), no raw tokens left.
|
|
76
|
+
const nvmrc = jetpack.read(path.join(tmp, '.nvmrc'));
|
|
77
|
+
ctx.expect(nvmrc).toContain('v22');
|
|
78
|
+
ctx.expect(nvmrc.includes('{{')).toBe(false);
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: 'omega.json5 merge: consumer values and consumer-only keys survive re-scaffold',
|
|
83
|
+
run: (ctx) => {
|
|
84
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-defaults-'));
|
|
85
|
+
jetpack.write(path.join(tmp, 'config', 'omega.json5'), JSON5.stringify({
|
|
86
|
+
brand: { id: 'my-brand' },
|
|
87
|
+
liveReloadPort: 40000,
|
|
88
|
+
targets: { extension: { custom: true } },
|
|
89
|
+
}, null, 2));
|
|
90
|
+
|
|
91
|
+
scaffoldDefaults({ outputDir: tmp });
|
|
92
|
+
|
|
93
|
+
const merged = JSON5.parse(jetpack.read(path.join(tmp, 'config', 'omega.json5')));
|
|
94
|
+
ctx.expect(merged.brand.id).toBe('my-brand');
|
|
95
|
+
ctx.expect(merged.liveReloadPort).toBe(40000);
|
|
96
|
+
ctx.expect(merged.targets.extension.custom).toBe(true);
|
|
97
|
+
// Framework template sections the consumer lacked arrive in the merge.
|
|
98
|
+
ctx.expect(typeof merged.theme).toBe('object');
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: 'preserve-if-exists rules: consumer config/description.md is never overwritten',
|
|
103
|
+
run: (ctx) => {
|
|
104
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-defaults-'));
|
|
105
|
+
jetpack.write(path.join(tmp, 'config', 'description.md'), 'consumer description');
|
|
106
|
+
|
|
107
|
+
scaffoldDefaults({ outputDir: tmp });
|
|
108
|
+
|
|
109
|
+
ctx.expect(jetpack.read(path.join(tmp, 'config', 'description.md'))).toBe('consumer description');
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
// The legacy-1.7.4 regression: no FILE_MAP rule matched test/**, so shipped
|
|
114
|
+
// test files fell through to the engine's overwrite: true default and every
|
|
115
|
+
// setup rerun reset the consumer's fixture hook to the stub.
|
|
116
|
+
name: 'test/** is copy-once: consumer test/_init.js survives re-scaffold',
|
|
117
|
+
run: (ctx) => {
|
|
118
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-defaults-'));
|
|
119
|
+
scaffoldDefaults({ outputDir: tmp });
|
|
120
|
+
|
|
121
|
+
// Seeded on first run
|
|
122
|
+
ctx.expect(jetpack.exists(path.join(tmp, 'test', '_init.js'))).toBeTruthy();
|
|
123
|
+
|
|
124
|
+
// Consumer customizes the fixture hook; a rerun must not clobber it
|
|
125
|
+
jetpack.write(path.join(tmp, 'test', '_init.js'), '// consumer fixture hook\n');
|
|
126
|
+
scaffoldDefaults({ outputDir: tmp });
|
|
127
|
+
|
|
128
|
+
ctx.expect(jetpack.read(path.join(tmp, 'test', '_init.js'))).toBe('// consumer fixture hook\n');
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
name: 'converges: after the first re-run the tree is stable',
|
|
133
|
+
run: (ctx) => {
|
|
134
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-defaults-'));
|
|
135
|
+
// Run 1 scaffolds; run 2 is the first merge pass (JSON5 comments strip on
|
|
136
|
+
// merge-stringify — pre-existing behavior). Stable from then on.
|
|
137
|
+
scaffoldDefaults({ outputDir: tmp });
|
|
138
|
+
scaffoldDefaults({ outputDir: tmp });
|
|
139
|
+
const snapshot = jetpack.inspectTree(tmp, { checksum: 'md5' });
|
|
140
|
+
const third = scaffoldDefaults({ outputDir: tmp });
|
|
141
|
+
|
|
142
|
+
ctx.expect(JSON.stringify(jetpack.inspectTree(tmp, { checksum: 'md5' })))
|
|
143
|
+
.toBe(JSON.stringify(snapshot));
|
|
144
|
+
ctx.expect(third.written.length).toBe(0);
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
name: 'brand target scaffolds NO config file (cp121c/cp122d: brand targets.* is the home; local file = standalone escape hatch)',
|
|
149
|
+
run: (ctx) => {
|
|
150
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-defaults-'));
|
|
151
|
+
jetpack.write(path.join(tmp, 'brand', 'config', 'omega.json5'), "{ brand: { id: 'acme', name: 'Acme' } }\n");
|
|
152
|
+
const targetDir = path.join(tmp, 'brand', 'targets', 'extension');
|
|
153
|
+
jetpack.dir(targetDir);
|
|
154
|
+
|
|
155
|
+
// Fresh scaffold AND every-build reruns: the local config never appears
|
|
156
|
+
// (the old targets-only seed kept resurrecting deleted local files)
|
|
157
|
+
scaffoldDefaults({ outputDir: targetDir });
|
|
158
|
+
ctx.expect(jetpack.exists(path.join(targetDir, 'config', 'omega.json5'))).toBe(false);
|
|
159
|
+
|
|
160
|
+
scaffoldDefaults({ outputDir: targetDir });
|
|
161
|
+
ctx.expect(jetpack.exists(path.join(targetDir, 'config', 'omega.json5'))).toBe(false);
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
name: 'brand target scaffolds NO per-target docs (brand doc unification: the brand root is the doc home)',
|
|
166
|
+
run: (ctx) => {
|
|
167
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-defaults-'));
|
|
168
|
+
jetpack.write(path.join(tmp, 'brand', 'config', 'omega.json5'), "{ brand: { id: 'acme', name: 'Acme' } }\n");
|
|
169
|
+
const targetDir = path.join(tmp, 'brand', 'targets', 'extension');
|
|
170
|
+
jetpack.dir(targetDir);
|
|
171
|
+
|
|
172
|
+
scaffoldDefaults({ outputDir: targetDir });
|
|
173
|
+
ctx.expect(jetpack.exists(path.join(targetDir, 'AGENTS.md'))).toBe(false);
|
|
174
|
+
ctx.expect(jetpack.exists(path.join(targetDir, 'CLAUDE.md'))).toBe(false);
|
|
175
|
+
ctx.expect(jetpack.exists(path.join(targetDir, 'CHANGELOG.md'))).toBe(false);
|
|
176
|
+
ctx.expect(jetpack.exists(path.join(targetDir, 'docs'))).toBe(false);
|
|
177
|
+
// The non-doc defaults still land.
|
|
178
|
+
ctx.expect(jetpack.exists(path.join(targetDir, '.gitignore'))).toBeTruthy();
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
name: 'brand setup sweeps framework-owned per-target docs, preserves consumer content with a warning',
|
|
183
|
+
run: (ctx) => {
|
|
184
|
+
const DEFAULT_MARKER = '# ========== Default Values ==========';
|
|
185
|
+
const CUSTOM_MARKER = '# ========== Custom Values ==========';
|
|
186
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-defaults-'));
|
|
187
|
+
const targetDir = path.join(tmp, 'brand', 'targets', 'extension');
|
|
188
|
+
jetpack.dir(targetDir);
|
|
189
|
+
|
|
190
|
+
// Standalone scaffold first (no brand config yet) — per-target docs land.
|
|
191
|
+
scaffoldDefaults({ outputDir: targetDir });
|
|
192
|
+
ctx.expect(jetpack.exists(path.join(targetDir, 'AGENTS.md'))).toBeTruthy();
|
|
193
|
+
ctx.expect(jetpack.exists(path.join(targetDir, 'CLAUDE.md'))).toBeTruthy();
|
|
194
|
+
|
|
195
|
+
// Wrap it in a brand monorepo: the next scaffold sweeps the untouched docs.
|
|
196
|
+
jetpack.write(path.join(tmp, 'brand', 'config', 'omega.json5'), "{ brand: { id: 'acme', name: 'Acme' } }\n");
|
|
197
|
+
const swept = scaffoldDefaults({ outputDir: targetDir });
|
|
198
|
+
ctx.expect(swept.removed.slice().sort().join(',')).toBe('AGENTS.md,CHANGELOG.md,CLAUDE.md,docs/README.md');
|
|
199
|
+
ctx.expect(jetpack.exists(path.join(targetDir, 'AGENTS.md'))).toBe(false);
|
|
200
|
+
ctx.expect(jetpack.exists(path.join(targetDir, 'CLAUDE.md'))).toBe(false);
|
|
201
|
+
ctx.expect(jetpack.exists(path.join(targetDir, 'docs'))).toBe(false);
|
|
202
|
+
|
|
203
|
+
// Consumer content is never destroyed: real notes below the Custom marker keep the file.
|
|
204
|
+
jetpack.write(path.join(targetDir, 'AGENTS.md'),
|
|
205
|
+
`${DEFAULT_MARKER}\nframework guidance\n\n${CUSTOM_MARKER}\nOur deploy needs the VPN up.\n`);
|
|
206
|
+
scaffoldDefaults({ outputDir: targetDir });
|
|
207
|
+
ctx.expect(jetpack.read(path.join(targetDir, 'AGENTS.md'))).toContain('VPN');
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
// GitHub runs workflows from the repo root ONLY, so the per-target copy a
|
|
212
|
+
// brand monorepo used to get never fired: no CI build, no store publish (#265).
|
|
213
|
+
name: 'brand target scaffolds NO per-target .github/ — its CI composes into the brand root',
|
|
214
|
+
run: (ctx) => {
|
|
215
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-defaults-'));
|
|
216
|
+
const brandRoot = path.join(tmp, 'brand');
|
|
217
|
+
jetpack.write(path.join(brandRoot, 'config', 'omega.json5'), "{ brand: { id: 'acme', name: 'Acme' } }\n");
|
|
218
|
+
const targetDir = path.join(brandRoot, 'targets', 'extension');
|
|
219
|
+
jetpack.dir(targetDir);
|
|
220
|
+
|
|
221
|
+
scaffoldDefaults({ outputDir: targetDir });
|
|
222
|
+
|
|
223
|
+
ctx.expect(jetpack.exists(path.join(targetDir, '.github'))).toBe(false);
|
|
224
|
+
|
|
225
|
+
const composed = path.join(brandRoot, '.github', 'workflows', 'extension-publish.yml');
|
|
226
|
+
ctx.expect(jetpack.exists(composed)).toBe('file');
|
|
227
|
+
|
|
228
|
+
const contents = jetpack.read(composed);
|
|
229
|
+
// Runs from the repo root, scoped to this target
|
|
230
|
+
ctx.expect(contents).toContain('working-directory: targets/extension');
|
|
231
|
+
// The site-token pass still renders (the pinned consumer Node version)
|
|
232
|
+
ctx.expect(contents).toContain(`NODE_VERSION: '22'`);
|
|
233
|
+
ctx.expect(contents.includes('[versions.node]')).toBe(false);
|
|
234
|
+
|
|
235
|
+
// Idempotent: a setup rerun updates that one file, never adds another
|
|
236
|
+
scaffoldDefaults({ outputDir: targetDir });
|
|
237
|
+
ctx.expect(jetpack.list(path.join(brandRoot, '.github', 'workflows'))).toEqual(['extension-publish.yml']);
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
name: 'standalone project keeps its own .github/workflows (its target dir IS the repo root)',
|
|
242
|
+
run: (ctx) => {
|
|
243
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'extension-defaults-'));
|
|
244
|
+
|
|
245
|
+
scaffoldDefaults({ outputDir: tmp });
|
|
246
|
+
|
|
247
|
+
ctx.expect(jetpack.exists(path.join(tmp, '.github', 'workflows', 'publish.yml'))).toBe('file');
|
|
248
|
+
},
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
name: 'appDescription seeds from brand.description when it fits the store cap (#573)',
|
|
252
|
+
run: (ctx) => {
|
|
253
|
+
// A description with an apostrophe: the seed is a single-quoted JSON5
|
|
254
|
+
// string, so an unescaped one would make the scaffolded file unparseable
|
|
255
|
+
const description = `Save what you find — the world's tidiest clipper.`;
|
|
256
|
+
const tmp = scaffoldWithBrand({ id: 'acme', name: 'Acme', description });
|
|
257
|
+
|
|
258
|
+
ctx.expect(readAppDescription(tmp)).toBe(description);
|
|
259
|
+
},
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
name: 'appDescription falls back to today\'s phrasing over the cap, or with no description (#573)',
|
|
263
|
+
run: (ctx) => {
|
|
264
|
+
const tooLong = `${'x'.repeat(201)}`;
|
|
265
|
+
const overCap = scaffoldWithBrand({ id: 'acme', name: 'Acme', description: tooLong });
|
|
266
|
+
const none = scaffoldWithBrand({ id: 'acme', name: 'Acme' });
|
|
267
|
+
|
|
268
|
+
ctx.expect(readAppDescription(overCap)).toBe('The official Acme browser extension.');
|
|
269
|
+
ctx.expect(readAppDescription(none)).toBe('The official Acme browser extension.');
|
|
270
|
+
},
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
name: 'every seeded message escapes the brand name — an apostrophe keeps the file parseable (#592)',
|
|
274
|
+
run: (ctx) => {
|
|
275
|
+
// #573 escaped the description path only; appName/appNameShort/btnTooltip
|
|
276
|
+
// rendered `[ site.brand.name ]` raw into the same single-quoted JSON5.
|
|
277
|
+
const name = `Ian's Clipper`;
|
|
278
|
+
const messages = readMessages(scaffoldWithBrand({ id: 'acme', name }));
|
|
279
|
+
|
|
280
|
+
ctx.expect(messages.appName.message).toBe(name);
|
|
281
|
+
ctx.expect(messages.appNameShort.message).toBe(name);
|
|
282
|
+
ctx.expect(messages.btnTooltip.message).toBe(name);
|
|
283
|
+
ctx.expect(messages.appDescription.message).toBe(`The official ${name} browser extension.`);
|
|
284
|
+
},
|
|
285
|
+
},
|
|
286
|
+
],
|
|
287
|
+
});
|