zcw-shared 1.29.0 → 1.31.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 (182) hide show
  1. package/README.md +87 -55
  2. package/dist/functions/platform/tencent-cloud/deploy.tcb.d.ts +13 -0
  3. package/dist/functions/platform/tencent-cloud/deploy.tcb.js +46 -0
  4. package/dist/functions/platform/tencent-cloud/deploy.tcb.js.map +1 -0
  5. package/dist/functions/platform/tencent-cloud/getSecret.d.ts +4 -0
  6. package/dist/functions/platform/tencent-cloud/getSecret.js +19 -0
  7. package/dist/functions/platform/tencent-cloud/getSecret.js.map +1 -0
  8. package/dist/functions/platform/uniapp/app-plus/buildAndroidApp.d.ts +27 -0
  9. package/dist/functions/platform/uniapp/app-plus/buildAndroidApp.js +287 -0
  10. package/dist/functions/platform/uniapp/app-plus/buildAndroidApp.js.map +1 -0
  11. package/dist/functions/platform/uniapp/build.d.ts +21 -0
  12. package/dist/functions/platform/uniapp/build.js +83 -0
  13. package/dist/functions/platform/uniapp/build.js.map +1 -0
  14. package/dist/functions/platform/uniapp/detectAndroidProjectStructure.d.ts +11 -0
  15. package/dist/functions/platform/uniapp/detectAndroidProjectStructure.js +30 -0
  16. package/dist/functions/platform/uniapp/detectAndroidProjectStructure.js.map +1 -0
  17. package/dist/functions/platform/uniapp/detectProjectType.d.ts +20 -0
  18. package/dist/functions/platform/uniapp/detectProjectType.js +68 -0
  19. package/dist/functions/platform/uniapp/detectProjectType.js.map +1 -0
  20. package/dist/functions/platform/uniapp/parseManifest.d.ts +18 -0
  21. package/dist/functions/platform/uniapp/parseManifest.js +49 -0
  22. package/dist/functions/platform/uniapp/parseManifest.js.map +1 -0
  23. package/dist/functions/platform/uniapp/waitForPages.d.ts +7 -0
  24. package/dist/functions/platform/uniapp/waitForPages.js +20 -0
  25. package/dist/functions/platform/uniapp/waitForPages.js.map +1 -0
  26. package/dist/functions/string/visualizeRegexSteps.d.ts +39 -0
  27. package/dist/functions/string/visualizeRegexSteps.js +446 -0
  28. package/dist/functions/string/visualizeRegexSteps.js.map +1 -0
  29. package/dist/functions/utils/createI18n.d.ts +2 -0
  30. package/dist/functions/utils/createI18n.js +97 -0
  31. package/dist/functions/utils/createI18n.js.map +1 -0
  32. package/dist/functions/utils/formatString.d.ts +5 -0
  33. package/dist/functions/utils/formatString.js +9 -0
  34. package/dist/functions/utils/formatString.js.map +1 -0
  35. package/dist/functions/vue/dynamicMount.d.ts +6 -4
  36. package/dist/functions/vue/isVNode.d.ts +1 -1
  37. package/dist/functions/vue/isVueComponent.d.ts +1 -1
  38. package/dist/hooks/usePermission.d.ts +7 -0
  39. package/dist/hooks/usePermission.js +123 -0
  40. package/dist/hooks/usePermission.js.map +1 -0
  41. package/dist/vue-hooks/browser/useBattery.d.ts +1 -1
  42. package/dist/vue-hooks/browser/useBluetooth.d.ts +1 -1
  43. package/dist/vue-hooks/browser/useCamera.d.ts +1 -1
  44. package/dist/vue-hooks/browser/useClipboard.d.ts +1 -1
  45. package/dist/vue-hooks/browser/useFileUpload.d.ts +3 -2
  46. package/dist/vue-hooks/browser/useFileUpload.js +12 -1
  47. package/dist/vue-hooks/browser/useFileUpload.js.map +1 -1
  48. package/dist/vue-hooks/browser/useFullscreen.d.ts +1 -1
  49. package/dist/vue-hooks/browser/useGamepad.d.ts +1 -1
  50. package/dist/vue-hooks/browser/useGeolocation.d.ts +1 -1
  51. package/dist/vue-hooks/browser/useMediaSession.d.ts +1 -1
  52. package/dist/vue-hooks/browser/useMicrophone.d.ts +1 -1
  53. package/dist/vue-hooks/browser/useNetwork.d.ts +1 -1
  54. package/dist/vue-hooks/browser/useOrientation.d.ts +1 -1
  55. package/dist/vue-hooks/browser/usePageVisibility.d.ts +1 -1
  56. package/dist/vue-hooks/browser/useScreenOrientation.d.ts +1 -1
  57. package/dist/vue-hooks/browser/useScreenWakeLock.d.ts +1 -1
  58. package/dist/vue-hooks/browser/useShare.d.ts +1 -1
  59. package/dist/vue-hooks/browser/useVibration.d.ts +1 -1
  60. package/dist/vue-hooks/dom/useAutoUpdate.d.ts +1 -1
  61. package/dist/vue-hooks/dom/useClickOutside.d.ts +1 -1
  62. package/dist/vue-hooks/dom/useDraggable.d.ts +4 -4
  63. package/dist/vue-hooks/dom/useEventListener.d.ts +1 -1
  64. package/dist/vue-hooks/dom/useKeyboard.d.ts +29 -0
  65. package/dist/vue-hooks/dom/useKeyboard.js +129 -0
  66. package/dist/vue-hooks/dom/useKeyboard.js.map +1 -0
  67. package/dist/vue-hooks/dom/useResizable.d.ts +8 -3
  68. package/dist/vue-hooks/history/useDebouncedRefHistory.d.ts +1 -1
  69. package/dist/vue-hooks/history/useManualRefHistory.d.ts +1 -1
  70. package/dist/vue-hooks/history/useRefHistory.d.ts +1 -1
  71. package/dist/vue-hooks/state/injectLocal.d.ts +1 -1
  72. package/dist/vue-hooks/state/provideLocal.d.ts +1 -1
  73. package/dist/vue-hooks/state/useAsyncState.d.ts +1 -1
  74. package/dist/vue-hooks/state/useCounter.d.ts +1 -1
  75. package/dist/vue-hooks/state/useFileUpload.d.ts +23 -0
  76. package/dist/vue-hooks/state/useFileUpload.js +93 -0
  77. package/dist/vue-hooks/state/useFileUpload.js.map +1 -0
  78. package/dist/vue-hooks/state/useToggle.d.ts +1 -1
  79. package/dist/vue-hooks/time/useInterval.d.ts +1 -1
  80. package/dist/vue-hooks/time/useTimeout.d.ts +1 -1
  81. package/dist/vue-hooks/worker/useWebWorker.d.ts +4 -4
  82. package/dist/vue-hooks/worker/useWorkerFunction.d.ts +4 -4
  83. package/dist/vue-hooks/worker/useWorkerPool.d.ts +4 -4
  84. package/package.json +1 -1
  85. package/types/vue.d.ts +1 -1
  86. package/dist/functions/algorithm/lcsVisual.d.ts +0 -6
  87. package/dist/functions/algorithm/lcsVisual.js +0 -88
  88. package/dist/functions/algorithm/lcsVisual.js.map +0 -1
  89. package/dist/functions/algorithm/mergeSortVisual.d.ts +0 -5
  90. package/dist/functions/algorithm/mergeSortVisual.js +0 -103
  91. package/dist/functions/algorithm/mergeSortVisual.js.map +0 -1
  92. package/dist/functions/algorithm/nQueensVisual.d.ts +0 -14
  93. package/dist/functions/algorithm/nQueensVisual.js +0 -94
  94. package/dist/functions/algorithm/nQueensVisual.js.map +0 -1
  95. package/dist/functions/algorithm/numIslandsVisual.d.ts +0 -17
  96. package/dist/functions/algorithm/numIslandsVisual.js +0 -102
  97. package/dist/functions/algorithm/numIslandsVisual.js.map +0 -1
  98. package/dist/functions/algorithm/quickSortVisual.d.ts +0 -18
  99. package/dist/functions/algorithm/quickSortVisual.js +0 -104
  100. package/dist/functions/algorithm/quickSortVisual.js.map +0 -1
  101. package/dist/functions/browser/detectDevice.d.ts +0 -10
  102. package/dist/functions/browser/detectDevice.js +0 -49
  103. package/dist/functions/browser/detectDevice.js.map +0 -1
  104. package/dist/functions/cookie/getCookie.d.ts +0 -5
  105. package/dist/functions/cookie/getCookie.js +0 -14
  106. package/dist/functions/cookie/getCookie.js.map +0 -1
  107. package/dist/functions/cookie/removeCookie.d.ts +0 -8
  108. package/dist/functions/cookie/removeCookie.js +0 -12
  109. package/dist/functions/cookie/removeCookie.js.map +0 -1
  110. package/dist/functions/cookie/setCookie.d.ts +0 -11
  111. package/dist/functions/cookie/setCookie.js +0 -23
  112. package/dist/functions/cookie/setCookie.js.map +0 -1
  113. package/dist/functions/data-structures/EventEmitter.d.ts +0 -32
  114. package/dist/functions/data-structures/EventEmitter.js +0 -108
  115. package/dist/functions/data-structures/EventEmitter.js.map +0 -1
  116. package/dist/functions/data-structures/MyPromise.d.ts +0 -32
  117. package/dist/functions/data-structures/MyPromise.js +0 -254
  118. package/dist/functions/data-structures/MyPromise.js.map +0 -1
  119. package/dist/functions/reactive/useReactiveCookie.d.ts +0 -19
  120. package/dist/functions/reactive/useReactiveCookie.js +0 -84
  121. package/dist/functions/reactive/useReactiveCookie.js.map +0 -1
  122. package/dist/hooks/useClickOutside.d.ts +0 -12
  123. package/dist/hooks/useClickOutside.js +0 -16
  124. package/dist/hooks/useClickOutside.js.map +0 -1
  125. package/dist/hooks/useClipboard.d.ts +0 -20
  126. package/dist/hooks/useClipboard.js +0 -33
  127. package/dist/hooks/useClipboard.js.map +0 -1
  128. package/dist/hooks/useCounter.d.ts +0 -19
  129. package/dist/hooks/useCounter.js +0 -44
  130. package/dist/hooks/useCounter.js.map +0 -1
  131. package/dist/hooks/useEventListener.d.ts +0 -14
  132. package/dist/hooks/useEventListener.js +0 -18
  133. package/dist/hooks/useEventListener.js.map +0 -1
  134. package/dist/hooks/useInterval.d.ts +0 -19
  135. package/dist/hooks/useInterval.js +0 -33
  136. package/dist/hooks/useInterval.js.map +0 -1
  137. package/dist/hooks/useTimeout.d.ts +0 -20
  138. package/dist/hooks/useTimeout.js +0 -40
  139. package/dist/hooks/useTimeout.js.map +0 -1
  140. package/dist/hooks/useToggle.d.ts +0 -15
  141. package/dist/hooks/useToggle.js +0 -23
  142. package/dist/hooks/useToggle.js.map +0 -1
  143. package/dist/reactive/createGlobalState.d.ts +0 -2
  144. package/dist/reactive/createGlobalState.js +0 -11
  145. package/dist/reactive/createGlobalState.js.map +0 -1
  146. package/dist/reactive/createSharedComposable.d.ts +0 -2
  147. package/dist/reactive/createSharedComposable.js +0 -13
  148. package/dist/reactive/createSharedComposable.js.map +0 -1
  149. package/dist/reactive/errorManager.d.ts +0 -63
  150. package/dist/reactive/errorManager.js +0 -199
  151. package/dist/reactive/errorManager.js.map +0 -1
  152. package/dist/reactive/i18n.d.ts +0 -27
  153. package/dist/reactive/i18n.js +0 -119
  154. package/dist/reactive/i18n.js.map +0 -1
  155. package/dist/reactive/permission.d.ts +0 -40
  156. package/dist/reactive/permission.js +0 -189
  157. package/dist/reactive/permission.js.map +0 -1
  158. package/dist/reactive/pinia.d.ts +0 -52
  159. package/dist/reactive/pinia.js +0 -183
  160. package/dist/reactive/pinia.js.map +0 -1
  161. package/dist/reactive/useAltool.d.ts +0 -39
  162. package/dist/reactive/useAltool.js +0 -350
  163. package/dist/reactive/useAltool.js.map +0 -1
  164. package/dist/reactive/useCache.d.ts +0 -18
  165. package/dist/reactive/useCache.js +0 -82
  166. package/dist/reactive/useCache.js.map +0 -1
  167. package/dist/reactive/useLocalStorage.d.ts +0 -8
  168. package/dist/reactive/useLocalStorage.js +0 -101
  169. package/dist/reactive/useLocalStorage.js.map +0 -1
  170. package/dist/reactive/usePluginSystem.d.ts +0 -11
  171. package/dist/reactive/usePluginSystem.js +0 -34
  172. package/dist/reactive/usePluginSystem.js.map +0 -1
  173. package/dist/reactive/useSessionStorage.d.ts +0 -8
  174. package/dist/reactive/useSessionStorage.js +0 -101
  175. package/dist/reactive/useSessionStorage.js.map +0 -1
  176. package/dist/reactive/useStorage.d.ts +0 -13
  177. package/dist/reactive/useStorage.js +0 -62
  178. package/dist/reactive/useStorage.js.map +0 -1
  179. package/dist/reactive/useStorageWithIndexedDB.d.ts +0 -8
  180. package/dist/reactive/useStorageWithIndexedDB.js +0 -132
  181. package/dist/reactive/useStorageWithIndexedDB.js.map +0 -1
  182. package/references/vue.d.ts +0 -242
