klasik 1.0.28 → 1.0.30
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/.claude/settings.local.json +7 -1
- package/dist/attribute-typemap-fixer.d.ts +37 -0
- package/dist/attribute-typemap-fixer.js +135 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -1
- package/dist/nestjs-type-fixer.d.ts +3 -0
- package/dist/nestjs-type-fixer.js +6 -0
- package/dist/openapi-client-generator.js +7 -0
- package/package.json +1 -1
|
@@ -19,7 +19,13 @@
|
|
|
19
19
|
"WebFetch(domain:json.schemastore.org)",
|
|
20
20
|
"Bash(node dist/cli.js:*)",
|
|
21
21
|
"Bash(curl:*)",
|
|
22
|
-
"Bash(node --input-type=module -e:*)"
|
|
22
|
+
"Bash(node --input-type=module -e:*)",
|
|
23
|
+
"Bash(while read f)",
|
|
24
|
+
"Bash(do if grep -q '\"\"\"\"vendorExtensions\"\"\"\": {}$' $f)",
|
|
25
|
+
"Bash(then echo $f)",
|
|
26
|
+
"Bash(fi)",
|
|
27
|
+
"Bash(done)",
|
|
28
|
+
"Bash(node -e:*)"
|
|
23
29
|
]
|
|
24
30
|
}
|
|
25
31
|
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fixes malformed attributeTypeMap arrays in generated TypeScript files
|
|
3
|
+
*
|
|
4
|
+
* openapi-class-transformer sometimes generates attributeTypeMap arrays
|
|
5
|
+
* with missing closing braces, especially when there's only a single entry.
|
|
6
|
+
*
|
|
7
|
+
* This utility fixes:
|
|
8
|
+
* - "vendorExtensions": {}\n]; -> "vendorExtensions": {}\n}\n];
|
|
9
|
+
*/
|
|
10
|
+
export declare class AttributeTypeMapFixer {
|
|
11
|
+
/**
|
|
12
|
+
* Fix all TypeScript files in a directory recursively
|
|
13
|
+
*/
|
|
14
|
+
fixDirectory(directory: string): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Fix a single file
|
|
17
|
+
* @returns true if file was modified, false otherwise
|
|
18
|
+
*/
|
|
19
|
+
private fixFile;
|
|
20
|
+
/**
|
|
21
|
+
* Fix missing closing braces in attributeTypeMap arrays
|
|
22
|
+
*
|
|
23
|
+
* Pattern to fix:
|
|
24
|
+
* "vendorExtensions": {}
|
|
25
|
+
* ]; // ❌ Missing }
|
|
26
|
+
*
|
|
27
|
+
* Should be:
|
|
28
|
+
* "vendorExtensions": {}
|
|
29
|
+
* } // ✅ Added closing brace
|
|
30
|
+
* ];
|
|
31
|
+
*/
|
|
32
|
+
private fixMissingClosingBraces;
|
|
33
|
+
/**
|
|
34
|
+
* Get all TypeScript files in a directory recursively
|
|
35
|
+
*/
|
|
36
|
+
private getAllTsFiles;
|
|
37
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
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.AttributeTypeMapFixer = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
/**
|
|
40
|
+
* Fixes malformed attributeTypeMap arrays in generated TypeScript files
|
|
41
|
+
*
|
|
42
|
+
* openapi-class-transformer sometimes generates attributeTypeMap arrays
|
|
43
|
+
* with missing closing braces, especially when there's only a single entry.
|
|
44
|
+
*
|
|
45
|
+
* This utility fixes:
|
|
46
|
+
* - "vendorExtensions": {}\n]; -> "vendorExtensions": {}\n}\n];
|
|
47
|
+
*/
|
|
48
|
+
class AttributeTypeMapFixer {
|
|
49
|
+
/**
|
|
50
|
+
* Fix all TypeScript files in a directory recursively
|
|
51
|
+
*/
|
|
52
|
+
async fixDirectory(directory) {
|
|
53
|
+
console.log('Fixing attributeTypeMap arrays...');
|
|
54
|
+
const files = this.getAllTsFiles(directory);
|
|
55
|
+
let fixedCount = 0;
|
|
56
|
+
for (const file of files) {
|
|
57
|
+
const fixed = await this.fixFile(file);
|
|
58
|
+
if (fixed) {
|
|
59
|
+
fixedCount++;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
console.log(`✅ Fixed attributeTypeMap in ${fixedCount} file(s)`);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Fix a single file
|
|
66
|
+
* @returns true if file was modified, false otherwise
|
|
67
|
+
*/
|
|
68
|
+
async fixFile(filePath) {
|
|
69
|
+
try {
|
|
70
|
+
let content = fs.readFileSync(filePath, 'utf8');
|
|
71
|
+
const originalContent = content;
|
|
72
|
+
// Fix missing closing braces in attributeTypeMap
|
|
73
|
+
content = this.fixMissingClosingBraces(content);
|
|
74
|
+
// Only write if content changed
|
|
75
|
+
if (content !== originalContent) {
|
|
76
|
+
fs.writeFileSync(filePath, content, 'utf8');
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
console.warn(`Warning: Failed to process ${filePath}:`, error);
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Fix missing closing braces in attributeTypeMap arrays
|
|
88
|
+
*
|
|
89
|
+
* Pattern to fix:
|
|
90
|
+
* "vendorExtensions": {}
|
|
91
|
+
* ]; // ❌ Missing }
|
|
92
|
+
*
|
|
93
|
+
* Should be:
|
|
94
|
+
* "vendorExtensions": {}
|
|
95
|
+
* } // ✅ Added closing brace
|
|
96
|
+
* ];
|
|
97
|
+
*/
|
|
98
|
+
fixMissingClosingBraces(content) {
|
|
99
|
+
// Look for: "vendorExtensions": {} followed by whitespace and ];
|
|
100
|
+
// Replace with: "vendorExtensions": {} followed by }, then ];
|
|
101
|
+
// Pattern explanation:
|
|
102
|
+
// - ("vendorExtensions":\s*\{\}) - match "vendorExtensions": {}
|
|
103
|
+
// - (\s*) - capture whitespace after vendorExtensions
|
|
104
|
+
// - (?=\];) - positive lookahead for ]; (don't consume it)
|
|
105
|
+
return content.replace(/("vendorExtensions":\s*\{\})(\s*)(?=\];)/g, (match, vendorExtensions, whitespace) => {
|
|
106
|
+
// Add closing brace before the ];
|
|
107
|
+
// Keep the whitespace, add }, then the whitespace before ];
|
|
108
|
+
return `${vendorExtensions}\n }`;
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get all TypeScript files in a directory recursively
|
|
113
|
+
*/
|
|
114
|
+
getAllTsFiles(directory) {
|
|
115
|
+
const files = [];
|
|
116
|
+
const walk = (dir) => {
|
|
117
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
118
|
+
for (const entry of entries) {
|
|
119
|
+
const fullPath = path.join(dir, entry.name);
|
|
120
|
+
if (entry.isDirectory()) {
|
|
121
|
+
// Skip node_modules and hidden directories
|
|
122
|
+
if (entry.name !== 'node_modules' && !entry.name.startsWith('.')) {
|
|
123
|
+
walk(fullPath);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else if (entry.isFile() && entry.name.endsWith('.ts')) {
|
|
127
|
+
files.push(fullPath);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
walk(directory);
|
|
132
|
+
return files;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
exports.AttributeTypeMapFixer = AttributeTypeMapFixer;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { OpenAPIClientGenerator, OpenAPIClientGeneratorOptions, GenerationMode } from './openapi-client-generator';
|
|
2
2
|
export { SpecDownloader, DownloadOptions } from './spec-downloader';
|
|
3
3
|
export { EsmFixer } from './esm-fixer';
|
|
4
|
+
export { AttributeTypeMapFixer } from './attribute-typemap-fixer';
|
|
4
5
|
export { CRDGenerator, CRDGeneratorOptions } from './crd/crd-generator';
|
|
5
6
|
export { CRDParser } from './crd/crd-parser';
|
|
6
7
|
export { CRDToOpenAPIConverter, ConversionOptions } from './crd/crd-to-openapi';
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.JSONSchemaToOpenAPIConverter = exports.JSONSchemaParser = exports.JSONSchemaGenerator = exports.CRDToOpenAPIConverter = exports.CRDParser = exports.CRDGenerator = exports.EsmFixer = exports.SpecDownloader = exports.OpenAPIClientGenerator = void 0;
|
|
3
|
+
exports.JSONSchemaToOpenAPIConverter = exports.JSONSchemaParser = exports.JSONSchemaGenerator = exports.CRDToOpenAPIConverter = exports.CRDParser = exports.CRDGenerator = exports.AttributeTypeMapFixer = exports.EsmFixer = exports.SpecDownloader = exports.OpenAPIClientGenerator = void 0;
|
|
4
4
|
var openapi_client_generator_1 = require("./openapi-client-generator");
|
|
5
5
|
Object.defineProperty(exports, "OpenAPIClientGenerator", { enumerable: true, get: function () { return openapi_client_generator_1.OpenAPIClientGenerator; } });
|
|
6
6
|
var spec_downloader_1 = require("./spec-downloader");
|
|
7
7
|
Object.defineProperty(exports, "SpecDownloader", { enumerable: true, get: function () { return spec_downloader_1.SpecDownloader; } });
|
|
8
8
|
var esm_fixer_1 = require("./esm-fixer");
|
|
9
9
|
Object.defineProperty(exports, "EsmFixer", { enumerable: true, get: function () { return esm_fixer_1.EsmFixer; } });
|
|
10
|
+
var attribute_typemap_fixer_1 = require("./attribute-typemap-fixer");
|
|
11
|
+
Object.defineProperty(exports, "AttributeTypeMapFixer", { enumerable: true, get: function () { return attribute_typemap_fixer_1.AttributeTypeMapFixer; } });
|
|
10
12
|
// CRD generation exports
|
|
11
13
|
var crd_generator_1 = require("./crd/crd-generator");
|
|
12
14
|
Object.defineProperty(exports, "CRDGenerator", { enumerable: true, get: function () { return crd_generator_1.CRDGenerator; } });
|
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
* backticks within the text
|
|
11
11
|
* 3. Undefined descriptions: Some decorators have description: undefined
|
|
12
12
|
* instead of empty strings
|
|
13
|
+
* 4. Invalid complex object types: Uses invalid arrow function syntax for
|
|
14
|
+
* dictionary types (type: () => [{ [key: string]: any; }])
|
|
13
15
|
*
|
|
14
16
|
* This utility transforms:
|
|
15
17
|
* - type: 'string' -> type: String
|
|
@@ -18,6 +20,7 @@
|
|
|
18
20
|
* - type: () => [string] -> type: [String]
|
|
19
21
|
* - type: () => [number] -> type: [Number]
|
|
20
22
|
* - type: () => [boolean] -> type: [Boolean]
|
|
23
|
+
* - type: () => [{ [key: string]: any; }] -> type: 'object'
|
|
21
24
|
* - description: `text `code` here` -> description: `text \`code\` here`
|
|
22
25
|
* - description: undefined -> description: ''
|
|
23
26
|
*
|
|
@@ -48,6 +48,8 @@ const path = __importStar(require("path"));
|
|
|
48
48
|
* backticks within the text
|
|
49
49
|
* 3. Undefined descriptions: Some decorators have description: undefined
|
|
50
50
|
* instead of empty strings
|
|
51
|
+
* 4. Invalid complex object types: Uses invalid arrow function syntax for
|
|
52
|
+
* dictionary types (type: () => [{ [key: string]: any; }])
|
|
51
53
|
*
|
|
52
54
|
* This utility transforms:
|
|
53
55
|
* - type: 'string' -> type: String
|
|
@@ -56,6 +58,7 @@ const path = __importStar(require("path"));
|
|
|
56
58
|
* - type: () => [string] -> type: [String]
|
|
57
59
|
* - type: () => [number] -> type: [Number]
|
|
58
60
|
* - type: () => [boolean] -> type: [Boolean]
|
|
61
|
+
* - type: () => [{ [key: string]: any; }] -> type: 'object'
|
|
59
62
|
* - description: `text `code` here` -> description: `text \`code\` here`
|
|
60
63
|
* - description: undefined -> description: ''
|
|
61
64
|
*
|
|
@@ -137,6 +140,9 @@ class NestJsTypeFixer {
|
|
|
137
140
|
const capitalized = primitive.charAt(0).toUpperCase() + primitive.slice(1);
|
|
138
141
|
return `type: [${capitalized}]`;
|
|
139
142
|
});
|
|
143
|
+
// Fix invalid complex object types with index signatures
|
|
144
|
+
// type: () => [{ [key: string]: any; }] -> type: 'object'
|
|
145
|
+
content = content.replace(/type:\s*\(\)\s*=>\s*\[\{[^\]]*\[key:\s*string\][^\]]*\}\]/g, "type: 'object'");
|
|
140
146
|
// Fix unescaped backticks in description strings
|
|
141
147
|
content = this.escapeBackticksInDescriptions(content);
|
|
142
148
|
// Fix undefined descriptions
|
|
@@ -102,6 +102,13 @@ class OpenAPIClientGenerator {
|
|
|
102
102
|
const typeFixer = new NestJsTypeFixer();
|
|
103
103
|
await typeFixer.fixDirectory(outputDir);
|
|
104
104
|
}
|
|
105
|
+
// Step 4.6: Fix malformed attributeTypeMap arrays
|
|
106
|
+
if (nestJsSwagger) {
|
|
107
|
+
console.log('Step 4.6: Fixing attributeTypeMap arrays...');
|
|
108
|
+
const { AttributeTypeMapFixer } = await Promise.resolve().then(() => __importStar(require('./attribute-typemap-fixer')));
|
|
109
|
+
const attrFixer = new AttributeTypeMapFixer();
|
|
110
|
+
await attrFixer.fixDirectory(outputDir);
|
|
111
|
+
}
|
|
105
112
|
// Step 5: Fix ESM imports if requested
|
|
106
113
|
if (fixEsmImports) {
|
|
107
114
|
console.log('Step 5: Fixing ESM imports...');
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "klasik",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.30",
|
|
4
4
|
"description": "Download OpenAPI specs from remote URLs and generate TypeScript clients with class-transformer support - support yaml, json, CustomResourceDefinition formats",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|