@omega.js/desktop 0.52.0 → 0.54.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 +53 -48
- 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-run.js +4 -1
- package/dist/cli.js +3 -3
- package/dist/commands/build.js +2 -2
- package/dist/commands/cdp/capture.js +2 -2
- package/dist/commands/cdp/client.js +1 -1
- 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/cdp.js +1 -1
- package/dist/commands/clean.js +4 -5
- package/dist/commands/deploy.js +4 -4
- package/dist/commands/dev.js +25 -0
- package/dist/commands/finalize-release.js +4 -4
- package/dist/commands/launch.js +2 -2
- package/dist/commands/lib/deploy-precheck.js +3 -3
- package/dist/commands/lib/ensure-target.js +18 -23
- package/dist/commands/lib/migrate.js +17 -0
- package/dist/commands/logs.js +1 -1
- package/dist/commands/package.js +2 -2
- package/dist/commands/publish.js +2 -2
- package/dist/commands/release.js +4 -4
- package/dist/commands/runner.js +11 -11
- package/dist/commands/sign-windows.js +5 -5
- package/dist/commands/test.js +8 -8
- package/dist/commands/update.js +7 -6
- package/dist/commands/validate-certs.js +4 -4
- package/dist/commands/version.js +3 -3
- package/dist/defaults/.github/workflows/build.yml +18 -18
- package/dist/defaults/_.gitignore +0 -2
- package/dist/defaults/_mas/README.md +3 -3
- package/dist/defaults/config/certs/README.md +1 -1
- package/dist/defaults/config/omega.json5 +43 -43
- package/dist/defaults/docs/README.md +3 -3
- package/dist/defaults/gulpfile.js +1 -1
- package/dist/defaults/hooks/build/post.js +2 -2
- package/dist/defaults/hooks/build/pre.js +2 -2
- package/dist/defaults/hooks/deploy/pre.js +1 -1
- package/dist/defaults/hooks/notarize/post.js +2 -2
- package/dist/defaults/hooks/release/post.js +2 -2
- package/dist/defaults/hooks/release/pre.js +2 -2
- 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/assets/scss/pages/about.scss +1 -1
- package/dist/defaults/src/assets/scss/pages/main.scss +1 -1
- package/dist/defaults/src/assets/scss/pages/settings.scss +1 -1
- package/dist/defaults/src/integrations/context-menu/index.js +13 -13
- package/dist/defaults/src/integrations/menu/index.js +8 -8
- package/dist/defaults/src/integrations/tray/index.js +12 -12
- package/dist/defaults/src/main.js +5 -7
- package/dist/defaults/src/preload.js +4 -6
- package/dist/defaults/test/README.md +5 -5
- package/dist/defaults/test/_init.js +1 -1
- package/dist/gulp/main.js +9 -10
- package/dist/gulp/tasks/audit.js +11 -14
- 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 +29 -29
- package/dist/lib/restart-manager/install.js +1 -1
- package/dist/lib/restart-manager/protocol.js +1 -1
- 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 +399 -483
- package/dist/preload.js +236 -176
- package/dist/renderer.js +417 -391
- 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 +21 -8
- 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/build-workflow-jobs.test.js +2 -2
- package/dist/test/suites/build/cli.test.js +30 -2
- package/dist/test/suites/build/config-schema.test.js +5 -5
- package/dist/test/suites/build/defaults-em-dash.test.js +22 -0
- package/dist/test/suites/build/defaults-scaffold.test.js +21 -7
- package/dist/test/suites/build/deploy-direct.test.js +7 -5
- package/dist/test/suites/build/deploy-dispatch.test.js +2 -1
- package/dist/test/suites/build/deploy-hook.test.js +7 -5
- package/dist/test/suites/build/dev-verb.test.js +67 -0
- package/dist/test/suites/build/ensure-target.test.js +13 -5
- 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 +7 -7
- package/dist/test/suites/build/migrate.test.js +29 -0
- 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/project-scripts-deps.test.js +6 -10
- package/dist/test/suites/build/renderer-auth-bridge.test.js +211 -78
- package/dist/test/suites/build/runner-env-write.test.js +73 -0
- package/dist/test/suites/build/runner.test.js +11 -10
- package/dist/test/suites/build/sentry.test.js +2 -2
- package/dist/test/suites/build/setup-scripts.test.js +27 -0
- 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 +15 -4
- package/dist/test/suites/build/verb-logs.test.js +20 -0
- 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} +28 -8
- package/dist/test/utils/extended-mode-warning.js +1 -1
- package/dist/utils/boot-harness.js +56 -0
- package/dist/utils/build-pipeline.js +4 -4
- package/dist/utils/mode-helpers.js +2 -15
- package/dist/utils/runner-env.js +13 -28
- 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/company.js +46 -14
- package/dist/vendor/config/defaults.js +30 -7
- package/dist/vendor/config/edit.js +25 -3
- package/dist/vendor/config/env-delivery.js +1 -1
- package/dist/vendor/config/env-schema.js +3 -6
- package/dist/vendor/config/env.js +34 -22
- package/dist/vendor/config/environment.js +11 -30
- package/dist/vendor/config/index.js +21 -28
- package/dist/vendor/config/load.js +16 -9
- package/dist/vendor/config/platforms.js +1 -1
- package/dist/vendor/config/repo.js +10 -27
- package/dist/vendor/config/schema-client.js +64 -0
- package/dist/vendor/config/schema-cloud.js +38 -0
- package/dist/vendor/config/schema-manager.js +118 -0
- package/dist/vendor/config/schema-overrides.js +68 -0
- package/dist/vendor/config/schema.js +104 -160
- package/dist/vendor/config/site-global.js +2 -3
- package/dist/vendor/config/validate.js +97 -78
- package/dist/vendor/config/winback.js +1 -1
- package/dist/vendor/devkit/actions-secrets.js +1 -1
- package/dist/vendor/devkit/agents-md.js +233 -0
- package/dist/vendor/devkit/attach-log-file.js +16 -2
- package/dist/vendor/devkit/build-json.js +1 -1
- package/dist/vendor/devkit/ci-workflows.js +30 -30
- package/dist/vendor/devkit/cli-router.js +16 -11
- package/dist/vendor/devkit/defaults-engine.js +15 -51
- package/dist/vendor/devkit/deploy-snapshot.js +44 -9
- package/dist/vendor/devkit/env-lines.js +183 -0
- package/dist/vendor/devkit/local.js +64 -10
- package/dist/vendor/devkit/lockfile.js +32 -13
- package/dist/vendor/devkit/logger.js +7 -2
- package/dist/vendor/devkit/merge-line-files.js +219 -177
- package/dist/vendor/devkit/omega-bin.js +208 -111
- package/dist/vendor/devkit/preludes/docs-sync.js +52 -0
- package/dist/vendor/devkit/preludes/index.js +1 -0
- package/dist/vendor/devkit/target-picker.js +45 -0
- package/dist/vendor/devkit/test/dashed-files.js +37 -0
- package/dist/vendor/devkit/test/run-verb-under-tee.js +71 -0
- package/dist/vendor/devkit/test/runner-core.js +6 -6
- package/dist/vendor/devkit/update.js +15 -15
- package/dist/vendor/devkit/verb-scripts.js +40 -0
- package/dist/vendor/devkit/verbs.js +170 -0
- 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/package.json +19 -26
- package/dist/commands/install.js +0 -37
- package/dist/defaults/AGENTS.md +0 -110
- package/dist/defaults/CLAUDE.md +0 -1
- 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/vendor/config/env-retired.js +0 -137
- package/dist/vendor/config/retired-keys.js +0 -635
- package/docs/analytics.md +0 -140
- package/docs/app-state.md +0 -92
- package/docs/audit.md +0 -69
- package/docs/auto-updater.md +0 -243
- package/docs/boot-sequence.md +0 -39
- package/docs/build-system.md +0 -169
- package/docs/cdp-debugging.md +0 -169
- package/docs/client-bridge.md +0 -269
- package/docs/common-mistakes.md +0 -21
- package/docs/config-schema.md +0 -120
- package/docs/context-menu.md +0 -112
- package/docs/context.md +0 -81
- package/docs/css.md +0 -90
- package/docs/deep-link.md +0 -186
- package/docs/environment-detection.md +0 -112
- package/docs/fontawesome.md +0 -107
- package/docs/hooks.md +0 -89
- package/docs/icons.md +0 -79
- package/docs/index.md +0 -317
- package/docs/installer-options.md +0 -165
- package/docs/ipc.md +0 -61
- package/docs/lib-modules.md +0 -53
- package/docs/logging.md +0 -229
- package/docs/menu.md +0 -160
- package/docs/releasing.md +0 -239
- package/docs/remote-config.md +0 -118
- package/docs/remote-scripts.md +0 -144
- package/docs/restart-manager.md +0 -144
- package/docs/runner.md +0 -290
- package/docs/sentry.md +0 -97
- package/docs/shared/agent-docs.md +0 -89
- package/docs/shared/analytics.md +0 -612
- package/docs/shared/brands.md +0 -57
- package/docs/shared/breaking-changes.md +0 -851
- package/docs/shared/config.md +0 -1952
- package/docs/shared/deploys.md +0 -341
- package/docs/shared/icons.md +0 -219
- package/docs/shared/local-dev.md +0 -167
- package/docs/shared/logging.md +0 -205
- package/docs/shared/monitoring.md +0 -167
- package/docs/shared/publishing.md +0 -187
- package/docs/shared/rulings.md +0 -34
- package/docs/shared/testing.md +0 -147
- package/docs/shared/theming.md +0 -629
- package/docs/shared/translation.md +0 -333
- package/docs/shared/updates.md +0 -61
- package/docs/signing.md +0 -293
- package/docs/startup.md +0 -142
- package/docs/storage.md +0 -59
- package/docs/templating.md +0 -101
- package/docs/test-boot-layer.md +0 -157
- package/docs/test-framework.md +0 -362
- package/docs/themes.md +0 -149
- package/docs/tooltips.md +0 -99
- package/docs/tray.md +0 -164
- package/docs/usage.md +0 -58
- package/docs/verts.md +0 -62
- package/docs/windows.md +0 -149
package/dist/lib/fontawesome.js
CHANGED
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
// partial Pro supply never loses icons the free set has.
|
|
13
13
|
//
|
|
14
14
|
// Main-side API:
|
|
15
|
-
//
|
|
16
|
-
//
|
|
15
|
+
// omega.fontawesome.get(name, style) → svg string | null ('play', 'solid')
|
|
16
|
+
// omega.fontawesome.has(name, style) → boolean
|
|
17
17
|
//
|
|
18
18
|
// Renderer-side (preload contextBridge):
|
|
19
19
|
// window.desktop.fontawesome.get(name, style) → Promise<svg string | null>
|
|
@@ -54,17 +54,17 @@ const logger = new LoggerLite('fontawesome');
|
|
|
54
54
|
|
|
55
55
|
const fontawesome = {
|
|
56
56
|
_initialized: false,
|
|
57
|
-
|
|
57
|
+
_omega: null,
|
|
58
58
|
_roots: [],
|
|
59
59
|
_aliasMap: null,
|
|
60
60
|
_cache: new Map(),
|
|
61
61
|
|
|
62
|
-
initialize(
|
|
62
|
+
initialize(omega) {
|
|
63
63
|
if (fontawesome._initialized) {
|
|
64
64
|
return;
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
fontawesome.
|
|
67
|
+
fontawesome._omega = omega;
|
|
68
68
|
fontawesome._roots = fontawesome._resolveRoots();
|
|
69
69
|
|
|
70
70
|
fontawesome._registerIpc();
|
package/dist/lib/ipc.js
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
// window.desktop.ipc.send(channel, payload) // fire-and-forget renderer → main
|
|
16
16
|
//
|
|
17
17
|
// All framework-internal channels are prefixed `desktop:` (e.g. `desktop:storage:get`);
|
|
18
|
-
// the test harness keeps its own `desktop:__test:*` channels (parked internals, like
|
|
18
|
+
// the test harness keeps its own `desktop:__test:*` channels (parked internals, like the OMEGA_TEST_* env vars).
|
|
19
19
|
// Consumers can register their own channels under any namespace they want.
|
|
20
20
|
|
|
21
21
|
const LoggerLite = require('./logger-lite.js');
|
|
@@ -24,18 +24,18 @@ const logger = new LoggerLite('ipc');
|
|
|
24
24
|
|
|
25
25
|
const ipc = {
|
|
26
26
|
_initialized: false,
|
|
27
|
-
|
|
27
|
+
_omega: null,
|
|
28
28
|
_handlers: {}, // channel -> handler fn
|
|
29
29
|
_listeners: {}, // channel -> Set<fn>
|
|
30
30
|
_ipcMain: null,
|
|
31
31
|
_electron: null,
|
|
32
32
|
|
|
33
|
-
initialize(
|
|
33
|
+
initialize(omega) {
|
|
34
34
|
if (ipc._initialized) {
|
|
35
35
|
return;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
ipc.
|
|
38
|
+
ipc._omega = omega;
|
|
39
39
|
ipc._electron = require('electron');
|
|
40
40
|
ipc._ipcMain = ipc._electron.ipcMain;
|
|
41
41
|
// No ipcMain in renderer/preload — those contexts use ipcRenderer instead.
|
package/dist/lib/menu.js
CHANGED
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
// @omega.js/desktop looks for the consumer's `src/integrations/menu/index.js` and calls it with a builder API:
|
|
4
4
|
//
|
|
5
5
|
// // src/integrations/menu/index.js
|
|
6
|
-
// module.exports = ({
|
|
6
|
+
// module.exports = ({ omega, menu, defaults }) => {
|
|
7
7
|
// // Use the platform-aware default template as a starting point...
|
|
8
8
|
// menu.useDefaults();
|
|
9
9
|
//
|
|
10
10
|
// // ...or build from scratch:
|
|
11
11
|
// menu.menu('File', [
|
|
12
|
-
// { id: 'file/new', label: 'New Window', accelerator: 'CmdOrCtrl+N', click: () =>
|
|
12
|
+
// { id: 'file/new', label: 'New Window', accelerator: 'CmdOrCtrl+N', click: () => omega.windows.show('main') },
|
|
13
13
|
// { type: 'separator' },
|
|
14
14
|
// { role: 'quit' },
|
|
15
15
|
// ]);
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
// menu.clear() // start over
|
|
29
29
|
// menu.append(item) // append a top-level descriptor (rare; prefer menu())
|
|
30
30
|
//
|
|
31
|
-
// Id-path API (during definition AND at runtime via `
|
|
31
|
+
// Id-path API (during definition AND at runtime via `omega.menu.*`):
|
|
32
32
|
// .find(idPath) / .has(idPath)
|
|
33
33
|
// .update(idPath, patch) — Object.assign + re-render
|
|
34
34
|
// .remove(idPath) — splice + re-render
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
// development/open-user-data, development/open-logs, development/open-app-config,
|
|
60
60
|
// development/test-error
|
|
61
61
|
//
|
|
62
|
-
// Disabling at runtime: call `
|
|
62
|
+
// Disabling at runtime: call `omega.menu.disable()` from anywhere in main,
|
|
63
63
|
// idempotent, calls Menu.setApplicationMenu(null) (or null on Windows/Linux to hide
|
|
64
64
|
// the menu bar). No config flag.
|
|
65
65
|
|
|
@@ -73,21 +73,21 @@ const logger = new LoggerLite('menu');
|
|
|
73
73
|
|
|
74
74
|
const menu = {
|
|
75
75
|
_initialized: false,
|
|
76
|
-
|
|
76
|
+
_omega: null,
|
|
77
77
|
_menu: null, // electron Menu instance (after _render)
|
|
78
78
|
_items: [], // top-level descriptors
|
|
79
79
|
_electron: null,
|
|
80
80
|
_definitionFn: null,
|
|
81
81
|
|
|
82
|
-
initialize(
|
|
82
|
+
initialize(omega) {
|
|
83
83
|
if (menu._initialized) {
|
|
84
84
|
return;
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
menu.
|
|
87
|
+
menu._omega = omega;
|
|
88
88
|
|
|
89
89
|
if (menu._disabled) {
|
|
90
|
-
logger.log('initialize — disabled via
|
|
90
|
+
logger.log('initialize — disabled via omega.menu.disable() called pre-init');
|
|
91
91
|
menu._initialized = true;
|
|
92
92
|
return;
|
|
93
93
|
}
|
|
@@ -102,7 +102,7 @@ const menu = {
|
|
|
102
102
|
|
|
103
103
|
if (fs.existsSync(absPath)) {
|
|
104
104
|
const loadConsumerFile = require('../utils/load-consumer-file.js');
|
|
105
|
-
const loaded = loadConsumerFile(absPath
|
|
105
|
+
const loaded = loadConsumerFile(absPath);
|
|
106
106
|
if (typeof loaded === 'function') {
|
|
107
107
|
menu._definitionFn = loaded;
|
|
108
108
|
} else if (loaded != null) {
|
|
@@ -117,7 +117,7 @@ const menu = {
|
|
|
117
117
|
|
|
118
118
|
if (menu._definitionFn) {
|
|
119
119
|
try {
|
|
120
|
-
menu._definitionFn({
|
|
120
|
+
menu._definitionFn({ omega, menu: builder, defaults: menu._defaultTemplate() });
|
|
121
121
|
} catch (e) {
|
|
122
122
|
logger.error('menu definition fn threw:', e);
|
|
123
123
|
}
|
|
@@ -131,8 +131,8 @@ const menu = {
|
|
|
131
131
|
// Reflect current auto-updater state into the menu item now that the menu exists.
|
|
132
132
|
// (The auto-updater initializes before menu in the boot sequence, so its initial state
|
|
133
133
|
// wasn't reflected in the menu yet.)
|
|
134
|
-
if (
|
|
135
|
-
|
|
134
|
+
if (omega.autoUpdater._updateMenuItem) {
|
|
135
|
+
omega.autoUpdater._updateMenuItem();
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
logger.log(`initialize — top-level menus=${menu._items.length}`);
|
|
@@ -168,12 +168,12 @@ const menu = {
|
|
|
168
168
|
// is informed by the legacy @omega.js/desktop template (preferences, relaunch,
|
|
169
169
|
// dev tools nested under view/developer, top-level development menu).
|
|
170
170
|
_defaultTemplate() {
|
|
171
|
-
const
|
|
171
|
+
const omega = menu._omega;
|
|
172
172
|
const isMac = process.platform === 'darwin';
|
|
173
|
-
const productName =
|
|
174
|
-
const brandUrl =
|
|
175
|
-
const brandName =
|
|
176
|
-
const isDev =
|
|
173
|
+
const productName = omega.config.app?.productName || omega.config.brand.name;
|
|
174
|
+
const brandUrl = omega.config.brand.url || null;
|
|
175
|
+
const brandName = omega.config.brand.name;
|
|
176
|
+
const isDev = omega.isDevelopment();
|
|
177
177
|
|
|
178
178
|
// @omega.js/desktop's built-in "Check for Updates..." item. Click defaults to invoking auto-updater
|
|
179
179
|
// check; auto-updater hook updates label/enabled dynamically based on status.
|
|
@@ -183,9 +183,9 @@ const menu = {
|
|
|
183
183
|
id: idPath,
|
|
184
184
|
label: 'Check for Updates...',
|
|
185
185
|
click: () => {
|
|
186
|
-
const status =
|
|
187
|
-
if (status.code === 'downloaded')
|
|
188
|
-
else
|
|
186
|
+
const status = omega.autoUpdater.getStatus();
|
|
187
|
+
if (status.code === 'downloaded') omega.autoUpdater.installNow();
|
|
188
|
+
else omega.autoUpdater.checkNow({ userInitiated: true });
|
|
189
189
|
},
|
|
190
190
|
});
|
|
191
191
|
|
|
@@ -197,7 +197,7 @@ const menu = {
|
|
|
197
197
|
id: `view/developer/simulate-update/${scenario}`,
|
|
198
198
|
label,
|
|
199
199
|
click: () => {
|
|
200
|
-
|
|
200
|
+
omega.autoUpdater.simulate(scenario)
|
|
201
201
|
.then((status) => logger.log(`simulate(${scenario}) → ${status.code}`))
|
|
202
202
|
.catch((e) => logger.warn(`simulate(${scenario}) failed: ${e.message}`));
|
|
203
203
|
},
|
|
@@ -211,7 +211,7 @@ const menu = {
|
|
|
211
211
|
accelerator: 'CommandOrControl+,',
|
|
212
212
|
visible: false,
|
|
213
213
|
click: () => {
|
|
214
|
-
|
|
214
|
+
omega.windows.show('settings');
|
|
215
215
|
},
|
|
216
216
|
};
|
|
217
217
|
|
|
@@ -351,7 +351,7 @@ const menu = {
|
|
|
351
351
|
const { shell } = require('electron');
|
|
352
352
|
// Route through getWebsiteUrl() so dev runs open localhost:4000 instead
|
|
353
353
|
// of punching out to the live brand site.
|
|
354
|
-
const safe = sanitizeURL(
|
|
354
|
+
const safe = sanitizeURL(omega.getWebsiteUrl());
|
|
355
355
|
if (safe) shell.openExternal(safe);
|
|
356
356
|
},
|
|
357
357
|
});
|
|
@@ -477,7 +477,7 @@ const menu = {
|
|
|
477
477
|
throw new Error('menu.define: fn must be a function');
|
|
478
478
|
}
|
|
479
479
|
menu._items = [];
|
|
480
|
-
fn({
|
|
480
|
+
fn({ omega: menu._omega, menu: menu._buildBuilder(), defaults: menu._defaultTemplate() });
|
|
481
481
|
menu._render();
|
|
482
482
|
},
|
|
483
483
|
|
|
@@ -511,7 +511,7 @@ const menu = {
|
|
|
511
511
|
isDisabled() { return Boolean(menu._disabled); },
|
|
512
512
|
};
|
|
513
513
|
|
|
514
|
-
// Mix the id-path API directly onto the singleton so `
|
|
514
|
+
// Mix the id-path API directly onto the singleton so `omega.menu.update(...)` works at runtime.
|
|
515
515
|
Object.assign(menu, buildIdApi({
|
|
516
516
|
getItems: () => menu._items,
|
|
517
517
|
render: () => menu._render(),
|
package/dist/lib/protocol.js
CHANGED
|
@@ -14,17 +14,17 @@ const logger = new LoggerLite('protocol');
|
|
|
14
14
|
|
|
15
15
|
const protocol = {
|
|
16
16
|
_initialized: false,
|
|
17
|
-
|
|
17
|
+
_omega: null,
|
|
18
18
|
_electron: null,
|
|
19
19
|
_hasLock: true,
|
|
20
20
|
_schemes: [],
|
|
21
21
|
|
|
22
|
-
initialize(
|
|
22
|
+
initialize(omega) {
|
|
23
23
|
if (protocol._initialized) {
|
|
24
24
|
return;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
protocol.
|
|
27
|
+
protocol._omega = omega;
|
|
28
28
|
protocol._electron = require('electron');
|
|
29
29
|
|
|
30
30
|
// `app` is only defined in the main process. In renderer/preload (and in
|
|
@@ -57,9 +57,9 @@ const protocol = {
|
|
|
57
57
|
// Register custom URL scheme. Always derived from brand.id — `<brand.id>://...` is
|
|
58
58
|
// the one and only scheme. No config knob; if you need multiple schemes for the same app,
|
|
59
59
|
// call `app.setAsDefaultProtocolClient(extra)` yourself in main.js.
|
|
60
|
-
const schemes = [
|
|
60
|
+
const schemes = [omega.config.brand.id];
|
|
61
61
|
protocol._schemes = schemes;
|
|
62
|
-
if (
|
|
62
|
+
if (omega.isProduction()) {
|
|
63
63
|
schemes.forEach((scheme) => {
|
|
64
64
|
if (process.platform === 'win32' || process.platform === 'linux') {
|
|
65
65
|
app.setAsDefaultProtocolClient(scheme, process.execPath, [process.cwd()]);
|
|
@@ -32,14 +32,14 @@ const DEFAULTS = Object.freeze({
|
|
|
32
32
|
// const required = cfg?.versionRequired || '0.0.0';
|
|
33
33
|
// if (semver.lt(app.getVersion(), required)) showForceUpdateDialog();
|
|
34
34
|
// };
|
|
35
|
-
// checkVersion(
|
|
36
|
-
//
|
|
35
|
+
// checkVersion(omega.remoteConfig.get()); // run at boot with defaults/cache
|
|
36
|
+
// omega.remoteConfig.on('update', checkVersion); // re-run on every fresh fetch
|
|
37
37
|
//
|
|
38
38
|
// API:
|
|
39
|
-
//
|
|
40
|
-
//
|
|
41
|
-
//
|
|
42
|
-
//
|
|
39
|
+
// omega.remoteConfig.get() → entire data (defaults | cache | latest fetch)
|
|
40
|
+
// omega.remoteConfig.get('versionRequired') → dot-path lookup
|
|
41
|
+
// omega.remoteConfig.on('update', fn) → subscribe; returns unsub fn
|
|
42
|
+
// omega.remoteConfig.refreshNow() → force a fetch right now (Promise<data | null>)
|
|
43
43
|
|
|
44
44
|
const LoggerLite = require('./logger-lite.js');
|
|
45
45
|
const fetch = require('wonderful-fetch');
|
|
@@ -53,17 +53,17 @@ const FETCH_TIMEOUT_MS = 60 * 1000; // 60s — generous; this is a once-an
|
|
|
53
53
|
|
|
54
54
|
const remoteConfig = {
|
|
55
55
|
_initialized: false,
|
|
56
|
-
|
|
56
|
+
_omega: null,
|
|
57
57
|
_data: null,
|
|
58
58
|
_intervalId: null,
|
|
59
59
|
_listeners: new Set(),
|
|
60
60
|
_url: null,
|
|
61
61
|
_enabled: true,
|
|
62
62
|
|
|
63
|
-
initialize(
|
|
63
|
+
initialize(omega) {
|
|
64
64
|
if (remoteConfig._initialized) return;
|
|
65
65
|
remoteConfig._initialized = true;
|
|
66
|
-
remoteConfig.
|
|
66
|
+
remoteConfig._omega = omega;
|
|
67
67
|
|
|
68
68
|
// Always seed with safe defaults FIRST so any caller reading `get()` between
|
|
69
69
|
// `initialize()` and the first successful fetch sees usable values (status:
|
|
@@ -74,16 +74,16 @@ const remoteConfig = {
|
|
|
74
74
|
// (disabled / no URL / transport gate) — the preload exposes these invokes
|
|
75
75
|
// unconditionally, so an unregistered handler would reject every renderer
|
|
76
76
|
// call instead of serving the defaults the early-return paths promise.
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
77
|
+
omega.ipc.unhandle('desktop:remote-config:get');
|
|
78
|
+
omega.ipc.handle('desktop:remote-config:get', (path) => remoteConfig.get(path));
|
|
79
|
+
omega.ipc.unhandle('desktop:remote-config:refresh-now');
|
|
80
|
+
omega.ipc.handle('desktop:remote-config:refresh-now', () => remoteConfig.refreshNow());
|
|
81
81
|
// Broadcast updates to renderers.
|
|
82
82
|
remoteConfig.on('update', (data) => {
|
|
83
|
-
|
|
83
|
+
omega.ipc.broadcast('desktop:remote-config:update', data);
|
|
84
84
|
});
|
|
85
85
|
|
|
86
|
-
const cfg =
|
|
86
|
+
const cfg = omega.config.remoteConfig || {};
|
|
87
87
|
remoteConfig._enabled = cfg.enabled !== false; // default on
|
|
88
88
|
|
|
89
89
|
if (!remoteConfig._enabled) {
|
|
@@ -95,8 +95,8 @@ const remoteConfig = {
|
|
|
95
95
|
// brand.url + the legacy convention path.
|
|
96
96
|
if (cfg.url) {
|
|
97
97
|
remoteConfig._url = cfg.url;
|
|
98
|
-
} else if (
|
|
99
|
-
const base = String(
|
|
98
|
+
} else if (omega.config.brand.url) {
|
|
99
|
+
const base = String(omega.config.brand.url).replace(/\/$/, '');
|
|
100
100
|
remoteConfig._url = `${base}/data/resources/main.json`;
|
|
101
101
|
}
|
|
102
102
|
|
|
@@ -115,7 +115,7 @@ const remoteConfig = {
|
|
|
115
115
|
|
|
116
116
|
// Restore cached data on top of defaults (last-known-good wins over defaults
|
|
117
117
|
// until the next successful fetch lands).
|
|
118
|
-
const cached =
|
|
118
|
+
const cached = omega.storage.get(STORAGE_KEY);
|
|
119
119
|
if (cached && typeof cached === 'object') {
|
|
120
120
|
remoteConfig._data = { ...DEFAULTS, ...cached };
|
|
121
121
|
}
|
|
@@ -127,9 +127,9 @@ const remoteConfig = {
|
|
|
127
127
|
// Cadence: match auto-updater's feed-check (same "occasionally network-hits-the-internet"
|
|
128
128
|
// job category). Auto-updater is wired BEFORE remote-config in boot sequence
|
|
129
129
|
// so `_options` is always populated; testing collapses to 500ms via isTesting().
|
|
130
|
-
const interval =
|
|
130
|
+
const interval = omega.isTesting()
|
|
131
131
|
? 500
|
|
132
|
-
:
|
|
132
|
+
: omega.autoUpdater._options.feedCheckIntervalMs;
|
|
133
133
|
remoteConfig._intervalId = setInterval(() => {
|
|
134
134
|
remoteConfig.refreshNow().catch((e) => logger.warn(`periodic fetch failed: ${formatFetchError(e)}`));
|
|
135
135
|
}, interval);
|
|
@@ -190,7 +190,7 @@ const remoteConfig = {
|
|
|
190
190
|
// Layer fresh fetch on top of defaults so consumers can omit fields from
|
|
191
191
|
// their hosted JSON and @omega.js/desktop still has sensible values.
|
|
192
192
|
remoteConfig._data = { ...DEFAULTS, ...data };
|
|
193
|
-
remoteConfig.
|
|
193
|
+
remoteConfig._omega.storage.set(STORAGE_KEY, data);
|
|
194
194
|
remoteConfig._emit('update', remoteConfig._data);
|
|
195
195
|
logger.log(`remote-config refreshed (${remoteConfig._url})`);
|
|
196
196
|
return remoteConfig._data;
|
|
@@ -210,7 +210,7 @@ const remoteConfig = {
|
|
|
210
210
|
if (remoteConfig._intervalId) clearInterval(remoteConfig._intervalId);
|
|
211
211
|
remoteConfig._intervalId = null;
|
|
212
212
|
remoteConfig._initialized = false;
|
|
213
|
-
remoteConfig.
|
|
213
|
+
remoteConfig._omega = null;
|
|
214
214
|
remoteConfig._data = null;
|
|
215
215
|
remoteConfig._listeners.clear();
|
|
216
216
|
remoteConfig._url = null;
|
|
@@ -10,14 +10,14 @@
|
|
|
10
10
|
// Fetch timeout: 60s
|
|
11
11
|
//
|
|
12
12
|
// The file is plain JavaScript fetched as text. It runs as an async function
|
|
13
|
-
// body with `
|
|
13
|
+
// body with `omega` and `require` in scope: full main-process access.
|
|
14
14
|
// Dedup is automatic: the script's content hash is stored in electron-store and
|
|
15
15
|
// the same script won't re-execute until the content changes.
|
|
16
16
|
//
|
|
17
17
|
// API:
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
//
|
|
18
|
+
// omega.remoteScripts.refreshNow() → force-fetch + execute if changed
|
|
19
|
+
// omega.remoteScripts.getLastRun() → { hash, timestamp } or null
|
|
20
|
+
// omega.remoteScripts.clearExecuted() → wipe stored hash (forces re-run next poll)
|
|
21
21
|
|
|
22
22
|
const LoggerLite = require('./logger-lite.js');
|
|
23
23
|
const fetch = require('wonderful-fetch');
|
|
@@ -31,17 +31,17 @@ const FETCH_TIMEOUT_MS = 60 * 1000;
|
|
|
31
31
|
|
|
32
32
|
const remoteScripts = {
|
|
33
33
|
_initialized: false,
|
|
34
|
-
|
|
34
|
+
_omega: null,
|
|
35
35
|
_url: null,
|
|
36
36
|
_enabled: false,
|
|
37
37
|
_intervalId: null,
|
|
38
38
|
|
|
39
|
-
initialize(
|
|
39
|
+
initialize(omega) {
|
|
40
40
|
if (remoteScripts._initialized) return;
|
|
41
41
|
remoteScripts._initialized = true;
|
|
42
|
-
remoteScripts.
|
|
42
|
+
remoteScripts._omega = omega;
|
|
43
43
|
|
|
44
|
-
const cfg =
|
|
44
|
+
const cfg = omega.config.remoteScripts || {};
|
|
45
45
|
remoteScripts._enabled = cfg.enabled === true;
|
|
46
46
|
|
|
47
47
|
if (!remoteScripts._enabled) {
|
|
@@ -51,8 +51,8 @@ const remoteScripts = {
|
|
|
51
51
|
|
|
52
52
|
if (cfg.url) {
|
|
53
53
|
remoteScripts._url = cfg.url;
|
|
54
|
-
} else if (
|
|
55
|
-
const base = String(
|
|
54
|
+
} else if (omega.config.brand.url) {
|
|
55
|
+
const base = String(omega.config.brand.url).replace(/\/$/, '');
|
|
56
56
|
remoteScripts._url = `${base}/data/scripts/main.js`;
|
|
57
57
|
}
|
|
58
58
|
|
|
@@ -72,9 +72,9 @@ const remoteScripts = {
|
|
|
72
72
|
remoteScripts.refreshNow()
|
|
73
73
|
.catch((e) => logger.warn(`initial fetch failed: ${formatFetchError(e)}`));
|
|
74
74
|
|
|
75
|
-
const interval =
|
|
75
|
+
const interval = omega.isTesting()
|
|
76
76
|
? 500
|
|
77
|
-
:
|
|
77
|
+
: omega.autoUpdater._options.feedCheckIntervalMs;
|
|
78
78
|
remoteScripts._intervalId = setInterval(() => {
|
|
79
79
|
remoteScripts.refreshNow()
|
|
80
80
|
.catch((e) => logger.warn(`periodic fetch failed: ${formatFetchError(e)}`));
|
|
@@ -114,31 +114,31 @@ const remoteScripts = {
|
|
|
114
114
|
logger.error(`remote-scripts: script threw: ${e.message}`);
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
-
remoteScripts.
|
|
117
|
+
remoteScripts._omega.storage.set(STORAGE_KEY, { hash, timestamp: Date.now() });
|
|
118
118
|
return { hash };
|
|
119
119
|
},
|
|
120
120
|
|
|
121
121
|
getLastRun() {
|
|
122
|
-
if (!remoteScripts.
|
|
123
|
-
return remoteScripts.
|
|
122
|
+
if (!remoteScripts._omega) return null;
|
|
123
|
+
return remoteScripts._omega.storage.get(STORAGE_KEY) || null;
|
|
124
124
|
},
|
|
125
125
|
|
|
126
126
|
clearExecuted() {
|
|
127
|
-
if (!remoteScripts.
|
|
128
|
-
remoteScripts.
|
|
127
|
+
if (!remoteScripts._omega) return;
|
|
128
|
+
remoteScripts._omega.storage.set(STORAGE_KEY, null);
|
|
129
129
|
},
|
|
130
130
|
|
|
131
131
|
// ─── Internals ──────────────────────────────────────────────────────────────
|
|
132
132
|
|
|
133
133
|
async _execute(code) {
|
|
134
|
-
const
|
|
134
|
+
const omega = remoteScripts._omega;
|
|
135
135
|
|
|
136
136
|
// The real `require`, handed to the script: it is compiled by
|
|
137
137
|
// `new AsyncFunction`, so it has no module scope of its own and no bundler
|
|
138
138
|
// ever sees its body.
|
|
139
139
|
const AsyncFunction = Object.getPrototypeOf(async function () {}).constructor;
|
|
140
|
-
const fn = new AsyncFunction('
|
|
141
|
-
await fn(
|
|
140
|
+
const fn = new AsyncFunction('omega', 'require', code);
|
|
141
|
+
await fn(omega, require);
|
|
142
142
|
},
|
|
143
143
|
|
|
144
144
|
_hash(str) {
|
|
@@ -149,7 +149,7 @@ const remoteScripts = {
|
|
|
149
149
|
if (remoteScripts._intervalId) clearInterval(remoteScripts._intervalId);
|
|
150
150
|
remoteScripts._intervalId = null;
|
|
151
151
|
remoteScripts._initialized = false;
|
|
152
|
-
remoteScripts.
|
|
152
|
+
remoteScripts._omega = null;
|
|
153
153
|
remoteScripts._url = null;
|
|
154
154
|
remoteScripts._enabled = false;
|
|
155
155
|
},
|