@g1cloud/api-gen 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.
Files changed (86) hide show
  1. package/.claude/settings.local.json +22 -0
  2. package/CLAUDE.md +63 -0
  3. package/README.md +379 -0
  4. package/dist/analyzer/controllerAnalyzer.d.ts +20 -0
  5. package/dist/analyzer/controllerAnalyzer.d.ts.map +1 -0
  6. package/dist/analyzer/controllerAnalyzer.js +101 -0
  7. package/dist/analyzer/controllerAnalyzer.js.map +1 -0
  8. package/dist/analyzer/parameterAnalyzer.d.ts +19 -0
  9. package/dist/analyzer/parameterAnalyzer.d.ts.map +1 -0
  10. package/dist/analyzer/parameterAnalyzer.js +207 -0
  11. package/dist/analyzer/parameterAnalyzer.js.map +1 -0
  12. package/dist/analyzer/responseAnalyzer.d.ts +12 -0
  13. package/dist/analyzer/responseAnalyzer.d.ts.map +1 -0
  14. package/dist/analyzer/responseAnalyzer.js +116 -0
  15. package/dist/analyzer/responseAnalyzer.js.map +1 -0
  16. package/dist/analyzer/schemaGenerator.d.ts +6 -0
  17. package/dist/analyzer/schemaGenerator.d.ts.map +1 -0
  18. package/dist/analyzer/schemaGenerator.js +347 -0
  19. package/dist/analyzer/schemaGenerator.js.map +1 -0
  20. package/dist/analyzer/securityAnalyzer.d.ts +6 -0
  21. package/dist/analyzer/securityAnalyzer.d.ts.map +1 -0
  22. package/dist/analyzer/securityAnalyzer.js +177 -0
  23. package/dist/analyzer/securityAnalyzer.js.map +1 -0
  24. package/dist/generator/openapiGenerator.d.ts +14 -0
  25. package/dist/generator/openapiGenerator.d.ts.map +1 -0
  26. package/dist/generator/openapiGenerator.js +340 -0
  27. package/dist/generator/openapiGenerator.js.map +1 -0
  28. package/dist/index.d.ts +3 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +218 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/lib.d.ts +61 -0
  33. package/dist/lib.d.ts.map +1 -0
  34. package/dist/lib.js +199 -0
  35. package/dist/lib.js.map +1 -0
  36. package/dist/mcp-server.d.ts +9 -0
  37. package/dist/mcp-server.d.ts.map +1 -0
  38. package/dist/mcp-server.js +257 -0
  39. package/dist/mcp-server.js.map +1 -0
  40. package/dist/mcp-server.mjs +45586 -0
  41. package/dist/parser/astAnalyzer.d.ts +87 -0
  42. package/dist/parser/astAnalyzer.d.ts.map +1 -0
  43. package/dist/parser/astAnalyzer.js +321 -0
  44. package/dist/parser/astAnalyzer.js.map +1 -0
  45. package/dist/parser/javaParser.d.ts +10 -0
  46. package/dist/parser/javaParser.d.ts.map +1 -0
  47. package/dist/parser/javaParser.js +805 -0
  48. package/dist/parser/javaParser.js.map +1 -0
  49. package/dist/types/index.d.ts +217 -0
  50. package/dist/types/index.d.ts.map +1 -0
  51. package/dist/types/index.js +3 -0
  52. package/dist/types/index.js.map +1 -0
  53. package/examples/CreateUserRequest.java +80 -0
  54. package/examples/DepartmentDTO.java +45 -0
  55. package/examples/Filter.java +39 -0
  56. package/examples/PaginatedList.java +71 -0
  57. package/examples/ProductController.java +136 -0
  58. package/examples/ProductDTO.java +129 -0
  59. package/examples/RoleDTO.java +47 -0
  60. package/examples/SearchParam.java +55 -0
  61. package/examples/Sort.java +70 -0
  62. package/examples/UpdateUserRequest.java +74 -0
  63. package/examples/UserController.java +98 -0
  64. package/examples/UserDTO.java +119 -0
  65. package/package.json +51 -0
  66. package/prompt/01_Initial.md +358 -0
  67. package/prompt/02_/354/266/224/352/260/200.md +31 -0
  68. package/src/analyzer/controllerAnalyzer.ts +125 -0
  69. package/src/analyzer/parameterAnalyzer.ts +259 -0
  70. package/src/analyzer/responseAnalyzer.ts +142 -0
  71. package/src/analyzer/schemaGenerator.ts +412 -0
  72. package/src/analyzer/securityAnalyzer.ts +200 -0
  73. package/src/generator/openapiGenerator.ts +378 -0
  74. package/src/index.ts +212 -0
  75. package/src/lib.ts +240 -0
  76. package/src/mcp-server.ts +310 -0
  77. package/src/parser/astAnalyzer.ts +373 -0
  78. package/src/parser/javaParser.ts +901 -0
  79. package/src/types/index.ts +238 -0
  80. package/test-boolean.yaml +607 -0
  81. package/test-filter.yaml +576 -0
  82. package/test-inner.ts +59 -0
  83. package/test-output.yaml +650 -0
  84. package/test-paginated.yaml +585 -0
  85. package/tsconfig.json +20 -0
  86. package/tsup.config.ts +30 -0
