bpm-core 0.0.129 → 0.0.130

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 (75) hide show
  1. package/README.md +57 -4
  2. package/cli/deploy/build.js +1 -1
  3. package/cli/deploy/git-operations-handler.js +1 -1
  4. package/cli/deploy/index.js +1 -1
  5. package/cli/generate/index.js +2 -0
  6. package/cli/generate/mock/index.js +17 -15
  7. package/cli/generate/new/angular-template/.editorconfig +13 -0
  8. package/cli/generate/new/angular-template/README.md +7 -0
  9. package/cli/generate/new/angular-template/angular.json.ejs +167 -0
  10. package/cli/generate/new/angular-template/build.sh +6 -0
  11. package/cli/generate/new/angular-template/extra-webpack.config.js.ejs +5 -0
  12. package/cli/generate/new/angular-template/karma.conf.js +44 -0
  13. package/cli/generate/new/angular-template/package.json.ejs +67 -0
  14. package/cli/generate/new/angular-template/protractor.conf.js +28 -0
  15. package/cli/generate/new/angular-template/src/app/app.component.html +35 -0
  16. package/cli/generate/new/angular-template/src/app/app.component.scss +0 -0
  17. package/cli/generate/new/angular-template/src/app/app.component.ts +81 -0
  18. package/cli/generate/new/angular-template/src/app/config/segment-dynamic-loader.config.ts.ejs +8 -0
  19. package/cli/generate/new/angular-template/src/app/i18n/ar.ts.ejs +18 -0
  20. package/cli/generate/new/angular-template/src/app/i18n/en.ts.ejs +18 -0
  21. package/cli/generate/new/angular-template/src/app/page-components/@@comp-template@@/@@.component.html.ejs +33 -0
  22. package/cli/generate/new/angular-template/src/app/page-components/@@comp-template@@/@@.component.ts.ejs +128 -0
  23. package/cli/generate/new/angular-template/src/app/page-components/@@comp-template@@/_html-field.ejs +97 -0
  24. package/cli/generate/new/angular-template/src/app/page-components/@@comp-template@@/_html-table.ejs +27 -0
  25. package/cli/generate/new/angular-template/src/app/page-components/@@comp-template@@/_ts-field.ejs +3 -0
  26. package/cli/generate/new/angular-template/src/app/shared/pipes/translate.pipe.ts +32 -0
  27. package/cli/generate/new/angular-template/src/app/shared/services/i18n.service.ts +32 -0
  28. package/cli/generate/new/angular-template/src/app/shared/services/segment-dynamic-loader.service.ts.ejs +49 -0
  29. package/cli/generate/new/angular-template/src/app/shared/services/state-machine.service.ts +119 -0
  30. package/cli/generate/new/angular-template/src/app/shared/types/lov.enum.ts.ejs +7 -0
  31. package/cli/generate/new/angular-template/src/app/templates/print-section/print-section.component.html +5 -0
  32. package/cli/generate/new/angular-template/src/app/templates/print-section/print-section.component.scss +0 -0
  33. package/cli/generate/new/angular-template/src/app/templates/print-section/print-section.component.ts.ejs +156 -0
  34. package/cli/generate/new/angular-template/src/app/templates/print.ts.ejs +392 -0
  35. package/cli/generate/new/angular-template/src/environments/environment.local.ts.ejs +40 -0
  36. package/cli/generate/new/angular-template/src/environments/environment.prod.ts +25 -0
  37. package/cli/generate/new/angular-template/src/environments/environment.ts +25 -0
  38. package/cli/generate/new/angular-template/src/favicon.ico +0 -0
  39. package/cli/generate/new/angular-template/src/index.html.ejs +14 -0
  40. package/cli/generate/new/angular-template/src/main.ts +49 -0
  41. package/cli/generate/new/angular-template/src/polyfills.ts +65 -0
  42. package/cli/generate/new/angular-template/src/styles.scss.ejs +121 -0
  43. package/cli/generate/new/angular-template/src/test.ts +26 -0
  44. package/cli/generate/new/angular-template/tsconfig.app.json +15 -0
  45. package/cli/generate/new/angular-template/tsconfig.json +50 -0
  46. package/cli/generate/new/angular-template/tsconfig.spec.json +18 -0
  47. package/cli/generate/new/angular-template/tslint.json +143 -0
  48. package/cli/generate/new/copy-and-generate.js +120 -0
  49. package/cli/generate/new/field.js +4 -0
  50. package/cli/generate/new/index.js +47 -0
  51. package/cli/generate/new/service-data.js +284 -0
  52. package/fesm2022/bpm-core.mjs +244 -252
  53. package/fesm2022/bpm-core.mjs.map +1 -1
  54. package/lib/components/shared-components/form-field/attachment-section/attachment-section.component.d.ts +1 -2
  55. package/lib/components/shared-components/form-field/control-value-accessor.directive.d.ts +4 -4
  56. package/lib/components/shared-components/form-field/index.d.ts +0 -1
  57. package/lib/components/shared-components/form-field/input/input.component.d.ts +3 -2
  58. package/lib/components/shared-components/form-field/input-number/input-number.component.d.ts +2 -0
  59. package/lib/components/shared-components/form-field/radio/radio.component.d.ts +39 -2
  60. package/lib/components/shared-components/form-field/search-employee/search-employee.component.d.ts +5 -5
  61. package/lib/components/shared-components/form-field/shared-imports.d.ts +1 -4
  62. package/lib/components/shared-components/form-field/textarea/textarea.component.d.ts +76 -1
  63. package/lib/components/shared-components/table/table.component.d.ts +3 -3
  64. package/lib/{components/shared-components/form-field/input → directives}/input-map-filter/input-filters.d.ts +1 -0
  65. package/lib/{components/shared-components/form-field/input → directives}/input-map-filter/input-map-filter.directive.d.ts +4 -1
  66. package/lib/testComponent/request-details-section/request-details-section.component.d.ts +8 -3
  67. package/package.json +7 -2
  68. package/public-api.d.ts +1 -0
  69. package/lib/directives/ar.directive.d.ts +0 -11
  70. package/lib/directives/en.directive.d.ts +0 -11
  71. package/lib/directives/number.directive.d.ts +0 -14
  72. /package/cli/{deploy → utilities}/utilities.js +0 -0
  73. /package/lib/{components/shared-components/form-field/input → directives}/input-map-filter/index.d.ts +0 -0
  74. /package/lib/{components/shared-components/form-field/input → directives}/input-map-filter/input-mappers.d.ts +0 -0
  75. /package/lib/{components/shared-components/form-field/input → directives}/input-map-filter/types.d.ts +0 -0
