Skip to content
This repository was archived by the owner on Nov 21, 2024. It is now read-only.

Commit 5ba529c

Browse files
committed
feat(generators): Add generator "Entity" for create entity and all ui components for work in application on rucken template
1 parent ffa90ee commit 5ba529c

4 files changed

Lines changed: 151 additions & 6 deletions

File tree

package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"@oclif/command": "^1",
1515
"@oclif/config": "^1",
1616
"@oclif/plugin-help": "^2",
17-
"@rucken/schematics": "^3.0.3",
17+
"@rucken/schematics": "^3.0.4",
1818
"@types/recursive-readdir": "^2.2.0",
1919
"@types/replace-ext": "0.0.27",
2020
"npm-run": "^5.0.1",
@@ -94,12 +94,13 @@
9494
"run-version-updater": "node ./bin/run version-updater test/fixtures/version-updater/folder1 -r test/fixtures/version-updater",
9595
"run-config": "node ./bin/run config test/fixtures/config/dev -m dev",
9696
"run-prepare": "node ./bin/run prepare test/fixtures/prepare -m dev",
97-
"run-new": "node ./bin/run new test/fixtures/new -n demo -u demo -e demo@demo.demo"
97+
"run-new": "node ./bin/run new test/fixtures/new -n demo -u demo -e demo@demo.demo",
98+
"run-entity": "node ./bin/run entity test/fixtures/entity -n demo -u demo -e demo@demo.demo -f [name,title]"
9899
},
99100
"greenkeeper": {
100101
"ignore": [
101102
"typescript"
102103
]
103104
},
104105
"types": "lib/index.d.ts"
105-
}
106+
}

src/commands/entity.ts

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
import { flags, Command } from '@oclif/command';
2+
import { sep } from 'path';
3+
const npmRun = require('npm-run');
4+
5+
export class Entity extends Command {
6+
static description = 'generate model, service, grid, lookup input, modal for edit row in grid, modal for select items from grid with items';
7+
static flags = {
8+
help: flags.help({ char: 'h' }),
9+
name: flags.string({ char: 'n', description: 'entity singular name on ke-bab case', required: true }),
10+
fields: flags.string({ char: 'f', description: 'entity fields', default: '[name]' }),
11+
username: flags.string({ char: 'u', description: 'username' }),
12+
email: flags.string({ char: 'e', description: 'email' }),
13+
app: flags.string({ char: 'a', description: 'application name in angular.json' }),
14+
core: flags.string({ char: 'c', description: 'core library name in angular.json' }),
15+
web: flags.string({ char: 'w', description: 'web library name in angular.json' })
16+
};
17+
static args = [{ name: 'folder' }];
18+
async run() {
19+
const { args, flags } = this.parse(Entity);
20+
const folder = args.folder;
21+
const name = flags.name;
22+
const fields = flags.fields;
23+
const username = flags.username;
24+
const email = flags.email;
25+
const app = flags.app;
26+
const core = flags.core;
27+
const web = flags.web;
28+
29+
try {
30+
await this.runEntity(
31+
folder,
32+
name,
33+
fields,
34+
username,
35+
email,
36+
app,
37+
core,
38+
web
39+
);
40+
} catch (error) {
41+
console.error(error);
42+
}
43+
}
44+
private runEntity(
45+
folder: string,
46+
name: string,
47+
fields?: string,
48+
username?: string,
49+
email?: string,
50+
app?: string,
51+
core?: string,
52+
web?: string
53+
) {
54+
this.debug('Start', {
55+
folder: folder,
56+
name: name,
57+
fields: fields,
58+
username: username,
59+
email: email,
60+
app: app,
61+
core: core,
62+
web: web
63+
});
64+
return new Promise((resolve, reject) => {
65+
const inputFolder = folder ? folder.replace(new RegExp('\\' + sep, 'g'), '/').split(sep).join('/') : undefined;
66+
const command =
67+
'schematics @rucken/schematics:entity ' +
68+
(inputFolder ? ('--root=' + inputFolder + ' ') : ' ') +
69+
(name ? ('--name=' + name + ' ') : ' ') +
70+
(fields ? ('--fields=' + fields + ' ') : ' ') +
71+
(username ? ('--username=' + username + ' ') : ' ') +
72+
(email ? ('--email=' + email + ' ') : ' ') +
73+
(app ? ('--app=' + app + ' ') : ' ') +
74+
(core ? ('--core=' + core + ' ') : ' ') +
75+
(web ? ('--web=' + web + ' ') : ' ') +
76+
'--dry-run=false --force';
77+
this.debug('command', command);
78+
npmRun.exec(
79+
command,
80+
{},
81+
(err: any, stdout: any, stderr: any) => {
82+
this.debug('err', err);
83+
this.debug('stdout', stdout);
84+
this.debug('stderr', stderr);
85+
if (err) {
86+
this.debug('End', err);
87+
reject(err);
88+
} else {
89+
this.debug('End', true);
90+
resolve();
91+
}
92+
}
93+
);
94+
});
95+
}
96+
}

test/commands/entity.test.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { expect, test } from '@oclif/test';
2+
import { readFileSync } from 'fs';
3+
import { resolve } from 'path';
4+
const rimraf = require('rimraf');
5+
6+
describe('entity', () => {
7+
beforeEach(done =>
8+
rimraf(resolve('test/fixtures/entity'), {}, () =>
9+
setTimeout(
10+
() =>
11+
done(), 1000
12+
)
13+
)
14+
);
15+
afterEach(done =>
16+
rimraf(resolve('test/fixtures/entity'), {}, () =>
17+
setTimeout(
18+
() =>
19+
done(), 1000
20+
)
21+
)
22+
);
23+
test
24+
.command(['entity', 'test/fixtures/entity', '-n', 'demo', '-u', 'demo', '-e', 'demo@demo.demo', '-f', '[name,title]'])
25+
.it('run entity generator', _ctx => {
26+
let angularConfig;
27+
let modelContent;
28+
try {
29+
angularConfig = JSON.parse(readFileSync(
30+
'test/fixtures/entity/angular.json'
31+
).toString());
32+
} catch (error) {
33+
angularConfig = {};
34+
console.error(error);
35+
}
36+
try {
37+
modelContent = readFileSync(
38+
'test/fixtures/entity/libs/demo/core/src/lib/shared/models/demo.ts'
39+
).toString();
40+
} catch (error) {
41+
modelContent = '';
42+
console.error(error);
43+
}
44+
expect(angularConfig.projects.demo.architect.build.builder).to.equals('@angular-devkit/build-angular:browser');
45+
expect(modelContent).to.contain(`name: translate('Name')`);
46+
expect(modelContent).to.contain(`title: translate('Title')`);
47+
});
48+
});

0 commit comments

Comments
 (0)