@omega.js/desktop 0.51.0 → 0.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/README.md +18 -13
  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 +145 -48
  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/.github/workflows/build.yml +2 -0
  48. package/dist/defaults/AGENTS.md +17 -8
  49. package/dist/defaults/config/omega.json5 +7 -7
  50. package/dist/defaults/hooks/build/post.js +1 -1
  51. package/dist/defaults/hooks/build/pre.js +1 -1
  52. package/dist/defaults/hooks/deploy/pre.js +1 -1
  53. package/dist/defaults/hooks/release/post.js +1 -1
  54. package/dist/defaults/hooks/release/pre.js +1 -1
  55. package/dist/defaults/src/assets/js/components/about/index.js +3 -5
  56. package/dist/defaults/src/assets/js/components/main/index.js +3 -5
  57. package/dist/defaults/src/assets/js/components/settings/index.js +3 -5
  58. package/dist/defaults/src/integrations/context-menu/index.js +2 -2
  59. package/dist/defaults/src/integrations/menu/index.js +3 -3
  60. package/dist/defaults/src/integrations/tray/index.js +3 -3
  61. package/dist/defaults/src/main.js +3 -5
  62. package/dist/defaults/src/preload.js +3 -5
  63. package/dist/defaults/test/README.md +2 -2
  64. package/dist/gulp/main.js +9 -10
  65. package/dist/gulp/tasks/audit.js +7 -7
  66. package/dist/gulp/tasks/build-config.js +8 -8
  67. package/dist/gulp/tasks/bundle.js +16 -16
  68. package/dist/gulp/tasks/defaults.js +3 -3
  69. package/dist/gulp/tasks/distribute.js +2 -2
  70. package/dist/gulp/tasks/html.js +9 -9
  71. package/dist/gulp/tasks/package-quick.js +3 -3
  72. package/dist/gulp/tasks/package.js +3 -3
  73. package/dist/gulp/tasks/release.js +3 -3
  74. package/dist/gulp/tasks/sass.js +6 -6
  75. package/dist/gulp/tasks/serve.js +4 -4
  76. package/dist/hooks/notarize-artifacts.js +1 -1
  77. package/dist/hooks/notarize.js +1 -1
  78. package/dist/index.js +5 -8
  79. package/dist/lib/_environment-mixin.js +50 -0
  80. package/dist/lib/_lifecycle-mixin.js +45 -0
  81. package/dist/lib/analytics.js +33 -35
  82. package/dist/lib/app-state.js +14 -14
  83. package/dist/lib/auth-flow.js +18 -18
  84. package/dist/lib/auth-persistence.js +12 -12
  85. package/dist/lib/auth.js +421 -0
  86. package/dist/lib/auto-updater.js +49 -49
  87. package/dist/lib/context-menu.js +13 -13
  88. package/dist/lib/context.js +19 -19
  89. package/dist/lib/deep-link.js +34 -34
  90. package/dist/lib/fontawesome.js +5 -5
  91. package/dist/lib/ipc.js +4 -4
  92. package/dist/lib/menu.js +25 -25
  93. package/dist/lib/protocol.js +5 -5
  94. package/dist/lib/remote-config.js +22 -22
  95. package/dist/lib/remote-scripts.js +21 -21
  96. package/dist/lib/restart-manager/index.js +28 -28
  97. package/dist/lib/sign-helpers/exec-with-limit.js +1 -1
  98. package/dist/lib/sign-helpers/sign-events.js +1 -1
  99. package/dist/lib/startup.js +18 -13
  100. package/dist/lib/storage.js +10 -10
  101. package/dist/lib/templating.js +16 -16
  102. package/dist/lib/theme.js +10 -10
  103. package/dist/lib/tray.js +27 -27
  104. package/dist/lib/usage.js +11 -11
  105. package/dist/lib/window-manager.js +26 -26
  106. package/dist/main.js +398 -483
  107. package/dist/preload.js +236 -176
  108. package/dist/renderer.js +417 -391
  109. package/dist/runner/job-started.js +1 -1
  110. package/dist/test/fixtures/consumer-app/config/omega.json5 +1 -1
  111. package/dist/test/fixtures/consumer-app/src/assets/js/components/main/index.js +8 -11
  112. package/dist/test/fixtures/consumer-app/src/main.js +5 -7
  113. package/dist/test/fixtures/consumer-app/src/preload.js +2 -2
  114. package/dist/test/harness/boot-entry.js +22 -20
  115. package/dist/test/harness/main-entry.js +31 -30
  116. package/dist/test/harness/renderer-entry.js +5 -5
  117. package/dist/test/harness/renderer-preload.js +137 -141
  118. package/dist/test/index.js +10 -10
  119. package/dist/test/runner.js +2 -2
  120. package/dist/test/runners/boot.js +7 -6
  121. package/dist/test/runners/electron.js +3 -2
  122. package/dist/test/runners/render-event.js +2 -2
  123. package/dist/test/suites/boot/consumer-app-boots.test.js +57 -26
  124. package/dist/test/suites/boot/restart-manager.test.js +2 -2
  125. package/dist/test/suites/boot/storage-bundled.test.js +5 -5
  126. package/dist/test/suites/boot/theme.test.js +13 -13
  127. package/dist/test/suites/build/audit.test.js +1 -1
  128. package/dist/test/suites/build/auth-persistence-resolve.test.js +6 -6
  129. package/dist/test/suites/build/boot-fixture.test.js +2 -2
  130. package/dist/test/suites/build/boot-runner-timeout.test.js +6 -5
  131. package/dist/test/suites/build/brand-scss.test.js +1 -1
  132. package/dist/test/suites/build/build-json-bake.test.js +1 -1
  133. package/dist/test/suites/build/cli.test.js +2 -2
  134. package/dist/test/suites/build/config-schema.test.js +5 -5
  135. package/dist/test/suites/build/defaults-scaffold.test.js +2 -2
  136. package/dist/test/suites/build/deploy-hook.test.js +3 -3
  137. package/dist/test/suites/build/ensure-target.test.js +2 -2
  138. package/dist/test/suites/build/env-delivery.test.js +2 -2
  139. package/dist/test/suites/build/esm-only-dependency.test.js +2 -2
  140. package/dist/test/suites/build/exports.test.js +9 -8
  141. package/dist/test/suites/build/get-config.test.js +4 -4
  142. package/dist/test/suites/build/manifest-deps.test.js +1 -1
  143. package/dist/test/suites/build/merge-line-files.test.js +1 -1
  144. package/dist/test/suites/build/omega-shell.test.js +34 -2
  145. package/dist/test/suites/build/omega.test.js +350 -0
  146. package/dist/test/suites/build/renderer-auth-bridge.test.js +211 -78
  147. package/dist/test/suites/build/runner.test.js +612 -5
  148. package/dist/test/suites/build/sentry.test.js +2 -2
  149. package/dist/test/suites/build/sign-windows-e2e.test.js +2 -2
  150. package/dist/test/suites/build/templating.test.js +3 -3
  151. package/dist/test/suites/build/test-stealth.test.js +7 -9
  152. package/dist/test/suites/build/url-helpers.test.js +55 -56
  153. package/dist/test/suites/build/validate-config.test.js +2 -2
  154. package/dist/test/suites/build/wave5-pins.test.js +2 -2
  155. package/dist/test/suites/main/analytics.test.js +59 -59
  156. package/dist/test/suites/main/app-state.test.js +66 -66
  157. package/dist/test/suites/main/auth-flow.test.js +41 -41
  158. package/dist/test/suites/main/auth-persistence.test.js +54 -43
  159. package/dist/test/suites/main/{client-bridge.integration.test.js → auth.integration.test.js} +10 -9
  160. package/dist/test/suites/main/auth.test.js +336 -0
  161. package/dist/test/suites/main/auto-updater.test.js +134 -134
  162. package/dist/test/suites/main/boot-sequence.test.js +37 -49
  163. package/dist/test/suites/main/context-menu.test.js +51 -50
  164. package/dist/test/suites/main/context.test.js +25 -25
  165. package/dist/test/suites/main/deep-link.test.js +74 -74
  166. package/dist/test/suites/main/fontawesome.test.js +27 -27
  167. package/dist/test/suites/main/ipc.test.js +35 -35
  168. package/dist/test/suites/main/menu.test.js +101 -100
  169. package/dist/test/suites/main/protocol.test.js +19 -19
  170. package/dist/test/suites/main/remote-config.test.js +63 -63
  171. package/dist/test/suites/main/remote-scripts.test.js +103 -103
  172. package/dist/test/suites/main/request.test.js +71 -0
  173. package/dist/test/suites/main/restart-manager.test.js +33 -33
  174. package/dist/test/suites/main/startup-paths-and-ua.test.js +4 -4
  175. package/dist/test/suites/main/startup.test.js +26 -26
  176. package/dist/test/suites/main/stealth-window.test.js +1 -1
  177. package/dist/test/suites/main/storage.test.js +25 -25
  178. package/dist/test/suites/main/theme.test.js +34 -34
  179. package/dist/test/suites/main/tray.test.js +79 -79
  180. package/dist/test/suites/main/url-helpers.test.js +133 -133
  181. package/dist/test/suites/main/usage.test.js +25 -25
  182. package/dist/test/suites/main/window-bounds.test.js +27 -27
  183. package/dist/test/suites/main/window-manager.test.js +44 -44
  184. package/dist/test/suites/renderer/analytics-bridge.test.js +5 -5
  185. package/dist/test/suites/renderer/cross-context-helpers.test.js +37 -31
  186. package/dist/test/suites/renderer/round-trip.test.js +3 -3
  187. package/dist/test/suites/renderer/tooltips.test.js +15 -15
  188. package/dist/test/suites/renderer/{window-em-surface.test.js → window-desktop-surface.test.js} +27 -7
  189. package/dist/test/utils/extended-mode-warning.js +1 -1
  190. package/dist/utils/boot-harness.js +56 -0
  191. package/dist/utils/mode-helpers.js +2 -15
  192. package/dist/utils/ship-keys.js +3 -3
  193. package/dist/utils/signing-status.js +51 -0
  194. package/dist/utils/test-events.js +7 -0
  195. package/dist/utils/test-stealth.js +6 -6
  196. package/dist/utils/url-helpers.js +52 -42
  197. package/dist/utils/user-agent.js +44 -0
  198. package/dist/vendor/account/engine.js +3 -3
  199. package/dist/vendor/account/index.js +14 -45
  200. package/dist/vendor/account/resolve-account.js +44 -0
  201. package/dist/vendor/account/schema.js +1 -1
  202. package/dist/vendor/account/user.js +99 -0
  203. package/dist/vendor/config/client-config.js +1 -1
  204. package/dist/vendor/config/environment.js +11 -30
  205. package/dist/vendor/config/index.js +13 -12
  206. package/dist/vendor/config/load.js +1 -2
  207. package/dist/vendor/config/platforms.js +1 -1
  208. package/dist/vendor/config/repo.js +24 -0
  209. package/dist/vendor/config/retired-keys.js +2 -2
  210. package/dist/vendor/config/schema.js +5 -8
  211. package/dist/vendor/config/site-global.js +2 -3
  212. package/dist/vendor/config/validate.js +1 -2
  213. package/dist/vendor/config/winback.js +1 -1
  214. package/dist/vendor/devkit/actions-secrets.js +1 -1
  215. package/dist/vendor/devkit/attach-log-file.js +1 -1
  216. package/dist/vendor/devkit/brand-version.js +162 -1
  217. package/dist/vendor/devkit/build-json.js +1 -1
  218. package/dist/vendor/devkit/cli-router.js +3 -4
  219. package/dist/vendor/devkit/defaults-engine.js +9 -11
  220. package/dist/vendor/devkit/deploy.js +64 -4
  221. package/dist/vendor/devkit/git-remote.js +78 -1
  222. package/dist/vendor/devkit/local.js +53 -3
  223. package/dist/vendor/devkit/lockfile.js +127 -0
  224. package/dist/vendor/devkit/merge-line-files.js +2 -3
  225. package/dist/vendor/devkit/pack-local.js +4 -7
  226. package/dist/vendor/devkit/preludes/origin-heal.js +35 -49
  227. package/dist/vendor/devkit/target-secrets.js +34 -45
  228. package/dist/vendor/devkit/test/runner-core.js +6 -6
  229. package/dist/vendor/monitoring/env.js +2 -2
  230. package/dist/vendor/monitoring/index.js +1 -1
  231. package/dist/vendor/monitoring/main.js +1 -1
  232. package/dist/vendor/monitoring/preload.js +1 -1
  233. package/dist/vendor/monitoring/renderer.js +1 -1
  234. package/docs/analytics.md +8 -8
  235. package/docs/app-state.md +19 -19
  236. package/docs/audit.md +4 -4
  237. package/docs/{client-bridge.md → auth.md} +88 -73
  238. package/docs/auto-updater.md +8 -8
  239. package/docs/boot-sequence.md +11 -6
  240. package/docs/build-system.md +1 -1
  241. package/docs/cdp-debugging.md +1 -1
  242. package/docs/common-mistakes.md +7 -7
  243. package/docs/config-schema.md +1 -1
  244. package/docs/context-menu.md +13 -13
  245. package/docs/context.md +11 -11
  246. package/docs/css.md +3 -9
  247. package/docs/deep-link.md +25 -25
  248. package/docs/environment-detection.md +16 -16
  249. package/docs/fontawesome.md +7 -5
  250. package/docs/hooks.md +8 -8
  251. package/docs/index.md +39 -28
  252. package/docs/ipc.md +10 -10
  253. package/docs/lib-modules.md +9 -9
  254. package/docs/logging.md +12 -14
  255. package/docs/menu.md +18 -18
  256. package/docs/releasing.md +4 -2
  257. package/docs/remote-config.md +9 -9
  258. package/docs/remote-scripts.md +12 -12
  259. package/docs/restart-manager.md +8 -8
  260. package/docs/runner.md +12 -10
  261. package/docs/sentry.md +4 -4
  262. package/docs/shared/analytics.md +1 -1
  263. package/docs/shared/brands.md +1 -1
  264. package/docs/shared/breaking-changes.md +79 -13
  265. package/docs/shared/config.md +24 -21
  266. package/docs/shared/deploys.md +30 -7
  267. package/docs/shared/local-dev.md +5 -3
  268. package/docs/shared/logging.md +1 -1
  269. package/docs/shared/monitoring.md +5 -5
  270. package/docs/shared/testing.md +2 -2
  271. package/docs/shared/theming.md +1 -1
  272. package/docs/shared/translation.md +19 -10
  273. package/docs/signing.md +1 -1
  274. package/docs/startup.md +16 -16
  275. package/docs/storage.md +11 -11
  276. package/docs/templating.md +3 -3
  277. package/docs/test-boot-layer.md +12 -12
  278. package/docs/test-framework.md +17 -17
  279. package/docs/themes.md +7 -7
  280. package/docs/tooltips.md +2 -2
  281. package/docs/tray.md +31 -31
  282. package/docs/usage.md +7 -7
  283. package/docs/verts.md +1 -1
  284. package/docs/windows.md +22 -22
  285. package/package.json +3 -4
  286. package/dist/lib/client-bridge.js +0 -374
  287. package/dist/lib/logger.js +0 -4
  288. package/dist/test/suites/build/manager.test.js +0 -213
  289. package/dist/test/suites/main/client-bridge.test.js +0 -262
