@researchdatabox/redbox-dev-tools 0.0.1-beta.8936

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 (104) hide show
  1. package/README.md +255 -0
  2. package/bin/cli.js +3 -0
  3. package/bin/run-hook-mocha.js +3 -0
  4. package/bin/run-hook-tsc.js +3 -0
  5. package/bin/wrapper-webpack.js +145 -0
  6. package/config/tsconfig.base.json +16 -0
  7. package/dist/bin/run-hook-mocha.d.ts +1 -0
  8. package/dist/bin/run-hook-mocha.js +49 -0
  9. package/dist/bin/run-hook-tsc.d.ts +1 -0
  10. package/dist/bin/run-hook-tsc.js +19 -0
  11. package/dist/cli-parsers.d.ts +9 -0
  12. package/dist/cli-parsers.js +131 -0
  13. package/dist/cli.d.ts +1 -0
  14. package/dist/cli.js +464 -0
  15. package/dist/commands/form-config.d.ts +5 -0
  16. package/dist/commands/form-config.js +194 -0
  17. package/dist/completion/index.d.ts +1 -0
  18. package/dist/completion/index.js +217 -0
  19. package/dist/generators/add-method.d.ts +27 -0
  20. package/dist/generators/add-method.js +235 -0
  21. package/dist/generators/angular-app.d.ts +24 -0
  22. package/dist/generators/angular-app.js +342 -0
  23. package/dist/generators/angular-service.d.ts +21 -0
  24. package/dist/generators/angular-service.js +154 -0
  25. package/dist/generators/controller.d.ts +40 -0
  26. package/dist/generators/controller.js +195 -0
  27. package/dist/generators/form-component.d.ts +46 -0
  28. package/dist/generators/form-component.js +906 -0
  29. package/dist/generators/form-field.d.ts +15 -0
  30. package/dist/generators/form-field.js +160 -0
  31. package/dist/generators/model.d.ts +42 -0
  32. package/dist/generators/model.js +206 -0
  33. package/dist/generators/service.d.ts +16 -0
  34. package/dist/generators/service.js +111 -0
  35. package/dist/runtime-resolver.d.ts +3 -0
  36. package/dist/runtime-resolver.js +27 -0
  37. package/dist/templates/hook-archetype.d.ts +12 -0
  38. package/dist/templates/hook-archetype.js +143 -0
  39. package/dist/testing.d.ts +7 -0
  40. package/dist/testing.js +53 -0
  41. package/dist/utils/config-helper.d.ts +71 -0
  42. package/dist/utils/config-helper.js +574 -0
  43. package/dist/utils/generator.d.ts +10 -0
  44. package/dist/utils/generator.js +68 -0
  45. package/dist/utils/hook-tsconfig.d.ts +9 -0
  46. package/dist/utils/hook-tsconfig.js +104 -0
  47. package/dist/utils/paths.d.ts +10 -0
  48. package/dist/utils/paths.js +60 -0
  49. package/index.js +4 -0
  50. package/package.json +85 -0
  51. package/runtime-resolver.d.ts +1 -0
  52. package/runtime-resolver.js +3 -0
  53. package/skills/redbox-angular-apps/SKILL.md +42 -0
  54. package/skills/redbox-angular-services/SKILL.md +29 -0
  55. package/skills/redbox-controllers/SKILL.md +65 -0
  56. package/skills/redbox-feature-design-planner/SKILL.md +169 -0
  57. package/skills/redbox-feature-implementation-review/SKILL.md +117 -0
  58. package/skills/redbox-form-components/SKILL.md +114 -0
  59. package/skills/redbox-form-config/SKILL.md +34 -0
  60. package/skills/redbox-hook-development/SKILL.md +66 -0
  61. package/skills/redbox-services/SKILL.md +54 -0
  62. package/skills/redbox-test-verification/SKILL.md +38 -0
  63. package/skills/redbox-testing/SKILL.md +64 -0
  64. package/skills/redbox-web-verification/SKILL.md +71 -0
  65. package/skills/redbox-web-verification/redbox-angular-apps/SKILL.md +48 -0
  66. package/skills/redbox-web-verification/redbox-angular-services/SKILL.md +30 -0
  67. package/skills/redbox-web-verification/redbox-controllers/SKILL.md +56 -0
  68. package/skills/redbox-web-verification/redbox-form-config/SKILL.md +29 -0
  69. package/skills/redbox-web-verification/redbox-hook-development/SKILL.md +61 -0
  70. package/skills/redbox-web-verification/redbox-services/SKILL.md +45 -0
  71. package/skills/redbox-web-verification/redbox-testing/SKILL.md +53 -0
  72. package/skills/redbox-web-verification/redbox-web-verification/SKILL.md +47 -0
  73. package/templates/hook-archetype/standard/.gitignore.hbs +4 -0
  74. package/templates/hook-archetype/standard/.npmignore.hbs +3 -0
  75. package/templates/hook-archetype/standard/.npmrc.hbs +6 -0
  76. package/templates/hook-archetype/standard/.nvmrc.hbs +1 -0
  77. package/templates/hook-archetype/standard/AGENTS.md.hbs +34 -0
  78. package/templates/hook-archetype/standard/Dockerfile.hbs +28 -0
  79. package/templates/hook-archetype/standard/README.md.hbs +39 -0
  80. package/templates/hook-archetype/standard/assets/fonts/.gitkeep +1 -0
  81. package/templates/hook-archetype/standard/language-defaults/.gitkeep +1 -0
  82. package/templates/hook-archetype/standard/package.json.hbs +40 -0
  83. package/templates/hook-archetype/standard/src/api/controllers/ExampleController.ts.hbs +21 -0
  84. package/templates/hook-archetype/standard/src/api/controllers/index.ts.hbs +23 -0
  85. package/templates/hook-archetype/standard/src/api/services/ExampleService.ts.hbs +22 -0
  86. package/templates/hook-archetype/standard/src/api/services/index.ts.hbs +23 -0
  87. package/templates/hook-archetype/standard/src/config/brandingConfigurationDefaults.ts.hbs +9 -0
  88. package/templates/hook-archetype/standard/src/config/reusableFormDefinitions.ts.hbs +6 -0
  89. package/templates/hook-archetype/standard/src/form-config/default-1.0-draft.ts.hbs +20 -0
  90. package/templates/hook-archetype/standard/src/form-config/index.ts.hbs +8 -0
  91. package/templates/hook-archetype/standard/src/index.ts.hbs +55 -0
  92. package/templates/hook-archetype/standard/support/bootstrap-data/.gitkeep +1 -0
  93. package/templates/hook-archetype/standard/support/development/docker-compose.yml.hbs +75 -0
  94. package/templates/hook-archetype/standard/support/integration-testing/docker-compose.mocha.yml.hbs +84 -0
  95. package/templates/hook-archetype/standard/support/integration-testing/run-mocha-hook.sh.hbs +9 -0
  96. package/templates/hook-archetype/standard/test/integration/hook-registration.test.ts.hbs +13 -0
  97. package/templates/hook-archetype/standard/test/support/globals.ts.hbs +40 -0
  98. package/templates/hook-archetype/standard/test/tsconfig.json.hbs +8 -0
  99. package/templates/hook-archetype/standard/test/unit/.mocharc.cjs.hbs +9 -0
  100. package/templates/hook-archetype/standard/test/unit/index.test.ts.hbs +40 -0
  101. package/templates/hook-archetype/standard/tsconfig.json.hbs +15 -0
  102. package/templates/hook-archetype/standard/views/.gitkeep +1 -0
  103. package/testing.d.ts +1 -0
  104. package/testing.js +3 -0
