@workbench-kit/workbench-config 0.0.2-prototype.0.2.6 → 0.0.2-prototype.0.2.8

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.
Files changed (2) hide show
  1. package/package.json +3 -3
  2. package/src/index.ts +61 -0
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@workbench-kit/workbench-config",
3
- "version": "0.0.2-prototype.0.2.6",
3
+ "version": "0.0.2-prototype.0.2.8",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "exports": {
7
7
  ".": "./src/index.ts"
8
8
  },
9
9
  "dependencies": {
10
- "@workbench-kit/base": "0.0.2-prototype.0.2.6",
11
- "@workbench-kit/platform": "0.0.2-prototype.0.2.6"
10
+ "@workbench-kit/base": "0.0.2-prototype.0.2.8",
11
+ "@workbench-kit/platform": "0.0.2-prototype.0.2.8"
12
12
  },
13
13
  "files": [
14
14
  "src",
package/src/index.ts CHANGED
@@ -19,6 +19,16 @@ export interface WorkbenchExtensionsConfig {
19
19
  recommendations: readonly string[];
20
20
  }
21
21
 
22
+ export interface WorkbenchExtensionsLockEntry {
23
+ readonly integrity?: string | undefined;
24
+ readonly version: string;
25
+ }
26
+
27
+ export interface WorkbenchExtensionsLock {
28
+ readonly extensions: Readonly<Record<string, WorkbenchExtensionsLockEntry>>;
29
+ readonly lockfileVersion: number;
30
+ }
31
+
22
32
  export interface WorkbenchLayoutConfig {
23
33
  readonly activityBar: {
24
34
  readonly hiddenItemIds?: readonly string[];
@@ -83,6 +93,57 @@ export function parseWorkbenchExtensionsConfigJson(jsonText: string): WorkbenchE
83
93
  }
84
94
  }
85
95
 
96
+ export function parseWorkbenchExtensionsLock(input: unknown): WorkbenchExtensionsLock {
97
+ const record = assertRecord(input, 'extensions lock');
98
+ const lockfileVersion = record.lockfileVersion;
99
+ if (
100
+ typeof lockfileVersion !== 'number' ||
101
+ !Number.isInteger(lockfileVersion) ||
102
+ lockfileVersion < 1
103
+ ) {
104
+ throw new WorkbenchConfigValidationError(
105
+ 'Expected extensions lock "lockfileVersion" to be a positive integer.',
106
+ );
107
+ }
108
+
109
+ const extensionsRecord = assertRecord(record.extensions ?? {}, 'extensions lock extensions');
110
+ const extensions: Record<string, WorkbenchExtensionsLockEntry> = {};
111
+ for (const [extensionId, rawEntry] of Object.entries(extensionsRecord)) {
112
+ const entry = assertRecord(rawEntry, `extensions lock entry "${extensionId}"`);
113
+ if (typeof entry.version !== 'string' || entry.version.trim().length === 0) {
114
+ throw new WorkbenchConfigValidationError(
115
+ `Expected extensions lock entry "${extensionId}" to include a non-empty version.`,
116
+ );
117
+ }
118
+ if (entry.integrity !== undefined && typeof entry.integrity !== 'string') {
119
+ throw new WorkbenchConfigValidationError(
120
+ `Expected extensions lock entry "${extensionId}" integrity to be a string.`,
121
+ );
122
+ }
123
+ extensions[extensionId] = {
124
+ integrity: typeof entry.integrity === 'string' ? entry.integrity : undefined,
125
+ version: entry.version.trim(),
126
+ };
127
+ }
128
+
129
+ return {
130
+ extensions,
131
+ lockfileVersion,
132
+ };
133
+ }
134
+
135
+ export function parseWorkbenchExtensionsLockJson(jsonText: string): WorkbenchExtensionsLock {
136
+ try {
137
+ return parseWorkbenchExtensionsLock(JSON.parse(jsonText) as unknown);
138
+ } catch (error) {
139
+ if (error instanceof WorkbenchConfigValidationError) {
140
+ throw error;
141
+ }
142
+
143
+ throw new WorkbenchConfigValidationError('Expected extensions lock to be valid JSON.');
144
+ }
145
+ }
146
+
86
147
  export function parseWorkbenchLayoutConfig(input: unknown): WorkbenchLayoutConfig {
87
148
  const record = assertRecord(input, 'layout config');
88
149
  assertKnownKeys(record, ['activityBar', 'auxiliaryBar', 'panel', 'sideBar'], 'layout config');