@dxos/plugin-settings 0.8.4-main.fcfe5033a5 → 0.8.4-staging.60fe92afc8
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/LICENSE +102 -5
- package/dist/lib/neutral/SettingsPlugin.mjs +9 -0
- package/dist/lib/neutral/SettingsPlugin.mjs.map +7 -0
- package/dist/lib/neutral/chunk-3DJRTSII.mjs +16 -0
- package/dist/lib/neutral/chunk-3DJRTSII.mjs.map +7 -0
- package/dist/lib/neutral/chunk-J2FJOTAW.mjs +28 -0
- package/dist/lib/neutral/chunk-J2FJOTAW.mjs.map +7 -0
- package/dist/lib/neutral/chunk-XP4EHGJW.mjs +22 -0
- package/dist/lib/neutral/chunk-XP4EHGJW.mjs.map +7 -0
- package/dist/lib/{node-esm/types → neutral}/index.mjs +9 -2
- package/dist/lib/{browser/types → neutral}/index.mjs.map +3 -3
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/neutral/open-NRUWKEGC.mjs +28 -0
- package/dist/lib/neutral/open-NRUWKEGC.mjs.map +7 -0
- package/dist/lib/neutral/open-plugin-registry-XGFG2JWB.mjs +26 -0
- package/dist/lib/neutral/open-plugin-registry-XGFG2JWB.mjs.map +7 -0
- package/dist/lib/neutral/plugin.mjs +18 -0
- package/dist/lib/neutral/plugin.mjs.map +7 -0
- package/dist/lib/neutral/testing.mjs +7 -0
- package/dist/lib/neutral/testing.mjs.map +7 -0
- package/dist/lib/neutral/translations.mjs +15 -0
- package/dist/lib/neutral/translations.mjs.map +7 -0
- package/dist/types/src/SettingsPlugin.d.ts +1 -0
- package/dist/types/src/SettingsPlugin.d.ts.map +1 -1
- package/dist/types/src/SettingsPlugin.test.d.ts +2 -0
- package/dist/types/src/SettingsPlugin.test.d.ts.map +1 -0
- package/dist/types/src/actions.d.ts +2 -2
- package/dist/types/src/actions.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +2 -1
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
- package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +5 -0
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +2 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +1 -1
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/operations/index.d.ts +1 -1
- package/dist/types/src/operations/index.d.ts.map +1 -1
- package/dist/types/src/operations/open-plugin-registry.d.ts +1 -1
- package/dist/types/src/operations/open-plugin-registry.d.ts.map +1 -1
- package/dist/types/src/operations/open.d.ts +1 -1
- package/dist/types/src/operations/open.d.ts.map +1 -1
- package/dist/types/src/plugin.d.ts +4 -0
- package/dist/types/src/plugin.d.ts.map +1 -0
- package/dist/types/src/testing.d.ts +2 -0
- package/dist/types/src/testing.d.ts.map +1 -0
- package/dist/types/src/translations.d.ts +2 -4
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +31 -25
- package/src/SettingsPlugin.test.ts +36 -0
- package/src/SettingsPlugin.ts +5 -3
- package/src/actions.ts +1 -1
- package/src/capabilities/app-graph-builder.ts +6 -4
- package/src/capabilities/index.ts +2 -1
- package/src/capabilities/operation-handler.ts +1 -1
- package/src/capabilities/react-surface.tsx +50 -0
- package/src/index.ts +2 -1
- package/src/meta.ts +7 -4
- package/src/operations/index.ts +1 -1
- package/src/operations/open-plugin-registry.ts +6 -6
- package/src/operations/open.ts +7 -6
- package/src/plugin.ts +11 -0
- package/src/testing.ts +7 -0
- package/src/translations.ts +1 -2
- package/dist/lib/browser/index.mjs +0 -56
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/types/index.mjs +0 -9
- package/dist/lib/node-esm/index.mjs +0 -58
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/types/index.mjs.map +0 -7
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/plugin-settings",
|
|
3
|
-
"version": "0.8.4-
|
|
3
|
+
"version": "0.8.4-staging.60fe92afc8",
|
|
4
4
|
"description": "DXOS Settings plugin for managing application settings.",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"type": "git",
|
|
9
9
|
"url": "https://github.com/dxos/dxos"
|
|
10
10
|
},
|
|
11
|
-
"license": "
|
|
11
|
+
"license": "FSL-1.1-Apache-2.0",
|
|
12
12
|
"author": "DXOS.org",
|
|
13
13
|
"sideEffects": true,
|
|
14
14
|
"type": "module",
|
|
@@ -16,48 +16,54 @@
|
|
|
16
16
|
"#capabilities": "./src/capabilities/index.ts",
|
|
17
17
|
"#meta": "./src/meta.ts",
|
|
18
18
|
"#operations": "./src/operations/index.ts",
|
|
19
|
+
"#plugin": "./src/SettingsPlugin.ts",
|
|
20
|
+
"#translations": "./src/translations.ts",
|
|
19
21
|
"#types": "./src/types/index.ts"
|
|
20
22
|
},
|
|
21
23
|
"exports": {
|
|
22
24
|
".": {
|
|
23
25
|
"source": "./src/index.ts",
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"types": "./dist/types/src/index.d.ts"
|
|
26
|
+
"types": "./dist/types/src/index.d.ts",
|
|
27
|
+
"default": "./dist/lib/neutral/index.mjs"
|
|
27
28
|
},
|
|
28
|
-
"./
|
|
29
|
-
"source": "./src/
|
|
30
|
-
"types": "./dist/types/src/
|
|
31
|
-
"
|
|
32
|
-
|
|
29
|
+
"./plugin": {
|
|
30
|
+
"source": "./src/plugin.ts",
|
|
31
|
+
"types": "./dist/types/src/plugin.d.ts",
|
|
32
|
+
"default": "./dist/lib/neutral/plugin.mjs"
|
|
33
|
+
},
|
|
34
|
+
"./testing": {
|
|
35
|
+
"source": "./src/testing.ts",
|
|
36
|
+
"types": "./dist/types/src/testing.d.ts",
|
|
37
|
+
"default": "./dist/lib/neutral/testing.mjs"
|
|
38
|
+
},
|
|
39
|
+
"./translations": {
|
|
40
|
+
"source": "./src/translations.ts",
|
|
41
|
+
"types": "./dist/types/src/translations.d.ts",
|
|
42
|
+
"default": "./dist/lib/neutral/translations.mjs"
|
|
33
43
|
}
|
|
34
44
|
},
|
|
35
45
|
"types": "dist/types/src/index.d.ts",
|
|
36
|
-
"typesVersions": {
|
|
37
|
-
"*": {
|
|
38
|
-
"types": [
|
|
39
|
-
"dist/types/src/types/index.d.ts"
|
|
40
|
-
]
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
46
|
"files": [
|
|
44
47
|
"dist",
|
|
45
48
|
"src"
|
|
46
49
|
],
|
|
47
50
|
"dependencies": {
|
|
48
|
-
"@dxos/app-
|
|
49
|
-
"@dxos/app-
|
|
50
|
-
"@dxos/
|
|
51
|
-
"@dxos/
|
|
52
|
-
"@dxos/
|
|
51
|
+
"@dxos/app-graph": "0.8.4-staging.60fe92afc8",
|
|
52
|
+
"@dxos/app-framework": "0.8.4-staging.60fe92afc8",
|
|
53
|
+
"@dxos/compute": "0.8.4-staging.60fe92afc8",
|
|
54
|
+
"@dxos/app-toolkit": "0.8.4-staging.60fe92afc8",
|
|
55
|
+
"@dxos/keys": "0.8.4-staging.60fe92afc8",
|
|
56
|
+
"@dxos/react-ui-form": "0.8.4-staging.60fe92afc8",
|
|
57
|
+
"@dxos/util": "0.8.4-staging.60fe92afc8"
|
|
53
58
|
},
|
|
54
59
|
"devDependencies": {
|
|
55
60
|
"@types/react": "~19.2.7",
|
|
56
|
-
"effect": "3.
|
|
57
|
-
"react": "~19.2.3"
|
|
61
|
+
"effect": "3.21.3",
|
|
62
|
+
"react": "~19.2.3",
|
|
63
|
+
"@dxos/plugin-graph": "0.8.4-staging.60fe92afc8"
|
|
58
64
|
},
|
|
59
65
|
"peerDependencies": {
|
|
60
|
-
"effect": "3.
|
|
66
|
+
"effect": "3.21.3",
|
|
61
67
|
"react": "~19.2.3"
|
|
62
68
|
},
|
|
63
69
|
"publishConfig": {
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { describe, test } from 'vitest';
|
|
6
|
+
|
|
7
|
+
import { ProcessManagerPlugin } from '@dxos/app-framework';
|
|
8
|
+
import { createTestApp } from '@dxos/app-framework/testing';
|
|
9
|
+
import { AppActivationEvents } from '@dxos/app-toolkit';
|
|
10
|
+
import { GraphPlugin } from '@dxos/plugin-graph/plugin';
|
|
11
|
+
|
|
12
|
+
import { SettingsPlugin } from '#plugin';
|
|
13
|
+
|
|
14
|
+
import { meta } from './meta';
|
|
15
|
+
|
|
16
|
+
const moduleId = (name: string) => `${meta.id}.module.${name}`;
|
|
17
|
+
|
|
18
|
+
describe('SettingsPlugin', () => {
|
|
19
|
+
test('modules activate on the expected events', async ({ expect }) => {
|
|
20
|
+
// Use createTestApp directly to avoid a circular dep with plugin-testing.
|
|
21
|
+
// GraphPlugin fires SetupAppGraph (via firesBeforeActivation) during Startup.
|
|
22
|
+
// SettingsAppGraphBuilder activates on allOf(SetupSettings, SetupAppGraph),
|
|
23
|
+
// so SetupSettings must be fired as a setup event.
|
|
24
|
+
// ProcessManagerPlugin fires SetupProcessManager during Startup, activating OperationHandler.
|
|
25
|
+
await using harness = await createTestApp({
|
|
26
|
+
plugins: [GraphPlugin(), ProcessManagerPlugin(), SettingsPlugin()],
|
|
27
|
+
setupEvents: [AppActivationEvents.SetupSettings],
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
// SettingsAppGraphBuilder activates on allOf(SetupSettings, SetupAppGraph).
|
|
31
|
+
// OperationHandler activates on SetupProcessManager (fired by ProcessManagerPlugin during Startup).
|
|
32
|
+
expect(harness.manager.getActive()).toEqual(
|
|
33
|
+
expect.arrayContaining([moduleId('SettingsAppGraphBuilder'), moduleId('OperationHandler')]),
|
|
34
|
+
);
|
|
35
|
+
});
|
|
36
|
+
});
|
package/src/SettingsPlugin.ts
CHANGED
|
@@ -5,14 +5,16 @@
|
|
|
5
5
|
import { Plugin } from '@dxos/app-framework';
|
|
6
6
|
import { AppPlugin } from '@dxos/app-toolkit';
|
|
7
7
|
|
|
8
|
-
import { OperationHandler, SettingsAppGraphBuilder } from '#capabilities';
|
|
8
|
+
import { OperationHandler, ReactSurface, SettingsAppGraphBuilder } from '#capabilities';
|
|
9
9
|
import { meta } from '#meta';
|
|
10
|
-
|
|
11
|
-
import { translations } from './translations';
|
|
10
|
+
import { translations } from '#translations';
|
|
12
11
|
|
|
13
12
|
export const SettingsPlugin = Plugin.define(meta).pipe(
|
|
14
13
|
AppPlugin.addAppGraphModule({ activate: SettingsAppGraphBuilder }),
|
|
15
14
|
AppPlugin.addOperationHandlerModule({ activate: OperationHandler }),
|
|
15
|
+
AppPlugin.addSurfaceModule({ activate: ReactSurface }),
|
|
16
16
|
AppPlugin.addTranslationsModule({ translations }),
|
|
17
17
|
Plugin.make,
|
|
18
18
|
);
|
|
19
|
+
|
|
20
|
+
export default SettingsPlugin;
|
package/src/actions.ts
CHANGED
|
@@ -17,7 +17,7 @@ export namespace SettingsAction {
|
|
|
17
17
|
output: Schema.Void,
|
|
18
18
|
}) {}
|
|
19
19
|
|
|
20
|
-
export class OpenPluginRegistry extends Schema.TaggedClass<OpenPluginRegistry>()(`${meta.id}.
|
|
20
|
+
export class OpenPluginRegistry extends Schema.TaggedClass<OpenPluginRegistry>()(`${meta.id}.openPluginRegistry`, {
|
|
21
21
|
input: Schema.Void,
|
|
22
22
|
output: Schema.Void,
|
|
23
23
|
}) {}
|
|
@@ -7,7 +7,7 @@ import * as Effect from 'effect/Effect';
|
|
|
7
7
|
import { Capabilities, Capability, type Plugin as Plugin$ } from '@dxos/app-framework';
|
|
8
8
|
import { GraphBuilder, Node, NodeMatcher } from '@dxos/app-graph';
|
|
9
9
|
import { AppCapabilities, SettingsOperation, getSpacePath } from '@dxos/app-toolkit';
|
|
10
|
-
import { Operation } from '@dxos/
|
|
10
|
+
import { Operation } from '@dxos/compute';
|
|
11
11
|
import { isNonNullable } from '@dxos/util';
|
|
12
12
|
|
|
13
13
|
import { meta } from '#meta';
|
|
@@ -31,7 +31,7 @@ export default Capability.makeModule(
|
|
|
31
31
|
id: 'root',
|
|
32
32
|
data: () => Operation.invoke(SettingsOperation.Open, {}),
|
|
33
33
|
properties: {
|
|
34
|
-
label: ['
|
|
34
|
+
label: ['plugin-settings.label', { ns: meta.id }],
|
|
35
35
|
icon: 'ph--gear--regular',
|
|
36
36
|
disposition: 'menu',
|
|
37
37
|
keyBinding: {
|
|
@@ -51,10 +51,10 @@ export default Capability.makeModule(
|
|
|
51
51
|
id: SETTINGS_ID,
|
|
52
52
|
type: meta.id,
|
|
53
53
|
properties: {
|
|
54
|
-
label: ['
|
|
54
|
+
label: ['plugin-settings.label', { ns: meta.id }],
|
|
55
55
|
icon: 'ph--gear--regular',
|
|
56
56
|
disposition: 'pin-end',
|
|
57
|
-
position: '
|
|
57
|
+
position: 'first',
|
|
58
58
|
testId: 'treeView.appSettings',
|
|
59
59
|
},
|
|
60
60
|
}),
|
|
@@ -78,6 +78,7 @@ export default Capability.makeModule(
|
|
|
78
78
|
return [plugin.meta, settings];
|
|
79
79
|
})
|
|
80
80
|
.filter(isNonNullable)
|
|
81
|
+
.sort(([a], [b]) => (a.name ?? a.id).localeCompare(b.name ?? b.id, undefined, { sensitivity: 'base' }))
|
|
81
82
|
.map(([meta, settings]: [Plugin$.Meta, AppCapabilities.Settings]) =>
|
|
82
83
|
Node.make({
|
|
83
84
|
id: `${SETTINGS_KEY}:${meta.id.replaceAll('/', ':')}`,
|
|
@@ -86,6 +87,7 @@ export default Capability.makeModule(
|
|
|
86
87
|
properties: {
|
|
87
88
|
label: meta.name ?? meta.id,
|
|
88
89
|
icon: meta.icon ?? 'ph--circle--regular',
|
|
90
|
+
iconHue: meta.iconHue,
|
|
89
91
|
},
|
|
90
92
|
}),
|
|
91
93
|
),
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { Capability } from '@dxos/app-framework';
|
|
6
|
-
import { OperationHandlerSet } from '@dxos/
|
|
6
|
+
import { OperationHandlerSet } from '@dxos/compute';
|
|
7
7
|
|
|
8
8
|
export const SettingsAppGraphBuilder = Capability.lazy('SettingsAppGraphBuilder', () => import('./app-graph-builder'));
|
|
9
9
|
export const OperationHandler = Capability.lazy<OperationHandlerSet.OperationHandlerSet>(
|
|
10
10
|
'OperationHandler',
|
|
11
11
|
() => import('./operation-handler'),
|
|
12
12
|
);
|
|
13
|
+
export const ReactSurface = Capability.lazy('ReactSurface', () => import('./react-surface'));
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import * as Effect from 'effect/Effect';
|
|
6
6
|
|
|
7
7
|
import { Capabilities, Capability } from '@dxos/app-framework';
|
|
8
|
-
import type { OperationHandlerSet } from '@dxos/
|
|
8
|
+
import type { OperationHandlerSet } from '@dxos/compute';
|
|
9
9
|
|
|
10
10
|
import { SettingsOperationHandlerSet } from '#operations';
|
|
11
11
|
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
import React from 'react';
|
|
7
|
+
|
|
8
|
+
import { Capabilities, Capability } from '@dxos/app-framework';
|
|
9
|
+
import { Surface, useSettingsState } from '@dxos/app-framework/ui';
|
|
10
|
+
import { type AppCapabilities } from '@dxos/app-toolkit';
|
|
11
|
+
import { AppSurface } from '@dxos/app-toolkit/ui';
|
|
12
|
+
import { Settings as SettingsForm } from '@dxos/react-ui-form';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Generic settings surface rendered for any plugin that contributes an
|
|
16
|
+
* `AppCapabilities.Settings` entry. It drives a schema-based form from the
|
|
17
|
+
* contributed `schema`/`atom`, so plugins whose settings are plain editable
|
|
18
|
+
* fields need not register a bespoke settings surface.
|
|
19
|
+
*
|
|
20
|
+
* No section title is rendered: the settings plank heading already names the
|
|
21
|
+
* plugin. Registered with `position: 'last'` so a plugin-specific surface
|
|
22
|
+
* (matching by prefix) always wins under the settings article's `limit={1}`
|
|
23
|
+
* dispatch.
|
|
24
|
+
*/
|
|
25
|
+
const DefaultSettings = ({ subject }: { subject: AppCapabilities.Settings }) => {
|
|
26
|
+
const { settings, updateSettings } = useSettingsState<Record<string, any>>(subject.atom);
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
<SettingsForm.Viewport>
|
|
30
|
+
<SettingsForm.FieldSet
|
|
31
|
+
schema={subject.schema}
|
|
32
|
+
values={settings}
|
|
33
|
+
onValuesChanged={(values) => updateSettings(() => values)}
|
|
34
|
+
/>
|
|
35
|
+
</SettingsForm.Viewport>
|
|
36
|
+
);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export default Capability.makeModule(() =>
|
|
40
|
+
Effect.succeed(
|
|
41
|
+
Capability.contributes(Capabilities.ReactSurface, [
|
|
42
|
+
Surface.create({
|
|
43
|
+
id: 'defaultPluginSettings',
|
|
44
|
+
position: 'last',
|
|
45
|
+
filter: AppSurface.settings(AppSurface.Article),
|
|
46
|
+
component: ({ data: { subject } }) => <DefaultSettings subject={subject} />,
|
|
47
|
+
}),
|
|
48
|
+
]),
|
|
49
|
+
),
|
|
50
|
+
);
|
package/src/index.ts
CHANGED
package/src/meta.ts
CHANGED
|
@@ -2,9 +2,12 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { Plugin } from '@dxos/app-framework';
|
|
6
|
+
import { DXN } from '@dxos/keys';
|
|
6
7
|
|
|
7
|
-
export const meta
|
|
8
|
-
|
|
8
|
+
export const meta = Plugin.makeMeta({
|
|
9
|
+
key: DXN.make('org.dxos.plugin.settings'),
|
|
9
10
|
name: 'Settings',
|
|
10
|
-
|
|
11
|
+
author: 'DXOS',
|
|
12
|
+
tags: ['system'],
|
|
13
|
+
});
|
package/src/operations/index.ts
CHANGED
|
@@ -6,7 +6,7 @@ import * as Effect from 'effect/Effect';
|
|
|
6
6
|
|
|
7
7
|
import { Capabilities, Capability } from '@dxos/app-framework';
|
|
8
8
|
import { LayoutOperation, SettingsOperation, getSpacePath } from '@dxos/app-toolkit';
|
|
9
|
-
import { Operation } from '@dxos/
|
|
9
|
+
import { Operation } from '@dxos/compute';
|
|
10
10
|
|
|
11
11
|
import { SETTINGS_ID, SETTINGS_KEY } from '../actions';
|
|
12
12
|
|
|
@@ -16,11 +16,11 @@ const handler: Operation.WithHandler<typeof SettingsOperation.OpenPluginRegistry
|
|
|
16
16
|
Effect.gen(function* () {
|
|
17
17
|
const { invoke } = yield* Capability.get(Capabilities.OperationInvoker);
|
|
18
18
|
yield* invoke(LayoutOperation.SwitchWorkspace, { subject: getSpacePath(SETTINGS_ID) });
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
);
|
|
19
|
+
// Await (don't fork): SwitchWorkspace selects the workspace's first child, so a forked Open
|
|
20
|
+
// races/drops before its deck update applies. Awaiting guarantees the registry is selected.
|
|
21
|
+
yield* invoke(LayoutOperation.Open, {
|
|
22
|
+
subject: [`${getSpacePath(SETTINGS_ID)}/${SETTINGS_KEY}:plugins`],
|
|
23
|
+
});
|
|
24
24
|
}),
|
|
25
25
|
),
|
|
26
26
|
);
|
package/src/operations/open.ts
CHANGED
|
@@ -6,7 +6,7 @@ import * as Effect from 'effect/Effect';
|
|
|
6
6
|
|
|
7
7
|
import { Capabilities, Capability } from '@dxos/app-framework';
|
|
8
8
|
import { LayoutOperation, SettingsOperation, getSpacePath } from '@dxos/app-toolkit';
|
|
9
|
-
import { Operation } from '@dxos/
|
|
9
|
+
import { Operation } from '@dxos/compute';
|
|
10
10
|
|
|
11
11
|
import { SETTINGS_ID, SETTINGS_KEY } from '../actions';
|
|
12
12
|
|
|
@@ -16,11 +16,12 @@ const handler: Operation.WithHandler<typeof SettingsOperation.Open> = SettingsOp
|
|
|
16
16
|
const { invoke } = yield* Capability.get(Capabilities.OperationInvoker);
|
|
17
17
|
yield* invoke(LayoutOperation.SwitchWorkspace, { subject: getSpacePath(SETTINGS_ID) });
|
|
18
18
|
if (input.plugin) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
19
|
+
// Await (don't fork): SwitchWorkspace already selects the workspace's first child, so a
|
|
20
|
+
// forked Open for the requested plugin races/drops before its deck update applies, leaving
|
|
21
|
+
// the wrong plugin selected. Awaiting guarantees the requested plugin becomes the selection.
|
|
22
|
+
yield* invoke(LayoutOperation.Open, {
|
|
23
|
+
subject: [`${getSpacePath(SETTINGS_ID)}/${SETTINGS_KEY}:${input.plugin.replaceAll('/', ':')}`],
|
|
24
|
+
});
|
|
24
25
|
}
|
|
25
26
|
}),
|
|
26
27
|
),
|
package/src/plugin.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { Plugin } from '@dxos/app-framework';
|
|
6
|
+
|
|
7
|
+
import { meta } from './meta';
|
|
8
|
+
|
|
9
|
+
export const SettingsPlugin = Plugin.lazy(meta, () => import('#plugin'));
|
|
10
|
+
|
|
11
|
+
export { SettingsOperationHandlerSet } from './operations';
|
package/src/testing.ts
ADDED
package/src/translations.ts
CHANGED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
// src/actions.ts
|
|
2
|
-
import * as Schema from "effect/Schema";
|
|
3
|
-
import { meta } from "#meta";
|
|
4
|
-
import { SETTINGS_ID, SETTINGS_KEY } from "#types";
|
|
5
|
-
(function(SettingsAction2) {
|
|
6
|
-
class Open extends Schema.TaggedClass()(`${meta.id}.open`, {
|
|
7
|
-
input: Schema.Struct({
|
|
8
|
-
plugin: Schema.optional(Schema.String)
|
|
9
|
-
}),
|
|
10
|
-
output: Schema.Void
|
|
11
|
-
}) {
|
|
12
|
-
}
|
|
13
|
-
SettingsAction2.Open = Open;
|
|
14
|
-
class OpenPluginRegistry extends Schema.TaggedClass()(`${meta.id}.open-plugin-registry`, {
|
|
15
|
-
input: Schema.Void,
|
|
16
|
-
output: Schema.Void
|
|
17
|
-
}) {
|
|
18
|
-
}
|
|
19
|
-
SettingsAction2.OpenPluginRegistry = OpenPluginRegistry;
|
|
20
|
-
})(SettingsAction || (SettingsAction = {}));
|
|
21
|
-
var SettingsAction;
|
|
22
|
-
|
|
23
|
-
// src/SettingsPlugin.ts
|
|
24
|
-
import { Plugin } from "@dxos/app-framework";
|
|
25
|
-
import { AppPlugin } from "@dxos/app-toolkit";
|
|
26
|
-
import { OperationHandler, SettingsAppGraphBuilder } from "#capabilities";
|
|
27
|
-
import { meta as meta3 } from "#meta";
|
|
28
|
-
|
|
29
|
-
// src/translations.ts
|
|
30
|
-
import { meta as meta2 } from "#meta";
|
|
31
|
-
var translations = [
|
|
32
|
-
{
|
|
33
|
-
"en-US": {
|
|
34
|
-
[meta2.id]: {
|
|
35
|
-
"open-settings.label": "Open settings",
|
|
36
|
-
"app-settings.label": "Settings"
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
];
|
|
41
|
-
|
|
42
|
-
// src/SettingsPlugin.ts
|
|
43
|
-
var SettingsPlugin = Plugin.define(meta3).pipe(AppPlugin.addAppGraphModule({
|
|
44
|
-
activate: SettingsAppGraphBuilder
|
|
45
|
-
}), AppPlugin.addOperationHandlerModule({
|
|
46
|
-
activate: OperationHandler
|
|
47
|
-
}), AppPlugin.addTranslationsModule({
|
|
48
|
-
translations
|
|
49
|
-
}), Plugin.make);
|
|
50
|
-
export {
|
|
51
|
-
SETTINGS_ID,
|
|
52
|
-
SETTINGS_KEY,
|
|
53
|
-
SettingsAction,
|
|
54
|
-
SettingsPlugin
|
|
55
|
-
};
|
|
56
|
-
//# sourceMappingURL=index.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/actions.ts", "../../../src/SettingsPlugin.ts", "../../../src/translations.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { meta } from '#meta';\nimport { SETTINGS_ID, SETTINGS_KEY } from '#types';\n\nexport { SETTINGS_ID, SETTINGS_KEY };\n\nexport namespace SettingsAction {\n export class Open extends Schema.TaggedClass<Open>()(`${meta.id}.open`, {\n input: Schema.Struct({\n plugin: Schema.optional(Schema.String),\n }),\n output: Schema.Void,\n }) {}\n\n export class OpenPluginRegistry extends Schema.TaggedClass<OpenPluginRegistry>()(`${meta.id}.open-plugin-registry`, {\n input: Schema.Void,\n output: Schema.Void,\n }) {}\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Plugin } from '@dxos/app-framework';\nimport { AppPlugin } from '@dxos/app-toolkit';\n\nimport { OperationHandler, SettingsAppGraphBuilder } from '#capabilities';\nimport { meta } from '#meta';\n\nimport { translations } from './translations';\n\nexport const SettingsPlugin = Plugin.define(meta).pipe(\n AppPlugin.addAppGraphModule({ activate: SettingsAppGraphBuilder }),\n AppPlugin.addOperationHandlerModule({ activate: OperationHandler }),\n AppPlugin.addTranslationsModule({ translations }),\n Plugin.make,\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Resource } from '@dxos/app-toolkit';\n\nimport { meta } from '#meta';\n\nexport const translations = [\n {\n 'en-US': {\n [meta.id]: {\n 'open-settings.label': 'Open settings',\n 'app-settings.label': 'Settings',\n },\n },\n },\n] as const satisfies Resource[];\n"],
|
|
5
|
-
"mappings": ";AAIA,YAAYA,YAAY;AAExB,SAASC,YAAY;AACrB,SAASC,aAAaC,oBAAoB;UAIzBC,iBAAAA;EACR,MAAMC,aAAoBC,mBAAW,EAAS,GAAGC,KAAKC,EAAE,SAAS;IACtEC,OAAcC,cAAO;MACnBC,QAAeC,gBAAgBC,aAAM;IACvC,CAAA;IACAC,QAAeC;EACjB,CAAA,EAAA;EAAI;kBALSV,OAAAA;EAON,MAAMW,2BAAkCV,mBAAW,EAAuB,GAAGC,KAAKC,EAAE,yBAAyB;IAClHC,OAAcM;IACdD,QAAeC;EACjB,CAAA,EAAA;EAAI;kBAHSC,qBAAAA;AAIf,GAZiBZ,mBAAAA,iBAAAA,CAAAA,EAAAA;;;;ACPjB,SAASa,cAAc;AACvB,SAASC,iBAAiB;AAE1B,SAASC,kBAAkBC,+BAA+B;AAC1D,SAASC,QAAAA,aAAY;;;ACFrB,SAASC,QAAAA,aAAY;AAEd,IAAMC,eAAe;EAC1B;IACE,SAAS;MACP,CAACC,MAAKC,EAAE,GAAG;QACT,uBAAuB;QACvB,sBAAsB;MACxB;IACF;EACF;;;;ADJK,IAAMC,iBAAiBC,OAAOC,OAAOC,KAAAA,EAAMC,KAChDC,UAAUC,kBAAkB;EAAEC,UAAUC;AAAwB,CAAA,GAChEH,UAAUI,0BAA0B;EAAEF,UAAUG;AAAiB,CAAA,GACjEL,UAAUM,sBAAsB;EAAEC;AAAa,CAAA,GAC/CX,OAAOY,IAAI;",
|
|
6
|
-
"names": ["Schema", "meta", "SETTINGS_ID", "SETTINGS_KEY", "SettingsAction", "Open", "TaggedClass", "meta", "id", "input", "Struct", "plugin", "optional", "String", "output", "Void", "OpenPluginRegistry", "Plugin", "AppPlugin", "OperationHandler", "SettingsAppGraphBuilder", "meta", "meta", "translations", "meta", "id", "SettingsPlugin", "Plugin", "define", "meta", "pipe", "AppPlugin", "addAppGraphModule", "activate", "SettingsAppGraphBuilder", "addOperationHandlerModule", "OperationHandler", "addTranslationsModule", "translations", "make"]
|
|
7
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"inputs":{"src/actions.ts":{"bytes":2762,"imports":[{"path":"effect/Schema","kind":"import-statement","external":true},{"path":"#meta","kind":"import-statement","external":true},{"path":"#types","kind":"import-statement","external":true}],"format":"esm"},"src/translations.ts":{"bytes":1286,"imports":[{"path":"#meta","kind":"import-statement","external":true}],"format":"esm"},"src/SettingsPlugin.ts":{"bytes":2370,"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/app-toolkit","kind":"import-statement","external":true},{"path":"#capabilities","kind":"import-statement","external":true},{"path":"#meta","kind":"import-statement","external":true},{"path":"src/translations.ts","kind":"import-statement","original":"./translations"}],"format":"esm"},"src/index.ts":{"bytes":564,"imports":[{"path":"src/actions.ts","kind":"import-statement","original":"./actions"},{"path":"src/SettingsPlugin.ts","kind":"import-statement","original":"./SettingsPlugin"}],"format":"esm"},"src/types/index.ts":{"bytes":943,"imports":[{"path":"@dxos/app-toolkit","kind":"import-statement","external":true}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":3047},"dist/lib/browser/index.mjs":{"imports":[{"path":"effect/Schema","kind":"import-statement","external":true},{"path":"#meta","kind":"import-statement","external":true},{"path":"#types","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/app-toolkit","kind":"import-statement","external":true},{"path":"#capabilities","kind":"import-statement","external":true},{"path":"#meta","kind":"import-statement","external":true},{"path":"#meta","kind":"import-statement","external":true}],"exports":["SETTINGS_ID","SETTINGS_KEY","SettingsAction","SettingsPlugin"],"entryPoint":"src/index.ts","inputs":{"src/actions.ts":{"bytesInOutput":637},"src/index.ts":{"bytesInOutput":0},"src/SettingsPlugin.ts":{"bytesInOutput":462},"src/translations.ts":{"bytesInOutput":209}},"bytes":1515},"dist/lib/browser/types/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":465},"dist/lib/browser/types/index.mjs":{"imports":[{"path":"@dxos/app-toolkit","kind":"import-statement","external":true}],"exports":["SETTINGS_ID","SETTINGS_KEY"],"entryPoint":"src/types/index.ts","inputs":{"src/types/index.ts":{"bytesInOutput":140}},"bytes":239}}}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
|
-
|
|
3
|
-
// src/actions.ts
|
|
4
|
-
import * as Schema from "effect/Schema";
|
|
5
|
-
import { meta } from "#meta";
|
|
6
|
-
import { SETTINGS_ID, SETTINGS_KEY } from "#types";
|
|
7
|
-
(function(SettingsAction2) {
|
|
8
|
-
class Open extends Schema.TaggedClass()(`${meta.id}.open`, {
|
|
9
|
-
input: Schema.Struct({
|
|
10
|
-
plugin: Schema.optional(Schema.String)
|
|
11
|
-
}),
|
|
12
|
-
output: Schema.Void
|
|
13
|
-
}) {
|
|
14
|
-
}
|
|
15
|
-
SettingsAction2.Open = Open;
|
|
16
|
-
class OpenPluginRegistry extends Schema.TaggedClass()(`${meta.id}.open-plugin-registry`, {
|
|
17
|
-
input: Schema.Void,
|
|
18
|
-
output: Schema.Void
|
|
19
|
-
}) {
|
|
20
|
-
}
|
|
21
|
-
SettingsAction2.OpenPluginRegistry = OpenPluginRegistry;
|
|
22
|
-
})(SettingsAction || (SettingsAction = {}));
|
|
23
|
-
var SettingsAction;
|
|
24
|
-
|
|
25
|
-
// src/SettingsPlugin.ts
|
|
26
|
-
import { Plugin } from "@dxos/app-framework";
|
|
27
|
-
import { AppPlugin } from "@dxos/app-toolkit";
|
|
28
|
-
import { OperationHandler, SettingsAppGraphBuilder } from "#capabilities";
|
|
29
|
-
import { meta as meta3 } from "#meta";
|
|
30
|
-
|
|
31
|
-
// src/translations.ts
|
|
32
|
-
import { meta as meta2 } from "#meta";
|
|
33
|
-
var translations = [
|
|
34
|
-
{
|
|
35
|
-
"en-US": {
|
|
36
|
-
[meta2.id]: {
|
|
37
|
-
"open-settings.label": "Open settings",
|
|
38
|
-
"app-settings.label": "Settings"
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
];
|
|
43
|
-
|
|
44
|
-
// src/SettingsPlugin.ts
|
|
45
|
-
var SettingsPlugin = Plugin.define(meta3).pipe(AppPlugin.addAppGraphModule({
|
|
46
|
-
activate: SettingsAppGraphBuilder
|
|
47
|
-
}), AppPlugin.addOperationHandlerModule({
|
|
48
|
-
activate: OperationHandler
|
|
49
|
-
}), AppPlugin.addTranslationsModule({
|
|
50
|
-
translations
|
|
51
|
-
}), Plugin.make);
|
|
52
|
-
export {
|
|
53
|
-
SETTINGS_ID,
|
|
54
|
-
SETTINGS_KEY,
|
|
55
|
-
SettingsAction,
|
|
56
|
-
SettingsPlugin
|
|
57
|
-
};
|
|
58
|
-
//# sourceMappingURL=index.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/actions.ts", "../../../src/SettingsPlugin.ts", "../../../src/translations.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { meta } from '#meta';\nimport { SETTINGS_ID, SETTINGS_KEY } from '#types';\n\nexport { SETTINGS_ID, SETTINGS_KEY };\n\nexport namespace SettingsAction {\n export class Open extends Schema.TaggedClass<Open>()(`${meta.id}.open`, {\n input: Schema.Struct({\n plugin: Schema.optional(Schema.String),\n }),\n output: Schema.Void,\n }) {}\n\n export class OpenPluginRegistry extends Schema.TaggedClass<OpenPluginRegistry>()(`${meta.id}.open-plugin-registry`, {\n input: Schema.Void,\n output: Schema.Void,\n }) {}\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Plugin } from '@dxos/app-framework';\nimport { AppPlugin } from '@dxos/app-toolkit';\n\nimport { OperationHandler, SettingsAppGraphBuilder } from '#capabilities';\nimport { meta } from '#meta';\n\nimport { translations } from './translations';\n\nexport const SettingsPlugin = Plugin.define(meta).pipe(\n AppPlugin.addAppGraphModule({ activate: SettingsAppGraphBuilder }),\n AppPlugin.addOperationHandlerModule({ activate: OperationHandler }),\n AppPlugin.addTranslationsModule({ translations }),\n Plugin.make,\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Resource } from '@dxos/app-toolkit';\n\nimport { meta } from '#meta';\n\nexport const translations = [\n {\n 'en-US': {\n [meta.id]: {\n 'open-settings.label': 'Open settings',\n 'app-settings.label': 'Settings',\n },\n },\n },\n] as const satisfies Resource[];\n"],
|
|
5
|
-
"mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,YAAY;AACrB,SAASC,aAAaC,oBAAoB;UAIzBC,iBAAAA;EACR,MAAMC,aAAoBC,mBAAW,EAAS,GAAGC,KAAKC,EAAE,SAAS;IACtEC,OAAcC,cAAO;MACnBC,QAAeC,gBAAgBC,aAAM;IACvC,CAAA;IACAC,QAAeC;EACjB,CAAA,EAAA;EAAI;kBALSV,OAAAA;EAON,MAAMW,2BAAkCV,mBAAW,EAAuB,GAAGC,KAAKC,EAAE,yBAAyB;IAClHC,OAAcM;IACdD,QAAeC;EACjB,CAAA,EAAA;EAAI;kBAHSC,qBAAAA;AAIf,GAZiBZ,mBAAAA,iBAAAA,CAAAA,EAAAA;;;;ACPjB,SAASa,cAAc;AACvB,SAASC,iBAAiB;AAE1B,SAASC,kBAAkBC,+BAA+B;AAC1D,SAASC,QAAAA,aAAY;;;ACFrB,SAASC,QAAAA,aAAY;AAEd,IAAMC,eAAe;EAC1B;IACE,SAAS;MACP,CAACC,MAAKC,EAAE,GAAG;QACT,uBAAuB;QACvB,sBAAsB;MACxB;IACF;EACF;;;;ADJK,IAAMC,iBAAiBC,OAAOC,OAAOC,KAAAA,EAAMC,KAChDC,UAAUC,kBAAkB;EAAEC,UAAUC;AAAwB,CAAA,GAChEH,UAAUI,0BAA0B;EAAEF,UAAUG;AAAiB,CAAA,GACjEL,UAAUM,sBAAsB;EAAEC;AAAa,CAAA,GAC/CX,OAAOY,IAAI;",
|
|
6
|
-
"names": ["Schema", "meta", "SETTINGS_ID", "SETTINGS_KEY", "SettingsAction", "Open", "TaggedClass", "meta", "id", "input", "Struct", "plugin", "optional", "String", "output", "Void", "OpenPluginRegistry", "Plugin", "AppPlugin", "OperationHandler", "SettingsAppGraphBuilder", "meta", "meta", "translations", "meta", "id", "SettingsPlugin", "Plugin", "define", "meta", "pipe", "AppPlugin", "addAppGraphModule", "activate", "SettingsAppGraphBuilder", "addOperationHandlerModule", "OperationHandler", "addTranslationsModule", "translations", "make"]
|
|
7
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"inputs":{"src/actions.ts":{"bytes":2762,"imports":[{"path":"effect/Schema","kind":"import-statement","external":true},{"path":"#meta","kind":"import-statement","external":true},{"path":"#types","kind":"import-statement","external":true}],"format":"esm"},"src/translations.ts":{"bytes":1286,"imports":[{"path":"#meta","kind":"import-statement","external":true}],"format":"esm"},"src/SettingsPlugin.ts":{"bytes":2370,"imports":[{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/app-toolkit","kind":"import-statement","external":true},{"path":"#capabilities","kind":"import-statement","external":true},{"path":"#meta","kind":"import-statement","external":true},{"path":"src/translations.ts","kind":"import-statement","original":"./translations"}],"format":"esm"},"src/index.ts":{"bytes":564,"imports":[{"path":"src/actions.ts","kind":"import-statement","original":"./actions"},{"path":"src/SettingsPlugin.ts","kind":"import-statement","original":"./SettingsPlugin"}],"format":"esm"},"src/types/index.ts":{"bytes":943,"imports":[{"path":"@dxos/app-toolkit","kind":"import-statement","external":true}],"format":"esm"}},"outputs":{"dist/lib/node-esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":3049},"dist/lib/node-esm/index.mjs":{"imports":[{"path":"effect/Schema","kind":"import-statement","external":true},{"path":"#meta","kind":"import-statement","external":true},{"path":"#types","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/app-toolkit","kind":"import-statement","external":true},{"path":"#capabilities","kind":"import-statement","external":true},{"path":"#meta","kind":"import-statement","external":true},{"path":"#meta","kind":"import-statement","external":true}],"exports":["SETTINGS_ID","SETTINGS_KEY","SettingsAction","SettingsPlugin"],"entryPoint":"src/index.ts","inputs":{"src/actions.ts":{"bytesInOutput":637},"src/index.ts":{"bytesInOutput":0},"src/SettingsPlugin.ts":{"bytesInOutput":462},"src/translations.ts":{"bytesInOutput":209}},"bytes":1608},"dist/lib/node-esm/types/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":467},"dist/lib/node-esm/types/index.mjs":{"imports":[{"path":"@dxos/app-toolkit","kind":"import-statement","external":true}],"exports":["SETTINGS_ID","SETTINGS_KEY"],"entryPoint":"src/types/index.ts","inputs":{"src/types/index.ts":{"bytesInOutput":140}},"bytes":332}}}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/types/index.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { pinnedWorkspaceId } from '@dxos/app-toolkit';\n\nexport const SETTINGS_ID = pinnedWorkspaceId('dxos:settings');\nexport const SETTINGS_KEY = 'settings';\n"],
|
|
5
|
-
"mappings": ";;;AAIA,SAASA,yBAAyB;AAE3B,IAAMC,cAAcC,kBAAkB,eAAA;AACtC,IAAMC,eAAe;",
|
|
6
|
-
"names": ["pinnedWorkspaceId", "SETTINGS_ID", "pinnedWorkspaceId", "SETTINGS_KEY"]
|
|
7
|
-
}
|