@pstdio/workbench 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -317
- package/dist/extensions.d.ts +1283 -774
- package/dist/extensions.js +1454 -1924
- package/dist/extensions.js.map +1 -1
- package/dist/file-renderer-view-kfJRY3yR.js +515 -0
- package/dist/file-renderer-view-kfJRY3yR.js.map +1 -0
- package/dist/index.d.ts +589 -644
- package/dist/index.js +5011 -2644
- package/dist/index.js.map +1 -1
- package/dist/react.d.ts +540 -585
- package/dist/react.js +3583 -3424
- package/dist/react.js.map +1 -1
- package/dist/storage.d.ts +118 -157
- package/dist/storage.js +135 -149
- package/dist/storage.js.map +1 -1
- package/dist/webview-runtime.d.ts +2 -5
- package/dist/webview-runtime.js +3 -3
- package/dist/webview-runtime.js.map +1 -1
- package/dist/workbench-menu-paths-B_QJzcNU.js +12 -0
- package/dist/workbench-menu-paths-B_QJzcNU.js.map +1 -0
- package/dist/workbench-renderers-DmsrBGC7.js +960 -0
- package/dist/workbench-renderers-DmsrBGC7.js.map +1 -0
- package/dist/workspaces-DJwFj8uq.js +1872 -0
- package/dist/workspaces-DJwFj8uq.js.map +1 -0
- package/package.json +6 -41
- package/dist/composition-resolver-types-CWykPyEK.js +0 -241
- package/dist/composition-resolver-types-CWykPyEK.js.map +0 -1
- package/dist/file-renderer-view-B6_iR4EN.js +0 -496
- package/dist/file-renderer-view-B6_iR4EN.js.map +0 -1
- package/dist/file-section-navigation-CfYqVObc.js +0 -30
- package/dist/file-section-navigation-CfYqVObc.js.map +0 -1
- package/dist/layout-types-DMoZz38-.js +0 -100
- package/dist/layout-types-DMoZz38-.js.map +0 -1
- package/dist/surface-map-C1pOTUmF.js +0 -52
- package/dist/surface-map-C1pOTUmF.js.map +0 -1
- package/dist/testing.d.ts +0 -2443
- package/dist/testing.js +0 -58
- package/dist/testing.js.map +0 -1
- package/dist/workbench-built-ins-BCJ6-fIM.js +0 -1173
- package/dist/workbench-built-ins-BCJ6-fIM.js.map +0 -1
- package/dist/workbench-menu-paths-D-e7iscN.js +0 -43
- package/dist/workbench-menu-paths-D-e7iscN.js.map +0 -1
- package/dist/workflow-status-settings-DLiu9FZ0.js +0 -144
- package/dist/workflow-status-settings-DLiu9FZ0.js.map +0 -1
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
const c = "pstdio.fileSectionNavigation", i = (t) => {
|
|
2
|
-
if (!t || typeof t != "object") return !1;
|
|
3
|
-
const e = t, r = e.occurrence === void 0 || typeof e.occurrence == "number" && Number.isInteger(e.occurrence) && e.occurrence >= 0;
|
|
4
|
-
return typeof e.id == "string" && typeof e.heading == "string" && r;
|
|
5
|
-
}, s = (t) => {
|
|
6
|
-
const e = t?.metadata?.[c];
|
|
7
|
-
if (!e || typeof e != "object") return;
|
|
8
|
-
const r = e;
|
|
9
|
-
if (!(typeof r.treeId != "string" || typeof r.targetNodeId != "string") && !(!Array.isArray(r.anchors) || !r.anchors.every(i)))
|
|
10
|
-
return {
|
|
11
|
-
treeId: r.treeId,
|
|
12
|
-
targetNodeId: r.targetNodeId,
|
|
13
|
-
anchors: r.anchors
|
|
14
|
-
};
|
|
15
|
-
}, a = (t, e) => e && t.anchors.some((r) => r.id === e) ? e : t.targetNodeId, d = (t) => {
|
|
16
|
-
const {
|
|
17
|
-
previous: e,
|
|
18
|
-
current: r,
|
|
19
|
-
currentResourceUri: n,
|
|
20
|
-
selectedNodeId: o
|
|
21
|
-
} = t;
|
|
22
|
-
return !e || !o || !e.anchorIds.includes(o) || r?.targetNodeId === o ? !1 : !r || e.treeId !== r.treeId || e.resourceUri !== n;
|
|
23
|
-
};
|
|
24
|
-
export {
|
|
25
|
-
c as F,
|
|
26
|
-
s as g,
|
|
27
|
-
a as r,
|
|
28
|
-
d as s
|
|
29
|
-
};
|
|
30
|
-
//# sourceMappingURL=file-section-navigation-CfYqVObc.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file-section-navigation-CfYqVObc.js","sources":["../src/core/registries/renderers/file-section-navigation.ts"],"sourcesContent":["import type { ResourceRef } from \"../resources/resource-registry\";\n\nexport const FILE_SECTION_NAVIGATION_METADATA_KEY = \"pstdio.fileSectionNavigation\";\n\nexport interface FileSectionAnchor {\n id: string;\n heading: string;\n occurrence?: number;\n}\n\nexport interface FileSectionNavigation {\n treeId: string;\n targetNodeId: string;\n anchors: FileSectionAnchor[];\n}\n\nconst isAnchor = (value: unknown): value is FileSectionAnchor => {\n if (!value || typeof value !== \"object\") return false;\n const anchor = value as Record<string, unknown>;\n const occurrenceIsValid =\n anchor.occurrence === undefined ||\n (typeof anchor.occurrence === \"number\" && Number.isInteger(anchor.occurrence) && anchor.occurrence >= 0);\n return typeof anchor.id === \"string\" && typeof anchor.heading === \"string\" && occurrenceIsValid;\n};\n\nexport const getFileSectionNavigation = (resource: ResourceRef | undefined): FileSectionNavigation | undefined => {\n const value = resource?.metadata?.[FILE_SECTION_NAVIGATION_METADATA_KEY];\n if (!value || typeof value !== \"object\") return undefined;\n const navigation = value as Record<string, unknown>;\n if (typeof navigation.treeId !== \"string\" || typeof navigation.targetNodeId !== \"string\") return undefined;\n if (!Array.isArray(navigation.anchors) || !navigation.anchors.every(isAnchor)) return undefined;\n\n return {\n treeId: navigation.treeId,\n targetNodeId: navigation.targetNodeId,\n anchors: navigation.anchors,\n };\n};\n\nexport const resolveFileSectionTargetId = (navigation: FileSectionNavigation, selectedNodeId: string | undefined) => {\n if (selectedNodeId && navigation.anchors.some((anchor) => anchor.id === selectedNodeId)) return selectedNodeId;\n return navigation.targetNodeId;\n};\n\nexport interface PreviousFileSectionNavigation {\n resourceUri?: string;\n treeId: string;\n anchorIds: string[];\n}\n\nexport const shouldClearFileSectionSelection = (input: {\n previous: PreviousFileSectionNavigation | null;\n current: FileSectionNavigation | undefined;\n currentResourceUri?: string;\n selectedNodeId?: string;\n}) => {\n const { previous, current, currentResourceUri, selectedNodeId } = input;\n if (!previous || !selectedNodeId || !previous.anchorIds.includes(selectedNodeId)) return false;\n if (current?.targetNodeId === selectedNodeId) return false;\n\n return !current || previous.treeId !== current.treeId || previous.resourceUri !== currentResourceUri;\n};\n"],"names":["FILE_SECTION_NAVIGATION_METADATA_KEY","isAnchor","value","anchor","occurrenceIsValid","occurrence","undefined","Number","isInteger","id","heading","getFileSectionNavigation","resource","metadata","navigation","treeId","targetNodeId","Array","isArray","anchors","every","resolveFileSectionTargetId","selectedNodeId","some","shouldClearFileSectionSelection","input","previous","current","currentResourceUri","anchorIds","includes","resourceUri"],"mappings":"AAEO,MAAMA,IAAuC,gCAc9CC,IAAWA,CAACC,MAA+C;AAC/D,MAAI,CAACA,KAAS,OAAOA,KAAU,SAAU,QAAO;AAChD,QAAMC,IAASD,GACTE,IACJD,EAAOE,eAAeC,UACrB,OAAOH,EAAOE,cAAe,YAAYE,OAAOC,UAAUL,EAAOE,UAAU,KAAKF,EAAOE,cAAc;AACxG,SAAO,OAAOF,EAAOM,MAAO,YAAY,OAAON,EAAOO,WAAY,YAAYN;AAChF,GAEaO,IAA2BA,CAACC,MAAyE;AAChH,QAAMV,IAAQU,GAAUC,WAAWb,CAAoC;AACvE,MAAI,CAACE,KAAS,OAAOA,KAAU,SAAU;AACzC,QAAMY,IAAaZ;AACnB,MAAI,SAAOY,EAAWC,UAAW,YAAY,OAAOD,EAAWE,gBAAiB,aAC5E,GAACC,MAAMC,QAAQJ,EAAWK,OAAO,KAAK,CAACL,EAAWK,QAAQC,MAAMnB,CAAQ;AAE5E,WAAO;AAAA,MACLc,QAAQD,EAAWC;AAAAA,MACnBC,cAAcF,EAAWE;AAAAA,MACzBG,SAASL,EAAWK;AAAAA,IAAAA;AAExB,GAEaE,IAA6BA,CAACP,GAAmCQ,MACxEA,KAAkBR,EAAWK,QAAQI,KAAMpB,OAAWA,EAAOM,OAAOa,CAAc,IAAUA,IACzFR,EAAWE,cASPQ,IAAkCA,CAACC,MAK1C;AACJ,QAAM;AAAA,IAAEC,UAAAA;AAAAA,IAAUC,SAAAA;AAAAA,IAASC,oBAAAA;AAAAA,IAAoBN,gBAAAA;AAAAA,EAAAA,IAAmBG;AAElE,SADI,CAACC,KAAY,CAACJ,KAAkB,CAACI,EAASG,UAAUC,SAASR,CAAc,KAC3EK,GAASX,iBAAiBM,IAAuB,KAE9C,CAACK,KAAWD,EAASX,WAAWY,EAAQZ,UAAUW,EAASK,gBAAgBH;AACpF;"}
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
const h = (n, e, i = e) => {
|
|
2
|
-
if (!n.has(i)) return i;
|
|
3
|
-
let t = 1;
|
|
4
|
-
for (; n.has(`${e}:${t}`); ) t += 1;
|
|
5
|
-
return `${e}:${t}`;
|
|
6
|
-
}, I = ["nav", "activity", "sidenav-header", "sidenav", "main-header", "main-left-menu", "main", "main-right-menu", "secondary-header", "secondary-left-menu", "secondary", "secondary-right-menu", "side-header", "side-left-menu", "side", "side-right-menu", "status", "overlay"], W = ["main", "secondary", "side"], R = {
|
|
7
|
-
main: {
|
|
8
|
-
left: "main-left-menu",
|
|
9
|
-
right: "main-right-menu"
|
|
10
|
-
},
|
|
11
|
-
secondary: {
|
|
12
|
-
left: "secondary-left-menu",
|
|
13
|
-
right: "secondary-right-menu"
|
|
14
|
-
},
|
|
15
|
-
side: {
|
|
16
|
-
left: "side-left-menu",
|
|
17
|
-
right: "side-right-menu"
|
|
18
|
-
}
|
|
19
|
-
}, l = {
|
|
20
|
-
"main-left-menu": "main",
|
|
21
|
-
"main-right-menu": "main",
|
|
22
|
-
"secondary-left-menu": "secondary",
|
|
23
|
-
"secondary-right-menu": "secondary",
|
|
24
|
-
"side-left-menu": "side",
|
|
25
|
-
"side-right-menu": "side"
|
|
26
|
-
}, b = (n) => l[n], f = (n, e) => ({
|
|
27
|
-
id: n,
|
|
28
|
-
visible: e,
|
|
29
|
-
widgets: []
|
|
30
|
-
}), v = (n = {}) => {
|
|
31
|
-
const e = (i) => f(i, n[i] ?? !0);
|
|
32
|
-
return {
|
|
33
|
-
regions: {
|
|
34
|
-
nav: e("nav"),
|
|
35
|
-
activity: e("activity"),
|
|
36
|
-
"sidenav-header": e("sidenav-header"),
|
|
37
|
-
sidenav: e("sidenav"),
|
|
38
|
-
"main-header": e("main-header"),
|
|
39
|
-
"main-left-menu": e("main-left-menu"),
|
|
40
|
-
main: e("main"),
|
|
41
|
-
"main-right-menu": e("main-right-menu"),
|
|
42
|
-
"secondary-header": e("secondary-header"),
|
|
43
|
-
"secondary-left-menu": e("secondary-left-menu"),
|
|
44
|
-
secondary: e("secondary"),
|
|
45
|
-
"secondary-right-menu": e("secondary-right-menu"),
|
|
46
|
-
"side-header": e("side-header"),
|
|
47
|
-
"side-left-menu": e("side-left-menu"),
|
|
48
|
-
side: e("side"),
|
|
49
|
-
"side-right-menu": e("side-right-menu"),
|
|
50
|
-
status: e("status"),
|
|
51
|
-
overlay: e("overlay")
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
}, y = (n, e) => {
|
|
55
|
-
for (let i = n.length - 1; i >= 0; i -= 1)
|
|
56
|
-
if (n[i]?.widgetId === e) return i;
|
|
57
|
-
return -1;
|
|
58
|
-
}, w = (n) => {
|
|
59
|
-
const e = /* @__PURE__ */ new Set(), i = {};
|
|
60
|
-
let t = n.activeWidgetId, g = n.activeResourceUri;
|
|
61
|
-
for (const [u, a] of Object.entries(n.regions)) {
|
|
62
|
-
const s = a.activeWidgetId, d = s ? y(a.widgets, s) : -1, o = a.widgets.map((r) => {
|
|
63
|
-
const c = h(e, r.contributionId, r.widgetId);
|
|
64
|
-
return e.add(c), c === r.widgetId ? r : {
|
|
65
|
-
...r,
|
|
66
|
-
widgetId: c
|
|
67
|
-
};
|
|
68
|
-
}), m = d >= 0 ? o[d]?.widgetId : s;
|
|
69
|
-
i[u] = {
|
|
70
|
-
...a,
|
|
71
|
-
widgets: o,
|
|
72
|
-
activeWidgetId: m
|
|
73
|
-
}, s && n.activeWidgetId === s && d >= 0 && (t = m, g = o[d]?.resourceUri);
|
|
74
|
-
}
|
|
75
|
-
return {
|
|
76
|
-
...n,
|
|
77
|
-
regions: i,
|
|
78
|
-
activeWidgetId: t,
|
|
79
|
-
activeResourceUri: g
|
|
80
|
-
};
|
|
81
|
-
}, k = (n, e = {}) => {
|
|
82
|
-
const i = v(e);
|
|
83
|
-
return w({
|
|
84
|
-
...n,
|
|
85
|
-
regions: {
|
|
86
|
-
...i.regions,
|
|
87
|
-
...n.regions
|
|
88
|
-
}
|
|
89
|
-
});
|
|
90
|
-
};
|
|
91
|
-
export {
|
|
92
|
-
R as a,
|
|
93
|
-
I as b,
|
|
94
|
-
v as c,
|
|
95
|
-
b as g,
|
|
96
|
-
k as m,
|
|
97
|
-
h as r,
|
|
98
|
-
W as w
|
|
99
|
-
};
|
|
100
|
-
//# sourceMappingURL=layout-types-DMoZz38-.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"layout-types-DMoZz38-.js","sources":["../src/core/registries/layout/widget-id.ts","../src/core/registries/layout/layout-types.ts"],"sourcesContent":["export const resolveUniqueWidgetId = (\n widgetIds: ReadonlySet<string>,\n contributionId: string,\n preferredId = contributionId,\n) => {\n if (!widgetIds.has(preferredId)) return preferredId;\n\n let suffix = 1;\n while (widgetIds.has(`${contributionId}:${suffix}`)) suffix += 1;\n return `${contributionId}:${suffix}`;\n};\n","import type { ContributionSource, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport { resolveUniqueWidgetId } from \"./widget-id\";\n\nexport const workbenchRegions = [\n \"nav\",\n \"activity\",\n \"sidenav-header\",\n \"sidenav\",\n \"main-header\",\n \"main-left-menu\",\n \"main\",\n \"main-right-menu\",\n \"secondary-header\",\n \"secondary-left-menu\",\n \"secondary\",\n \"secondary-right-menu\",\n \"side-header\",\n \"side-left-menu\",\n \"side\",\n \"side-right-menu\",\n \"status\",\n \"overlay\",\n] as const;\n\nexport type WorkbenchRegion = (typeof workbenchRegions)[number];\n\nexport const workbenchPanelRegions = [\"main\", \"secondary\", \"side\"] as const satisfies readonly WorkbenchRegion[];\n\nexport type WorkbenchPanelRegion = (typeof workbenchPanelRegions)[number];\n\nexport type WorkbenchPanelMenuSide = \"left\" | \"right\";\n\nexport const workbenchPanelMenuRegions = {\n main: { left: \"main-left-menu\", right: \"main-right-menu\" },\n secondary: { left: \"secondary-left-menu\", right: \"secondary-right-menu\" },\n side: { left: \"side-left-menu\", right: \"side-right-menu\" },\n} as const satisfies Record<WorkbenchPanelRegion, Record<WorkbenchPanelMenuSide, WorkbenchRegion>>;\n\nexport type WorkbenchPanelMenuRegion = (typeof workbenchPanelMenuRegions)[WorkbenchPanelRegion][WorkbenchPanelMenuSide];\n\nconst workbenchPanelByMenuRegion = {\n \"main-left-menu\": \"main\",\n \"main-right-menu\": \"main\",\n \"secondary-left-menu\": \"secondary\",\n \"secondary-right-menu\": \"secondary\",\n \"side-left-menu\": \"side\",\n \"side-right-menu\": \"side\",\n} as const satisfies Record<WorkbenchPanelMenuRegion, WorkbenchPanelRegion>;\n\nexport const getWorkbenchPanelForMenuRegion = (region: WorkbenchPanelMenuRegion) => workbenchPanelByMenuRegion[region];\n\nexport interface WorkbenchRegionSize {\n defaultPx?: number;\n minPx?: number;\n maxPx?: number;\n}\n\nexport type WidgetReusePolicy = \"resource\" | \"none\";\n\nexport type WidgetMountStrategy = \"active\" | \"keep-mounted\";\n\nexport type WorkbenchPanelReusePolicy = WidgetReusePolicy;\n\nexport type WorkbenchPanelMountStrategy = WidgetMountStrategy;\n\nexport type WorkbenchFloatingPanelVisibility = \"visible\" | \"hidden\";\n\nexport type WorkbenchWidgetRole = \"content\" | \"location\" | \"sub-panel\" | \"panel-menu\";\n\nexport type WorkbenchTabRetention = \"preview\" | \"persistent\";\n\nexport type WorkbenchTabPosition = \"start\" | \"end\" | { beforeWidgetId: string } | { afterWidgetId: string };\n\nexport interface WorkbenchLocationEligibility {\n modeIds?: string[];\n resourceKinds?: string[];\n resourceIds?: string[];\n canOpen?(resource: ResourceRef): boolean;\n canOpenLocation?(location: { resource?: ResourceRef; viewId?: string }): boolean;\n}\n\nexport type WorkbenchPanelMenuOwner =\n | { level: \"panel\"; contributionId?: string }\n | { level: \"sub-panel\"; contributionId: string };\n\nexport interface WorkbenchWidgetTab {\n contentRendererId?: string;\n /** Custom actions shown when the user activates an already-active tab. */\n customMenuRendererId?: string;\n}\n\nexport type WorkbenchPanelTab = WorkbenchWidgetTab;\n\nexport interface WidgetContribution {\n id: string;\n title: string;\n icon?: string;\n region: WorkbenchRegion;\n fallbackRegion?: WorkbenchRegion;\n singleton?: boolean;\n reuse?: WidgetReusePolicy;\n mountStrategy?: WidgetMountStrategy;\n closable?: boolean;\n // Non-closeable widgets opt into the tab visibility menu; closeable widgets\n // ignore this and use the X button for dismissal.\n hiddenByDefault?: boolean;\n // A Location that presents only its Sub Panels: it renders no tab and no\n // content of its own — establishing it activates its first Sub Panel.\n subPanelsOnly?: boolean;\n regionSize?: WorkbenchRegionSize;\n regionCollapsible?: boolean;\n headerBorderBottom?: boolean;\n floatingPanels?: WorkbenchFloatingPanelVisibility;\n resourceKinds?: string[];\n priority?: number;\n rendererId: string;\n openCommandId?: string;\n eligibleLocations?: WorkbenchLocationEligibility;\n panelMenuOwner?: WorkbenchPanelMenuOwner;\n tab?: WorkbenchWidgetTab;\n config?: unknown;\n canOpen?(resource: ResourceRef): boolean;\n}\n\nexport interface WorkbenchPanelMenuDefinition {\n id: string;\n title: string;\n icon?: string;\n side: WorkbenchPanelMenuSide;\n singleton?: boolean;\n reuse?: WorkbenchPanelReusePolicy;\n mountStrategy?: WorkbenchPanelMountStrategy;\n hiddenByDefault?: boolean;\n regionSize?: WorkbenchRegionSize;\n regionCollapsible?: boolean;\n headerBorderBottom?: boolean;\n rendererId: string;\n priority?: number;\n config?: unknown;\n}\n\ninterface WorkbenchPanelMenusContribution {\n panelMenus?: readonly WorkbenchPanelMenuDefinition[];\n}\n\nexport interface WorkbenchPanelContribution {\n id: string;\n title: string;\n icon?: string;\n region: WorkbenchRegion;\n fallbackRegion?: WorkbenchRegion;\n rendererId: string;\n singleton?: boolean;\n reuse?: WorkbenchPanelReusePolicy;\n mountStrategy?: WorkbenchPanelMountStrategy;\n hiddenByDefault?: boolean;\n subPanelsOnly?: boolean;\n regionSize?: WorkbenchRegionSize;\n regionCollapsible?: boolean;\n headerBorderBottom?: boolean;\n floatingPanels?: WorkbenchFloatingPanelVisibility;\n resourceKinds?: string[];\n eligibleLocations?: WorkbenchLocationEligibility;\n priority?: number;\n openCommandId?: string;\n tab?: WorkbenchPanelTab;\n config?: unknown;\n canOpen?(resource: ResourceRef): boolean;\n ownerId?: string;\n source?: ContributionSource;\n panelMenus?: readonly WorkbenchPanelMenuDefinition[];\n}\n\nexport type WorkbenchLocationContribution = WidgetContribution & WorkbenchPanelMenusContribution;\n\nexport type WorkbenchSubPanelContribution = Omit<WidgetContribution, \"region\" | \"fallbackRegion\"> & {\n region: WorkbenchPanelRegion;\n fallbackRegion?: WorkbenchPanelRegion;\n} & WorkbenchPanelMenusContribution;\n\nexport type WorkbenchPanelMenuContribution = Omit<WidgetContribution, \"region\" | \"fallbackRegion\"> & {\n region: WorkbenchPanelMenuRegion;\n fallbackRegion?: WorkbenchPanelMenuRegion;\n};\n\nexport type RegisteredWidgetContribution = Omit<WidgetContribution, \"priority\" | \"singleton\" | \"reuse\"> & {\n ownedPanelMenuIds?: readonly string[];\n singleton: boolean;\n reuse: WidgetReusePolicy;\n} & RegisteredContributionMetadata;\n\nexport interface PlaceholderContribution {\n id: string;\n title: string;\n region: WorkbenchRegion;\n rendererId: string;\n regionSize?: WorkbenchRegionSize;\n regionCollapsible?: boolean;\n config?: unknown;\n priority?: number;\n}\n\nexport type RegisteredPlaceholderContribution = Omit<PlaceholderContribution, \"priority\"> &\n RegisteredContributionMetadata;\n\nexport interface WorkbenchWidgetPlacement {\n widgetId: string;\n contributionId: string;\n viewId?: string;\n ownerId?: string;\n source?: ContributionSource;\n resource?: ResourceRef;\n resourceUri?: string;\n ownerResourceUri?: string;\n title?: string;\n pinned?: boolean;\n closable?: boolean;\n mountStrategy?: WidgetMountStrategy;\n hiddenByDefault?: boolean;\n tabRetention?: WorkbenchTabRetention;\n tab?: WorkbenchWidgetTab;\n role?: WorkbenchWidgetRole;\n}\n\nexport interface WorkbenchPanelInstance {\n instanceId: string;\n panelId: string;\n viewId?: string;\n ownerId?: string;\n source?: ContributionSource;\n resource?: ResourceRef;\n resourceUri?: string;\n ownerResourceUri?: string;\n title?: string;\n pinned?: boolean;\n closable: boolean;\n mountStrategy?: WorkbenchPanelMountStrategy;\n hiddenByDefault?: boolean;\n tabRetention?: WorkbenchTabRetention;\n tab?: WorkbenchPanelTab;\n}\n\nexport interface WorkbenchRegionState {\n id: WorkbenchRegion;\n visible: boolean;\n size?: number;\n widgets: WorkbenchWidgetPlacement[];\n activeWidgetId?: string;\n}\n\nexport interface WorkbenchLayout {\n regions: Record<WorkbenchRegion, WorkbenchRegionState>;\n locationSubPanelSelections?: Record<string, Partial<Record<WorkbenchPanelRegion, string>>>;\n activeWidgetId?: string;\n activeLocationWidgetId?: string;\n activeResourceUri?: string;\n}\n\nexport interface WorkbenchLayoutStoreState {\n layout: WorkbenchLayout;\n widgets: Record<string, RegisteredWidgetContribution>;\n placeholders: Partial<Record<WorkbenchRegion, RegisteredPlaceholderContribution>>;\n}\n\nexport interface OpenWidgetInput {\n viewId?: string | null;\n resource?: ResourceRef | null;\n title?: string;\n region?: WorkbenchRegion;\n // The role this placement takes, when the caller knows it better than the widget\n // does. A panel is a Location in main and a Sub Panel elsewhere, so a placement made\n // by the composition resolver carries the role its region implies.\n role?: WorkbenchWidgetRole;\n ownerId?: string;\n source?: ContributionSource;\n pinned?: boolean;\n closable?: boolean;\n mountStrategy?: WidgetMountStrategy;\n hiddenByDefault?: boolean;\n tabRetention?: WorkbenchTabRetention;\n tabPosition?: WorkbenchTabPosition;\n tab?: WorkbenchWidgetTab;\n replaceActive?: boolean;\n replaceWidgetId?: string;\n}\n\nexport type WorkbenchPanelOpenStrategy =\n | { kind: \"persistent\"; position?: WorkbenchTabPosition }\n | { kind: \"replace-active\" }\n | { kind: \"replace-panel\"; instanceId: string; retention?: WorkbenchTabRetention }\n | { kind: \"preview\"; position?: WorkbenchTabPosition };\n\nexport interface OpenWorkbenchPanelInput {\n /** Set by the view registry. Low-level layout callers should leave this undefined. */\n viewId?: string | null;\n /** `null` explicitly clears an existing singleton placement's resource binding. */\n resource?: ResourceRef | null;\n title?: string;\n region?: WorkbenchRegion;\n role?: WorkbenchWidgetRole;\n pinned?: boolean;\n closable?: boolean;\n mountStrategy?: WorkbenchPanelMountStrategy;\n hiddenByDefault?: boolean;\n tab?: WorkbenchPanelTab;\n strategy?: WorkbenchPanelOpenStrategy;\n}\n\nconst createRegionState = (id: WorkbenchRegion, visible: boolean): WorkbenchRegionState => ({\n id,\n visible,\n widgets: [],\n});\n\nexport const createDefaultWorkbenchLayout = (\n regionVisibility: Partial<Record<WorkbenchRegion, boolean>> = {},\n): WorkbenchLayout => {\n const createRegion = (id: WorkbenchRegion) => createRegionState(id, regionVisibility[id] ?? true);\n\n return {\n regions: {\n nav: createRegion(\"nav\"),\n activity: createRegion(\"activity\"),\n \"sidenav-header\": createRegion(\"sidenav-header\"),\n sidenav: createRegion(\"sidenav\"),\n \"main-header\": createRegion(\"main-header\"),\n \"main-left-menu\": createRegion(\"main-left-menu\"),\n main: createRegion(\"main\"),\n \"main-right-menu\": createRegion(\"main-right-menu\"),\n \"secondary-header\": createRegion(\"secondary-header\"),\n \"secondary-left-menu\": createRegion(\"secondary-left-menu\"),\n secondary: createRegion(\"secondary\"),\n \"secondary-right-menu\": createRegion(\"secondary-right-menu\"),\n \"side-header\": createRegion(\"side-header\"),\n \"side-left-menu\": createRegion(\"side-left-menu\"),\n side: createRegion(\"side\"),\n \"side-right-menu\": createRegion(\"side-right-menu\"),\n status: createRegion(\"status\"),\n overlay: createRegion(\"overlay\"),\n },\n };\n};\n\nconst findLastWidgetIndex = (widgets: WorkbenchWidgetPlacement[], widgetId: string) => {\n for (let index = widgets.length - 1; index >= 0; index -= 1) {\n if (widgets[index]?.widgetId === widgetId) return index;\n }\n return -1;\n};\n\nconst normalizeWidgetIds = (layout: WorkbenchLayout) => {\n const widgetIds = new Set<string>();\n const regions = {} as WorkbenchLayout[\"regions\"];\n let activeWidgetId = layout.activeWidgetId;\n let activeResourceUri = layout.activeResourceUri;\n\n for (const [id, region] of Object.entries(layout.regions) as [WorkbenchRegion, WorkbenchRegionState][]) {\n const originalActiveWidgetId = region.activeWidgetId;\n const activeIndex = originalActiveWidgetId ? findLastWidgetIndex(region.widgets, originalActiveWidgetId) : -1;\n const widgets = region.widgets.map((placement) => {\n const widgetId = resolveUniqueWidgetId(widgetIds, placement.contributionId, placement.widgetId);\n widgetIds.add(widgetId);\n return widgetId === placement.widgetId ? placement : { ...placement, widgetId };\n });\n const normalizedActiveWidgetId = activeIndex >= 0 ? widgets[activeIndex]?.widgetId : originalActiveWidgetId;\n regions[id] = { ...region, widgets, activeWidgetId: normalizedActiveWidgetId };\n\n if (originalActiveWidgetId && layout.activeWidgetId === originalActiveWidgetId && activeIndex >= 0) {\n activeWidgetId = normalizedActiveWidgetId;\n activeResourceUri = widgets[activeIndex]?.resourceUri;\n }\n }\n\n return { ...layout, regions, activeWidgetId, activeResourceUri };\n};\n\nexport const mergeWithDefaultRegions = (\n persisted: WorkbenchLayout,\n regionVisibility: Partial<Record<WorkbenchRegion, boolean>> = {},\n): WorkbenchLayout => {\n const defaults = createDefaultWorkbenchLayout(regionVisibility);\n return normalizeWidgetIds({\n ...persisted,\n regions: { ...defaults.regions, ...persisted.regions },\n });\n};\n"],"names":["resolveUniqueWidgetId","widgetIds","contributionId","preferredId","has","suffix","workbenchRegions","workbenchPanelRegions","workbenchPanelMenuRegions","main","left","right","secondary","side","workbenchPanelByMenuRegion","getWorkbenchPanelForMenuRegion","region","createRegionState","id","visible","widgets","createDefaultWorkbenchLayout","regionVisibility","createRegion","regions","nav","activity","sidenav","status","overlay","findLastWidgetIndex","widgetId","index","length","normalizeWidgetIds","layout","Set","activeWidgetId","activeResourceUri","Object","entries","originalActiveWidgetId","activeIndex","map","placement","add","normalizedActiveWidgetId","resourceUri","mergeWithDefaultRegions","persisted","defaults"],"mappings":"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"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { b as s } from "./layout-types-DMoZz38-.js";
|
|
2
|
-
const n = (e, a, o) => ({
|
|
3
|
-
role: "anchor",
|
|
4
|
-
anchor: e,
|
|
5
|
-
persistence: a,
|
|
6
|
-
candidates: o
|
|
7
|
-
}), r = (e, a = !1) => a ? {
|
|
8
|
-
role: "projection",
|
|
9
|
-
reads: e,
|
|
10
|
-
navigator: a
|
|
11
|
-
} : {
|
|
12
|
-
role: "projection",
|
|
13
|
-
reads: e
|
|
14
|
-
}, i = {
|
|
15
|
-
role: "chrome"
|
|
16
|
-
}, d = {
|
|
17
|
-
role: "transient"
|
|
18
|
-
}, t = {
|
|
19
|
-
// The top bar hosts breadcrumbs (primary trail) and session status (attached), so it
|
|
20
|
-
// reads both anchors — it is a projection, not inert chrome.
|
|
21
|
-
nav: r(["primary", "attached"]),
|
|
22
|
-
activity: i,
|
|
23
|
-
"sidenav-header": r(["primary"]),
|
|
24
|
-
sidenav: r(["primary"], !0),
|
|
25
|
-
"main-header": r(["primary"]),
|
|
26
|
-
"main-left-menu": r(["primary"]),
|
|
27
|
-
main: n("primary", "primary", "global"),
|
|
28
|
-
"main-right-menu": r(["primary"]),
|
|
29
|
-
"secondary-header": r(["primary"]),
|
|
30
|
-
"secondary-left-menu": r(["secondary"]),
|
|
31
|
-
secondary: n("secondary", "derived", "scoped"),
|
|
32
|
-
"secondary-right-menu": r(["secondary"]),
|
|
33
|
-
status: r(["primary", "attached"]),
|
|
34
|
-
overlay: d,
|
|
35
|
-
"side-header": r(["attached"]),
|
|
36
|
-
"side-left-menu": r(["attached"]),
|
|
37
|
-
side: n("attached", "detached", "scoped"),
|
|
38
|
-
"side-right-menu": r(["attached"])
|
|
39
|
-
}, m = (e) => t[e], y = () => s.filter((e) => t[e].role === "anchor"), l = (e) => {
|
|
40
|
-
const a = s.find((o) => {
|
|
41
|
-
const c = t[o];
|
|
42
|
-
return c.role === "anchor" && c.anchor === e;
|
|
43
|
-
});
|
|
44
|
-
if (!a) throw new Error(`No region hosts anchor: ${e}`);
|
|
45
|
-
return a;
|
|
46
|
-
};
|
|
47
|
-
export {
|
|
48
|
-
m as g,
|
|
49
|
-
y as l,
|
|
50
|
-
l as r
|
|
51
|
-
};
|
|
52
|
-
//# sourceMappingURL=surface-map-C1pOTUmF.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"surface-map-C1pOTUmF.js","sources":["../src/core/registries/layout/surface-map.ts"],"sourcesContent":["import { type WorkbenchRegion, workbenchRegions } from \"./layout-types\";\n\n// The surface map describes the *behavioural* role of each workbench region: which\n// regions host a resource (anchors), which render an anchor's resource (projections),\n// and which are frame chrome or the transient overlay layer. The project scope root is\n// not a surface; it is handled by the layout persistence scope.\n\n// Logical anchor identity, independent of the region id that currently hosts it.\nexport type AnchorId = \"primary\" | \"secondary\" | \"attached\";\n\n// Does an anchor's active selection survive a primary change?\n// - primary: the subject itself.\n// - derived: re-scopes/clears on primary change (terminals follow the workspace).\n// - detached: persists across primary navigation, but disconnects when the new\n// primary's scoped candidates no longer list it (scope wins).\nexport type AnchorPersistence = \"primary\" | \"derived\" | \"detached\";\n\n// What the anchor's quick-pick offers: everything, or filtered by primary.\nexport type AnchorCandidates = \"global\" | \"scoped\";\n\n// Which anchor(s) a projection renders.\nexport type AnchorReadId = AnchorId;\n\nexport interface AnchorSurface {\n role: \"anchor\";\n anchor: AnchorId;\n persistence: AnchorPersistence;\n candidates: AnchorCandidates;\n}\n\nexport interface ProjectionSurface {\n role: \"projection\";\n reads: AnchorReadId[];\n // The sidenav navigator both reads primary (highlight) and selects it (the picker).\n navigator?: boolean;\n}\n\nexport interface ChromeSurface {\n role: \"chrome\";\n}\n\nexport interface TransientSurface {\n role: \"transient\";\n}\n\nexport type SurfaceDescriptor = AnchorSurface | ProjectionSurface | ChromeSurface | TransientSurface;\n\nconst anchor = (anchor: AnchorId, persistence: AnchorPersistence, candidates: AnchorCandidates): AnchorSurface => ({\n role: \"anchor\",\n anchor,\n persistence,\n candidates,\n});\n\nconst projection = (reads: AnchorReadId[], navigator = false): ProjectionSurface =>\n navigator ? { role: \"projection\", reads, navigator } : { role: \"projection\", reads };\n\nconst chrome: ChromeSurface = { role: \"chrome\" };\nconst transient: TransientSurface = { role: \"transient\" };\n\nexport const surfaceMap: Record<WorkbenchRegion, SurfaceDescriptor> = {\n // The top bar hosts breadcrumbs (primary trail) and session status (attached), so it\n // reads both anchors — it is a projection, not inert chrome.\n nav: projection([\"primary\", \"attached\"]),\n activity: chrome,\n \"sidenav-header\": projection([\"primary\"]),\n sidenav: projection([\"primary\"], true),\n \"main-header\": projection([\"primary\"]),\n \"main-left-menu\": projection([\"primary\"]),\n main: anchor(\"primary\", \"primary\", \"global\"),\n \"main-right-menu\": projection([\"primary\"]),\n \"secondary-header\": projection([\"primary\"]),\n \"secondary-left-menu\": projection([\"secondary\"]),\n secondary: anchor(\"secondary\", \"derived\", \"scoped\"),\n \"secondary-right-menu\": projection([\"secondary\"]),\n status: projection([\"primary\", \"attached\"]),\n overlay: transient,\n \"side-header\": projection([\"attached\"]),\n \"side-left-menu\": projection([\"attached\"]),\n side: anchor(\"attached\", \"detached\", \"scoped\"),\n \"side-right-menu\": projection([\"attached\"]),\n};\n\nexport const getSurface = (region: WorkbenchRegion) => surfaceMap[region];\n\nexport const listAnchorRegions = () =>\n workbenchRegions.filter((region): region is WorkbenchRegion => surfaceMap[region].role === \"anchor\");\n\nexport const listProjectionRegions = () =>\n workbenchRegions.filter((region): region is WorkbenchRegion => surfaceMap[region].role === \"projection\");\n\nexport const listProjectionsReading = (anchorId: AnchorReadId) =>\n workbenchRegions.filter((region) => {\n const surface = surfaceMap[region];\n return surface.role === \"projection\" && surface.reads.includes(anchorId);\n });\n\n// Reverse lookup: which region currently hosts a given logical anchor.\nexport const resolveAnchorRegion = (anchorId: AnchorId) => {\n const region = workbenchRegions.find((candidate) => {\n const surface = surfaceMap[candidate];\n return surface.role === \"anchor\" && surface.anchor === anchorId;\n });\n if (!region) throw new Error(`No region hosts anchor: ${anchorId}`);\n return region;\n};\n"],"names":["anchor","persistence","candidates","role","projection","reads","navigator","chrome","transient","surfaceMap","nav","activity","sidenav","main","secondary","status","overlay","side","getSurface","region","listAnchorRegions","workbenchRegions","filter","resolveAnchorRegion","anchorId","find","candidate","surface","Error"],"mappings":";AA+CA,MAAMA,IAASA,CAACA,GAAkBC,GAAgCC,OAAiD;AAAA,EACjHC,MAAM;AAAA,EACNH,QAAAA;AAAAA,EACAC,aAAAA;AAAAA,EACAC,YAAAA;AACF,IAEME,IAAaA,CAACC,GAAuBC,IAAY,OACrDA,IAAY;AAAA,EAAEH,MAAM;AAAA,EAAcE,OAAAA;AAAAA,EAAOC,WAAAA;AAAU,IAAI;AAAA,EAAEH,MAAM;AAAA,EAAcE,OAAAA;AAAM,GAE/EE,IAAwB;AAAA,EAAEJ,MAAM;AAAS,GACzCK,IAA8B;AAAA,EAAEL,MAAM;AAAY,GAE3CM,IAAyD;AAAA;AAAA;AAAA,EAGpEC,KAAKN,EAAW,CAAC,WAAW,UAAU,CAAC;AAAA,EACvCO,UAAUJ;AAAAA,EACV,kBAAkBH,EAAW,CAAC,SAAS,CAAC;AAAA,EACxCQ,SAASR,EAAW,CAAC,SAAS,GAAG,EAAI;AAAA,EACrC,eAAeA,EAAW,CAAC,SAAS,CAAC;AAAA,EACrC,kBAAkBA,EAAW,CAAC,SAAS,CAAC;AAAA,EACxCS,MAAMb,EAAO,WAAW,WAAW,QAAQ;AAAA,EAC3C,mBAAmBI,EAAW,CAAC,SAAS,CAAC;AAAA,EACzC,oBAAoBA,EAAW,CAAC,SAAS,CAAC;AAAA,EAC1C,uBAAuBA,EAAW,CAAC,WAAW,CAAC;AAAA,EAC/CU,WAAWd,EAAO,aAAa,WAAW,QAAQ;AAAA,EAClD,wBAAwBI,EAAW,CAAC,WAAW,CAAC;AAAA,EAChDW,QAAQX,EAAW,CAAC,WAAW,UAAU,CAAC;AAAA,EAC1CY,SAASR;AAAAA,EACT,eAAeJ,EAAW,CAAC,UAAU,CAAC;AAAA,EACtC,kBAAkBA,EAAW,CAAC,UAAU,CAAC;AAAA,EACzCa,MAAMjB,EAAO,YAAY,YAAY,QAAQ;AAAA,EAC7C,mBAAmBI,EAAW,CAAC,UAAU,CAAC;AAC5C,GAEac,IAAaA,CAACC,MAA4BV,EAAWU,CAAM,GAE3DC,IAAoBA,MAC/BC,EAAiBC,OAAO,CAACH,MAAsCV,EAAWU,CAAM,EAAEhB,SAAS,QAAQ,GAYxFoB,IAAsBA,CAACC,MAAuB;AACzD,QAAML,IAASE,EAAiBI,KAAMC,CAAAA,MAAc;AAClD,UAAMC,IAAUlB,EAAWiB,CAAS;AACpC,WAAOC,EAAQxB,SAAS,YAAYwB,EAAQ3B,WAAWwB;AAAAA,EACzD,CAAC;AACD,MAAI,CAACL,EAAQ,OAAM,IAAIS,MAAM,2BAA2BJ,CAAQ,EAAE;AAClE,SAAOL;AACT;"}
|