@tantawowa/hosanna-tools 0.9.0 → 0.10.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.
@@ -1,3 +1,5 @@
1
1
  {
2
- "buildDate": "2025-09-09T21:03:03.078Z"
2
+ "buildDate": "2025-09-22T10:01:39+01:00",
3
+ "buildDateISO": "2025-09-22T09:01:39.714Z",
4
+ "timeZone": "Europe/London"
3
5
  }
package/dist/cli.js CHANGED
@@ -37,6 +37,9 @@ const helpers_1 = require("yargs/helpers");
37
37
  const generation_utils_js_1 = require("./generation/generation-utils.js");
38
38
  const sdk_manager_js_1 = require("./updater/sdk-manager.js");
39
39
  const generation_utils_js_2 = require("./generation/generation-utils.js");
40
+ const command_debugger_js_1 = require("./support-tools/command-debugger.js");
41
+ const dev_runner_js_1 = require("./support-tools/dev-runner.js");
42
+ const env_info_js_1 = require("./lib/env-info.js");
40
43
  // Read build date and version embedded at build time
41
44
  let buildDate = 'unknown';
42
45
  let buildVersion = 'unknown';
@@ -59,115 +62,167 @@ console.info(`hosanna-tools: Version: ${buildVersion} (build date: ${buildDate})
59
62
  /*******************************************************************
60
63
  * CLI Handling
61
64
  *******************************************************************/
62
- // eslint-disable-next-line @typescript-eslint/no-unused-vars, unused-imports/no-unused-vars
63
- const argv = (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
64
- .usage('$0 <command> [options]', `Hosanna Tools CLI\nVersion: ${buildVersion}\nBuild Date: ${buildDate}`)
65
- .command('generate', 'Generate structs and command handler maps', yargs => yargs
66
- .option('watch', { type: 'boolean', description: 'Watch for file changes' })
67
- .option('rootFolder', { type: 'string', description: 'Root folder for the operation' })
68
- .example('$0 generate --rootFolder ./src', 'Generate structs and command handler maps for the specified root folder')
69
- .example('$0 generate --watch', 'Generate structs and command handler maps and watch for file changes'), args => {
70
- const rootFolder = args.rootFolder ? path.resolve(args.rootFolder) : path.resolve(process.cwd(), 'src');
71
- console.info(`Running generate command in folder ${rootFolder}`);
72
- if (args.watch) {
73
- console.info(`Watching for changes in ${rootFolder}...`);
65
+ // Early handling for top-level --env flag (to avoid yargs demanding a command)
66
+ const rawArgs = (0, helpers_1.hideBin)(process.argv);
67
+ const isEnvOnly = rawArgs.includes('--env') && rawArgs.every(arg => arg.startsWith('-'));
68
+ if (isEnvOnly) {
69
+ const info = (0, env_info_js_1.collectEnvInfo)(process.cwd());
70
+ const report = (0, env_info_js_1.formatEnvReport)(info);
71
+ console.info(report);
72
+ if (!process.env.VITEST) {
73
+ process.exit(0);
74
74
  }
75
- (async () => {
76
- await (0, generation_utils_js_1.generateAll)(rootFolder); // Ensure generateAll completes
75
+ }
76
+ if (!isEnvOnly) {
77
+ const argv = (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
78
+ .usage('$0 <command> [options]', `Hosanna Tools CLI\nVersion: ${buildVersion}\nBuild Date: ${buildDate}`)
79
+ .option('env', {
80
+ type: 'boolean',
81
+ description: 'Print environment info (versions and hosanna.json)'
82
+ })
83
+ .command('debugger', 'Start the command debugger WebSocket proxy', yargs => yargs
84
+ .option('webAppPort', { type: 'number', description: 'Port for web app client', default: 59151 })
85
+ .option('deviceAppPort', { type: 'number', description: 'Port for device app client', default: 59152 })
86
+ .option('extensionPort', { type: 'number', description: 'Port for extension client', default: 59153 })
87
+ .option('defaultClientType', { type: 'string', choices: ['web', 'device'], default: 'web', description: 'Default target client for extension messages' }), args => {
88
+ (0, command_debugger_js_1.startCommandDebugger)({
89
+ webAppPort: args.webAppPort,
90
+ deviceAppPort: args.deviceAppPort,
91
+ extensionPort: args.extensionPort,
92
+ defaultClientType: args.defaultClientType || 'web',
93
+ });
94
+ })
95
+ .command('generate', 'Generate structs and command handler maps', yargs => yargs
96
+ .option('watch', { type: 'boolean', description: 'Watch for file changes' })
97
+ .option('rootFolder', { type: 'string', description: 'Root folder for the operation' })
98
+ .example('$0 generate --rootFolder ./src', 'Generate structs and command handler maps for the specified root folder')
99
+ .example('$0 generate --watch', 'Generate structs and command handler maps and watch for file changes'), args => {
100
+ const rootFolder = args.rootFolder ? path.resolve(args.rootFolder) : path.resolve(process.cwd(), 'src');
101
+ console.info(`Running generate command in folder ${rootFolder}`);
77
102
  if (args.watch) {
78
- const watcher = chokidar.watch(rootFolder, {
79
- persistent: true,
80
- ignoreInitial: false,
81
- ignored: /(^|[/\\])\../ // ignore dotfiles
82
- });
83
- watcher.on('add', (filePath) => (0, generation_utils_js_1.debounceHandler)(generation_utils_js_1.handleFileChange)(filePath, generation_utils_js_1.ChangeType.Add, rootFolder));
84
- watcher.on('change', (filePath) => (0, generation_utils_js_1.debounceHandler)(generation_utils_js_1.handleFileChange)(filePath, generation_utils_js_1.ChangeType.Change, rootFolder));
85
- watcher.on('unlink', (filePath) => (0, generation_utils_js_1.debounceHandler)(generation_utils_js_1.handleFileChange)(filePath, generation_utils_js_1.ChangeType.Unlink, rootFolder));
103
+ console.info(`Generator running in watch mode.`);
86
104
  }
87
- else {
88
- console.info('Generate command completed.');
89
- process.exit(0); // Exit after finishing when not in watch mode
105
+ (async () => {
106
+ await (0, generation_utils_js_1.generateAll)(rootFolder); // Ensure generateAll completes
107
+ if (args.watch) {
108
+ console.info(`Initial generation completed. Watching for changes in ${rootFolder}...`);
109
+ const watcher = chokidar.watch(rootFolder, {
110
+ persistent: true,
111
+ ignoreInitial: true,
112
+ ignored: /(^|[/\\])\../ // ignore dotfiles
113
+ });
114
+ watcher.on('add', (filePath) => (0, generation_utils_js_1.debounceHandler)(generation_utils_js_1.handleFileChange)(filePath, generation_utils_js_1.ChangeType.Add, rootFolder));
115
+ watcher.on('change', (filePath) => (0, generation_utils_js_1.debounceHandler)(generation_utils_js_1.handleFileChange)(filePath, generation_utils_js_1.ChangeType.Change, rootFolder));
116
+ watcher.on('unlink', (filePath) => (0, generation_utils_js_1.debounceHandler)(generation_utils_js_1.handleFileChange)(filePath, generation_utils_js_1.ChangeType.Unlink, rootFolder));
117
+ }
118
+ else {
119
+ console.info('Generate command completed.');
120
+ process.exit(0); // Exit after finishing when not in watch mode
121
+ }
122
+ })();
123
+ })
124
+ .command('generate-structs [files..]', 'Generate structs only for the specified files (space-separated)', yargs => yargs
125
+ .positional('files', {
126
+ type: 'string',
127
+ array: true,
128
+ describe: 'One or more TypeScript files to generate structs for',
129
+ })
130
+ .option('rootFolder', { type: 'string', description: 'Project root folder (defaults to ./src)' })
131
+ .example('$0 generate-structs src/views/Button.ts src/views/Input.ts', 'Generate structs only for Button and Input')
132
+ .example('$0 generate-structs --rootFolder ./src src/views/Card.ts', 'Generate struct for Card relative to project root'), args => {
133
+ const files = args.files || [];
134
+ const rootFolder = args.rootFolder ? path.resolve(args.rootFolder) : path.resolve(process.cwd(), 'src');
135
+ if (!files.length) {
136
+ console.error('No files specified. Provide one or more .ts files.');
137
+ process.exit(1);
138
+ }
139
+ try {
140
+ const count = (0, generation_utils_js_2.generateStructsForFiles)(files, rootFolder);
141
+ console.info(`Generated structs for ${count} file(s).`);
142
+ process.exit(0);
143
+ }
144
+ catch (err) {
145
+ console.error('Failed to generate structs for files:', err);
146
+ process.exit(1);
147
+ }
148
+ })
149
+ .command('clean', 'Clean generated files', yargs => yargs.option('rootFolder', { type: 'string', description: 'Root folder for the operation' }), async (args) => {
150
+ const rootFolder = args.rootFolder ? path.resolve(args.rootFolder) : path.resolve(process.cwd(), 'src');
151
+ console.info(`Running clean command in folder ${rootFolder}`);
152
+ await (0, generation_utils_js_1.cleanGeneratedFiles)(rootFolder); // Await the cleanup process
153
+ console.info('Cleanup process completed.');
154
+ process.exit(0); // Exit after finishing
155
+ })
156
+ .command('create-view', 'Create a new view', yargs => yargs.option('rootFolder', { type: 'string', description: 'Root folder for the operation' }), async (args) => {
157
+ const rootFolder = args.rootFolder ? path.resolve(args.rootFolder) : path.resolve(process.cwd(), 'src');
158
+ console.info(`Running create-view command in folder ${rootFolder}`);
159
+ try {
160
+ await (0, view_generator_js_1.generateView)(rootFolder);
161
+ }
162
+ catch (err) {
163
+ console.error(err);
164
+ }
165
+ })
166
+ .command('prepare-gitignore', 'Ensure .gitignore contains required entries', yargs => yargs, () => {
167
+ console.info('Preparing .gitignore...');
168
+ (0, sdk_manager_js_1.prepareGitIgnore)();
169
+ console.info('.gitignore preparation completed.');
170
+ })
171
+ .command('update', 'Update the SDK by cloning the repository, checking out the branch or tag, and setting up symlinks', yargs => yargs, () => {
172
+ console.info('Running update-sdk command...');
173
+ (0, sdk_manager_js_1.updateSdk)();
174
+ console.info('update-sdk command completed.');
175
+ })
176
+ .command('install', 'Install the SDK by creating hosanna.json and setting up the environment', yargs => yargs, async () => {
177
+ console.info('Running install-sdk command...');
178
+ try {
179
+ await (0, sdk_manager_js_1.installSdk)(); // Ensure installSdk is awaited
180
+ console.info('install-sdk command completed.');
181
+ process.exit(0); // Exit after successful completion
182
+ }
183
+ catch (err) {
184
+ console.error('An error occurred during the install process:', err);
185
+ process.exit(1); // Exit with error code on failure
186
+ }
187
+ })
188
+ .command('create-template-app', 'Create a new template app with the Hosanna SDK', yargs => yargs, async () => {
189
+ console.info('Running create-template-app command...');
190
+ try {
191
+ await (0, sdk_manager_js_1.createTemplateApp)();
192
+ console.info('create-template-app command completed.');
193
+ process.exit(0);
194
+ }
195
+ catch (err) {
196
+ console.error('An error occurred during the create template app process:', err);
197
+ process.exit(1);
198
+ }
199
+ })
200
+ .command('run', 'Run dev processes: vite, generator watch, and optional debugger', yargs => yargs
201
+ .option('vitePort', { type: 'number', description: 'Port for Vite dev server', default: 5173 })
202
+ .option('webAppPort', { type: 'number', description: 'Port for web app client', default: 59151 })
203
+ .option('deviceAppPort', { type: 'number', description: 'Port for device app client', default: 59152 })
204
+ .option('extensionPort', { type: 'number', description: 'Port for extension client', default: 59153 })
205
+ .option('defaultClientType', { type: 'string', choices: ['web', 'device'], default: 'web', description: 'Default target client for extension messages' }), args => {
206
+ (0, dev_runner_js_1.runDevProcesses)({
207
+ vitePort: args.vitePort,
208
+ webAppPort: args.webAppPort,
209
+ deviceAppPort: args.deviceAppPort,
210
+ extensionPort: args.extensionPort,
211
+ defaultClientType: args.defaultClientType || 'web',
212
+ });
213
+ })
214
+ .help('help', 'View help information about this tool.')
215
+ .demandCommand(0)
216
+ .strict()
217
+ .argv;
218
+ // Support top-level flag: hst --env
219
+ if (argv.env) {
220
+ const info = (0, env_info_js_1.collectEnvInfo)(process.cwd());
221
+ const report = (0, env_info_js_1.formatEnvReport)(info);
222
+ console.info(report);
223
+ if (!process.env.VITEST) {
224
+ process.exit(0);
90
225
  }
91
- })();
92
- })
93
- .command('generate-structs [files..]', 'Generate structs only for the specified files (space-separated)', yargs => yargs
94
- .positional('files', {
95
- type: 'string',
96
- array: true,
97
- describe: 'One or more TypeScript files to generate structs for',
98
- })
99
- .option('rootFolder', { type: 'string', description: 'Project root folder (defaults to ./src)' })
100
- .example('$0 generate-structs src/views/Button.ts src/views/Input.ts', 'Generate structs only for Button and Input')
101
- .example('$0 generate-structs --rootFolder ./src src/views/Card.ts', 'Generate struct for Card relative to project root'), args => {
102
- const files = args.files || [];
103
- const rootFolder = args.rootFolder ? path.resolve(args.rootFolder) : path.resolve(process.cwd(), 'src');
104
- if (!files.length) {
105
- console.error('No files specified. Provide one or more .ts files.');
106
- process.exit(1);
107
- }
108
- try {
109
- const count = (0, generation_utils_js_2.generateStructsForFiles)(files, rootFolder);
110
- console.info(`Generated structs for ${count} file(s).`);
111
- process.exit(0);
112
- }
113
- catch (err) {
114
- console.error('Failed to generate structs for files:', err);
115
- process.exit(1);
116
- }
117
- })
118
- .command('clean', 'Clean generated files', yargs => yargs.option('rootFolder', { type: 'string', description: 'Root folder for the operation' }), async (args) => {
119
- const rootFolder = args.rootFolder ? path.resolve(args.rootFolder) : path.resolve(process.cwd(), 'src');
120
- console.info(`Running clean command in folder ${rootFolder}`);
121
- await (0, generation_utils_js_1.cleanGeneratedFiles)(rootFolder); // Await the cleanup process
122
- console.info('Cleanup process completed.');
123
- process.exit(0); // Exit after finishing
124
- })
125
- .command('create-view', 'Create a new view', yargs => yargs.option('rootFolder', { type: 'string', description: 'Root folder for the operation' }), async (args) => {
126
- const rootFolder = args.rootFolder ? path.resolve(args.rootFolder) : path.resolve(process.cwd(), 'src');
127
- console.info(`Running create-view command in folder ${rootFolder}`);
128
- try {
129
- await (0, view_generator_js_1.generateView)(rootFolder);
130
- }
131
- catch (err) {
132
- console.error(err);
133
- }
134
- })
135
- .command('prepare-gitignore', 'Ensure .gitignore contains required entries', yargs => yargs, () => {
136
- console.info('Preparing .gitignore...');
137
- (0, sdk_manager_js_1.prepareGitIgnore)();
138
- console.info('.gitignore preparation completed.');
139
- })
140
- .command('update', 'Update the SDK by cloning the repository, checking out the branch or tag, and setting up symlinks', yargs => yargs, () => {
141
- console.info('Running update-sdk command...');
142
- (0, sdk_manager_js_1.updateSdk)();
143
- console.info('update-sdk command completed.');
144
- })
145
- .command('install', 'Install the SDK by creating hosanna.json and setting up the environment', yargs => yargs, async () => {
146
- console.info('Running install-sdk command...');
147
- try {
148
- await (0, sdk_manager_js_1.installSdk)(); // Ensure installSdk is awaited
149
- console.info('install-sdk command completed.');
150
- process.exit(0); // Exit after successful completion
151
- }
152
- catch (err) {
153
- console.error('An error occurred during the install process:', err);
154
- process.exit(1); // Exit with error code on failure
155
- }
156
- })
157
- .command('create-template-app', 'Create a new template app with the Hosanna SDK', yargs => yargs, async () => {
158
- console.info('Running create-template-app command...');
159
- try {
160
- await (0, sdk_manager_js_1.createTemplateApp)();
161
- console.info('create-template-app command completed.');
162
- process.exit(0);
163
- }
164
- catch (err) {
165
- console.error('An error occurred during the create template app process:', err);
166
- process.exit(1);
167
226
  }
168
- })
169
- .help('help', 'View help information about this tool.')
170
- .demandCommand(1, 'You need to specify a command.')
171
- .strict()
172
- .argv;
227
+ }
173
228
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -28,7 +28,7 @@ exports.StateInterfaceGenerator = void 0;
28
28
  const ts = __importStar(require("typescript"));
29
29
  class StateInterfaceGenerator {
30
30
  static generate(viewClassNode, viewName, sourceFile, members, viewStateClassName = 'ViewState') {
31
- var _a;
31
+ var _a, _b;
32
32
  const stateFields = [];
33
33
  for (const member of viewClassNode.members) {
34
34
  if (!ts.isPropertyDeclaration(member))
@@ -56,11 +56,19 @@ class StateInterfaceGenerator {
56
56
  members.push(member);
57
57
  stateFields.push({ name, type: typeText });
58
58
  }
59
+ const typeParams = (_b = viewClassNode.typeParameters) !== null && _b !== void 0 ? _b : [];
60
+ const typeParamDeclFull = typeParams.length ? `<${typeParams.map(tp => tp.getText(sourceFile)).join(', ')}>` : '';
61
+ const typeParamDeclWithDefaults = typeParams.length ? `<${typeParams.map(tp => `${tp.name.getText(sourceFile)} = any`).join(', ')}>` : '';
59
62
  const interfaceName = `${viewName}State`;
60
63
  const interfaceBody = stateFields
61
64
  .map((f) => ` ${f.name}?: ${f.type};`)
62
65
  .join('\n');
63
- return `export interface ${interfaceName} extends ${viewStateClassName} {\n${interfaceBody}\n}\n`;
66
+ // Only propagate generics to the state interface if any state field references a type parameter
67
+ const typeParamNames = typeParams.map(tp => tp.name.getText(sourceFile));
68
+ const usesGenericsInState = typeParamNames.length > 0 && stateFields.some(f => typeParamNames.some(name => f.type.includes(name)));
69
+ // Prefer defaults so that referring to the interface without type args continues to work in user code
70
+ const typeParamDecl = usesGenericsInState ? (typeParamDeclWithDefaults || typeParamDeclFull) : '';
71
+ return `export interface ${interfaceName}${typeParamDecl} extends ${viewStateClassName} {\n${interfaceBody}\n}\n`;
64
72
  }
65
73
  static getDecoratorName(decorator) {
66
74
  if (ts.isCallExpression(decorator.expression)) {
@@ -1 +1 @@
1
- {"version":3,"file":"StateInterfaceGenerator.js","sourceRoot":"","sources":["../../src/generation/StateInterfaceGenerator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"StateInterfaceGenerator.js","sourceRoot":"","sources":["../../src/generation/StateInterfaceGenerator.ts"],"names":[],"mappings":"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"}
@@ -175,6 +175,7 @@ function generateStructForFile(fileName, rootProjectPath) {
175
175
  console.log('viewName', viewMetadata.viewName);
176
176
  const { viewName: targetViewName, isAggregate: isAggregateView, className: viewClassName } = viewMetadata;
177
177
  ts.forEachChild(sourceFile, (node) => {
178
+ var _a, _b, _c, _d, _e;
178
179
  const viewStateMembers = [];
179
180
  //NEW FEATUTRE TO COMPLETE
180
181
  if (!ts.isClassDeclaration(node)) {
@@ -187,7 +188,12 @@ function generateStructForFile(fileName, rootProjectPath) {
187
188
  }
188
189
  // if (ts.isInterfaceDeclaration(node)) {
189
190
  if (true) {
190
- let baseStructClass = 'ViewStruct<T>';
191
+ // Compute generics for the view class
192
+ const typeParams = (_a = node.typeParameters) !== null && _a !== void 0 ? _a : [];
193
+ const typeParamDecl = typeParams.length ? `<${typeParams.map(tp => tp.getText(sourceFile)).join(', ')}>` : '';
194
+ const typeParamNames = typeParams.map(tp => tp.name.getText());
195
+ const typeParamUsage = typeParamNames.length ? `<${typeParamNames.join(', ')}>` : '';
196
+ let baseStructClass = '';
191
197
  const parentInfo = resolveParentViewStructInfo(node, sourceFile, imports, _rootProjectPath);
192
198
  const generatedStateInterface = StateInterfaceGenerator_1.StateInterfaceGenerator.generate(node, viewMetadata.viewName, sourceFile, viewStateMembers, parentInfo === null || parentInfo === void 0 ? void 0 : parentInfo.baseStateInterfaceName);
193
199
  //TODO work out the parent struct if required
@@ -196,12 +202,33 @@ function generateStructForFile(fileName, rootProjectPath) {
196
202
  if (isViewState) {
197
203
  console.info(`Generating view struct for ${sourceFile.fileName}`);
198
204
  // const stateInterface = node.name.getText(); // E.g., "LabelState"
199
- const stateInterface = `${targetViewName}State`; // E.g., "LabelState"
205
+ const usesGenericsInState = ((_c = (_b = node.typeParameters) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : 0) > 0 && viewStateMembers.some((m) => {
206
+ const t = m.type;
207
+ if (!t)
208
+ return false;
209
+ const txt = t.getText(sourceFile);
210
+ return (node.typeParameters || []).some(tp => txt.includes(tp.name.getText(sourceFile)));
211
+ });
212
+ const stateInterface = `${targetViewName}State${usesGenericsInState ? typeParamUsage : ''}`; // E.g., "LabelState"
213
+ const hasViewGenerics = ((_e = (_d = node.typeParameters) === null || _d === void 0 ? void 0 : _d.length) !== null && _e !== void 0 ? _e : 0) > 0;
214
+ const structTypeParamDecl = hasViewGenerics
215
+ ? typeParamDecl
216
+ : `<T extends ${stateInterface} = ${stateInterface}>`;
217
+ const structTypeParamUsage = hasViewGenerics ? typeParamUsage : `<T>`;
200
218
  const structClassName = getTargetStructClassName(targetViewName);
201
219
  //FIXME - we need to know the actual class name of this view!!! the way we work this out presently is wrong - it should come from the class that has the @view decorator
202
220
  const generatorFunctionName = targetViewName; // E.g., "LabelView"
203
221
  const requiredImportsMap = getImports(sourceFile);
204
222
  const usedImports = new Set();
223
+ // Ensure types used in generic parameter constraints/defaults are imported (e.g., ISGNGroup)
224
+ for (const tp of typeParams) {
225
+ if (tp.constraint) {
226
+ usedImports.add(getTypeName(tp.constraint));
227
+ }
228
+ if (tp.default) {
229
+ usedImports.add(getTypeName(tp.default));
230
+ }
231
+ }
205
232
  // Determine the correct base struct class
206
233
  // if (parentInfo) {
207
234
  // baseStructClass = `_${parentInfo.baseStructClassName}<T>`;
@@ -210,7 +237,7 @@ function generateStructForFile(fileName, rootProjectPath) {
210
237
  // // requiredImports.set(parentInfo.baseStructClassName, parentInfo.importPath);
211
238
  // }
212
239
  if (parentInfo) {
213
- baseStructClass = `_${parentInfo.baseStructClassName}<T>`;
240
+ baseStructClass = `_${parentInfo.baseStructClassName}<${stateInterface}>`;
214
241
  // Add all parent symbols to usedImports and ensure they resolve to the generated-struct path
215
242
  usedImports.add(parentInfo.baseStructClassName);
216
243
  usedImports.add(`_${parentInfo.baseStructClassName}`);
@@ -219,6 +246,9 @@ function generateStructForFile(fileName, rootProjectPath) {
219
246
  imports.set(`_${parentInfo.baseStructClassName}`, parentInfo.importPath);
220
247
  imports.set(parentInfo.baseStateInterfaceName, parentInfo.importPath);
221
248
  }
249
+ else {
250
+ baseStructClass = hasViewGenerics ? `ViewStruct<${stateInterface}>` : `ViewStruct<T>`;
251
+ }
222
252
  // const structMethods = node.members.map((member: ts.TypeElement) => {
223
253
  const structMethods = viewStateMembers.map((member) => {
224
254
  const memberName = member.name.getText();
@@ -306,12 +336,16 @@ function generateStructForFile(fileName, rootProjectPath) {
306
336
  usedImports.delete('FocusChildChangeEvent');
307
337
  usedImports.delete(viewClassName);
308
338
  imports.delete(viewClassName);
339
+ // Prevent self-import of the generated state interface in its own file
340
+ const selfStateName = `${targetViewName}State`;
341
+ usedImports.delete(selfStateName);
342
+ imports.delete(selfStateName);
309
343
  // Remove generic type parameters from imports (e.g., T)
310
344
  const genericParams = new Set((node.typeParameters || []).map(p => p.name.getText()));
311
345
  genericParams.forEach(p => usedImports.delete(p));
312
346
  let generatedStruct = `
313
347
 
314
- /* eslint-disable */ WTF WTFG
348
+ /* eslint-disable */
315
349
  import { ${viewClassName} } from '${viewMetadata.importFileName}';
316
350
  ${Array.from(usedImports).filter((type) => !exportedTypes.has(type)).map((type) => `import { ${type} } from '${imports.get(type)}';`).join('\n')}
317
351
  import { FocusChildChangeEvent, ViewStruct, ViewState } from '${relativePathToViewApi}';
@@ -321,17 +355,18 @@ import { hs_struct } from '${relativePathToHsStruct}';
321
355
 
322
356
  ${Array.from(exportedTypes).map((type) => `import { ${type} } from './${baseFileName}';`).join('\n')}
323
357
 
324
- export class _${structClassName}<T extends ${stateInterface}> extends ${baseStructClass} {
358
+ export class _${structClassName}${structTypeParamDecl} extends ${baseStructClass} {
325
359
  __viewClassName = '${viewClassName}';
360
+ declare state: ${hasViewGenerics ? stateInterface : 'T'};
326
361
  ${structMethods.join('\n')}
327
362
  override createHosannaView(): any {
328
- const view = AppUtils.resolve<IInstancePool>('instancePool').get('${viewClassName}', ${viewClassName} as unknown as () => IReusable);
363
+ const view = AppUtils.resolve<IInstancePool>('instancePool').get('${viewClassName}', ${viewClassName} as unknown as new() => IReusable);
329
364
  return view;
330
365
  }
331
366
  }
332
367
 
333
368
  @hs_struct("${structClassName}"${isAggregateView ? ', true' : ''})
334
- export class ${structClassName} extends _${structClassName}<${stateInterface}> {
369
+ export class ${structClassName}${hasViewGenerics ? typeParamDecl : ''} extends _${structClassName}${hasViewGenerics ? structTypeParamUsage : `<${stateInterface}>`} {
335
370
  }
336
371
  `;
337
372
  //CHECKME
@@ -341,9 +376,8 @@ export class ${structClassName} extends _${structClassName}<${stateInterface}> {
341
376
  //FIXME -why was I creating new structs for children every time???
342
377
  if (isAggregateView) {
343
378
  generatedStruct += `
344
- export function ${generatorFunctionName}(children: ViewStruct<ViewState>[]) {
345
- // return new ${structClassName}({} as any).children(children);
346
- const struct = AppUtils.resolve<IInstancePool>('instancePool').get<${structClassName}>('${structClassName}', ${structClassName} as unknown as new() => IReusable);
379
+ export function ${generatorFunctionName}${hasViewGenerics ? typeParamDecl : ''}(children: ViewStruct<ViewState>[]) {
380
+ const struct = AppUtils.resolve<IInstancePool>('instancePool').get<${structClassName}${hasViewGenerics ? structTypeParamUsage : ''}>('${structClassName}', ${structClassName} as unknown as new() => ${structClassName}${hasViewGenerics ? structTypeParamUsage : ''});
347
381
  struct.setState({} as any);
348
382
  return struct.children(children);
349
383
  }`;
@@ -351,8 +385,8 @@ export function ${generatorFunctionName}(children: ViewStruct<ViewState>[]) {
351
385
  else {
352
386
  generatedStruct += `
353
387
 
354
- export function ${generatorFunctionName}(state?: ${stateInterface}): ${structClassName} {
355
- const struct = AppUtils.resolve<IInstancePool>('instancePool').get<${structClassName}>('${structClassName}', ${structClassName} as unknown as new() => IReusable);
388
+ export function ${generatorFunctionName}${hasViewGenerics ? typeParamDecl : ''}(state?: ${stateInterface}): ${structClassName}${hasViewGenerics ? structTypeParamUsage : ''} {
389
+ const struct = AppUtils.resolve<IInstancePool>('instancePool').get<${structClassName}${hasViewGenerics ? structTypeParamUsage : ''}>('${structClassName}', ${structClassName} as unknown as new() => ${structClassName}${hasViewGenerics ? structTypeParamUsage : ''});
356
390
  struct.setState(state as any);
357
391
  return struct;
358
392
  }
@@ -390,6 +424,7 @@ function generateStructForSource(sourceCode, fileName, rootProjectPath, readFile
390
424
  }
391
425
  const { viewName: targetViewName, isAggregate: isAggregateView, className: viewClassName } = viewMetadata;
392
426
  ts.forEachChild(sourceFile, (node) => {
427
+ var _a, _b, _c;
393
428
  const viewStateMembers = [];
394
429
  if (!ts.isClassDeclaration(node)) {
395
430
  return;
@@ -398,18 +433,39 @@ function generateStructForSource(sourceCode, fileName, rootProjectPath, readFile
398
433
  if (!isView || !viewMetadata) {
399
434
  return;
400
435
  }
401
- let baseStructClass = 'ViewStruct<T>';
436
+ // Compute generics for the view class
437
+ const typeParams = (_a = node.typeParameters) !== null && _a !== void 0 ? _a : [];
438
+ const typeParamDecl = typeParams.length ? `<${typeParams.map(tp => tp.getText(sourceFile)).join(', ')}>` : '';
439
+ const typeParamNames = typeParams.map(tp => tp.name.getText());
440
+ const typeParamUsage = typeParamNames.length ? `<${typeParamNames.join(', ')}>` : '';
441
+ let baseStructClass = '';
402
442
  const parentInfo = resolveParentViewStructInfo(node, sourceFile, imports, _rootProjectPath, readFile, fileExists);
403
443
  const generatedStateInterface = StateInterfaceGenerator_1.StateInterfaceGenerator.generate(node, viewMetadata.viewName, sourceFile, viewStateMembers, parentInfo === null || parentInfo === void 0 ? void 0 : parentInfo.baseStateInterfaceName);
404
444
  const isViewState = true;
405
445
  if (isViewState) {
406
- const stateInterface = `${targetViewName}State`;
446
+ const usesGenericsInState = ((_c = (_b = node.typeParameters) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : 0) > 0 && viewStateMembers.some((m) => {
447
+ const t = m.type;
448
+ if (!t)
449
+ return false;
450
+ const txt = t.getText(sourceFile);
451
+ return (node.typeParameters || []).some(tp => txt.includes(tp.name.getText(sourceFile)));
452
+ });
453
+ const stateInterface = `${targetViewName}State${usesGenericsInState ? typeParamUsage : ''}`;
407
454
  const structClassName = getTargetStructClassName(targetViewName);
408
455
  const generatorFunctionName = targetViewName;
409
456
  const requiredImportsMap = getImports(sourceFile);
410
457
  const usedImports = new Set();
458
+ // Ensure types used in generic parameter constraints/defaults are imported (e.g., ISGNGroup)
459
+ for (const tp of typeParams) {
460
+ if (tp.constraint) {
461
+ usedImports.add(getTypeName(tp.constraint));
462
+ }
463
+ if (tp.default) {
464
+ usedImports.add(getTypeName(tp.default));
465
+ }
466
+ }
411
467
  if (parentInfo) {
412
- baseStructClass = `_${parentInfo.baseStructClassName}<T>`;
468
+ baseStructClass = `_${parentInfo.baseStructClassName}<${stateInterface}>`;
413
469
  usedImports.add(parentInfo.baseStructClassName);
414
470
  usedImports.add(`_${parentInfo.baseStructClassName}`);
415
471
  usedImports.add(parentInfo.baseStateInterfaceName);
@@ -417,6 +473,9 @@ function generateStructForSource(sourceCode, fileName, rootProjectPath, readFile
417
473
  imports.set(`_${parentInfo.baseStructClassName}`, parentInfo.importPath);
418
474
  imports.set(parentInfo.baseStateInterfaceName, parentInfo.importPath);
419
475
  }
476
+ else {
477
+ baseStructClass = `ViewStruct<${stateInterface}>`;
478
+ }
420
479
  const structMethods = viewStateMembers.map((member) => {
421
480
  const memberName = member.name.getText();
422
481
  const memberType = getMemberType(member, sourceFile);
@@ -494,20 +553,29 @@ function generateStructForSource(sourceCode, fileName, rootProjectPath, readFile
494
553
  usedImports.delete('FocusChildChangeEvent');
495
554
  usedImports.delete(viewClassName);
496
555
  imports.delete(viewClassName);
556
+ // Prevent self-import of the generated state interface in its own file
557
+ const selfStateName = `${targetViewName}State`;
558
+ usedImports.delete(selfStateName);
559
+ imports.delete(selfStateName);
497
560
  // Remove generic type parameters from imports (e.g., T)
498
561
  const genericParams = new Set((node.typeParameters || []).map(p => p.name.getText()));
499
562
  genericParams.forEach(p => usedImports.delete(p));
500
- let generatedStruct = `\n\n/* eslint-disable */ WTF WTF\nimport { ${viewClassName} } from '${viewMetadata.importFileName}';\n${Array.from(usedImports)
563
+ let generatedStruct = `\n\n/* eslint-disable */\nimport { ${viewClassName} } from '${viewMetadata.importFileName}';\n${Array.from(usedImports)
501
564
  .filter((type) => !exportedTypes.has(type))
502
565
  .map((type) => `import { ${type} } from '${imports.get(type)}';`)
503
566
  .join('\n')}\nimport { FocusChildChangeEvent, ViewStruct, ViewState } from '${relativePathToViewApi}';\nimport { AppUtils } from '${relativePathToAppUtils}';\nimport { IInstancePool, IReusable } from '${relativePathToInstancePool}';\nimport { hs_struct } from '${relativePathToHsStruct}';\n\n${Array.from(exportedTypes)
504
567
  .map((type) => `import { ${type} } from './${baseFileName}';`)
505
- .join('\n')}\n\nexport class _${structClassName}<T extends ${stateInterface}> extends ${baseStructClass} {\n __viewClassName = '${viewClassName}';\n ${structMethods.join('\n')}\n override createHosannaView(): any {\n const view = AppUtils.resolve<IInstancePool>('instancePool').get('${viewClassName}', ${viewClassName} as unknown as new() => IReusable);\n return view;\n }\n}\n\n@hs_struct("${structClassName}"${isAggregateView ? ', true' : ''})\nexport class ${structClassName} extends _${structClassName}<${stateInterface}> {\n}\n`;
568
+ .join('\n')}\n\nexport class _${structClassName}${typeParamDecl} extends ${baseStructClass} {\n __viewClassName = '${viewClassName}';\n ${structMethods.join('\n')}\n override createHosannaView(): any {\n const view = AppUtils.resolve<IInstancePool>('instancePool').get('${viewClassName}', ${viewClassName} as unknown as new() => IReusable);\n return view;\n }\n}\n\n@hs_struct("${structClassName}"${isAggregateView ? ', true' : ''})\nexport class ${structClassName}${typeParamDecl} extends _${structClassName}${typeParamUsage} {\n}\n`;
506
569
  if (isAggregateView) {
507
- generatedStruct += `\nexport function ${generatorFunctionName}(children: ViewStruct<ViewState>[]) {\n const struct = AppUtils.resolve<IInstancePool>('instancePool').get<${structClassName}>("${structClassName}", ${structClassName} as unknown as new() => IReusable);\n struct.setState({} as any);\n return struct.children(children);\n}`;
570
+ generatedStruct += `\nexport function ${generatorFunctionName}${typeParamDecl}(children: ViewStruct<ViewState>[]) {\n const struct = AppUtils.resolve<IInstancePool>('instancePool').get<${structClassName}${typeParamUsage}>("${structClassName}", ${structClassName} as unknown as new() => ${structClassName}${typeParamUsage});
571
+ struct.setState({} as any);
572
+ return struct.children(children);
573
+ }`;
508
574
  }
509
575
  else {
510
- generatedStruct += `\n\nexport function ${generatorFunctionName}(state?: ${stateInterface}): ${structClassName} {\n const struct = AppUtils.resolve<IInstancePool>('instancePool').get<${structClassName}>("${structClassName}", ${structClassName} as unknown as new() => IReusable);\n struct.setState(state as any);\n return struct;\n}\n`;
576
+ generatedStruct += `\n\nexport function ${generatorFunctionName}${typeParamDecl}(state?: ${stateInterface}): ${structClassName}${typeParamUsage} {\n const struct = AppUtils.resolve<IInstancePool>('instancePool').get<${structClassName}${typeParamUsage}>("${structClassName}", ${structClassName} as unknown as new() => ${structClassName}${typeParamUsage});
577
+ struct.setState(state as any);
578
+ return struct;\n}\n`;
511
579
  }
512
580
  generatedStructs.push(generatedStruct);
513
581
  generatedStructs.push(generatedStateInterface);