@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,360 @@
|
|
|
1
|
+
// Analytics — GA4 via Measurement Protocol. Mirrors @omega.js/backend's
|
|
2
|
+
// `Manager.config.analytics.providers.google.id` shape so the same person can be
|
|
3
|
+
// tracked across desktop (@omega.js/desktop) + web (UJM/@omega.js/client) + backend (@omega.js/backend) by
|
|
4
|
+
// referencing a single namespaced UUIDv5 identity.
|
|
5
|
+
//
|
|
6
|
+
// Cross-platform identity (the key feature):
|
|
7
|
+
// client_id = uuidv5(deviceId, namespace) // anonymous-but-stable per install
|
|
8
|
+
// user_id = uuidv5(firebaseUid, namespace) // same human across all surfaces
|
|
9
|
+
//
|
|
10
|
+
// The HUMAN is what crosses surfaces, never the machine: this app's deviceId comes
|
|
11
|
+
// from desktop's own storage and a browser's comes from its localStorage, so one
|
|
12
|
+
// machine is two client_ids and always was (#396). The derivation is shared
|
|
13
|
+
// (@omega.js/analytics' `deriveDeviceId`), the storage it reads is not. user_id
|
|
14
|
+
// rides ALONGSIDE the client_id in every payload — it never replaces it, because
|
|
15
|
+
// GA stitches sessions by client_id.
|
|
16
|
+
//
|
|
17
|
+
// `namespace` is the consumer's `cloud.config.projectId` re-encoded as a UUIDv5
|
|
18
|
+
// namespace via uuidv5.URL of the projectId string. Same projectId in @omega.js/backend/@omega.js/client/@omega.js/desktop
|
|
19
|
+
// → the same uid hashes to the same user_id everywhere → unified analytics.
|
|
20
|
+
//
|
|
21
|
+
// Anonymous (client-bridge hasn't reported auth yet) → user_id stays null.
|
|
22
|
+
// Authed (auth event fires) → user_id is set + a `login` event is dispatched. On
|
|
23
|
+
// logout → user_id clears + `logout` event fires.
|
|
24
|
+
//
|
|
25
|
+
// API surface:
|
|
26
|
+
// manager.analytics.event(name, params?) // generic event
|
|
27
|
+
// manager.analytics.pageview(path?) // convenience wrapper
|
|
28
|
+
// manager.analytics.screenview(name?) // convenience wrapper
|
|
29
|
+
// manager.analytics.setUserId(uid) // manual override; auto-wired to omega
|
|
30
|
+
// manager.analytics.setUserProperties(props) // merge into user_properties block
|
|
31
|
+
//
|
|
32
|
+
// Events fired during normal operation are queued until init completes (we need
|
|
33
|
+
// context.session + measurement_id + secret). Once initialized, the queue
|
|
34
|
+
// flushes and subsequent calls send immediately.
|
|
35
|
+
//
|
|
36
|
+
// Config:
|
|
37
|
+
// analytics: {
|
|
38
|
+
// enabled: true, // default true
|
|
39
|
+
// providers: {
|
|
40
|
+
// google: {
|
|
41
|
+
// id: 'G-XXXXXXXXXX', // Measurement ID (REQUIRED)
|
|
42
|
+
// },
|
|
43
|
+
// },
|
|
44
|
+
// }
|
|
45
|
+
//
|
|
46
|
+
// Secret comes from `process.env.GOOGLE_ANALYTICS_SECRET` (matches @omega.js/backend). The bundle
|
|
47
|
+
// task's esbuild `define` injects it at build time so packaged apps don't need .env at runtime.
|
|
48
|
+
// Without the secret, the module logs a warning + becomes a no-op.
|
|
49
|
+
|
|
50
|
+
const LoggerLite = require('./logger-lite.js');
|
|
51
|
+
const fetch = require('wonderful-fetch');
|
|
52
|
+
// The MP semantics live in ONE place — @omega.js/analytics' core
|
|
53
|
+
// (C4 cp106b): identity math, payload + URL shape are shared with the browser
|
|
54
|
+
// engine and can never drift again.
|
|
55
|
+
const core = require('../vendor/analytics/core.js');
|
|
56
|
+
// And so does WHAT an event is called: the shared catalog and its adapters
|
|
57
|
+
// decide the native name and payload for every surface
|
|
58
|
+
// ([#328](https://github.com/Omega-JS-Stack/omega/issues/328)). This module
|
|
59
|
+
// keeps only what is genuinely desktop's — the Measurement Protocol transport,
|
|
60
|
+
// the pre-init queue, and the IPC bridge.
|
|
61
|
+
const analytics_ = require('../vendor/analytics/index.js');
|
|
62
|
+
|
|
63
|
+
const logger = new LoggerLite('analytics');
|
|
64
|
+
|
|
65
|
+
const FETCH_TIMEOUT_MS = 30 * 1000;
|
|
66
|
+
const MAX_QUEUE = 200;
|
|
67
|
+
|
|
68
|
+
const analytics = {
|
|
69
|
+
_initialized: false,
|
|
70
|
+
_manager: null,
|
|
71
|
+
_enabled: false,
|
|
72
|
+
_measurementId: null,
|
|
73
|
+
_apiSecret: null,
|
|
74
|
+
_namespace: null,
|
|
75
|
+
_clientId: null, // uuidv5(deviceId, namespace) — set on init
|
|
76
|
+
_userId: null, // uuidv5(firebaseUid, namespace) — set on auth
|
|
77
|
+
_userProperties: {},
|
|
78
|
+
_queue: [],
|
|
79
|
+
_authUnsub: null,
|
|
80
|
+
|
|
81
|
+
initialize(manager) {
|
|
82
|
+
if (analytics._initialized) return;
|
|
83
|
+
analytics._initialized = true;
|
|
84
|
+
analytics._manager = manager;
|
|
85
|
+
|
|
86
|
+
const cfg = manager.config.analytics || {};
|
|
87
|
+
|
|
88
|
+
// Presence-driven: providers.google.id presence enables analytics. No separate
|
|
89
|
+
// `enabled` flag (matches @omega.js/backend convention — credentials are the enable signal).
|
|
90
|
+
analytics._measurementId = cfg.providers?.google?.id || null;
|
|
91
|
+
// Secret comes from env. In packaged builds, the bundle task's esbuild `define`
|
|
92
|
+
// replaces `process.env.GOOGLE_ANALYTICS_SECRET` with the build-time literal so the
|
|
93
|
+
// packaged app has it baked in without shipping .env.
|
|
94
|
+
analytics._apiSecret = process.env.GOOGLE_ANALYTICS_SECRET || null;
|
|
95
|
+
|
|
96
|
+
if (!analytics._measurementId) {
|
|
97
|
+
logger.log('analytics: no measurement ID set (config.analytics.providers.google.id) — disabled.');
|
|
98
|
+
analytics._enabled = false;
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (!analytics._apiSecret) {
|
|
102
|
+
logger.warn('analytics: GOOGLE_ANALYTICS_SECRET env var not set — disabled. (Set in .env for dev; the bundle task bakes it in at build time for packaged apps.)');
|
|
103
|
+
analytics._enabled = false;
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
analytics._enabled = true;
|
|
107
|
+
|
|
108
|
+
// Namespace = uuidv5 of the firebase project ID (or app id as fallback). Same
|
|
109
|
+
// projectId in @omega.js/backend/@omega.js/client/@omega.js/desktop → same namespace → same per-uid UUIDv5
|
|
110
|
+
// everywhere. UUIDv5 needs a UUID-shaped namespace — we derive one from the
|
|
111
|
+
// string projectId by hashing it into uuidv5.URL space (RFC 4122).
|
|
112
|
+
const projectId = manager.config.cloud?.config?.projectId
|
|
113
|
+
|| manager.config.brand.id;
|
|
114
|
+
analytics._namespace = core.deriveNamespace(projectId);
|
|
115
|
+
|
|
116
|
+
// Apply a uid stored by a pre-init setUserId() call — the auth
|
|
117
|
+
// subscription below still overrides it when auth resolves.
|
|
118
|
+
if (analytics._pendingUid) {
|
|
119
|
+
analytics.setUserId(analytics._pendingUid);
|
|
120
|
+
analytics._pendingUid = null;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// client_id = the PERSISTED per-install device id. context.session.deviceId is
|
|
124
|
+
// async-resolved and context.initialize() runs before this in the boot sequence,
|
|
125
|
+
// so an empty one is a broken boot order, never a runtime condition — and a
|
|
126
|
+
// fresh id minted here would persist nowhere, making every launch a new GA
|
|
127
|
+
// client (#396). It raises instead.
|
|
128
|
+
const deviceId = manager.context.session.deviceId;
|
|
129
|
+
|
|
130
|
+
if (!deviceId) {
|
|
131
|
+
throw new Error('analytics.initialize() ran before context.initialize() resolved session.deviceId — the boot sequence must init context first');
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
analytics._clientId = core.deriveClientId(deviceId, analytics._namespace);
|
|
135
|
+
|
|
136
|
+
// The facade's seams for THIS process. The transport is the Measurement
|
|
137
|
+
// Protocol below — Meta's and TikTok's pixels do not exist in a main
|
|
138
|
+
// process, so their descriptors report blocked and the fire log says so.
|
|
139
|
+
// Environment mirrors the app's own dev flag: an unknown event name throws
|
|
140
|
+
// in development, where a typo is a bug, and is logged-and-skipped in a
|
|
141
|
+
// packaged app, where throwing would take the user's action with it.
|
|
142
|
+
analytics_.configure({
|
|
143
|
+
transport: { send: (descriptor) => analytics._send(descriptor) },
|
|
144
|
+
context: { runtime: 'electron' },
|
|
145
|
+
environment: manager.isDevelopment?.() ? 'development' : 'production',
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
// Wire auth subscription so user_id flips automatically on login/logout.
|
|
149
|
+
analytics._authUnsub = manager.omega.onAuthChange((snap) => {
|
|
150
|
+
analytics._handleAuthChange(snap);
|
|
151
|
+
});
|
|
152
|
+
// Pull current state immediately in case auth already resolved.
|
|
153
|
+
const current = manager.omega.getCurrentUser();
|
|
154
|
+
if (current?.uid) analytics._handleAuthChange(current);
|
|
155
|
+
|
|
156
|
+
// Compute initial user_properties from context + usage.
|
|
157
|
+
analytics._userProperties = analytics._buildUserProperties();
|
|
158
|
+
|
|
159
|
+
logger.log(`analytics initialized — measurement=${analytics._measurementId} client_id=${analytics._clientId.slice(0, 8)}…`);
|
|
160
|
+
|
|
161
|
+
// Flush any queued events.
|
|
162
|
+
if (analytics._queue.length > 0) {
|
|
163
|
+
logger.log(`analytics: flushing ${analytics._queue.length} queued event(s).`);
|
|
164
|
+
const queued = analytics._queue.slice();
|
|
165
|
+
analytics._queue = [];
|
|
166
|
+
for (const item of queued) analytics.event(item.name, item.params);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Auto-emit app_launch from the main process — the one launch event for the
|
|
170
|
+
// whole app. A renderer emits nothing of its own on init: it forwards the
|
|
171
|
+
// events its own code fires through the IPC bridge below, and this sender
|
|
172
|
+
// is what delivers them ([#411](https://github.com/Omega-JS-Stack/omega/issues/411)).
|
|
173
|
+
if (analytics._isMain()) {
|
|
174
|
+
analytics.event('app_launch');
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// IPC: renderer → main analytics calls. Forward fires-and-forgets via send;
|
|
178
|
+
// status query via invoke.
|
|
179
|
+
manager.ipc.unhandle('desktop:analytics:status');
|
|
180
|
+
manager.ipc.handle('desktop:analytics:status', () => analytics.toJSON());
|
|
181
|
+
// Use Set-deduped listener; named handler so re-init collapses duplicates.
|
|
182
|
+
manager.ipc.on('desktop:analytics:event', analytics._onIpcEvent);
|
|
183
|
+
manager.ipc.on('desktop:analytics:set-user-properties', analytics._onIpcSetProps);
|
|
184
|
+
},
|
|
185
|
+
|
|
186
|
+
_onIpcEvent({ name, params } = {}) {
|
|
187
|
+
if (!name) return;
|
|
188
|
+
analytics.event(name, params);
|
|
189
|
+
},
|
|
190
|
+
|
|
191
|
+
_onIpcSetProps(props) {
|
|
192
|
+
analytics.setUserProperties(props);
|
|
193
|
+
},
|
|
194
|
+
|
|
195
|
+
// ─── Public API ─────────────────────────────────────────────────────────────
|
|
196
|
+
|
|
197
|
+
// Fire a CANONICAL event (a catalog name). Queues if not initialized yet.
|
|
198
|
+
event(name, params) {
|
|
199
|
+
if (!analytics._enabled || !analytics._measurementId) {
|
|
200
|
+
// Queue while we're still booting (init may flip _enabled later).
|
|
201
|
+
if (!analytics._initialized) {
|
|
202
|
+
if (analytics._queue.length < MAX_QUEUE) {
|
|
203
|
+
analytics._queue.push({ name, params });
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// The catalog resolves the name and the payload; the transport below is
|
|
210
|
+
// handed the result. Nothing about a provider's dialect lives here.
|
|
211
|
+
analytics_.event(name, analytics._enrichParams(params || {}));
|
|
212
|
+
},
|
|
213
|
+
|
|
214
|
+
// The Measurement Protocol transport: one resolved descriptor → one POST.
|
|
215
|
+
_send(descriptor) {
|
|
216
|
+
if (descriptor.provider !== 'ga4') {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const payload = core.buildPayload({
|
|
221
|
+
clientId: analytics._clientId,
|
|
222
|
+
userId: analytics._userId,
|
|
223
|
+
userProperties: analytics._userProperties,
|
|
224
|
+
eventName: descriptor.name,
|
|
225
|
+
params: descriptor.payload,
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
const url = core.buildCollectUrl(analytics._measurementId, analytics._apiSecret);
|
|
229
|
+
|
|
230
|
+
fetch(url, {
|
|
231
|
+
method: 'post',
|
|
232
|
+
response: 'text',
|
|
233
|
+
tries: 2,
|
|
234
|
+
timeout: FETCH_TIMEOUT_MS,
|
|
235
|
+
body: payload,
|
|
236
|
+
}).catch((e) => {
|
|
237
|
+
logger.warn(`event "${descriptor.name}" failed: ${e.message}`);
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
return true;
|
|
241
|
+
},
|
|
242
|
+
|
|
243
|
+
pageview(path) {
|
|
244
|
+
analytics.event('page_view', path ? { page_path: path } : {});
|
|
245
|
+
},
|
|
246
|
+
|
|
247
|
+
screenview(name) {
|
|
248
|
+
analytics.event('screen_view', name ? { screen_name: name } : {});
|
|
249
|
+
},
|
|
250
|
+
|
|
251
|
+
// Manual user-id override. Normally client-bridge wires this automatically.
|
|
252
|
+
setUserId(uid) {
|
|
253
|
+
if (!analytics._namespace) {
|
|
254
|
+
// Init hasn't run yet — store and apply at init.
|
|
255
|
+
analytics._pendingUid = uid || null;
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
analytics._userId = core.deriveUserId(uid, analytics._namespace);
|
|
259
|
+
},
|
|
260
|
+
|
|
261
|
+
// Merge into the user_properties block sent on every subsequent event.
|
|
262
|
+
setUserProperties(props) {
|
|
263
|
+
if (!props || typeof props !== 'object') return;
|
|
264
|
+
analytics._userProperties = { ...analytics._userProperties, ...core.wrapUserProperties(props) };
|
|
265
|
+
},
|
|
266
|
+
|
|
267
|
+
// ─── Internals ──────────────────────────────────────────────────────────────
|
|
268
|
+
|
|
269
|
+
_isMain() {
|
|
270
|
+
return process.type === 'browser' || process.type === undefined; // undefined in tests
|
|
271
|
+
},
|
|
272
|
+
|
|
273
|
+
// GA4 param contract: each event needs engagement_time_msec (else session bounces),
|
|
274
|
+
// and we add session_id + page_location so reports group properly.
|
|
275
|
+
_enrichParams(params) {
|
|
276
|
+
const m = analytics._manager;
|
|
277
|
+
const ctx = m.context;
|
|
278
|
+
const sessionStart = ctx.session.startTime ? new Date(ctx.session.startTime).getTime() : Date.now();
|
|
279
|
+
const engagement = Math.max(1, Date.now() - sessionStart);
|
|
280
|
+
return {
|
|
281
|
+
session_id: ctx.session.id || 'unknown',
|
|
282
|
+
engagement_time_msec: engagement,
|
|
283
|
+
page_location: params.page_location || `app://${m.config.brand.id}`,
|
|
284
|
+
page_title: params.page_title || m.config.app?.productName || m.config.brand.name,
|
|
285
|
+
...params,
|
|
286
|
+
};
|
|
287
|
+
},
|
|
288
|
+
|
|
289
|
+
// Compute user-properties from current context + usage. Re-run on auth change.
|
|
290
|
+
_buildUserProperties() {
|
|
291
|
+
const m = analytics._manager;
|
|
292
|
+
const ctx = m.context;
|
|
293
|
+
const usage = m.usage;
|
|
294
|
+
const wrap = (v) => ({ value: v });
|
|
295
|
+
const out = {
|
|
296
|
+
app_version: wrap(ctx.app.version || 'unknown'),
|
|
297
|
+
operating_system: wrap(ctx.client.platform || 'unknown'),
|
|
298
|
+
device_category: wrap(ctx.client.mobile ? 'mobile' : 'desktop'),
|
|
299
|
+
country: wrap(ctx.geolocation.country || 'None'),
|
|
300
|
+
language: wrap(ctx.client.locale || 'None'),
|
|
301
|
+
authenticated: wrap(!!analytics._userId),
|
|
302
|
+
};
|
|
303
|
+
out.app_opens = wrap(usage.opens());
|
|
304
|
+
out.app_hours_total = wrap(Math.round((usage.hoursTotal() || 0) * 100) / 100);
|
|
305
|
+
return out;
|
|
306
|
+
},
|
|
307
|
+
|
|
308
|
+
// Auth bridge wiring — fires login/logout events on transition.
|
|
309
|
+
_handleAuthChange(snap) {
|
|
310
|
+
const newUid = snap?.uid || null;
|
|
311
|
+
const prevUid = analytics._userId
|
|
312
|
+
? 'set' // we don't reverse the uuidv5; just need to know whether one was set
|
|
313
|
+
: null;
|
|
314
|
+
|
|
315
|
+
if (newUid) {
|
|
316
|
+
const previousAuthed = analytics._userId !== null;
|
|
317
|
+
analytics.setUserId(newUid);
|
|
318
|
+
analytics._userProperties = analytics._buildUserProperties();
|
|
319
|
+
if (!previousAuthed) {
|
|
320
|
+
analytics.event('login', { method: snap?.providerId || 'unknown' });
|
|
321
|
+
}
|
|
322
|
+
} else if (prevUid) {
|
|
323
|
+
analytics.event('logout');
|
|
324
|
+
analytics._userId = null;
|
|
325
|
+
analytics._userProperties = analytics._buildUserProperties();
|
|
326
|
+
}
|
|
327
|
+
},
|
|
328
|
+
|
|
329
|
+
// Plain-JSON snapshot for IPC inspection.
|
|
330
|
+
toJSON() {
|
|
331
|
+
return {
|
|
332
|
+
enabled: analytics._enabled,
|
|
333
|
+
measurementId: analytics._measurementId,
|
|
334
|
+
clientId: analytics._clientId,
|
|
335
|
+
userId: analytics._userId,
|
|
336
|
+
queueLength: analytics._queue.length,
|
|
337
|
+
};
|
|
338
|
+
},
|
|
339
|
+
|
|
340
|
+
// Test teardown.
|
|
341
|
+
shutdown() {
|
|
342
|
+
if (typeof analytics._authUnsub === 'function') {
|
|
343
|
+
analytics._authUnsub();
|
|
344
|
+
}
|
|
345
|
+
analytics._initialized = false;
|
|
346
|
+
analytics._manager = null;
|
|
347
|
+
analytics._enabled = false;
|
|
348
|
+
analytics._measurementId = null;
|
|
349
|
+
analytics._apiSecret = null;
|
|
350
|
+
analytics._namespace = null;
|
|
351
|
+
analytics._clientId = null;
|
|
352
|
+
analytics._userId = null;
|
|
353
|
+
analytics._userProperties = {};
|
|
354
|
+
analytics._queue = [];
|
|
355
|
+
analytics._authUnsub = null;
|
|
356
|
+
analytics._pendingUid = null;
|
|
357
|
+
},
|
|
358
|
+
};
|
|
359
|
+
|
|
360
|
+
module.exports = analytics;
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
// App state — first-launch / launch-count / crash-sentinel / startup-context flags.
|
|
2
|
+
//
|
|
3
|
+
// Storage shape (under storage key `appState`):
|
|
4
|
+
// {
|
|
5
|
+
// installedAt: 1700000000000, // first time the app booted (ms epoch)
|
|
6
|
+
// launchCount: 42,
|
|
7
|
+
// lastLaunchAt: 1700000000000, // previous launch timestamp (set BEFORE this launch increments)
|
|
8
|
+
// lastQuitAt: 1700000000000, // last graceful quit; null/missing if previous launch crashed
|
|
9
|
+
// version: '1.2.3', // version of THIS launch
|
|
10
|
+
// previousVersion: '1.2.2', // version before this launch, if it changed
|
|
11
|
+
// sentinel: true, // set on launch, cleared on graceful quit; survival = crash
|
|
12
|
+
// }
|
|
13
|
+
//
|
|
14
|
+
// Public API on `manager.appState`:
|
|
15
|
+
// isFirstLaunch() — true only for the very first boot of the app on this machine
|
|
16
|
+
// getLaunchCount() — total successful launches (including this one)
|
|
17
|
+
// getInstalledAt() — Date of first launch
|
|
18
|
+
// getLastLaunchAt() — Date of the previous launch, or null
|
|
19
|
+
// getLastQuitAt() — Date of the last graceful quit, or null if it crashed
|
|
20
|
+
// recoveredFromCrash() — true if the previous launch did not exit cleanly
|
|
21
|
+
// getVersion() — package.json version of this launch
|
|
22
|
+
// getPreviousVersion() — version before this launch (if it changed), else null
|
|
23
|
+
// wasUpgraded() — true if version differs from previousVersion
|
|
24
|
+
// launchedAtLogin() — true if OS launched the app via openAtLogin (mac/win)
|
|
25
|
+
// launchedFromDeepLink() — set later by lib/deep-link if argv had a deep-link payload
|
|
26
|
+
//
|
|
27
|
+
// Side effects on initialize():
|
|
28
|
+
// - increments launchCount
|
|
29
|
+
// - migrates lastLaunchAt → previous launch timestamp
|
|
30
|
+
// - records previousVersion if version changed
|
|
31
|
+
// - writes the crash sentinel
|
|
32
|
+
// - registers app-quit listeners that clear the sentinel + write lastQuitAt
|
|
33
|
+
|
|
34
|
+
const LoggerLite = require('./logger-lite.js');
|
|
35
|
+
|
|
36
|
+
const logger = new LoggerLite('app-state');
|
|
37
|
+
|
|
38
|
+
const STORAGE_KEY = 'appState';
|
|
39
|
+
|
|
40
|
+
const appState = {
|
|
41
|
+
_initialized: false,
|
|
42
|
+
_quitWired: false,
|
|
43
|
+
_manager: null,
|
|
44
|
+
_electron: null,
|
|
45
|
+
|
|
46
|
+
// Cached snapshot of the state AS LOADED at the start of this launch.
|
|
47
|
+
// (Mutators write through to storage; readers can use either source.)
|
|
48
|
+
_snapshot: null,
|
|
49
|
+
|
|
50
|
+
// Specifically: the previous-run sentinel value, captured BEFORE we overwrite it.
|
|
51
|
+
// True = previous launch never wrote `lastQuitAt` → it crashed.
|
|
52
|
+
_recoveredFromCrash: false,
|
|
53
|
+
|
|
54
|
+
// Set by lib/deep-link.initialize when argv contains a deep-link payload.
|
|
55
|
+
_launchedFromDeepLink: false,
|
|
56
|
+
|
|
57
|
+
async initialize(manager) {
|
|
58
|
+
if (appState._initialized) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
appState._manager = manager;
|
|
63
|
+
appState._electron = require('electron');
|
|
64
|
+
|
|
65
|
+
const storage = manager.storage;
|
|
66
|
+
|
|
67
|
+
const now = Date.now();
|
|
68
|
+
const previous = storage.get(STORAGE_KEY) || {};
|
|
69
|
+
const isFirstLaunch = !previous.installedAt;
|
|
70
|
+
|
|
71
|
+
// Crash detection: previous launch wrote sentinel=true but never cleared it via lastQuitAt.
|
|
72
|
+
// First launch has no previous sentinel, so it can't be "recovered from crash."
|
|
73
|
+
const previousSentinel = !!previous.sentinel;
|
|
74
|
+
const previousQuitAt = previous.lastQuitAt || null;
|
|
75
|
+
appState._recoveredFromCrash = !isFirstLaunch && previousSentinel && !previousQuitAt;
|
|
76
|
+
|
|
77
|
+
// Version detection. Prefer the cross-context manager.getVersion() helper —
|
|
78
|
+
// it tries `app.getVersion()` first (authoritative in main, reads asar
|
|
79
|
+
// package.json in packaged builds) and falls back to project package.json.
|
|
80
|
+
const currentVersion = manager.config.app?.version
|
|
81
|
+
|| manager.getVersion()
|
|
82
|
+
|| tryGetVersionFromPackage()
|
|
83
|
+
|| null;
|
|
84
|
+
const previousVersion = previous.version || null;
|
|
85
|
+
const versionChanged = currentVersion && previousVersion && currentVersion !== previousVersion;
|
|
86
|
+
|
|
87
|
+
// Build the next snapshot.
|
|
88
|
+
const next = {
|
|
89
|
+
installedAt: previous.installedAt || now,
|
|
90
|
+
launchCount: (previous.launchCount || 0) + 1,
|
|
91
|
+
lastLaunchAt: now,
|
|
92
|
+
lastQuitAt: null, // cleared; will be set on quit
|
|
93
|
+
version: currentVersion,
|
|
94
|
+
previousVersion: versionChanged ? previousVersion : (previous.previousVersion || null),
|
|
95
|
+
sentinel: true, // crash-sentinel for THIS launch
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
storage.set(STORAGE_KEY, next);
|
|
99
|
+
appState._snapshot = {
|
|
100
|
+
...next,
|
|
101
|
+
_previousLaunchAt: previous.lastLaunchAt || null, // exposed via getLastLaunchAt()
|
|
102
|
+
_isFirstLaunch: isFirstLaunch,
|
|
103
|
+
_wasUpgraded: Boolean(versionChanged), // true only if THIS launch differs from prior
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
// Wire graceful-quit cleanup. We listen to both `before-quit` and `will-quit`
|
|
107
|
+
// so a quick `app.quit()` from the main process is captured even if the
|
|
108
|
+
// window-close path didn't fire. Either firing clears the sentinel.
|
|
109
|
+
appState._wireGracefulQuit();
|
|
110
|
+
|
|
111
|
+
logger.log(`initialize — firstLaunch=${isFirstLaunch} count=${next.launchCount} version=${currentVersion || '(unknown)'} recoveredFromCrash=${appState._recoveredFromCrash}`);
|
|
112
|
+
|
|
113
|
+
appState._initialized = true;
|
|
114
|
+
},
|
|
115
|
+
|
|
116
|
+
_wireGracefulQuit() {
|
|
117
|
+
if (appState._quitWired) return;
|
|
118
|
+
appState._quitWired = true;
|
|
119
|
+
const { app } = appState._electron;
|
|
120
|
+
|
|
121
|
+
let cleared = false;
|
|
122
|
+
const onQuit = () => {
|
|
123
|
+
if (cleared) return;
|
|
124
|
+
cleared = true;
|
|
125
|
+
const storage = appState._manager.storage;
|
|
126
|
+
const cur = storage.get(STORAGE_KEY) || {};
|
|
127
|
+
cur.sentinel = false;
|
|
128
|
+
cur.lastQuitAt = Date.now();
|
|
129
|
+
storage.set(STORAGE_KEY, cur);
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
app.on('before-quit', onQuit);
|
|
133
|
+
app.on('will-quit', onQuit);
|
|
134
|
+
},
|
|
135
|
+
|
|
136
|
+
// Public API ─────────────────────────────────────────────────────────────────
|
|
137
|
+
|
|
138
|
+
isFirstLaunch() {
|
|
139
|
+
return Boolean(appState._snapshot?._isFirstLaunch);
|
|
140
|
+
},
|
|
141
|
+
|
|
142
|
+
getLaunchCount() {
|
|
143
|
+
return appState._snapshot?.launchCount || 0;
|
|
144
|
+
},
|
|
145
|
+
|
|
146
|
+
getInstalledAt() {
|
|
147
|
+
const ms = appState._snapshot?.installedAt;
|
|
148
|
+
return ms ? new Date(ms) : null;
|
|
149
|
+
},
|
|
150
|
+
|
|
151
|
+
getLastLaunchAt() {
|
|
152
|
+
const ms = appState._snapshot?._previousLaunchAt;
|
|
153
|
+
return ms ? new Date(ms) : null;
|
|
154
|
+
},
|
|
155
|
+
|
|
156
|
+
getLastQuitAt() {
|
|
157
|
+
// The CURRENT snapshot's lastQuitAt is null (we cleared it on init).
|
|
158
|
+
// What the consumer wants is "when did we previously quit gracefully" — read storage live,
|
|
159
|
+
// because at the moment of the call this launch hasn't quit yet.
|
|
160
|
+
const cur = appState._manager.storage.get(STORAGE_KEY) || {};
|
|
161
|
+
const ms = cur.lastQuitAt;
|
|
162
|
+
return ms ? new Date(ms) : null;
|
|
163
|
+
},
|
|
164
|
+
|
|
165
|
+
recoveredFromCrash() {
|
|
166
|
+
return Boolean(appState._recoveredFromCrash);
|
|
167
|
+
},
|
|
168
|
+
|
|
169
|
+
getVersion() {
|
|
170
|
+
return appState._snapshot?.version || null;
|
|
171
|
+
},
|
|
172
|
+
|
|
173
|
+
getPreviousVersion() {
|
|
174
|
+
return appState._snapshot?.previousVersion || null;
|
|
175
|
+
},
|
|
176
|
+
|
|
177
|
+
wasUpgraded() {
|
|
178
|
+
return Boolean(appState._snapshot?._wasUpgraded);
|
|
179
|
+
},
|
|
180
|
+
|
|
181
|
+
launchedAtLogin() {
|
|
182
|
+
// `getLoginItemSettings` exists on macOS + Windows; on Linux it just returns
|
|
183
|
+
// a stub object with openAtLogin=false. So the field check below is safe
|
|
184
|
+
// everywhere — no platform branch needed.
|
|
185
|
+
const s = appState._electron.app.getLoginItemSettings();
|
|
186
|
+
// Electron exposes `wasOpenedAtLogin` on macOS (via NSWorkspace) and
|
|
187
|
+
// `openAtLogin` plus a `launchItems` array on Windows. The shorthand:
|
|
188
|
+
// if the OS booted us via the login-item path, the field is true.
|
|
189
|
+
return Boolean(s.wasOpenedAtLogin);
|
|
190
|
+
},
|
|
191
|
+
|
|
192
|
+
launchedFromDeepLink() {
|
|
193
|
+
return appState._launchedFromDeepLink;
|
|
194
|
+
},
|
|
195
|
+
|
|
196
|
+
// Hook for lib/deep-link to call when it parses a cold-start deep link from argv.
|
|
197
|
+
setLaunchedFromDeepLink(value) {
|
|
198
|
+
appState._launchedFromDeepLink = Boolean(value);
|
|
199
|
+
},
|
|
200
|
+
|
|
201
|
+
// Test helper — wipe persisted state and reset the in-memory snapshot.
|
|
202
|
+
// (Public, intentionally — used by integration tests + by consumers who want a "reset to factory" command.)
|
|
203
|
+
reset() {
|
|
204
|
+
appState._manager.storage.delete(STORAGE_KEY);
|
|
205
|
+
appState._snapshot = null;
|
|
206
|
+
appState._recoveredFromCrash = false;
|
|
207
|
+
appState._launchedFromDeepLink = false;
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
function tryGetVersionFromPackage() {
|
|
212
|
+
// Last-resort fallback used only when manager.getVersion() is unavailable.
|
|
213
|
+
// Reads via build.js's getPackage helper which already handles "no package.json
|
|
214
|
+
// at projectRoot" by returning null — no try/catch needed.
|
|
215
|
+
const Manager = require('../build.js');
|
|
216
|
+
const pkg = Manager.getPackage('project');
|
|
217
|
+
return pkg?.version || null;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
module.exports = appState;
|