fep-migrator 1.0.0 → 1.0.2

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/README.md CHANGED
@@ -2,16 +2,10 @@
2
2
 
3
3
  @falconix fep 迁移工具
4
4
 
5
- ## 安装
6
-
7
- ```shell
8
- pnpm i fep-migrator -g
9
- ```
10
-
11
5
  ## 使用
12
6
 
13
7
  ```shell
14
- fep-migrator <...dir>
8
+ npx fep-migrator <...dir>
15
9
  ```
16
10
 
17
11
  `dir` 为需要迁移的 fep 项目目录,支持多个目录同时迁移,例如:
@@ -26,6 +20,8 @@ fep-migrator src1 src2
26
20
  fep-migrator src "!**/public"
27
21
  ```
28
22
 
23
+ ## 注意事项
24
+
29
25
  `fep-migrator` 会迁移两个包的内容:
30
26
 
31
27
  - element-plus => @falconix/fep
package/dist/index.mjs CHANGED
@@ -84,6 +84,7 @@ async function replacer(dirs) {
84
84
  fail: 0,
85
85
  total: fileList.length
86
86
  };
87
+ console.log("# 开始处理...");
87
88
  for (const file of fileList) try {
88
89
  if (file.endsWith(".vue")) {
89
90
  const [code, descriptor] = parseVueSfcFile(file);
@@ -105,18 +106,20 @@ async function replacer(dirs) {
105
106
  if (changed) {
106
107
  const [_changed, resolved] = modifySfcCodeByDescriptor(code, descriptor);
107
108
  fs.writeFileSync(file, resolved);
109
+ statistic.success++;
108
110
  }
109
111
  } else {
110
112
  const [hasChanged, resolved] = resolveFep(fs.readFileSync(file, { encoding: "utf-8" }), file);
111
- if (hasChanged) fs.writeFileSync(file, resolved);
113
+ if (hasChanged) {
114
+ fs.writeFileSync(file, resolved);
115
+ statistic.success++;
116
+ }
112
117
  }
113
- statistic.success++;
114
118
  } catch (e) {
115
- statistic.fail++;
116
119
  console.error(`❌ 处理错误: [${path.relative(process.cwd(), file)}], error:${e}`);
117
- throw e;
120
+ statistic.fail++;
118
121
  }
119
- return statistic;
122
+ console.log(`# 处理完成。共扫描 ${statistic.total} 个文件,修改成功 ${statistic.success} 个,修改失败 ${statistic.fail} 个`);
120
123
  }
121
124
  var replace_fep_default = replacer;
122
125
 
@@ -124,9 +127,7 @@ var replace_fep_default = replacer;
124
127
  //#region src/index.ts
125
128
  const cli = cac("fep-migrator");
126
129
  cli.version(process.env.npm_package_version ?? "-").command("<...dir>", "处理路径").action(async (dirs) => {
127
- console.log("# 开始处理.");
128
- const statistic = await replace_fep_default(dirs);
129
- console.log(`# 所有文件迁移完成。共处理 ${statistic.total} 个文件,成功 ${statistic.success} 个,失败 ${statistic.fail} 个`);
130
+ replace_fep_default(dirs);
130
131
  });
131
132
  cli.help();
132
133
  cli.parse();
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["replaceFep"],"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 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 }\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 }\n }\n statistic.success++\n } catch (e) {\n statistic.fail++\n console.error(`❌ 处理错误: [${path.relative(process.cwd(), file)}], error:${e}`)\n throw e\n }\n }\n return statistic\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 console.log('# 开始处理.')\n const statistic = await replaceFep(dirs)\n console.log(`# 所有文件迁移完成。共处理 ${statistic.total} 个文件,成功 ${statistic.success} 个,失败 ${statistic.fail} 个`)\n })\ncli.help()\ncli.parse()\n"],"mappings":"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"}
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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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "fep-migrator",
3
3
  "type": "module",
4
- "version": "1.0.0",
4
+ "version": "1.0.2",
5
5
  "packageManager": "pnpm@10.23.0",
6
6
  "description": "@falconix/fep migration helper",
7
7
  "author": "tjyuanpeng <tjyuanpeng@gmail.com>",