@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,687 @@
|
|
|
1
|
+
// The signing box's OWN configuration: `<runner home>\.env`.
|
|
2
|
+
//
|
|
3
|
+
// The Windows signing runner is a MACHINE, not a brand: the EV token, its PIN,
|
|
4
|
+
// the signtool path, the GitHub token that registers the runner and the orgs it
|
|
5
|
+
// serves all belong to the box. They live in one file beside the install —
|
|
6
|
+
// `%LOCALAPPDATA%\omega-runner\.env` — which `omega runner` and `omega
|
|
7
|
+
// sign-windows` read from whatever directory they run in: this monorepo, a
|
|
8
|
+
// consumer brand, a bare `npm i -g @omega.js/desktop`. No brand's `.env` ever
|
|
9
|
+
// holds the box's PIN ([#337](https://github.com/Omega-JS-Stack/omega/issues/337)).
|
|
10
|
+
//
|
|
11
|
+
// Precedence: a value the shell already carries, or a CI job delivers, WINS over
|
|
12
|
+
// the file (an empty delivered value counts as absent, the same rule
|
|
13
|
+
// sanitize-signing-env applies). The file survives `runner uninstall`: it is
|
|
14
|
+
// configuration, not install state.
|
|
15
|
+
//
|
|
16
|
+
// A required key that is still missing is asked for — in an interactive
|
|
17
|
+
// terminal, through the one prompt wrapper every OMEGA package uses — and the
|
|
18
|
+
// answer is written back to the file. Off a TTY, or when the answer is empty,
|
|
19
|
+
// the command REFUSES, naming the file and the keys: a runner never boots half
|
|
20
|
+
// configured.
|
|
21
|
+
//
|
|
22
|
+
// `install` and `config` run the SAME walk: every key of both scopes, in
|
|
23
|
+
// schema order, each question DEFAULTING to the current value — the file's,
|
|
24
|
+
// else what the shell or CI delivered, else the key's suggestion. A shell
|
|
25
|
+
// value never skips a question (that is how Ian's box registered against an
|
|
26
|
+
// exported org list it was never shown, 2026-09-04). A secret never echoes:
|
|
27
|
+
// an empty answer keeps what is saved.
|
|
28
|
+
//
|
|
29
|
+
// The orgs are the one answer nobody types from memory, so they are PICKED:
|
|
30
|
+
// a checkbox of every org the token administers, ticked to what this box
|
|
31
|
+
// already answered — the saved list, else the orgs it registered, else
|
|
32
|
+
// NOTHING. A token that administers 35 orgs must never register 35 runners
|
|
33
|
+
// on one Enter.
|
|
34
|
+
|
|
35
|
+
const fs = require('fs');
|
|
36
|
+
const os = require('os');
|
|
37
|
+
const path = require('path');
|
|
38
|
+
|
|
39
|
+
// Runner files live under %LOCALAPPDATA%\omega-runner — a per-user path that
|
|
40
|
+
// doesn't need admin to read/write. Set OMEGA_RUNNER_HOME to override.
|
|
41
|
+
function defaultRunnerHome(platform, env) {
|
|
42
|
+
platform = platform || process.platform;
|
|
43
|
+
env = env || process.env;
|
|
44
|
+
if (platform === 'win32') {
|
|
45
|
+
const localAppData = env.LOCALAPPDATA || path.join(os.homedir(), 'AppData', 'Local');
|
|
46
|
+
return path.join(localAppData, 'omega-runner');
|
|
47
|
+
}
|
|
48
|
+
return path.join(process.cwd(), '.gh-runners');
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function runnerEnvFile(home) {
|
|
52
|
+
return path.join(home, '.env');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// The env schema (@omega.js/config) owns each key's secrecy and its one-line
|
|
56
|
+
// meaning; the runner adds what is required HERE and how to ask for it. The
|
|
57
|
+
// two runner-only keys (the org list, the timestamp server) are not delivery
|
|
58
|
+
// keys of any target, so they carry their own text.
|
|
59
|
+
function schemaEntry(name) {
|
|
60
|
+
try {
|
|
61
|
+
return require('../vendor/config/env-schema.js').ENV_SCHEMA.find((e) => e.name === name) || null;
|
|
62
|
+
} catch (e) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const RUNNER_ENV_SCHEMA = [
|
|
68
|
+
{
|
|
69
|
+
key: 'GH_TOKEN',
|
|
70
|
+
required: true,
|
|
71
|
+
secret: true,
|
|
72
|
+
scope: 'runner',
|
|
73
|
+
prompt: 'GitHub classic PAT (repo + workflow + admin:org) that registers this box as a runner',
|
|
74
|
+
comment: 'GitHub classic PAT with repo + workflow + admin:org (registers the runner).',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
key: 'OMEGA_RUNNER_ORGS',
|
|
78
|
+
required: false,
|
|
79
|
+
secret: false,
|
|
80
|
+
scope: 'runner',
|
|
81
|
+
prompt: 'Orgs to register against, comma-separated (empty = EVERY org the token administers)',
|
|
82
|
+
comment: 'Orgs to register against, comma-separated. Empty = every org the token administers.',
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
key: 'WIN_EV_TOKEN_PATH',
|
|
86
|
+
required: true,
|
|
87
|
+
secret: false,
|
|
88
|
+
scope: 'signing',
|
|
89
|
+
prompt: 'EV cert: SHA1 thumbprint (SafeNet/eToken) or path to a .pfx',
|
|
90
|
+
comment: 'The EV cert: its SHA1 thumbprint (SafeNet/eToken) or a path to a .pfx.',
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
key: 'WIN_CSC_KEY_PASSWORD',
|
|
94
|
+
required: true,
|
|
95
|
+
secret: true,
|
|
96
|
+
scope: 'signing',
|
|
97
|
+
prompt: 'Token PIN (typed into the SafeNet Token Logon dialog for you)',
|
|
98
|
+
comment: 'The token PIN — typed into the SafeNet Token Logon dialog for you.',
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
key: 'SIGNTOOL_PATH',
|
|
102
|
+
required: true,
|
|
103
|
+
secret: false,
|
|
104
|
+
scope: 'signing',
|
|
105
|
+
prompt: 'Full path to signtool.exe',
|
|
106
|
+
comment: 'Full path to signtool.exe (Windows SDK / VS Build Tools).',
|
|
107
|
+
suggest: () => detectSigntool(),
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
key: 'WIN_TIMESTAMP_URL',
|
|
111
|
+
required: false,
|
|
112
|
+
secret: false,
|
|
113
|
+
scope: 'signing',
|
|
114
|
+
prompt: 'RFC 3161 timestamp server',
|
|
115
|
+
comment: 'RFC 3161 timestamp server. Default: http://timestamp.sectigo.com',
|
|
116
|
+
optionalComment: true,
|
|
117
|
+
},
|
|
118
|
+
].map((entry) => {
|
|
119
|
+
const schema = schemaEntry(entry.key);
|
|
120
|
+
return { ...entry, secret: schema ? schema.secret : entry.secret, description: schema?.description || entry.comment };
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
const RUNNER_ENV_KEYS = RUNNER_ENV_SCHEMA.map((e) => e.key);
|
|
124
|
+
|
|
125
|
+
// The file `runner install` lays down when the box has none yet.
|
|
126
|
+
const RUNNER_ENV_TEMPLATE = [
|
|
127
|
+
'# omega-runner — THIS BOX\'s signing configuration. Never a brand\'s .env.',
|
|
128
|
+
'# Read by `omega runner` and `omega sign-windows` from any directory. A value',
|
|
129
|
+
'# already set in the shell, or delivered by a CI job, wins over this file.',
|
|
130
|
+
'# Survives `omega runner uninstall`. A missing required key is asked for.',
|
|
131
|
+
'',
|
|
132
|
+
...RUNNER_ENV_SCHEMA.flatMap((e) => [`# ${e.comment}`, `${e.optionalComment ? '# ' : ''}${e.key}=""`]),
|
|
133
|
+
'',
|
|
134
|
+
].join('\n');
|
|
135
|
+
|
|
136
|
+
function isBlank(value) {
|
|
137
|
+
return value === undefined || value === null || String(value).trim() === '';
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// The ONE reading of OMEGA_RUNNER_ORGS — comma or space separated — shared by
|
|
141
|
+
// the question, install's filter and the drift check, so the three can never
|
|
142
|
+
// disagree about what the key says.
|
|
143
|
+
function parseRunnerOrgs(value) {
|
|
144
|
+
return String(value || '').split(/[\s,]+/).map((s) => s.trim()).filter(Boolean);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Two org lists naming the same orgs. GitHub org names are case-insensitive,
|
|
148
|
+
// and the order a checkbox returns is not meaningful.
|
|
149
|
+
function sameRunnerOrgs(a, b) {
|
|
150
|
+
const set = (list) => new Set((list || []).map((o) => String(o).toLowerCase()));
|
|
151
|
+
const [x, y] = [set(a), set(b)];
|
|
152
|
+
return x.size === y.size && [...x].every((o) => y.has(o));
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// The newest signtool.exe the Windows SDK installed, or null. Only a SUGGESTION
|
|
156
|
+
// for the prompt — the file names the one the box uses.
|
|
157
|
+
function detectSigntool(env) {
|
|
158
|
+
env = env || process.env;
|
|
159
|
+
if (process.platform !== 'win32') return null;
|
|
160
|
+
const root = path.join(env['ProgramFiles(x86)'] || 'C:\\Program Files (x86)', 'Windows Kits', '10', 'bin');
|
|
161
|
+
let versions;
|
|
162
|
+
try {
|
|
163
|
+
versions = fs.readdirSync(root).filter((name) => /^\d+(\.\d+)+$/.test(name));
|
|
164
|
+
} catch (e) {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
const byVersion = (a, b) => {
|
|
168
|
+
const pa = a.split('.').map(Number);
|
|
169
|
+
const pb = b.split('.').map(Number);
|
|
170
|
+
for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
|
|
171
|
+
if ((pa[i] || 0) !== (pb[i] || 0)) return (pb[i] || 0) - (pa[i] || 0);
|
|
172
|
+
}
|
|
173
|
+
return 0;
|
|
174
|
+
};
|
|
175
|
+
for (const version of versions.sort(byVersion)) {
|
|
176
|
+
const candidate = path.join(root, version, 'x64', 'signtool.exe');
|
|
177
|
+
if (fs.existsSync(candidate)) return candidate;
|
|
178
|
+
}
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Read the file into `env` (process.env by default) — only keys the environment
|
|
183
|
+
// does not already carry a value for, and only non-empty values from the file.
|
|
184
|
+
// Returns what happened, so callers can say which file was read and what it set.
|
|
185
|
+
function loadRunnerEnv(options) {
|
|
186
|
+
const { home, env = process.env, platform } = options || {};
|
|
187
|
+
const root = home || env.OMEGA_RUNNER_HOME || defaultRunnerHome(platform, env);
|
|
188
|
+
const file = runnerEnvFile(root);
|
|
189
|
+
|
|
190
|
+
let raw;
|
|
191
|
+
try {
|
|
192
|
+
raw = fs.readFileSync(file, 'utf8');
|
|
193
|
+
} catch (e) {
|
|
194
|
+
return { file, present: false, applied: [], skipped: [] };
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
const parsed = require('dotenv').parse(raw);
|
|
198
|
+
const applied = [];
|
|
199
|
+
const skipped = [];
|
|
200
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
201
|
+
if (isBlank(value)) continue;
|
|
202
|
+
if (!isBlank(env[key])) { skipped.push(key); continue; } // shell / CI wins
|
|
203
|
+
env[key] = value;
|
|
204
|
+
applied.push(key);
|
|
205
|
+
}
|
|
206
|
+
return { file, present: true, applied, skipped };
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// The file's OWN values, whatever the environment carries. The walk defaults
|
|
210
|
+
// each question to what the BOX saved, not to what this shell exported, so it
|
|
211
|
+
// needs the file read apart from the merge loadRunnerEnv does. Same reader
|
|
212
|
+
// (dotenv) either way — quoting lives in one place.
|
|
213
|
+
function readRunnerEnvValues(home) {
|
|
214
|
+
try {
|
|
215
|
+
return require('dotenv').parse(fs.readFileSync(runnerEnvFile(home), 'utf8'));
|
|
216
|
+
} catch (e) {
|
|
217
|
+
return {};
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Where the box records what its runner commands did — beside the install, not
|
|
222
|
+
// in whatever directory the command was typed in.
|
|
223
|
+
function runnerLogFile(home) {
|
|
224
|
+
return path.join(home, 'logs', 'runner.log');
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Is this process a TEST run? `OMEGA_TEST_RUNNER` is set by `omega test` for the
|
|
228
|
+
// whole run (and inherited by the electron/boot children); `OMEGA_TEST_MODE` is
|
|
229
|
+
// the canonical signal those children already carried. Either one means: no
|
|
230
|
+
// command here may touch the machine's real runner home.
|
|
231
|
+
//
|
|
232
|
+
// It reads process.env, ALWAYS, and takes no environment argument. An injected
|
|
233
|
+
// env is a fixture for the config walk — a case that passed `{}` would be
|
|
234
|
+
// handing the safety check an environment with no marker in it and disarming
|
|
235
|
+
// the very guard that exists because a case did something like that.
|
|
236
|
+
function isTestRun() {
|
|
237
|
+
return process.env.OMEGA_TEST_RUNNER === '1' || process.env.OMEGA_TEST_MODE === 'true';
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// A home a test is allowed to act on: a `.temp` directory (the desktop suites'
|
|
241
|
+
// per-run scratch) or one under the OS temp dir (`mkdtemp`, what most cases use).
|
|
242
|
+
// Neither can ever be `%LOCALAPPDATA%\omega-runner`.
|
|
243
|
+
//
|
|
244
|
+
// A path rule, not a home rule: `assertTestSafeRunnerHome` asks it about the
|
|
245
|
+
// Startup folder too, and the same two shapes are the safe answer there.
|
|
246
|
+
function isScratchRunnerHome(home) {
|
|
247
|
+
const resolved = path.resolve(String(home || ''));
|
|
248
|
+
if (resolved.split(path.sep).includes('.temp')) return true;
|
|
249
|
+
return safeRealpath(resolved).startsWith(`${safeRealpath(os.tmpdir())}${path.sep}`);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// realpath so /var/folders/… and its /private/var/… twin (macOS) compare equal;
|
|
253
|
+
// a path that does not exist yet answers as itself.
|
|
254
|
+
function safeRealpath(target) {
|
|
255
|
+
try {
|
|
256
|
+
return fs.realpathSync(target);
|
|
257
|
+
} catch (e) {
|
|
258
|
+
return path.resolve(target);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// The refusal that makes 2026-09-04 impossible to repeat: a test process asked a
|
|
263
|
+
// MUTATING box command to act on a surface that is not a scratch. It happened —
|
|
264
|
+
// `runner install` from the suite, with no home of its own, tore the signing
|
|
265
|
+
// box's runner down and registered 34 orgs — so this is a hard stop, not a warn.
|
|
266
|
+
//
|
|
267
|
+
// EVERY surface the command could reach is checked, and the refusal names the
|
|
268
|
+
// one that is real. There are THREE:
|
|
269
|
+
// 1. the passed `_home`,
|
|
270
|
+
// 2. the module-level `RUNNER_HOME` — every subcommand honours a passed
|
|
271
|
+
// `_home` now, but the command module's `loadRunnerEnv({ home: RUNNER_HOME })`
|
|
272
|
+
// runs at REQUIRE time, so a process whose RUNNER_HOME is the box's already
|
|
273
|
+
// has the box's token and PIN in its environment and a scratch `_home`
|
|
274
|
+
// alone proves nothing,
|
|
275
|
+
// 3. the Startup folder (`STARTUP_DIR`) — added after the SECOND incident,
|
|
276
|
+
// 2026-09-04: the round-4 `uninstall` case ran with both homes scratch, and
|
|
277
|
+
// `uninstall` swept the REAL Startup folder anyway, deleting the box's three
|
|
278
|
+
// `omega-runner-*.cmd` shortcuts. A home scopes nothing machine-wide, so the
|
|
279
|
+
// folder needs its own scratch seam (`OMEGA_RUNNER_STARTUP_DIR`) and its own
|
|
280
|
+
// place in this check.
|
|
281
|
+
//
|
|
282
|
+
// It is checked before the platform gate: "a test may not touch this machine"
|
|
283
|
+
// is true on every platform, and the box is the one machine where the platform
|
|
284
|
+
// gate would have let it through.
|
|
285
|
+
//
|
|
286
|
+
// @param {string} verb - The subcommand, for the message.
|
|
287
|
+
// @param {...string} surfaces - Every home + Startup folder this run could act on.
|
|
288
|
+
function assertTestSafeRunnerHome(verb, ...surfaces) {
|
|
289
|
+
if (!isTestRun()) return;
|
|
290
|
+
|
|
291
|
+
const offender = surfaces.filter(Boolean).find((surface) => !isScratchRunnerHome(surface));
|
|
292
|
+
if (!offender) return;
|
|
293
|
+
|
|
294
|
+
throw new Error(
|
|
295
|
+
`Refusing \`runner ${verb}\` against ${offender}: this process is a test run (OMEGA_TEST_RUNNER / OMEGA_TEST_MODE), `
|
|
296
|
+
+ 'and a test may only act on scratch surfaces — the runner home AND the Startup folder, each under a `.temp` directory or the OS temp dir. '
|
|
297
|
+
+ 'Point OMEGA_RUNNER_HOME and OMEGA_RUNNER_STARTUP_DIR at scratch ones before the command module is required.',
|
|
298
|
+
);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// Lay the template down when the box has no file yet. Returns true when written.
|
|
302
|
+
function ensureRunnerEnvFile(home) {
|
|
303
|
+
const file = runnerEnvFile(home);
|
|
304
|
+
if (fs.existsSync(file)) return false;
|
|
305
|
+
fs.mkdirSync(home, { recursive: true });
|
|
306
|
+
fs.writeFileSync(file, RUNNER_ENV_TEMPLATE);
|
|
307
|
+
return true;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// Write values into the file IN PLACE: an existing `KEY=` line (commented or
|
|
311
|
+
// not) is replaced, a key the file never had is appended. Comments and order
|
|
312
|
+
// survive, so the file stays the one a person reads.
|
|
313
|
+
function writeRunnerEnvValues(home, values) {
|
|
314
|
+
// Every value double-quoted, the one .env quoting rule this repo writes
|
|
315
|
+
// everywhere. dotenv reads a double-quoted value back verbatim and has no
|
|
316
|
+
// escape for a `"` inside one, so a value carrying one cannot be written at
|
|
317
|
+
// all: refuse it — naming the key and the character — before the file is
|
|
318
|
+
// touched, rather than save a value that reads back wrong.
|
|
319
|
+
const serialize = (key, value) => `${key}="${value}"`;
|
|
320
|
+
for (const [key, value] of Object.entries(values)) {
|
|
321
|
+
if (String(value).includes('"')) {
|
|
322
|
+
throw new Error(`${key} contains a double quote (") — a .env value cannot carry one. Remove it, then set ${key} again.`);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
ensureRunnerEnvFile(home);
|
|
327
|
+
const file = runnerEnvFile(home);
|
|
328
|
+
const lines = fs.readFileSync(file, 'utf8').split(/\r?\n/);
|
|
329
|
+
const seen = new Set();
|
|
330
|
+
|
|
331
|
+
const out = lines.map((line) => {
|
|
332
|
+
const m = /^\s*#?\s*([A-Z][A-Z0-9_]*)\s*=/.exec(line);
|
|
333
|
+
if (!m || !(m[1] in values) || seen.has(m[1])) return line;
|
|
334
|
+
seen.add(m[1]);
|
|
335
|
+
return serialize(m[1], String(values[m[1]]));
|
|
336
|
+
});
|
|
337
|
+
for (const [key, value] of Object.entries(values)) {
|
|
338
|
+
if (!seen.has(key)) out.push(serialize(key, String(value)));
|
|
339
|
+
}
|
|
340
|
+
fs.writeFileSync(file, out.join('\n').replace(/\n*$/, '\n'));
|
|
341
|
+
return file;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
// ─── the runner's private HOME (#807) ───────────────────────────────────────────
|
|
345
|
+
//
|
|
346
|
+
// `actions/checkout` copies `path.join(process.env.HOME || os.homedir(),
|
|
347
|
+
// '.gitconfig')` into the temporary HOME it runs git under, with `@actions/io`,
|
|
348
|
+
// which recreates a SYMLINK source as a Windows JUNCTION. A junction to a FILE
|
|
349
|
+
// is invalid, so on a box whose `~/.gitconfig` is a symlink (dotfiles, and it
|
|
350
|
+
// must stay one) the copied file is unreadable and every git call in the job
|
|
351
|
+
// dies on "unknown error occurred while reading the configuration files".
|
|
352
|
+
//
|
|
353
|
+
// HOME wins in that lookup, so the runner is given a home of its OWN, inside
|
|
354
|
+
// RUNNER_HOME, holding a real `.gitconfig`. Nothing outside RUNNER_HOME is
|
|
355
|
+
// touched and the user's dotfiles symlink is left exactly as it is.
|
|
356
|
+
function runnerPrivateHome(home) {
|
|
357
|
+
return path.join(home, 'home');
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// The one setting the workflows rely on, and the only one this file carries:
|
|
361
|
+
// checkouts must not rewrite line endings on the way in.
|
|
362
|
+
const RUNNER_PRIVATE_GITCONFIG = '[core]\n\tautocrlf = false\n';
|
|
363
|
+
|
|
364
|
+
// Create the private home and its `.gitconfig`. A file that is already there
|
|
365
|
+
// with different content is KEPT and named in a log line: a person may have
|
|
366
|
+
// edited it on the box, and delivering one setting is never worth overwriting
|
|
367
|
+
// someone's file. Returns the home, the file, and whether it was written.
|
|
368
|
+
function ensureRunnerPrivateHome(home, options) {
|
|
369
|
+
const { logger } = options || {};
|
|
370
|
+
const root = runnerPrivateHome(home);
|
|
371
|
+
const file = path.join(root, '.gitconfig');
|
|
372
|
+
fs.mkdirSync(root, { recursive: true });
|
|
373
|
+
|
|
374
|
+
let existing;
|
|
375
|
+
try {
|
|
376
|
+
existing = fs.readFileSync(file, 'utf8');
|
|
377
|
+
} catch (e) {
|
|
378
|
+
fs.writeFileSync(file, RUNNER_PRIVATE_GITCONFIG);
|
|
379
|
+
return { home: root, file, written: true };
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
if (existing !== RUNNER_PRIVATE_GITCONFIG && logger) {
|
|
383
|
+
logger.log(`Kept ${file} as it is: it is not the file this command writes, so it is someone's own. Add \`[core] autocrlf = false\` to it by hand if a checkout ever rewrites line endings.`);
|
|
384
|
+
}
|
|
385
|
+
return { home: root, file, written: false };
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
// The runner's OWN environment file, `<runner dir>\.env`: the file GitHub
|
|
389
|
+
// documents for proxy settings, one `KEY=value` per line, which the listener
|
|
390
|
+
// reads at startup and applies to every job it runs. One write therefore
|
|
391
|
+
// reaches the detached spawn and the Startup shortcut alike.
|
|
392
|
+
//
|
|
393
|
+
// The value is written BARE, not in the double-quoted form the box's own `.env`
|
|
394
|
+
// uses: the listener takes the rest of the line verbatim, so quotes would end
|
|
395
|
+
// up inside the value. An existing `KEY=` line is rewritten in place and every
|
|
396
|
+
// other line survives, in the endings the file already uses (LF for a new one),
|
|
397
|
+
// so running it twice is running it once.
|
|
398
|
+
function ensureRunnerDirEnv(runnerDir, values) {
|
|
399
|
+
const file = path.join(runnerDir, '.env');
|
|
400
|
+
|
|
401
|
+
let raw;
|
|
402
|
+
try {
|
|
403
|
+
raw = fs.readFileSync(file, 'utf8');
|
|
404
|
+
} catch (e) {
|
|
405
|
+
raw = '';
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
const newline = raw.includes('\r\n') ? '\r\n' : '\n';
|
|
409
|
+
const seen = new Set();
|
|
410
|
+
// The file's REAL lines. An empty file has none at all (splitting one yields
|
|
411
|
+
// a single empty string, which would push the first key onto a second line),
|
|
412
|
+
// and a written file ends with a newline, whose trailing empty element an
|
|
413
|
+
// append would land below: a blank line before the new key, one more on
|
|
414
|
+
// every rewrite. The terminator is put back by the write below.
|
|
415
|
+
const lines = raw === '' ? [] : raw.split(/\r?\n/);
|
|
416
|
+
if (lines[lines.length - 1] === '') lines.pop();
|
|
417
|
+
|
|
418
|
+
const out = lines.map((line) => {
|
|
419
|
+
const m = /^([A-Za-z_][A-Za-z0-9_]*)=/.exec(line);
|
|
420
|
+
if (!m || !(m[1] in values) || seen.has(m[1])) return line;
|
|
421
|
+
seen.add(m[1]);
|
|
422
|
+
return `${m[1]}=${values[m[1]]}`;
|
|
423
|
+
});
|
|
424
|
+
for (const [key, value] of Object.entries(values)) {
|
|
425
|
+
if (!seen.has(key)) out.push(`${key}=${value}`);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
fs.mkdirSync(runnerDir, { recursive: true });
|
|
429
|
+
fs.writeFileSync(file, out.join(newline).replace(/(\r?\n)*$/, newline));
|
|
430
|
+
return file;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// Which of the box's keys currently carry a value — names only, never values.
|
|
434
|
+
function runnerEnvReport(env) {
|
|
435
|
+
env = env || process.env;
|
|
436
|
+
return RUNNER_ENV_SCHEMA.map(({ key, required, scope }) => ({ key, required, scope, set: !isBlank(env[key]) }));
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// The ONE refusal a half-configured box gets, wherever it is caught: the keys,
|
|
440
|
+
// the file to fill them in, and whether there was a terminal to ask in.
|
|
441
|
+
function missingKeysError(keys, file, isTTY) {
|
|
442
|
+
const one = keys.length === 1;
|
|
443
|
+
const noTTY = isTTY ? '' : ' (no terminal to ask in)';
|
|
444
|
+
return new Error(
|
|
445
|
+
`${keys.join(', ')} ${one ? 'is' : 'are'} not set. Fill ${one ? 'it' : 'them'} in ${file}${noTTY} — the runner does not start half configured.`,
|
|
446
|
+
);
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
// Make sure every required key of `scopes` has a value, asking for the missing
|
|
450
|
+
// ones in an interactive terminal and writing the answers to the file. Throws
|
|
451
|
+
// — naming the file and the keys — when any is still missing afterwards, so no
|
|
452
|
+
// caller ever runs half configured.
|
|
453
|
+
//
|
|
454
|
+
// This is the step for the commands that only need the box to WORK — `start`,
|
|
455
|
+
// `register-org`, `sign-windows`. The commands that CONFIGURE it (`install`,
|
|
456
|
+
// `config`) run reconfigureRunnerEnv below, which asks for everything.
|
|
457
|
+
//
|
|
458
|
+
// `prompt` and `interactive` are injected by the tests; the real ones are the
|
|
459
|
+
// devkit prompt wrapper (input / password) and its TTY check.
|
|
460
|
+
async function ensureRunnerConfig(options) {
|
|
461
|
+
const {
|
|
462
|
+
home,
|
|
463
|
+
env = process.env,
|
|
464
|
+
scopes = ['runner', 'signing'],
|
|
465
|
+
logger,
|
|
466
|
+
interactive,
|
|
467
|
+
prompt,
|
|
468
|
+
} = options || {};
|
|
469
|
+
const root = home || env.OMEGA_RUNNER_HOME || defaultRunnerHome(undefined, env);
|
|
470
|
+
const file = runnerEnvFile(root);
|
|
471
|
+
|
|
472
|
+
if (ensureRunnerEnvFile(root) && logger) {
|
|
473
|
+
logger.log(`Wrote ${file} — this box's signing configuration. It survives uninstall.`);
|
|
474
|
+
}
|
|
475
|
+
loadRunnerEnv({ home: root, env });
|
|
476
|
+
|
|
477
|
+
const wanted = RUNNER_ENV_SCHEMA.filter((e) => scopes.includes(e.scope));
|
|
478
|
+
const missing = () => wanted.filter((e) => e.required && isBlank(env[e.key]));
|
|
479
|
+
|
|
480
|
+
const prompts = prompt || require('../vendor/devkit/prompt.js');
|
|
481
|
+
const isTTY = interactive === undefined ? prompts.isInteractive() : interactive;
|
|
482
|
+
const asked = [];
|
|
483
|
+
|
|
484
|
+
if (isTTY && missing().length > 0) {
|
|
485
|
+
if (logger) logger.log(`This box's signing configuration (${file}) is missing ${missing().map((e) => e.key).join(', ')} — asking now. Answers are saved to that file.`);
|
|
486
|
+
const answers = {};
|
|
487
|
+
for (const entry of wanted) {
|
|
488
|
+
if (!entry.required || !isBlank(env[entry.key])) continue;
|
|
489
|
+
const suggestion = entry.suggest ? entry.suggest() : undefined;
|
|
490
|
+
const message = `${entry.key} — ${entry.prompt}:`;
|
|
491
|
+
const validate = (v) => (isBlank(v) ? `${entry.key} is required` : true);
|
|
492
|
+
const answer = entry.secret
|
|
493
|
+
? await prompts.password({ message, mask: '*', validate })
|
|
494
|
+
: await prompts.input({ message, default: suggestion || undefined, validate });
|
|
495
|
+
const value = String(answer || '').trim();
|
|
496
|
+
if (isBlank(value)) continue;
|
|
497
|
+
answers[entry.key] = value;
|
|
498
|
+
env[entry.key] = value;
|
|
499
|
+
asked.push(entry.key);
|
|
500
|
+
}
|
|
501
|
+
if (asked.length > 0) writeRunnerEnvValues(root, answers);
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
const still = missing();
|
|
505
|
+
if (still.length > 0) throw missingKeysError(still.map((e) => e.key), file, isTTY);
|
|
506
|
+
|
|
507
|
+
return { file, asked };
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
// The orgs question itself: a checkbox of every org the token administers,
|
|
511
|
+
// ticked to what this box already answered — the saved list, else the orgs it
|
|
512
|
+
// registered, else nothing. Nothing ticked by default is the point: a token
|
|
513
|
+
// that administers 35 orgs would otherwise register 35 runners on one Enter.
|
|
514
|
+
// Zero chosen is still refused — a runner registered against no org signs
|
|
515
|
+
// nothing. A token that administers nothing gets one warn line and no
|
|
516
|
+
// question. Returns `{ admin, chosen }` — the walk the caller can reuse, and
|
|
517
|
+
// the picked orgs (null when nothing was asked).
|
|
518
|
+
async function askRunnerOrgs(options) {
|
|
519
|
+
const { current = [], prompts, logger, discoverOrgs } = options || {};
|
|
520
|
+
// Asking without a way to LIST them is a wiring bug, never a runtime case:
|
|
521
|
+
// the octokit call lives in runner.js, so every asking caller passes it in.
|
|
522
|
+
if (typeof discoverOrgs !== 'function') {
|
|
523
|
+
throw new Error('The orgs question needs a discoverOrgs function — the caller wires it (runner.js passes discoverAdminOrgs).');
|
|
524
|
+
}
|
|
525
|
+
const admin = await discoverOrgs();
|
|
526
|
+
if (admin.length === 0) {
|
|
527
|
+
if (logger) logger.warn('GH_TOKEN administers no orgs — skipping the OMEGA_RUNNER_ORGS question. Fix the token\'s admin:org scope, then run `npx omega runner config`.');
|
|
528
|
+
return { admin, chosen: null };
|
|
529
|
+
}
|
|
530
|
+
const ticked = new Set(current.map((o) => String(o).toLowerCase()));
|
|
531
|
+
|
|
532
|
+
// An org this box already answered for that the token cannot admin any more
|
|
533
|
+
// never appears in the list below, so say why it is gone before it silently
|
|
534
|
+
// disappears: admin lost, the org renamed, or a different token in the shell.
|
|
535
|
+
const adminSet = new Set(admin.map((o) => o.toLowerCase()));
|
|
536
|
+
const dropped = current.filter((o) => !adminSet.has(String(o).toLowerCase()));
|
|
537
|
+
if (dropped.length > 0 && logger) {
|
|
538
|
+
logger.warn(`Not offered below: ${dropped.join(', ')} — this GH_TOKEN no longer administers ${dropped.length === 1 ? 'it' : 'them'} (admin lost, or the org was renamed).`);
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
const chosen = await prompts.checkbox({
|
|
542
|
+
message: 'OMEGA_RUNNER_ORGS — which orgs does this box sign for? (space toggles, Enter confirms)',
|
|
543
|
+
// Alphabetical, case-insensitively: GitHub returns membership order, which
|
|
544
|
+
// is no order at all when scanning 35 names for the three you want.
|
|
545
|
+
choices: [...admin]
|
|
546
|
+
.sort((a, b) => a.localeCompare(b, 'en', { sensitivity: 'base' }))
|
|
547
|
+
.map((org) => ({ name: org, value: org, checked: ticked.has(org.toLowerCase()) })),
|
|
548
|
+
});
|
|
549
|
+
if (!chosen || chosen.length === 0) {
|
|
550
|
+
throw new Error('OMEGA_RUNNER_ORGS: pick at least one org — a runner registered against nothing is not a runner.');
|
|
551
|
+
}
|
|
552
|
+
return { admin, chosen };
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
// The walk `install` and `config` share: the whole file, asked. Every key of
|
|
556
|
+
// both scopes in schema order, each question defaulting to the CURRENT value —
|
|
557
|
+
// the file's, else what the shell or CI delivered, else the key's suggestion —
|
|
558
|
+
// then the orgs checkbox. An empty answer KEEPS that current value (which is
|
|
559
|
+
// how a saved secret survives a walk it never echoes, and how a shell-only
|
|
560
|
+
// value gets written into the file); every key the walk ends with a value for
|
|
561
|
+
// is written, kept or typed, and it is written before the orgs question, which
|
|
562
|
+
// can refuse.
|
|
563
|
+
//
|
|
564
|
+
// Off a TTY nothing can be asked: `config` exists only to ask, so it says so
|
|
565
|
+
// (`requireTerminal`); install's walk falls back to the same required-key
|
|
566
|
+
// check every other command makes, so a CI box that carries its values in the
|
|
567
|
+
// shell still installs.
|
|
568
|
+
async function reconfigureRunnerEnv(options) {
|
|
569
|
+
const {
|
|
570
|
+
home,
|
|
571
|
+
env = process.env,
|
|
572
|
+
logger,
|
|
573
|
+
interactive,
|
|
574
|
+
prompt,
|
|
575
|
+
discoverOrgs,
|
|
576
|
+
registeredOrgs = [],
|
|
577
|
+
requireTerminal = false,
|
|
578
|
+
} = options || {};
|
|
579
|
+
const root = home || env.OMEGA_RUNNER_HOME || defaultRunnerHome(undefined, env);
|
|
580
|
+
const file = runnerEnvFile(root);
|
|
581
|
+
|
|
582
|
+
if (ensureRunnerEnvFile(root) && logger) {
|
|
583
|
+
logger.log(`Wrote ${file} — this box's signing configuration. It survives uninstall.`);
|
|
584
|
+
}
|
|
585
|
+
loadRunnerEnv({ home: root, env });
|
|
586
|
+
const saved = readRunnerEnvValues(root);
|
|
587
|
+
|
|
588
|
+
const prompts = prompt || require('../vendor/devkit/prompt.js');
|
|
589
|
+
const isTTY = interactive === undefined ? prompts.isInteractive() : interactive;
|
|
590
|
+
|
|
591
|
+
if (!isTTY) {
|
|
592
|
+
if (requireTerminal) {
|
|
593
|
+
throw new Error(`No terminal to ask in — edit ${file} directly, or run \`npx omega runner config\` in an interactive terminal.`);
|
|
594
|
+
}
|
|
595
|
+
const missing = RUNNER_ENV_SCHEMA.filter((e) => e.required && isBlank(env[e.key]));
|
|
596
|
+
if (missing.length > 0) throw missingKeysError(missing.map((e) => e.key), file, false);
|
|
597
|
+
return { file, answers: [], orgs: null, adminOrgs: null };
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
if (logger) logger.log(`This box's signing configuration (${file}) — every key, with what is saved as the default.`);
|
|
601
|
+
|
|
602
|
+
// What a question DEFAULTS to. The file first: a value the shell exported is
|
|
603
|
+
// this session's, not the box's answer, and taking it as the default is how
|
|
604
|
+
// a brand's token would end up configuring the box.
|
|
605
|
+
const currentOf = (entry) => {
|
|
606
|
+
const value = isBlank(saved[entry.key]) ? env[entry.key] : saved[entry.key];
|
|
607
|
+
return isBlank(value) ? '' : String(value).trim();
|
|
608
|
+
};
|
|
609
|
+
|
|
610
|
+
const answers = {};
|
|
611
|
+
const empty = [];
|
|
612
|
+
for (const entry of RUNNER_ENV_SCHEMA) {
|
|
613
|
+
if (entry.key === 'OMEGA_RUNNER_ORGS') continue; // the checkbox below IS its question
|
|
614
|
+
const current = currentOf(entry);
|
|
615
|
+
const validate = (v) => (current || !entry.required || !isBlank(v) ? true : `${entry.key} is required`);
|
|
616
|
+
const answer = entry.secret
|
|
617
|
+
? await prompts.password({ message: `${entry.key} — ${entry.prompt}${current ? ' (Enter keeps the current value)' : ''}:`, mask: '*', validate })
|
|
618
|
+
: await prompts.input({ message: `${entry.key} — ${entry.prompt}:`, default: current || (entry.suggest ? entry.suggest() || undefined : undefined), validate });
|
|
619
|
+
let value = String(answer || '').trim();
|
|
620
|
+
|
|
621
|
+
// Enter KEEPS the current value — which is the answer, so it takes the same
|
|
622
|
+
// path a typed one does. That matters for a value only the shell carries:
|
|
623
|
+
// keeping it saves it to the box's file, secret or not (the non-secret
|
|
624
|
+
// prompts already did, by handing their default back).
|
|
625
|
+
if (isBlank(value)) {
|
|
626
|
+
if (!current) {
|
|
627
|
+
if (entry.required) empty.push(entry.key);
|
|
628
|
+
continue;
|
|
629
|
+
}
|
|
630
|
+
value = current;
|
|
631
|
+
}
|
|
632
|
+
env[entry.key] = value;
|
|
633
|
+
answers[entry.key] = value;
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
// Save EVERY answer, the kept ones included, BEFORE anything that can refuse —
|
|
637
|
+
// the required-key check right below, and the orgs question after it (nothing
|
|
638
|
+
// ticked, a token that cannot list, a Ctrl-C). A refusal must never cost the
|
|
639
|
+
// operator the keys they just typed. Writing the kept values too is what
|
|
640
|
+
// brings a file the pre-quoting code wrote up to the rule: the writer
|
|
641
|
+
// serializes `KEY="value"` and is idempotent, so a walk of Enters rewrites
|
|
642
|
+
// every line quoted without changing one value.
|
|
643
|
+
if (Object.keys(answers).length > 0) writeRunnerEnvValues(root, answers);
|
|
644
|
+
if (empty.length > 0) throw missingKeysError(empty, file, true);
|
|
645
|
+
|
|
646
|
+
const savedOrgs = parseRunnerOrgs(saved.OMEGA_RUNNER_ORGS);
|
|
647
|
+
const { admin, chosen } = await askRunnerOrgs({
|
|
648
|
+
current: savedOrgs.length > 0 ? savedOrgs : registeredOrgs,
|
|
649
|
+
prompts,
|
|
650
|
+
logger,
|
|
651
|
+
discoverOrgs,
|
|
652
|
+
});
|
|
653
|
+
if (chosen) {
|
|
654
|
+
const value = chosen.join(',');
|
|
655
|
+
if (value !== (saved.OMEGA_RUNNER_ORGS || '')) {
|
|
656
|
+
answers.OMEGA_RUNNER_ORGS = value;
|
|
657
|
+
writeRunnerEnvValues(root, { OMEGA_RUNNER_ORGS: value });
|
|
658
|
+
}
|
|
659
|
+
env.OMEGA_RUNNER_ORGS = value;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
return { file, answers: Object.keys(answers), orgs: chosen, adminOrgs: admin };
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
module.exports = {
|
|
666
|
+
defaultRunnerHome,
|
|
667
|
+
runnerEnvFile,
|
|
668
|
+
runnerLogFile,
|
|
669
|
+
isTestRun,
|
|
670
|
+
isScratchRunnerHome,
|
|
671
|
+
assertTestSafeRunnerHome,
|
|
672
|
+
detectSigntool,
|
|
673
|
+
loadRunnerEnv,
|
|
674
|
+
ensureRunnerEnvFile,
|
|
675
|
+
writeRunnerEnvValues,
|
|
676
|
+
runnerPrivateHome,
|
|
677
|
+
ensureRunnerPrivateHome,
|
|
678
|
+
ensureRunnerDirEnv,
|
|
679
|
+
ensureRunnerConfig,
|
|
680
|
+
reconfigureRunnerEnv,
|
|
681
|
+
runnerEnvReport,
|
|
682
|
+
parseRunnerOrgs,
|
|
683
|
+
sameRunnerOrgs,
|
|
684
|
+
RUNNER_ENV_SCHEMA,
|
|
685
|
+
RUNNER_ENV_KEYS,
|
|
686
|
+
RUNNER_ENV_TEMPLATE,
|
|
687
|
+
};
|