Skip to content

Commit 653e82d

Browse files
committed
chore(utils): updated extension generation
1 parent 97c0a34 commit 653e82d

File tree

9 files changed

+231
-308
lines changed

9 files changed

+231
-308
lines changed

package.json

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,6 @@
4747
"default": true,
4848
"description": "Add @JsonKey() annotations from json_annotation package"
4949
},
50-
"neuma-api-dart.generateFromJson": {
51-
"type": "boolean",
52-
"default": true,
53-
"description": "Generate fromJson() constructor"
54-
},
55-
"neuma-api-dart.generateToJson": {
56-
"type": "boolean",
57-
"default": true,
58-
"description": "Generate toJson() method"
59-
},
6050
"neuma-api-dart.generateCopyWith": {
6151
"type": "boolean",
6252
"default": false,

src/commands/generateCollection.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// import * as vscode from 'vscode';
2+
// import { generateCollectionModels } from '../utils/collectionGenUtils';
3+
4+
// export function registerGenerateCollectionCommand(context: vscode.ExtensionContext) {
5+
// return vscode.commands.registerCommand('neuma-api-dart.generateCollection', generateCollectionModels);
6+
// }

src/commands/generateModel.ts

Lines changed: 2 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -1,116 +1,6 @@
11
import * as vscode from 'vscode';
2-
import { generateDartModel } from '../utils/dartGenUtils';
2+
import { generateSingleModel } from '../utils/singleGenUtils';
33

44
export function registerGenerateModelCommand(context: vscode.ExtensionContext) {
5-
return vscode.commands.registerCommand('neuma-api-dart.generateModel', async () => {
6-
const jsonInput = await vscode.window.showInputBox({
7-
placeHolder: 'Paste your JSON object here',
8-
prompt: 'This should be a valid JSON object (e.g. {"name": "John"})',
9-
validateInput: text => {
10-
try {
11-
JSON.parse(text);
12-
return null;
13-
} catch (e) {
14-
return 'Invalid JSON';
15-
}
16-
}
17-
});
18-
19-
if (!jsonInput) return;
20-
21-
const modelType = await vscode.window.showQuickPick(['Request', 'Response'], {
22-
placeHolder: 'Select model type'
23-
});
24-
25-
if (!modelType) return;
26-
27-
const classNameBase = await vscode.window.showInputBox({
28-
placeHolder: 'Enter base class name (e.g. UserProfile, LoginAuth, ProductDetails)',
29-
prompt: 'This will create the model class and organize it in a folder structure. For example:\n• "UserProfile" creates models/user_profile/user_profile_request.dart\n• "LoginAuth" creates models/login_auth/login_auth_response.dart\nUse PascalCase - it will be converted to snake_case for folders and files.'
30-
});
31-
32-
if (!classNameBase) return;
33-
34-
const finalClassName = `${classNameBase}${modelType}`;
35-
36-
// Get extension configuration
37-
const config = vscode.workspace.getConfiguration('neuma-api-dart');
38-
const baseFolder = config.get<string>('defaultBaseFolder', 'lib/models');
39-
const generateSubfolders = config.get<boolean>('generateSubfolders', true);
40-
41-
// Convert PascalCase to snake_case for folder and file names (Dart convention)
42-
const folderName = classNameBase.replace(/([A-Z])/g, (match, letter, index) => {
43-
return index === 0 ? letter.toLowerCase() : '_' + letter.toLowerCase();
44-
});
45-
46-
const fileName = `${folderName}_${modelType.toLowerCase()}.dart`;
47-
48-
// Build path based on subfolder setting
49-
const relativePath = generateSubfolders
50-
? `${baseFolder}/${folderName}/${fileName}`
51-
: `${baseFolder}/${fileName}`;
52-
53-
const json = JSON.parse(jsonInput);
54-
55-
// Create model generation options from config
56-
const modelOptions = {
57-
nullSafety: config.get<string>('nullSafety', 'auto'),
58-
generateJsonAnnotation: config.get<boolean>('generateJsonAnnotation', true),
59-
generateFromJson: config.get<boolean>('generateFromJson', true),
60-
generateToJson: config.get<boolean>('generateToJson', true),
61-
generateCopyWith: config.get<boolean>('generateCopyWith', false),
62-
generateEquatable: config.get<boolean>('generateEquatable', false),
63-
generateToString: config.get<boolean>('generateToString', false),
64-
useFreezed: config.get<boolean>('useFreezed', false),
65-
fieldCase: config.get<string>('fieldCase', 'camelCase'),
66-
addPartStatement: config.get<boolean>('addPartStatement', true)
67-
};
68-
69-
const dartCode = generateDartModel(json, finalClassName, new Set(Object.keys(modelOptions)));
70-
71-
// Get the workspace folder
72-
const workspaceFolder = vscode.workspace.workspaceFolders?.[0];
73-
74-
if (!workspaceFolder) {
75-
// No workspace - fallback to untitled document
76-
vscode.window.showWarningMessage('No workspace folder found. Opening as untitled document.');
77-
const doc = await vscode.workspace.openTextDocument({
78-
content: dartCode,
79-
language: 'dart'
80-
});
81-
await vscode.window.showTextDocument(doc);
82-
return;
83-
}
84-
85-
try {
86-
// Create the full file path
87-
const fullPath = vscode.Uri.joinPath(workspaceFolder.uri, relativePath);
88-
89-
// Create directories if they don't exist
90-
const dirPath = generateSubfolders
91-
? vscode.Uri.joinPath(workspaceFolder.uri, `${baseFolder}/${folderName}`)
92-
: vscode.Uri.joinPath(workspaceFolder.uri, baseFolder);
93-
await vscode.workspace.fs.createDirectory(dirPath);
94-
95-
// Write the file
96-
const encoder = new TextEncoder();
97-
await vscode.workspace.fs.writeFile(fullPath, encoder.encode(dartCode));
98-
99-
// Open the created file
100-
const doc = await vscode.workspace.openTextDocument(fullPath);
101-
await vscode.window.showTextDocument(doc);
102-
103-
vscode.window.showInformationMessage(`Model created at: ${relativePath}`);
104-
105-
} catch (error) {
106-
vscode.window.showErrorMessage(`Failed to create file: ${error}`);
107-
108-
// Fallback: open in untitled document
109-
const doc = await vscode.workspace.openTextDocument({
110-
content: dartCode,
111-
language: 'dart'
112-
});
113-
vscode.window.showTextDocument(doc);
114-
}
115-
});
5+
return vscode.commands.registerCommand('neuma-api-dart.generateModel', generateSingleModel);
1166
}

src/configs/types.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
export interface ModelGenerationOptions {
44
nullSafety: 'nullable' | 'non-nullable' | 'auto';
55
generateJsonAnnotation: boolean;
6-
generateFromJson: boolean;
7-
generateToJson: boolean;
86
generateCopyWith: boolean;
97
generateEquatable: boolean;
108
generateToString: boolean;

src/extension.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import * as vscode from 'vscode';
22
import { registerGenerateModelCommand } from './commands/generateModel';
3+
// import { registerGenerateCollectionCommand } from './commands/generateCollection';
34

45
export function activate(context: vscode.ExtensionContext) {
56
console.log('Neuma API Dart extension is now active!');
67

78
const generateModelDisposable = registerGenerateModelCommand(context);
8-
// const generateCollectionDisposable = registerGenerateModelCommand(context);
9+
// const generateCollectionDisposable = registerGenerateCollectionCommand(context);
910

1011
context.subscriptions.push(generateModelDisposable);
1112
// context.subscriptions.push(generateCollectionDisposable);

0 commit comments

Comments
 (0)