@dubium/icons 0.0.2-alpha.2 → 0.0.2-alpha.4

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 (126) hide show
  1. package/README.md +286 -49
  2. package/dist/collection/AdjustmentsPlusIcon.d.ts +3 -0
  3. package/dist/collection/{Icon123Icon.js → AdjustmentsPlusIcon.js} +3 -3
  4. package/dist/collection/AdjustmentsQuestionIcon.d.ts +3 -0
  5. package/dist/collection/AdjustmentsQuestionIcon.js +18 -0
  6. package/dist/collection/AlarmPlusFilledIcon.d.ts +3 -0
  7. package/dist/collection/AlarmPlusFilledIcon.js +29 -0
  8. package/dist/collection/AlarmSnoozeFilledIcon.d.ts +3 -0
  9. package/dist/collection/AlarmSnoozeFilledIcon.js +29 -0
  10. package/dist/collection/{Icon24HoursIcon.d.ts → AlarmSnoozeIcon.d.ts} +2 -2
  11. package/dist/collection/{Icon360Icon.js → AlarmSnoozeIcon.js} +3 -3
  12. package/dist/collection/AlbumIcon.d.ts +3 -0
  13. package/dist/collection/{Icon24HoursIcon.js → AlbumIcon.js} +3 -3
  14. package/dist/collection/AlbumOffIcon.d.ts +3 -0
  15. package/dist/collection/AlbumOffIcon.js +18 -0
  16. package/dist/collection/AlertCircleFilledIcon.d.ts +3 -0
  17. package/dist/collection/AlertCircleFilledIcon.js +15 -0
  18. package/dist/collection/{Icon360ViewIcon.d.ts → AlertCircleIcon.d.ts} +2 -2
  19. package/dist/collection/{Icon2faIcon.js → AlertCircleIcon.js} +3 -3
  20. package/dist/collection/AlertHexagonIcon.d.ts +3 -0
  21. package/dist/collection/AlertHexagonIcon.js +18 -0
  22. package/dist/collection/AlignBoxBottomRightFilledIcon.d.ts +3 -0
  23. package/dist/collection/AlignBoxBottomRightFilledIcon.js +15 -0
  24. package/dist/collection/AlignBoxBottomRightIcon.d.ts +3 -0
  25. package/dist/collection/AlignBoxBottomRightIcon.js +18 -0
  26. package/dist/collection/AlignBoxCenterMiddleFilledIcon.d.ts +3 -0
  27. package/dist/collection/AlignBoxCenterMiddleFilledIcon.js +15 -0
  28. package/dist/collection/AlignBoxCenterMiddleIcon.d.ts +3 -0
  29. package/dist/collection/AlignBoxCenterMiddleIcon.js +18 -0
  30. package/dist/collection/AlignBoxLeftBottomFilledIcon.d.ts +3 -0
  31. package/dist/collection/AlignBoxLeftBottomFilledIcon.js +15 -0
  32. package/dist/collection/AlignBoxLeftBottomIcon.d.ts +3 -0
  33. package/dist/collection/AlignBoxLeftBottomIcon.js +18 -0
  34. package/dist/collection/AlignBoxLeftMiddleFilledIcon.d.ts +3 -0
  35. package/dist/collection/AlignBoxLeftMiddleFilledIcon.js +15 -0
  36. package/dist/collection/AlignBoxLeftMiddleIcon.d.ts +3 -0
  37. package/dist/collection/AlignBoxLeftMiddleIcon.js +18 -0
  38. package/dist/collection/index.d.ts +20 -7
  39. package/dist/collection/index.js +19 -6
  40. package/dist/collection/types.d.ts +17 -1
  41. package/dist/icon/Icon.container.d.ts +29 -0
  42. package/dist/icon/Icon.container.js +19 -0
  43. package/dist/icon/Icon.d.ts +5 -0
  44. package/dist/icon/Icon.js +20 -0
  45. package/dist/icon/Icon.types.d.ts +59 -0
  46. package/dist/icon/index.d.ts +13 -0
  47. package/dist/icon/index.js +2 -0
  48. package/dist/vite/icon/Icon.create.d.ts +35 -0
  49. package/dist/{spa → vite}/icon/Icon.create.js +1 -1
  50. package/dist/vite/icon/Icon.d.ts +66 -0
  51. package/dist/vite/icon/Icon.js +79 -0
  52. package/dist/vite/icon/Icon.types.d.ts +88 -0
  53. package/dist/vite/icon/index.d.ts +6 -0
  54. package/dist/vite/index.d.ts +10 -46
  55. package/dist/vite/index.js +6 -166
  56. package/dist/vite/plugin/index.d.ts +11 -0
  57. package/dist/vite/plugin/index.js +2 -0
  58. package/dist/vite/plugin/plugin.d.ts +41 -0
  59. package/dist/vite/plugin/plugin.js +105 -0
  60. package/dist/vite/plugin/plugin.types.d.ts +99 -0
  61. package/dist/vite/plugin/scanner/index.d.ts +9 -0
  62. package/dist/vite/plugin/scanner/scanner.imports.d.ts +5 -0
  63. package/dist/vite/plugin/scanner/scanner.imports.js +36 -0
  64. package/dist/vite/plugin/scanner/scanner.jsx.d.ts +24 -0
  65. package/dist/vite/plugin/scanner/scanner.jsx.js +58 -0
  66. package/dist/vite/plugin/scanner/scanner.lexical.d.ts +30 -0
  67. package/dist/vite/plugin/scanner/scanner.lexical.js +140 -0
  68. package/dist/vite/plugin/scanner/scanner.properties.d.ts +9 -0
  69. package/dist/vite/plugin/scanner/scanner.properties.js +78 -0
  70. package/dist/vite/plugin/scanner/scanner.regex.d.ts +21 -0
  71. package/dist/vite/plugin/scanner/scanner.regex.js +24 -0
  72. package/dist/vite/plugin/scanner/scanner.source.d.ts +18 -0
  73. package/dist/vite/plugin/scanner/scanner.source.js +23 -0
  74. package/dist/vite/plugin/scanner/scanner.types.d.ts +1 -0
  75. package/dist/vite/plugin/sources/index.d.ts +11 -0
  76. package/dist/vite/plugin/sources/sources.catalog.d.ts +17 -0
  77. package/dist/vite/plugin/sources/sources.catalog.js +19 -0
  78. package/dist/vite/plugin/sources/sources.files.d.ts +34 -0
  79. package/dist/vite/plugin/sources/sources.files.js +43 -0
  80. package/dist/vite/plugin/sources/sources.types.d.ts +1 -0
  81. package/dist/vite/plugin/sources/sources.validate.d.ts +13 -0
  82. package/dist/vite/plugin/sources/sources.validate.js +12 -0
  83. package/dist/vite/plugin/virtual/index.d.ts +9 -0
  84. package/dist/vite/plugin/virtual/virtual.constants.d.ts +15 -0
  85. package/dist/vite/plugin/virtual/virtual.constants.js +4 -0
  86. package/dist/vite/plugin/virtual/virtual.module.d.ts +23 -0
  87. package/dist/vite/plugin/virtual/virtual.module.js +27 -0
  88. package/dist/vite/provider/IconProvider.context.d.ts +14 -0
  89. package/dist/vite/provider/IconProvider.context.js +5 -0
  90. package/dist/{spa → vite}/provider/IconProvider.d.ts +3 -2
  91. package/dist/{spa → vite}/provider/IconProvider.js +1 -1
  92. package/dist/{spa → vite}/provider/index.d.ts +2 -2
  93. package/dist/{spa/provider/IconProvider.context.d.ts → vite/provider/useIconContext.d.ts} +4 -14
  94. package/dist/vite/provider/useIconContext.js +6 -0
  95. package/dist/vite/runtime/IconRuntime.registry.d.ts +54 -0
  96. package/dist/vite/runtime/IconRuntime.registry.js +58 -0
  97. package/dist/vite/runtime/index.d.ts +9 -0
  98. package/package.json +17 -17
  99. package/dist/_virtual/__vite-browser-external.js +0 -8
  100. package/dist/_virtual/_rolldown/runtime.js +0 -4
  101. package/dist/collection/Icon123Icon.d.ts +0 -3
  102. package/dist/collection/Icon2faIcon.d.ts +0 -3
  103. package/dist/collection/Icon360Icon.d.ts +0 -3
  104. package/dist/collection/Icon360ViewIcon.js +0 -18
  105. package/dist/spa/icon/Icon.create.d.ts +0 -40
  106. package/dist/spa/icon/Icon.d.ts +0 -25
  107. package/dist/spa/icon/Icon.js +0 -58
  108. package/dist/spa/icon/Icon.registry.d.ts +0 -12
  109. package/dist/spa/icon/Icon.types.d.ts +0 -71
  110. package/dist/spa/icon/index.d.ts +0 -9
  111. package/dist/spa/index.d.ts +0 -8
  112. package/dist/spa/index.js +0 -5
  113. package/dist/spa/provider/IconProvider.context.js +0 -5
  114. package/dist/ssr/icon/Icon.container.d.ts +0 -26
  115. package/dist/ssr/icon/Icon.container.js +0 -23
  116. package/dist/ssr/icon/Icon.create.d.ts +0 -35
  117. package/dist/ssr/icon/Icon.create.js +0 -8
  118. package/dist/ssr/icon/Icon.d.ts +0 -6
  119. package/dist/ssr/icon/Icon.js +0 -27
  120. package/dist/ssr/icon/Icon.registry.d.ts +0 -12
  121. package/dist/ssr/icon/Icon.registry.js +0 -10
  122. package/dist/ssr/icon/Icon.types.d.ts +0 -97
  123. package/dist/ssr/icon/index.d.ts +0 -10
  124. package/dist/ssr/index.d.ts +0 -6
  125. package/dist/ssr/index.js +0 -4
  126. /package/dist/{spa → vite}/provider/IconProvider.types.d.ts +0 -0
