@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,353 @@
|
|
|
1
|
+
// Restart Manager install machinery — feed discovery, artifact download, and
|
|
2
|
+
// silent per-platform install. Install ONLY — RM updates ITSELF via @omega.js/desktop's
|
|
3
|
+
// standard autoUpdater once it's running (that's also why Windows uses NSIS:
|
|
4
|
+
// electron-updater can only self-update NSIS installs).
|
|
5
|
+
//
|
|
6
|
+
// The RM app publishes releases through @omega.js/desktop's standard pipeline: versioned
|
|
7
|
+
// artifacts + electron-updater feed files (latest-mac.yml / latest.yml /
|
|
8
|
+
// latest-linux.yml) on `github.com/<owner>/<repo>/releases`. We fetch the feed
|
|
9
|
+
// from the stable `releases/latest/download/<feed>` URL, pick the artifact,
|
|
10
|
+
// download it, and install:
|
|
11
|
+
//
|
|
12
|
+
// mac — unzip → <sharedRoot>/app/Restart Manager.app (no DMG mount, no /Volumes flash)
|
|
13
|
+
// win — run the NSIS one-click installer with /S (fully silent, per-user, no admin,
|
|
14
|
+
// lands in %LOCALAPPDATA%\Programs\Restart Manager\)
|
|
15
|
+
// linux — copy + chmod 755 → app/Restart-Manager.AppImage (no root, no .deb)
|
|
16
|
+
//
|
|
17
|
+
// mac/linux extract into `app.tmp/` first, then swap into `app/` — a torn
|
|
18
|
+
// install is never observable. The advisory install.lock keeps two @omega.js/desktop apps on
|
|
19
|
+
// the same machine from running installers concurrently; RM itself ignores it.
|
|
20
|
+
//
|
|
21
|
+
// Pure helpers (parseFeed, pickArtifact, URL builders) are exported individually
|
|
22
|
+
// for build-layer tests. See docs/restart-manager.md.
|
|
23
|
+
|
|
24
|
+
const path = require('path');
|
|
25
|
+
const fs = require('fs');
|
|
26
|
+
const https = require('https');
|
|
27
|
+
const { spawn } = require('child_process');
|
|
28
|
+
const yaml = require('js-yaml');
|
|
29
|
+
const jetpack = require('fs-jetpack');
|
|
30
|
+
const fetch = require('wonderful-fetch');
|
|
31
|
+
const LoggerLite = require('../logger-lite.js');
|
|
32
|
+
const protocol = require('./protocol.js');
|
|
33
|
+
|
|
34
|
+
const logger = new LoggerLite('restart-manager');
|
|
35
|
+
|
|
36
|
+
const WIN_INSTALLER_TIMEOUT_MS = 2 * 60 * 1000; // NSIS /S should finish well inside this
|
|
37
|
+
|
|
38
|
+
// electron-updater feed file per platform (produced by @omega.js/desktop's release pipeline).
|
|
39
|
+
const FEED_FILES = Object.freeze({
|
|
40
|
+
darwin: 'latest-mac.yml',
|
|
41
|
+
win32: 'latest.yml',
|
|
42
|
+
linux: 'latest-linux.yml',
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
const FEED_TIMEOUT_MS = 30000;
|
|
46
|
+
const LOCK_STALE_MS = 10 * 60 * 1000; // takeover threshold for a dead holder's lock
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Build the feed URL for a platform.
|
|
50
|
+
* `feed.url` (full base-URL override, e.g. an air-gapped mirror) wins over
|
|
51
|
+
* the GitHub `owner`/`repo` form.
|
|
52
|
+
*
|
|
53
|
+
* @param {{ owner?: string, repo?: string, url?: string }} feedCfg
|
|
54
|
+
* @param {string} platform - process.platform value.
|
|
55
|
+
* @returns {string} absolute feed URL.
|
|
56
|
+
*/
|
|
57
|
+
function buildFeedUrl(feedCfg, platform) {
|
|
58
|
+
const feedFile = FEED_FILES[platform];
|
|
59
|
+
if (!feedFile) throw new Error(`restart-manager: unsupported platform "${platform}"`);
|
|
60
|
+
if (feedCfg.url) return `${feedCfg.url.replace(/\/+$/, '')}/${feedFile}`;
|
|
61
|
+
return `https://github.com/${feedCfg.owner}/${feedCfg.repo}/releases/latest/download/${feedFile}`;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Build the artifact download URL next to the feed.
|
|
66
|
+
* Artifact names are URL-encoded — GitHub renames uploaded assets containing
|
|
67
|
+
* spaces (space → dot) while the feed keeps the original name, so encoding is
|
|
68
|
+
* belt-and-suspenders on top of @omega.js/desktop's already-sanitized artifact names.
|
|
69
|
+
*
|
|
70
|
+
* @param {{ owner?: string, repo?: string, url?: string }} feedCfg
|
|
71
|
+
* @param {string} artifactName - files[].url entry from the parsed feed.
|
|
72
|
+
* @returns {string} absolute artifact URL.
|
|
73
|
+
*/
|
|
74
|
+
function buildArtifactUrl(feedCfg, artifactName) {
|
|
75
|
+
const encoded = encodeURIComponent(artifactName);
|
|
76
|
+
if (feedCfg.url) return `${feedCfg.url.replace(/\/+$/, '')}/${encoded}`;
|
|
77
|
+
return `https://github.com/${feedCfg.owner}/${feedCfg.repo}/releases/latest/download/${encoded}`;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Parse an electron-updater feed file (latest*.yml).
|
|
82
|
+
*
|
|
83
|
+
* @param {string} ymlText - raw feed contents.
|
|
84
|
+
* @returns {{ version: string, files: Array<{url: string, sha512?: string, size?: number}> }}
|
|
85
|
+
*/
|
|
86
|
+
function parseFeed(ymlText) {
|
|
87
|
+
const doc = yaml.load(ymlText);
|
|
88
|
+
if (!doc || typeof doc !== 'object') throw new Error('restart-manager: feed is not a YAML object');
|
|
89
|
+
if (!doc.version) throw new Error('restart-manager: feed has no version');
|
|
90
|
+
const files = Array.isArray(doc.files) ? doc.files : [];
|
|
91
|
+
return { version: String(doc.version), files };
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Pick the install artifact for a platform from a parsed feed.
|
|
96
|
+
* darwin — zip, preferring `-<arch>-mac.zip` → `-universal-mac.zip` →
|
|
97
|
+
* `-mac-universal.zip` (the versionless form, #620) → `-mac.zip`
|
|
98
|
+
* win32 — the NSIS setup .exe (run silently with /S; NSIS is what lets RM
|
|
99
|
+
* self-update via electron-updater on Windows)
|
|
100
|
+
* linux — the .AppImage entry
|
|
101
|
+
*
|
|
102
|
+
* @param {{ version: string, files: Array<{url: string}> }} feed
|
|
103
|
+
* @param {string} platform - process.platform value.
|
|
104
|
+
* @param {string} arch - process.arch value (mac pick order only).
|
|
105
|
+
* @returns {string} artifact file name.
|
|
106
|
+
*/
|
|
107
|
+
function pickArtifact(feed, platform, arch) {
|
|
108
|
+
const names = feed.files.map((f) => f.url).filter(Boolean);
|
|
109
|
+
|
|
110
|
+
let picked = null;
|
|
111
|
+
if (platform === 'darwin') {
|
|
112
|
+
picked = names.find((n) => n.endsWith(`-${arch}-mac.zip`))
|
|
113
|
+
|| names.find((n) => n.endsWith('-universal-mac.zip'))
|
|
114
|
+
// The name @omega.js/desktop packages under since #620 — a feed published
|
|
115
|
+
// before it still answers on one of the forms above.
|
|
116
|
+
|| names.find((n) => n.endsWith('-mac-universal.zip'))
|
|
117
|
+
|| names.find((n) => n.endsWith('-mac.zip'));
|
|
118
|
+
} else if (platform === 'win32') {
|
|
119
|
+
picked = names.find((n) => n.endsWith('.exe'));
|
|
120
|
+
} else if (platform === 'linux') {
|
|
121
|
+
picked = names.find((n) => n.endsWith('.AppImage'));
|
|
122
|
+
} else {
|
|
123
|
+
throw new Error(`restart-manager: unsupported platform "${platform}"`);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (!picked) {
|
|
127
|
+
throw new Error(`restart-manager: no ${platform} artifact in feed (candidates: ${names.join(', ') || 'none'})`);
|
|
128
|
+
}
|
|
129
|
+
return picked;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Fetch + parse the release feed.
|
|
134
|
+
*
|
|
135
|
+
* @param {{ owner?: string, repo?: string, url?: string }} feedCfg
|
|
136
|
+
* @param {string} platform
|
|
137
|
+
* @returns {Promise<{ version: string, files: Array<{url: string}> }>}
|
|
138
|
+
*/
|
|
139
|
+
async function fetchFeed(feedCfg, platform) {
|
|
140
|
+
const url = buildFeedUrl(feedCfg, platform);
|
|
141
|
+
logger.log(`fetching release feed ${url}`);
|
|
142
|
+
const text = await fetch(url, { method: 'get', response: 'text', timeout: FEED_TIMEOUT_MS, tries: 2 });
|
|
143
|
+
return parseFeed(text);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Plain HTTPS download with atomic write. Follows redirects (GitHub release
|
|
148
|
+
* assets 302 to S3). Writes to `<dest>.part` then renames — no partial file
|
|
149
|
+
* is ever observable at `dest`.
|
|
150
|
+
*
|
|
151
|
+
* @param {string} url
|
|
152
|
+
* @param {string} dest - absolute destination path.
|
|
153
|
+
* @param {number} [redirectsLeft]
|
|
154
|
+
* @returns {Promise<void>}
|
|
155
|
+
*/
|
|
156
|
+
function downloadFile(url, dest, redirectsLeft = 5) {
|
|
157
|
+
return new Promise((resolve, reject) => {
|
|
158
|
+
const tmp = `${dest}.part`;
|
|
159
|
+
const out = fs.createWriteStream(tmp);
|
|
160
|
+
const req = https.get(url, (res) => {
|
|
161
|
+
if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
|
|
162
|
+
out.close();
|
|
163
|
+
try { fs.unlinkSync(tmp); } catch (_) { /* ignore */ }
|
|
164
|
+
if (redirectsLeft <= 0) return reject(new Error('too many redirects'));
|
|
165
|
+
return downloadFile(res.headers.location, dest, redirectsLeft - 1).then(resolve, reject);
|
|
166
|
+
}
|
|
167
|
+
if (res.statusCode !== 200) {
|
|
168
|
+
out.close();
|
|
169
|
+
try { fs.unlinkSync(tmp); } catch (_) { /* ignore */ }
|
|
170
|
+
return reject(new Error(`HTTP ${res.statusCode} downloading ${url}`));
|
|
171
|
+
}
|
|
172
|
+
res.pipe(out);
|
|
173
|
+
out.on('finish', () => {
|
|
174
|
+
out.close(() => {
|
|
175
|
+
try { fs.renameSync(tmp, dest); resolve(); }
|
|
176
|
+
catch (e) { reject(e); }
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
req.on('error', (e) => {
|
|
181
|
+
try { fs.unlinkSync(tmp); } catch (_) { /* ignore */ }
|
|
182
|
+
reject(e);
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Install a downloaded artifact.
|
|
189
|
+
* mac: unzip into `<root>/app/` (atomic swap via app.tmp). linux: copy +
|
|
190
|
+
* chmod 755, same swap. win: run the NSIS one-click installer with /S —
|
|
191
|
+
* fully silent, per-user, installs to %LOCALAPPDATA%\Programs\ where
|
|
192
|
+
* electron-updater can self-update it later.
|
|
193
|
+
*
|
|
194
|
+
* @param {{ root: string, platform: string, artifactPath: string, version: string }} opts
|
|
195
|
+
* @returns {Promise<string>} the installed app path.
|
|
196
|
+
*/
|
|
197
|
+
async function installArtifact(opts) {
|
|
198
|
+
const { root, platform, artifactPath, version } = opts;
|
|
199
|
+
|
|
200
|
+
if (platform === 'win32') {
|
|
201
|
+
logger.log(`running NSIS installer silently: ${artifactPath} /S`);
|
|
202
|
+
await runSilentInstaller(artifactPath);
|
|
203
|
+
const exePath = protocol.getInstalledAppPath(root, platform);
|
|
204
|
+
if (!fs.existsSync(exePath)) {
|
|
205
|
+
throw new Error(`restart-manager: installer finished but ${exePath} is missing`);
|
|
206
|
+
}
|
|
207
|
+
logger.log(`installed restart-manager v${version} → ${exePath}`);
|
|
208
|
+
return exePath;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const appDir = protocol.getAppDir(root);
|
|
212
|
+
const tmpDir = `${appDir}.tmp`;
|
|
213
|
+
|
|
214
|
+
// Fresh staging dir.
|
|
215
|
+
removeDirNoAsar(tmpDir);
|
|
216
|
+
jetpack.dir(tmpDir);
|
|
217
|
+
|
|
218
|
+
if (platform === 'darwin') {
|
|
219
|
+
const extractZip = require('extract-zip');
|
|
220
|
+
await extractZip(artifactPath, { dir: tmpDir });
|
|
221
|
+
} else if (platform === 'linux') {
|
|
222
|
+
const target = path.join(tmpDir, protocol.RM_APP_NAMES.linux);
|
|
223
|
+
jetpack.copy(artifactPath, target);
|
|
224
|
+
fs.chmodSync(target, 0o755);
|
|
225
|
+
} else {
|
|
226
|
+
throw new Error(`restart-manager: unsupported platform "${platform}"`);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Swap: remove old app/, rename staging into place (rename-retry guards
|
|
230
|
+
// transient locks).
|
|
231
|
+
removeDirNoAsar(appDir);
|
|
232
|
+
await renameWithRetry(tmpDir, appDir);
|
|
233
|
+
|
|
234
|
+
const appPath = protocol.getInstalledAppPath(root, platform);
|
|
235
|
+
logger.log(`installed restart-manager v${version} → ${appPath}`);
|
|
236
|
+
return appPath;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Run an NSIS one-click installer fully silently and wait for it to finish.
|
|
240
|
+
function runSilentInstaller(installerPath) {
|
|
241
|
+
return new Promise((resolve, reject) => {
|
|
242
|
+
const child = spawn(installerPath, ['/S'], { stdio: 'ignore' });
|
|
243
|
+
const timer = setTimeout(() => {
|
|
244
|
+
child.kill();
|
|
245
|
+
reject(new Error('restart-manager: silent installer timed out'));
|
|
246
|
+
}, WIN_INSTALLER_TIMEOUT_MS);
|
|
247
|
+
child.on('error', (e) => { clearTimeout(timer); reject(e); });
|
|
248
|
+
child.on('exit', (code) => {
|
|
249
|
+
clearTimeout(timer);
|
|
250
|
+
if (code === 0) return resolve();
|
|
251
|
+
reject(new Error(`restart-manager: installer exited with code ${code}`));
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Acquire the advisory install lock (wx-flag create). A lock whose holder pid
|
|
258
|
+
* is dead OR that is older than LOCK_STALE_MS is taken over.
|
|
259
|
+
*
|
|
260
|
+
* @param {string} root
|
|
261
|
+
* @param {{ pid: number, hostAppId: string }} meta
|
|
262
|
+
* @returns {boolean} true when acquired.
|
|
263
|
+
*/
|
|
264
|
+
function acquireInstallLock(root, meta) {
|
|
265
|
+
const lockPath = protocol.getLockPath(root);
|
|
266
|
+
jetpack.dir(root);
|
|
267
|
+
const payload = JSON.stringify({ pid: meta.pid, hostAppId: meta.hostAppId, acquiredAt: Date.now() });
|
|
268
|
+
|
|
269
|
+
try {
|
|
270
|
+
fs.writeFileSync(lockPath, payload, { flag: 'wx' });
|
|
271
|
+
return true;
|
|
272
|
+
} catch (e) {
|
|
273
|
+
if (e.code !== 'EEXIST') return false;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Lock exists — stale (dead holder or too old) means we take over.
|
|
277
|
+
let existing = null;
|
|
278
|
+
try { existing = JSON.parse(fs.readFileSync(lockPath, 'utf8')); } catch (_) { /* corrupt = stale */ }
|
|
279
|
+
const holderAlive = existing && pidAlive(existing.pid);
|
|
280
|
+
const fresh = existing && Number.isFinite(existing.acquiredAt) && (Date.now() - existing.acquiredAt) < LOCK_STALE_MS;
|
|
281
|
+
if (holderAlive && fresh) return false;
|
|
282
|
+
|
|
283
|
+
try {
|
|
284
|
+
fs.writeFileSync(lockPath, payload);
|
|
285
|
+
return true;
|
|
286
|
+
} catch (_) {
|
|
287
|
+
return false;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Release the advisory install lock (best-effort).
|
|
293
|
+
*
|
|
294
|
+
* @param {string} root
|
|
295
|
+
*/
|
|
296
|
+
function releaseInstallLock(root) {
|
|
297
|
+
try { fs.unlinkSync(protocol.getLockPath(root)); } catch (_) { /* ignore */ }
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Liveness check by pid. EPERM means "alive but not ours".
|
|
302
|
+
*
|
|
303
|
+
* @param {number} pid
|
|
304
|
+
* @returns {boolean}
|
|
305
|
+
*/
|
|
306
|
+
function pidAlive(pid) {
|
|
307
|
+
if (!Number.isInteger(pid) || pid <= 0) return false;
|
|
308
|
+
try {
|
|
309
|
+
process.kill(pid, 0);
|
|
310
|
+
return true;
|
|
311
|
+
} catch (e) {
|
|
312
|
+
return e.code === 'EPERM';
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// Remove a dir that may contain .app/.asar entries — jetpack won't walk into
|
|
317
|
+
// asar paths unless process.noAsar is set (same guard the legacy lib used).
|
|
318
|
+
function removeDirNoAsar(dir) {
|
|
319
|
+
if (!jetpack.exists(dir)) return;
|
|
320
|
+
const prev = process.noAsar;
|
|
321
|
+
process.noAsar = true;
|
|
322
|
+
try { jetpack.remove(dir); } finally { process.noAsar = prev; }
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// Windows keeps exe/dir locks alive briefly after the owning process exits;
|
|
326
|
+
// retry the swap on EBUSY/EPERM before giving up.
|
|
327
|
+
async function renameWithRetry(from, to, tries = 5, delayMs = 500) {
|
|
328
|
+
for (let i = 0; i < tries; i++) {
|
|
329
|
+
try {
|
|
330
|
+
fs.renameSync(from, to);
|
|
331
|
+
return;
|
|
332
|
+
} catch (e) {
|
|
333
|
+
const retryable = e.code === 'EBUSY' || e.code === 'EPERM' || e.code === 'ENOTEMPTY';
|
|
334
|
+
if (!retryable || i === tries - 1) throw e;
|
|
335
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
336
|
+
removeDirNoAsar(to);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
module.exports = {
|
|
342
|
+
FEED_FILES,
|
|
343
|
+
buildFeedUrl,
|
|
344
|
+
buildArtifactUrl,
|
|
345
|
+
parseFeed,
|
|
346
|
+
pickArtifact,
|
|
347
|
+
fetchFeed,
|
|
348
|
+
downloadFile,
|
|
349
|
+
installArtifact,
|
|
350
|
+
acquireInstallLock,
|
|
351
|
+
releaseInstallLock,
|
|
352
|
+
pidAlive,
|
|
353
|
+
};
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
// Restart Manager protocol v1 — the shared contract SSOT.
|
|
2
|
+
//
|
|
3
|
+
// BOTH sides of the Restart Manager system import this file:
|
|
4
|
+
// - @omega.js/desktop's own lib (src/lib/restart-manager/index.js) — the registering side that
|
|
5
|
+
// every @omega.js/desktop app runs.
|
|
6
|
+
// - The Restart Manager app itself (an @omega.js/desktop consumer) via the sanctioned deep
|
|
7
|
+
// require: require('@omega.js/desktop/lib/restart-manager/protocol').
|
|
8
|
+
//
|
|
9
|
+
// NEVER copy these constants into another repo — this file is the single
|
|
10
|
+
// authoritative definition of the wire protocol, the shared filesystem layout,
|
|
11
|
+
// and the payload shapes. Bump PROTOCOL_VERSION on any breaking change.
|
|
12
|
+
//
|
|
13
|
+
// Deliberately pure Node: no electron import, no @omega.js/desktop imports, no I/O. Everything
|
|
14
|
+
// takes plain values so it's testable at the build layer and bundles anywhere.
|
|
15
|
+
//
|
|
16
|
+
// The shared root (`<appData>/restart-manager/`) is NEUTRAL ground — it is NOT
|
|
17
|
+
// any app's userData dir, so @omega.js/desktop's dev/test userData suffixing never moves it:
|
|
18
|
+
// runtime.json — written atomically by the RM app while its HTTP server is
|
|
19
|
+
// listening; removed on graceful quit. The pid inside is the
|
|
20
|
+
// liveness truth check — a stale file is harmless.
|
|
21
|
+
// app/ — the installed RM app on mac/linux (owned by @omega.js/desktop's install
|
|
22
|
+
// machinery). Windows installs via silent NSIS instead, so
|
|
23
|
+
// the exe lives in %LOCALAPPDATA%\Programs\ (see
|
|
24
|
+
// getInstalledAppPath) — NSIS is what lets RM self-update
|
|
25
|
+
// through electron-updater on Windows.
|
|
26
|
+
// install.lock — advisory lock so two @omega.js/desktop apps can't run installers concurrently.
|
|
27
|
+
//
|
|
28
|
+
// Updates: RM updates ITSELF via @omega.js/desktop's standard autoUpdater (registrations are
|
|
29
|
+
// storage-persisted, so they survive the update relaunch). @omega.js/desktop's lib only ever
|
|
30
|
+
// installs RM when it's missing.
|
|
31
|
+
//
|
|
32
|
+
// Full reference: docs/restart-manager.md.
|
|
33
|
+
|
|
34
|
+
const path = require('path');
|
|
35
|
+
|
|
36
|
+
const PROTOCOL_VERSION = 1;
|
|
37
|
+
|
|
38
|
+
const SHARED_DIR_NAME = 'restart-manager';
|
|
39
|
+
const RUNTIME_FILE = 'runtime.json';
|
|
40
|
+
const APP_DIR = 'app';
|
|
41
|
+
const LOCK_FILE = 'install.lock';
|
|
42
|
+
|
|
43
|
+
// HTTP endpoints served by the RM app on 127.0.0.1:<runtime.json port>.
|
|
44
|
+
const ENDPOINTS = Object.freeze({
|
|
45
|
+
health: '/v1/health', // GET → { ok, version, protocolVersion, uptime, apps } (apps = COUNT)
|
|
46
|
+
register: '/v1/register', // POST → { ok } (idempotent upsert keyed by id)
|
|
47
|
+
deregister: '/v1/deregister', // POST → { ok } (idempotent; unknown id still ok)
|
|
48
|
+
apps: '/v1/apps', // GET → { ok, apps: [...] }
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// Installed-app entry per platform. mac/linux live inside `<sharedRoot>/app/`;
|
|
52
|
+
// Windows is an NSIS per-user install under %LOCALAPPDATA%\Programs\<productName>\
|
|
53
|
+
// (electron-builder's default one-click location — required for electron-updater
|
|
54
|
+
// self-updates).
|
|
55
|
+
const RM_APP_NAMES = Object.freeze({
|
|
56
|
+
darwin: 'Restart Manager.app',
|
|
57
|
+
win32: 'Restart Manager.exe',
|
|
58
|
+
linux: 'Restart-Manager.AppImage',
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
const WIN_INSTALL_DIR_NAME = 'Restart Manager'; // %LOCALAPPDATA%\Programs\<this>\
|
|
62
|
+
|
|
63
|
+
const ENVIRONMENTS = Object.freeze(['development', 'testing', 'production']);
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Resolve the shared root directory both sides agree on.
|
|
67
|
+
* `OMEGA_RM_ROOT` is the cross-repo isolation seam: tests (and parallel dev setups)
|
|
68
|
+
* set it to keep dev/test runs away from the real `<appData>/restart-manager`.
|
|
69
|
+
*
|
|
70
|
+
* @param {string} appDataPath - `app.getPath('appData')` (the PARENT of userData dirs).
|
|
71
|
+
* @param {object} [env] - environment map, defaults to process.env.
|
|
72
|
+
* @returns {string} absolute shared-root path.
|
|
73
|
+
*/
|
|
74
|
+
function resolveSharedRoot(appDataPath, env) {
|
|
75
|
+
const e = env || process.env;
|
|
76
|
+
return e.OMEGA_RM_ROOT || path.join(appDataPath, SHARED_DIR_NAME);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* @param {string} root - shared root from resolveSharedRoot().
|
|
81
|
+
* @returns {string} path to runtime.json.
|
|
82
|
+
*/
|
|
83
|
+
function getRuntimePath(root) {
|
|
84
|
+
return path.join(root, RUNTIME_FILE);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* @param {string} root
|
|
89
|
+
* @returns {string} path to the app/ install dir (mac/linux installs).
|
|
90
|
+
*/
|
|
91
|
+
function getAppDir(root) {
|
|
92
|
+
return path.join(root, APP_DIR);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* @param {string} root
|
|
97
|
+
* @returns {string} path to the advisory install lock file.
|
|
98
|
+
*/
|
|
99
|
+
function getLockPath(root) {
|
|
100
|
+
return path.join(root, LOCK_FILE);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Canonical installed-app path per platform — THE existence check target.
|
|
105
|
+
* mac/linux: inside the shared root's app/ dir. Windows: the NSIS per-user
|
|
106
|
+
* install location (%LOCALAPPDATA%\Programs\Restart Manager\Restart Manager.exe).
|
|
107
|
+
*
|
|
108
|
+
* @param {string} root - shared root (used for mac/linux).
|
|
109
|
+
* @param {string} platform - process.platform value ('darwin' | 'win32' | 'linux').
|
|
110
|
+
* @param {object} [env] - environment map (win32 only), defaults to process.env.
|
|
111
|
+
* @returns {string} absolute path to the installed RM app entry.
|
|
112
|
+
*/
|
|
113
|
+
function getInstalledAppPath(root, platform, env) {
|
|
114
|
+
const name = RM_APP_NAMES[platform];
|
|
115
|
+
if (!name) throw new Error(`restart-manager: unsupported platform "${platform}"`);
|
|
116
|
+
if (platform === 'win32') {
|
|
117
|
+
const e = env || process.env;
|
|
118
|
+
if (!e.LOCALAPPDATA) throw new Error('restart-manager: LOCALAPPDATA not set');
|
|
119
|
+
return path.join(e.LOCALAPPDATA, 'Programs', WIN_INSTALL_DIR_NAME, name);
|
|
120
|
+
}
|
|
121
|
+
return path.join(getAppDir(root), name);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// ─── Validators ───────────────────────────────────────────────────────────────
|
|
125
|
+
// All return { valid: boolean, errors: [{ field, message }] } and never throw.
|
|
126
|
+
|
|
127
|
+
function _isPlainObject(value) {
|
|
128
|
+
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function _isPositiveInt(value) {
|
|
132
|
+
return Number.isInteger(value) && value > 0;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function _isNonEmptyString(value) {
|
|
136
|
+
return typeof value === 'string' && value.length > 0;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Validate a parsed runtime.json payload.
|
|
141
|
+
*
|
|
142
|
+
* @param {object} obj - parsed runtime.json contents.
|
|
143
|
+
* @returns {{ valid: boolean, errors: Array<{field: string, message: string}> }}
|
|
144
|
+
*/
|
|
145
|
+
function validateRuntime(obj) {
|
|
146
|
+
const errors = [];
|
|
147
|
+
|
|
148
|
+
if (!_isPlainObject(obj)) {
|
|
149
|
+
return { valid: false, errors: [{ field: '', message: 'runtime must be an object' }] };
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (obj.protocolVersion !== PROTOCOL_VERSION) {
|
|
153
|
+
errors.push({ field: 'protocolVersion', message: `must be ${PROTOCOL_VERSION}` });
|
|
154
|
+
}
|
|
155
|
+
if (!_isPositiveInt(obj.port) || obj.port > 65535) {
|
|
156
|
+
errors.push({ field: 'port', message: 'must be an integer 1-65535' });
|
|
157
|
+
}
|
|
158
|
+
if (!_isPositiveInt(obj.pid)) {
|
|
159
|
+
errors.push({ field: 'pid', message: 'must be a positive integer' });
|
|
160
|
+
}
|
|
161
|
+
if (!_isNonEmptyString(obj.version)) {
|
|
162
|
+
errors.push({ field: 'version', message: 'must be a non-empty string' });
|
|
163
|
+
}
|
|
164
|
+
if (!_isNonEmptyString(obj.environment)) {
|
|
165
|
+
errors.push({ field: 'environment', message: 'must be a non-empty string' });
|
|
166
|
+
}
|
|
167
|
+
if (!obj.startedAt) {
|
|
168
|
+
errors.push({ field: 'startedAt', message: 'is required' });
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return { valid: errors.length === 0, errors };
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Validate a POST /v1/register body.
|
|
176
|
+
*
|
|
177
|
+
* @param {object} obj - candidate register payload.
|
|
178
|
+
* @returns {{ valid: boolean, errors: Array<{field: string, message: string}> }}
|
|
179
|
+
*/
|
|
180
|
+
function validateRegisterPayload(obj) {
|
|
181
|
+
const errors = [];
|
|
182
|
+
|
|
183
|
+
if (!_isPlainObject(obj)) {
|
|
184
|
+
return { valid: false, errors: [{ field: '', message: 'payload must be an object' }] };
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (obj.protocolVersion !== PROTOCOL_VERSION) {
|
|
188
|
+
errors.push({ field: 'protocolVersion', message: `must be ${PROTOCOL_VERSION}` });
|
|
189
|
+
}
|
|
190
|
+
if (!_isNonEmptyString(obj.id)) {
|
|
191
|
+
errors.push({ field: 'id', message: 'must be a non-empty string' });
|
|
192
|
+
}
|
|
193
|
+
if (!_isNonEmptyString(obj.name)) {
|
|
194
|
+
errors.push({ field: 'name', message: 'must be a non-empty string' });
|
|
195
|
+
}
|
|
196
|
+
if (!_isPositiveInt(obj.pid)) {
|
|
197
|
+
errors.push({ field: 'pid', message: 'must be a positive integer' });
|
|
198
|
+
}
|
|
199
|
+
// Same-machine protocol → path.isAbsolute is valid for the receiving side too.
|
|
200
|
+
if (!_isNonEmptyString(obj.path) || !path.isAbsolute(obj.path)) {
|
|
201
|
+
errors.push({ field: 'path', message: 'must be an absolute path string' });
|
|
202
|
+
}
|
|
203
|
+
if (!_isNonEmptyString(obj.version)) {
|
|
204
|
+
errors.push({ field: 'version', message: 'must be a non-empty string' });
|
|
205
|
+
}
|
|
206
|
+
if (!ENVIRONMENTS.includes(obj.environment)) {
|
|
207
|
+
errors.push({ field: 'environment', message: `must be one of ${ENVIRONMENTS.join(', ')}` });
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return { valid: errors.length === 0, errors };
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Validate a POST /v1/deregister body.
|
|
215
|
+
*
|
|
216
|
+
* @param {object} obj - candidate deregister payload.
|
|
217
|
+
* @returns {{ valid: boolean, errors: Array<{field: string, message: string}> }}
|
|
218
|
+
*/
|
|
219
|
+
function validateDeregisterPayload(obj) {
|
|
220
|
+
const errors = [];
|
|
221
|
+
|
|
222
|
+
if (!_isPlainObject(obj)) {
|
|
223
|
+
return { valid: false, errors: [{ field: '', message: 'payload must be an object' }] };
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
if (!_isNonEmptyString(obj.id)) {
|
|
227
|
+
errors.push({ field: 'id', message: 'must be a non-empty string' });
|
|
228
|
+
}
|
|
229
|
+
if (!_isPositiveInt(obj.pid)) {
|
|
230
|
+
errors.push({ field: 'pid', message: 'must be a positive integer' });
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return { valid: errors.length === 0, errors };
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Build a register payload with the protocol version stamped.
|
|
238
|
+
* Callers pass raw fields; this is the ONE place the wire shape is assembled.
|
|
239
|
+
*
|
|
240
|
+
* @param {{ id: string, name: string, pid: number, path: string, version: string, environment: string }} fields
|
|
241
|
+
* @returns {object} wire-ready register payload.
|
|
242
|
+
*/
|
|
243
|
+
function buildRegisterPayload(fields) {
|
|
244
|
+
return {
|
|
245
|
+
protocolVersion: PROTOCOL_VERSION,
|
|
246
|
+
id: fields.id,
|
|
247
|
+
name: fields.name,
|
|
248
|
+
pid: fields.pid,
|
|
249
|
+
path: fields.path,
|
|
250
|
+
version: fields.version,
|
|
251
|
+
environment: fields.environment,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
module.exports = {
|
|
256
|
+
PROTOCOL_VERSION,
|
|
257
|
+
SHARED_DIR_NAME,
|
|
258
|
+
RUNTIME_FILE,
|
|
259
|
+
APP_DIR,
|
|
260
|
+
LOCK_FILE,
|
|
261
|
+
ENDPOINTS,
|
|
262
|
+
RM_APP_NAMES,
|
|
263
|
+
WIN_INSTALL_DIR_NAME,
|
|
264
|
+
ENVIRONMENTS,
|
|
265
|
+
resolveSharedRoot,
|
|
266
|
+
getRuntimePath,
|
|
267
|
+
getAppDir,
|
|
268
|
+
getLockPath,
|
|
269
|
+
getInstalledAppPath,
|
|
270
|
+
validateRuntime,
|
|
271
|
+
validateRegisterPayload,
|
|
272
|
+
validateDeregisterPayload,
|
|
273
|
+
buildRegisterPayload,
|
|
274
|
+
};
|