@lvce-editor/extension-detail-view 7.8.0 → 7.10.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.
@@ -20,6 +20,7 @@ const Copy = 'Copy';
20
20
  const CopyImage = 'Copy Image';
21
21
  const CopyImageUrl = 'Copy Image Url';
22
22
  const CopyLink = 'Copy Link';
23
+ const Created = 'Created';
23
24
  const Details$1 = 'Details';
24
25
  const Disable$1 = 'Disable';
25
26
  const Elements = 'Elements';
@@ -214,6 +215,9 @@ const identifier = () => {
214
215
  const version = () => {
215
216
  return i18nString(Version);
216
217
  };
218
+ const created = () => {
219
+ return i18nString(Created);
220
+ };
217
221
  const lastUpdated = () => {
218
222
  return i18nString(LastUpdated);
219
223
  };
@@ -2492,6 +2496,9 @@ const enable2 = (id, platform) => {
2492
2496
  const disable2 = (id, platform) => {
2493
2497
  return invoke$4(`Extensions.disable2`, id, platform);
2494
2498
  };
2499
+ const getLanguages = (platform, assetDir) => {
2500
+ return invoke$4('Extensions.getLanguages', platform, assetDir);
2501
+ };
2495
2502
 
2496
2503
  const {
2497
2504
  invoke: invoke$3,
@@ -3417,6 +3424,7 @@ const create = (uid, uri, x, y, width, height, platform, assetDir) => {
3417
3424
  changelogVirtualDom: [],
3418
3425
  commands: [],
3419
3426
  commit: '',
3427
+ created: null,
3420
3428
  currentColorThemeId: '',
3421
3429
  description: '',
3422
3430
  detailsVirtualDom: [],
@@ -3439,6 +3447,7 @@ const create = (uid, uri, x, y, width, height, platform, assetDir) => {
3439
3447
  initial: true,
3440
3448
  installationEntries: [],
3441
3449
  jsonValidation: [],
3450
+ languages: [],
3442
3451
  lastUpdated: null,
3443
3452
  linkProtectionEnabled: false,
3444
3453
  locationHost: '',
@@ -4070,6 +4079,42 @@ const getSideBarWidth = width => {
4070
4079
  return Math.max(175 + Math.round(20 * (width / 100)), Math.round(width / 4));
4071
4080
  };
4072
4081
 
4082
+ const getStringArray = value => {
4083
+ if (!Array.isArray(value)) {
4084
+ return undefined;
4085
+ }
4086
+ return value.filter(item => typeof item === 'string');
4087
+ };
4088
+ const toSyntaxLanguage = value => {
4089
+ if (!value || typeof value !== 'object') {
4090
+ return undefined;
4091
+ }
4092
+ const language = value;
4093
+ if (typeof language.id !== 'string' || typeof language.tokenize !== 'string') {
4094
+ return undefined;
4095
+ }
4096
+ return {
4097
+ aliases: getStringArray(language.aliases),
4098
+ extensions: getStringArray(language.extensions),
4099
+ id: language.id,
4100
+ tokenize: language.tokenize
4101
+ };
4102
+ };
4103
+ const getSyntaxLanguages = async (platform, assetDir) => {
4104
+ try {
4105
+ const languages = await getLanguages(platform, assetDir);
4106
+ if (!Array.isArray(languages)) {
4107
+ return [];
4108
+ }
4109
+ return languages.flatMap(language => {
4110
+ const syntaxLanguage = toSyntaxLanguage(language);
4111
+ return syntaxLanguage ? [syntaxLanguage] : [];
4112
+ });
4113
+ } catch {
4114
+ return [];
4115
+ }
4116
+ };
4117
+
4073
4118
  const getTabs = (selectedTab, hasReadme, hasFeatures, hasChangelog) => {
4074
4119
  const tabs = [{
4075
4120
  enabled: hasReadme,
@@ -4419,6 +4464,39 @@ const getFolderSize = async uri => {
4419
4464
  }
4420
4465
  };
4421
4466
 
4467
+ const minute = 60 * 1000;
4468
+ const hour = 60 * minute;
4469
+ const day = 24 * hour;
4470
+ const month = 30 * day;
4471
+ const year = 365 * day;
4472
+ const relativeTimeFormat = new Intl.RelativeTimeFormat(undefined, {
4473
+ numeric: 'always'
4474
+ });
4475
+ const getRelativeValue = diff => {
4476
+ const absoluteDiff = Math.abs(diff);
4477
+ if (absoluteDiff >= year) {
4478
+ return [Math.trunc(diff / year), 'year'];
4479
+ }
4480
+ if (absoluteDiff >= month) {
4481
+ return [Math.trunc(diff / month), 'month'];
4482
+ }
4483
+ if (absoluteDiff >= day) {
4484
+ return [Math.trunc(diff / day), 'day'];
4485
+ }
4486
+ if (absoluteDiff >= hour) {
4487
+ return [Math.trunc(diff / hour), 'hour'];
4488
+ }
4489
+ return [Math.trunc(diff / minute), 'minute'];
4490
+ };
4491
+ const formatCreated = (created, now = Date.now()) => {
4492
+ if (created === null || !Number.isFinite(created)) {
4493
+ return 'n/a';
4494
+ }
4495
+ const diff = created - now;
4496
+ const [value, unit] = getRelativeValue(diff);
4497
+ return relativeTimeFormat.format(value, unit);
4498
+ };
4499
+
4422
4500
  const formatLastUpdated = lastUpdated => {
4423
4501
  if (lastUpdated === null) {
4424
4502
  return 'n/a';
@@ -4450,22 +4528,38 @@ const getSizeEntries = (showSizeLink, displaySize, extensionUri) => {
4450
4528
  }];
4451
4529
  };
4452
4530
 
4453
- const getInstallationEntries = (displaySize, extensionId, extensionVersion, extensionUri, showSizeLink, lastUpdated$1) => {
4531
+ const addOddEntries = entries => {
4532
+ return entries.map((entry, index) => {
4533
+ if (index % 2 === 0) {
4534
+ return {
4535
+ ...entry,
4536
+ odd: true
4537
+ };
4538
+ }
4539
+ return entry;
4540
+ });
4541
+ };
4542
+ const getInstallationEntries = (displaySize, extensionId, extensionVersion, extensionUri, showSizeLink, created$1, lastUpdated$1) => {
4454
4543
  const entries = [{
4455
4544
  code: true,
4456
4545
  key: identifier(),
4457
- odd: true,
4458
4546
  value: extensionId
4459
4547
  }, {
4460
4548
  code: true,
4461
4549
  key: version(),
4462
4550
  value: extensionVersion
4463
- }, {
4551
+ }];
4552
+ if (created$1 !== null) {
4553
+ entries.push({
4554
+ key: created(),
4555
+ value: formatCreated(created$1)
4556
+ });
4557
+ }
4558
+ entries.push({
4464
4559
  key: lastUpdated(),
4465
- odd: true,
4466
4560
  value: formatLastUpdated(lastUpdated$1)
4467
- }, ...getSizeEntries(showSizeLink, displaySize, extensionUri)];
4468
- return entries;
4561
+ }, ...getSizeEntries(showSizeLink, displaySize, extensionUri));
4562
+ return addOddEntries(entries);
4469
4563
  };
4470
4564
 
4471
4565
  const getMarketplaceEntries = isBuiltin => {
@@ -4566,10 +4660,10 @@ const getResources = (isBuiltin, extension) => {
4566
4660
  return rawResources.filter(resource => resource.enabled);
4567
4661
  };
4568
4662
 
4569
- const loadSideBarContent = async (extensionId, extensionVersion, extensionUri, isBuiltin, extension, showSizeLink, lastUpdated) => {
4663
+ const loadSideBarContent = async (extensionId, extensionVersion, extensionUri, isBuiltin, extension, showSizeLink, created, lastUpdated) => {
4570
4664
  const folderSize = await getFolderSize(extensionUri);
4571
4665
  const displaySize = getDisplaySize(folderSize);
4572
- const installationEntries = getInstallationEntries(displaySize, extensionId, extensionVersion, extensionUri, showSizeLink, lastUpdated);
4666
+ const installationEntries = getInstallationEntries(displaySize, extensionId, extensionVersion, extensionUri, showSizeLink, created, lastUpdated);
4573
4667
  const marketplaceEntries = getMarketplaceEntries(isBuiltin);
4574
4668
  const categories = getCategories(extension);
4575
4669
  const resources = getResources(isBuiltin, extension);
@@ -4583,6 +4677,23 @@ const loadSideBarContent = async (extensionId, extensionVersion, extensionUri, i
4583
4677
  };
4584
4678
  };
4585
4679
 
4680
+ const parseCreated = extension => {
4681
+ if (!extension || typeof extension !== 'object') {
4682
+ return null;
4683
+ }
4684
+ const {
4685
+ created
4686
+ } = extension;
4687
+ if (typeof created !== 'string' || created === '') {
4688
+ return null;
4689
+ }
4690
+ const timestamp = Date.parse(created);
4691
+ if (!Number.isFinite(timestamp)) {
4692
+ return null;
4693
+ }
4694
+ return timestamp;
4695
+ };
4696
+
4586
4697
  const parseLastUpdated = extension => {
4587
4698
  if (!extension || typeof extension !== 'object') {
4588
4699
  return null;
@@ -4671,6 +4782,7 @@ const loadContent = async (state, platform, savedState, isTest = false) => {
4671
4782
  }
4672
4783
  const currentColorThemeId = await getCurrentColorTheme();
4673
4784
  const commit = await getCommit();
4785
+ const languages = await getSyntaxLanguages(platform, state.assetDir);
4674
4786
  const headerData = loadHeaderContent(state, platform, extension);
4675
4787
  const {
4676
4788
  badge,
@@ -4695,6 +4807,7 @@ const loadContent = async (state, platform, savedState, isTest = false) => {
4695
4807
  const readmeHtml = await renderMarkdown(readmeContent, {
4696
4808
  baseUrl,
4697
4809
  commit,
4810
+ languages,
4698
4811
  linksExternal: true,
4699
4812
  locationProtocol
4700
4813
  });
@@ -4719,6 +4832,7 @@ const loadContent = async (state, platform, savedState, isTest = false) => {
4719
4832
  const enabledTabs = tabs.filter(isEnabled);
4720
4833
  const sizeValue = getViewletSize(width || 0);
4721
4834
  const showSizeLink = platform !== Web$1;
4835
+ const created = parseCreated(extension);
4722
4836
  const lastUpdated = parseLastUpdated(extension);
4723
4837
  const {
4724
4838
  categories,
@@ -4727,7 +4841,7 @@ const loadContent = async (state, platform, savedState, isTest = false) => {
4727
4841
  installationEntries,
4728
4842
  marketplaceEntries,
4729
4843
  resources
4730
- } = await loadSideBarContent(extensionId, extensionVersion, extensionUri, isBuiltin, extension, showSizeLink, lastUpdated);
4844
+ } = await loadSideBarContent(extensionId, extensionVersion, extensionUri, isBuiltin, extension, showSizeLink, created, lastUpdated);
4731
4845
  const padding = getPadding(width);
4732
4846
  const sideBarWidth = getSideBarWidth(width);
4733
4847
  const showSideBar = sideBarWidth > 0;
@@ -4740,6 +4854,7 @@ const loadContent = async (state, platform, savedState, isTest = false) => {
4740
4854
  categories,
4741
4855
  changelogScrollTop,
4742
4856
  commit,
4857
+ created,
4743
4858
  currentColorThemeId,
4744
4859
  description,
4745
4860
  detailsVirtualDom,
@@ -4757,6 +4872,7 @@ const loadContent = async (state, platform, savedState, isTest = false) => {
4757
4872
  iconSrc,
4758
4873
  initial: false,
4759
4874
  installationEntries,
4875
+ languages,
4760
4876
  lastUpdated,
4761
4877
  linkProtectionEnabled,
4762
4878
  locationHost,
@@ -4980,12 +5096,14 @@ const selectTabChangelog = async state => {
4980
5096
  const {
4981
5097
  baseUrl,
4982
5098
  extension,
5099
+ languages,
4983
5100
  locationProtocol,
4984
5101
  tabs
4985
5102
  } = state;
4986
5103
  const changelogContent = await loadChangelogContent(extension.path); // TODO use uri
4987
5104
  const changelogMarkdownHtml = await renderMarkdown(changelogContent, {
4988
5105
  baseUrl,
5106
+ languages,
4989
5107
  locationProtocol
4990
5108
  });
4991
5109
  const changelogDom = await getMarkdownVirtualDom(changelogMarkdownHtml);
@@ -5010,6 +5128,7 @@ const selectTabDefault = async state => {
5010
5128
  const selectTabDetails = async state => {
5011
5129
  const {
5012
5130
  baseUrl,
5131
+ languages,
5013
5132
  locationProtocol,
5014
5133
  readmeUrl,
5015
5134
  tabs
@@ -5017,6 +5136,7 @@ const selectTabDetails = async state => {
5017
5136
  const readmeContent = await loadReadmeContent(readmeUrl);
5018
5137
  const readmeHtml = await renderMarkdown(readmeContent, {
5019
5138
  baseUrl,
5139
+ languages,
5020
5140
  linksExternal: true,
5021
5141
  locationProtocol
5022
5142
  });
@@ -5102,6 +5222,7 @@ const handleTabsClick = (state, name) => {
5102
5222
 
5103
5223
  const hideSizeLink = state => {
5104
5224
  const {
5225
+ created,
5105
5226
  displaySize,
5106
5227
  extensionId,
5107
5228
  extensionUri,
@@ -5109,7 +5230,7 @@ const hideSizeLink = state => {
5109
5230
  lastUpdated
5110
5231
  } = state;
5111
5232
  const newShowSizeLink = false;
5112
- const installationEntries = getInstallationEntries(displaySize, extensionId, extensionVersion, extensionUri, newShowSizeLink, lastUpdated);
5233
+ const installationEntries = getInstallationEntries(displaySize, extensionId, extensionVersion, extensionUri, newShowSizeLink, created, lastUpdated);
5113
5234
  return {
5114
5235
  ...state,
5115
5236
  installationEntries,
@@ -5338,7 +5459,7 @@ const getExtraProps = (title, onClick) => {
5338
5459
  props.title = title;
5339
5460
  }
5340
5461
  if (onClick) {
5341
- props.style = 'cursor: pointer';
5462
+ props.style = 'color: var(--vscode-textLink-foreground, #3794ff); cursor: pointer; text-decoration: none';
5342
5463
  props.tabIndex = 0;
5343
5464
  }
5344
5465
  return props;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/extension-detail-view",
3
- "version": "7.8.0",
3
+ "version": "7.10.0",
4
4
  "description": "Extension Detail View Worker",
5
5
  "repository": {
6
6
  "type": "git",