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