@@ -0,0 +1,20 @@
1
+ export function waitForPages(deps, timeout = 5000) {
2
+ return new Promise((resolve, reject) => {
3
+ const startTime = Date.now();
4
+ const checkPages = () => {
5
+ const pages = deps.getCurrentPages();
6
+ if (pages.length > 0) {
7
+ resolve(pages);
8
+ return;
9
+ }
10
+ if (Date.now() - startTime > timeout) {
11
+ reject(new Error('等待页面栈超时'));
12
+ return;
13
+ }
14
+ deps.setTimeout(checkPages, 100);
15
+ };
16
+ checkPages();
17
+ });
18
+ }
19
+ ;
20
+ //# sourceMappingURL=waitForPages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waitForPages.js","sourceRoot":"","sources":["../../../../src/functions/platform/uniapp/waitForPages.ts"],"names":[],"mappings":"AAwBA,MAAM,UAAU,YAAY,CAAC,IAAsB,EAAE,OAAO,GAAG,IAAI;IACjE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,MAAM,UAAU,GAAG,GAAG,EAAE;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YAErC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,OAAO,CAAC,KAAK,CAAC,CAAC;gBACf,OAAO;YACT,CAAC;YAGD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,CAAC;gBACrC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC7B,OAAO;YACT,CAAC;YAGD,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACnC,CAAC,CAAC;QAEF,UAAU,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAAA,CAAC"}
@@ -0,0 +1,39 @@
1
+ export interface RegexStep {
2
+ stepNumber: number;
3
+ textPosition: number;
4
+ regexPosition: number;
5
+ action: string;
6
+ status: 'matching' | 'matched' | 'failed' | 'backtrack';
7
+ matchedText: string;
8
+ captureGroups: CaptureGroupState[];
9
+ backtrackStack: BacktrackPoint[];
10
+ quantifierState?: QuantifierState;
11
+ explanation: string;
12
+ }
13
+ export interface CaptureGroupState {
14
+ index: number;
15
+ name?: string;
16
+ text: string;
17
+ completed: boolean;
18
+ }
19
+ export interface BacktrackPoint {
20
+ textPos: number;
21
+ regexPos: number;
22
+ description: string;
23
+ }
24
+ export interface QuantifierState {
25
+ symbol: string;
26
+ currentCount: number;
27
+ minCount: number;
28
+ maxCount: number;
29
+ greedy: boolean;
30
+ }
31
+ export interface RegexVisualization {
32
+ steps: RegexStep[];
33
+ finalMatch: {
34
+ success: boolean;
35
+ matchedText: string;
36
+ captureGroups: CaptureGroupState[];
37
+ };
38
+ }
39
+ export declare function visualizeRegexSteps(pattern: string, text: string, maxSteps?: number): RegexVisualization;
@@ -0,0 +1,446 @@
1
+ function parseSimpleRegex(pattern) {
2
+ const components = [];
3
+ let i = 0;
4
+ while (i < pattern.length) {
5
+ const char = pattern[i];
6
+ if (char === '\\' && i + 1 < pattern.length) {
7
+ components.push({
8
+ type: 'escape',
9
+ text: pattern.substring(i, i + 2),
10
+ value: pattern[i + 1]
11
+ });
12
+ i += 2;
13
+ continue;
14
+ }
15
+ if (['+', '*', '?'].includes(char)) {
16
+ const quantMap = {
17
+ '+': [1, Infinity],
18
+ '*': [0, Infinity],
19
+ '?': [0, 1]
20
+ };
21
+ const [min, max] = quantMap[char];
22
+ components.push({
23
+ type: 'quantifier',
24
+ text: char,
25
+ min,
26
+ max
27
+ });
28
+ i++;
29
+ continue;
30
+ }
31
+ if (char === '[') {
32
+ let j = i + 1;
33
+ while (j < pattern.length && pattern[j] !== ']') {
34
+ if (pattern[j] === '\\')
35
+ j++;
36
+ j++;
37
+ }
38
+ components.push({
39
+ type: 'charset',
40
+ text: pattern.substring(i, j + 1)
41
+ });
42
+ i = j + 1;
43
+ continue;
44
+ }
45
+ if (char === '(') {
46
+ let depth = 1;
47
+ let j = i + 1;
48
+ while (j < pattern.length && depth > 0) {
49
+ if (pattern[j] === '\\') {
50
+ j += 2;
51
+ continue;
52
+ }
53
+ if (pattern[j] === '(')
54
+ depth++;
55
+ if (pattern[j] === ')')
56
+ depth--;
57
+ j++;
58
+ }
59
+ components.push({
60
+ type: 'group',
61
+ text: pattern.substring(i, j)
62
+ });
63
+ i = j;
64
+ continue;
65
+ }
66
+ if (char === '^' || char === '$') {
67
+ components.push({
68
+ type: 'anchor',
69
+ text: char
70
+ });
71
+ i++;
72
+ continue;
73
+ }
74
+ components.push({
75
+ type: 'literal',
76
+ text: char,
77
+ value: char
78
+ });
79
+ i++;
80
+ }
81
+ return components;
82
+ }
83
+ function matchEscape(escapeChar, textChar) {
84
+ const escapeMap = {
85
+ 'd': (c) => /[0-9]/.test(c),
86
+ 'D': (c) => /[^0-9]/.test(c),
87
+ 'w': (c) => /[a-zA-Z0-9_]/.test(c),
88
+ 'W': (c) => /[^a-zA-Z0-9_]/.test(c),
89
+ 's': (c) => /\s/.test(c),
90
+ 'S': (c) => /\S/.test(c)
91
+ };
92
+ return escapeMap[escapeChar]?.(textChar) || false;
93
+ }
94
+ function matchCharset(charset, textChar) {
95
+ const isNegated = charset[1] === '^';
96
+ const chars = charset.substring(isNegated ? 2 : 1, charset.length - 1);
97
+ let matches = false;
98
+ for (let i = 0; i < chars.length; i++) {
99
+ if (chars[i + 1] === '-' && i + 2 < chars.length) {
100
+ const start = chars.charCodeAt(i);
101
+ const end = chars.charCodeAt(i + 2);
102
+ const code = textChar.charCodeAt(0);
103
+ if (code >= start && code <= end) {
104
+ matches = true;
105
+ break;
106
+ }
107
+ i += 2;
108
+ }
109
+ else {
110
+ if (chars[i] === textChar) {
111
+ matches = true;
112
+ break;
113
+ }
114
+ }
115
+ }
116
+ return isNegated ? !matches : matches;
117
+ }
118
+ function tryMatchAt(components, text, startPos, steps, stepNumber) {
119
+ let textPos = startPos;
120
+ let regexPos = 0;
121
+ let matchedText = '';
122
+ const captureGroups = [];
123
+ const backtrackStack = [];
124
+ steps.push({
125
+ stepNumber: stepNumber++,
126
+ textPosition: textPos,
127
+ regexPosition: regexPos,
128
+ action: `尝试从位置 ${startPos} 开始匹配`,
129
+ status: 'matching',
130
+ matchedText: '',
131
+ captureGroups: [],
132
+ backtrackStack: [],
133
+ explanation: `将正则引擎定位到文本位置 ${startPos},准备开始匹配`
134
+ });
135
+ while (regexPos < components.length && textPos < text.length) {
136
+ const component = components[regexPos];
137
+ const currentChar = text[textPos];
138
+ const nextComponent = components[regexPos + 1];
139
+ const hasQuantifier = nextComponent?.type === 'quantifier';
140
+ if (component.type === 'literal') {
141
+ steps.push({
142
+ stepNumber: stepNumber++,
143
+ textPosition: textPos,
144
+ regexPosition: regexPos,
145
+ action: `匹配字面字符 "${component.text}"`,
146
+ status: 'matching',
147
+ matchedText,
148
+ captureGroups: [...captureGroups],
149
+ backtrackStack: [...backtrackStack],
150
+ explanation: `检查文本位置 ${textPos} 的字符 "${currentChar}" 是否等于 "${component.text}"`
151
+ });
152
+ if (currentChar === component.value) {
153
+ matchedText += currentChar;
154
+ textPos++;
155
+ regexPos++;
156
+ steps.push({
157
+ stepNumber: stepNumber++,
158
+ textPosition: textPos,
159
+ regexPosition: regexPos,
160
+ action: '匹配成功',
161
+ status: 'matched',
162
+ matchedText,
163
+ captureGroups: [...captureGroups],
164
+ backtrackStack: [...backtrackStack],
165
+ explanation: `字符 "${currentChar}" 匹配成功,继续向前`
166
+ });
167
+ }
168
+ else {
169
+ steps.push({
170
+ stepNumber: stepNumber++,
171
+ textPosition: textPos,
172
+ regexPosition: regexPos,
173
+ action: '匹配失败',
174
+ status: 'failed',
175
+ matchedText,
176
+ captureGroups: [...captureGroups],
177
+ backtrackStack: [...backtrackStack],
178
+ explanation: `字符 "${currentChar}" 不匹配 "${component.text}",匹配失败`
179
+ });
180
+ break;
181
+ }
182
+ }
183
+ else if (component.type === 'escape') {
184
+ steps.push({
185
+ stepNumber: stepNumber++,
186
+ textPosition: textPos,
187
+ regexPosition: regexPos,
188
+ action: `匹配转义字符 ${component.text}`,
189
+ status: 'matching',
190
+ matchedText,
191
+ captureGroups: [...captureGroups],
192
+ backtrackStack: [...backtrackStack],
193
+ explanation: `检查文本位置 ${textPos} 的字符 "${currentChar}" 是否符合 ${component.text} 的规则`
194
+ });
195
+ if (matchEscape(component.value, currentChar)) {
196
+ if (hasQuantifier) {
197
+ const quantifier = nextComponent;
198
+ const quantState = {
199
+ symbol: quantifier.text,
200
+ currentCount: 0,
201
+ minCount: quantifier.min,
202
+ maxCount: quantifier.max,
203
+ greedy: true
204
+ };
205
+ steps.push({
206
+ stepNumber: stepNumber++,
207
+ textPosition: textPos,
208
+ regexPosition: regexPos,
209
+ action: `进入量词 ${quantifier.text}`,
210
+ status: 'matching',
211
+ matchedText,
212
+ captureGroups: [...captureGroups],
213
+ backtrackStack: [...backtrackStack],
214
+ quantifierState: quantState,
215
+ explanation: `检测到量词 ${quantifier.text},要求匹配 ${quantifier.min} 到 ${quantifier.max === Infinity ? '∞' : quantifier.max} 次`
216
+ });
217
+ let count = 0;
218
+ let tempPos = textPos;
219
+ while (count < quantifier.max && tempPos < text.length) {
220
+ const nextChar = text[tempPos];
221
+ if (matchEscape(component.value, nextChar)) {
222
+ matchedText += nextChar;
223
+ count++;
224
+ tempPos++;
225
+ quantState.currentCount = count;
226
+ steps.push({
227
+ stepNumber: stepNumber++,
228
+ textPosition: tempPos,
229
+ regexPosition: regexPos,
230
+ action: `量词匹配(第 ${count} 次)`,
231
+ status: 'matched',
232
+ matchedText,
233
+ captureGroups: [...captureGroups],
234
+ backtrackStack: [...backtrackStack],
235
+ quantifierState: { ...quantState },
236
+ explanation: `字符 "${nextChar}" 匹配成功,已匹配 ${count} 次`
237
+ });
238
+ }
239
+ else {
240
+ break;
241
+ }
242
+ }
243
+ if (count >= quantifier.min) {
244
+ textPos = tempPos;
245
+ regexPos += 2;
246
+ steps.push({
247
+ stepNumber: stepNumber++,
248
+ textPosition: textPos,
249
+ regexPosition: regexPos,
250
+ action: '✓ 量词匹配完成',
251
+ status: 'matched',
252
+ matchedText,
253
+ captureGroups: [...captureGroups],
254
+ backtrackStack: [...backtrackStack],
255
+ quantifierState: { ...quantState },
256
+ explanation: `量词 ${quantifier.text} 成功匹配 ${count} 次,满足要求 [${quantifier.min}, ${quantifier.max === Infinity ? '∞' : quantifier.max}]`
257
+ });
258
+ }
259
+ else {
260
+ steps.push({
261
+ stepNumber: stepNumber++,
262
+ textPosition: textPos,
263
+ regexPosition: regexPos,
264
+ action: '✗ 量词不满足',
265
+ status: 'failed',
266
+ matchedText,
267
+ captureGroups: [...captureGroups],
268
+ backtrackStack: [...backtrackStack],
269
+ quantifierState: { ...quantState },
270
+ explanation: `量词 ${quantifier.text} 只匹配 ${count} 次,不满足最小要求 ${quantifier.min}`
271
+ });
272
+ break;
273
+ }
274
+ }
275
+ else {
276
+ matchedText += currentChar;
277
+ textPos++;
278
+ regexPos++;
279
+ steps.push({
280
+ stepNumber: stepNumber++,
281
+ textPosition: textPos,
282
+ regexPosition: regexPos,
283
+ action: '✓ 匹配成功',
284
+ status: 'matched',
285
+ matchedText,
286
+ captureGroups: [...captureGroups],
287
+ backtrackStack: [...backtrackStack],
288
+ explanation: `字符 "${currentChar}" 符合 ${component.text} 规则`
289
+ });
290
+ }
291
+ }
292
+ else {
293
+ steps.push({
294
+ stepNumber: stepNumber++,
295
+ textPosition: textPos,
296
+ regexPosition: regexPos,
297
+ action: '匹配失败',
298
+ status: 'failed',
299
+ matchedText,
300
+ captureGroups: [...captureGroups],
301
+ backtrackStack: [...backtrackStack],
302
+ explanation: `字符 "${currentChar}" 不符合 ${component.text} 规则,匹配失败`
303
+ });
304
+ break;
305
+ }
306
+ }
307
+ else if (component.type === 'charset') {
308
+ steps.push({
309
+ stepNumber: stepNumber++,
310
+ textPosition: textPos,
311
+ regexPosition: regexPos,
312
+ action: `匹配字符集 ${component.text}`,
313
+ status: 'matching',
314
+ matchedText,
315
+ captureGroups: [...captureGroups],
316
+ backtrackStack: [...backtrackStack],
317
+ explanation: `检查字符 "${currentChar}" 是否在字符集 ${component.text} 中`
318
+ });
319
+ if (matchCharset(component.text, currentChar)) {
320
+ matchedText += currentChar;
321
+ textPos++;
322
+ regexPos++;
323
+ steps.push({
324
+ stepNumber: stepNumber++,
325
+ textPosition: textPos,
326
+ regexPosition: regexPos,
327
+ action: '匹配成功',
328
+ status: 'matched',
329
+ matchedText,
330
+ captureGroups: [...captureGroups],
331
+ backtrackStack: [...backtrackStack],
332
+ explanation: `字符 "${currentChar}" 在字符集中,匹配成功`
333
+ });
334
+ }
335
+ else {
336
+ steps.push({
337
+ stepNumber: stepNumber++,
338
+ textPosition: textPos,
339
+ regexPosition: regexPos,
340
+ action: '匹配失败',
341
+ status: 'failed',
342
+ matchedText,
343
+ captureGroups: [...captureGroups],
344
+ backtrackStack: [...backtrackStack],
345
+ explanation: `字符 "${currentChar}" 不在字符集中,匹配失败`
346
+ });
347
+ break;
348
+ }
349
+ }
350
+ else {
351
+ regexPos++;
352
+ }
353
+ }
354
+ const success = regexPos >= components.length;
355
+ if (success) {
356
+ steps.push({
357
+ stepNumber: stepNumber++,
358
+ textPosition: textPos,
359
+ regexPosition: regexPos,
360
+ action: '✅ 匹配成功',
361
+ status: 'matched',
362
+ matchedText,
363
+ captureGroups: [],
364
+ backtrackStack: [],
365
+ explanation: `所有模式都已匹配成功!最终匹配结果:"${matchedText}"`
366
+ });
367
+ }
368
+ else {
369
+ steps.push({
370
+ stepNumber: stepNumber++,
371
+ textPosition: textPos,
372
+ regexPosition: regexPos,
373
+ action: '❌ 本次尝试失败',
374
+ status: 'failed',
375
+ matchedText,
376
+ captureGroups: [],
377
+ backtrackStack: [],
378
+ explanation: `从位置 ${startPos} 开始的匹配尝试失败`
379
+ });
380
+ }
381
+ return { success, matchedText, steps, stepNumber };
382
+ }
383
+ export function visualizeRegexSteps(pattern, text, maxSteps = 200) {
384
+ const steps = [];
385
+ const components = parseSimpleRegex(pattern);
386
+ let stepNumber = 0;
387
+ steps.push({
388
+ stepNumber: stepNumber++,
389
+ textPosition: 0,
390
+ regexPosition: 0,
391
+ action: '🎬 开始正则匹配',
392
+ status: 'matching',
393
+ matchedText: '',
394
+ captureGroups: [],
395
+ backtrackStack: [],
396
+ explanation: `准备在文本中搜索模式 /${pattern}/,文本内容:"${text}"`
397
+ });
398
+ for (let i = 0; i < text.length; i++) {
399
+ const result = tryMatchAt(components, text, i, steps, stepNumber);
400
+ stepNumber = result.stepNumber;
401
+ if (result.success) {
402
+ return {
403
+ steps,
404
+ finalMatch: {
405
+ success: true,
406
+ matchedText: result.matchedText,
407
+ captureGroups: []
408
+ }
409
+ };
410
+ }
411
+ if (steps.length >= maxSteps) {
412
+ steps.push({
413
+ stepNumber: stepNumber++,
414
+ textPosition: i + 1,
415
+ regexPosition: 0,
416
+ action: '⏸ 步骤过多,暂停',
417
+ status: 'failed',
418
+ matchedText: '',
419
+ captureGroups: [],
420
+ backtrackStack: [],
421
+ explanation: `已生成 ${steps.length} 个步骤,为避免过长暂停执行`
422
+ });
423
+ break;
424
+ }
425
+ }
426
+ steps.push({
427
+ stepNumber: stepNumber++,
428
+ textPosition: text.length,
429
+ regexPosition: 0,
430
+ action: '❌ 匹配失败',
431
+ status: 'failed',
432
+ matchedText: '',
433
+ captureGroups: [],
434
+ backtrackStack: [],
435
+ explanation: `已扫描整个文本,未找到匹配项`
436
+ });
437
+ return {
438
+ steps,
439
+ finalMatch: {
440
+ success: false,
441
+ matchedText: '',
442
+ captureGroups: []
443
+ }
444
+ };
445
+ }
446
+ //# sourceMappingURL=visualizeRegexSteps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visualizeRegexSteps.js","sourceRoot":"","sources":["../../../src/functions/string/visualizeRegexSteps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { CreateI18n } from '../../../types/i18n.d';
2
+ export declare const createI18n: CreateI18n;
@@ -0,0 +1,97 @@
1
+ import { createReactive } from './createReactive';
2
+ export const createI18n = (initialState, deps) => {
3
+ const reactiveI18n = createReactive(initialState, {
4
+ subscribers: new Set(),
5
+ notify: () => {
6
+ },
7
+ subscribe: (listener) => {
8
+ reactiveI18n.subscribers.add(listener);
9
+ return () => reactiveI18n.subscribers.delete(listener);
10
+ },
11
+ dispose: () => reactiveI18n.subscribers.clear(),
12
+ createProxy: (target, deps) => new Proxy(target, {
13
+ get(target, property) {
14
+ if (property === 'subscribe' || property === 'notify' ||
15
+ property === 'dispose' || property === 'subscribers') {
16
+ return deps[property];
17
+ }
18
+ return target[property];
19
+ },
20
+ set(target, property, value) {
21
+ if (property === 'currentLang') {
22
+ const newLang = String(value);
23
+ if (newLang !== target.currentLang) {
24
+ ;
25
+ target[property] = newLang;
26
+ deps.notify();
27
+ return true;
28
+ }
29
+ return true;
30
+ }
31
+ ;
32
+ target[property] = value;
33
+ deps.notify();
34
+ return true;
35
+ }
36
+ }),
37
+ getChangePath: (target, property) => [String(property)]
38
+ });
39
+ const t = (key, params) => {
40
+ const { currentLang, messages, fallbackLang } = reactiveI18n;
41
+ let message = messages[currentLang]?.[key];
42
+ if (!message && fallbackLang) {
43
+ message = messages[fallbackLang]?.[key];
44
+ }
45
+ if (!message) {
46
+ message = key;
47
+ }
48
+ if (params && Object.keys(params).length > 0) {
49
+ message = deps.format(message, params);
50
+ }
51
+ return message;
52
+ };
53
+ const addMessages = (lang, messages) => {
54
+ if (!reactiveI18n.messages[lang]) {
55
+ ;
56
+ reactiveI18n.messages[lang] = {};
57
+ }
58
+ Object.assign(reactiveI18n.messages[lang], messages);
59
+ };
60
+ const removeMessages = (lang) => {
61
+ if (reactiveI18n.messages[lang]) {
62
+ delete reactiveI18n.messages[lang];
63
+ if (reactiveI18n.currentLang === lang) {
64
+ const fallbackLang = reactiveI18n.fallbackLang;
65
+ if (fallbackLang && reactiveI18n.messages[fallbackLang]) {
66
+ reactiveI18n.currentLang = fallbackLang;
67
+ }
68
+ else {
69
+ const availableLangs = Object.keys(reactiveI18n.messages);
70
+ if (availableLangs.length > 0) {
71
+ reactiveI18n.currentLang = availableLangs[0];
72
+ }
73
+ }
74
+ }
75
+ }
76
+ };
77
+ const setLang = (lang) => {
78
+ if (reactiveI18n.messages[lang]) {
79
+ reactiveI18n.currentLang = lang;
80
+ }
81
+ else {
82
+ deps.console?.warn(`Language "${lang}" is not available. Available languages:`, Object.keys(reactiveI18n.messages));
83
+ }
84
+ };
85
+ const getSupportedLangs = () => {
86
+ return Object.keys(reactiveI18n.messages);
87
+ };
88
+ Object.assign(reactiveI18n, {
89
+ t,
90
+ addMessages,
91
+ removeMessages,
92
+ setLang,
93
+ getSupportedLangs
94
+ });
95
+ return reactiveI18n;
96
+ };
97
+ //# sourceMappingURL=createI18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createI18n.js","sourceRoot":"","sources":["../../../src/functions/utils/createI18n.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface FormatStringDeps {
2
+ replace: (str: string, searchValue: string, replaceValue: string) => string;
3
+ replaceAll: (str: string, searchValue: string | RegExp, replaceValue: string) => string;
4
+ }
5
+ export declare function formatString(template: string, params: Record<string, string | number>, deps: FormatStringDeps): string;
@@ -0,0 +1,9 @@
1
+ export function formatString(template, params, deps) {
2
+ let result = template;
3
+ for (const [key, value] of Object.entries(params)) {
4
+ const placeholder = `{${key}}`;
5
+ result = deps.replace(result, placeholder, String(value));
6
+ }
7
+ return result;
8
+ }
9
+ //# sourceMappingURL=formatString.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatString.js","sourceRoot":"","sources":["../../../src/functions/utils/formatString.ts"],"names":[],"mappings":"AAkCA,MAAM,UAAU,YAAY,CAC1B,QAAgB,EAChB,MAAuC,EACvC,IAAsB;IAEtB,IAAI,MAAM,GAAG,QAAQ,CAAA;IAGrB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,MAAM,WAAW,GAAG,IAAI,GAAG,GAAG,CAAA;QAC9B,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAC3D,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}