@ainc/fs 0.1.12 → 0.1.16

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 (187) hide show
  1. package/README.md +1 -0
  2. package/dist/basename.d.ts +6 -6
  3. package/dist/basename.js +16 -16
  4. package/dist/copy.d.ts +40 -40
  5. package/dist/copy.js +89 -89
  6. package/dist/copy.js.map +1 -1
  7. package/dist/cpdir.d.ts +19 -19
  8. package/dist/cpdir.js +28 -28
  9. package/dist/cpdir.js.map +1 -1
  10. package/dist/cwd.d.ts +6 -6
  11. package/dist/cwd.js +16 -16
  12. package/dist/dirname.d.ts +6 -6
  13. package/dist/dirname.js +30 -30
  14. package/dist/extname.d.ts +6 -6
  15. package/dist/extname.js +16 -16
  16. package/dist/filename.d.ts +6 -6
  17. package/dist/filename.js +24 -24
  18. package/dist/find.d.ts +26 -26
  19. package/dist/find.js +72 -72
  20. package/dist/find.js.map +1 -1
  21. package/dist/findFile.d.ts +20 -20
  22. package/dist/findFile.js +39 -39
  23. package/dist/findFile.js.map +1 -1
  24. package/dist/finddir.d.ts +20 -20
  25. package/dist/finddir.js +39 -39
  26. package/dist/finddir.js.map +1 -1
  27. package/dist/helpers/FileResolver.d.ts +54 -0
  28. package/dist/helpers/FileResolver.d.ts.map +1 -0
  29. package/dist/helpers/FileResolver.js +184 -0
  30. package/dist/helpers/FileResolver.js.map +1 -0
  31. package/dist/helpers/compose.d.ts +14 -0
  32. package/dist/helpers/compose.d.ts.map +1 -0
  33. package/dist/helpers/compose.js +38 -0
  34. package/dist/helpers/compose.js.map +1 -0
  35. package/dist/helpers/each.d.ts +7 -0
  36. package/dist/helpers/each.d.ts.map +1 -0
  37. package/dist/helpers/each.js +21 -0
  38. package/dist/helpers/each.js.map +1 -0
  39. package/dist/helpers/match.d.ts +7 -0
  40. package/dist/helpers/match.d.ts.map +1 -0
  41. package/dist/helpers/match.js +30 -0
  42. package/dist/helpers/match.js.map +1 -0
  43. package/dist/helpers/normalizePath.d.ts +23 -0
  44. package/dist/helpers/normalizePath.d.ts.map +1 -0
  45. package/dist/helpers/normalizePath.js +37 -0
  46. package/dist/helpers/normalizePath.js.map +1 -0
  47. package/dist/helpers/safeCall.d.ts +7 -0
  48. package/dist/helpers/safeCall.d.ts.map +1 -0
  49. package/dist/helpers/safeCall.js +24 -0
  50. package/dist/helpers/safeCall.js.map +1 -0
  51. package/dist/helpers/split.d.ts +7 -0
  52. package/dist/helpers/split.d.ts.map +1 -0
  53. package/dist/helpers/split.js +25 -0
  54. package/dist/helpers/split.js.map +1 -0
  55. package/dist/helpers/stripBOM.d.ts +7 -0
  56. package/dist/helpers/stripBOM.d.ts.map +1 -0
  57. package/dist/helpers/stripBOM.js +19 -0
  58. package/dist/helpers/stripBOM.js.map +1 -0
  59. package/dist/helpers/stripComments.d.ts +7 -0
  60. package/dist/helpers/stripComments.d.ts.map +1 -0
  61. package/dist/{normalizeJSON.js → helpers/stripComments.js} +147 -145
  62. package/dist/helpers/stripComments.js.map +1 -0
  63. package/dist/homedir.d.ts +6 -6
  64. package/dist/homedir.js +31 -31
  65. package/dist/includePaths.d.ts +6 -6
  66. package/dist/includePaths.js +53 -53
  67. package/dist/includePaths.js.map +1 -1
  68. package/dist/index.d.ts +43 -44
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +90 -92
  71. package/dist/index.js.map +1 -1
  72. package/dist/indir.d.ts +13 -13
  73. package/dist/indir.js +26 -26
  74. package/dist/isAbsolutePath.d.ts +6 -6
  75. package/dist/isAbsolutePath.js +24 -24
  76. package/dist/isDirectory.d.ts +12 -12
  77. package/dist/isDirectory.js +26 -26
  78. package/dist/isDirectory.js.map +1 -1
  79. package/dist/isRelativePath.d.ts +6 -6
  80. package/dist/isRelativePath.js +44 -44
  81. package/dist/json.d.ts +21 -21
  82. package/dist/json.d.ts.map +1 -1
  83. package/dist/json.js +34 -33
  84. package/dist/json.js.map +1 -1
  85. package/dist/jsonc.d.ts +27 -21
  86. package/dist/jsonc.d.ts.map +1 -1
  87. package/dist/jsonc.js +49 -40
  88. package/dist/jsonc.js.map +1 -1
  89. package/dist/lstat.d.ts +22 -22
  90. package/dist/lstat.js +30 -30
  91. package/dist/mapdir.d.ts +22 -22
  92. package/dist/mapdir.js +42 -42
  93. package/dist/mapdir.js.map +1 -1
  94. package/dist/mkdir.d.ts +6 -6
  95. package/dist/mkdir.js +37 -37
  96. package/dist/mkdir.js.map +1 -1
  97. package/dist/parseJSON.d.ts +16 -0
  98. package/dist/parseJSON.d.ts.map +1 -0
  99. package/dist/parseJSON.js +29 -0
  100. package/dist/parseJSON.js.map +1 -0
  101. package/dist/readFile.d.ts +29 -29
  102. package/dist/readFile.js +26 -26
  103. package/dist/readFile.js.map +1 -1
  104. package/dist/readStream.d.ts +36 -36
  105. package/dist/readStream.d.ts.map +1 -1
  106. package/dist/readStream.js +19 -19
  107. package/dist/readStream.js.map +1 -1
  108. package/dist/readdir.d.ts +16 -16
  109. package/dist/readdir.js +34 -34
  110. package/dist/readdir.js.map +1 -1
  111. package/dist/readline.d.ts +16 -16
  112. package/dist/readline.d.ts.map +1 -1
  113. package/dist/readline.js +24 -24
  114. package/dist/readline.js.map +1 -1
  115. package/dist/realpath.d.ts +12 -12
  116. package/dist/realpath.js +32 -32
  117. package/dist/realpath.js.map +1 -1
  118. package/dist/relative.d.ts +6 -6
  119. package/dist/relative.js +38 -38
  120. package/dist/resolve.d.ts +26 -26
  121. package/dist/resolve.js +53 -53
  122. package/dist/resolve.js.map +1 -1
  123. package/dist/resolvePath.d.ts +27 -0
  124. package/dist/resolvePath.d.ts.map +1 -0
  125. package/dist/resolvePath.js +178 -0
  126. package/dist/resolvePath.js.map +1 -0
  127. package/dist/rmdir.d.ts +6 -6
  128. package/dist/rmdir.js +40 -40
  129. package/dist/rmdir.js.map +1 -1
  130. package/dist/stat.d.ts +21 -21
  131. package/dist/stat.js +30 -30
  132. package/dist/supdir.d.ts +21 -15
  133. package/dist/supdir.d.ts.map +1 -1
  134. package/dist/supdir.js +62 -35
  135. package/dist/supdir.js.map +1 -1
  136. package/dist/symlink.d.ts +22 -22
  137. package/dist/symlink.js +39 -39
  138. package/dist/symlink.js.map +1 -1
  139. package/dist/unlink.d.ts +6 -6
  140. package/dist/unlink.js +28 -28
  141. package/dist/unlink.js.map +1 -1
  142. package/dist/usedir.d.ts +6 -6
  143. package/dist/usedir.js +24 -24
  144. package/dist/writeFile.d.ts +33 -33
  145. package/dist/writeFile.js +49 -49
  146. package/dist/writeFile.js.map +1 -1
  147. package/dist/writeStream.d.ts +35 -35
  148. package/dist/writeStream.d.ts.map +1 -1
  149. package/dist/writeStream.js +19 -19
  150. package/dist/writeStream.js.map +1 -1
  151. package/package.json +4 -4
  152. package/src/helpers/FileResolver.ts +282 -0
  153. package/src/helpers/compose.ts +49 -0
  154. package/src/helpers/each.ts +19 -0
  155. package/src/helpers/match.ts +31 -0
  156. package/src/helpers/normalizePath.ts +51 -0
  157. package/src/helpers/safeCall.ts +21 -0
  158. package/src/helpers/split.ts +25 -0
  159. package/src/helpers/stripBOM.ts +17 -0
  160. package/src/{normalizeJSON.ts → helpers/stripComments.ts} +58 -52
  161. package/src/index.ts +2 -3
  162. package/src/json.ts +2 -1
  163. package/src/jsonc.ts +22 -11
  164. package/src/parseJSON.ts +40 -0
  165. package/src/readStream.ts +2 -2
  166. package/src/readline.ts +2 -2
  167. package/src/resolvePath.ts +234 -0
  168. package/src/supdir.ts +31 -0
  169. package/src/writeStream.ts +2 -2
  170. package/dist/normalizeJSON.d.ts +0 -7
  171. package/dist/normalizeJSON.d.ts.map +0 -1
  172. package/dist/normalizeJSON.js.map +0 -1
  173. package/dist/resolveFile.d.ts +0 -22
  174. package/dist/resolveFile.d.ts.map +0 -1
  175. package/dist/resolveFile.js +0 -80
  176. package/dist/resolveFile.js.map +0 -1
  177. package/dist/resolveModule.d.ts +0 -41
  178. package/dist/resolveModule.d.ts.map +0 -1
  179. package/dist/resolveModule.js +0 -119
  180. package/dist/resolveModule.js.map +0 -1
  181. package/dist/resolvePaths.d.ts +0 -22
  182. package/dist/resolvePaths.d.ts.map +0 -1
  183. package/dist/resolvePaths.js +0 -233
  184. package/dist/resolvePaths.js.map +0 -1
  185. package/src/resolveFile.ts +0 -103
  186. package/src/resolveModule.ts +0 -157
  187. package/src/resolvePaths.ts +0 -320
