@slingr/cli 0.0.1

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 (144) hide show
  1. package/README.md +320 -0
  2. package/bin/dev.cmd +3 -0
  3. package/bin/dev.js +5 -0
  4. package/bin/run.cmd +3 -0
  5. package/bin/run.js +5 -0
  6. package/dist/commands/cli-build.d.ts +9 -0
  7. package/dist/commands/cli-build.d.ts.map +1 -0
  8. package/dist/commands/cli-build.js +36 -0
  9. package/dist/commands/cli-build.js.map +1 -0
  10. package/dist/commands/create-app.d.ts +20 -0
  11. package/dist/commands/create-app.d.ts.map +1 -0
  12. package/dist/commands/create-app.js +246 -0
  13. package/dist/commands/create-app.js.map +1 -0
  14. package/dist/commands/ds.d.ts +28 -0
  15. package/dist/commands/ds.d.ts.map +1 -0
  16. package/dist/commands/ds.js +529 -0
  17. package/dist/commands/ds.js.map +1 -0
  18. package/dist/commands/gql.d.ts +22 -0
  19. package/dist/commands/gql.d.ts.map +1 -0
  20. package/dist/commands/gql.js +340 -0
  21. package/dist/commands/gql.js.map +1 -0
  22. package/dist/commands/infra/down.d.ts +13 -0
  23. package/dist/commands/infra/down.d.ts.map +1 -0
  24. package/dist/commands/infra/down.js +80 -0
  25. package/dist/commands/infra/down.js.map +1 -0
  26. package/dist/commands/infra/up.d.ts +13 -0
  27. package/dist/commands/infra/up.d.ts.map +1 -0
  28. package/dist/commands/infra/up.js +69 -0
  29. package/dist/commands/infra/up.js.map +1 -0
  30. package/dist/commands/infra/update.d.ts +14 -0
  31. package/dist/commands/infra/update.d.ts.map +1 -0
  32. package/dist/commands/infra/update.js +321 -0
  33. package/dist/commands/infra/update.js.map +1 -0
  34. package/dist/commands/run.d.ts +19 -0
  35. package/dist/commands/run.d.ts.map +1 -0
  36. package/dist/commands/run.js +315 -0
  37. package/dist/commands/run.js.map +1 -0
  38. package/dist/commands/setup.d.ts +18 -0
  39. package/dist/commands/setup.d.ts.map +1 -0
  40. package/dist/commands/setup.js +189 -0
  41. package/dist/commands/setup.js.map +1 -0
  42. package/dist/index.d.ts +2 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +8 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/projectStructure.d.ts +10 -0
  47. package/dist/projectStructure.d.ts.map +1 -0
  48. package/dist/projectStructure.js +153 -0
  49. package/dist/projectStructure.js.map +1 -0
  50. package/dist/scripts/generate-schema.d.ts +10 -0
  51. package/dist/scripts/generate-schema.d.ts.map +1 -0
  52. package/dist/scripts/generate-schema.js +130 -0
  53. package/dist/scripts/generate-schema.js.map +1 -0
  54. package/dist/scripts/generate-schema.ts +143 -0
  55. package/dist/templates/.github/copilot-instructions.md.template +17 -0
  56. package/dist/templates/config/datasource.ts.template +9 -0
  57. package/dist/templates/config/jest.config.ts +30 -0
  58. package/dist/templates/config/jest.setup.ts +1 -0
  59. package/dist/templates/config/tsconfig.json.template +30 -0
  60. package/dist/templates/dataSources/mysql.ts.template +13 -0
  61. package/dist/templates/dataSources/postgres.ts.template +13 -0
  62. package/dist/templates/dataset-generator-script.ts.template +140 -0
  63. package/dist/templates/datasets/mysql-default/Address.jsonl.template +4 -0
  64. package/dist/templates/datasets/mysql-default/App.jsonl.template +5 -0
  65. package/dist/templates/datasets/mysql-default/Company.jsonl.template +4 -0
  66. package/dist/templates/datasets/mysql-default/Person.jsonl.template +3 -0
  67. package/dist/templates/datasets/postgres-default/Address.jsonl.template +4 -0
  68. package/dist/templates/datasets/postgres-default/App.jsonl.template +5 -0
  69. package/dist/templates/datasets/postgres-default/Company.jsonl.template +4 -0
  70. package/dist/templates/datasets/postgres-default/Person.jsonl.template +3 -0
  71. package/dist/templates/docs/app-description.md.template +34 -0
  72. package/dist/templates/gql/codegen.yml.template +25 -0
  73. package/dist/templates/gql/index.ts.template +24 -0
  74. package/dist/templates/gql/operations.graphql.template +30 -0
  75. package/dist/templates/package.json.template +38 -0
  76. package/dist/templates/prompt-analysis.md.template +111 -0
  77. package/dist/templates/prompt-script-generation.md.template +259 -0
  78. package/dist/templates/src/Address.ts.template +31 -0
  79. package/dist/templates/src/App.ts.template +61 -0
  80. package/dist/templates/src/Company.ts.template +48 -0
  81. package/dist/templates/src/Models.test.ts.template +655 -0
  82. package/dist/templates/src/Person.test.ts.template +289 -0
  83. package/dist/templates/src/Person.ts.template +105 -0
  84. package/dist/templates/src/actions/index.ts.template +12 -0
  85. package/dist/templates/src/index.ts +66 -0
  86. package/dist/templates/src/types/gql.d.ts.template +18 -0
  87. package/dist/templates/vscode/extensions.json +3 -0
  88. package/dist/templates/vscode/settings.json +11 -0
  89. package/dist/utils/datasourceParser.d.ts +12 -0
  90. package/dist/utils/datasourceParser.d.ts.map +1 -0
  91. package/dist/utils/datasourceParser.js +91 -0
  92. package/dist/utils/datasourceParser.js.map +1 -0
  93. package/dist/utils/jsonlLoader.d.ts +140 -0
  94. package/dist/utils/jsonlLoader.d.ts.map +1 -0
  95. package/dist/utils/jsonlLoader.js +583 -0
  96. package/dist/utils/jsonlLoader.js.map +1 -0
  97. package/dist/utils/model-analyzer.d.ts +86 -0
  98. package/dist/utils/model-analyzer.d.ts.map +1 -0
  99. package/dist/utils/model-analyzer.js +458 -0
  100. package/dist/utils/model-analyzer.js.map +1 -0
  101. package/dist/utils/portChecker.d.ts +36 -0
  102. package/dist/utils/portChecker.d.ts.map +1 -0
  103. package/dist/utils/portChecker.js +308 -0
  104. package/dist/utils/portChecker.js.map +1 -0
  105. package/dist/utils/synthetic-data-generator.d.ts +74 -0
  106. package/dist/utils/synthetic-data-generator.d.ts.map +1 -0
  107. package/dist/utils/synthetic-data-generator.js +443 -0
  108. package/dist/utils/synthetic-data-generator.js.map +1 -0
  109. package/oclif.manifest.json +435 -0
  110. package/package.json +118 -0
  111. package/src/templates/.github/copilot-instructions.md.template +17 -0
  112. package/src/templates/config/datasource.ts.template +9 -0
  113. package/src/templates/config/jest.config.ts +30 -0
  114. package/src/templates/config/jest.setup.ts +1 -0
  115. package/src/templates/config/tsconfig.json.template +30 -0
  116. package/src/templates/dataSources/mysql.ts.template +13 -0
  117. package/src/templates/dataSources/postgres.ts.template +13 -0
  118. package/src/templates/dataset-generator-script.ts.template +140 -0
  119. package/src/templates/datasets/mysql-default/Address.jsonl.template +4 -0
  120. package/src/templates/datasets/mysql-default/App.jsonl.template +5 -0
  121. package/src/templates/datasets/mysql-default/Company.jsonl.template +4 -0
  122. package/src/templates/datasets/mysql-default/Person.jsonl.template +3 -0
  123. package/src/templates/datasets/postgres-default/Address.jsonl.template +4 -0
  124. package/src/templates/datasets/postgres-default/App.jsonl.template +5 -0
  125. package/src/templates/datasets/postgres-default/Company.jsonl.template +4 -0
  126. package/src/templates/datasets/postgres-default/Person.jsonl.template +3 -0
  127. package/src/templates/docs/app-description.md.template +34 -0
  128. package/src/templates/gql/codegen.yml.template +25 -0
  129. package/src/templates/gql/index.ts.template +24 -0
  130. package/src/templates/gql/operations.graphql.template +30 -0
  131. package/src/templates/package.json.template +38 -0
  132. package/src/templates/prompt-analysis.md.template +111 -0
  133. package/src/templates/prompt-script-generation.md.template +259 -0
  134. package/src/templates/src/Address.ts.template +31 -0
  135. package/src/templates/src/App.ts.template +61 -0
  136. package/src/templates/src/Company.ts.template +48 -0
  137. package/src/templates/src/Models.test.ts.template +655 -0
  138. package/src/templates/src/Person.test.ts.template +289 -0
  139. package/src/templates/src/Person.ts.template +105 -0
  140. package/src/templates/src/actions/index.ts.template +12 -0
  141. package/src/templates/src/index.ts +66 -0
  142. package/src/templates/src/types/gql.d.ts.template +18 -0
  143. package/src/templates/vscode/extensions.json +3 -0
  144. package/src/templates/vscode/settings.json +11 -0
