@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
|
@@ -8,19 +8,19 @@ module.exports = defineCases({
|
|
|
8
8
|
description: 'deep-link (main)',
|
|
9
9
|
cleanup: (ctx) => {
|
|
10
10
|
// Drop all consumer handlers we registered. Built-ins stay (they're idempotent).
|
|
11
|
-
ctx.
|
|
11
|
+
ctx.omega.deepLink._handlers = ctx.omega.deepLink._handlers.filter((h) => h.builtin);
|
|
12
12
|
},
|
|
13
13
|
tests: [
|
|
14
14
|
{
|
|
15
15
|
name: 'initialize ran during boot',
|
|
16
16
|
run: (ctx) => {
|
|
17
|
-
ctx.expect(ctx.
|
|
17
|
+
ctx.expect(ctx.omega.deepLink._initialized).toBe(true);
|
|
18
18
|
},
|
|
19
19
|
},
|
|
20
20
|
{
|
|
21
21
|
name: 'built-in handlers are registered for auth/token, app/show, app/quit',
|
|
22
22
|
run: (ctx) => {
|
|
23
|
-
const patterns = ctx.
|
|
23
|
+
const patterns = ctx.omega.deepLink.getHandlers().map((h) => h.pattern);
|
|
24
24
|
ctx.expect(patterns).toContain('auth/token');
|
|
25
25
|
ctx.expect(patterns).toContain('app/show');
|
|
26
26
|
ctx.expect(patterns).toContain('app/quit');
|
|
@@ -29,7 +29,7 @@ module.exports = defineCases({
|
|
|
29
29
|
{
|
|
30
30
|
name: '_parseUrl extracts scheme, route, query for a flat path',
|
|
31
31
|
run: (ctx) => {
|
|
32
|
-
const parsed = ctx.
|
|
32
|
+
const parsed = ctx.omega.deepLink._parseUrl('myapp://auth/token?token=abc&x=1');
|
|
33
33
|
ctx.expect(parsed.scheme).toBe('myapp');
|
|
34
34
|
ctx.expect(parsed.route).toBe('auth/token');
|
|
35
35
|
ctx.expect(parsed.query).toEqual({ token: 'abc', x: '1' });
|
|
@@ -38,67 +38,67 @@ module.exports = defineCases({
|
|
|
38
38
|
{
|
|
39
39
|
name: '_parseUrl handles nested paths',
|
|
40
40
|
run: (ctx) => {
|
|
41
|
-
const parsed = ctx.
|
|
41
|
+
const parsed = ctx.omega.deepLink._parseUrl('myapp://user/profile/42');
|
|
42
42
|
ctx.expect(parsed.route).toBe('user/profile/42');
|
|
43
43
|
},
|
|
44
44
|
},
|
|
45
45
|
{
|
|
46
46
|
name: '_parseUrl returns null for malformed urls',
|
|
47
47
|
run: (ctx) => {
|
|
48
|
-
ctx.expect(ctx.
|
|
48
|
+
ctx.expect(ctx.omega.deepLink._parseUrl('not a url')).toBeNull();
|
|
49
49
|
},
|
|
50
50
|
},
|
|
51
51
|
{
|
|
52
52
|
name: '_matchPattern: exact match returns empty params',
|
|
53
53
|
run: (ctx) => {
|
|
54
|
-
ctx.expect(ctx.
|
|
54
|
+
ctx.expect(ctx.omega.deepLink._matchPattern('auth/token', 'auth/token')).toEqual({});
|
|
55
55
|
},
|
|
56
56
|
},
|
|
57
57
|
{
|
|
58
58
|
name: '_matchPattern: param match returns named params',
|
|
59
59
|
run: (ctx) => {
|
|
60
|
-
ctx.expect(ctx.
|
|
60
|
+
ctx.expect(ctx.omega.deepLink._matchPattern('user/profile/42', 'user/profile/:id'))
|
|
61
61
|
.toEqual({ id: '42' });
|
|
62
|
-
ctx.expect(ctx.
|
|
62
|
+
ctx.expect(ctx.omega.deepLink._matchPattern('org/foo/repo/bar', 'org/:slug/repo/:repo'))
|
|
63
63
|
.toEqual({ slug: 'foo', repo: 'bar' });
|
|
64
64
|
},
|
|
65
65
|
},
|
|
66
66
|
{
|
|
67
67
|
name: '_matchPattern: mismatched length or static segment returns null',
|
|
68
68
|
run: (ctx) => {
|
|
69
|
-
ctx.expect(ctx.
|
|
70
|
-
ctx.expect(ctx.
|
|
69
|
+
ctx.expect(ctx.omega.deepLink._matchPattern('auth/token', 'auth/token/extra')).toBeNull();
|
|
70
|
+
ctx.expect(ctx.omega.deepLink._matchPattern('user/x/42', 'user/profile/:id')).toBeNull();
|
|
71
71
|
},
|
|
72
72
|
},
|
|
73
73
|
{
|
|
74
74
|
name: '_matchPattern: wildcard always matches',
|
|
75
75
|
run: (ctx) => {
|
|
76
|
-
ctx.expect(ctx.
|
|
76
|
+
ctx.expect(ctx.omega.deepLink._matchPattern('anything/at/all', '*')).toEqual({});
|
|
77
77
|
},
|
|
78
78
|
},
|
|
79
79
|
{
|
|
80
80
|
name: 'on() registers a handler and returns an unsubscribe fn',
|
|
81
81
|
run: (ctx) => {
|
|
82
|
-
const before = ctx.
|
|
83
|
-
const off = ctx.
|
|
84
|
-
ctx.expect(ctx.
|
|
82
|
+
const before = ctx.omega.deepLink.getHandlers().length;
|
|
83
|
+
const off = ctx.omega.deepLink.on('test/route', () => {});
|
|
84
|
+
ctx.expect(ctx.omega.deepLink.getHandlers().length).toBe(before + 1);
|
|
85
85
|
off();
|
|
86
|
-
ctx.expect(ctx.
|
|
86
|
+
ctx.expect(ctx.omega.deepLink.getHandlers().length).toBe(before);
|
|
87
87
|
},
|
|
88
88
|
},
|
|
89
89
|
{
|
|
90
90
|
name: 'on() validates inputs',
|
|
91
91
|
run: (ctx) => {
|
|
92
|
-
ctx.expect(() => ctx.
|
|
93
|
-
ctx.expect(() => ctx.
|
|
92
|
+
ctx.expect(() => ctx.omega.deepLink.on('', () => {})).toThrow(/non-empty string/);
|
|
93
|
+
ctx.expect(() => ctx.omega.deepLink.on('x', null)).toThrow(/must be a function/);
|
|
94
94
|
},
|
|
95
95
|
},
|
|
96
96
|
{
|
|
97
97
|
name: 'dispatch() fires the matching handler with parsed ctx',
|
|
98
98
|
run: (ctx) => {
|
|
99
99
|
let received;
|
|
100
|
-
const off = ctx.
|
|
101
|
-
ctx.
|
|
100
|
+
const off = ctx.omega.deepLink.on('user/profile/:id', (c) => { received = c; });
|
|
101
|
+
ctx.omega.deepLink.dispatch('myapp://user/profile/42?ref=tray');
|
|
102
102
|
off();
|
|
103
103
|
|
|
104
104
|
ctx.expect(received).toBeTruthy();
|
|
@@ -115,9 +115,9 @@ module.exports = defineCases({
|
|
|
115
115
|
name: 'multiple handlers for the same route fire in order',
|
|
116
116
|
run: (ctx) => {
|
|
117
117
|
const calls = [];
|
|
118
|
-
const off1 = ctx.
|
|
119
|
-
const off2 = ctx.
|
|
120
|
-
ctx.
|
|
118
|
+
const off1 = ctx.omega.deepLink.on('foo/bar', () => { calls.push('a'); });
|
|
119
|
+
const off2 = ctx.omega.deepLink.on('foo/bar', () => { calls.push('b'); });
|
|
120
|
+
ctx.omega.deepLink.dispatch('myapp://foo/bar');
|
|
121
121
|
off1(); off2();
|
|
122
122
|
ctx.expect(calls).toEqual(['a', 'b']);
|
|
123
123
|
},
|
|
@@ -126,16 +126,16 @@ module.exports = defineCases({
|
|
|
126
126
|
name: 'consumer handler runs BEFORE built-in for the same route',
|
|
127
127
|
run: (ctx) => {
|
|
128
128
|
const calls = [];
|
|
129
|
-
const off = ctx.
|
|
130
|
-
// Built-in for app/show calls
|
|
131
|
-
const origShow = ctx.
|
|
132
|
-
ctx.
|
|
129
|
+
const off = ctx.omega.deepLink.on('app/show', () => { calls.push('consumer'); });
|
|
130
|
+
// Built-in for app/show calls omega.windows.show — temporarily stub to record the call.
|
|
131
|
+
const origShow = ctx.omega.windows.show;
|
|
132
|
+
ctx.omega.windows.show = () => { calls.push('builtin'); };
|
|
133
133
|
|
|
134
134
|
try {
|
|
135
|
-
ctx.
|
|
135
|
+
ctx.omega.deepLink.dispatch('myapp://app/show');
|
|
136
136
|
ctx.expect(calls).toEqual(['consumer', 'builtin']);
|
|
137
137
|
} finally {
|
|
138
|
-
ctx.
|
|
138
|
+
ctx.omega.windows.show = origShow;
|
|
139
139
|
off();
|
|
140
140
|
}
|
|
141
141
|
},
|
|
@@ -144,18 +144,18 @@ module.exports = defineCases({
|
|
|
144
144
|
name: 'ctx.handled = true suppresses subsequent handlers (including built-ins)',
|
|
145
145
|
run: (ctx) => {
|
|
146
146
|
const calls = [];
|
|
147
|
-
const off = ctx.
|
|
147
|
+
const off = ctx.omega.deepLink.on('app/show', (c) => {
|
|
148
148
|
calls.push('consumer');
|
|
149
149
|
c.handled = true;
|
|
150
150
|
});
|
|
151
|
-
const origShow = ctx.
|
|
152
|
-
ctx.
|
|
151
|
+
const origShow = ctx.omega.windows.show;
|
|
152
|
+
ctx.omega.windows.show = () => { calls.push('builtin'); };
|
|
153
153
|
|
|
154
154
|
try {
|
|
155
|
-
ctx.
|
|
155
|
+
ctx.omega.deepLink.dispatch('myapp://app/show');
|
|
156
156
|
ctx.expect(calls).toEqual(['consumer']);
|
|
157
157
|
} finally {
|
|
158
|
-
ctx.
|
|
158
|
+
ctx.omega.windows.show = origShow;
|
|
159
159
|
off();
|
|
160
160
|
}
|
|
161
161
|
},
|
|
@@ -164,14 +164,14 @@ module.exports = defineCases({
|
|
|
164
164
|
name: 'wildcard handler runs only when no concrete handler matched',
|
|
165
165
|
run: (ctx) => {
|
|
166
166
|
const calls = [];
|
|
167
|
-
const offWild = ctx.
|
|
168
|
-
const offConcrete = ctx.
|
|
167
|
+
const offWild = ctx.omega.deepLink.on('*', () => { calls.push('wild'); });
|
|
168
|
+
const offConcrete = ctx.omega.deepLink.on('foo/bar', () => { calls.push('concrete'); });
|
|
169
169
|
|
|
170
170
|
// Concrete match → wildcard does NOT fire.
|
|
171
|
-
ctx.
|
|
171
|
+
ctx.omega.deepLink.dispatch('myapp://foo/bar');
|
|
172
172
|
|
|
173
173
|
// No concrete match → wildcard fires.
|
|
174
|
-
ctx.
|
|
174
|
+
ctx.omega.deepLink.dispatch('myapp://nothing/here');
|
|
175
175
|
|
|
176
176
|
offWild(); offConcrete();
|
|
177
177
|
|
|
@@ -179,55 +179,55 @@ module.exports = defineCases({
|
|
|
179
179
|
},
|
|
180
180
|
},
|
|
181
181
|
{
|
|
182
|
-
name: 'built-in app/show calls
|
|
182
|
+
name: 'built-in app/show calls omega.windows.show with query.window',
|
|
183
183
|
run: (ctx) => {
|
|
184
184
|
let shownName = null;
|
|
185
|
-
const orig = ctx.
|
|
186
|
-
ctx.
|
|
185
|
+
const orig = ctx.omega.windows.show;
|
|
186
|
+
ctx.omega.windows.show = (name) => { shownName = name; };
|
|
187
187
|
|
|
188
188
|
try {
|
|
189
|
-
ctx.
|
|
189
|
+
ctx.omega.deepLink.dispatch('myapp://app/show?window=settings');
|
|
190
190
|
ctx.expect(shownName).toBe('settings');
|
|
191
191
|
|
|
192
192
|
shownName = null;
|
|
193
|
-
ctx.
|
|
193
|
+
ctx.omega.deepLink.dispatch('myapp://app/show');
|
|
194
194
|
ctx.expect(shownName).toBe('main');
|
|
195
195
|
} finally {
|
|
196
|
-
ctx.
|
|
196
|
+
ctx.omega.windows.show = orig;
|
|
197
197
|
}
|
|
198
198
|
},
|
|
199
199
|
},
|
|
200
200
|
{
|
|
201
|
-
name: 'built-in auth/token calls
|
|
201
|
+
name: 'built-in auth/token calls auth.handleToken when available',
|
|
202
202
|
run: (ctx) => {
|
|
203
203
|
let receivedToken = null;
|
|
204
|
-
const origHandler = ctx.
|
|
205
|
-
ctx.
|
|
204
|
+
const origHandler = ctx.omega.auth.handleToken;
|
|
205
|
+
ctx.omega.auth.handleToken = (token) => { receivedToken = token; };
|
|
206
206
|
|
|
207
207
|
try {
|
|
208
|
-
ctx.
|
|
208
|
+
ctx.omega.deepLink.dispatch('myapp://auth/token?authToken=abc123');
|
|
209
209
|
ctx.expect(receivedToken).toBe('abc123');
|
|
210
210
|
} finally {
|
|
211
|
-
ctx.
|
|
211
|
+
ctx.omega.auth.handleToken = origHandler;
|
|
212
212
|
}
|
|
213
213
|
},
|
|
214
214
|
},
|
|
215
215
|
{
|
|
216
216
|
// MODERN shape only: ?authToken= (what the website's token page sends).
|
|
217
|
-
//
|
|
217
|
+
// Older formats (?token=, ?payload=) are ignored.
|
|
218
218
|
name: 'built-in auth/token reads ONLY ?authToken= (legacy ?token=/?payload= ignored)',
|
|
219
219
|
run: (ctx) => {
|
|
220
220
|
let called = false;
|
|
221
|
-
const origHandler = ctx.
|
|
222
|
-
ctx.
|
|
221
|
+
const origHandler = ctx.omega.auth.handleToken;
|
|
222
|
+
ctx.omega.auth.handleToken = () => { called = true; };
|
|
223
223
|
|
|
224
224
|
try {
|
|
225
|
-
ctx.
|
|
225
|
+
ctx.omega.deepLink.dispatch('myapp://auth/token?token=legacy1');
|
|
226
226
|
const payload = encodeURIComponent(JSON.stringify({ token: 'legacy2' }));
|
|
227
|
-
ctx.
|
|
227
|
+
ctx.omega.deepLink.dispatch(`myapp://auth/token?payload=${payload}`);
|
|
228
228
|
ctx.expect(called).toBe(false);
|
|
229
229
|
} finally {
|
|
230
|
-
ctx.
|
|
230
|
+
ctx.omega.auth.handleToken = origHandler;
|
|
231
231
|
}
|
|
232
232
|
},
|
|
233
233
|
},
|
|
@@ -235,37 +235,37 @@ module.exports = defineCases({
|
|
|
235
235
|
name: '_extractUrlFromArgv finds the url in argv',
|
|
236
236
|
run: (ctx) => {
|
|
237
237
|
const argv = ['/path/to/electron', 'main.js', '--flag', 'myapp://auth/token?token=x'];
|
|
238
|
-
ctx.expect(ctx.
|
|
238
|
+
ctx.expect(ctx.omega.deepLink._extractUrlFromArgv(argv)).toBe('myapp://auth/token?token=x');
|
|
239
239
|
},
|
|
240
240
|
},
|
|
241
241
|
{
|
|
242
242
|
name: '_extractUrlFromArgv returns null when no scheme matches',
|
|
243
243
|
run: (ctx) => {
|
|
244
244
|
const argv = ['/path/to/electron', 'main.js', '--flag', 'https://example.com'];
|
|
245
|
-
ctx.expect(ctx.
|
|
245
|
+
ctx.expect(ctx.omega.deepLink._extractUrlFromArgv(argv)).toBeNull();
|
|
246
246
|
},
|
|
247
247
|
},
|
|
248
248
|
{
|
|
249
249
|
// wave-5 F1: a cold-start auth/token used to dispatch via setImmediate,
|
|
250
|
-
// long before
|
|
251
|
-
name: 'dispatches before
|
|
250
|
+
// long before auth booted Firebase, the token was dropped.
|
|
251
|
+
name: 'dispatches before markOmegaReady() are queued and drained on it',
|
|
252
252
|
run: (ctx) => {
|
|
253
|
-
const dl = ctx.
|
|
253
|
+
const dl = ctx.omega.deepLink;
|
|
254
254
|
const calls = [];
|
|
255
255
|
const off = dl.on('queued/route', (c) => calls.push(c.query.v));
|
|
256
|
-
const origReady = dl.
|
|
256
|
+
const origReady = dl._omegaReady;
|
|
257
257
|
try {
|
|
258
|
-
dl.
|
|
258
|
+
dl._omegaReady = false;
|
|
259
259
|
dl._handle('myapp://queued/route?v=early', 'cold-start');
|
|
260
260
|
ctx.expect(calls).toEqual([]); // held, not dispatched
|
|
261
261
|
ctx.expect(dl._bootQueue.length).toBe(1);
|
|
262
262
|
|
|
263
|
-
dl.
|
|
263
|
+
dl.markOmegaReady();
|
|
264
264
|
ctx.expect(calls).toEqual(['early']); // drained in order
|
|
265
265
|
ctx.expect(dl._bootQueue.length).toBe(0);
|
|
266
|
-
ctx.expect(dl.
|
|
266
|
+
ctx.expect(dl._omegaReady).toBe(true);
|
|
267
267
|
} finally {
|
|
268
|
-
dl.
|
|
268
|
+
dl._omegaReady = origReady;
|
|
269
269
|
off();
|
|
270
270
|
}
|
|
271
271
|
},
|
|
@@ -277,13 +277,13 @@ module.exports = defineCases({
|
|
|
277
277
|
// the case can only pass by reading the fourth argument.
|
|
278
278
|
name: 'second-instance reads argv/cwd from additionalData when it rides along',
|
|
279
279
|
run: (ctx) => {
|
|
280
|
-
const brandId = ctx.
|
|
280
|
+
const brandId = ctx.omega.config.brand.id;
|
|
281
281
|
const url = `${brandId}://dup/launch?k=v`;
|
|
282
282
|
let received;
|
|
283
|
-
const off = ctx.
|
|
283
|
+
const off = ctx.omega.deepLink.on('dup/launch', (c) => { received = c; });
|
|
284
284
|
|
|
285
285
|
try {
|
|
286
|
-
ctx.
|
|
286
|
+
ctx.omega.protocol._electron.app.emit(
|
|
287
287
|
'second-instance',
|
|
288
288
|
{},
|
|
289
289
|
['/bin/app', '--title', '--message', '--allow-file-access-from-files', 'B', 'two'],
|
|
@@ -307,13 +307,13 @@ module.exports = defineCases({
|
|
|
307
307
|
// A duplicate built before #921 passes no object, so the event's own argv still dispatches.
|
|
308
308
|
name: 'second-instance falls back to the event argv when no additionalData rides along',
|
|
309
309
|
run: (ctx) => {
|
|
310
|
-
const brandId = ctx.
|
|
310
|
+
const brandId = ctx.omega.config.brand.id;
|
|
311
311
|
const url = `${brandId}://dup/fallback?k=v`;
|
|
312
312
|
let received;
|
|
313
|
-
const off = ctx.
|
|
313
|
+
const off = ctx.omega.deepLink.on('dup/fallback', (c) => { received = c; });
|
|
314
314
|
|
|
315
315
|
try {
|
|
316
|
-
ctx.
|
|
316
|
+
ctx.omega.protocol._electron.app.emit('second-instance', {}, ['/bin/app', url], '/z');
|
|
317
317
|
|
|
318
318
|
ctx.expect(received).toBeTruthy();
|
|
319
319
|
ctx.expect(received.url).toBe(url);
|
|
@@ -328,11 +328,11 @@ module.exports = defineCases({
|
|
|
328
328
|
name: 'handler errors do not stop subsequent handlers',
|
|
329
329
|
run: (ctx) => {
|
|
330
330
|
const calls = [];
|
|
331
|
-
const off1 = ctx.
|
|
332
|
-
const off2 = ctx.
|
|
331
|
+
const off1 = ctx.omega.deepLink.on('error/route', () => { throw new Error('boom'); });
|
|
332
|
+
const off2 = ctx.omega.deepLink.on('error/route', () => { calls.push('after-error'); });
|
|
333
333
|
|
|
334
334
|
// Should not throw to the caller.
|
|
335
|
-
ctx.
|
|
335
|
+
ctx.omega.deepLink.dispatch('myapp://error/route');
|
|
336
336
|
off1(); off2();
|
|
337
337
|
|
|
338
338
|
ctx.expect(calls).toEqual(['after-error']);
|
|
@@ -11,17 +11,17 @@ module.exports = defineCases({
|
|
|
11
11
|
description: 'fontawesome (main)',
|
|
12
12
|
tests: [
|
|
13
13
|
{
|
|
14
|
-
name: '
|
|
14
|
+
name: 'omega.fontawesome is initialized with the full API surface',
|
|
15
15
|
run: (ctx) => {
|
|
16
|
-
ctx.expect(ctx.
|
|
17
|
-
ctx.expect(typeof ctx.
|
|
18
|
-
ctx.expect(typeof ctx.
|
|
16
|
+
ctx.expect(ctx.omega.fontawesome._initialized).toBe(true);
|
|
17
|
+
ctx.expect(typeof ctx.omega.fontawesome.get).toBe('function');
|
|
18
|
+
ctx.expect(typeof ctx.omega.fontawesome.has).toBe('function');
|
|
19
19
|
},
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
name: 'get() resolves a solid icon to an inline SVG sized 1em/currentColor',
|
|
23
23
|
run: (ctx) => {
|
|
24
|
-
const svg = ctx.
|
|
24
|
+
const svg = ctx.omega.fontawesome.get('play');
|
|
25
25
|
ctx.expect(typeof svg).toBe('string');
|
|
26
26
|
ctx.expect(svg.startsWith('<svg ')).toBe(true);
|
|
27
27
|
ctx.expect(svg.includes('width="1em"')).toBe(true);
|
|
@@ -36,7 +36,7 @@ module.exports = defineCases({
|
|
|
36
36
|
// fa-lock's shackle peaks at y=-32 in a 0 0 384 512 viewBox; the SVG
|
|
37
37
|
// root default (overflow: hidden) clips it — FA's own kit renders
|
|
38
38
|
// with overflow visible, so the serve path must too.
|
|
39
|
-
const svg = ctx.
|
|
39
|
+
const svg = ctx.omega.fontawesome.get('lock');
|
|
40
40
|
ctx.expect(typeof svg).toBe('string');
|
|
41
41
|
ctx.expect(svg.includes('overflow="visible"')).toBe(true);
|
|
42
42
|
},
|
|
@@ -44,8 +44,8 @@ module.exports = defineCases({
|
|
|
44
44
|
{
|
|
45
45
|
name: 'solid is the default style; brands resolve when named',
|
|
46
46
|
run: (ctx) => {
|
|
47
|
-
ctx.expect(ctx.
|
|
48
|
-
const brand = ctx.
|
|
47
|
+
ctx.expect(ctx.omega.fontawesome.get('rocket')).toBe(ctx.omega.fontawesome.get('rocket', 'solid'));
|
|
48
|
+
const brand = ctx.omega.fontawesome.get('github', 'brands');
|
|
49
49
|
ctx.expect(typeof brand).toBe('string');
|
|
50
50
|
ctx.expect(brand.startsWith('<svg ')).toBe(true);
|
|
51
51
|
},
|
|
@@ -54,20 +54,20 @@ module.exports = defineCases({
|
|
|
54
54
|
name: 'FA aliases resolve (via the fontawesome-free metadata map)',
|
|
55
55
|
run: (ctx) => {
|
|
56
56
|
// 'search' is the classic alias of 'magnifying-glass'.
|
|
57
|
-
ctx.expect(ctx.
|
|
58
|
-
ctx.expect(ctx.
|
|
57
|
+
ctx.expect(ctx.omega.fontawesome.has('search')).toBe(true);
|
|
58
|
+
ctx.expect(ctx.omega.fontawesome.has('magnifying-glass')).toBe(true);
|
|
59
59
|
},
|
|
60
60
|
},
|
|
61
61
|
{
|
|
62
62
|
name: 'unknown names and unknown styles return null (never throw)',
|
|
63
63
|
run: (ctx) => {
|
|
64
|
-
ctx.expect(ctx.
|
|
64
|
+
ctx.expect(ctx.omega.fontawesome.get('definitely-not-an-icon-xyz')).toBe(null);
|
|
65
65
|
// 'no-such-style' is shape-valid but exists in NO Font Awesome set —
|
|
66
66
|
// stays null even after a brand supplies Pro (whose styles, like
|
|
67
67
|
// duotone, are legitimate lookups now).
|
|
68
|
-
ctx.expect(ctx.
|
|
69
|
-
ctx.expect(ctx.
|
|
70
|
-
ctx.expect(ctx.
|
|
68
|
+
ctx.expect(ctx.omega.fontawesome.get('play', 'no-such-style')).toBe(null);
|
|
69
|
+
ctx.expect(ctx.omega.fontawesome.get('play', '../solid')).toBe(null);
|
|
70
|
+
ctx.expect(ctx.omega.fontawesome.has('definitely-not-an-icon-xyz')).toBe(false);
|
|
71
71
|
},
|
|
72
72
|
},
|
|
73
73
|
{
|
|
@@ -76,7 +76,7 @@ module.exports = defineCases({
|
|
|
76
76
|
const os = require('os');
|
|
77
77
|
const path = require('path');
|
|
78
78
|
const jetpack = require('fs-jetpack');
|
|
79
|
-
const fa = ctx.
|
|
79
|
+
const fa = ctx.omega.fontawesome;
|
|
80
80
|
|
|
81
81
|
const brandRoot = path.join(os.tmpdir(), `omega-fa-test-${process.pid}`);
|
|
82
82
|
jetpack.write(
|
|
@@ -112,34 +112,34 @@ module.exports = defineCases({
|
|
|
112
112
|
{
|
|
113
113
|
name: 'non-slug names are rejected — no path traversal, no crashes',
|
|
114
114
|
run: (ctx) => {
|
|
115
|
-
ctx.expect(ctx.
|
|
116
|
-
ctx.expect(ctx.
|
|
117
|
-
ctx.expect(ctx.
|
|
118
|
-
ctx.expect(ctx.
|
|
119
|
-
ctx.expect(ctx.
|
|
120
|
-
ctx.expect(ctx.
|
|
121
|
-
ctx.expect(ctx.
|
|
115
|
+
ctx.expect(ctx.omega.fontawesome.get('../../package')).toBe(null);
|
|
116
|
+
ctx.expect(ctx.omega.fontawesome.get('..')).toBe(null);
|
|
117
|
+
ctx.expect(ctx.omega.fontawesome.get('play.svg/../../secrets')).toBe(null);
|
|
118
|
+
ctx.expect(ctx.omega.fontawesome.get('')).toBe(null);
|
|
119
|
+
ctx.expect(ctx.omega.fontawesome.get(null)).toBe(null);
|
|
120
|
+
ctx.expect(ctx.omega.fontawesome.get(42)).toBe(null);
|
|
121
|
+
ctx.expect(ctx.omega.fontawesome.get('Play')).toBe(null); // uppercase is not a slug
|
|
122
122
|
},
|
|
123
123
|
},
|
|
124
124
|
{
|
|
125
125
|
name: 'lookups are cached — same string instance on repeat calls',
|
|
126
126
|
run: (ctx) => {
|
|
127
|
-
const first = ctx.
|
|
128
|
-
const second = ctx.
|
|
127
|
+
const first = ctx.omega.fontawesome.get('play');
|
|
128
|
+
const second = ctx.omega.fontawesome.get('play');
|
|
129
129
|
ctx.expect(first === second).toBe(true);
|
|
130
130
|
},
|
|
131
131
|
},
|
|
132
132
|
{
|
|
133
133
|
name: 'desktop:fontawesome:get IPC handler round-trips (and nulls bad input)',
|
|
134
134
|
run: async (ctx) => {
|
|
135
|
-
const ok = await ctx.
|
|
135
|
+
const ok = await ctx.omega.ipc.invoke('desktop:fontawesome:get', { name: 'play', style: 'solid' });
|
|
136
136
|
ctx.expect(typeof ok.svg).toBe('string');
|
|
137
137
|
ctx.expect(ok.svg.startsWith('<svg ')).toBe(true);
|
|
138
138
|
|
|
139
|
-
const bad = await ctx.
|
|
139
|
+
const bad = await ctx.omega.ipc.invoke('desktop:fontawesome:get', { name: '../../etc/passwd' });
|
|
140
140
|
ctx.expect(bad.svg).toBe(null);
|
|
141
141
|
|
|
142
|
-
const empty = await ctx.
|
|
142
|
+
const empty = await ctx.omega.ipc.invoke('desktop:fontawesome:get', {});
|
|
143
143
|
ctx.expect(empty.svg).toBe(null);
|
|
144
144
|
},
|
|
145
145
|
},
|