@dxos/plugin-debug 0.8.4-main.3fbcb4aa9b → 0.8.4-main.43cb759274
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/PLUGIN.mdl +373 -0
- package/README.md +1 -1
- package/dist/lib/neutral/{DebugObjectPanel-UJ63CV25.mjs → DebugObjectPanel-OS65NC4M.mjs} +1 -1
- package/dist/lib/neutral/{DebugObjectPanel-UJ63CV25.mjs.map → DebugObjectPanel-OS65NC4M.mjs.map} +1 -1
- package/dist/lib/neutral/DebugPlugin.mjs +12 -0
- package/dist/lib/neutral/DebugPlugin.mjs.map +4 -4
- package/dist/lib/neutral/DebugPlugin.workerd.mjs +12 -0
- package/dist/lib/neutral/DebugPlugin.workerd.mjs.map +7 -0
- package/dist/lib/neutral/{DebugSettings-Z3XADRNK.mjs → DebugSettings-RKYNQIKH.mjs} +5 -6
- package/dist/lib/neutral/DebugSettings-RKYNQIKH.mjs.map +7 -0
- package/dist/lib/neutral/{DebugSpaceObjectsPanel-NISULU6U.mjs → DebugSpaceObjectsPanel-BHOCFWDJ.mjs} +1 -1
- package/dist/lib/neutral/{DebugSpaceObjectsPanel-NISULU6U.mjs.map → DebugSpaceObjectsPanel-BHOCFWDJ.mjs.map} +1 -1
- package/dist/lib/neutral/{DebugStatus-YB3KFP7G.mjs → DebugStatus-H2BAHN26.mjs} +2 -1
- package/dist/lib/neutral/DebugStatus-H2BAHN26.mjs.map +7 -0
- package/dist/lib/neutral/GithubPanel-QJKDJRVQ.mjs +177 -0
- package/dist/lib/neutral/GithubPanel-QJKDJRVQ.mjs.map +7 -0
- package/dist/lib/neutral/RegistryPanel-64GIYJHN.mjs +161 -0
- package/dist/lib/neutral/RegistryPanel-64GIYJHN.mjs.map +7 -0
- package/dist/lib/neutral/{SpaceGenerator-UBYB4NPD.mjs → SpaceGenerator-Y35G6DRV.mjs} +9 -6
- package/dist/lib/neutral/SpaceGenerator-Y35G6DRV.mjs.map +7 -0
- package/dist/lib/neutral/{Wireframe-7SNRUKET.mjs → Wireframe-WD7S2AUU.mjs} +2 -2
- package/dist/lib/neutral/Wireframe-WD7S2AUU.mjs.map +7 -0
- package/dist/lib/neutral/{app-graph-builder-YPYHL2K5.mjs → app-graph-builder-XYLTBYKN.mjs} +46 -11
- package/dist/lib/neutral/app-graph-builder-XYLTBYKN.mjs.map +7 -0
- package/dist/lib/neutral/capabilities/index.mjs +2 -2
- package/dist/lib/neutral/chunk-HOV6MV5B.mjs +43 -0
- package/dist/lib/neutral/chunk-HOV6MV5B.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-NFIOTQRZ.mjs → chunk-UAAGABXZ.mjs} +2 -1
- package/dist/lib/neutral/{chunk-NFIOTQRZ.mjs.map → chunk-UAAGABXZ.mjs.map} +3 -3
- package/dist/lib/neutral/components/index.mjs +39 -48
- package/dist/lib/neutral/components/index.mjs.map +3 -3
- package/dist/lib/neutral/containers/index.mjs +9 -5
- package/dist/lib/neutral/containers/index.mjs.map +3 -3
- package/dist/lib/neutral/index.mjs +2 -2
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/lib/neutral/meta.mjs +1 -1
- package/dist/lib/neutral/plugin.mjs +1 -1
- package/dist/lib/neutral/{react-surface-NH2H63KW.mjs → react-surface-3MDMZGCA.mjs} +23 -18
- package/dist/lib/neutral/react-surface-3MDMZGCA.mjs.map +7 -0
- package/dist/lib/neutral/translations.mjs +10 -2
- package/dist/lib/neutral/translations.mjs.map +2 -2
- package/dist/lib/neutral/types/index.mjs +1 -1
- package/dist/types/src/DebugPlugin.d.ts.map +1 -1
- package/dist/types/src/DebugPlugin.workerd.d.ts +5 -0
- package/dist/types/src/DebugPlugin.workerd.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/components/DebugSettings/DebugSettings.d.ts.map +1 -1
- package/dist/types/src/components/DebugSettings/DebugSettings.stories.d.ts +8 -1
- package/dist/types/src/components/DebugSettings/DebugSettings.stories.d.ts.map +1 -1
- package/dist/types/src/components/SpaceGenerator/ObjectGenerator.d.ts +2 -3
- package/dist/types/src/components/SpaceGenerator/ObjectGenerator.d.ts.map +1 -1
- package/dist/types/src/components/SpaceGenerator/presets.d.ts.map +1 -1
- package/dist/types/src/containers/DebugStatus/DebugStatus.d.ts.map +1 -1
- package/dist/types/src/containers/GithubPanel/GithubComponent.d.ts +15 -0
- package/dist/types/src/containers/GithubPanel/GithubComponent.d.ts.map +1 -0
- package/dist/types/src/containers/GithubPanel/GithubComponent.stories.d.ts +106 -0
- package/dist/types/src/containers/GithubPanel/GithubComponent.stories.d.ts.map +1 -0
- package/dist/types/src/containers/GithubPanel/GithubPanel.d.ts +3 -0
- package/dist/types/src/containers/GithubPanel/GithubPanel.d.ts.map +1 -0
- package/dist/types/src/containers/GithubPanel/index.d.ts +2 -0
- package/dist/types/src/containers/GithubPanel/index.d.ts.map +1 -0
- package/dist/types/src/containers/RegistryPanel/RegistryPanel.d.ts +3 -0
- package/dist/types/src/containers/RegistryPanel/RegistryPanel.d.ts.map +1 -0
- package/dist/types/src/containers/RegistryPanel/index.d.ts +2 -0
- package/dist/types/src/containers/RegistryPanel/index.d.ts.map +1 -0
- package/dist/types/src/containers/SpaceGenerator/SpaceGenerator.d.ts.map +1 -1
- package/dist/types/src/containers/index.d.ts +2 -0
- package/dist/types/src/containers/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/translations.d.ts +8 -1
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/index.d.ts +1 -0
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +60 -70
- package/src/DebugPlugin.tsx +6 -0
- package/src/DebugPlugin.workerd.ts +12 -0
- package/src/capabilities/app-graph-builder.ts +38 -10
- package/src/capabilities/react-surface.tsx +22 -15
- package/src/components/DebugSettings/DebugSettings.tsx +5 -8
- package/src/components/SpaceGenerator/ObjectGenerator.tsx +16 -14
- package/src/components/SpaceGenerator/presets.ts +13 -14
- package/src/containers/DebugObjectPanel/DebugObjectPanel.tsx +2 -2
- package/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.tsx +2 -2
- package/src/containers/DebugStatus/DebugStatus.tsx +1 -0
- package/src/containers/GithubPanel/GithubComponent.stories.tsx +38 -0
- package/src/containers/GithubPanel/GithubComponent.tsx +192 -0
- package/src/containers/GithubPanel/GithubPanel.tsx +17 -0
- package/src/containers/GithubPanel/index.ts +5 -0
- package/src/containers/RegistryPanel/RegistryPanel.tsx +150 -0
- package/src/containers/RegistryPanel/index.ts +5 -0
- package/src/containers/SpaceGenerator/SpaceGenerator.tsx +6 -5
- package/src/containers/Wireframe/Wireframe.tsx +1 -1
- package/src/containers/index.ts +2 -0
- package/src/meta.ts +26 -6
- package/src/translations.ts +9 -1
- package/src/types/index.ts +1 -0
- package/src/vite-env.d.ts +10 -0
- package/dist/lib/neutral/DebugSettings-Z3XADRNK.mjs.map +0 -7
- package/dist/lib/neutral/DebugStatus-YB3KFP7G.mjs.map +0 -7
- package/dist/lib/neutral/SpaceGenerator-UBYB4NPD.mjs.map +0 -7
- package/dist/lib/neutral/Wireframe-7SNRUKET.mjs.map +0 -7
- package/dist/lib/neutral/app-graph-builder-YPYHL2K5.mjs.map +0 -7
- package/dist/lib/neutral/chunk-3OGPOE7H.mjs +0 -20
- package/dist/lib/neutral/chunk-3OGPOE7H.mjs.map +0 -7
- package/dist/lib/neutral/react-surface-NH2H63KW.mjs.map +0 -7
|
@@ -6,7 +6,7 @@ import { getPersonalSpace } from "@dxos/app-toolkit";
|
|
|
6
6
|
import { SaveConfig, Storage, defs } from "@dxos/config";
|
|
7
7
|
import { log } from "@dxos/log";
|
|
8
8
|
import { useClient } from "@dxos/react-client";
|
|
9
|
-
import {
|
|
9
|
+
import { IconButton, Input, Select, Toast, useFileDownload, useTranslation } from "@dxos/react-ui";
|
|
10
10
|
import { Settings as SettingsForm } from "@dxos/react-ui-form";
|
|
11
11
|
import { TRACE_ALL_KEY } from "@dxos/tracing";
|
|
12
12
|
import { setDeep } from "@dxos/util";
|
|
@@ -192,10 +192,9 @@ var DebugSettings = ({ settings, onSettingsChange, logStore, onUpload }) => {
|
|
|
192
192
|
iconOnly: true,
|
|
193
193
|
label: t("settings.repair.label"),
|
|
194
194
|
onClick: handleRepair
|
|
195
|
-
})), toast && /* @__PURE__ */ React.createElement(Toast.Root, null, /* @__PURE__ */ React.createElement(Toast.
|
|
196
|
-
icon: "ph--gift--duotone"
|
|
197
|
-
|
|
198
|
-
}), /* @__PURE__ */ React.createElement("span", null, toast.title)), toast.description && /* @__PURE__ */ React.createElement(Toast.Description, null, toast.description))), /* @__PURE__ */ React.createElement(SettingsForm.Item, {
|
|
195
|
+
})), toast && /* @__PURE__ */ React.createElement(Toast.Root, null, /* @__PURE__ */ React.createElement(Toast.Title, {
|
|
196
|
+
icon: "ph--gift--duotone"
|
|
197
|
+
}, /* @__PURE__ */ React.createElement("span", null, toast.title)), toast.description && /* @__PURE__ */ React.createElement(Toast.Description, null, toast.description)), /* @__PURE__ */ React.createElement(SettingsForm.Item, {
|
|
199
198
|
title: t("settings.choose-storage-adaptor.label"),
|
|
200
199
|
description: t("settings.choose-storage-adaptor.description")
|
|
201
200
|
}, /* @__PURE__ */ React.createElement(Select.Root, {
|
|
@@ -221,4 +220,4 @@ var updateConfig = (config, setConfig, path, value) => {
|
|
|
221
220
|
export {
|
|
222
221
|
DebugSettings as default
|
|
223
222
|
};
|
|
224
|
-
//# sourceMappingURL=DebugSettings-
|
|
223
|
+
//# sourceMappingURL=DebugSettings-RKYNQIKH.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/components/DebugSettings/DebugSettings.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { AppCapabilities, getPersonalSpace } from '@dxos/app-toolkit';\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { type ConfigProto, SaveConfig, Storage, defs } from '@dxos/config';\nimport { log } from '@dxos/log';\nimport { type IdbLogStore } from '@dxos/log-store-idb';\nimport { useClient } from '@dxos/react-client';\nimport { IconButton, Input, Select, Toast, useFileDownload, useTranslation } from '@dxos/react-ui';\nimport { Settings as SettingsForm } from '@dxos/react-ui-form';\nimport { TRACE_ALL_KEY } from '@dxos/tracing';\nimport { setDeep } from '@dxos/util';\n\nimport { meta } from '#meta';\nimport { type Settings } from '#types';\n\ntype Toast = {\n title: string;\n description?: string;\n};\n\nconst StorageAdapters = {\n opfs: defs.Runtime.Client.Storage.StorageDriver.WEBFS,\n idb: defs.Runtime.Client.Storage.StorageDriver.IDB,\n} as const;\n\nexport type DebugSettingsProps = AppSurface.SettingsArticleProps<\n Settings.Settings,\n {\n logStore: IdbLogStore;\n onUpload?: AppCapabilities.FileUploader;\n }\n>;\n\nexport const DebugSettings = ({ settings, onSettingsChange, logStore, onUpload }: DebugSettingsProps) => {\n const { t } = useTranslation(meta.id);\n const [toast, setToast] = useState<Toast>();\n const download = useFileDownload();\n const [storageConfig, setStorageConfig] = useState<ConfigProto>({});\n const client = useClient();\n\n useEffect(() => {\n void Storage().then((config) => setStorageConfig(config));\n }, []);\n\n const handleToast = useCallback(\n (toast: Toast) => {\n setToast(toast);\n const timer = setTimeout(() => setToast(undefined), 5_000);\n return () => clearTimeout(timer);\n },\n [setToast],\n );\n\n const handleDownload = useCallback(async () => {\n const data = await client.diagnostics();\n const file = new Blob([JSON.stringify(data, undefined, 2)], {\n type: 'text/plain',\n });\n const fileName = `composer-${new Date().toISOString().replace(/\\W/g, '-')}.json`;\n download(file, fileName);\n\n if (onUpload) {\n const personalSpace = getPersonalSpace(client);\n if (!personalSpace) {\n log.error('no personal space available for upload');\n return;\n }\n const info = await onUpload(personalSpace.db, new File([file], fileName));\n if (!info) {\n log.error('diagnostics failed to upload to IPFS');\n return;\n }\n handleToast({\n title: t('settings.uploaded.message'),\n description: t('settings.uploaded.description'),\n });\n\n // TODO(nf): move to IpfsPlugin?\n const url = client.config.values.runtime!.services!.ipfs!.gateway + '/' + info.cid;\n void navigator.clipboard.writeText(url);\n handleToast({\n title: t('settings.uploaded.message'),\n description: t('settings.uploaded.description'),\n });\n log.info('diagnostics', { url });\n }\n }, [client, download, handleToast, onUpload, t]);\n\n const handleDownloadLogs = useCallback(async () => {\n const ndjson = await logStore.export();\n const file = new Blob([ndjson], { type: 'application/x-ndjson' });\n const fileName = `composer-logs-${new Date().toISOString().slice(0, 19).replace(/:/g, '-')}.ndjson`;\n download(file, fileName);\n }, [download, logStore]);\n\n const handleRepair = useCallback(async () => {\n try {\n const info = await client.repair();\n setStorageConfig(await Storage());\n handleToast({\n title: t('settings.repair-success.message'),\n description: JSON.stringify(info, undefined, 2),\n });\n } catch (err: any) {\n handleToast({\n title: t('settings.repair-failed.message'),\n description: err.message,\n });\n }\n }, [client, handleToast, t]);\n\n const handleWireframeChange = useCallback(\n (checked: boolean) => onSettingsChange?.((s) => ({ ...s, wireframe: !!checked })),\n [onSettingsChange],\n );\n\n const traceAll = useMemo(\n () => settings.traceAll ?? (typeof localStorage !== 'undefined' && localStorage.getItem(TRACE_ALL_KEY) === 'true'),\n [settings.traceAll],\n );\n\n const handleTraceAllChange = useCallback(\n (checked: boolean) => {\n const value = !!checked;\n localStorage.setItem(TRACE_ALL_KEY, String(value));\n onSettingsChange?.((s) => ({ ...s, traceAll: value }));\n },\n [onSettingsChange],\n );\n\n const handleOpenTracingPanel = useCallback(() => {\n window.open('about:blank', '_blank');\n }, []);\n\n const handleStorageAdapterChange = useCallback(\n (value: string) => {\n if (confirm(t('settings.storage-adapter.changed-alert.message'))) {\n updateConfig(\n storageConfig,\n setStorageConfig,\n ['runtime', 'client', 'storage', 'dataStore'],\n StorageAdapters[value as keyof typeof StorageAdapters],\n );\n }\n },\n [storageConfig, t],\n );\n\n return (\n <SettingsForm.Viewport>\n <SettingsForm.Section title={t('settings.title', { ns: meta.id })}>\n <SettingsForm.Item title={t('settings.wireframe.label')} description={t('settings.wireframe.description')}>\n <Input.Switch\n disabled={!onSettingsChange}\n checked={settings.wireframe}\n onCheckedChange={handleWireframeChange}\n />\n </SettingsForm.Item>\n <SettingsForm.Item title={t('settings.trace-all.label')} description={t('settings.trace-all.description')}>\n <Input.Switch disabled={!onSettingsChange} checked={traceAll} onCheckedChange={handleTraceAllChange} />\n </SettingsForm.Item>\n <SettingsForm.Item\n title={t('settings.tracing-panel.label')}\n description={t('settings.tracing-panel.description')}\n >\n <IconButton\n icon='ph--arrow-square-out--regular'\n iconOnly\n label={t('settings.tracing-panel.label')}\n onClick={handleOpenTracingPanel}\n />\n </SettingsForm.Item>\n <SettingsForm.Item\n title={t('settings.download-diagnostics.label')}\n description={t('settings.download-diagnostics.description')}\n >\n <IconButton\n icon='ph--download-simple--regular'\n iconOnly\n label={t('settings.download-diagnostics.label')}\n onClick={handleDownload}\n />\n </SettingsForm.Item>\n <SettingsForm.Item\n title={t('settings.download-logs.label')}\n description={t('settings.download-logs.description')}\n >\n <IconButton\n icon='ph--download-simple--regular'\n iconOnly\n label={t('settings.download-logs.label')}\n onClick={handleDownloadLogs}\n />\n </SettingsForm.Item>\n <SettingsForm.Item title={t('settings.repair.label')} description={t('settings.repair.description')}>\n <IconButton\n icon='ph--first-aid-kit--regular'\n iconOnly\n label={t('settings.repair.label')}\n onClick={handleRepair}\n />\n </SettingsForm.Item>\n\n {/* TODO(burdon): Move to layout? */}\n {toast && (\n <Toast.Root>\n <Toast.Title icon='ph--gift--duotone'>\n <span>{toast.title}</span>\n </Toast.Title>\n {toast.description && <Toast.Description>{toast.description}</Toast.Description>}\n </Toast.Root>\n )}\n\n <SettingsForm.Item\n title={t('settings.choose-storage-adaptor.label')}\n description={t('settings.choose-storage-adaptor.description')}\n >\n <Select.Root\n disabled={!onSettingsChange}\n value={\n Object.entries(StorageAdapters).find(\n ([_name, value]) => value === storageConfig?.runtime?.client?.storage?.dataStore,\n )?.[0]\n }\n onValueChange={handleStorageAdapterChange}\n >\n <Select.TriggerButton disabled={!onSettingsChange} placeholder={t('settings.data-store.label')} />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n {Object.keys(StorageAdapters).map((key) => (\n <Select.Option key={key} value={key}>\n {t(`settings.storage-adaptor.${key}.label`)}\n </Select.Option>\n ))}\n </Select.Viewport>\n <Select.Arrow />\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </SettingsForm.Item>\n </SettingsForm.Section>\n </SettingsForm.Viewport>\n );\n};\n\nconst updateConfig = (config: ConfigProto, setConfig: (newConfig: ConfigProto) => void, path: string[], value: any) => {\n const storageConfigCopy = JSON.parse(JSON.stringify(config ?? {}));\n setDeep(storageConfigCopy, path, value);\n setConfig(storageConfigCopy);\n queueMicrotask(async () => {\n await SaveConfig(storageConfigCopy);\n });\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React", "useCallback", "useEffect", "useMemo", "useState", "getPersonalSpace", "SaveConfig", "Storage", "defs", "log", "useClient", "IconButton", "Input", "Select", "Toast", "useFileDownload", "useTranslation", "Settings", "SettingsForm", "TRACE_ALL_KEY", "setDeep", "meta", "StorageAdapters", "idb", "Client", "DebugSettings", "settings", "onSettingsChange", "toast", "download", "storageConfig", "setStorageConfig", "client", "config", "handleToast", "setToast", "setTimeout", "clearTimeout", "Blob", "JSON", "stringify", "data", "undefined", "type", "fileName", "onUpload", "personalSpace", "error", "description", "title", "info", "t", "ndjson", "checked", "handleTraceAllChange", "localStorage", "String", "value", "handleStorageAdapterChange", "disabled", "wireframe", "onCheckedChange", "traceAll", "icon", "iconOnly", "label", "onClick", "handleOpenTracingPanel", "handleDownload", "handleDownloadLogs", "handleRepair", "span", "Object", "entries", "find", "_name", "onValueChange", "TriggerButton", "key", "updateConfig", "path", "storageConfigCopy", "setConfig", "queueMicrotask"]
|
|
7
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useState } from 'react';\n\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { ObjectsTree } from '@dxos/devtools';\nimport { Filter, Query } from '@dxos/echo';\nimport { type
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useState } from 'react';\n\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { ObjectsTree } from '@dxos/devtools';\nimport { Filter, Query } from '@dxos/echo';\nimport { type EntityId } from '@dxos/keys';\nimport { useQuery } from '@dxos/react-client/echo';\nimport { Clipboard, Grid, Input, Panel, ScrollArea, Toolbar } from '@dxos/react-ui';\nimport { JsonHighlighter } from '@dxos/react-ui-syntax-highlighter';\n\nexport type DebugSpaceObjectsPanelProps = AppSurface.SpaceArticleProps;\n\nexport const DebugSpaceObjectsPanel = ({ space }: DebugSpaceObjectsPanelProps) => {\n const [selectedId, setSelectedId] = useState<EntityId | null>(null);\n const [selectedObject] = useQuery(\n space.db,\n selectedId ? Query.select(Filter.id(selectedId)) : Query.select(Filter.nothing()),\n );\n\n return (\n <Clipboard.Provider>\n <Panel.Root>\n <Panel.Toolbar asChild>\n <Toolbar.Root>\n <Input.Root>\n <Input.TextInput disabled placeholder='Search...' />\n </Input.Root>\n </Toolbar.Root>\n </Panel.Toolbar>\n <Panel.Content asChild>\n <Grid rows={2} classNames='divide-y divide-separator'>\n <ScrollArea.Root>\n <ScrollArea.Viewport>\n <ObjectsTree db={space.db} onSelect={(entity) => setSelectedId(entity.id)} />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n {selectedObject && <JsonHighlighter classNames='p-1' data={selectedObject} />}\n </Grid>\n </Panel.Content>\n </Panel.Root>\n </Clipboard.Provider>\n );\n};\n"],
|
|
5
5
|
"mappings": ";;;AAIA,OAAOA,SAASC,gBAAgB;AAGhC,SAASC,mBAAmB;AAC5B,SAASC,QAAQC,aAAa;AAE9B,SAASC,gBAAgB;AACzB,SAASC,WAAWC,MAAMC,OAAOC,OAAOC,YAAYC,eAAe;AACnE,SAASC,uBAAuB;AAIzB,IAAMC,yBAAyB,CAAC,EAAEC,MAAK,MAA+B;AAC3E,QAAM,CAACC,YAAYC,aAAAA,IAAiBf,SAA0B,IAAA;AAC9D,QAAM,CAACgB,cAAAA,IAAkBZ,SACvBS,MAAMI,IACNH,aAAaX,MAAMe,OAAOhB,OAAOiB,GAAGL,UAAAA,CAAAA,IAAeX,MAAMe,OAAOhB,OAAOkB,QAAO,CAAA,CAAA;AAGhF,SACE,sBAAA,cAACf,UAAUgB,UAAQ,MACjB,sBAAA,cAACb,MAAMc,MAAI,MACT,sBAAA,cAACd,MAAME,SAAO;IAACa,SAAAA;KACb,sBAAA,cAACb,QAAQY,MAAI,MACX,sBAAA,cAACf,MAAMe,MAAI,MACT,sBAAA,cAACf,MAAMiB,WAAS;IAACC,UAAAA;IAASC,aAAY;SAI5C,sBAAA,cAAClB,MAAMmB,SAAO;IAACJ,SAAAA;KACb,sBAAA,cAACjB,MAAAA;IAAKsB,MAAM;IAAGC,YAAW;KACxB,sBAAA,cAACpB,WAAWa,MAAI,MACd,sBAAA,cAACb,WAAWqB,UAAQ,MAClB,sBAAA,cAAC7B,aAAAA;IAAYgB,IAAIJ,MAAMI;IAAIc,UAAU,CAACC,WAAWjB,cAAciB,OAAOb,EAAE;QAG3EH,kBAAkB,sBAAA,cAACL,iBAAAA;IAAgBkB,YAAW;IAAMI,MAAMjB;;AAMvE;",
|
|
6
6
|
"names": ["React", "useState", "ObjectsTree", "Filter", "Query", "useQuery", "Clipboard", "Grid", "Input", "Panel", "ScrollArea", "Toolbar", "JsonHighlighter", "DebugSpaceObjectsPanel", "space", "selectedId", "setSelectedId", "selectedObject", "db", "select", "id", "nothing", "Provider", "Root", "asChild", "TextInput", "disabled", "placeholder", "Content", "rows", "classNames", "Viewport", "onSelect", "entity", "data"]
|
|
7
7
|
}
|
|
@@ -36,6 +36,7 @@ var ErrorIndicator = () => {
|
|
|
36
36
|
};
|
|
37
37
|
if (errorRef.current) {
|
|
38
38
|
return /* @__PURE__ */ React.createElement(StatusBar.Item, null, /* @__PURE__ */ React.createElement(IconButton, {
|
|
39
|
+
variant: "ghost",
|
|
39
40
|
icon: "ph--warning-circle--duotone",
|
|
40
41
|
iconOnly: true,
|
|
41
42
|
label: errorRef.current.message,
|
|
@@ -118,4 +119,4 @@ var DebugStatus = () => {
|
|
|
118
119
|
export {
|
|
119
120
|
DebugStatus as default
|
|
120
121
|
};
|
|
121
|
-
//# sourceMappingURL=DebugStatus-
|
|
122
|
+
//# sourceMappingURL=DebugStatus-H2BAHN26.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/containers/DebugStatus/DebugStatus.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { TimeoutError } from '@dxos/async';\nimport { StatusBar } from '@dxos/plugin-status-bar/components';\nimport { ConnectionState } from '@dxos/protocols/proto/dxos/client/services';\nimport { useNetworkStatus } from '@dxos/react-client/mesh';\nimport { IconButton } from '@dxos/react-ui';\n\nconst styles = {\n success: 'text-sky-300 dark:text-green-700',\n warning: 'text-orange-300 dark:text-orange-600',\n error: 'text-red-300 dark:text-red-600',\n};\n\n// TODO(burdon): Move out of debug plugin.\n// TODO(burdon): Make pluggable (move indicators to relevant plugins).\n// TODO(burdon): Vault heartbeat indicator (global scope)?\n\n/**\n * Ensure light doesn't flicker immediately after start.\n */\n// TODO(burdon): Move to @dxos/async (debounce?)\nconst _timer = (cb: (err?: Error) => void, options?: { min?: number; max?: number }) => {\n const min = options?.min ?? 500;\n let start: number;\n let pending: NodeJS.Timeout;\n let timeout: NodeJS.Timeout;\n return {\n start: () => {\n start = Date.now();\n clearTimeout(pending);\n if (options?.max) {\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n cb(new TimeoutError(options.max));\n }, options.max);\n }\n },\n stop: () => {\n clearTimeout(timeout);\n const delta = Date.now() - start;\n if (delta < min) {\n pending = setTimeout(() => {\n cb();\n }, min - delta);\n }\n },\n };\n};\n\n/**\n * Global error handler.\n */\n// TODO(burdon): Integrate with Sentry?\nconst ErrorIndicator = () => {\n const [, forceUpdate] = useState({});\n const errorRef = useRef<Error>(null);\n useEffect(() => {\n const errorListener = (event: any) => {\n const error: Error = event.error ?? event.reason;\n if (errorRef.current !== error) {\n errorRef.current = error;\n forceUpdate({});\n }\n };\n\n // TODO(burdon): Register globally?\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/error_event\n window.addEventListener('error', errorListener);\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/unhandledrejection_event\n window.addEventListener('unhandledrejection', errorListener);\n\n return () => {\n window.removeEventListener('error', errorListener);\n window.removeEventListener('unhandledrejection', errorListener);\n };\n }, []);\n\n const handleReset = () => {\n errorRef.current = null;\n forceUpdate({});\n };\n\n if (errorRef.current) {\n return (\n <StatusBar.Item>\n <IconButton\n variant='ghost'\n icon='ph--warning-circle--duotone'\n iconOnly\n label={errorRef.current.message}\n classNames={styles.error}\n onClick={handleReset}\n />\n </StatusBar.Item>\n );\n } else {\n return (\n <StatusBar.Item>\n <IconButton variant='ghost' icon='ph--check--regular' iconOnly label='No errors.' />\n </StatusBar.Item>\n );\n }\n};\n\n/**\n * Swarm connection handler.\n */\nconst SwarmIndicator = () => {\n const [state, setState] = useState(0);\n const { swarm } = useNetworkStatus();\n useEffect(() => {\n setState(swarm === ConnectionState.ONLINE ? 0 : 1);\n }, [swarm]);\n\n if (state === 0) {\n return (\n <StatusBar.Item>\n <IconButton variant='ghost' icon='ph--lightning--regular' iconOnly label='Connected to swarm.' />\n </StatusBar.Item>\n );\n } else {\n return (\n <StatusBar.Item>\n <IconButton\n variant='ghost'\n icon='ph--lightning-slash--regular'\n iconOnly\n label='Disconnected from swarm.'\n classNames={styles.warning}\n />\n </StatusBar.Item>\n );\n }\n};\n\n/**\n * Data saving indicator.\n */\n// TODO(burdon): Merge with SaveStatus.\nconst SavingIndicator = () => {\n const [state, _setState] = useState(0);\n // TODO(dmaretskyi): Fix this when we have save status for automerge.\n // useEffect(() => {\n // if (!space) {\n // return;\n // }\n // const { start, stop } = timer(() => setState(0), { min: 250 });\n // return space.db.pendingBatch.on(({ duration, error }) => {\n // if (error) {\n // setState(2);\n // stop();\n // } else if (duration === undefined) {\n // setState(1);\n // start();\n // } else {\n // stop();\n // }\n // });\n // }, [space]);\n\n switch (state) {\n case 2:\n return (\n <StatusBar.Item>\n <IconButton\n variant='ghost'\n icon='ph--circle--duotone'\n iconOnly\n label='Edit not saved.'\n classNames={styles.warning}\n />\n </StatusBar.Item>\n );\n case 1:\n return (\n <StatusBar.Item>\n <IconButton\n variant='ghost'\n icon='ph--circle--duotone'\n iconOnly\n label='Saving...'\n classNames={styles.success}\n />\n </StatusBar.Item>\n );\n case 0:\n default:\n return (\n <StatusBar.Item>\n <IconButton variant='ghost' icon='ph--circle--duotone' iconOnly label='Modified indicator.' />\n </StatusBar.Item>\n );\n }\n};\n\nconst indicators = [SavingIndicator, SwarmIndicator, ErrorIndicator];\n\nexport const DebugStatus = () => {\n return (\n <>\n {indicators.map((Indicator) => (\n <Indicator key={Indicator.name} />\n ))}\n </>\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React", "useEffect", "useRef", "useState", "TimeoutError", "StatusBar", "ConnectionState", "useNetworkStatus", "IconButton", "styles", "success", "warning", "error", "ErrorIndicator", "forceUpdate", "useState", "errorRef", "useRef", "useEffect", "errorListener", "event", "error", "reason", "current", "window", "addEventListener", "removeEventListener", "handleReset", "StatusBar", "Item", "IconButton", "variant", "icon", "iconOnly", "label", "message", "classNames", "styles", "onClick", "SwarmIndicator", "state", "setState", "swarm", "useNetworkStatus", "ConnectionState", "ONLINE", "warning", "SavingIndicator", "_setState", "success", "indicators", "DebugStatus", "map", "Indicator", "key", "name"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import "./chunk-J5LGTIGS.mjs";
|
|
2
|
+
|
|
3
|
+
// src/containers/GithubPanel/GithubPanel.tsx
|
|
4
|
+
import React2 from "react";
|
|
5
|
+
|
|
6
|
+
// src/containers/GithubPanel/GithubComponent.tsx
|
|
7
|
+
import React, { createContext, useContext, useEffect, useState } from "react";
|
|
8
|
+
import { IconButton, ScrollArea, useTranslation } from "@dxos/react-ui";
|
|
9
|
+
import { meta } from "#meta";
|
|
10
|
+
var DEFAULT_REPO = "dxos/dxos";
|
|
11
|
+
var DEFAULT_LIMIT = 20;
|
|
12
|
+
var ComponentContext = /* @__PURE__ */ createContext(null);
|
|
13
|
+
var useComponentContext = () => {
|
|
14
|
+
const ctx = useContext(ComponentContext);
|
|
15
|
+
if (!ctx) {
|
|
16
|
+
throw new Error("GithubComponent.* parts must be rendered inside GithubComponent.Root.");
|
|
17
|
+
}
|
|
18
|
+
return ctx;
|
|
19
|
+
};
|
|
20
|
+
var Root = ({ repo = DEFAULT_REPO, limit = DEFAULT_LIMIT, children }) => {
|
|
21
|
+
const [pulls, setPulls] = useState([]);
|
|
22
|
+
const [unavailable, setUnavailable] = useState(false);
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
const controller = new AbortController();
|
|
25
|
+
setPulls([]);
|
|
26
|
+
setUnavailable(false);
|
|
27
|
+
void (async () => {
|
|
28
|
+
try {
|
|
29
|
+
const url = new URL(`https://api.github.com/repos/${repo}/pulls`);
|
|
30
|
+
url.searchParams.set("state", "closed");
|
|
31
|
+
url.searchParams.set("sort", "updated");
|
|
32
|
+
url.searchParams.set("direction", "desc");
|
|
33
|
+
url.searchParams.set("per_page", String(limit * 2));
|
|
34
|
+
const response = await fetch(url.toString(), {
|
|
35
|
+
signal: controller.signal,
|
|
36
|
+
headers: {
|
|
37
|
+
Accept: "application/vnd.github+json"
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
if (!response.ok) {
|
|
41
|
+
setUnavailable(true);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const items = await response.json();
|
|
45
|
+
setPulls(items.filter((pull) => pull.merged_at !== null).slice(0, limit));
|
|
46
|
+
setUnavailable(false);
|
|
47
|
+
} catch {
|
|
48
|
+
if (controller.signal.aborted) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
setPulls([]);
|
|
52
|
+
setUnavailable(true);
|
|
53
|
+
}
|
|
54
|
+
})();
|
|
55
|
+
return () => controller.abort();
|
|
56
|
+
}, [
|
|
57
|
+
repo,
|
|
58
|
+
limit
|
|
59
|
+
]);
|
|
60
|
+
return /* @__PURE__ */ React.createElement(ComponentContext.Provider, {
|
|
61
|
+
value: {
|
|
62
|
+
repo,
|
|
63
|
+
pulls,
|
|
64
|
+
unavailable
|
|
65
|
+
}
|
|
66
|
+
}, children);
|
|
67
|
+
};
|
|
68
|
+
var Header = () => {
|
|
69
|
+
const { t } = useTranslation(meta.id);
|
|
70
|
+
const { repo, pulls, unavailable } = useComponentContext();
|
|
71
|
+
return /* @__PURE__ */ React.createElement("header", {
|
|
72
|
+
className: "flex items-center justify-between gap-1 px-4 py-3 bg-modal-surface border-b border-subdued-separator"
|
|
73
|
+
}, /* @__PURE__ */ React.createElement("a", {
|
|
74
|
+
href: `https://github.com/${repo}`,
|
|
75
|
+
target: "_blank",
|
|
76
|
+
rel: "noopener noreferrer",
|
|
77
|
+
className: "text-sm font-medium truncate"
|
|
78
|
+
}, "@", repo), /* @__PURE__ */ React.createElement("div", {
|
|
79
|
+
className: "text-xs text-description"
|
|
80
|
+
}, unavailable ? t("github-unavailable.message") : pulls.length > 0 ? t("recent-prs.label", {
|
|
81
|
+
count: pulls.length
|
|
82
|
+
}) : t("github-loading.message")));
|
|
83
|
+
};
|
|
84
|
+
var RELATIVE_UNITS = [
|
|
85
|
+
[
|
|
86
|
+
"year",
|
|
87
|
+
60 * 60 * 24 * 365
|
|
88
|
+
],
|
|
89
|
+
[
|
|
90
|
+
"month",
|
|
91
|
+
60 * 60 * 24 * 30
|
|
92
|
+
],
|
|
93
|
+
[
|
|
94
|
+
"week",
|
|
95
|
+
60 * 60 * 24 * 7
|
|
96
|
+
],
|
|
97
|
+
[
|
|
98
|
+
"day",
|
|
99
|
+
60 * 60 * 24
|
|
100
|
+
],
|
|
101
|
+
[
|
|
102
|
+
"hour",
|
|
103
|
+
60 * 60
|
|
104
|
+
],
|
|
105
|
+
[
|
|
106
|
+
"minute",
|
|
107
|
+
60
|
|
108
|
+
]
|
|
109
|
+
];
|
|
110
|
+
var formatRelative = (iso) => {
|
|
111
|
+
const formatter = new Intl.RelativeTimeFormat(void 0, {
|
|
112
|
+
numeric: "auto"
|
|
113
|
+
});
|
|
114
|
+
const diffSeconds = (Date.parse(iso) - Date.now()) / 1e3;
|
|
115
|
+
const absDiff = Math.abs(diffSeconds);
|
|
116
|
+
for (const [unit, secondsInUnit] of RELATIVE_UNITS) {
|
|
117
|
+
if (absDiff >= secondsInUnit) {
|
|
118
|
+
return formatter.format(Math.round(diffSeconds / secondsInUnit), unit);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return formatter.format(Math.round(diffSeconds), "second");
|
|
122
|
+
};
|
|
123
|
+
var PullRow = ({ pull }) => /* @__PURE__ */ React.createElement("li", null, /* @__PURE__ */ React.createElement("a", {
|
|
124
|
+
href: pull.html_url,
|
|
125
|
+
target: "_blank",
|
|
126
|
+
rel: "noopener noreferrer",
|
|
127
|
+
className: "flex items-start gap-2 px-2 py-1 rounded-sm hover:bg-hover-surface"
|
|
128
|
+
}, /* @__PURE__ */ React.createElement("img", {
|
|
129
|
+
src: pull.user.avatar_url,
|
|
130
|
+
alt: "",
|
|
131
|
+
className: "w-6 h-6 rounded-full shrink-0 mt-0.5"
|
|
132
|
+
}), /* @__PURE__ */ React.createElement("div", {
|
|
133
|
+
className: "flex flex-col min-w-0 flex-1"
|
|
134
|
+
}, /* @__PURE__ */ React.createElement("span", {
|
|
135
|
+
className: "text-sm truncate"
|
|
136
|
+
}, pull.title), /* @__PURE__ */ React.createElement("span", {
|
|
137
|
+
className: "text-xs text-description truncate"
|
|
138
|
+
}, "#", pull.number, " \xB7 ", pull.user.login, " \xB7 ", pull.merged_at ? formatRelative(pull.merged_at) : ""))));
|
|
139
|
+
var Content = () => {
|
|
140
|
+
const { pulls } = useComponentContext();
|
|
141
|
+
return /* @__PURE__ */ React.createElement(ScrollArea.Root, {
|
|
142
|
+
orientation: "vertical"
|
|
143
|
+
}, /* @__PURE__ */ React.createElement(ScrollArea.Viewport, null, /* @__PURE__ */ React.createElement("ul", {
|
|
144
|
+
className: "flex flex-col p-1"
|
|
145
|
+
}, pulls.map((pull) => /* @__PURE__ */ React.createElement(PullRow, {
|
|
146
|
+
key: pull.number,
|
|
147
|
+
pull
|
|
148
|
+
})))));
|
|
149
|
+
};
|
|
150
|
+
var StatusBar = () => {
|
|
151
|
+
const { t } = useTranslation(meta.id);
|
|
152
|
+
const { repo } = useComponentContext();
|
|
153
|
+
return /* @__PURE__ */ React.createElement(IconButton, {
|
|
154
|
+
icon: "ph--github-logo--regular",
|
|
155
|
+
label: t("view-on-github.button"),
|
|
156
|
+
variant: "primary",
|
|
157
|
+
classNames: "w-full",
|
|
158
|
+
onClick: () => {
|
|
159
|
+
window.open(`https://github.com/${repo}`, "_blank", "noopener,noreferrer");
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
};
|
|
163
|
+
var GithubComponent = {
|
|
164
|
+
Root,
|
|
165
|
+
Header,
|
|
166
|
+
Content,
|
|
167
|
+
StatusBar
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
// src/containers/GithubPanel/GithubPanel.tsx
|
|
171
|
+
var GithubPanel = () => /* @__PURE__ */ React2.createElement(GithubComponent.Root, null, /* @__PURE__ */ React2.createElement("div", {
|
|
172
|
+
className: "h-full grid grid-rows-[auto_minmax(0,1fr)_auto] overflow-hidden h-full is-full"
|
|
173
|
+
}, /* @__PURE__ */ React2.createElement(GithubComponent.Header, null), /* @__PURE__ */ React2.createElement(GithubComponent.Content, null), /* @__PURE__ */ React2.createElement(GithubComponent.StatusBar, null)));
|
|
174
|
+
export {
|
|
175
|
+
GithubPanel as default
|
|
176
|
+
};
|
|
177
|
+
//# sourceMappingURL=GithubPanel-QJKDJRVQ.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/containers/GithubPanel/GithubPanel.tsx", "../../../src/containers/GithubPanel/GithubComponent.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport React from 'react';\n\nimport { GithubComponent } from './GithubComponent';\n\nexport const GithubPanel = () => (\n <GithubComponent.Root>\n <div className='h-full grid grid-rows-[auto_minmax(0,1fr)_auto] overflow-hidden h-full is-full'>\n <GithubComponent.Header />\n <GithubComponent.Content />\n <GithubComponent.StatusBar />\n </div>\n </GithubComponent.Root>\n);\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { type ReactNode, createContext, useContext, useEffect, useState } from 'react';\n\nimport { IconButton, ScrollArea, useTranslation } from '@dxos/react-ui';\n\nimport { meta } from '#meta';\n\nconst DEFAULT_REPO = 'dxos/dxos';\nconst DEFAULT_LIMIT = 20;\n\ntype GithubUser = {\n login: string;\n avatar_url: string;\n html_url: string;\n};\n\ntype GithubPullRequest = {\n number: number;\n title: string;\n html_url: string;\n merged_at: string | null;\n user: GithubUser;\n};\n\ntype ComponentContextValue = {\n repo: string;\n pulls: GithubPullRequest[];\n unavailable: boolean;\n};\n\nconst ComponentContext = createContext<ComponentContextValue | null>(null);\n\nconst useComponentContext = () => {\n const ctx = useContext(ComponentContext);\n if (!ctx) {\n throw new Error('GithubComponent.* parts must be rendered inside GithubComponent.Root.');\n }\n return ctx;\n};\n\nexport type GithubComponentRootProps = {\n /** `<owner>/<name>`. Defaults to `dxos/dxos`. */\n repo?: string;\n /** Maximum number of merged PRs to fetch. */\n limit?: number;\n children?: ReactNode;\n};\n\nconst Root = ({ repo = DEFAULT_REPO, limit = DEFAULT_LIMIT, children }: GithubComponentRootProps) => {\n const [pulls, setPulls] = useState<GithubPullRequest[]>([]);\n const [unavailable, setUnavailable] = useState(false);\n\n useEffect(() => {\n const controller = new AbortController();\n setPulls([]);\n setUnavailable(false);\n void (async () => {\n try {\n const url = new URL(`https://api.github.com/repos/${repo}/pulls`);\n url.searchParams.set('state', 'closed');\n url.searchParams.set('sort', 'updated');\n url.searchParams.set('direction', 'desc');\n url.searchParams.set('per_page', String(limit * 2));\n const response = await fetch(url.toString(), {\n signal: controller.signal,\n headers: { Accept: 'application/vnd.github+json' },\n });\n if (!response.ok) {\n setUnavailable(true);\n return;\n }\n const items = (await response.json()) as GithubPullRequest[];\n setPulls(items.filter((pull) => pull.merged_at !== null).slice(0, limit));\n setUnavailable(false);\n } catch {\n if (controller.signal.aborted) {\n return;\n }\n setPulls([]);\n setUnavailable(true);\n }\n })();\n return () => controller.abort();\n }, [repo, limit]);\n\n return <ComponentContext.Provider value={{ repo, pulls, unavailable }}>{children}</ComponentContext.Provider>;\n};\n\nconst Header = () => {\n const { t } = useTranslation(meta.id);\n const { repo, pulls, unavailable } = useComponentContext();\n return (\n <header className='flex items-center justify-between gap-1 px-4 py-3 bg-modal-surface border-b border-subdued-separator'>\n <a\n href={`https://github.com/${repo}`}\n target='_blank'\n rel='noopener noreferrer'\n className='text-sm font-medium truncate'\n >\n @{repo}\n </a>\n <div className='text-xs text-description'>\n {unavailable\n ? t('github-unavailable.message')\n : pulls.length > 0\n ? t('recent-prs.label', { count: pulls.length })\n : t('github-loading.message')}\n </div>\n </header>\n );\n};\n\nconst RELATIVE_UNITS: Array<[Intl.RelativeTimeFormatUnit, number]> = [\n ['year', 60 * 60 * 24 * 365],\n ['month', 60 * 60 * 24 * 30],\n ['week', 60 * 60 * 24 * 7],\n ['day', 60 * 60 * 24],\n ['hour', 60 * 60],\n ['minute', 60],\n];\n\nconst formatRelative = (iso: string): string => {\n const formatter = new Intl.RelativeTimeFormat(undefined, { numeric: 'auto' });\n const diffSeconds = (Date.parse(iso) - Date.now()) / 1000;\n const absDiff = Math.abs(diffSeconds);\n for (const [unit, secondsInUnit] of RELATIVE_UNITS) {\n if (absDiff >= secondsInUnit) {\n return formatter.format(Math.round(diffSeconds / secondsInUnit), unit);\n }\n }\n return formatter.format(Math.round(diffSeconds), 'second');\n};\n\nconst PullRow = ({ pull }: { pull: GithubPullRequest }) => (\n <li>\n <a\n href={pull.html_url}\n target='_blank'\n rel='noopener noreferrer'\n className='flex items-start gap-2 px-2 py-1 rounded-sm hover:bg-hover-surface'\n >\n <img src={pull.user.avatar_url} alt='' className='w-6 h-6 rounded-full shrink-0 mt-0.5' />\n <div className='flex flex-col min-w-0 flex-1'>\n <span className='text-sm truncate'>{pull.title}</span>\n <span className='text-xs text-description truncate'>\n #{pull.number} · {pull.user.login} · {pull.merged_at ? formatRelative(pull.merged_at) : ''}\n </span>\n </div>\n </a>\n </li>\n);\n\nconst Content = () => {\n const { pulls } = useComponentContext();\n return (\n <ScrollArea.Root orientation='vertical'>\n <ScrollArea.Viewport>\n <ul className='flex flex-col p-1'>\n {pulls.map((pull) => (\n <PullRow key={pull.number} pull={pull} />\n ))}\n </ul>\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n );\n};\n\nconst StatusBar = () => {\n const { t } = useTranslation(meta.id);\n const { repo } = useComponentContext();\n return (\n <IconButton\n icon='ph--github-logo--regular'\n label={t('view-on-github.button')}\n variant='primary'\n classNames='w-full'\n onClick={() => {\n window.open(`https://github.com/${repo}`, '_blank', 'noopener,noreferrer');\n }}\n />\n );\n};\n\nexport const GithubComponent = {\n Root,\n Header,\n Content,\n StatusBar,\n};\n"],
|
|
5
|
+
"mappings": ";;;AAIA,OAAOA,YAAW;;;ACAlB,OAAOC,SAAyBC,eAAeC,YAAYC,WAAWC,gBAAgB;AAEtF,SAASC,YAAYC,YAAYC,sBAAsB;AAEvD,SAASC,YAAY;AAErB,IAAMC,eAAe;AACrB,IAAMC,gBAAgB;AAsBtB,IAAMC,mBAAmBV,8BAA4C,IAAA;AAErE,IAAMW,sBAAsB,MAAA;AAC1B,QAAMC,MAAMX,WAAWS,gBAAAA;AACvB,MAAI,CAACE,KAAK;AACR,UAAM,IAAIC,MAAM,uEAAA;EAClB;AACA,SAAOD;AACT;AAUA,IAAME,OAAO,CAAC,EAAEC,OAAOP,cAAcQ,QAAQP,eAAeQ,SAAQ,MAA4B;AAC9F,QAAM,CAACC,OAAOC,QAAAA,IAAYhB,SAA8B,CAAA,CAAE;AAC1D,QAAM,CAACiB,aAAaC,cAAAA,IAAkBlB,SAAS,KAAA;AAE/CD,YAAU,MAAA;AACR,UAAMoB,aAAa,IAAIC,gBAAAA;AACvBJ,aAAS,CAAA,CAAE;AACXE,mBAAe,KAAA;AACf,UAAM,YAAA;AACJ,UAAI;AACF,cAAMG,MAAM,IAAIC,IAAI,gCAAgCV,IAAAA,QAAY;AAChES,YAAIE,aAAaC,IAAI,SAAS,QAAA;AAC9BH,YAAIE,aAAaC,IAAI,QAAQ,SAAA;AAC7BH,YAAIE,aAAaC,IAAI,aAAa,MAAA;AAClCH,YAAIE,aAAaC,IAAI,YAAYC,OAAOZ,QAAQ,CAAA,CAAA;AAChD,cAAMa,WAAW,MAAMC,MAAMN,IAAIO,SAAQ,GAAI;UAC3CC,QAAQV,WAAWU;UACnBC,SAAS;YAAEC,QAAQ;UAA8B;QACnD,CAAA;AACA,YAAI,CAACL,SAASM,IAAI;AAChBd,yBAAe,IAAA;AACf;QACF;AACA,cAAMe,QAAS,MAAMP,SAASQ,KAAI;AAClClB,iBAASiB,MAAME,OAAO,CAACC,SAASA,KAAKC,cAAc,IAAA,EAAMC,MAAM,GAAGzB,KAAAA,CAAAA;AAClEK,uBAAe,KAAA;MACjB,QAAQ;AACN,YAAIC,WAAWU,OAAOU,SAAS;AAC7B;QACF;AACAvB,iBAAS,CAAA,CAAE;AACXE,uBAAe,IAAA;MACjB;IACF,GAAA;AACA,WAAO,MAAMC,WAAWqB,MAAK;EAC/B,GAAG;IAAC5B;IAAMC;GAAM;AAEhB,SAAO,sBAAA,cAACN,iBAAiBkC,UAAQ;IAACC,OAAO;MAAE9B;MAAMG;MAAOE;IAAY;KAAIH,QAAAA;AAC1E;AAEA,IAAM6B,SAAS,MAAA;AACb,QAAM,EAAEC,EAAC,IAAKzC,eAAeC,KAAKyC,EAAE;AACpC,QAAM,EAAEjC,MAAMG,OAAOE,YAAW,IAAKT,oBAAAA;AACrC,SACE,sBAAA,cAACsC,UAAAA;IAAOC,WAAU;KAChB,sBAAA,cAACC,KAAAA;IACCC,MAAM,sBAAsBrC,IAAAA;IAC5BsC,QAAO;IACPC,KAAI;IACJJ,WAAU;KACX,KACGnC,IAAAA,GAEJ,sBAAA,cAACwC,OAAAA;IAAIL,WAAU;KACZ9B,cACG2B,EAAE,4BAAA,IACF7B,MAAMsC,SAAS,IACbT,EAAE,oBAAoB;IAAEU,OAAOvC,MAAMsC;EAAO,CAAA,IAC5CT,EAAE,wBAAA,CAAA,CAAA;AAIhB;AAEA,IAAMW,iBAA+D;EACnE;IAAC;IAAQ,KAAK,KAAK,KAAK;;EACxB;IAAC;IAAS,KAAK,KAAK,KAAK;;EACzB;IAAC;IAAQ,KAAK,KAAK,KAAK;;EACxB;IAAC;IAAO,KAAK,KAAK;;EAClB;IAAC;IAAQ,KAAK;;EACd;IAAC;IAAU;;;AAGb,IAAMC,iBAAiB,CAACC,QAAAA;AACtB,QAAMC,YAAY,IAAIC,KAAKC,mBAAmBC,QAAW;IAAEC,SAAS;EAAO,CAAA;AAC3E,QAAMC,eAAeC,KAAKC,MAAMR,GAAAA,IAAOO,KAAKE,IAAG,KAAM;AACrD,QAAMC,UAAUC,KAAKC,IAAIN,WAAAA;AACzB,aAAW,CAACO,MAAMC,aAAAA,KAAkBhB,gBAAgB;AAClD,QAAIY,WAAWI,eAAe;AAC5B,aAAOb,UAAUc,OAAOJ,KAAKK,MAAMV,cAAcQ,aAAAA,GAAgBD,IAAAA;IACnE;EACF;AACA,SAAOZ,UAAUc,OAAOJ,KAAKK,MAAMV,WAAAA,GAAc,QAAA;AACnD;AAEA,IAAMW,UAAU,CAAC,EAAEtC,KAAI,MACrB,sBAAA,cAACuC,MAAAA,MACC,sBAAA,cAAC3B,KAAAA;EACCC,MAAMb,KAAKwC;EACX1B,QAAO;EACPC,KAAI;EACJJ,WAAU;GAEV,sBAAA,cAAC8B,OAAAA;EAAIC,KAAK1C,KAAK2C,KAAKC;EAAYC,KAAI;EAAGlC,WAAU;IACjD,sBAAA,cAACK,OAAAA;EAAIL,WAAU;GACb,sBAAA,cAACmC,QAAAA;EAAKnC,WAAU;GAAoBX,KAAK+C,KAAK,GAC9C,sBAAA,cAACD,QAAAA;EAAKnC,WAAU;GAAoC,KAChDX,KAAKgD,QAAO,UAAIhD,KAAK2C,KAAKM,OAAM,UAAIjD,KAAKC,YAAYmB,eAAepB,KAAKC,SAAS,IAAI,EAAA,CAAA,CAAA,CAAA;AAOlG,IAAMiD,UAAU,MAAA;AACd,QAAM,EAAEvE,MAAK,IAAKP,oBAAAA;AAClB,SACE,sBAAA,cAACN,WAAWS,MAAI;IAAC4E,aAAY;KAC3B,sBAAA,cAACrF,WAAWsF,UAAQ,MAClB,sBAAA,cAACC,MAAAA;IAAG1C,WAAU;KACXhC,MAAM2E,IAAI,CAACtD,SACV,sBAAA,cAACsC,SAAAA;IAAQiB,KAAKvD,KAAKgD;IAAQhD;;AAMvC;AAEA,IAAMwD,YAAY,MAAA;AAChB,QAAM,EAAEhD,EAAC,IAAKzC,eAAeC,KAAKyC,EAAE;AACpC,QAAM,EAAEjC,KAAI,IAAKJ,oBAAAA;AACjB,SACE,sBAAA,cAACP,YAAAA;IACC4F,MAAK;IACLC,OAAOlD,EAAE,uBAAA;IACTmD,SAAQ;IACRC,YAAW;IACXC,SAAS,MAAA;AACPC,aAAOC,KAAK,sBAAsBvF,IAAAA,IAAQ,UAAU,qBAAA;IACtD;;AAGN;AAEO,IAAMwF,kBAAkB;EAC7BzF;EACAgC;EACA2C;EACAM;AACF;;;ADvLO,IAAMS,cAAc,MACzB,gBAAAC,OAAA,cAACC,gBAAgBC,MAAI,MACnB,gBAAAF,OAAA,cAACG,OAAAA;EAAIC,WAAU;GACb,gBAAAJ,OAAA,cAACC,gBAAgBI,QAAM,IAAA,GACvB,gBAAAL,OAAA,cAACC,gBAAgBK,SAAO,IAAA,GACxB,gBAAAN,OAAA,cAACC,gBAAgBM,WAAS,IAAA,CAAA,CAAA;",
|
|
6
|
+
"names": ["React", "React", "createContext", "useContext", "useEffect", "useState", "IconButton", "ScrollArea", "useTranslation", "meta", "DEFAULT_REPO", "DEFAULT_LIMIT", "ComponentContext", "useComponentContext", "ctx", "Error", "Root", "repo", "limit", "children", "pulls", "setPulls", "unavailable", "setUnavailable", "controller", "AbortController", "url", "URL", "searchParams", "set", "String", "response", "fetch", "toString", "signal", "headers", "Accept", "ok", "items", "json", "filter", "pull", "merged_at", "slice", "aborted", "abort", "Provider", "value", "Header", "t", "id", "header", "className", "a", "href", "target", "rel", "div", "length", "count", "RELATIVE_UNITS", "formatRelative", "iso", "formatter", "Intl", "RelativeTimeFormat", "undefined", "numeric", "diffSeconds", "Date", "parse", "now", "absDiff", "Math", "abs", "unit", "secondsInUnit", "format", "round", "PullRow", "li", "html_url", "img", "src", "user", "avatar_url", "alt", "span", "title", "number", "login", "Content", "orientation", "Viewport", "ul", "map", "key", "StatusBar", "icon", "label", "variant", "classNames", "onClick", "window", "open", "GithubComponent", "GithubPanel", "React", "GithubComponent", "Root", "div", "className", "Header", "Content", "StatusBar"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import "./chunk-J5LGTIGS.mjs";
|
|
2
|
+
|
|
3
|
+
// src/containers/RegistryPanel/RegistryPanel.tsx
|
|
4
|
+
import React, { useCallback, useEffect, useMemo, useState } from "react";
|
|
5
|
+
import { Operation } from "@dxos/compute";
|
|
6
|
+
import { JsonView, PanelContainer, Placeholder, Searchbar } from "@dxos/devtools";
|
|
7
|
+
import { Entity, Format, Obj, Type } from "@dxos/echo";
|
|
8
|
+
import { useClient } from "@dxos/react-client";
|
|
9
|
+
import { Toolbar } from "@dxos/react-ui";
|
|
10
|
+
import { DynamicTable } from "@dxos/react-ui-table";
|
|
11
|
+
import { mx } from "@dxos/ui-theme";
|
|
12
|
+
var textFilter = (text) => {
|
|
13
|
+
if (!text) {
|
|
14
|
+
return () => true;
|
|
15
|
+
}
|
|
16
|
+
const matcher = new RegExp(text, "i");
|
|
17
|
+
return (entity) => {
|
|
18
|
+
const typename = Entity.getTypename(entity) ?? "";
|
|
19
|
+
const metaKey = Obj.isObject(entity) ? Obj.getMeta(entity).key ?? "" : "";
|
|
20
|
+
const uri = Type.isType(entity) ? Type.getURI(entity)?.toString() ?? "" : "";
|
|
21
|
+
const operationKey = Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity) ? Operation.getKey(entity) ?? "" : "";
|
|
22
|
+
const name = Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity) ? entity.name : "";
|
|
23
|
+
return [
|
|
24
|
+
typename,
|
|
25
|
+
metaKey,
|
|
26
|
+
uri,
|
|
27
|
+
operationKey,
|
|
28
|
+
name,
|
|
29
|
+
getEntityId(entity)
|
|
30
|
+
].some((value) => value.match(matcher));
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
var getEntityId = (entity) => {
|
|
34
|
+
if (entity.id) {
|
|
35
|
+
return entity.id;
|
|
36
|
+
}
|
|
37
|
+
if (Type.isType(entity)) {
|
|
38
|
+
return Type.getURI(entity)?.toString() ?? Type.getTypename(entity) ?? "unknown-type";
|
|
39
|
+
}
|
|
40
|
+
return Entity.getTypename(entity) ?? "unknown";
|
|
41
|
+
};
|
|
42
|
+
var getKind = (entity) => {
|
|
43
|
+
if (Type.isType(entity)) {
|
|
44
|
+
return "type";
|
|
45
|
+
}
|
|
46
|
+
if (Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity)) {
|
|
47
|
+
return "operation";
|
|
48
|
+
}
|
|
49
|
+
return "other";
|
|
50
|
+
};
|
|
51
|
+
var getLabel = (entity) => {
|
|
52
|
+
if (Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity)) {
|
|
53
|
+
return entity.name || Operation.getKey(entity) || getEntityId(entity);
|
|
54
|
+
}
|
|
55
|
+
if (Type.isType(entity)) {
|
|
56
|
+
return Type.getTypename(entity) ?? getEntityId(entity);
|
|
57
|
+
}
|
|
58
|
+
return getEntityId(entity);
|
|
59
|
+
};
|
|
60
|
+
var toDetailJson = (entity) => {
|
|
61
|
+
if (Type.isType(entity)) {
|
|
62
|
+
return {
|
|
63
|
+
id: getEntityId(entity),
|
|
64
|
+
typename: Type.getTypename(entity),
|
|
65
|
+
uri: Type.getURI(entity)?.toString(),
|
|
66
|
+
version: Type.getVersion(entity),
|
|
67
|
+
jsonSchema: entity.jsonSchema
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
if (Obj.isObject(entity)) {
|
|
71
|
+
return Obj.toJSON(entity);
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
id: getEntityId(entity),
|
|
75
|
+
typename: Entity.getTypename(entity)
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
var RegistryPanel = () => {
|
|
79
|
+
const client = useClient();
|
|
80
|
+
const [entities, setEntities] = useState([]);
|
|
81
|
+
const [filter, setFilter] = useState("");
|
|
82
|
+
const [selected, setSelected] = useState();
|
|
83
|
+
useEffect(() => {
|
|
84
|
+
const registry = client.graph.registry;
|
|
85
|
+
const refresh = () => setEntities([
|
|
86
|
+
...registry.list()
|
|
87
|
+
]);
|
|
88
|
+
refresh();
|
|
89
|
+
return registry.changed.on(refresh);
|
|
90
|
+
}, [
|
|
91
|
+
client
|
|
92
|
+
]);
|
|
93
|
+
const properties = useMemo(() => [
|
|
94
|
+
{
|
|
95
|
+
name: "kind",
|
|
96
|
+
format: Format.TypeFormat.String,
|
|
97
|
+
size: 100
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: "label",
|
|
101
|
+
format: Format.TypeFormat.String
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: "id",
|
|
105
|
+
format: Format.TypeFormat.String,
|
|
106
|
+
size: 280
|
|
107
|
+
}
|
|
108
|
+
], []);
|
|
109
|
+
const rows = useMemo(() => {
|
|
110
|
+
return entities.filter(textFilter(filter)).map((entity) => ({
|
|
111
|
+
id: getEntityId(entity),
|
|
112
|
+
kind: getKind(entity),
|
|
113
|
+
label: getLabel(entity),
|
|
114
|
+
_entity: entity
|
|
115
|
+
})).toSorted((left, right) => left.label.localeCompare(right.label));
|
|
116
|
+
}, [
|
|
117
|
+
entities,
|
|
118
|
+
filter
|
|
119
|
+
]);
|
|
120
|
+
const handleRowClicked = useCallback((row) => {
|
|
121
|
+
if (!row?._entity) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
setSelected(row._entity);
|
|
125
|
+
}, []);
|
|
126
|
+
const detailJson = useMemo(() => selected ? toDetailJson(selected) : void 0, [
|
|
127
|
+
selected
|
|
128
|
+
]);
|
|
129
|
+
const features = useMemo(() => ({
|
|
130
|
+
selection: {
|
|
131
|
+
enabled: true,
|
|
132
|
+
mode: "single"
|
|
133
|
+
}
|
|
134
|
+
}), []);
|
|
135
|
+
return /* @__PURE__ */ React.createElement(PanelContainer, {
|
|
136
|
+
toolbar: /* @__PURE__ */ React.createElement(Toolbar.Root, null, /* @__PURE__ */ React.createElement(Searchbar, {
|
|
137
|
+
placeholder: "Filter...",
|
|
138
|
+
onChange: setFilter
|
|
139
|
+
}))
|
|
140
|
+
}, /* @__PURE__ */ React.createElement("div", {
|
|
141
|
+
className: mx("h-full grid grid-cols-[2fr_1fr] overflow-hidden")
|
|
142
|
+
}, /* @__PURE__ */ React.createElement("div", {
|
|
143
|
+
className: mx("flex flex-col min-h-0 overflow-hidden")
|
|
144
|
+
}, /* @__PURE__ */ React.createElement(DynamicTable, {
|
|
145
|
+
properties,
|
|
146
|
+
rows,
|
|
147
|
+
features,
|
|
148
|
+
onRowClick: handleRowClicked
|
|
149
|
+
})), /* @__PURE__ */ React.createElement("div", {
|
|
150
|
+
className: mx("min-h-0 h-full overflow-auto border-s border-separator text-sm")
|
|
151
|
+
}, detailJson ? /* @__PURE__ */ React.createElement(JsonView, {
|
|
152
|
+
data: detailJson
|
|
153
|
+
}) : /* @__PURE__ */ React.createElement(Placeholder, {
|
|
154
|
+
label: "Details"
|
|
155
|
+
}))));
|
|
156
|
+
};
|
|
157
|
+
export {
|
|
158
|
+
RegistryPanel,
|
|
159
|
+
RegistryPanel as default
|
|
160
|
+
};
|
|
161
|
+
//# sourceMappingURL=RegistryPanel-64GIYJHN.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/containers/RegistryPanel/RegistryPanel.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { Operation } from '@dxos/compute';\nimport { JsonView, PanelContainer, Placeholder, Searchbar } from '@dxos/devtools';\nimport { Entity, Format, Obj, Type } from '@dxos/echo';\nimport { useClient } from '@dxos/react-client';\nimport { Toolbar } from '@dxos/react-ui';\nimport { DynamicTable, type TableFeatures } from '@dxos/react-ui-table';\nimport { mx } from '@dxos/ui-theme';\n\ntype RegistryRow = {\n id: string;\n kind: string;\n label: string;\n _entity: Entity.Unknown;\n};\n\nconst textFilter = (text?: string) => {\n if (!text) {\n return () => true;\n }\n\n const matcher = new RegExp(text, 'i');\n return (entity: Entity.Unknown) => {\n const typename = Entity.getTypename(entity) ?? '';\n const metaKey = Obj.isObject(entity) ? (Obj.getMeta(entity).key ?? '') : '';\n const uri = Type.isType(entity) ? (Type.getURI(entity)?.toString() ?? '') : '';\n const operationKey =\n Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity)\n ? (Operation.getKey(entity) ?? '')\n : '';\n const name = Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity) ? entity.name : '';\n return [typename, metaKey, uri, operationKey, name, getEntityId(entity)].some((value) => value.match(matcher));\n };\n};\n\nconst getEntityId = (entity: Entity.Unknown): string => {\n if (entity.id) {\n return entity.id;\n }\n if (Type.isType(entity)) {\n return Type.getURI(entity)?.toString() ?? Type.getTypename(entity) ?? 'unknown-type';\n }\n return Entity.getTypename(entity) ?? 'unknown';\n};\n\nconst getKind = (entity: Entity.Unknown): string => {\n if (Type.isType(entity)) {\n return 'type';\n }\n if (Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity)) {\n return 'operation';\n }\n return 'other';\n};\n\nconst getLabel = (entity: Entity.Unknown): string => {\n if (Obj.isObject(entity) && Obj.instanceOf(Operation.PersistentOperation, entity)) {\n return entity.name || Operation.getKey(entity) || getEntityId(entity);\n }\n if (Type.isType(entity)) {\n return Type.getTypename(entity) ?? getEntityId(entity);\n }\n return getEntityId(entity);\n};\n\nconst toDetailJson = (entity: Entity.Unknown): object => {\n if (Type.isType(entity)) {\n return {\n id: getEntityId(entity),\n typename: Type.getTypename(entity),\n uri: Type.getURI(entity)?.toString(),\n version: Type.getVersion(entity),\n jsonSchema: entity.jsonSchema,\n };\n }\n if (Obj.isObject(entity)) {\n return Obj.toJSON(entity);\n }\n return { id: getEntityId(entity), typename: Entity.getTypename(entity) };\n};\n\nexport const RegistryPanel = () => {\n const client = useClient();\n const [entities, setEntities] = useState<Entity.Unknown[]>([]);\n const [filter, setFilter] = useState('');\n const [selected, setSelected] = useState<Entity.Unknown>();\n\n useEffect(() => {\n const registry = client.graph.registry;\n const refresh = () => setEntities([...registry.list()]);\n refresh();\n return registry.changed.on(refresh);\n }, [client]);\n\n const properties = useMemo(\n () => [\n { name: 'kind', format: Format.TypeFormat.String, size: 100 },\n { name: 'label', format: Format.TypeFormat.String },\n { name: 'id', format: Format.TypeFormat.String, size: 280 },\n ],\n [],\n );\n\n const rows = useMemo((): RegistryRow[] => {\n return entities\n .filter(textFilter(filter))\n .map((entity) => ({\n id: getEntityId(entity),\n kind: getKind(entity),\n label: getLabel(entity),\n _entity: entity,\n }))\n .toSorted((left, right) => left.label.localeCompare(right.label));\n }, [entities, filter]);\n\n const handleRowClicked = useCallback((row: RegistryRow | undefined) => {\n if (!row?._entity) {\n return;\n }\n setSelected(row._entity);\n }, []);\n\n const detailJson = useMemo(() => (selected ? toDetailJson(selected) : undefined), [selected]);\n\n const features: Partial<TableFeatures> = useMemo(() => ({ selection: { enabled: true, mode: 'single' } }), []);\n\n return (\n <PanelContainer\n toolbar={\n <Toolbar.Root>\n <Searchbar placeholder='Filter...' onChange={setFilter} />\n </Toolbar.Root>\n }\n >\n <div className={mx('h-full grid grid-cols-[2fr_1fr] overflow-hidden')}>\n <div className={mx('flex flex-col min-h-0 overflow-hidden')}>\n <DynamicTable properties={properties} rows={rows} features={features} onRowClick={handleRowClicked} />\n </div>\n <div className={mx('min-h-0 h-full overflow-auto border-s border-separator text-sm')}>\n {detailJson ? <JsonView data={detailJson} /> : <Placeholder label='Details' />}\n </div>\n </div>\n </PanelContainer>\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React", "useCallback", "useEffect", "useMemo", "useState", "Operation", "JsonView", "PanelContainer", "Placeholder", "Searchbar", "Entity", "Format", "Obj", "Type", "useClient", "Toolbar", "DynamicTable", "mx", "textFilter", "text", "matcher", "RegExp", "entity", "typename", "getTypename", "metaKey", "isObject", "getMeta", "key", "uri", "isType", "getURI", "toString", "operationKey", "instanceOf", "PersistentOperation", "getKey", "name", "getEntityId", "some", "value", "match", "id", "getKind", "getLabel", "toDetailJson", "version", "getVersion", "jsonSchema", "toJSON", "RegistryPanel", "client", "entities", "setEntities", "filter", "setFilter", "selected", "setSelected", "registry", "graph", "refresh", "list", "changed", "on", "properties", "format", "TypeFormat", "String", "size", "rows", "map", "kind", "label", "_entity", "toSorted", "left", "right", "localeCompare", "handleRowClicked", "row", "detailJson", "undefined", "features", "selection", "enabled", "mode", "toolbar", "Root", "placeholder", "onChange", "div", "className", "onRowClick", "data"]
|
|
7
|
+
}
|
|
@@ -4,14 +4,14 @@ import "./chunk-J5LGTIGS.mjs";
|
|
|
4
4
|
import React, { useCallback, useMemo, useState } from "react";
|
|
5
5
|
import { useOperationInvoker } from "@dxos/app-framework/ui";
|
|
6
6
|
import { ComputeGraph } from "@dxos/conductor";
|
|
7
|
-
import { Filter, Obj } from "@dxos/echo";
|
|
7
|
+
import { Filter, Obj, Type } from "@dxos/echo";
|
|
8
8
|
import { Markdown } from "@dxos/plugin-markdown";
|
|
9
9
|
import { Sheet } from "@dxos/plugin-sheet";
|
|
10
10
|
import { Sketch } from "@dxos/plugin-sketch";
|
|
11
11
|
import { useClient } from "@dxos/react-client";
|
|
12
12
|
import { IconButton, Input, Panel, ScrollArea, Toolbar, useAsyncEffect } from "@dxos/react-ui";
|
|
13
|
+
import { composable, composableProps } from "@dxos/react-ui";
|
|
13
14
|
import { Organization, Person, Task } from "@dxos/types";
|
|
14
|
-
import { composable, composableProps } from "@dxos/ui-theme";
|
|
15
15
|
import { sortKeys } from "@dxos/util";
|
|
16
16
|
import { SchemaTable, createGenerator, generator, staticGenerators } from "#components";
|
|
17
17
|
var staticTypes = [
|
|
@@ -43,7 +43,7 @@ var SpaceGenerator = composable(({ space, onCreateObjects, children, ...props },
|
|
|
43
43
|
]);
|
|
44
44
|
const typeMap = useMemo(() => {
|
|
45
45
|
const recordGenerators = new Map(recordTypes.map((type) => [
|
|
46
|
-
type
|
|
46
|
+
Type.getTypename(type),
|
|
47
47
|
createGenerator(client, invokePromise, type)
|
|
48
48
|
]));
|
|
49
49
|
return new Map([
|
|
@@ -57,8 +57,11 @@ var SpaceGenerator = composable(({ space, onCreateObjects, children, ...props },
|
|
|
57
57
|
presets
|
|
58
58
|
]);
|
|
59
59
|
const updateInfo = useCallback(async () => {
|
|
60
|
-
const
|
|
61
|
-
|
|
60
|
+
const allSchema = [
|
|
61
|
+
...space.db.graph.registry.list().filter(Type.isType)
|
|
62
|
+
];
|
|
63
|
+
const echoSchema = allSchema.filter((t) => Type.isTypeKind(t));
|
|
64
|
+
const staticSchema = allSchema.filter((t) => !Type.isTypeKind(t));
|
|
62
65
|
const objects = await space.db.query(Filter.everything()).run();
|
|
63
66
|
const objectMap = sortKeys(objects.reduce((map, obj) => {
|
|
64
67
|
const type = Obj.getTypename(obj);
|
|
@@ -140,4 +143,4 @@ var SpaceGenerator = composable(({ space, onCreateObjects, children, ...props },
|
|
|
140
143
|
export {
|
|
141
144
|
SpaceGenerator as default
|
|
142
145
|
};
|
|
143
|
-
//# sourceMappingURL=SpaceGenerator-
|
|
146
|
+
//# sourceMappingURL=SpaceGenerator-Y35G6DRV.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/containers/SpaceGenerator/SpaceGenerator.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback, useMemo, useState } from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { ComputeGraph } from '@dxos/conductor';\nimport { Filter, Obj, Type } from '@dxos/echo';\nimport { Markdown } from '@dxos/plugin-markdown';\nimport { Sheet } from '@dxos/plugin-sheet';\nimport { Sketch } from '@dxos/plugin-sketch';\nimport { useClient } from '@dxos/react-client';\nimport { type Space } from '@dxos/react-client/echo';\nimport { IconButton, Input, Panel, ScrollArea, Toolbar, useAsyncEffect } from '@dxos/react-ui';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport { Organization, Person, Task } from '@dxos/types';\nimport { sortKeys } from '@dxos/util';\n\nimport { type ObjectGenerator, SchemaTable, createGenerator, generator, staticGenerators } from '#components';\n\n// TODO(burdon): Make extensible.\nconst staticTypes = [Markdown.Document, Sketch.Sketch, Sheet.Sheet, ComputeGraph];\nconst recordTypes: Type.AnyObj[] = [Organization.Organization, Person.Person, Task.Task];\n\nexport type SpaceGeneratorProps = {\n space: Space;\n onCreateObjects?: (objects: Obj.Unknown[]) => void;\n};\n\nexport const SpaceGenerator = composable<HTMLDivElement, SpaceGeneratorProps>(\n ({ space, onCreateObjects, children, ...props }, forwardedRef) => {\n const { invokePromise } = useOperationInvoker();\n const client = useClient();\n const [count, setCount] = useState(1);\n const [info, setInfo] = useState<any>({});\n const presets = useMemo(() => generator(), []);\n\n // Register types.\n useAsyncEffect(async () => {\n await client.addTypes([...staticTypes, ...recordTypes, ...presets.schemas]);\n }, [client, presets]);\n\n // Create type generators.\n const typeMap = useMemo(() => {\n const recordGenerators = new Map<string, ObjectGenerator<any>>(\n recordTypes.map((type) => [Type.getTypename(type), createGenerator(client, invokePromise, type)]),\n );\n\n return new Map([...staticGenerators, ...presets.items, ...recordGenerators]);\n }, [client, invokePromise, presets]);\n\n // Query space to get info.\n const updateInfo = useCallback(async () => {\n const allSchema = [...space.db.graph.registry.list().filter(Type.isType)];\n const echoSchema = allSchema.filter((t) => Type.isTypeKind(t));\n const staticSchema = allSchema.filter((t) => !Type.isTypeKind(t));\n\n const objects = await space.db.query(Filter.everything()).run();\n const objectMap = sortKeys(\n objects.reduce<Record<string, number>>((map, obj) => {\n const type = Obj.getTypename(obj);\n if (type) {\n const count = map[type] ?? 0;\n map[type] = count + 1;\n }\n\n return map;\n }, {}),\n );\n\n setInfo({\n schema: {\n static: staticSchema.length,\n mutable: echoSchema.length,\n },\n objects: objectMap,\n });\n }, [space]);\n\n useAsyncEffect(updateInfo, [updateInfo]);\n\n const handleCreateData = useCallback(\n async (typename: string) => {\n const constructor = typeMap.get(typename);\n if (constructor) {\n // TODO(burdon): Input to specify number of objects.\n await constructor(space, count, onCreateObjects);\n await updateInfo();\n }\n },\n [typeMap, count, space, onCreateObjects, updateInfo],\n );\n\n return (\n <Panel.Root {...composableProps(props)} ref={forwardedRef}>\n <Panel.Toolbar asChild>\n <Toolbar.Root>\n <IconButton icon='ph--arrow-clockwise--regular' iconOnly label='Refresh' onClick={updateInfo} />\n <Toolbar.Separator />\n <Input.Root>\n <Input.TextInput\n type='number'\n placeholder='Count'\n classNames='w-[4rem] text-right'\n min={1}\n max={100}\n size={8}\n value={count}\n onChange={(event) => setCount(parseInt(event.target.value))}\n />\n </Input.Root>\n </Toolbar.Root>\n </Panel.Toolbar>\n <Panel.Content asChild>\n <ScrollArea.Root thin orientation='vertical'>\n <ScrollArea.Viewport classNames='dx-document gap-4 divide-y divide-subdued-separator'>\n <SchemaTable types={staticTypes} objects={info.objects} label='Static Types' onClick={handleCreateData} />\n <SchemaTable types={recordTypes} objects={info.objects} label='Record Types' onClick={handleCreateData} />\n <SchemaTable types={presets.types} objects={info.objects} label='Presets' onClick={handleCreateData} />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </Panel.Content>\n </Panel.Root>\n );\n },\n);\n"],
|
|
5
|
+
"mappings": ";;;AAIA,OAAOA,SAASC,aAAaC,SAASC,gBAAgB;AAEtD,SAASC,2BAA2B;AACpC,SAASC,oBAAoB;AAC7B,SAASC,QAAQC,KAAKC,YAAY;AAClC,SAASC,gBAAgB;AACzB,SAASC,aAAa;AACtB,SAASC,cAAc;AACvB,SAASC,iBAAiB;AAE1B,SAASC,YAAYC,OAAOC,OAAOC,YAAYC,SAASC,sBAAsB;AAC9E,SAASC,YAAYC,uBAAuB;AAC5C,SAASC,cAAcC,QAAQC,YAAY;AAC3C,SAASC,gBAAgB;AAEzB,SAA+BC,aAAaC,iBAAiBC,WAAWC,wBAAwB;AAGhG,IAAMC,cAAc;EAACpB,SAASqB;EAAUnB,OAAOA;EAAQD,MAAMA;EAAOL;;AACpE,IAAM0B,cAA6B;EAACV,aAAaA;EAAcC,OAAOA;EAAQC,KAAKA;;AAO5E,IAAMS,iBAAiBb,WAC5B,CAAC,EAAEc,OAAOC,iBAAiBC,UAAU,GAAGC,MAAAA,GAASC,iBAAAA;AAC/C,QAAM,EAAEC,cAAa,IAAKlC,oBAAAA;AAC1B,QAAMmC,SAAS3B,UAAAA;AACf,QAAM,CAAC4B,OAAOC,QAAAA,IAAYtC,SAAS,CAAA;AACnC,QAAM,CAACuC,MAAMC,OAAAA,IAAWxC,SAAc,CAAC,CAAA;AACvC,QAAMyC,UAAU1C,QAAQ,MAAMyB,UAAAA,GAAa,CAAA,CAAE;AAG7CT,iBAAe,YAAA;AACb,UAAMqB,OAAOM,SAAS;SAAIhB;SAAgBE;SAAgBa,QAAQE;KAAQ;EAC5E,GAAG;IAACP;IAAQK;GAAQ;AAGpB,QAAMG,UAAU7C,QAAQ,MAAA;AACtB,UAAM8C,mBAAmB,IAAIC,IAC3BlB,YAAYmB,IAAI,CAACC,SAAS;MAAC3C,KAAK4C,YAAYD,IAAAA;MAAOzB,gBAAgBa,QAAQD,eAAea,IAAAA;KAAM,CAAA;AAGlG,WAAO,IAAIF,IAAI;SAAIrB;SAAqBgB,QAAQS;SAAUL;KAAiB;EAC7E,GAAG;IAACT;IAAQD;IAAeM;GAAQ;AAGnC,QAAMU,aAAarD,YAAY,YAAA;AAC7B,UAAMsD,YAAY;SAAItB,MAAMuB,GAAGC,MAAMC,SAASC,KAAI,EAAGC,OAAOpD,KAAKqD,MAAM;;AACvE,UAAMC,aAAaP,UAAUK,OAAO,CAACG,MAAMvD,KAAKwD,WAAWD,CAAAA,CAAAA;AAC3D,UAAME,eAAeV,UAAUK,OAAO,CAACG,MAAM,CAACvD,KAAKwD,WAAWD,CAAAA,CAAAA;AAE9D,UAAMG,UAAU,MAAMjC,MAAMuB,GAAGW,MAAM7D,OAAO8D,WAAU,CAAA,EAAIC,IAAG;AAC7D,UAAMC,YAAY9C,SAChB0C,QAAQK,OAA+B,CAACrB,KAAKsB,QAAAA;AAC3C,YAAMrB,OAAO5C,IAAI6C,YAAYoB,GAAAA;AAC7B,UAAIrB,MAAM;AACR,cAAMX,SAAQU,IAAIC,IAAAA,KAAS;AAC3BD,YAAIC,IAAAA,IAAQX,SAAQ;MACtB;AAEA,aAAOU;IACT,GAAG,CAAC,CAAA,CAAA;AAGNP,YAAQ;MACN8B,QAAQ;QACNC,QAAQT,aAAaU;QACrBC,SAASd,WAAWa;MACtB;MACAT,SAASI;IACX,CAAA;EACF,GAAG;IAACrC;GAAM;AAEVf,iBAAeoC,YAAY;IAACA;GAAW;AAEvC,QAAMuB,mBAAmB5E,YACvB,OAAO6E,aAAAA;AACL,UAAMC,cAAchC,QAAQiC,IAAIF,QAAAA;AAChC,QAAIC,aAAa;AAEf,YAAMA,YAAY9C,OAAOO,OAAON,eAAAA;AAChC,YAAMoB,WAAAA;IACR;EACF,GACA;IAACP;IAASP;IAAOP;IAAOC;IAAiBoB;GAAW;AAGtD,SACE,sBAAA,cAACvC,MAAMkE,MAAI;IAAE,GAAG7D,gBAAgBgB,KAAAA;IAAQ8C,KAAK7C;KAC3C,sBAAA,cAACtB,MAAME,SAAO;IAACkE,SAAAA;KACb,sBAAA,cAAClE,QAAQgE,MAAI,MACX,sBAAA,cAACpE,YAAAA;IAAWuE,MAAK;IAA+BC,UAAAA;IAASC,OAAM;IAAUC,SAASjC;MAClF,sBAAA,cAACrC,QAAQuE,WAAS,IAAA,GAClB,sBAAA,cAAC1E,MAAMmE,MAAI,MACT,sBAAA,cAACnE,MAAM2E,WAAS;IACdtC,MAAK;IACLuC,aAAY;IACZC,YAAW;IACXC,KAAK;IACLC,KAAK;IACLC,MAAM;IACNC,OAAOvD;IACPwD,UAAU,CAACC,UAAUxD,SAASyD,SAASD,MAAME,OAAOJ,KAAK,CAAA;SAKjE,sBAAA,cAAChF,MAAMqF,SAAO;IAACjB,SAAAA;KACb,sBAAA,cAACnE,WAAWiE,MAAI;IAACoB,MAAAA;IAAKC,aAAY;KAChC,sBAAA,cAACtF,WAAWuF,UAAQ;IAACZ,YAAW;KAC9B,sBAAA,cAAClE,aAAAA;IAAY+E,OAAO3E;IAAaqC,SAASxB,KAAKwB;IAASoB,OAAM;IAAeC,SAASV;MACtF,sBAAA,cAACpD,aAAAA;IAAY+E,OAAOzE;IAAamC,SAASxB,KAAKwB;IAASoB,OAAM;IAAeC,SAASV;MACtF,sBAAA,cAACpD,aAAAA;IAAY+E,OAAO5D,QAAQ4D;IAAOtC,SAASxB,KAAKwB;IAASoB,OAAM;IAAUC,SAASV;;AAM/F,CAAA;",
|
|
6
|
+
"names": ["React", "useCallback", "useMemo", "useState", "useOperationInvoker", "ComputeGraph", "Filter", "Obj", "Type", "Markdown", "Sheet", "Sketch", "useClient", "IconButton", "Input", "Panel", "ScrollArea", "Toolbar", "useAsyncEffect", "composable", "composableProps", "Organization", "Person", "Task", "sortKeys", "SchemaTable", "createGenerator", "generator", "staticGenerators", "staticTypes", "Document", "recordTypes", "SpaceGenerator", "space", "onCreateObjects", "children", "props", "forwardedRef", "invokePromise", "client", "count", "setCount", "info", "setInfo", "presets", "addTypes", "schemas", "typeMap", "recordGenerators", "Map", "map", "type", "getTypename", "items", "updateInfo", "allSchema", "db", "graph", "registry", "list", "filter", "isType", "echoSchema", "t", "isTypeKind", "staticSchema", "objects", "query", "everything", "run", "objectMap", "reduce", "obj", "schema", "static", "length", "mutable", "handleCreateData", "typename", "constructor", "get", "Root", "ref", "asChild", "icon", "iconOnly", "label", "onClick", "Separator", "TextInput", "placeholder", "classNames", "min", "max", "size", "value", "onChange", "event", "parseInt", "target", "Content", "thin", "orientation", "Viewport", "types"]
|
|
7
|
+
}
|