@lvce-editor/extension-detail-view 3.39.0 → 3.41.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/dist/extensionDetailViewWorkerMain.js +325 -264
- package/package.json +1 -1
|
@@ -173,6 +173,7 @@ const H2 = 22;
|
|
|
173
173
|
const Dd = 43;
|
|
174
174
|
const Dl = 44;
|
|
175
175
|
const Li = 48;
|
|
176
|
+
const P = 50;
|
|
176
177
|
const Pre = 51;
|
|
177
178
|
const A = 53;
|
|
178
179
|
const Ul = 60;
|
|
@@ -191,6 +192,7 @@ const VirtualDomElements = {
|
|
|
191
192
|
H2,
|
|
192
193
|
Img,
|
|
193
194
|
Li,
|
|
195
|
+
P,
|
|
194
196
|
Pre,
|
|
195
197
|
Span,
|
|
196
198
|
TBody,
|
|
@@ -260,11 +262,16 @@ const TableCell = 'TableCell';
|
|
|
260
262
|
const TableHeading = 'TableHeading';
|
|
261
263
|
const Viewlet = 'Viewlet';
|
|
262
264
|
|
|
265
|
+
const li = {
|
|
266
|
+
type: VirtualDomElements.Li,
|
|
267
|
+
childCount: 1
|
|
268
|
+
};
|
|
269
|
+
const code = {
|
|
270
|
+
type: VirtualDomElements.Code,
|
|
271
|
+
childCount: 1
|
|
272
|
+
};
|
|
263
273
|
const getActivationEventVirtualDom = event => {
|
|
264
|
-
return [
|
|
265
|
-
type: VirtualDomElements.Li,
|
|
266
|
-
childCount: 1
|
|
267
|
-
}, text(event)];
|
|
274
|
+
return [li, code, text(event)];
|
|
268
275
|
};
|
|
269
276
|
|
|
270
277
|
const getFeatureContentHeadingVirtualDom = heading => {
|
|
@@ -509,6 +516,19 @@ class FeatureNotFoundError extends Error {
|
|
|
509
516
|
}
|
|
510
517
|
}
|
|
511
518
|
|
|
519
|
+
const getFeatureUnsupportedVirtualDom = state => {
|
|
520
|
+
return [{
|
|
521
|
+
type: VirtualDomElements.Div,
|
|
522
|
+
childCount: 2
|
|
523
|
+
}, {
|
|
524
|
+
type: VirtualDomElements.H1,
|
|
525
|
+
childCount: 1
|
|
526
|
+
}, text('Unsupported Feature'), {
|
|
527
|
+
type: VirtualDomElements.P,
|
|
528
|
+
childCount: 1
|
|
529
|
+
}, text('Selected feature is unknown or unsupported')];
|
|
530
|
+
};
|
|
531
|
+
|
|
512
532
|
const features = Object.create(null);
|
|
513
533
|
const register$1 = feature => {
|
|
514
534
|
features[feature.id] = feature;
|
|
@@ -535,7 +555,7 @@ const getFeatureDetailsHandler = featureName => {
|
|
|
535
555
|
const getFeatureVirtualDomHandler = featureName => {
|
|
536
556
|
const feature = features[featureName];
|
|
537
557
|
if (!feature) {
|
|
538
|
-
|
|
558
|
+
return getFeatureUnsupportedVirtualDom;
|
|
539
559
|
}
|
|
540
560
|
return feature.getVirtualDom;
|
|
541
561
|
};
|
|
@@ -2078,9 +2098,10 @@ const create = (uid, uri, x, y, width, height, platform, assetDir) => {
|
|
|
2078
2098
|
badge: '',
|
|
2079
2099
|
baseUrl: '',
|
|
2080
2100
|
builtinExtensionsBadgeEnabled: true,
|
|
2101
|
+
buttons: [],
|
|
2081
2102
|
categories: [],
|
|
2082
|
-
changelogVirtualDom: [],
|
|
2083
2103
|
changelogScrollTop: 0,
|
|
2104
|
+
changelogVirtualDom: [],
|
|
2084
2105
|
commands: [],
|
|
2085
2106
|
description: '',
|
|
2086
2107
|
detailsVirtualDom: [],
|
|
@@ -2091,10 +2112,10 @@ const create = (uid, uri, x, y, width, height, platform, assetDir) => {
|
|
|
2091
2112
|
extensionVersion: '',
|
|
2092
2113
|
features: [],
|
|
2093
2114
|
featuresVirtualDom: [],
|
|
2115
|
+
focus: 0,
|
|
2094
2116
|
folderSize: 0,
|
|
2095
2117
|
hasColorTheme: false,
|
|
2096
2118
|
iconSrc: '',
|
|
2097
|
-
isBuiltin: false,
|
|
2098
2119
|
jsonValidation: [],
|
|
2099
2120
|
name: '',
|
|
2100
2121
|
platform,
|
|
@@ -2111,11 +2132,12 @@ const create = (uid, uri, x, y, width, height, platform, assetDir) => {
|
|
|
2111
2132
|
showAdditionalDetailsBreakpoint: 600,
|
|
2112
2133
|
sizeOnDisk: 0,
|
|
2113
2134
|
sizeValue: 0,
|
|
2135
|
+
tabs: [],
|
|
2114
2136
|
themesMarkdownDom: [],
|
|
2115
2137
|
uri,
|
|
2116
2138
|
webViews: [],
|
|
2117
2139
|
width,
|
|
2118
|
-
|
|
2140
|
+
readmeUrl: ''
|
|
2119
2141
|
};
|
|
2120
2142
|
set$1(uid, state, state);
|
|
2121
2143
|
};
|
|
@@ -2276,8 +2298,7 @@ const {
|
|
|
2276
2298
|
set,
|
|
2277
2299
|
setColorTheme: setColorTheme$1,
|
|
2278
2300
|
uninstallExtension,
|
|
2279
|
-
sendMessagePortToMarkdownWorker: sendMessagePortToMarkdownWorker$1
|
|
2280
|
-
} = RendererWorker;
|
|
2301
|
+
sendMessagePortToMarkdownWorker: sendMessagePortToMarkdownWorker$1} = RendererWorker;
|
|
2281
2302
|
|
|
2282
2303
|
const setColorTheme = id => {
|
|
2283
2304
|
return setColorTheme$1(id);
|
|
@@ -2346,6 +2367,15 @@ const handleIconError = state => {
|
|
|
2346
2367
|
};
|
|
2347
2368
|
};
|
|
2348
2369
|
|
|
2370
|
+
const handleScroll = (state, scrollTop) => {
|
|
2371
|
+
const newScrollTop = Math.max(0, scrollTop);
|
|
2372
|
+
return {
|
|
2373
|
+
...state,
|
|
2374
|
+
readmeScrollTop: newScrollTop,
|
|
2375
|
+
scrollSource: User
|
|
2376
|
+
};
|
|
2377
|
+
};
|
|
2378
|
+
|
|
2349
2379
|
const readFile = async uri => {
|
|
2350
2380
|
return readFile$1(uri);
|
|
2351
2381
|
};
|
|
@@ -2379,17 +2409,25 @@ const loadChangelogContent = async path => {
|
|
|
2379
2409
|
const selectTabChangelog = async state => {
|
|
2380
2410
|
const {
|
|
2381
2411
|
extension,
|
|
2382
|
-
baseUrl
|
|
2412
|
+
baseUrl,
|
|
2413
|
+
tabs
|
|
2383
2414
|
} = state;
|
|
2384
2415
|
const changelogContent = await loadChangelogContent(extension.path); // TODO use uri
|
|
2385
2416
|
const changelogMarkdownHtml = await renderMarkdown(changelogContent, {
|
|
2386
2417
|
baseUrl
|
|
2387
2418
|
});
|
|
2388
2419
|
const changelogDom = await getMarkdownVirtualDom(changelogMarkdownHtml);
|
|
2420
|
+
const newTabs = tabs.map(tab => {
|
|
2421
|
+
return {
|
|
2422
|
+
...tab,
|
|
2423
|
+
selected: tab.name === Changelog
|
|
2424
|
+
};
|
|
2425
|
+
});
|
|
2389
2426
|
return {
|
|
2390
2427
|
...state,
|
|
2391
2428
|
selectedTab: Changelog,
|
|
2392
|
-
changelogVirtualDom: changelogDom
|
|
2429
|
+
changelogVirtualDom: changelogDom,
|
|
2430
|
+
tabs: newTabs
|
|
2393
2431
|
};
|
|
2394
2432
|
};
|
|
2395
2433
|
|
|
@@ -2397,9 +2435,8 @@ const selectTabDefault = async state => {
|
|
|
2397
2435
|
return state;
|
|
2398
2436
|
};
|
|
2399
2437
|
|
|
2400
|
-
const loadReadmeContent = async
|
|
2438
|
+
const loadReadmeContent = async readmeUrl => {
|
|
2401
2439
|
try {
|
|
2402
|
-
const readmeUrl = join(path, 'README.md');
|
|
2403
2440
|
const readmeContent = await readFile(readmeUrl);
|
|
2404
2441
|
return readmeContent;
|
|
2405
2442
|
} catch (error) {
|
|
@@ -2415,18 +2452,26 @@ const loadReadmeContent = async path => {
|
|
|
2415
2452
|
|
|
2416
2453
|
const selectTabDetails = async state => {
|
|
2417
2454
|
const {
|
|
2418
|
-
|
|
2419
|
-
|
|
2455
|
+
baseUrl,
|
|
2456
|
+
readmeUrl,
|
|
2457
|
+
tabs
|
|
2420
2458
|
} = state;
|
|
2421
|
-
const readmeContent = await loadReadmeContent(
|
|
2459
|
+
const readmeContent = await loadReadmeContent(readmeUrl);
|
|
2422
2460
|
const readmeHtml = await renderMarkdown(readmeContent, {
|
|
2423
2461
|
baseUrl
|
|
2424
2462
|
});
|
|
2425
2463
|
const detailsDom = await getMarkdownVirtualDom(readmeHtml);
|
|
2464
|
+
const newTabs = tabs.map(tab => {
|
|
2465
|
+
return {
|
|
2466
|
+
...tab,
|
|
2467
|
+
selected: tab.name === Details
|
|
2468
|
+
};
|
|
2469
|
+
});
|
|
2426
2470
|
return {
|
|
2427
2471
|
...state,
|
|
2428
2472
|
selectedTab: Details,
|
|
2429
|
-
detailsVirtualDom: detailsDom
|
|
2473
|
+
detailsVirtualDom: detailsDom,
|
|
2474
|
+
tabs: newTabs
|
|
2430
2475
|
};
|
|
2431
2476
|
};
|
|
2432
2477
|
|
|
@@ -2435,15 +2480,26 @@ const selectTabFeatures = async state => {
|
|
|
2435
2480
|
extension,
|
|
2436
2481
|
baseUrl,
|
|
2437
2482
|
selectedFeature,
|
|
2438
|
-
features
|
|
2483
|
+
features,
|
|
2484
|
+
tabs
|
|
2439
2485
|
} = state;
|
|
2486
|
+
if (features.length === 0) {
|
|
2487
|
+
return state;
|
|
2488
|
+
}
|
|
2440
2489
|
const actualSelectedFeature = selectedFeature || Theme;
|
|
2441
2490
|
const fn = getFeatureDetailsHandler(actualSelectedFeature);
|
|
2442
2491
|
const partialNewState = await fn(extension, baseUrl);
|
|
2492
|
+
const newTabs = tabs.map(tab => {
|
|
2493
|
+
return {
|
|
2494
|
+
...tab,
|
|
2495
|
+
selected: tab.name === Features
|
|
2496
|
+
};
|
|
2497
|
+
});
|
|
2443
2498
|
return {
|
|
2444
2499
|
...state,
|
|
2445
2500
|
selectedTab: Features,
|
|
2446
2501
|
selectedFeature: features[0].id || '',
|
|
2502
|
+
tabs: newTabs,
|
|
2447
2503
|
...partialNewState
|
|
2448
2504
|
};
|
|
2449
2505
|
};
|
|
@@ -2470,15 +2526,6 @@ const handleTabsClick = (state, name) => {
|
|
|
2470
2526
|
return selectTab(state, name);
|
|
2471
2527
|
};
|
|
2472
2528
|
|
|
2473
|
-
const handleWheel = (state, deltaX, deltaY) => {
|
|
2474
|
-
const newScrollTop = Math.max(0, state.readmeScrollTop + deltaY);
|
|
2475
|
-
return {
|
|
2476
|
-
...state,
|
|
2477
|
-
readmeScrollTop: newScrollTop,
|
|
2478
|
-
scrollSource: User
|
|
2479
|
-
};
|
|
2480
|
-
};
|
|
2481
|
-
|
|
2482
2529
|
const sendMessagePortToMarkdownWorker = async port => {
|
|
2483
2530
|
await sendMessagePortToMarkdownWorker$1(port, 0);
|
|
2484
2531
|
};
|
|
@@ -2505,6 +2552,11 @@ const initialize = async () => {
|
|
|
2505
2552
|
// TODO create connection to file system worker
|
|
2506
2553
|
};
|
|
2507
2554
|
|
|
2555
|
+
const existsFile = async uri => {
|
|
2556
|
+
// TODO ask file system worker
|
|
2557
|
+
return true;
|
|
2558
|
+
};
|
|
2559
|
+
|
|
2508
2560
|
const Web = 1;
|
|
2509
2561
|
const Electron = 2;
|
|
2510
2562
|
const Remote = 3;
|
|
@@ -2560,7 +2612,152 @@ const getBaseUrl = (extensionPath, platform) => {
|
|
|
2560
2612
|
}
|
|
2561
2613
|
};
|
|
2562
2614
|
|
|
2615
|
+
const getExtensionDetailButtons = (hasColorTheme, isBuiltin) => {
|
|
2616
|
+
const allActions = [{
|
|
2617
|
+
label: setColorTheme$3(),
|
|
2618
|
+
onClick: HandleClickSetColorTheme,
|
|
2619
|
+
enabled: hasColorTheme,
|
|
2620
|
+
name: SetColorTheme
|
|
2621
|
+
}, {
|
|
2622
|
+
label: disable(),
|
|
2623
|
+
onClick: HandleClickDisable,
|
|
2624
|
+
enabled: true,
|
|
2625
|
+
name: Disable
|
|
2626
|
+
}, {
|
|
2627
|
+
label: uninstall(),
|
|
2628
|
+
onClick: HandleClickUninstall,
|
|
2629
|
+
enabled: !isBuiltin,
|
|
2630
|
+
name: Uninstall
|
|
2631
|
+
}];
|
|
2632
|
+
return allActions;
|
|
2633
|
+
};
|
|
2634
|
+
|
|
2635
|
+
const getExtensionIdFromUri = uri => {
|
|
2636
|
+
const id = uri.slice('extension-detail://'.length);
|
|
2637
|
+
return id;
|
|
2638
|
+
};
|
|
2639
|
+
|
|
2640
|
+
const getTabs = (selectedTab, hasReadme, hasFeatures, hasChangelog) => {
|
|
2641
|
+
const tabs = [{
|
|
2642
|
+
label: details(),
|
|
2643
|
+
name: Details,
|
|
2644
|
+
selected: selectedTab === Details,
|
|
2645
|
+
enabled: hasReadme
|
|
2646
|
+
}, {
|
|
2647
|
+
label: features$1(),
|
|
2648
|
+
name: Features,
|
|
2649
|
+
selected: selectedTab === Features,
|
|
2650
|
+
enabled: hasFeatures
|
|
2651
|
+
}, {
|
|
2652
|
+
label: changelog(),
|
|
2653
|
+
name: Changelog,
|
|
2654
|
+
selected: selectedTab === Changelog,
|
|
2655
|
+
enabled: hasChangelog
|
|
2656
|
+
}];
|
|
2657
|
+
return tabs;
|
|
2658
|
+
};
|
|
2659
|
+
|
|
2660
|
+
const Small = 1;
|
|
2661
|
+
const Normal = 2;
|
|
2662
|
+
const Large = 3;
|
|
2663
|
+
|
|
2664
|
+
const getViewletSize = width => {
|
|
2665
|
+
if (width < 180) {
|
|
2666
|
+
return Small;
|
|
2667
|
+
}
|
|
2668
|
+
if (width < 768) {
|
|
2669
|
+
return Normal;
|
|
2670
|
+
}
|
|
2671
|
+
return Large;
|
|
2672
|
+
};
|
|
2673
|
+
|
|
2674
|
+
const isLanguageBasicsExtension = extension => {
|
|
2675
|
+
return extension.name && extension.name.startsWith('Language Basics');
|
|
2676
|
+
};
|
|
2677
|
+
|
|
2678
|
+
const isThemeExtension = extension => {
|
|
2679
|
+
return extension.name && extension.name.endsWith(' Theme');
|
|
2680
|
+
};
|
|
2681
|
+
|
|
2682
|
+
const getIcon = (extension, platform, assetDir) => {
|
|
2683
|
+
if (!extension) {
|
|
2684
|
+
return extensionDefaultIcon(assetDir);
|
|
2685
|
+
}
|
|
2686
|
+
if (!extension.path || !extension.icon) {
|
|
2687
|
+
if (isLanguageBasicsExtension(extension)) {
|
|
2688
|
+
return extensionLanguageBasics(assetDir);
|
|
2689
|
+
}
|
|
2690
|
+
if (isThemeExtension(extension)) {
|
|
2691
|
+
return extensionTheme(assetDir);
|
|
2692
|
+
}
|
|
2693
|
+
return extensionDefaultIcon(assetDir);
|
|
2694
|
+
}
|
|
2695
|
+
if (platform === Remote || platform === Electron) {
|
|
2696
|
+
if (extension.builtin) {
|
|
2697
|
+
return `${assetDir}/extensions/${extension.id}/${extension.icon}`;
|
|
2698
|
+
}
|
|
2699
|
+
return `/remote/${extension.path}/${extension.icon}`; // TODO support windows paths
|
|
2700
|
+
}
|
|
2701
|
+
return '';
|
|
2702
|
+
};
|
|
2703
|
+
|
|
2704
|
+
const getDescription = extension => {
|
|
2705
|
+
if (!extension || !extension.description) {
|
|
2706
|
+
return 'n/a';
|
|
2707
|
+
}
|
|
2708
|
+
return extension.description;
|
|
2709
|
+
};
|
|
2710
|
+
|
|
2711
|
+
const getName = extension => {
|
|
2712
|
+
if (extension && extension.name) {
|
|
2713
|
+
return extension.name;
|
|
2714
|
+
}
|
|
2715
|
+
if (extension && extension.id) {
|
|
2716
|
+
return extension.id;
|
|
2717
|
+
}
|
|
2718
|
+
return 'n/a';
|
|
2719
|
+
};
|
|
2720
|
+
|
|
2721
|
+
const getBadge = (builtin, badgeEnabled) => {
|
|
2722
|
+
if (builtin && badgeEnabled) {
|
|
2723
|
+
return 'builtin';
|
|
2724
|
+
}
|
|
2725
|
+
return '';
|
|
2726
|
+
};
|
|
2727
|
+
|
|
2728
|
+
const hasColorThemes = extension => {
|
|
2729
|
+
return Boolean(extension && extension.colorThemes && extension.colorThemes.length > 0);
|
|
2730
|
+
};
|
|
2731
|
+
|
|
2732
|
+
const loadHeaderContent = (state, platform, extension) => {
|
|
2733
|
+
const {
|
|
2734
|
+
assetDir,
|
|
2735
|
+
builtinExtensionsBadgeEnabled
|
|
2736
|
+
} = state;
|
|
2737
|
+
const iconSrc = getIcon(extension, platform, assetDir);
|
|
2738
|
+
const description = getDescription(extension);
|
|
2739
|
+
const name = getName(extension);
|
|
2740
|
+
const extensionUri = extension.uri || extension.path;
|
|
2741
|
+
const extensionId = extension?.id || 'n/a';
|
|
2742
|
+
const extensionVersion = extension?.version || 'n/a';
|
|
2743
|
+
const hasColorTheme = hasColorThemes(extension);
|
|
2744
|
+
const isBuiltin = extension?.builtin;
|
|
2745
|
+
const badge = getBadge(isBuiltin, builtinExtensionsBadgeEnabled);
|
|
2746
|
+
return {
|
|
2747
|
+
badge,
|
|
2748
|
+
description,
|
|
2749
|
+
extension,
|
|
2750
|
+
extensionId,
|
|
2751
|
+
extensionUri,
|
|
2752
|
+
extensionVersion,
|
|
2753
|
+
hasColorTheme,
|
|
2754
|
+
iconSrc,
|
|
2755
|
+
name
|
|
2756
|
+
};
|
|
2757
|
+
};
|
|
2758
|
+
|
|
2563
2759
|
const getCategories = () => {
|
|
2760
|
+
// TODO
|
|
2564
2761
|
return [{
|
|
2565
2762
|
id: 'themes',
|
|
2566
2763
|
label: 'Themes'
|
|
@@ -2660,24 +2857,6 @@ const getDisplaySize = size => {
|
|
|
2660
2857
|
});
|
|
2661
2858
|
};
|
|
2662
2859
|
|
|
2663
|
-
const getEntries = () => {
|
|
2664
|
-
return [{
|
|
2665
|
-
key: 'Identifier',
|
|
2666
|
-
value: 'abc'
|
|
2667
|
-
}, {
|
|
2668
|
-
key: 'Version',
|
|
2669
|
-
value: '1.9.5'
|
|
2670
|
-
}, {
|
|
2671
|
-
key: 'Last Updated',
|
|
2672
|
-
value: 'n/a'
|
|
2673
|
-
}];
|
|
2674
|
-
};
|
|
2675
|
-
|
|
2676
|
-
const getExtensionIdFromUri = uri => {
|
|
2677
|
-
const id = uri.slice('extension-detail://'.length);
|
|
2678
|
-
return id;
|
|
2679
|
-
};
|
|
2680
|
-
|
|
2681
2860
|
const getFolderSize = async uri => {
|
|
2682
2861
|
if (!uri) {
|
|
2683
2862
|
throw new VError(`uri is required`);
|
|
@@ -2689,128 +2868,77 @@ const getFolderSize = async uri => {
|
|
|
2689
2868
|
}
|
|
2690
2869
|
};
|
|
2691
2870
|
|
|
2692
|
-
const
|
|
2693
|
-
|
|
2694
|
-
|
|
2695
|
-
|
|
2871
|
+
const getInstallationEntries = (displaySize, extensionId, extensionVersion, extensionUri) => {
|
|
2872
|
+
const entries = [{
|
|
2873
|
+
key: 'Identifier',
|
|
2874
|
+
value: extensionId,
|
|
2875
|
+
odd: true,
|
|
2876
|
+
code: true
|
|
2696
2877
|
}, {
|
|
2697
|
-
|
|
2698
|
-
|
|
2878
|
+
key: 'Version',
|
|
2879
|
+
value: extensionVersion,
|
|
2880
|
+
code: true
|
|
2699
2881
|
}, {
|
|
2700
|
-
|
|
2701
|
-
|
|
2882
|
+
key: 'Last Updated',
|
|
2883
|
+
value: 'n/a',
|
|
2884
|
+
odd: true
|
|
2702
2885
|
}, {
|
|
2703
|
-
|
|
2704
|
-
|
|
2886
|
+
key: 'Size',
|
|
2887
|
+
value: displaySize,
|
|
2888
|
+
onClick: HandleClickSize,
|
|
2889
|
+
title: extensionUri
|
|
2705
2890
|
}];
|
|
2891
|
+
return entries;
|
|
2706
2892
|
};
|
|
2707
2893
|
|
|
2708
|
-
const
|
|
2894
|
+
const getMarketplaceEntries = isBuiltin => {
|
|
2895
|
+
if (isBuiltin) {
|
|
2896
|
+
return [];
|
|
2897
|
+
}
|
|
2709
2898
|
return [{
|
|
2710
2899
|
key: 'Published',
|
|
2711
|
-
value: 'n/a'
|
|
2900
|
+
value: 'n/a',
|
|
2901
|
+
odd: true
|
|
2712
2902
|
}, {
|
|
2713
2903
|
key: 'Last Released',
|
|
2714
2904
|
value: 'n/a'
|
|
2715
2905
|
}];
|
|
2716
2906
|
};
|
|
2717
2907
|
|
|
2718
|
-
const
|
|
2719
|
-
|
|
2720
|
-
|
|
2721
|
-
|
|
2722
|
-
const getViewletSize = width => {
|
|
2723
|
-
if (width < 180) {
|
|
2724
|
-
return Small;
|
|
2725
|
-
}
|
|
2726
|
-
if (width < 768) {
|
|
2727
|
-
return Normal;
|
|
2728
|
-
}
|
|
2729
|
-
return Large;
|
|
2730
|
-
};
|
|
2731
|
-
|
|
2732
|
-
const isLanguageBasicsExtension = extension => {
|
|
2733
|
-
return extension.name && extension.name.startsWith('Language Basics');
|
|
2734
|
-
};
|
|
2735
|
-
|
|
2736
|
-
const isThemeExtension = extension => {
|
|
2737
|
-
return extension.name && extension.name.endsWith(' Theme');
|
|
2738
|
-
};
|
|
2739
|
-
|
|
2740
|
-
const getIcon = (extension, platform, assetDir) => {
|
|
2741
|
-
if (!extension) {
|
|
2742
|
-
return extensionDefaultIcon(assetDir);
|
|
2743
|
-
}
|
|
2744
|
-
if (!extension.path || !extension.icon) {
|
|
2745
|
-
if (isLanguageBasicsExtension(extension)) {
|
|
2746
|
-
return extensionLanguageBasics(assetDir);
|
|
2747
|
-
}
|
|
2748
|
-
if (isThemeExtension(extension)) {
|
|
2749
|
-
return extensionTheme(assetDir);
|
|
2750
|
-
}
|
|
2751
|
-
return extensionDefaultIcon(assetDir);
|
|
2752
|
-
}
|
|
2753
|
-
if (platform === Remote || platform === Electron) {
|
|
2754
|
-
if (extension.builtin) {
|
|
2755
|
-
return `${assetDir}/extensions/${extension.id}/${extension.icon}`;
|
|
2756
|
-
}
|
|
2757
|
-
return `/remote/${extension.path}/${extension.icon}`; // TODO support windows paths
|
|
2758
|
-
}
|
|
2759
|
-
return '';
|
|
2760
|
-
};
|
|
2761
|
-
|
|
2762
|
-
const getDescription = extension => {
|
|
2763
|
-
if (!extension || !extension.description) {
|
|
2764
|
-
return 'n/a';
|
|
2765
|
-
}
|
|
2766
|
-
return extension.description;
|
|
2767
|
-
};
|
|
2768
|
-
|
|
2769
|
-
const getName = extension => {
|
|
2770
|
-
if (extension && extension.name) {
|
|
2771
|
-
return extension.name;
|
|
2772
|
-
}
|
|
2773
|
-
if (extension && extension.id) {
|
|
2774
|
-
return extension.id;
|
|
2775
|
-
}
|
|
2776
|
-
return 'n/a';
|
|
2777
|
-
};
|
|
2778
|
-
|
|
2779
|
-
const getBadge = (builtin, badgeEnabled) => {
|
|
2780
|
-
if (builtin && badgeEnabled) {
|
|
2781
|
-
return 'builtin';
|
|
2908
|
+
const getResources = isBuiltin => {
|
|
2909
|
+
if (isBuiltin) {
|
|
2910
|
+
return [];
|
|
2782
2911
|
}
|
|
2783
|
-
|
|
2784
|
-
|
|
2785
|
-
|
|
2786
|
-
|
|
2787
|
-
|
|
2912
|
+
// TODO
|
|
2913
|
+
return [{
|
|
2914
|
+
label: 'Marketplace',
|
|
2915
|
+
url: '#'
|
|
2916
|
+
}, {
|
|
2917
|
+
label: 'Issues',
|
|
2918
|
+
url: '#'
|
|
2919
|
+
}, {
|
|
2920
|
+
label: 'Repository',
|
|
2921
|
+
url: '#'
|
|
2922
|
+
}, {
|
|
2923
|
+
label: 'License',
|
|
2924
|
+
url: '#'
|
|
2925
|
+
}];
|
|
2788
2926
|
};
|
|
2789
2927
|
|
|
2790
|
-
const
|
|
2791
|
-
const
|
|
2792
|
-
|
|
2793
|
-
|
|
2794
|
-
|
|
2795
|
-
const
|
|
2796
|
-
const
|
|
2797
|
-
const name = getName(extension);
|
|
2798
|
-
const extensionUri = extension.uri || extension.path;
|
|
2799
|
-
const extensionId = extension?.id || 'n/a';
|
|
2800
|
-
const extensionVersion = extension?.version || 'n/a';
|
|
2801
|
-
const hasColorTheme = hasColorThemes(extension);
|
|
2802
|
-
const isBuiltin = extension?.builtin;
|
|
2803
|
-
const badge = getBadge(isBuiltin, builtinExtensionsBadgeEnabled);
|
|
2928
|
+
const loadSideBarContent = async (extensionId, extensionVersion, extensionUri, isBuiltin) => {
|
|
2929
|
+
const folderSize = await getFolderSize(extensionUri);
|
|
2930
|
+
const displaySize = getDisplaySize(folderSize);
|
|
2931
|
+
const installationEntries = getInstallationEntries(displaySize, extensionId, extensionVersion, extensionUri);
|
|
2932
|
+
const marketplaceEntries = getMarketplaceEntries(isBuiltin);
|
|
2933
|
+
const categories = getCategories();
|
|
2934
|
+
const resources = getResources(isBuiltin);
|
|
2804
2935
|
return {
|
|
2805
|
-
|
|
2806
|
-
|
|
2807
|
-
|
|
2808
|
-
|
|
2809
|
-
|
|
2810
|
-
|
|
2811
|
-
hasColorTheme,
|
|
2812
|
-
iconSrc,
|
|
2813
|
-
name
|
|
2936
|
+
installationEntries,
|
|
2937
|
+
marketplaceEntries,
|
|
2938
|
+
displaySize,
|
|
2939
|
+
categories,
|
|
2940
|
+
resources,
|
|
2941
|
+
folderSize
|
|
2814
2942
|
};
|
|
2815
2943
|
};
|
|
2816
2944
|
|
|
@@ -2876,7 +3004,11 @@ const loadContent = async (state, platform, savedState) => {
|
|
|
2876
3004
|
iconSrc,
|
|
2877
3005
|
name
|
|
2878
3006
|
} = headerData;
|
|
2879
|
-
const
|
|
3007
|
+
const readmeUrl = join(extension.path, 'README.md');
|
|
3008
|
+
join(extension.path, 'CHANGELOG.md');
|
|
3009
|
+
const hasReadme = await existsFile();
|
|
3010
|
+
const hasChangelog = await existsFile();
|
|
3011
|
+
const readmeContent = await loadReadmeContent(readmeUrl);
|
|
2880
3012
|
const baseUrl = getBaseUrl(extension.path, platform);
|
|
2881
3013
|
const readmeHtml = await renderMarkdown(readmeContent, {
|
|
2882
3014
|
baseUrl
|
|
@@ -2884,30 +3016,40 @@ const loadContent = async (state, platform, savedState) => {
|
|
|
2884
3016
|
const detailsVirtualDom = await getMarkdownVirtualDom(readmeHtml, {
|
|
2885
3017
|
scrollToTopEnabled: true
|
|
2886
3018
|
});
|
|
3019
|
+
const isBuiltin = extension?.isBuiltin;
|
|
3020
|
+
const buttons = getExtensionDetailButtons(hasColorTheme, isBuiltin);
|
|
3021
|
+
const enabledButtons = buttons.filter(button => button.enabled);
|
|
2887
3022
|
const size = getViewletSize(width);
|
|
2888
3023
|
const {
|
|
2889
3024
|
selectedFeature,
|
|
2890
3025
|
selectedTab,
|
|
2891
|
-
readmeScrollTop
|
|
3026
|
+
readmeScrollTop,
|
|
3027
|
+
changelogScrollTop
|
|
2892
3028
|
} = restoreState(savedState);
|
|
2893
3029
|
const features = getFeatures(selectedFeature || Theme, extension);
|
|
2894
|
-
const
|
|
2895
|
-
const
|
|
2896
|
-
const
|
|
2897
|
-
const secondEntries = getSecondEntries();
|
|
2898
|
-
const categories = getCategories();
|
|
2899
|
-
const resources = getResources();
|
|
3030
|
+
const hasFeatures = features.length > 0;
|
|
3031
|
+
const tabs = getTabs(selectedTab, hasReadme, hasFeatures, hasChangelog);
|
|
3032
|
+
const enabledTabs = tabs.filter(tab => tab.enabled);
|
|
2900
3033
|
const sizeValue = getViewletSize(width || 0);
|
|
2901
|
-
const
|
|
3034
|
+
const {
|
|
3035
|
+
installationEntries,
|
|
3036
|
+
marketplaceEntries,
|
|
3037
|
+
displaySize,
|
|
3038
|
+
categories,
|
|
3039
|
+
resources,
|
|
3040
|
+
folderSize
|
|
3041
|
+
} = await loadSideBarContent(extensionId, extensionVersion, extensionUri, isBuiltin);
|
|
2902
3042
|
return {
|
|
2903
3043
|
...state,
|
|
2904
3044
|
badge,
|
|
2905
3045
|
baseUrl,
|
|
3046
|
+
buttons: enabledButtons,
|
|
2906
3047
|
categories,
|
|
3048
|
+
changelogScrollTop,
|
|
2907
3049
|
description,
|
|
2908
3050
|
detailsVirtualDom,
|
|
2909
3051
|
displaySize,
|
|
2910
|
-
entries,
|
|
3052
|
+
entries: installationEntries,
|
|
2911
3053
|
extension,
|
|
2912
3054
|
extensionId,
|
|
2913
3055
|
extensionVersion,
|
|
@@ -2915,15 +3057,17 @@ const loadContent = async (state, platform, savedState) => {
|
|
|
2915
3057
|
folderSize,
|
|
2916
3058
|
hasColorTheme,
|
|
2917
3059
|
iconSrc,
|
|
2918
|
-
isBuiltin,
|
|
2919
3060
|
name,
|
|
2920
3061
|
readmeScrollTop,
|
|
3062
|
+
readmeUrl,
|
|
2921
3063
|
resources,
|
|
3064
|
+
scrollSource: Script,
|
|
2922
3065
|
scrollToTopButtonEnabled: true,
|
|
2923
|
-
secondEntries,
|
|
3066
|
+
secondEntries: marketplaceEntries,
|
|
2924
3067
|
selectedTab,
|
|
2925
3068
|
sizeOnDisk: size,
|
|
2926
|
-
sizeValue
|
|
3069
|
+
sizeValue,
|
|
3070
|
+
tabs: enabledTabs
|
|
2927
3071
|
};
|
|
2928
3072
|
};
|
|
2929
3073
|
|
|
@@ -2931,26 +3075,6 @@ const loadContent2 = async (state, savedState) => {
|
|
|
2931
3075
|
return loadContent(state, state.platform, savedState);
|
|
2932
3076
|
};
|
|
2933
3077
|
|
|
2934
|
-
const getExtensionDetailButtons = (hasColorTheme, isBuiltin) => {
|
|
2935
|
-
const allActions = [{
|
|
2936
|
-
label: setColorTheme$3(),
|
|
2937
|
-
onClick: HandleClickSetColorTheme,
|
|
2938
|
-
enabled: hasColorTheme,
|
|
2939
|
-
name: SetColorTheme
|
|
2940
|
-
}, {
|
|
2941
|
-
label: disable(),
|
|
2942
|
-
onClick: HandleClickDisable,
|
|
2943
|
-
enabled: true,
|
|
2944
|
-
name: Disable
|
|
2945
|
-
}, {
|
|
2946
|
-
label: uninstall(),
|
|
2947
|
-
onClick: HandleClickUninstall,
|
|
2948
|
-
enabled: !isBuiltin,
|
|
2949
|
-
name: Uninstall
|
|
2950
|
-
}];
|
|
2951
|
-
return allActions;
|
|
2952
|
-
};
|
|
2953
|
-
|
|
2954
3078
|
const getChangelogVirtualDom = changelogDom => {
|
|
2955
3079
|
// const notImplemented = ExtensionDetailStrings.notImplemented()
|
|
2956
3080
|
// TODO set tabpanel role
|
|
@@ -3108,40 +3232,6 @@ const getAdditionalDetailsVirtualDom = (showAdditionalDetails, firstHeading, ent
|
|
|
3108
3232
|
}, ...getAdditionalDetailsEntryVirtualDom(firstHeading, entries, getMoreInfoVirtualDom), ...getAdditionalDetailsEntryVirtualDom(secondHeading, secondEntries, getMoreInfoVirtualDom), ...getAdditionalDetailsEntryVirtualDom(thirdHeading, categories, getCategoriesDom), ...getAdditionalDetailsEntryVirtualDom(fourthHeading, resources, getResourcesVirtualDom)];
|
|
3109
3233
|
};
|
|
3110
3234
|
|
|
3111
|
-
const getInstallationEntries = (displaySize, extensionId, extensionVersion, extensionUri) => {
|
|
3112
|
-
const entries = [{
|
|
3113
|
-
key: 'Identifier',
|
|
3114
|
-
value: extensionId,
|
|
3115
|
-
odd: true,
|
|
3116
|
-
code: true
|
|
3117
|
-
}, {
|
|
3118
|
-
key: 'Version',
|
|
3119
|
-
value: extensionVersion,
|
|
3120
|
-
code: true
|
|
3121
|
-
}, {
|
|
3122
|
-
key: 'Last Updated',
|
|
3123
|
-
value: 'n/a',
|
|
3124
|
-
odd: true
|
|
3125
|
-
}, {
|
|
3126
|
-
key: 'Size',
|
|
3127
|
-
value: displaySize,
|
|
3128
|
-
onClick: HandleClickSize,
|
|
3129
|
-
title: extensionUri
|
|
3130
|
-
}];
|
|
3131
|
-
return entries;
|
|
3132
|
-
};
|
|
3133
|
-
|
|
3134
|
-
const getMarketplaceEntries = () => {
|
|
3135
|
-
return [{
|
|
3136
|
-
key: 'Published',
|
|
3137
|
-
value: 'n/a',
|
|
3138
|
-
odd: true
|
|
3139
|
-
}, {
|
|
3140
|
-
key: 'Last Released',
|
|
3141
|
-
value: 'n/a'
|
|
3142
|
-
}];
|
|
3143
|
-
};
|
|
3144
|
-
|
|
3145
3235
|
const getChildCount = (additionalDetails, scrollToTopEnabled) => {
|
|
3146
3236
|
let count = 1;
|
|
3147
3237
|
if (additionalDetails) {
|
|
@@ -3149,12 +3239,9 @@ const getChildCount = (additionalDetails, scrollToTopEnabled) => {
|
|
|
3149
3239
|
}
|
|
3150
3240
|
return count;
|
|
3151
3241
|
};
|
|
3152
|
-
const getDetailsVirtualDom = (sanitizedReadmeHtml,
|
|
3153
|
-
) => {
|
|
3242
|
+
const getDetailsVirtualDom = (sanitizedReadmeHtml, width, scrollToTopButtonEnabled, categories$1, resources$1, showAdditionalDetailsBreakpoint, marketplaceEntries, installationEntries) => {
|
|
3154
3243
|
const firstHeading = installation();
|
|
3155
|
-
const entries = getInstallationEntries(displaySize, extensionId, extensionVersion, extensionUri);
|
|
3156
3244
|
const secondHeading = marketplace();
|
|
3157
|
-
const secondEntries = getMarketplaceEntries();
|
|
3158
3245
|
const thirdHeading = categories();
|
|
3159
3246
|
const fourthHeading = resources();
|
|
3160
3247
|
const showAdditionalDetails = width > showAdditionalDetailsBreakpoint;
|
|
@@ -3164,7 +3251,7 @@ const getDetailsVirtualDom = (sanitizedReadmeHtml, displaySize, extensionId, ext
|
|
|
3164
3251
|
className: ExtensionDetailPanel,
|
|
3165
3252
|
childCount: childCount,
|
|
3166
3253
|
role: AriaRoles.Panel
|
|
3167
|
-
}, ...sanitizedReadmeHtml, ...getAdditionalDetailsVirtualDom(showAdditionalDetails, firstHeading,
|
|
3254
|
+
}, ...sanitizedReadmeHtml, ...getAdditionalDetailsVirtualDom(showAdditionalDetails, firstHeading, installationEntries, secondHeading, marketplaceEntries, thirdHeading, categories$1, fourthHeading, resources$1)];
|
|
3168
3255
|
return dom;
|
|
3169
3256
|
};
|
|
3170
3257
|
|
|
@@ -3216,10 +3303,10 @@ const getFeaturesVirtualDom = (features, selectedFeature, state) => {
|
|
|
3216
3303
|
}, ...featureVirtualDom];
|
|
3217
3304
|
};
|
|
3218
3305
|
|
|
3219
|
-
const getExtensionDetailContentVirtualDom = (sanitizedReadmeHtml,
|
|
3306
|
+
const getExtensionDetailContentVirtualDom = (sanitizedReadmeHtml, selectedTab, width, scrollToTopButtonEnabled, categories, resources, breakpoint, changelogDom, state) => {
|
|
3220
3307
|
switch (selectedTab) {
|
|
3221
3308
|
case Details:
|
|
3222
|
-
return getDetailsVirtualDom(sanitizedReadmeHtml,
|
|
3309
|
+
return getDetailsVirtualDom(sanitizedReadmeHtml, width, scrollToTopButtonEnabled, categories, resources, breakpoint, state.entries, state.secondEntries);
|
|
3223
3310
|
case Features:
|
|
3224
3311
|
return getFeaturesVirtualDom(state.features, state.selectedFeature, state);
|
|
3225
3312
|
case Changelog:
|
|
@@ -3321,32 +3408,19 @@ const getExtensionDetailHeaderVirtualDom = (name, iconSrc, description, badge, b
|
|
|
3321
3408
|
return dom;
|
|
3322
3409
|
};
|
|
3323
3410
|
|
|
3324
|
-
const getTabs = selectedTab => {
|
|
3325
|
-
const tabs = [{
|
|
3326
|
-
label: details(),
|
|
3327
|
-
name: Details,
|
|
3328
|
-
selected: selectedTab === Details
|
|
3329
|
-
}, {
|
|
3330
|
-
label: features$1(),
|
|
3331
|
-
name: Features,
|
|
3332
|
-
selected: selectedTab === Features
|
|
3333
|
-
}, {
|
|
3334
|
-
label: changelog(),
|
|
3335
|
-
name: Changelog,
|
|
3336
|
-
selected: selectedTab === Changelog
|
|
3337
|
-
}];
|
|
3338
|
-
return tabs;
|
|
3339
|
-
};
|
|
3340
|
-
|
|
3341
3411
|
const selectedClassName = mergeClassNames(ExtensionDetailTab, ExtensionDetailTabSelected);
|
|
3342
3412
|
const defaultClassName = ExtensionDetailTab;
|
|
3413
|
+
const getTabClassName = isSelected => {
|
|
3414
|
+
return isSelected ? selectedClassName : defaultClassName;
|
|
3415
|
+
};
|
|
3416
|
+
|
|
3343
3417
|
const getTabVirtualDom = tab => {
|
|
3344
3418
|
const {
|
|
3345
3419
|
label,
|
|
3346
3420
|
selected,
|
|
3347
3421
|
name
|
|
3348
3422
|
} = tab;
|
|
3349
|
-
const className = selected
|
|
3423
|
+
const className = getTabClassName(selected);
|
|
3350
3424
|
const ariaSelected = selected;
|
|
3351
3425
|
return [{
|
|
3352
3426
|
type: VirtualDomElements.Button,
|
|
@@ -3390,43 +3464,28 @@ const getExtensionDetailVirtualDom = (newState, selectedTab) => {
|
|
|
3390
3464
|
// 3. virtual dom
|
|
3391
3465
|
// 4. dom
|
|
3392
3466
|
const {
|
|
3393
|
-
|
|
3467
|
+
badge,
|
|
3468
|
+
buttons,
|
|
3394
3469
|
categories,
|
|
3395
3470
|
changelogVirtualDom,
|
|
3396
|
-
commands,
|
|
3397
3471
|
description,
|
|
3398
3472
|
detailsVirtualDom,
|
|
3399
|
-
displaySize,
|
|
3400
|
-
extension,
|
|
3401
|
-
extensionId,
|
|
3402
|
-
extensionVersion,
|
|
3403
|
-
features,
|
|
3404
|
-
hasColorTheme,
|
|
3405
3473
|
iconSrc,
|
|
3406
|
-
isBuiltin,
|
|
3407
|
-
jsonValidation,
|
|
3408
3474
|
name,
|
|
3409
3475
|
resources,
|
|
3410
3476
|
scrollToTopButtonEnabled,
|
|
3411
|
-
selectedFeature,
|
|
3412
|
-
settings,
|
|
3413
3477
|
settingsButtonEnabled,
|
|
3414
3478
|
showAdditionalDetailsBreakpoint,
|
|
3415
3479
|
sizeValue,
|
|
3416
|
-
|
|
3417
|
-
webViews,
|
|
3418
|
-
badge
|
|
3480
|
+
tabs
|
|
3419
3481
|
} = newState;
|
|
3420
|
-
const extensionUri = extension.uri || extension.path || '';
|
|
3421
3482
|
const width = newState?.width || 500;
|
|
3422
|
-
const tabs = getTabs(selectedTab);
|
|
3423
3483
|
const sizeClass = getClassNames(sizeValue);
|
|
3424
|
-
const buttonDefs = getExtensionDetailButtons(hasColorTheme, isBuiltin); // TODO compute in loadContent
|
|
3425
3484
|
const dom = [{
|
|
3426
3485
|
type: VirtualDomElements.Div,
|
|
3427
3486
|
className: mergeClassNames(Viewlet, ExtensionDetail, sizeClass),
|
|
3428
3487
|
childCount: 3
|
|
3429
|
-
}, ...getExtensionDetailHeaderVirtualDom(name, iconSrc, description, badge,
|
|
3488
|
+
}, ...getExtensionDetailHeaderVirtualDom(name, iconSrc, description, badge, buttons, settingsButtonEnabled), ...getTabsVirtualDom(tabs), ...getExtensionDetailContentVirtualDom(detailsVirtualDom, selectedTab, width, scrollToTopButtonEnabled, categories, resources, showAdditionalDetailsBreakpoint, changelogVirtualDom, newState)];
|
|
3430
3489
|
return dom;
|
|
3431
3490
|
};
|
|
3432
3491
|
|
|
@@ -3489,7 +3548,7 @@ const renderEventListeners = () => {
|
|
|
3489
3548
|
params: ['handleReadmeContextMenu', 'event.clientX', 'event.clientY', 'event.target.href', 'event.target.src']
|
|
3490
3549
|
}, {
|
|
3491
3550
|
name: HandleReadmeScroll,
|
|
3492
|
-
params: ['
|
|
3551
|
+
params: ['handleScroll', 'event.target.scrollTop'],
|
|
3493
3552
|
passive: true
|
|
3494
3553
|
}, {
|
|
3495
3554
|
name: HandleTabsClick,
|
|
@@ -3554,14 +3613,16 @@ const commandMap = {
|
|
|
3554
3613
|
'ExtensionDetail.handleClickCategory': wrapCommand(handleClickCategory),
|
|
3555
3614
|
'ExtensionDetail.handleClickDisable': wrapCommand(handleClickDisable),
|
|
3556
3615
|
'ExtensionDetail.handleClickScrollToTop': wrapCommand(handleClickScrollToTop),
|
|
3557
|
-
'ExtensionDetail.handleClickSettings': wrapCommand(handleClickSettings),
|
|
3558
3616
|
'ExtensionDetail.handleClickSetColorTheme': wrapCommand(handleClickSetColorTheme),
|
|
3617
|
+
'ExtensionDetail.handleClickSettings': wrapCommand(handleClickSettings),
|
|
3559
3618
|
'ExtensionDetail.handleClickSize': wrapCommand(handleClickSize),
|
|
3560
3619
|
'ExtensionDetail.handleClickUninstall': wrapCommand(handleClickUninstall),
|
|
3561
3620
|
'ExtensionDetail.handleFeaturesClick': wrapCommand(handleClickFeatures),
|
|
3562
3621
|
'ExtensionDetail.handleIconError': wrapCommand(handleIconError),
|
|
3622
|
+
'ExtensionDetail.handleScroll': wrapCommand(handleScroll),
|
|
3563
3623
|
'ExtensionDetail.handleTabsClick': wrapCommand(handleTabsClick),
|
|
3564
|
-
'ExtensionDetail.handleWheel': wrapCommand(
|
|
3624
|
+
'ExtensionDetail.handleWheel': wrapCommand(handleScroll),
|
|
3625
|
+
// deprecated
|
|
3565
3626
|
'ExtensionDetail.loadContent2': wrapCommand(loadContent2),
|
|
3566
3627
|
'ExtensionDetail.render2': render2,
|
|
3567
3628
|
'ExtensionDetail.renderEventListeners': renderEventListeners,
|