@omega.js/desktop 0.52.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 +17 -12
- 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 +11 -11
- 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/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/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 +2 -2
- 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 +8 -11
- package/dist/vendor/config/load.js +1 -2
- package/dist/vendor/config/platforms.js +1 -1
- 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/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/local.js +2 -0
- package/dist/vendor/devkit/merge-line-files.js +2 -3
- 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 +38 -27
- 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/remote-config.md +9 -9
- package/docs/remote-scripts.md +12 -12
- package/docs/restart-manager.md +8 -8
- package/docs/sentry.md +4 -4
- package/docs/shared/analytics.md +1 -1
- package/docs/shared/breaking-changes.md +79 -13
- package/docs/shared/config.md +17 -21
- 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/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
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
4
4
|
|
|
5
|
+
// Every library src/main.js assigns, by its property name
|
|
6
|
+
const LIBS = [
|
|
7
|
+
'storage', 'theme', 'fontawesome', 'sentry', 'protocol', 'deepLink', 'authFlow', 'appState',
|
|
8
|
+
'ipc', 'autoUpdater', 'tray', 'menu', 'contextMenu', 'startup', 'auth', 'windows', 'context',
|
|
9
|
+
'usage', 'remoteConfig', 'remoteScripts', 'analytics', 'restartManager',
|
|
10
|
+
];
|
|
11
|
+
|
|
5
12
|
module.exports = defineCases({
|
|
6
13
|
type: 'group',
|
|
7
14
|
layer: 'main',
|
|
@@ -10,67 +17,48 @@ module.exports = defineCases({
|
|
|
10
17
|
{
|
|
11
18
|
name: 'config was loaded',
|
|
12
19
|
run: (ctx) => {
|
|
13
|
-
ctx.expect(ctx.
|
|
14
|
-
ctx.expect(ctx.
|
|
20
|
+
ctx.expect(ctx.omega.config).toBeTruthy();
|
|
21
|
+
ctx.expect(ctx.omega.config.brand.id).toBeTruthy();
|
|
15
22
|
},
|
|
16
23
|
},
|
|
17
24
|
{
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
name: 'app-state initialized',
|
|
35
|
-
run: (ctx) => ctx.expect(ctx.manager.appState._initialized).toBe(true),
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
name: 'ipc initialized',
|
|
39
|
-
run: (ctx) => ctx.expect(ctx.manager.ipc._initialized).toBe(true),
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
name: 'auto-updater initialized',
|
|
43
|
-
run: (ctx) => ctx.expect(ctx.manager.autoUpdater._initialized).toBe(true),
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
name: 'tray initialized',
|
|
47
|
-
run: (ctx) => ctx.expect(ctx.manager.tray._initialized).toBe(true),
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
name: 'menu initialized',
|
|
51
|
-
run: (ctx) => ctx.expect(ctx.manager.menu._initialized).toBe(true),
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
name: 'context-menu initialized',
|
|
55
|
-
run: (ctx) => ctx.expect(ctx.manager.contextMenu._initialized).toBe(true),
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
name: 'startup initialized',
|
|
59
|
-
run: (ctx) => ctx.expect(ctx.manager.startup._initialized).toBe(true),
|
|
25
|
+
// The 22 libraries, each a plain property of the one instance and each
|
|
26
|
+
// brought up by initialize(). `auth` is the main-side auth (lib/auth.js);
|
|
27
|
+
// the old `omega` property that held it is gone.
|
|
28
|
+
name: 'every library is on the instance and initialized',
|
|
29
|
+
run: (ctx) => {
|
|
30
|
+
for (const name of LIBS) {
|
|
31
|
+
ctx.expect(Boolean(ctx.omega[name])).toBe(true);
|
|
32
|
+
if (ctx.omega[name]._initialized !== true) {
|
|
33
|
+
throw new Error(`omega.${name} was not initialized by the boot`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
ctx.expect(LIBS.length).toBe(22);
|
|
37
|
+
ctx.expect(ctx.omega.omega).toBeUndefined();
|
|
38
|
+
},
|
|
60
39
|
},
|
|
61
40
|
{
|
|
62
|
-
|
|
63
|
-
|
|
41
|
+
// The one instance a consumer's main.js requires IS the one the harness booted
|
|
42
|
+
name: 'the module exports ONE instance, and .Omega is its constructor',
|
|
43
|
+
run: (ctx) => {
|
|
44
|
+
const main = require('../../../main.js');
|
|
45
|
+
ctx.expect(main).toBe(ctx.omega);
|
|
46
|
+
ctx.expect(typeof main.Omega).toBe('function');
|
|
47
|
+
ctx.expect(main).toBeInstanceOf(main.Omega);
|
|
48
|
+
ctx.expect(main.constructor).toBe(main.Omega);
|
|
49
|
+
},
|
|
64
50
|
},
|
|
65
51
|
{
|
|
66
|
-
name: '
|
|
67
|
-
run: (ctx) =>
|
|
52
|
+
name: 'ready settled with the instance',
|
|
53
|
+
run: async (ctx) => {
|
|
54
|
+
ctx.expect(await ctx.omega.ready).toBe(ctx.omega);
|
|
55
|
+
},
|
|
68
56
|
},
|
|
69
57
|
{
|
|
70
58
|
name: 'getEnvironment returns testing under the test harness',
|
|
71
59
|
run: (ctx) => {
|
|
72
60
|
// The harness spawn names OMEGA_ENVIRONMENT=testing, the one input.
|
|
73
|
-
ctx.expect(ctx.
|
|
61
|
+
ctx.expect(ctx.omega.getEnvironment()).toBe('testing');
|
|
74
62
|
},
|
|
75
63
|
},
|
|
76
64
|
],
|
|
@@ -12,13 +12,13 @@ module.exports = defineCases({
|
|
|
12
12
|
description: 'context-menu (main)',
|
|
13
13
|
cleanup: (ctx) => {
|
|
14
14
|
// Reset to the built-in default fn so subsequent test runs aren't affected.
|
|
15
|
-
ctx.
|
|
15
|
+
ctx.omega.contextMenu._definitionFn = null;
|
|
16
16
|
},
|
|
17
17
|
tests: [
|
|
18
18
|
{
|
|
19
19
|
name: 'initialize ran (enabled by default)',
|
|
20
20
|
run: (ctx) => {
|
|
21
|
-
ctx.expect(ctx.
|
|
21
|
+
ctx.expect(ctx.omega.contextMenu._initialized).toBe(true);
|
|
22
22
|
},
|
|
23
23
|
},
|
|
24
24
|
{
|
|
@@ -30,19 +30,19 @@ module.exports = defineCases({
|
|
|
30
30
|
// In the test harness, appRoot() === app.getAppPath() === the @omega.js/desktop harness dir, which
|
|
31
31
|
// differs from process.cwd() (the consumer project dir when run from a consumer).
|
|
32
32
|
// Comparing against process.cwd() made this assert a false mismatch in consumers:
|
|
33
|
-
// the consumer has src/integrations/context-menu/index.js, but the
|
|
33
|
+
// the consumer has src/integrations/context-menu/index.js, but the omega instance never
|
|
34
34
|
// looks there — it looks under appRoot(). Keying the expectation off appRoot() makes
|
|
35
35
|
// the invariant self-consistent in both the @omega.js/desktop self-test and any consumer run.
|
|
36
36
|
const appRoot = require('../../../utils/app-root.js')();
|
|
37
37
|
const consumerFile = path.join(appRoot, 'src', 'integrations', 'context-menu', 'index.js');
|
|
38
38
|
const hasConsumer = fs.existsSync(consumerFile);
|
|
39
|
-
ctx.expect(ctx.
|
|
39
|
+
ctx.expect(ctx.omega.contextMenu.hasCustomDefinition()).toBe(hasConsumer);
|
|
40
40
|
},
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
43
|
name: 'default fn: editable params produce cut/copy/paste',
|
|
44
44
|
run: (ctx) => {
|
|
45
|
-
const items = ctx.
|
|
45
|
+
const items = ctx.omega.contextMenu.buildItems({
|
|
46
46
|
isEditable: true,
|
|
47
47
|
editFlags: { canCut: true, canCopy: true, canPaste: true },
|
|
48
48
|
});
|
|
@@ -55,7 +55,7 @@ module.exports = defineCases({
|
|
|
55
55
|
{
|
|
56
56
|
name: 'default fn: text selection produces copy only',
|
|
57
57
|
run: (ctx) => {
|
|
58
|
-
const items = ctx.
|
|
58
|
+
const items = ctx.omega.contextMenu.buildItems({
|
|
59
59
|
isEditable: false,
|
|
60
60
|
selectionText: 'hello world',
|
|
61
61
|
});
|
|
@@ -68,7 +68,7 @@ module.exports = defineCases({
|
|
|
68
68
|
{
|
|
69
69
|
name: 'default fn: link adds Open / Copy Address items',
|
|
70
70
|
run: (ctx) => {
|
|
71
|
-
const items = ctx.
|
|
71
|
+
const items = ctx.omega.contextMenu.buildItems({
|
|
72
72
|
linkURL: 'https://example.com',
|
|
73
73
|
});
|
|
74
74
|
const labels = items.filter((i) => i.label).map((i) => i.label);
|
|
@@ -80,27 +80,27 @@ module.exports = defineCases({
|
|
|
80
80
|
name: 'default fn: empty params → only the always-on items (reload)',
|
|
81
81
|
run: (ctx) => {
|
|
82
82
|
// Force isDevelopment false so dev-only items don't appear.
|
|
83
|
-
const orig = ctx.
|
|
84
|
-
ctx.
|
|
83
|
+
const orig = ctx.omega.isDevelopment;
|
|
84
|
+
ctx.omega.isDevelopment = () => false;
|
|
85
85
|
try {
|
|
86
|
-
const items = ctx.
|
|
86
|
+
const items = ctx.omega.contextMenu.buildItems({});
|
|
87
87
|
// With no editFlags, no selection, no link → only `reload` is always-on.
|
|
88
88
|
const ids = items.filter((i) => i.id).map((i) => i.id);
|
|
89
89
|
ctx.expect(ids).toEqual(['reload']);
|
|
90
90
|
} finally {
|
|
91
|
-
ctx.
|
|
91
|
+
ctx.omega.isDevelopment = orig;
|
|
92
92
|
}
|
|
93
93
|
},
|
|
94
94
|
},
|
|
95
95
|
{
|
|
96
96
|
name: 'define() replaces the fn',
|
|
97
97
|
run: (ctx) => {
|
|
98
|
-
ctx.
|
|
98
|
+
ctx.omega.contextMenu.define(({ menu, params }) => {
|
|
99
99
|
menu.item({ label: `Selected: ${params.selectionText}` });
|
|
100
100
|
});
|
|
101
|
-
ctx.expect(ctx.
|
|
101
|
+
ctx.expect(ctx.omega.contextMenu.hasCustomDefinition()).toBe(true);
|
|
102
102
|
|
|
103
|
-
const items = ctx.
|
|
103
|
+
const items = ctx.omega.contextMenu.buildItems({ selectionText: 'foo' });
|
|
104
104
|
ctx.expect(items.length).toBe(1);
|
|
105
105
|
ctx.expect(items[0].label).toBe('Selected: foo');
|
|
106
106
|
},
|
|
@@ -108,18 +108,18 @@ module.exports = defineCases({
|
|
|
108
108
|
{
|
|
109
109
|
name: 'define() throws on non-function input',
|
|
110
110
|
run: (ctx) => {
|
|
111
|
-
ctx.expect(() => ctx.
|
|
111
|
+
ctx.expect(() => ctx.omega.contextMenu.define(null)).toThrow(/must be a function/);
|
|
112
112
|
},
|
|
113
113
|
},
|
|
114
114
|
{
|
|
115
115
|
name: 'menu.separator() pushes a separator descriptor',
|
|
116
116
|
run: (ctx) => {
|
|
117
|
-
ctx.
|
|
117
|
+
ctx.omega.contextMenu.define(({ menu }) => {
|
|
118
118
|
menu.item({ label: 'A' });
|
|
119
119
|
menu.separator();
|
|
120
120
|
menu.item({ label: 'B' });
|
|
121
121
|
});
|
|
122
|
-
const items = ctx.
|
|
122
|
+
const items = ctx.omega.contextMenu.buildItems({});
|
|
123
123
|
ctx.expect(items.length).toBe(3);
|
|
124
124
|
ctx.expect(items[1].type).toBe('separator');
|
|
125
125
|
},
|
|
@@ -127,24 +127,25 @@ module.exports = defineCases({
|
|
|
127
127
|
{
|
|
128
128
|
name: 'menu.submenu() builds a nested submenu',
|
|
129
129
|
run: (ctx) => {
|
|
130
|
-
ctx.
|
|
130
|
+
ctx.omega.contextMenu.define(({ menu }) => {
|
|
131
131
|
menu.submenu('More', [{ label: 'X' }, { label: 'Y' }]);
|
|
132
132
|
});
|
|
133
|
-
const items = ctx.
|
|
133
|
+
const items = ctx.omega.contextMenu.buildItems({});
|
|
134
134
|
ctx.expect(items[0].label).toBe('More');
|
|
135
135
|
ctx.expect(items[0].submenu.length).toBe(2);
|
|
136
136
|
},
|
|
137
137
|
},
|
|
138
138
|
{
|
|
139
|
-
name: 'definition fn receives
|
|
139
|
+
name: 'definition fn receives omega, params, webContents (no manager key)',
|
|
140
140
|
run: (ctx) => {
|
|
141
141
|
let received;
|
|
142
|
-
ctx.
|
|
142
|
+
ctx.omega.contextMenu.define((arg) => {
|
|
143
143
|
received = arg;
|
|
144
144
|
arg.menu.item({ label: 'probe' });
|
|
145
145
|
});
|
|
146
|
-
ctx.
|
|
147
|
-
ctx.expect(received.
|
|
146
|
+
ctx.omega.contextMenu.buildItems({ x: 100, y: 200 }, { id: 'fake-wc' });
|
|
147
|
+
ctx.expect(received.omega).toBe(ctx.omega);
|
|
148
|
+
ctx.expect(received.manager).toBeUndefined();
|
|
148
149
|
ctx.expect(received.params).toEqual({ x: 100, y: 200 });
|
|
149
150
|
ctx.expect(received.webContents).toEqual({ id: 'fake-wc' });
|
|
150
151
|
ctx.expect(typeof received.menu.item).toBe('function');
|
|
@@ -156,12 +157,12 @@ module.exports = defineCases({
|
|
|
156
157
|
name: '_resolveItem evaluates dynamic labels',
|
|
157
158
|
run: (ctx) => {
|
|
158
159
|
let n = 0;
|
|
159
|
-
const resolved = ctx.
|
|
160
|
+
const resolved = ctx.omega.contextMenu._resolveItem({
|
|
160
161
|
label: () => `Items: ${n}`,
|
|
161
162
|
});
|
|
162
163
|
ctx.expect(resolved.label).toBe('Items: 0');
|
|
163
164
|
n = 4;
|
|
164
|
-
const resolved2 = ctx.
|
|
165
|
+
const resolved2 = ctx.omega.contextMenu._resolveItem({ label: () => `Items: ${n}` });
|
|
165
166
|
ctx.expect(resolved2.label).toBe('Items: 4');
|
|
166
167
|
},
|
|
167
168
|
},
|
|
@@ -169,7 +170,7 @@ module.exports = defineCases({
|
|
|
169
170
|
name: '_resolveItem wraps click handlers to swallow errors',
|
|
170
171
|
run: (ctx) => {
|
|
171
172
|
let called = false;
|
|
172
|
-
const resolved = ctx.
|
|
173
|
+
const resolved = ctx.omega.contextMenu._resolveItem({
|
|
173
174
|
label: 'X',
|
|
174
175
|
click: () => { called = true; throw new Error('nope'); },
|
|
175
176
|
});
|
|
@@ -185,8 +186,8 @@ module.exports = defineCases({
|
|
|
185
186
|
const mockWC = {
|
|
186
187
|
on: (evt, fn) => { calls.push({ evt, fn }); },
|
|
187
188
|
};
|
|
188
|
-
ctx.
|
|
189
|
-
ctx.
|
|
189
|
+
ctx.omega.contextMenu.attach(mockWC);
|
|
190
|
+
ctx.omega.contextMenu.attach(mockWC); // second call should be a no-op
|
|
190
191
|
ctx.expect(calls.length).toBe(1);
|
|
191
192
|
ctx.expect(calls[0].evt).toBe('context-menu');
|
|
192
193
|
},
|
|
@@ -194,8 +195,8 @@ module.exports = defineCases({
|
|
|
194
195
|
{
|
|
195
196
|
name: 'menu.useDefaults() ships id-tagged items (cut, copy, paste, ...)',
|
|
196
197
|
run: (ctx) => {
|
|
197
|
-
ctx.
|
|
198
|
-
const items = ctx.
|
|
198
|
+
ctx.omega.contextMenu.define(({ menu }) => { menu.useDefaults(); });
|
|
199
|
+
const items = ctx.omega.contextMenu.buildItems({
|
|
199
200
|
isEditable: true,
|
|
200
201
|
editFlags: { canCut: true, canCopy: true, canPaste: true },
|
|
201
202
|
});
|
|
@@ -208,11 +209,11 @@ module.exports = defineCases({
|
|
|
208
209
|
{
|
|
209
210
|
name: 'menu.remove() drops an item by id within the event',
|
|
210
211
|
run: (ctx) => {
|
|
211
|
-
ctx.
|
|
212
|
+
ctx.omega.contextMenu.define(({ menu }) => {
|
|
212
213
|
menu.useDefaults();
|
|
213
214
|
menu.remove('paste');
|
|
214
215
|
});
|
|
215
|
-
const items = ctx.
|
|
216
|
+
const items = ctx.omega.contextMenu.buildItems({
|
|
216
217
|
isEditable: true,
|
|
217
218
|
editFlags: { canCut: true, canCopy: true, canPaste: true },
|
|
218
219
|
});
|
|
@@ -225,11 +226,11 @@ module.exports = defineCases({
|
|
|
225
226
|
{
|
|
226
227
|
name: 'menu.insertAfter splices a new item by id',
|
|
227
228
|
run: (ctx) => {
|
|
228
|
-
ctx.
|
|
229
|
+
ctx.omega.contextMenu.define(({ menu }) => {
|
|
229
230
|
menu.useDefaults();
|
|
230
231
|
menu.insertAfter('copy', { id: 'search', label: 'Search...' });
|
|
231
232
|
});
|
|
232
|
-
const items = ctx.
|
|
233
|
+
const items = ctx.omega.contextMenu.buildItems({
|
|
233
234
|
isEditable: false,
|
|
234
235
|
selectionText: 'foo',
|
|
235
236
|
});
|
|
@@ -243,11 +244,11 @@ module.exports = defineCases({
|
|
|
243
244
|
{
|
|
244
245
|
name: 'menu.update() patches a default item before popup',
|
|
245
246
|
run: (ctx) => {
|
|
246
|
-
ctx.
|
|
247
|
+
ctx.omega.contextMenu.define(({ menu }) => {
|
|
247
248
|
menu.useDefaults();
|
|
248
249
|
menu.update('copy', { label: 'CUSTOM COPY' });
|
|
249
250
|
});
|
|
250
|
-
const items = ctx.
|
|
251
|
+
const items = ctx.omega.contextMenu.buildItems({
|
|
251
252
|
isEditable: false,
|
|
252
253
|
selectionText: 'foo',
|
|
253
254
|
});
|
|
@@ -259,7 +260,7 @@ module.exports = defineCases({
|
|
|
259
260
|
{
|
|
260
261
|
name: 'defaults: undo/redo appear when canUndo/canRedo flags set',
|
|
261
262
|
run: (ctx) => {
|
|
262
|
-
const items = ctx.
|
|
263
|
+
const items = ctx.omega.contextMenu.buildItems({
|
|
263
264
|
isEditable: true,
|
|
264
265
|
editFlags: { canUndo: true, canRedo: true, canCut: true, canCopy: true, canPaste: true },
|
|
265
266
|
});
|
|
@@ -271,7 +272,7 @@ module.exports = defineCases({
|
|
|
271
272
|
{
|
|
272
273
|
name: 'defaults: paste-and-match-style appears in editable contexts',
|
|
273
274
|
run: (ctx) => {
|
|
274
|
-
const items = ctx.
|
|
275
|
+
const items = ctx.omega.contextMenu.buildItems({
|
|
275
276
|
isEditable: true,
|
|
276
277
|
editFlags: { canCut: true, canCopy: true, canPaste: true },
|
|
277
278
|
});
|
|
@@ -282,14 +283,14 @@ module.exports = defineCases({
|
|
|
282
283
|
{
|
|
283
284
|
name: 'defaults: reload always present',
|
|
284
285
|
run: (ctx) => {
|
|
285
|
-
const orig = ctx.
|
|
286
|
-
ctx.
|
|
286
|
+
const orig = ctx.omega.isDevelopment;
|
|
287
|
+
ctx.omega.isDevelopment = () => false;
|
|
287
288
|
try {
|
|
288
|
-
const items = ctx.
|
|
289
|
+
const items = ctx.omega.contextMenu.buildItems({ selectionText: 'hi' });
|
|
289
290
|
const ids = items.filter((i) => i.id).map((i) => i.id);
|
|
290
291
|
ctx.expect(ids).toContain('reload');
|
|
291
292
|
} finally {
|
|
292
|
-
ctx.
|
|
293
|
+
ctx.omega.isDevelopment = orig;
|
|
293
294
|
}
|
|
294
295
|
},
|
|
295
296
|
},
|
|
@@ -297,13 +298,13 @@ module.exports = defineCases({
|
|
|
297
298
|
name: 'menu.find / menu.has work within event builder',
|
|
298
299
|
run: (ctx) => {
|
|
299
300
|
let foundCopy, hasCut, hasNope;
|
|
300
|
-
ctx.
|
|
301
|
+
ctx.omega.contextMenu.define(({ menu }) => {
|
|
301
302
|
menu.useDefaults();
|
|
302
303
|
foundCopy = menu.find('copy');
|
|
303
304
|
hasCut = menu.has('cut');
|
|
304
305
|
hasNope = menu.has('does-not-exist');
|
|
305
306
|
});
|
|
306
|
-
ctx.
|
|
307
|
+
ctx.omega.contextMenu.buildItems({
|
|
307
308
|
isEditable: true,
|
|
308
309
|
editFlags: { canCut: true, canCopy: true, canPaste: true },
|
|
309
310
|
});
|
|
@@ -315,11 +316,11 @@ module.exports = defineCases({
|
|
|
315
316
|
{
|
|
316
317
|
name: 'menu.insertBefore splices a new item by id',
|
|
317
318
|
run: (ctx) => {
|
|
318
|
-
ctx.
|
|
319
|
+
ctx.omega.contextMenu.define(({ menu }) => {
|
|
319
320
|
menu.useDefaults();
|
|
320
321
|
menu.insertBefore('copy', { id: 'pre-copy', label: 'BEFORE COPY' });
|
|
321
322
|
});
|
|
322
|
-
const items = ctx.
|
|
323
|
+
const items = ctx.omega.contextMenu.buildItems({
|
|
323
324
|
isEditable: false,
|
|
324
325
|
selectionText: 'foo',
|
|
325
326
|
});
|
|
@@ -332,12 +333,12 @@ module.exports = defineCases({
|
|
|
332
333
|
{
|
|
333
334
|
name: 'menu.hide / menu.enable / menu.show within event',
|
|
334
335
|
run: (ctx) => {
|
|
335
|
-
ctx.
|
|
336
|
+
ctx.omega.contextMenu.define(({ menu }) => {
|
|
336
337
|
menu.useDefaults();
|
|
337
338
|
menu.hide('copy');
|
|
338
339
|
menu.enable('paste', false);
|
|
339
340
|
});
|
|
340
|
-
const items = ctx.
|
|
341
|
+
const items = ctx.omega.contextMenu.buildItems({
|
|
341
342
|
isEditable: true,
|
|
342
343
|
editFlags: { canCut: true, canCopy: true, canPaste: true },
|
|
343
344
|
});
|
|
@@ -350,12 +351,12 @@ module.exports = defineCases({
|
|
|
350
351
|
{
|
|
351
352
|
name: 'menu.appendTo pushes into a submenu created via menu.submenu(...)',
|
|
352
353
|
run: (ctx) => {
|
|
353
|
-
ctx.
|
|
354
|
+
ctx.omega.contextMenu.define(({ menu }) => {
|
|
354
355
|
// Build a parent submenu with an id.
|
|
355
356
|
menu.item({ id: 'more', label: 'More', submenu: [] });
|
|
356
357
|
menu.appendTo('more', { id: 'extra', label: 'Extra' });
|
|
357
358
|
});
|
|
358
|
-
const items = ctx.
|
|
359
|
+
const items = ctx.omega.contextMenu.buildItems({});
|
|
359
360
|
const more = items.find((i) => i.id === 'more');
|
|
360
361
|
ctx.expect(more).toBeTruthy();
|
|
361
362
|
ctx.expect(more.submenu[0].id).toBe('extra');
|
|
@@ -13,16 +13,16 @@ module.exports = defineCases({
|
|
|
13
13
|
description: 'context (main)',
|
|
14
14
|
tests: [
|
|
15
15
|
{
|
|
16
|
-
name: 'context module wired on
|
|
16
|
+
name: 'context module wired on omega + initialized during boot',
|
|
17
17
|
run: (ctx) => {
|
|
18
|
-
ctx.expect(ctx.
|
|
19
|
-
ctx.expect(ctx.
|
|
18
|
+
ctx.expect(ctx.omega.context).toBeDefined();
|
|
19
|
+
ctx.expect(ctx.omega.context._initialized).toBe(true);
|
|
20
20
|
},
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
name: 'session has id (UUID), startTime (ISO), deviceId (string)',
|
|
24
24
|
run: (ctx) => {
|
|
25
|
-
const s = ctx.
|
|
25
|
+
const s = ctx.omega.context.session;
|
|
26
26
|
ctx.expect(typeof s.id).toBe('string');
|
|
27
27
|
ctx.expect(s.id.length).toBe(36);
|
|
28
28
|
ctx.expect(typeof s.startTime).toBe('string');
|
|
@@ -34,10 +34,10 @@ module.exports = defineCases({
|
|
|
34
34
|
{
|
|
35
35
|
name: 'deviceId is stable — re-init preserves the same id',
|
|
36
36
|
run: async (ctx) => {
|
|
37
|
-
const before = ctx.
|
|
38
|
-
ctx.
|
|
39
|
-
await ctx.
|
|
40
|
-
const after = ctx.
|
|
37
|
+
const before = ctx.omega.context.session.deviceId;
|
|
38
|
+
ctx.omega.context.shutdown();
|
|
39
|
+
await ctx.omega.context.initialize(ctx.omega);
|
|
40
|
+
const after = ctx.omega.context.session.deviceId;
|
|
41
41
|
ctx.expect(after).toBe(before);
|
|
42
42
|
},
|
|
43
43
|
},
|
|
@@ -63,14 +63,14 @@ module.exports = defineCases({
|
|
|
63
63
|
// that hands a wiped install back the id it had before.
|
|
64
64
|
name: 'deviceId derives from the injected MAC seed and persists to storage',
|
|
65
65
|
run: async (ctx) => {
|
|
66
|
-
const storage = ctx.
|
|
66
|
+
const storage = ctx.omega.storage;
|
|
67
67
|
const saved = storage.get('context.deviceId');
|
|
68
68
|
|
|
69
69
|
try {
|
|
70
70
|
// A wiped install: nothing stored, so the seed decides
|
|
71
71
|
storage.delete('context.deviceId');
|
|
72
|
-
const derived = await ctx.
|
|
73
|
-
const mac = ctx.
|
|
72
|
+
const derived = await ctx.omega.context._resolveDeviceId();
|
|
73
|
+
const mac = ctx.omega.context._readFirstMac();
|
|
74
74
|
|
|
75
75
|
if (mac) {
|
|
76
76
|
ctx.expect(derived).toBe(mac);
|
|
@@ -82,7 +82,7 @@ module.exports = defineCases({
|
|
|
82
82
|
ctx.expect(storage.get('context.deviceId')).toBe(derived);
|
|
83
83
|
|
|
84
84
|
storage.set('context.deviceId', 'stored-wins-over-the-seed');
|
|
85
|
-
ctx.expect(await ctx.
|
|
85
|
+
ctx.expect(await ctx.omega.context._resolveDeviceId()).toBe('stored-wins-over-the-seed');
|
|
86
86
|
} finally {
|
|
87
87
|
if (saved) storage.set('context.deviceId', saved);
|
|
88
88
|
else storage.delete('context.deviceId');
|
|
@@ -93,38 +93,38 @@ module.exports = defineCases({
|
|
|
93
93
|
name: 'client.platform is set (matches os.platform())',
|
|
94
94
|
run: (ctx) => {
|
|
95
95
|
const expected = require('os').platform();
|
|
96
|
-
ctx.expect(ctx.
|
|
96
|
+
ctx.expect(ctx.omega.context.client.platform).toBe(expected);
|
|
97
97
|
},
|
|
98
98
|
},
|
|
99
99
|
{
|
|
100
100
|
name: 'client.arch is set',
|
|
101
101
|
run: (ctx) => {
|
|
102
|
-
ctx.expect(typeof ctx.
|
|
103
|
-
ctx.expect(ctx.
|
|
102
|
+
ctx.expect(typeof ctx.omega.context.client.arch).toBe('string');
|
|
103
|
+
ctx.expect(ctx.omega.context.client.arch.length > 0).toBe(true);
|
|
104
104
|
},
|
|
105
105
|
},
|
|
106
106
|
{
|
|
107
107
|
name: 'client.mobile is false on desktop',
|
|
108
108
|
run: (ctx) => {
|
|
109
|
-
ctx.expect(ctx.
|
|
109
|
+
ctx.expect(ctx.omega.context.client.mobile).toBe(false);
|
|
110
110
|
},
|
|
111
111
|
},
|
|
112
112
|
{
|
|
113
|
-
name: 'app.environment matches
|
|
113
|
+
name: 'app.environment matches omega.getEnvironment()',
|
|
114
114
|
run: (ctx) => {
|
|
115
|
-
ctx.expect(ctx.
|
|
115
|
+
ctx.expect(ctx.omega.context.app.environment).toBe(ctx.omega.getEnvironment());
|
|
116
116
|
},
|
|
117
117
|
},
|
|
118
118
|
{
|
|
119
|
-
name: 'app.version matches
|
|
119
|
+
name: 'app.version matches omega.getVersion()',
|
|
120
120
|
run: (ctx) => {
|
|
121
|
-
ctx.expect(ctx.
|
|
121
|
+
ctx.expect(ctx.omega.context.app.version).toBe(ctx.omega.getVersion());
|
|
122
122
|
},
|
|
123
123
|
},
|
|
124
124
|
{
|
|
125
125
|
name: 'toJSON returns plain JSON snapshot (structured-cloneable)',
|
|
126
126
|
run: (ctx) => {
|
|
127
|
-
const snap = ctx.
|
|
127
|
+
const snap = ctx.omega.context.toJSON();
|
|
128
128
|
ctx.expect(snap.geolocation).toBeDefined();
|
|
129
129
|
ctx.expect(snap.client).toBeDefined();
|
|
130
130
|
ctx.expect(snap.session).toBeDefined();
|
|
@@ -137,7 +137,7 @@ module.exports = defineCases({
|
|
|
137
137
|
{
|
|
138
138
|
name: '_readFirstMac returns null or a MAC-shaped string',
|
|
139
139
|
run: (ctx) => {
|
|
140
|
-
const mac = ctx.
|
|
140
|
+
const mac = ctx.omega.context._readFirstMac();
|
|
141
141
|
if (mac !== null) {
|
|
142
142
|
ctx.expect(mac).toMatch(/^[0-9a-f]{2}(:[0-9a-f]{2}){5}$/i);
|
|
143
143
|
}
|
|
@@ -146,9 +146,9 @@ module.exports = defineCases({
|
|
|
146
146
|
{
|
|
147
147
|
name: 'IPC handler desktop:context:get returns the snapshot',
|
|
148
148
|
run: async (ctx) => {
|
|
149
|
-
const snap = await ctx.
|
|
150
|
-
ctx.expect(snap.session.id).toBe(ctx.
|
|
151
|
-
ctx.expect(snap.client.platform).toBe(ctx.
|
|
149
|
+
const snap = await ctx.omega.ipc.invoke('desktop:context:get');
|
|
150
|
+
ctx.expect(snap.session.id).toBe(ctx.omega.context.session.id);
|
|
151
|
+
ctx.expect(snap.client.platform).toBe(ctx.omega.context.client.platform);
|
|
152
152
|
},
|
|
153
153
|
},
|
|
154
154
|
],
|