fep-migrator 1.0.1 → 1.0.3
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/index.mjs +5 -34
- package/package.json +5 -7
- package/dist/index.mjs.map +0 -1
package/dist/index.mjs
CHANGED
|
@@ -1,41 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import process from "node:process";
|
|
3
3
|
import { cac } from "cac";
|
|
4
|
+
import fs from "node:fs";
|
|
4
5
|
import path from "node:path";
|
|
5
|
-
import fs from "fs-extra";
|
|
6
6
|
import { globbySync } from "globby";
|
|
7
7
|
import MagicString from "magic-string";
|
|
8
8
|
import { parseSync } from "oxc-parser";
|
|
9
|
-
import { parse } from "
|
|
9
|
+
import { parse, writeBack } from "vue-sfc-descriptor-write-back";
|
|
10
10
|
|
|
11
|
-
//#region src/sfc.ts
|
|
12
|
-
const parseVueSfcFile = (filename) => {
|
|
13
|
-
const code = fs.readFileSync(filename, { encoding: "utf-8" });
|
|
14
|
-
const { descriptor } = parse(code, {
|
|
15
|
-
filename,
|
|
16
|
-
sourceMap: false
|
|
17
|
-
});
|
|
18
|
-
return [code, descriptor];
|
|
19
|
-
};
|
|
20
|
-
const modifySfcCodeByDescriptor = (code, descriptor) => {
|
|
21
|
-
const ms = new MagicString(code);
|
|
22
|
-
const { template, script, scriptSetup, styles, customBlocks } = descriptor;
|
|
23
|
-
const blocks = [
|
|
24
|
-
template,
|
|
25
|
-
script,
|
|
26
|
-
scriptSetup,
|
|
27
|
-
...styles,
|
|
28
|
-
...customBlocks
|
|
29
|
-
].filter((block) => block != null).sort((a, b) => {
|
|
30
|
-
return a.loc.start.offset - b.loc.start.offset;
|
|
31
|
-
});
|
|
32
|
-
blocks.reverse();
|
|
33
|
-
for (const block of blocks) ms.overwrite(block.loc.start.offset, block.loc.end.offset, block.content);
|
|
34
|
-
const hasChanged = ms.hasChanged();
|
|
35
|
-
return [hasChanged, hasChanged ? ms.toString() : code];
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
//#endregion
|
|
39
11
|
//#region src/replace-fep.ts
|
|
40
12
|
const resolveFep = (code, filename) => {
|
|
41
13
|
const ms = new MagicString(code);
|
|
@@ -87,7 +59,7 @@ async function replacer(dirs) {
|
|
|
87
59
|
console.log("# 开始处理...");
|
|
88
60
|
for (const file of fileList) try {
|
|
89
61
|
if (file.endsWith(".vue")) {
|
|
90
|
-
const
|
|
62
|
+
const { code, descriptor } = parse(file);
|
|
91
63
|
let changed = false;
|
|
92
64
|
if (descriptor.script) {
|
|
93
65
|
const [hasChanged, newScript] = resolveFep(descriptor.script.content, file);
|
|
@@ -104,7 +76,7 @@ async function replacer(dirs) {
|
|
|
104
76
|
}
|
|
105
77
|
}
|
|
106
78
|
if (changed) {
|
|
107
|
-
const
|
|
79
|
+
const { code: resolved } = writeBack(code, descriptor);
|
|
108
80
|
fs.writeFileSync(file, resolved);
|
|
109
81
|
statistic.success++;
|
|
110
82
|
}
|
|
@@ -133,5 +105,4 @@ cli.help();
|
|
|
133
105
|
cli.parse();
|
|
134
106
|
|
|
135
107
|
//#endregion
|
|
136
|
-
export { };
|
|
137
|
-
//# sourceMappingURL=index.mjs.map
|
|
108
|
+
export { };
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fep-migrator",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.3",
|
|
5
5
|
"packageManager": "pnpm@10.23.0",
|
|
6
6
|
"description": "@falconix/fep migration helper",
|
|
7
7
|
"author": "tjyuanpeng <tjyuanpeng@gmail.com>",
|
|
@@ -34,23 +34,21 @@
|
|
|
34
34
|
},
|
|
35
35
|
"scripts": {
|
|
36
36
|
"start": "node dist/index.mjs",
|
|
37
|
-
"watch": "tsdown --watch
|
|
38
|
-
"build": "tsdown
|
|
37
|
+
"watch": "tsdown --watch",
|
|
38
|
+
"build": "tsdown",
|
|
39
39
|
"lint": "eslint .",
|
|
40
40
|
"typecheck": "tsc --noEmit"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"@vue/compiler-sfc": "^3.5.26",
|
|
44
44
|
"cac": "^6.7.14",
|
|
45
|
-
"fep-migrator": "^1.0.0",
|
|
46
|
-
"fs-extra": "^11.3.3",
|
|
47
45
|
"globby": "^16.1.0",
|
|
48
46
|
"magic-string": "^0.30.21",
|
|
49
|
-
"oxc-parser": "^0.108.0"
|
|
47
|
+
"oxc-parser": "^0.108.0",
|
|
48
|
+
"vue-sfc-descriptor-write-back": "^1.0.0"
|
|
50
49
|
},
|
|
51
50
|
"devDependencies": {
|
|
52
51
|
"@antfu/eslint-config": "^6.7.3",
|
|
53
|
-
"@types/fs-extra": "^11.0.4",
|
|
54
52
|
"@types/node": "^25.0.6",
|
|
55
53
|
"eslint": "^9.39.2",
|
|
56
54
|
"eslint-plugin-format": "^1.2.0",
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/sfc.ts","../src/replace-fep.ts","../src/index.ts"],"sourcesContent":["import type { SFCDescriptor } from '@vue/compiler-sfc'\nimport { parse } from '@vue/compiler-sfc'\nimport fs from 'fs-extra'\nimport MagicString from 'magic-string'\n\nexport const parseVueSfcFile = (filename: string): [string, SFCDescriptor] => {\n const code = fs.readFileSync(filename, { encoding: 'utf-8' })\n const { descriptor } = parse(code, {\n filename,\n sourceMap: false,\n })\n\n return [code, descriptor]\n}\n\nexport const modifySfcCodeByDescriptor = (code: string, descriptor: SFCDescriptor): [boolean, string] => {\n const ms = new MagicString(code)\n const {\n template,\n script,\n scriptSetup,\n styles,\n customBlocks,\n } = descriptor\n\n const blocks = [template, script, scriptSetup, ...styles, ...customBlocks]\n .filter(block => block != null)\n .sort((a, b) => {\n return a.loc.start.offset - b.loc.start.offset\n })\n blocks.reverse()\n\n for (const block of blocks) {\n ms.overwrite(block.loc.start.offset, block.loc.end.offset, block.content)\n }\n\n const hasChanged = ms.hasChanged()\n return [hasChanged, hasChanged ? ms.toString() : code]\n}\n","import path from 'node:path'\nimport process from 'node:process'\nimport fs from 'fs-extra'\nimport { globbySync } from 'globby'\nimport MagicString from 'magic-string'\nimport { parseSync } from 'oxc-parser'\nimport { modifySfcCodeByDescriptor, parseVueSfcFile } from './sfc'\n\nconst resolveFep = (code: string, filename: string): [boolean, string] => {\n const ms = new MagicString(code)\n const { program } = parseSync(filename, code, { lang: 'tsx' })\n const imports = program.body.filter(i => i.type === 'ImportDeclaration').reverse()\n for (const importItem of imports) {\n const { raw, start, end } = importItem.source\n const text = raw ?? ''\n const epRegex = /^(['\"])element-plus/\n const iconRegex = /^(['\"])@element-plus\\/icons-vue/\n if (epRegex.test(text)) {\n const newPath = text.replace(epRegex, (_all, p1) => {\n return `${p1}@falconix/fep`\n })\n ms.overwrite(start, end, newPath)\n } else if (iconRegex.test(text)) {\n const newPath = text.replace(iconRegex, (_all, p1) => {\n return `${p1}@falconix/icons-vue`\n })\n ms.overwrite(start, end, newPath)\n }\n }\n const hasChanged = ms.hasChanged()\n return [hasChanged, hasChanged ? ms.toString() : code]\n}\n\nasync function replacer(dirs: string[]) {\n const fileList = globbySync(dirs, {\n absolute: true,\n onlyFiles: true,\n gitignore: true,\n expandDirectories: {\n extensions: ['js', 'jsx', 'ts', 'tsx', 'vue'],\n },\n ignore: ['**/node_modules', '**/*.d.ts', '**/public'],\n })\n const statistic = {\n success: 0,\n fail: 0,\n total: fileList.length,\n }\n console.log('# 开始处理...')\n for (const file of fileList) {\n try {\n if (file.endsWith('.vue')) {\n const [code, descriptor] = parseVueSfcFile(file)\n let changed = false\n if (descriptor.script) {\n const [hasChanged, newScript] = resolveFep(descriptor.script.content, file)\n if (hasChanged) {\n changed = true\n descriptor.script.content = newScript\n }\n }\n if (descriptor.scriptSetup) {\n const [hasChanged, newScriptSetup] = resolveFep(descriptor.scriptSetup.content, file)\n if (hasChanged) {\n changed = true\n descriptor.scriptSetup.content = newScriptSetup\n }\n }\n if (changed) {\n const [_changed, resolved] = modifySfcCodeByDescriptor(code, descriptor)\n fs.writeFileSync(file, resolved)\n statistic.success++\n }\n } else {\n const content = fs.readFileSync(file, { encoding: 'utf-8' })\n const [hasChanged, resolved] = resolveFep(content, file)\n if (hasChanged) {\n fs.writeFileSync(file, resolved)\n statistic.success++\n }\n }\n } catch (e) {\n console.error(`❌ 处理错误: [${path.relative(process.cwd(), file)}], error:${e}`)\n statistic.fail++\n }\n }\n console.log(`# 处理完成。共扫描 ${statistic.total} 个文件,修改成功 ${statistic.success} 个,修改失败 ${statistic.fail} 个`)\n}\n\nexport default replacer\n","#!/usr/bin/env node\n\nimport process from 'node:process'\nimport { cac } from 'cac'\nimport replaceFep from './replace-fep'\n\nconst cli = cac('fep-migrator')\ncli\n .version(process.env.npm_package_version ?? '-')\n .command('<...dir>', '处理路径')\n .action(async (dirs) => {\n replaceFep(dirs)\n })\ncli.help()\ncli.parse()\n"],"mappings":"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"}
|