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