@@ -25,24 +25,6 @@ function isEscaped(index: number, source: string): number {
25
25
  }
26
26
 
27
27
 
28
- /**
29
- *****************************************
30
- * 判断是否为结尾的逗号
31
- *****************************************
32
- */
33
- function isTrailingComma(start: number, source: string): boolean {
34
- let ch = source[start];
35
-
36
- // 过滤空白字符
37
- while (' \n\r'.indexOf(ch) > -1) {
38
- ch = source[++ start];
39
- }
40
-
41
- // 返回是否为结束符
42
- return '}]'.indexOf(ch) > -1;
43
- }
44
-
45
-
46
28
  /**
47
29
  *****************************************
48
30
  * 查找字符串结束
@@ -95,73 +77,97 @@ function indexBlockCommentEnd(start: number, source: string): number {
95
77
  }
96
78
 
97
79
 
80
+ /**
81
+ *****************************************
82
+ * 过滤末尾逗号
83
+ *****************************************
84
+ */
85
+ function stripTrailingComma(buffer: Buffer, offset: number): number {
86
+ let idx = offset - 1;
87
+ let code = buffer[idx];
88
+
89
+ // 路过空白字符
90
+ while ([0x20, 0x0a, 0x0d].includes(buffer[idx])) {
91
+ idx --;
92
+ code = buffer[idx];
93
+ }
94
+
95
+ // 判断为非逗号
96
+ if (code !== 0x2c) {
97
+ return offset;
98
+ }
99
+
100
+ // 移动字符
101
+ while (idx < offset) {
102
+ buffer[idx] = buffer[++ idx];
103
+ }
104
+
105
+ // 返回新索引
106
+ return offset - 1;
107
+ }
108
+
109
+
98
110
  /**
99
111
  *****************************************
100
112
  * 过滤注释
101
113
  *****************************************
102
114
  */