@@ -0,0 +1,86 @@
1
+ export interface FieldMetadata {
2
+ name: string;
3
+ type: string;
4
+ required: boolean | string;
5
+ primaryKey?: boolean;
6
+ generated?: boolean;
7
+ validation?: string;
8
+ available?: boolean | string;
9
+ minLength?: number;
10
+ maxLength?: number;
11
+ regex?: string;
12
+ regexMessage?: string;
13
+ min?: number;
14
+ max?: number;
15
+ precision?: number;
16
+ scale?: number;
17
+ isRelationship?: boolean;
18
+ relationshipType?: string;
19
+ relatedModel?: string;
20
+ }
21
+ export interface ModelMetadata {
22
+ name: string;
23
+ filePath: string;
24
+ dataSource: string;
25
+ fields: FieldMetadata[];
26
+ relationships: RelationshipMetadata[];
27
+ docs?: string;
28
+ }
29
+ export interface RelationshipMetadata {
30
+ fieldName: string;
31
+ type: 'OneToOne' | 'OneToMany' | 'ManyToOne' | 'ManyToMany';
32
+ targetModel: string;
33
+ cascade?: boolean;
34
+ eager?: boolean;
35
+ }
36
+ export declare class ModelAnalyzer {
37
+ /**
38
+ * Analyze all models in the src directory and extract metadata
39
+ */
40
+ analyzeModels(srcPath: string): Promise<ModelMetadata[]>;
41
+ /**
42
+ * Analyze models using runtime metadata (preferred method)
43
+ */
44
+ analyzeModelsFromRuntime(srcPath: string): Promise<ModelMetadata[]>;
45
+ /**
46
+ * Extract metadata from a compiled model class using runtime reflection
47
+ */
48
+ private extractRuntimeMetadata;
49
+ /**
50
+ * Extract field metadata using runtime reflection
51
+ */
52
+ private extractRuntimeFields;
53
+ /**
54
+ * Analyze models using static source analysis (fallback method)
55
+ */
56
+ analyzeModelsFromSource(srcPath: string): Promise<ModelMetadata[]>;
57
+ /**
58
+ * Analyze a single TypeScript model file and extract metadata
59
+ */
60
+ analyzeModel(filePath: string): Promise<ModelMetadata | null>;
61
+ /**
62
+ * Extract field metadata from the model content
63
+ */
64
+ private extractFields;
65
+ /**
66
+ * Extract relationship metadata (for future use)
67
+ */
68
+ private extractRelationships;
69
+ /**
70
+ * Parse @Field decorator options
71
+ */
72
+ private parseFieldOptions;
73
+ /**
74
+ * Parse type decorator options (Text, Integer, etc.)
75
+ */
76
+ private parseTypeDecoratorOptions;
77
+ /**
78
+ * Map TypeScript types to field types
79
+ */
80
+ private mapTypeScriptTypeToFieldType;
81
+ /**
82
+ * Extract model name from TypeScript type
83
+ */
84
+ private extractModelNameFromType;
85
+ }
86
+ //# sourceMappingURL=model-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-analyzer.d.ts","sourceRoot":"","sources":["../../src/utils/model-analyzer.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,aAAa,EAAE,oBAAoB,EAAE,CAAC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,YAAY,CAAC;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,aAAa;IACxB;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAW9D;;OAEG;IACG,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IA8CzE;;OAEG;YACW,sBAAsB;IA8CpC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAsE5B;;OAEG;IACG,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAuBxE;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAqDnE;;OAEG;IACH,OAAO,CAAC,aAAa;IA0ErB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAsB5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAsCzB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IA2DjC;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAmBpC;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAOjC"}
@@ -0,0 +1,458 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ModelAnalyzer = void 0;
7
+ const fs_extra_1 = __importDefault(require("fs-extra"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const node_url_1 = require("node:url");
10
+ const glob_1 = require("glob");
11
+ class ModelAnalyzer {
12
+ /**
13
+ * Analyze all models in the src directory and extract metadata
14
+ */
15
+ async analyzeModels(srcPath) {
16
+ // Try runtime analysis first (more accurate)
17
+ try {
18
+ return await this.analyzeModelsFromRuntime(srcPath);
19
+ }
20
+ catch (error) {
21
+ console.warn('Runtime analysis failed, falling back to static analysis:', error.message);
22
+ // Fallback to static analysis
23
+ return await this.analyzeModelsFromSource(srcPath);
24
+ }
25
+ }
26
+ /**
27
+ * Analyze models using runtime metadata (preferred method)
28
+ */
29
+ async analyzeModelsFromRuntime(srcPath) {
30
+ const models = [];
31
+ const distPath = node_path_1.default.join(process.cwd(), 'dist');
32
+ // Look for compiled model files
33
+ const modelFiles = await (0, glob_1.glob)('**/*.js', {
34
+ cwd: node_path_1.default.join(distPath, 'data'),
35
+ absolute: true,
36
+ ignore: ['**/*.test.js', '**/Models.test.js'],
37
+ });
38
+ for (const filePath of modelFiles) {
39
+ try {
40
+ // Import the compiled module
41
+ // Convert to file:// URL for Windows compatibility
42
+ const fileUrl = (0, node_url_1.pathToFileURL)(filePath).href;
43
+ const module = await import(fileUrl);
44
+ // Find the model class (should extend BaseModel)
45
+ for (const exportName of Object.keys(module)) {
46
+ const ExportedClass = module[exportName];
47
+ if (typeof ExportedClass === 'function' && ExportedClass.prototype) {
48
+ // Check if it's a model class by creating an instance
49
+ try {
50
+ const instance = new ExportedClass();
51
+ if (instance && typeof instance.validate === 'function') {
52
+ const metadata = await this.extractRuntimeMetadata(ExportedClass, filePath);
53
+ if (metadata) {
54
+ models.push(metadata);
55
+ }
56
+ }
57
+ }
58
+ catch (e) {
59
+ // Skip if can't instantiate
60
+ continue;
61
+ }
62
+ }
63
+ }
64
+ }
65
+ catch (error) {
66
+ console.warn(`Warning: Could not analyze compiled model ${filePath}: ${error.message}`);
67
+ }
68
+ }
69
+ return models;
70
+ }
71
+ /**
72
+ * Extract metadata from a compiled model class using runtime reflection
73
+ */
74
+ async extractRuntimeMetadata(ModelClass, filePath) {
75
+ try {
76
+ const instance = new ModelClass();
77
+ const modelName = ModelClass.name;
78
+ // Get dataSource from class metadata
79
+ const dataSourceObj = Reflect.getMetadata?.('model:dataSource', ModelClass);
80
+ let dataSource = '';
81
+ if (dataSourceObj) {
82
+ if (typeof dataSourceObj === 'string') {
83
+ dataSource = dataSourceObj;
84
+ }
85
+ else if (dataSourceObj.name) {
86
+ dataSource = dataSourceObj.name;
87
+ }
88
+ else if (dataSourceObj.constructor?.name) {
89
+ dataSource = dataSourceObj.constructor.name;
90
+ }
91
+ else {
92
+ // Try to extract datasource name from object
93
+ dataSource = dataSourceObj.toString();
94
+ }
95
+ }
96
+ const docs = Reflect.getMetadata?.('model:docs', ModelClass);
97
+ // Extract fields using runtime metadata
98
+ const fields = this.extractRuntimeFields(instance);
99
+ const metadata = {
100
+ name: modelName,
101
+ filePath,
102
+ dataSource,
103
+ fields,
104
+ relationships: [], // TODO: extract relationships from runtime
105
+ };
106
+ if (docs) {
107
+ metadata.docs = docs;
108
+ }
109
+ return metadata;
110
+ }
111
+ catch (error) {
112
+ console.warn(`Failed to extract runtime metadata for ${ModelClass.name}:`, error.message);
113
+ return null;
114
+ }
115
+ }
116
+ /**
117
+ * Extract field metadata using runtime reflection
118
+ */
119
+ extractRuntimeFields(instance) {
120
+ const fields = [];
121
+ // Get all property descriptors from the prototype and instance
122
+ const proto = Object.getPrototypeOf(instance);
123
+ const propertyNames = Object.getOwnPropertyNames(proto).concat(Object.getOwnPropertyNames(instance));
124
+ for (const propertyName of propertyNames) {
125
+ if (propertyName === 'constructor') {
126
+ continue;
127
+ }
128
+ try {
129
+ // Get field metadata
130
+ const fieldType = Reflect.getMetadata?.('field:type', instance, propertyName);
131
+ const relationshipType = Reflect.getMetadata?.('field:relationship:type', instance, propertyName);
132
+ const designType = Reflect.getMetadata?.('design:type', instance, propertyName);
133
+ const required = Reflect.getMetadata?.('field:required', instance, propertyName);
134
+ const primaryKey = Reflect.getMetadata?.('field:primaryKey', instance, propertyName);
135
+ const generated = Reflect.getMetadata?.('field:generated', instance, propertyName);
136
+ const available = Reflect.getMetadata?.('field:available', instance, propertyName);
137
+ const validation = Reflect.getMetadata?.('field:validation', instance, propertyName);
138
+ const typeOptions = Reflect.getMetadata?.('field:type:options', instance, propertyName);
139
+ // Only include properties that have field metadata
140
+ if (fieldType || relationshipType) {
141
+ const field = {
142
+ name: propertyName,
143
+ type: fieldType || 'unknown',
144
+ required: required !== undefined ? required : false,
145
+ primaryKey: primaryKey || false,
146
+ generated: generated || false,
147
+ available: available !== undefined ? available : true,
148
+ };
149
+ // Add relationship metadata
150
+ if (relationshipType) {
151
+ field.isRelationship = true;
152
+ field.relationshipType = relationshipType;
153
+ field.relatedModel = designType?.name || 'unknown';
154
+ }
155
+ // Add validation metadata
156
+ if (validation) {
157
+ field.validation = validation.toString();
158
+ }
159
+ // Add type options (constraints)
160
+ if (typeOptions) {
161
+ field.minLength = typeOptions.minLength;
162
+ field.maxLength = typeOptions.maxLength;
163
+ field.min = typeOptions.min;
164
+ field.max = typeOptions.max;
165
+ field.precision = typeOptions.precision;
166
+ field.scale = typeOptions.scale;
167
+ field.regex = typeOptions.regex?.toString();
168
+ field.regexMessage = typeOptions.regexMessage;
169
+ }
170
+ fields.push(field);
171
+ }
172
+ }
173
+ catch (error) {
174
+ // Skip properties that cause errors
175
+ continue;
176
+ }
177
+ }
178
+ return fields;
179
+ }
180
+ /**
181
+ * Analyze models using static source analysis (fallback method)
182
+ */
183
+ async analyzeModelsFromSource(srcPath) {
184
+ const modelFiles = await (0, glob_1.glob)('**/*.ts', {
185
+ cwd: node_path_1.default.join(srcPath, 'data'),
186
+ absolute: true,
187
+ ignore: ['**/*.test.ts', '**/Models.test.ts'],
188
+ });
189
+ const models = [];
190
+ for (const filePath of modelFiles) {
191
+ try {
192
+ const modelMetadata = await this.analyzeModel(filePath);
193
+ if (modelMetadata) {
194
+ models.push(modelMetadata);
195
+ }
196
+ }
197
+ catch (error) {
198
+ console.warn(`Warning: Could not analyze model ${filePath}: ${error.message}`);
199
+ }
200
+ }
201
+ return models;
202
+ }
203
+ /**
204
+ * Analyze a single TypeScript model file and extract metadata
205
+ */
206
+ async analyzeModel(filePath) {
207
+ const content = await fs_extra_1.default.readFile(filePath, 'utf-8');
208
+ // Extract model class name
209
+ const classMatch = content.match(/export\s+class\s+(\w+)\s+extends\s+BaseModel/);
210
+ if (!classMatch) {
211
+ return null; // Not a model file
212
+ }
213
+ const modelName = classMatch[1];
214
+ // Extract model decorator info
215
+ const modelDecoratorMatch = content.match(/@Model\(\s*{([^}]+)}\s*\)/);
216
+ let docs;
217
+ let dataSource = '';
218
+ if (modelDecoratorMatch) {
219
+ const decoratorContent = modelDecoratorMatch[1];
220
+ // Extract docs
221
+ const docsMatch = decoratorContent.match(/docs:\s*["']([^"']+)["']/);
222
+ if (docsMatch) {
223
+ docs = docsMatch[1];
224
+ }
225
+ // Extract dataSource
226
+ const dataSourceMatch = decoratorContent.match(/dataSource:\s*(\w+)/);
227
+ if (dataSourceMatch) {
228
+ dataSource = dataSourceMatch[1];
229
+ }
230
+ }
231
+ // Extract fields
232
+ const fields = this.extractFields(content);
233
+ // Extract relationships (for future use)
234
+ const relationships = this.extractRelationships(content);
235
+ const metadata = {
236
+ name: modelName,
237
+ filePath,
238
+ dataSource,
239
+ fields,
240
+ relationships,
241
+ };
242
+ if (docs) {
243
+ metadata.docs = docs;
244
+ }
245
+ return metadata;
246
+ }
247
+ /**
248
+ * Extract field metadata from the model content
249
+ */
250
+ extractFields(content) {
251
+ const fields = [];
252
+ // Match field declarations with decorators - more comprehensive pattern
253
+ const fieldPattern = /@Field\(\s*{([^}]*)}\s*\)\s*(?:@(\w+)\(\s*(?:{([^}]*)}|\([^)]*\))?\s*\))?\s*(\w+)(?:\?)?!?:\s*([^;]+);/g;
254
+ let match;
255
+ while ((match = fieldPattern.exec(content)) !== null) {
256
+ const fieldDecoratorContent = match[1];
257
+ const typeDecorator = match[2];
258
+ const typeDecoratorOptions = match[3] || '';
259
+ const fieldName = match[4];
260
+ const fieldType = match[5].trim();
261
+ const field = {
262
+ name: fieldName,
263
+ type: this.mapTypeScriptTypeToFieldType(fieldType, typeDecorator),
264
+ required: false,
265
+ };
266
+ // Parse @Field decorator options
267
+ this.parseFieldOptions(fieldDecoratorContent, field);
268
+ // Parse type decorator options
269
+ if (typeDecorator) {
270
+ this.parseTypeDecoratorOptions(typeDecorator, typeDecoratorOptions, field);
271
+ }
272
+ // Special handling for composition types
273
+ if (typeDecorator === 'Composition') {
274
+ field.type = 'composition';
275
+ field.isRelationship = true;
276
+ field.relationshipType = 'composition';
277
+ // Try to extract the element type from the field type
278
+ const elementTypeMatch = fieldType.match(/(\w+)$/);
279
+ if (elementTypeMatch) {
280
+ field.type = `composition:${elementTypeMatch[1]}`;
281
+ field.relatedModel = elementTypeMatch[1];
282
+ }
283
+ }
284
+ // Special handling for reference types
285
+ if (typeDecorator === 'Reference') {
286
+ field.type = 'reference';
287
+ field.isRelationship = true;
288
+ field.relationshipType = 'reference';
289
+ // Try to extract the element type from the field type
290
+ const elementTypeMatch = fieldType.match(/(\w+)$/);
291
+ if (elementTypeMatch) {
292
+ field.type = `reference:${elementTypeMatch[1]}`;
293
+ field.relatedModel = elementTypeMatch[1];
294
+ }
295
+ }
296
+ // Special handling for shared composition types
297
+ if (typeDecorator === 'SharedComposition') {
298
+ field.type = 'sharedComposition';
299
+ field.isRelationship = true;
300
+ field.relationshipType = 'sharedComposition';
301
+ // Try to extract the element type from the field type
302
+ const elementTypeMatch = fieldType.match(/(\w+)$/);
303
+ if (elementTypeMatch) {
304
+ field.type = `sharedComposition:${elementTypeMatch[1]}`;
305
+ field.relatedModel = elementTypeMatch[1];
306
+ }
307
+ }
308
+ fields.push(field);
309
+ }
310
+ return fields;
311
+ }
312
+ /**
313
+ * Extract relationship metadata (for future use)
314
+ */
315
+ extractRelationships(content) {
316
+ const relationships = [];
317
+ // Pattern to match relationship decorators
318
+ const relationshipPattern = /@(OneToOne|OneToMany|ManyToOne|ManyToMany)\([^)]*\)\s*(\w+)(?:\?)?!?:\s*([^;]+);/g;
319
+ let match;
320
+ while ((match = relationshipPattern.exec(content)) !== null) {
321
+ const relationType = match[1];
322
+ const fieldName = match[2];
323
+ const targetType = match[3].trim();
324
+ relationships.push({
325
+ fieldName,
326
+ type: relationType,
327
+ targetModel: this.extractModelNameFromType(targetType),
328
+ });
329
+ }
330
+ return relationships;
331
+ }
332
+ /**
333
+ * Parse @Field decorator options
334
+ */
335
+ parseFieldOptions(options, field) {
336
+ // Parse required
337
+ const requiredMatch = options.match(/required:\s*(true|false|\([^)]+\)\s*=>\s*{[^}]+})/);
338
+ if (requiredMatch) {
339
+ if (requiredMatch[1] === 'true') {
340
+ field.required = true;
341
+ }
342
+ else if (requiredMatch[1] === 'false') {
343
+ field.required = false;
344
+ }
345
+ else {
346
+ field.required = requiredMatch[1]; // function as string
347
+ }
348
+ }
349
+ // Parse primaryKey
350
+ const primaryKeyMatch = options.match(/primaryKey:\s*(true|false)/);
351
+ if (primaryKeyMatch) {
352
+ field.primaryKey = primaryKeyMatch[1] === 'true';
353
+ }
354
+ // Parse validation
355
+ const validationMatch = options.match(/validation:\s*(\([^)]+\)\s*=>\s*{[^}]+})/);
356
+ if (validationMatch) {
357
+ field.validation = validationMatch[1];
358
+ }
359
+ // Parse available
360
+ const availableMatch = options.match(/available:\s*(true|false|\([^)]+\)\s*=>\s*{[^}]+})/);
361
+ if (availableMatch) {
362
+ if (availableMatch[1] === 'true') {
363
+ field.available = true;
364
+ }
365
+ else if (availableMatch[1] === 'false') {
366
+ field.available = false;
367
+ }
368
+ else {
369
+ field.available = availableMatch[1]; // function as string
370
+ }
371
+ }
372
+ }
373
+ /**
374
+ * Parse type decorator options (Text, Integer, etc.)
375
+ */
376
+ parseTypeDecoratorOptions(decorator, options, field) {
377
+ switch (decorator.toLowerCase()) {
378
+ case 'text':
379
+ const minLengthMatch = options.match(/minLength:\s*(\d+)/);
380
+ if (minLengthMatch) {
381
+ field.minLength = parseInt(minLengthMatch[1]);
382
+ }
383
+ const maxLengthMatch = options.match(/maxLength:\s*(\d+)/);
384
+ if (maxLengthMatch) {
385
+ field.maxLength = parseInt(maxLengthMatch[1]);
386
+ }
387
+ const regexMatch = options.match(/regex:\s*\/([^\/]+)\//);
388
+ if (regexMatch) {
389
+ field.regex = regexMatch[1];
390
+ }
391
+ const regexMessageMatch = options.match(/regexMessage:\s*["']([^"']+)["']/);
392
+ if (regexMessageMatch) {
393
+ field.regexMessage = regexMessageMatch[1];
394
+ }
395
+ break;
396
+ case 'integer':
397
+ case 'float':
398
+ case 'decimal':
399
+ const minMatch = options.match(/min:\s*(\d+)/);
400
+ if (minMatch) {
401
+ field.min = parseInt(minMatch[1]);
402
+ }
403
+ const maxMatch = options.match(/max:\s*(\d+)/);
404
+ if (maxMatch) {
405
+ field.max = parseInt(maxMatch[1]);
406
+ }
407
+ if (decorator === 'decimal') {
408
+ const precisionMatch = options.match(/precision:\s*(\d+)/);
409
+ if (precisionMatch) {
410
+ field.precision = parseInt(precisionMatch[1]);
411
+ }
412
+ const scaleMatch = options.match(/scale:\s*(\d+)/);
413
+ if (scaleMatch) {
414
+ field.scale = parseInt(scaleMatch[1]);
415
+ }
416
+ }
417
+ break;
418
+ case 'uuid':
419
+ const generatedMatch = options.match(/generated:\s*(true|false)/);
420
+ if (generatedMatch) {
421
+ field.generated = generatedMatch[1] === 'true';
422
+ }
423
+ break;
424
+ }
425
+ }
426
+ /**
427
+ * Map TypeScript types to field types
428
+ */
429
+ mapTypeScriptTypeToFieldType(tsType, decorator) {
430
+ if (decorator) {
431
+ return decorator.toLowerCase();
432
+ }
433
+ switch (tsType.toLowerCase()) {
434
+ case 'string':
435
+ return 'text';
436
+ case 'number':
437
+ return 'integer';
438
+ case 'boolean':
439
+ return 'boolean';
440
+ case 'date':
441
+ return 'date';
442
+ default:
443
+ return 'text';
444
+ }
445
+ }
446
+ /**
447
+ * Extract model name from TypeScript type
448
+ */
449
+ extractModelNameFromType(type) {
450
+ // Handle arrays like "Person[]"
451
+ if (type.endsWith('[]')) {
452
+ return type.slice(0, -2);
453
+ }
454
+ return type;
455
+ }
456
+ }
457
+ exports.ModelAnalyzer = ModelAnalyzer;
458
+ //# sourceMappingURL=model-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-analyzer.js","sourceRoot":"","sources":["../../src/utils/model-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Check if Docker daemon is running
3
+ */
4
+ export declare function isDockerRunning(): boolean;
5
+ /**
6
+ * Check if a port is being used by a Docker container from the current project
7
+ */
8
+ export declare function isPortUsedByProjectDocker(port: number): {
9
+ containerId?: string;
10
+ containerName?: string;
11
+ isDocker: boolean;
12
+ };
13
+ /**
14
+ * Check if a port is currently in use using system tools
15
+ */
16
+ export declare function isPortInUse(port: number, host?: string): Promise<boolean>;
17
+ /**
18
+ * Find what process is using a specific port
19
+ */
20
+ export declare function getProcessUsingPort(port: number): null | string;
21
+ /**
22
+ * Find an available port starting from a given port
23
+ */
24
+ export declare function findAvailablePort(startingPort: number, maxAttempts?: number): Promise<null | number>;
25
+ /**
26
+ * Check multiple ports and return information about their usage
27
+ */
28
+ export declare function checkPortsUsage(ports: number[]): Promise<Array<{
29
+ containerId?: string;
30
+ containerName?: string;
31
+ inUse: boolean;
32
+ isProjectDocker?: boolean;
33
+ port: number;
34
+ process?: string;
35
+ }>>;
36
+ //# sourceMappingURL=portChecker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portChecker.d.ts","sourceRoot":"","sources":["../../src/utils/portChecker.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAOzC;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;CACnB,CA4FA;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,SAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CA+CpF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAqE/D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,SAAK,GAAG,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,CAQtG;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAC7D,KAAK,CAAC;IACJ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC,CACH,CAwCA"}