@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,520 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brand-monorepo CI composition (#265).
|
|
3
|
+
*
|
|
4
|
+
* Every framework scaffolds `.github/workflows/*.yml` into the target it sets up.
|
|
5
|
+
* That is correct for a STANDALONE target (the target dir is the git root) and dead on
|
|
6
|
+
* arrival inside a brand monorepo: GitHub executes workflows from the REPO
|
|
7
|
+
* ROOT's `.github/workflows/` only, so `targets/extension/.github/workflows/publish.yml`
|
|
8
|
+
* never runs — CI builds and store publishes silently do not exist.
|
|
9
|
+
*
|
|
10
|
+
* In a monorepo the target's workflow is COMPOSED into the root dir instead: one
|
|
11
|
+
* file per target (`<target>-<workflow>.yml`), every post-checkout `run:` step scoped
|
|
12
|
+
* to the target's path, regenerated from the framework template on every setup — so
|
|
13
|
+
* a re-run updates the target's own file and can never duplicate a job. Each target's
|
|
14
|
+
* runs also get their own concurrency group, so one target's deploy never cancels
|
|
15
|
+
* another's.
|
|
16
|
+
*
|
|
17
|
+
* Scoping is by working directory, not by a `paths:` trigger filter: OMEGA
|
|
18
|
+
* workflows carry NO push triggers by design (deliberate deploys — D13), and a
|
|
19
|
+
* path filter on a dispatch-only workflow filters nothing. It is declared PER
|
|
20
|
+
* STEP, not as a workflow-level `defaults.run.working-directory`: that would
|
|
21
|
+
* also scope the steps that run before actions/checkout (and the jobs that never
|
|
22
|
+
* check out), where the target dir does not exist yet.
|
|
23
|
+
*
|
|
24
|
+
* Composition RECONCILES (#636): the enabled target set derives the composed
|
|
25
|
+
* file set, so a target the brand's config no longer enables has its composed
|
|
26
|
+
* files DELETED (reconcileComposedWorkflows) — the ratified example of a
|
|
27
|
+
* dropped config key becoming a real removal.
|
|
28
|
+
*/
|
|
29
|
+
const path = require('path');
|
|
30
|
+
const jetpack = require('fs-jetpack');
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Action inputs that name a path inside the checkout, per action. `uses:` steps
|
|
34
|
+
* ignore `working-directory:` entirely (it is a `run:` key), so a composed
|
|
35
|
+
* workflow has to scope these itself — the gh-pages publish otherwise pushes a
|
|
36
|
+
* repo-root `dist/` no build ever wrote, and the cache key hashes nothing.
|
|
37
|
+
*
|
|
38
|
+
* Named per action on purpose: a blanket "any input called path" rule would
|
|
39
|
+
* rewrite inputs that mean something else — `actions/checkout`'s `path:` names
|
|
40
|
+
* where to CLONE the repo, not a file in it. An action missing from this table
|
|
41
|
+
* is left alone; add it here when a template starts using it.
|
|
42
|
+
*/
|
|
43
|
+
const SCOPED_ACTION_INPUTS = {
|
|
44
|
+
'actions/cache': ['path'],
|
|
45
|
+
'actions/upload-artifact': ['path'],
|
|
46
|
+
'actions/download-artifact': ['path'],
|
|
47
|
+
'peaceiris/actions-gh-pages': ['publish_dir'],
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Compose one framework workflow template for a target inside a brand monorepo.
|
|
52
|
+
* Pure: text in, text out.
|
|
53
|
+
* @param {string} contents - The (already rendered) workflow template
|
|
54
|
+
* @param {object} options
|
|
55
|
+
* @param {string} options.targetPath - The target's path relative to the repo root (e.g. targets/extension)
|
|
56
|
+
* @param {string} options.targetName - The target's short name (e.g. extension)
|
|
57
|
+
* @returns {string} the composed workflow
|
|
58
|
+
*/
|
|
59
|
+
function composeWorkflow(contents, options) {
|
|
60
|
+
const targetPath = options.targetPath;
|
|
61
|
+
const targetName = options.targetName;
|
|
62
|
+
|
|
63
|
+
let composed = contents;
|
|
64
|
+
|
|
65
|
+
// Display name carries the target — two targets' runs are told apart in the
|
|
66
|
+
// Actions list, where only the workflow name shows.
|
|
67
|
+
composed = composed.replace(/^name:[ \t]*(.*)$/m, (full, value) => `name: ${value.trim()} (${targetPath})`);
|
|
68
|
+
|
|
69
|
+
// Per-target concurrency: `${{ github.ref }}` alone means the website's deploy
|
|
70
|
+
// cancels the extension's.
|
|
71
|
+
composed = composed.replace(/^(concurrency:\n(?:[ \t]+.*\n)*?[ \t]+group:[ \t]*)(.*)$/m, (full, prefix, value) => `${prefix}${targetName}-${value.trim()}`);
|
|
72
|
+
|
|
73
|
+
// Every `run:` step that follows its job's checkout executes in the target dir
|
|
74
|
+
// (`uses:` actions — checkout and friends — stay at the repo root, which is
|
|
75
|
+
// what they want).
|
|
76
|
+
composed = scopeRunSteps(composed, targetPath);
|
|
77
|
+
|
|
78
|
+
return `${header(targetPath)}${composed}`;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Compose every workflow a framework ships for one target into the brand root's
|
|
83
|
+
* `.github/workflows/`, and sweep the target's own dead copy.
|
|
84
|
+
* @param {object} options
|
|
85
|
+
* @param {string} options.sourceDir - The framework's `.github/workflows` defaults dir
|
|
86
|
+
* @param {string} options.targetDir - The consumer target dir
|
|
87
|
+
* @param {string} options.brandRoot - The brand (repo) root
|
|
88
|
+
* @param {Function} [options.transform] - `(contents, name) => contents`, run before composing
|
|
89
|
+
* @param {object} [options.logger] - Logger with `log`/`warn` (defaults to console)
|
|
90
|
+
* @returns {{ written: string[], skipped: string[], removed: string[] }} brand-root-relative paths
|
|
91
|
+
*/
|
|
92
|
+
function composeTargetWorkflows(options) {
|
|
93
|
+
const { sourceDir, targetDir, brandRoot } = options;
|
|
94
|
+
const transform = options.transform || null;
|
|
95
|
+
const logger = options.logger || console;
|
|
96
|
+
const result = { written: [], skipped: [], removed: [] };
|
|
97
|
+
|
|
98
|
+
if (!jetpack.exists(sourceDir)) {
|
|
99
|
+
return result;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const targetPath = relativePath(brandRoot, targetDir);
|
|
103
|
+
const targetName = path.basename(targetDir);
|
|
104
|
+
|
|
105
|
+
for (const name of jetpack.list(sourceDir).sort()) {
|
|
106
|
+
const source = path.join(sourceDir, name);
|
|
107
|
+
if (jetpack.exists(source) !== 'file') {
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
let rendered = jetpack.read(source);
|
|
112
|
+
if (transform) {
|
|
113
|
+
rendered = transform(rendered, name);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const composed = composeWorkflow(rendered, { targetPath, targetName });
|
|
117
|
+
const relative = `.github/workflows/${targetName}-${name}`;
|
|
118
|
+
const destination = path.join(brandRoot, '.github', 'workflows', `${targetName}-${name}`);
|
|
119
|
+
|
|
120
|
+
if (jetpack.exists(destination) && jetpack.read(destination) === composed) {
|
|
121
|
+
result.skipped.push(relative);
|
|
122
|
+
} else {
|
|
123
|
+
jetpack.write(destination, composed);
|
|
124
|
+
result.written.push(relative);
|
|
125
|
+
logger.log(`Composed → ${relative} (runs ${targetPath} from the repo root)`);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// The target's own copy is dead weight in a monorepo: delete the untouched
|
|
129
|
+
// framework file, report a differing one rather than destroying it.
|
|
130
|
+
sweepTargetCopy({ targetDir, targetPath, name, composedName: relative, rendered, logger, result });
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Delete the composed workflows of targets this brand no longer has (#636).
|
|
138
|
+
* Composing is per-target and a dropped target's framework never runs again, so
|
|
139
|
+
* the file it wrote at the brand root would outlive it forever — a workflow
|
|
140
|
+
* Actions still lists and still dispatches for a target that is gone.
|
|
141
|
+
*
|
|
142
|
+
* The brand root's `.github/workflows/` is a MIXED dir: the brand's own
|
|
143
|
+
* human-authored workflows live beside the composed ones. So a file goes only
|
|
144
|
+
* past a DOUBLE lock — it carries the GENERATED header (which also NAMES the
|
|
145
|
+
* target it was composed for) AND it is named the composed way,
|
|
146
|
+
* `<target>-<framework file>.yml`. A human file matches neither and is never
|
|
147
|
+
* even a candidate; nothing here reads or edits one.
|
|
148
|
+
*
|
|
149
|
+
* @param {object} options
|
|
150
|
+
* @param {string} options.brandRoot - The brand (repo) root
|
|
151
|
+
* @param {string[]} options.liveTargets - The target DIR names the brand's config
|
|
152
|
+
* still enables (`website`, `extension`, …). A composed file owned by anything
|
|
153
|
+
* else is a leftover.
|
|
154
|
+
* @param {boolean} [options.dryRun] - Report what would go, delete nothing
|
|
155
|
+
* @param {object} [options.logger] - Logger with `log`/`warn` (defaults to console)
|
|
156
|
+
* @returns {{ removed: string[] }} brand-root-relative paths
|
|
157
|
+
*/
|
|
158
|
+
function reconcileComposedWorkflows(options) {
|
|
159
|
+
const live = new Set(options.liveTargets || []);
|
|
160
|
+
const logger = options.logger || console;
|
|
161
|
+
const dryRun = options.dryRun || false;
|
|
162
|
+
const result = { removed: [] };
|
|
163
|
+
|
|
164
|
+
const workflowsDir = path.join(options.brandRoot, '.github', 'workflows');
|
|
165
|
+
if (jetpack.exists(workflowsDir) !== 'dir') {
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
for (const name of (jetpack.list(workflowsDir) || []).sort()) {
|
|
170
|
+
const file = path.join(workflowsDir, name);
|
|
171
|
+
if (jetpack.exists(file) !== 'file') {
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const owned = composedWorkflowOwner(name, jetpack.read(file));
|
|
176
|
+
if (!owned || live.has(owned.target)) {
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
if (!dryRun) {
|
|
181
|
+
jetpack.remove(file);
|
|
182
|
+
}
|
|
183
|
+
result.removed.push(`.github/workflows/${name}`);
|
|
184
|
+
logger.log(`Removed .github/workflows/${name} — ${owned.targetPath} is no longer a target of this brand`);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return result;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* The workflow file name to dispatch for a target — composed in a brand monorepo,
|
|
192
|
+
* the framework's own name standalone. The ONE place deploy verbs and the
|
|
193
|
+
* compose step agree on the name.
|
|
194
|
+
* @param {object} options
|
|
195
|
+
* @param {string} options.targetDir - The consumer target dir
|
|
196
|
+
* @param {string|null} options.brandRoot - The brand root, or null when standalone
|
|
197
|
+
* @param {string} options.workflow - The framework's workflow file name (e.g. publish.yml)
|
|
198
|
+
* @returns {string} the workflow file name
|
|
199
|
+
*/
|
|
200
|
+
function composedWorkflowName(options) {
|
|
201
|
+
if (!options.brandRoot || path.resolve(options.brandRoot) === path.resolve(options.targetDir)) {
|
|
202
|
+
return options.workflow;
|
|
203
|
+
}
|
|
204
|
+
return `${path.basename(options.targetDir)}-${options.workflow}`;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Scope every `run:` step that executes AFTER its job's checkout to the target dir.
|
|
208
|
+
// A workflow-level `defaults.run.working-directory` reads cleaner but applies to
|
|
209
|
+
// EVERY run step, including the ones that execute before actions/checkout (the
|
|
210
|
+
// git config step, a matrix-resolving step) and the jobs that never check out at
|
|
211
|
+
// all — the target dir does not exist there yet, and the job dies on step 1.
|
|
212
|
+
function scopeRunSteps(contents, targetPath) {
|
|
213
|
+
const lines = contents.split('\n');
|
|
214
|
+
const output = [];
|
|
215
|
+
let insideJobs = false;
|
|
216
|
+
let stepsIndent = -1; // indent of the open `steps:` key, -1 when outside one
|
|
217
|
+
let itemIndent = -1; // indent of that list's `- ` step items
|
|
218
|
+
let checkedOut = false; // has THIS job checked out yet
|
|
219
|
+
let step = null; // the buffered lines of the step being read
|
|
220
|
+
|
|
221
|
+
const flush = () => {
|
|
222
|
+
if (!step) return;
|
|
223
|
+
output.push(...(checkedOut ? scopeStep(step, itemIndent + 2, targetPath) : step));
|
|
224
|
+
checkedOut = checkedOut || step.some((line) => /^[ \t]*(?:- )?uses:[ \t]*actions\/checkout/.test(line));
|
|
225
|
+
step = null;
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
for (const line of lines) {
|
|
229
|
+
const indent = line.search(/\S/);
|
|
230
|
+
// Comments and blank lines never close a block — they belong to what follows
|
|
231
|
+
const structural = indent >= 0 && !line.trimStart().startsWith('#');
|
|
232
|
+
|
|
233
|
+
// A top-level key closes any open steps list and says whether we are in `jobs:`
|
|
234
|
+
if (structural && indent === 0) {
|
|
235
|
+
flush();
|
|
236
|
+
stepsIndent = -1;
|
|
237
|
+
insideJobs = /^jobs:[ \t]*$/.test(line);
|
|
238
|
+
output.push(line);
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// The steps list ends where the job's next key begins
|
|
243
|
+
if (stepsIndent >= 0 && structural && indent <= stepsIndent) {
|
|
244
|
+
flush();
|
|
245
|
+
stepsIndent = -1;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
if (stepsIndent >= 0) {
|
|
249
|
+
const item = structural && /^[ \t]*- /.test(line);
|
|
250
|
+
if (item && itemIndent === -1) {
|
|
251
|
+
itemIndent = indent;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
if (item && indent === itemIndent) {
|
|
255
|
+
flush();
|
|
256
|
+
step = [line];
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
if (step) {
|
|
261
|
+
step.push(line);
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
} else if (insideJobs) {
|
|
265
|
+
const opens = /^([ \t]+)steps:[ \t]*$/.exec(line);
|
|
266
|
+
if (opens) {
|
|
267
|
+
stepsIndent = opens[1].length;
|
|
268
|
+
itemIndent = -1;
|
|
269
|
+
checkedOut = false;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
output.push(line);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
flush();
|
|
277
|
+
|
|
278
|
+
return output.join('\n');
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// Scope one post-checkout step to the target: a `run:` step gets a
|
|
282
|
+
// `working-directory:`, a `uses:` step gets its path-bearing inputs rewritten
|
|
283
|
+
// (the key is illegal there), and every step's `hashFiles()` patterns are moved
|
|
284
|
+
// into the target dir.
|
|
285
|
+
function scopeStep(step, keyIndent, targetPath) {
|
|
286
|
+
const lines = scopeHashFiles(step, targetPath);
|
|
287
|
+
const action = actionOf(lines, keyIndent);
|
|
288
|
+
|
|
289
|
+
if (action) {
|
|
290
|
+
return scopeActionInputs(lines, keyIndent, targetPath, SCOPED_ACTION_INPUTS[action]);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
return scopeRunStep(lines, keyIndent, targetPath);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// The action a `uses:` step runs, version stripped (`actions/cache@v4` → `actions/cache`).
|
|
297
|
+
function actionOf(step, keyIndent) {
|
|
298
|
+
const pad = ' '.repeat(keyIndent);
|
|
299
|
+
const line = step.find((entry, index) => (index === 0 ? /^[ \t]*- uses:/.test(entry) : entry.startsWith(`${pad}uses:`)));
|
|
300
|
+
|
|
301
|
+
return line ? line.slice(line.indexOf('uses:') + 5).trim().split('@')[0] : null;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// `hashFiles()` globs from GITHUB_WORKSPACE wherever it appears — no step key
|
|
305
|
+
// moves it — so a composed target workflow's patterns carry the target path or match
|
|
306
|
+
// nothing at all.
|
|
307
|
+
function scopeHashFiles(step, targetPath) {
|
|
308
|
+
return step.map((line) => line.replace(/hashFiles\(([^)]*)\)/g, (full, args) => {
|
|
309
|
+
const scoped = args.replace(/(['"])([^'"]+)\1/g, (quoted, quote, pattern) => `${quote}${joinTargetPath(pattern, targetPath)}${quote}`);
|
|
310
|
+
return `hashFiles(${scoped})`;
|
|
311
|
+
}));
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// Rewrite the named inputs of a `uses:` step's `with:` block to target-relative
|
|
315
|
+
// paths. A `|` block scalar (upload-artifact's multi-glob `path:`) is rewritten
|
|
316
|
+
// line by line.
|
|
317
|
+
function scopeActionInputs(step, keyIndent, targetPath, inputs) {
|
|
318
|
+
if (!inputs) {
|
|
319
|
+
return step;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
const pad = ' '.repeat(keyIndent);
|
|
323
|
+
const withIndex = step.findIndex((line) => line.startsWith(`${pad}with:`));
|
|
324
|
+
if (withIndex === -1) {
|
|
325
|
+
return step;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
const scoped = [...step];
|
|
329
|
+
let blockIndent = -1;
|
|
330
|
+
|
|
331
|
+
for (let index = withIndex + 1; index < scoped.length; index++) {
|
|
332
|
+
const line = scoped[index];
|
|
333
|
+
const indent = line.search(/\S/);
|
|
334
|
+
|
|
335
|
+
if (indent === -1) {
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
if (blockIndent >= 0 && indent > blockIndent) {
|
|
340
|
+
scoped[index] = line.slice(0, indent) + joinTargetPath(line.slice(indent), targetPath);
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
blockIndent = -1;
|
|
345
|
+
|
|
346
|
+
// Back out at the step's own key level: the `with:` block is over
|
|
347
|
+
if (indent <= keyIndent) {
|
|
348
|
+
break;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
const entry = /^([ \t]+)([A-Za-z0-9_-]+):[ \t]*(.*)$/.exec(line);
|
|
352
|
+
if (!entry || !inputs.includes(entry[2])) {
|
|
353
|
+
continue;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
if (/^[|>]/.test(entry[3])) {
|
|
357
|
+
blockIndent = entry[1].length;
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
scoped[index] = `${entry[1]}${entry[2]}: ${scopeValue(entry[3], targetPath)}`;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
return scoped;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// Prefix a YAML scalar's path with the target path, quotes preserved.
|
|
368
|
+
function scopeValue(value, targetPath) {
|
|
369
|
+
const quoted = /^(['"])(.*)\1$/.exec(value.trim());
|
|
370
|
+
if (!quoted) {
|
|
371
|
+
return joinTargetPath(value.trim(), targetPath);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
return `${quoted[1]}${joinTargetPath(quoted[2], targetPath)}${quoted[1]}`;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// A target-relative path/glob. Absolute paths and expression-built values name
|
|
378
|
+
// something other than a file in the checkout — those are left as written.
|
|
379
|
+
function joinTargetPath(value, targetPath) {
|
|
380
|
+
const trimmed = value.trim();
|
|
381
|
+
const scoped = trimmed.replace(/^\.\//, '');
|
|
382
|
+
|
|
383
|
+
if (!trimmed || trimmed.startsWith('/') || trimmed.startsWith('~') || trimmed.includes('${{') || scoped === targetPath || scoped.startsWith(`${targetPath}/`)) {
|
|
384
|
+
return trimmed;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
return `${targetPath}/${scoped}`;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// Declare `working-directory` on one run step's lines — a step that already
|
|
391
|
+
// declares its own is left alone.
|
|
392
|
+
function scopeRunStep(step, keyIndent, targetPath) {
|
|
393
|
+
const pad = ' '.repeat(keyIndent);
|
|
394
|
+
const declared = `working-directory: ${targetPath}`;
|
|
395
|
+
const alreadyScoped = /^[ \t]*- working-directory:/.test(step[0]) || step.some((line) => line.startsWith(`${pad}working-directory:`));
|
|
396
|
+
|
|
397
|
+
if (alreadyScoped) {
|
|
398
|
+
return step;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
const runIndex = step.findIndex((line, index) => (index === 0 ? /^[ \t]*- run:/.test(line) : line.startsWith(`${pad}run:`)));
|
|
402
|
+
if (runIndex === -1) {
|
|
403
|
+
return step;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
// A `- run: …` step carries its command on the dash line: working-directory
|
|
407
|
+
// takes the dash and `run:` moves to its own key line (a `|` block scalar's
|
|
408
|
+
// body is indented deeper, so it rides along untouched).
|
|
409
|
+
if (runIndex === 0) {
|
|
410
|
+
const dash = step[0].slice(0, step[0].indexOf('- ') + 2);
|
|
411
|
+
return [`${dash}${declared}`, `${pad}${step[0].slice(dash.length)}`, ...step.slice(1)];
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
return [...step.slice(0, runIndex), `${pad}${declared}`, ...step.slice(runIndex)];
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
// Delete the target-level copy of a workflow when the framework wrote every line
|
|
418
|
+
// of it (framework-owned); keep and report one carrying anything else.
|
|
419
|
+
function sweepTargetCopy(context) {
|
|
420
|
+
const { targetDir, targetPath, name, composedName, rendered, logger, result } = context;
|
|
421
|
+
const targetCopy = path.join(targetDir, '.github', 'workflows', name);
|
|
422
|
+
|
|
423
|
+
if (jetpack.exists(targetCopy) !== 'file') {
|
|
424
|
+
return;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
if (isFrameworkGeneration(jetpack.read(targetCopy), rendered)) {
|
|
428
|
+
jetpack.remove(targetCopy);
|
|
429
|
+
pruneEmptyDirs(path.dirname(targetCopy), targetDir);
|
|
430
|
+
result.removed.push(`.github/workflows/${name}`);
|
|
431
|
+
logger.log(`Removed ${targetPath}/.github/workflows/${name} — GitHub only runs workflows from the repo root`);
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
logger.warn(`Kept ${targetPath}/.github/workflows/${name} — it differs from the current framework template (your edits, or an older framework version), and GitHub NEVER runs a workflow from a target dir. Compare it against ${composedName}, move anything it still needs, then delete ${targetPath}/.github/workflows/${name}`);
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
// Is every line of the target's copy a line the current template still ships, in
|
|
439
|
+
// the template's own order? Then the framework wrote all of it and the copy is
|
|
440
|
+
// safe to delete. An exact match is the trivial case, and a copy a SUPERSEDED
|
|
441
|
+
// template wrote passes too, because templates evolve by GAINING lines (#189
|
|
442
|
+
// added the generated secrets block; every copy scaffolded before it is that
|
|
443
|
+
// same file minus those lines, #334). A line the consumer ADDED or CHANGED is a
|
|
444
|
+
// line no template of this framework ever shipped, so it fails here and the
|
|
445
|
+
// copy is kept. Accepted blind spot: an edit that ONLY deletes lines is still a
|
|
446
|
+
// subsequence and gets swept — bounded, because a target-dir workflow never runs
|
|
447
|
+
// and the composed root file is regenerated from the current template.
|
|
448
|
+
function isFrameworkGeneration(existing, rendered) {
|
|
449
|
+
const template = rendered.split('\n');
|
|
450
|
+
let cursor = 0;
|
|
451
|
+
|
|
452
|
+
for (const line of existing.split('\n')) {
|
|
453
|
+
cursor = template.indexOf(line, cursor);
|
|
454
|
+
if (cursor === -1) {
|
|
455
|
+
return false;
|
|
456
|
+
}
|
|
457
|
+
cursor++;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
return true;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
// Remove now-empty ancestor dirs of a swept file, stopping at (never removing) rootDir.
|
|
464
|
+
function pruneEmptyDirs(dir, rootDir) {
|
|
465
|
+
const root = path.resolve(rootDir);
|
|
466
|
+
let current = path.resolve(dir);
|
|
467
|
+
while (current !== root && current.startsWith(root + path.sep)) {
|
|
468
|
+
if ((jetpack.list(current) || []).length > 0) return;
|
|
469
|
+
jetpack.remove(current);
|
|
470
|
+
current = path.dirname(current);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
// posix-style target path — this string ends up inside a YAML workflow.
|
|
475
|
+
function relativePath(from, to) {
|
|
476
|
+
return path.relative(from, to).split(path.sep).join('/');
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
// The generation mark, written and read: one sentence, two directions. It says
|
|
480
|
+
// the file is framework-owned AND which target it belongs to, which is what
|
|
481
|
+
// makes the reconcile able to tell a composed file from a brand's own workflow
|
|
482
|
+
// without guessing from the name alone.
|
|
483
|
+
const generatedMark = (targetPath) => `# GENERATED by the ${targetPath} framework scaffold — do not edit.`;
|
|
484
|
+
// Reading accepts the LEGACY wording too (`# GENERATED by \`omega setup\` for
|
|
485
|
+
// <targetPath> — do not edit.`): a target dropped before the rewording keeps its
|
|
486
|
+
// old-header file forever, which is exactly the file the reconcile exists to
|
|
487
|
+
// remove. Composing only ever writes the current sentence.
|
|
488
|
+
const GENERATED_MARK = /^# GENERATED by (?:the (\S+) framework scaffold|`omega setup` for (\S+)) — do not edit\.$/;
|
|
489
|
+
|
|
490
|
+
// Which target a brand-root workflow file was composed for — null when the file
|
|
491
|
+
// is not a composed one. BOTH locks must hold: the generation mark on line 1,
|
|
492
|
+
// and the `<target>-<framework file>.yml` naming the compose writes.
|
|
493
|
+
function composedWorkflowOwner(name, contents) {
|
|
494
|
+
if (!/\.ya?ml$/.test(name)) {
|
|
495
|
+
return null;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
const marked = GENERATED_MARK.exec(contents.split('\n', 1)[0]);
|
|
499
|
+
if (!marked) {
|
|
500
|
+
return null;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
const targetPath = marked[1] || marked[2];
|
|
504
|
+
const target = path.basename(targetPath);
|
|
505
|
+
|
|
506
|
+
return name.startsWith(`${target}-`) ? { target, targetPath } : null;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
function header(targetPath) {
|
|
510
|
+
return [
|
|
511
|
+
generatedMark(targetPath),
|
|
512
|
+
'# GitHub runs workflows from the repo root only, so this brand\'s per-target CI',
|
|
513
|
+
`# lives here and every step after the checkout runs in ${targetPath}. Change the`,
|
|
514
|
+
'# target\'s config (or the framework template) and run any omega verb; this file is',
|
|
515
|
+
'# rewritten from scratch.',
|
|
516
|
+
'',
|
|
517
|
+
].join('\n');
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
module.exports = { composeWorkflow, composeTargetWorkflows, composedWorkflowName, reconcileComposedWorkflows };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clean build-output directories: remove each one and recreate it empty.
|
|
3
|
+
*
|
|
4
|
+
* `rm -rf` on Unix for speed; fs-jetpack on Windows (no rm there, and
|
|
5
|
+
* jetpack.remove retries transient locks). Relative paths resolve against
|
|
6
|
+
* process.cwd(), same as the framework clean commands that call this.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const { execSync } = require('child_process');
|
|
10
|
+
const jetpack = require('fs-jetpack');
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Remove and recreate each directory, leaving them empty.
|
|
14
|
+
* @param {string[]} dirs - Directories to clean (relative or absolute).
|
|
15
|
+
*/
|
|
16
|
+
function cleanDirs(dirs) {
|
|
17
|
+
for (const dir of dirs) {
|
|
18
|
+
if (process.platform !== 'win32') {
|
|
19
|
+
execSync(`rm -rf '${dir}'`, { stdio: 'ignore' });
|
|
20
|
+
} else {
|
|
21
|
+
jetpack.remove(dir);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
jetpack.dir(dir);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
module.exports = { cleanDirs };
|