@@ -0,0 +1,58 @@
1
+ import { REGEX as e } from "./scanner.regex.js";
2
+ import { isIdentifierCharacter as t, isWhitespace as n, walkCode as r } from "./scanner.lexical.js";
3
+ //#region src/icons/vite/plugin/scanner/scanner.jsx.ts
4
+ var i = (e, r, i) => {
5
+ if (e[r] !== "<") return !1;
6
+ let a = r + 1;
7
+ for (; n(e[a]);) a += 1;
8
+ for (let n of i) {
9
+ if (!e.startsWith(n, a)) continue;
10
+ let r = e[a + n.length];
11
+ if (!t(r)) return !0;
12
+ }
13
+ return !1;
14
+ }, a = (e, t) => {
15
+ if (t.length === 0) return [];
16
+ let n = [];
17
+ return r(e, ({ character: r, index: a }) => {
18
+ r === "<" && i(e, a, t) && n.push(a);
19
+ }), n;
20
+ }, o = (e, t) => {
21
+ let n = null, r = !1, i = 0;
22
+ for (let a = t; a < e.length; a += 1) {
23
+ let t = e[a];
24
+ if (n) {
25
+ if (r) {
26
+ r = !1;
27
+ continue;
28
+ }
29
+ if (t === "\\") {
30
+ r = !0;
31
+ continue;
32
+ }
33
+ t === n && (n = null);
34
+ continue;
35
+ }
36
+ if (t === "'" || t === "\"" || t === "`") {
37
+ n = t;
38
+ continue;
39
+ }
40
+ if (t === "{") {
41
+ i += 1;
42
+ continue;
43
+ }
44
+ if (t === "}") {
45
+ i = Math.max(0, i - 1);
46
+ continue;
47
+ }
48
+ if (t === ">" && i === 0) return a;
49
+ }
50
+ return -1;
51
+ }, s = (t) => {
52
+ let n = e.JSX.STATIC_QUOTED_NAME.exec(t);
53
+ if (n) return n[2].trim();
54
+ let r = e.JSX.STATIC_EXPRESSION_NAME.exec(t);
55
+ return r ? (r[2] ?? r[3] ?? "").trim() : null;
56
+ }, c = (t) => e.JSX.NAME_ATTRIBUTE.test(t);
57
+ //#endregion
58
+ export { a as findComponentTagStarts, o as findTagEnd, c as hasNameAttribute, s as parseStaticName };
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Если в указанной позиции начинается JavaScript RegExp literal,
3
+ * возвращает индекс сразу после литерала и его флагов.
4
+ *
5
+ * @remarks
6
+ * Учитывает escape-последовательности и character classes (`[...]`).
7
+ * Комментарии `//` и `/* ... *\/` здесь не обрабатываются — вызывающий lexer
8
+ * должен проверить их раньше.
9
+ *
10
+ * @param source - Исходный текст
11
+ * @param startIndex - Индекс предполагаемого открывающего `/`
12
+ * @returns Индекс после RegExp literal или `null`, если это не RegExp literal
13
+ */
14
+ export declare const findRegexLiteralEnd: (source: string, startIndex: number) => number | null;
15
+ /**
16
+ * Обходит только значимые позиции JavaScript/TypeScript-кода.
17
+ *
18
+ * @remarks
19
+ * Общая state-machine централизованно игнорирует содержимое комментариев,
20
+ * строк, template literals и RegExp literals. Visitor вызывается для обычного
21
+ * кода и для открывающей кавычки строки — это позволяет отдельным сканерам
22
+ * распознавать строковые ключи объектов, не дублируя lexer.
23
+ *
24
+ * Visitor может вызвать `skipTo(index)`, если уже разобрал конструкцию целиком.
25
+ * Тогда следующий вызов visitor произойдёт с указанного индекса.
26
+ *
27
+ * @param source - Исходный текст файла
28
+ * @param visitor - Обработчик значимых позиций
29
+ */
30
+ export declare const walkCode: (source: string, visitor: (context: ICodeWalkerContext) => void) => void;
@@ -0,0 +1,140 @@
1
+ import { REGEX as e } from "./scanner.regex.js";
2
+ //#region src/icons/vite/plugin/scanner/scanner.lexical.ts
3
+ var t = /* @__PURE__ */ new Set([
4
+ "await",
5
+ "case",
6
+ "delete",
7
+ "do",
8
+ "else",
9
+ "in",
10
+ "instanceof",
11
+ "of",
12
+ "return",
13
+ "throw",
14
+ "typeof",
15
+ "void",
16
+ "yield"
17
+ ]), n = /* @__PURE__ */ new Set([
18
+ "(",
19
+ "{",
20
+ "[",
21
+ ",",
22
+ ";",
23
+ ":",
24
+ "=",
25
+ "!",
26
+ "?",
27
+ "&",
28
+ "|",
29
+ "+",
30
+ "-",
31
+ "*",
32
+ "%",
33
+ "^",
34
+ "~",
35
+ "<",
36
+ ">"
37
+ ]), r = (t) => t !== void 0 && e.WHITESPACE.test(t), i = (t) => t !== void 0 && e.IDENTIFIER.CHARACTER.test(t), a = (e, a) => {
38
+ let o = a - 1;
39
+ for (; o >= 0 && r(e[o]);) --o;
40
+ if (o < 0) return !0;
41
+ let s = e[o];
42
+ if (n.has(s)) return !0;
43
+ if (!i(s)) return !1;
44
+ let c = o;
45
+ for (; c > 0 && i(e[c - 1]);) --c;
46
+ return t.has(e.slice(c, o + 1));
47
+ }, o = (t, n) => {
48
+ if (t[n] !== "/") return null;
49
+ let r = t[n + 1];
50
+ if (r === "/" || r === "*" || !a(t, n)) return null;
51
+ let i = !1, o = !1;
52
+ for (let r = n + 1; r < t.length; r += 1) {
53
+ let n = t[r];
54
+ if (n === "\n" || n === "\r") return null;
55
+ if (i) {
56
+ i = !1;
57
+ continue;
58
+ }
59
+ if (n === "\\") {
60
+ i = !0;
61
+ continue;
62
+ }
63
+ if (n === "[") {
64
+ o = !0;
65
+ continue;
66
+ }
67
+ if (n === "]" && o) {
68
+ o = !1;
69
+ continue;
70
+ }
71
+ if (n !== "/" || o) continue;
72
+ let a = r + 1;
73
+ for (; e.REGEX_FLAG.test(t[a] ?? "");) a += 1;
74
+ return a;
75
+ }
76
+ return null;
77
+ }, s = (e, t) => {
78
+ let n = "code", r = !1;
79
+ for (let i = 0; i < e.length; i += 1) {
80
+ let a = e[i], s = e[i + 1];
81
+ if (n === "line-comment") {
82
+ (a === "\n" || a === "\r") && (n = "code");
83
+ continue;
84
+ }
85
+ if (n === "block-comment") {
86
+ a === "*" && s === "/" && (n = "code", i += 1);
87
+ continue;
88
+ }
89
+ if (n === "single-quote" || n === "double-quote" || n === "template") {
90
+ if (r) {
91
+ r = !1;
92
+ continue;
93
+ }
94
+ if (a === "\\") {
95
+ r = !0;
96
+ continue;
97
+ }
98
+ a === (n === "single-quote" ? "'" : n === "double-quote" ? "\"" : "`") && (n = "code");
99
+ continue;
100
+ }
101
+ if (a === "/" && s === "/") {
102
+ n = "line-comment", i += 1;
103
+ continue;
104
+ }
105
+ if (a === "/" && s === "*") {
106
+ n = "block-comment", i += 1;
107
+ continue;
108
+ }
109
+ if (a === "/") {
110
+ let t = o(e, i);
111
+ if (t !== null) {
112
+ i = t - 1;
113
+ continue;
114
+ }
115
+ }
116
+ let c = null;
117
+ if (t({
118
+ character: a,
119
+ index: i,
120
+ nextCharacter: s,
121
+ skipTo: (e) => {
122
+ c = Math.max(i + 1, e);
123
+ }
124
+ }), c !== null) {
125
+ i = c - 1;
126
+ continue;
127
+ }
128
+ if (a === "'") {
129
+ n = "single-quote";
130
+ continue;
131
+ }
132
+ if (a === "\"") {
133
+ n = "double-quote";
134
+ continue;
135
+ }
136
+ a === "`" && (n = "template");
137
+ }
138
+ };
139
+ //#endregion
140
+ export { o as findRegexLiteralEnd, i as isIdentifierCharacter, r as isWhitespace, s as walkCode };
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Находит значения перечисленных свойств и добавляет их в множество имён иконок.
3
+ *
4
+ * @remarks
5
+ * Общий lexical walker игнорирует содержимое комментариев, строк,
6
+ * template literals и RegExp literals. Открывающая кавычка при этом доступна
7
+ * visitor-у, поэтому поддерживаются строковые ключи вида `"iconName": "User"`.
8
+ */
9
+ export declare const scanPropertyNames: (source: string, propertyNames: readonly string[], icons: Set<string>) => void;
@@ -0,0 +1,78 @@
1
+ import { isIdentifierCharacter as e, isWhitespace as t, walkCode as n } from "./scanner.lexical.js";
2
+ //#region src/icons/vite/plugin/scanner/scanner.properties.ts
3
+ var r = (e, n) => {
4
+ let r = n;
5
+ for (; r < e.length;) {
6
+ let n = e[r], i = e[r + 1];
7
+ if (t(n)) {
8
+ r += 1;
9
+ continue;
10
+ }
11
+ if (n === "/" && i === "/") {
12
+ for (r += 2; r < e.length && e[r] !== "\n" && e[r] !== "\r";) r += 1;
13
+ continue;
14
+ }
15
+ if (n === "/" && i === "*") {
16
+ for (r += 2; r < e.length;) {
17
+ if (e[r] === "*" && e[r + 1] === "/") {
18
+ r += 2;
19
+ break;
20
+ }
21
+ r += 1;
22
+ }
23
+ continue;
24
+ }
25
+ break;
26
+ }
27
+ return r;
28
+ }, i = (e, t) => {
29
+ let n = e[t];
30
+ if (n !== "'" && n !== "\"") return null;
31
+ let r = "", i = !1;
32
+ for (let a = t + 1; a < e.length; a += 1) {
33
+ let t = e[a];
34
+ if (i) {
35
+ r += t, i = !1;
36
+ continue;
37
+ }
38
+ if (t === "\\") {
39
+ i = !0;
40
+ continue;
41
+ }
42
+ if (t === n) return {
43
+ endIndex: a + 1,
44
+ value: r.trim()
45
+ };
46
+ if (t === "\n" || t === "\r") return null;
47
+ r += t;
48
+ }
49
+ return null;
50
+ }, a = (t, n, r) => {
51
+ if (!t.startsWith(r, n)) return null;
52
+ let i = t[n - 1], a = t[n + r.length];
53
+ return e(i) || e(a) ? null : n + r.length;
54
+ }, o = (e, t, n) => {
55
+ let r = i(e, t);
56
+ return !r || r.value !== n ? null : r.endIndex;
57
+ }, s = (e, t, n) => {
58
+ for (let s of n) {
59
+ let n = ["'", "\""].includes(e[t] ?? "") ? o(e, t, s) : a(e, t, s);
60
+ if (n === null) continue;
61
+ let c = r(e, n);
62
+ if (e[c] !== ":") continue;
63
+ c = r(e, c + 1);
64
+ let l = i(e, c);
65
+ if (l?.value) return {
66
+ endIndex: l.endIndex,
67
+ value: l.value
68
+ };
69
+ }
70
+ return null;
71
+ }, c = (e, t, r) => {
72
+ t.length !== 0 && n(e, ({ index: n, skipTo: i }) => {
73
+ let a = s(e, n, t);
74
+ a && (r.add(a.value), i(a.endIndex));
75
+ });
76
+ };
77
+ //#endregion
78
+ export { c as scanPropertyNames };
@@ -0,0 +1,21 @@
1
+ export declare const REGEX: {
2
+ readonly IDENTIFIER: {
3
+ readonly CHARACTER: RegExp;
4
+ readonly NAME: RegExp;
5
+ };
6
+ readonly WHITESPACE: RegExp;
7
+ readonly REGEX_FLAG: RegExp;
8
+ readonly COMMENTS: {
9
+ readonly MULTILINE: RegExp;
10
+ readonly SINGLE_LINE: RegExp;
11
+ };
12
+ readonly IMPORT: {
13
+ readonly STATEMENT: RegExp;
14
+ readonly ICON_SPECIFIER: RegExp;
15
+ };
16
+ readonly JSX: {
17
+ readonly STATIC_QUOTED_NAME: RegExp;
18
+ readonly STATIC_EXPRESSION_NAME: RegExp;
19
+ readonly NAME_ATTRIBUTE: RegExp;
20
+ };
21
+ };
@@ -0,0 +1,24 @@
1
+ //#region src/icons/vite/plugin/scanner/scanner.regex.ts
2
+ var e = "[A-Za-z_$][A-Za-z0-9_$]*", t = {
3
+ IDENTIFIER: {
4
+ CHARACTER: /[A-Za-z0-9_$]/u,
5
+ NAME: RegExp(`^${e}$`, "u")
6
+ },
7
+ WHITESPACE: /\s/u,
8
+ REGEX_FLAG: /[A-Za-z]/u,
9
+ COMMENTS: {
10
+ MULTILINE: /\/\*[\s\S]*?\*\//gu,
11
+ SINGLE_LINE: /\/\/[^\r\n]*/gu
12
+ },
13
+ IMPORT: {
14
+ STATEMENT: /^import\s*\{([\s\S]*?)\}\s*from\s*(["'])([^"']+)\2/u,
15
+ ICON_SPECIFIER: RegExp(`^Icon(?:\\s+as\\s+(${e}))?$`, "u")
16
+ },
17
+ JSX: {
18
+ STATIC_QUOTED_NAME: /\bname\s*=\s*(["'])(.*?)\1/su,
19
+ STATIC_EXPRESSION_NAME: /\bname\s*=\s*\{\s*(?:(["'])(.*?)\1|`([^`${}]*)`)\s*\}/su,
20
+ NAME_ATTRIBUTE: /\bname\s*=/u
21
+ }
22
+ };
23
+ //#endregion
24
+ export { t as REGEX };
@@ -0,0 +1,18 @@
1
+ import type { ScanResult } from "./scanner.types.js";
2
+ /**
3
+ * Сканирует исходник и собирает статические имена иконок.
4
+ *
5
+ * @remarks
6
+ * `Icon`, импортированный из `@dubium/icons/vite`, определяется автоматически,
7
+ * включая import alias. Дополнительные component names можно явно передать
8
+ * через `additionalComponentNames`.
9
+ *
10
+ * JSX-теги и propertyNames внутри комментариев и JavaScript-строк
11
+ * игнорируются.
12
+ *
13
+ * @param source - Исходный текст файла
14
+ * @param additionalComponentNames - Дополнительные имена компонентов-иконок
15
+ * @param propertyNames - Имена свойств со строковыми ссылками на иконки
16
+ * @returns Результат сканирования: найденные имена и число динамических
17
+ */
18
+ export declare const scanSource: (source: string, additionalComponentNames: readonly string[], propertyNames: readonly string[]) => ScanResult;
@@ -0,0 +1,23 @@
1
+ import { findImportedIconComponentNames as e } from "./scanner.imports.js";
2
+ import { findComponentTagStarts as t, findTagEnd as n, hasNameAttribute as r, parseStaticName as i } from "./scanner.jsx.js";
3
+ import { scanPropertyNames as a } from "./scanner.properties.js";
4
+ //#region src/icons/vite/plugin/scanner/scanner.source.ts
5
+ var o = (o, s, c) => {
6
+ let l = /* @__PURE__ */ new Set(), u = e(o), d = [.../* @__PURE__ */ new Set([...u, ...s])], f = t(o, d), p = 0;
7
+ for (let e of f) {
8
+ let t = n(o, e);
9
+ if (t === -1) continue;
10
+ let a = o.slice(e, t + 1), s = i(a);
11
+ if (s) {
12
+ l.add(s);
13
+ continue;
14
+ }
15
+ r(a) && (p += 1);
16
+ }
17
+ return a(o, c, l), {
18
+ dynamicNames: p,
19
+ icons: l
20
+ };
21
+ };
22
+ //#endregion
23
+ export { o as scanSource };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Публичный API модуля источников иконок.
3
+ *
4
+ * @remarks
5
+ * Содержит работу с файловой системой (обход директорий, сбор локальных
6
+ * каталогов) и валидацию настроек источников.
7
+ */
8
+ export { buildLocalCatalog } from "./sources.catalog.js";
9
+ export { DEFAULT_EXTENSIONS, getSourceFiles, isPathInsideDirectory, normalizePath } from "./sources.files.js";
10
+ export { validateSources } from "./sources.validate.js";
11
+ export type { ILocalSourceCatalog } from "./sources.types.js";
@@ -0,0 +1,17 @@
1
+ import type { TDubiumIconSource } from "../plugin.types.js";
2
+ import type { ILocalSourceCatalog } from "./sources.types.js";
3
+ /**
4
+ * Строит локальный каталог иконок из файлов в директории.
5
+ *
6
+ * @remarks
7
+ * Имя иконки получается из имени файла вычитанием суффикса.
8
+ * Например, `UserIcon.tsx` при суффиксе `Icon` даёт имя `User`.
9
+ *
10
+ * @param root - Корень Vite-проекта
11
+ * @param source - Настройки локального источника
12
+ * @returns Каталог иконок с путями к компонентам
13
+ * @throws Если в одном local source найдены две иконки с одинаковым именем
14
+ */
15
+ export declare const buildLocalCatalog: (root: string, source: Extract<TDubiumIconSource, {
16
+ type: "local";
17
+ }>) => Promise<ILocalSourceCatalog>;
@@ -0,0 +1,19 @@
1
+ import { getSourceFiles as e, normalizePath as t } from "./sources.files.js";
2
+ import { basename as n, extname as r, resolve as i } from "node:path";
3
+ //#region src/icons/vite/plugin/sources/sources.catalog.ts
4
+ var a = async (a, o) => {
5
+ let s = i(a, o.path), c = o.suffix ?? "Icon", l = await e(s), u = /* @__PURE__ */ new Map();
6
+ for (let e of l) {
7
+ let i = r(e), a = n(e, i);
8
+ if (!a.endsWith(c)) continue;
9
+ let o = a.slice(0, -c.length);
10
+ if (!o) continue;
11
+ let s = t(e), l = u.get(o);
12
+ if (l) throw Error(`[@dubium/icons] Дублирующееся имя локальной иконки "${o}".\nНайдено в:
13
+ - ${l}\n - ${s}\nПереименуйте один из файлов или используйте другой суффикс/структуру источника.`);
14
+ u.set(o, s);
15
+ }
16
+ return { icons: u };
17
+ };
18
+ //#endregion
19
+ export { a as buildLocalCatalog };
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Расширения файлов, которые плагин считает исходниками и сканирует.
3
+ *
4
+ * @remarks
5
+ * Файлы с другими расширениями игнорируются при рекурсивном обходе проекта.
6
+ */
7
+ export declare const DEFAULT_EXTENSIONS: Set<string>;
8
+ /**
9
+ * Приводит пути к Unix-разделителю `/`.
10
+ *
11
+ * @param value - Путь с разделителями текущей операционной системы
12
+ * @returns Путь с разделителями `/`
13
+ */
14
+ export declare const normalizePath: (value: string) => string;
15
+ /**
16
+ * Проверяет, находится ли путь внутри указанной директории.
17
+ *
18
+ * @param directory - Абсолютный путь к родительской директории
19
+ * @param path - Проверяемый путь
20
+ * @returns `true`, если путь лежит внутри директории или совпадает с ней
21
+ */
22
+ export declare const isPathInsideDirectory: (directory: string, path: string) => boolean;
23
+ /**
24
+ * Рекурсивно собирает исходные файлы в директории.
25
+ *
26
+ * @remarks
27
+ * Игнорирует каталоги из `DEFAULT_IGNORED_DIRECTORIES` и файлы
28
+ * с расширениями вне `DEFAULT_EXTENSIONS`.
29
+ *
30
+ * @param directory - Абсолютный путь к директории
31
+ * @returns Список путей к исходным файлам
32
+ * @throws Если директорию не удалось прочитать (например, она не существует)
33
+ */
34
+ export declare const getSourceFiles: (directory: string) => Promise<string[]>;
@@ -0,0 +1,43 @@
1
+ import { readdir as e } from "node:fs/promises";
2
+ import { extname as t, isAbsolute as n, join as r, relative as i } from "node:path";
3
+ //#region src/icons/vite/plugin/sources/sources.files.ts
4
+ var a = /* @__PURE__ */ new Set([
5
+ ".js",
6
+ ".jsx",
7
+ ".mjs",
8
+ ".cjs",
9
+ ".ts",
10
+ ".tsx"
11
+ ]), o = /* @__PURE__ */ new Set([
12
+ ".git",
13
+ ".next",
14
+ ".nuxt",
15
+ ".output",
16
+ ".turbo",
17
+ "build",
18
+ "coverage",
19
+ "dist",
20
+ "node_modules"
21
+ ]), s = (e) => e.replaceAll("\\", "/"), c = (e, t) => {
22
+ let r = i(e, t);
23
+ return r === "" || !r.startsWith("..") && !n(r);
24
+ }, l = async (n) => {
25
+ let i;
26
+ try {
27
+ i = await e(n, { withFileTypes: !0 });
28
+ } catch (e) {
29
+ throw Error(`[@dubium/icons] Не удалось прочитать директорию: "${n}".\nПроверьте существование пути и права доступа.`, { cause: e });
30
+ }
31
+ let s = [];
32
+ for (let e of i) {
33
+ let i = r(n, e.name);
34
+ if (e.isDirectory()) {
35
+ o.has(e.name) || s.push(...await l(i));
36
+ continue;
37
+ }
38
+ e.isFile() && a.has(t(e.name).toLowerCase()) && s.push(i);
39
+ }
40
+ return s;
41
+ };
42
+ //#endregion
43
+ export { a as DEFAULT_EXTENSIONS, l as getSourceFiles, c as isPathInsideDirectory, s as normalizePath };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ import type { TDubiumIconSource } from "../plugin.types.js";
2
+ /**
3
+ * Проверяет настройки источников иконок на допустимость.
4
+ *
5
+ * @remarks
6
+ * Гарантирует, что задан максимум один `package` source и его шаблон
7
+ * импорта содержит плейсхолдер `{name}`.
8
+ *
9
+ * @param sources - Список настроенных источников иконок
10
+ * @throws Если указано больше одного package source
11
+ * @throws Если `importPattern` package source не содержит `{name}`
12
+ */
13
+ export declare const validateSources: (sources: readonly TDubiumIconSource[]) => void;
@@ -0,0 +1,12 @@
1
+ //#region src/icons/vite/plugin/sources/sources.validate.ts
2
+ var e = (e) => {
3
+ let t = e.filter((e) => e.type === "package");
4
+ if (t.length > 1) throw Error(`[@dubium/icons] Допускается только один package source.
5
+ Получено: ${t.length} package sources.\nИспользуйте несколько local sources и один package source как fallback.`);
6
+ let n = t[0];
7
+ if (n && !n.importPattern.includes("{name}")) throw Error(`[@dubium/icons] Некорректный importPattern у package source.
8
+ Получено: ${JSON.stringify(n.importPattern)}\nШаблон должен содержать "{name}".
9
+ Пример: "@dubium/icons/icons/{name}".`);
10
+ };
11
+ //#endregion
12
+ export { e as validateSources };
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Публичный API виртуального модуля `virtual:@dubium/icons-registry`.
3
+ *
4
+ * @remarks
5
+ * Содержит идентификаторы виртуального модуля и генератор его исходного
6
+ * кода с реестром иконок.
7
+ */
8
+ export { RESOLVED_VIRTUAL_MODULE_ID, VIRTUAL_MODULE_ID } from "./virtual.constants.js";
9
+ export { createVirtualModuleSource } from "./virtual.module.js";
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Идентификатор виртуального модуля, через который загружается реестр иконок.
3
+ *
4
+ * @remarks
5
+ * Используется в приложении как источник `iconRegistry` с ленивыми
6
+ * загрузчиками всех иконок, обнаруженных плагином.
7
+ */
8
+ export declare const VIRTUAL_MODULE_ID = "virtual:@dubium/icons-registry";
9
+ /**
10
+ * Разрешённый идентификатор виртуального модуля для Vite.
11
+ *
12
+ * @remarks
13
+ * Префикс `\0` защищает модуль от внешнего доступа в dev-сервере.
14
+ */
15
+ export declare const RESOLVED_VIRTUAL_MODULE_ID = "\0virtual:@dubium/icons-registry";
@@ -0,0 +1,4 @@
1
+ //#region src/icons/vite/plugin/virtual/virtual.constants.ts
2
+ var e = "virtual:@dubium/icons-registry", t = `\0${e}`;
3
+ //#endregion
4
+ export { t as RESOLVED_VIRTUAL_MODULE_ID, e as VIRTUAL_MODULE_ID };
@@ -0,0 +1,23 @@
1
+ import type { TDubiumIconSource } from "../plugin.types.js";
2
+ import type { ILocalSourceCatalog } from "../sources/sources.types.js";
3
+ /**
4
+ * Генерирует исходный код виртуального модуля с реестром иконок.
5
+ *
6
+ * @remarks
7
+ * Package-импорты предварительно проверяются через Vite/Rollup resolver.
8
+ * Благодаря этому для несуществующей статически обнаруженной иконки
9
+ * плагин выбрасывает понятную ошибку до генерации записи в реестре.
10
+ *
11
+ * @param iconNames - Имена иконок для включения в реестр
12
+ * @param localCatalogs - Локальные каталоги для разрешения путей импорта
13
+ * @param packageSource - Package-источник, используемый как fallback
14
+ * @param resolveImport - Резолвер пути импорта
15
+ * @returns Исходный код виртуального модуля
16
+ * @throws Если найденное имя иконки не разрешилось ни через local sources,
17
+ * ни через package source
18
+ */
19
+ export declare const createVirtualModuleSource: (iconNames: readonly string[], localCatalogs: readonly ILocalSourceCatalog[], packageSource: Extract<TDubiumIconSource, {
20
+ type: "package";
21
+ }> | undefined, resolveImport: (importPath: string) => Promise<{
22
+ id: string;
23
+ } | null | undefined>) => Promise<string>;
@@ -0,0 +1,27 @@
1
+ //#region src/icons/vite/plugin/virtual/virtual.module.ts
2
+ var e = async (e, t, n, r) => {
3
+ let i = [];
4
+ for (let a of e) {
5
+ let e, o = !1;
6
+ for (let n of t) {
7
+ let t = n.icons.get(a);
8
+ if (t) {
9
+ e = t;
10
+ break;
11
+ }
12
+ }
13
+ if (!e && n && (e = n.importPattern.replaceAll("{name}", a), o = !0), !e) throw Error(`[@dubium/icons] Иконка "${a}" не найдена ни в local sources, ни в package source.\nПроверьте настройки options.sources или добавьте компонент иконки в один из источников.`);
14
+ if (o && !await r(e)) throw Error(`[@dubium/icons] Иконка "${a}" не найдена: импорт "${e}" не резолвится.\nПроверьте наличие иконки в npm-пакете или настройки options.sources.`);
15
+ i.push(`\t${JSON.stringify(a)}: () => import(${JSON.stringify(e)}),`);
16
+ }
17
+ return `/**
18
+ * СГЕНЕРИРОВАНО В ПАМЯТИ плагином @dubium/icons/vite.
19
+ * Содержит только ссылки на иконки, обнаруженные в этом приложении/MF.
20
+ */
21
+ export const iconRegistry = {
22
+ ${i.join("\n")}
23
+ }
24
+ `;
25
+ };
26
+ //#endregion
27
+ export { e as createVirtualModuleSource };