@dxos/plugin-space 0.8.0 → 0.8.1-main.013e445
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/dist/lib/browser/{app-graph-builder-MGK5HWPZ.mjs → app-graph-builder-7NG7UNQD.mjs} +5 -5
- package/dist/lib/browser/{app-graph-serializer-FOWFLYGU.mjs → app-graph-serializer-OZNRXG62.mjs} +7 -7
- package/dist/lib/browser/{app-graph-serializer-FOWFLYGU.mjs.map → app-graph-serializer-OZNRXG62.mjs.map} +2 -2
- package/dist/lib/browser/{chunk-23RVI5FZ.mjs → chunk-KV4JWY3Z.mjs} +9 -8
- package/dist/lib/browser/{chunk-23RVI5FZ.mjs.map → chunk-KV4JWY3Z.mjs.map} +3 -3
- package/dist/lib/browser/{chunk-NU7WDVGN.mjs → chunk-O7LODPTY.mjs} +2 -2
- package/dist/lib/browser/{chunk-PCEP3KQY.mjs → chunk-PE2T7DOU.mjs} +22 -21
- package/dist/lib/browser/chunk-PE2T7DOU.mjs.map +7 -0
- package/dist/lib/browser/{chunk-PQXZCNAU.mjs → chunk-PTKYMZWO.mjs} +1 -1
- package/dist/lib/browser/chunk-PTKYMZWO.mjs.map +7 -0
- package/dist/lib/browser/{chunk-ULA2UQJ4.mjs → chunk-TYU27VTL.mjs} +6 -62
- package/dist/lib/browser/chunk-TYU27VTL.mjs.map +7 -0
- package/dist/lib/browser/{chunk-UDWHTKB5.mjs → chunk-VIU4XFXR.mjs} +6 -8
- package/dist/lib/browser/chunk-VIU4XFXR.mjs.map +7 -0
- package/dist/lib/browser/{identity-created-FYGS6TBH.mjs → identity-created-TG52G7RV.mjs} +3 -3
- package/dist/lib/browser/index.mjs +13 -13
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-GPNAQ2SG.mjs → intent-resolver-XAEHWUHJ.mjs} +11 -9
- package/dist/lib/browser/{intent-resolver-GPNAQ2SG.mjs.map → intent-resolver-XAEHWUHJ.mjs.map} +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-root-4CCSD7TZ.mjs → react-root-H5WH6EUY.mjs} +6 -6
- package/dist/lib/browser/{react-surface-FKMRI3WV.mjs → react-surface-523S3CFL.mjs} +9 -8
- package/dist/lib/browser/react-surface-523S3CFL.mjs.map +7 -0
- package/dist/lib/browser/{schema-5W3DSY2E.mjs → schema-UOCBWGA4.mjs} +3 -3
- package/dist/lib/browser/schema-tools-6J5ZEDBC.mjs +123 -0
- package/dist/lib/browser/schema-tools-6J5ZEDBC.mjs.map +7 -0
- package/dist/lib/browser/{settings-PHPCXX33.mjs → settings-XCHJUNYL.mjs} +3 -3
- package/dist/lib/browser/{spaces-ready-K47RR7N2.mjs → spaces-ready-VVPJN6TU.mjs} +5 -5
- package/dist/lib/browser/{state-INJ63O57.mjs → state-BUM7SQUV.mjs} +3 -3
- package/dist/lib/browser/types/index.mjs +2 -10
- package/dist/lib/node/{app-graph-builder-ZIUBXRPA.cjs → app-graph-builder-G3O5GZMQ.cjs} +45 -45
- package/dist/lib/node/{app-graph-serializer-VQOGHKXL.cjs → app-graph-serializer-774VMAFT.cjs} +21 -21
- package/dist/lib/node/{app-graph-serializer-VQOGHKXL.cjs.map → app-graph-serializer-774VMAFT.cjs.map} +2 -2
- package/dist/lib/node/{chunk-WAJKBO3J.cjs → chunk-37QRDFMQ.cjs} +10 -70
- package/dist/lib/node/chunk-37QRDFMQ.cjs.map +7 -0
- package/dist/lib/node/{chunk-U6DYXAR3.cjs → chunk-5MWD635N.cjs} +11 -13
- package/dist/lib/node/chunk-5MWD635N.cjs.map +7 -0
- package/dist/lib/node/{chunk-WZR6OAN3.cjs → chunk-6P2DB4QQ.cjs} +4 -4
- package/dist/lib/node/{chunk-WZR6OAN3.cjs.map → chunk-6P2DB4QQ.cjs.map} +2 -2
- package/dist/lib/node/{chunk-OVGKWJOC.cjs → chunk-7BN5N2ND.cjs} +60 -59
- package/dist/lib/node/{chunk-OVGKWJOC.cjs.map → chunk-7BN5N2ND.cjs.map} +3 -3
- package/dist/lib/node/{chunk-QE4GVR6C.cjs → chunk-BN5K3SRF.cjs} +83 -80
- package/dist/lib/node/chunk-BN5K3SRF.cjs.map +7 -0
- package/dist/lib/node/{chunk-YZKNRFHU.cjs → chunk-GRM6AGWI.cjs} +10 -10
- package/dist/lib/node/{identity-created-AXI64BLE.cjs → identity-created-AQCHGXOF.cjs} +7 -7
- package/dist/lib/node/index.cjs +96 -97
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/{intent-resolver-ICHHI6I6.cjs → intent-resolver-7DUDOPMC.cjs} +71 -69
- package/dist/lib/node/{intent-resolver-ICHHI6I6.cjs.map → intent-resolver-7DUDOPMC.cjs.map} +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{react-root-TCBTUOOJ.cjs → react-root-HCFNELCK.cjs} +12 -12
- package/dist/lib/node/{react-surface-JSCCIZS5.cjs → react-surface-VIGVLED7.cjs} +62 -61
- package/dist/lib/node/react-surface-VIGVLED7.cjs.map +7 -0
- package/dist/lib/node/{schema-YN7WVFRX.cjs → schema-EERAOETL.cjs} +7 -7
- package/dist/lib/node/schema-tools-OZS4OC6X.cjs +146 -0
- package/dist/lib/node/schema-tools-OZS4OC6X.cjs.map +7 -0
- package/dist/lib/node/{settings-5QYFWNH7.cjs → settings-VPFJWIWP.cjs} +8 -8
- package/dist/lib/node/{spaces-ready-FQNAKR7G.cjs → spaces-ready-BDKHLPYB.cjs} +14 -14
- package/dist/lib/node/{state-57UE3DYE.cjs → state-AIETH3DE.cjs} +8 -8
- package/dist/lib/node/types/index.cjs +13 -21
- package/dist/lib/node/types/index.cjs.map +2 -2
- package/dist/lib/node-esm/{app-graph-builder-TERVM2SL.mjs → app-graph-builder-LJAESOIB.mjs} +5 -5
- package/dist/lib/node-esm/{app-graph-serializer-GZRSWHEN.mjs → app-graph-serializer-YATEFHDI.mjs} +7 -7
- package/dist/lib/node-esm/{app-graph-serializer-GZRSWHEN.mjs.map → app-graph-serializer-YATEFHDI.mjs.map} +2 -2
- package/dist/lib/node-esm/{chunk-6RSVVEPS.mjs → chunk-AJ4IZAKT.mjs} +2 -2
- package/dist/lib/node-esm/{chunk-HJCEJNW3.mjs → chunk-G6EUAPVP.mjs} +22 -21
- package/dist/lib/node-esm/chunk-G6EUAPVP.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-TRNZQEEN.mjs → chunk-KNJZGST5.mjs} +6 -62
- package/dist/lib/node-esm/chunk-KNJZGST5.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-ICCM4YRJ.mjs → chunk-MSWEFAPD.mjs} +1 -1
- package/dist/lib/node-esm/chunk-MSWEFAPD.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-2TQ2AJEZ.mjs → chunk-TTHJ55CE.mjs} +6 -8
- package/dist/lib/node-esm/chunk-TTHJ55CE.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-PGH5L7MV.mjs → chunk-XRC7NH6E.mjs} +9 -8
- package/dist/lib/node-esm/{chunk-PGH5L7MV.mjs.map → chunk-XRC7NH6E.mjs.map} +3 -3
- package/dist/lib/node-esm/{identity-created-3CGEXNPO.mjs → identity-created-CK3VMR6Q.mjs} +3 -3
- package/dist/lib/node-esm/index.mjs +13 -13
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-VR42K5GE.mjs → intent-resolver-7MLSVU7R.mjs} +11 -9
- package/dist/lib/node-esm/{intent-resolver-VR42K5GE.mjs.map → intent-resolver-7MLSVU7R.mjs.map} +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-root-THJBSTQS.mjs → react-root-PLKZW44B.mjs} +6 -6
- package/dist/lib/node-esm/{react-surface-Z3BBQ5HX.mjs → react-surface-DTT3ZJVO.mjs} +9 -8
- package/dist/lib/node-esm/react-surface-DTT3ZJVO.mjs.map +7 -0
- package/dist/lib/node-esm/{schema-LOR2EVGY.mjs → schema-LOOOBN6J.mjs} +3 -3
- package/dist/lib/node-esm/schema-tools-KJVXGDBO.mjs +125 -0
- package/dist/lib/node-esm/schema-tools-KJVXGDBO.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-H6MXTEQM.mjs → settings-2VSJTVUW.mjs} +3 -3
- package/dist/lib/node-esm/{spaces-ready-HKAQG5SA.mjs → spaces-ready-7ROQ7PRB.mjs} +5 -5
- package/dist/lib/node-esm/{state-VYA6OFHD.mjs → state-DWUAP6MH.mjs} +3 -3
- package/dist/lib/node-esm/types/index.mjs +2 -10
- package/dist/types/src/SpacePlugin.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 +1 -0
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/schema-tool.test.d.ts +2 -0
- package/dist/types/src/capabilities/schema-tool.test.d.ts.map +1 -0
- package/dist/types/src/capabilities/schema-tools.d.ts +13 -0
- package/dist/types/src/capabilities/schema-tools.d.ts.map +1 -0
- package/dist/types/src/components/AdvancedObjectSettings/AdvancedObjectSettings.d.ts +2 -1
- package/dist/types/src/components/AdvancedObjectSettings/AdvancedObjectSettings.d.ts.map +1 -1
- package/dist/types/src/components/AdvancedObjectSettings/ForeignKeys.d.ts +2 -1
- package/dist/types/src/components/AdvancedObjectSettings/ForeignKeys.d.ts.map +1 -1
- package/dist/types/src/components/AwaitingObject.d.ts +2 -1
- package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
- package/dist/types/src/components/BaseObjectSettings.d.ts +2 -1
- package/dist/types/src/components/BaseObjectSettings.d.ts.map +1 -1
- package/dist/types/src/components/CollectionMain.d.ts +2 -1
- package/dist/types/src/components/CollectionMain.d.ts.map +1 -1
- package/dist/types/src/components/CollectionSection.d.ts +2 -1
- package/dist/types/src/components/CollectionSection.d.ts.map +1 -1
- package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts +2 -1
- package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
- package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +2 -1
- package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
- package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts +2 -1
- package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
- package/dist/types/src/components/JoinDialog.d.ts +2 -1
- package/dist/types/src/components/JoinDialog.d.ts.map +1 -1
- package/dist/types/src/components/MenuFooter.d.ts +2 -1
- package/dist/types/src/components/MenuFooter.d.ts.map +1 -1
- package/dist/types/src/components/PersistenceStatus.d.ts +2 -1
- package/dist/types/src/components/PersistenceStatus.d.ts.map +1 -1
- package/dist/types/src/components/PopoverAddSpace.d.ts +2 -1
- package/dist/types/src/components/PopoverAddSpace.d.ts.map +1 -1
- package/dist/types/src/components/PopoverRenameObject.d.ts +2 -1
- package/dist/types/src/components/PopoverRenameObject.d.ts.map +1 -1
- package/dist/types/src/components/PopoverRenameSpace.d.ts +2 -1
- package/dist/types/src/components/PopoverRenameSpace.d.ts.map +1 -1
- package/dist/types/src/components/ShareSpaceButton.d.ts +3 -2
- package/dist/types/src/components/ShareSpaceButton.d.ts.map +1 -1
- package/dist/types/src/components/SpacePluginSettings.d.ts +2 -1
- package/dist/types/src/components/SpacePluginSettings.d.ts.map +1 -1
- package/dist/types/src/components/SpacePresence.d.ts +5 -4
- package/dist/types/src/components/SpacePresence.d.ts.map +1 -1
- package/dist/types/src/components/SpacePresence.stories.d.ts +3 -2
- package/dist/types/src/components/SpacePresence.stories.d.ts.map +1 -1
- package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.d.ts +2 -1
- package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.d.ts.map +1 -1
- package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.d.ts +2 -1
- package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.d.ts.map +1 -1
- package/dist/types/src/components/SyncStatus/InlineSyncStatus.d.ts +2 -1
- package/dist/types/src/components/SyncStatus/InlineSyncStatus.d.ts.map +1 -1
- package/dist/types/src/components/SyncStatus/Space.d.ts +3 -2
- package/dist/types/src/components/SyncStatus/Space.d.ts.map +1 -1
- package/dist/types/src/components/SyncStatus/SyncStatus.d.ts +4 -3
- package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +2 -5
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +5 -12
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/thread.d.ts +177 -174
- package/dist/types/src/types/thread.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +2 -0
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/src/util.d.ts.map +1 -1
- package/package.json +43 -41
- package/src/SpacePlugin.tsx +6 -1
- package/src/capabilities/app-graph-serializer.ts +2 -2
- package/src/capabilities/index.ts +1 -0
- package/src/capabilities/intent-resolver.ts +3 -1
- package/src/capabilities/react-surface.tsx +3 -2
- package/src/capabilities/schema-tool.test.ts +45 -0
- package/src/capabilities/schema-tools.ts +124 -0
- package/src/components/BaseObjectSettings.tsx +3 -1
- package/src/components/CreateDialog/CreateObjectDialog.tsx +3 -6
- package/src/components/PopoverRenameObject.tsx +1 -1
- package/src/meta.ts +2 -2
- package/src/translations.ts +2 -4
- package/src/types/thread.ts +2 -56
- package/src/types/types.ts +3 -0
- package/src/util.tsx +1 -2
- package/dist/lib/browser/chunk-PCEP3KQY.mjs.map +0 -7
- package/dist/lib/browser/chunk-PQXZCNAU.mjs.map +0 -7
- package/dist/lib/browser/chunk-UDWHTKB5.mjs.map +0 -7
- package/dist/lib/browser/chunk-ULA2UQJ4.mjs.map +0 -7
- package/dist/lib/browser/react-surface-FKMRI3WV.mjs.map +0 -7
- package/dist/lib/node/chunk-QE4GVR6C.cjs.map +0 -7
- package/dist/lib/node/chunk-U6DYXAR3.cjs.map +0 -7
- package/dist/lib/node/chunk-WAJKBO3J.cjs.map +0 -7
- package/dist/lib/node/react-surface-JSCCIZS5.cjs.map +0 -7
- package/dist/lib/node-esm/chunk-2TQ2AJEZ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-HJCEJNW3.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-ICCM4YRJ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-TRNZQEEN.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-Z3BBQ5HX.mjs.map +0 -7
- /package/dist/lib/browser/{app-graph-builder-MGK5HWPZ.mjs.map → app-graph-builder-7NG7UNQD.mjs.map} +0 -0
- /package/dist/lib/browser/{chunk-NU7WDVGN.mjs.map → chunk-O7LODPTY.mjs.map} +0 -0
- /package/dist/lib/browser/{identity-created-FYGS6TBH.mjs.map → identity-created-TG52G7RV.mjs.map} +0 -0
- /package/dist/lib/browser/{react-root-4CCSD7TZ.mjs.map → react-root-H5WH6EUY.mjs.map} +0 -0
- /package/dist/lib/browser/{schema-5W3DSY2E.mjs.map → schema-UOCBWGA4.mjs.map} +0 -0
- /package/dist/lib/browser/{settings-PHPCXX33.mjs.map → settings-XCHJUNYL.mjs.map} +0 -0
- /package/dist/lib/browser/{spaces-ready-K47RR7N2.mjs.map → spaces-ready-VVPJN6TU.mjs.map} +0 -0
- /package/dist/lib/browser/{state-INJ63O57.mjs.map → state-BUM7SQUV.mjs.map} +0 -0
- /package/dist/lib/node/{app-graph-builder-ZIUBXRPA.cjs.map → app-graph-builder-G3O5GZMQ.cjs.map} +0 -0
- /package/dist/lib/node/{chunk-YZKNRFHU.cjs.map → chunk-GRM6AGWI.cjs.map} +0 -0
- /package/dist/lib/node/{identity-created-AXI64BLE.cjs.map → identity-created-AQCHGXOF.cjs.map} +0 -0
- /package/dist/lib/node/{react-root-TCBTUOOJ.cjs.map → react-root-HCFNELCK.cjs.map} +0 -0
- /package/dist/lib/node/{schema-YN7WVFRX.cjs.map → schema-EERAOETL.cjs.map} +0 -0
- /package/dist/lib/node/{settings-5QYFWNH7.cjs.map → settings-VPFJWIWP.cjs.map} +0 -0
- /package/dist/lib/node/{spaces-ready-FQNAKR7G.cjs.map → spaces-ready-BDKHLPYB.cjs.map} +0 -0
- /package/dist/lib/node/{state-57UE3DYE.cjs.map → state-AIETH3DE.cjs.map} +0 -0
- /package/dist/lib/node-esm/{app-graph-builder-TERVM2SL.mjs.map → app-graph-builder-LJAESOIB.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-6RSVVEPS.mjs.map → chunk-AJ4IZAKT.mjs.map} +0 -0
- /package/dist/lib/node-esm/{identity-created-3CGEXNPO.mjs.map → identity-created-CK3VMR6Q.mjs.map} +0 -0
- /package/dist/lib/node-esm/{react-root-THJBSTQS.mjs.map → react-root-PLKZW44B.mjs.map} +0 -0
- /package/dist/lib/node-esm/{schema-LOR2EVGY.mjs.map → schema-LOOOBN6J.mjs.map} +0 -0
- /package/dist/lib/node-esm/{settings-H6MXTEQM.mjs.map → settings-2VSJTVUW.mjs.map} +0 -0
- /package/dist/lib/node-esm/{spaces-ready-HKAQG5SA.mjs.map → spaces-ready-7ROQ7PRB.mjs.map} +0 -0
- /package/dist/lib/node-esm/{state-VYA6OFHD.mjs.map → state-DWUAP6MH.mjs.map} +0 -0
|
@@ -318,7 +318,7 @@ export default ({ createInvitationUrl, context, observability }: IntentResolverO
|
|
|
318
318
|
}),
|
|
319
319
|
createResolver({
|
|
320
320
|
intent: SpaceAction.AddObject,
|
|
321
|
-
resolve: async ({ target, object }) => {
|
|
321
|
+
resolve: async ({ target, object, hidden }) => {
|
|
322
322
|
const space = isSpace(target) ? target : getSpace(target);
|
|
323
323
|
invariant(space, 'Space not found.');
|
|
324
324
|
|
|
@@ -356,6 +356,8 @@ export default ({ createInvitationUrl, context, observability }: IntentResolverO
|
|
|
356
356
|
|
|
357
357
|
if (target instanceof CollectionType) {
|
|
358
358
|
target.objects.push(makeRef(object as HasId));
|
|
359
|
+
} else if (isSpace(target) && hidden) {
|
|
360
|
+
space.db.add(object);
|
|
359
361
|
} else if (isSpace(target)) {
|
|
360
362
|
const collection = space.properties[CollectionType.typename]?.target;
|
|
361
363
|
if (collection instanceof CollectionType) {
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import React from 'react';
|
|
6
6
|
|
|
7
7
|
import { Capabilities, contributes, createSurface, Surface, useCapability } from '@dxos/app-framework';
|
|
8
|
+
import { isInstanceOf } from '@dxos/echo-schema';
|
|
8
9
|
import { SettingsStore } from '@dxos/local-storage';
|
|
9
10
|
import {
|
|
10
11
|
getSpace,
|
|
@@ -74,7 +75,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
|
|
|
74
75
|
id: `${SPACE_PLUGIN}/collection-fallback`,
|
|
75
76
|
role: 'article',
|
|
76
77
|
position: 'fallback',
|
|
77
|
-
filter: (data): data is { subject: CollectionType } => data.subject
|
|
78
|
+
filter: (data): data is { subject: CollectionType } => isInstanceOf(CollectionType, data.subject),
|
|
78
79
|
component: ({ data }) => <CollectionMain collection={data.subject} />,
|
|
79
80
|
}),
|
|
80
81
|
createSurface({
|
|
@@ -186,7 +187,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
|
|
|
186
187
|
createSurface({
|
|
187
188
|
id: `${SPACE_PLUGIN}/collection-section`,
|
|
188
189
|
role: 'section',
|
|
189
|
-
filter: (data): data is { subject: CollectionType } => data.subject
|
|
190
|
+
filter: (data): data is { subject: CollectionType } => isInstanceOf(CollectionType, data.subject),
|
|
190
191
|
component: ({ data }) => <CollectionSection collection={data.subject} />,
|
|
191
192
|
}),
|
|
192
193
|
createSurface({
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { describe, it, expect } from 'vitest';
|
|
6
|
+
|
|
7
|
+
import { S } from '@dxos/echo-schema';
|
|
8
|
+
|
|
9
|
+
import { TypeNameSchema } from './schema-tools';
|
|
10
|
+
|
|
11
|
+
describe('TypeNameSchema format', () => {
|
|
12
|
+
const valid = [
|
|
13
|
+
'example.com/usCities',
|
|
14
|
+
'dxos.org/Contact',
|
|
15
|
+
'dxos.org/Table',
|
|
16
|
+
'dxos.org/Table/Contact',
|
|
17
|
+
'dxos.org/PluginName/TypeName',
|
|
18
|
+
// Case variations
|
|
19
|
+
'DXOS.org/Table',
|
|
20
|
+
'dxos.ORG/table',
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
const invalid = [
|
|
24
|
+
'http://dxos.org/Table', // No protocol allowed
|
|
25
|
+
'dxos.org/', // Must have type path
|
|
26
|
+
// TODO(dmaretskyi): Decide if we want to ban numbers.
|
|
27
|
+
// 'dxos.org/1Type', // Path segments must start with letter
|
|
28
|
+
'dxos.org/Type!', // Invalid character
|
|
29
|
+
'.org/Type', // Must have domain
|
|
30
|
+
];
|
|
31
|
+
|
|
32
|
+
const validate = S.validateSync(TypeNameSchema);
|
|
33
|
+
|
|
34
|
+
valid.forEach((typename) => {
|
|
35
|
+
it(`should accept valid typename: ${typename}`, () => {
|
|
36
|
+
expect(() => validate(typename)).not.toThrow();
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
invalid.forEach((typename) => {
|
|
41
|
+
it(`should reject invalid typename: ${typename}`, () => {
|
|
42
|
+
expect(() => validate(typename)).toThrow();
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
});
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { DescriptionAnnotationId, ExamplesAnnotationId, TitleAnnotationId } from 'effect/SchemaAST';
|
|
6
|
+
|
|
7
|
+
import { Capabilities, contributes, type PromiseIntentDispatcher } from '@dxos/app-framework';
|
|
8
|
+
import { defineTool, ToolResult } from '@dxos/artifact';
|
|
9
|
+
import { type Space } from '@dxos/client/echo';
|
|
10
|
+
import { FormatEnum, FormatEnums, S, SelectOptionSchema, GeoPoint, toJsonSchema } from '@dxos/echo-schema';
|
|
11
|
+
import { invariant } from '@dxos/invariant';
|
|
12
|
+
import { hues } from '@dxos/react-ui-theme';
|
|
13
|
+
import { echoSchemaFromPropertyDefinitions } from '@dxos/schema';
|
|
14
|
+
|
|
15
|
+
// TODO(burdon): Factor out.
|
|
16
|
+
declare global {
|
|
17
|
+
interface ToolContextExtensions {
|
|
18
|
+
space?: Space;
|
|
19
|
+
dispatch?: PromiseIntentDispatcher;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// TODO(ZaymonFC): Move this somewhere common.
|
|
24
|
+
export const TypeNameSchema = S.String.pipe(
|
|
25
|
+
S.pattern(/^\w+\.\w{2,}\/[\w/]+$/i),
|
|
26
|
+
S.annotations({
|
|
27
|
+
[TitleAnnotationId]: 'TypeName',
|
|
28
|
+
[DescriptionAnnotationId]:
|
|
29
|
+
'Domain-style type name path. Dashes are not allowed. Use camel case for the final component of the type name.',
|
|
30
|
+
[ExamplesAnnotationId]: ['example.com/type/Document', 'example.com/type/FlightList'],
|
|
31
|
+
}),
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
const formatDescription = `The format of the property. Additional information:
|
|
35
|
+
${FormatEnum.GeoPoint}: ${JSON.stringify(toJsonSchema(GeoPoint))}
|
|
36
|
+
This tuple is GeoJSON. You must specify \`${FormatEnum.GeoPoint}\` as [Longitude, Latitude]`;
|
|
37
|
+
|
|
38
|
+
// TODO(ZaymonFC): All properties are default optional, but maybe we should allow for required properties.
|
|
39
|
+
const PropertyDefinitionSchema = S.Struct({
|
|
40
|
+
name: S.String.annotations({ [DescriptionAnnotationId]: 'The name of the property.' }),
|
|
41
|
+
format: S.Union(...FormatEnums.map((format) => S.Literal(format))).annotations({
|
|
42
|
+
[DescriptionAnnotationId]: formatDescription,
|
|
43
|
+
}),
|
|
44
|
+
config: S.optional(
|
|
45
|
+
S.Struct({
|
|
46
|
+
options: S.optional(
|
|
47
|
+
S.Array(SelectOptionSchema)
|
|
48
|
+
.annotations({
|
|
49
|
+
description: `Options for SingleSelect/MultiSelect formats. Available colors: ${hues.join(', ')}`,
|
|
50
|
+
})
|
|
51
|
+
.pipe(S.mutable),
|
|
52
|
+
),
|
|
53
|
+
}),
|
|
54
|
+
),
|
|
55
|
+
}).pipe(S.mutable);
|
|
56
|
+
|
|
57
|
+
const SYSTEM_NAMESPACE = 'dxos.org/echo/schema';
|
|
58
|
+
|
|
59
|
+
export default () =>
|
|
60
|
+
contributes(Capabilities.Tools, [
|
|
61
|
+
defineTool(SYSTEM_NAMESPACE, {
|
|
62
|
+
name: 'list',
|
|
63
|
+
description: 'List registered schemas in the space.',
|
|
64
|
+
caption: 'Listing registered schemas...',
|
|
65
|
+
schema: S.Struct({}),
|
|
66
|
+
execute: async (_input, { extensions }) => {
|
|
67
|
+
invariant(extensions?.space, 'No space.');
|
|
68
|
+
const space = extensions.space;
|
|
69
|
+
|
|
70
|
+
const schemas = await space.db.schemaRegistry.query({}).run();
|
|
71
|
+
return ToolResult.Success(
|
|
72
|
+
schemas.map((schema) => ({
|
|
73
|
+
typename: schema.typename,
|
|
74
|
+
version: schema.version,
|
|
75
|
+
})),
|
|
76
|
+
);
|
|
77
|
+
},
|
|
78
|
+
}),
|
|
79
|
+
defineTool(SYSTEM_NAMESPACE, {
|
|
80
|
+
name: 'get',
|
|
81
|
+
description: 'Get a specific schema by its typename.',
|
|
82
|
+
caption: 'Getting schema...',
|
|
83
|
+
schema: S.Struct({
|
|
84
|
+
typename: S.String.annotations({
|
|
85
|
+
description: 'The fully qualified typename of the schema.',
|
|
86
|
+
}),
|
|
87
|
+
}),
|
|
88
|
+
execute: async ({ typename }, { extensions }) => {
|
|
89
|
+
invariant(extensions?.space, 'No space.');
|
|
90
|
+
const space = extensions.space;
|
|
91
|
+
|
|
92
|
+
const schema = await space.db.schemaRegistry.query({ typename }).firstOrUndefined();
|
|
93
|
+
if (!schema) {
|
|
94
|
+
return ToolResult.Error(`Schema not found: ${typename}`);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return ToolResult.Success(schema);
|
|
98
|
+
},
|
|
99
|
+
}),
|
|
100
|
+
defineTool(SYSTEM_NAMESPACE, {
|
|
101
|
+
name: 'create',
|
|
102
|
+
description: 'Create a new schema with the provided definition.',
|
|
103
|
+
caption: 'Creating schema...',
|
|
104
|
+
schema: S.Struct({
|
|
105
|
+
typename: TypeNameSchema.annotations({
|
|
106
|
+
description:
|
|
107
|
+
'The fully qualified schema typename. Must start with a domain, and then one or more path components (e.g., "example.com/type/TypeName").',
|
|
108
|
+
}),
|
|
109
|
+
properties: S.Array(PropertyDefinitionSchema).pipe(
|
|
110
|
+
S.annotations({ description: 'Array of property definitions for the schema.' }),
|
|
111
|
+
S.mutable,
|
|
112
|
+
),
|
|
113
|
+
}),
|
|
114
|
+
execute: async ({ typename, properties }, { extensions }) => {
|
|
115
|
+
invariant(extensions?.space, 'No space.');
|
|
116
|
+
const space = extensions.space;
|
|
117
|
+
|
|
118
|
+
const schema = echoSchemaFromPropertyDefinitions(typename, properties);
|
|
119
|
+
const [registeredSchema] = await space.db.schemaRegistry.register([schema]);
|
|
120
|
+
|
|
121
|
+
return ToolResult.Success(registeredSchema);
|
|
122
|
+
},
|
|
123
|
+
}),
|
|
124
|
+
]);
|
|
@@ -16,7 +16,9 @@ export type BaseObjectSettingsProps = {
|
|
|
16
16
|
export const BaseObjectSettings = ({ object }: BaseObjectSettingsProps) => {
|
|
17
17
|
const { t } = useTranslation(SPACE_PLUGIN);
|
|
18
18
|
const inputRef = React.useRef<HTMLInputElement>(null);
|
|
19
|
-
// TODO(
|
|
19
|
+
// TODO(wittjosiah): This should be a form based on the schema of the object.
|
|
20
|
+
// The form should only include fields with a specific settings annotation.
|
|
21
|
+
// Perhaps also including the field of the title annotation as well.
|
|
20
22
|
return (
|
|
21
23
|
<div role='form' className='flex flex-col w-full p-2 gap-1'>
|
|
22
24
|
<Input.Root>
|
|
@@ -22,7 +22,7 @@ import { Button, Dialog, Icon, useTranslation } from '@dxos/react-ui';
|
|
|
22
22
|
import { CreateObjectPanel, type CreateObjectPanelProps } from './CreateObjectPanel';
|
|
23
23
|
import { SpaceCapabilities } from '../../capabilities';
|
|
24
24
|
import { SPACE_PLUGIN } from '../../meta';
|
|
25
|
-
import {
|
|
25
|
+
import { type ObjectForm, SpaceAction } from '../../types';
|
|
26
26
|
|
|
27
27
|
export const CREATE_OBJECT_DIALOG = `${SPACE_PLUGIN}/CreateObjectDialog`;
|
|
28
28
|
|
|
@@ -53,16 +53,13 @@ export const CreateObjectDialog = ({
|
|
|
53
53
|
const handleCreateObject = useCallback(
|
|
54
54
|
async ({
|
|
55
55
|
form,
|
|
56
|
-
target
|
|
56
|
+
target,
|
|
57
57
|
data = {},
|
|
58
58
|
}: {
|
|
59
59
|
form: ObjectForm;
|
|
60
60
|
target: CreateObjectPanelProps['target'];
|
|
61
61
|
data?: Record<string, any>;
|
|
62
62
|
}) => {
|
|
63
|
-
const target = isSpace(_target)
|
|
64
|
-
? (_target.properties[CollectionType.typename]?.target as CollectionType | undefined)
|
|
65
|
-
: _target;
|
|
66
63
|
if (!target) {
|
|
67
64
|
// TODO(wittjosiah): UI feedback.
|
|
68
65
|
return;
|
|
@@ -76,7 +73,7 @@ export const CreateObjectDialog = ({
|
|
|
76
73
|
const result = await dispatch(form.getIntent(data, { space }));
|
|
77
74
|
const object = result.data?.object;
|
|
78
75
|
if (isReactiveObject(object)) {
|
|
79
|
-
const addObjectIntent = createIntent(SpaceAction.AddObject, { target, object });
|
|
76
|
+
const addObjectIntent = createIntent(SpaceAction.AddObject, { target, object, hidden: form.hidden });
|
|
80
77
|
const shouldNavigate = _shouldNavigate ?? (() => true);
|
|
81
78
|
if (shouldNavigate(object)) {
|
|
82
79
|
await dispatch(pipe(addObjectIntent, chain(LayoutAction.Open, { part: 'main' })));
|
|
@@ -38,7 +38,7 @@ export const PopoverRenameObject = ({ object: obj }: { object: ReactiveObject<an
|
|
|
38
38
|
<Input.Root>
|
|
39
39
|
<Input.Label srOnly>{t('object name label')}</Input.Label>
|
|
40
40
|
<Input.TextInput
|
|
41
|
-
placeholder={t('object
|
|
41
|
+
placeholder={t('object placeholder')}
|
|
42
42
|
value={name}
|
|
43
43
|
data-testid='spacePlugin.renameObject.input'
|
|
44
44
|
onChange={({ target: { value } }) => setName(value)}
|
package/src/meta.ts
CHANGED
|
@@ -6,8 +6,8 @@ import { type PluginMeta } from '@dxos/app-framework';
|
|
|
6
6
|
|
|
7
7
|
export const SPACE_PLUGIN = 'dxos.org/plugin/space';
|
|
8
8
|
|
|
9
|
-
export const meta = {
|
|
9
|
+
export const meta: PluginMeta = {
|
|
10
10
|
id: SPACE_PLUGIN,
|
|
11
11
|
name: 'Spaces',
|
|
12
12
|
icon: 'ph--planet--regular',
|
|
13
|
-
}
|
|
13
|
+
};
|
package/src/translations.ts
CHANGED
|
@@ -10,6 +10,7 @@ export default [
|
|
|
10
10
|
'en-US': {
|
|
11
11
|
[CollectionType.typename]: {
|
|
12
12
|
'typename label': 'Collection',
|
|
13
|
+
'object name placeholder': 'New collection',
|
|
13
14
|
},
|
|
14
15
|
[SPACE_PLUGIN]: {
|
|
15
16
|
'plugin name': 'Spaces',
|
|
@@ -39,7 +40,7 @@ export default [
|
|
|
39
40
|
'confirm restore title': 'Overwrite files in this space?',
|
|
40
41
|
'confirm restore body': 'Restoring from a backup will overwrite the contents of any documents that match.',
|
|
41
42
|
'upload file message': 'Drag file here or click to browse',
|
|
42
|
-
'object
|
|
43
|
+
'object placeholder': 'Type a title here…',
|
|
43
44
|
'personal space label': 'Personal Space',
|
|
44
45
|
'spaces label': 'Spaces',
|
|
45
46
|
'show hidden spaces label': 'Show closed spaces',
|
|
@@ -64,9 +65,6 @@ export default [
|
|
|
64
65
|
'missing object message': 'Object not available.',
|
|
65
66
|
'missing object description':
|
|
66
67
|
'The requested object has not been found yet. Ensure there are enough peers online in the space with an updated copy.',
|
|
67
|
-
'create collection label': 'Create collection',
|
|
68
|
-
'unnamed object label': 'New object',
|
|
69
|
-
'unnamed collection label': 'New collection',
|
|
70
68
|
'create object in space label': 'Add to space',
|
|
71
69
|
'create object in collection label': 'Add to collection',
|
|
72
70
|
'share space label': 'Share',
|
package/src/types/thread.ts
CHANGED
|
@@ -2,66 +2,12 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { Ref, S, TypedObject } from '@dxos/echo-schema';
|
|
6
|
+
import { MessageType } from '@dxos/schema';
|
|
6
7
|
|
|
7
8
|
// TODO(wittjosiah): These types were placed here rather than in @dxos/plugin-thread
|
|
8
9
|
// in order to avoid a circular dependency between threads and other objects that use threads.
|
|
9
10
|
|
|
10
|
-
// TODO(wittjosiah): Factor out to halo?
|
|
11
|
-
export class ContactType extends TypedObject({ typename: 'dxos.org/type/Contact', version: '0.1.0' })({
|
|
12
|
-
name: S.optional(S.String),
|
|
13
|
-
identifiers: S.mutable(
|
|
14
|
-
S.Array(
|
|
15
|
-
S.Struct({
|
|
16
|
-
type: S.String,
|
|
17
|
-
value: S.String,
|
|
18
|
-
}),
|
|
19
|
-
),
|
|
20
|
-
),
|
|
21
|
-
}) {}
|
|
22
|
-
|
|
23
|
-
export const ActorSchema = S.mutable(
|
|
24
|
-
S.Struct({
|
|
25
|
-
contact: S.optional(Ref(ContactType)),
|
|
26
|
-
// TODO(wittjosiah): Should the below fields just be the contact schema?
|
|
27
|
-
// i.e. it should either be a reference to an existing contact or an inline contact schema.
|
|
28
|
-
identityKey: S.optional(S.String),
|
|
29
|
-
// TODO(burdon): Generalize to handle/identifier?
|
|
30
|
-
email: S.optional(S.String),
|
|
31
|
-
name: S.optional(S.String),
|
|
32
|
-
}),
|
|
33
|
-
);
|
|
34
|
-
|
|
35
|
-
export type ActorType = S.Schema.Type<typeof ActorSchema>;
|
|
36
|
-
|
|
37
|
-
export enum MessageState {
|
|
38
|
-
NONE = 0,
|
|
39
|
-
ARCHIVED = 1,
|
|
40
|
-
DELETED = 2,
|
|
41
|
-
SPAM = 3,
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export class MessageType extends TypedObject({ typename: 'dxos.org/type/Message', version: '0.1.0' })({
|
|
45
|
-
/** ISO date string when the message was sent. */
|
|
46
|
-
timestamp: S.String,
|
|
47
|
-
/** Message state. */
|
|
48
|
-
state: S.optional(S.Enums(MessageState)),
|
|
49
|
-
/** Identity of the message sender. */
|
|
50
|
-
sender: ActorSchema,
|
|
51
|
-
/** Text content of the message. */
|
|
52
|
-
text: S.String,
|
|
53
|
-
/** Non-text content sent with a message (e.g., files, polls, etc.) */
|
|
54
|
-
parts: S.optional(S.mutable(S.Array(Ref(Expando)))),
|
|
55
|
-
/** Custom properties for specific message types (e.g. email subject or cc fields). */
|
|
56
|
-
properties: S.optional(S.mutable(S.Record({ key: S.String, value: S.Any }))),
|
|
57
|
-
// TODO(wittjosiah): Add read status:
|
|
58
|
-
// - Read receipts need to be per space member.
|
|
59
|
-
// - Read receipts don't need to be added to schema until they being implemented.
|
|
60
|
-
/** Context of the application when message was created. */
|
|
61
|
-
// TODO(burdon): Evolve "attention object" to be current UX state? E.g., of Deck?
|
|
62
|
-
context: S.optional(Ref(Expando)),
|
|
63
|
-
}) {}
|
|
64
|
-
|
|
65
11
|
export const ThreadStatus = S.Union(S.Literal('staged'), S.Literal('active'), S.Literal('resolved'));
|
|
66
12
|
|
|
67
13
|
export class ThreadType extends TypedObject({ typename: 'dxos.org/type/Thread', version: '0.1.0' })({
|
package/src/types/types.ts
CHANGED
|
@@ -94,8 +94,10 @@ export const SpaceForm = S.Struct({
|
|
|
94
94
|
});
|
|
95
95
|
|
|
96
96
|
export type ObjectForm<T extends BaseObject = BaseObject> = {
|
|
97
|
+
// TODO(dmaretskyi): Change to S.Schema.AnyNoContext
|
|
97
98
|
objectSchema: TypedObject;
|
|
98
99
|
formSchema?: S.Schema<T, any>;
|
|
100
|
+
hidden?: boolean;
|
|
99
101
|
getIntent: (props: T, options: { space: Space }) => AnyIntentChain;
|
|
100
102
|
};
|
|
101
103
|
|
|
@@ -206,6 +208,7 @@ export namespace SpaceAction {
|
|
|
206
208
|
input: S.Struct({
|
|
207
209
|
object: ReactiveObjectSchema,
|
|
208
210
|
target: S.Union(SpaceSchema, CollectionType),
|
|
211
|
+
hidden: S.optional(S.Boolean),
|
|
209
212
|
}),
|
|
210
213
|
output: S.Struct({
|
|
211
214
|
id: S.String,
|
package/src/util.tsx
CHANGED
|
@@ -399,8 +399,7 @@ export const createObjectNode = ({
|
|
|
399
399
|
properties: {
|
|
400
400
|
...partials,
|
|
401
401
|
label: metadata.label?.(object) ||
|
|
402
|
-
object.name ||
|
|
403
|
-
metadata.placeholder || ['unnamed object label', { ns: SPACE_PLUGIN }],
|
|
402
|
+
object.name || ['object name placeholder', { ns: type, default: 'New object' }],
|
|
404
403
|
icon: metadata.icon ?? 'ph--placeholder--regular',
|
|
405
404
|
testId: 'spacePlugin.object',
|
|
406
405
|
persistenceClass: 'echo',
|