@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.
- package/dist/build-info.json +3 -1
- package/dist/cli.js +161 -106
- package/dist/cli.js.map +1 -1
- package/dist/generation/StateInterfaceGenerator.js +10 -2
- package/dist/generation/StateInterfaceGenerator.js.map +1 -1
- package/dist/generation/struct-generator.js +87 -19
- package/dist/generation/struct-generator.js.map +1 -1
- package/dist/lib/env-info.d.ts +9 -0
- package/dist/lib/env-info.js +132 -0
- package/dist/lib/env-info.js.map +1 -0
- package/dist/support-tools/command-debugger.d.ts +11 -0
- package/dist/support-tools/command-debugger.js +219 -0
- package/dist/support-tools/command-debugger.js.map +1 -0
- package/dist/support-tools/dev-runner.d.ts +7 -0
- package/dist/support-tools/dev-runner.js +139 -0
- package/dist/support-tools/dev-runner.js.map +1 -0
- package/package.json +9 -5
package/dist/build-info.json
CHANGED
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
|
-
//
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
.
|
|
69
|
-
.
|
|
70
|
-
|
|
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
|
-
|
|
76
|
-
|
|
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
|
-
|
|
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
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,gCAAgC;AAChC,mDAAqC;AACrC,2CAA6B;AAC7B,uCAAyB;AACzB,sEAA8D;AAC9D,kDAA0B;AAC1B,2CAAwC;AACxC,0EAAmI;AACnI,6DAAsG;AACtG,0EAA2E;
|
|
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
|
-
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uDAAuD;AACvD,+CAAiC;AAEjC,MAAa,uBAAuB;IAClC,MAAM,CAAC,QAAQ,CAAC,aAAkC,EAAE,QAAgB,EAAE,UAAyB,EAAE,OAAkB,EAAE,qBAA6B,WAAW;;QAC3J,MAAM,WAAW,GAAqC,EAAE,CAAC;QAEzD,KAAK,MAAM,MAAM,IAAI,aAAa,CAAC,OAAO,EAAE;YAC1C,IAAI,CAAC,EAAE,CAAC,qBAAqB,CAAC,MAAM,CAAC;gBAAE,SAAS;YAEhD,oCAAoC;YACpC,IACE,MAAM,CAAC,SAAS;gBAChB,MAAM,CAAC,SAAS,CAAC,IAAI,CACnB,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,cAAc;oBACzC,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAC9C,EACD;gBACA,SAAS;aACV;YAED,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YACzC,IAAI,CAAC,UAAU,EAAE;gBACf,SAAS;aACV;YAED,MAAM,IAAI,GAAG,MAAC,MAAM,CAAC,IAAsB,0CAAE,IAAI,CAAC;YAClD,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,IAAI,QAAQ,GAAG,KAAK,CAAC;YAErB,IAAI,MAAM,CAAC,IAAI,EAAE;gBACf,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;aAC5C;iBAAM,IAAI,MAAM,CAAC,WAAW,EAAE;gBAC7B,QAAQ,GAAG,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;aAC9D;YAED,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;SAC5C;QAED,MAAM,aAAa,GAAG,GAAG,QAAQ,OAAO,CAAC;QAEzC,MAAM,aAAa,GAAG,WAAW;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC;aACtC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,OAAO,oBAAoB,aAAa,YAAY,kBAAkB,OAAO,aAAa,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"StateInterfaceGenerator.js","sourceRoot":"","sources":["../../src/generation/StateInterfaceGenerator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uDAAuD;AACvD,+CAAiC;AAEjC,MAAa,uBAAuB;IAClC,MAAM,CAAC,QAAQ,CAAC,aAAkC,EAAE,QAAgB,EAAE,UAAyB,EAAE,OAAkB,EAAE,qBAA6B,WAAW;;QAC3J,MAAM,WAAW,GAAqC,EAAE,CAAC;QAEzD,KAAK,MAAM,MAAM,IAAI,aAAa,CAAC,OAAO,EAAE;YAC1C,IAAI,CAAC,EAAE,CAAC,qBAAqB,CAAC,MAAM,CAAC;gBAAE,SAAS;YAEhD,oCAAoC;YACpC,IACE,MAAM,CAAC,SAAS;gBAChB,MAAM,CAAC,SAAS,CAAC,IAAI,CACnB,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,cAAc;oBACzC,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAC9C,EACD;gBACA,SAAS;aACV;YAED,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YACzC,IAAI,CAAC,UAAU,EAAE;gBACf,SAAS;aACV;YAED,MAAM,IAAI,GAAG,MAAC,MAAM,CAAC,IAAsB,0CAAE,IAAI,CAAC;YAClD,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,IAAI,QAAQ,GAAG,KAAK,CAAC;YAErB,IAAI,MAAM,CAAC,IAAI,EAAE;gBACf,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;aAC5C;iBAAM,IAAI,MAAM,CAAC,WAAW,EAAE;gBAC7B,QAAQ,GAAG,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;aAC9D;YAED,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;SAC5C;QAED,MAAM,UAAU,GAAG,MAAA,aAAa,CAAC,cAAc,mCAAI,EAAE,CAAC;QACtD,MAAM,iBAAiB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAClH,MAAM,yBAAyB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1I,MAAM,aAAa,GAAG,GAAG,QAAQ,OAAO,CAAC;QAEzC,MAAM,aAAa,GAAG,WAAW;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC;aACtC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,gGAAgG;QAChG,MAAM,cAAc,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QACzE,MAAM,mBAAmB,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEnI,sGAAsG;QACtG,MAAM,aAAa,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC,yBAAyB,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClG,OAAO,oBAAoB,aAAa,GAAG,aAAa,YAAY,kBAAkB,OAAO,aAAa,OAAO,CAAC;IACpH,CAAC;IAEO,MAAM,CAAC,gBAAgB,CAAC,SAAuB;QACrD,IAAI,EAAE,CAAC,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE;YAC7C,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC;YAC7C,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;gBACzB,OAAO,IAAI,CAAC,IAAI,CAAC;aAClB;SACF;aAAM,IAAI,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE;YAChD,OAAO,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC;SAClC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,MAAM,CAAC,wBAAwB,CAAC,WAA0B;QAChE,QAAQ,WAAW,CAAC,IAAI,EAAE;YACxB,KAAK,EAAE,CAAC,UAAU,CAAC,aAAa;gBAC9B,OAAO,QAAQ,CAAC;YAClB,KAAK,EAAE,CAAC,UAAU,CAAC,cAAc;gBAC/B,OAAO,QAAQ,CAAC;YAClB,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;YAC/B,KAAK,EAAE,CAAC,UAAU,CAAC,YAAY;gBAC7B,OAAO,SAAS,CAAC;YACnB,KAAK,EAAE,CAAC,UAAU,CAAC,sBAAsB;gBACvC,OAAO,OAAO,CAAC;YACjB,KAAK,EAAE,CAAC,UAAU,CAAC,uBAAuB;gBACxC,OAAO,qBAAqB,CAAC;YAC/B;gBACE,OAAO,KAAK,CAAC;SAChB;IACH,CAAC;CACF;AAtFD,0DAsFC;AAID,SAAS,aAAa,CAAC,IAAa;;IAClC,KAAK,MAAM,QAAQ,IAAK,IAAY,CAAC,SAAS,IAAI,EAAE,EAAE;QACpD,IAAI,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE;YAC5B,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,gBAAgB,CAAC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,UAAU,CAAC,KAAI,MAAC,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,UAAU,0CAAE,UAAkB,0CAAE,IAAI,CAAA,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,UAAU,CAAC,KAAI,MAAC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,UAAkB,0CAAE,IAAI,CAAA,CAAC,CAAC;YAC9L,IAAI,IAAI,KAAK,OAAO,EAAE;gBACpB,OAAO,OAAO,CAAC;aAChB;iBAAM,IAAI,IAAI,KAAK,aAAa,EAAE;gBACjC,OAAO,aAAa,CAAC;aACtB;iBAAM,IAAI,IAAI,KAAK,aAAa,EAAE;gBACjC,OAAO,aAAa,CAAC;aACtB;iBAAM,IAAI,IAAI,KAAK,YAAY,EAAE;gBAChC,OAAO,YAAY,CAAC;aACrB;iBAAM,IAAI,IAAI,KAAK,kBAAkB,EAAE;gBACtC,OAAO,kBAAkB,CAAC;aAC3B;SACF;KAEF;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -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
|
-
|
|
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
|
|
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}
|
|
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 */
|
|
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}
|
|
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}
|
|
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
|
-
|
|
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() =>
|
|
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
|
-
|
|
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
|
|
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}
|
|
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
|
|
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}
|
|
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() =>
|
|
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() =>
|
|
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);
|