@@ -1,262 +0,0 @@
1
- // Main-process tests for lib/client-bridge.js — unit-level coverage that doesn't hit Firebase.
2
- //
3
- // Real Firebase integration tests live in client-bridge.integration.test.js
4
- // (gated on extended mode); the sign-in proof itself is #904's, through a
5
- // persona the backend emulator seeds.
6
-
7
- const defineCases = require('../../../vendor/devkit/test/define-cases.js');
8
-
9
- module.exports = defineCases({
10
- type: 'suite',
11
- layer: 'main',
12
- description: 'client-bridge (main, unit)',
13
- cleanup: async (ctx) => {
14
- await ctx.manager.omega._resetForTests();
15
- },
16
- tests: [
17
- {
18
- name: 'initialize ran during boot',
19
- run: (ctx) => {
20
- ctx.expect(ctx.manager.omega._initialized).toBe(true);
21
- },
22
- },
23
- {
24
- name: 'IPC handlers are registered',
25
- run: (ctx) => {
26
- ctx.expect(ctx.manager.ipc.hasHandler('desktop:auth:sync-request')).toBe(true);
27
- ctx.expect(ctx.manager.ipc.hasHandler('desktop:auth:sign-out')).toBe(true);
28
- ctx.expect(ctx.manager.ipc.hasHandler('desktop:auth:get-user')).toBe(true);
29
- },
30
- },
31
- {
32
- name: 'getCurrentUser returns null when nothing is signed in',
33
- run: (ctx) => {
34
- // The harness boots without auth; either firebase isn't loaded (no cloud.config
35
- // in default config) or it is and there's no user. Either way, currentUser is null.
36
- ctx.expect(ctx.manager.omega.getCurrentUser()).toBeNull();
37
- },
38
- },
39
- {
40
- name: 'getIdToken returns null when nothing is signed in',
41
- run: async (ctx) => {
42
- // Same no-auth harness as getCurrentUser above — signed-in token
43
- // round-trips are the integration suite's domain.
44
- ctx.expect(await ctx.manager.omega.getIdToken()).toBeNull();
45
- },
46
- },
47
- {
48
- name: 'handleAuthToken returns no-op result when firebase not loaded',
49
- run: async (ctx) => {
50
- // Default config has empty cloud.config → firebase fails to init → _firebaseAuth=null.
51
- if (ctx.manager.omega._firebaseAuth) {
52
- ctx.skip('firebase did load (cloud.config was set) — covered by integration tests');
53
- }
54
- const r = await ctx.manager.omega.handleAuthToken('whatever');
55
- ctx.expect(r.success).toBe(false);
56
- ctx.expect(r.reason).toBe('firebase-not-loaded');
57
- },
58
- },
59
- {
60
- name: 'handleAuthToken with empty token returns no-token failure',
61
- run: async (ctx) => {
62
- // Stub _firebaseAuth so we hit the "no token" branch instead of "firebase-not-loaded."
63
- const origAuth = ctx.manager.omega._firebaseAuth;
64
- ctx.manager.omega._firebaseAuth = { currentUser: null }; // truthy so we pass the firebase check
65
- try {
66
- const r = await ctx.manager.omega.handleAuthToken('');
67
- ctx.expect(r.success).toBe(false);
68
- ctx.expect(r.reason).toBe('no-token');
69
- } finally {
70
- ctx.manager.omega._firebaseAuth = origAuth;
71
- }
72
- },
73
- },
74
- {
75
- name: 'sync-request: same UID → no sync needed',
76
- run: async (ctx) => {
77
- // Stub the auth so we control bgUid.
78
- const origAuth = ctx.manager.omega._firebaseAuth;
79
- ctx.manager.omega._firebaseAuth = { currentUser: { uid: 'abc' } };
80
- try {
81
- const result = await ctx.manager.ipc.invoke('desktop:auth:sync-request', { contextUid: 'abc' });
82
- ctx.expect(result.needsSync).toBe(false);
83
- } finally {
84
- ctx.manager.omega._firebaseAuth = origAuth;
85
- }
86
- },
87
- },
88
- {
89
- name: 'sync-request: main signed out, renderer signed in → tells renderer to sign out',
90
- run: async (ctx) => {
91
- const origAuth = ctx.manager.omega._firebaseAuth;
92
- ctx.manager.omega._firebaseAuth = { currentUser: null };
93
- try {
94
- const result = await ctx.manager.ipc.invoke('desktop:auth:sync-request', { contextUid: 'someone' });
95
- ctx.expect(result.needsSync).toBe(true);
96
- ctx.expect(result.signOut).toBe(true);
97
- } finally {
98
- ctx.manager.omega._firebaseAuth = origAuth;
99
- }
100
- },
101
- },
102
- {
103
- name: 'sync-request: firebase not loaded → no sync',
104
- run: async (ctx) => {
105
- const origAuth = ctx.manager.omega._firebaseAuth;
106
- ctx.manager.omega._firebaseAuth = null;
107
- try {
108
- const result = await ctx.manager.ipc.invoke('desktop:auth:sync-request', { contextUid: null });
109
- ctx.expect(result.needsSync).toBe(false);
110
- ctx.expect(result.reason).toBe('firebase-not-loaded');
111
- } finally {
112
- ctx.manager.omega._firebaseAuth = origAuth;
113
- }
114
- },
115
- },
116
- {
117
- name: 'sign-out IPC succeeds when nothing is signed in',
118
- run: async (ctx) => {
119
- const result = await ctx.manager.ipc.invoke('desktop:auth:sign-out');
120
- ctx.expect(result.success).toBe(true);
121
- },
122
- },
123
- {
124
- name: 'get-user IPC returns null when no current user',
125
- run: async (ctx) => {
126
- const result = await ctx.manager.ipc.invoke('desktop:auth:get-user');
127
- ctx.expect(result).toBeNull();
128
- },
129
- },
130
- {
131
- name: 'onAuthChange returns an unsubscribe fn',
132
- run: (ctx) => {
133
- const fn = () => {};
134
- const off = ctx.manager.omega.onAuthChange(fn);
135
- ctx.expect(ctx.manager.omega._stateSubs.has(fn)).toBe(true);
136
- off();
137
- ctx.expect(ctx.manager.omega._stateSubs.has(fn)).toBe(false);
138
- },
139
- },
140
- {
141
- name: '_snapshotUser returns the public user shape (no token)',
142
- run: (ctx) => {
143
- const snap = ctx.manager.omega._snapshotUser({
144
- uid: 'u1',
145
- email: 'a@b.com',
146
- displayName: 'Bob',
147
- photoURL: 'http://x/p.png',
148
- emailVerified: true,
149
- // sensitive stuff that should NOT be exposed
150
- stsTokenManager: { accessToken: 'SECRET' },
151
- providerData: ['xxx'],
152
- });
153
- ctx.expect(snap).toEqual({
154
- uid: 'u1',
155
- email: 'a@b.com',
156
- displayName: 'Bob',
157
- photoURL: 'http://x/p.png',
158
- emailVerified: true,
159
- });
160
- },
161
- },
162
- {
163
- // The emulator gate (#46). _getFirebaseAuth resolves firebase through the
164
- // bridge's OWN seams (_firebase / _firebaseModule, filled by
165
- // _tryLoadFirebase) — swapping those recording namespaces in drives the real
166
- // method, no stubbing of the module under test. The manager is an input too:
167
- // isTesting() is the whole gate.
168
- name: 'auth emulator: a testing run connects, dev/production never do',
169
- run: (ctx) => {
170
- const bridge = ctx.manager.omega;
171
- const saved = {
172
- firebase: bridge._firebase,
173
- module: bridge._firebaseModule,
174
- auth: bridge._firebaseAuth,
175
- manager: bridge._manager,
176
- port: process.env.OMEGA_AUTH_PORT,
177
- };
178
-
179
- // One recording firebase namespace pair, reused per run
180
- const connects = [];
181
- const authInstance = { __auth: true };
182
- bridge._firebase = {
183
- getApp: () => { throw new Error('no app'); },
184
- initializeApp: () => ({ __app: true }),
185
- };
186
- bridge._firebaseModule = {
187
- getAuth: () => authInstance,
188
- connectAuthEmulator: (auth, url, opts) => connects.push({ auth, url, opts }),
189
- };
190
-
191
- const run = (isTesting, dev) => {
192
- bridge._firebaseAuth = null;
193
- bridge._manager = {
194
- config: { cloud: { config: { apiKey: 'AIza-test', projectId: 'demo-desktop' } }, ...(dev ? { dev } : {}) },
195
- isTesting: () => isTesting,
196
- };
197
- return bridge._getFirebaseAuth(null);
198
- };
199
-
200
- try {
201
- delete process.env.OMEGA_AUTH_PORT;
202
-
203
- // production / dev shape — no emulator, ever
204
- ctx.expect(run(false)).toBe(authInstance);
205
- ctx.expect(connects.length).toBe(0);
206
-
207
- // testing shape: the port comes from the map the bundle baked, which
208
- // carries @omega.js/config's classic 9099 as its floor
209
- // ([#834](https://github.com/Omega-JS-Stack/omega/issues/834)).
210
- ctx.expect(run(true, { ports: { auth: 9099 } })).toBe(authInstance);
211
- ctx.expect(connects.length).toBe(1);
212
- ctx.expect(connects[0].auth).toBe(authInstance);
213
- ctx.expect(connects[0].url).toBe('http://localhost:9099');
214
-
215
- // a bumped port arrives on OMEGA_AUTH_PORT (N7)
216
- process.env.OMEGA_AUTH_PORT = '9199';
217
- run(true, { ports: { auth: 9099 } });
218
- ctx.expect(connects.length).toBe(2);
219
- ctx.expect(connects[1].url).toBe('http://localhost:9199');
220
-
221
- // Neither channel is a broken artifact, and it says so by name
222
- // rather than dialling a port nothing identity-checks (#834).
223
- delete process.env.OMEGA_AUTH_PORT;
224
- let threw;
225
- try { run(true); } catch (e) { threw = e; }
226
- ctx.expect(threw).toBeDefined();
227
- ctx.expect(threw.message).toMatch(/dev port for `auth`/);
228
- ctx.expect(threw.message).toMatch(/bundle task/);
229
- ctx.expect(connects.length).toBe(2);
230
- } finally {
231
- bridge._firebase = saved.firebase;
232
- bridge._firebaseModule = saved.module;
233
- bridge._firebaseAuth = saved.auth;
234
- bridge._manager = saved.manager;
235
- if (saved.port === undefined) delete process.env.OMEGA_AUTH_PORT;
236
- else process.env.OMEGA_AUTH_PORT = saved.port;
237
- }
238
- },
239
- },
240
- {
241
- name: 'deep-link auth/token route is wired to handleAuthToken',
242
- run: async (ctx) => {
243
- // We've already tested the deep-link side in deep-link.test.js. Here we verify
244
- // the integration is actually live: dispatching the route triggers our spy.
245
- let received = null;
246
- const orig = ctx.manager.omega.handleAuthToken;
247
- ctx.manager.omega.handleAuthToken = async (token) => {
248
- received = token;
249
- return { success: true };
250
- };
251
- try {
252
- ctx.manager.deepLink.dispatch('myapp://auth/token?authToken=BRIDGE-TEST-TOKEN');
253
- // Built-in handler is sync up to the await — give it a tick.
254
- await new Promise((r) => setImmediate(r));
255
- ctx.expect(received).toBe('BRIDGE-TEST-TOKEN');
256
- } finally {
257
- ctx.manager.omega.handleAuthToken = orig;
258
- }
259
- },
260
- },
261
- ],
262
- });