@omega.js/desktop 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 +166 -0
- package/bin/omega +2 -0
- package/bin/omega-desktop +2 -0
- package/bin/omg +2 -0
- package/dist/assets/css/core/_fontawesome.scss +146 -0
- package/dist/assets/css/core/_initialize.scss +38 -0
- package/dist/assets/css/omega-desktop.scss +39 -0
- package/dist/assets/css/shell/_index.scss +207 -0
- package/dist/assets/css/tokens/_index.scss +166 -0
- package/dist/assets/js/bootstrap.bundle.js +1 -0
- package/dist/assets/js/core/app-shell.js +136 -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/build.js +249 -0
- package/dist/cli-run.js +34 -0
- package/dist/cli.js +49 -0
- package/dist/commands/build.js +32 -0
- package/dist/commands/cdp/capture.js +91 -0
- package/dist/commands/cdp/client.js +140 -0
- package/dist/commands/cdp/eval.js +20 -0
- package/dist/commands/cdp/quit.js +84 -0
- package/dist/commands/cdp/relaunch.js +62 -0
- package/dist/commands/cdp/shot.js +20 -0
- package/dist/commands/cdp/status.js +38 -0
- package/dist/commands/cdp/theme.js +21 -0
- package/dist/commands/cdp.js +53 -0
- package/dist/commands/clean.js +34 -0
- package/dist/commands/deploy.js +75 -0
- package/dist/commands/finalize-release.js +238 -0
- package/dist/commands/install.js +37 -0
- package/dist/commands/launch.js +150 -0
- package/dist/commands/lib/dependencies.js +35 -0
- package/dist/commands/lib/deploy-precheck.js +117 -0
- package/dist/commands/lib/ensure-target.js +300 -0
- package/dist/commands/logs.js +185 -0
- package/dist/commands/package.js +31 -0
- package/dist/commands/publish.js +34 -0
- package/dist/commands/push-secrets.js +141 -0
- package/dist/commands/release.js +286 -0
- package/dist/commands/runner.js +1874 -0
- package/dist/commands/sign-windows.js +563 -0
- package/dist/commands/test.js +121 -0
- package/dist/commands/update.js +21 -0
- package/dist/commands/validate-certs.js +238 -0
- package/dist/commands/version.js +9 -0
- package/dist/config/page-template.html +35 -0
- package/dist/defaults/.github/workflows/build.yml +276 -0
- package/dist/defaults/AGENTS.md +109 -0
- package/dist/defaults/CHANGELOG.md +15 -0
- package/dist/defaults/CLAUDE.md +1 -0
- package/dist/defaults/_.gitignore +24 -0
- package/dist/defaults/_mas/README.md +49 -0
- package/dist/defaults/_mas/entitlements.mas.inherit.plist +12 -0
- package/dist/defaults/_mas/entitlements.mas.loginhelper.plist +8 -0
- package/dist/defaults/_mas/entitlements.mas.plist +33 -0
- package/dist/defaults/config/certs/.gitkeep +0 -0
- package/dist/defaults/config/certs/README.md +60 -0
- package/dist/defaults/config/icons/macos/dmg.png +0 -0
- package/dist/defaults/config/icons/macos/icon.png +0 -0
- package/dist/defaults/config/icons/macos/tray.png +0 -0
- package/dist/defaults/config/icons/windows/icon.png +0 -0
- package/dist/defaults/config/omega.json5 +279 -0
- package/dist/defaults/docs/README.md +17 -0
- package/dist/defaults/gulpfile.js +6 -0
- package/dist/defaults/hooks/build/post.js +9 -0
- package/dist/defaults/hooks/build/pre.js +9 -0
- package/dist/defaults/hooks/notarize/post.js +16 -0
- package/dist/defaults/hooks/release/post.js +9 -0
- package/dist/defaults/hooks/release/pre.js +9 -0
- package/dist/defaults/src/assets/js/components/about/index.js +10 -0
- package/dist/defaults/src/assets/js/components/main/index.js +14 -0
- package/dist/defaults/src/assets/js/components/settings/index.js +10 -0
- package/dist/defaults/src/assets/scss/main.scss +34 -0
- package/dist/defaults/src/assets/scss/pages/about.scss +3 -0
- package/dist/defaults/src/assets/scss/pages/main.scss +4 -0
- package/dist/defaults/src/assets/scss/pages/settings.scss +3 -0
- package/dist/defaults/src/integrations/context-menu/index.js +60 -0
- package/dist/defaults/src/integrations/menu/index.js +58 -0
- package/dist/defaults/src/integrations/tray/index.js +60 -0
- package/dist/defaults/src/main.js +78 -0
- package/dist/defaults/src/preload.js +15 -0
- package/dist/defaults/src/views/about/index.html +3 -0
- package/dist/defaults/src/views/main/index.html +8 -0
- package/dist/defaults/src/views/settings/index.html +3 -0
- package/dist/defaults/test/README.md +41 -0
- package/dist/defaults/test/_init.js +10 -0
- package/dist/gulp/main.js +144 -0
- package/dist/gulp/tasks/audit.js +82 -0
- package/dist/gulp/tasks/build-config.js +445 -0
- package/dist/gulp/tasks/bundle.js +451 -0
- package/dist/gulp/tasks/defaults.js +20 -0
- package/dist/gulp/tasks/distribute.js +8 -0
- package/dist/gulp/tasks/html.js +95 -0
- package/dist/gulp/tasks/package-quick.js +102 -0
- package/dist/gulp/tasks/package.js +53 -0
- package/dist/gulp/tasks/release.js +57 -0
- package/dist/gulp/tasks/sass.js +82 -0
- package/dist/gulp/tasks/serve.js +191 -0
- package/dist/hooks/notarize.js +70 -0
- package/dist/index.js +14 -0
- package/dist/lib/_menu-mixin.js +199 -0
- package/dist/lib/analytics.js +360 -0
- package/dist/lib/app-state.js +220 -0
- package/dist/lib/auth-flow.js +160 -0
- package/dist/lib/auth-persistence.js +207 -0
- package/dist/lib/auto-updater.js +752 -0
- package/dist/lib/client-bridge.js +371 -0
- package/dist/lib/context-menu.js +302 -0
- package/dist/lib/context.js +162 -0
- package/dist/lib/deep-link.js +370 -0
- package/dist/lib/fontawesome.js +203 -0
- package/dist/lib/ipc.js +169 -0
- package/dist/lib/logger-lite.js +259 -0
- package/dist/lib/logger.js +4 -0
- package/dist/lib/menu.js +521 -0
- package/dist/lib/protocol.js +85 -0
- package/dist/lib/remote-config.js +224 -0
- package/dist/lib/remote-scripts.js +158 -0
- package/dist/lib/restart-manager/index.js +550 -0
- package/dist/lib/restart-manager/install.js +353 -0
- package/dist/lib/restart-manager/protocol.js +274 -0
- package/dist/lib/sign-helpers/auto-unlock.js +95 -0
- package/dist/lib/sign-helpers/entitlements.js +98 -0
- package/dist/lib/sign-helpers/resolve-icons.js +171 -0
- package/dist/lib/sign-helpers/sign-events.js +75 -0
- package/dist/lib/sign-helpers/update-info.js +186 -0
- package/dist/lib/startup.js +214 -0
- package/dist/lib/storage.js +193 -0
- package/dist/lib/templating.js +85 -0
- package/dist/lib/theme.js +173 -0
- package/dist/lib/tray.js +414 -0
- package/dist/lib/usage.js +141 -0
- package/dist/lib/window-manager.js +509 -0
- package/dist/main.js +542 -0
- package/dist/omega-bin.js +6 -0
- package/dist/preload.js +241 -0
- package/dist/renderer.js +456 -0
- package/dist/test/assert.js +4 -0
- package/dist/test/fixtures/consumer-app/config/omega.json5 +39 -0
- package/dist/test/fixtures/consumer-app/package.json +13 -0
- package/dist/test/fixtures/consumer-app/src/assets/js/components/main/index.js +11 -0
- package/dist/test/fixtures/consumer-app/src/assets/scss/main.scss +3 -0
- package/dist/test/fixtures/consumer-app/src/main.js +17 -0
- package/dist/test/fixtures/consumer-app/src/preload.js +4 -0
- package/dist/test/fixtures/consumer-app/src/views/main/index.html +4 -0
- package/dist/test/harness/boot-entry.js +237 -0
- package/dist/test/harness/main-entry.js +494 -0
- package/dist/test/harness/package.json +6 -0
- package/dist/test/harness/renderer-entry.js +173 -0
- package/dist/test/harness/renderer-preload.js +310 -0
- package/dist/test/harness/renderer.html +12 -0
- package/dist/test/index.js +65 -0
- package/dist/test/runner.js +99 -0
- package/dist/test/runners/boot.js +414 -0
- package/dist/test/runners/electron.js +92 -0
- package/dist/test/runners/render-event.js +46 -0
- package/dist/test/suites/boot/build-isolation.test.js +54 -0
- package/dist/test/suites/boot/consumer-app-boots.test.js +99 -0
- package/dist/test/suites/boot/restart-manager.test.js +38 -0
- package/dist/test/suites/boot/storage-bundled.test.js +59 -0
- package/dist/test/suites/boot/theme.test.js +68 -0
- package/dist/test/suites/boot/view-suite.test.js +47 -0
- package/dist/test/suites/build/attach-log-file.test.js +99 -0
- package/dist/test/suites/build/audit.test.js +271 -0
- package/dist/test/suites/build/boot-fixture.test.js +48 -0
- package/dist/test/suites/build/build-config.test.js +457 -0
- package/dist/test/suites/build/build-verbs.test.js +156 -0
- package/dist/test/suites/build/build-workflow-jobs.test.js +55 -0
- package/dist/test/suites/build/cdp.test.js +89 -0
- package/dist/test/suites/build/cli.test.js +135 -0
- package/dist/test/suites/build/config-schema.test.js +133 -0
- package/dist/test/suites/build/defaults-scaffold.test.js +192 -0
- package/dist/test/suites/build/deliver-certs.test.js +95 -0
- package/dist/test/suites/build/derive-signing-env.test.js +122 -0
- package/dist/test/suites/build/electron-node-version.test.js +49 -0
- package/dist/test/suites/build/electron-targets.test.js +92 -0
- package/dist/test/suites/build/ensure-target.test.js +131 -0
- package/dist/test/suites/build/entitlements.test.js +107 -0
- package/dist/test/suites/build/env-delivery.test.js +166 -0
- package/dist/test/suites/build/env-watch.test.js +86 -0
- package/dist/test/suites/build/exports.test.js +63 -0
- package/dist/test/suites/build/finalize-release.test.js +152 -0
- package/dist/test/suites/build/format-fetch-error.test.js +85 -0
- package/dist/test/suites/build/framework-deps.test.js +173 -0
- package/dist/test/suites/build/get-config.test.js +137 -0
- package/dist/test/suites/build/github-utils.test.js +54 -0
- package/dist/test/suites/build/icon-sheet.test.js +62 -0
- package/dist/test/suites/build/license-stamp.test.js +63 -0
- package/dist/test/suites/build/logger-lite.test.js +148 -0
- package/dist/test/suites/build/logs-command.test.js +226 -0
- package/dist/test/suites/build/manager.test.js +193 -0
- package/dist/test/suites/build/menu-mixin.test.js +130 -0
- package/dist/test/suites/build/merge-line-files.test.js +230 -0
- package/dist/test/suites/build/omega-shell.test.js +94 -0
- package/dist/test/suites/build/omega-tokens.test.js +64 -0
- package/dist/test/suites/build/project-scripts-deps.test.js +90 -0
- package/dist/test/suites/build/push-secrets.test.js +226 -0
- package/dist/test/suites/build/release-pipeline.test.js +365 -0
- package/dist/test/suites/build/renderer-auth-bridge.test.js +158 -0
- package/dist/test/suites/build/renderer-entry-key.test.js +37 -0
- package/dist/test/suites/build/renderer-node-shims.test.js +125 -0
- package/dist/test/suites/build/resolve-icons.test.js +296 -0
- package/dist/test/suites/build/resolve-signing-cert.test.js +342 -0
- package/dist/test/suites/build/restart-manager-install.test.js +178 -0
- package/dist/test/suites/build/restart-manager-protocol.test.js +158 -0
- package/dist/test/suites/build/run-consumer-hook.test.js +137 -0
- package/dist/test/suites/build/runner.test.js +2599 -0
- package/dist/test/suites/build/sanitize-signing-env.test.js +98 -0
- package/dist/test/suites/build/sanitize-url.test.js +78 -0
- package/dist/test/suites/build/secure-remote-url.test.js +42 -0
- package/dist/test/suites/build/sentry.test.js +89 -0
- package/dist/test/suites/build/serve-resolve-electron.test.js +58 -0
- package/dist/test/suites/build/setup-scripts.test.js +172 -0
- package/dist/test/suites/build/sign-events.test.js +90 -0
- package/dist/test/suites/build/sign-windows-e2e.test.js +302 -0
- package/dist/test/suites/build/sign-windows.test.js +313 -0
- package/dist/test/suites/build/strip-dev-blocks.test.js +116 -0
- package/dist/test/suites/build/templating.test.js +95 -0
- package/dist/test/suites/build/test-discovery.test.js +64 -0
- package/dist/test/suites/build/test-stealth.test.js +83 -0
- package/dist/test/suites/build/test-target-no-match.test.js +119 -0
- package/dist/test/suites/build/update-info.test.js +224 -0
- package/dist/test/suites/build/url-helpers.test.js +289 -0
- package/dist/test/suites/build/validate-certs.test.js +103 -0
- package/dist/test/suites/build/validate-config.test.js +90 -0
- package/dist/test/suites/build/verb-logs.test.js +43 -0
- package/dist/test/suites/build/wave5-pins.test.js +35 -0
- package/dist/test/suites/main/analytics.test.js +364 -0
- package/dist/test/suites/main/app-state.test.js +197 -0
- package/dist/test/suites/main/auth-flow.test.js +196 -0
- package/dist/test/suites/main/auth-persistence.test.js +167 -0
- package/dist/test/suites/main/auto-updater.test.js +1138 -0
- package/dist/test/suites/main/boot-sequence.test.js +77 -0
- package/dist/test/suites/main/client-bridge.integration.test.js +134 -0
- package/dist/test/suites/main/client-bridge.test.js +249 -0
- package/dist/test/suites/main/context-menu.test.js +365 -0
- package/dist/test/suites/main/context.test.js +155 -0
- package/dist/test/suites/main/deep-link.test.js +288 -0
- package/dist/test/suites/main/epipe-handler.test.js +40 -0
- package/dist/test/suites/main/fontawesome.test.js +147 -0
- package/dist/test/suites/main/harness-cdp.test.js +49 -0
- package/dist/test/suites/main/ipc.test.js +165 -0
- package/dist/test/suites/main/menu.test.js +419 -0
- package/dist/test/suites/main/protocol.test.js +77 -0
- package/dist/test/suites/main/remote-config.test.js +189 -0
- package/dist/test/suites/main/remote-scripts.test.js +276 -0
- package/dist/test/suites/main/restart-manager.test.js +328 -0
- package/dist/test/suites/main/startup-paths-and-ua.test.js +99 -0
- package/dist/test/suites/main/startup.test.js +129 -0
- package/dist/test/suites/main/stealth-window.test.js +74 -0
- package/dist/test/suites/main/storage.test.js +89 -0
- package/dist/test/suites/main/theme.test.js +137 -0
- package/dist/test/suites/main/tray.test.js +322 -0
- package/dist/test/suites/main/truncate-on-boot.test.js +22 -0
- package/dist/test/suites/main/url-helpers.test.js +429 -0
- package/dist/test/suites/main/usage.test.js +127 -0
- package/dist/test/suites/main/window-bounds.test.js +169 -0
- package/dist/test/suites/main/window-manager.test.js +233 -0
- package/dist/test/suites/renderer/analytics-bridge.test.js +128 -0
- package/dist/test/suites/renderer/cross-context-helpers.test.js +131 -0
- package/dist/test/suites/renderer/fontawesome.test.js +190 -0
- package/dist/test/suites/renderer/round-trip.test.js +107 -0
- package/dist/test/suites/renderer/theme.test.js +118 -0
- package/dist/test/suites/renderer/tooltips.test.js +166 -0
- package/dist/test/suites/renderer/verts.test.js +100 -0
- package/dist/test/suites/renderer/window-em-surface.test.js +107 -0
- package/dist/test/utils/dist-snapshot.js +36 -0
- package/dist/test/utils/extended-mode-warning.js +13 -0
- package/dist/utils/app-root.js +28 -0
- package/dist/utils/attach-log-file.js +4 -0
- package/dist/utils/build-pipeline.js +58 -0
- package/dist/utils/deliver-certs.js +69 -0
- package/dist/utils/derive-signing-env.js +56 -0
- package/dist/utils/dist-root.js +21 -0
- package/dist/utils/electron-node-version.js +48 -0
- package/dist/utils/electron-targets.js +72 -0
- package/dist/utils/format-fetch-error.js +38 -0
- package/dist/utils/github.js +73 -0
- package/dist/utils/load-consumer-file.js +26 -0
- package/dist/utils/merge-line-files.js +5 -0
- package/dist/utils/mode-helpers.js +147 -0
- package/dist/utils/resolve-signing-cert.js +175 -0
- package/dist/utils/run-consumer-hook.js +38 -0
- package/dist/utils/runner-env.js +687 -0
- package/dist/utils/safe-install.js +4 -0
- package/dist/utils/sanitize-signing-env.js +45 -0
- package/dist/utils/sanitize-url.js +28 -0
- package/dist/utils/secure-remote-url.js +25 -0
- package/dist/utils/stealth-window.js +37 -0
- package/dist/utils/test-stealth.js +29 -0
- package/dist/utils/url-helpers.js +169 -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/analytics/adapters/ga4.js +26 -0
- package/dist/vendor/analytics/adapters/meta.js +26 -0
- package/dist/vendor/analytics/adapters/resolve.js +130 -0
- package/dist/vendor/analytics/adapters/tiktok.js +27 -0
- package/dist/vendor/analytics/catalog.js +908 -0
- package/dist/vendor/analytics/consent.js +49 -0
- package/dist/vendor/analytics/core.js +141 -0
- package/dist/vendor/analytics/identity.js +136 -0
- package/dist/vendor/analytics/index.js +170 -0
- package/dist/vendor/analytics/logger.js +40 -0
- package/dist/vendor/analytics/transports/browser.js +110 -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/certs.js +199 -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/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/prompt.js +187 -0
- package/dist/vendor/devkit/safe-install.js +18 -0
- package/dist/vendor/devkit/scaffold-guard.js +96 -0
- package/dist/vendor/devkit/stop-signals.js +28 -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/update.js +569 -0
- package/dist/vendor/monitoring/core.js +180 -0
- package/dist/vendor/monitoring/env.js +49 -0
- package/dist/vendor/monitoring/index.js +28 -0
- package/dist/vendor/monitoring/logger.js +39 -0
- package/dist/vendor/monitoring/main.js +99 -0
- package/dist/vendor/monitoring/preload.js +45 -0
- package/dist/vendor/monitoring/renderer.js +87 -0
- package/docs/analytics.md +140 -0
- package/docs/app-state.md +92 -0
- package/docs/audit.md +69 -0
- package/docs/auto-updater.md +243 -0
- package/docs/boot-sequence.md +39 -0
- package/docs/build-system.md +161 -0
- package/docs/cdp-debugging.md +169 -0
- package/docs/client-bridge.md +267 -0
- package/docs/common-mistakes.md +21 -0
- package/docs/config-schema.md +120 -0
- package/docs/context-menu.md +112 -0
- package/docs/context.md +81 -0
- package/docs/css.md +84 -0
- package/docs/deep-link.md +178 -0
- package/docs/environment-detection.md +104 -0
- package/docs/fontawesome.md +107 -0
- package/docs/hooks.md +87 -0
- package/docs/icons.md +79 -0
- package/docs/index.md +279 -0
- package/docs/installer-options.md +162 -0
- package/docs/ipc.md +61 -0
- package/docs/lib-modules.md +53 -0
- package/docs/logging.md +229 -0
- package/docs/menu.md +160 -0
- package/docs/releasing.md +229 -0
- package/docs/remote-config.md +118 -0
- package/docs/remote-scripts.md +144 -0
- package/docs/restart-manager.md +144 -0
- package/docs/runner.md +253 -0
- package/docs/sentry.md +97 -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/signing.md +267 -0
- package/docs/startup.md +142 -0
- package/docs/storage.md +59 -0
- package/docs/templating.md +101 -0
- package/docs/test-boot-layer.md +157 -0
- package/docs/test-framework.md +357 -0
- package/docs/themes.md +135 -0
- package/docs/tooltips.md +99 -0
- package/docs/tray.md +164 -0
- package/docs/usage.md +58 -0
- package/docs/verts.md +62 -0
- package/docs/windows.md +149 -0
- package/package.json +184 -0
- package/scripts/sync-nvmrc.js +100 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
// `npx omega logs [runtime|dev|build|test]` — show / tail / locate one of the
|
|
2
|
+
// project's log files.
|
|
3
|
+
//
|
|
4
|
+
// The optional positional names the surface (default `runtime`) and resolves to
|
|
5
|
+
// <projectRoot>/logs/<surface>.log — the same four files documented in
|
|
6
|
+
// docs/logging.md. Every flag below works on whichever surface was named.
|
|
7
|
+
//
|
|
8
|
+
// `runtime` resolves to the file the runtime logger writes to:
|
|
9
|
+
// - Dev (running from a project directory): <projectRoot>/logs/runtime.log
|
|
10
|
+
// - Outside a project: prints the conventional Electron user-data path the runtime
|
|
11
|
+
// would resolve to in production, but doesn't read it (we don't know the AppName
|
|
12
|
+
// from outside the running app).
|
|
13
|
+
//
|
|
14
|
+
// Flags:
|
|
15
|
+
// (default) Print the resolved path, then `tail -50` of the file.
|
|
16
|
+
// --tail / -f Follow mode — keep printing as the file grows. Ctrl+C to stop.
|
|
17
|
+
// --path / -p Just print the resolved path. Useful for piping to your own tools.
|
|
18
|
+
// --open Open the log file in the OS default editor.
|
|
19
|
+
// --lines=<N> How many lines for the default (non-follow) read. Defaults to 50.
|
|
20
|
+
|
|
21
|
+
const path = require('path');
|
|
22
|
+
const fs = require('fs');
|
|
23
|
+
const jetpack = require('fs-jetpack');
|
|
24
|
+
const { spawn, spawnSync } = require('child_process');
|
|
25
|
+
const { STOP_SIGNALS } = require('../vendor/devkit/stop-signals.js');
|
|
26
|
+
|
|
27
|
+
// The tee'd surfaces a project writes into logs/ — one file each, same names on
|
|
28
|
+
// every framework (docs/shared/logging.md).
|
|
29
|
+
const SURFACES = ['runtime', 'dev', 'build', 'test'];
|
|
30
|
+
|
|
31
|
+
module.exports = async function logs(options) {
|
|
32
|
+
options = options || {};
|
|
33
|
+
options._ = options._ || [];
|
|
34
|
+
|
|
35
|
+
// `omega logs dev` → options._ = ['logs', 'dev'], the router's positional
|
|
36
|
+
// convention. No positional keeps the historical runtime surface.
|
|
37
|
+
const surface = options._[1] || 'runtime';
|
|
38
|
+
if (!SURFACES.includes(surface)) {
|
|
39
|
+
throw new Error(`Unknown log surface "${surface}". Try one of: ${SURFACES.join(', ')}.`);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const logPath = resolveLogPath(surface);
|
|
43
|
+
const exists = jetpack.exists(logPath) === 'file';
|
|
44
|
+
|
|
45
|
+
// --path: print and exit. Pipe-friendly.
|
|
46
|
+
if (options.path || options.p) {
|
|
47
|
+
console.log(logPath);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// --open: open in default editor and exit.
|
|
52
|
+
if (options.open) {
|
|
53
|
+
if (!exists) {
|
|
54
|
+
console.error(`No log file at ${logPath}. Run the app or verb that writes it at least once to generate logs.`);
|
|
55
|
+
process.exitCode = 1;
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
openInDefaultEditor(logPath);
|
|
59
|
+
console.log(`Opened ${logPath}`);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// --tail / -f: follow mode.
|
|
64
|
+
if (options.tail || options.f) {
|
|
65
|
+
if (!exists) {
|
|
66
|
+
// It's fine to follow a file that doesn't exist yet — we'll start tailing once
|
|
67
|
+
// it appears. Useful workflow: launch `mgr logs --tail` in one terminal, then
|
|
68
|
+
// `npm start` in another, and watch the log appear.
|
|
69
|
+
console.log(`Watching for log file at ${logPath} (will start tailing once it exists)...`);
|
|
70
|
+
jetpack.dir(path.dirname(logPath));
|
|
71
|
+
}
|
|
72
|
+
return tailFollow(logPath);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Default: print path + last N lines.
|
|
76
|
+
const lines = parseInt(options.lines, 10) || 50;
|
|
77
|
+
console.log(`Log file: ${logPath}`);
|
|
78
|
+
if (!exists) {
|
|
79
|
+
console.log('(file does not exist yet — run the app or verb that writes it to generate logs)');
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
console.log(`(last ${lines} lines)`);
|
|
83
|
+
console.log('─'.repeat(60));
|
|
84
|
+
const content = fs.readFileSync(logPath, 'utf8');
|
|
85
|
+
const allLines = content.split(/\r?\n/);
|
|
86
|
+
const tailLines = allLines.slice(Math.max(0, allLines.length - lines));
|
|
87
|
+
process.stdout.write(tailLines.join('\n'));
|
|
88
|
+
if (!tailLines[tailLines.length - 1]?.endsWith('\n')) process.stdout.write('\n');
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// Resolve a surface's log path the same way its writer does — for `runtime`,
|
|
92
|
+
// that's lib/logger-lite.js. We don't require logger-lite here because that
|
|
93
|
+
// would attempt to load `electron`, which is only available when running inside
|
|
94
|
+
// the Electron runtime (not from a CLI).
|
|
95
|
+
function resolveLogPath(surface) {
|
|
96
|
+
// CLI runs from the consumer project root, so this matches dev-mode logger
|
|
97
|
+
// resolution exactly: <cwd>/logs/<surface>.log.
|
|
98
|
+
return path.join(process.cwd(), 'logs', `${surface}.log`);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Cross-platform "open in default app" — uses the OS's URL/file handler.
|
|
102
|
+
function openInDefaultEditor(filePath) {
|
|
103
|
+
const platform = process.platform;
|
|
104
|
+
if (platform === 'darwin') {
|
|
105
|
+
spawnSync('open', [filePath], { stdio: 'inherit' });
|
|
106
|
+
} else if (platform === 'win32') {
|
|
107
|
+
// start needs the shell to interpret it. Empty quoted title arg avoids cmd
|
|
108
|
+
// treating the first quoted token as a window title.
|
|
109
|
+
spawnSync('cmd', ['/c', 'start', '""', filePath], { stdio: 'inherit' });
|
|
110
|
+
} else {
|
|
111
|
+
spawnSync('xdg-open', [filePath], { stdio: 'inherit' });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// `tail -f` semantics, implemented in pure Node so it works on Windows where there's
|
|
116
|
+
// no `tail` binary. Strategy:
|
|
117
|
+
// 1. Print everything in the file already (so user has full context).
|
|
118
|
+
// 2. Watch the file for size changes; on each change, read from the previous size
|
|
119
|
+
// to the new size and print the delta.
|
|
120
|
+
// 3. Handle truncation (file rotation) by resetting the offset to 0.
|
|
121
|
+
//
|
|
122
|
+
// Returns a Promise that resolves when the user Ctrl+Cs (or the watcher errors).
|
|
123
|
+
function tailFollow(logPath) {
|
|
124
|
+
return new Promise((resolve) => {
|
|
125
|
+
let lastSize = 0;
|
|
126
|
+
|
|
127
|
+
// Initial dump of everything currently in the file.
|
|
128
|
+
if (jetpack.exists(logPath) === 'file') {
|
|
129
|
+
const data = fs.readFileSync(logPath, 'utf8');
|
|
130
|
+
process.stdout.write(data);
|
|
131
|
+
lastSize = Buffer.byteLength(data, 'utf8');
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// fs.watch fires on rename / change events. We poll on change rather than
|
|
135
|
+
// streaming because Node's stream interface against a growing file is fiddly
|
|
136
|
+
// (you have to manage your own offset anyway).
|
|
137
|
+
let watcher;
|
|
138
|
+
try {
|
|
139
|
+
jetpack.dir(path.dirname(logPath));
|
|
140
|
+
watcher = fs.watch(path.dirname(logPath), { persistent: true }, (eventType, filename) => {
|
|
141
|
+
if (filename !== path.basename(logPath)) return;
|
|
142
|
+
try {
|
|
143
|
+
if (jetpack.exists(logPath) !== 'file') return;
|
|
144
|
+
const stat = fs.statSync(logPath);
|
|
145
|
+
if (stat.size < lastSize) {
|
|
146
|
+
// File was truncated (rotation). Reset and re-read from start.
|
|
147
|
+
lastSize = 0;
|
|
148
|
+
process.stdout.write('\n--- log rotated ---\n');
|
|
149
|
+
}
|
|
150
|
+
if (stat.size > lastSize) {
|
|
151
|
+
const fd = fs.openSync(logPath, 'r');
|
|
152
|
+
try {
|
|
153
|
+
const buf = Buffer.alloc(stat.size - lastSize);
|
|
154
|
+
fs.readSync(fd, buf, 0, buf.length, lastSize);
|
|
155
|
+
process.stdout.write(buf.toString('utf8'));
|
|
156
|
+
lastSize = stat.size;
|
|
157
|
+
} finally {
|
|
158
|
+
fs.closeSync(fd);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
} catch (e) {
|
|
162
|
+
// File may have been momentarily missing during rotation — just wait
|
|
163
|
+
// for the next event.
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
watcher.on('error', (e) => {
|
|
167
|
+
console.error(`watcher error: ${e.message}`);
|
|
168
|
+
resolve();
|
|
169
|
+
});
|
|
170
|
+
} catch (e) {
|
|
171
|
+
console.error(`Could not watch ${logPath}: ${e.message}`);
|
|
172
|
+
resolve();
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Clean up on every way this follow is asked to stop, off the ONE devkit
|
|
177
|
+
// list ([#629](https://github.com/Omega-JS-Stack/omega/issues/629)): a
|
|
178
|
+
// closed terminal (SIGHUP) used to kill the run with the watcher still open.
|
|
179
|
+
STOP_SIGNALS.forEach((signal) => process.on(signal, () => {
|
|
180
|
+
if (watcher) watcher.close();
|
|
181
|
+
console.log('\n(stopped following)');
|
|
182
|
+
resolve();
|
|
183
|
+
}));
|
|
184
|
+
});
|
|
185
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Libraries
|
|
2
|
+
const Manager = new (require('../build.js'));
|
|
3
|
+
const logger = Manager.logger('package');
|
|
4
|
+
const { runPipeline } = require('../utils/build-pipeline.js');
|
|
5
|
+
|
|
6
|
+
// `npx omega package` (the consumer's `package` script) builds the full installer
|
|
7
|
+
// set; `--quick` (the `package:quick` script) builds only the host platform/arch.
|
|
8
|
+
// That is ALL `--quick` does (#737): the build ahead of it is full and cold, and
|
|
9
|
+
// the flag is read here and nowhere else.
|
|
10
|
+
function plan(options) {
|
|
11
|
+
options = options || {};
|
|
12
|
+
|
|
13
|
+
const quick = options.quick === true || options.q === true;
|
|
14
|
+
|
|
15
|
+
return {
|
|
16
|
+
env: { OMEGA_BUILD_MODE: 'true' },
|
|
17
|
+
steps: [
|
|
18
|
+
{ type: 'clean' },
|
|
19
|
+
{ type: 'certs' },
|
|
20
|
+
{ type: 'gulp', task: quick ? 'packageQuick' : 'packageBuild' },
|
|
21
|
+
],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
module.exports = async function (options) {
|
|
26
|
+
logger.log('Running package...');
|
|
27
|
+
|
|
28
|
+
await runPipeline(plan(options), options);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
module.exports.plan = plan;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Libraries
|
|
2
|
+
const Manager = new (require('../build.js'));
|
|
3
|
+
const logger = Manager.logger('publish');
|
|
4
|
+
const { runPipeline } = require('../utils/build-pipeline.js');
|
|
5
|
+
|
|
6
|
+
// `npx omega publish` publishes from an already-built tree (the CI lane calls it
|
|
7
|
+
// after its own build); `--local` (the consumer's `release:local` script) cleans
|
|
8
|
+
// first. Both deliver the Apple signing artifacts (#678) and then run cert
|
|
9
|
+
// validation before the gulp task — a warning gate unless `--strict` makes it
|
|
10
|
+
// fatal (validate-certs.js owns that).
|
|
11
|
+
function plan(options) {
|
|
12
|
+
options = options || {};
|
|
13
|
+
|
|
14
|
+
const steps = [];
|
|
15
|
+
|
|
16
|
+
if (options.local === true) {
|
|
17
|
+
steps.push({ type: 'clean' });
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
steps.push({ type: 'certs' }, { type: 'validate-certs' }, { type: 'gulp', task: 'publish' });
|
|
21
|
+
|
|
22
|
+
return {
|
|
23
|
+
env: { OMEGA_BUILD_MODE: 'true', OMEGA_IS_PUBLISH: 'true' },
|
|
24
|
+
steps: steps,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
module.exports = async function (options) {
|
|
29
|
+
logger.log('Running publish...');
|
|
30
|
+
|
|
31
|
+
await runPipeline(plan(options), options);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
module.exports.plan = plan;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `.env` → GitHub Actions secrets publisher for the desktop target.
|
|
3
|
+
*
|
|
4
|
+
* Since [#682](https://github.com/Omega-JS-Stack/omega/issues/682) this is a
|
|
5
|
+
* BIND of `@omega.js/devkit/target-secrets`, exactly as web and the extension
|
|
6
|
+
* are: the same derive (the schema's desktop delivery set, #627) → collect (the
|
|
7
|
+
* COMPOSED target env, company ← brand ← target, files only, #678) → guard (the
|
|
8
|
+
* brand's DECLARED repo, never an inferred remote) → publish, over the ONE `gh`
|
|
9
|
+
* transport (values on stdin, never logged), with the same five loud skips. It
|
|
10
|
+
* used to run @octokit/rest + libsodium-wrappers itself on a GH_TOKEN PAT the
|
|
11
|
+
* consumer had to mint; `gh`'s own auth session is the credential now and the
|
|
12
|
+
* sealed-box crypto is the CLI's.
|
|
13
|
+
*
|
|
14
|
+
* What is desktop's OWN is the value resolver, the seam the shared publisher
|
|
15
|
+
* applies between collect and publish: a desktop secret can name a FILE
|
|
16
|
+
* (`CSC_LINK=config/certs/dev-id.p12`, `APPLE_API_KEY=.omega/secrets/key.p8` —
|
|
17
|
+
* target-root relative, falling back to the brand root), and CI needs the
|
|
18
|
+
* BYTES, so an existing file publishes as its base64 contents. The workflow
|
|
19
|
+
* decodes it back to a temp file at job start.
|
|
20
|
+
*
|
|
21
|
+
* Usage:
|
|
22
|
+
* npx omega push-secrets # push every composed desktop key
|
|
23
|
+
* npx omega push-secrets --only=GH_TOKEN,CSC_LINK
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
const path = require('path');
|
|
27
|
+
const fs = require('fs');
|
|
28
|
+
|
|
29
|
+
const Manager = new (require('../build.js'));
|
|
30
|
+
const logger = Manager.logger('push-secrets');
|
|
31
|
+
const { collectTargetSecrets, declaredBrandRepo: declaredRepoFor, publishTargetSecrets } = require('../vendor/devkit/target-secrets.js');
|
|
32
|
+
const { findBrandRoot } = require('../vendor/config/index.js');
|
|
33
|
+
|
|
34
|
+
const TARGET = 'desktop';
|
|
35
|
+
|
|
36
|
+
module.exports = async function (options) {
|
|
37
|
+
options = options || {};
|
|
38
|
+
|
|
39
|
+
return publishEnvSecrets({
|
|
40
|
+
targetDir: process.cwd(),
|
|
41
|
+
logger,
|
|
42
|
+
only: options.only,
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Desktop's value seam: base64 for a value that names an existing file, the
|
|
48
|
+
* value itself otherwise, and null for a key `--only` leaves out (the publisher
|
|
49
|
+
* drops a falsy value, the same way it drops an empty composed one).
|
|
50
|
+
*
|
|
51
|
+
* @param {object} options
|
|
52
|
+
* @param {string} options.targetDir - The target root.
|
|
53
|
+
* @param {string} [options.only] - Comma-separated key names to narrow to.
|
|
54
|
+
* @returns {function} `(value, key) => string|null`
|
|
55
|
+
*/
|
|
56
|
+
function fileValueResolver(options) {
|
|
57
|
+
const { targetDir } = options;
|
|
58
|
+
const only = options.only ? String(options.only).split(',').map((s) => s.trim()).filter(Boolean) : null;
|
|
59
|
+
const brandRoot = findBrandRoot(targetDir);
|
|
60
|
+
|
|
61
|
+
return (value, key) => {
|
|
62
|
+
if (only && !only.includes(key)) return null;
|
|
63
|
+
return fileContentsBase64(value, { targetDir, brandRoot }) || value;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// The base64 contents of the file `value` names, or null when it names none.
|
|
68
|
+
// Heuristic: a path-shaped value (a separator, or a typical cert/key extension)
|
|
69
|
+
// that resolves to a real file under the target root or the brand root. A
|
|
70
|
+
// path-shaped value that exists nowhere is pushed as-is — it is a string.
|
|
71
|
+
function fileContentsBase64(value, { targetDir, brandRoot }) {
|
|
72
|
+
const looksLikePath = /[/\\]/.test(value) || /\.(p12|pem|cer|p8|provisionprofile|crt|key|json)$/i.test(value);
|
|
73
|
+
if (!looksLikePath) return null;
|
|
74
|
+
|
|
75
|
+
const roots = path.isAbsolute(value) ? [''] : [targetDir, brandRoot].filter(Boolean);
|
|
76
|
+
for (const root of roots) {
|
|
77
|
+
const absolute = path.isAbsolute(value) ? value : path.join(root, value);
|
|
78
|
+
if (fs.existsSync(absolute) && fs.statSync(absolute).isFile()) {
|
|
79
|
+
return fs.readFileSync(absolute).toString('base64');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* The publishable secrets: the schema's desktop delivery set, valued from the
|
|
88
|
+
* composed env with file-path values resolved to their base64 contents. An
|
|
89
|
+
* empty value never claims a key.
|
|
90
|
+
*
|
|
91
|
+
* @param {string} targetDir - The target root (its .env is the local layer).
|
|
92
|
+
* @param {object} [options]
|
|
93
|
+
* @param {string} [options.only] - Comma-separated key names to narrow to.
|
|
94
|
+
* @returns {Object<string, string>} key → value, ready to publish.
|
|
95
|
+
*/
|
|
96
|
+
function collectEnvSecrets(targetDir, options) {
|
|
97
|
+
return collectTargetSecrets({
|
|
98
|
+
targetDir,
|
|
99
|
+
target: TARGET,
|
|
100
|
+
resolveValue: fileValueResolver({ targetDir, only: (options || {}).only }),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* The brand's OWN repo as `owner/name`, from the composed config. Null when the
|
|
106
|
+
* config declares nothing usable or doesn't load.
|
|
107
|
+
*
|
|
108
|
+
* @param {string} targetDir - The target root.
|
|
109
|
+
* @returns {string|null}
|
|
110
|
+
*/
|
|
111
|
+
function declaredBrandRepo(targetDir) {
|
|
112
|
+
return declaredRepoFor({ targetDir, target: TARGET });
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* The `omega deploy` precheck step: publish the target's composed values as
|
|
117
|
+
* repo Actions secrets.
|
|
118
|
+
*
|
|
119
|
+
* @param {object} options
|
|
120
|
+
* @param {string} options.targetDir - The target root.
|
|
121
|
+
* @param {object} options.logger - `{ log, warn, error }`.
|
|
122
|
+
* @param {object} [options.env] - Env map (default: process.env).
|
|
123
|
+
* @param {string} [options.only] - Comma-separated key names to narrow to (`--only`).
|
|
124
|
+
* @param {function} [options.execFn] - Injectable `gh` exec (tests).
|
|
125
|
+
* @param {function} [options.gitExecFn] - Injectable `git` exec for remote discovery (tests).
|
|
126
|
+
* @returns {{ skipped: string }|{ published: string[], failed: Array<object> }}
|
|
127
|
+
*/
|
|
128
|
+
function publishEnvSecrets(options) {
|
|
129
|
+
options = options || {};
|
|
130
|
+
|
|
131
|
+
return publishTargetSecrets({
|
|
132
|
+
...options,
|
|
133
|
+
target: TARGET,
|
|
134
|
+
resolveValue: fileValueResolver({ targetDir: options.targetDir, only: options.only }),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
module.exports.collectEnvSecrets = collectEnvSecrets;
|
|
139
|
+
module.exports.declaredBrandRepo = declaredBrandRepo;
|
|
140
|
+
module.exports.fileValueResolver = fileValueResolver;
|
|
141
|
+
module.exports.publishEnvSecrets = publishEnvSecrets;
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
// release — trigger the GitHub Actions Build & Release workflow + stream logs locally.
|
|
2
|
+
//
|
|
3
|
+
// Replaces the old "do it from my laptop" release flow with "let CI do it, but make it
|
|
4
|
+
// feel local." User runs `npm run release` (or `npx omega release`) and gets:
|
|
5
|
+
// 1. A workflow_dispatch POST to GH Actions on the brand's repo (owner/repo from the
|
|
6
|
+
// config, and the workflow file the scaffold actually wrote: see dispatchTarget).
|
|
7
|
+
// 2. A few seconds of waiting while GH spins up the run.
|
|
8
|
+
// 3. Live polling of every job's logs at 5s intervals, printing NEW lines as they
|
|
9
|
+
// arrive (job-prefixed) so it looks like streaming.
|
|
10
|
+
// 4. Everything teed to <root>/logs/ci.log with ANSI codes preserved on stdout
|
|
11
|
+
// and stripped from the file (matches the dev/build log convention).
|
|
12
|
+
// 5. Exit 0 on success, 1 on any job failure.
|
|
13
|
+
//
|
|
14
|
+
// Why poll instead of stream? GH Actions doesn't expose live stdout — logs are only
|
|
15
|
+
// fetchable AFTER each STEP completes. So "streaming" is a polite fiction: every 5s
|
|
16
|
+
// we re-fetch each job's logs and diff against what we already printed.
|
|
17
|
+
|
|
18
|
+
const path = require('path');
|
|
19
|
+
const fs = require('fs');
|
|
20
|
+
const jetpack = require('fs-jetpack');
|
|
21
|
+
|
|
22
|
+
const { getOctokit } = require('../utils/github.js');
|
|
23
|
+
const { dispatchRepo } = require('../vendor/devkit/deploy.js');
|
|
24
|
+
const Manager = new (require('../build.js'));
|
|
25
|
+
|
|
26
|
+
const logger = Manager.logger('release');
|
|
27
|
+
|
|
28
|
+
const POLL_INTERVAL_MS = 5000;
|
|
29
|
+
|
|
30
|
+
module.exports = async function release(options = {}) {
|
|
31
|
+
const projectRoot = process.cwd();
|
|
32
|
+
|
|
33
|
+
if (!process.env.GH_TOKEN) {
|
|
34
|
+
throw new Error('GH_TOKEN not set in env. Set it in .env (or shell) so we can dispatch the workflow.');
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// silent: true — suppress octokit's default console output for transient 404s
|
|
38
|
+
// (in-progress job logs return 404 until the step completes).
|
|
39
|
+
const octokit = getOctokit({ silent: true });
|
|
40
|
+
if (!octokit) {
|
|
41
|
+
throw new Error('Failed to create octokit (missing GH_TOKEN?).');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const { owner, repo, workflow: WORKFLOW_FILE } = dispatchTarget({ projectRoot, config: Manager.getConfig() });
|
|
45
|
+
|
|
46
|
+
// Discover ref (current branch or override via --ref).
|
|
47
|
+
const ref = options.ref || (await currentBranch(projectRoot)) || 'main';
|
|
48
|
+
|
|
49
|
+
// Optional --platforms / --platform flag forwarded as a workflow input. Accepts a
|
|
50
|
+
// single value ('windows') or comma-separated list ('mac,linux'). Special value
|
|
51
|
+
// 'all' or undefined builds every platform — same as the workflow's default. We
|
|
52
|
+
// only attach `inputs` when the user explicitly passed a flag, so older consumer
|
|
53
|
+
// workflows (without a `platforms` input declared) keep working unchanged.
|
|
54
|
+
const platforms = options.platforms || options.platform || null;
|
|
55
|
+
|
|
56
|
+
const dispatchArgs = { owner, repo, workflow_id: WORKFLOW_FILE, ref };
|
|
57
|
+
if (platforms) dispatchArgs.inputs = { platforms: String(platforms) };
|
|
58
|
+
|
|
59
|
+
const platformsLabel = platforms ? ` (platforms=${platforms})` : '';
|
|
60
|
+
logger.log(`Triggering ${owner}/${repo} workflow ${WORKFLOW_FILE} on ref=${ref}${platformsLabel}...`);
|
|
61
|
+
|
|
62
|
+
// 1. Mark a "before" timestamp so we can identify the new run we just dispatched.
|
|
63
|
+
const before = new Date();
|
|
64
|
+
|
|
65
|
+
// 2. Dispatch.
|
|
66
|
+
await octokit.rest.actions.createWorkflowDispatch(dispatchArgs);
|
|
67
|
+
|
|
68
|
+
// 3. Wait for the new run to appear (GH Actions takes a few seconds to register it).
|
|
69
|
+
const run = await waitForNewRun({ octokit, owner, repo, after: before, workflowFile: WORKFLOW_FILE });
|
|
70
|
+
if (!run) {
|
|
71
|
+
throw new Error('Workflow dispatch succeeded but no new run appeared after 60s. Check GitHub Actions UI.');
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
logger.log(`Run started: ${run.html_url}`);
|
|
75
|
+
require('../vendor/devkit/deploy-record.js').recordDeploy({ dir: projectRoot, target: 'desktop', detail: { method: 'release-dispatch' } });
|
|
76
|
+
|
|
77
|
+
// 4. Set up the CI log tee.
|
|
78
|
+
const logsDir = path.join(projectRoot, 'logs');
|
|
79
|
+
jetpack.dir(logsDir);
|
|
80
|
+
const ciLogPath = path.join(logsDir, 'ci.log');
|
|
81
|
+
// Truncate so each release run starts fresh.
|
|
82
|
+
fs.writeFileSync(ciLogPath, `# release run ${run.html_url}\n# started ${new Date().toISOString()}\n\n`);
|
|
83
|
+
const logFile = fs.createWriteStream(ciLogPath, { flags: 'a' });
|
|
84
|
+
|
|
85
|
+
// Spinner state. We tick every 250ms even between polls so the terminal feels alive.
|
|
86
|
+
// The spinner line uses \r to overwrite itself; before printing real content we clear
|
|
87
|
+
// the line, write content, then re-render the spinner. File output is unaffected.
|
|
88
|
+
const startedAt = Date.now();
|
|
89
|
+
const isTty = process.stdout.isTTY === true;
|
|
90
|
+
const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
91
|
+
let spinnerFrame = 0;
|
|
92
|
+
let pollCount = 0;
|
|
93
|
+
let latestState = null;
|
|
94
|
+
let latestJobs = [];
|
|
95
|
+
|
|
96
|
+
function clearSpinner() {
|
|
97
|
+
if (!isTty) return;
|
|
98
|
+
process.stdout.write('\r\x1b[2K');
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function renderSpinner() {
|
|
102
|
+
if (!isTty || !latestState) return;
|
|
103
|
+
const frame = SPINNER_FRAMES[spinnerFrame % SPINNER_FRAMES.length];
|
|
104
|
+
const elapsed = formatElapsed(Date.now() - startedAt);
|
|
105
|
+
const status = `${latestState.status}${latestState.conclusion ? ` (${latestState.conclusion})` : ''}`;
|
|
106
|
+
const jobBits = latestJobs.map((j) => `${jobSymbol(j)} ${j.name}`).join(' ');
|
|
107
|
+
const line = `${frame} ${status} · ${elapsed} · ${pollCount} polls · ${jobBits}`;
|
|
108
|
+
// Truncate so we never wrap (which breaks the \r overwrite).
|
|
109
|
+
const cols = process.stdout.columns || 120;
|
|
110
|
+
const safe = line.length > cols - 1 ? line.slice(0, cols - 2) + '…' : line;
|
|
111
|
+
process.stdout.write(`\r${safe}`);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Print line(s) to stdout AND tee to file. Clears spinner first; spinner re-renders next tick.
|
|
115
|
+
function print(line) {
|
|
116
|
+
clearSpinner();
|
|
117
|
+
process.stdout.write(line);
|
|
118
|
+
logFile.write(stripAnsi(line));
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Tick the spinner ~4 times/sec so it animates between polls.
|
|
122
|
+
const spinnerTimer = isTty ? setInterval(() => {
|
|
123
|
+
spinnerFrame += 1;
|
|
124
|
+
renderSpinner();
|
|
125
|
+
}, 250) : null;
|
|
126
|
+
|
|
127
|
+
// 5. Poll until completion. Track byte offsets per job so we only print new lines.
|
|
128
|
+
const printedByJob = new Map(); // jobId -> chars printed so far
|
|
129
|
+
let lastStatusLine = '';
|
|
130
|
+
|
|
131
|
+
try {
|
|
132
|
+
while (true) {
|
|
133
|
+
pollCount += 1;
|
|
134
|
+
const { data: state } = await octokit.rest.actions.getWorkflowRun({
|
|
135
|
+
owner, repo, run_id: run.id,
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
// Pull all jobs. Each job has steps; each step has a step-level status.
|
|
139
|
+
const { data: jobsResp } = await octokit.rest.actions.listJobsForWorkflowRun({
|
|
140
|
+
owner, repo, run_id: run.id, per_page: 100,
|
|
141
|
+
});
|
|
142
|
+
const jobs = jobsResp.jobs || [];
|
|
143
|
+
latestState = state;
|
|
144
|
+
latestJobs = jobs;
|
|
145
|
+
|
|
146
|
+
// For each job, fetch its logs (only available once steps complete; for in-progress
|
|
147
|
+
// jobs, GH returns 404 or partial — we tolerate both).
|
|
148
|
+
for (const job of jobs) {
|
|
149
|
+
// Skip queued jobs entirely (no logs yet).
|
|
150
|
+
if (job.status === 'queued') continue;
|
|
151
|
+
|
|
152
|
+
let logsText = '';
|
|
153
|
+
try {
|
|
154
|
+
const { data } = await octokit.request('GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs', {
|
|
155
|
+
owner, repo, job_id: job.id,
|
|
156
|
+
});
|
|
157
|
+
// Octokit returns the raw text content here.
|
|
158
|
+
logsText = typeof data === 'string' ? data : Buffer.from(data || '').toString('utf8');
|
|
159
|
+
} catch (e) {
|
|
160
|
+
// 404 = logs not ready yet. Other errors we just skip until next tick.
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const printed = printedByJob.get(job.id) || 0;
|
|
165
|
+
if (logsText.length > printed) {
|
|
166
|
+
const fresh = logsText.slice(printed);
|
|
167
|
+
// Prefix each line with the job name so interleaved output is readable.
|
|
168
|
+
const prefix = `[${job.name}] `;
|
|
169
|
+
for (const rawLine of fresh.split('\n')) {
|
|
170
|
+
if (!rawLine) continue;
|
|
171
|
+
print(`${prefix}${rawLine}\n`);
|
|
172
|
+
}
|
|
173
|
+
printedByJob.set(job.id, logsText.length);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Print a one-line status banner if it changed (no spam — only on transition).
|
|
178
|
+
const banner = formatStatusBanner(state, jobs);
|
|
179
|
+
if (banner !== lastStatusLine) {
|
|
180
|
+
print(`\n${banner}\n`);
|
|
181
|
+
lastStatusLine = banner;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
if (state.status === 'completed') {
|
|
185
|
+
clearSpinner();
|
|
186
|
+
logFile.end();
|
|
187
|
+
const success = state.conclusion === 'success';
|
|
188
|
+
const symbol = success ? '✓' : '✗';
|
|
189
|
+
logger.log(`${symbol} Run ${state.conclusion} — ${state.html_url}`);
|
|
190
|
+
logger.log(`Logs: ${path.relative(projectRoot, ciLogPath)}`);
|
|
191
|
+
if (!success) {
|
|
192
|
+
process.exitCode = 1;
|
|
193
|
+
throw new Error(`Release run failed (conclusion=${state.conclusion}). See ${ciLogPath} or ${state.html_url}.`);
|
|
194
|
+
}
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
await sleep(POLL_INTERVAL_MS);
|
|
199
|
+
}
|
|
200
|
+
} finally {
|
|
201
|
+
if (spinnerTimer) clearInterval(spinnerTimer);
|
|
202
|
+
clearSpinner();
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
// The CI dispatch address, from the config and the scaffold: the brand's APP
|
|
207
|
+
// repo (`@omega.js/devkit/deploy`'s dispatchRepo, the one call web and the
|
|
208
|
+
// extension deploy verbs make too) and the workflow file the target's
|
|
209
|
+
// ensure-target pass actually wrote (composed as `desktop-build.yml` at the
|
|
210
|
+
// brand root inside a monorepo, plain `build.yml` standalone:
|
|
211
|
+
// `@omega.js/devkit/ci-workflows` owns that name for all four frameworks).
|
|
212
|
+
// Never the git remote: a brand nested in another repo would dispatch on the
|
|
213
|
+
// enclosing one, which for the playground is the framework monorepo itself.
|
|
214
|
+
// Exported for tests.
|
|
215
|
+
function dispatchTarget({ projectRoot, config }) {
|
|
216
|
+
const { composedWorkflowName } = require('../vendor/devkit/ci-workflows.js');
|
|
217
|
+
const { resolveSeedMode } = require('../vendor/config/index.js');
|
|
218
|
+
const { owner, repo } = dispatchRepo(config);
|
|
219
|
+
|
|
220
|
+
return {
|
|
221
|
+
owner,
|
|
222
|
+
repo,
|
|
223
|
+
workflow: composedWorkflowName({
|
|
224
|
+
targetDir: projectRoot,
|
|
225
|
+
brandRoot: resolveSeedMode(projectRoot).brandRoot,
|
|
226
|
+
workflow: 'build.yml',
|
|
227
|
+
}),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function formatElapsed(ms) {
|
|
232
|
+
const totalSec = Math.floor(ms / 1000);
|
|
233
|
+
const m = Math.floor(totalSec / 60);
|
|
234
|
+
const s = totalSec % 60;
|
|
235
|
+
return m > 0 ? `${m}m ${String(s).padStart(2, '0')}s` : `${s}s`;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function jobSymbol(j) {
|
|
239
|
+
if (j.status === 'completed') return j.conclusion === 'success' ? '✓' : '✗';
|
|
240
|
+
if (j.status === 'in_progress') return '…';
|
|
241
|
+
if (j.status === 'queued') return '·';
|
|
242
|
+
return '?';
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
async function waitForNewRun({ octokit, owner, repo, after, workflowFile }) {
|
|
246
|
+
const deadline = Date.now() + 60_000;
|
|
247
|
+
while (Date.now() < deadline) {
|
|
248
|
+
const { data } = await octokit.rest.actions.listWorkflowRuns({
|
|
249
|
+
owner, repo, workflow_id: workflowFile, per_page: 5, event: 'workflow_dispatch',
|
|
250
|
+
});
|
|
251
|
+
const runs = data.workflow_runs || [];
|
|
252
|
+
// The newest run created strictly after our dispatch timestamp.
|
|
253
|
+
const fresh = runs.find((r) => new Date(r.created_at).getTime() >= after.getTime() - 1000);
|
|
254
|
+
if (fresh) return fresh;
|
|
255
|
+
await sleep(2000);
|
|
256
|
+
}
|
|
257
|
+
return null;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function formatStatusBanner(run, jobs) {
|
|
261
|
+
const parts = jobs.map((j) => `${jobSymbol(j)} ${j.name}`);
|
|
262
|
+
return `── ${run.status}${run.conclusion ? ` (${run.conclusion})` : ''} ── ${parts.join(' | ')}`;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
async function currentBranch(projectRoot) {
|
|
266
|
+
try {
|
|
267
|
+
const { execute } = require('node-powertools');
|
|
268
|
+
const out = await execute('git rev-parse --abbrev-ref HEAD', { cwd: projectRoot, log: false });
|
|
269
|
+
return String(out || '').trim();
|
|
270
|
+
} catch (e) {
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
function sleep(ms) {
|
|
276
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
function stripAnsi(s) {
|
|
280
|
+
// Minimal ANSI stripper — handles CSI sequences (colors, cursor moves).
|
|
281
|
+
return String(s).replace(/\x1b\[[0-9;]*[A-Za-z]/g, '');
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// Exported for tests + `omega deploy`, which prints the exact dispatch this
|
|
285
|
+
// sends before delegating here.
|
|
286
|
+
module.exports.dispatchTarget = dispatchTarget;
|