material-icon-theme 4.14.0 → 4.16.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.
Files changed (185) hide show
  1. package/.eslintrc.json +51 -51
  2. package/.github/FUNDING.yml +3 -3
  3. package/.github/ISSUE_TEMPLATE/bug_report.md +34 -34
  4. package/.github/ISSUE_TEMPLATE/icon_request.md +27 -27
  5. package/.github/workflows/build.yml +45 -45
  6. package/.github/workflows/color-check.yml +22 -22
  7. package/.github/workflows/release.yml +73 -73
  8. package/.prettierrc +7 -7
  9. package/.vscode/extensions.json +3 -3
  10. package/.vscode/launch.json +43 -43
  11. package/.vscode/settings.json +14 -14
  12. package/.vscode/tasks.json +32 -32
  13. package/.vscodeignore +20 -20
  14. package/CHANGELOG.md +1135 -1101
  15. package/CONTRIBUTING.md +62 -62
  16. package/LICENSE.md +8 -8
  17. package/README.md +209 -209
  18. package/build/web-extension.webpack.config.js +62 -62
  19. package/build/webpack.config.js +39 -39
  20. package/changelog.config.json +4 -4
  21. package/icons/astyle.svg +4 -4
  22. package/icons/blitz.svg +4 -4
  23. package/icons/cypress.svg +4 -4
  24. package/icons/dependabot.svg +4 -4
  25. package/icons/dinophp.svg +16 -16
  26. package/icons/figma.svg +10 -10
  27. package/icons/folder-angular-open.svg +2 -2
  28. package/icons/folder-angular.svg +2 -2
  29. package/icons/folder-cypress-open.svg +5 -5
  30. package/icons/folder-cypress.svg +5 -5
  31. package/icons/folder-java-open.svg +2 -2
  32. package/icons/folder-java.svg +2 -2
  33. package/icons/folder-next-open.svg +2 -2
  34. package/icons/folder-next.svg +2 -2
  35. package/icons/folder-queue-open.svg +2 -2
  36. package/icons/folder-queue.svg +2 -2
  37. package/icons/folder-resolver-open.svg +2 -2
  38. package/icons/folder-resolver.svg +2 -2
  39. package/icons/folder-serverless-open.svg +5 -5
  40. package/icons/folder-serverless.svg +5 -5
  41. package/icons/folder-target-open.svg +2 -2
  42. package/icons/folder-target.svg +2 -2
  43. package/icons/folder-unity-open.svg +2 -0
  44. package/icons/folder-unity.svg +2 -0
  45. package/icons/folder-vercel-open.svg +4 -4
  46. package/icons/folder-vercel.svg +4 -4
  47. package/icons/gleam.svg +4 -4
  48. package/icons/gridsome.svg +4 -4
  49. package/icons/hardhat.svg +3 -3
  50. package/icons/lighthouse.svg +2 -2
  51. package/icons/ndst.svg +7 -7
  52. package/icons/next.svg +3 -3
  53. package/icons/next_light.svg +2 -2
  54. package/icons/odin.svg +6 -6
  55. package/icons/parcel.svg +4 -4
  56. package/icons/playwright.svg +7 -7
  57. package/icons/pnpm.svg +9 -9
  58. package/icons/pnpm_light.svg +7 -7
  59. package/icons/poetry.svg +1 -0
  60. package/icons/processing.svg +10 -1
  61. package/icons/remix.svg +4 -4
  62. package/icons/remix_light.svg +4 -4
  63. package/icons/rome.svg +5 -5
  64. package/icons/serverless.svg +4 -4
  65. package/icons/siyuan.svg +9 -9
  66. package/icons/steadybit.svg +1 -0
  67. package/icons/svgr.svg +4 -4
  68. package/icons/tauri.svg +9 -9
  69. package/icons/template.svg +4 -4
  70. package/icons/tobi.svg +4 -4
  71. package/icons/tobimake.svg +14 -14
  72. package/icons/turborepo.svg +12 -0
  73. package/icons/turborepo_light.svg +12 -0
  74. package/images/contributors.png +0 -0
  75. package/images/fileIcons.png +0 -0
  76. package/images/folderIcons.png +0 -0
  77. package/logo.svg +21 -21
  78. package/material-colors.yml +257 -257
  79. package/package.json +264 -264
  80. package/package.nls.de.json +35 -35
  81. package/package.nls.es.json +32 -32
  82. package/package.nls.fr.json +32 -32
  83. package/package.nls.ja.json +35 -35
  84. package/package.nls.json +35 -35
  85. package/package.nls.nl.json +35 -35
  86. package/package.nls.pl.json +35 -35
  87. package/package.nls.pt-BR.json +32 -32
  88. package/package.nls.pt-PT.json +32 -32
  89. package/package.nls.ru.json +32 -32
  90. package/package.nls.zh-CN.json +32 -32
  91. package/package.nls.zh-TW.json +32 -32
  92. package/src/commands/activate.ts +26 -26
  93. package/src/commands/explorerArrows.ts +55 -55
  94. package/src/commands/folderColor.ts +96 -96
  95. package/src/commands/folders.ts +55 -55
  96. package/src/commands/grayscale.ts +55 -55
  97. package/src/commands/iconPacks.ts +68 -68
  98. package/src/commands/index.ts +30 -30
  99. package/src/commands/opacity.ts +46 -46
  100. package/src/commands/restoreConfig.ts +14 -14
  101. package/src/commands/saturation.ts +46 -46
  102. package/src/extension.ts +35 -35
  103. package/src/helpers/changeDetection.ts +68 -68
  104. package/src/helpers/customIcons.ts +8 -8
  105. package/src/helpers/fileConfig.ts +37 -37
  106. package/src/helpers/index.ts +100 -100
  107. package/src/helpers/objects.ts +58 -58
  108. package/src/helpers/types.ts +7 -7
  109. package/src/helpers/versioning.ts +73 -73
  110. package/src/i18n/index.ts +78 -78
  111. package/src/i18n/lang-de.ts +54 -54
  112. package/src/i18n/lang-en.ts +53 -53
  113. package/src/i18n/lang-es.ts +53 -53
  114. package/src/i18n/lang-fr.ts +53 -53
  115. package/src/i18n/lang-ja.ts +54 -54
  116. package/src/i18n/lang-nl.ts +54 -54
  117. package/src/i18n/lang-pl.ts +52 -52
  118. package/src/i18n/lang-pt-br.ts +53 -53
  119. package/src/i18n/lang-pt-pt.ts +53 -53
  120. package/src/i18n/lang-ru.ts +52 -52
  121. package/src/i18n/lang-uk.ts +54 -54
  122. package/src/i18n/lang-zh-cn.ts +52 -52
  123. package/src/i18n/lang-zh-tw.ts +52 -52
  124. package/src/icons/fileIcons.ts +1854 -1782
  125. package/src/icons/folderIcons.ts +754 -711
  126. package/src/icons/generator/constants.ts +29 -29
  127. package/src/icons/generator/fileGenerator.ts +216 -216
  128. package/src/icons/generator/folderGenerator.ts +340 -340
  129. package/src/icons/generator/iconOpacity.ts +111 -111
  130. package/src/icons/generator/iconSaturation.ts +140 -140
  131. package/src/icons/generator/index.ts +7 -7
  132. package/src/icons/generator/jsonGenerator.ts +187 -187
  133. package/src/icons/generator/languageGenerator.ts +127 -127
  134. package/src/icons/index.ts +4 -4
  135. package/src/icons/languageIcons.ts +134 -134
  136. package/src/messages/outdated.ts +33 -33
  137. package/src/messages/reload.ts +32 -32
  138. package/src/messages/start.ts +12 -12
  139. package/src/messages/update.ts +48 -48
  140. package/src/messages/welcome.ts +47 -47
  141. package/src/models/helpers/index.ts +1 -1
  142. package/src/models/helpers/themeStatus.ts +5 -5
  143. package/src/models/i18n/index.ts +1 -1
  144. package/src/models/i18n/translation.ts +50 -50
  145. package/src/models/iconConfiguration.ts +37 -37
  146. package/src/models/icons/defaultIcon.ts +16 -16
  147. package/src/models/icons/files/fileIcon.ts +49 -49
  148. package/src/models/icons/files/fileTypes.ts +14 -14
  149. package/src/models/icons/files/index.ts +2 -2
  150. package/src/models/icons/folders/folderIcon.ts +34 -34
  151. package/src/models/icons/folders/folderTheme.ts +23 -23
  152. package/src/models/icons/folders/index.ts +2 -2
  153. package/src/models/icons/iconJsonOptions.ts +23 -23
  154. package/src/models/icons/iconPack.ts +12 -12
  155. package/src/models/icons/index.ts +6 -6
  156. package/src/models/icons/languages/index.ts +1 -1
  157. package/src/models/icons/languages/languageIdentifier.ts +26 -26
  158. package/src/models/index.ts +4 -4
  159. package/src/models/scripts/contributors/contributor.ts +22 -22
  160. package/src/models/scripts/contributors/contributorsConfig.ts +10 -10
  161. package/src/scripts/contributors/contributors.css +24 -24
  162. package/src/scripts/contributors/index.ts +138 -138
  163. package/src/scripts/helpers/painter.ts +5 -5
  164. package/src/scripts/helpers/screenshots.ts +32 -32
  165. package/src/scripts/helpers/similarity.ts +47 -47
  166. package/src/scripts/helpers/titleCase.ts +7 -7
  167. package/src/scripts/icons/checks/checkIconAvailability.ts +215 -215
  168. package/src/scripts/icons/checks/checkIconConflicts.ts +154 -154
  169. package/src/scripts/icons/checks/checkIconUsage.ts +141 -141
  170. package/src/scripts/icons/checks/index.ts +7 -7
  171. package/src/scripts/icons/generateJson.ts +11 -11
  172. package/src/scripts/preview/index.ts +40 -40
  173. package/src/scripts/preview/preview.ts +165 -165
  174. package/src/scripts/preview/style.css +48 -48
  175. package/src/test/runTest.ts +26 -26
  176. package/src/test/spec/i18n/i18n.spec.ts +61 -61
  177. package/src/test/spec/icons/fileIcons.spec.ts +250 -250
  178. package/src/test/spec/icons/folderIcons.spec.ts +418 -418
  179. package/src/test/spec/icons/languageIcons.spec.ts +184 -184
  180. package/src/test/spec/index.ts +36 -36
  181. package/src/web/extension.ts +10 -10
  182. package/svgo.config.js +11 -11
  183. package/tsconfig.json +23 -23
  184. package/.github/workflows/greetings.yml +0 -17
  185. package/icons/processing_light.svg +0 -1
