agent-ide 0.8.2 → 0.9.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.
- package/dist/core/change-signature/call-site-updater.d.ts +108 -0
- package/dist/core/change-signature/call-site-updater.d.ts.map +1 -0
- package/dist/core/change-signature/call-site-updater.js +347 -0
- package/dist/core/change-signature/call-site-updater.js.map +1 -0
- package/dist/core/change-signature/change-signature-service.d.ts +4 -55
- package/dist/core/change-signature/change-signature-service.d.ts.map +1 -1
- package/dist/core/change-signature/change-signature-service.js +17 -483
- package/dist/core/change-signature/change-signature-service.js.map +1 -1
- package/dist/core/change-signature/index.d.ts +4 -0
- package/dist/core/change-signature/index.d.ts.map +1 -1
- package/dist/core/change-signature/index.js +5 -0
- package/dist/core/change-signature/index.js.map +1 -1
- package/dist/core/change-signature/signature-transformer.d.ts +20 -0
- package/dist/core/change-signature/signature-transformer.d.ts.map +1 -0
- package/dist/core/change-signature/signature-transformer.js +91 -0
- package/dist/core/change-signature/signature-transformer.js.map +1 -0
- package/dist/core/change-signature/signature-validator.d.ts +30 -0
- package/dist/core/change-signature/signature-validator.d.ts.map +1 -0
- package/dist/core/change-signature/signature-validator.js +152 -0
- package/dist/core/change-signature/signature-validator.js.map +1 -0
- package/dist/core/change-signature/utils.d.ts +19 -0
- package/dist/core/change-signature/utils.d.ts.map +1 -0
- package/dist/core/change-signature/utils.js +23 -0
- package/dist/core/change-signature/utils.js.map +1 -0
- package/dist/core/cycles/cycle-detector.d.ts.map +1 -1
- package/dist/core/cycles/cycle-detector.js +16 -8
- package/dist/core/cycles/cycle-detector.js.map +1 -1
- package/dist/core/cycles/index.d.ts +1 -1
- package/dist/core/cycles/index.d.ts.map +1 -1
- package/dist/core/cycles/index.js +1 -1
- package/dist/core/cycles/index.js.map +1 -1
- package/dist/core/cycles/types.d.ts +20 -4
- package/dist/core/cycles/types.d.ts.map +1 -1
- package/dist/core/cycles/types.js +22 -4
- package/dist/core/cycles/types.js.map +1 -1
- package/dist/core/deadcode/dead-code-remover.js +4 -4
- package/dist/core/deadcode/dead-code-remover.js.map +1 -1
- package/dist/core/impact/dependency-extractor.d.ts +25 -0
- package/dist/core/impact/dependency-extractor.d.ts.map +1 -0
- package/dist/core/impact/dependency-extractor.js +65 -0
- package/dist/core/impact/dependency-extractor.js.map +1 -0
- package/dist/core/impact/file-scanner.d.ts +52 -0
- package/dist/core/impact/file-scanner.d.ts.map +1 -0
- package/dist/core/impact/file-scanner.js +131 -0
- package/dist/core/impact/file-scanner.js.map +1 -0
- package/dist/core/impact/impact-analyzer.d.ts +3 -64
- package/dist/core/impact/impact-analyzer.d.ts.map +1 -1
- package/dist/core/impact/impact-analyzer.js +13 -312
- package/dist/core/impact/impact-analyzer.js.map +1 -1
- package/dist/core/impact/index.d.ts +3 -0
- package/dist/core/impact/index.d.ts.map +1 -1
- package/dist/core/impact/index.js +3 -0
- package/dist/core/impact/index.js.map +1 -1
- package/dist/core/impact/path-resolver.d.ts +35 -0
- package/dist/core/impact/path-resolver.d.ts.map +1 -0
- package/dist/core/impact/path-resolver.js +166 -0
- package/dist/core/impact/path-resolver.js.map +1 -0
- package/dist/core/move/file-scanner.d.ts +48 -0
- package/dist/core/move/file-scanner.d.ts.map +1 -0
- package/dist/core/move/file-scanner.js +137 -0
- package/dist/core/move/file-scanner.js.map +1 -0
- package/dist/core/move/import-resolver.d.ts +5 -0
- package/dist/core/move/import-resolver.d.ts.map +1 -1
- package/dist/core/move/import-resolver.js +24 -6
- package/dist/core/move/import-resolver.js.map +1 -1
- package/dist/core/move/index.d.ts +7 -3
- package/dist/core/move/index.d.ts.map +1 -1
- package/dist/core/move/index.js +7 -2
- package/dist/core/move/index.js.map +1 -1
- package/dist/core/move/move-service.d.ts +11 -60
- package/dist/core/move/move-service.d.ts.map +1 -1
- package/dist/core/move/move-service.js +16 -352
- package/dist/core/move/move-service.js.map +1 -1
- package/dist/core/move/path-calculator.d.ts +49 -0
- package/dist/core/move/path-calculator.d.ts.map +1 -0
- package/dist/core/move/path-calculator.js +158 -0
- package/dist/core/move/path-calculator.js.map +1 -0
- package/dist/core/move/path-parser.d.ts +33 -0
- package/dist/core/move/path-parser.d.ts.map +1 -0
- package/dist/core/move/path-parser.js +53 -0
- package/dist/core/move/path-parser.js.map +1 -0
- package/dist/core/move/path-utils.d.ts +70 -0
- package/dist/core/move/path-utils.d.ts.map +1 -0
- package/dist/core/move/path-utils.js +201 -0
- package/dist/core/move/path-utils.js.map +1 -0
- package/dist/core/move/types.d.ts +81 -18
- package/dist/core/move/types.d.ts.map +1 -1
- package/dist/core/move/types.js +73 -5
- package/dist/core/move/types.js.map +1 -1
- package/dist/core/move-member/change-applier.d.ts +23 -0
- package/dist/core/move-member/change-applier.d.ts.map +1 -0
- package/dist/core/move-member/change-applier.js +51 -0
- package/dist/core/move-member/change-applier.js.map +1 -0
- package/dist/core/move-member/file-change-preparer.d.ts +49 -0
- package/dist/core/move-member/file-change-preparer.d.ts.map +1 -0
- package/dist/core/move-member/file-change-preparer.js +340 -0
- package/dist/core/move-member/file-change-preparer.js.map +1 -0
- package/dist/core/move-member/index.d.ts +4 -1
- package/dist/core/move-member/index.d.ts.map +1 -1
- package/dist/core/move-member/index.js +3 -0
- package/dist/core/move-member/index.js.map +1 -1
- package/dist/core/move-member/member-extractor.d.ts +11 -0
- package/dist/core/move-member/member-extractor.d.ts.map +1 -1
- package/dist/core/move-member/member-extractor.js +114 -22
- package/dist/core/move-member/member-extractor.js.map +1 -1
- package/dist/core/move-member/move-member-service.d.ts +3 -78
- package/dist/core/move-member/move-member-service.d.ts.map +1 -1
- package/dist/core/move-member/move-member-service.js +35 -419
- package/dist/core/move-member/move-member-service.js.map +1 -1
- package/dist/core/move-member/reference-updater.d.ts +73 -0
- package/dist/core/move-member/reference-updater.d.ts.map +1 -0
- package/dist/core/move-member/reference-updater.js +286 -0
- package/dist/core/move-member/reference-updater.js.map +1 -0
- package/dist/core/move-member/types.d.ts +17 -2
- package/dist/core/move-member/types.d.ts.map +1 -1
- package/dist/core/move-member/types.js.map +1 -1
- package/dist/core/rename/reference-updater.d.ts.map +1 -1
- package/dist/core/rename/reference-updater.js +4 -1
- package/dist/core/rename/reference-updater.js.map +1 -1
- package/dist/core/rename/rename-engine.d.ts +5 -3
- package/dist/core/rename/rename-engine.d.ts.map +1 -1
- package/dist/core/rename/rename-engine.js +29 -8
- package/dist/core/rename/rename-engine.js.map +1 -1
- package/dist/core/shared/symbol-finder/symbol-finder.d.ts.map +1 -1
- package/dist/core/shared/symbol-finder/symbol-finder.js +9 -1
- package/dist/core/shared/symbol-finder/symbol-finder.js.map +1 -1
- package/dist/infrastructure/changeset/change-applicator.d.ts +1 -1
- package/dist/infrastructure/changeset/change-applicator.d.ts.map +1 -1
- package/dist/infrastructure/changeset/change-applicator.js +22 -21
- package/dist/infrastructure/changeset/change-applicator.js.map +1 -1
- package/dist/infrastructure/changeset/changeset-builder.d.ts +2 -2
- package/dist/infrastructure/changeset/changeset-builder.d.ts.map +1 -1
- package/dist/infrastructure/changeset/changeset-builder.js +11 -6
- package/dist/infrastructure/changeset/changeset-builder.js.map +1 -1
- package/dist/infrastructure/changeset/changeset-converter.d.ts +1 -1
- package/dist/infrastructure/changeset/changeset-converter.d.ts.map +1 -1
- package/dist/infrastructure/changeset/changeset-converter.js +9 -8
- package/dist/infrastructure/changeset/changeset-converter.js.map +1 -1
- package/dist/infrastructure/changeset/index.d.ts +1 -0
- package/dist/infrastructure/changeset/index.d.ts.map +1 -1
- package/dist/infrastructure/changeset/index.js +2 -0
- package/dist/infrastructure/changeset/index.js.map +1 -1
- package/dist/infrastructure/changeset/types.d.ts +41 -4
- package/dist/infrastructure/changeset/types.d.ts.map +1 -1
- package/dist/infrastructure/changeset/types.js +41 -1
- package/dist/infrastructure/changeset/types.js.map +1 -1
- package/dist/interfaces/cli/cli.d.ts.map +1 -1
- package/dist/interfaces/cli/cli.js +1 -2
- package/dist/interfaces/cli/cli.js.map +1 -1
- package/dist/interfaces/cli/commands/index.d.ts +0 -1
- package/dist/interfaces/cli/commands/index.d.ts.map +1 -1
- package/dist/interfaces/cli/commands/index.js +0 -1
- package/dist/interfaces/cli/commands/index.js.map +1 -1
- package/dist/interfaces/cli/commands/move.command.d.ts +1 -0
- package/dist/interfaces/cli/commands/move.command.d.ts.map +1 -1
- package/dist/interfaces/cli/commands/move.command.js +127 -11
- package/dist/interfaces/cli/commands/move.command.js.map +1 -1
- package/dist/interfaces/cli/commands/rename.command.d.ts.map +1 -1
- package/dist/interfaces/cli/commands/rename.command.js +114 -6
- package/dist/interfaces/cli/commands/rename.command.js.map +1 -1
- package/dist/plugins/javascript/declaration-analyzer.d.ts.map +1 -1
- package/dist/plugins/javascript/declaration-analyzer.js +9 -0
- package/dist/plugins/javascript/declaration-analyzer.js.map +1 -1
- package/dist/plugins/typescript/declaration-analyzer.d.ts.map +1 -1
- package/dist/plugins/typescript/declaration-analyzer.js +4 -0
- package/dist/plugins/typescript/declaration-analyzer.js.map +1 -1
- package/dist/plugins/typescript/reference-finder.d.ts.map +1 -1
- package/dist/plugins/typescript/reference-finder.js +11 -2
- package/dist/plugins/typescript/reference-finder.js.map +1 -1
- package/dist/plugins/typescript/symbol-extractor.d.ts.map +1 -1
- package/dist/plugins/typescript/symbol-extractor.js +6 -2
- package/dist/plugins/typescript/symbol-extractor.js.map +1 -1
- package/package.json +1 -1
- package/dist/interfaces/cli/commands/move-member.command.d.ts +0 -11
- package/dist/interfaces/cli/commands/move-member.command.d.ts.map +0 -1
- package/dist/interfaces/cli/commands/move-member.command.js +0 -140
- package/dist/interfaces/cli/commands/move-member.command.js.map +0 -1
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 路徑計算模組
|
|
3
|
+
* 負責計算 import 路徑更新
|
|
4
|
+
*/
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import { PathUtils } from './path-utils.js';
|
|
7
|
+
import { FileScanner } from './file-scanner.js';
|
|
8
|
+
/**
|
|
9
|
+
* 路徑計算器類別
|
|
10
|
+
* 負責計算檔案移動時需要更新的 import 路徑
|
|
11
|
+
*/
|
|
12
|
+
export class PathCalculator {
|
|
13
|
+
fileSystem;
|
|
14
|
+
importResolver;
|
|
15
|
+
pathUtils;
|
|
16
|
+
fileScanner;
|
|
17
|
+
constructor(fileSystem, importResolver) {
|
|
18
|
+
this.fileSystem = fileSystem;
|
|
19
|
+
this.importResolver = importResolver;
|
|
20
|
+
this.pathUtils = new PathUtils(importResolver);
|
|
21
|
+
this.fileScanner = new FileScanner(fileSystem, importResolver);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 計算路徑更新的內部共用方法
|
|
25
|
+
* 用於 moveFile() 和 generateChangeset() 共用
|
|
26
|
+
*
|
|
27
|
+
* @param source - 來源路徑
|
|
28
|
+
* @param target - 目標路徑
|
|
29
|
+
* @param isDirectory - 是否為目錄
|
|
30
|
+
* @param projectRoot - 專案根目錄
|
|
31
|
+
* @returns 路徑更新列表
|
|
32
|
+
*/
|
|
33
|
+
async calculatePathUpdatesInternal(source, target, isDirectory, projectRoot) {
|
|
34
|
+
const pathUpdates = [];
|
|
35
|
+
if (isDirectory) {
|
|
36
|
+
// 目錄移動:處理目錄內所有檔案
|
|
37
|
+
const filesInDir = await this.fileScanner.getFilesInDirectory(source);
|
|
38
|
+
for (const filePath of filesInDir) {
|
|
39
|
+
// 計算檔案在目錄內的相對路徑
|
|
40
|
+
const relativePath = path.relative(source, filePath);
|
|
41
|
+
const newFilePath = path.join(target, relativePath);
|
|
42
|
+
// 更新其他檔案對目錄內檔案的引用
|
|
43
|
+
const affectedFiles = await this.fileScanner.findAffectedFiles(filePath, projectRoot);
|
|
44
|
+
for (const affectedFile of affectedFiles) {
|
|
45
|
+
const updates = await this.calculatePathUpdates(affectedFile, filePath, newFilePath);
|
|
46
|
+
pathUpdates.push(...updates);
|
|
47
|
+
}
|
|
48
|
+
// 更新目錄內檔案的內部 import
|
|
49
|
+
const internalUpdates = await this.calculateMovedFileInternalUpdates(filePath, newFilePath);
|
|
50
|
+
pathUpdates.push(...internalUpdates);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
// 單一檔案移動
|
|
55
|
+
// 更新其他檔案對被移動檔案的引用
|
|
56
|
+
const affectedFiles = await this.fileScanner.findAffectedFiles(source, projectRoot);
|
|
57
|
+
for (const filePath of affectedFiles) {
|
|
58
|
+
const updates = await this.calculatePathUpdates(filePath, source, target);
|
|
59
|
+
pathUpdates.push(...updates);
|
|
60
|
+
}
|
|
61
|
+
// 更新被移動檔案內部的 import(在移動前處理)
|
|
62
|
+
const movedFileInternalUpdates = await this.calculateMovedFileInternalUpdates(source, target);
|
|
63
|
+
pathUpdates.push(...movedFileInternalUpdates);
|
|
64
|
+
}
|
|
65
|
+
return pathUpdates;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 計算路徑更新
|
|
69
|
+
* 針對單一檔案,計算其對被移動檔案的 import 更新
|
|
70
|
+
*
|
|
71
|
+
* @param filePath - 包含 import 的檔案
|
|
72
|
+
* @param oldPath - 舊的目標路徑
|
|
73
|
+
* @param newPath - 新的目標路徑
|
|
74
|
+
* @returns 路徑更新列表
|
|
75
|
+
*/
|
|
76
|
+
async calculatePathUpdates(filePath, oldPath, newPath) {
|
|
77
|
+
const updates = [];
|
|
78
|
+
try {
|
|
79
|
+
const content = await this.fileSystem.readFile(filePath, 'utf-8');
|
|
80
|
+
const imports = this.importResolver.parseImportStatements(content, filePath);
|
|
81
|
+
for (const importStatement of imports) {
|
|
82
|
+
// 跳過 node_modules
|
|
83
|
+
if (this.importResolver.isNodeModuleImport(importStatement.path)) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
// 將 oldPath 規範化為絕對路徑以便比較
|
|
87
|
+
const normalizedOldPath = path.isAbsolute(oldPath)
|
|
88
|
+
? path.normalize(oldPath)
|
|
89
|
+
: path.normalize(path.resolve(oldPath));
|
|
90
|
+
// 計算 import 指向的絕對路徑
|
|
91
|
+
const resolvedPath = this.pathUtils.resolveImportPath(importStatement.path, filePath);
|
|
92
|
+
// 使用 pathsMatch 檢查是否指向被移動的檔案
|
|
93
|
+
if (this.pathUtils.pathsMatch(resolvedPath, normalizedOldPath)) {
|
|
94
|
+
// 計算新的 import 路徑,保留原始路徑類型(別名或相對路徑)
|
|
95
|
+
const newImportPath = this.pathUtils.calculateNewImportPathPreservingStyle(importStatement.path, filePath, normalizedOldPath, newPath);
|
|
96
|
+
const newImport = importStatement.rawStatement.replace(new RegExp(`(['"\`])${this.pathUtils.escapeRegex(importStatement.path)}\\1`), `$1${newImportPath}$1`);
|
|
97
|
+
updates.push({
|
|
98
|
+
filePath,
|
|
99
|
+
line: importStatement.position.line,
|
|
100
|
+
oldImport: importStatement.rawStatement,
|
|
101
|
+
newImport
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
console.warn(`無法處理檔案 ${filePath}:`, error);
|
|
108
|
+
}
|
|
109
|
+
return updates;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* 計算被移動檔案內部的 import 更新
|
|
113
|
+
* 這些更新會在檔案移動後套用
|
|
114
|
+
*
|
|
115
|
+
* @param source - 來源檔案路徑
|
|
116
|
+
* @param target - 目標檔案路徑
|
|
117
|
+
* @returns 路徑更新列表
|
|
118
|
+
*/
|
|
119
|
+
async calculateMovedFileInternalUpdates(source, target) {
|
|
120
|
+
const updates = [];
|
|
121
|
+
try {
|
|
122
|
+
const content = await this.fileSystem.readFile(source, 'utf-8');
|
|
123
|
+
const imports = this.importResolver.parseImportStatements(content, source);
|
|
124
|
+
// 防禦性檢查:確保 imports 是陣列
|
|
125
|
+
if (!imports || !Array.isArray(imports)) {
|
|
126
|
+
return updates;
|
|
127
|
+
}
|
|
128
|
+
for (const importStatement of imports) {
|
|
129
|
+
// 跳過 node_modules
|
|
130
|
+
if (this.importResolver.isNodeModuleImport(importStatement.path)) {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
// 只處理相對路徑的 import
|
|
134
|
+
if (importStatement.path.startsWith('.')) {
|
|
135
|
+
// 計算這個 import 當前指向的檔案
|
|
136
|
+
const sourceDir = path.dirname(source);
|
|
137
|
+
const currentResolved = path.resolve(sourceDir, importStatement.path);
|
|
138
|
+
// 計算從新位置應該如何 import 這個檔案
|
|
139
|
+
const newImportPath = this.pathUtils.calculateNewImportPath(target, currentResolved);
|
|
140
|
+
// 如果路徑改變了,加入更新列表
|
|
141
|
+
if (newImportPath !== importStatement.path) {
|
|
142
|
+
updates.push({
|
|
143
|
+
filePath: target, // 注意:這裡是 target,因為更新會在檔案移動後套用
|
|
144
|
+
line: importStatement.position.line,
|
|
145
|
+
oldImport: importStatement.rawStatement,
|
|
146
|
+
newImport: importStatement.rawStatement.replace(new RegExp(`(['"\`])${this.pathUtils.escapeRegex(importStatement.path)}\\1`), `$1${newImportPath}$1`)
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
console.warn(`無法處理被移動檔案的內部 import ${source}:`, error);
|
|
154
|
+
}
|
|
155
|
+
return updates;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=path-calculator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-calculator.js","sourceRoot":"","sources":["../../../src/core/move/path-calculator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path Parser
|
|
3
|
+
* 解析 move 命令的路徑格式(支援 file:line:col)
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* 解析後的路徑資訊
|
|
7
|
+
*/
|
|
8
|
+
export interface ParsedPath {
|
|
9
|
+
/** 檔案路徑 */
|
|
10
|
+
readonly filePath: string;
|
|
11
|
+
/** 行號(1-based) */
|
|
12
|
+
readonly line?: number;
|
|
13
|
+
/** 欄位(1-based) */
|
|
14
|
+
readonly column?: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 解析移動目標路徑
|
|
18
|
+
*
|
|
19
|
+
* 支援格式:
|
|
20
|
+
* - `/path/to/file.ts` → 純檔案路徑
|
|
21
|
+
* - `/path/to/file.ts:25` → 檔案路徑 + 行號
|
|
22
|
+
* - `/path/to/file.ts:25:10` → 檔案路徑 + 行號 + 欄位
|
|
23
|
+
* - `C:\path\to\file.ts:25` → Windows 路徑(保留磁碟機代號)
|
|
24
|
+
*
|
|
25
|
+
* @param input 輸入字串
|
|
26
|
+
* @returns 解析後的路徑資訊
|
|
27
|
+
*/
|
|
28
|
+
export declare function parseMoveTarget(input: string): ParsedPath;
|
|
29
|
+
/**
|
|
30
|
+
* 檢查路徑是否包含位置資訊
|
|
31
|
+
*/
|
|
32
|
+
export declare function hasPositionInfo(parsed: ParsedPath): boolean;
|
|
33
|
+
//# sourceMappingURL=path-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-parser.d.ts","sourceRoot":"","sources":["../../../src/core/move/path-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,WAAW;IACX,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,kBAAkB;IAClB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB;IAClB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAiCzD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAE3D"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path Parser
|
|
3
|
+
* 解析 move 命令的路徑格式(支援 file:line:col)
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* 解析移動目標路徑
|
|
7
|
+
*
|
|
8
|
+
* 支援格式:
|
|
9
|
+
* - `/path/to/file.ts` → 純檔案路徑
|
|
10
|
+
* - `/path/to/file.ts:25` → 檔案路徑 + 行號
|
|
11
|
+
* - `/path/to/file.ts:25:10` → 檔案路徑 + 行號 + 欄位
|
|
12
|
+
* - `C:\path\to\file.ts:25` → Windows 路徑(保留磁碟機代號)
|
|
13
|
+
*
|
|
14
|
+
* @param input 輸入字串
|
|
15
|
+
* @returns 解析後的路徑資訊
|
|
16
|
+
*/
|
|
17
|
+
export function parseMoveTarget(input) {
|
|
18
|
+
// 找最後一個可能是行號的 `:數字` 模式
|
|
19
|
+
// 從後往前找,避免錯誤解析 Windows 磁碟機代號(如 C:\path)
|
|
20
|
+
const parts = input.split(':');
|
|
21
|
+
if (parts.length === 1) {
|
|
22
|
+
// 無冒號,純路徑
|
|
23
|
+
return { filePath: input };
|
|
24
|
+
}
|
|
25
|
+
// 檢查最後一部分是否為數字(column)
|
|
26
|
+
const lastPart = parts[parts.length - 1];
|
|
27
|
+
const secondLastPart = parts.length >= 2 ? parts[parts.length - 2] : '';
|
|
28
|
+
// 判斷最後兩個部分是否都是數字
|
|
29
|
+
const lastIsNumber = /^\d+$/.test(lastPart);
|
|
30
|
+
const secondLastIsNumber = /^\d+$/.test(secondLastPart);
|
|
31
|
+
if (lastIsNumber && secondLastIsNumber) {
|
|
32
|
+
// 格式:path:line:col
|
|
33
|
+
const line = parseInt(secondLastPart, 10);
|
|
34
|
+
const column = parseInt(lastPart, 10);
|
|
35
|
+
const filePath = parts.slice(0, -2).join(':');
|
|
36
|
+
return { filePath, line, column };
|
|
37
|
+
}
|
|
38
|
+
else if (lastIsNumber) {
|
|
39
|
+
// 格式:path:line
|
|
40
|
+
const line = parseInt(lastPart, 10);
|
|
41
|
+
const filePath = parts.slice(0, -1).join(':');
|
|
42
|
+
return { filePath, line };
|
|
43
|
+
}
|
|
44
|
+
// 無有效位置資訊,當作純路徑
|
|
45
|
+
return { filePath: input };
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 檢查路徑是否包含位置資訊
|
|
49
|
+
*/
|
|
50
|
+
export function hasPositionInfo(parsed) {
|
|
51
|
+
return parsed.line !== undefined;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=path-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-parser.js","sourceRoot":"","sources":["../../../src/core/move/path-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,uBAAuB;IACvB,wCAAwC;IACxC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,UAAU;QACV,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,uBAAuB;IACvB,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAExE,iBAAiB;IACjB,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAExD,IAAI,YAAY,IAAI,kBAAkB,EAAE,CAAC;QACvC,mBAAmB;QACnB,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACpC,CAAC;SAAM,IAAI,YAAY,EAAE,CAAC;QACxB,eAAe;QACf,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,gBAAgB;IAChB,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAkB;IAChD,OAAO,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 路徑工具模組
|
|
3
|
+
* 提供路徑解析、比對、轉換等工具方法
|
|
4
|
+
*/
|
|
5
|
+
import { ImportResolver } from './import-resolver.js';
|
|
6
|
+
/**
|
|
7
|
+
* 支援的檔案副檔名
|
|
8
|
+
*/
|
|
9
|
+
export declare const ALLOWED_EXTENSIONS: readonly [".ts", ".tsx", ".js", ".jsx", ".vue"];
|
|
10
|
+
/**
|
|
11
|
+
* 排除的目錄模式
|
|
12
|
+
*/
|
|
13
|
+
export declare const EXCLUDE_PATTERNS: readonly ["node_modules", "dist", ".git", "coverage", ".build"];
|
|
14
|
+
/**
|
|
15
|
+
* 路徑工具類別
|
|
16
|
+
* 處理 import 路徑的解析、比對和轉換
|
|
17
|
+
*/
|
|
18
|
+
export declare class PathUtils {
|
|
19
|
+
private readonly importResolver;
|
|
20
|
+
constructor(importResolver: ImportResolver);
|
|
21
|
+
/**
|
|
22
|
+
* 解析 import 路徑為絕對路徑
|
|
23
|
+
*
|
|
24
|
+
* @param importPath - import 語句中的路徑
|
|
25
|
+
* @param fromFile - 包含該 import 的檔案路徑
|
|
26
|
+
* @returns 解析後的絕對路徑
|
|
27
|
+
*/
|
|
28
|
+
resolveImportPath(importPath: string, fromFile: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* 檢查兩個路徑是否指向同一個檔案
|
|
31
|
+
*
|
|
32
|
+
* @param path1 - 第一個路徑(可能是目錄,如 import from '@/utils' 解析為 /path/utils)
|
|
33
|
+
* @param path2 - 第二個路徑(通常是完整檔案路徑,如 /path/utils/index.ts)
|
|
34
|
+
* @returns 是否指向同一檔案
|
|
35
|
+
*/
|
|
36
|
+
pathsMatch(path1: string, path2: string): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* 移除檔案副檔名
|
|
39
|
+
*
|
|
40
|
+
* @param filePath - 檔案路徑
|
|
41
|
+
* @returns 移除副檔名後的路徑
|
|
42
|
+
*/
|
|
43
|
+
removeExtension(filePath: string): string;
|
|
44
|
+
/**
|
|
45
|
+
* 計算新的 import 路徑
|
|
46
|
+
*
|
|
47
|
+
* @param fromFile - import 所在的檔案
|
|
48
|
+
* @param toFile - import 指向的目標檔案
|
|
49
|
+
* @returns 新的相對 import 路徑
|
|
50
|
+
*/
|
|
51
|
+
calculateNewImportPath(fromFile: string, toFile: string): string;
|
|
52
|
+
/**
|
|
53
|
+
* 計算新的 import 路徑,保留原始路徑樣式(別名、baseUrl 相對路徑或相對路徑)
|
|
54
|
+
*
|
|
55
|
+
* @param originalImportPath - 原始 import 路徑
|
|
56
|
+
* @param fromFile - import 所在的檔案
|
|
57
|
+
* @param oldFilePath - 舊的目標檔案路徑(未使用但保留介面一致性)
|
|
58
|
+
* @param newFilePath - 新的目標檔案路徑
|
|
59
|
+
* @returns 新的 import 路徑
|
|
60
|
+
*/
|
|
61
|
+
calculateNewImportPathPreservingStyle(originalImportPath: string, fromFile: string, _oldFilePath: string, newFilePath: string): string;
|
|
62
|
+
/**
|
|
63
|
+
* 跳脫正則表達式特殊字元
|
|
64
|
+
*
|
|
65
|
+
* @param str - 要跳脫的字串
|
|
66
|
+
* @returns 跳脫後的字串
|
|
67
|
+
*/
|
|
68
|
+
escapeRegex(str: string): string;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=path-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-utils.d.ts","sourceRoot":"","sources":["../../../src/core/move/path-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD;;GAEG;AACH,eAAO,MAAM,kBAAkB,iDAAkD,CAAC;AAElF;;GAEG;AACH,eAAO,MAAM,gBAAgB,iEAAkE,CAAC;AAOhG;;;GAGG;AACH,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAAd,cAAc,EAAE,cAAc;IAE3D;;;;;;OAMG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAuC/D;;;;;;OAMG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAuCjD;;;;;OAKG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAQzC;;;;;;OAMG;IACH,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAmBhE;;;;;;;;OAQG;IACH,qCAAqC,CACnC,kBAAkB,EAAE,MAAM,EAC1B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,MAAM;IA8CT;;;;;OAKG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAGjC"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 路徑工具模組
|
|
3
|
+
* 提供路徑解析、比對、轉換等工具方法
|
|
4
|
+
*/
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
/**
|
|
7
|
+
* 支援的檔案副檔名
|
|
8
|
+
*/
|
|
9
|
+
export const ALLOWED_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.vue'];
|
|
10
|
+
/**
|
|
11
|
+
* 排除的目錄模式
|
|
12
|
+
*/
|
|
13
|
+
export const EXCLUDE_PATTERNS = ['node_modules', 'dist', '.git', 'coverage', '.build'];
|
|
14
|
+
/**
|
|
15
|
+
* 支援移除的副檔名
|
|
16
|
+
*/
|
|
17
|
+
const REMOVABLE_EXTENSIONS = ['.js', '.ts', '.jsx', '.tsx'];
|
|
18
|
+
/**
|
|
19
|
+
* 路徑工具類別
|
|
20
|
+
* 處理 import 路徑的解析、比對和轉換
|
|
21
|
+
*/
|
|
22
|
+
export class PathUtils {
|
|
23
|
+
importResolver;
|
|
24
|
+
constructor(importResolver) {
|
|
25
|
+
this.importResolver = importResolver;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 解析 import 路徑為絕對路徑
|
|
29
|
+
*
|
|
30
|
+
* @param importPath - import 語句中的路徑
|
|
31
|
+
* @param fromFile - 包含該 import 的檔案路徑
|
|
32
|
+
* @returns 解析後的絕對路徑
|
|
33
|
+
*/
|
|
34
|
+
resolveImportPath(importPath, fromFile) {
|
|
35
|
+
if (this.importResolver.isNodeModuleImport(importPath)) {
|
|
36
|
+
return importPath; // Node 模組不處理
|
|
37
|
+
}
|
|
38
|
+
if (importPath.startsWith('.')) {
|
|
39
|
+
// 相對路徑 - 轉換為絕對路徑
|
|
40
|
+
const fromDir = path.dirname(path.isAbsolute(fromFile) ? fromFile : path.resolve(fromFile));
|
|
41
|
+
const resolved = path.resolve(fromDir, importPath);
|
|
42
|
+
// 正規化路徑
|
|
43
|
+
return path.normalize(resolved);
|
|
44
|
+
}
|
|
45
|
+
// 嘗試解析別名(如 @/ 開頭的路徑映射)
|
|
46
|
+
const resolved = this.importResolver.resolvePathAlias(importPath);
|
|
47
|
+
if (resolved !== importPath) {
|
|
48
|
+
// 如果解析成功(與原始路徑不同)
|
|
49
|
+
if (path.isAbsolute(resolved)) {
|
|
50
|
+
// 絕對路徑直接返回
|
|
51
|
+
return path.normalize(resolved);
|
|
52
|
+
}
|
|
53
|
+
// 非絕對路徑:相對於專案根目錄或 baseUrl
|
|
54
|
+
// 由於 pathAliases 已經在 move.command.ts 中轉為絕對路徑,這裡應該是絕對路徑
|
|
55
|
+
// 若仍為相對路徑,則視為相對於當前檔案
|
|
56
|
+
const fromDir = path.dirname(path.isAbsolute(fromFile) ? fromFile : path.resolve(fromFile));
|
|
57
|
+
const absoluteResolved = path.resolve(fromDir, resolved);
|
|
58
|
+
return path.normalize(absoluteResolved);
|
|
59
|
+
}
|
|
60
|
+
// 嘗試解析 baseUrl 相對路徑(如 src/utils)
|
|
61
|
+
const baseUrl = this.importResolver.getBaseUrl();
|
|
62
|
+
if (baseUrl) {
|
|
63
|
+
const absoluteResolved = path.resolve(baseUrl, importPath);
|
|
64
|
+
return path.normalize(absoluteResolved);
|
|
65
|
+
}
|
|
66
|
+
return importPath;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 檢查兩個路徑是否指向同一個檔案
|
|
70
|
+
*
|
|
71
|
+
* @param path1 - 第一個路徑(可能是目錄,如 import from '@/utils' 解析為 /path/utils)
|
|
72
|
+
* @param path2 - 第二個路徑(通常是完整檔案路徑,如 /path/utils/index.ts)
|
|
73
|
+
* @returns 是否指向同一檔案
|
|
74
|
+
*/
|
|
75
|
+
pathsMatch(path1, path2) {
|
|
76
|
+
try {
|
|
77
|
+
// 確保兩個路徑都是絕對路徑並正規化
|
|
78
|
+
const abs1 = path.isAbsolute(path1)
|
|
79
|
+
? path.normalize(path1)
|
|
80
|
+
: path.normalize(path.resolve(path1));
|
|
81
|
+
const abs2 = path.isAbsolute(path2)
|
|
82
|
+
? path.normalize(path2)
|
|
83
|
+
: path.normalize(path.resolve(path2));
|
|
84
|
+
// 檢查完全匹配
|
|
85
|
+
if (abs1 === abs2) {
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
// 檢查去除副檔名後是否匹配(TypeScript/JavaScript 可以省略副檔名)
|
|
89
|
+
const withoutExt1 = this.removeExtension(abs1);
|
|
90
|
+
const withoutExt2 = this.removeExtension(abs2);
|
|
91
|
+
if (withoutExt1 === withoutExt2) {
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
// 處理目錄 import 指向 index 檔案的情況
|
|
95
|
+
// 如 import from '@/utils' 解析為 /path/utils,實際指向 /path/utils/index.ts
|
|
96
|
+
const indexBasename = path.basename(withoutExt2);
|
|
97
|
+
if (indexBasename === 'index') {
|
|
98
|
+
const dirPath = path.dirname(withoutExt2);
|
|
99
|
+
if (withoutExt1 === dirPath) {
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* 移除檔案副檔名
|
|
111
|
+
*
|
|
112
|
+
* @param filePath - 檔案路徑
|
|
113
|
+
* @returns 移除副檔名後的路徑
|
|
114
|
+
*/
|
|
115
|
+
removeExtension(filePath) {
|
|
116
|
+
const ext = path.extname(filePath);
|
|
117
|
+
if (REMOVABLE_EXTENSIONS.includes(ext)) {
|
|
118
|
+
return filePath.slice(0, -ext.length);
|
|
119
|
+
}
|
|
120
|
+
return filePath;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* 計算新的 import 路徑
|
|
124
|
+
*
|
|
125
|
+
* @param fromFile - import 所在的檔案
|
|
126
|
+
* @param toFile - import 指向的目標檔案
|
|
127
|
+
* @returns 新的相對 import 路徑
|
|
128
|
+
*/
|
|
129
|
+
calculateNewImportPath(fromFile, toFile) {
|
|
130
|
+
const fromDir = path.dirname(fromFile);
|
|
131
|
+
let relativePath = path.relative(fromDir, toFile);
|
|
132
|
+
// 移除副檔名(如果目標是支援的檔案類型)
|
|
133
|
+
const ext = path.extname(relativePath);
|
|
134
|
+
if (REMOVABLE_EXTENSIONS.includes(ext)) {
|
|
135
|
+
relativePath = relativePath.slice(0, -ext.length);
|
|
136
|
+
}
|
|
137
|
+
// 確保相對路徑以 ./ 或 ../ 開始
|
|
138
|
+
if (!relativePath.startsWith('.')) {
|
|
139
|
+
relativePath = './' + relativePath;
|
|
140
|
+
}
|
|
141
|
+
// 統一使用正斜線
|
|
142
|
+
return relativePath.replace(/\\/g, '/');
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* 計算新的 import 路徑,保留原始路徑樣式(別名、baseUrl 相對路徑或相對路徑)
|
|
146
|
+
*
|
|
147
|
+
* @param originalImportPath - 原始 import 路徑
|
|
148
|
+
* @param fromFile - import 所在的檔案
|
|
149
|
+
* @param oldFilePath - 舊的目標檔案路徑(未使用但保留介面一致性)
|
|
150
|
+
* @param newFilePath - 新的目標檔案路徑
|
|
151
|
+
* @returns 新的 import 路徑
|
|
152
|
+
*/
|
|
153
|
+
calculateNewImportPathPreservingStyle(originalImportPath, fromFile, _oldFilePath, newFilePath) {
|
|
154
|
+
// 如果原本是路徑別名或 baseUrl 相對路徑,保留樣式
|
|
155
|
+
if (!originalImportPath.startsWith('.') && !originalImportPath.startsWith('/')) {
|
|
156
|
+
// 1. 檢查是否為路徑別名(精確匹配:alias 本身或 alias/ 開頭)
|
|
157
|
+
for (const [alias, aliasPath] of Object.entries(this.importResolver.getPathAliases())) {
|
|
158
|
+
if (originalImportPath === alias || originalImportPath.startsWith(alias + '/')) {
|
|
159
|
+
const resolvedAliasPath = path.normalize(aliasPath);
|
|
160
|
+
// 計算新檔案相對於別名基礎路徑的相對路徑
|
|
161
|
+
let newRelativeToAlias = path.relative(resolvedAliasPath, path.normalize(newFilePath));
|
|
162
|
+
newRelativeToAlias = newRelativeToAlias.replace(/\\/g, '/');
|
|
163
|
+
// 移除副檔名
|
|
164
|
+
const newExt = path.extname(newRelativeToAlias);
|
|
165
|
+
if (REMOVABLE_EXTENSIONS.includes(newExt)) {
|
|
166
|
+
newRelativeToAlias = newRelativeToAlias.slice(0, -newExt.length);
|
|
167
|
+
}
|
|
168
|
+
// 組合新的別名路徑:alias + / + newRelativeToAlias
|
|
169
|
+
// 如果 alias 本身不以 / 結尾,需要加上
|
|
170
|
+
const separator = alias.endsWith('/') ? '' : '/';
|
|
171
|
+
return alias + separator + newRelativeToAlias;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// 2. 檢查是否為 baseUrl 相對路徑(如 src/utils)
|
|
175
|
+
const baseUrl = this.importResolver.getBaseUrl();
|
|
176
|
+
if (baseUrl) {
|
|
177
|
+
// 保留原始的 baseUrl 相對路徑格式
|
|
178
|
+
let newRelativeToBaseUrl = path.relative(baseUrl, path.normalize(newFilePath));
|
|
179
|
+
newRelativeToBaseUrl = newRelativeToBaseUrl.replace(/\\/g, '/');
|
|
180
|
+
// 移除副檔名
|
|
181
|
+
const newExt = path.extname(newRelativeToBaseUrl);
|
|
182
|
+
if (REMOVABLE_EXTENSIONS.includes(newExt)) {
|
|
183
|
+
newRelativeToBaseUrl = newRelativeToBaseUrl.slice(0, -newExt.length);
|
|
184
|
+
}
|
|
185
|
+
return newRelativeToBaseUrl;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// 否則使用相對路徑
|
|
189
|
+
return this.calculateNewImportPath(fromFile, newFilePath);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* 跳脫正則表達式特殊字元
|
|
193
|
+
*
|
|
194
|
+
* @param str - 要跳脫的字串
|
|
195
|
+
* @returns 跳脫後的字串
|
|
196
|
+
*/
|
|
197
|
+
escapeRegex(str) {
|
|
198
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=path-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../../../src/core/move/path-utils.ts"],"names":[],"mappings":"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"}
|