@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,371 @@
|
|
|
1
|
+
// Client bridge — main-process Firebase Auth, source of truth for renderers.
|
|
2
|
+
//
|
|
3
|
+
// This is @omega.js/desktop's analogue of BXM's background-service-worker auth role. The pattern:
|
|
4
|
+
//
|
|
5
|
+
// 1. Main runs its own Firebase Auth instance and is the source of truth.
|
|
6
|
+
// 2. When a deep-link auth/token arrives, main calls signInWithCustomToken with that token,
|
|
7
|
+
// then BROADCASTS the token to all renderer windows so their @omega.js/client Firebase
|
|
8
|
+
// instances can sign in with the SAME token.
|
|
9
|
+
// 3. On every renderer load, the renderer asks main "I'm at UID X (or null)" via the
|
|
10
|
+
// desktop:auth:sync-request IPC. Main compares with its own UID and either does nothing,
|
|
11
|
+
// tells the renderer to sign out, or fetches a fresh custom token from /omega
|
|
12
|
+
// and sends it to the renderer.
|
|
13
|
+
// 4. Sign-out: any renderer can request sign-out via desktop:auth:sign-out. Main signs out
|
|
14
|
+
// its own Firebase + broadcasts desktop:auth:sign-out to all renderers.
|
|
15
|
+
//
|
|
16
|
+
// Firebase is BUNDLED by esbuild from @omega.js/desktop's module context (@omega.js/client owns it in @omega.js/desktop's
|
|
17
|
+
// tree). If loading fails, the bridge stays in no-op mode and logs the reason.
|
|
18
|
+
|
|
19
|
+
const LoggerLite = require('./logger-lite.js');
|
|
20
|
+
const authPersistence = require('./auth-persistence.js');
|
|
21
|
+
const { localPort } = require('../utils/url-helpers.js');
|
|
22
|
+
|
|
23
|
+
const logger = new LoggerLite('client-bridge');
|
|
24
|
+
|
|
25
|
+
const FIREBASE_APP_NAME = 'omega-auth';
|
|
26
|
+
|
|
27
|
+
const bridge = {
|
|
28
|
+
_initialized: false,
|
|
29
|
+
_manager: null,
|
|
30
|
+
_firebase: null, // firebase/app
|
|
31
|
+
_firebaseAuth: null, // auth instance
|
|
32
|
+
_firebaseModule: null, // firebase/auth namespace (signInWithCustomToken, signOut, ...)
|
|
33
|
+
_stateSubs: new Set(), // main-side subscribers fn(user)
|
|
34
|
+
_ipcRegistered: false,
|
|
35
|
+
_resolvedPlan: null, // renderer-resolved subscription { plan, active, trialing, cancelling }
|
|
36
|
+
_resolvedRoles: null, // renderer-resolved account roles { admin, betaTester, ... }
|
|
37
|
+
|
|
38
|
+
async initialize(manager) {
|
|
39
|
+
if (bridge._initialized) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
bridge._manager = manager;
|
|
44
|
+
|
|
45
|
+
// Try to load firebase. If it's not installed, run in no-op mode.
|
|
46
|
+
const ok = await bridge._tryLoadFirebase();
|
|
47
|
+
if (!ok) {
|
|
48
|
+
logger.warn('firebase not installed — client-bridge running in no-op mode. `npm i firebase` to enable auth.');
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
bridge._registerIpc();
|
|
52
|
+
|
|
53
|
+
if (ok) {
|
|
54
|
+
// Boot Firebase Auth. With a persistence strategy active (lib/auth-persistence.js,
|
|
55
|
+
// default safeStorage), the session survives restarts — the restore lands async
|
|
56
|
+
// via onAuthStateChanged shortly after boot.
|
|
57
|
+
try {
|
|
58
|
+
const strategy = await authPersistence.resolve(manager);
|
|
59
|
+
bridge._firebaseAuth = bridge._getFirebaseAuth(strategy);
|
|
60
|
+
// onAuthStateChanged is the source of truth listener.
|
|
61
|
+
bridge._firebaseModule.onAuthStateChanged(bridge._firebaseAuth, (user) => {
|
|
62
|
+
bridge._handleAuthStateChange(user);
|
|
63
|
+
});
|
|
64
|
+
logger.log(`initialize — firebase loaded (persistence: ${strategy ? strategy.name : 'in-memory'})`);
|
|
65
|
+
} catch (e) {
|
|
66
|
+
logger.error('firebase init failed:', e.message);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
bridge._initialized = true;
|
|
71
|
+
},
|
|
72
|
+
|
|
73
|
+
// Load firebase. Returns true on success. BUNDLED by esbuild from @omega.js/desktop's module context
|
|
74
|
+
// (@omega.js/client owns firebase in @omega.js/desktop's tree) — same treatment as json5 in main.js. In the
|
|
75
|
+
// webpack era it was a webpackIgnore'd runtime import(), which resolves relative to the CONSUMER's
|
|
76
|
+
// main.bundle.js: that walk never reaches @omega.js/desktop's node_modules when @omega.js/desktop is symlinked
|
|
77
|
+
// (`mgr install dev`) and depends on npm hoisting when installed — every dev app silently
|
|
78
|
+
// ran the bridge in no-op mode. Interop guards handle both namespace shapes (json5 precedent).
|
|
79
|
+
async _tryLoadFirebase() {
|
|
80
|
+
try {
|
|
81
|
+
const appMod = require('firebase/app');
|
|
82
|
+
const authMod = require('firebase/auth');
|
|
83
|
+
|
|
84
|
+
bridge._firebase = appMod.initializeApp ? appMod : (appMod.default || appMod);
|
|
85
|
+
bridge._firebaseModule = authMod.getAuth ? authMod : (authMod.default || authMod);
|
|
86
|
+
return true;
|
|
87
|
+
} catch (e) {
|
|
88
|
+
logger.warn('firebase load failed:', e.message);
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
|
|
93
|
+
_getFirebaseAuth(strategy) {
|
|
94
|
+
if (bridge._firebaseAuth) return bridge._firebaseAuth;
|
|
95
|
+
|
|
96
|
+
const firebaseConfig = bridge._manager.config.cloud?.config;
|
|
97
|
+
if (!firebaseConfig || !Object.keys(firebaseConfig).length) {
|
|
98
|
+
throw new Error('cloud.config is empty — cannot initialize auth.');
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const { initializeApp, getApp } = bridge._firebase;
|
|
102
|
+
const { getAuth, initializeAuth } = bridge._firebaseModule;
|
|
103
|
+
|
|
104
|
+
let app;
|
|
105
|
+
try { app = getApp(FIREBASE_APP_NAME); }
|
|
106
|
+
catch (e) { app = initializeApp(firebaseConfig, FIREBASE_APP_NAME); }
|
|
107
|
+
|
|
108
|
+
// With a storage strategy, boot auth on OUR persistence (session survives
|
|
109
|
+
// restarts); without one, firebase's Node default (in-memory) applies.
|
|
110
|
+
if (strategy && initializeAuth) {
|
|
111
|
+
bridge._firebaseAuth = initializeAuth(app, {
|
|
112
|
+
persistence: [authPersistence.buildFirebasePersistence(strategy)],
|
|
113
|
+
});
|
|
114
|
+
} else {
|
|
115
|
+
bridge._firebaseAuth = getAuth(app);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// A TESTING run talks to the LOCAL stack, never real auth — the same move
|
|
119
|
+
// getApiUrl() makes when it maps testing to localhost, and the same one
|
|
120
|
+
// @omega.js/extension's background SW makes for its emulator runs. Only
|
|
121
|
+
// OMEGA_TEST_MODE=true reaches here; dev and production are untouched.
|
|
122
|
+
if (bridge._manager.isTesting()) {
|
|
123
|
+
const { connectAuthEmulator } = bridge._firebaseModule;
|
|
124
|
+
const port = bridge._authEmulatorPort();
|
|
125
|
+
logger.log(`testing run — connecting auth to the emulator on :${port}`);
|
|
126
|
+
connectAuthEmulator(bridge._firebaseAuth, `http://localhost:${port}`, { disableWarnings: true });
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return bridge._firebaseAuth;
|
|
130
|
+
},
|
|
131
|
+
|
|
132
|
+
// The auth emulator's port, on the same three-step chain getApiUrl() walks:
|
|
133
|
+
// the resolved-port env channel (N7), then the `dev.ports` map the bundle
|
|
134
|
+
// baked into OMEGA_BUILD_JSON, then the classic 9099
|
|
135
|
+
// ([#745](https://github.com/Omega-JS-Stack/omega/issues/745)).
|
|
136
|
+
_authEmulatorPort() {
|
|
137
|
+
return localPort(bridge._manager, 'OMEGA_AUTH_PORT', 'auth') || 9099;
|
|
138
|
+
},
|
|
139
|
+
|
|
140
|
+
_registerIpc() {
|
|
141
|
+
if (bridge._ipcRegistered) return;
|
|
142
|
+
const ipc = bridge._manager.ipc;
|
|
143
|
+
|
|
144
|
+
// Renderer asks main: "I'm at UID X (or null). Are we in sync?"
|
|
145
|
+
ipc.handle('desktop:auth:sync-request', async ({ contextUid }) => {
|
|
146
|
+
return bridge._handleSyncRequest(contextUid);
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
// Renderer asks main to sign out.
|
|
150
|
+
ipc.handle('desktop:auth:sign-out', async () => {
|
|
151
|
+
return bridge._handleSignOut();
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
// Renderer asks main for the current user (uid + email + displayName, no token).
|
|
155
|
+
ipc.handle('desktop:auth:get-user', () => {
|
|
156
|
+
const u = bridge._firebaseAuth?.currentUser;
|
|
157
|
+
return u ? bridge._snapshotUser(u) : null;
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
// Renderer pushes its @omega.js/client account resolution (auth().listen() settled:
|
|
161
|
+
// Firestore account fetched, subscription resolved). Main can't run Firestore,
|
|
162
|
+
// so this is how main-side plan gates learn the REAL plan — BXM's "browser
|
|
163
|
+
// contexts resolve, authority caches" split. UID-guarded: a stale push from a
|
|
164
|
+
// renderer that hasn't synced yet is dropped.
|
|
165
|
+
ipc.handle('desktop:auth:account-resolved', ({ uid, resolved, roles } = {}) => {
|
|
166
|
+
const mainUid = bridge._firebaseAuth?.currentUser?.uid || null;
|
|
167
|
+
if (!uid || uid !== mainUid) {
|
|
168
|
+
return { accepted: false };
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const changed = JSON.stringify(resolved) !== JSON.stringify(bridge._resolvedPlan)
|
|
172
|
+
|| JSON.stringify(roles || null) !== JSON.stringify(bridge._resolvedRoles);
|
|
173
|
+
bridge._resolvedPlan = resolved || null;
|
|
174
|
+
bridge._resolvedRoles = roles || null;
|
|
175
|
+
|
|
176
|
+
if (changed) {
|
|
177
|
+
logger.log(`account resolved — plan=${resolved?.plan || '(none)'} active=${!!resolved?.active}`);
|
|
178
|
+
bridge._manager.ipc.broadcast('desktop:auth:plan-changed', { resolved: bridge._resolvedPlan, roles: bridge._resolvedRoles });
|
|
179
|
+
// Main-side subscribers see the same user snapshot again with plan now known.
|
|
180
|
+
const u = bridge._firebaseAuth?.currentUser;
|
|
181
|
+
bridge._stateSubs.forEach((fn) => {
|
|
182
|
+
try { fn(u ? bridge._snapshotUser(u) : null); } catch (e) { logger.error('onAuthChange subscriber threw:', e); }
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
return { accepted: true };
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
bridge._ipcRegistered = true;
|
|
189
|
+
},
|
|
190
|
+
|
|
191
|
+
_handleAuthStateChange(user) {
|
|
192
|
+
logger.log(`auth state → ${user ? user.email : 'signed out'}`);
|
|
193
|
+
|
|
194
|
+
// Sign-out (or a different user signing in) invalidates the cached resolution —
|
|
195
|
+
// renderers re-resolve and push fresh via desktop:auth:account-resolved.
|
|
196
|
+
if (!user) {
|
|
197
|
+
bridge._resolvedPlan = null;
|
|
198
|
+
bridge._resolvedRoles = null;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Notify any main-side subscribers (consumer code that called manager.omega.onAuthChange).
|
|
202
|
+
const snap = user ? bridge._snapshotUser(user) : null;
|
|
203
|
+
bridge._stateSubs.forEach((fn) => {
|
|
204
|
+
try { fn(snap); } catch (e) { logger.error('onAuthChange subscriber threw:', e); }
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
// Tell renderers about the change so they can update UI / refresh menu items.
|
|
208
|
+
bridge._manager.ipc.broadcast('desktop:auth:state-changed', snap);
|
|
209
|
+
|
|
210
|
+
// Attribute Sentry events to the signed-in user (or clear on sign-out). When
|
|
211
|
+
// sentry is disabled (no DSN, dev mode, etc.) setUser is a documented no-op.
|
|
212
|
+
bridge._manager.sentry.setUser(snap);
|
|
213
|
+
},
|
|
214
|
+
|
|
215
|
+
// BXM's syncAuth pattern, ported to Electron.
|
|
216
|
+
async _handleSyncRequest(contextUid) {
|
|
217
|
+
if (!bridge._firebaseAuth) {
|
|
218
|
+
return { needsSync: false, reason: 'firebase-not-loaded' };
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const bgUser = bridge._firebaseAuth.currentUser;
|
|
222
|
+
const bgUid = bgUser?.uid || null;
|
|
223
|
+
|
|
224
|
+
// Already in sync.
|
|
225
|
+
if (contextUid === bgUid) {
|
|
226
|
+
return { needsSync: false };
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Renderer signed in but main signed out → tell renderer to sign out.
|
|
230
|
+
if (!bgUser && contextUid) {
|
|
231
|
+
return { needsSync: true, signOut: true };
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// Main signed in, renderer not (or different user) → fetch a fresh custom token + send.
|
|
235
|
+
try {
|
|
236
|
+
const token = await bridge._fetchCustomToken(bgUser);
|
|
237
|
+
return {
|
|
238
|
+
needsSync: true,
|
|
239
|
+
customToken: token,
|
|
240
|
+
user: bridge._snapshotUser(bgUser),
|
|
241
|
+
};
|
|
242
|
+
} catch (e) {
|
|
243
|
+
logger.error('sync-request: failed to fetch custom token:', e.message);
|
|
244
|
+
return { needsSync: false, error: e.message };
|
|
245
|
+
}
|
|
246
|
+
},
|
|
247
|
+
|
|
248
|
+
async _handleSignOut() {
|
|
249
|
+
try {
|
|
250
|
+
if (bridge._firebaseAuth?.currentUser) {
|
|
251
|
+
await bridge._firebaseModule.signOut(bridge._firebaseAuth);
|
|
252
|
+
}
|
|
253
|
+
bridge._manager.ipc.broadcast('desktop:auth:sign-out', {});
|
|
254
|
+
return { success: true };
|
|
255
|
+
} catch (e) {
|
|
256
|
+
logger.error('sign-out failed:', e.message);
|
|
257
|
+
return { success: false, error: e.message };
|
|
258
|
+
}
|
|
259
|
+
},
|
|
260
|
+
|
|
261
|
+
// Public API ──────────────────────────────────────────────────────────────────
|
|
262
|
+
|
|
263
|
+
// Called by lib/deep-link's auth/token built-in.
|
|
264
|
+
async handleAuthToken(token) {
|
|
265
|
+
if (!bridge._firebaseAuth) {
|
|
266
|
+
logger.warn('handleAuthToken called but firebase not loaded — ignoring.');
|
|
267
|
+
return { success: false, reason: 'firebase-not-loaded' };
|
|
268
|
+
}
|
|
269
|
+
if (!token) {
|
|
270
|
+
logger.warn('handleAuthToken called with no token — ignoring.');
|
|
271
|
+
return { success: false, reason: 'no-token' };
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
try {
|
|
275
|
+
const cred = await bridge._firebaseModule.signInWithCustomToken(bridge._firebaseAuth, token);
|
|
276
|
+
logger.log(`signed in: ${cred.user.email || cred.user.uid}`);
|
|
277
|
+
|
|
278
|
+
// Broadcast the token to renderers so they can sign in with the SAME token.
|
|
279
|
+
// Tokens expire in 1 hour and aren't stored.
|
|
280
|
+
bridge._manager.ipc.broadcast('desktop:auth:sign-in-with-token', { token });
|
|
281
|
+
|
|
282
|
+
return { success: true, user: bridge._snapshotUser(cred.user) };
|
|
283
|
+
} catch (e) {
|
|
284
|
+
logger.error('signInWithCustomToken failed:', e.message);
|
|
285
|
+
return { success: false, error: e.message };
|
|
286
|
+
}
|
|
287
|
+
},
|
|
288
|
+
|
|
289
|
+
// Subscribe to auth state changes on the main side (e.g. for menu/tray refresh).
|
|
290
|
+
onAuthChange(fn) {
|
|
291
|
+
bridge._stateSubs.add(fn);
|
|
292
|
+
return () => bridge._stateSubs.delete(fn);
|
|
293
|
+
},
|
|
294
|
+
|
|
295
|
+
// Snapshot of the current user (sync), or null.
|
|
296
|
+
getCurrentUser() {
|
|
297
|
+
const u = bridge._firebaseAuth?.currentUser;
|
|
298
|
+
return u ? bridge._snapshotUser(u) : null;
|
|
299
|
+
},
|
|
300
|
+
|
|
301
|
+
// The renderer-resolved subscription ({ plan, active, trialing, cancelling }) or null
|
|
302
|
+
// while no renderer has resolved yet. THE main-side plan source — consumer plan gates
|
|
303
|
+
// read this (@omega.js/client's resolveSubscription output, pushed via desktop:auth:account-resolved).
|
|
304
|
+
getResolvedPlan() {
|
|
305
|
+
return bridge._resolvedPlan;
|
|
306
|
+
},
|
|
307
|
+
|
|
308
|
+
// The renderer-resolved account roles ({ admin, betaTester, ... }) or null.
|
|
309
|
+
getResolvedRoles() {
|
|
310
|
+
return bridge._resolvedRoles;
|
|
311
|
+
},
|
|
312
|
+
|
|
313
|
+
// Fresh Firebase ID token for the signed-in user (async), or null when
|
|
314
|
+
// signed out / Firebase absent. For consumer main code calling
|
|
315
|
+
// authenticated backend routes (`Authorization: Bearer <token>`).
|
|
316
|
+
async getIdToken() {
|
|
317
|
+
const u = bridge._firebaseAuth?.currentUser;
|
|
318
|
+
return u ? u.getIdToken() : null;
|
|
319
|
+
},
|
|
320
|
+
|
|
321
|
+
// Force sign-out from main code.
|
|
322
|
+
async signOut() {
|
|
323
|
+
return bridge._handleSignOut();
|
|
324
|
+
},
|
|
325
|
+
|
|
326
|
+
// ─── Internals ────────────────────────────────────────────────────────────
|
|
327
|
+
|
|
328
|
+
_snapshotUser(user) {
|
|
329
|
+
return {
|
|
330
|
+
uid: user.uid,
|
|
331
|
+
email: user.email,
|
|
332
|
+
displayName: user.displayName,
|
|
333
|
+
photoURL: user.photoURL,
|
|
334
|
+
emailVerified: user.emailVerified,
|
|
335
|
+
};
|
|
336
|
+
},
|
|
337
|
+
|
|
338
|
+
// Fetch a fresh custom token for the currently-signed-in user via the shared
|
|
339
|
+
// @omega.js/client request layer. Mirrors BXM: POST <apiUrl>/omega/user/token —
|
|
340
|
+
// the route defaults uid to the authenticated caller and responds { token }
|
|
341
|
+
// at the top level.
|
|
342
|
+
async _fetchCustomToken(user) {
|
|
343
|
+
const { createRequest } = require('@omega.js/client/modules/request.js');
|
|
344
|
+
|
|
345
|
+
const request = createRequest({
|
|
346
|
+
getApiUrl: () => bridge._manager.getApiUrl(),
|
|
347
|
+
getIdToken: (force) => user.getIdToken(force),
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
const data = await request('/omega/user/token', { method: 'POST', body: {} });
|
|
351
|
+
|
|
352
|
+
const token = data?.token;
|
|
353
|
+
if (!token) {
|
|
354
|
+
throw new Error('@omega.js/backend response missing token.');
|
|
355
|
+
}
|
|
356
|
+
return token;
|
|
357
|
+
},
|
|
358
|
+
|
|
359
|
+
// Tear-down used by tests — wipes state but keeps registered IPC handlers
|
|
360
|
+
// (they're idempotent via `ipc.handle` duplicate-detection).
|
|
361
|
+
async _resetForTests() {
|
|
362
|
+
try {
|
|
363
|
+
if (bridge._firebaseAuth?.currentUser && bridge._firebaseModule?.signOut) {
|
|
364
|
+
await bridge._firebaseModule.signOut(bridge._firebaseAuth);
|
|
365
|
+
}
|
|
366
|
+
} catch (e) { /* ignore */ }
|
|
367
|
+
bridge._stateSubs.clear();
|
|
368
|
+
},
|
|
369
|
+
};
|
|
370
|
+
|
|
371
|
+
module.exports = bridge;
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
// Context Menu — file-based right-click menu definition.
|
|
2
|
+
//
|
|
3
|
+
// @omega.js/desktop looks for the consumer's `src/integrations/context-menu/index.js` and calls it FOR EACH
|
|
4
|
+
// context-menu event with a builder API plus the event's `params`:
|
|
5
|
+
//
|
|
6
|
+
// // src/integrations/context-menu/index.js
|
|
7
|
+
// module.exports = ({ manager, menu, params, webContents }) => {
|
|
8
|
+
// // Start from @omega.js/desktop's default template (undo/redo, cut/copy/paste, link items,
|
|
9
|
+
// // reload, dev-only inspect):
|
|
10
|
+
// menu.useDefaults();
|
|
11
|
+
//
|
|
12
|
+
// // Mutate by id within this event's items:
|
|
13
|
+
// menu.remove('toggle-devtools'); // hide dev tools
|
|
14
|
+
// menu.insertAfter('copy', { id: 'search-google',
|
|
15
|
+
// label: `Search "${params.selectionText.slice(0,20)}"`,
|
|
16
|
+
// click: () => require('electron').shell.openExternal(...) });
|
|
17
|
+
//
|
|
18
|
+
// // Or build entirely from scratch — useDefaults() is optional:
|
|
19
|
+
// // menu.item({ id: 'copy', role: 'copy' });
|
|
20
|
+
// // menu.separator();
|
|
21
|
+
// // menu.item({ id: 'mine', label: 'Custom', click: ... });
|
|
22
|
+
// };
|
|
23
|
+
//
|
|
24
|
+
// Builder API (per event):
|
|
25
|
+
// menu.item(descriptor)
|
|
26
|
+
// menu.separator()
|
|
27
|
+
// menu.submenu(label, items)
|
|
28
|
+
// menu.useDefaults() — populate with @omega.js/desktop's default template based on params
|
|
29
|
+
// menu.clear() — wipe items added so far this event
|
|
30
|
+
//
|
|
31
|
+
// Id-path API (per event, same shape as menu/tray):
|
|
32
|
+
// .find / .has / .update / .remove / .enable / .show / .hide /
|
|
33
|
+
// .insertBefore / .insertAfter / .appendTo
|
|
34
|
+
//
|
|
35
|
+
// Default template ids (flat — no `context/` prefix; the lib namespace is implicit):
|
|
36
|
+
// undo, redo — when params.editFlags allow
|
|
37
|
+
// cut, copy, paste, paste-and-match-style,
|
|
38
|
+
// select-all — when params.isEditable
|
|
39
|
+
// copy — when params.selectionText (read-only)
|
|
40
|
+
// open-link, copy-link — when params.linkURL
|
|
41
|
+
// reload — always (page reload)
|
|
42
|
+
// inspect, toggle-devtools — dev mode only
|
|
43
|
+
//
|
|
44
|
+
// Building no items (calling no menu.* methods) suppresses the popup entirely.
|
|
45
|
+
//
|
|
46
|
+
// @omega.js/desktop auto-attaches the handler to every BrowserWindow's webContents that
|
|
47
|
+
// goes through `manager.windows.createNamed()`. To attach manually:
|
|
48
|
+
// manager.contextMenu.attach(webContents)
|
|
49
|
+
//
|
|
50
|
+
// Disabling at runtime: call `manager.contextMenu.disable()`. Idempotent. After
|
|
51
|
+
// disable() the lib stops responding to context-menu events on already-attached
|
|
52
|
+
// webContents — no new menus are shown. No config flag.
|
|
53
|
+
|
|
54
|
+
const path = require('path');
|
|
55
|
+
const fs = require('fs');
|
|
56
|
+
const LoggerLite = require('./logger-lite.js');
|
|
57
|
+
const sanitizeURL = require('../utils/sanitize-url.js');
|
|
58
|
+
const { buildIdApi } = require('./_menu-mixin.js');
|
|
59
|
+
|
|
60
|
+
const logger = new LoggerLite('context-menu');
|
|
61
|
+
|
|
62
|
+
const contextMenu = {
|
|
63
|
+
_initialized: false,
|
|
64
|
+
_manager: null,
|
|
65
|
+
_electron: null,
|
|
66
|
+
_definitionFn: null,
|
|
67
|
+
_attached: new WeakSet(), // webContents that already have the listener
|
|
68
|
+
|
|
69
|
+
initialize(manager) {
|
|
70
|
+
if (contextMenu._initialized) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
contextMenu._manager = manager;
|
|
75
|
+
|
|
76
|
+
if (contextMenu._disabled) {
|
|
77
|
+
logger.log('initialize — disabled via manager.contextMenu.disable() called pre-init');
|
|
78
|
+
contextMenu._initialized = true;
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
contextMenu._electron = require('electron');
|
|
83
|
+
|
|
84
|
+
// Conventional path. No config knob — disable() at runtime if you don't want a context menu.
|
|
85
|
+
// appRoot resolves to project dir in dev and asar mount in packaged apps — both contain
|
|
86
|
+
// src/integrations/* (electron-builder's `files: ['**/*']` packs the consumer's src/
|
|
87
|
+
// into the asar), so the existsSync + require below works in both modes.
|
|
88
|
+
const absPath = path.join(require('../utils/app-root.js')(), 'src', 'integrations', 'context-menu', 'index.js');
|
|
89
|
+
|
|
90
|
+
if (fs.existsSync(absPath)) {
|
|
91
|
+
const loadConsumerFile = require('../utils/load-consumer-file.js');
|
|
92
|
+
const loaded = loadConsumerFile(absPath, logger);
|
|
93
|
+
if (typeof loaded === 'function') {
|
|
94
|
+
contextMenu._definitionFn = loaded;
|
|
95
|
+
} else if (loaded != null) {
|
|
96
|
+
logger.warn(`context-menu definition at ${absPath} did not export a function — using default.`);
|
|
97
|
+
contextMenu._definitionFn = null;
|
|
98
|
+
}
|
|
99
|
+
} else {
|
|
100
|
+
logger.log(`no context-menu definition at ${absPath} — using default (copy/paste based on params).`);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
logger.log(`initialize — definition=${contextMenu._definitionFn ? 'consumer' : 'default'}`);
|
|
104
|
+
contextMenu._initialized = true;
|
|
105
|
+
},
|
|
106
|
+
|
|
107
|
+
// Attach the context-menu listener to a webContents (idempotent per webContents).
|
|
108
|
+
attach(webContents) {
|
|
109
|
+
if (!webContents || contextMenu._attached.has(webContents)) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (!contextMenu._electron) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
contextMenu._attached.add(webContents);
|
|
117
|
+
|
|
118
|
+
webContents.on('context-menu', (event, params) => {
|
|
119
|
+
contextMenu._popup(webContents, params);
|
|
120
|
+
});
|
|
121
|
+
},
|
|
122
|
+
|
|
123
|
+
// Build the menu for the given (webContents, params) and pop it up.
|
|
124
|
+
_popup(webContents, params) {
|
|
125
|
+
if (contextMenu._disabled) return; // disabled at runtime → no menu
|
|
126
|
+
const { Menu } = contextMenu._electron;
|
|
127
|
+
|
|
128
|
+
const items = contextMenu._buildItemsForEvent(params, webContents);
|
|
129
|
+
if (items.length === 0) return; // suppress popup
|
|
130
|
+
|
|
131
|
+
const template = items.map((item) => contextMenu._resolveItem(item));
|
|
132
|
+
const builtMenu = Menu.buildFromTemplate(template);
|
|
133
|
+
builtMenu.popup({ window: webContents.getOwnerBrowserWindow() || undefined });
|
|
134
|
+
},
|
|
135
|
+
|
|
136
|
+
// Construct the per-event builder + run the consumer's (or default) definition fn.
|
|
137
|
+
// Returns the items array (live — but per-event, so post-event mutations are pointless).
|
|
138
|
+
_buildItemsForEvent(params, webContents) {
|
|
139
|
+
const items = [];
|
|
140
|
+
|
|
141
|
+
const idApi = buildIdApi({
|
|
142
|
+
getItems: () => items,
|
|
143
|
+
// Per-event: nothing to re-render. The popup happens after definition returns.
|
|
144
|
+
render: () => {},
|
|
145
|
+
logger,
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
const builder = {
|
|
149
|
+
item: (d) => { items.push(d); },
|
|
150
|
+
separator: () => { items.push({ type: 'separator' }); },
|
|
151
|
+
submenu: (label, subs) => { items.push({ label, submenu: subs }); },
|
|
152
|
+
useDefaults: () => { contextMenu._populateDefaults(items, params); },
|
|
153
|
+
clear: () => { items.length = 0; },
|
|
154
|
+
...idApi,
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
const fn = contextMenu._definitionFn || contextMenu._defaultFn;
|
|
158
|
+
try {
|
|
159
|
+
fn({ manager: contextMenu._manager, menu: builder, params, webContents });
|
|
160
|
+
} catch (e) {
|
|
161
|
+
logger.error('context-menu definition fn threw:', e);
|
|
162
|
+
return [];
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return items;
|
|
166
|
+
},
|
|
167
|
+
|
|
168
|
+
// Populate `items` with @omega.js/desktop's default template based on context-menu params.
|
|
169
|
+
// Used by both `_defaultFn` (when no consumer file) and `menu.useDefaults()` (consumer opt-in).
|
|
170
|
+
// Item set + visibility gates mirror the legacy @omega.js/desktop context-menu behavior:
|
|
171
|
+
// undo/redo gated on canUndo/canRedo, edit ops gated on params.isEditable, etc.
|
|
172
|
+
_populateDefaults(items, params) {
|
|
173
|
+
const m = contextMenu._manager;
|
|
174
|
+
const flags = params.editFlags || {};
|
|
175
|
+
|
|
176
|
+
// Undo / redo — only when applicable. Hidden when canUndo/canRedo is false (matches legacy).
|
|
177
|
+
if (flags.canUndo) {
|
|
178
|
+
items.push({ id: 'undo', role: 'undo' });
|
|
179
|
+
}
|
|
180
|
+
if (flags.canRedo) {
|
|
181
|
+
items.push({ id: 'redo', role: 'redo' });
|
|
182
|
+
}
|
|
183
|
+
if (flags.canUndo || flags.canRedo) {
|
|
184
|
+
items.push({ type: 'separator' });
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (params.isEditable) {
|
|
188
|
+
items.push({ id: 'cut', role: 'cut', enabled: flags.canCut !== false });
|
|
189
|
+
items.push({ id: 'copy', role: 'copy', enabled: flags.canCopy !== false });
|
|
190
|
+
items.push({ id: 'paste', role: 'paste', enabled: flags.canPaste !== false });
|
|
191
|
+
items.push({ id: 'paste-and-match-style', role: 'pasteAndMatchStyle', enabled: flags.canPaste !== false });
|
|
192
|
+
items.push({ id: 'select-all', role: 'selectAll' });
|
|
193
|
+
} else if (params.selectionText) {
|
|
194
|
+
items.push({ id: 'copy', role: 'copy' });
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (params.linkURL) {
|
|
198
|
+
if (items.length > 0) items.push({ type: 'separator' });
|
|
199
|
+
items.push({
|
|
200
|
+
id: 'open-link',
|
|
201
|
+
label: 'Open Link in Browser',
|
|
202
|
+
click: () => {
|
|
203
|
+
const { shell } = require('electron');
|
|
204
|
+
const safe = sanitizeURL(params.linkURL);
|
|
205
|
+
if (safe) shell.openExternal(safe);
|
|
206
|
+
},
|
|
207
|
+
});
|
|
208
|
+
items.push({
|
|
209
|
+
id: 'copy-link',
|
|
210
|
+
label: 'Copy Link Address',
|
|
211
|
+
click: () => {
|
|
212
|
+
const { clipboard } = require('electron');
|
|
213
|
+
clipboard.writeText(params.linkURL);
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Reload — useful for both dev and prod. Separator only if there's already content above.
|
|
219
|
+
if (items.length > 0) items.push({ type: 'separator' });
|
|
220
|
+
items.push({ id: 'reload', role: 'reload' });
|
|
221
|
+
|
|
222
|
+
if (m.isDevelopment()) {
|
|
223
|
+
items.push({ type: 'separator' });
|
|
224
|
+
items.push({ id: 'inspect', role: 'inspectElement' });
|
|
225
|
+
items.push({ id: 'toggle-devtools', role: 'toggleDevTools' });
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
|
|
229
|
+
// Default behavior when no consumer definition exists — sensible baseline.
|
|
230
|
+
_defaultFn({ menu, params }) {
|
|
231
|
+
menu.useDefaults();
|
|
232
|
+
},
|
|
233
|
+
|
|
234
|
+
// Same resolver pattern as tray/menu — supports dynamic label/enabled/etc.
|
|
235
|
+
_resolveItem(item) {
|
|
236
|
+
if (item.type === 'separator') {
|
|
237
|
+
return { type: 'separator' };
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
const out = { ...item };
|
|
241
|
+
|
|
242
|
+
if (typeof item.label === 'function') {
|
|
243
|
+
try { out.label = String(item.label()); }
|
|
244
|
+
catch (e) { logger.error('item.label() threw:', e); out.label = ''; }
|
|
245
|
+
}
|
|
246
|
+
if (typeof item.enabled === 'function') {
|
|
247
|
+
try { out.enabled = Boolean(item.enabled()); } catch (e) { out.enabled = true; }
|
|
248
|
+
}
|
|
249
|
+
if (typeof item.visible === 'function') {
|
|
250
|
+
try { out.visible = Boolean(item.visible()); } catch (e) { out.visible = true; }
|
|
251
|
+
}
|
|
252
|
+
if (typeof item.checked === 'function') {
|
|
253
|
+
try { out.checked = Boolean(item.checked()); } catch (e) { out.checked = false; }
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (Array.isArray(item.submenu)) {
|
|
257
|
+
out.submenu = item.submenu.map((sub) => contextMenu._resolveItem(sub));
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
if (typeof item.click === 'function') {
|
|
261
|
+
out.click = (menuItem, browserWindow, event) => {
|
|
262
|
+
try { item.click(menuItem, browserWindow, event); }
|
|
263
|
+
catch (e) { logger.error('item.click handler threw:', e); }
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
return out;
|
|
268
|
+
},
|
|
269
|
+
|
|
270
|
+
// Public runtime API — replace the definition fn at runtime.
|
|
271
|
+
define(fn) {
|
|
272
|
+
if (typeof fn !== 'function') {
|
|
273
|
+
throw new Error('contextMenu.define: fn must be a function');
|
|
274
|
+
}
|
|
275
|
+
contextMenu._definitionFn = fn;
|
|
276
|
+
},
|
|
277
|
+
|
|
278
|
+
// Test/inspection helpers — build the items list for given params without popping a menu.
|
|
279
|
+
buildItems(params, webContents) {
|
|
280
|
+
return contextMenu._buildItemsForEvent(params || {}, webContents);
|
|
281
|
+
},
|
|
282
|
+
|
|
283
|
+
hasCustomDefinition() {
|
|
284
|
+
return Boolean(contextMenu._definitionFn);
|
|
285
|
+
},
|
|
286
|
+
|
|
287
|
+
// Disable the context menu entirely. Idempotent. Safe pre- or post-init.
|
|
288
|
+
// After this, _popup() short-circuits — already-attached webContents stop
|
|
289
|
+
// showing menus on right-click. No way to re-enable; call manager.contextMenu.define()
|
|
290
|
+
// and clear _disabled if you really need to.
|
|
291
|
+
disable() {
|
|
292
|
+
contextMenu._disabled = true;
|
|
293
|
+
contextMenu._definitionFn = null;
|
|
294
|
+
if (contextMenu._initialized) {
|
|
295
|
+
logger.log('disabled at runtime — context-menu events will be ignored');
|
|
296
|
+
}
|
|
297
|
+
},
|
|
298
|
+
|
|
299
|
+
isDisabled() { return Boolean(contextMenu._disabled); },
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
module.exports = contextMenu;
|