@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
|
@@ -6,7 +6,7 @@ const { v5: uuidv5 } = require('uuid');
|
|
|
6
6
|
const defineCases = require('../../../vendor/devkit/test/define-cases.js');
|
|
7
7
|
|
|
8
8
|
async function reinit(ctx, env, configOverrides) {
|
|
9
|
-
ctx.
|
|
9
|
+
ctx.omega.analytics.shutdown();
|
|
10
10
|
const saved = {
|
|
11
11
|
GOOGLE_ANALYTICS_SECRET: process.env.GOOGLE_ANALYTICS_SECRET,
|
|
12
12
|
};
|
|
@@ -14,19 +14,19 @@ async function reinit(ctx, env, configOverrides) {
|
|
|
14
14
|
if (v == null) delete process.env[k];
|
|
15
15
|
else process.env[k] = v;
|
|
16
16
|
}
|
|
17
|
-
const cfgOrig = ctx.
|
|
17
|
+
const cfgOrig = ctx.omega.config.analytics;
|
|
18
18
|
if (configOverrides !== undefined) {
|
|
19
|
-
ctx.
|
|
19
|
+
ctx.omega.config.analytics = configOverrides;
|
|
20
20
|
}
|
|
21
|
-
ctx.
|
|
21
|
+
ctx.omega.analytics.initialize(ctx.omega);
|
|
22
22
|
return () => {
|
|
23
|
-
ctx.
|
|
23
|
+
ctx.omega.analytics.shutdown();
|
|
24
24
|
for (const [k, v] of Object.entries(saved)) {
|
|
25
25
|
if (v == null) delete process.env[k];
|
|
26
26
|
else process.env[k] = v;
|
|
27
27
|
}
|
|
28
|
-
ctx.
|
|
29
|
-
ctx.
|
|
28
|
+
ctx.omega.config.analytics = cfgOrig;
|
|
29
|
+
ctx.omega.analytics.initialize(ctx.omega);
|
|
30
30
|
};
|
|
31
31
|
}
|
|
32
32
|
|
|
@@ -35,15 +35,15 @@ module.exports = defineCases({
|
|
|
35
35
|
layer: 'main',
|
|
36
36
|
description: 'analytics (main)',
|
|
37
37
|
cleanup: async (ctx) => {
|
|
38
|
-
ctx.
|
|
38
|
+
ctx.omega.analytics.shutdown();
|
|
39
39
|
delete process.env.GOOGLE_ANALYTICS_SECRET;
|
|
40
|
-
ctx.
|
|
40
|
+
ctx.omega.analytics.initialize(ctx.omega);
|
|
41
41
|
},
|
|
42
42
|
tests: [
|
|
43
43
|
{
|
|
44
|
-
name: 'analytics module wired on
|
|
44
|
+
name: 'analytics module wired on omega',
|
|
45
45
|
run: (ctx) => {
|
|
46
|
-
ctx.expect(ctx.
|
|
46
|
+
ctx.expect(ctx.omega.analytics).toBeDefined();
|
|
47
47
|
},
|
|
48
48
|
},
|
|
49
49
|
{
|
|
@@ -51,8 +51,8 @@ module.exports = defineCases({
|
|
|
51
51
|
run: async (ctx) => {
|
|
52
52
|
const restore = await reinit(ctx, {}, { enabled: false });
|
|
53
53
|
try {
|
|
54
|
-
ctx.expect(ctx.
|
|
55
|
-
ctx.expect(ctx.
|
|
54
|
+
ctx.expect(ctx.omega.analytics._enabled).toBe(false);
|
|
55
|
+
ctx.expect(ctx.omega.analytics._clientId).toBe(null);
|
|
56
56
|
} finally { await restore(); }
|
|
57
57
|
},
|
|
58
58
|
},
|
|
@@ -64,7 +64,7 @@ module.exports = defineCases({
|
|
|
64
64
|
providers: { google: { id: '' } },
|
|
65
65
|
});
|
|
66
66
|
try {
|
|
67
|
-
ctx.expect(ctx.
|
|
67
|
+
ctx.expect(ctx.omega.analytics._enabled).toBe(false);
|
|
68
68
|
} finally { await restore(); }
|
|
69
69
|
},
|
|
70
70
|
},
|
|
@@ -76,7 +76,7 @@ module.exports = defineCases({
|
|
|
76
76
|
providers: { google: { id: 'G-TESTID12' } },
|
|
77
77
|
});
|
|
78
78
|
try {
|
|
79
|
-
ctx.expect(ctx.
|
|
79
|
+
ctx.expect(ctx.omega.analytics._enabled).toBe(false);
|
|
80
80
|
} finally { await restore(); }
|
|
81
81
|
},
|
|
82
82
|
},
|
|
@@ -88,14 +88,14 @@ module.exports = defineCases({
|
|
|
88
88
|
providers: { google: { id: 'G-TESTID12' } },
|
|
89
89
|
});
|
|
90
90
|
try {
|
|
91
|
-
ctx.expect(ctx.
|
|
92
|
-
ctx.expect(typeof ctx.
|
|
93
|
-
ctx.expect(ctx.
|
|
91
|
+
ctx.expect(ctx.omega.analytics._enabled).toBe(true);
|
|
92
|
+
ctx.expect(typeof ctx.omega.analytics._clientId).toBe('string');
|
|
93
|
+
ctx.expect(ctx.omega.analytics._clientId.length).toBe(36);
|
|
94
94
|
// Confirm it's a stable derivation: same deviceId + same namespace should
|
|
95
95
|
// produce the same uuidv5 every time.
|
|
96
|
-
const ns = ctx.
|
|
97
|
-
const deviceId = ctx.
|
|
98
|
-
ctx.expect(ctx.
|
|
96
|
+
const ns = ctx.omega.analytics._namespace;
|
|
97
|
+
const deviceId = ctx.omega.context.session.deviceId;
|
|
98
|
+
ctx.expect(ctx.omega.analytics._clientId).toBe(uuidv5(deviceId, ns));
|
|
99
99
|
} finally { await restore(); }
|
|
100
100
|
},
|
|
101
101
|
},
|
|
@@ -105,24 +105,24 @@ module.exports = defineCases({
|
|
|
105
105
|
// launch a new GA client, so initialize raises instead of limping.
|
|
106
106
|
name: 'no context.session.deviceId: initialize raises (the boot-order invariant)',
|
|
107
107
|
run: async (ctx) => {
|
|
108
|
-
const savedDeviceId = ctx.
|
|
108
|
+
const savedDeviceId = ctx.omega.context.session.deviceId;
|
|
109
109
|
const savedSecret = process.env.GOOGLE_ANALYTICS_SECRET;
|
|
110
|
-
const savedConfig = ctx.
|
|
110
|
+
const savedConfig = ctx.omega.config.analytics;
|
|
111
111
|
|
|
112
|
-
ctx.
|
|
113
|
-
ctx.
|
|
112
|
+
ctx.omega.analytics.shutdown();
|
|
113
|
+
ctx.omega.context.session.deviceId = null;
|
|
114
114
|
process.env.GOOGLE_ANALYTICS_SECRET = 'fake-secret';
|
|
115
|
-
ctx.
|
|
115
|
+
ctx.omega.config.analytics = { enabled: true, providers: { google: { id: 'G-TESTID12' } } };
|
|
116
116
|
|
|
117
117
|
try {
|
|
118
|
-
await ctx.expect(() => ctx.
|
|
118
|
+
await ctx.expect(() => ctx.omega.analytics.initialize(ctx.omega)).toThrow(/boot sequence/);
|
|
119
119
|
} finally {
|
|
120
|
-
ctx.
|
|
121
|
-
ctx.
|
|
120
|
+
ctx.omega.context.session.deviceId = savedDeviceId;
|
|
121
|
+
ctx.omega.config.analytics = savedConfig;
|
|
122
122
|
if (savedSecret == null) delete process.env.GOOGLE_ANALYTICS_SECRET;
|
|
123
123
|
else process.env.GOOGLE_ANALYTICS_SECRET = savedSecret;
|
|
124
|
-
ctx.
|
|
125
|
-
ctx.
|
|
124
|
+
ctx.omega.analytics.shutdown();
|
|
125
|
+
ctx.omega.analytics.initialize(ctx.omega);
|
|
126
126
|
}
|
|
127
127
|
},
|
|
128
128
|
},
|
|
@@ -136,7 +136,7 @@ module.exports = defineCases({
|
|
|
136
136
|
providers: { google: { id: 'G-TESTID12' } },
|
|
137
137
|
});
|
|
138
138
|
try {
|
|
139
|
-
const a = ctx.
|
|
139
|
+
const a = ctx.omega.analytics;
|
|
140
140
|
const ns = a._namespace;
|
|
141
141
|
a.setUserId('firebase-uid-abc-123');
|
|
142
142
|
const expected = uuidv5('firebase-uid-abc-123', ns);
|
|
@@ -153,7 +153,7 @@ module.exports = defineCases({
|
|
|
153
153
|
run: async (ctx) => {
|
|
154
154
|
// Hand-rolled (not reinit()): the helper's leading shutdown() would
|
|
155
155
|
// wipe the very _pendingUid this test plants.
|
|
156
|
-
const a = ctx.
|
|
156
|
+
const a = ctx.omega.analytics;
|
|
157
157
|
a.shutdown(); // _namespace null — the pre-init state
|
|
158
158
|
|
|
159
159
|
a.setUserId('early-uid-before-boot');
|
|
@@ -161,18 +161,18 @@ module.exports = defineCases({
|
|
|
161
161
|
|
|
162
162
|
const savedSecret = process.env.GOOGLE_ANALYTICS_SECRET;
|
|
163
163
|
process.env.GOOGLE_ANALYTICS_SECRET = 'fake-secret';
|
|
164
|
-
const cfgOrig = ctx.
|
|
165
|
-
ctx.
|
|
164
|
+
const cfgOrig = ctx.omega.config.analytics;
|
|
165
|
+
ctx.omega.config.analytics = { enabled: true, providers: { google: { id: 'G-TESTID12' } } };
|
|
166
166
|
try {
|
|
167
|
-
a.initialize(ctx.
|
|
167
|
+
a.initialize(ctx.omega);
|
|
168
168
|
ctx.expect(a._pendingUid).toBe(null);
|
|
169
169
|
ctx.expect(a._userId).toBe(uuidv5('early-uid-before-boot', a._namespace));
|
|
170
170
|
} finally {
|
|
171
171
|
a.shutdown();
|
|
172
172
|
if (savedSecret == null) delete process.env.GOOGLE_ANALYTICS_SECRET;
|
|
173
173
|
else process.env.GOOGLE_ANALYTICS_SECRET = savedSecret;
|
|
174
|
-
ctx.
|
|
175
|
-
a.initialize(ctx.
|
|
174
|
+
ctx.omega.config.analytics = cfgOrig;
|
|
175
|
+
a.initialize(ctx.omega);
|
|
176
176
|
}
|
|
177
177
|
},
|
|
178
178
|
},
|
|
@@ -184,10 +184,10 @@ module.exports = defineCases({
|
|
|
184
184
|
providers: { google: { id: 'G-TESTID12' } },
|
|
185
185
|
});
|
|
186
186
|
try {
|
|
187
|
-
ctx.
|
|
188
|
-
ctx.expect(ctx.
|
|
189
|
-
ctx.
|
|
190
|
-
ctx.expect(ctx.
|
|
187
|
+
ctx.omega.analytics.setUserId('some-uid');
|
|
188
|
+
ctx.expect(ctx.omega.analytics._userId).not.toBe(null);
|
|
189
|
+
ctx.omega.analytics.setUserId(null);
|
|
190
|
+
ctx.expect(ctx.omega.analytics._userId).toBe(null);
|
|
191
191
|
} finally { await restore(); }
|
|
192
192
|
},
|
|
193
193
|
},
|
|
@@ -203,7 +203,7 @@ module.exports = defineCases({
|
|
|
203
203
|
providers: { google: { id: 'G-TESTID12' } },
|
|
204
204
|
});
|
|
205
205
|
|
|
206
|
-
const a = ctx.
|
|
206
|
+
const a = ctx.omega.analytics;
|
|
207
207
|
const origSend = a._send;
|
|
208
208
|
const sent = [];
|
|
209
209
|
a._send = (descriptor) => { sent.push(descriptor); return true; };
|
|
@@ -230,7 +230,7 @@ module.exports = defineCases({
|
|
|
230
230
|
{
|
|
231
231
|
name: '_enrichParams adds session_id + engagement_time_msec',
|
|
232
232
|
run: (ctx) => {
|
|
233
|
-
const params = ctx.
|
|
233
|
+
const params = ctx.omega.analytics._enrichParams({ custom: 'value' });
|
|
234
234
|
ctx.expect(params.custom).toBe('value');
|
|
235
235
|
ctx.expect(typeof params.session_id).toBe('string');
|
|
236
236
|
ctx.expect(typeof params.engagement_time_msec).toBe('number');
|
|
@@ -245,7 +245,7 @@ module.exports = defineCases({
|
|
|
245
245
|
const restore = await reinit(ctx, {}, { enabled: false });
|
|
246
246
|
try {
|
|
247
247
|
// Should not throw.
|
|
248
|
-
ctx.
|
|
248
|
+
ctx.omega.analytics.event('app_launch', { x: 1 });
|
|
249
249
|
ctx.expect(true).toBe(true);
|
|
250
250
|
} finally { await restore(); }
|
|
251
251
|
},
|
|
@@ -253,28 +253,28 @@ module.exports = defineCases({
|
|
|
253
253
|
{
|
|
254
254
|
name: 'event() before init queues, queue is bounded',
|
|
255
255
|
run: (ctx) => {
|
|
256
|
-
const a = ctx.
|
|
256
|
+
const a = ctx.omega.analytics;
|
|
257
257
|
a.shutdown(); // back to uninitialized state
|
|
258
258
|
a.event('queued_one');
|
|
259
259
|
a.event('queued_two');
|
|
260
260
|
ctx.expect(a._queue.length).toBe(2);
|
|
261
|
-
ctx.
|
|
261
|
+
ctx.omega.analytics.initialize(ctx.omega); // restore for downstream tests
|
|
262
262
|
},
|
|
263
263
|
},
|
|
264
264
|
{
|
|
265
265
|
name: 'queue flushes on init',
|
|
266
266
|
run: async (ctx) => {
|
|
267
267
|
// Force a "before init" state with a couple of queued items.
|
|
268
|
-
ctx.
|
|
269
|
-
ctx.
|
|
270
|
-
ctx.
|
|
268
|
+
ctx.omega.analytics.shutdown();
|
|
269
|
+
ctx.omega.analytics._queue.push({ name: 'x', params: {} });
|
|
270
|
+
ctx.omega.analytics._queue.push({ name: 'y', params: {} });
|
|
271
271
|
const restore = await reinit(ctx, { GOOGLE_ANALYTICS_SECRET: 'fake-secret' }, {
|
|
272
272
|
enabled: true,
|
|
273
273
|
providers: { google: { id: 'G-TESTID12' } },
|
|
274
274
|
});
|
|
275
275
|
try {
|
|
276
276
|
// After init, queue should be drained.
|
|
277
|
-
ctx.expect(ctx.
|
|
277
|
+
ctx.expect(ctx.omega.analytics._queue.length).toBe(0);
|
|
278
278
|
} finally { await restore(); }
|
|
279
279
|
},
|
|
280
280
|
},
|
|
@@ -286,7 +286,7 @@ module.exports = defineCases({
|
|
|
286
286
|
providers: { google: { id: 'G-TESTID12' } },
|
|
287
287
|
});
|
|
288
288
|
try {
|
|
289
|
-
const a = ctx.
|
|
289
|
+
const a = ctx.omega.analytics;
|
|
290
290
|
// Simulate auth bridge firing.
|
|
291
291
|
a._handleAuthChange({ uid: 'user-123' });
|
|
292
292
|
ctx.expect(a._userId).not.toBe(null);
|
|
@@ -304,9 +304,9 @@ module.exports = defineCases({
|
|
|
304
304
|
providers: { google: { id: 'G-TESTID12' } },
|
|
305
305
|
});
|
|
306
306
|
try {
|
|
307
|
-
ctx.
|
|
308
|
-
ctx.expect(ctx.
|
|
309
|
-
ctx.expect(ctx.
|
|
307
|
+
ctx.omega.analytics.setUserProperties({ plan: 'premium', custom_flag: true });
|
|
308
|
+
ctx.expect(ctx.omega.analytics._userProperties.plan).toEqual({ value: 'premium' });
|
|
309
|
+
ctx.expect(ctx.omega.analytics._userProperties.custom_flag).toEqual({ value: true });
|
|
310
310
|
} finally { await restore(); }
|
|
311
311
|
},
|
|
312
312
|
},
|
|
@@ -318,7 +318,7 @@ module.exports = defineCases({
|
|
|
318
318
|
providers: { google: { id: 'G-TESTID12' } },
|
|
319
319
|
});
|
|
320
320
|
try {
|
|
321
|
-
const snap = await ctx.
|
|
321
|
+
const snap = await ctx.omega.ipc.invoke('desktop:analytics:status');
|
|
322
322
|
ctx.expect(snap.enabled).toBe(true);
|
|
323
323
|
ctx.expect(snap.measurementId).toBe('G-TESTID12');
|
|
324
324
|
} finally { await restore(); }
|
|
@@ -327,13 +327,13 @@ module.exports = defineCases({
|
|
|
327
327
|
{
|
|
328
328
|
name: 'IPC listener desktop:analytics:event routes to analytics.event',
|
|
329
329
|
run: async (ctx) => {
|
|
330
|
-
const a = ctx.
|
|
330
|
+
const a = ctx.omega.analytics;
|
|
331
331
|
const origEvent = a.event;
|
|
332
332
|
let captured = null;
|
|
333
333
|
a.event = (name, params) => { captured = { name, params }; };
|
|
334
334
|
try {
|
|
335
335
|
// Simulate an inbound IPC call (renderer would do ipcRenderer.send).
|
|
336
|
-
const listeners = ctx.
|
|
336
|
+
const listeners = ctx.omega.ipc._listeners?.['desktop:analytics:event'];
|
|
337
337
|
ctx.expect(listeners).toBeDefined();
|
|
338
338
|
listeners.forEach((fn) => fn({ name: 'rendererEvent', params: { x: 1 } }));
|
|
339
339
|
ctx.expect(captured).toEqual({ name: 'rendererEvent', params: { x: 1 } });
|
|
@@ -348,7 +348,7 @@ module.exports = defineCases({
|
|
|
348
348
|
providers: { google: { id: 'G-TESTID12' } },
|
|
349
349
|
});
|
|
350
350
|
try {
|
|
351
|
-
const j = ctx.
|
|
351
|
+
const j = ctx.omega.analytics.toJSON();
|
|
352
352
|
ctx.expect(j.enabled).toBe(true);
|
|
353
353
|
ctx.expect(j.measurementId).toBe('G-TESTID12');
|
|
354
354
|
ctx.expect(typeof j.clientId).toBe('string');
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Main-process tests for lib/app-state.js — storage-backed launch flags + crash sentinel.
|
|
2
2
|
//
|
|
3
|
-
// The harness already booted
|
|
3
|
+
// The harness already booted omega once, which incremented launchCount and seeded
|
|
4
4
|
// state. We test by calling appState.reset() then re-initializing with crafted
|
|
5
5
|
// storage state to simulate first-launch / repeat-launch / crash-recovery / upgrade.
|
|
6
6
|
|
|
@@ -14,60 +14,60 @@ module.exports = defineCases({
|
|
|
14
14
|
description: 'app-state (main)',
|
|
15
15
|
cleanup: async (ctx) => {
|
|
16
16
|
// Restore a sane state for any later suites that look at appState.
|
|
17
|
-
ctx.
|
|
17
|
+
ctx.omega.appState.reset();
|
|
18
18
|
// Mark _initialized=false so we can re-init cleanly.
|
|
19
|
-
ctx.
|
|
20
|
-
await ctx.
|
|
19
|
+
ctx.omega.appState._initialized = false;
|
|
20
|
+
await ctx.omega.appState.initialize(ctx.omega);
|
|
21
21
|
},
|
|
22
22
|
tests: [
|
|
23
23
|
{
|
|
24
24
|
name: 'initialize ran during boot',
|
|
25
25
|
run: (ctx) => {
|
|
26
|
-
ctx.expect(ctx.
|
|
26
|
+
ctx.expect(ctx.omega.appState._initialized).toBe(true);
|
|
27
27
|
},
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
30
|
name: 'first launch: flags + counters seeded correctly',
|
|
31
31
|
run: async (ctx) => {
|
|
32
|
-
ctx.
|
|
33
|
-
ctx.
|
|
34
|
-
await ctx.
|
|
35
|
-
|
|
36
|
-
ctx.expect(ctx.
|
|
37
|
-
ctx.expect(ctx.
|
|
38
|
-
ctx.expect(ctx.
|
|
39
|
-
ctx.expect(ctx.
|
|
40
|
-
ctx.expect(ctx.
|
|
32
|
+
ctx.omega.appState.reset();
|
|
33
|
+
ctx.omega.appState._initialized = false;
|
|
34
|
+
await ctx.omega.appState.initialize(ctx.omega);
|
|
35
|
+
|
|
36
|
+
ctx.expect(ctx.omega.appState.isFirstLaunch()).toBe(true);
|
|
37
|
+
ctx.expect(ctx.omega.appState.getLaunchCount()).toBe(1);
|
|
38
|
+
ctx.expect(ctx.omega.appState.getInstalledAt()).toBeInstanceOf(Date);
|
|
39
|
+
ctx.expect(ctx.omega.appState.getLastLaunchAt()).toBeNull();
|
|
40
|
+
ctx.expect(ctx.omega.appState.recoveredFromCrash()).toBe(false);
|
|
41
41
|
},
|
|
42
42
|
},
|
|
43
43
|
{
|
|
44
44
|
name: 'second launch: not first, count incremented, lastLaunchAt populated',
|
|
45
45
|
run: async (ctx) => {
|
|
46
|
-
ctx.
|
|
47
|
-
ctx.
|
|
48
|
-
await ctx.
|
|
46
|
+
ctx.omega.appState.reset();
|
|
47
|
+
ctx.omega.appState._initialized = false;
|
|
48
|
+
await ctx.omega.appState.initialize(ctx.omega);
|
|
49
49
|
|
|
50
50
|
// Simulate a graceful quit from the first launch.
|
|
51
|
-
const after1 = ctx.
|
|
51
|
+
const after1 = ctx.omega.storage.get(STORAGE_KEY);
|
|
52
52
|
after1.sentinel = false;
|
|
53
53
|
after1.lastQuitAt = Date.now();
|
|
54
|
-
ctx.
|
|
54
|
+
ctx.omega.storage.set(STORAGE_KEY, after1);
|
|
55
55
|
|
|
56
56
|
// Boot again.
|
|
57
|
-
ctx.
|
|
58
|
-
await ctx.
|
|
57
|
+
ctx.omega.appState._initialized = false;
|
|
58
|
+
await ctx.omega.appState.initialize(ctx.omega);
|
|
59
59
|
|
|
60
|
-
ctx.expect(ctx.
|
|
61
|
-
ctx.expect(ctx.
|
|
62
|
-
ctx.expect(ctx.
|
|
63
|
-
ctx.expect(ctx.
|
|
60
|
+
ctx.expect(ctx.omega.appState.isFirstLaunch()).toBe(false);
|
|
61
|
+
ctx.expect(ctx.omega.appState.getLaunchCount()).toBe(2);
|
|
62
|
+
ctx.expect(ctx.omega.appState.getLastLaunchAt()).toBeInstanceOf(Date);
|
|
63
|
+
ctx.expect(ctx.omega.appState.recoveredFromCrash()).toBe(false);
|
|
64
64
|
},
|
|
65
65
|
},
|
|
66
66
|
{
|
|
67
67
|
name: 'crash detection: previous launch left sentinel and no quit timestamp',
|
|
68
68
|
run: async (ctx) => {
|
|
69
69
|
// Seed storage with a "we were running and never gracefully quit" state.
|
|
70
|
-
ctx.
|
|
70
|
+
ctx.omega.storage.set(STORAGE_KEY, {
|
|
71
71
|
installedAt: Date.now() - 10000,
|
|
72
72
|
launchCount: 3,
|
|
73
73
|
lastLaunchAt: Date.now() - 1000,
|
|
@@ -76,17 +76,17 @@ module.exports = defineCases({
|
|
|
76
76
|
version: '1.0.0',
|
|
77
77
|
});
|
|
78
78
|
|
|
79
|
-
ctx.
|
|
80
|
-
await ctx.
|
|
79
|
+
ctx.omega.appState._initialized = false;
|
|
80
|
+
await ctx.omega.appState.initialize(ctx.omega);
|
|
81
81
|
|
|
82
|
-
ctx.expect(ctx.
|
|
83
|
-
ctx.expect(ctx.
|
|
82
|
+
ctx.expect(ctx.omega.appState.recoveredFromCrash()).toBe(true);
|
|
83
|
+
ctx.expect(ctx.omega.appState.getLaunchCount()).toBe(4);
|
|
84
84
|
},
|
|
85
85
|
},
|
|
86
86
|
{
|
|
87
87
|
name: 'graceful quit: sentinel cleared on next boot, no crash flag',
|
|
88
88
|
run: async (ctx) => {
|
|
89
|
-
ctx.
|
|
89
|
+
ctx.omega.storage.set(STORAGE_KEY, {
|
|
90
90
|
installedAt: Date.now() - 10000,
|
|
91
91
|
launchCount: 5,
|
|
92
92
|
lastLaunchAt: Date.now() - 1000,
|
|
@@ -95,17 +95,17 @@ module.exports = defineCases({
|
|
|
95
95
|
version: '1.0.0',
|
|
96
96
|
});
|
|
97
97
|
|
|
98
|
-
ctx.
|
|
99
|
-
await ctx.
|
|
98
|
+
ctx.omega.appState._initialized = false;
|
|
99
|
+
await ctx.omega.appState.initialize(ctx.omega);
|
|
100
100
|
|
|
101
|
-
ctx.expect(ctx.
|
|
102
|
-
ctx.expect(ctx.
|
|
101
|
+
ctx.expect(ctx.omega.appState.recoveredFromCrash()).toBe(false);
|
|
102
|
+
ctx.expect(ctx.omega.appState.getLaunchCount()).toBe(6);
|
|
103
103
|
},
|
|
104
104
|
},
|
|
105
105
|
{
|
|
106
106
|
name: 'version upgrade: previousVersion populated when version changes',
|
|
107
107
|
run: async (ctx) => {
|
|
108
|
-
ctx.
|
|
108
|
+
ctx.omega.storage.set(STORAGE_KEY, {
|
|
109
109
|
installedAt: Date.now() - 10000,
|
|
110
110
|
launchCount: 10,
|
|
111
111
|
lastLaunchAt: Date.now() - 1000,
|
|
@@ -114,19 +114,19 @@ module.exports = defineCases({
|
|
|
114
114
|
version: '0.9.0', // previous version
|
|
115
115
|
});
|
|
116
116
|
|
|
117
|
-
// Force the
|
|
118
|
-
const origConfig = ctx.
|
|
119
|
-
ctx.
|
|
117
|
+
// Force the omega instance's reported version to differ.
|
|
118
|
+
const origConfig = ctx.omega.config.app;
|
|
119
|
+
ctx.omega.config.app = { ...origConfig, version: '1.0.0' };
|
|
120
120
|
|
|
121
121
|
try {
|
|
122
|
-
ctx.
|
|
123
|
-
await ctx.
|
|
122
|
+
ctx.omega.appState._initialized = false;
|
|
123
|
+
await ctx.omega.appState.initialize(ctx.omega);
|
|
124
124
|
|
|
125
|
-
ctx.expect(ctx.
|
|
126
|
-
ctx.expect(ctx.
|
|
127
|
-
ctx.expect(ctx.
|
|
125
|
+
ctx.expect(ctx.omega.appState.getVersion()).toBe('1.0.0');
|
|
126
|
+
ctx.expect(ctx.omega.appState.getPreviousVersion()).toBe('0.9.0');
|
|
127
|
+
ctx.expect(ctx.omega.appState.wasUpgraded()).toBe(true);
|
|
128
128
|
} finally {
|
|
129
|
-
ctx.
|
|
129
|
+
ctx.omega.config.app = origConfig;
|
|
130
130
|
}
|
|
131
131
|
},
|
|
132
132
|
},
|
|
@@ -134,7 +134,7 @@ module.exports = defineCases({
|
|
|
134
134
|
name: 'no version change: wasUpgraded false, previousVersion preserved',
|
|
135
135
|
run: async (ctx) => {
|
|
136
136
|
// Seed with a previousVersion that should NOT be overwritten when version doesn't change.
|
|
137
|
-
ctx.
|
|
137
|
+
ctx.omega.storage.set(STORAGE_KEY, {
|
|
138
138
|
installedAt: Date.now() - 10000,
|
|
139
139
|
launchCount: 20,
|
|
140
140
|
lastLaunchAt: Date.now() - 1000,
|
|
@@ -144,53 +144,53 @@ module.exports = defineCases({
|
|
|
144
144
|
previousVersion: '0.9.0',
|
|
145
145
|
});
|
|
146
146
|
|
|
147
|
-
const origConfig = ctx.
|
|
148
|
-
ctx.
|
|
147
|
+
const origConfig = ctx.omega.config.app;
|
|
148
|
+
ctx.omega.config.app = { ...origConfig, version: '1.0.0' };
|
|
149
149
|
|
|
150
150
|
try {
|
|
151
|
-
ctx.
|
|
152
|
-
await ctx.
|
|
151
|
+
ctx.omega.appState._initialized = false;
|
|
152
|
+
await ctx.omega.appState.initialize(ctx.omega);
|
|
153
153
|
|
|
154
|
-
ctx.expect(ctx.
|
|
154
|
+
ctx.expect(ctx.omega.appState.wasUpgraded()).toBe(false);
|
|
155
155
|
// Should preserve the historical previousVersion rather than nuking it.
|
|
156
|
-
ctx.expect(ctx.
|
|
156
|
+
ctx.expect(ctx.omega.appState.getPreviousVersion()).toBe('0.9.0');
|
|
157
157
|
} finally {
|
|
158
|
-
ctx.
|
|
158
|
+
ctx.omega.config.app = origConfig;
|
|
159
159
|
}
|
|
160
160
|
},
|
|
161
161
|
},
|
|
162
162
|
{
|
|
163
163
|
name: 'launchedFromDeepLink: defaults false, set/cleared via setter',
|
|
164
164
|
run: (ctx) => {
|
|
165
|
-
ctx.expect(ctx.
|
|
166
|
-
ctx.
|
|
167
|
-
ctx.expect(ctx.
|
|
168
|
-
ctx.
|
|
169
|
-
ctx.expect(ctx.
|
|
165
|
+
ctx.expect(ctx.omega.appState.launchedFromDeepLink()).toBe(false);
|
|
166
|
+
ctx.omega.appState.setLaunchedFromDeepLink(true);
|
|
167
|
+
ctx.expect(ctx.omega.appState.launchedFromDeepLink()).toBe(true);
|
|
168
|
+
ctx.omega.appState.setLaunchedFromDeepLink(false);
|
|
169
|
+
ctx.expect(ctx.omega.appState.launchedFromDeepLink()).toBe(false);
|
|
170
170
|
},
|
|
171
171
|
},
|
|
172
172
|
{
|
|
173
173
|
name: 'launchedAtLogin returns a boolean',
|
|
174
174
|
run: (ctx) => {
|
|
175
|
-
ctx.expect(typeof ctx.
|
|
175
|
+
ctx.expect(typeof ctx.omega.appState.launchedAtLogin()).toBe('boolean');
|
|
176
176
|
},
|
|
177
177
|
},
|
|
178
178
|
{
|
|
179
179
|
name: 'getLastQuitAt reads live storage (returns null when sentinel is active)',
|
|
180
180
|
run: async (ctx) => {
|
|
181
|
-
ctx.
|
|
182
|
-
ctx.
|
|
183
|
-
await ctx.
|
|
181
|
+
ctx.omega.appState.reset();
|
|
182
|
+
ctx.omega.appState._initialized = false;
|
|
183
|
+
await ctx.omega.appState.initialize(ctx.omega);
|
|
184
184
|
// After init, sentinel=true and lastQuitAt=null.
|
|
185
|
-
ctx.expect(ctx.
|
|
185
|
+
ctx.expect(ctx.omega.appState.getLastQuitAt()).toBeNull();
|
|
186
186
|
},
|
|
187
187
|
},
|
|
188
188
|
{
|
|
189
189
|
name: 'reset() wipes persisted state',
|
|
190
190
|
run: (ctx) => {
|
|
191
|
-
ctx.expect(ctx.
|
|
192
|
-
ctx.
|
|
193
|
-
ctx.expect(ctx.
|
|
191
|
+
ctx.expect(ctx.omega.storage.has(STORAGE_KEY)).toBe(true);
|
|
192
|
+
ctx.omega.appState.reset();
|
|
193
|
+
ctx.expect(ctx.omega.storage.has(STORAGE_KEY)).toBe(false);
|
|
194
194
|
},
|
|
195
195
|
},
|
|
196
196
|
],
|