103
- export function normalizeJSON(content: string): string {
104
- let result = '';
105
- let idx = 0;
106
- let len = content.length;
107
- let start = 0;
108
-
109
- // 检测第一个字符是否为BOM
110
- if (content.charCodeAt(0) === 0xFEFF) {
111
- idx = start = 1;
115
+ export function stripComments(content: string): string {
116
+ const size = content.length;
117
+ const buffer = Buffer.alloc(3 * size);
118
+
119
+ // 定义索引位置
120
+ let idx = content.charCodeAt(0) === 0xFEFF ? 1 : 0;
121
+ let offset = 0;
122
+
123
+ // 写入内容
124
+ function write(value: string): void {
125
+
126
+ // 去除末尾的逗号
127
+ if (value === ']' || value === '}') {
128
+ offset = stripTrailingComma(buffer, offset);
129
+ }
130
+
131
+ // 写入内容
132
+ offset += buffer.write(value, offset, 'utf8');
112
133
  }
113
134
 
114
135
  // 遍历字符
115
- while (idx < len) {
116
- const ch = content[idx];
136
+ while (idx < size) {
137
+ let ch = content.charAt(idx);
117
138
 
118
139
  // 跳过字符串
119
140
  if (ch === '"' || ch === '\'') {
120
- idx = indexStringEnd(idx + 1, ch, content);
141
+ write(content.slice(idx, idx = indexStringEnd(idx + 1, ch, content)));
121
142
  continue;
122
143
  }
123
144
 
124
145
  // 自增偏移
125
146
  idx ++;
126
147
 
127
- // 判断是为结尾的逗号
128
- if (ch === ',' && isTrailingComma(idx, content)) {
129
- result += content.slice(start, idx - 1);
130
- start = idx;
131
- idx = start + 1;
132
- continue;
133
- }
134
-
135
148
  // 非注释
136
149
  if (ch !== '/') {
150
+ write(ch);
137
151
  continue;
138
152
  }
139
153
 
140
154
  // 获取下一字符
141
- const next = content[idx];
155
+ const next = content.charAt(idx);
142
156
 
143
157
  // 处理行注释
144
158
  if (next === '/') {
145
- result += content.slice(start, idx - 1);
146
- start = indexLineCommentEnd(idx + 1, content);
147
- idx = start + 1;
159
+ idx = indexLineCommentEnd(idx + 1, content);
148
160
  continue;
149
161
  }
150
162
 
151
163
  // 处理多行注释
152
164
  if (next === '*') {
153
- result += content.slice(start, idx - 1);
154
- start = indexBlockCommentEnd(idx + 2, content);
155
- idx = start;
165
+ idx = indexBlockCommentEnd(idx + 2, content);
156
166
  continue;
157
167
  }
158
168
  }
159
169
 
160
- // 添加结束片段
161
- if (start < len) {
162
- result += content.slice(start);
163
- }
164
-
165
- // 返回结果
166
- return result;
170
+ // 输出结果
171
+ return buffer.slice(0, offset).toString('utf8');
167
172
  }
173
+
package/src/index.ts CHANGED
@@ -25,6 +25,7 @@ export { isDirectory } from './isDirectory';
25
25
  export { indir } from './indir';
26
26
  export { json } from './json';
27
27
  export { jsonc } from './jsonc';
28
+ export { parseJSON } from './parseJSON';
28
29
  export { copy } from './copy';
29
30
  export { cpdir } from './cpdir';
30
31
  export { find } from './find';
@@ -45,9 +46,7 @@ export { mapdir } from './mapdir';
45
46
  export { symlink } from './symlink';
46
47
  export { usedir } from './usedir';
47
48
  export { supdir } from './supdir';
48
- export { resolveFile } from './resolveFile';
49
- export { resolveModule } from './resolveModule';
50
- export { resolvePaths } from './resolvePaths';
49
+ export { resolvePath } from './resolvePath';
51
50
  export { includePaths } from './includePaths';
52
51
  export { isAbsolutePath } from './isAbsolutePath';
53
52
  export { isRelativePath } from './isRelativePath';
package/src/json.ts CHANGED
@@ -15,6 +15,7 @@
15
15
  import { stat } from './stat';
16
16
  import { readFile } from './readFile';
17
17
  import { writeFile } from './writeFile';
18
+ import { stripBOM } from './helpers/stripBOM';
18
19
 
19
20
 
20
21
  /**
@@ -44,7 +45,7 @@ function json<T = Data>(...args: [string] | [string, T]): T | null {
44
45
  const stats = stat(name);
45
46
 
46
47
  if (stats && stats.isFile()) {
47
- return JSON.parse(readFile(stats.path));
48
+ return JSON.parse(stripBOM(readFile(stats.path)));
48
49
  }
49
50
  }
50
51
 
package/src/jsonc.ts CHANGED
@@ -15,7 +15,7 @@
15
15
  import { stat } from './stat';
16
16
  import { readFile } from './readFile';
17
17
  import { writeFile } from './writeFile';
18
- import { normalizeJSON } from './normalizeJSON';
18
+ import { stripComments } from './helpers/stripComments';
19
19
 
20
20
 
21
21
  /**
@@ -28,6 +28,24 @@ interface Data {
28
28
  }
29
29
 
30
30
 
31
+ /**
32
+ *****************************************
33
+ * 解析内容
34
+ *****************************************
35
+ */
36
+ function parse<T = Data>(content: string): T | null {
37
+
38
+ // 格式化内容
39
+ content = stripComments(content);
40
+
41
+ // 打印输出
42
+ // console.log(content);
43
+
44
+ // 解析文件
45
+ return content ? JSON.parse(content) : null;
46
+ }
47
+
48
+
31
49
  /**
32
50
  *****************************************
33
51
  * 读取/写入【jsonc】文件
@@ -44,16 +62,9 @@ function jsonc<T = Data>(...args: [string] | [string, T]): T | null {
44
62
  } else {
45
63
  const stats = stat(name);
46
64
 
65
+ // 解析文件
47
66
  if (stats && stats.isFile()) {
48
- const content = normalizeJSON(readFile(stats.path));
49
-
50
- // 空白文件
51
- if (!content.trim()) {
52
- return null;
53
- }
54
-
55
- // 解析文件
56
- return JSON.parse(content);
67
+ return parse(readFile(stats.path));
57
68
  }
58
69
  }
59
70
 
@@ -67,4 +78,4 @@ function jsonc<T = Data>(...args: [string] | [string, T]): T | null {
67
78
  * 抛出接口
68
79
  *****************************************
69
80
  */
70
- export { jsonc };
81
+ export { jsonc, parse };
@@ -0,0 +1,40 @@
1
+ /**
2
+ *****************************************
3
+ * Created by edonet@163.com
4
+ * Created on 2022-01-01 21:01:19
5
+ *****************************************
6
+ */
7
+ 'use strict';
8
+
9
+
10
+ /**
11
+ *****************************************
12
+ * 加载依赖
13
+ *****************************************
14
+ */
15
+ import { stripBOM } from './helpers/stripBOM';
16
+ import { stripComments } from './helpers/stripComments';
17
+
18
+
19
+ /**
20
+ *****************************************
21
+ * 选项
22
+ *****************************************
23
+ */
24
+ interface Options {
25
+ comments?: boolean;
26
+ }
27
+
28
+
29
+ /**
30
+ *****************************************
31
+ * 解析【JSON】文件
32
+ *****************************************
33
+ */
34
+ export function parseJSON<T>(content: string, options: Options = {}): T {
35
+ const normalized = options.comments ? stripComments(content) : stripBOM(content);
36
+ const source = normalized.trim();
37
+
38
+ // 解析内容
39
+ return source ? JSON.parse(source) : undefined;
40
+ }
package/src/readStream.ts CHANGED
@@ -38,9 +38,9 @@ export interface Options {
38
38
  * 创建可读流
39
39
  *****************************************
40
40
  */
41
- function readStream(path: string, encoding?: string): fs.ReadStream;
41
+ function readStream(path: string, encoding?: BufferEncoding): fs.ReadStream;
42
42
  function readStream(path: string, options?: Options): fs.ReadStream;
43
- function readStream(path: string, options?: string | Options): fs.ReadStream {
43
+ function readStream(path: string, options?: BufferEncoding | Options): fs.ReadStream {
44
44
  return fs.createReadStream(path, options);
45
45
  }
46
46
 
package/src/readline.ts CHANGED
@@ -23,9 +23,9 @@ import { Options } from './readStream';
23
23
  * 逐行读取
24
24
  *****************************************
25
25
  */
26
- function readline(path: string, encoding?: string): Readable;
26
+ function readline(path: string, encoding?: BufferEncoding): Readable;
27
27
  function readline(path: string, options?: Options): Readable;
28
- function readline(path: string, options?: string | Options): Readable {
28
+ function readline(path: string, options?: BufferEncoding | Options): Readable {
29
29
  const input = fs.createReadStream(path, options);
30
30
  const readable = Readable.from(createInterface({ input, crlfDelay: Infinity }));
31
31
 
@@ -0,0 +1,234 @@
1
+ /**
2
+ *****************************************
3
+ * Created by edonet@163.com
4
+ * Created on 2021-06-19 00:16:40
5
+ *****************************************
6
+ */
7
+ 'use strict';
8
+
9
+
10
+ /**
11
+ *****************************************
12
+ * 加载依赖
13
+ *****************************************
14
+ */
15
+ import { createFileResolver, FileResolver, Handler, Options as FileOptions } from './helpers/FileResolver';
16
+ import { split } from './helpers/split';
17
+ import { each } from './helpers/each';
18
+ import { compose } from './helpers/compose';
19
+ import { cwd } from './cwd';
20
+
21
+
22
+ /**
23
+ *****************************************
24
+ * 格式化别名
25
+ *****************************************
26
+ */
27
+ function normalizePaths(value: string | string[]): void | string[] {
28
+
29
+ // 校验值
30
+ if (!value) {
31
+ return;
32
+ }
33
+
34
+ // 处理字符串配置
35
+ if (typeof value === 'string') {
36
+ return [value];
37
+ }
38
+
39
+ // 校验数组配置参数
40
+ if (!Array.isArray(value) || !value.length) {
41
+ return;
42
+ }
43
+
44
+ // 校验参数
45
+ if (value.find(path => !path || typeof path !== 'string')) {
46
+ throw new Error('expect paths value to be valid string[]!');
47
+ }
48
+
49
+ // 返回结果
50
+ return value;
51
+ }
52
+
53
+
54
+ /**
55
+ *****************************************
56
+ * 创建路径解析器
57
+ *****************************************
58
+ */
59
+ function createPathsResolver(resolver: FileResolver, options: Options): Handler {
60
+ const rules: Handler[] = [];
61
+ const baseURL = cwd(options.context || process.cwd(), options.baseUrl || './');
62
+ const resolvePath = resolver.resolvePath;
63
+
64
+ // 解析路径
65
+ function resolvePaths(paths: string[]): Handler {
66
+ return compose(paths.map(value => {
67
+ const [start, end] = split(value, '*');
68
+
69
+ // 处理绝对匹配
70
+ if (end === undefined) {
71
+ return (_, context) => resolvePath(cwd(baseURL, start), context);
72
+ } else {
73
+ return (id, context) => resolvePath(cwd(baseURL, start + id + end), context);
74
+ }
75
+ }));
76
+ }
77
+
78
+ // 校验存在路径映射配置
79
+ each(options.paths, (value, key) => {
80
+ const paths = normalizePaths(value);
81
+
82
+ // 校验配置
83
+ if (!paths) {
84
+ return;
85
+ }
86
+
87
+ // 生成解析函数
88
+ const resolve = resolvePaths(paths);
89
+
90
+ // 解析匹配项
91
+ const [start, end] = split(key, '*');
92
+
93
+ // 完成匹配
94
+ if (end === undefined) {
95
+ return rules.push((id, context) => {
96
+ return id === start ? resolve('', context) : undefined;
97
+ });
98
+ }
99
+
100
+ // 获取前/后缀长度
101
+ const startLength = start.length;
102
+ const endLength = end.length;
103
+ const idx = (startLength ? 1 : 0) + (endLength ? 2 : 0);
104
+
105
+ // 匹配前缀
106
+ if (idx === 1) {
107
+ return rules.push((id, context) => {
108
+ if (id.startsWith(start)) {
109
+ return resolve(id.slice(startLength), context);
110
+ }
111
+ });
112
+ }
113
+
114
+ // 匹配后缀
115
+ if (idx === 2) {
116
+ return rules.push((id, context) => {
117
+ if (id.endsWith(end)) {
118
+ return resolve(id.slice(0, - endLength), context);
119
+ }
120
+ });
121
+ }
122
+
123
+ // 匹配前缀和后缀
124
+ if (idx === 3) {
125
+ return rules.push((id, context) => {
126
+ if (id.startsWith(start) && id.endsWith(end)) {
127
+ return resolve(id.slice(startLength, - endLength), context);
128
+ }
129
+ });
130
+ }
131
+
132
+ // 默认完全匹配
133
+ return rules.push((id, context) => resolve(id, context));
134
+ });
135
+
136
+ // 组件规则解析方法
137
+ if (rules.length) {
138
+ return resolver.wrapHandler(compose([...rules, resolver.resolveModule]));
139
+ } else {
140
+ return resolvePath;
141
+ }
142
+ }
143
+
144
+
145
+ /**
146
+ *****************************************
147
+ * 创建别名解析器
148
+ *****************************************
149
+ */
150
+ function createAliasResolver(resolver: FileResolver, options: Options): Handler {
151
+ const resolvePaths = createPathsResolver(resolver, options);
152
+ const rules: Handler[] = [];
153
+
154
+ // 解析别名
155
+ each(options.alias, (value, key) => {
156
+ const paths = normalizePaths(value);
157
+
158
+ // 校验参数
159
+ if (!paths) {
160
+ return;
161
+ }
162
+
163
+ // 生成解析函数
164
+ const resolve: Handler = compose(
165
+ paths.map(start => (id, context) => resolvePaths(start + id, context))
166
+ );
167
+
168
+ // 绝对匹配
169
+ if (key.endsWith('$')) {
170
+
171
+ // 去除匹配符
172
+ key = key.slice(0, -1);
173
+
174
+ // 添加匹配规则
175
+ return rules.push(
176
+ (id, context) => (id === key ? resolve('', context) : undefined)
177
+ );
178
+ }
179
+
180
+ // 生成配置前缀
181
+ const prefix = key + '/';
182
+ const prefixLength = key.length;
183
+
184
+ // 添加匹配规则
185
+ return rules.push(
186
+ (id, context) => (id === key ? resolve('', context) : undefined),
187
+ (id, context) => (id.startsWith(prefix) ? resolve(id.slice(prefixLength), context) : undefined)
188
+ );
189
+ });
190
+
191
+ // 返回解析函数
192
+ if (rules.length) {
193
+ return resolver.wrapHandler(compose([...rules, resolvePaths]));
194
+ } else {
195
+ return resolvePaths;
196
+ }
197
+ }
198
+
199
+
200
+ /**
201
+ *****************************************
202
+ * 选项
203
+ *****************************************
204
+ */
205
+ export interface Options extends FileOptions {
206
+ baseUrl?: string;
207
+ paths?: {
208
+ [key: string]: string[];
209
+ };
210
+ alias?: {
211
+ [key: string]: string | string[];
212
+ };
213
+ }
214
+
215
+
216
+ /**
217
+ *****************************************
218
+ * 解析文件
219
+ *****************************************
220
+ */
221
+ export function resolvePath(options: Options = {}): Handler {
222
+ const modules = options.modules || ['node_modules'];
223
+
224
+ // 添加基准模块解析
225
+ if (options.baseUrl || options.paths) {
226
+ modules.unshift(options.baseUrl || '.');
227
+ }
228
+
229
+ // 创建文件解析器
230
+ const resolver = createFileResolver({ ...options, modules });
231
+
232
+ // 返回解析函数
233
+ return createAliasResolver(resolver, options);
234
+ }
package/src/supdir.ts CHANGED
@@ -16,6 +16,37 @@ import * as path from 'path';
16
16
  import { dirname } from './dirname';
17
17
 
18
18
 
19
+ /**
20
+ *****************************************
21
+ * 遍历目录
22
+ *****************************************
23
+ */
24
+ export function mapdir(dir: string, handler: (dir: string) => void): void {
25
+ const resolveFrom = path.resolve(dir);
26
+ const sep = path.sep;
27
+ const end = resolveFrom.indexOf(sep);
28
+
29
+ // 不存在结束符
30
+ if (end < 0) {
31
+ return handler(resolveFrom);
32
+ }
33
+
34
+ // 遍历目录
35
+ for (let idx = resolveFrom.length; idx >= end; ) {
36
+
37
+ // 执行回调
38
+ if (idx === 0) {
39
+ return handler('/');
40
+ } else {
41
+ handler(resolveFrom.slice(0, idx));
42
+ }
43
+
44
+ // 更新索引
45
+ idx = resolveFrom.lastIndexOf(sep, idx - 1);
46
+ }
47
+ }
48
+
49
+
19
50
  /**
20
51
  *****************************************
21
52
  * 查找上一级目录回调
@@ -37,9 +37,9 @@ interface Options {
37
37
  * 创建可写流
38
38
  *****************************************
39
39
  */
40
- function writeStream(path: string, encoding?: string): fs.WriteStream;
40
+ function writeStream(path: string, encoding?: BufferEncoding): fs.WriteStream;
41
41
  function writeStream(path: string, options?: Options): fs.WriteStream;
42
- function writeStream(path: string, options?: string | Options): fs.WriteStream {
42
+ function writeStream(path: string, options?: BufferEncoding | Options): fs.WriteStream {
43
43
  return fs.createWriteStream(path, options);
44
44
  }
45
45
 
@@ -1,7 +0,0 @@
1
- /**
2
- *****************************************
3
- * 过滤注释
4
- *****************************************
5
- */
6
- export declare function normalizeJSON(content: string): string;
7
- //# sourceMappingURL=normalizeJSON.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"normalizeJSON.d.ts","sourceRoot":"","sources":["../src/normalizeJSON.ts"],"names":[],"mappings":"AAiGA;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAgErD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"normalizeJSON.js","sourceRoot":"","sources":["../src/normalizeJSON.ts"],"names":[],"mappings":"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"}
@@ -1,22 +0,0 @@
1
- /**
2
- *****************************************
3
- * 配置项
4
- *****************************************
5
- */
6
- export interface Options {
7
- extensions?: string[];
8
- mainFields?: string[];
9
- }
10
- /**
11
- *****************************************
12
- * 匹配列表
13
- *****************************************
14
- */
15
- export declare function match<T, P>(list: T[], handler: (data: T, index: number) => void | P): void | P;
16
- /**
17
- *****************************************
18
- * 解析文件
19
- *****************************************
20
- */
21
- export declare function resolveFile(file: string, options?: Options): void | string;
22
- //# sourceMappingURL=resolveFile.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolveFile.d.ts","sourceRoot":"","sources":["../src/resolveFile.ts"],"names":[],"mappings":"AAmBA;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAGD;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAgB9F;AAGD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,OAAY,GAAG,IAAI,GAAG,MAAM,CA2C9E"}