@be-link/smart-test 1.0.1-beta.3 → 1.0.1-beta.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/record.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA4JzE"}
1
+ {"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/record.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA6JzE"}
package/dist/cli/index.js CHANGED
@@ -321,11 +321,11 @@ async function initCommand() {
321
321
  name: 'naming',
322
322
  message: '文件命名风格:',
323
323
  choices: [
324
- { name: 'kebab-case (推荐)', value: 'kebab-case' },
324
+ { name: 'PascalCase (推荐)', value: 'PascalCase' },
325
325
  { name: 'camelCase', value: 'camelCase' },
326
- { name: 'snake_case', value: 'snake_case' },
326
+ { name: 'kebab-case', value: 'kebab-case' },
327
327
  ],
328
- default: 'kebab-case',
328
+ default: 'PascalCase',
329
329
  },
330
330
  ]);
331
331
  // 构建配置对象
@@ -384,7 +384,7 @@ const DEFAULT_CONFIG = {
384
384
  output: {
385
385
  testsDir: './tests/e2e',
386
386
  helpersDir: './tests/helpers',
387
- naming: 'kebab-case',
387
+ naming: 'PascalCase',
388
388
  },
389
389
  templates: {
390
390
  mock: 'default',
@@ -898,12 +898,22 @@ class HARConverter {
898
898
  capitalize(str) {
899
899
  return str.charAt(0).toUpperCase() + str.slice(1);
900
900
  }
901
+ /**
902
+ * 转换为 PascalCase
903
+ */
904
+ toPascalCase(str) {
905
+ return str
906
+ .split(/[-_\s]+/)
907
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
908
+ .join('');
909
+ }
901
910
  /**
902
911
  * 保存 Mock 代码
903
912
  */
904
913
  async saveMockCode(requests, outputPath, pageName) {
905
914
  const mockCode = this.generateMockCode(requests, pageName);
906
- const mockPath = path.join(outputPath, `mock-${pageName}.ts`);
915
+ const fileName = `Mock${this.toPascalCase(pageName)}.ts`;
916
+ const mockPath = path.join(outputPath, fileName);
907
917
  await fs.mkdir(outputPath, { recursive: true });
908
918
  await fs.writeFile(mockPath, mockCode, 'utf-8');
909
919
  logger.success(`Mock 代码已保存: ${mockPath}`);
@@ -987,13 +997,17 @@ ${requestSummary}
987
997
 
988
998
  ## 要求
989
999
  1. 使用 TypeScript 语法
990
- 2. 导入 Mock 函数: import { mock${this.capitalize(pageName)}Apis } from './${mockFileName}'
1000
+ 2. 导入必要的函数:
1001
+ - import { test, expect } from '@playwright/test'
1002
+ - import { aiReviewScreenshot } from '@be-link/smart-test'
1003
+ - import { mock${this.capitalize(pageName)}Apis } from './${mockFileName}'
991
1004
  3. 在测试开始前调用 Mock 函数
992
1005
  4. 包含基础的页面加载测试
993
- 5. 根据请求类型,生成合适的测试场景(如表单提交、数据加载等)
994
- 6. 使用 Playwright 的最佳实践
995
- 7. 包含有意义的断言
996
- 8. 代码简洁清晰,有适当的注释
1006
+ 5. 必须包含一个 AI 视觉识别测试用例,使用 aiReviewScreenshot 检查页面内容
1007
+ 6. 根据请求类型,生成合适的测试场景(如表单提交、数据加载等)
1008
+ 7. 使用 Playwright 的最佳实践
1009
+ 8. 包含有意义的断言
1010
+ 9. 代码简洁清晰,有适当的注释
997
1011
 
998
1012
  请直接返回测试代码,不需要额外的说明。
999
1013
  `;
@@ -1029,6 +1043,7 @@ ${requestSummary}
1029
1043
  generateBasicTest(url, pageName, mockFileName) {
1030
1044
  const capitalizedName = this.capitalize(pageName);
1031
1045
  return `import { test, expect } from '@playwright/test';
1046
+ import { aiReviewScreenshot } from '@be-link/smart-test';
1032
1047
  import { mock${capitalizedName}Apis } from './${mockFileName}';
1033
1048
 
1034
1049
  test.describe('${capitalizedName} 页面测试', () => {
@@ -1048,15 +1063,47 @@ test.describe('${capitalizedName} 页面测试', () => {
1048
1063
  await expect(page).toHaveURL('${url}');
1049
1064
  });
1050
1065
 
1066
+ test('AI 视觉识别 - 页面内容检查', async ({ page }) => {
1067
+ // 访问页面
1068
+ await page.goto('${url}');
1069
+
1070
+ // 等待页面加载
1071
+ await page.waitForLoadState('networkidle');
1072
+
1073
+ // 使用 AI 视觉识别检查页面内容
1074
+ const result = await aiReviewScreenshot(page, {
1075
+ expected: '页面应该正常显示,没有明显的布局错误或内容缺失',
1076
+ fullPage: true,
1077
+ });
1078
+
1079
+ // 如果没有配置 AI,跳过测试
1080
+ if (result.skipped) {
1081
+ test.skip();
1082
+ }
1083
+
1084
+ // 验证 AI 检查结果
1085
+ expect(result.ok, result.issues?.join(', ')).toBeTruthy();
1086
+ });
1087
+
1051
1088
  // TODO: 添加更多测试用例
1052
1089
  });
1053
1090
  `;
1054
1091
  }
1092
+ /**
1093
+ * 转换为 PascalCase
1094
+ */
1095
+ toPascalCase(str) {
1096
+ return str
1097
+ .split(/[-_\s]+/)
1098
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
1099
+ .join('');
1100
+ }
1055
1101
  /**
1056
1102
  * 保存测试文件
1057
1103
  */
1058
1104
  async saveTest(testCode, outputPath, pageName) {
1059
- const testPath = path.join(outputPath, `${pageName}.spec.ts`);
1105
+ const fileName = `${this.toPascalCase(pageName)}.spec.ts`;
1106
+ const testPath = path.join(outputPath, fileName);
1060
1107
  await fs.mkdir(outputPath, { recursive: true });
1061
1108
  await fs.writeFile(testPath, testCode, 'utf-8');
1062
1109
  logger.success(`测试文件已保存: ${testPath}`);
@@ -1375,11 +1422,21 @@ export class ${className} {
1375
1422
  })
1376
1423
  .join('');
1377
1424
  }
1425
+ /**
1426
+ * 转换为 PascalCase
1427
+ */
1428
+ toPascalCase(str) {
1429
+ return str
1430
+ .split(/[-_\s]+/)
1431
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
1432
+ .join('');
1433
+ }
1378
1434
  /**
1379
1435
  * 保存 POM 文件
1380
1436
  */
1381
1437
  async savePOM(pomCode, outputPath, pageName) {
1382
- const pomPath = path.join(outputPath, `${pageName}-page.po.ts`);
1438
+ const fileName = `${this.toPascalCase(pageName)}Page.ts`;
1439
+ const pomPath = path.join(outputPath, fileName);
1383
1440
  await fs.mkdir(outputPath, { recursive: true });
1384
1441
  await fs.writeFile(pomPath, pomCode, 'utf-8');
1385
1442
  logger.success(`POM 文件已保存: ${pomPath}`);
@@ -1829,12 +1886,13 @@ async function recordCommand(options) {
1829
1886
  const converter = new HARConverter();
1830
1887
  // 提取页面名称
1831
1888
  const pageName = extractPageName(recordOptions.url);
1832
- logger.debug(`页面名称: ${pageName}`);
1889
+ const pascalCaseName = toPascalCase(pageName);
1890
+ logger.debug(`页面名称: ${pageName} (PascalCase: ${pascalCaseName})`);
1833
1891
  // 保存 HAR 文件
1834
1892
  const outputDir = path.resolve(process.cwd(), recordOptions.output);
1835
1893
  await converter.saveHAR(validRequests, outputDir);
1836
1894
  // 生成并保存 Mock 代码
1837
- const mockFileName = `mock-${pageName}`;
1895
+ const mockFileName = `Mock${pascalCaseName}`;
1838
1896
  await converter.saveMockCode(validRequests, outputDir, pageName);
1839
1897
  logger.succeedSpinner('Mock 代码生成完成');
1840
1898
  // 生成测试用例
@@ -1857,14 +1915,14 @@ async function recordCommand(options) {
1857
1915
  logger.info('生成的文件:');
1858
1916
  logger.info(` 📄 ${path.join(outputDir, 'recorded.har')}`);
1859
1917
  logger.info(` 📄 ${path.join(outputDir, `${mockFileName}.ts`)}`);
1860
- logger.info(` 📄 ${path.join(outputDir, `${pageName}.spec.ts`)}`);
1861
- logger.info(` 📄 ${path.join(outputDir, `${pageName}-page.po.ts`)}`);
1918
+ logger.info(` 📄 ${path.join(outputDir, `${pascalCaseName}.spec.ts`)}`);
1919
+ logger.info(` 📄 ${path.join(outputDir, `${pascalCaseName}Page.ts`)}`);
1862
1920
  logger.newLine();
1863
1921
  logger.info('下一步:');
1864
1922
  logger.info(` 1. 查看生成的 Mock 代码: ${path.join(outputDir, `${mockFileName}.ts`)}`);
1865
- logger.info(` 2. 查看生成的测试用例: ${path.join(outputDir, `${pageName}.spec.ts`)}`);
1866
- logger.info(` 3. 查看生成的 POM 代码: ${path.join(outputDir, `${pageName}-page.po.ts`)}`);
1867
- logger.info(` 4. 运行测试: npx playwright test ${path.join(outputDir, `${pageName}.spec.ts`)}`);
1923
+ logger.info(` 2. 查看生成的测试用例: ${path.join(outputDir, `${pascalCaseName}.spec.ts`)}`);
1924
+ logger.info(` 3. 查看生成的 POM 代码: ${path.join(outputDir, `${pascalCaseName}Page.ts`)}`);
1925
+ logger.info(` 4. 运行测试: npx playwright test ${path.join(outputDir, `${pascalCaseName}.spec.ts`)}`);
1868
1926
  logger.newLine();
1869
1927
  }
1870
1928
  catch (error) {
@@ -1893,6 +1951,19 @@ function extractPageName(url) {
1893
1951
  return 'page';
1894
1952
  }
1895
1953
  }
1954
+ /**
1955
+ * 将字符串转换为 PascalCase 格式
1956
+ * @example
1957
+ * toPascalCase('user-profile') // 'UserProfile'
1958
+ * toPascalCase('my_page') // 'MyPage'
1959
+ * toPascalCase('login') // 'Login'
1960
+ */
1961
+ function toPascalCase(str) {
1962
+ return str
1963
+ .split(/[-_\s]+/) // 按短横线、下划线、空格分割
1964
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
1965
+ .join('');
1966
+ }
1896
1967
 
1897
1968
  /**
1898
1969
  * 生成命令
@@ -42,7 +42,7 @@ export interface SmartTestConfig {
42
42
  /**
43
43
  * 文件命名风格
44
44
  */
45
- naming?: 'camelCase' | 'kebab-case' | 'snake_case';
45
+ naming?: 'PascalCase' | 'camelCase' | 'kebab-case' | 'snake_case';
46
46
  };
47
47
  /**
48
48
  * 模板配置
@@ -1 +1 @@
1
- {"version":3,"file":"config-schema.d.ts","sourceRoot":"","sources":["../../src/config/config-schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,EAAE,CAAC,EAAE;QACH;;WAEG;QACH,KAAK,CAAC,EAAE,MAAM,CAAC;QAEf;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,CAAC;QAEhB;;WAEG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB;;WAEG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IAEF;;OAEG;IACH,MAAM,CAAC,EAAE;QACP;;WAEG;QACH,QAAQ,CAAC,EAAE,MAAM,CAAC;QAElB;;WAEG;QACH,UAAU,CAAC,EAAE,MAAM,CAAC;QAEpB;;WAEG;QACH,MAAM,CAAC,EAAE,WAAW,GAAG,YAAY,GAAG,YAAY,CAAC;KACpD,CAAC;IAEF;;OAEG;IACH,SAAS,CAAC,EAAE;QACV;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,CAAC;QAEd;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IAEF;;OAEG;IACH,UAAU,CAAC,EAAE;QACX;;WAEG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB;;WAEG;QACH,QAAQ,CAAC,EAAE;YACT,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;QAEF;;WAEG;QACH,OAAO,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;KAC7C,CAAC;CACH;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,eAwB5B,CAAC"}
1
+ {"version":3,"file":"config-schema.d.ts","sourceRoot":"","sources":["../../src/config/config-schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,EAAE,CAAC,EAAE;QACH;;WAEG;QACH,KAAK,CAAC,EAAE,MAAM,CAAC;QAEf;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,CAAC;QAEhB;;WAEG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB;;WAEG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IAEF;;OAEG;IACH,MAAM,CAAC,EAAE;QACP;;WAEG;QACH,QAAQ,CAAC,EAAE,MAAM,CAAC;QAElB;;WAEG;QACH,UAAU,CAAC,EAAE,MAAM,CAAC;QAEpB;;WAEG;QACH,MAAM,CAAC,EAAE,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,YAAY,CAAC;KACnE,CAAC;IAEF;;OAEG;IACH,SAAS,CAAC,EAAE;QACV;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,CAAC;QAEd;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IAEF;;OAEG;IACH,UAAU,CAAC,EAAE;QACX;;WAEG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB;;WAEG;QACH,QAAQ,CAAC,EAAE;YACT,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;QAEF;;WAEG;QACH,OAAO,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;KAC7C,CAAC;CACH;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,eAwB5B,CAAC"}
@@ -39,6 +39,10 @@ export declare class HARConverter {
39
39
  * 首字母大写
40
40
  */
41
41
  private capitalize;
42
+ /**
43
+ * 转换为 PascalCase
44
+ */
45
+ private toPascalCase;
42
46
  /**
43
47
  * 保存 Mock 代码
44
48
  */
@@ -1 +1 @@
1
- {"version":3,"file":"har-converter.d.ts","sourceRoot":"","sources":["../../src/recorder/har-converter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAY,MAAM,SAAS,CAAC;AAGjE;;GAEG;AACH,qBAAa,YAAY;IACvB;;OAEG;IACH,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,OAAO;IAiB1C;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA8BzB;;OAEG;IACG,OAAO,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAW9E;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAyCjE;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,OAAO,CAAC,eAAe;IAWvB;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IA2CtE;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAe1B;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAUtG"}
1
+ {"version":3,"file":"har-converter.d.ts","sourceRoot":"","sources":["../../src/recorder/har-converter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAY,MAAM,SAAS,CAAC;AAGjE;;GAEG;AACH,qBAAa,YAAY;IACvB;;OAEG;IACH,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,OAAO;IAiB1C;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA8BzB;;OAEG;IACG,OAAO,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAW9E;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAyCjE;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,OAAO,CAAC,eAAe;IAWvB;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IA2CtE;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAe1B;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,OAAO,CAAC,YAAY;IAOpB;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAWtG"}
@@ -52,6 +52,10 @@ export declare class POMGenerator {
52
52
  * 将描述转换为属性名
53
53
  */
54
54
  private toPropertyName;
55
+ /**
56
+ * 转换为 PascalCase
57
+ */
58
+ private toPascalCase;
55
59
  /**
56
60
  * 保存 POM 文件
57
61
  */
@@ -1 +1 @@
1
- {"version":3,"file":"pom-generator.d.ts","sourceRoot":"","sources":["../../src/recorder/pom-generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAG7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;IAEpE;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEnC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,qBAAa,YAAY;IAGX,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,MAAM,CAAuB;gBAEjB,MAAM,EAAE,eAAe;IAW3C;;OAEG;IACG,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA0IzD;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAiE9F;;OAEG;YACW,oBAAoB;IAqElC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA4BxB;;OAEG;IACH,OAAO,CAAC,cAAc;IAgBtB;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAUrF;;OAEG;IACH,OAAO,CAAC,UAAU;CAGnB"}
1
+ {"version":3,"file":"pom-generator.d.ts","sourceRoot":"","sources":["../../src/recorder/pom-generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAG7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;IAEpE;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEnC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,qBAAa,YAAY;IAGX,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,MAAM,CAAuB;gBAEjB,MAAM,EAAE,eAAe;IAW3C;;OAEG;IACG,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA0IzD;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAiE9F;;OAEG;YACW,oBAAoB;IAqElC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA4BxB;;OAEG;IACH,OAAO,CAAC,cAAc;IAgBtB;;OAEG;IACH,OAAO,CAAC,YAAY;IAOpB;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWrF;;OAEG;IACH,OAAO,CAAC,UAAU;CAGnB"}
@@ -23,6 +23,10 @@ export declare class TestGenerator {
23
23
  * 生成基础测试模板(不使用 AI)
24
24
  */
25
25
  private generateBasicTest;
26
+ /**
27
+ * 转换为 PascalCase
28
+ */
29
+ private toPascalCase;
26
30
  /**
27
31
  * 保存测试文件
28
32
  */
@@ -1 +1 @@
1
- {"version":3,"file":"test-generator.d.ts","sourceRoot":"","sources":["../../src/recorder/test-generator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D;;GAEG;AACH,qBAAa,aAAa;IAGZ,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,MAAM,CAAuB;gBAEjB,MAAM,EAAE,eAAe;IAW3C;;OAEG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA+CpH;;OAEG;IACH,OAAO,CAAC,WAAW;IA4BnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA2BzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA4BzB;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAUvF;;OAEG;IACH,OAAO,CAAC,UAAU;CAGnB"}
1
+ {"version":3,"file":"test-generator.d.ts","sourceRoot":"","sources":["../../src/recorder/test-generator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D;;GAEG;AACH,qBAAa,aAAa;IAGZ,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,MAAM,CAAuB;gBAEjB,MAAM,EAAE,eAAe;IAW3C;;OAEG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA+CpH;;OAEG;IACH,OAAO,CAAC,WAAW;IAgCnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA2BzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmDzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAOpB;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWvF;;OAEG;IACH,OAAO,CAAC,UAAU;CAGnB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@be-link/smart-test",
3
- "version": "1.0.1-beta.3",
3
+ "version": "1.0.1-beta.4",
4
4
  "type": "module",
5
5
  "description": "AI-powered visual testing for Playwright - 基于 AI 视觉模型的 Playwright 测试工具",
6
6
  "homepage": "https://github.com/snowmountain-top/be-link",