@@ -1,154 +1,154 @@
1
- import * as painter from '../../helpers/painter';
2
- import { fileIcons, folderIcons, languageIcons } from './../../../icons';
3
-
4
- /**
5
- * Store all icons that are wrong configured
6
- */
7
- const allConflicts: {
8
- fileIcons: {
9
- fileExtensions: Record<string, string[]>;
10
- fileNames: Record<string, string[]>;
11
- };
12
- folderIcons: Record<string, string[]>;
13
- languageIcons: Record<string, string[]>;
14
- } = {
15
- fileIcons: {
16
- fileExtensions: {},
17
- fileNames: {},
18
- },
19
- folderIcons: {},
20
- languageIcons: {},
21
- };
22
-
23
- export const check = () => {
24
- checkFolderIcons();
25
- checkFileIcons();
26
- checkLanguageIcons();
27
-
28
- handleErrors();
29
- };
30
-
31
- const checkFileIcons = () => {
32
- checkForConflictsInFileIcons('fileExtensions');
33
- checkForConflictsInFileIcons('fileNames');
34
- };
35
-
36
- const checkForConflictsInFileIcons = (
37
- fileIconDefinitionType: 'fileExtensions' | 'fileNames'
38
- ) => {
39
- const icons: Record<string, string> = {};
40
- fileIcons.icons.forEach((icon) => {
41
- if (!icon[fileIconDefinitionType]) return;
42
- (icon[fileIconDefinitionType] ?? [])
43
- .map((d) => d.toLowerCase())
44
- .forEach((definition) => {
45
- if (
46
- !icons[definition] ||
47
- (icon.enabledFor && icon.enabledFor.length > 0)
48
- ) {
49
- icons[definition] = icon.name;
50
- } else {
51
- if (!allConflicts.fileIcons[fileIconDefinitionType][definition]) {
52
- allConflicts.fileIcons[fileIconDefinitionType][definition] = [
53
- icons[definition],
54
- icon.name,
55
- ];
56
- } else {
57
- allConflicts.fileIcons[fileIconDefinitionType][definition].push(
58
- icon.name
59
- );
60
- }
61
- }
62
- });
63
- });
64
- };
65
-
66
- const checkFolderIcons = () => {
67
- folderIcons.forEach((theme) => {
68
- if (!theme.icons) return;
69
- const icons: Record<string, string> = {};
70
- theme.icons.forEach((icon) => {
71
- icon.folderNames
72
- .map((f) => f.toLowerCase())
73
- .forEach((folderName) => {
74
- if (
75
- !icons[folderName] ||
76
- (icon.enabledFor && icon.enabledFor.length > 0)
77
- ) {
78
- icons[folderName] = icon.name;
79
- } else {
80
- if (!allConflicts.folderIcons[folderName]) {
81
- allConflicts.folderIcons[folderName] = [
82
- icons[folderName],
83
- icon.name,
84
- ];
85
- } else {
86
- allConflicts.folderIcons[folderName].push(icon.name);
87
- }
88
- }
89
- });
90
- });
91
- });
92
- };
93
-
94
- const checkLanguageIcons = () => {
95
- const icons: Record<string, string> = {};
96
- languageIcons.forEach((langIcon) => {
97
- langIcon.ids
98
- .map((id) => id.toLowerCase())
99
- .forEach((id) => {
100
- if (!icons[id]) {
101
- icons[id] = langIcon.icon.name;
102
- } else {
103
- if (!allConflicts.languageIcons[id]) {
104
- allConflicts.languageIcons[id] = [icons[id], langIcon.icon.name];
105
- } else {
106
- allConflicts.languageIcons[id].push(langIcon.icon.name);
107
- }
108
- }
109
- });
110
- });
111
- };
112
-
113
- const handleErrors = () => {
114
- if (
115
- [
116
- ...Object.keys(allConflicts.fileIcons.fileExtensions),
117
- ...Object.keys(allConflicts.fileIcons.fileNames),
118
- ...Object.keys(allConflicts.folderIcons),
119
- ...Object.keys(allConflicts.languageIcons),
120
- ].length > 0
121
- ) {
122
- console.log('> Material Icon Theme:', painter.red('Icon conflicts:'));
123
- console.log(painter.red('--------------------------------------'));
124
-
125
- printErrorMessage(allConflicts.fileIcons.fileExtensions, 'fileExtension');
126
- printErrorMessage(allConflicts.fileIcons.fileNames, 'fileName');
127
- printErrorMessage(allConflicts.folderIcons, 'folderName');
128
- printErrorMessage(allConflicts.languageIcons, 'languageId');
129
-
130
- console.log(
131
- '\n' + painter.red('Please check the wrong icon configurations!\n')
132
- );
133
- process.exit(1);
134
- } else {
135
- console.log(
136
- '> Material Icon Theme:',
137
- painter.green('Passed icon conflict checks!')
138
- );
139
- }
140
- };
141
-
142
- const printErrorMessage = (icons: any, definitionType: string) => {
143
- const keys = Object.keys(icons);
144
- keys.forEach((key) => {
145
- const conflictIcons = icons[key];
146
- console.log(
147
- painter.red(
148
- `For ${definitionType} "${key}" are ${
149
- conflictIcons.length
150
- } icons defined: [${conflictIcons.join(', ')}]`
151
- )
152
- );
153
- });
154
- };
1
+ import * as painter from '../../helpers/painter';
2
+ import { fileIcons, folderIcons, languageIcons } from './../../../icons';
3
+
4
+ /**
5
+ * Store all icons that are wrong configured
6
+ */
7
+ const allConflicts: {
8
+ fileIcons: {
9
+ fileExtensions: Record<string, string[]>;
10
+ fileNames: Record<string, string[]>;
11
+ };
12
+ folderIcons: Record<string, string[]>;
13
+ languageIcons: Record<string, string[]>;
14
+ } = {
15
+ fileIcons: {
16
+ fileExtensions: {},
17
+ fileNames: {},
18
+ },
19
+ folderIcons: {},
20
+ languageIcons: {},
21
+ };
22
+
23
+ export const check = () => {
24
+ checkFolderIcons();
25
+ checkFileIcons();
26
+ checkLanguageIcons();
27
+
28
+ handleErrors();
29
+ };
30
+
31
+ const checkFileIcons = () => {
32
+ checkForConflictsInFileIcons('fileExtensions');
33
+ checkForConflictsInFileIcons('fileNames');
34
+ };
35
+
36
+ const checkForConflictsInFileIcons = (
37
+ fileIconDefinitionType: 'fileExtensions' | 'fileNames'
38
+ ) => {
39
+ const icons: Record<string, string> = {};
40
+ fileIcons.icons.forEach((icon) => {
41
+ if (!icon[fileIconDefinitionType]) return;
42
+ (icon[fileIconDefinitionType] ?? [])
43
+ .map((d) => d.toLowerCase())
44
+ .forEach((definition) => {
45
+ if (
46
+ !icons[definition] ||
47
+ (icon.enabledFor && icon.enabledFor.length > 0)
48
+ ) {
49
+ icons[definition] = icon.name;
50
+ } else {
51
+ if (!allConflicts.fileIcons[fileIconDefinitionType][definition]) {
52
+ allConflicts.fileIcons[fileIconDefinitionType][definition] = [
53
+ icons[definition],
54
+ icon.name,
55
+ ];
56
+ } else {
57
+ allConflicts.fileIcons[fileIconDefinitionType][definition].push(
58
+ icon.name
59
+ );
60
+ }
61
+ }
62
+ });
63
+ });
64
+ };
65
+
66
+ const checkFolderIcons = () => {
67
+ folderIcons.forEach((theme) => {
68
+ if (!theme.icons) return;
69
+ const icons: Record<string, string> = {};
70
+ theme.icons.forEach((icon) => {
71
+ icon.folderNames
72
+ .map((f) => f.toLowerCase())
73
+ .forEach((folderName) => {
74
+ if (
75
+ !icons[folderName] ||
76
+ (icon.enabledFor && icon.enabledFor.length > 0)
77
+ ) {
78
+ icons[folderName] = icon.name;
79
+ } else {
80
+ if (!allConflicts.folderIcons[folderName]) {
81
+ allConflicts.folderIcons[folderName] = [
82
+ icons[folderName],
83
+ icon.name,
84
+ ];
85
+ } else {
86
+ allConflicts.folderIcons[folderName].push(icon.name);
87
+ }
88
+ }
89
+ });
90
+ });
91
+ });
92
+ };
93
+
94
+ const checkLanguageIcons = () => {
95
+ const icons: Record<string, string> = {};
96
+ languageIcons.forEach((langIcon) => {
97
+ langIcon.ids
98
+ .map((id) => id.toLowerCase())
99
+ .forEach((id) => {
100
+ if (!icons[id]) {
101
+ icons[id] = langIcon.icon.name;
102
+ } else {
103
+ if (!allConflicts.languageIcons[id]) {
104
+ allConflicts.languageIcons[id] = [icons[id], langIcon.icon.name];
105
+ } else {
106
+ allConflicts.languageIcons[id].push(langIcon.icon.name);
107
+ }
108
+ }
109
+ });
110
+ });
111
+ };
112
+
113
+ const handleErrors = () => {
114
+ if (
115
+ [
116
+ ...Object.keys(allConflicts.fileIcons.fileExtensions),
117
+ ...Object.keys(allConflicts.fileIcons.fileNames),
118
+ ...Object.keys(allConflicts.folderIcons),
119
+ ...Object.keys(allConflicts.languageIcons),
120
+ ].length > 0
121
+ ) {
122
+ console.log('> Material Icon Theme:', painter.red('Icon conflicts:'));
123
+ console.log(painter.red('--------------------------------------'));
124
+
125
+ printErrorMessage(allConflicts.fileIcons.fileExtensions, 'fileExtension');
126
+ printErrorMessage(allConflicts.fileIcons.fileNames, 'fileName');
127
+ printErrorMessage(allConflicts.folderIcons, 'folderName');
128
+ printErrorMessage(allConflicts.languageIcons, 'languageId');
129
+
130
+ console.log(
131
+ '\n' + painter.red('Please check the wrong icon configurations!\n')
132
+ );
133
+ process.exit(1);
134
+ } else {
135
+ console.log(
136
+ '> Material Icon Theme:',
137
+ painter.green('Passed icon conflict checks!')
138
+ );
139
+ }
140
+ };
141
+
142
+ const printErrorMessage = (icons: any, definitionType: string) => {
143
+ const keys = Object.keys(icons);
144
+ keys.forEach((key) => {
145
+ const conflictIcons = icons[key];
146
+ console.log(
147
+ painter.red(
148
+ `For ${definitionType} "${key}" are ${
149
+ conflictIcons.length
150
+ } icons defined: [${conflictIcons.join(', ')}]`
151
+ )
152
+ );
153
+ });
154
+ };
@@ -1,141 +1,141 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
3
- import { DefaultIcon, FolderIcon, FolderTheme } from '../../../models/index';
4
- import {
5
- fileIcons,
6
- folderIcons,
7
- highContrastColorFileEnding,
8
- languageIcons,
9
- lightColorFileEnding,
10
- openedFolder,
11
- } from './../../../icons';
12
- import * as painter from './../../helpers/painter';
13
-
14
- /**
15
- * Defines the folder where all icon files are located.
16
- */
17
- const folderPath = path.join('icons');
18
-
19
- /**
20
- * Defines an array with all icons that can be found in the file system.
21
- */
22
- const availableIcons: { [s: string]: string } = {};
23
-
24
- /**
25
- * Get all icon file names from the file system.
26
- */
27
- const fsReadAllIconFiles = (
28
- error: NodeJS.ErrnoException | null,
29
- files: string[]
30
- ) => {
31
- if (error) {
32
- throw Error(error.message);
33
- }
34
-
35
- files.forEach((file) => {
36
- const fileName = file;
37
- const iconName = path.parse(file).name;
38
- availableIcons[iconName] = fileName;
39
- });
40
-
41
- checkUsageOfAllIcons();
42
- handleErrors();
43
- };
44
-
45
- const checkUsageOfAllIcons = () => {
46
- const usedFileIcons: string[] = getAllUsedFileIcons();
47
- const usedFolderIcons: string[] = getAllUsedFolderIcons();
48
- const usedLanguageIcons: string[] = getAllUsedLanguageIcons();
49
-
50
- [...usedFileIcons, ...usedFolderIcons, ...usedLanguageIcons].forEach(
51
- (icon) => {
52
- delete availableIcons[icon];
53
- }
54
- );
55
- };
56
-
57
- const handleErrors = () => {
58
- const amountOfUnusedIcons = Object.keys(availableIcons).length;
59
- if (amountOfUnusedIcons === 0) {
60
- console.log(
61
- '> Material Icon Theme:',
62
- painter.green('Passed icon usage checks!')
63
- );
64
- } else {
65
- console.log(
66
- '> Material Icon Theme: ' +
67
- painter.red(`${amountOfUnusedIcons} unused icon(s):`)
68
- );
69
- Object.keys(availableIcons).forEach((icon) => {
70
- console.log(painter.red(`- ${availableIcons[icon]}`));
71
- });
72
- throw new Error('Found unused icon files!');
73
- }
74
- };
75
-
76
- // read from the file system
77
- export const check = () => fs.readdir(folderPath, fsReadAllIconFiles);
78
-
79
- const getAllUsedFileIcons = (): string[] => {
80
- return [
81
- fileIcons.defaultIcon.name,
82
- fileIcons.defaultIcon.light
83
- ? fileIcons.defaultIcon.name + lightColorFileEnding
84
- : '',
85
- fileIcons.defaultIcon.highContrast
86
- ? fileIcons.defaultIcon.name + highContrastColorFileEnding
87
- : '',
88
- ...fileIcons.icons.map((icon) => icon.name),
89
- ...fileIcons.icons
90
- .filter((icon) => icon.light)
91
- .map((icon) => icon.name + lightColorFileEnding),
92
- ...fileIcons.icons
93
- .filter((icon) => icon.highContrast)
94
- .map((icon) => icon.name + highContrastColorFileEnding),
95
- ].filter((f) => f !== '');
96
- };
97
-
98
- const getAllUsedFolderIcons = (): string[] => {
99
- const icons = folderIcons
100
- .map((theme) => (theme.name === 'none' ? [] : getAllFolderIcons(theme)))
101
- .reduce((a, b) => a.concat(b));
102
- return icons
103
- .map((icon) => {
104
- return [
105
- icon.name,
106
- icon.name + openedFolder,
107
- icon.light ? icon.name + lightColorFileEnding : '',
108
- icon.light ? icon.name + openedFolder + lightColorFileEnding : '',
109
- icon.highContrast ? icon.name + highContrastColorFileEnding : '',
110
- icon.highContrast
111
- ? icon.name + openedFolder + highContrastColorFileEnding
112
- : '',
113
- ];
114
- })
115
- .filter((icon) => icon !== undefined)
116
- .reduce((a, b) => a.concat(b));
117
- };
118
-
119
- const getAllFolderIcons = (
120
- theme: FolderTheme
121
- ): (FolderIcon | DefaultIcon)[] => {
122
- const icons = theme.icons || [];
123
- const allFolderIcons = [theme.defaultIcon, ...icons];
124
- if (theme.rootFolder) {
125
- allFolderIcons.push(theme.rootFolder);
126
- }
127
- return allFolderIcons;
128
- };
129
-
130
- const getAllUsedLanguageIcons = (): string[] => {
131
- const icons = [
132
- ...languageIcons.map((lang) => lang.icon.name),
133
- ...languageIcons
134
- .filter((lang) => lang.icon.light)
135
- .map((lang) => lang.icon.name + lightColorFileEnding),
136
- ...languageIcons
137
- .filter((lang) => lang.icon.highContrast)
138
- .map((lang) => lang.icon.name + highContrastColorFileEnding),
139
- ];
140
- return icons;
141
- };
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { DefaultIcon, FolderIcon, FolderTheme } from '../../../models/index';
4
+ import {
5
+ fileIcons,
6
+ folderIcons,
7
+ highContrastColorFileEnding,
8
+ languageIcons,
9
+ lightColorFileEnding,
10
+ openedFolder,
11
+ } from './../../../icons';
12
+ import * as painter from './../../helpers/painter';
13
+
14
+ /**
15
+ * Defines the folder where all icon files are located.
16
+ */
17
+ const folderPath = path.join('icons');
18
+
19
+ /**
20
+ * Defines an array with all icons that can be found in the file system.
21
+ */
22
+ const availableIcons: { [s: string]: string } = {};
23
+
24
+ /**
25
+ * Get all icon file names from the file system.
26
+ */
27
+ const fsReadAllIconFiles = (
28
+ error: NodeJS.ErrnoException | null,
29
+ files: string[]
30
+ ) => {
31
+ if (error) {
32
+ throw Error(error.message);
33
+ }
34
+
35
+ files.forEach((file) => {
36
+ const fileName = file;
37
+ const iconName = path.parse(file).name;
38
+ availableIcons[iconName] = fileName;
39
+ });
40
+
41
+ checkUsageOfAllIcons();
42
+ handleErrors();
43
+ };
44
+
45
+ const checkUsageOfAllIcons = () => {
46
+ const usedFileIcons: string[] = getAllUsedFileIcons();
47
+ const usedFolderIcons: string[] = getAllUsedFolderIcons();
48
+ const usedLanguageIcons: string[] = getAllUsedLanguageIcons();
49
+
50
+ [...usedFileIcons, ...usedFolderIcons, ...usedLanguageIcons].forEach(
51
+ (icon) => {
52
+ delete availableIcons[icon];
53
+ }
54
+ );
55
+ };
56
+
57
+ const handleErrors = () => {
58
+ const amountOfUnusedIcons = Object.keys(availableIcons).length;
59
+ if (amountOfUnusedIcons === 0) {
60
+ console.log(
61
+ '> Material Icon Theme:',
62
+ painter.green('Passed icon usage checks!')
63
+ );
64
+ } else {
65
+ console.log(
66
+ '> Material Icon Theme: ' +
67
+ painter.red(`${amountOfUnusedIcons} unused icon(s):`)
68
+ );
69
+ Object.keys(availableIcons).forEach((icon) => {
70
+ console.log(painter.red(`- ${availableIcons[icon]}`));
71
+ });
72
+ throw new Error('Found unused icon files!');
73
+ }
74
+ };
75
+
76
+ // read from the file system
77
+ export const check = () => fs.readdir(folderPath, fsReadAllIconFiles);
78
+
79
+ const getAllUsedFileIcons = (): string[] => {
80
+ return [
81
+ fileIcons.defaultIcon.name,
82
+ fileIcons.defaultIcon.light
83
+ ? fileIcons.defaultIcon.name + lightColorFileEnding
84
+ : '',
85
+ fileIcons.defaultIcon.highContrast
86
+ ? fileIcons.defaultIcon.name + highContrastColorFileEnding
87
+ : '',
88
+ ...fileIcons.icons.map((icon) => icon.name),
89
+ ...fileIcons.icons
90
+ .filter((icon) => icon.light)
91
+ .map((icon) => icon.name + lightColorFileEnding),
92
+ ...fileIcons.icons
93
+ .filter((icon) => icon.highContrast)
94
+ .map((icon) => icon.name + highContrastColorFileEnding),
95
+ ].filter((f) => f !== '');
96
+ };
97
+
98
+ const getAllUsedFolderIcons = (): string[] => {
99
+ const icons = folderIcons
100
+ .map((theme) => (theme.name === 'none' ? [] : getAllFolderIcons(theme)))
101
+ .reduce((a, b) => a.concat(b));
102
+ return icons
103
+ .map((icon) => {
104
+ return [
105
+ icon.name,
106
+ icon.name + openedFolder,
107
+ icon.light ? icon.name + lightColorFileEnding : '',
108
+ icon.light ? icon.name + openedFolder + lightColorFileEnding : '',
109
+ icon.highContrast ? icon.name + highContrastColorFileEnding : '',
110
+ icon.highContrast
111
+ ? icon.name + openedFolder + highContrastColorFileEnding
112
+ : '',
113
+ ];
114
+ })
115
+ .filter((icon) => icon !== undefined)
116
+ .reduce((a, b) => a.concat(b));
117
+ };
118
+
119
+ const getAllFolderIcons = (
120
+ theme: FolderTheme
121
+ ): (FolderIcon | DefaultIcon)[] => {
122
+ const icons = theme.icons || [];
123
+ const allFolderIcons = [theme.defaultIcon, ...icons];
124
+ if (theme.rootFolder) {
125
+ allFolderIcons.push(theme.rootFolder);
126
+ }
127
+ return allFolderIcons;
128
+ };
129
+
130
+ const getAllUsedLanguageIcons = (): string[] => {
131
+ const icons = [
132
+ ...languageIcons.map((lang) => lang.icon.name),
133
+ ...languageIcons
134
+ .filter((lang) => lang.icon.light)
135
+ .map((lang) => lang.icon.name + lightColorFileEnding),
136
+ ...languageIcons
137
+ .filter((lang) => lang.icon.highContrast)
138
+ .map((lang) => lang.icon.name + highContrastColorFileEnding),
139
+ ];
140
+ return icons;
141
+ };
@@ -1,7 +1,7 @@
1
- import * as checkAvailability from './checkIconAvailability';
2
- import * as checkIconConflicts from './checkIconConflicts';
3
- import * as checkIconUsage from './checkIconUsage';
4
-
5
- checkAvailability.check();
6
- checkIconUsage.check();
7
- checkIconConflicts.check();
1
+ import * as checkAvailability from './checkIconAvailability';
2
+ import * as checkIconConflicts from './checkIconConflicts';
3
+ import * as checkIconUsage from './checkIconUsage';
4
+
5
+ checkAvailability.check();
6
+ checkIconUsage.check();
7
+ checkIconConflicts.check();
@@ -1,11 +1,11 @@
1
- /**
2
- * This file is meant to be executed exclusively by npm scripts.
3
- */
4
- import { createIconFile } from './../../icons/index';
5
-
6
- try {
7
- createIconFile();
8
- } catch (error) {
9
- console.error(error);
10
- throw Error('Could not create icon file!');
11
- }
1
+ /**
2
+ * This file is meant to be executed exclusively by npm scripts.
3
+ */
4
+ import { createIconFile } from './../../icons/index';
5
+
6
+ try {
7
+ createIconFile();
8
+ } catch (error) {
9
+ console.error(error);
10
+ throw Error('Could not create icon file!');
11
+ }