@@ -0,0 +1,347 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateSchemas = generateSchemas;
4
+ const astAnalyzer_1 = require("../parser/astAnalyzer");
5
+ /**
6
+ * Generate OpenAPI schemas for all referenced types
7
+ */
8
+ function generateSchemas(context) {
9
+ const schemas = new Map(context.dtoSchemas);
10
+ // Add standard schemas for SearchParam, Filter, Sort
11
+ addStandardSchemas(schemas);
12
+ // Process all referenced types
13
+ const processedTypes = new Set();
14
+ const typesToProcess = [...context.referencedTypes];
15
+ while (typesToProcess.length > 0) {
16
+ const typeName = typesToProcess.pop();
17
+ if (processedTypes.has(typeName)) {
18
+ continue;
19
+ }
20
+ processedTypes.add(typeName);
21
+ // Skip primitive types
22
+ if (astAnalyzer_1.ASTAnalyzer.isPrimitiveOrWrapper(typeName)) {
23
+ continue;
24
+ }
25
+ // Skip if already in schemas
26
+ if (schemas.has(typeName)) {
27
+ continue;
28
+ }
29
+ // Find the Java class for this type
30
+ const javaClass = context.javaClasses.get(typeName);
31
+ if (javaClass) {
32
+ // Handle enum types
33
+ if (javaClass.isEnum && javaClass.enumValues) {
34
+ schemas.set(typeName, {
35
+ type: 'string',
36
+ enum: javaClass.enumValues,
37
+ description: javaClass.javadoc,
38
+ });
39
+ }
40
+ else {
41
+ const { schema, nestedTypes } = generateSchemaForClass(javaClass, context);
42
+ schemas.set(typeName, schema);
43
+ // Add nested types to process
44
+ for (const nestedType of nestedTypes) {
45
+ if (!processedTypes.has(nestedType)) {
46
+ typesToProcess.push(nestedType);
47
+ }
48
+ }
49
+ }
50
+ }
51
+ else {
52
+ // Type not found, create a generic object schema
53
+ schemas.set(typeName, {
54
+ type: 'object',
55
+ description: `Schema for ${typeName}`,
56
+ });
57
+ }
58
+ }
59
+ return schemas;
60
+ }
61
+ /**
62
+ * Add standard schemas for SearchParam, Filter, Sort
63
+ */
64
+ function addStandardSchemas(schemas) {
65
+ // Filter schema
66
+ if (!schemas.has('Filter')) {
67
+ schemas.set('Filter', {
68
+ type: 'object',
69
+ description: 'Filter conditions',
70
+ });
71
+ }
72
+ // Sort schema
73
+ if (!schemas.has('Sort')) {
74
+ schemas.set('Sort', {
75
+ type: 'object',
76
+ description: 'Sort conditions',
77
+ });
78
+ }
79
+ // SearchParam schema (for reference)
80
+ if (!schemas.has('SearchParam')) {
81
+ schemas.set('SearchParam', {
82
+ type: 'object',
83
+ description: 'Search parameters for pagination and filtering',
84
+ properties: {
85
+ offset: { type: 'integer', description: 'Pagination offset' },
86
+ limit: { type: 'integer', description: 'Pagination limit' },
87
+ filter: { $ref: '#/components/schemas/Filter' },
88
+ sort: { $ref: '#/components/schemas/Sort' },
89
+ },
90
+ });
91
+ }
92
+ // MultiLangString schema - Map<String, String>
93
+ if (!schemas.has('MultiLangString')) {
94
+ schemas.set('MultiLangString', {
95
+ type: 'object',
96
+ description: 'Multi-language string (Map<String, String>)',
97
+ additionalProperties: { type: 'string' },
98
+ });
99
+ }
100
+ // StoredFile schema
101
+ if (!schemas.has('StoredFile')) {
102
+ schemas.set('StoredFile', {
103
+ type: 'object',
104
+ description: 'Stored file information',
105
+ properties: {
106
+ fileUrl: { type: 'string', description: 'File URL' },
107
+ mediaType: { type: 'MediaType', enum: ['Image', 'Vide', 'Youtube', 'Unknown'], description: 'Media type' },
108
+ thumbnailUrl: { type: 'string', description: 'Thumbnail URL' },
109
+ fileName: { type: 'string', description: 'Original file name' },
110
+ altText: { type: 'string', description: 'Alternative text for the file' },
111
+ width: { type: 'integer', description: 'Width of the media' },
112
+ height: { type: 'integer', description: 'Height of the media' },
113
+ },
114
+ });
115
+ }
116
+ // MultiLangStoredFile schema - Map<String, StoredFile>
117
+ if (!schemas.has('MultiLangStoredFile')) {
118
+ schemas.set('MultiLangStoredFile', {
119
+ type: 'object',
120
+ description: 'Multi-language stored file (Map<String, StoredFile>)',
121
+ additionalProperties: { $ref: '#/components/schemas/StoredFile' },
122
+ });
123
+ }
124
+ }
125
+ /**
126
+ * Generate schema for a Java class, including inherited fields from superclass
127
+ */
128
+ function generateSchemaForClass(javaClass, context) {
129
+ const properties = {};
130
+ const required = [];
131
+ const nestedTypes = [];
132
+ // Collect all fields including inherited ones
133
+ const allFields = collectAllFields(javaClass, context);
134
+ for (const field of allFields) {
135
+ const { propertySchema, isRequired, referencedType } = generatePropertySchema(field);
136
+ properties[field.name] = propertySchema;
137
+ if (isRequired) {
138
+ required.push(field.name);
139
+ }
140
+ if (referencedType) {
141
+ nestedTypes.push(referencedType);
142
+ }
143
+ }
144
+ const schema = {
145
+ type: 'object',
146
+ properties,
147
+ };
148
+ if (required.length > 0) {
149
+ schema.required = required;
150
+ }
151
+ return { schema, nestedTypes };
152
+ }
153
+ /**
154
+ * Collect all fields from a class and its superclasses
155
+ */
156
+ function collectAllFields(javaClass, context) {
157
+ const fields = [];
158
+ const visitedClasses = new Set();
159
+ let currentClass = javaClass;
160
+ while (currentClass && !visitedClasses.has(currentClass.name)) {
161
+ visitedClasses.add(currentClass.name);
162
+ // Add fields from current class (prepend to maintain inheritance order: parent fields first)
163
+ fields.unshift(...currentClass.fields);
164
+ // Move to superclass
165
+ if (currentClass.superClass) {
166
+ currentClass = context.javaClasses.get(currentClass.superClass);
167
+ }
168
+ else {
169
+ break;
170
+ }
171
+ }
172
+ return fields;
173
+ }
174
+ /**
175
+ * Generate schema for a field
176
+ */
177
+ function generatePropertySchema(field) {
178
+ let isRequired = false;
179
+ let referencedType;
180
+ // Check for validation annotations
181
+ const constraints = extractValidationConstraints(field.annotations);
182
+ isRequired = constraints.required;
183
+ // Generate base schema based on type
184
+ let propertySchema;
185
+ if (astAnalyzer_1.ASTAnalyzer.isPrimitiveOrWrapper(field.type)) {
186
+ propertySchema = astAnalyzer_1.ASTAnalyzer.javaTypeToOpenAPI(field.type);
187
+ }
188
+ else if (field.type.endsWith('[]')) {
189
+ const elementType = field.type.slice(0, -2);
190
+ if (astAnalyzer_1.ASTAnalyzer.isPrimitiveOrWrapper(elementType)) {
191
+ propertySchema = {
192
+ type: 'array',
193
+ items: astAnalyzer_1.ASTAnalyzer.javaTypeToOpenAPI(elementType),
194
+ };
195
+ }
196
+ else {
197
+ referencedType = elementType;
198
+ propertySchema = {
199
+ type: 'array',
200
+ items: { $ref: `#/components/schemas/${elementType}` },
201
+ };
202
+ }
203
+ }
204
+ else if (astAnalyzer_1.ASTAnalyzer.isCollectionType(field.type)) {
205
+ const itemType = field.genericType ? extractMainType(field.genericType) : 'Object';
206
+ if (astAnalyzer_1.ASTAnalyzer.isPrimitiveOrWrapper(itemType)) {
207
+ propertySchema = {
208
+ type: 'array',
209
+ items: astAnalyzer_1.ASTAnalyzer.javaTypeToOpenAPI(itemType),
210
+ };
211
+ }
212
+ else {
213
+ referencedType = itemType;
214
+ propertySchema = {
215
+ type: 'array',
216
+ items: { $ref: `#/components/schemas/${itemType}` },
217
+ };
218
+ }
219
+ }
220
+ else if (astAnalyzer_1.ASTAnalyzer.isMapType(field.type)) {
221
+ propertySchema = {
222
+ type: 'object',
223
+ additionalProperties: true,
224
+ };
225
+ }
226
+ else if (isEnumType(field)) {
227
+ propertySchema = {
228
+ type: 'string',
229
+ enum: constraints.enumValues,
230
+ };
231
+ }
232
+ else {
233
+ // Reference type
234
+ referencedType = field.type.split('.').pop() || field.type;
235
+ propertySchema = { $ref: `#/components/schemas/${referencedType}` };
236
+ }
237
+ // Apply constraints to schema
238
+ if (constraints.minLength !== undefined && propertySchema.type === 'string') {
239
+ propertySchema.minLength = constraints.minLength;
240
+ }
241
+ if (constraints.maxLength !== undefined && propertySchema.type === 'string') {
242
+ propertySchema.maxLength = constraints.maxLength;
243
+ }
244
+ if (constraints.minimum !== undefined && (propertySchema.type === 'integer' || propertySchema.type === 'number')) {
245
+ propertySchema.minimum = constraints.minimum;
246
+ }
247
+ if (constraints.maximum !== undefined && (propertySchema.type === 'integer' || propertySchema.type === 'number')) {
248
+ propertySchema.maximum = constraints.maximum;
249
+ }
250
+ if (constraints.pattern) {
251
+ propertySchema.pattern = constraints.pattern;
252
+ }
253
+ // Apply description: annotation description takes priority, then javadoc
254
+ if (constraints.description) {
255
+ propertySchema.description = constraints.description;
256
+ }
257
+ else if (field.javadoc) {
258
+ propertySchema.description = field.javadoc;
259
+ }
260
+ return { propertySchema, isRequired, referencedType };
261
+ }
262
+ /**
263
+ * Extract validation constraints from field annotations
264
+ */
265
+ function extractValidationConstraints(annotations) {
266
+ const constraints = { required: false };
267
+ for (const annotation of annotations) {
268
+ switch (annotation.name) {
269
+ case 'NotNull':
270
+ case 'NotEmpty':
271
+ case 'NotBlank':
272
+ constraints.required = true;
273
+ break;
274
+ case 'Size':
275
+ if (annotation.values['min']) {
276
+ constraints.minLength = parseInt(String(annotation.values['min']), 10);
277
+ }
278
+ if (annotation.values['max']) {
279
+ constraints.maxLength = parseInt(String(annotation.values['max']), 10);
280
+ }
281
+ break;
282
+ case 'Min':
283
+ if (annotation.values['value']) {
284
+ constraints.minimum = parseInt(String(annotation.values['value']), 10);
285
+ }
286
+ break;
287
+ case 'Max':
288
+ if (annotation.values['value']) {
289
+ constraints.maximum = parseInt(String(annotation.values['value']), 10);
290
+ }
291
+ break;
292
+ case 'Pattern':
293
+ if (annotation.values['regexp']) {
294
+ constraints.pattern = String(annotation.values['regexp']);
295
+ }
296
+ break;
297
+ case 'Email':
298
+ constraints.pattern = '^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$';
299
+ break;
300
+ case 'Length':
301
+ if (annotation.values['min']) {
302
+ constraints.minLength = parseInt(String(annotation.values['min']), 10);
303
+ }
304
+ if (annotation.values['max']) {
305
+ constraints.maxLength = parseInt(String(annotation.values['max']), 10);
306
+ }
307
+ break;
308
+ case 'Range':
309
+ if (annotation.values['min']) {
310
+ constraints.minimum = parseInt(String(annotation.values['min']), 10);
311
+ }
312
+ if (annotation.values['max']) {
313
+ constraints.maximum = parseInt(String(annotation.values['max']), 10);
314
+ }
315
+ break;
316
+ case 'ApiModelProperty':
317
+ case 'Schema':
318
+ if (annotation.values['description']) {
319
+ constraints.description = String(annotation.values['description']);
320
+ }
321
+ if (annotation.values['required'] === 'true' || annotation.values['required'] === true) {
322
+ constraints.required = true;
323
+ }
324
+ break;
325
+ }
326
+ }
327
+ return constraints;
328
+ }
329
+ /**
330
+ * Check if field is an enum type
331
+ */
332
+ function isEnumType(field) {
333
+ // This is a simplified check - in practice, you'd need to analyze the type
334
+ const enumAnnotations = field.annotations.filter((a) => a.name === 'Enumerated' || (a.name === 'Schema' && a.values['allowableValues']));
335
+ return enumAnnotations.length > 0;
336
+ }
337
+ /**
338
+ * Extract main type from generic type string
339
+ */
340
+ function extractMainType(genericType) {
341
+ const match = genericType.match(/^([^<]+)/);
342
+ if (match) {
343
+ return match[1].trim();
344
+ }
345
+ return genericType;
346
+ }
347
+ //# sourceMappingURL=schemaGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaGenerator.js","sourceRoot":"","sources":["../../src/analyzer/schemaGenerator.ts"],"names":[],"mappings":";;AAYA,0CA6DC;AAlED,uDAAoD;AAEpD;;GAEG;AACH,SAAgB,eAAe,CAAC,OAA0B;IACxD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAqB,OAAO,CAAC,UAAU,CAAC,CAAC;IAEhE,qDAAqD;IACrD,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAE5B,+BAA+B;IAC/B,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,MAAM,cAAc,GAAG,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAEpD,OAAO,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,EAAG,CAAC;QAEvC,IAAI,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,SAAS;QACX,CAAC;QAED,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE7B,uBAAuB;QACvB,IAAI,yBAAW,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/C,SAAS;QACX,CAAC;QAED,6BAA6B;QAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,oCAAoC;QACpC,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEpD,IAAI,SAAS,EAAE,CAAC;YACd,oBAAoB;YACpB,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE;oBACpB,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,SAAS,CAAC,UAAU;oBAC1B,WAAW,EAAE,SAAS,CAAC,OAAO;iBAC/B,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,sBAAsB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAC3E,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAE9B,8BAA8B;gBAC9B,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;oBACrC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;wBACpC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,iDAAiD;YACjD,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE;gBACpB,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,cAAc,QAAQ,EAAE;aACtC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,OAAgC;IAC1D,gBAAgB;IAChB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE;YACpB,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,mBAAmB;SACjC,CAAC,CAAC;IACL,CAAC;IAED,cAAc;IACd,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE;YAClB,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,iBAAiB;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,qCAAqC;IACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE;YACzB,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,gDAAgD;YAC7D,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,mBAAmB,EAAE;gBAC7D,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,kBAAkB,EAAE;gBAC3D,MAAM,EAAE,EAAE,IAAI,EAAE,6BAA6B,EAAE;gBAC/C,IAAI,EAAE,EAAE,IAAI,EAAE,2BAA2B,EAAE;aAC5C;SACF,CAAC,CAAC;IACL,CAAC;IAED,+CAA+C;IAC/C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE;YAC7B,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,6CAA6C;YAC1D,oBAAoB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SACzC,CAAC,CAAC;IACL,CAAC;IAED,oBAAoB;IACpB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE;YACxB,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,yBAAyB;YACtC,UAAU,EAAE;gBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE;gBACpD,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE;gBAC1G,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE;gBAC9D,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;gBAC/D,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+BAA+B,EAAE;gBACzE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,oBAAoB,EAAE;gBAC7D,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,qBAAqB,EAAE;aAChE;SACF,CAAC,CAAC;IACL,CAAC;IAED,uDAAuD;IACvD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE;YACjC,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,sDAAsD;YACnE,oBAAoB,EAAE,EAAE,IAAI,EAAE,iCAAiC,EAAE;SAClE,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAC7B,SAAoB,EACpB,OAA0B;IAE1B,MAAM,UAAU,GAA+B,EAAE,CAAC;IAClD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,8CAA8C;IAC9C,MAAM,SAAS,GAAG,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAEvD,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAErF,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC;QAExC,IAAI,UAAU,EAAE,CAAC;YACf,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YACnB,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAe;QACzB,IAAI,EAAE,QAAQ;QACd,UAAU;KACX,CAAC;IAEF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,SAAoB,EAAE,OAA0B;IACxE,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,IAAI,YAAY,GAA0B,SAAS,CAAC;IAEpD,OAAO,YAAY,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9D,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAEtC,6FAA6F;QAC7F,MAAM,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAEvC,qBAAqB;QACrB,IAAI,YAAY,CAAC,UAAU,EAAE,CAAC;YAC5B,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,KAAgB;IAK9C,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,cAAkC,CAAC;IAEvC,mCAAmC;IACnC,MAAM,WAAW,GAAG,4BAA4B,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACpE,UAAU,GAAG,WAAW,CAAC,QAAQ,CAAC;IAElC,qCAAqC;IACrC,IAAI,cAA0B,CAAC;IAE/B,IAAI,yBAAW,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,cAAc,GAAG,yBAAW,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,yBAAW,CAAC,oBAAoB,CAAC,WAAW,CAAC,EAAE,CAAC;YAClD,cAAc,GAAG;gBACf,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,yBAAW,CAAC,iBAAiB,CAAC,WAAW,CAAC;aAClD,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,WAAW,CAAC;YAC7B,cAAc,GAAG;gBACf,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,wBAAwB,WAAW,EAAE,EAAE;aACvD,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,yBAAW,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACnF,IAAI,yBAAW,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/C,cAAc,GAAG;gBACf,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,yBAAW,CAAC,iBAAiB,CAAC,QAAQ,CAAC;aAC/C,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,QAAQ,CAAC;YAC1B,cAAc,GAAG;gBACf,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,wBAAwB,QAAQ,EAAE,EAAE;aACpD,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,yBAAW,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,cAAc,GAAG;YACf,IAAI,EAAE,QAAQ;YACd,oBAAoB,EAAE,IAAI;SAC3B,CAAC;IACJ,CAAC;SAAM,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,cAAc,GAAG;YACf,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,WAAW,CAAC,UAAU;SAC7B,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,iBAAiB;QACjB,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC;QAC3D,cAAc,GAAG,EAAE,IAAI,EAAE,wBAAwB,cAAc,EAAE,EAAE,CAAC;IACtE,CAAC;IAED,8BAA8B;IAC9B,IAAI,WAAW,CAAC,SAAS,KAAK,SAAS,IAAI,cAAc,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5E,cAAc,CAAC,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;IACnD,CAAC;IACD,IAAI,WAAW,CAAC,SAAS,KAAK,SAAS,IAAI,cAAc,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5E,cAAc,CAAC,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;IACnD,CAAC;IACD,IAAI,WAAW,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,cAAc,CAAC,IAAI,KAAK,SAAS,IAAI,cAAc,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;QACjH,cAAc,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;IAC/C,CAAC;IACD,IAAI,WAAW,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,cAAc,CAAC,IAAI,KAAK,SAAS,IAAI,cAAc,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;QACjH,cAAc,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;IAC/C,CAAC;IACD,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QACxB,cAAc,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;IAC/C,CAAC;IAED,yEAAyE;IACzE,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC;QAC5B,cAAc,CAAC,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC;IACvD,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACzB,cAAc,CAAC,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC;IAC7C,CAAC;IAED,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;AACxD,CAAC;AAaD;;GAEG;AACH,SAAS,4BAA4B,CAAC,WAA6B;IACjE,MAAM,WAAW,GAA0B,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAE/D,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;YACxB,KAAK,SAAS,CAAC;YACf,KAAK,UAAU,CAAC;YAChB,KAAK,UAAU;gBACb,WAAW,CAAC,QAAQ,GAAG,IAAI,CAAC;gBAC5B,MAAM;YAER,KAAK,MAAM;gBACT,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC7B,WAAW,CAAC,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzE,CAAC;gBACD,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC7B,WAAW,CAAC,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzE,CAAC;gBACD,MAAM;YAER,KAAK,KAAK;gBACR,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC/B,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzE,CAAC;gBACD,MAAM;YAER,KAAK,KAAK;gBACR,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC/B,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzE,CAAC;gBACD,MAAM;YAER,KAAK,SAAS;gBACZ,IAAI,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAChC,WAAW,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC5D,CAAC;gBACD,MAAM;YAER,KAAK,OAAO;gBACV,WAAW,CAAC,OAAO,GAAG,uCAAuC,CAAC;gBAC9D,MAAM;YAER,KAAK,QAAQ;gBACX,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC7B,WAAW,CAAC,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzE,CAAC;gBACD,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC7B,WAAW,CAAC,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzE,CAAC;gBACD,MAAM;YAER,KAAK,OAAO;gBACV,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC7B,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACvE,CAAC;gBACD,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC7B,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACvE,CAAC;gBACD,MAAM;YAER,KAAK,kBAAkB,CAAC;YACxB,KAAK,QAAQ;gBACX,IAAI,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;oBACrC,WAAW,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;gBACrE,CAAC;gBACD,IAAI,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC;oBACvF,WAAW,CAAC,QAAQ,GAAG,IAAI,CAAC;gBAC9B,CAAC;gBACD,MAAM;QACV,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,KAAgB;IAClC,2EAA2E;IAC3E,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,CAC9C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CACvF,CAAC;IACF,OAAO,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,WAAmB;IAC1C,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { JavaMethod, SecurityInfo } from '../types';
2
+ /**
3
+ * Analyze method security annotations and extract roles/authorities
4
+ */
5
+ export declare function analyzeMethodSecurity(method: JavaMethod): SecurityInfo;
6
+ //# sourceMappingURL=securityAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"securityAnalyzer.d.ts","sourceRoot":"","sources":["../../src/analyzer/securityAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAkB,YAAY,EAAE,MAAM,UAAU,CAAC;AAGpE;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,CA6BtE"}
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.analyzeMethodSecurity = analyzeMethodSecurity;
4
+ const astAnalyzer_1 = require("../parser/astAnalyzer");
5
+ /**
6
+ * Analyze method security annotations and extract roles/authorities
7
+ */
8
+ function analyzeMethodSecurity(method) {
9
+ const securityInfo = {
10
+ roles: [],
11
+ authorities: [],
12
+ hasComplexExpression: false,
13
+ };
14
+ const securityAnnotations = astAnalyzer_1.ASTAnalyzer.getSecurityAnnotations(method);
15
+ for (const annotation of securityAnnotations) {
16
+ switch (annotation.name) {
17
+ case 'PreAuthorize':
18
+ case 'PostAuthorize':
19
+ analyzeSpELExpression(annotation, securityInfo);
20
+ break;
21
+ case 'Secured':
22
+ analyzeSecuredAnnotation(annotation, securityInfo);
23
+ break;
24
+ case 'RolesAllowed':
25
+ analyzeRolesAllowedAnnotation(annotation, securityInfo);
26
+ break;
27
+ }
28
+ }
29
+ // Remove duplicates
30
+ securityInfo.roles = [...new Set(securityInfo.roles)];
31
+ securityInfo.authorities = [...new Set(securityInfo.authorities)];
32
+ return securityInfo;
33
+ }
34
+ /**
35
+ * Analyze @PreAuthorize / @PostAuthorize SpEL expression
36
+ */
37
+ function analyzeSpELExpression(annotation, securityInfo) {
38
+ const expression = getAnnotationValue(annotation);
39
+ if (!expression)
40
+ return;
41
+ // Extract hasRole() calls
42
+ const hasRoleMatches = expression.matchAll(/hasRole\s*\(\s*'([^']+)'\s*\)/g);
43
+ for (const match of hasRoleMatches) {
44
+ const role = normalizeRole(match[1]);
45
+ securityInfo.roles.push(role);
46
+ }
47
+ // Extract hasAnyRole() calls
48
+ const hasAnyRoleMatches = expression.matchAll(/hasAnyRole\s*\(\s*([^)]+)\s*\)/g);
49
+ for (const match of hasAnyRoleMatches) {
50
+ const rolesString = match[1];
51
+ const roles = extractRolesFromString(rolesString);
52
+ securityInfo.roles.push(...roles.map(normalizeRole));
53
+ }
54
+ // Extract hasAuthority() calls
55
+ const hasAuthorityMatches = expression.matchAll(/hasAuthority\s*\(\s*'([^']+)'\s*\)/g);
56
+ for (const match of hasAuthorityMatches) {
57
+ securityInfo.authorities.push(match[1]);
58
+ }
59
+ // Extract hasAnyAuthority() calls
60
+ const hasAnyAuthorityMatches = expression.matchAll(/hasAnyAuthority\s*\(\s*([^)]+)\s*\)/g);
61
+ for (const match of hasAnyAuthorityMatches) {
62
+ const authoritiesString = match[1];
63
+ const authorities = extractRolesFromString(authoritiesString);
64
+ securityInfo.authorities.push(...authorities);
65
+ }
66
+ // Check if the expression is complex (has more than just role/authority checks)
67
+ const isComplex = isComplexSpELExpression(expression);
68
+ if (isComplex) {
69
+ securityInfo.hasComplexExpression = true;
70
+ securityInfo.securityExpression = expression;
71
+ }
72
+ }
73
+ /**
74
+ * Analyze @Secured annotation
75
+ */
76
+ function analyzeSecuredAnnotation(annotation, securityInfo) {
77
+ const value = annotation.values['value'];
78
+ if (!value)
79
+ return;
80
+ const roles = Array.isArray(value) ? value : [value];
81
+ for (const role of roles) {
82
+ if (typeof role === 'string') {
83
+ securityInfo.roles.push(normalizeRole(role));
84
+ }
85
+ }
86
+ }
87
+ /**
88
+ * Analyze @RolesAllowed annotation
89
+ */
90
+ function analyzeRolesAllowedAnnotation(annotation, securityInfo) {
91
+ const value = annotation.values['value'];
92
+ if (!value)
93
+ return;
94
+ const roles = Array.isArray(value) ? value : [value];
95
+ for (const role of roles) {
96
+ if (typeof role === 'string') {
97
+ securityInfo.roles.push(normalizeRole(role));
98
+ }
99
+ }
100
+ }
101
+ /**
102
+ * Get annotation value
103
+ */
104
+ function getAnnotationValue(annotation) {
105
+ const value = annotation.values['value'];
106
+ if (value === undefined)
107
+ return undefined;
108
+ if (Array.isArray(value)) {
109
+ return value[0];
110
+ }
111
+ return typeof value === 'string' ? value : String(value);
112
+ }
113
+ /**
114
+ * Normalize role name to include ROLE_ prefix if not present
115
+ */
116
+ function normalizeRole(role) {
117
+ const trimmedRole = role.trim().replace(/^['"]|['"]$/g, '');
118
+ if (trimmedRole.startsWith('ROLE_')) {
119
+ return trimmedRole;
120
+ }
121
+ return `ROLE_${trimmedRole}`;
122
+ }
123
+ /**
124
+ * Extract roles from a comma-separated string with quotes
125
+ * e.g., "'USER', 'ADMIN'" -> ["USER", "ADMIN"]
126
+ */
127
+ function extractRolesFromString(rolesString) {
128
+ const roles = [];
129
+ const matches = rolesString.matchAll(/'([^']+)'/g);
130
+ for (const match of matches) {
131
+ roles.push(match[1]);
132
+ }
133
+ return roles;
134
+ }
135
+ /**
136
+ * Check if a SpEL expression is complex
137
+ * (contains more than just hasRole/hasAnyRole/hasAuthority/hasAnyAuthority)
138
+ */
139
+ function isComplexSpELExpression(expression) {
140
+ // Remove all simple role/authority checks
141
+ let simplified = expression
142
+ .replace(/hasRole\s*\(\s*'[^']+'\s*\)/g, '')
143
+ .replace(/hasAnyRole\s*\(\s*[^)]+\s*\)/g, '')
144
+ .replace(/hasAuthority\s*\(\s*'[^']+'\s*\)/g, '')
145
+ .replace(/hasAnyAuthority\s*\(\s*[^)]+\s*\)/g, '')
146
+ .replace(/\s+/g, ' ')
147
+ .trim();
148
+ // Remove boolean operators that might remain
149
+ simplified = simplified
150
+ .replace(/^\s*and\s*/gi, '')
151
+ .replace(/\s*and\s*$/gi, '')
152
+ .replace(/^\s*or\s*/gi, '')
153
+ .replace(/\s*or\s*$/gi, '')
154
+ .replace(/^\s*&&\s*/g, '')
155
+ .replace(/\s*&&\s*$/g, '')
156
+ .replace(/^\s*\|\|\s*/g, '')
157
+ .replace(/\s*\|\|\s*$/g, '')
158
+ .replace(/^\s*\(\s*\)\s*$/g, '')
159
+ .trim();
160
+ // If anything remains (other than parentheses and whitespace), it's complex
161
+ const hasOtherContent = simplified.replace(/[()]/g, '').trim().length > 0;
162
+ // Also check for specific complex patterns
163
+ const complexPatterns = [
164
+ /#\w+/, // Variable references like #user, #id
165
+ /\.\w+/, // Property access
166
+ /==|!=|<|>|<=|>=/, // Comparison operators
167
+ /isAuthenticated\(\)/, // Authentication checks
168
+ /isAnonymous\(\)/, // Anonymous checks
169
+ /permitAll\(\)/, // Permit all
170
+ /denyAll\(\)/, // Deny all
171
+ /authentication\./i, // Authentication object access
172
+ /principal\./i, // Principal object access
173
+ ];
174
+ const hasComplexPattern = complexPatterns.some((pattern) => pattern.test(expression));
175
+ return hasOtherContent || hasComplexPattern;
176
+ }
177
+ //# sourceMappingURL=securityAnalyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"securityAnalyzer.js","sourceRoot":"","sources":["../../src/analyzer/securityAnalyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { CLIOptions, OpenAPISpec, ControllerInfo, ProcessingContext } from '../types';
2
+ /**
3
+ * Generate OpenAPI YAML from analyzed controllers
4
+ */
5
+ export declare function generateOpenAPISpec(controllers: ControllerInfo[], context: ProcessingContext, options: CLIOptions): OpenAPISpec;
6
+ /**
7
+ * Generate OpenAPI spec for a single controller
8
+ */
9
+ export declare function generateOpenAPISpecForController(controller: ControllerInfo, context: ProcessingContext, options: CLIOptions): OpenAPISpec;
10
+ /**
11
+ * Write OpenAPI spec to YAML file
12
+ */
13
+ export declare function writeOpenAPISpec(spec: OpenAPISpec, outputPath: string): void;
14
+ //# sourceMappingURL=openapiGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapiGenerator.d.ts","sourceRoot":"","sources":["../../src/generator/openapiGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,UAAU,EACV,WAAW,EACX,cAAc,EAEd,iBAAiB,EAQlB,MAAM,UAAU,CAAC;AAGlB;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,cAAc,EAAE,EAC7B,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,UAAU,GAClB,WAAW,CA0Db;AA6LD;;GAEG;AACH,wBAAgB,gCAAgC,CAC9C,UAAU,EAAE,cAAc,EAC1B,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,UAAU,GAClB,WAAW,CAmFb;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAU5E"}