@@ -0,0 +1,195 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ControllerGenerator = void 0;
37
+ const path = __importStar(require("path"));
38
+ const ts_morph_1 = require("ts-morph");
39
+ const generator_1 = require("../utils/generator");
40
+ const config_helper_1 = require("../utils/config-helper");
41
+ class ControllerGenerator extends generator_1.Generator {
42
+ name;
43
+ className;
44
+ actions;
45
+ webservice;
46
+ routes;
47
+ auth;
48
+ navigation;
49
+ languageDefaults;
50
+ paths;
51
+ project;
52
+ constructor(options) {
53
+ super(options);
54
+ this.name = options.name;
55
+ this.actions = options.actions || [];
56
+ this.webservice = !!options.webservice;
57
+ this.auth = options.auth;
58
+ this.navigation = options.navigation || [];
59
+ this.languageDefaults = options.languageDefaults || [];
60
+ this.paths = options.paths;
61
+ const inferredClassName = this.name.endsWith('Controller') ? this.name.replace('Controller', '') : this.name;
62
+ this.className = options.className || inferredClassName;
63
+ this.project = new ts_morph_1.Project({
64
+ manipulationSettings: {
65
+ quoteKind: ts_morph_1.QuoteKind.Single,
66
+ },
67
+ });
68
+ this.validateActions();
69
+ // Handle backwards compatibility: convert single route to routes array
70
+ if (options.routes && options.routes.length > 0) {
71
+ this.routes = options.routes;
72
+ }
73
+ else if (options.route) {
74
+ // Legacy: single route maps to first action or 'index'
75
+ const action = (this.actions && this.actions.length > 0) ? this.actions[0] : 'index';
76
+ this.routes = [{ action, path: options.route, verb: 'get' }];
77
+ }
78
+ else {
79
+ this.routes = [];
80
+ }
81
+ }
82
+ async generate() {
83
+ const controllerName = this.name.endsWith('Controller') ? this.name : `${this.name}Controller`;
84
+ const className = this.className;
85
+ const controllerDir = path.join(this.paths.coreTypes, 'src', 'controllers', this.webservice ? 'webservice' : '');
86
+ const controllerPath = path.join(controllerDir, `${controllerName}.ts`);
87
+ const content = this.generateControllerContent(className);
88
+ this.writeFile(controllerPath, content);
89
+ if (!this.dryRun) {
90
+ await (0, config_helper_1.updateControllerIndex)({
91
+ project: this.project,
92
+ paths: this.paths,
93
+ root: this.root,
94
+ controllerName: controllerName,
95
+ className: className,
96
+ webservice: this.webservice,
97
+ dryRun: this.dryRun
98
+ });
99
+ // Process each route mapping
100
+ for (const routeMapping of this.routes) {
101
+ const routeKey = routeMapping.verb
102
+ ? `${routeMapping.verb.toLowerCase()} ${routeMapping.path}`
103
+ : routeMapping.path;
104
+ await (0, config_helper_1.updateRoutes)({
105
+ project: this.project,
106
+ paths: this.paths,
107
+ root: this.root,
108
+ route: routeKey,
109
+ controllerName: controllerName,
110
+ action: routeMapping.action,
111
+ webservice: this.webservice,
112
+ csrf: routeMapping.csrf,
113
+ dryRun: this.dryRun
114
+ });
115
+ // Apply auth rules: use route-specific auth if provided, otherwise controller-level auth
116
+ const routeAuth = routeMapping.auth || this.auth;
117
+ if (routeAuth && routeAuth.length > 0) {
118
+ await (0, config_helper_1.updateAuth)({
119
+ project: this.project,
120
+ paths: this.paths,
121
+ root: this.root,
122
+ route: routeKey,
123
+ auth: routeAuth,
124
+ dryRun: this.dryRun
125
+ });
126
+ }
127
+ }
128
+ if (this.navigation.length > 0) {
129
+ for (const nav of this.navigation) {
130
+ const actionName = nav.action || (this.routes.length === 1 ? this.routes[0].action : (this.actions.length === 1 ? this.actions[0] : undefined));
131
+ if (!actionName) {
132
+ console.warn(' [NAV] Navigation mapping missing action and cannot be inferred. Skipping.');
133
+ continue;
134
+ }
135
+ const routeMapping = this.routes.find(r => r.action === actionName);
136
+ if (!routeMapping) {
137
+ console.warn(` [NAV] No route mapping found for action '${actionName}'. Skipping.`);
138
+ continue;
139
+ }
140
+ await (0, config_helper_1.updateNavigationConfig)({
141
+ project: this.project,
142
+ paths: this.paths,
143
+ root: this.root,
144
+ mapping: {
145
+ ...nav,
146
+ href: routeMapping.path
147
+ },
148
+ dryRun: this.dryRun
149
+ });
150
+ }
151
+ }
152
+ if (this.languageDefaults.length > 0) {
153
+ await (0, config_helper_1.updateLanguageDefaults)({
154
+ root: this.root,
155
+ entries: this.languageDefaults,
156
+ dryRun: this.dryRun
157
+ });
158
+ }
159
+ }
160
+ }
161
+ generateControllerContent(className) {
162
+ const importPath = this.webservice ? '../../index' : '../index';
163
+ const actionsCode = this.actions.map(action => `
164
+ public async ${action}(req: Sails.Req, res: Sails.Res): Promise<unknown> {
165
+ return this.sendResp(req, res, { data: { message: 'Action ${action} in ${className}' } });
166
+ }`).join('\n');
167
+ const exportedMethods = ['init', ...this.actions].map(a => `'${a}'`).join(',\n ');
168
+ return `import { Controllers as controllers } from '${importPath}';
169
+
170
+ export namespace Controllers {
171
+ export class ${className} extends controllers.Core.Controller {
172
+
173
+ protected override _exportedMethods: string[] = [
174
+ ${exportedMethods}
175
+ ];
176
+
177
+ public init(): void {
178
+ // Initialize services here
179
+ }
180
+ ${actionsCode}
181
+ }
182
+ }
183
+ `;
184
+ }
185
+ validateActions() {
186
+ const invalidActions = this.actions.filter(action => !this.isValidIdentifier(action));
187
+ if (invalidActions.length > 0) {
188
+ throw new Error(`Invalid action name(s): ${invalidActions.join(', ')}`);
189
+ }
190
+ }
191
+ isValidIdentifier(name) {
192
+ return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(name);
193
+ }
194
+ }
195
+ exports.ControllerGenerator = ControllerGenerator;
@@ -0,0 +1,46 @@
1
+ import { Generator, GeneratorOptions } from '../utils/generator';
2
+ import { RedboxPaths } from '../utils/paths';
3
+ export interface FormComponentGeneratorOptions extends GeneratorOptions {
4
+ name: string;
5
+ app?: string;
6
+ withService?: boolean;
7
+ paths: RedboxPaths;
8
+ }
9
+ export declare class FormComponentGenerator extends Generator {
10
+ private readonly rawName;
11
+ private readonly app;
12
+ private readonly withService;
13
+ private readonly paths;
14
+ private readonly kebabName;
15
+ private readonly pascalName;
16
+ private readonly componentClassName;
17
+ private readonly modelClassName;
18
+ private readonly componentNameConstant;
19
+ private readonly modelNameConstant;
20
+ constructor(options: FormComponentGeneratorOptions);
21
+ generate(): Promise<void>;
22
+ private toKebabCase;
23
+ private toPascalCase;
24
+ private readFile;
25
+ private updateTextFile;
26
+ private insertBeforeMarker;
27
+ private ensureImport;
28
+ private appendToObjectLiteral;
29
+ private appendToArrayLiteral;
30
+ private findMatchingDelimiter;
31
+ private generateSailsNgCommonComponentFiles;
32
+ private generateAngularComponentFiles;
33
+ private generateAngularServiceFiles;
34
+ private updateSailsNgCommonDictionaries;
35
+ private updateSailsNgCommonIndex;
36
+ private updateBaseVisitors;
37
+ private updateConcreteVisitors;
38
+ private updateClientVisitor;
39
+ private updateDataValueVisitor;
40
+ private updateJsonTypeDefVisitor;
41
+ private updateValidatorVisitor;
42
+ private updateTemplateVisitor;
43
+ private updateConstructVisitor;
44
+ private updateMigrateVisitor;
45
+ private updateAngularWiring;
46
+ }