@omega.js/desktop 0.53.0 → 0.54.1
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 +38 -38
- package/dist/cli-run.js +4 -1
- package/dist/cli.js +2 -2
- package/dist/commands/cdp/client.js +1 -1
- package/dist/commands/cdp.js +1 -1
- package/dist/commands/clean.js +2 -3
- package/dist/commands/dev.js +25 -0
- package/dist/commands/lib/ensure-target.js +12 -17
- package/dist/commands/lib/migrate.js +17 -0
- package/dist/commands/logs.js +1 -1
- package/dist/commands/release.js +1 -1
- package/dist/commands/test.js +4 -4
- package/dist/commands/update.js +5 -4
- 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 +36 -36
- package/dist/defaults/docs/README.md +3 -3
- package/dist/defaults/gulpfile.js +1 -1
- package/dist/defaults/hooks/build/post.js +1 -1
- package/dist/defaults/hooks/build/pre.js +1 -1
- package/dist/defaults/hooks/notarize/post.js +2 -2
- package/dist/defaults/hooks/release/post.js +1 -1
- package/dist/defaults/hooks/release/pre.js +1 -1
- 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 +11 -11
- package/dist/defaults/src/integrations/menu/index.js +5 -5
- package/dist/defaults/src/integrations/tray/index.js +9 -9
- package/dist/defaults/src/main.js +2 -2
- package/dist/defaults/src/preload.js +1 -1
- package/dist/defaults/test/README.md +3 -3
- package/dist/defaults/test/_init.js +1 -1
- package/dist/gulp/tasks/audit.js +5 -8
- package/dist/lib/restart-manager/index.js +1 -1
- package/dist/lib/restart-manager/install.js +1 -1
- package/dist/lib/restart-manager/protocol.js +1 -1
- package/dist/main.js +4 -3
- package/dist/preload.js +1 -1
- package/dist/test/suites/build/audit.test.js +20 -7
- package/dist/test/suites/build/build-workflow-jobs.test.js +2 -2
- package/dist/test/suites/build/cli.test.js +28 -0
- package/dist/test/suites/build/defaults-em-dash.test.js +22 -0
- package/dist/test/suites/build/defaults-scaffold.test.js +19 -5
- 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 +4 -2
- package/dist/test/suites/build/dev-verb.test.js +67 -0
- package/dist/test/suites/build/ensure-target.test.js +11 -3
- package/dist/test/suites/build/merge-line-files.test.js +6 -6
- package/dist/test/suites/build/migrate.test.js +29 -0
- package/dist/test/suites/build/project-scripts-deps.test.js +6 -10
- package/dist/test/suites/build/runner-env-write.test.js +73 -0
- package/dist/test/suites/build/runner.test.js +9 -8
- package/dist/test/suites/build/setup-scripts.test.js +27 -0
- package/dist/test/suites/build/validate-config.test.js +13 -2
- package/dist/test/suites/build/verb-logs.test.js +20 -0
- package/dist/test/suites/renderer/window-desktop-surface.test.js +1 -1
- package/dist/utils/build-pipeline.js +4 -4
- package/dist/utils/runner-env.js +13 -28
- 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/index.js +13 -17
- package/dist/vendor/config/load.js +15 -7
- 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 +99 -152
- package/dist/vendor/config/validate.js +97 -77
- package/dist/vendor/devkit/agents-md.js +233 -0
- package/dist/vendor/devkit/attach-log-file.js +15 -1
- package/dist/vendor/devkit/ci-workflows.js +30 -30
- package/dist/vendor/devkit/cli-router.js +13 -7
- package/dist/vendor/devkit/defaults-engine.js +9 -43
- package/dist/vendor/devkit/deploy-snapshot.js +44 -9
- package/dist/vendor/devkit/env-lines.js +183 -0
- package/dist/vendor/devkit/local.js +62 -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 -176
- 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/update.js +15 -15
- package/dist/vendor/devkit/verb-scripts.js +40 -0
- package/dist/vendor/devkit/verbs.js +170 -0
- package/package.json +18 -24
- package/dist/commands/install.js +0 -37
- package/dist/defaults/AGENTS.md +0 -119
- package/dist/defaults/CLAUDE.md +0 -1
- 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/auth.md +0 -284
- package/docs/auto-updater.md +0 -243
- package/docs/boot-sequence.md +0 -44
- package/docs/build-system.md +0 -169
- package/docs/cdp-debugging.md +0 -169
- 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 -84
- package/docs/deep-link.md +0 -186
- package/docs/environment-detection.md +0 -112
- package/docs/fontawesome.md +0 -109
- package/docs/hooks.md +0 -89
- package/docs/icons.md +0 -79
- package/docs/index.md +0 -328
- 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 -227
- 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 -917
- package/docs/shared/config.md +0 -1948
- 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 -342
- 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
|
@@ -1,31 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @omega.js/config repo: the ONE derivation of every repo a brand owns
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* name derives from the `<brand.id>-<role>` rule (Ian 2026-09-07,
|
|
13
|
-
* [#809](https://github.com/Omega-JS-Stack/omega/issues/809)), one function per
|
|
14
|
-
* role, so nobody types a repo name to get the right one:
|
|
15
|
-
*
|
|
16
|
-
* - `<brand.id>-omega` the SOURCE monorepo (`sourceRepo`)
|
|
17
|
-
* - `<brand.id>-releases` the public release channel (`releasesRepo`)
|
|
18
|
-
* - `<brand.id>-<name>` one per web target that GitHub hosts (`websiteRepo`)
|
|
19
|
-
*
|
|
20
|
-
* A repo name that must differ is a brand id that must differ: the override
|
|
21
|
-
* keys (`repo.providers.github.repo`, the top-level `github` block,
|
|
22
|
-
* `targets.<name>.github.repo`, `targets.desktop.releases.owner/repo`) are
|
|
23
|
-
* retired, each with a row in retired-keys.js.
|
|
24
|
-
*
|
|
25
|
-
* Visibility is NOT in omega.json5 either: the brand root's package.json
|
|
26
|
-
* `private` field is the one statement of it (`brandVisibility`), absent
|
|
27
|
-
* meaning private, because every brand monorepo is private by default
|
|
28
|
-
* (Ian 2026-09-11).
|
|
2
|
+
* @omega.js/config repo: the ONE derivation of every repo a brand owns. One
|
|
3
|
+
* block says where a brand hosts its code, `repo: { provider: 'github', org }`:
|
|
4
|
+
* its presence enables the repo service, `provider` defaults to `github`, and
|
|
5
|
+
* `org` is the only typed value. No repo NAME is configured anywhere; each
|
|
6
|
+
* derives from `<brand.id>-<role>`, one function per role: `<brand.id>-omega`
|
|
7
|
+
* the source monorepo (`sourceRepo`), `<brand.id>-releases` the public release
|
|
8
|
+
* channel (`releasesRepo`), `<brand.id>-<name>` per GitHub-hosted web target
|
|
9
|
+
* (`websiteRepo`). The old override keys are rows in @omega.js/manager's
|
|
10
|
+
* src/migrate/retired-keys.js. Visibility is the brand root package.json's
|
|
11
|
+
* `private` field (`brandVisibility`), absent meaning private.
|
|
29
12
|
*/
|
|
30
13
|
|
|
31
14
|
const fs = require('node:fs');
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema rules for the `client` blob: the @omega.js/client settings bag a web
|
|
3
|
+
* target carries. The bag is OPEN (the client normalizes it against its own
|
|
4
|
+
* defaults); only the keys a brand authors, and consent, are typed.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const CLIENT_RULES = [
|
|
8
|
+
{
|
|
9
|
+
path: 'client',
|
|
10
|
+
type: 'object',
|
|
11
|
+
open: true,
|
|
12
|
+
required: false,
|
|
13
|
+
description: "The @omega.js/client runtime settings (auth, firebase, exitPopup, …), merged over the client's own defaults. Open by design: only consent and the keys a brand authors are typed below.",
|
|
14
|
+
},
|
|
15
|
+
|
|
16
|
+
// Consent decides whether a visitor is tracked at all: a typo that silently
|
|
17
|
+
// disabled the banner would ship a site with no consent gate and no error.
|
|
18
|
+
{
|
|
19
|
+
path: 'client.consent.enabled',
|
|
20
|
+
type: 'boolean',
|
|
21
|
+
required: false,
|
|
22
|
+
default: true,
|
|
23
|
+
description: 'The consent banner + the provider-script gate (default true). false ships NO banner: legal only for a site that loads no analytics/marketing provider at all.',
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
path: 'client.consent.config.position',
|
|
27
|
+
type: 'string',
|
|
28
|
+
required: false,
|
|
29
|
+
enum: ['bottom-left', 'bottom-right', 'bottom'],
|
|
30
|
+
description: "Where the panel sits. 'bottom' is the centered full-width form.",
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
path: 'client.consent.config.content',
|
|
34
|
+
type: 'object',
|
|
35
|
+
required: false,
|
|
36
|
+
description: "Banner copy: message, panelIntro, accept, customize, acceptAll, acceptNone (a literal `{terms}`/`{cookies}` links the terms/cookie-policy page). Category labels are framework copy: a brand renames the buttons, not the categories.",
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
// The keys a BRAND authors: each one reaches the client payload and changes
|
|
40
|
+
// what the site does, so each one is typed.
|
|
41
|
+
{
|
|
42
|
+
path: 'client.auth.config.policy',
|
|
43
|
+
type: 'string',
|
|
44
|
+
required: false,
|
|
45
|
+
enum: ['authenticated', 'unauthenticated', 'disabled'],
|
|
46
|
+
description: "Who a page is FOR: 'authenticated' redirects a signed-out visitor to the signin route, 'unauthenticated' redirects a signed-in one away, 'disabled' skips the auth module entirely (a vert iframe). Absent = no policy, which is the site-wide answer: the auth/admin layouts set theirs in page frontmatter, so a brand only sets this to blanket a whole site.",
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
path: 'client.exitPopup.enabled',
|
|
50
|
+
type: 'boolean',
|
|
51
|
+
required: false,
|
|
52
|
+
default: true,
|
|
53
|
+
description: 'The exit-intent offer popup (default true). false ships no popup at all; its copy, timeout and avatars live under client.exitPopup.config.',
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
path: 'client.serviceWorker.enabled',
|
|
57
|
+
type: 'boolean',
|
|
58
|
+
required: false,
|
|
59
|
+
default: true,
|
|
60
|
+
description: 'Registers the site service worker (default true): the offline/refresh lane and the push-notification registration ride it. false unregisters any worker the visitor already has.',
|
|
61
|
+
},
|
|
62
|
+
];
|
|
63
|
+
|
|
64
|
+
module.exports = { CLIENT_RULES };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema rules for `cloud.config`, the provider's web-app config. For firebase
|
|
3
|
+
* it is the console's config verbatim: public by design (the web API key is no
|
|
4
|
+
* secret), and every key the Firebase web SDK takes is typed.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const FIREBASE_WEB_KEYS = {
|
|
8
|
+
apiKey: 'The web API key the Firebase SDKs identify the project with. Public by design: it ships in every browser bundle.',
|
|
9
|
+
authDomain: "The Firebase Auth domain: the BRAND host, where the web build self-hosts /__/auth/* (docs/shared/config.md → authDomain).",
|
|
10
|
+
databaseURL: 'The Realtime Database URL, for a project that has one.',
|
|
11
|
+
storageBucket: 'The default Cloud Storage bucket.',
|
|
12
|
+
messagingSenderId: 'The Cloud Messaging sender id web push registers against.',
|
|
13
|
+
appId: 'The Firebase web app id.',
|
|
14
|
+
measurementId: 'The Google Analytics measurement id Firebase links to the web app.',
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const CLOUD_CONFIG_RULES = [
|
|
18
|
+
{
|
|
19
|
+
path: 'cloud.config',
|
|
20
|
+
type: 'object',
|
|
21
|
+
required: false,
|
|
22
|
+
description: 'Provider app config. For firebase: the web-app config verbatim from the console. Public by design: the web API key is not a secret.',
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
path: 'cloud.config.projectId',
|
|
26
|
+
type: 'string',
|
|
27
|
+
required: false,
|
|
28
|
+
description: 'Drives auth, emulator project selection, analytics uuidv5 namespace, remote-config URL fallbacks.',
|
|
29
|
+
},
|
|
30
|
+
...Object.entries(FIREBASE_WEB_KEYS).map(([key, description]) => ({
|
|
31
|
+
path: `cloud.config.${key}`,
|
|
32
|
+
type: 'string',
|
|
33
|
+
required: false,
|
|
34
|
+
description,
|
|
35
|
+
})),
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
module.exports = { CLOUD_CONFIG_RULES };
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema rules for the keys the manager's services (and the backend's content
|
|
3
|
+
* generators) read or write back: the brand switch, service switches, and the
|
|
4
|
+
* Stripe, GA4, devlog, blog and SEO engine data. The four zero-data switches
|
|
5
|
+
* default ON here and are materialized into brand files; the engine data's
|
|
6
|
+
* defaults stay in the manager's config.js.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const MANAGER_RULES = [
|
|
10
|
+
{
|
|
11
|
+
path: 'enabled',
|
|
12
|
+
type: 'boolean',
|
|
13
|
+
required: false,
|
|
14
|
+
default: true,
|
|
15
|
+
description: 'Whether the brand is active. `false` makes the manager skip it: a company run stamps it but never spawns its walk.',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
path: 'server.enabled',
|
|
19
|
+
type: 'boolean',
|
|
20
|
+
required: false,
|
|
21
|
+
default: true,
|
|
22
|
+
description: "false (or `server: false`) skips the manager's server service, which registers this brand in the company server's brands collection.",
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
path: 'assets.enabled',
|
|
26
|
+
type: 'boolean',
|
|
27
|
+
required: false,
|
|
28
|
+
default: true,
|
|
29
|
+
description: "false (or `assets: false`) skips the manager's assets service, which derives the brand's visual collateral from its logo sources.",
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
path: 'payment.enabled',
|
|
33
|
+
type: 'boolean',
|
|
34
|
+
required: false,
|
|
35
|
+
default: true,
|
|
36
|
+
description: "false skips the manager's payment service: no provider account, product, webhook or Radar reconciliation for this brand.",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
path: 'payment.providers.stripe.updateAccountInfo',
|
|
40
|
+
type: 'boolean',
|
|
41
|
+
required: false,
|
|
42
|
+
description: "false leaves the Stripe account's business profile alone instead of diffing it to the brand's name, url and support email.",
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
path: 'payment.providers.stripe.radar',
|
|
46
|
+
type: 'array',
|
|
47
|
+
required: false,
|
|
48
|
+
description: "The Radar fraud rules ([{ action, predicate, description }]) the payment service prints as guidance: Radar has no API, so a human applies them in the Dashboard.",
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
path: 'payment.providers.stripe.radarConfirmed',
|
|
52
|
+
type: 'boolean',
|
|
53
|
+
required: false,
|
|
54
|
+
description: 'Machine-written: the Radar rules were applied by hand in the Dashboard. The confirmation is the record, because nothing can read them back.',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
path: 'payment.providers.stripe.disputesConfirmed',
|
|
58
|
+
type: 'boolean',
|
|
59
|
+
required: false,
|
|
60
|
+
description: 'Machine-written: Enhanced Dispute Protection was switched on by hand in the Dashboard. The confirmation is the record, because nothing can read it back.',
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
path: 'analytics.providers.google.timeZone',
|
|
64
|
+
type: 'string',
|
|
65
|
+
required: false,
|
|
66
|
+
description: 'The GA4 property reporting time zone the analytics service uses when it creates the property.',
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
path: 'analytics.providers.google.currency',
|
|
70
|
+
type: 'string',
|
|
71
|
+
required: false,
|
|
72
|
+
description: 'The GA4 property reporting currency the analytics service uses when it creates the property.',
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
path: 'analytics.providers.google.enhancedMeasurement',
|
|
76
|
+
type: 'object',
|
|
77
|
+
required: false,
|
|
78
|
+
description: "The GA4 web streams' Enhanced Measurement switches ({ scrollsEnabled, siteSearchEnabled, … }) the analytics service diffs every stream to.",
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
path: 'devlog.providers.ghostii',
|
|
82
|
+
type: 'object',
|
|
83
|
+
required: false,
|
|
84
|
+
description: 'The devlog writer and its settings (orgs, lookbackDays, excludeRepos, excludeCommits, excludeTopics, includePrivate, postPath, destinations, overrides): the manager\'s devlog pipeline reads them here.',
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
path: 'blog.enabled',
|
|
88
|
+
type: 'boolean',
|
|
89
|
+
required: false,
|
|
90
|
+
description: "true lets the backend's daily blog auto-publisher run; absent or false, it skips.",
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
path: 'blog.providers',
|
|
94
|
+
type: 'object',
|
|
95
|
+
required: false,
|
|
96
|
+
description: 'The blog writer, a KEY under `providers` (ghostii when none is picked).',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
path: 'blog.content',
|
|
100
|
+
type: 'object|array',
|
|
101
|
+
required: false,
|
|
102
|
+
description: 'The blog pipeline entries ({ sources, categories, links, postPath, … }), one object or a list.',
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
path: 'seo.enabled',
|
|
106
|
+
type: 'boolean',
|
|
107
|
+
required: false,
|
|
108
|
+
description: "false (or `seo: false`) skips the manager's seo service.",
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
path: 'seo.github',
|
|
112
|
+
type: 'object',
|
|
113
|
+
required: false,
|
|
114
|
+
description: "The parasite-SEO content repos (`seo.github.content[]`) the seo service reconciles; a `config/seo.json5` sidecar merges over it.",
|
|
115
|
+
},
|
|
116
|
+
];
|
|
117
|
+
|
|
118
|
+
module.exports = { MANAGER_RULES };
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-target rules for what a brand hands a framework verbatim: the desktop
|
|
3
|
+
* install knobs electron-builder takes, and the documented override blocks
|
|
4
|
+
* whose shape belongs to someone else (electron-builder, Electron, the MCP
|
|
5
|
+
* client), where a rule types the block and never the keys inside it.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// A platform's install knobs beside its `formats`, handed to electron-builder
|
|
9
|
+
const knob = (path, type, description) => ({ path: `platforms.${path}`, type, required: false, description });
|
|
10
|
+
|
|
11
|
+
const DESKTOP = [
|
|
12
|
+
knob('mac.arch', 'array|string', 'The mac architectures built (`universal`, `x64`, `arm64`).'),
|
|
13
|
+
knob('mac.entitlements', 'object|string', 'The mac hardened-runtime entitlements (a map, or a plist path).'),
|
|
14
|
+
knob('mac.mas.enabled', 'boolean', 'Mac App Store distribution: reserved, not implemented yet (the audit warns when true).'),
|
|
15
|
+
knob('mac.mas.provisioningProfile', 'string', 'The Mac App Store provisioning profile path (reserved).'),
|
|
16
|
+
knob('mac.mas.entitlements', 'string', 'The Mac App Store entitlements plist (reserved).'),
|
|
17
|
+
knob('mac.mas.entitlementsInherit', 'string', 'The Mac App Store inherited entitlements plist (reserved).'),
|
|
18
|
+
knob('windows.arch', 'array|string', 'The Windows architectures built (`x64`, `ia32`, `arm64`).'),
|
|
19
|
+
knob('windows.oneClick', 'boolean', 'NSIS one-click install (no wizard).'),
|
|
20
|
+
knob('windows.desktopShortcut', 'boolean', 'NSIS creates a desktop shortcut.'),
|
|
21
|
+
knob('windows.startMenuShortcut', 'boolean', 'NSIS creates a Start-menu shortcut.'),
|
|
22
|
+
knob('windows.runAfterFinish', 'boolean', 'NSIS launches the app when the install finishes.'),
|
|
23
|
+
knob('windows.perMachine', 'boolean', 'NSIS installs for every user rather than the current one.'),
|
|
24
|
+
knob('windows.signing.cloud', 'object', 'The cloud signing provider and its options, for the `cloud` signing strategy.'),
|
|
25
|
+
knob('linux.arch', 'array|string', 'The Linux architectures built (`x64`, `arm64`).'),
|
|
26
|
+
{
|
|
27
|
+
path: 'electronBuilder',
|
|
28
|
+
type: 'object',
|
|
29
|
+
required: false,
|
|
30
|
+
description: "Merged over the generated electron-builder config as the LAST layer (build-config.js), for the rare knob the framework defaults do not cover. Any electron-builder key.",
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
path: 'fileAssociations',
|
|
34
|
+
type: 'array',
|
|
35
|
+
required: false,
|
|
36
|
+
description: "The file types the packaged app registers for ([{ ext, name, role, icon }]), handed to electron-builder's fileAssociations as written.",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
path: 'protocols',
|
|
40
|
+
type: 'array',
|
|
41
|
+
required: false,
|
|
42
|
+
description: "The URL schemes the packaged app registers for ([{ name, schemes }]), handed to electron-builder's protocols as written.",
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
path: 'windows',
|
|
46
|
+
type: 'object',
|
|
47
|
+
required: false,
|
|
48
|
+
description: 'Per-window BrowserWindow options keyed by window name (`windows.main.width`); the window manager merges each over its own defaults, and a call-site override still wins.',
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
path: 'cdp',
|
|
52
|
+
type: 'object',
|
|
53
|
+
required: false,
|
|
54
|
+
description: 'The desktop cdp command\'s settings. `cdp.readySignal` is the URL substring of the view whose load marks boot complete, for an app that finishes after its first paint.',
|
|
55
|
+
},
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
const BACKEND = [
|
|
59
|
+
{
|
|
60
|
+
path: 'mcp.authUrl',
|
|
61
|
+
type: 'string',
|
|
62
|
+
required: false,
|
|
63
|
+
match: /^https?:\/\//,
|
|
64
|
+
description: "Overrides the consumer auth URL the backend's MCP OAuth flow sends a client to; unset derives `<website url>/token` (docs/backend/mcp.md).",
|
|
65
|
+
},
|
|
66
|
+
];
|
|
67
|
+
|
|
68
|
+
module.exports = { OVERRIDE_RULES: { desktop: DESKTOP, backend: BACKEND } };
|