bpm-core 0.0.131 → 0.0.133

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 (63) hide show
  1. package/cli/deploy/build.js +62 -0
  2. package/cli/deploy/git-operations-handler.js +104 -0
  3. package/cli/deploy/index.js +61 -0
  4. package/cli/deploy/jenkins-manager.js +107 -0
  5. package/cli/generate/index.js +10 -0
  6. package/cli/generate/mock/form-node.js +77 -0
  7. package/cli/generate/mock/index.js +209 -0
  8. package/cli/generate/mock/lov.js +18 -0
  9. package/cli/generate/new/angular-template/.editorconfig +13 -0
  10. package/cli/generate/new/angular-template/README.md +7 -0
  11. package/cli/generate/new/angular-template/angular.json.ejs +167 -0
  12. package/cli/generate/new/angular-template/build.sh +6 -0
  13. package/cli/generate/new/angular-template/extra-webpack.config.js.ejs +5 -0
  14. package/cli/generate/new/angular-template/karma.conf.js +44 -0
  15. package/cli/generate/new/angular-template/package.json.ejs +66 -0
  16. package/cli/generate/new/angular-template/protractor.conf.js +28 -0
  17. package/cli/generate/new/angular-template/src/app/app.component.html +35 -0
  18. package/cli/generate/new/angular-template/src/app/app.component.scss +0 -0
  19. package/cli/generate/new/angular-template/src/app/app.component.ts +81 -0
  20. package/cli/generate/new/angular-template/src/app/config/segment-dynamic-loader.config.ts.ejs +8 -0
  21. package/cli/generate/new/angular-template/src/app/i18n/ar.ts.ejs +18 -0
  22. package/cli/generate/new/angular-template/src/app/i18n/en.ts.ejs +18 -0
  23. package/cli/generate/new/angular-template/src/app/page-components/@@comp-template@@/@@.component.html.ejs +33 -0
  24. package/cli/generate/new/angular-template/src/app/page-components/@@comp-template@@/@@.component.ts.ejs +128 -0
  25. package/cli/generate/new/angular-template/src/app/page-components/@@comp-template@@/_html-field.ejs +97 -0
  26. package/cli/generate/new/angular-template/src/app/page-components/@@comp-template@@/_html-table.ejs +27 -0
  27. package/cli/generate/new/angular-template/src/app/page-components/@@comp-template@@/_ts-field.ejs +3 -0
  28. package/cli/generate/new/angular-template/src/app/shared/pipes/translate.pipe.ts +32 -0
  29. package/cli/generate/new/angular-template/src/app/shared/services/i18n.service.ts +32 -0
  30. package/cli/generate/new/angular-template/src/app/shared/services/segment-dynamic-loader.service.ts.ejs +49 -0
  31. package/cli/generate/new/angular-template/src/app/shared/services/state-machine.service.ts +119 -0
  32. package/cli/generate/new/angular-template/src/app/shared/types/lov.enum.ts.ejs +7 -0
  33. package/cli/generate/new/angular-template/src/app/templates/print-section/print-section.component.html +5 -0
  34. package/cli/generate/new/angular-template/src/app/templates/print-section/print-section.component.scss +0 -0
  35. package/cli/generate/new/angular-template/src/app/templates/print-section/print-section.component.ts.ejs +156 -0
  36. package/cli/generate/new/angular-template/src/app/templates/print.ts.ejs +392 -0
  37. package/cli/generate/new/angular-template/src/environments/environment.local.ts.ejs +40 -0
  38. package/cli/generate/new/angular-template/src/environments/environment.prod.ts +25 -0
  39. package/cli/generate/new/angular-template/src/environments/environment.ts +25 -0
  40. package/cli/generate/new/angular-template/src/favicon.ico +0 -0
  41. package/cli/generate/new/angular-template/src/index.html.ejs +14 -0
  42. package/cli/generate/new/angular-template/src/main.ts +49 -0
  43. package/cli/generate/new/angular-template/src/polyfills.ts +65 -0
  44. package/cli/generate/new/angular-template/src/styles.scss.ejs +121 -0
  45. package/cli/generate/new/angular-template/src/test.ts +26 -0
  46. package/cli/generate/new/angular-template/tsconfig.app.json +15 -0
  47. package/cli/generate/new/angular-template/tsconfig.json +50 -0
  48. package/cli/generate/new/angular-template/tsconfig.spec.json +18 -0
  49. package/cli/generate/new/angular-template/tslint.json +143 -0
  50. package/cli/generate/new/copy-and-generate.js +120 -0
  51. package/cli/generate/new/field.js +4 -0
  52. package/cli/generate/new/index.js +47 -0
  53. package/cli/generate/new/service-data.js +284 -0
  54. package/cli/index.js +14 -0
  55. package/cli/utilities/utilities.js +114 -0
  56. package/fesm2022/bpm-core.mjs +350 -395
  57. package/fesm2022/bpm-core.mjs.map +1 -1
  58. package/lib/components/shared-components/form-field/search-employee/search-employee.component.d.ts +6 -1
  59. package/lib/components/shared-components/form-field/shared-imports.d.ts +1 -1
  60. package/lib/components/shared-components/form-field/table-list/table-list.component.d.ts +1 -1
  61. package/lib/services/core.service.ts.d.ts +1 -0
  62. package/lib/testComponent/request-details-section/request-details-section.component.d.ts +0 -2
  63. package/package.json +2 -2
