@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.
Files changed (273) hide show
  1. package/README.md +17 -12
  2. package/dist/assets/css/core/_initialize.scss +1 -1
  3. package/dist/assets/js/core/app-shell.js +14 -15
  4. package/dist/assets/themes/_template/_theme.js +6 -6
  5. package/dist/assets/themes/base/_includes/global/sections/account.html +4 -4
  6. package/dist/assets/themes/base/_includes/global/sections/app-sidebar.html +5 -5
  7. package/dist/assets/themes/base/_layouts/frontend/pages/account/index.html +3 -3
  8. package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/index.html +1 -1
  9. package/dist/assets/themes/base/_layouts/frontend/pages/blog/tags/tag.html +1 -1
  10. package/dist/assets/themes/base/_layouts/frontend/pages/payment/confirmation.html +1 -1
  11. package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.js +2 -3
  12. package/dist/assets/themes/base/_sections/verts/unit/section.html +1 -1
  13. package/dist/assets/themes/base/_sections/verts/unit/section.js +3 -4
  14. package/dist/assets/themes/base/_theme.js +4 -3
  15. package/dist/assets/themes/bootstrap/_theme.js +2 -2
  16. package/dist/assets/themes/bootstrap/overrides/_links.scss +1 -1
  17. package/dist/assets/themes/classy/_theme.js +8 -6
  18. package/dist/assets/themes/classy/css/marketing/_sections.scss +1 -2
  19. package/dist/assets/themes/classy/js/hero-demo-form.js +3 -2
  20. package/dist/assets/themes/neobrutalism/_theme.js +5 -5
  21. package/dist/assets/themes/neobrutalism/js/pages/test/libraries/layers/index.js +1 -1
  22. package/dist/assets/themes/newsflash/_theme.js +6 -6
  23. package/dist/assets/themes/newsflash/js/pages/test/libraries/layers/index.js +1 -1
  24. package/dist/build.js +87 -111
  25. package/dist/cli.js +1 -1
  26. package/dist/commands/build.js +2 -2
  27. package/dist/commands/cdp/capture.js +2 -2
  28. package/dist/commands/cdp/quit.js +2 -2
  29. package/dist/commands/cdp/relaunch.js +2 -2
  30. package/dist/commands/cdp/theme.js +1 -1
  31. package/dist/commands/clean.js +2 -2
  32. package/dist/commands/deploy.js +4 -4
  33. package/dist/commands/finalize-release.js +4 -4
  34. package/dist/commands/install.js +3 -3
  35. package/dist/commands/launch.js +2 -2
  36. package/dist/commands/lib/deploy-precheck.js +3 -3
  37. package/dist/commands/lib/ensure-target.js +6 -6
  38. package/dist/commands/package.js +2 -2
  39. package/dist/commands/publish.js +2 -2
  40. package/dist/commands/release.js +3 -3
  41. package/dist/commands/runner.js +11 -11
  42. package/dist/commands/sign-windows.js +5 -5
  43. package/dist/commands/test.js +4 -4
  44. package/dist/commands/update.js +2 -2
  45. package/dist/commands/validate-certs.js +4 -4
  46. package/dist/commands/version.js +3 -3
  47. package/dist/defaults/AGENTS.md +17 -8
  48. package/dist/defaults/config/omega.json5 +7 -7
  49. package/dist/defaults/hooks/build/post.js +1 -1
  50. package/dist/defaults/hooks/build/pre.js +1 -1
  51. package/dist/defaults/hooks/deploy/pre.js +1 -1
  52. package/dist/defaults/hooks/release/post.js +1 -1
  53. package/dist/defaults/hooks/release/pre.js +1 -1
  54. package/dist/defaults/src/assets/js/components/about/index.js +3 -5
  55. package/dist/defaults/src/assets/js/components/main/index.js +3 -5
  56. package/dist/defaults/src/assets/js/components/settings/index.js +3 -5
  57. package/dist/defaults/src/integrations/context-menu/index.js +2 -2
  58. package/dist/defaults/src/integrations/menu/index.js +3 -3
  59. package/dist/defaults/src/integrations/tray/index.js +3 -3
  60. package/dist/defaults/src/main.js +3 -5
  61. package/dist/defaults/src/preload.js +3 -5
  62. package/dist/defaults/test/README.md +2 -2
  63. package/dist/gulp/main.js +9 -10
  64. package/dist/gulp/tasks/audit.js +7 -7
  65. package/dist/gulp/tasks/build-config.js +8 -8
  66. package/dist/gulp/tasks/bundle.js +16 -16
  67. package/dist/gulp/tasks/defaults.js +3 -3
  68. package/dist/gulp/tasks/distribute.js +2 -2
  69. package/dist/gulp/tasks/html.js +9 -9
  70. package/dist/gulp/tasks/package-quick.js +3 -3
  71. package/dist/gulp/tasks/package.js +3 -3
  72. package/dist/gulp/tasks/release.js +3 -3
  73. package/dist/gulp/tasks/sass.js +6 -6
  74. package/dist/gulp/tasks/serve.js +4 -4
  75. package/dist/hooks/notarize-artifacts.js +1 -1
  76. package/dist/hooks/notarize.js +1 -1
  77. package/dist/index.js +5 -8
  78. package/dist/lib/_environment-mixin.js +50 -0
  79. package/dist/lib/_lifecycle-mixin.js +45 -0
  80. package/dist/lib/analytics.js +33 -35
  81. package/dist/lib/app-state.js +14 -14
  82. package/dist/lib/auth-flow.js +18 -18
  83. package/dist/lib/auth-persistence.js +12 -12
  84. package/dist/lib/auth.js +421 -0
  85. package/dist/lib/auto-updater.js +49 -49
  86. package/dist/lib/context-menu.js +13 -13
  87. package/dist/lib/context.js +19 -19
  88. package/dist/lib/deep-link.js +34 -34
  89. package/dist/lib/fontawesome.js +5 -5
  90. package/dist/lib/ipc.js +4 -4
  91. package/dist/lib/menu.js +25 -25
  92. package/dist/lib/protocol.js +5 -5
  93. package/dist/lib/remote-config.js +22 -22
  94. package/dist/lib/remote-scripts.js +21 -21
  95. package/dist/lib/restart-manager/index.js +28 -28
  96. package/dist/lib/sign-helpers/exec-with-limit.js +1 -1
  97. package/dist/lib/sign-helpers/sign-events.js +1 -1
  98. package/dist/lib/startup.js +18 -13
  99. package/dist/lib/storage.js +10 -10
  100. package/dist/lib/templating.js +16 -16
  101. package/dist/lib/theme.js +10 -10
  102. package/dist/lib/tray.js +27 -27
  103. package/dist/lib/usage.js +11 -11
  104. package/dist/lib/window-manager.js +26 -26
  105. package/dist/main.js +398 -483
  106. package/dist/preload.js +236 -176
  107. package/dist/renderer.js +417 -391
  108. package/dist/test/fixtures/consumer-app/config/omega.json5 +1 -1
  109. package/dist/test/fixtures/consumer-app/src/assets/js/components/main/index.js +8 -11
  110. package/dist/test/fixtures/consumer-app/src/main.js +5 -7
  111. package/dist/test/fixtures/consumer-app/src/preload.js +2 -2
  112. package/dist/test/harness/boot-entry.js +22 -20
  113. package/dist/test/harness/main-entry.js +31 -30
  114. package/dist/test/harness/renderer-entry.js +5 -5
  115. package/dist/test/harness/renderer-preload.js +137 -141
  116. package/dist/test/index.js +10 -10
  117. package/dist/test/runner.js +2 -2
  118. package/dist/test/runners/boot.js +7 -6
  119. package/dist/test/runners/electron.js +3 -2
  120. package/dist/test/runners/render-event.js +2 -2
  121. package/dist/test/suites/boot/consumer-app-boots.test.js +57 -26
  122. package/dist/test/suites/boot/restart-manager.test.js +2 -2
  123. package/dist/test/suites/boot/storage-bundled.test.js +5 -5
  124. package/dist/test/suites/boot/theme.test.js +13 -13
  125. package/dist/test/suites/build/audit.test.js +1 -1
  126. package/dist/test/suites/build/auth-persistence-resolve.test.js +6 -6
  127. package/dist/test/suites/build/boot-fixture.test.js +2 -2
  128. package/dist/test/suites/build/boot-runner-timeout.test.js +6 -5
  129. package/dist/test/suites/build/brand-scss.test.js +1 -1
  130. package/dist/test/suites/build/build-json-bake.test.js +1 -1
  131. package/dist/test/suites/build/cli.test.js +2 -2
  132. package/dist/test/suites/build/config-schema.test.js +5 -5
  133. package/dist/test/suites/build/defaults-scaffold.test.js +2 -2
  134. package/dist/test/suites/build/deploy-hook.test.js +3 -3
  135. package/dist/test/suites/build/ensure-target.test.js +2 -2
  136. package/dist/test/suites/build/env-delivery.test.js +2 -2
  137. package/dist/test/suites/build/esm-only-dependency.test.js +2 -2
  138. package/dist/test/suites/build/exports.test.js +9 -8
  139. package/dist/test/suites/build/get-config.test.js +4 -4
  140. package/dist/test/suites/build/manifest-deps.test.js +1 -1
  141. package/dist/test/suites/build/merge-line-files.test.js +1 -1
  142. package/dist/test/suites/build/omega-shell.test.js +34 -2
  143. package/dist/test/suites/build/omega.test.js +350 -0
  144. package/dist/test/suites/build/renderer-auth-bridge.test.js +211 -78
  145. package/dist/test/suites/build/runner.test.js +2 -2
  146. package/dist/test/suites/build/sentry.test.js +2 -2
  147. package/dist/test/suites/build/sign-windows-e2e.test.js +2 -2
  148. package/dist/test/suites/build/templating.test.js +3 -3
  149. package/dist/test/suites/build/test-stealth.test.js +7 -9
  150. package/dist/test/suites/build/url-helpers.test.js +55 -56
  151. package/dist/test/suites/build/validate-config.test.js +2 -2
  152. package/dist/test/suites/build/wave5-pins.test.js +2 -2
  153. package/dist/test/suites/main/analytics.test.js +59 -59
  154. package/dist/test/suites/main/app-state.test.js +66 -66
  155. package/dist/test/suites/main/auth-flow.test.js +41 -41
  156. package/dist/test/suites/main/auth-persistence.test.js +54 -43
  157. package/dist/test/suites/main/{client-bridge.integration.test.js → auth.integration.test.js} +10 -9
  158. package/dist/test/suites/main/auth.test.js +336 -0
  159. package/dist/test/suites/main/auto-updater.test.js +134 -134
  160. package/dist/test/suites/main/boot-sequence.test.js +37 -49
  161. package/dist/test/suites/main/context-menu.test.js +51 -50
  162. package/dist/test/suites/main/context.test.js +25 -25
  163. package/dist/test/suites/main/deep-link.test.js +74 -74
  164. package/dist/test/suites/main/fontawesome.test.js +27 -27
  165. package/dist/test/suites/main/ipc.test.js +35 -35
  166. package/dist/test/suites/main/menu.test.js +101 -100
  167. package/dist/test/suites/main/protocol.test.js +19 -19
  168. package/dist/test/suites/main/remote-config.test.js +63 -63
  169. package/dist/test/suites/main/remote-scripts.test.js +103 -103
  170. package/dist/test/suites/main/request.test.js +71 -0
  171. package/dist/test/suites/main/restart-manager.test.js +33 -33
  172. package/dist/test/suites/main/startup-paths-and-ua.test.js +4 -4
  173. package/dist/test/suites/main/startup.test.js +26 -26
  174. package/dist/test/suites/main/stealth-window.test.js +1 -1
  175. package/dist/test/suites/main/storage.test.js +25 -25
  176. package/dist/test/suites/main/theme.test.js +34 -34
  177. package/dist/test/suites/main/tray.test.js +79 -79
  178. package/dist/test/suites/main/url-helpers.test.js +133 -133
  179. package/dist/test/suites/main/usage.test.js +25 -25
  180. package/dist/test/suites/main/window-bounds.test.js +27 -27
  181. package/dist/test/suites/main/window-manager.test.js +44 -44
  182. package/dist/test/suites/renderer/analytics-bridge.test.js +5 -5
  183. package/dist/test/suites/renderer/cross-context-helpers.test.js +37 -31
  184. package/dist/test/suites/renderer/round-trip.test.js +3 -3
  185. package/dist/test/suites/renderer/tooltips.test.js +15 -15
  186. package/dist/test/suites/renderer/{window-em-surface.test.js → window-desktop-surface.test.js} +27 -7
  187. package/dist/test/utils/extended-mode-warning.js +1 -1
  188. package/dist/utils/boot-harness.js +56 -0
  189. package/dist/utils/mode-helpers.js +2 -15
  190. package/dist/utils/ship-keys.js +3 -3
  191. package/dist/utils/signing-status.js +51 -0
  192. package/dist/utils/test-events.js +7 -0
  193. package/dist/utils/test-stealth.js +6 -6
  194. package/dist/utils/url-helpers.js +52 -42
  195. package/dist/utils/user-agent.js +44 -0
  196. package/dist/vendor/account/engine.js +3 -3
  197. package/dist/vendor/account/index.js +14 -45
  198. package/dist/vendor/account/resolve-account.js +44 -0
  199. package/dist/vendor/account/schema.js +1 -1
  200. package/dist/vendor/account/user.js +99 -0
  201. package/dist/vendor/config/client-config.js +1 -1
  202. package/dist/vendor/config/environment.js +11 -30
  203. package/dist/vendor/config/index.js +8 -11
  204. package/dist/vendor/config/load.js +1 -2
  205. package/dist/vendor/config/platforms.js +1 -1
  206. package/dist/vendor/config/retired-keys.js +2 -2
  207. package/dist/vendor/config/schema.js +5 -8
  208. package/dist/vendor/config/site-global.js +2 -3
  209. package/dist/vendor/config/validate.js +1 -2
  210. package/dist/vendor/config/winback.js +1 -1
  211. package/dist/vendor/devkit/actions-secrets.js +1 -1
  212. package/dist/vendor/devkit/attach-log-file.js +1 -1
  213. package/dist/vendor/devkit/build-json.js +1 -1
  214. package/dist/vendor/devkit/cli-router.js +3 -4
  215. package/dist/vendor/devkit/defaults-engine.js +9 -11
  216. package/dist/vendor/devkit/local.js +2 -0
  217. package/dist/vendor/devkit/merge-line-files.js +2 -3
  218. package/dist/vendor/devkit/test/runner-core.js +6 -6
  219. package/dist/vendor/monitoring/env.js +2 -2
  220. package/dist/vendor/monitoring/index.js +1 -1
  221. package/dist/vendor/monitoring/main.js +1 -1
  222. package/dist/vendor/monitoring/preload.js +1 -1
  223. package/dist/vendor/monitoring/renderer.js +1 -1
  224. package/docs/analytics.md +8 -8
  225. package/docs/app-state.md +19 -19
  226. package/docs/audit.md +4 -4
  227. package/docs/{client-bridge.md → auth.md} +88 -73
  228. package/docs/auto-updater.md +8 -8
  229. package/docs/boot-sequence.md +11 -6
  230. package/docs/build-system.md +1 -1
  231. package/docs/cdp-debugging.md +1 -1
  232. package/docs/common-mistakes.md +7 -7
  233. package/docs/config-schema.md +1 -1
  234. package/docs/context-menu.md +13 -13
  235. package/docs/context.md +11 -11
  236. package/docs/css.md +3 -9
  237. package/docs/deep-link.md +25 -25
  238. package/docs/environment-detection.md +16 -16
  239. package/docs/fontawesome.md +7 -5
  240. package/docs/hooks.md +8 -8
  241. package/docs/index.md +38 -27
  242. package/docs/ipc.md +10 -10
  243. package/docs/lib-modules.md +9 -9
  244. package/docs/logging.md +12 -14
  245. package/docs/menu.md +18 -18
  246. package/docs/remote-config.md +9 -9
  247. package/docs/remote-scripts.md +12 -12
  248. package/docs/restart-manager.md +8 -8
  249. package/docs/sentry.md +4 -4
  250. package/docs/shared/analytics.md +1 -1
  251. package/docs/shared/breaking-changes.md +79 -13
  252. package/docs/shared/config.md +17 -21
  253. package/docs/shared/logging.md +1 -1
  254. package/docs/shared/monitoring.md +5 -5
  255. package/docs/shared/testing.md +2 -2
  256. package/docs/shared/theming.md +1 -1
  257. package/docs/shared/translation.md +19 -10
  258. package/docs/startup.md +16 -16
  259. package/docs/storage.md +11 -11
  260. package/docs/templating.md +3 -3
  261. package/docs/test-boot-layer.md +12 -12
  262. package/docs/test-framework.md +17 -17
  263. package/docs/themes.md +7 -7
  264. package/docs/tooltips.md +2 -2
  265. package/docs/tray.md +31 -31
  266. package/docs/usage.md +7 -7
  267. package/docs/verts.md +1 -1
  268. package/docs/windows.md +22 -22
  269. package/package.json +3 -4
  270. package/dist/lib/client-bridge.js +0 -374
  271. package/dist/lib/logger.js +0 -4
  272. package/dist/test/suites/build/manager.test.js +0 -213
  273. package/dist/test/suites/main/client-bridge.test.js +0 -262
