@lvce-editor/extension-detail-view 3.31.0 → 3.32.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.
@@ -944,30 +944,34 @@ const {
944
944
 
945
945
  const create$1 = (uid, uri, x, y, width, height, platform, assetDir) => {
946
946
  const state = {
947
+ assetDir: assetDir || '',
948
+ baseUrl: '',
949
+ builtinExtensionsBadgeEnabled: true,
950
+ categories: [],
951
+ changelogVirtualDom: [],
947
952
  description: '',
948
- iconSrc: '',
949
- selectedFeature: '',
950
- name: '',
951
- sanitizedReadmeHtml: '',
952
- selectedTab: '',
953
- sizeOnDisk: 0,
954
- width,
955
- uri,
953
+ detailsVirtualDom: [],
956
954
  entries: [],
957
- secondEntries: [],
958
- categories: [],
959
- resources: [],
960
- selectedFeatureMarkdownDom: '',
961
955
  extension: {},
962
- baseUrl: '',
963
956
  features: [],
957
+ featuresVirtualDom: [],
964
958
  folderSize: 0,
965
- assetDir: assetDir || '',
959
+ iconSrc: '',
960
+ name: '',
966
961
  platform,
967
962
  readmeScrollTop: 0,
963
+ resources: [],
964
+ sanitizedReadmeHtml: '',
965
+ scrollToTopButtonEnabled: false,
966
+ secondEntries: [],
967
+ selectedFeature: '',
968
+ themesMarkdownDom: [],
969
+ selectedTab: '',
968
970
  settingsButtonEnabled: false,
969
- builtinExtensionsBadgeEnabled: true,
970
- scrollToTopButtonEnabled: false
971
+ showAdditionalDetailsBreakpoint: 600,
972
+ sizeOnDisk: 0,
973
+ uri,
974
+ width
971
975
  };
972
976
  set$1(uid, state, state);
973
977
  };
@@ -1402,10 +1406,61 @@ const SetColorTheme = 'SetColorTheme';
1402
1406
  const Disable = 'Disable';
1403
1407
  const Uninstall = 'Uninstall';
1404
1408
 
1409
+ const getMarkdownVirtualDom = async html => {
1410
+ string(html);
1411
+ const dom = await getMarkdownDom(html);
1412
+ return dom;
1413
+ };
1414
+
1415
+ const readFile = async uri => {
1416
+ return readFile$1(uri);
1417
+ };
1418
+
1419
+ const ENOENT = 'ENOENT';
1420
+
1421
+ const isEnoentError = error => {
1422
+ return error && error.code === ENOENT;
1423
+ };
1424
+
1425
+ const join = (pathSeparator, ...parts) => {
1426
+ return parts.join(pathSeparator);
1427
+ };
1428
+
1429
+ const loadChangelogContent = async path => {
1430
+ try {
1431
+ const changelogUrl = join('/', path, 'CHANGELOG.md');
1432
+ const changelogContent = await readFile(changelogUrl);
1433
+ return changelogContent;
1434
+ } catch (error) {
1435
+ if (isEnoentError(error)) {
1436
+ return '';
1437
+ }
1438
+ // TODO send message to error worker
1439
+ // @ts-ignore
1440
+ console.error(new VError(error, 'Failed to load Changelog content'));
1441
+ return `${error}`;
1442
+ }
1443
+ };
1444
+
1445
+ const renderMarkdown = async (markdown, options = {}) => {
1446
+ const html = await renderMarkdown$1(markdown, options);
1447
+ return html;
1448
+ };
1449
+
1405
1450
  const selectTabChangelog = async state => {
1451
+ const {
1452
+ extension,
1453
+ baseUrl
1454
+ } = state;
1455
+ const changelogContent = await loadChangelogContent(extension.path); // TODO use uri
1456
+ const changelogMarkdownHtml = await renderMarkdown(changelogContent, {
1457
+ baseUrl
1458
+ });
1459
+ const changelogDom = await getMarkdownVirtualDom(changelogMarkdownHtml);
1406
1460
  return {
1407
1461
  ...state,
1408
- selectedTab: Changelog$1
1462
+ selectedTab: Changelog$1,
1463
+ changelogVirtualDom: changelogDom
1409
1464
  };
1410
1465
  };
1411
1466
 
@@ -1413,11 +1468,56 @@ const selectTabDefault = async state => {
1413
1468
  return state;
1414
1469
  };
1415
1470
 
1471
+ const getRemoteSrc = uri => {
1472
+ const src = `/remote${uri}`;
1473
+ return src;
1474
+ };
1475
+
1476
+ const Web = 1;
1477
+ const Electron = 2;
1478
+ const Remote = 3;
1479
+
1480
+ const getBaseUrl = (extensionPath, platform) => {
1481
+ switch (platform) {
1482
+ case Remote:
1483
+ case Electron:
1484
+ return getRemoteSrc(extensionPath + '/');
1485
+ default:
1486
+ return extensionPath;
1487
+ }
1488
+ };
1489
+
1490
+ const loadReadmeContent = async path => {
1491
+ try {
1492
+ const readmeUrl = join('/', path, 'README.md');
1493
+ const readmeContent = await readFile(readmeUrl);
1494
+ return readmeContent;
1495
+ } catch (error) {
1496
+ if (isEnoentError(error)) {
1497
+ return '';
1498
+ }
1499
+ // TODO send message to error worker
1500
+ // @ts-ignore
1501
+ console.error(new VError(error, 'Failed to load Readme content'));
1502
+ return `${error}`;
1503
+ }
1504
+ };
1505
+
1416
1506
  const selectTabDetails = async state => {
1417
- // TODO load readmo markdown here
1507
+ const {
1508
+ extension,
1509
+ platform
1510
+ } = state;
1511
+ const readmeContent = await loadReadmeContent(extension.path);
1512
+ const baseUrl = getBaseUrl(extension.path, platform);
1513
+ const readmeHtml = await renderMarkdown(readmeContent, {
1514
+ baseUrl
1515
+ });
1516
+ const detailsDom = await getMarkdownVirtualDom(readmeHtml);
1418
1517
  return {
1419
1518
  ...state,
1420
- selectedTab: Details
1519
+ selectedTab: Details,
1520
+ detailsVirtualDom: detailsDom
1421
1521
  };
1422
1522
  };
1423
1523
 
@@ -1454,30 +1554,31 @@ const getThemeMarkdown = (themes, iconThemes, productIconThemes) => {
1454
1554
  return markdown;
1455
1555
  };
1456
1556
 
1457
- const renderMarkdown = async (markdown, options = {}) => {
1458
- const html = await renderMarkdown$1(markdown, options);
1459
- return html;
1460
- };
1461
-
1462
- const selectTab$1 = async state => {
1557
+ const selectTabFeatures = async state => {
1463
1558
  const {
1464
1559
  extension,
1465
- baseUrl
1560
+ baseUrl,
1561
+ selectedFeature
1466
1562
  } = state;
1467
- const {
1468
- colorThemes,
1469
- iconThemes,
1470
- productIconThemes
1471
- } = extension;
1472
- // TODO do this depending on featured tab content
1473
- const markdown = getThemeMarkdown(colorThemes || [], iconThemes || [], productIconThemes || []);
1474
- const rendered = await renderMarkdown(markdown, {
1475
- baseUrl
1476
- });
1563
+
1564
+ // Only generate theme markdown when the selected feature is actually "Theme"
1565
+ let themesMarkdownDom = [];
1566
+ if (!selectedFeature || selectedFeature === Theme) {
1567
+ const {
1568
+ colorThemes,
1569
+ iconThemes,
1570
+ productIconThemes
1571
+ } = extension;
1572
+ const markdown = getThemeMarkdown(colorThemes || [], iconThemes || [], productIconThemes || []);
1573
+ const rendered = await renderMarkdown(markdown, {
1574
+ baseUrl
1575
+ });
1576
+ themesMarkdownDom = await getMarkdownVirtualDom(rendered);
1577
+ }
1477
1578
  return {
1478
1579
  ...state,
1479
1580
  selectedTab: Features$1,
1480
- selectedFeatureMarkdownDom: rendered
1581
+ themesMarkdownDom: themesMarkdownDom
1481
1582
  };
1482
1583
  };
1483
1584
 
@@ -1486,7 +1587,7 @@ const getSelectTabHandler = selectedTab => {
1486
1587
  case Details:
1487
1588
  return selectTabDetails;
1488
1589
  case Features$1:
1489
- return selectTab$1;
1590
+ return selectTabFeatures;
1490
1591
  case Changelog$1:
1491
1592
  return selectTabChangelog;
1492
1593
  default:
@@ -1524,10 +1625,6 @@ const isThemeExtension = extension => {
1524
1625
  return extension.name && extension.name.endsWith(' Theme');
1525
1626
  };
1526
1627
 
1527
- const Web = 1;
1528
- const Electron = 2;
1529
- const Remote = 3;
1530
-
1531
1628
  const getIcon = (extension, platform, assetDir) => {
1532
1629
  if (!extension) {
1533
1630
  return extensionDefaultIcon(assetDir);
@@ -1596,21 +1693,6 @@ const getExtension = async (id, platform) => {
1596
1693
  }
1597
1694
  };
1598
1695
 
1599
- const getRemoteSrc = uri => {
1600
- const src = `/remote${uri}`;
1601
- return src;
1602
- };
1603
-
1604
- const getBaseUrl = (extensionPath, platform) => {
1605
- switch (platform) {
1606
- case Remote:
1607
- case Electron:
1608
- return getRemoteSrc(extensionPath + '/');
1609
- default:
1610
- return extensionPath;
1611
- }
1612
- };
1613
-
1614
1696
  const getCategories = () => {
1615
1697
  return [{
1616
1698
  id: 'themes',
@@ -1729,36 +1811,6 @@ const getViewletSize = width => {
1729
1811
  return Large$1;
1730
1812
  };
1731
1813
 
1732
- const readFile = async uri => {
1733
- return readFile$1(uri);
1734
- };
1735
-
1736
- const ENOENT = 'ENOENT';
1737
-
1738
- const isEnoentError = error => {
1739
- return error && error.code === ENOENT;
1740
- };
1741
-
1742
- const join = (pathSeparator, ...parts) => {
1743
- return parts.join(pathSeparator);
1744
- };
1745
-
1746
- const loadReadmeContent = async path => {
1747
- try {
1748
- const readmeUrl = join('/', path, 'README.md');
1749
- const readmeContent = await readFile(readmeUrl);
1750
- return readmeContent;
1751
- } catch (error) {
1752
- if (isEnoentError(error)) {
1753
- return '';
1754
- }
1755
- // TODO send message to error worker
1756
- // @ts-ignore
1757
- console.error(new VError(error, 'Failed to load Readme content'));
1758
- return `${error}`;
1759
- }
1760
- };
1761
-
1762
1814
  const getSavedSelectedFeature = savedState => {
1763
1815
  if (savedState && typeof savedState === 'object' && 'selectedFeature' in savedState && typeof savedState.selectedFeature === 'string') {
1764
1816
  return savedState.selectedFeature;
@@ -2253,12 +2305,6 @@ const getInstallationEntries = (displaySize, extensionId, extensionVersion, exte
2253
2305
  return entries;
2254
2306
  };
2255
2307
 
2256
- const getMarkdownVirtualDom = async html => {
2257
- string(html);
2258
- const dom = await getMarkdownDom(html);
2259
- return dom;
2260
- };
2261
-
2262
2308
  const getMarketplaceEntries = () => {
2263
2309
  return [{
2264
2310
  key: 'Published',
@@ -2294,14 +2340,13 @@ const getChildCount = (additionalDetails, scrollToTopEnabled) => {
2294
2340
  }
2295
2341
  return count;
2296
2342
  };
2297
- const getDetailsVirtualDom = async (sanitizedReadmeHtml, displaySize, extensionId, extensionVersion, width, extensionUri, scrollToTopButtonEnabled, categories$1, resources$1) => {
2343
+ const getDetailsVirtualDom = async (sanitizedReadmeHtml, displaySize, extensionId, extensionVersion, width, extensionUri, scrollToTopButtonEnabled, categories$1, resources$1, showAdditionalDetailsBreakpoint) => {
2298
2344
  const firstHeading = installation();
2299
2345
  const entries = getInstallationEntries(displaySize, extensionId, extensionVersion, extensionUri);
2300
2346
  const secondHeading = marketplace();
2301
2347
  const secondEntries = getMarketplaceEntries();
2302
2348
  const thirdHeading = categories();
2303
2349
  const fourthHeading = resources();
2304
- const showAdditionalDetailsBreakpoint = 600;
2305
2350
  const showAdditionalDetails = width > showAdditionalDetailsBreakpoint;
2306
2351
  const childCount = getChildCount(showAdditionalDetails, scrollToTopButtonEnabled);
2307
2352
  const dom = [{
@@ -2540,9 +2585,8 @@ const getVirtualDomChildCount = dom => {
2540
2585
  return stack.length;
2541
2586
  };
2542
2587
 
2543
- const getFeatureThemesVirtualDom = async themesHtml => {
2544
- const markdownDom = await getMarkdownVirtualDom(themesHtml);
2545
- const childCount = getVirtualDomChildCount(markdownDom);
2588
+ const getFeatureThemesVirtualDom = async themesDom => {
2589
+ const childCount = getVirtualDomChildCount(themesDom);
2546
2590
  const heading = theme();
2547
2591
  return [{
2548
2592
  type: VirtualDomElements.Div,
@@ -2552,7 +2596,7 @@ const getFeatureThemesVirtualDom = async themesHtml => {
2552
2596
  type: VirtualDomElements.Div,
2553
2597
  className: DefaultMarkdown,
2554
2598
  childCount
2555
- }, ...markdownDom];
2599
+ }, ...themesDom];
2556
2600
  };
2557
2601
 
2558
2602
  const toWebView = rawWebView => {
@@ -2621,10 +2665,10 @@ const getFeatureWebViewsVirtualDom = extension => {
2621
2665
  }, ...webViews$1.flatMap(getWebViewVirtualDom)];
2622
2666
  };
2623
2667
 
2624
- const getFeatureContentVirtualDom = async (features, themesHtml, selectedFeature, extension) => {
2668
+ const getFeatureContentVirtualDom = async (features, themesDom, selectedFeature, extension) => {
2625
2669
  switch (selectedFeature) {
2626
2670
  case Theme:
2627
- return await getFeatureThemesVirtualDom(themesHtml);
2671
+ return await getFeatureThemesVirtualDom(themesDom);
2628
2672
  case Commands:
2629
2673
  return getFeatureCommandsVirtualDom(extension);
2630
2674
  case JsonValidation:
@@ -2666,7 +2710,7 @@ const getFeatureListVirtualDom = features => {
2666
2710
  }, ...features.flatMap(getFeatureListItemVirtualDom)];
2667
2711
  };
2668
2712
 
2669
- const getFeaturesVirtualDom = async (features, themesHtml, selectedFeature, extension) => {
2713
+ const getFeaturesVirtualDom = async (features, themesDom, selectedFeature, extension) => {
2670
2714
  if (features.length === 0) {
2671
2715
  const none$1 = none();
2672
2716
  return [{
@@ -2683,15 +2727,15 @@ const getFeaturesVirtualDom = async (features, themesHtml, selectedFeature, exte
2683
2727
  type: VirtualDomElements.Div,
2684
2728
  className: mergeClassNames(Sash, SashVertical),
2685
2729
  childCount: 0
2686
- }, ...(await getFeatureContentVirtualDom(features, themesHtml, selectedFeature, extension))];
2730
+ }, ...(await getFeatureContentVirtualDom(features, themesDom, selectedFeature, extension))];
2687
2731
  };
2688
2732
 
2689
- const getExtensionDetailContentVirtualDom = async (sanitizedReadmeHtml, themesHtml, selectedTab, features, displaySize, extensionId, extensionVersion, selectedFeature, extension, width, scrollToTopButtonEnabled, categories, resources) => {
2733
+ const getExtensionDetailContentVirtualDom = async (sanitizedReadmeHtml, themesDom, selectedTab, features, displaySize, extensionId, extensionVersion, selectedFeature, extension, width, scrollToTopButtonEnabled, categories, resources, breakpoint) => {
2690
2734
  switch (selectedTab) {
2691
2735
  case Details:
2692
- return await getDetailsVirtualDom(sanitizedReadmeHtml, displaySize, extensionId, extensionVersion, width, extension.uri || extension.path || '', scrollToTopButtonEnabled, categories, resources);
2736
+ return await getDetailsVirtualDom(sanitizedReadmeHtml, displaySize, extensionId, extensionVersion, width, extension.uri || extension.path || '', scrollToTopButtonEnabled, categories, resources, breakpoint);
2693
2737
  case Features$1:
2694
- return await getFeaturesVirtualDom(features, themesHtml, selectedFeature, extension);
2738
+ return await getFeaturesVirtualDom(features, themesDom, selectedFeature, extension);
2695
2739
  case Changelog$1:
2696
2740
  return getChangelogVirtualDom();
2697
2741
  default:
@@ -2748,6 +2792,17 @@ const getExtensionDetailHeaderActionsVirtualDom = (buttonDefs, settingsButtonEna
2748
2792
  return dom;
2749
2793
  };
2750
2794
 
2795
+ const getExtensionDetailIconVirtualDom = iconSrc => {
2796
+ return {
2797
+ type: VirtualDomElements.Img,
2798
+ className: ExtensionDetailIcon,
2799
+ alt: '',
2800
+ draggable: false,
2801
+ childCount: 0,
2802
+ src: iconSrc
2803
+ };
2804
+ };
2805
+
2751
2806
  const getNameBadgeVirtualDom = badge => {
2752
2807
  if (!badge) {
2753
2808
  return [];
@@ -2772,14 +2827,7 @@ const getExtensionDetailHeaderVirtualDom = (name, iconSrc, description, badge, b
2772
2827
  type: VirtualDomElements.Div,
2773
2828
  className: ExtensionDetailHeader,
2774
2829
  childCount: 2
2775
- }, {
2776
- type: VirtualDomElements.Img,
2777
- className: ExtensionDetailIcon,
2778
- alt: '',
2779
- draggable: false,
2780
- childCount: 0,
2781
- src: iconSrc
2782
- }, {
2830
+ }, getExtensionDetailIconVirtualDom(iconSrc), {
2783
2831
  type: VirtualDomElements.Div,
2784
2832
  className: ExtensionDetailHeaderDetails,
2785
2833
  childCount: 3
@@ -2855,7 +2903,7 @@ const getExtensionDetailVirtualDom = async (newState, sanitizedReadmeHtml, selec
2855
2903
  // 2. view model
2856
2904
  // 3. virtual dom
2857
2905
  // 4. dom
2858
- const themesHtml = newState?.selectedFeatureMarkdownDom || '';
2906
+ const themesHtml = newState.themesMarkdownDom;
2859
2907
  const selectedFeature = newState?.selectedFeature || '';
2860
2908
  const extension = newState?.extension || {};
2861
2909
  const features = getFeatures(selectedFeature, extension);
@@ -2881,7 +2929,7 @@ const getExtensionDetailVirtualDom = async (newState, sanitizedReadmeHtml, selec
2881
2929
  type: VirtualDomElements.Div,
2882
2930
  className: mergeClassNames(Viewlet, ExtensionDetail, sizeClass),
2883
2931
  childCount: 3
2884
- }, ...getExtensionDetailHeaderVirtualDom(name, iconSrc, description, badge, buttonDefs, settingsButtonEnabled), ...getTabsVirtualDom(tabs), ...(await getExtensionDetailContentVirtualDom(sanitizedReadmeHtml, themesHtml, selectedTab, features, displaySize, extensionId, extensionVersion, selectedFeature, extension, width, newState.scrollToTopButtonEnabled, newState.categories, newState.resources))];
2932
+ }, ...getExtensionDetailHeaderVirtualDom(name, iconSrc, description, badge, buttonDefs, settingsButtonEnabled), ...getTabsVirtualDom(tabs), ...(await getExtensionDetailContentVirtualDom(sanitizedReadmeHtml, themesHtml, selectedTab, features, displaySize, extensionId, extensionVersion, selectedFeature, extension, width, newState.scrollToTopButtonEnabled, newState.categories, newState.resources, newState.showAdditionalDetailsBreakpoint))];
2885
2933
  return dom;
2886
2934
  };
2887
2935
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/extension-detail-view",
3
- "version": "3.31.0",
3
+ "version": "3.32.0",
4
4
  "description": "Extension Detail View Worker",
5
5
  "license": "MIT",
6
6
  "author": "Lvce Editor",