@@ -0,0 +1,62 @@
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.LibraryBuild = exports.Build = void 0;
27
+ const utilities_1 = require("../utilities/utilities");
28
+ const fs = __importStar(require("fs"));
29
+ class Build {
30
+ constructor() { }
31
+ async runBuild(servicePath) {
32
+ await this.runNgBuild(servicePath);
33
+ this.renameBuildFiles(servicePath);
34
+ this.removeUnneededBuildFiles(servicePath);
35
+ }
36
+ }
37
+ exports.Build = Build;
38
+ class LibraryBuild extends Build {
39
+ runNgBuild(servicePath) {
40
+ return (0, utilities_1.runCommand)('npx ng build --aot -c production --output-hashing none', servicePath);
41
+ }
42
+ isWebpackBuildRequired() {
43
+ return false;
44
+ }
45
+ renameBuildFiles(servicePath) {
46
+ const filesToRenameAfterBuild = [
47
+ { from: `${servicePath}/dist/main.js`, to: `${servicePath}/dist/wm-main.bundle.js` },
48
+ { from: `${servicePath}/dist/styles.css`, to: `${servicePath}/dist/wm-styles.bundle.css` },
49
+ { from: `${servicePath}/dist/polyfills.js`, to: `${servicePath}/dist/wm-polyfills.bundle.js` },
50
+ { from: `${servicePath}/dist/scripts.js`, to: `${servicePath}/dist/wm-scripts.bundle.js` },
51
+ { from: `${servicePath}/dist/runtime.js`, to: `${servicePath}/dist/wm-inline.bundle.js` }
52
+ ];
53
+ filesToRenameAfterBuild.forEach(item => fs.renameSync(item.from, item.to));
54
+ }
55
+ removeUnneededBuildFiles(servicePath) {
56
+ const scssDirPath = `${servicePath}/dis/assets/scss`;
57
+ if (fs.existsSync(scssDirPath)) {
58
+ fs.rmdirSync(scssDirPath, { recursive: true });
59
+ }
60
+ }
61
+ }
62
+ exports.LibraryBuild = LibraryBuild;
@@ -0,0 +1,104 @@
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.GitOperationsHandler = void 0;
27
+ const fs = __importStar(require("fs"));
28
+ const path = __importStar(require("path"));
29
+ const util_1 = require("util");
30
+ const child_process_1 = require("child_process");
31
+ const utilities_1 = require("../utilities/utilities");
32
+ class GitOperationsHandler {
33
+ constructor() { }
34
+ async sync(localBuildRepoPath, serviceRemoteDir, servicePath, commitMessage, logger, env) {
35
+ if (await this.getCurrentBranch(localBuildRepoPath) !== env) {
36
+ throw new Error(`Current branch in build repo is not "${env}". Please switch to the correct branch and try again.`);
37
+ }
38
+ logger.log('Pulling latest changes from remote repo...');
39
+ await this.pull(localBuildRepoPath);
40
+ logger.log('Copying build files to service directory in build repo...');
41
+ await this.copyBuildFilesToServiceDirInBuildRepo(localBuildRepoPath, serviceRemoteDir, servicePath);
42
+ logger.log(`Files copied from "${servicePath}" to "${path.join(localBuildRepoPath, serviceRemoteDir)}".`);
43
+ logger.log('Committing changes to local build repo...');
44
+ await this.commit(localBuildRepoPath, commitMessage);
45
+ logger.log('Pushing changes to remote repo...');
46
+ await this.push(localBuildRepoPath);
47
+ }
48
+ async pull(localBuildRepoPath) {
49
+ return await (0, utilities_1.runCommand)('git pull', localBuildRepoPath);
50
+ }
51
+ copyBuildFilesToServiceDirInBuildRepo(localBuildRepoPath, serviceDirNameInBuildRepo, servicePath) {
52
+ const from = path.join(servicePath, 'dist');
53
+ const to = path.join(localBuildRepoPath, serviceDirNameInBuildRepo);
54
+ return this.copyFiles(from, to);
55
+ }
56
+ async commit(localBuildRepoPath, commitMessage) {
57
+ const execAsync = (0, util_1.promisify)(child_process_1.exec);
58
+ try {
59
+ const { stdout: status } = await execAsync('git status --porcelain', { cwd: localBuildRepoPath });
60
+ if (status.trim().length === 0) {
61
+ throw new Error('No changes to commit');
62
+ }
63
+ await execAsync('git add .', { cwd: localBuildRepoPath });
64
+ await execAsync(`git commit -m "${commitMessage}"`, { cwd: localBuildRepoPath });
65
+ }
66
+ catch (error) {
67
+ throw new Error('Failed to commit', { cause: error });
68
+ }
69
+ }
70
+ push(localBuildRepoPath) {
71
+ return (0, utilities_1.runCommand)('git push', localBuildRepoPath);
72
+ }
73
+ async copyFiles(srcDir, destDir) {
74
+ try {
75
+ await fs.promises.mkdir(destDir, { recursive: true });
76
+ const items = await fs.promises.readdir(srcDir, { withFileTypes: true });
77
+ for (const item of items) {
78
+ const srcPath = path.join(srcDir, item.name);
79
+ const destPath = path.join(destDir, item.name);
80
+ if (item.isDirectory()) {
81
+ await this.copyFiles(srcPath, destPath);
82
+ }
83
+ else {
84
+ await fs.promises.copyFile(srcPath, destPath);
85
+ }
86
+ }
87
+ }
88
+ catch (error) {
89
+ const errorMsg = `Error copying files: ${error.message}`;
90
+ throw Error(errorMsg);
91
+ }
92
+ }
93
+ async getCurrentBranch(localBuildRepoPath) {
94
+ const execAsync = (0, util_1.promisify)(child_process_1.exec);
95
+ try {
96
+ const { stdout: currentBranch } = await execAsync('git rev-parse --abbrev-ref HEAD', { cwd: localBuildRepoPath });
97
+ return currentBranch.trim();
98
+ }
99
+ catch (error) {
100
+ throw new Error('Failed to get current branch', { cause: error });
101
+ }
102
+ }
103
+ }
104
+ exports.GitOperationsHandler = GitOperationsHandler;
@@ -0,0 +1,61 @@
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.deployCommand = void 0;
27
+ const path = __importStar(require("path"));
28
+ const commander_1 = require("commander");
29
+ const build_1 = require("./build");
30
+ const git_operations_handler_1 = require("./git-operations-handler");
31
+ const jenkins_manager_1 = require("./jenkins-manager");
32
+ const utilities_1 = require("../utilities/utilities");
33
+ exports.deployCommand = new commander_1.Command('deploy');
34
+ exports.deployCommand
35
+ .description('Deploy a service to a specific environment, deployment process includes building the service, syncing with the remote repository, and running a Jenkins job if credentials are provided.')
36
+ .requiredOption('--env <string>', 'The env you want to deploy to it (dev, sit, or bat)')
37
+ .requiredOption('--repo-path <string>', 'The path for the local build repo make sure it is switched to env branch you want to deploy to it')
38
+ .requiredOption('--commit-msg <string>', 'The commit message for the changes you want to commit to the build repo')
39
+ .requiredOption('--remote-dir <string>', 'The remote directory name in the build repo where the service files will be copied to')
40
+ .option('--skip-build', 'Skip Angular build (optional)', false)
41
+ .option('--username <string>', 'Jenkins username (optional, if not provided Jenkins job will not run)')
42
+ .option('--token <string>', 'Jenkins token or password (optional, if not provided Jenkins job will not run)')
43
+ .action(async (options) => {
44
+ const cwd = process.cwd();
45
+ const serviceName = path.basename(cwd);
46
+ const env = (0, utilities_1.parseEnv)(options.env);
47
+ const logger = new utilities_1.Logger();
48
+ try {
49
+ if (!options.skipBuild) {
50
+ await logger.asyncLog('Building...')(new build_1.LibraryBuild().runBuild(cwd), 'Build Done.', 'Build Failed.');
51
+ }
52
+ await logger.asyncLog('Syncing with the remote repo...')(new git_operations_handler_1.GitOperationsHandler().sync(options.repoPath, options.remoteDir, cwd, options.commitMsg, logger, env), 'Sync Done.', 'Sync Failed.');
53
+ if (options.username && options.token) {
54
+ await logger.asyncLog('Running Jenkins job...')(new jenkins_manager_1.JenkinsManager().run(options.username, options.token, env, logger), 'Jenkins Job Done.', 'Failed to run Jenkins job.');
55
+ logger.success(`${serviceName.toLocaleUpperCase()} deployed to ${options.env.toUpperCase()} successfully.`);
56
+ }
57
+ }
58
+ catch (err) {
59
+ console.log(`${err.message} ${(err.cause?.message || err.cause) ? 'because ' + (err.cause?.message || err.cause) : ''}`);
60
+ }
61
+ });
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JenkinsManager = void 0;
4
+ class JenkinsManager {
5
+ async run(username, token, env, logger) {
6
+ const jobName = this.getJobName(env);
7
+ try {
8
+ const buildNumber = await this.triggerJenkinsAndGetBuildNumber(username, token, jobName, logger);
9
+ await this.waitForBuildToFinish(buildNumber, username, token, jobName, logger);
10
+ }
11
+ catch (err) {
12
+ throw new Error(`Failed to run Jenkins job`, { cause: err });
13
+ }
14
+ }
15
+ async triggerJenkinsAndGetBuildNumber(username, token, jobName, logger) {
16
+ const JENKINS_URL = 'http://172.20.151.119:9090';
17
+ const auth = btoa(`${username}:${token}`);
18
+ try {
19
+ const triggerResponse = await fetch(`${JENKINS_URL}/job/${jobName}/build`, {
20
+ method: 'POST',
21
+ headers: {
22
+ 'Authorization': `Basic ${auth}`
23
+ },
24
+ redirect: 'manual'
25
+ });
26
+ if (triggerResponse.status !== 201) {
27
+ throw new Error(`Failed to trigger build:, ${triggerResponse.statusText}`);
28
+ }
29
+ const queueUrl = triggerResponse.headers.get('Location');
30
+ if (!queueUrl) {
31
+ throw new Error('No queue URL returned');
32
+ }
33
+ logger.log(`Build queued.`);
34
+ let buildNumber = null;
35
+ const maxAttempts = 20;
36
+ const delay = 3000;
37
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
38
+ const queueRes = await fetch(`${queueUrl}api/json`, {
39
+ headers: {
40
+ 'Authorization': `Basic ${auth}`
41
+ }
42
+ });
43
+ const queueData = await queueRes.json();
44
+ if (queueData.executable && queueData.executable.number) {
45
+ buildNumber = queueData.executable.number;
46
+ break;
47
+ }
48
+ logger.log(`Waiting for build to start... (${attempt + 1})`);
49
+ await new Promise(resolve => setTimeout(resolve, delay));
50
+ }
51
+ if (buildNumber) {
52
+ logger.log(`Build started with number: ${buildNumber}`);
53
+ return buildNumber;
54
+ }
55
+ else {
56
+ throw new Error('Failed to get build number.');
57
+ }
58
+ }
59
+ catch (err) {
60
+ throw new Error(`Error triggering Jenkins build: ${err.message}`);
61
+ }
62
+ }
63
+ async waitForBuildToFinish(buildNumber, username, token, jobName, logger) {
64
+ const JENKINS_URL = 'http://172.20.151.119:9090';
65
+ const auth = btoa(`${username}:${token}`);
66
+ const maxAttempts = 40;
67
+ const delay = 5000;
68
+ for (let i = 0; i < maxAttempts; i++) {
69
+ const res = await fetch(`${JENKINS_URL}/job/${jobName}/${buildNumber}/api/json`, {
70
+ headers: {
71
+ 'Authorization': `Basic ${auth}`
72
+ }
73
+ });
74
+ const data = await res.json();
75
+ if (!data.building) {
76
+ const result = data.result;
77
+ if (result === 'SUCCESS') {
78
+ logger.log(`Build #${buildNumber} completed successfully.`);
79
+ return data;
80
+ }
81
+ else {
82
+ throw new Error(`Build #${buildNumber} failed.`);
83
+ }
84
+ }
85
+ logger.log(`Build #${buildNumber} is still running... (${i + 1})`);
86
+ await new Promise(resolve => setTimeout(resolve, delay));
87
+ }
88
+ return null;
89
+ }
90
+ getJobName(env) {
91
+ if (!env) {
92
+ throw new Error('Environment is required to get the job name');
93
+ }
94
+ env = env.toLowerCase();
95
+ const jobNameMap = {
96
+ dev: 'wmbpm-web-dev',
97
+ sit: 'wmbpm-web-sit',
98
+ bat: 'wmbpm-web-bat'
99
+ };
100
+ const jobName = jobNameMap[env];
101
+ if (!jobName) {
102
+ throw new Error(`No job name found for environment: ${env}`);
103
+ }
104
+ return jobName;
105
+ }
106
+ }
107
+ exports.JenkinsManager = JenkinsManager;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const mock_1 = require("./mock");
6
+ const new_1 = require("./new");
7
+ exports.generateCommand = new commander_1.Command('generate');
8
+ exports.generateCommand.alias('g');
9
+ exports.generateCommand.addCommand(mock_1.generateMockDataCommand);
10
+ exports.generateCommand.addCommand(new_1.generateNewProjectCommand);
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ControlNode = exports.GroupNode = void 0;
4
+ const lov_1 = require("./lov");
5
+ const randomNumber = () => Math.floor(Math.random() * 100);
6
+ const CONTROL_MOCK_MAP = {
7
+ 'app-input': () => `Sample text ${randomNumber()}`,
8
+ 'app-textarea': () => `Multiline ${randomNumber()}\nText ${randomNumber()}\nHere ${randomNumber()}`,
9
+ 'app-datepicker': () => new Date().toISOString(),
10
+ 'app-input-number': () => randomNumber().toString(),
11
+ 'app-custom-searchable': (control) => {
12
+ const lovName = control.options?.options?.match(/lov\??\.(?<lovName>\w+?)\??\.options/)?.groups?.lovName || control.name;
13
+ return (0, lov_1.getLOVFieldValue)(lovName);
14
+ },
15
+ 'app-checkbox': () => "false",
16
+ 'app-search-employee': () => ({
17
+ "personName": "Jehad Saleh A Alluhayd",
18
+ "personEmail": "jsalluhayd@stc.com.sa"
19
+ }),
20
+ 'app-file-uploader': (control) => {
21
+ const attachment = () => ({
22
+ "fileName": `ajm_location_issue_${randomNumber()}.png`,
23
+ "attachmentId": `b7d2915d-930e-4e93-930e-3675a5959ba8${randomNumber()}`,
24
+ "mimeType": "image\/png"
25
+ });
26
+ control.options?.multiple === 'true' ? [attachment(), attachment()] : attachment();
27
+ },
28
+ 'app-input-currency': () => '123' + randomNumber().toString(),
29
+ 'app-attachment-section': () => {
30
+ const attachment = () => ({
31
+ "fileDescription": "desc " + randomNumber(),
32
+ "attachmentcomment": "comm " + randomNumber(),
33
+ "fileComments": "comm " + randomNumber(),
34
+ "fileName": `dummy_${randomNumber()}.pdf`,
35
+ "attachmentId": "idd_40910B7B-0000-CE16-BD92-EC800D2FDFC6" + randomNumber(),
36
+ "mimeType": "application/pdf"
37
+ });
38
+ return [attachment(), attachment()];
39
+ },
40
+ 'app-radio': (control) => {
41
+ const lovName = control.options?.options?.match(/lov\??\.(?<lovName>\w+?)\??\.options/)?.groups?.lovName || control.name;
42
+ return (0, lov_1.getLOVFieldValue)(lovName);
43
+ },
44
+ };
45
+ class FormNode {
46
+ }
47
+ class GroupNode extends FormNode {
48
+ constructor(name, children = {}) {
49
+ super();
50
+ this.name = name;
51
+ this.children = children;
52
+ }
53
+ getValue() {
54
+ const output = {};
55
+ for (const key in this.children) {
56
+ output[key] = this.children[key].getValue();
57
+ }
58
+ return output;
59
+ }
60
+ addChild(child) {
61
+ this.children[child.name] = child;
62
+ }
63
+ }
64
+ exports.GroupNode = GroupNode;
65
+ class ControlNode extends FormNode {
66
+ constructor(name, tag, options) {
67
+ super();
68
+ this.name = name;
69
+ this.tag = tag;
70
+ this.options = options;
71
+ }
72
+ getValue() {
73
+ const generator = CONTROL_MOCK_MAP[this.tag] || (() => 'Unknown');
74
+ return generator(this);
75
+ }
76
+ }
77
+ exports.ControlNode = ControlNode;
@@ -0,0 +1,209 @@
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.generateMockDataCommand = void 0;
27
+ const fs = __importStar(require("fs"));
28
+ const path = __importStar(require("path"));
29
+ const cheerio = __importStar(require("cheerio"));
30
+ const commander_1 = require("commander");
31
+ const form_node_1 = require("./form-node");
32
+ const lov_1 = require("./lov");
33
+ exports.generateMockDataCommand = new commander_1.Command('mock');
34
+ exports.generateMockDataCommand.alias('m');
35
+ exports.generateMockDataCommand.action((options) => {
36
+ main();
37
+ });
38
+ const projectRoot = process.cwd();
39
+ const serviceName = path.basename(projectRoot);
40
+ const configDir = path.join(projectRoot, 'src', 'app', 'config');
41
+ const configFile = path.join(configDir, 'segment-dynamic-loader.config.ts');
42
+ function extractComponentPaths(configContent) {
43
+ const importRegex = /import\s*{\s*(?<name>\w+)\s*}\s+from\s+['"](?<path>.+?)['"]/g;
44
+ const imports = [...configContent.matchAll(importRegex)].reduce((prev, curr) => {
45
+ prev.push(curr.groups);
46
+ return prev;
47
+ }, []);
48
+ const exportRegex = /roleToApprovalSectionMapping\s*:\s*{([^}]+)}/s;
49
+ const exportMatch = configContent.match(exportRegex);
50
+ const body = exportMatch[1];
51
+ const usageRegex = /\s*(?<role>\w+)\s*:\s*(?<name>\w+)/g;
52
+ const roleToCompClassName = [...body.matchAll(usageRegex)].reduce((prev, curr) => {
53
+ prev.push(curr.groups);
54
+ return prev;
55
+ }, []);
56
+ const roleToRealCompPath = roleToCompClassName.reduce((prev, curr) => {
57
+ const importPathInConfigFile = imports.find((imp) => imp.name === curr.name).path;
58
+ const realPath = path.join(configDir, importPathInConfigFile + '.ts');
59
+ prev.push({ role: curr.role, path: realPath });
60
+ return prev;
61
+ }, []);
62
+ return roleToRealCompPath;
63
+ }
64
+ function getTemplatePath(componentTsPath) {
65
+ if (!fs.existsSync(componentTsPath))
66
+ return null;
67
+ const content = fs.readFileSync(componentTsPath, 'utf-8');
68
+ const match = content.match(/templateUrl\s*:\s*['"](.+?)['"]/);
69
+ if (!match)
70
+ return null;
71
+ return path.resolve(path.dirname(componentTsPath), match[1]);
72
+ }
73
+ function parseAttributesWithoutBinding(attributes) {
74
+ const attrAsString = JSON.stringify(attributes);
75
+ const output = [...attrAsString.matchAll(/"\[?(?<name>[^"]+?)\]?"\s*?:\s*?"(?<value>[^"]+?)"/g)].reduce((prev, curr) => {
76
+ prev[curr.groups.name] = curr.groups.value;
77
+ return prev;
78
+ }, {});
79
+ return output;
80
+ }
81
+ function parseFormControls($, $el, groupNode) {
82
+ $el.children().each((_, child) => {
83
+ const tagName = child.tagName.toLowerCase();
84
+ const formGroup = child.attribs?.formgroupname;
85
+ const formControl = child.attribs?.formcontrolname;
86
+ if (formGroup) {
87
+ const childGroup = new form_node_1.GroupNode(formGroup);
88
+ groupNode.addChild(childGroup);
89
+ parseFormControls($, $(child), childGroup);
90
+ }
91
+ if (formControl) {
92
+ const options = parseAttributesWithoutBinding(child.attribs);
93
+ groupNode.addChild(new form_node_1.ControlNode(formControl, tagName, options));
94
+ }
95
+ });
96
+ return groupNode;
97
+ }
98
+ function getTemplateMockData(templatePath) {
99
+ if (!fs.existsSync(templatePath)) {
100
+ throw new Error(`Template not found: ${templatePath}`);
101
+ }
102
+ const html = fs.readFileSync(templatePath, 'utf-8');
103
+ const $ = cheerio.load(html);
104
+ const $form = $('form');
105
+ const controlsTree = parseFormControls($, $form, new form_node_1.GroupNode(''));
106
+ return controlsTree.getValue();
107
+ }
108
+ function buildPayloadWithMockData(roleToStageMockMap, requestMock) {
109
+ const workflowSteps = Object.entries(roleToStageMockMap).map(([role, stageMock]) => {
110
+ return {
111
+ "actor": {
112
+ "delegate": null,
113
+ "recipient": {
114
+ "role": role.toUpperCase(),
115
+ "name": "Sami Sulaiman M Alfayez",
116
+ "shortName": null,
117
+ "email": "sfayez@stc.com.sa",
118
+ "employeeNumber": null
119
+ },
120
+ "email": "sfayez@stc.com.sa",
121
+ "status": "COMPLETED"
122
+ },
123
+ "date": "2025-07-31T13:11:28.584+03:00",
124
+ "details": {
125
+ ...stageMock,
126
+ "decision": {
127
+ "value": "Pending",
128
+ "key": "PENDING"
129
+ }
130
+ }
131
+ };
132
+ });
133
+ const output = {
134
+ "data": {
135
+ "requester": {
136
+ "departmentName": "Enterprise HR Business Partner Section_Private",
137
+ "directManagerName": "Hissah Ibrahim M Bin Zuayr",
138
+ "generalDepartmentName": "",
139
+ "generalDepartmentCode": "",
140
+ "onBehalfAuthorized": "false",
141
+ "employeeEmail": "iimran@stc.com.sa",
142
+ "fullName": "Ibrahim A. Alimran",
143
+ "employeeId": "",
144
+ "sectorName": "",
145
+ "seniorSectorName": "",
146
+ "humanResourceLocation": "",
147
+ "jobPosition": "",
148
+ "nationality": "",
149
+ "businessPhone": "966555008873"
150
+ },
151
+ workflowSteps,
152
+ "request": {
153
+ "details": requestMock
154
+ },
155
+ "form": {
156
+ "formId": `${serviceName.toUpperCase()}5000015`,
157
+ "currentActor": {
158
+ "name": "Ibrahim Ahmed M Alimran",
159
+ "email": "iimran@stc.com.sa"
160
+ },
161
+ "formName": serviceName.toUpperCase(),
162
+ "formStatus": {
163
+ "value": "Pending",
164
+ "key": "PENDING"
165
+ },
166
+ "readOnly": "false",
167
+ "formStep": workflowSteps[workflowSteps.length - 1].actor.recipient.role,
168
+ "creationDate": "2025-07-28T20:13:11.650+03:00"
169
+ }
170
+ },
171
+ "meta": {
172
+ "lovs": {
173
+ "decision": {
174
+ "options": [
175
+ {
176
+ "description": "Submit to Account manager",
177
+ "value": "SUBMIT_TO_ACCOUNT_MANAGER",
178
+ },
179
+ {
180
+ "description": "Send Back",
181
+ "value": "SENDBACK",
182
+ }
183
+ ],
184
+ "type": "button"
185
+ },
186
+ ...(0, lov_1.getLOVs)()
187
+ }
188
+ }
189
+ };
190
+ return output;
191
+ }
192
+ function main() {
193
+ if (!fs.existsSync(configFile)) {
194
+ throw new Error(`Config file not found: ${configFile}`);
195
+ }
196
+ const configContent = fs.readFileSync(configFile, 'utf-8');
197
+ const componentPaths = extractComponentPaths(configContent);
198
+ const stageMocks = {};
199
+ for (const { role, path: tsPath } of componentPaths) {
200
+ const templatePath = getTemplatePath(tsPath);
201
+ stageMocks[role] = getTemplateMockData(templatePath);
202
+ }
203
+ const requestTemplatePath = path.join(projectRoot, '/src/app/page-components/request-details-section/request-details-section.component.html');
204
+ const requestMock = getTemplateMockData(requestTemplatePath);
205
+ const payload = buildPayloadWithMockData(stageMocks, requestMock);
206
+ const outputPath = path.join(projectRoot, '/mock-output.json');
207
+ fs.writeFileSync(outputPath, JSON.stringify(payload, null, 2), 'utf-8');
208
+ console.log(`Mock data written to: ${outputPath}`);
209
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getLOVFieldValue = getLOVFieldValue;
4
+ exports.getLOVs = getLOVs;
5
+ const lovs = {};
6
+ function getLOVFieldValue(lovName) {
7
+ if (!lovs[lovName]) {
8
+ const randomNumber = () => Math.floor(Math.random() * 100);
9
+ lovs[lovName] = {
10
+ type: 'combo',
11
+ options: Array.from({ length: 5 }).map((_, index) => ({ description: `Op_${index + 1} ${randomNumber()}`, value: (index + 1).toString() }))
12
+ };
13
+ }
14
+ return { key: lovs[lovName].options[0].value, value: lovs[lovName].options[0].description };
15
+ }
16
+ function getLOVs() {
17
+ return lovs;
18
+ }
@@ -0,0 +1,13 @@
1
+ # Editor configuration, see http://editorconfig.org
2
+ root = true
3
+
4
+ [*]
5
+ charset = utf-8
6
+ indent_style = space
7
+ indent_size = 2
8
+ insert_final_newline = true
9
+ trim_trailing_whitespace = true
10
+
11
+ [*.md]
12
+ max_line_length = off
13
+ trim_trailing_whitespace = false
@@ -0,0 +1,7 @@
1
+ # BPM Core CLI
2
+
3
+ This project was generated with [BPM Core CLI](https://www.npmjs.com/package/bpm-core?activeTab=readme#bpm-core-cli).
4
+
5
+ ## Development server
6
+
7
+ Run `ng serve` for a dev server. Navigate to `http://localhost:4200/` . The app will automatically reload if you change any of the source files.