@omega.js/desktop 0.51.0 → 0.53.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/README.md +18 -13
- package/dist/assets/css/core/_initialize.scss +1 -1
- package/dist/assets/js/core/app-shell.js +14 -15
- package/dist/assets/themes/_template/_theme.js +6 -6
- package/dist/assets/themes/base/_includes/global/sections/account.html +4 -4
- package/dist/assets/themes/base/_includes/global/sections/app-sidebar.html +5 -5
- package/dist/assets/themes/base/_layouts/frontend/pages/account/index.html +3 -3
- package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/index.html +1 -1
- package/dist/assets/themes/base/_layouts/frontend/pages/blog/tags/tag.html +1 -1
- package/dist/assets/themes/base/_layouts/frontend/pages/payment/confirmation.html +1 -1
- package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.js +2 -3
- package/dist/assets/themes/base/_sections/verts/unit/section.html +1 -1
- package/dist/assets/themes/base/_sections/verts/unit/section.js +3 -4
- package/dist/assets/themes/base/_theme.js +4 -3
- package/dist/assets/themes/bootstrap/_theme.js +2 -2
- package/dist/assets/themes/bootstrap/overrides/_links.scss +1 -1
- package/dist/assets/themes/classy/_theme.js +8 -6
- package/dist/assets/themes/classy/css/marketing/_sections.scss +1 -2
- package/dist/assets/themes/classy/js/hero-demo-form.js +3 -2
- package/dist/assets/themes/neobrutalism/_theme.js +5 -5
- package/dist/assets/themes/neobrutalism/js/pages/test/libraries/layers/index.js +1 -1
- package/dist/assets/themes/newsflash/_theme.js +6 -6
- package/dist/assets/themes/newsflash/js/pages/test/libraries/layers/index.js +1 -1
- package/dist/build.js +87 -111
- package/dist/cli.js +1 -1
- package/dist/commands/build.js +2 -2
- package/dist/commands/cdp/capture.js +2 -2
- package/dist/commands/cdp/quit.js +2 -2
- package/dist/commands/cdp/relaunch.js +2 -2
- package/dist/commands/cdp/theme.js +1 -1
- package/dist/commands/clean.js +2 -2
- package/dist/commands/deploy.js +4 -4
- package/dist/commands/finalize-release.js +4 -4
- package/dist/commands/install.js +3 -3
- package/dist/commands/launch.js +2 -2
- package/dist/commands/lib/deploy-precheck.js +3 -3
- package/dist/commands/lib/ensure-target.js +6 -6
- package/dist/commands/package.js +2 -2
- package/dist/commands/publish.js +2 -2
- package/dist/commands/release.js +3 -3
- package/dist/commands/runner.js +145 -48
- package/dist/commands/sign-windows.js +5 -5
- package/dist/commands/test.js +4 -4
- package/dist/commands/update.js +2 -2
- package/dist/commands/validate-certs.js +4 -4
- package/dist/commands/version.js +3 -3
- package/dist/defaults/.github/workflows/build.yml +2 -0
- package/dist/defaults/AGENTS.md +17 -8
- package/dist/defaults/config/omega.json5 +7 -7
- package/dist/defaults/hooks/build/post.js +1 -1
- package/dist/defaults/hooks/build/pre.js +1 -1
- package/dist/defaults/hooks/deploy/pre.js +1 -1
- package/dist/defaults/hooks/release/post.js +1 -1
- package/dist/defaults/hooks/release/pre.js +1 -1
- package/dist/defaults/src/assets/js/components/about/index.js +3 -5
- package/dist/defaults/src/assets/js/components/main/index.js +3 -5
- package/dist/defaults/src/assets/js/components/settings/index.js +3 -5
- package/dist/defaults/src/integrations/context-menu/index.js +2 -2
- package/dist/defaults/src/integrations/menu/index.js +3 -3
- package/dist/defaults/src/integrations/tray/index.js +3 -3
- package/dist/defaults/src/main.js +3 -5
- package/dist/defaults/src/preload.js +3 -5
- package/dist/defaults/test/README.md +2 -2
- package/dist/gulp/main.js +9 -10
- package/dist/gulp/tasks/audit.js +7 -7
- package/dist/gulp/tasks/build-config.js +8 -8
- package/dist/gulp/tasks/bundle.js +16 -16
- package/dist/gulp/tasks/defaults.js +3 -3
- package/dist/gulp/tasks/distribute.js +2 -2
- package/dist/gulp/tasks/html.js +9 -9
- package/dist/gulp/tasks/package-quick.js +3 -3
- package/dist/gulp/tasks/package.js +3 -3
- package/dist/gulp/tasks/release.js +3 -3
- package/dist/gulp/tasks/sass.js +6 -6
- package/dist/gulp/tasks/serve.js +4 -4
- package/dist/hooks/notarize-artifacts.js +1 -1
- package/dist/hooks/notarize.js +1 -1
- package/dist/index.js +5 -8
- package/dist/lib/_environment-mixin.js +50 -0
- package/dist/lib/_lifecycle-mixin.js +45 -0
- package/dist/lib/analytics.js +33 -35
- package/dist/lib/app-state.js +14 -14
- package/dist/lib/auth-flow.js +18 -18
- package/dist/lib/auth-persistence.js +12 -12
- package/dist/lib/auth.js +421 -0
- package/dist/lib/auto-updater.js +49 -49
- package/dist/lib/context-menu.js +13 -13
- package/dist/lib/context.js +19 -19
- package/dist/lib/deep-link.js +34 -34
- package/dist/lib/fontawesome.js +5 -5
- package/dist/lib/ipc.js +4 -4
- package/dist/lib/menu.js +25 -25
- package/dist/lib/protocol.js +5 -5
- package/dist/lib/remote-config.js +22 -22
- package/dist/lib/remote-scripts.js +21 -21
- package/dist/lib/restart-manager/index.js +28 -28
- package/dist/lib/sign-helpers/exec-with-limit.js +1 -1
- package/dist/lib/sign-helpers/sign-events.js +1 -1
- package/dist/lib/startup.js +18 -13
- package/dist/lib/storage.js +10 -10
- package/dist/lib/templating.js +16 -16
- package/dist/lib/theme.js +10 -10
- package/dist/lib/tray.js +27 -27
- package/dist/lib/usage.js +11 -11
- package/dist/lib/window-manager.js +26 -26
- package/dist/main.js +398 -483
- package/dist/preload.js +236 -176
- package/dist/renderer.js +417 -391
- package/dist/runner/job-started.js +1 -1
- package/dist/test/fixtures/consumer-app/config/omega.json5 +1 -1
- package/dist/test/fixtures/consumer-app/src/assets/js/components/main/index.js +8 -11
- package/dist/test/fixtures/consumer-app/src/main.js +5 -7
- package/dist/test/fixtures/consumer-app/src/preload.js +2 -2
- package/dist/test/harness/boot-entry.js +22 -20
- package/dist/test/harness/main-entry.js +31 -30
- package/dist/test/harness/renderer-entry.js +5 -5
- package/dist/test/harness/renderer-preload.js +137 -141
- package/dist/test/index.js +10 -10
- package/dist/test/runner.js +2 -2
- package/dist/test/runners/boot.js +7 -6
- package/dist/test/runners/electron.js +3 -2
- package/dist/test/runners/render-event.js +2 -2
- package/dist/test/suites/boot/consumer-app-boots.test.js +57 -26
- package/dist/test/suites/boot/restart-manager.test.js +2 -2
- package/dist/test/suites/boot/storage-bundled.test.js +5 -5
- package/dist/test/suites/boot/theme.test.js +13 -13
- package/dist/test/suites/build/audit.test.js +1 -1
- package/dist/test/suites/build/auth-persistence-resolve.test.js +6 -6
- package/dist/test/suites/build/boot-fixture.test.js +2 -2
- package/dist/test/suites/build/boot-runner-timeout.test.js +6 -5
- package/dist/test/suites/build/brand-scss.test.js +1 -1
- package/dist/test/suites/build/build-json-bake.test.js +1 -1
- package/dist/test/suites/build/cli.test.js +2 -2
- package/dist/test/suites/build/config-schema.test.js +5 -5
- package/dist/test/suites/build/defaults-scaffold.test.js +2 -2
- package/dist/test/suites/build/deploy-hook.test.js +3 -3
- package/dist/test/suites/build/ensure-target.test.js +2 -2
- package/dist/test/suites/build/env-delivery.test.js +2 -2
- package/dist/test/suites/build/esm-only-dependency.test.js +2 -2
- package/dist/test/suites/build/exports.test.js +9 -8
- package/dist/test/suites/build/get-config.test.js +4 -4
- package/dist/test/suites/build/manifest-deps.test.js +1 -1
- package/dist/test/suites/build/merge-line-files.test.js +1 -1
- package/dist/test/suites/build/omega-shell.test.js +34 -2
- package/dist/test/suites/build/omega.test.js +350 -0
- package/dist/test/suites/build/renderer-auth-bridge.test.js +211 -78
- package/dist/test/suites/build/runner.test.js +612 -5
- package/dist/test/suites/build/sentry.test.js +2 -2
- package/dist/test/suites/build/sign-windows-e2e.test.js +2 -2
- package/dist/test/suites/build/templating.test.js +3 -3
- package/dist/test/suites/build/test-stealth.test.js +7 -9
- package/dist/test/suites/build/url-helpers.test.js +55 -56
- package/dist/test/suites/build/validate-config.test.js +2 -2
- package/dist/test/suites/build/wave5-pins.test.js +2 -2
- package/dist/test/suites/main/analytics.test.js +59 -59
- package/dist/test/suites/main/app-state.test.js +66 -66
- package/dist/test/suites/main/auth-flow.test.js +41 -41
- package/dist/test/suites/main/auth-persistence.test.js +54 -43
- package/dist/test/suites/main/{client-bridge.integration.test.js → auth.integration.test.js} +10 -9
- package/dist/test/suites/main/auth.test.js +336 -0
- package/dist/test/suites/main/auto-updater.test.js +134 -134
- package/dist/test/suites/main/boot-sequence.test.js +37 -49
- package/dist/test/suites/main/context-menu.test.js +51 -50
- package/dist/test/suites/main/context.test.js +25 -25
- package/dist/test/suites/main/deep-link.test.js +74 -74
- package/dist/test/suites/main/fontawesome.test.js +27 -27
- package/dist/test/suites/main/ipc.test.js +35 -35
- package/dist/test/suites/main/menu.test.js +101 -100
- package/dist/test/suites/main/protocol.test.js +19 -19
- package/dist/test/suites/main/remote-config.test.js +63 -63
- package/dist/test/suites/main/remote-scripts.test.js +103 -103
- package/dist/test/suites/main/request.test.js +71 -0
- package/dist/test/suites/main/restart-manager.test.js +33 -33
- package/dist/test/suites/main/startup-paths-and-ua.test.js +4 -4
- package/dist/test/suites/main/startup.test.js +26 -26
- package/dist/test/suites/main/stealth-window.test.js +1 -1
- package/dist/test/suites/main/storage.test.js +25 -25
- package/dist/test/suites/main/theme.test.js +34 -34
- package/dist/test/suites/main/tray.test.js +79 -79
- package/dist/test/suites/main/url-helpers.test.js +133 -133
- package/dist/test/suites/main/usage.test.js +25 -25
- package/dist/test/suites/main/window-bounds.test.js +27 -27
- package/dist/test/suites/main/window-manager.test.js +44 -44
- package/dist/test/suites/renderer/analytics-bridge.test.js +5 -5
- package/dist/test/suites/renderer/cross-context-helpers.test.js +37 -31
- package/dist/test/suites/renderer/round-trip.test.js +3 -3
- package/dist/test/suites/renderer/tooltips.test.js +15 -15
- package/dist/test/suites/renderer/{window-em-surface.test.js → window-desktop-surface.test.js} +27 -7
- package/dist/test/utils/extended-mode-warning.js +1 -1
- package/dist/utils/boot-harness.js +56 -0
- package/dist/utils/mode-helpers.js +2 -15
- package/dist/utils/ship-keys.js +3 -3
- package/dist/utils/signing-status.js +51 -0
- package/dist/utils/test-events.js +7 -0
- package/dist/utils/test-stealth.js +6 -6
- package/dist/utils/url-helpers.js +52 -42
- package/dist/utils/user-agent.js +44 -0
- package/dist/vendor/account/engine.js +3 -3
- package/dist/vendor/account/index.js +14 -45
- package/dist/vendor/account/resolve-account.js +44 -0
- package/dist/vendor/account/schema.js +1 -1
- package/dist/vendor/account/user.js +99 -0
- package/dist/vendor/config/client-config.js +1 -1
- package/dist/vendor/config/environment.js +11 -30
- package/dist/vendor/config/index.js +13 -12
- package/dist/vendor/config/load.js +1 -2
- package/dist/vendor/config/platforms.js +1 -1
- package/dist/vendor/config/repo.js +24 -0
- package/dist/vendor/config/retired-keys.js +2 -2
- package/dist/vendor/config/schema.js +5 -8
- package/dist/vendor/config/site-global.js +2 -3
- package/dist/vendor/config/validate.js +1 -2
- package/dist/vendor/config/winback.js +1 -1
- package/dist/vendor/devkit/actions-secrets.js +1 -1
- package/dist/vendor/devkit/attach-log-file.js +1 -1
- package/dist/vendor/devkit/brand-version.js +162 -1
- package/dist/vendor/devkit/build-json.js +1 -1
- package/dist/vendor/devkit/cli-router.js +3 -4
- package/dist/vendor/devkit/defaults-engine.js +9 -11
- package/dist/vendor/devkit/deploy.js +64 -4
- package/dist/vendor/devkit/git-remote.js +78 -1
- package/dist/vendor/devkit/local.js +53 -3
- package/dist/vendor/devkit/lockfile.js +127 -0
- package/dist/vendor/devkit/merge-line-files.js +2 -3
- package/dist/vendor/devkit/pack-local.js +4 -7
- package/dist/vendor/devkit/preludes/origin-heal.js +35 -49
- package/dist/vendor/devkit/target-secrets.js +34 -45
- package/dist/vendor/devkit/test/runner-core.js +6 -6
- package/dist/vendor/monitoring/env.js +2 -2
- package/dist/vendor/monitoring/index.js +1 -1
- package/dist/vendor/monitoring/main.js +1 -1
- package/dist/vendor/monitoring/preload.js +1 -1
- package/dist/vendor/monitoring/renderer.js +1 -1
- package/docs/analytics.md +8 -8
- package/docs/app-state.md +19 -19
- package/docs/audit.md +4 -4
- package/docs/{client-bridge.md → auth.md} +88 -73
- package/docs/auto-updater.md +8 -8
- package/docs/boot-sequence.md +11 -6
- package/docs/build-system.md +1 -1
- package/docs/cdp-debugging.md +1 -1
- package/docs/common-mistakes.md +7 -7
- package/docs/config-schema.md +1 -1
- package/docs/context-menu.md +13 -13
- package/docs/context.md +11 -11
- package/docs/css.md +3 -9
- package/docs/deep-link.md +25 -25
- package/docs/environment-detection.md +16 -16
- package/docs/fontawesome.md +7 -5
- package/docs/hooks.md +8 -8
- package/docs/index.md +39 -28
- package/docs/ipc.md +10 -10
- package/docs/lib-modules.md +9 -9
- package/docs/logging.md +12 -14
- package/docs/menu.md +18 -18
- package/docs/releasing.md +4 -2
- package/docs/remote-config.md +9 -9
- package/docs/remote-scripts.md +12 -12
- package/docs/restart-manager.md +8 -8
- package/docs/runner.md +12 -10
- package/docs/sentry.md +4 -4
- package/docs/shared/analytics.md +1 -1
- package/docs/shared/brands.md +1 -1
- package/docs/shared/breaking-changes.md +79 -13
- package/docs/shared/config.md +24 -21
- package/docs/shared/deploys.md +30 -7
- package/docs/shared/local-dev.md +5 -3
- package/docs/shared/logging.md +1 -1
- package/docs/shared/monitoring.md +5 -5
- package/docs/shared/testing.md +2 -2
- package/docs/shared/theming.md +1 -1
- package/docs/shared/translation.md +19 -10
- package/docs/signing.md +1 -1
- package/docs/startup.md +16 -16
- package/docs/storage.md +11 -11
- package/docs/templating.md +3 -3
- package/docs/test-boot-layer.md +12 -12
- package/docs/test-framework.md +17 -17
- package/docs/themes.md +7 -7
- package/docs/tooltips.md +2 -2
- package/docs/tray.md +31 -31
- package/docs/usage.md +7 -7
- package/docs/verts.md +1 -1
- package/docs/windows.md +22 -22
- package/package.json +3 -4
- package/dist/lib/client-bridge.js +0 -374
- package/dist/lib/logger.js +0 -4
- package/dist/test/suites/build/manager.test.js +0 -213
- package/dist/test/suites/main/client-bridge.test.js +0 -262
package/dist/lib/tray.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// @omega.js/desktop looks for the consumer's `src/integrations/tray/index.js` and calls it with a builder API:
|
|
4
4
|
//
|
|
5
5
|
// // src/integrations/tray/index.js
|
|
6
|
-
// module.exports = ({
|
|
6
|
+
// module.exports = ({ omega, tray }) => {
|
|
7
7
|
// tray.icon('src/assets/icons/tray-Template.png');
|
|
8
8
|
// tray.tooltip('MyApp');
|
|
9
9
|
//
|
|
@@ -11,11 +11,11 @@
|
|
|
11
11
|
// tray.useDefaults();
|
|
12
12
|
//
|
|
13
13
|
// // ...or build from scratch:
|
|
14
|
-
// tray.item({ id: 'open', label: 'Open', click: () =>
|
|
14
|
+
// tray.item({ id: 'open', label: 'Open', click: () => omega.windows.show('main') });
|
|
15
15
|
// tray.separator();
|
|
16
16
|
// tray.item({ id: 'quit', label: 'Quit', click: () => require('electron').app.quit() });
|
|
17
17
|
//
|
|
18
|
-
// // Mutate by id (works during definition AND at runtime via `
|
|
18
|
+
// // Mutate by id (works during definition AND at runtime via `omega.tray.*`):
|
|
19
19
|
// tray.insertAfter('open', { id: 'preferences', label: 'Preferences...', click: ... });
|
|
20
20
|
// tray.update('check-for-updates', { label: 'Updates' });
|
|
21
21
|
// tray.remove('website');
|
|
@@ -28,12 +28,12 @@
|
|
|
28
28
|
// tray.useDefaults() — populate with @omega.js/desktop's default template
|
|
29
29
|
// tray.clear() — start over
|
|
30
30
|
//
|
|
31
|
-
// Id-path API (during definition AND at runtime via `
|
|
31
|
+
// Id-path API (during definition AND at runtime via `omega.tray.*`):
|
|
32
32
|
// .find / .has / .update / .remove / .enable / .show / .hide /
|
|
33
33
|
// .insertBefore / .insertAfter / .appendTo
|
|
34
34
|
//
|
|
35
35
|
// Items support dynamic labels (function) and dynamic enabled/visible/checked.
|
|
36
|
-
// Call `
|
|
36
|
+
// Call `omega.tray.refresh()` after mutating state to re-render the menu.
|
|
37
37
|
//
|
|
38
38
|
// Default template ids (flat — no `tray/` prefix; the lib namespace is implicit):
|
|
39
39
|
// title — disabled label showing the app name
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
// website — opens brand.url in external browser (only if configured)
|
|
43
43
|
// quit — quits the app
|
|
44
44
|
//
|
|
45
|
-
// Disabling at runtime: call `
|
|
45
|
+
// Disabling at runtime: call `omega.tray.disable()` from anywhere in main,
|
|
46
46
|
// idempotent, tears down any existing Tray + clears items. There is no config
|
|
47
47
|
// flag for this; default is "enabled, looks at the conventional path."
|
|
48
48
|
|
|
@@ -56,7 +56,7 @@ const logger = new LoggerLite('tray');
|
|
|
56
56
|
|
|
57
57
|
const tray = {
|
|
58
58
|
_initialized: false,
|
|
59
|
-
|
|
59
|
+
_omega: null,
|
|
60
60
|
_tray: null, // electron Tray instance
|
|
61
61
|
_items: [], // raw item descriptors
|
|
62
62
|
_icon: null, // resolved abs path
|
|
@@ -64,15 +64,15 @@ const tray = {
|
|
|
64
64
|
_electron: null,
|
|
65
65
|
_definitionFn: null, // consumer's exported fn (or null)
|
|
66
66
|
|
|
67
|
-
initialize(
|
|
67
|
+
initialize(omega) {
|
|
68
68
|
if (tray._initialized) {
|
|
69
69
|
return;
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
tray.
|
|
72
|
+
tray._omega = omega;
|
|
73
73
|
|
|
74
74
|
if (tray._disabled) {
|
|
75
|
-
logger.log('initialize — disabled via
|
|
75
|
+
logger.log('initialize — disabled via omega.tray.disable() called pre-init');
|
|
76
76
|
tray._initialized = true;
|
|
77
77
|
return;
|
|
78
78
|
}
|
|
@@ -87,7 +87,7 @@ const tray = {
|
|
|
87
87
|
|
|
88
88
|
if (fs.existsSync(absPath)) {
|
|
89
89
|
const loadConsumerFile = require('../utils/load-consumer-file.js');
|
|
90
|
-
const loaded = loadConsumerFile(absPath
|
|
90
|
+
const loaded = loadConsumerFile(absPath);
|
|
91
91
|
if (typeof loaded === 'function') {
|
|
92
92
|
tray._definitionFn = loaded;
|
|
93
93
|
} else if (loaded != null) {
|
|
@@ -103,7 +103,7 @@ const tray = {
|
|
|
103
103
|
|
|
104
104
|
if (tray._definitionFn) {
|
|
105
105
|
try {
|
|
106
|
-
tray._definitionFn({
|
|
106
|
+
tray._definitionFn({ omega, tray: builder });
|
|
107
107
|
} catch (e) {
|
|
108
108
|
logger.error('tray definition fn threw:', e);
|
|
109
109
|
}
|
|
@@ -116,14 +116,14 @@ const tray = {
|
|
|
116
116
|
// back to sensible framework defaults so a consumer file is truly optional —
|
|
117
117
|
// someone with no `src/integrations/tray/index.js` still gets a working tray.
|
|
118
118
|
if (!tray._icon) tray._icon = tray._defaultIconPath();
|
|
119
|
-
if (!tray._tooltip) tray._tooltip =
|
|
119
|
+
if (!tray._tooltip) tray._tooltip = omega.config.app?.productName || omega.config.brand.name;
|
|
120
120
|
|
|
121
121
|
// Create the Tray now that items/icon/tooltip are in place.
|
|
122
122
|
tray._render();
|
|
123
123
|
|
|
124
124
|
// Reflect current auto-updater state into the tray check-for-updates item if present.
|
|
125
|
-
if (
|
|
126
|
-
|
|
125
|
+
if (omega.autoUpdater._updateTrayItem) {
|
|
126
|
+
omega.autoUpdater._updateTrayItem();
|
|
127
127
|
}
|
|
128
128
|
|
|
129
129
|
logger.log(`initialize — items=${tray._items.length} icon=${tray._icon || '(none)'}`);
|
|
@@ -207,9 +207,9 @@ const tray = {
|
|
|
207
207
|
|
|
208
208
|
// Default template — id-tagged so consumers can target each item.
|
|
209
209
|
_defaultTemplate() {
|
|
210
|
-
const
|
|
211
|
-
const productName =
|
|
212
|
-
const brandUrl =
|
|
210
|
+
const omega = tray._omega;
|
|
211
|
+
const productName = omega.config.app?.productName || omega.config.brand.name;
|
|
212
|
+
const brandUrl = omega.config.brand.url || null;
|
|
213
213
|
|
|
214
214
|
const items = [
|
|
215
215
|
{ id: 'title', label: productName, enabled: false },
|
|
@@ -218,17 +218,17 @@ const tray = {
|
|
|
218
218
|
id: 'open',
|
|
219
219
|
label: `Open ${productName}`,
|
|
220
220
|
click: () => {
|
|
221
|
-
|
|
221
|
+
omega.windows.show('main');
|
|
222
222
|
},
|
|
223
223
|
},
|
|
224
224
|
{
|
|
225
225
|
id: 'check-for-updates',
|
|
226
226
|
label: 'Check for Updates...',
|
|
227
227
|
click: () => {
|
|
228
|
-
if (!
|
|
229
|
-
const status =
|
|
230
|
-
if (status.code === 'downloaded')
|
|
231
|
-
else
|
|
228
|
+
if (!omega || !omega.autoUpdater) return;
|
|
229
|
+
const status = omega.autoUpdater.getStatus();
|
|
230
|
+
if (status.code === 'downloaded') omega.autoUpdater.installNow();
|
|
231
|
+
else omega.autoUpdater.checkNow({ userInitiated: true });
|
|
232
232
|
},
|
|
233
233
|
},
|
|
234
234
|
];
|
|
@@ -241,7 +241,7 @@ const tray = {
|
|
|
241
241
|
const { shell } = require('electron');
|
|
242
242
|
// Route through getWebsiteUrl() so dev runs open localhost:4000 instead
|
|
243
243
|
// of punching out to the live brand site.
|
|
244
|
-
const safe = sanitizeURL(
|
|
244
|
+
const safe = sanitizeURL(omega.getWebsiteUrl());
|
|
245
245
|
if (safe) shell.openExternal(safe);
|
|
246
246
|
},
|
|
247
247
|
});
|
|
@@ -349,7 +349,7 @@ const tray = {
|
|
|
349
349
|
throw new Error('tray.define: fn must be a function');
|
|
350
350
|
}
|
|
351
351
|
tray._items = [];
|
|
352
|
-
fn({
|
|
352
|
+
fn({ omega: tray._omega, tray: tray._buildBuilder() });
|
|
353
353
|
tray._render();
|
|
354
354
|
},
|
|
355
355
|
|
|
@@ -391,7 +391,7 @@ const tray = {
|
|
|
391
391
|
// Disable the tray entirely. Idempotent. Safe to call before OR after initialize:
|
|
392
392
|
// - Pre-init: marks the lib as disabled, initialize() short-circuits.
|
|
393
393
|
// - Post-init: tears down the live Tray + clears items.
|
|
394
|
-
// No way to re-enable after disable()
|
|
394
|
+
// No way to re-enable after disable(): call omega.tray.define() if you want a fresh
|
|
395
395
|
// tray, then it'll re-render on next refresh.
|
|
396
396
|
disable() {
|
|
397
397
|
tray._disabled = true;
|
|
@@ -405,7 +405,7 @@ const tray = {
|
|
|
405
405
|
isDisabled() { return Boolean(tray._disabled); },
|
|
406
406
|
};
|
|
407
407
|
|
|
408
|
-
// Mix the id-path API onto the singleton so `
|
|
408
|
+
// Mix the id-path API onto the singleton so `omega.tray.update(...)` works at runtime.
|
|
409
409
|
Object.assign(tray, buildIdApi({
|
|
410
410
|
getItems: () => tray._items,
|
|
411
411
|
render: () => tray._render(),
|
package/dist/lib/usage.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Usage tracking — opens (= launchCount) + hours-of-use accumulation.
|
|
2
2
|
// Sister of legacy @omega.js/desktop's Usage library, but without the
|
|
3
|
-
// electron-store-cwd hack (uses our
|
|
3
|
+
// electron-store-cwd hack (uses our omega.storage instead).
|
|
4
4
|
//
|
|
5
5
|
// Persisted shape (storage.usage):
|
|
6
6
|
// {
|
|
@@ -37,17 +37,17 @@ const STORAGE_KEY = 'usage';
|
|
|
37
37
|
|
|
38
38
|
const usage = {
|
|
39
39
|
_initialized: false,
|
|
40
|
-
|
|
40
|
+
_omega: null,
|
|
41
41
|
_sessionStart: null,
|
|
42
42
|
_snapshot: null,
|
|
43
43
|
|
|
44
|
-
initialize(
|
|
44
|
+
initialize(omega) {
|
|
45
45
|
if (usage._initialized) return;
|
|
46
46
|
usage._initialized = true;
|
|
47
|
-
usage.
|
|
47
|
+
usage._omega = omega;
|
|
48
48
|
usage._sessionStart = Date.now();
|
|
49
49
|
|
|
50
|
-
const previous =
|
|
50
|
+
const previous = omega.storage.get(STORAGE_KEY) || {};
|
|
51
51
|
const now = new Date();
|
|
52
52
|
|
|
53
53
|
// Step 2: credit prior session if it ended cleanly.
|
|
@@ -69,15 +69,15 @@ const usage = {
|
|
|
69
69
|
lastQuitAt: null, // cleared; will be set on quit
|
|
70
70
|
};
|
|
71
71
|
|
|
72
|
-
|
|
72
|
+
omega.storage.set(STORAGE_KEY, next);
|
|
73
73
|
usage._snapshot = next;
|
|
74
74
|
|
|
75
75
|
// Wire the quit handler — single registration, idempotent if re-init runs.
|
|
76
76
|
usage._wireQuitHandler();
|
|
77
77
|
|
|
78
78
|
// IPC for renderer access to usage stats.
|
|
79
|
-
|
|
80
|
-
|
|
79
|
+
omega.ipc.unhandle('desktop:usage:get');
|
|
80
|
+
omega.ipc.handle('desktop:usage:get', () => usage.toJSON());
|
|
81
81
|
|
|
82
82
|
logger.log(`usage initialized — opens=${next.opens} hoursTotal=${next.hoursTotal.toFixed(2)} installedAt=${next.installedAt}`);
|
|
83
83
|
},
|
|
@@ -87,9 +87,9 @@ const usage = {
|
|
|
87
87
|
usage._quitHandlerWired = true;
|
|
88
88
|
const { app } = require('electron');
|
|
89
89
|
app.on('before-quit', () => {
|
|
90
|
-
const cur = usage.
|
|
90
|
+
const cur = usage._omega.storage.get(STORAGE_KEY) || usage._snapshot || {};
|
|
91
91
|
cur.lastQuitAt = new Date().toISOString();
|
|
92
|
-
usage.
|
|
92
|
+
usage._omega.storage.set(STORAGE_KEY, cur);
|
|
93
93
|
});
|
|
94
94
|
},
|
|
95
95
|
|
|
@@ -129,7 +129,7 @@ const usage = {
|
|
|
129
129
|
// Test teardown.
|
|
130
130
|
shutdown() {
|
|
131
131
|
usage._initialized = false;
|
|
132
|
-
usage.
|
|
132
|
+
usage._omega = null;
|
|
133
133
|
usage._sessionStart = null;
|
|
134
134
|
usage._snapshot = null;
|
|
135
135
|
// Note: we don't unwire `app.on('before-quit')` — Electron has no listener
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Window manager — named-window registry over BrowserWindow.
|
|
2
2
|
//
|
|
3
3
|
// **Lazy creation.** @omega.js/desktop does NOT auto-create any windows. Consumers call
|
|
4
|
-
// `
|
|
5
|
-
// to surface — typically right after `
|
|
4
|
+
// `omega.windows.create('main', opts?)` from their main.js when they want UI
|
|
5
|
+
// to surface — typically right after `omega.initialize()` resolves, but may
|
|
6
6
|
// be deferred (e.g. agent apps that only show UI when the user clicks the tray).
|
|
7
7
|
//
|
|
8
8
|
// Defaults baked in (no JSON config required):
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
// any other → { width: 800, height: 600, hideOnClose: false, view: name }
|
|
11
11
|
//
|
|
12
12
|
// Override at the call site:
|
|
13
|
-
//
|
|
14
|
-
//
|
|
13
|
+
// omega.windows.create('main', { width: 1280, height: 800 });
|
|
14
|
+
// omega.windows.create('settings', { width: 600, height: 480 });
|
|
15
15
|
//
|
|
16
16
|
// `view` resolves to `<projectRoot>/dist/views/<view>/index.html`.
|
|
17
17
|
//
|
|
@@ -37,13 +37,13 @@ const SAVE_DEBOUNCE_MS = 250;
|
|
|
37
37
|
|
|
38
38
|
const windowManager = {
|
|
39
39
|
_initialized: false,
|
|
40
|
-
|
|
40
|
+
_omega: null,
|
|
41
41
|
_windows: {}, // name -> BrowserWindow
|
|
42
42
|
_saveTimers: {}, // name -> debounce timer
|
|
43
43
|
_electron: null,
|
|
44
44
|
|
|
45
|
-
initialize(
|
|
46
|
-
windowManager.
|
|
45
|
+
initialize(omega) {
|
|
46
|
+
windowManager._omega = omega;
|
|
47
47
|
windowManager._initialized = true;
|
|
48
48
|
|
|
49
49
|
windowManager._electron = require('electron');
|
|
@@ -83,15 +83,15 @@ const windowManager = {
|
|
|
83
83
|
// can configure entirely from main.js without touching JSON. Falls through to
|
|
84
84
|
// createNamed which does the heavy lifting.
|
|
85
85
|
async create(name, overrides) {
|
|
86
|
-
return windowManager.createNamed(name, windowManager.
|
|
86
|
+
return windowManager.createNamed(name, windowManager._omega, overrides);
|
|
87
87
|
},
|
|
88
88
|
|
|
89
89
|
// Create or focus a named window. Args:
|
|
90
90
|
// name — registry key + default view name + storage key for bounds.
|
|
91
|
-
//
|
|
91
|
+
// omega : the omega instance (defaults to the one passed to initialize()).
|
|
92
92
|
// overrides — optional opts that take precedence over config.windows.<name>.
|
|
93
|
-
async createNamed(name,
|
|
94
|
-
|
|
93
|
+
async createNamed(name, omega, overrides) {
|
|
94
|
+
omega = omega || windowManager._omega;
|
|
95
95
|
overrides = overrides || {};
|
|
96
96
|
|
|
97
97
|
// Single-instance dedup
|
|
@@ -119,7 +119,7 @@ const windowManager = {
|
|
|
119
119
|
const defaults = isMain
|
|
120
120
|
? { width: 1024, height: 720, view: 'main', hideOnClose: true }
|
|
121
121
|
: { width: 800, height: 600, view: name, hideOnClose: false };
|
|
122
|
-
const jsonConfig =
|
|
122
|
+
const jsonConfig = omega.config.windows?.[name] || {};
|
|
123
123
|
const config = { ...defaults, ...jsonConfig, ...overrides };
|
|
124
124
|
|
|
125
125
|
logger.log(`createNamed: building "${name}" (show=${config.show !== false}, hideOnClose=${config.hideOnClose})`);
|
|
@@ -141,7 +141,7 @@ const windowManager = {
|
|
|
141
141
|
};
|
|
142
142
|
if (typeof config.x === 'number') defaultBounds.x = config.x;
|
|
143
143
|
if (typeof config.y === 'number') defaultBounds.y = config.y;
|
|
144
|
-
const savedBounds = persistBounds ? windowManager._loadBounds(name,
|
|
144
|
+
const savedBounds = persistBounds ? windowManager._loadBounds(name, omega) : null;
|
|
145
145
|
const bounds = savedBounds
|
|
146
146
|
? windowManager._clampToDisplays(savedBounds)
|
|
147
147
|
: defaultBounds;
|
|
@@ -190,7 +190,7 @@ const windowManager = {
|
|
|
190
190
|
show: false, // flicker prevention — show on ready-to-show
|
|
191
191
|
// Tray-only apps suppress all taskbar/dock representation for their windows.
|
|
192
192
|
skipTaskbar,
|
|
193
|
-
title: config.title ||
|
|
193
|
+
title: config.title || omega.config.app?.productName || name,
|
|
194
194
|
backgroundColor: config.backgroundColor || '#ffffff',
|
|
195
195
|
...titleBarOpts,
|
|
196
196
|
webPreferences: {
|
|
@@ -218,7 +218,7 @@ const windowManager = {
|
|
|
218
218
|
}
|
|
219
219
|
|
|
220
220
|
// Attach the context-menu listener so right-click works in this window.
|
|
221
|
-
|
|
221
|
+
omega.contextMenu.attach(win.webContents);
|
|
222
222
|
|
|
223
223
|
// ALL event listeners must attach BEFORE `await loadFile()` below — otherwise the
|
|
224
224
|
// window can be in the registry but missing close/resize/etc. listeners during the
|
|
@@ -265,9 +265,9 @@ const windowManager = {
|
|
|
265
265
|
// Consumers override per-window via config.windows.<name>.hideOnClose.
|
|
266
266
|
//
|
|
267
267
|
// Three escape hatches let a close-event ACTUALLY close:
|
|
268
|
-
// 1. `
|
|
268
|
+
// 1. `omega._allowQuit` — set by omega.quit({ force: true }) and by the
|
|
269
269
|
// auto-updater before installNow().
|
|
270
|
-
// 2. `
|
|
270
|
+
// 2. `omega._isQuitting` — set by app.on('before-quit'), so any quit path
|
|
271
271
|
// Electron knows about (Cmd+Q, role:'quit' menu, app.quit() programmatic,
|
|
272
272
|
// OS shutdown) flows through naturally.
|
|
273
273
|
// 3. `win._emForceClose` — per-window override for one-off "close this for
|
|
@@ -275,8 +275,8 @@ const windowManager = {
|
|
|
275
275
|
const hideOnClose = config.hideOnClose === true;
|
|
276
276
|
|
|
277
277
|
win.on('close', (event) => {
|
|
278
|
-
const allowQuit =
|
|
279
|
-
const isQuitting =
|
|
278
|
+
const allowQuit = omega._allowQuit === true;
|
|
279
|
+
const isQuitting = omega._isQuitting === true;
|
|
280
280
|
const force = win._emForceClose === true;
|
|
281
281
|
|
|
282
282
|
if (hideOnClose && !allowQuit && !isQuitting && !force) {
|
|
@@ -332,7 +332,7 @@ const windowManager = {
|
|
|
332
332
|
const win = windowManager._windows[name];
|
|
333
333
|
if (!win || win.isDestroyed()) return;
|
|
334
334
|
|
|
335
|
-
const storage = windowManager.
|
|
335
|
+
const storage = windowManager._omega.storage;
|
|
336
336
|
|
|
337
337
|
// Use getNormalBounds when maximized/fullscreen so we restore to the underlying size on next launch.
|
|
338
338
|
const isMaximized = win.isMaximized();
|
|
@@ -353,8 +353,8 @@ const windowManager = {
|
|
|
353
353
|
storage.set(`windows.${name}.bounds`, bounds);
|
|
354
354
|
},
|
|
355
355
|
|
|
356
|
-
_loadBounds(name,
|
|
357
|
-
const storage = (
|
|
356
|
+
_loadBounds(name, omega) {
|
|
357
|
+
const storage = (omega || windowManager._omega).storage;
|
|
358
358
|
|
|
359
359
|
const saved = storage.get(`windows.${name}.bounds`);
|
|
360
360
|
if (!saved || typeof saved !== 'object') return null;
|
|
@@ -431,7 +431,7 @@ const windowManager = {
|
|
|
431
431
|
// focus app-wide) is suppressed separately — main.js flips the app to the
|
|
432
432
|
// accessory activation policy under the same predicate.
|
|
433
433
|
_isStealth() {
|
|
434
|
-
return require('../utils/test-stealth.js')(windowManager.
|
|
434
|
+
return require('../utils/test-stealth.js')(windowManager._omega);
|
|
435
435
|
},
|
|
436
436
|
|
|
437
437
|
// Surface a window: normal show (+ dock) — or stealth-show in Testing mode.
|
|
@@ -470,9 +470,9 @@ const windowManager = {
|
|
|
470
470
|
// alone. No-op off macOS. Wired to every named window's 'hide' event.
|
|
471
471
|
_maybeRehideDock() {
|
|
472
472
|
if (process.platform !== 'darwin') return;
|
|
473
|
-
const
|
|
474
|
-
if (
|
|
475
|
-
if (
|
|
473
|
+
const omega = windowManager._omega;
|
|
474
|
+
if (omega.startup.getMode() !== 'hidden') return;
|
|
475
|
+
if (omega._isQuitting === true) return;
|
|
476
476
|
|
|
477
477
|
const anyVisible = Object.values(windowManager._windows)
|
|
478
478
|
.some((win) => !win.isDestroyed() && win.isVisible());
|