swagger-to-playwright-api-clients 1.0.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.
- package/LICENSE +21 -0
- package/README.md +190 -0
- package/dist/api.d.ts +27 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +127 -0
- package/dist/api.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +255 -0
- package/dist/cli.js.map +1 -0
- package/dist/clients/BaseAPIClient.d.ts +88 -0
- package/dist/clients/BaseAPIClient.d.ts.map +1 -0
- package/dist/clients/BaseAPIClient.js +199 -0
- package/dist/clients/BaseAPIClient.js.map +1 -0
- package/dist/config/types.d.ts +72 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +19 -0
- package/dist/config/types.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/copyBaseClient.d.ts +8 -0
- package/dist/utils/copyBaseClient.d.ts.map +1 -0
- package/dist/utils/copyBaseClient.js +354 -0
- package/dist/utils/copyBaseClient.js.map +1 -0
- package/dist/utils/logger.d.ts +6 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +57 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/swagger/ClientGenerator.d.ts +49 -0
- package/dist/utils/swagger/ClientGenerator.d.ts.map +1 -0
- package/dist/utils/swagger/ClientGenerator.js +192 -0
- package/dist/utils/swagger/ClientGenerator.js.map +1 -0
- package/dist/utils/swagger/FileWriter.d.ts +66 -0
- package/dist/utils/swagger/FileWriter.d.ts.map +1 -0
- package/dist/utils/swagger/FileWriter.js +185 -0
- package/dist/utils/swagger/FileWriter.js.map +1 -0
- package/dist/utils/swagger/SwaggerGenerator.d.ts +42 -0
- package/dist/utils/swagger/SwaggerGenerator.d.ts.map +1 -0
- package/dist/utils/swagger/SwaggerGenerator.js +211 -0
- package/dist/utils/swagger/SwaggerGenerator.js.map +1 -0
- package/dist/utils/swagger/SwaggerParser.d.ts +69 -0
- package/dist/utils/swagger/SwaggerParser.d.ts.map +1 -0
- package/dist/utils/swagger/SwaggerParser.js +358 -0
- package/dist/utils/swagger/SwaggerParser.js.map +1 -0
- package/dist/utils/swagger/TypeGenerator.d.ts +49 -0
- package/dist/utils/swagger/TypeGenerator.d.ts.map +1 -0
- package/dist/utils/swagger/TypeGenerator.js +166 -0
- package/dist/utils/swagger/TypeGenerator.js.map +1 -0
- package/dist/utils/swagger/index.d.ts +12 -0
- package/dist/utils/swagger/index.d.ts.map +1 -0
- package/dist/utils/swagger/index.js +38 -0
- package/dist/utils/swagger/index.js.map +1 -0
- package/dist/utils/swagger/run-generator.d.ts +23 -0
- package/dist/utils/swagger/run-generator.d.ts.map +1 -0
- package/dist/utils/swagger/run-generator.js +195 -0
- package/dist/utils/swagger/run-generator.js.map +1 -0
- package/dist/utils/swagger/types.d.ts +142 -0
- package/dist/utils/swagger/types.d.ts.map +1 -0
- package/dist/utils/swagger/types.js +7 -0
- package/dist/utils/swagger/types.js.map +1 -0
- package/dist/utils/swagger/utils/naming.d.ts +48 -0
- package/dist/utils/swagger/utils/naming.d.ts.map +1 -0
- package/dist/utils/swagger/utils/naming.js +109 -0
- package/dist/utils/swagger/utils/naming.js.map +1 -0
- package/dist/utils/swagger/utils/pathUtils.d.ts +40 -0
- package/dist/utils/swagger/utils/pathUtils.d.ts.map +1 -0
- package/dist/utils/swagger/utils/pathUtils.js +118 -0
- package/dist/utils/swagger/utils/pathUtils.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Path utilities for processing API endpoints
|
|
4
|
+
* Handles path parsing, grouping, and organization
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.determineFolderStructure = determineFolderStructure;
|
|
8
|
+
exports.stripPathParams = stripPathParams;
|
|
9
|
+
exports.generatePathTemplate = generatePathTemplate;
|
|
10
|
+
exports.parseQueryFromPath = parseQueryFromPath;
|
|
11
|
+
exports.groupEndpointsByFolder = groupEndpointsByFolder;
|
|
12
|
+
const naming_1 = require("./naming");
|
|
13
|
+
/**
|
|
14
|
+
* Determine the folder structure for an endpoint
|
|
15
|
+
* Groups endpoints logically based on path segments
|
|
16
|
+
*/
|
|
17
|
+
function determineFolderStructure(path, serviceName) {
|
|
18
|
+
const segments = path.split('/').filter((s) => s && !s.startsWith('{') && !s.endsWith('}'));
|
|
19
|
+
// Skip common prefixes
|
|
20
|
+
const filtered = segments.filter((s) => !['api', 'v1', 'v2', 'v3'].includes(s.toLowerCase()));
|
|
21
|
+
// Start with service name
|
|
22
|
+
const folders = [(0, naming_1.toPascalCase)(serviceName)];
|
|
23
|
+
// If only one segment after filtering (e.g., /health, /metrics), use Root folder
|
|
24
|
+
if (filtered.length <= 1) {
|
|
25
|
+
folders.push('Root');
|
|
26
|
+
return folders;
|
|
27
|
+
}
|
|
28
|
+
// Check for therapist keyword - create dedicated folder
|
|
29
|
+
for (const segment of filtered) {
|
|
30
|
+
if (segment.toLowerCase().includes('therapist')) {
|
|
31
|
+
folders.push('Therapist');
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// Group by first meaningful segment after service name
|
|
36
|
+
if (filtered.length > 1) {
|
|
37
|
+
// Use the first segment after the service-like segment
|
|
38
|
+
const groupSegment = filtered[0];
|
|
39
|
+
if (!folders.includes((0, naming_1.toPascalCase)(groupSegment)) &&
|
|
40
|
+
groupSegment.toLowerCase() !== 'therapist') {
|
|
41
|
+
folders.push((0, naming_1.toPascalCase)(groupSegment));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return folders;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Strip path parameters from endpoint for base path
|
|
48
|
+
* Example: "/api/v1/activity/{id}/items/{itemId}" -> "/api/v1/activity"
|
|
49
|
+
*/
|
|
50
|
+
function stripPathParams(path) {
|
|
51
|
+
return path
|
|
52
|
+
.split('/')
|
|
53
|
+
.filter((s) => !s.startsWith('{'))
|
|
54
|
+
.join('/');
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Generate template literal for path with params
|
|
58
|
+
* Example: "/api/v1/activity/{id}" -> "`/api/v1/activity/${id}`"
|
|
59
|
+
*/
|
|
60
|
+
function generatePathTemplate(path) {
|
|
61
|
+
const hasParams = path.includes('{');
|
|
62
|
+
if (!hasParams) {
|
|
63
|
+
return `'${path}'`;
|
|
64
|
+
}
|
|
65
|
+
// Convert {param} to ${param}
|
|
66
|
+
const template = path.replace(/\{([^}]+)\}/g, '${$1}');
|
|
67
|
+
return '`' + template + '`';
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Parse query parameters from path (if any exist in the path definition)
|
|
71
|
+
*/
|
|
72
|
+
function parseQueryFromPath(path) {
|
|
73
|
+
const [basePath, query] = path.split('?');
|
|
74
|
+
if (!query) {
|
|
75
|
+
return { basePath, queryParams: [] };
|
|
76
|
+
}
|
|
77
|
+
const queryParams = [];
|
|
78
|
+
const params = query.split('&');
|
|
79
|
+
for (const param of params) {
|
|
80
|
+
const [key] = param.split('=');
|
|
81
|
+
if (key) {
|
|
82
|
+
queryParams.push(key.replace(/[{}]/g, ''));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return { basePath, queryParams };
|
|
86
|
+
}
|
|
87
|
+
function groupEndpointsByFolder(paths, serviceName) {
|
|
88
|
+
const groups = new Map();
|
|
89
|
+
for (const [path, pathItem] of Object.entries(paths)) {
|
|
90
|
+
const folders = determineFolderStructure(path, serviceName);
|
|
91
|
+
const folderKey = folders.join('/');
|
|
92
|
+
if (!groups.has(folderKey)) {
|
|
93
|
+
groups.set(folderKey, {
|
|
94
|
+
folder: folders,
|
|
95
|
+
endpoints: [],
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
const methods = [
|
|
99
|
+
'get',
|
|
100
|
+
'post',
|
|
101
|
+
'put',
|
|
102
|
+
'patch',
|
|
103
|
+
'delete',
|
|
104
|
+
];
|
|
105
|
+
for (const method of methods) {
|
|
106
|
+
const operation = pathItem[method];
|
|
107
|
+
if (operation) {
|
|
108
|
+
groups.get(folderKey).endpoints.push({
|
|
109
|
+
path,
|
|
110
|
+
method: method.toUpperCase(),
|
|
111
|
+
operationId: operation.operationId,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return groups;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=pathUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pathUtils.js","sourceRoot":"","sources":["../../../../src/utils/swagger/utils/pathUtils.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "swagger-to-playwright-api-clients",
|
|
3
|
+
"version": "1.0.4",
|
|
4
|
+
"description": "Generate TypeScript API clients from Swagger/OpenAPI specifications for Playwright testing",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"swagger-to-playwright": "./dist/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"build:watch": "tsc --watch",
|
|
17
|
+
"prepublishOnly": "npm run build",
|
|
18
|
+
"test": "npx playwright test",
|
|
19
|
+
"generate": "npx ts-node src/cli.ts",
|
|
20
|
+
"generate:help": "npx ts-node src/cli.ts --help",
|
|
21
|
+
"format": "prettier --write .",
|
|
22
|
+
"format:check": "prettier --check ."
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"swagger",
|
|
26
|
+
"openapi",
|
|
27
|
+
"playwright",
|
|
28
|
+
"api-client",
|
|
29
|
+
"code-generator",
|
|
30
|
+
"typescript"
|
|
31
|
+
],
|
|
32
|
+
"author": "",
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "https://github.com/amartanwar42/swagger-to-playwright-api-clients"
|
|
37
|
+
},
|
|
38
|
+
"engines": {
|
|
39
|
+
"node": ">=18.0.0"
|
|
40
|
+
},
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"@playwright/test": ">=1.40.0",
|
|
43
|
+
"playwright": ">=1.40.0"
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"winston": "^3.19.0"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@playwright/test": "^1.58.2",
|
|
50
|
+
"@types/node": "^25.3.0",
|
|
51
|
+
"playwright": "^1.58.2",
|
|
52
|
+
"prettier": "^3.5.3",
|
|
53
|
+
"ts-node": "^10.9.2",
|
|
54
|
+
"typescript": "^5.9.3"
|
|
55
|
+
}
|
|
56
|
+
}
|