@geekles007/spring-to-ts 1.0.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.
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.FileUtils = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const glob_1 = require("glob");
40
+ class FileUtils {
41
+ static async findSourceFiles(sourceDir, excludePatterns = []) {
42
+ const patterns = ['**/*.kt', '**/*.java'];
43
+ const allFiles = [];
44
+ for (const pattern of patterns) {
45
+ const files = await (0, glob_1.glob)(path.join(sourceDir, pattern), {
46
+ ignore: excludePatterns.map((p) => path.join(sourceDir, p)),
47
+ });
48
+ allFiles.push(...files);
49
+ }
50
+ return allFiles;
51
+ }
52
+ static ensureDirectoryExists(dirPath) {
53
+ if (!fs.existsSync(dirPath)) {
54
+ fs.mkdirSync(dirPath, { recursive: true });
55
+ }
56
+ }
57
+ static writeFile(filePath, content) {
58
+ const dir = path.dirname(filePath);
59
+ this.ensureDirectoryExists(dir);
60
+ fs.writeFileSync(filePath, content, 'utf-8');
61
+ }
62
+ static readFile(filePath) {
63
+ return fs.readFileSync(filePath, 'utf-8');
64
+ }
65
+ static getRelativePath(from, to) {
66
+ const relativePath = path.relative(from, to);
67
+ return relativePath.replace(/\\/g, '/');
68
+ }
69
+ static getFileNameWithoutExtension(filePath) {
70
+ return path.basename(filePath, path.extname(filePath));
71
+ }
72
+ }
73
+ exports.FileUtils = FileUtils;
74
+ //# sourceMappingURL=file-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAC7B,+BAA4B;AAE5B,MAAa,SAAS;IACpB,MAAM,CAAC,KAAK,CAAC,eAAe,CAC1B,SAAiB,EACjB,kBAA4B,EAAE;QAE9B,MAAM,QAAQ,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,IAAA,WAAI,EAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE;gBACtD,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;aAC5D,CAAC,CAAC;YACH,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,qBAAqB,CAAC,OAAe;QAC1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,QAAgB,EAAE,OAAe;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAChC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,QAAgB;QAC9B,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,eAAe,CAAC,IAAY,EAAE,EAAU;QAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7C,OAAO,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,CAAC,2BAA2B,CAAC,QAAgB;QACjD,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACzD,CAAC;CACF;AA1CD,8BA0CC"}
@@ -0,0 +1,13 @@
1
+ import { SpringToTsConfig } from '../types';
2
+ export declare class TypeMapper {
3
+ private customMapping;
4
+ private dateFormat;
5
+ constructor(config: SpringToTsConfig);
6
+ mapType(kotlinType: string): string;
7
+ private mapDateType;
8
+ private handleGenericType;
9
+ private parseGenericTypes;
10
+ isNullable(type: string): boolean;
11
+ removeNullability(type: string): string;
12
+ }
13
+ //# sourceMappingURL=type-mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-mapper.d.ts","sourceRoot":"","sources":["../../src/utils/type-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAe,MAAM,UAAU,CAAC;AAEzD,qBAAa,UAAU;IACrB,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,EAAE,gBAAgB;IAKpC,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAoEnC,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,iBAAiB;IA2BzB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAGxC"}
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TypeMapper = void 0;
4
+ class TypeMapper {
5
+ constructor(config) {
6
+ this.dateFormat = config.dateFormat || 'ISO';
7
+ this.customMapping = config.customTypeMapping || {};
8
+ }
9
+ mapType(kotlinType) {
10
+ // Check custom mapping first
11
+ if (this.customMapping[kotlinType]) {
12
+ return this.customMapping[kotlinType];
13
+ }
14
+ // Remove generic parameters for base type matching
15
+ const baseType = kotlinType.split('<')[0].trim();
16
+ // Standard Kotlin/Java to TypeScript mappings
17
+ const standardMapping = {
18
+ // Kotlin primitives
19
+ String: 'string',
20
+ Int: 'number',
21
+ Long: 'number',
22
+ Double: 'number',
23
+ Float: 'number',
24
+ Boolean: 'boolean',
25
+ Char: 'string',
26
+ Byte: 'number',
27
+ Short: 'number',
28
+ // Java primitives
29
+ int: 'number',
30
+ long: 'number',
31
+ double: 'number',
32
+ float: 'number',
33
+ boolean: 'boolean',
34
+ char: 'string',
35
+ byte: 'number',
36
+ short: 'number',
37
+ // Common Java types
38
+ Integer: 'number',
39
+ BigDecimal: 'number',
40
+ BigInteger: 'number',
41
+ UUID: 'string',
42
+ // Date/Time types
43
+ Date: this.mapDateType(),
44
+ LocalDate: this.mapDateType(),
45
+ LocalDateTime: this.mapDateType(),
46
+ LocalTime: 'string',
47
+ ZonedDateTime: this.mapDateType(),
48
+ Instant: this.mapDateType(),
49
+ Timestamp: this.mapDateType(),
50
+ // Collections (will handle generics separately)
51
+ List: 'Array',
52
+ Set: 'Array',
53
+ Collection: 'Array',
54
+ Map: 'Record',
55
+ // Special types
56
+ Any: 'any',
57
+ Object: 'any',
58
+ Void: 'void',
59
+ Unit: 'void',
60
+ };
61
+ if (standardMapping[baseType]) {
62
+ return this.handleGenericType(kotlinType, standardMapping[baseType]);
63
+ }
64
+ // If no mapping found, assume it's a custom entity type
65
+ return baseType;
66
+ }
67
+ mapDateType() {
68
+ switch (this.dateFormat) {
69
+ case 'Date':
70
+ return 'Date';
71
+ case 'number':
72
+ return 'number';
73
+ case 'ISO':
74
+ default:
75
+ return 'string';
76
+ }
77
+ }
78
+ handleGenericType(fullType, baseMapping) {
79
+ const genericMatch = fullType.match(/<(.+)>/);
80
+ if (!genericMatch) {
81
+ return baseMapping === 'Array' ? 'any[]' : baseMapping;
82
+ }
83
+ const genericTypes = this.parseGenericTypes(genericMatch[1]);
84
+ if (baseMapping === 'Array') {
85
+ const elementType = this.mapType(genericTypes[0]);
86
+ return `${elementType}[]`;
87
+ }
88
+ if (baseMapping === 'Record') {
89
+ const keyType = this.mapType(genericTypes[0]);
90
+ const valueType = this.mapType(genericTypes[1] || 'any');
91
+ return `Record<${keyType}, ${valueType}>`;
92
+ }
93
+ return baseMapping;
94
+ }
95
+ parseGenericTypes(generics) {
96
+ const types = [];
97
+ let currentType = '';
98
+ let depth = 0;
99
+ for (const char of generics) {
100
+ if (char === '<') {
101
+ depth++;
102
+ currentType += char;
103
+ }
104
+ else if (char === '>') {
105
+ depth--;
106
+ currentType += char;
107
+ }
108
+ else if (char === ',' && depth === 0) {
109
+ types.push(currentType.trim());
110
+ currentType = '';
111
+ }
112
+ else {
113
+ currentType += char;
114
+ }
115
+ }
116
+ if (currentType.trim()) {
117
+ types.push(currentType.trim());
118
+ }
119
+ return types;
120
+ }
121
+ isNullable(type) {
122
+ return type.endsWith('?') || type.includes('Optional<');
123
+ }
124
+ removeNullability(type) {
125
+ return type.replace('?', '').replace(/Optional<(.+)>/, '$1');
126
+ }
127
+ }
128
+ exports.TypeMapper = TypeMapper;
129
+ //# sourceMappingURL=type-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-mapper.js","sourceRoot":"","sources":["../../src/utils/type-mapper.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@geekles007/spring-to-ts",
3
+ "version": "1.0.0",
4
+ "description": "Generate TypeScript types from Spring Boot/Kotlin entities",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "spring-to-ts": "./bin/spring-to-ts.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "bin",
13
+ "README.md",
14
+ "LICENSE"
15
+ ],
16
+ "scripts": {
17
+ "build": "tsc",
18
+ "dev": "tsc --watch",
19
+ "prepublishOnly": "yarn build",
20
+ "test": "jest --passWithNoTests",
21
+ "lint": "eslint src/**/*.ts",
22
+ "format": "prettier --write \"src/**/*.ts\""
23
+ },
24
+ "keywords": [
25
+ "spring-boot",
26
+ "kotlin",
27
+ "java",
28
+ "typescript",
29
+ "code-generation",
30
+ "types",
31
+ "jpa",
32
+ "dto"
33
+ ],
34
+ "author": "geekles007 <tondjilee@gmail.com>",
35
+ "license": "MIT",
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "https://github.com/geekles007/spring-to-ts.git"
39
+ },
40
+ "homepage": "https://github.com/geekles007/spring-to-ts#readme",
41
+ "bugs": {
42
+ "url": "https://github.com/geekles007/spring-to-ts/issues"
43
+ },
44
+ "dependencies": {
45
+ "chalk": "^4.1.2",
46
+ "chokidar": "^3.6.0",
47
+ "commander": "^12.0.0",
48
+ "glob": "^10.3.10",
49
+ "js-yaml": "^4.1.0"
50
+ },
51
+ "devDependencies": {
52
+ "@types/jest": "^29.5.11",
53
+ "@types/js-yaml": "^4.0.9",
54
+ "@types/node": "^20.11.0",
55
+ "@typescript-eslint/eslint-plugin": "^6.19.0",
56
+ "@typescript-eslint/parser": "^6.19.0",
57
+ "eslint": "^8.56.0",
58
+ "jest": "^29.7.0",
59
+ "prettier": "^3.2.4",
60
+ "strip-ansi": "6.0.1",
61
+ "ts-jest": "^29.1.2",
62
+ "typescript": "^5.3.3"
63
+ },
64
+ "engines": {
65
+ "node": ">=18.0.0"
66
+ },
67
+ "resolutions": {
68
+ "strip-ansi": "6.0.1",
69
+ "string-width": "^4.2.3",
70
+ "wrap-ansi": "^7.0.0"
71
+ }
72
+ }