@@ -0,0 +1,120 @@
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 (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.main = main;
30
+ const fs = __importStar(require("fs"));
31
+ const path = __importStar(require("path"));
32
+ const ejs_1 = __importDefault(require("ejs"));
33
+ const prettier_1 = require("prettier");
34
+ const util_1 = require("util");
35
+ const utilities_1 = require("../../utilities/utilities");
36
+ const renderEjsFile = (0, util_1.promisify)(ejs_1.default.renderFile);
37
+ const sourceDir = path.join(__dirname, 'angular-template');
38
+ const destDir = process.cwd();
39
+ ;
40
+ function formatWithPrettier(content, fileName) {
41
+ const splitFileName = fileName.split('.');
42
+ const fileExtension = splitFileName[splitFileName.length - 1];
43
+ const parserTyp = {
44
+ 'html': 'html',
45
+ 'ts': 'typescript',
46
+ 'css': 'css',
47
+ 'scss': 'scss'
48
+ };
49
+ if (!parserTyp[fileExtension])
50
+ return Promise.resolve(content);
51
+ return (0, prettier_1.format)(content, { parser: parserTyp[fileExtension], printWidth: 120 });
52
+ }
53
+ async function processTemplateFiles(src, dest, serviceData) {
54
+ if (!fs.existsSync(dest))
55
+ fs.mkdirSync(dest, { recursive: true });
56
+ const entries = fs.readdirSync(src);
57
+ for (const entry of entries) {
58
+ const srcPath = path.join(src, entry);
59
+ const stats = fs.statSync(srcPath);
60
+ if (stats.isDirectory()) {
61
+ if (entry === '@@comp-template@@') {
62
+ const srcPathForPageComponents = src;
63
+ const destPathForPageComponents = dest;
64
+ await writePageComponents(srcPathForPageComponents, destPathForPageComponents, serviceData);
65
+ continue;
66
+ }
67
+ const subDest = path.join(dest, entry);
68
+ await processTemplateFiles(srcPath, subDest, serviceData);
69
+ }
70
+ else if (stats.isFile()) {
71
+ const isEjs = entry.endsWith('.ejs');
72
+ const outputFilename = isEjs ? entry.slice(0, -4) : entry;
73
+ const destPath = path.join(dest, outputFilename);
74
+ if (isEjs) {
75
+ const result = await renderEjsFile(srcPath, serviceData);
76
+ if (result && result.trim()) {
77
+ const formattedResult = await formatWithPrettier(result, destPath);
78
+ fs.writeFileSync(destPath, formattedResult, 'utf8');
79
+ }
80
+ }
81
+ else {
82
+ fs.copyFileSync(srcPath, destPath);
83
+ }
84
+ }
85
+ }
86
+ }
87
+ async function writePageComponents(src, dest, serviceData) {
88
+ if (!fs.existsSync(dest))
89
+ fs.mkdirSync(dest, { recursive: true });
90
+ const templateWrapperPath = path.join(src, '@@comp-template@@');
91
+ const entries = fs.readdirSync(templateWrapperPath);
92
+ for (const compInfo of serviceData.getPageComponents()) {
93
+ for (const entry of entries) {
94
+ if (entry.startsWith('_'))
95
+ continue;
96
+ const filePath = path.join(templateWrapperPath, entry);
97
+ let result = await renderEjsFile(filePath, compInfo);
98
+ const fileSuffix = entry.match(/@@(?<suffix>.+).ejs/)?.groups?.suffix;
99
+ const fileName = compInfo.componentNameKebab + fileSuffix;
100
+ const dir = path.join(dest, compInfo.componentNameKebab);
101
+ const destPath = path.join(dir, fileName);
102
+ if (!fs.existsSync(dir))
103
+ fs.mkdirSync(dir, { recursive: true });
104
+ if (fileSuffix.endsWith('.ts')) {
105
+ result = compInfo.importsManager.renderImports(result);
106
+ }
107
+ const formattedResult = await formatWithPrettier(result, fileName);
108
+ fs.writeFileSync(destPath, formattedResult, 'utf8');
109
+ }
110
+ }
111
+ }
112
+ async function main(serviceData) {
113
+ const logger = new utilities_1.Logger();
114
+ try {
115
+ await logger.asyncLog('Generating the service...')(processTemplateFiles(sourceDir, destDir, serviceData), `${serviceData.serviceCode} Service Generated.`, 'Service Generation Failed.');
116
+ }
117
+ catch (err) {
118
+ console.log(`${err.message} ${(err.cause?.message || err.cause) ? 'because ' + (err.cause?.message || err.cause) : ''}`);
119
+ }
120
+ }
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ ;
4
+ ;
@@ -0,0 +1,47 @@
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 (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.generateNewProjectCommand = void 0;
27
+ const commander_1 = require("commander");
28
+ const copy_and_generate_1 = require("./copy-and-generate");
29
+ const path = __importStar(require("path"));
30
+ const fs = __importStar(require("fs"));
31
+ const service_data_1 = require("./service-data");
32
+ exports.generateNewProjectCommand = new commander_1.Command('new');
33
+ exports.generateNewProjectCommand.description('Generate a new project based on the provided config, like the form builder');
34
+ exports.generateNewProjectCommand.alias('n');
35
+ exports.generateNewProjectCommand.requiredOption('--config <string>', 'Path to config file');
36
+ exports.generateNewProjectCommand.requiredOption('--service-code <string>', 'Service Code');
37
+ exports.generateNewProjectCommand.action((options) => {
38
+ const cwd = process.cwd();
39
+ const configPath = path.join(cwd, options.config);
40
+ const serviceCode = options.serviceCode;
41
+ if (!fs.existsSync(configPath)) {
42
+ throw new Error(`Config file not found: ${configPath}`);
43
+ }
44
+ const configContent = fs.readFileSync(configPath, 'utf-8');
45
+ const config = JSON.parse(configContent);
46
+ (0, copy_and_generate_1.main)(new service_data_1.ServiceData(serviceCode, config));
47
+ });
@@ -0,0 +1,284 @@
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 (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.ServiceData = void 0;
27
+ const changeCase = __importStar(require("change-case"));
28
+ class ServiceData {
29
+ constructor(serviceCode, stages) {
30
+ this.serviceCode = serviceCode;
31
+ this.stages = stages;
32
+ this.visibilityCodeLOVEnums = this.parseLOVEnums();
33
+ this.changeCase = changeCase;
34
+ this.en = {};
35
+ this.ar = {};
36
+ this.addI18n();
37
+ }
38
+ getPageComponents() {
39
+ return Object.entries(this.stages).map(([key, value]) => {
40
+ return {
41
+ componentNameKebab: `${changeCase.kebabCase(key)}-section`,
42
+ componentNamePascal: `${changeCase.pascalCase(key)}Section`,
43
+ fields: value.fields,
44
+ getCommonAttributes(field) {
45
+ const attrs = {
46
+ class: "section-item",
47
+ formControlName: field.fieldName,
48
+ "[label]": `'${changeCase.camelCase(field.label)}' | translate`,
49
+ "[mandatory]": field.required,
50
+ "[isReadOnly]": field.readOnly ? 'true' : 'section?.header?.readOnly',
51
+ };
52
+ return Object.entries(attrs).map(([key, value]) => `${key}="${value}"`).join('\n');
53
+ },
54
+ importsManager: new ImportsManager(),
55
+ getFieldType(field) {
56
+ const importManager = this.importsManager;
57
+ switch (field.componentName) {
58
+ case 'input':
59
+ importManager.addImport('InputComponent', 'bpm-core', true);
60
+ return 'string';
61
+ case 'textarea':
62
+ importManager.addImport('TextareaComponent', 'bpm-core', true);
63
+ return 'string';
64
+ case 'input-currency':
65
+ importManager.addImport('InputCurrencyComponent', 'bpm-core', true);
66
+ return 'string';
67
+ case 'input-number':
68
+ importManager.addImport('InputNumberComponent', 'bpm-core', true);
69
+ return 'string';
70
+ case 'datepicker':
71
+ importManager.addImport('DatePickerComponent', 'bpm-core', true);
72
+ return 'string';
73
+ case 'select':
74
+ importManager.addImport('CustomSearchableComponent', 'bpm-core', true);
75
+ importManager.addImport('Select', 'bpm-core');
76
+ return 'Select';
77
+ case 'search-employee':
78
+ importManager.addImport('SearchEmployeeComponent', 'bpm-core', true);
79
+ importManager.addImport('Employee', 'bpm-core');
80
+ return 'Employee';
81
+ case 'attachment-section':
82
+ importManager.addImport('AttachmentSectionComponent', 'bpm-core', true);
83
+ importManager.addImport('Attachment', 'bpm-core');
84
+ return 'Attachment[]';
85
+ case 'file-uploader':
86
+ importManager.addImport('DocsUploaderComponent', 'bpm-core', true);
87
+ importManager.addImport('Attachment', 'bpm-core');
88
+ return 'Attachment';
89
+ case 'table':
90
+ return 'any[]';
91
+ default:
92
+ return 'any';
93
+ }
94
+ },
95
+ changeCase: changeCase,
96
+ getValidators(field) {
97
+ const importManager = this.importsManager;
98
+ const validators = [];
99
+ switch (field.componentName) {
100
+ case 'input':
101
+ if (field.required)
102
+ validators.push('Validators.required');
103
+ if (field.minLength)
104
+ validators.push(`Validators.minLength(${field.minLength})`);
105
+ break;
106
+ case 'textarea':
107
+ if (field.required)
108
+ validators.push('Validators.required');
109
+ if (field.minLength)
110
+ validators.push(`Validators.minLength(${field.minLength})`);
111
+ break;
112
+ case 'select':
113
+ importManager.addImport('DataValidators', 'bpm-core');
114
+ if (field.required)
115
+ validators.push('DataValidators.selectRequired');
116
+ break;
117
+ case 'search-employee':
118
+ importManager.addImport('DataValidators', 'bpm-core');
119
+ if (field.required)
120
+ validators.push('DataValidators.employeeRequired');
121
+ break;
122
+ case 'file-uploader':
123
+ importManager.addImport('DataValidators', 'bpm-core');
124
+ if (field.required) {
125
+ if (field.multiple)
126
+ validators.push('DataValidators.multiFileUploaderRequired');
127
+ else
128
+ validators.push('DataValidators.fileUploaderRequired');
129
+ }
130
+ break;
131
+ case 'attachment-section':
132
+ importManager.addImport('DataValidators', 'bpm-core');
133
+ if (field.required)
134
+ validators.push('DataValidators.multiFileUploaderRequired');
135
+ break;
136
+ default:
137
+ if (field.required)
138
+ validators.push('Validators.required');
139
+ }
140
+ let output = `[${validators.join(',')}]`;
141
+ if ('visibilityCheckCode' in field && field.componentName !== 'hint') {
142
+ importManager.addImport('validateOnlyWhen', 'bpm-core');
143
+ output = `validateOnlyWhen(() => this.${changeCase.camelCase(`is ${field.fieldName} visible`)}, [${validators.join(',')}])`;
144
+ }
145
+ return output;
146
+ },
147
+ getEnumName(field) {
148
+ const code = field.visibilityCheckCode;
149
+ return [...code.matchAll(/(?<![\w?.])(?<enumName>\b\w+Enum)\.(?<key>\w+)\b/g)]
150
+ .map(item => item.groups.enumName);
151
+ }
152
+ };
153
+ });
154
+ }
155
+ addI18n() {
156
+ const requestStage = this.stages.requestDetails;
157
+ const setI18n = (field) => {
158
+ if (field.label) {
159
+ const labelKey = changeCase.camelCase(field.label);
160
+ this.en[labelKey] = field.labelEn;
161
+ this.ar[labelKey] = field.labelAr;
162
+ }
163
+ if (field.componentName === 'panel-start' || field.componentName === 'hint') {
164
+ const labelKey = changeCase.camelCase(field.headerName);
165
+ this.en[labelKey] = field.headerNameEn;
166
+ this.ar[labelKey] = field.headerNameAr;
167
+ }
168
+ if (field.componentName === 'table') {
169
+ field.tableColumns.forEach(col => setI18n(col));
170
+ }
171
+ };
172
+ if (requestStage) {
173
+ this.en.formTitle = requestStage.labelEn;
174
+ this.ar.formTitle = requestStage.labelAr;
175
+ requestStage.fields.forEach(field => setI18n(field));
176
+ }
177
+ this.getRoleStages().forEach(stageInfo => {
178
+ const stageTitleKey = `${stageInfo.role.toLowerCase()}Role`;
179
+ this.en[stageTitleKey] = stageInfo.titleEn;
180
+ this.ar[stageTitleKey] = stageInfo.titleAr;
181
+ stageInfo.fields.forEach(field => setI18n(field));
182
+ });
183
+ }
184
+ getRoleStages() {
185
+ const roleStages = [];
186
+ Object.entries(this.stages)
187
+ .filter(([key, value]) => key !== 'requestDetails')
188
+ .forEach(([key, item]) => {
189
+ item.roles.forEach((role, index) => {
190
+ roleStages.push({
191
+ role: role.toLowerCase(),
192
+ compClass: `${changeCase.pascalCase(key)}SectionComponent`,
193
+ dirName: `${changeCase.kebabCase(key)}-section`,
194
+ fbConfigKey: key,
195
+ printPartialName: changeCase.camelCase(`section ${key}`),
196
+ fields: item.fields,
197
+ titleAr: item.rolesAr[index],
198
+ titleEn: item.rolesEn[index]
199
+ });
200
+ });
201
+ });
202
+ return roleStages;
203
+ }
204
+ getSegmentDynamicLoaderConfig() {
205
+ const roleStages = this.getRoleStages();
206
+ const compClassToDirName = roleStages.reduce((prev, curr) => {
207
+ prev[curr.compClass] = curr.dirName;
208
+ return prev;
209
+ }, {});
210
+ return {
211
+ roleToCompClass: roleStages.map(item => `${item.role}: ${item.compClass}`).join(',\n'),
212
+ imports: Object.entries(compClassToDirName).map(([compClass, compDirName]) => `import { ${compClass} } from '../page-components/${compDirName}/${compDirName}.component';`).join('\n')
213
+ };
214
+ }
215
+ getPrintPartials() {
216
+ let output;
217
+ output = Object.entries(this.stages).map(([key, value]) => {
218
+ return {
219
+ printPartialName: changeCase.camelCase(`section ${key}`),
220
+ fields: value.fields
221
+ };
222
+ });
223
+ return output;
224
+ }
225
+ checkInAllFieldsStages(checker) {
226
+ return Object.values(this.stages).some(stage => stage.fields.some(field => {
227
+ return checker(field);
228
+ }));
229
+ }
230
+ parseLOVEnums() {
231
+ const lovEnums = {};
232
+ Object.entries(this.stages).forEach(([key, value]) => {
233
+ value.fields.forEach(field => {
234
+ const visibilityCheckCode = field.visibilityCheckCode;
235
+ if (visibilityCheckCode) {
236
+ [...visibilityCheckCode.matchAll(/(?<![\w?.])(?<enumName>\b\w+Enum)\.(?<key>\w+)\b/g)]
237
+ .forEach(match => {
238
+ const { enumName, key } = match.groups;
239
+ if (!lovEnums[enumName]) {
240
+ lovEnums[enumName] = new Set();
241
+ }
242
+ lovEnums[enumName].add(key);
243
+ });
244
+ }
245
+ });
246
+ });
247
+ if (!Object.keys(lovEnums).length)
248
+ return null;
249
+ return lovEnums;
250
+ }
251
+ }
252
+ exports.ServiceData = ServiceData;
253
+ class ImportsManager {
254
+ constructor() {
255
+ this.imports = {};
256
+ this.componentImports = new Set();
257
+ }
258
+ addImport(value, path, addToComponentImports = false) {
259
+ if (!this.imports[path]) {
260
+ this.imports[path] = new Set();
261
+ }
262
+ if (!Array.isArray(value))
263
+ value = [value];
264
+ value.forEach(item => this.imports[path].add(item));
265
+ if (addToComponentImports) {
266
+ value.forEach(item => this.componentImports.add(item));
267
+ }
268
+ }
269
+ getImports() {
270
+ return Object.entries(this.imports).map(([path, value]) => `import { ${[...value].join(', ')} } from '${path}';`).join('\n');
271
+ }
272
+ getComponentImports() {
273
+ return [...this.componentImports].join(', ');
274
+ }
275
+ renderImports(tsContent) {
276
+ if (this.componentImports.size) {
277
+ tsContent = tsContent.replace(/imports:\s*\[\]/, `imports: [${this.getComponentImports()}]`);
278
+ }
279
+ if (Object.keys(this.imports).length) {
280
+ tsContent = `${this.getImports()}\n${tsContent}`;
281
+ }
282
+ return tsContent;
283
+ }
284
+ }