@lenne.tech/cli 0.0.68 → 0.0.73

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.
@@ -19,7 +19,7 @@ const NewCommand = {
19
19
  hidden: false,
20
20
  run: (toolbox) => __awaiter(void 0, void 0, void 0, function* () {
21
21
  // Retrieve the tools we need
22
- const { filesystem, git, helper, parameters, patching, print: { error, info, spin, success }, prompt: { confirm }, strings: { kebabCase }, system, } = toolbox;
22
+ const { filesystem, git, helper, parameters, print: { error, info, spin, success }, prompt: { confirm }, strings: { kebabCase }, system, } = toolbox;
23
23
  // Start timer
24
24
  const timer = system.startTimer();
25
25
  // Info
@@ -28,12 +28,6 @@ const NewCommand = {
28
28
  if (!(yield git.gitInstalled())) {
29
29
  return;
30
30
  }
31
- // Check ng
32
- if (!system.which('nx') && (yield confirm(`Install nx global?`))) {
33
- const nxSpinner = spin('Install nx global');
34
- yield system.run(`npm i -g @nrwl/cli`);
35
- nxSpinner.succeed('nx global installed');
36
- }
37
31
  // Get name of the workspace
38
32
  const name = yield helper.getInput(parameters.first, {
39
33
  name: 'workspace name',
@@ -50,88 +44,81 @@ const NewCommand = {
50
44
  error(`There's already a folder named "${projectDir}" here.`);
51
45
  return undefined;
52
46
  }
53
- // Get name of the app
54
- let appName = yield helper.getInput(parameters.second, {
55
- name: 'app name',
56
- showError: true,
57
- });
58
- if (!appName) {
59
- appName = 'app';
60
- }
61
47
  // Set preset
62
48
  // See https://github.com/nrwl/nx/blob/4bcd25ec01d793ca59e0ebaf1578bae275b6821d/packages/create-nx-workspace/bin/create-nx-workspace.ts#L32
63
- const preset = parameters.third === 'true' || (!parameters.third && (yield confirm(`Add API (Nest server)?`)))
49
+ const preset = parameters.second === 'true' || (!parameters.second && (yield confirm(`Add API (Nest server)?`)))
64
50
  ? 'angular-nest'
65
51
  : 'angular';
66
- // Init Workspace
67
- // See https://github.com/nrwl/nx/blob/4bcd25ec01d793ca59e0ebaf1578bae275b6821d/packages/create-nx-workspace/bin/create-nx-workspace.ts#L163
68
- const workspaceSpinner = spin(`Create ${preset} workspace ${projectDir} with ${appName} app`);
69
- yield system.run(`npx create-nx-workspace ${projectDir} --preset='${preset}' --appName='${appName}' --style='scss' --linter='eslint' --packageManager='npm' --nxCloud=false --cli="nx"`);
52
+ let addToGit = yield confirm(`Add workspace to a new git repository?`);
53
+ let gitLink;
54
+ // Check if git init is active
55
+ if (addToGit) {
56
+ // Get name of the app
57
+ gitLink = yield helper.getInput(null, {
58
+ name: 'git repository link',
59
+ showError: true,
60
+ });
61
+ if (!gitLink) {
62
+ addToGit = false;
63
+ }
64
+ }
65
+ const workspaceSpinner = spin(`Create ${preset} workspace ${projectDir} with ${name} app`);
66
+ // Clone monorepo
67
+ yield system.run(`git clone https://github.com/lenneTech/lt-monorepo.git ${projectDir}`);
68
+ // Check for directory
70
69
  if (!filesystem.isDirectory(`./${projectDir}`)) {
71
70
  error(`The directory "${projectDir}" could not be created.`);
72
71
  return undefined;
73
72
  }
74
- workspaceSpinner.succeed(`Create ${preset} workspace ${projectDir} for ${appName} created`);
73
+ workspaceSpinner.succeed(`Create ${preset} workspace ${projectDir} for ${name} created`);
75
74
  // Include example app
76
75
  const ngBaseSpinner = spin('Integrate example for Angular');
77
- // Install packages
78
- yield system.run(`cd ${projectDir} && npm i @lenne.tech/ng-base`);
79
- // Extend ts config
80
- yield patching.update(`./${projectDir}/tsconfig.base.json`, (config) => {
81
- config.compilerOptions.resolveJsonModule = true;
82
- config.compilerOptions.strictNullChecks = false;
83
- return config;
84
- });
85
- // Get src files
86
- yield system.run(`cd ${projectDir} && git clone https://github.com/lenneTech/angular-example temp`);
76
+ // Remove git folder after clone
77
+ yield system.run(`cd ${projectDir} && rm -rf .git`);
78
+ // Check if git init is active
79
+ if (addToGit) {
80
+ yield system.run(`cd ${projectDir} && git init --initial-branch=main`);
81
+ yield system.run(`cd ${projectDir} && git remote add origin ${gitLink}`);
82
+ yield system.run(`cd ${projectDir} && git add .`);
83
+ yield system.run(`cd ${projectDir} && git commit -m "Initial commit"`);
84
+ yield system.run(`cd ${projectDir} && git push -u origin main`);
85
+ }
86
+ // Clone ng-base-starter
87
+ yield system.run(`cd ${projectDir}/projects && git clone https://github.com/lenneTech/ng-base-starter.git app`);
88
+ // Remove gitkeep file
89
+ yield system.run(`cd ${projectDir}/projects && rm .gitkeep`);
90
+ // Remove git folder after clone
91
+ yield system.run(`cd ${projectDir}/projects/app && rm -rf .git`);
87
92
  // Integrate files
88
- if (filesystem.isDirectory(`./${projectDir}/temp`)) {
89
- filesystem.remove(`./${projectDir}/apps/${appName}/src`);
90
- filesystem.copy(`./${projectDir}/temp/apps/example/src`, `./${projectDir}/apps/${appName}/src`, {
91
- overwrite: true,
92
- });
93
- // Remove temp files
94
- filesystem.remove(`./${projectDir}/temp`);
95
- // Commit changes
96
- yield system.run(`cd ${projectDir} && git add . && git commit -am "Angular example integrated"`);
93
+ if (filesystem.isDirectory(`./${projectDir}/projects/app`)) {
94
+ // Check if git init is active
95
+ if (addToGit) {
96
+ // Commit changes
97
+ yield system.run(`cd ${projectDir} && git add . && git commit -am "feat: Angular example integrated" && git push`);
98
+ }
97
99
  // Angular example integration done
98
100
  ngBaseSpinner.succeed('Example for Angular integrated');
99
101
  // Include files from https://github.com/lenneTech/nest-server-starter
100
102
  if (preset === 'angular-nest') {
101
103
  // Init
102
104
  const serverSpinner = spin(`Integrate Nest Server Starter`);
103
- yield system.run(`cd ${projectDir} && npm i @lenne.tech/nest-server`);
104
- yield system.run(`cd ${projectDir} && git clone https://github.com/lenneTech/nest-server-starter temp`);
105
+ // Clone api
106
+ yield system.run(`cd ${projectDir}/projects && git clone https://github.com/lenneTech/nest-server-starter api`);
105
107
  // Integrate files
106
- if (filesystem.isDirectory(`./${projectDir}/temp`)) {
107
- filesystem.remove(`./${projectDir}/apps/api/src`);
108
- filesystem.copy(`./${projectDir}/temp/src`, `./${projectDir}/apps/api/src`, { overwrite: true });
109
- filesystem.write(`./${projectDir}/apps/api/src/meta.json`, {
110
- name: `${appName}-api-server`,
111
- description: `API for ${appName} app`,
108
+ if (filesystem.isDirectory(`./${projectDir}/projects/api`)) {
109
+ // Remove git folder from clone
110
+ yield system.run(`cd ${projectDir}/projects/api && rm -rf .git`);
111
+ // Prepare meta.json in api
112
+ filesystem.write(`./${projectDir}/projects/api/src/meta.json`, {
113
+ name: `${name}-api-server`,
114
+ description: `API for ${name} app`,
112
115
  version: '0.0.0',
113
116
  });
114
- // Update proxy
115
- yield patching.update(`./${projectDir}/apps/${appName}/proxy.conf.json`, (config) => {
116
- config['/api']['target'] = 'http://localhost:3000';
117
- return config;
118
- });
119
- // Extend ts config
120
- yield patching.update(`./${projectDir}/apps/api/tsconfig.app.json`, (config) => {
121
- config.compilerOptions.resolveJsonModule = true;
122
- return config;
123
- });
124
- // Remove temp files
125
- filesystem.remove(`./${projectDir}/temp`);
126
- // Add scripts
127
- yield patching.update(`./${projectDir}/package.json`, (config) => {
128
- config.scripts['start:app'] = 'npm start';
129
- config.scripts['start:server'] = 'nx serve api';
130
- config.scripts['e2e'] = `nx e2e ${appName}-e2e`;
131
- return config;
132
- });
133
- // Commit changes
134
- yield system.run(`cd ${projectDir} && git add . && git commit -am "Nest Server Starter integrated"`);
117
+ // Check if git init is active
118
+ if (addToGit) {
119
+ // Commit changes
120
+ yield system.run(`cd ${projectDir} && git add . && git commit -am "feat: Nest Server Starter integrated" && git push`);
121
+ }
135
122
  // Done
136
123
  serverSpinner.succeed('Nest Server Starter integrated');
137
124
  }
@@ -139,27 +126,23 @@ const NewCommand = {
139
126
  serverSpinner.warn('Nest Server Starter not integrated');
140
127
  }
141
128
  }
129
+ // Install all packages
130
+ const installSpinner = spin('Install all packages');
131
+ yield system.run(`cd ${projectDir} && npm i && npm run init`);
132
+ installSpinner.succeed('Successfull installed all packages');
142
133
  // We're done, so show what to do next
143
134
  info(``);
144
- success(`Generated ${preset} workspace ${projectDir} with ${appName} app in ${helper.msToMinutesAndSeconds(timer())}m.`);
135
+ success(`Generated ${preset} workspace ${projectDir} with ${name} app in ${helper.msToMinutesAndSeconds(timer())}m.`);
145
136
  info(``);
146
137
  info(`Next:`);
147
- info(` Run ${appName}`);
138
+ info(` Run ${name}`);
148
139
  info(` $ cd ${projectDir}`);
149
- if (preset === 'angular-nest') {
150
- info(` $ npm run start:server`);
151
- info(` $ npm run start:app`);
152
- }
153
- else {
154
- info(` $ npm start`);
155
- }
156
- info(``);
157
- info(`More infos about Nx and Angular: https://nx.dev/angular`);
140
+ info(` $ npm run start`);
158
141
  info(``);
159
142
  // For tests
160
- return `new workspace ${projectDir} with ${appName}`;
143
+ return `new workspace ${projectDir} with ${name}`;
161
144
  }
162
145
  }),
163
146
  };
164
147
  exports.default = NewCommand;
165
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2FuZ3VsYXIvY3JlYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBR0E7O0dBRUc7QUFDSCxNQUFNLFVBQVUsR0FBbUI7SUFDakMsSUFBSSxFQUFFLFFBQVE7SUFDZCxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDWixXQUFXLEVBQUUsNkNBQTZDO0lBQzFELE1BQU0sRUFBRSxLQUFLO0lBQ2IsR0FBRyxFQUFFLENBQU8sT0FBK0IsRUFBRSxFQUFFO1FBQzdDLDZCQUE2QjtRQUM3QixNQUFNLEVBQ0osVUFBVSxFQUNWLEdBQUcsRUFDSCxNQUFNLEVBQ04sVUFBVSxFQUNWLFFBQVEsRUFDUixLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFDckMsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQ25CLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUN0QixNQUFNLEdBQ1AsR0FBRyxPQUFPLENBQUM7UUFFWixjQUFjO1FBQ2QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWxDLE9BQU87UUFDUCxJQUFJLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUVuRCxZQUFZO1FBQ1osSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRTtZQUMvQixPQUFPO1NBQ1I7UUFFRCxXQUFXO1FBQ1gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEVBQUU7WUFDaEUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDNUMsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENB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
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2FuZ3VsYXIvY3JlYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBR0E7O0dBRUc7QUFDSCxNQUFNLFVBQVUsR0FBbUI7SUFDakMsSUFBSSxFQUFFLFFBQVE7SUFDZCxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDWixXQUFXLEVBQUUsNkNBQTZDO0lBQzFELE1BQU0sRUFBRSxLQUFLO0lBQ2IsR0FBRyxFQUFFLENBQU8sT0FBK0IsRUFBRSxFQUFFO1FBQzdDLDZCQUE2QjtRQUM3QixNQUFNLEVBQ0osVUFBVSxFQUNWLEdBQUcsRUFDSCxNQUFNLEVBQ04sVUFBVSxFQUNWLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUNyQyxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFDbkIsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQ3RCLE1BQU0sR0FDUCxHQUFHLE9BQU8sQ0FBQztRQUVaLGNBQWM7UUFDZCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEMsT0FBTztRQUNQLElBQUksQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBRW5ELFlBQVk7UUFDWixJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFO1lBQy9CLE9BQU87U0FDUjtRQUVELDRCQUE0QjtRQUM1QixNQUFNLElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRTtZQUNuRCxJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCLFNBQVMsRUFBRSxJQUFJO1NBQ2hCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxPQUFPO1NBQ1I7UUFFRCx3QkFBd0I7UUFDeEIsTUFBTSxVQUFV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
@@ -95,14 +95,21 @@ const NewCommand = {
95
95
  const serverModule = (0, path_1.join)(path, 'src', 'server', 'server.module.ts');
96
96
  if (filesystem.exists(serverModule)) {
97
97
  const includeSpinner = spin('Include module into server');
98
+ // Import module
98
99
  yield patching.patch(serverModule, {
99
100
  insert: `import { ${namePascal}Module } from './modules/${nameKebab}/${nameKebab}.module';\n`,
100
101
  before: 'import',
101
102
  });
103
+ // Add Module
102
104
  yield patching.patch(serverModule, {
103
105
  insert: ` ${namePascal}Module,\n `,
104
106
  after: new RegExp('imports:[^\\]]*', 'm'),
105
107
  });
108
+ // Add comma if necessary
109
+ yield patching.patch(serverModule, {
110
+ insert: '$1,$2',
111
+ replace: new RegExp('([^,\\s])(\\s*' + namePascal + 'Module,\\s*\\])'),
112
+ });
106
113
  if (filesystem.exists(prettier)) {
107
114
  yield system.run(prettier + ' ' + serverModule);
108
115
  }
@@ -123,4 +130,4 @@ const NewCommand = {
123
130
  }),
124
131
  };
125
132
  exports.default = NewCommand;
126
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3NlcnZlci9tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFDQSwrQkFBNEI7QUFHNUI7O0dBRUc7QUFDSCxNQUFNLFVBQVUsR0FBbUI7SUFDakMsSUFBSSxFQUFFLFFBQVE7SUFDZCxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDWixXQUFXLEVBQUUsNkJBQTZCO0lBQzFDLE1BQU0sRUFBRSxLQUFLO0lBQ2IsR0FBRyxFQUFFLENBQU8sT0FBK0IsRUFBRSxFQUFFO1FBQzdDLDZCQUE2QjtRQUM3QixNQUFNLEVBQ0osVUFBVSxFQUNWLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxFQUNSLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUNyQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxFQUM3QyxNQUFNLEVBQ04sUUFBUSxHQUNULEdBQUcsT0FBTyxDQUFDO1FBRVosY0FBYztRQUNkLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQyxPQUFPO1FBQ1AsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFFbkMsV0FBVztRQUNYLE1BQU0sSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFO1lBQ25ELElBQUksRUFBRSxhQUFhO1NBQ3BCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxPQUFPO1NBQ1I7UUFFRCxnREFBZ0Q7UUFDaEQsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxNQUFNLFVBQVUsR0FB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
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3NlcnZlci9tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFDQSwrQkFBNEI7QUFHNUI7O0dBRUc7QUFDSCxNQUFNLFVBQVUsR0FBbUI7SUFDakMsSUFBSSxFQUFFLFFBQVE7SUFDZCxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDWixXQUFXLEVBQUUsNkJBQTZCO0lBQzFDLE1BQU0sRUFBRSxLQUFLO0lBQ2IsR0FBRyxFQUFFLENBQU8sT0FBK0IsRUFBRSxFQUFFO1FBQzdDLDZCQUE2QjtRQUM3QixNQUFNLEVBQ0osVUFBVSxFQUNWLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxFQUNSLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUNyQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxFQUM3QyxNQUFNLEVBQ04sUUFBUSxHQUNULEdBQUcsT0FBTyxDQUFDO1FBRVosY0FBYztRQUNkLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQyxPQUFPO1FBQ1AsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFFbkMsV0FBVztRQUNYLE1BQU0sSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFO1lBQ25ELElBQUksRUFBRSxhQUFhO1NBQ3BCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxPQUFPO1NBQ1I7UUFFRCxnREFBZ0Q7UUFDaEQsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxNQUFNLFVBQVUsR0FB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
@@ -0,0 +1,3 @@
1
+ module.exports = {
2
+ name: '<%= props.name %>'
3
+ }
@@ -0,0 +1,21 @@
1
+ import { Field, InputType } from '@nestjs/graphql';
2
+ import { IsOptional } from 'class-validator';
3
+ import { <%= props.namePascal %>Input } from './<%= props.nameKebab %>.input';
4
+
5
+ /**
6
+ * <%= props.namePascal %> create input
7
+ */
8
+ @InputType({ description: 'Input data to create a new <%= props.namePascal %>' })
9
+ export class <%= props.namePascal %>CreateInput extends <%= props.namePascal %>Input {
10
+
11
+ // ===================================================================================================================
12
+ // Properties
13
+ // ===================================================================================================================
14
+
15
+ /**
16
+ * Description of the property
17
+ */
18
+ @Field(() => [String], { description: 'Description of the property', nullable: true })
19
+ @IsOptional()
20
+ property?: string[];
21
+ }
@@ -0,0 +1,22 @@
1
+ import { Restricted, RoleEnum } from '@lenne.tech/nest-server';
2
+ import { Field, InputType } from '@nestjs/graphql';
3
+ import { IsOptional } from 'class-validator';
4
+
5
+ /**
6
+ * <%= props.namePascal %> input
7
+ */
8
+ @InputType({ description: 'Input data to update an existing <%= props.namePascal %>' })
9
+ export class <%= props.namePascal %>Input {
10
+
11
+ // ===================================================================================================================
12
+ // Properties
13
+ // ===================================================================================================================
14
+
15
+ /**
16
+ * Description of the property
17
+ */
18
+ @Restricted(RoleEnum.ADMIN, RoleEnum.S_CREATOR)
19
+ @Field(() => [String], { description: 'Description of the property', nullable: true })
20
+ @IsOptional()
21
+ property?: string[];
22
+ }
@@ -0,0 +1,63 @@
1
+ import { mapClasses, Restricted, RoleEnum } from '@lenne.tech/nest-server';
2
+ import { Field, ObjectType } from '@nestjs/graphql';
3
+ import { Prop, Schema as MongooseSchema, SchemaFactory } from '@nestjs/mongoose';
4
+ import { Document, Schema } from 'mongoose';
5
+ import { PersistenceModel } from '../../common/models/persistence.model';
6
+ import { User } from '../user/user.model';
7
+
8
+ export type <%= props.namePascal %>Document = <%= props.namePascal %> & Document;
9
+
10
+ /**
11
+ * <%= props.namePascal %> model
12
+ */
13
+ @ObjectType({ description: '<%= props.namePascal %>' })
14
+ @MongooseSchema({ timestamps: true })
15
+ export class <%= props.namePascal %> extends PersistenceModel {
16
+
17
+ // ===================================================================================================================
18
+ // Properties
19
+ // ===================================================================================================================
20
+
21
+ /**
22
+ * Description of the property
23
+ */
24
+ @Restricted(RoleEnum.ADMIN, RoleEnum.S_CREATOR)
25
+ @Field(() => [String], { description: 'Properties of <%= props.namePascal %>', nullable: 'items'})
26
+ @Prop([String])
27
+ properties: string[] = undefined;
28
+
29
+ /**
30
+ * User how has tested the <%= props.namePascal %>
31
+ */
32
+ @Field(() => User, {
33
+ description: 'User who has tested the <%= props.namePascal %>',
34
+ nullable: true,
35
+ })
36
+ @Prop({ type: Schema.Types.ObjectId, ref: 'User' })
37
+ testedBy: User = undefined;
38
+
39
+ // ===================================================================================================================
40
+ // Methods
41
+ // ===================================================================================================================
42
+
43
+ /**
44
+ * Initialize instance with default values instead of undefined
45
+ */
46
+ init() {
47
+ super.init();
48
+ this.properties = [];
49
+ return this;
50
+ }
51
+
52
+ /**
53
+ * Map input
54
+ *
55
+ * Hint: Non-primitive variables should always be mapped (see mapClasses / mapClassesAsync in ModelHelper)
56
+ */
57
+ map(input) {
58
+ super.map(input);
59
+ return mapClasses(input, {user: User}, this);
60
+ }
61
+ }
62
+
63
+ export const <%= props.namePascal %>Schema = SchemaFactory.createForClass(<%= props.namePascal %>);
@@ -0,0 +1,27 @@
1
+ import { JSON } from '@lenne.tech/nest-server';
2
+ import { Module } from '@nestjs/common';
3
+ import { MongooseModule } from '@nestjs/mongoose';
4
+ import { PubSub } from 'graphql-subscriptions';
5
+ import { UserModule } from '../user/user.module';
6
+ import { <%= props.namePascal %>, <%= props.namePascal %>Schema } from './<%= props.nameKebab %>.model';
7
+ import { <%= props.namePascal %>Resolver } from './<%= props.nameKebab %>.resolver';
8
+ import { <%= props.namePascal %>Service } from './<%= props.nameKebab %>.service';
9
+
10
+ /**
11
+ * <%= props.namePascal %> module
12
+ */
13
+ @Module({
14
+ imports: [MongooseModule.forFeature([{ name: <%= props.namePascal %>.name, schema: <%= props.namePascal %>Schema }]), UserModule],
15
+ controllers: [],
16
+ providers: [
17
+ <%= props.namePascal %>Resolver,
18
+ <%= props.namePascal %>Service,
19
+ JSON,
20
+ {
21
+ provide: 'PUB_SUB',
22
+ useValue: new PubSub(),
23
+ },
24
+ ],
25
+ exports: [MongooseModule, <%= props.namePascal %>Resolver, <%= props.namePascal %>Service]
26
+ })
27
+ export class <%= props.namePascal %>Module {}
@@ -0,0 +1,136 @@
1
+ import { FilterArgs, GraphQLUser, RoleEnum, Roles } from '@lenne.tech/nest-server';
2
+ import { Inject } from '@nestjs/common';
3
+ import { Args, Info, Mutation, Query, Resolver, Subscription } from '@nestjs/graphql';
4
+ import { GraphQLResolveInfo } from 'graphql';
5
+ import { PubSub } from 'graphql-subscriptions';
6
+ import { User } from '../user/user.model';
7
+ import { <%= props.namePascal %>CreateInput } from './inputs/<%= props.nameKebab %>-create.input';
8
+ import { <%= props.namePascal %>Input } from './inputs/<%= props.nameKebab %>.input';
9
+ import { <%= props.namePascal %> } from './<%= props.nameKebab %>.model';
10
+ import { <%= props.namePascal %>Service } from './<%= props.nameKebab %>.service';
11
+
12
+ /**
13
+ * Resolver to process with <%= props.namePascal %> data
14
+ */
15
+ @Resolver(() => <%= props.namePascal %>)
16
+ export class <%= props.namePascal %>Resolver {
17
+
18
+ /**
19
+ * Import services
20
+ */
21
+ constructor(
22
+ private readonly <%= props.nameCamel %>Service: <%= props.namePascal %>Service,
23
+ @Inject('PUB_SUB') protected readonly pubSub: PubSub
24
+ ) {}
25
+
26
+ // ===========================================================================
27
+ // Queries
28
+ // ===========================================================================
29
+
30
+ /**
31
+ * Get <%= props.namePascal %>s (via filter)
32
+ */
33
+ @Roles(RoleEnum.S_USER)
34
+ @Query(() => [<%= props.namePascal %>], { description: 'Find <%= props.namePascal %> (via filter)' })
35
+ async find<%= props.namePascal %>s(
36
+ @Info() info: GraphQLResolveInfo,
37
+ @GraphQLUser() user: User,
38
+ @Args() args?: FilterArgs
39
+ ) {
40
+ return await this.<%= props.nameCamel %>Service.find(args, {
41
+ currentUser: user,
42
+ fieldSelection: { info, select: 'find<%= props.namePascal %>s' },
43
+ inputType: FilterArgs
44
+ });
45
+ }
46
+
47
+ /**
48
+ * Get <%= props.namePascal %> via ID
49
+ */
50
+ @Roles(RoleEnum.S_USER)
51
+ @Query(() => <%= props.namePascal %>, { description: 'Get <%= props.namePascal %> with specified ID' })
52
+ async get<%= props.namePascal %>(
53
+ @Info() info: GraphQLResolveInfo,
54
+ @GraphQLUser() user: User,
55
+ @Args('id') id: string,
56
+ ): Promise<<%= props.namePascal %>> {
57
+ return await this.<%= props.nameCamel %>Service.get(id, {
58
+ currentUser: user,
59
+ fieldSelection: { info, select: 'get<%= props.namePascal %>' },
60
+ });
61
+ }
62
+
63
+ // ===========================================================================
64
+ // Mutations
65
+ // ===========================================================================
66
+
67
+ /**
68
+ * Create new <%= props.namePascal %>
69
+ */
70
+ @Roles(RoleEnum.S_USER)
71
+ @Mutation(() => <%= props.namePascal %>, { description: 'Create a new <%= props.namePascal %>' })
72
+ async create<%= props.namePascal %>(
73
+ @Info() info: GraphQLResolveInfo,
74
+ @GraphQLUser() user: User,
75
+ @Args('input') input: <%= props.namePascal %>CreateInput
76
+ ): Promise<<%= props.namePascal %>> {
77
+ return await this.<%= props.nameCamel %>Service.create(input, {
78
+ currentUser: user,
79
+ fieldSelection: { info, select: 'create<%= props.namePascal %>' },
80
+ inputType: <%= props.namePascal %>CreateInput
81
+ });
82
+ }
83
+
84
+ /**
85
+ * Delete existing <%= props.namePascal %>
86
+ */
87
+ @Roles(RoleEnum.S_USER)
88
+ @Mutation(() => <%= props.namePascal %>, { description: 'Delete existing <%= props.namePascal %>' })
89
+ async delete<%= props.namePascal %>(
90
+ @Info() info: GraphQLResolveInfo,
91
+ @GraphQLUser() user: User,
92
+ @Args('id') id: string
93
+ ): Promise<<%= props.namePascal %>> {
94
+ return await this.<%= props.nameCamel %>Service.delete(id, {
95
+ currentUser: user,
96
+ fieldSelection: { info, select: 'delete<%= props.namePascal %>' },
97
+ roles: [RoleEnum.ADMIN, RoleEnum.S_CREATOR]
98
+ });
99
+ }
100
+
101
+ /**
102
+ * Update existing <%= props.namePascal %>
103
+ */
104
+ @Roles(RoleEnum.S_USER)
105
+ @Mutation(() => <%= props.namePascal %>, { description: 'Update existing <%= props.namePascal %>' })
106
+ async update<%= props.namePascal %>(
107
+ @Info() info: GraphQLResolveInfo,
108
+ @GraphQLUser() user: User,
109
+ @Args('id') id: string,
110
+ @Args('input') input: <%= props.namePascal %>Input
111
+ ): Promise<<%= props.namePascal %>> {
112
+ return await this.<%= props.nameCamel %>Service.update(id, input, {
113
+ currentUser: user,
114
+ fieldSelection: { info, select: 'update<%= props.namePascal %>' },
115
+ inputType: <%= props.namePascal %>Input,
116
+ roles: [RoleEnum.ADMIN, RoleEnum.S_CREATOR]
117
+ });
118
+ }
119
+
120
+ // ===========================================================================
121
+ // Subscriptions
122
+ // ===========================================================================
123
+
124
+ /**
125
+ * Subscription for create <%= props.namePascal %>
126
+ */
127
+ @Subscription(() => <%= props.namePascal %>, {
128
+ filter(this: <%= props.namePascal %>Resolver, payload, variables, context) {
129
+ return context?.user?.hasRole?.(RoleEnum.ADMIN);
130
+ },
131
+ resolve: (value) => value,
132
+ })
133
+ async <%= props.nameCamel %>Created() {
134
+ return this.pubSub.asyncIterator('<%= props.nameCamel %>Created');
135
+ }
136
+ }
@@ -0,0 +1,74 @@
1
+ import { assignPlain, CrudService, ServiceOptions } from '@lenne.tech/nest-server';
2
+ import { Inject, Injectable, NotFoundException } from '@nestjs/common';
3
+ import { InjectModel } from '@nestjs/mongoose';
4
+ import { PubSub } from 'graphql-subscriptions';
5
+ import { Model } from 'mongoose';
6
+ import { <%= props.namePascal %>CreateInput } from './inputs/<%= props.nameKebab %>-create.input';
7
+ import { <%= props.namePascal %>, <%= props.namePascal %>Document } from './<%= props.nameKebab %>.model';
8
+
9
+ /**
10
+ * <%= props.namePascal %> service
11
+ */
12
+ @Injectable()
13
+ export class <%= props.namePascal %>Service extends CrudService<<%= props.namePascal %>> {
14
+
15
+ // ===================================================================================================================
16
+ // Properties
17
+ // ===================================================================================================================
18
+
19
+ // ===================================================================================================================
20
+ // Injections
21
+ // ===================================================================================================================
22
+
23
+ /**
24
+ * Constructor for injecting services
25
+ */
26
+ constructor(
27
+ @InjectModel('<%= props.namePascal %>') protected readonly <%= props.nameCamel %>Model: Model<<%= props.namePascal %>Document>,
28
+ @Inject('PUB_SUB') protected readonly pubSub: PubSub
29
+ ) {
30
+ super({mainDbModel: <%= props.nameCamel %>Model, mainModelConstructor: <%= props.namePascal %>});
31
+ }
32
+
33
+ // ===================================================================================================================
34
+ // Methods
35
+ // ===================================================================================================================
36
+
37
+ /**
38
+ * Create new <%= props.namePascal %>
39
+ * Overwrites create method from CrudService
40
+ */
41
+ async create(input: <%= props.namePascal %>CreateInput, serviceOptions?: ServiceOptions): Promise<<%= props.namePascal %>> {
42
+ // Get new <%= props.namePascal %>
43
+ const created<%= props.namePascal %> = await super.create(input, serviceOptions);
44
+
45
+ // Inform subscriber
46
+ if (serviceOptions?.pubSub === undefined || serviceOptions.pubSub) {
47
+ await this.pubSub.publish('<%= props.nameCamel %>Created', <%= props.namePascal %>.map(created<%= props.namePascal %>));
48
+ }
49
+
50
+ // Return created <%= props.namePascal %>
51
+ return created<%= props.namePascal %>;
52
+ }
53
+
54
+ /**
55
+ * Example method
56
+ * Extends the CrudService
57
+ */
58
+ async exampleMethode(id: string, input: Record<string, any>, serviceOptions?: ServiceOptions): Promise<<%= props.namePascal %>> {
59
+
60
+ // Get and check <%= props.namePascal %>
61
+ const <%= props.nameCamel %> = await this.mainDbModel.findById(id).exec();
62
+ if (!<%= props.nameCamel %>) {
63
+ throw new NotFoundException(`<%= props.namePascal %> not found with ID: ${id}`);
64
+ }
65
+
66
+ // Process input and output
67
+ return await this.process(async (data) => {
68
+
69
+ // Update, save and return <%= props.namePascal %>
70
+ return await assignPlain(<%= props.nameCamel %>, data.input).save();
71
+
72
+ }, {input, serviceOptions});
73
+ }
74
+ }
@@ -0,0 +1,61 @@
1
+ # <%= props.name %>
2
+ <%= props.description %>
3
+
4
+ ## Requirements
5
+
6
+ - [Node.js incl. npm](https://nodejs.org):
7
+ the runtime environment for your server
8
+
9
+ - [MongoDB](https://docs.mongodb.com/manual/installation/#mongodb-community-edition-installation-tutorials)
10
+ the database for your objects
11
+
12
+
13
+ ## Start the server
14
+
15
+ `$ npm run start:dev`
16
+
17
+
18
+ ## Extend the server
19
+
20
+ This server is based on [lenne.Tech Nest Server](https://github.com/lenneTech/nest-server).
21
+
22
+ Since the lenne.Tech Nest Server is based on [Nest](https://nestjs.com/), you can find all information about extending
23
+ the **<%= props.name %>** in the [documentation of Nest](https://docs.nestjs.com/).
24
+
25
+ The documentation of the extensions and auxiliary classes that the
26
+ [lenne.Tech Nest Server](https://github.com/lenneTech/nest-server) contains is currently under construction.
27
+ As long as this is not yet available,have a look at the
28
+ [source code](https://github.com/lenneTech/nest-server/tree/master/src/core).
29
+ There you will find a lot of things that will help you to extend your server, such as:
30
+
31
+ - [GraphQL scalars](https://github.com/lenneTech/nest-server/tree/master/src/core/common/scalars)
32
+ - [Filter and pagination](https://github.com/lenneTech/nest-server/tree/master/src/core/common/args)
33
+ - [Decorators for restrictions and roles](https://github.com/lenneTech/nest-server/tree/master/src/core/common/decorators)
34
+ - [Authorisation handling](https://github.com/lenneTech/nest-server/tree/master/src/core/modules/auth)
35
+ - [Ready to use user module](https://github.com/lenneTech/nest-server/tree/master/src/core/modules/user)
36
+ - [Common helpers](https://github.com/lenneTech/nest-server/tree/master/src/core/common/helpers) and
37
+ [helpers for tests](https://github.com/lenneTech/nest-server/blob/master/src/test/test.helper.ts)
38
+ - ...
39
+
40
+
41
+ ## Further information
42
+
43
+ ### Running the app
44
+
45
+ ```bash
46
+ # Development
47
+ $ npm start
48
+
49
+ # Watch mode
50
+ $ npm run start:dev
51
+
52
+ # Production mode
53
+ $ npm run start:prod
54
+ ```
55
+
56
+ ### Test
57
+
58
+ ```bash
59
+ # e2e tests
60
+ $ npm run test:e2e
61
+ ```
@@ -0,0 +1,165 @@
1
+ import { RoleEnum, TestGraphQLType, TestHelper } from '@lenne.tech/nest-server';
2
+ import { Test, TestingModule } from '@nestjs/testing';
3
+ import { PubSub } from 'graphql-subscriptions';
4
+ import envConfig from '../src/config.env';
5
+ import { User } from '../src/server/modules/user/user.model';
6
+ import { UserService } from '../src/server/modules/user/user.service';
7
+ import { ServerModule } from '../src/server/server.module';
8
+ import { MongoClient, ObjectId } from 'mongodb';
9
+
10
+ describe('<%= props.namePascal %> (e2e)', () => {
11
+ let app;
12
+ let testHelper: TestHelper;
13
+
14
+ // database
15
+ let connection;
16
+ let db;
17
+
18
+ // Global vars
19
+ let userService: UserService;
20
+ const users: Partial<User & { token: string }>[] = [];
21
+
22
+ // ===================================================================================================================
23
+ // Preparations
24
+ // ===================================================================================================================
25
+
26
+ /**
27
+ * Before all tests
28
+ */
29
+ beforeAll(async () => {
30
+ try {
31
+ const moduleFixture: TestingModule = await Test.createTestingModule({
32
+ imports: [ServerModule],
33
+ providers: [
34
+ UserService,
35
+ {
36
+ provide: 'PUB_SUB',
37
+ useValue: new PubSub(),
38
+ },
39
+ ],
40
+ }).compile();
41
+ app = moduleFixture.createNestApplication();
42
+ app.setBaseViewsDir(envConfig.templates.path);
43
+ app.setViewEngine(envConfig.templates.engine);
44
+ await app.init();
45
+ testHelper = new TestHelper(app);
46
+ userService = moduleFixture.get<UserService>(UserService);
47
+
48
+ // Connection to database
49
+ connection = await MongoClient.connect(envConfig.mongoose.uri);
50
+ db = await connection.db();
51
+ } catch (e) {
52
+ console.log('beforeAllError', e);
53
+ }
54
+ });
55
+
56
+ /**
57
+ * After all tests are finished
58
+ */
59
+ afterAll(async () => {
60
+ await connection.close();
61
+ await app.close();
62
+ });
63
+
64
+ // ===================================================================================================================
65
+ // Initialization tests
66
+ // ===================================================================================================================
67
+
68
+ /**
69
+ * Create and verify users for testing
70
+ */
71
+ it('createAndVerifyUsers', async () => {
72
+ const userCount = 2;
73
+ for (let i = 0; i < userCount; i++) {
74
+ const random = Math.random().toString(36).substring(7);
75
+ const input = {
76
+ password: random,
77
+ email: random + '@testusers.com',
78
+ firstName: 'Test' + random,
79
+ lastName: 'User' + random,
80
+ };
81
+
82
+ // Sign up user
83
+ const res: any = await testHelper.graphQl({
84
+ name: 'signUp',
85
+ type: TestGraphQLType.MUTATION,
86
+ arguments: { input },
87
+ fields: [{ user: ['id', 'email', 'firstName', 'lastName'] }],
88
+ });
89
+ res.user.password = input.password;
90
+ users.push(res.user);
91
+
92
+ // Verify user
93
+ await db.collection('users').updateOne({ _id: new ObjectId(res.id) }, { $set: { verified: true } });
94
+ }
95
+ expect(users.length).toBeGreaterThanOrEqual(userCount);
96
+ });
97
+
98
+ /**
99
+ * Sign in users
100
+ */
101
+ it('signInUsers', async () => {
102
+ for (const user of users) {
103
+ const res: any = await testHelper.graphQl({
104
+ name: 'signIn',
105
+ arguments: {
106
+ input: {
107
+ email: user.email,
108
+ password: user.password,
109
+ },
110
+ },
111
+ fields: ['token', { user: ['id', 'email'] }],
112
+ });
113
+ expect(res.user.id).toEqual(user.id);
114
+ expect(res.user.email).toEqual(user.email);
115
+ user.token = res.token;
116
+ }
117
+ });
118
+
119
+ /**
120
+ * Prepare users
121
+ */
122
+ it('prepareUsers', async () => {
123
+ await db
124
+ .collection('users')
125
+ .findOneAndUpdate({ _id: new ObjectId(users[0].id) }, { $set: { roles: [RoleEnum.ADMIN] } });
126
+ });
127
+
128
+ // ===================================================================================================================
129
+ // Tests for <%= props.namePascal %>
130
+ // ===================================================================================================================
131
+
132
+ /**
133
+ * Test
134
+ */
135
+ it('test', async () => {
136
+ console.log('Implement <%= props.namePascal %> test here');
137
+ });
138
+
139
+ // ===================================================================================================================
140
+ // Clean up tests
141
+ // ===================================================================================================================
142
+
143
+ /**
144
+ * Delete users
145
+ */
146
+ it('deleteUsers', async () => {
147
+ // Add admin role to user 2
148
+ await userService.setRoles(users[1].id, ['admin']);
149
+
150
+ for (const user of users) {
151
+ const res: any = await testHelper.graphQl(
152
+ {
153
+ name: 'deleteUser',
154
+ type: TestGraphQLType.MUTATION,
155
+ arguments: {
156
+ id: user.id,
157
+ },
158
+ fields: ['id'],
159
+ },
160
+ { token: users[1].token }
161
+ );
162
+ expect(res.id).toEqual(user.id);
163
+ }
164
+ });
165
+ });
@@ -0,0 +1,30 @@
1
+ # <%= props.name %>
2
+
3
+ [![License](https://img.shields.io/github/license/<%= props.nameKebab %>)](/LICENSE) [![CircleCI](https://circleci.com/gh/<%= props.nameKebab %>/tree/master.svg?style=shield)](https://circleci.com/gh/<%= props.nameKebab %>/tree/master)
4
+ [![Dependency Status](https://david-dm.org/<%= props.nameKebab %>.svg)](https://david-dm.org/<%= props.nameKebab %>) [![devDependency Status](https://david-dm.org/<%= props.nameKebab %>/dev-status.svg)](https://david-dm.org/<%= props.nameKebab %>?type=dev)
5
+
6
+ <!--
7
+ [![GitHub forks](https://img.shields.io/github/forks/<%= props.nameKebab %>)](https://github.com/<%= props.nameKebab %>/fork) [![GitHub stars](https://img.shields.io/github/stars/<%= props.nameKebab %>)](https://github.com/<%= props.nameKebab %>)
8
+ -->
9
+
10
+
11
+ ## Requirements
12
+
13
+ - [Node.js incl. npm](https://nodejs.org):
14
+ the runtime environment for your project
15
+
16
+
17
+ ## Scripts
18
+
19
+ ```bash
20
+ # Lint
21
+ $ npm run lint
22
+
23
+ # Test
24
+ $ npm test
25
+ $ npm run watch
26
+ $ npm run coverage
27
+
28
+ # Build
29
+ $ npm build
30
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lenne.tech/cli",
3
- "version": "0.0.68",
3
+ "version": "0.0.73",
4
4
  "description": "lenne.Tech CLI: lt",
5
5
  "keywords": [
6
6
  "lenne.Tech",
@@ -21,7 +21,7 @@
21
21
  "build": "npm run lint && npm run test && npm run clean-build && npm run compile && npm run copy-templates",
22
22
  "clean-build": "rimraf ./build",
23
23
  "compile": "tsc -p .",
24
- "copy-templates": "path-exists ./src/templates && rimraf ./build/templates && cpy --parents --cwd=./src templates/**/* ../build || echo 'No templates to copy'",
24
+ "copy-templates": "cp -R ./src/templates ./build/templates",
25
25
  "coverage": "jest --coverage",
26
26
  "format": "prettier --write 'src/**/*.{js,ts,tsx,json}' '!src/templates/**/*'",
27
27
  "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix --cache",
@@ -53,20 +53,20 @@
53
53
  "find-file-up": "2.0.1",
54
54
  "gluegun": "5.1.2",
55
55
  "open": "8.4.0",
56
- "standard-version": "^9.3.2",
57
- "ts-node": "10.7.0",
56
+ "standard-version": "9.5.0",
57
+ "ts-node": "10.8.0",
58
58
  "typescript": "4.6.4"
59
59
  },
60
60
  "devDependencies": {
61
61
  "@lenne.tech/npm-package-helper": "0.0.12",
62
- "@types/jest": "27.5.0",
63
- "@types/node": "16.11.33",
64
- "@typescript-eslint/eslint-plugin": "5.22.0",
65
- "@typescript-eslint/parser": "5.22.0",
62
+ "@types/jest": "27.5.1",
63
+ "@types/node": "16.11.36",
64
+ "@typescript-eslint/eslint-plugin": "5.25.0",
65
+ "@typescript-eslint/parser": "5.25.0",
66
66
  "cpy-cli": "4.1.0",
67
- "eslint": "8.15.0",
67
+ "eslint": "8.16.0",
68
68
  "eslint-config-prettier": "8.5.0",
69
- "husky": "7.0.4",
69
+ "husky": "8.0.1",
70
70
  "jest": "28.1.0",
71
71
  "path-exists-cli": "2.0.0",
72
72
  "prettier": "2.6.2",