@@ -1,8 +1,8 @@
1
1
  // Tests for src/utils/url-helpers.js — getFunctionsUrl / getApiUrl / getWebsiteUrl —
2
2
  // plus the getEnvironment() resolution they depend on (getEnvironment itself is the
3
3
  // SSOT defined in src/utils/mode-helpers.js; these tests exercise it through the
4
- // Manager because the URL helpers route through `this.config` and `this.getEnvironment()`).
5
- // The manager (already bootstrapped by the test harness) is the natural object under test.
4
+ // omega instance because the URL helpers route through `this.config` and `this.getEnvironment()`).
5
+ // The instance (already bootstrapped by the test harness) is the natural object under test.
6
6
 
7
7
  const defineCases = require('../../../vendor/devkit/test/define-cases.js');
8
8
  const { CLASSIC_PORTS, CLASSIC_DEV_ORIGIN } = require('../../../vendor/config/index.js');
@@ -13,11 +13,11 @@ const { CLASSIC_PORTS, CLASSIC_DEV_ORIGIN } = require('../../../vendor/config/in
13
13
  // bakes the classic map as the FLOOR of the resolved one, so the classics reach
14
14
  // these helpers the way they reach a shipped dev build, from @omega.js/config,
15
15
  // and no copy of the numbers lives in this file or in url-helpers.js.
16
- function withClassicBakedPorts(manager, fn) {
17
- const original = manager.config.dev;
18
- manager.config.dev = { ports: { ...CLASSIC_PORTS } };
16
+ function withClassicBakedPorts(omega, fn) {
17
+ const original = omega.config.dev;
18
+ omega.config.dev = { ports: { ...CLASSIC_PORTS } };
19
19
  try { return fn(); } finally {
20
- if (original !== undefined) manager.config.dev = original; else delete manager.config.dev;
20
+ if (original !== undefined) omega.config.dev = original; else delete omega.config.dev;
21
21
  }
22
22
  }
23
23
 
@@ -36,50 +36,50 @@ module.exports = defineCases({
36
36
  // app.isPackaged / OMEGA_BUILD_MODE / NODE_ENV sniffs.
37
37
  name: 'getEnvironment: the process input, then the baked config.environment',
38
38
  run: (ctx) => {
39
- const m = ctx.manager;
40
- const origConfigEnv = m.config.environment;
39
+ const omega = ctx.omega;
40
+ const origConfigEnv = omega.config.environment;
41
41
  const origVar = process.env.OMEGA_ENVIRONMENT;
42
42
  try {
43
43
  // The lane's variable is the answer wherever it exists.
44
- m.config.environment = 'production';
44
+ omega.config.environment = 'production';
45
45
  for (const name of ['development', 'testing', 'production']) {
46
46
  process.env.OMEGA_ENVIRONMENT = name;
47
- ctx.expect(m.getEnvironment()).toBe(name);
47
+ ctx.expect(omega.getEnvironment()).toBe(name);
48
48
  }
49
49
 
50
50
  // With no variable, the artifact's own baked word answers.
51
51
  delete process.env.OMEGA_ENVIRONMENT;
52
52
  for (const name of ['development', 'testing', 'production']) {
53
- m.config.environment = name;
54
- ctx.expect(m.getEnvironment()).toBe(name);
53
+ omega.config.environment = name;
54
+ ctx.expect(omega.getEnvironment()).toBe(name);
55
55
  }
56
56
 
57
57
  // Neither is a loud error, never a default.
58
- delete m.config.environment;
58
+ delete omega.config.environment;
59
59
  let threw;
60
- try { m.getEnvironment(); } catch (e) { threw = e; }
60
+ try { omega.getEnvironment(); } catch (e) { threw = e; }
61
61
  ctx.expect(threw).toBeDefined();
62
62
  ctx.expect(threw.message).toMatch(/OMEGA_ENVIRONMENT/);
63
63
  } finally {
64
- if (origConfigEnv !== undefined) m.config.environment = origConfigEnv; else delete m.config.environment;
64
+ if (origConfigEnv !== undefined) omega.config.environment = origConfigEnv; else delete omega.config.environment;
65
65
  if (origVar !== undefined) process.env.OMEGA_ENVIRONMENT = origVar; else delete process.env.OMEGA_ENVIRONMENT;
66
66
  }
67
67
  },
68
68
  },
69
69
  {
70
70
  // The three checks DERIVE from getEnvironment(), on the REAL main-process
71
- // Manager, so they can never disagree with it.
71
+ // omega instance, so they can never disagree with it.
72
72
  name: 'the three is*() checks derive from it, and exactly one is true',
73
73
  run: (ctx) => {
74
- const m = ctx.manager;
74
+ const omega = ctx.omega;
75
75
  const origVar = process.env.OMEGA_ENVIRONMENT;
76
76
  try {
77
77
  for (const name of ['development', 'testing', 'production']) {
78
78
  process.env.OMEGA_ENVIRONMENT = name;
79
- ctx.expect(m.isDevelopment()).toBe(name === 'development');
80
- ctx.expect(m.isTesting()).toBe(name === 'testing');
81
- ctx.expect(m.isProduction()).toBe(name === 'production');
82
- ctx.expect([m.isDevelopment(), m.isTesting(), m.isProduction()].filter(Boolean).length).toBe(1);
79
+ ctx.expect(omega.isDevelopment()).toBe(name === 'development');
80
+ ctx.expect(omega.isTesting()).toBe(name === 'testing');
81
+ ctx.expect(omega.isProduction()).toBe(name === 'production');
82
+ ctx.expect([omega.isDevelopment(), omega.isTesting(), omega.isProduction()].filter(Boolean).length).toBe(1);
83
83
  }
84
84
  } finally {
85
85
  if (origVar !== undefined) process.env.OMEGA_ENVIRONMENT = origVar; else delete process.env.OMEGA_ENVIRONMENT;
@@ -89,44 +89,44 @@ module.exports = defineCases({
89
89
  {
90
90
  name: 'getFunctionsUrl: dev returns localhost:5001/<projectId>/us-central1',
91
91
  run: (ctx) => {
92
- const m = ctx.manager;
93
- m.config.cloud = m.config.cloud || {};
94
- m.config.cloud.config = m.config.cloud.config || {};
95
- const orig = m.config.cloud.config.projectId;
96
- m.config.cloud.config.projectId = 'demo-app';
92
+ const omega = ctx.omega;
93
+ omega.config.cloud = omega.config.cloud || {};
94
+ omega.config.cloud.config = omega.config.cloud.config || {};
95
+ const orig = omega.config.cloud.config.projectId;
96
+ omega.config.cloud.config.projectId = 'demo-app';
97
97
  try {
98
- withClassicBakedPorts(m, () => {
99
- ctx.expect(m.getFunctionsUrl('development')).toBe('http://localhost:5001/demo-app/us-central1');
98
+ withClassicBakedPorts(omega, () => {
99
+ ctx.expect(omega.getFunctionsUrl('development')).toBe('http://localhost:5001/demo-app/us-central1');
100
100
  });
101
- } finally { m.config.cloud.config.projectId = orig; }
101
+ } finally { omega.config.cloud.config.projectId = orig; }
102
102
  },
103
103
  },
104
104
  {
105
105
  name: 'getFunctionsUrl: prod returns us-central1-<projectId>.cloudfunctions.net',
106
106
  run: (ctx) => {
107
- const m = ctx.manager;
108
- m.config.cloud = m.config.cloud || {};
109
- m.config.cloud.config = m.config.cloud.config || {};
110
- const orig = m.config.cloud.config.projectId;
111
- m.config.cloud.config.projectId = 'demo-app';
107
+ const omega = ctx.omega;
108
+ omega.config.cloud = omega.config.cloud || {};
109
+ omega.config.cloud.config = omega.config.cloud.config || {};
110
+ const orig = omega.config.cloud.config.projectId;
111
+ omega.config.cloud.config.projectId = 'demo-app';
112
112
  try {
113
- ctx.expect(m.getFunctionsUrl('production')).toBe('https://us-central1-demo-app.cloudfunctions.net');
114
- } finally { m.config.cloud.config.projectId = orig; }
113
+ ctx.expect(omega.getFunctionsUrl('production')).toBe('https://us-central1-demo-app.cloudfunctions.net');
114
+ } finally { omega.config.cloud.config.projectId = orig; }
115
115
  },
116
116
  },
117
117
  {
118
118
  name: 'getFunctionsUrl: throws when projectId missing',
119
119
  run: (ctx) => {
120
- const m = ctx.manager;
121
- const orig = m.config.cloud?.config?.projectId;
122
- if (m.config.cloud?.config) delete m.config.cloud.config.projectId;
120
+ const omega = ctx.omega;
121
+ const orig = omega.config.cloud?.config?.projectId;
122
+ if (omega.config.cloud?.config) delete omega.config.cloud.config.projectId;
123
123
  try {
124
124
  let threw;
125
- try { m.getFunctionsUrl('production'); } catch (e) { threw = e; }
125
+ try { omega.getFunctionsUrl('production'); } catch (e) { threw = e; }
126
126
  ctx.expect(threw).toBeDefined();
127
127
  ctx.expect(threw.message).toMatch(/cloud\.config\.projectId/);
128
128
  } finally {
129
- if (orig !== undefined) m.config.cloud.config.projectId = orig;
129
+ if (orig !== undefined) omega.config.cloud.config.projectId = orig;
130
130
  }
131
131
  },
132
132
  },
@@ -138,8 +138,8 @@ module.exports = defineCases({
138
138
  delete process.env.OMEGA_HTTPS_PORT;
139
139
  delete process.env.OMEGA_HOSTING_PORT;
140
140
  try {
141
- withClassicBakedPorts(ctx.manager, () => {
142
- ctx.expect(ctx.manager.getApiUrl('development')).toBe('http://localhost:5002');
141
+ withClassicBakedPorts(ctx.omega, () => {
142
+ ctx.expect(ctx.omega.getApiUrl('development')).toBe('http://localhost:5002');
143
143
  });
144
144
  } finally {
145
145
  if (origHttps !== undefined) process.env.OMEGA_HTTPS_PORT = origHttps;
@@ -157,8 +157,8 @@ module.exports = defineCases({
157
157
  delete process.env.OMEGA_HTTPS_PORT;
158
158
  delete process.env.OMEGA_HOSTING_PORT;
159
159
  try {
160
- withClassicBakedPorts(ctx.manager, () => {
161
- ctx.expect(ctx.manager.getApiUrl('testing')).toBe('http://localhost:5002');
160
+ withClassicBakedPorts(ctx.omega, () => {
161
+ ctx.expect(ctx.omega.getApiUrl('testing')).toBe('http://localhost:5002');
162
162
  });
163
163
  } finally {
164
164
  if (origHttps !== undefined) process.env.OMEGA_HTTPS_PORT = origHttps;
@@ -172,15 +172,15 @@ module.exports = defineCases({
172
172
  // published OMEGA_HOSTING_PORT is plain http to the hosting emulator.
173
173
  name: 'getApiUrl: dev follows OMEGA_HTTPS_PORT (https) then OMEGA_HOSTING_PORT (http)',
174
174
  run: (ctx) => {
175
- const m = ctx.manager;
175
+ const omega = ctx.omega;
176
176
  const origHttps = process.env.OMEGA_HTTPS_PORT;
177
177
  const origHosting = process.env.OMEGA_HOSTING_PORT;
178
178
  try {
179
179
  process.env.OMEGA_HOSTING_PORT = '5099';
180
180
  delete process.env.OMEGA_HTTPS_PORT;
181
- ctx.expect(m.getApiUrl('development')).toBe('http://localhost:5099');
181
+ ctx.expect(omega.getApiUrl('development')).toBe('http://localhost:5099');
182
182
  process.env.OMEGA_HTTPS_PORT = '5443';
183
- ctx.expect(m.getApiUrl('development')).toBe('https://localhost:5443');
183
+ ctx.expect(omega.getApiUrl('development')).toBe('https://localhost:5443');
184
184
  } finally {
185
185
  if (origHttps !== undefined) process.env.OMEGA_HTTPS_PORT = origHttps; else delete process.env.OMEGA_HTTPS_PORT;
186
186
  if (origHosting !== undefined) process.env.OMEGA_HOSTING_PORT = origHosting; else delete process.env.OMEGA_HOSTING_PORT;
@@ -190,25 +190,25 @@ module.exports = defineCases({
190
190
  {
191
191
  // #745: the baked `dev.ports` map (written by the bundle task from the
192
192
  // sibling backend's ports file) is the second channel, behind the env
193
- // and ahead of the classics, on the REAL main-process Manager shape.
193
+ // and ahead of the classics, on the REAL main-process omega shape.
194
194
  name: 'getApiUrl: dev follows the baked dev.ports map when no env is published',
195
195
  run: (ctx) => {
196
- const m = ctx.manager;
197
- const origDev = m.config.dev;
196
+ const omega = ctx.omega;
197
+ const origDev = omega.config.dev;
198
198
  const origHttps = process.env.OMEGA_HTTPS_PORT;
199
199
  const origHosting = process.env.OMEGA_HOSTING_PORT;
200
200
  try {
201
201
  delete process.env.OMEGA_HTTPS_PORT;
202
202
  delete process.env.OMEGA_HOSTING_PORT;
203
- m.config.dev = { ports: { hosting: 5012 } };
204
- ctx.expect(m.getApiUrl('development')).toBe('http://localhost:5012');
205
- m.config.dev = { ports: { hosting: 5012, https: 5003 } };
206
- ctx.expect(m.getApiUrl('development')).toBe('https://localhost:5003');
203
+ omega.config.dev = { ports: { hosting: 5012 } };
204
+ ctx.expect(omega.getApiUrl('development')).toBe('http://localhost:5012');
205
+ omega.config.dev = { ports: { hosting: 5012, https: 5003 } };
206
+ ctx.expect(omega.getApiUrl('development')).toBe('https://localhost:5003');
207
207
  process.env.OMEGA_HOSTING_PORT = '5099';
208
- delete m.config.dev.ports.https;
209
- ctx.expect(m.getApiUrl('development')).toBe('http://localhost:5099');
208
+ delete omega.config.dev.ports.https;
209
+ ctx.expect(omega.getApiUrl('development')).toBe('http://localhost:5099');
210
210
  } finally {
211
- if (origDev !== undefined) m.config.dev = origDev; else delete m.config.dev;
211
+ if (origDev !== undefined) omega.config.dev = origDev; else delete omega.config.dev;
212
212
  if (origHttps !== undefined) process.env.OMEGA_HTTPS_PORT = origHttps; else delete process.env.OMEGA_HTTPS_PORT;
213
213
  if (origHosting !== undefined) process.env.OMEGA_HOSTING_PORT = origHosting; else delete process.env.OMEGA_HOSTING_PORT;
214
214
  }
@@ -219,36 +219,36 @@ module.exports = defineCases({
219
219
  // the API base must come from brand.url, never authDomain.
220
220
  name: 'getApiUrl: prod returns api.<brand.url host>, never api.<authDomain>',
221
221
  run: (ctx) => {
222
- const m = ctx.manager;
223
- m.config.brand = m.config.brand || {};
224
- const origUrl = m.config.brand.url;
225
- m.config.brand.url = 'https://demo-app.example.com';
226
- m.config.cloud = m.config.cloud || {};
227
- m.config.cloud.config = m.config.cloud.config || {};
228
- const origAuth = m.config.cloud.config.authDomain;
229
- m.config.cloud.config.authDomain = 'demo-app.firebaseapp.com';
222
+ const omega = ctx.omega;
223
+ omega.config.brand = omega.config.brand || {};
224
+ const origUrl = omega.config.brand.url;
225
+ omega.config.brand.url = 'https://demo-app.example.com';
226
+ omega.config.cloud = omega.config.cloud || {};
227
+ omega.config.cloud.config = omega.config.cloud.config || {};
228
+ const origAuth = omega.config.cloud.config.authDomain;
229
+ omega.config.cloud.config.authDomain = 'demo-app.firebaseapp.com';
230
230
  try {
231
- ctx.expect(m.getApiUrl('production')).toBe('https://api.demo-app.example.com');
231
+ ctx.expect(omega.getApiUrl('production')).toBe('https://api.demo-app.example.com');
232
232
  } finally {
233
- m.config.brand.url = origUrl;
234
- m.config.cloud.config.authDomain = origAuth;
233
+ omega.config.brand.url = origUrl;
234
+ omega.config.cloud.config.authDomain = origAuth;
235
235
  }
236
236
  },
237
237
  },
238
238
  {
239
239
  name: 'getApiUrl: throws when brand.url missing in prod',
240
240
  run: (ctx) => {
241
- const m = ctx.manager;
242
- m.config.brand = m.config.brand || {};
243
- const orig = m.config.brand.url;
244
- delete m.config.brand.url;
241
+ const omega = ctx.omega;
242
+ omega.config.brand = omega.config.brand || {};
243
+ const orig = omega.config.brand.url;
244
+ delete omega.config.brand.url;
245
245
  try {
246
246
  let threw;
247
- try { m.getApiUrl('production'); } catch (e) { threw = e; }
247
+ try { omega.getApiUrl('production'); } catch (e) { threw = e; }
248
248
  ctx.expect(threw).toBeDefined();
249
249
  ctx.expect(threw.message).toMatch(/brand\.url/);
250
250
  } finally {
251
- if (orig !== undefined) m.config.brand.url = orig;
251
+ if (orig !== undefined) omega.config.brand.url = orig;
252
252
  }
253
253
  },
254
254
  },
@@ -258,8 +258,8 @@ module.exports = defineCases({
258
258
  const orig = process.env.OMEGA_WEBSITE_PORT;
259
259
  delete process.env.OMEGA_WEBSITE_PORT;
260
260
  try {
261
- withClassicBakedPorts(ctx.manager, () => {
262
- ctx.expect(ctx.manager.getWebsiteUrl('development')).toBe('https://localhost:4000');
261
+ withClassicBakedPorts(ctx.omega, () => {
262
+ ctx.expect(ctx.omega.getWebsiteUrl('development')).toBe('https://localhost:4000');
263
263
  });
264
264
  } finally {
265
265
  if (orig !== undefined) process.env.OMEGA_WEBSITE_PORT = orig;
@@ -272,7 +272,7 @@ module.exports = defineCases({
272
272
  const orig = process.env.OMEGA_WEBSITE_PORT;
273
273
  try {
274
274
  process.env.OMEGA_WEBSITE_PORT = '4001';
275
- ctx.expect(ctx.manager.getWebsiteUrl('development')).toBe('https://localhost:4001');
275
+ ctx.expect(ctx.omega.getWebsiteUrl('development')).toBe('https://localhost:4001');
276
276
  } finally {
277
277
  if (orig !== undefined) process.env.OMEGA_WEBSITE_PORT = orig; else delete process.env.OMEGA_WEBSITE_PORT;
278
278
  }
@@ -281,19 +281,19 @@ module.exports = defineCases({
281
281
  {
282
282
  // #747: the baked `dev.origin` (the live website's published origin,
283
283
  // scheme included) is the complete fact and outranks the env port, on
284
- // the REAL main-process Manager shape; getAuthUrl rides it by construction.
284
+ // the REAL main-process omega shape; getAuthUrl rides it by construction.
285
285
  name: 'getWebsiteUrl: dev follows the baked dev.origin over OMEGA_WEBSITE_PORT',
286
286
  run: (ctx) => {
287
- const m = ctx.manager;
288
- const origDev = m.config.dev;
287
+ const omega = ctx.omega;
288
+ const origDev = omega.config.dev;
289
289
  const origPort = process.env.OMEGA_WEBSITE_PORT;
290
290
  try {
291
291
  process.env.OMEGA_WEBSITE_PORT = '4001';
292
- m.config.dev = { origin: 'https://localhost:4123' };
293
- ctx.expect(m.getWebsiteUrl('development')).toBe('https://localhost:4123');
294
- ctx.expect(new URL(m.getAuthUrl('development')).origin).toBe('https://localhost:4123');
292
+ omega.config.dev = { origin: 'https://localhost:4123' };
293
+ ctx.expect(omega.getWebsiteUrl('development')).toBe('https://localhost:4123');
294
+ ctx.expect(new URL(omega.getAuthUrl('development')).origin).toBe('https://localhost:4123');
295
295
  } finally {
296
- if (origDev !== undefined) m.config.dev = origDev; else delete m.config.dev;
296
+ if (origDev !== undefined) omega.config.dev = origDev; else delete omega.config.dev;
297
297
  if (origPort !== undefined) process.env.OMEGA_WEBSITE_PORT = origPort; else delete process.env.OMEGA_WEBSITE_PORT;
298
298
  }
299
299
  },
@@ -301,28 +301,28 @@ module.exports = defineCases({
301
301
  {
302
302
  name: 'getWebsiteUrl: prod returns config.brand.url',
303
303
  run: (ctx) => {
304
- const m = ctx.manager;
305
- m.config.brand = m.config.brand || {};
306
- const orig = m.config.brand.url;
307
- m.config.brand.url = 'https://example.com';
304
+ const omega = ctx.omega;
305
+ omega.config.brand = omega.config.brand || {};
306
+ const orig = omega.config.brand.url;
307
+ omega.config.brand.url = 'https://example.com';
308
308
  try {
309
- ctx.expect(m.getWebsiteUrl('production')).toBe('https://example.com');
310
- } finally { m.config.brand.url = orig; }
309
+ ctx.expect(omega.getWebsiteUrl('production')).toBe('https://example.com');
310
+ } finally { omega.config.brand.url = orig; }
311
311
  },
312
312
  },
313
313
  {
314
314
  name: 'getWebsiteUrl: throws in prod when brand.url is missing',
315
315
  run: (ctx) => {
316
- const m = ctx.manager;
317
- const orig = m.config.brand?.url;
318
- if (m.config.brand) delete m.config.brand.url;
316
+ const omega = ctx.omega;
317
+ const orig = omega.config.brand?.url;
318
+ if (omega.config.brand) delete omega.config.brand.url;
319
319
  try {
320
320
  let threw;
321
- try { m.getWebsiteUrl('production'); } catch (e) { threw = e; }
321
+ try { omega.getWebsiteUrl('production'); } catch (e) { threw = e; }
322
322
  ctx.expect(threw).toBeDefined();
323
323
  ctx.expect(threw.message).toMatch(/brand\.url/);
324
324
  } finally {
325
- if (orig !== undefined) m.config.brand.url = orig;
325
+ if (orig !== undefined) omega.config.brand.url = orig;
326
326
  }
327
327
  },
328
328
  },
@@ -331,13 +331,13 @@ module.exports = defineCases({
331
331
  // (searchParams round-trip), not by string-matching encodings.
332
332
  name: 'getAuthUrl: chains /signin → /token → <brand.id>://auth/token (dev)',
333
333
  run: (ctx) => {
334
- const m = ctx.manager;
335
- m.config.brand = m.config.brand || {};
336
- const origId = m.config.brand.id;
337
- m.config.brand.id = 'demo';
334
+ const omega = ctx.omega;
335
+ omega.config.brand = omega.config.brand || {};
336
+ const origId = omega.config.brand.id;
337
+ omega.config.brand.id = 'demo';
338
338
  try {
339
- withClassicBakedPorts(m, () => {
340
- const url = new URL(m.getAuthUrl('development'));
339
+ withClassicBakedPorts(omega, () => {
340
+ const url = new URL(omega.getAuthUrl('development'));
341
341
  ctx.expect(url.origin).toBe('https://localhost:4000');
342
342
  ctx.expect(url.pathname).toBe('/signin');
343
343
  const tokenUrl = new URL(url.searchParams.get('authReturnUrl'));
@@ -346,29 +346,29 @@ module.exports = defineCases({
346
346
  ctx.expect(tokenUrl.searchParams.get('authReturnUrl')).toBe('demo://auth/token');
347
347
  });
348
348
  } finally {
349
- if (origId !== undefined) m.config.brand.id = origId; else delete m.config.brand.id;
349
+ if (origId !== undefined) omega.config.brand.id = origId; else delete omega.config.brand.id;
350
350
  }
351
351
  },
352
352
  },
353
353
  {
354
354
  name: 'getAuthUrl: prod rides brand.url',
355
355
  run: (ctx) => {
356
- const m = ctx.manager;
357
- m.config.brand = m.config.brand || {};
358
- const origId = m.config.brand.id;
359
- const origUrl = m.config.brand.url;
360
- m.config.brand.id = 'demo';
361
- m.config.brand.url = 'https://example.com';
356
+ const omega = ctx.omega;
357
+ omega.config.brand = omega.config.brand || {};
358
+ const origId = omega.config.brand.id;
359
+ const origUrl = omega.config.brand.url;
360
+ omega.config.brand.id = 'demo';
361
+ omega.config.brand.url = 'https://example.com';
362
362
  try {
363
- const url = new URL(m.getAuthUrl('production'));
363
+ const url = new URL(omega.getAuthUrl('production'));
364
364
  ctx.expect(url.origin).toBe('https://example.com');
365
365
  ctx.expect(url.pathname).toBe('/signin');
366
366
  const tokenUrl = new URL(url.searchParams.get('authReturnUrl'));
367
367
  ctx.expect(tokenUrl.origin).toBe('https://example.com');
368
368
  ctx.expect(tokenUrl.searchParams.get('authReturnUrl')).toBe('demo://auth/token');
369
369
  } finally {
370
- if (origId !== undefined) m.config.brand.id = origId; else delete m.config.brand.id;
371
- if (origUrl !== undefined) m.config.brand.url = origUrl; else delete m.config.brand.url;
370
+ if (origId !== undefined) omega.config.brand.id = origId; else delete omega.config.brand.id;
371
+ if (origUrl !== undefined) omega.config.brand.url = origUrl; else delete omega.config.brand.url;
372
372
  }
373
373
  },
374
374
  },
@@ -376,38 +376,38 @@ module.exports = defineCases({
376
376
  // The dev loopback return channel (lib/auth-flow.js) swaps the final hop.
377
377
  name: 'getAuthUrl: optional returnUrl overrides the final hop',
378
378
  run: (ctx) => {
379
- const m = ctx.manager;
380
- m.config.brand = m.config.brand || {};
381
- const origId = m.config.brand.id;
382
- m.config.brand.id = 'demo';
379
+ const omega = ctx.omega;
380
+ omega.config.brand = omega.config.brand || {};
381
+ const origId = omega.config.brand.id;
382
+ omega.config.brand.id = 'demo';
383
383
  try {
384
384
  const loopback = 'http://127.0.0.1:49152/auth/token?state=abc';
385
- withClassicBakedPorts(m, () => {
386
- const url = new URL(m.getAuthUrl('development', loopback));
385
+ withClassicBakedPorts(omega, () => {
386
+ const url = new URL(omega.getAuthUrl('development', loopback));
387
387
  const tokenUrl = new URL(url.searchParams.get('authReturnUrl'));
388
388
  ctx.expect(tokenUrl.pathname).toBe('/token');
389
389
  ctx.expect(tokenUrl.searchParams.get('authReturnUrl')).toBe(loopback);
390
390
  });
391
391
  } finally {
392
- if (origId !== undefined) m.config.brand.id = origId; else delete m.config.brand.id;
392
+ if (origId !== undefined) omega.config.brand.id = origId; else delete omega.config.brand.id;
393
393
  }
394
394
  },
395
395
  },
396
396
  {
397
397
  name: 'getAuthUrl: throws when brand.id missing',
398
398
  run: (ctx) => {
399
- const m = ctx.manager;
400
- const orig = m.config.brand?.id;
401
- if (m.config.brand) delete m.config.brand.id;
399
+ const omega = ctx.omega;
400
+ const orig = omega.config.brand?.id;
401
+ if (omega.config.brand) delete omega.config.brand.id;
402
402
  try {
403
- withClassicBakedPorts(m, () => {
403
+ withClassicBakedPorts(omega, () => {
404
404
  let threw;
405
- try { m.getAuthUrl('development'); } catch (e) { threw = e; }
405
+ try { omega.getAuthUrl('development'); } catch (e) { threw = e; }
406
406
  ctx.expect(threw).toBeDefined();
407
407
  ctx.expect(threw.message).toMatch(/brand\.id/);
408
408
  });
409
409
  } finally {
410
- if (orig !== undefined) m.config.brand.id = orig;
410
+ if (orig !== undefined) omega.config.brand.id = orig;
411
411
  }
412
412
  },
413
413
  },
@@ -416,21 +416,21 @@ module.exports = defineCases({
416
416
  // the one input (#817): whatever the lane named for this process.
417
417
  name: 'getWebsiteUrl: respects the current environment when no arg passed',
418
418
  run: (ctx) => {
419
- const m = ctx.manager;
419
+ const omega = ctx.omega;
420
420
  const origVar = process.env.OMEGA_ENVIRONMENT;
421
- m.config.brand = m.config.brand || {};
422
- const origUrl = m.config.brand.url;
423
- m.config.brand.url = 'https://example.com';
421
+ omega.config.brand = omega.config.brand || {};
422
+ const origUrl = omega.config.brand.url;
423
+ omega.config.brand.url = 'https://example.com';
424
424
  try {
425
425
  process.env.OMEGA_ENVIRONMENT = 'development';
426
- withClassicBakedPorts(m, () => {
427
- ctx.expect(m.getWebsiteUrl()).toBe('https://localhost:4000');
426
+ withClassicBakedPorts(omega, () => {
427
+ ctx.expect(omega.getWebsiteUrl()).toBe('https://localhost:4000');
428
428
  });
429
429
  process.env.OMEGA_ENVIRONMENT = 'production';
430
- ctx.expect(m.getWebsiteUrl()).toBe('https://example.com');
430
+ ctx.expect(omega.getWebsiteUrl()).toBe('https://example.com');
431
431
  } finally {
432
432
  if (origVar !== undefined) process.env.OMEGA_ENVIRONMENT = origVar; else delete process.env.OMEGA_ENVIRONMENT;
433
- m.config.brand.url = origUrl;
433
+ omega.config.brand.url = origUrl;
434
434
  }
435
435
  },
436
436
  },
@@ -6,9 +6,9 @@ const STORAGE_KEY = 'usage';
6
6
 
7
7
  async function reinitWithSnapshot(ctx, snapshot) {
8
8
  // Reset and re-init with a planted previous snapshot.
9
- ctx.manager.usage.shutdown();
10
- ctx.manager.storage.set(STORAGE_KEY, snapshot);
11
- ctx.manager.usage.initialize(ctx.manager);
9
+ ctx.omega.usage.shutdown();
10
+ ctx.omega.storage.set(STORAGE_KEY, snapshot);
11
+ ctx.omega.usage.initialize(ctx.omega);
12
12
  }
13
13
 
14
14
  module.exports = defineCases({
@@ -16,28 +16,28 @@ module.exports = defineCases({
16
16
  layer: 'main',
17
17
  description: 'usage (main)',
18
18
  cleanup: (ctx) => {
19
- ctx.manager.usage.shutdown();
20
- ctx.manager.storage.set(STORAGE_KEY, null);
21
- ctx.manager.usage.initialize(ctx.manager);
19
+ ctx.omega.usage.shutdown();
20
+ ctx.omega.storage.set(STORAGE_KEY, null);
21
+ ctx.omega.usage.initialize(ctx.omega);
22
22
  },
23
23
  tests: [
24
24
  {
25
- name: 'usage module wired on manager + initialized during boot',
25
+ name: 'usage module wired on omega + initialized during boot',
26
26
  run: (ctx) => {
27
- ctx.expect(ctx.manager.usage).toBeDefined();
28
- ctx.expect(ctx.manager.usage._initialized).toBe(true);
27
+ ctx.expect(ctx.omega.usage).toBeDefined();
28
+ ctx.expect(ctx.omega.usage._initialized).toBe(true);
29
29
  },
30
30
  },
31
31
  {
32
32
  name: 'opens() returns at least 1 (this launch)',
33
33
  run: (ctx) => {
34
- ctx.expect(ctx.manager.usage.opens() >= 1).toBe(true);
34
+ ctx.expect(ctx.omega.usage.opens() >= 1).toBe(true);
35
35
  },
36
36
  },
37
37
  {
38
38
  name: 'hoursThisSession() is a small positive number',
39
39
  run: (ctx) => {
40
- const h = ctx.manager.usage.hoursThisSession();
40
+ const h = ctx.omega.usage.hoursThisSession();
41
41
  ctx.expect(typeof h).toBe('number');
42
42
  ctx.expect(h >= 0).toBe(true);
43
43
  ctx.expect(h < 1).toBe(true); // tests run in seconds, not hours
@@ -48,14 +48,14 @@ module.exports = defineCases({
48
48
  run: async (ctx) => {
49
49
  // Plant a known starting state so this test isn't sensitive to whatever
50
50
  // accumulated in the prior test's storage.
51
- ctx.manager.usage.shutdown();
52
- ctx.manager.storage.set('usage', { opens: 5, hoursTotal: 0, installedAt: '2024-01-01T00:00:00Z', lastLaunchAt: null, lastQuitAt: null });
53
- ctx.manager.usage.initialize(ctx.manager);
54
- const before = ctx.manager.usage.opens();
51
+ ctx.omega.usage.shutdown();
52
+ ctx.omega.storage.set('usage', { opens: 5, hoursTotal: 0, installedAt: '2024-01-01T00:00:00Z', lastLaunchAt: null, lastQuitAt: null });
53
+ ctx.omega.usage.initialize(ctx.omega);
54
+ const before = ctx.omega.usage.opens();
55
55
  ctx.expect(before).toBe(6); // 5 + this re-init
56
- ctx.manager.usage.shutdown();
57
- ctx.manager.usage.initialize(ctx.manager);
58
- const after = ctx.manager.usage.opens();
56
+ ctx.omega.usage.shutdown();
57
+ ctx.omega.usage.initialize(ctx.omega);
58
+ const after = ctx.omega.usage.opens();
59
59
  ctx.expect(after).toBe(before + 1); // 7
60
60
  },
61
61
  },
@@ -73,10 +73,10 @@ module.exports = defineCases({
73
73
  installedAt: '2024-01-01T00:00:00.000Z',
74
74
  });
75
75
  // After re-init we should have hoursTotal = 10 + 2 = 12 (within rounding).
76
- const ht = ctx.manager.usage.hoursTotal();
76
+ const ht = ctx.omega.usage.hoursTotal();
77
77
  ctx.expect(ht > 11.9).toBe(true);
78
78
  ctx.expect(ht < 12.1).toBe(true);
79
- ctx.expect(ctx.manager.usage.opens()).toBe(6);
79
+ ctx.expect(ctx.omega.usage.opens()).toBe(6);
80
80
  },
81
81
  },
82
82
  {
@@ -90,7 +90,7 @@ module.exports = defineCases({
90
90
  installedAt: '2024-01-01T00:00:00.000Z',
91
91
  });
92
92
  // Should still be 5 — crashed sessions don't credit hours.
93
- ctx.expect(ctx.manager.usage.hoursTotal()).toBe(5);
93
+ ctx.expect(ctx.omega.usage.hoursTotal()).toBe(5);
94
94
  },
95
95
  },
96
96
  {
@@ -103,13 +103,13 @@ module.exports = defineCases({
103
103
  lastLaunchAt: new Date().toISOString(),
104
104
  lastQuitAt: null,
105
105
  });
106
- ctx.expect(ctx.manager.usage.installedAt()).toBe('2023-06-15T10:00:00.000Z');
106
+ ctx.expect(ctx.omega.usage.installedAt()).toBe('2023-06-15T10:00:00.000Z');
107
107
  },
108
108
  },
109
109
  {
110
110
  name: 'toJSON includes opens, hoursTotal, hoursThisSession, installedAt',
111
111
  run: (ctx) => {
112
- const j = ctx.manager.usage.toJSON();
112
+ const j = ctx.omega.usage.toJSON();
113
113
  ctx.expect(typeof j.opens).toBe('number');
114
114
  ctx.expect(typeof j.hoursTotal).toBe('number');
115
115
  ctx.expect(typeof j.hoursThisSession).toBe('number');
@@ -119,8 +119,8 @@ module.exports = defineCases({
119
119
  {
120
120
  name: 'IPC handler desktop:usage:get returns the snapshot',
121
121
  run: async (ctx) => {
122
- const snap = await ctx.manager.ipc.invoke('desktop:usage:get');
123
- ctx.expect(snap.opens).toBe(ctx.manager.usage.opens());
122
+ const snap = await ctx.omega.ipc.invoke('desktop:usage:get');
123
+ ctx.expect(snap.opens).toBe(ctx.omega.usage.opens());
124
124
  },
125
125
  },
126
126
  ],