material-icon-theme 4.18.0 → 4.18.1

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 (202) 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 +1179 -1171
  15. package/CONTRIBUTING.md +62 -62
  16. package/LICENSE.md +8 -8
  17. package/README.md +208 -208
  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/architecture.svg +4 -4
  22. package/icons/astyle.svg +4 -4
  23. package/icons/auto.svg +10 -0
  24. package/icons/auto_light.svg +10 -0
  25. package/icons/azure.svg +9 -9
  26. package/icons/blitz.svg +4 -4
  27. package/icons/buildkite.svg +8 -8
  28. package/icons/cypress.svg +4 -4
  29. package/icons/dart_generated.svg +9 -9
  30. package/icons/dependabot.svg +4 -4
  31. package/icons/dinophp.svg +16 -16
  32. package/icons/figma.svg +10 -10
  33. package/icons/folder-angular-open.svg +2 -2
  34. package/icons/folder-angular.svg +2 -2
  35. package/icons/folder-buildkite-open.svg +8 -8
  36. package/icons/folder-buildkite.svg +7 -7
  37. package/icons/folder-cypress-open.svg +5 -5
  38. package/icons/folder-cypress.svg +5 -5
  39. package/icons/folder-java-open.svg +2 -2
  40. package/icons/folder-java.svg +2 -2
  41. package/icons/folder-next-open.svg +2 -2
  42. package/icons/folder-next.svg +2 -2
  43. package/icons/folder-nuxt-open.svg +2 -2
  44. package/icons/folder-nuxt.svg +2 -2
  45. package/icons/folder-queue-open.svg +2 -2
  46. package/icons/folder-queue.svg +2 -2
  47. package/icons/folder-resolver-open.svg +2 -2
  48. package/icons/folder-resolver.svg +2 -2
  49. package/icons/folder-serverless-open.svg +5 -5
  50. package/icons/folder-serverless.svg +5 -5
  51. package/icons/folder-shader-open.svg +7 -7
  52. package/icons/folder-shader.svg +6 -6
  53. package/icons/folder-target-open.svg +2 -2
  54. package/icons/folder-target.svg +2 -2
  55. package/icons/folder-unity-open.svg +2 -2
  56. package/icons/folder-unity.svg +2 -2
  57. package/icons/folder-vercel-open.svg +4 -4
  58. package/icons/folder-vercel.svg +4 -4
  59. package/icons/folder-verdaccio-open.svg +8 -8
  60. package/icons/folder-verdaccio.svg +8 -8
  61. package/icons/gleam.svg +4 -4
  62. package/icons/gridsome.svg +4 -4
  63. package/icons/hardhat.svg +3 -3
  64. package/icons/lighthouse.svg +2 -2
  65. package/icons/ndst.svg +7 -7
  66. package/icons/next.svg +3 -3
  67. package/icons/next_light.svg +2 -2
  68. package/icons/nuxt.svg +5 -5
  69. package/icons/odin.svg +6 -6
  70. package/icons/otne.svg +16 -16
  71. package/icons/parcel.svg +4 -4
  72. package/icons/playwright.svg +7 -7
  73. package/icons/plop.svg +4 -4
  74. package/icons/pnpm.svg +9 -9
  75. package/icons/pnpm_light.svg +7 -7
  76. package/icons/poetry.svg +1 -1
  77. package/icons/processing.svg +10 -10
  78. package/icons/remix.svg +4 -4
  79. package/icons/remix_light.svg +4 -4
  80. package/icons/rescript-interface.svg +5 -5
  81. package/icons/rome.svg +5 -5
  82. package/icons/serverless.svg +4 -4
  83. package/icons/shader.svg +4 -4
  84. package/icons/siyuan.svg +9 -9
  85. package/icons/steadybit.svg +1 -1
  86. package/icons/svgr.svg +4 -4
  87. package/icons/tauri.svg +9 -9
  88. package/icons/template.svg +4 -4
  89. package/icons/tobi.svg +4 -4
  90. package/icons/tobimake.svg +14 -14
  91. package/icons/turborepo.svg +12 -12
  92. package/icons/turborepo_light.svg +12 -12
  93. package/icons/verdaccio.svg +5 -5
  94. package/images/contributors.png +0 -0
  95. package/images/fileIcons.png +0 -0
  96. package/logo.svg +21 -21
  97. package/material-colors.yml +257 -257
  98. package/package.json +267 -264
  99. package/package.nls.de.json +35 -35
  100. package/package.nls.es.json +32 -32
  101. package/package.nls.fr.json +32 -32
  102. package/package.nls.ja.json +35 -35
  103. package/package.nls.json +35 -35
  104. package/package.nls.nl.json +35 -35
  105. package/package.nls.pl.json +35 -35
  106. package/package.nls.pt-BR.json +32 -32
  107. package/package.nls.pt-PT.json +32 -32
  108. package/package.nls.ru.json +32 -32
  109. package/package.nls.zh-CN.json +32 -32
  110. package/package.nls.zh-TW.json +32 -32
  111. package/src/commands/activate.ts +26 -26
  112. package/src/commands/explorerArrows.ts +55 -55
  113. package/src/commands/folderColor.ts +96 -96
  114. package/src/commands/folders.ts +55 -55
  115. package/src/commands/grayscale.ts +55 -55
  116. package/src/commands/iconPacks.ts +68 -68
  117. package/src/commands/index.ts +30 -30
  118. package/src/commands/opacity.ts +46 -46
  119. package/src/commands/restoreConfig.ts +14 -14
  120. package/src/commands/saturation.ts +46 -46
  121. package/src/extension.ts +42 -42
  122. package/src/helpers/changeDetection.ts +105 -73
  123. package/src/helpers/customIcons.ts +8 -8
  124. package/src/helpers/fileConfig.ts +37 -37
  125. package/src/helpers/index.ts +100 -100
  126. package/src/helpers/objects.ts +58 -58
  127. package/src/helpers/types.ts +7 -7
  128. package/src/helpers/versioning.ts +73 -73
  129. package/src/i18n/index.ts +78 -78
  130. package/src/i18n/lang-de.ts +54 -54
  131. package/src/i18n/lang-en.ts +53 -53
  132. package/src/i18n/lang-es.ts +53 -53
  133. package/src/i18n/lang-fr.ts +53 -53
  134. package/src/i18n/lang-ja.ts +54 -54
  135. package/src/i18n/lang-nl.ts +54 -54
  136. package/src/i18n/lang-pl.ts +52 -52
  137. package/src/i18n/lang-pt-br.ts +53 -53
  138. package/src/i18n/lang-pt-pt.ts +53 -53
  139. package/src/i18n/lang-ru.ts +52 -52
  140. package/src/i18n/lang-uk.ts +54 -54
  141. package/src/i18n/lang-zh-cn.ts +52 -52
  142. package/src/i18n/lang-zh-tw.ts +52 -52
  143. package/src/icons/fileIcons.ts +2060 -2046
  144. package/src/icons/folderIcons.ts +773 -773
  145. package/src/icons/generator/constants.ts +29 -29
  146. package/src/icons/generator/fileGenerator.ts +216 -216
  147. package/src/icons/generator/folderGenerator.ts +340 -340
  148. package/src/icons/generator/iconOpacity.ts +111 -111
  149. package/src/icons/generator/iconSaturation.ts +140 -140
  150. package/src/icons/generator/index.ts +7 -7
  151. package/src/icons/generator/jsonGenerator.ts +187 -187
  152. package/src/icons/generator/languageGenerator.ts +127 -127
  153. package/src/icons/index.ts +4 -4
  154. package/src/icons/languageIcons.ts +136 -136
  155. package/src/messages/outdated.ts +33 -33
  156. package/src/messages/reload.ts +32 -32
  157. package/src/messages/start.ts +12 -12
  158. package/src/messages/update.ts +48 -48
  159. package/src/messages/welcome.ts +47 -47
  160. package/src/models/helpers/index.ts +1 -1
  161. package/src/models/helpers/themeStatus.ts +5 -5
  162. package/src/models/i18n/index.ts +1 -1
  163. package/src/models/i18n/translation.ts +50 -50
  164. package/src/models/iconConfiguration.ts +37 -37
  165. package/src/models/icons/defaultIcon.ts +16 -16
  166. package/src/models/icons/files/fileIcon.ts +49 -49
  167. package/src/models/icons/files/fileTypes.ts +14 -14
  168. package/src/models/icons/files/index.ts +2 -2
  169. package/src/models/icons/folders/folderIcon.ts +34 -34
  170. package/src/models/icons/folders/folderTheme.ts +23 -23
  171. package/src/models/icons/folders/index.ts +2 -2
  172. package/src/models/icons/iconJsonOptions.ts +23 -23
  173. package/src/models/icons/iconPack.ts +12 -12
  174. package/src/models/icons/index.ts +6 -6
  175. package/src/models/icons/languages/index.ts +1 -1
  176. package/src/models/icons/languages/languageIdentifier.ts +26 -26
  177. package/src/models/index.ts +4 -4
  178. package/src/models/scripts/contributors/contributor.ts +22 -22
  179. package/src/models/scripts/contributors/contributorsConfig.ts +10 -10
  180. package/src/scripts/contributors/contributors.css +24 -24
  181. package/src/scripts/contributors/index.ts +138 -138
  182. package/src/scripts/helpers/painter.ts +5 -5
  183. package/src/scripts/helpers/screenshots.ts +32 -32
  184. package/src/scripts/helpers/similarity.ts +47 -47
  185. package/src/scripts/helpers/titleCase.ts +7 -7
  186. package/src/scripts/icons/checks/checkIconAvailability.ts +215 -215
  187. package/src/scripts/icons/checks/checkIconConflicts.ts +154 -154
  188. package/src/scripts/icons/checks/checkIconUsage.ts +141 -141
  189. package/src/scripts/icons/checks/index.ts +7 -7
  190. package/src/scripts/icons/generateJson.ts +11 -11
  191. package/src/scripts/preview/index.ts +40 -40
  192. package/src/scripts/preview/preview.ts +165 -165
  193. package/src/scripts/preview/style.css +48 -48
  194. package/src/test/runTest.ts +26 -26
  195. package/src/test/spec/i18n/i18n.spec.ts +61 -61
  196. package/src/test/spec/icons/fileIcons.spec.ts +250 -250
  197. package/src/test/spec/icons/folderIcons.spec.ts +418 -418
  198. package/src/test/spec/icons/languageIcons.spec.ts +184 -184
  199. package/src/test/spec/index.ts +36 -36
  200. package/src/web/extension.ts +10 -10
  201. package/svgo.config.js +11 -11
  202. package/tsconfig.json +23 -23
@@ -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
+ }