@ronas-it/nx-generators 0.10.1 → 0.10.3
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.
- package/.eslintrc.json +37 -0
- package/jest.config.ts +10 -0
- package/package.json +2 -2
- package/project.json +61 -0
- package/src/generators/code-checks/config.ts +17 -0
- package/src/generators/code-checks/generator.ts +72 -0
- package/src/generators/code-checks/scripts.ts +5 -0
- package/src/generators/entity-api/generator.ts +127 -0
- package/src/generators/expo-app/app-files/app.config.ts.template +1 -0
- package/src/generators/expo-app/generator.ts +152 -0
- package/src/generators/expo-app/scripts.ts +12 -0
- package/src/generators/form/generator.ts +53 -0
- package/src/generators/form/utils/add-form-usage.ts +86 -0
- package/src/generators/form/utils/get-app-name.ts +3 -0
- package/src/generators/form/utils/get-form-utils-directory.ts +46 -0
- package/src/generators/form/utils/update-index.ts +14 -0
- package/src/generators/lib-move/generator.ts +57 -0
- package/src/generators/lib-remove/generator.ts +25 -0
- package/src/generators/lib-rename/generator.ts +25 -0
- package/src/generators/lib-tags/generator.ts +68 -0
- package/src/generators/lib-tags/interfaces/context.ts +9 -0
- package/src/generators/lib-tags/interfaces/index.ts +2 -0
- package/src/generators/lib-tags/interfaces/verify-tag-config.ts +12 -0
- package/src/generators/lib-tags/types/index.ts +1 -0
- package/src/generators/lib-tags/types/tag.ts +1 -0
- package/src/generators/lib-tags/utils/check-lib-tags.ts +143 -0
- package/src/generators/next-app/generator.ts +99 -0
- package/src/generators/react-component/generator.ts +80 -0
- package/src/generators/react-lib/generator.ts +86 -0
- package/src/generators/repo-config/generator.ts +44 -0
- package/src/generators/repo-config/scripts.ts +3 -0
- package/src/shared/dependencies.ts +76 -0
- package/src/shared/enums/base-generator-type.ts +4 -0
- package/src/shared/generators/api-client/generator.ts +49 -0
- package/src/shared/generators/app-env/generator.ts +37 -0
- package/src/shared/generators/app-env/lib-files/shared/utils/app-env/src/app-env.ts.template +1 -1
- package/src/shared/generators/auth/generator.ts +107 -0
- package/src/shared/generators/form-utils/generator.ts +23 -0
- package/src/shared/generators/rn-styles/generator.ts +49 -0
- package/src/shared/generators/storage/generator.ts +34 -0
- package/src/shared/generators/store/generator.ts +48 -0
- package/src/shared/generators/store/schema.d.ts +1 -1
- package/src/shared/generators/ui-kitten/generator.ts +55 -0
- package/src/shared/utils/cli-utils.ts +149 -0
- package/src/shared/utils/config-utils.ts +146 -0
- package/src/shared/utils/constants.ts +3 -0
- package/src/shared/utils/dynamic-import.ts +4 -0
- package/src/shared/utils/format-utils.ts +16 -0
- package/src/shared/utils/get-lib-directory-name.ts +12 -0
- package/src/shared/utils/ts-utils.ts +17 -0
- package/tsconfig.json +16 -0
- package/tsconfig.lib.json +10 -0
- package/tsconfig.spec.json +14 -0
- package/src/generators/code-checks/config.d.ts +0 -18
- package/src/generators/code-checks/config.js +0 -20
- package/src/generators/code-checks/config.js.map +0 -1
- package/src/generators/code-checks/generator.d.ts +0 -4
- package/src/generators/code-checks/generator.js +0 -53
- package/src/generators/code-checks/generator.js.map +0 -1
- package/src/generators/code-checks/scripts.d.ts +0 -6
- package/src/generators/code-checks/scripts.js +0 -8
- package/src/generators/code-checks/scripts.js.map +0 -1
- package/src/generators/entity-api/generator.d.ts +0 -4
- package/src/generators/entity-api/generator.js +0 -84
- package/src/generators/entity-api/generator.js.map +0 -1
- package/src/generators/expo-app/app-files/.env.development.template +0 -1
- package/src/generators/expo-app/generator.d.ts +0 -4
- package/src/generators/expo-app/generator.js +0 -93
- package/src/generators/expo-app/generator.js.map +0 -1
- package/src/generators/expo-app/scripts.d.ts +0 -13
- package/src/generators/expo-app/scripts.js +0 -15
- package/src/generators/expo-app/scripts.js.map +0 -1
- package/src/generators/form/generator.d.ts +0 -4
- package/src/generators/form/generator.js +0 -48
- package/src/generators/form/generator.js.map +0 -1
- package/src/generators/form/utils/add-form-usage.d.ts +0 -1
- package/src/generators/form/utils/add-form-usage.js +0 -67
- package/src/generators/form/utils/add-form-usage.js.map +0 -1
- package/src/generators/form/utils/get-app-name.d.ts +0 -1
- package/src/generators/form/utils/get-app-name.js +0 -8
- package/src/generators/form/utils/get-app-name.js.map +0 -1
- package/src/generators/form/utils/get-form-utils-directory.d.ts +0 -2
- package/src/generators/form/utils/get-form-utils-directory.js +0 -34
- package/src/generators/form/utils/get-form-utils-directory.js.map +0 -1
- package/src/generators/form/utils/index.js +0 -8
- package/src/generators/form/utils/index.js.map +0 -1
- package/src/generators/form/utils/update-index.d.ts +0 -2
- package/src/generators/form/utils/update-index.js +0 -18
- package/src/generators/form/utils/update-index.js.map +0 -1
- package/src/generators/lib-move/generator.d.ts +0 -4
- package/src/generators/lib-move/generator.js +0 -34
- package/src/generators/lib-move/generator.js.map +0 -1
- package/src/generators/lib-remove/generator.d.ts +0 -4
- package/src/generators/lib-remove/generator.js +0 -22
- package/src/generators/lib-remove/generator.js.map +0 -1
- package/src/generators/lib-rename/generator.d.ts +0 -4
- package/src/generators/lib-rename/generator.js +0 -24
- package/src/generators/lib-rename/generator.js.map +0 -1
- package/src/generators/lib-tags/generator.d.ts +0 -4
- package/src/generators/lib-tags/generator.js +0 -56
- package/src/generators/lib-tags/generator.js.map +0 -1
- package/src/generators/lib-tags/interfaces/context.d.ts +0 -8
- package/src/generators/lib-tags/interfaces/context.js +0 -3
- package/src/generators/lib-tags/interfaces/context.js.map +0 -1
- package/src/generators/lib-tags/interfaces/index.d.ts +0 -1
- package/src/generators/lib-tags/interfaces/index.js +0 -5
- package/src/generators/lib-tags/interfaces/index.js.map +0 -1
- package/src/generators/lib-tags/utils/check-lib-tags.d.ts +0 -4
- package/src/generators/lib-tags/utils/check-lib-tags.js +0 -99
- package/src/generators/lib-tags/utils/check-lib-tags.js.map +0 -1
- package/src/generators/lib-tags/utils/index.js +0 -5
- package/src/generators/lib-tags/utils/index.js.map +0 -1
- package/src/generators/next-app/generator.d.ts +0 -4
- package/src/generators/next-app/generator.js +0 -71
- package/src/generators/next-app/generator.js.map +0 -1
- package/src/generators/react-component/generator.d.ts +0 -4
- package/src/generators/react-component/generator.js +0 -55
- package/src/generators/react-component/generator.js.map +0 -1
- package/src/generators/react-lib/generator.d.ts +0 -4
- package/src/generators/react-lib/generator.js +0 -49
- package/src/generators/react-lib/generator.js.map +0 -1
- package/src/generators/repo-config/generator.d.ts +0 -3
- package/src/generators/repo-config/generator.js +0 -36
- package/src/generators/repo-config/generator.js.map +0 -1
- package/src/generators/repo-config/scripts.d.ts +0 -4
- package/src/generators/repo-config/scripts.js +0 -6
- package/src/generators/repo-config/scripts.js.map +0 -1
- package/src/index.js +0 -1
- package/src/index.js.map +0 -1
- package/src/shared/dependencies.d.ts +0 -73
- package/src/shared/dependencies.js +0 -79
- package/src/shared/dependencies.js.map +0 -1
- package/src/shared/enums/base-generator-type.d.ts +0 -4
- package/src/shared/enums/base-generator-type.js +0 -9
- package/src/shared/enums/base-generator-type.js.map +0 -1
- package/src/shared/enums/index.js +0 -5
- package/src/shared/enums/index.js.map +0 -1
- package/src/shared/generators/api-client/generator.d.ts +0 -6
- package/src/shared/generators/api-client/generator.js +0 -35
- package/src/shared/generators/api-client/generator.js.map +0 -1
- package/src/shared/generators/api-client/index.js +0 -5
- package/src/shared/generators/api-client/index.js.map +0 -1
- package/src/shared/generators/app-env/generator.d.ts +0 -6
- package/src/shared/generators/app-env/generator.js +0 -25
- package/src/shared/generators/app-env/generator.js.map +0 -1
- package/src/shared/generators/app-env/index.js +0 -5
- package/src/shared/generators/app-env/index.js.map +0 -1
- package/src/shared/generators/auth/generator.d.ts +0 -4
- package/src/shared/generators/auth/generator.js +0 -74
- package/src/shared/generators/auth/generator.js.map +0 -1
- package/src/shared/generators/auth/index.js +0 -5
- package/src/shared/generators/auth/index.js.map +0 -1
- package/src/shared/generators/form-utils/generator.d.ts +0 -5
- package/src/shared/generators/form-utils/generator.js +0 -22
- package/src/shared/generators/form-utils/generator.js.map +0 -1
- package/src/shared/generators/form-utils/index.js +0 -5
- package/src/shared/generators/form-utils/index.js.map +0 -1
- package/src/shared/generators/index.js +0 -12
- package/src/shared/generators/index.js.map +0 -1
- package/src/shared/generators/rn-styles/generator.d.ts +0 -6
- package/src/shared/generators/rn-styles/generator.js +0 -36
- package/src/shared/generators/rn-styles/generator.js.map +0 -1
- package/src/shared/generators/rn-styles/index.js +0 -5
- package/src/shared/generators/rn-styles/index.js.map +0 -1
- package/src/shared/generators/storage/generator.d.ts +0 -6
- package/src/shared/generators/storage/generator.js +0 -25
- package/src/shared/generators/storage/generator.js.map +0 -1
- package/src/shared/generators/storage/index.js +0 -5
- package/src/shared/generators/storage/index.js.map +0 -1
- package/src/shared/generators/store/generator.d.ts +0 -4
- package/src/shared/generators/store/generator.js +0 -34
- package/src/shared/generators/store/generator.js.map +0 -1
- package/src/shared/generators/store/index.js +0 -5
- package/src/shared/generators/store/index.js.map +0 -1
- package/src/shared/generators/ui-kitten/generator.d.ts +0 -6
- package/src/shared/generators/ui-kitten/generator.js +0 -40
- package/src/shared/generators/ui-kitten/generator.js.map +0 -1
- package/src/shared/generators/ui-kitten/index.js +0 -5
- package/src/shared/generators/ui-kitten/index.js.map +0 -1
- package/src/shared/utils/cli-utils.d.ts +0 -28
- package/src/shared/utils/cli-utils.js +0 -125
- package/src/shared/utils/cli-utils.js.map +0 -1
- package/src/shared/utils/config-utils.d.ts +0 -19
- package/src/shared/utils/config-utils.js +0 -115
- package/src/shared/utils/config-utils.js.map +0 -1
- package/src/shared/utils/constants.d.ts +0 -3
- package/src/shared/utils/constants.js +0 -7
- package/src/shared/utils/constants.js.map +0 -1
- package/src/shared/utils/dynamic-import.d.ts +0 -1
- package/src/shared/utils/dynamic-import.js +0 -5
- package/src/shared/utils/dynamic-import.js.map +0 -1
- package/src/shared/utils/format-utils.d.ts +0 -4
- package/src/shared/utils/format-utils.js +0 -18
- package/src/shared/utils/format-utils.js.map +0 -1
- package/src/shared/utils/get-lib-directory-name.d.ts +0 -1
- package/src/shared/utils/get-lib-directory-name.js +0 -15
- package/src/shared/utils/get-lib-directory-name.js.map +0 -1
- package/src/shared/utils/index.js +0 -11
- package/src/shared/utils/index.js.map +0 -1
- package/src/shared/utils/ts-utils.d.ts +0 -2
- package/src/shared/utils/ts-utils.js +0 -21
- package/src/shared/utils/ts-utils.js.map +0 -1
- /package/src/generators/form/utils/{index.d.ts → index.ts} +0 -0
- /package/src/generators/lib-tags/utils/{index.d.ts → index.ts} +0 -0
- /package/src/{index.d.ts → index.ts} +0 -0
- /package/src/shared/enums/{index.d.ts → index.ts} +0 -0
- /package/src/shared/generators/api-client/{index.d.ts → index.ts} +0 -0
- /package/src/shared/generators/app-env/{index.d.ts → index.ts} +0 -0
- /package/src/shared/generators/auth/{index.d.ts → index.ts} +0 -0
- /package/src/shared/generators/form-utils/{index.d.ts → index.ts} +0 -0
- /package/src/shared/generators/{index.d.ts → index.ts} +0 -0
- /package/src/shared/generators/rn-styles/{index.d.ts → index.ts} +0 -0
- /package/src/shared/generators/storage/{index.d.ts → index.ts} +0 -0
- /package/src/shared/generators/store/{index.d.ts → index.ts} +0 -0
- /package/src/shared/generators/ui-kitten/{index.d.ts → index.ts} +0 -0
- /package/src/shared/utils/{index.d.ts → index.ts} +0 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import * as readline from 'readline';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import { getProjects, ProjectType, Tree } from '@nx/devkit';
|
|
4
|
+
import { dynamicImport } from './dynamic-import';
|
|
5
|
+
import { constants } from './constants';
|
|
6
|
+
|
|
7
|
+
export const createCliReadline = (): readline.Interface => readline.createInterface({
|
|
8
|
+
input: process.stdin,
|
|
9
|
+
output: process.stdout,
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
export const askQuestion = (question: string, defaultAnswer?: string, cliReadline?: readline.Interface): Promise<string> => {
|
|
13
|
+
const rl = cliReadline || createCliReadline();
|
|
14
|
+
|
|
15
|
+
if (defaultAnswer) {
|
|
16
|
+
rl.write(defaultAnswer);
|
|
17
|
+
// Move cursor to end of the line
|
|
18
|
+
setTimeout(() => rl.write(null, { ctrl: true, name: 'e' }));
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return new Promise((resolve) =>
|
|
22
|
+
rl.question(question, (answer) => {
|
|
23
|
+
if (!cliReadline) {
|
|
24
|
+
rl.close();
|
|
25
|
+
}
|
|
26
|
+
resolve(answer);
|
|
27
|
+
}),
|
|
28
|
+
);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export enum LibraryType {
|
|
32
|
+
UI = 'ui',
|
|
33
|
+
DATA_ACCESS = 'data-access',
|
|
34
|
+
FEATURES = 'features',
|
|
35
|
+
UTILS = 'utils',
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const parseLibsPaths = (): Record<string, Array<string>> => {
|
|
39
|
+
let tsconfig;
|
|
40
|
+
|
|
41
|
+
if (fs.existsSync('tsconfig.base.json')) {
|
|
42
|
+
tsconfig = JSON.parse(fs.readFileSync('tsconfig.base.json', 'utf8'));
|
|
43
|
+
} else {
|
|
44
|
+
tsconfig = JSON.parse(fs.readFileSync('tsconfig.json', 'utf8'));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return tsconfig.compilerOptions.paths;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export const validateLibraryType = (type: string): string => {
|
|
51
|
+
const allLibraryTypes = Object.values(LibraryType);
|
|
52
|
+
|
|
53
|
+
if (!allLibraryTypes.includes(type as LibraryType)) {
|
|
54
|
+
throw new Error(`Invalid library type: ${type}.\nAvailable types: ${allLibraryTypes.join(', ')}`);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return type;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export const getNxLibsPaths = (types: Array<LibraryType>) => {
|
|
61
|
+
const libs = parseLibsPaths();
|
|
62
|
+
|
|
63
|
+
return Object.values(libs)
|
|
64
|
+
.map((value) => value[0].replace('/index.ts', ''))
|
|
65
|
+
.filter((value) => types.some((type) => value.includes(type)));
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export const searchNxLibsPaths = (
|
|
69
|
+
paths: Array<string>,
|
|
70
|
+
input: string,
|
|
71
|
+
method: 'includes' | 'startsWith' | 'endsWith' = 'includes',
|
|
72
|
+
) => {
|
|
73
|
+
return paths.filter((path) => path[method](input));
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
export const searchAliasPath = (input: string) => {
|
|
77
|
+
const libs = parseLibsPaths();
|
|
78
|
+
const path = Object.keys(libs).find((key) => libs[key][0].includes(input));
|
|
79
|
+
|
|
80
|
+
return path;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export const filterSource = async (input: string, source: Array<string>) => {
|
|
84
|
+
const filteredData = input
|
|
85
|
+
? source.filter((pathname) => pathname.toLowerCase().includes(input.toLowerCase()))
|
|
86
|
+
: source;
|
|
87
|
+
|
|
88
|
+
return filteredData.map((path) => ({ value: path }));
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
export const appendFileContent = (path: string, endContent: string, tree: Tree) => {
|
|
92
|
+
const content = tree.read(path, 'utf-8');
|
|
93
|
+
const contentUpdate = (content || '') + endContent;
|
|
94
|
+
|
|
95
|
+
tree.write(path, contentUpdate);
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export const getProjectsDetails = (tree: Tree, projectType: ProjectType) => Array.from(getProjects(tree))
|
|
99
|
+
.filter(([_, project]) => project.projectType === projectType)
|
|
100
|
+
.map(([name, project]) => ({ name, path: project.root }));
|
|
101
|
+
|
|
102
|
+
export const selectProject = async (tree: Tree, projectType: ProjectType, message: string): Promise<{ name: string, path: string }> => {
|
|
103
|
+
const { default: autocomplete } = await dynamicImport<typeof import('inquirer-autocomplete-standalone')>('inquirer-autocomplete-standalone');
|
|
104
|
+
const projects = getProjectsDetails(tree, projectType);
|
|
105
|
+
|
|
106
|
+
if (!projects.length) {
|
|
107
|
+
throw new Error(`No projects of type ${projectType} found.`);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return autocomplete({
|
|
111
|
+
message,
|
|
112
|
+
source: async (input) => {
|
|
113
|
+
const entries = [...projects, { name: constants.sharedValue, path: constants.sharedValue }].map((project) => ({
|
|
114
|
+
name: `${project.name} (${project.path})`,
|
|
115
|
+
value: { ...project, name: projectType === 'application' ? project.path.replace('apps/', '') : project.name }
|
|
116
|
+
}));
|
|
117
|
+
|
|
118
|
+
if (!input) {
|
|
119
|
+
return entries;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return entries.filter((entry) => entry.name.toLowerCase().includes(input.toLowerCase()));
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
export const getLibraryDetailsByName = async (tree: Tree, libraryName?: string): Promise<{ name: string; path: string }> => {
|
|
128
|
+
let selectedLibraryName: string;
|
|
129
|
+
let selectedLibraryPath: string;
|
|
130
|
+
|
|
131
|
+
if (libraryName) {
|
|
132
|
+
selectedLibraryName = libraryName;
|
|
133
|
+
|
|
134
|
+
const library = getProjectsDetails(tree, 'library').find((library) => library.name === selectedLibraryName);
|
|
135
|
+
|
|
136
|
+
if (!library) {
|
|
137
|
+
throw new Error(`Library ${selectedLibraryName} not found`);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
selectedLibraryPath = library.path;
|
|
141
|
+
} else {
|
|
142
|
+
const selectedLibrary = await selectProject(tree, 'library', 'Select the library to move: ');
|
|
143
|
+
|
|
144
|
+
selectedLibraryName = selectedLibrary.name;
|
|
145
|
+
selectedLibraryPath = selectedLibrary.path;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return { name: selectedLibraryName, path: selectedLibraryPath };
|
|
149
|
+
};
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { Tree, output, readJson, writeJson } from '@nx/devkit';
|
|
2
|
+
import { isEmpty } from 'lodash';
|
|
3
|
+
|
|
4
|
+
const defaultEsLintConfigPath = '.eslintrc.json';
|
|
5
|
+
|
|
6
|
+
export interface Constraint {
|
|
7
|
+
sourceTag: string;
|
|
8
|
+
onlyDependOnLibsWithTags: Array<string>;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const getNxRulesEntry = (config: Record<string, any>): { files: Array<string>, rules: Record<string, any> } =>
|
|
12
|
+
config.overrides?.find((entry: { rules: { [x: string]: any; }; }) => !!entry.rules['@nx/enforce-module-boundaries']);
|
|
13
|
+
|
|
14
|
+
export const getNxRulesEntryOrThrowError = (config: Record<string, any>): { files: Array<string>, rules: Record<string, any> } => {
|
|
15
|
+
if (!config) {
|
|
16
|
+
throw new Error('ESLint config not found');
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const entryWithRules = getNxRulesEntry(config);
|
|
20
|
+
|
|
21
|
+
if (!entryWithRules) {
|
|
22
|
+
throw new Error(`ESLint: can't find '@nx/enforce-module-boundaries' rule`);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return entryWithRules;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export const getNxRulesStatus = (config: Record<string, any>): string => {
|
|
29
|
+
return getNxRulesEntryOrThrowError(config).rules['@nx/enforce-module-boundaries'][0];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export const getNxRules = (config: Record<string, any>): Array<Constraint> => {
|
|
33
|
+
return getNxRulesEntryOrThrowError(config).rules['@nx/enforce-module-boundaries'][1].depConstraints;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export const readESLintConfig = (tree: Tree): { config: Record<string, any>, path: string } => {
|
|
37
|
+
let path = defaultEsLintConfigPath;
|
|
38
|
+
|
|
39
|
+
const checkConfigExists = (path: string): void => {
|
|
40
|
+
if (!tree.exists(path)) {
|
|
41
|
+
throw new Error(`ESLint config not found: ${path}`);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
checkConfigExists(path);
|
|
46
|
+
|
|
47
|
+
let config = readJson(tree, path);
|
|
48
|
+
|
|
49
|
+
if (getNxRulesEntry(config)) {
|
|
50
|
+
return { config, path };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (config.extends?.length) {
|
|
54
|
+
path = config.extends[0];
|
|
55
|
+
|
|
56
|
+
checkConfigExists(path);
|
|
57
|
+
|
|
58
|
+
config = readJson(tree, config.extends[0]);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return { config, path };
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const getNpmScope = (tree: Tree): string | undefined => {
|
|
65
|
+
const { name } = tree.exists('package.json')
|
|
66
|
+
? readJson<{ name?: string }>(tree, 'package.json')
|
|
67
|
+
: { name: null };
|
|
68
|
+
|
|
69
|
+
return name?.startsWith('@') ? name.split('/')[0].substring(1) : undefined;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
export const addNxAppTag = (tree: Tree, appDirectory: string): void => {
|
|
73
|
+
const { config, path } = readESLintConfig(tree);
|
|
74
|
+
const constraints = getNxRules(config);
|
|
75
|
+
const doesTagExist = !!constraints.find((constraint) => constraint.sourceTag === `app:${appDirectory}`);
|
|
76
|
+
|
|
77
|
+
if (doesTagExist) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
constraints.push({ sourceTag: `app:${appDirectory}`, onlyDependOnLibsWithTags: [`app:${appDirectory}`, 'app:shared'] });
|
|
82
|
+
|
|
83
|
+
writeJson(tree, path, config);
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export const addNxScopeTag = (tree: Tree, scope: string): void => {
|
|
87
|
+
const { config, path } = readESLintConfig(tree);
|
|
88
|
+
const constraints = getNxRules(config);
|
|
89
|
+
const doesTagExist = !!constraints.find((constraint) => constraint.sourceTag === `scope:${scope}`);
|
|
90
|
+
|
|
91
|
+
if (doesTagExist) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
constraints.push({ sourceTag: `scope:${scope}`, onlyDependOnLibsWithTags: [`scope:${scope}`, 'scope:shared'] });
|
|
96
|
+
|
|
97
|
+
writeJson(tree, path, config);
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
export const getImportPathPrefix = (tree: Tree): string => {
|
|
101
|
+
const npmScope = getNpmScope(tree);
|
|
102
|
+
|
|
103
|
+
return npmScope ? `${npmScope === '@' ? '' : '@'}${npmScope}` : '';
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
export const verifyEsLintConfig = (tree: Tree): Record<string, any> => {
|
|
107
|
+
const { config, path } = readESLintConfig(tree);
|
|
108
|
+
const importantTags = ['app:shared', 'scope:shared', 'type:app', 'type:data-access', 'type:features', 'type:ui', 'type:utils'];
|
|
109
|
+
|
|
110
|
+
if (!config || isEmpty(config)) {
|
|
111
|
+
throw new Error(`Failed to load ESLint config: ${path}`);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
try {
|
|
115
|
+
const rulesEntry = getNxRulesEntryOrThrowError(config).rules['@nx/enforce-module-boundaries'];
|
|
116
|
+
const tags = rulesEntry[1].depConstraints.map((rule: Constraint) => rule.sourceTag);
|
|
117
|
+
const areRulesDisabled = rulesEntry[1].depConstraints.find((rule: Constraint) => rule.sourceTag === '*' && rule.onlyDependOnLibsWithTags.includes('*'));
|
|
118
|
+
const areRulesBroken = !importantTags.every((tag) => tags.includes(tag));
|
|
119
|
+
|
|
120
|
+
if (rulesEntry[0] !== 'error') {
|
|
121
|
+
rulesEntry[0] = 'error';
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (areRulesDisabled || areRulesBroken) {
|
|
125
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
126
|
+
const esLintConfigTemplate = require('../templates/config-template.json');
|
|
127
|
+
const templateRules = esLintConfigTemplate.rules['@nx/enforce-module-boundaries'];
|
|
128
|
+
|
|
129
|
+
rulesEntry[0] = templateRules[0];
|
|
130
|
+
rulesEntry[1] = templateRules[1];
|
|
131
|
+
|
|
132
|
+
writeJson(tree, path, config);
|
|
133
|
+
}
|
|
134
|
+
// TODO: use custom errors
|
|
135
|
+
} catch {
|
|
136
|
+
output.warn({ title: output.bold('ESLint config has no @nx/enforce-module-boundaries rule. Updating rules...') });
|
|
137
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
138
|
+
const esLintConfigRulesTemplate = require('../templates/config-template.json');
|
|
139
|
+
|
|
140
|
+
config.overrides.push(esLintConfigRulesTemplate);
|
|
141
|
+
|
|
142
|
+
writeJson(tree, path, config);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return config;
|
|
146
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export const formatName = (value: string, withoutSpaces = false) =>
|
|
2
|
+
value
|
|
3
|
+
.split('-')
|
|
4
|
+
.map((word) => `${word.charAt(0).toUpperCase()}${word.substring(1)}`)
|
|
5
|
+
.join(withoutSpaces ? '' : ' ');
|
|
6
|
+
|
|
7
|
+
export const formatAppIdentifier = (value: string) =>
|
|
8
|
+
value.toLowerCase().replace(/-/g, '.');
|
|
9
|
+
|
|
10
|
+
export const getProjectName = (str: string) => {
|
|
11
|
+
const parts = str.split('@');
|
|
12
|
+
|
|
13
|
+
return parts.length > 1 ? parts[1].split('/')[0] : parts[0];
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export const getLibName = (path: string) => path.split('/').pop();
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function getLibDirectoryName(libName: string, scopeName: string): string {
|
|
2
|
+
const libWords = libName.split('-');
|
|
3
|
+
const scopeWords = scopeName.split('-');
|
|
4
|
+
let newLibWords = libWords;
|
|
5
|
+
|
|
6
|
+
const startsWithScopeWords = scopeWords.every((word, index) => libWords[index] === word);
|
|
7
|
+
if (startsWithScopeWords && libWords.length > scopeWords.length) {
|
|
8
|
+
newLibWords = libWords.slice(scopeWords.length);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
return newLibWords.join('-');
|
|
12
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { SourceFile } from 'ts-morph';
|
|
2
|
+
|
|
3
|
+
export const addNamedImport = (namedImport: string, moduleSpecifier: string, file: SourceFile): void => {
|
|
4
|
+
const importDeclaration = file.getImportDeclaration(moduleSpecifier);
|
|
5
|
+
if (importDeclaration) {
|
|
6
|
+
const hasNamedImport = importDeclaration.getNamedImports()
|
|
7
|
+
.find((declaration) => declaration.getName() === namedImport);
|
|
8
|
+
if (!hasNamedImport) {
|
|
9
|
+
importDeclaration.addNamedImport(namedImport);
|
|
10
|
+
}
|
|
11
|
+
} else {
|
|
12
|
+
file.addImportDeclaration({
|
|
13
|
+
namedImports: [namedImport],
|
|
14
|
+
moduleSpecifier
|
|
15
|
+
})
|
|
16
|
+
}
|
|
17
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "./tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"outDir": "../dist/out-tsc",
|
|
5
|
+
"module": "commonjs",
|
|
6
|
+
"types": ["jest", "node"]
|
|
7
|
+
},
|
|
8
|
+
"include": [
|
|
9
|
+
"jest.config.ts",
|
|
10
|
+
"src/**/*.test.ts",
|
|
11
|
+
"src/**/*.spec.ts",
|
|
12
|
+
"src/**/*.d.ts"
|
|
13
|
+
]
|
|
14
|
+
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
declare const _default: {
|
|
2
|
-
'lint-staged': {
|
|
3
|
-
'*.{ts,tsx}': string;
|
|
4
|
-
'*.{ts,tsx,js,html,json,md}': string;
|
|
5
|
-
'*.{ts,tsx,js}': string;
|
|
6
|
-
};
|
|
7
|
-
tsconfig: {
|
|
8
|
-
jsx: string;
|
|
9
|
-
allowJs: boolean;
|
|
10
|
-
noEmit: boolean;
|
|
11
|
-
strict: boolean;
|
|
12
|
-
allowSyntheticDefaultImports: boolean;
|
|
13
|
-
noImplicitAny: boolean;
|
|
14
|
-
strictPropertyInitialization: boolean;
|
|
15
|
-
strictNullChecks: boolean;
|
|
16
|
-
};
|
|
17
|
-
};
|
|
18
|
-
export default _default;
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.default = {
|
|
4
|
-
'lint-staged': {
|
|
5
|
-
'*.{ts,tsx}': 'tsc-files --noEmit types.d.ts',
|
|
6
|
-
'*.{ts,tsx,js,html,json,md}': 'prettier --write',
|
|
7
|
-
'*.{ts,tsx,js}': 'eslint --cache --fix',
|
|
8
|
-
},
|
|
9
|
-
tsconfig: {
|
|
10
|
-
jsx: 'react-native',
|
|
11
|
-
allowJs: true,
|
|
12
|
-
noEmit: true,
|
|
13
|
-
strict: true,
|
|
14
|
-
allowSyntheticDefaultImports: true,
|
|
15
|
-
noImplicitAny: true,
|
|
16
|
-
strictPropertyInitialization: false,
|
|
17
|
-
strictNullChecks: true,
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
//# sourceMappingURL=config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../plugin/src/generators/code-checks/config.ts"],"names":[],"mappings":";;AAAA,kBAAe;IACb,aAAa,EAAE;QACb,YAAY,EAAE,+BAA+B;QAC7C,4BAA4B,EAAE,kBAAkB;QAChD,eAAe,EAAE,sBAAsB;KACxC;IACD,QAAQ,EAAE;QACR,GAAG,EAAE,cAAc;QACnB,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,IAAI;QACZ,4BAA4B,EAAE,IAAI;QAClC,aAAa,EAAE,IAAI;QACnB,4BAA4B,EAAE,KAAK;QACnC,gBAAgB,EAAE,IAAI;KACvB;CACF,CAAC"}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.codeChecksGenerator = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const child_process_1 = require("child_process");
|
|
6
|
-
const path = require("path");
|
|
7
|
-
const devkit_1 = require("@nx/devkit");
|
|
8
|
-
const dependencies_1 = require("../../shared/dependencies");
|
|
9
|
-
const config_1 = require("./config");
|
|
10
|
-
const scripts_1 = require("./scripts");
|
|
11
|
-
function codeChecksGenerator(tree, options) {
|
|
12
|
-
var _a, _b;
|
|
13
|
-
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
14
|
-
const projectRoot = '.';
|
|
15
|
-
// Delete files
|
|
16
|
-
tree.delete('.eslintrc.json');
|
|
17
|
-
tree.delete('eslint.config.cjs');
|
|
18
|
-
tree.delete('.prettierrc');
|
|
19
|
-
// Configure pre-commit hook
|
|
20
|
-
(0, child_process_1.execSync)('npx mrm@2 lint-staged', { stdio: 'inherit' });
|
|
21
|
-
const packageJson = (0, devkit_1.readJson)(tree, 'package.json');
|
|
22
|
-
packageJson['lint-staged'] = config_1.default['lint-staged'];
|
|
23
|
-
packageJson.scripts = Object.assign(Object.assign({}, scripts_1.default), packageJson.scripts);
|
|
24
|
-
(0, devkit_1.writeJson)(tree, 'package.json', packageJson);
|
|
25
|
-
// Update tsconfig.base.json
|
|
26
|
-
const tsconfigJson = (0, devkit_1.readJson)(tree, 'tsconfig.base.json');
|
|
27
|
-
tsconfigJson.compilerOptions = Object.assign(Object.assign({}, config_1.default.tsconfig), tsconfigJson.compilerOptions);
|
|
28
|
-
(0, devkit_1.writeJson)(tree, 'tsconfig.base.json', tsconfigJson);
|
|
29
|
-
// Update .gitignore
|
|
30
|
-
const gitignoreContent = ((_a = tree.read('.gitignore')) === null || _a === void 0 ? void 0 : _a.toString()) + '\n.eslintcache\n';
|
|
31
|
-
tree.write('.gitignore', gitignoreContent);
|
|
32
|
-
// Update .eslintignore
|
|
33
|
-
const eslintignoreContent = ((_b = tree.read('.eslintignore')) === null || _b === void 0 ? void 0 : _b.toString()) + '\n**/*.js\napps/*/app.config.ts\n';
|
|
34
|
-
tree.write('.eslintignore', eslintignoreContent);
|
|
35
|
-
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
36
|
-
const configTemplate = require('../../shared/templates/config-template.json');
|
|
37
|
-
// Add files
|
|
38
|
-
(0, devkit_1.generateFiles)(tree, path.join(__dirname, 'files'), projectRoot, options);
|
|
39
|
-
// Add rules to .eslintrc.json
|
|
40
|
-
const esLintConfig = (0, devkit_1.readJson)(tree, '.eslintrc.json');
|
|
41
|
-
esLintConfig.overrides.push(configTemplate);
|
|
42
|
-
(0, devkit_1.writeJson)(tree, '.eslintrc.json', esLintConfig);
|
|
43
|
-
// Install necessary dependencies
|
|
44
|
-
(0, devkit_1.addDependenciesToPackageJson)(tree, {}, dependencies_1.devDependencies['code-checks']);
|
|
45
|
-
yield (0, devkit_1.formatFiles)(tree);
|
|
46
|
-
return () => {
|
|
47
|
-
(0, devkit_1.installPackagesTask)(tree);
|
|
48
|
-
};
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
exports.codeChecksGenerator = codeChecksGenerator;
|
|
52
|
-
exports.default = codeChecksGenerator;
|
|
53
|
-
//# sourceMappingURL=generator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../plugin/src/generators/code-checks/generator.ts"],"names":[],"mappings":";;;;AAAA,iDAAyC;AACzC,6BAA6B;AAC7B,uCAQoB;AACpB,4DAA4D;AAC5D,qCAA8B;AAE9B,uCAAgC;AAEhC,SAAsB,mBAAmB,CAAC,IAAU,EAAE,OAAkC;;;QACtF,MAAM,WAAW,GAAG,GAAG,CAAC;QAExB,eAAe;QACf,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAE3B,4BAA4B;QAC5B,IAAA,wBAAQ,EAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAExD,MAAM,WAAW,GAAG,IAAA,iBAAQ,EAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QACnD,WAAW,CAAC,aAAa,CAAC,GAAG,gBAAM,CAAC,aAAa,CAAC,CAAC;QACnD,WAAW,CAAC,OAAO,mCAAQ,iBAAO,GAAK,WAAW,CAAC,OAAO,CAAE,CAAC;QAC7D,IAAA,kBAAS,EAAC,IAAI,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;QAE7C,4BAA4B;QAC5B,MAAM,YAAY,GAAG,IAAA,iBAAQ,EAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;QAC1D,YAAY,CAAC,eAAe,mCAAQ,gBAAM,CAAC,QAAQ,GAAK,YAAY,CAAC,eAAe,CAAE,CAAC;QACvF,IAAA,kBAAS,EAAC,IAAI,EAAE,oBAAoB,EAAE,YAAY,CAAC,CAAC;QAEpD,oBAAoB;QACpB,MAAM,gBAAgB,GAAG,CAAA,MAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,0CAAE,QAAQ,EAAE,IAAG,kBAAkB,CAAC;QAClF,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;QAE3C,uBAAuB;QACvB,MAAM,mBAAmB,GAAG,CAAA,MAAA,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,0CAAE,QAAQ,EAAE,IAAG,mCAAmC,CAAC;QACzG,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAC;QAEjD,8DAA8D;QAC9D,MAAM,cAAc,GAAG,OAAO,CAAC,6CAA6C,CAAC,CAAC;QAE9E,YAAY;QACZ,IAAA,sBAAa,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QAEzE,8BAA8B;QAC9B,MAAM,YAAY,GAAG,IAAA,iBAAQ,EAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAEtD,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5C,IAAA,kBAAS,EAAC,IAAI,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;QAEhD,iCAAiC;QACjC,IAAA,qCAA4B,EAC1B,IAAI,EACJ,EAAE,EACF,8BAAe,CAAC,aAAa,CAAC,CAC/B,CAAC;QAEF,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAC;QAExB,OAAO,GAAG,EAAE;YACV,IAAA,4BAAmB,EAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC;;CACH;AArDD,kDAqDC;AAED,kBAAe,mBAAmB,CAAC"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.default = {
|
|
4
|
-
'lint': 'npx tsc && cross-env ESLINT_USE_FLAT_CONFIG=false npx eslint ./',
|
|
5
|
-
'format': 'npx prettier --write . && npm run lint -- --fix',
|
|
6
|
-
'prepare': 'husky',
|
|
7
|
-
};
|
|
8
|
-
//# sourceMappingURL=scripts.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts.js","sourceRoot":"","sources":["../../../../../plugin/src/generators/code-checks/scripts.ts"],"names":[],"mappings":";;AAAA,kBAAe;IACb,MAAM,EAAE,iEAAiE;IACzE,QAAQ,EAAE,iDAAiD;IAC3D,SAAS,EAAE,OAAO;CACnB,CAAA"}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.entityApiGenerator = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const devkit_1 = require("@nx/devkit");
|
|
6
|
-
const ts_morph_1 = require("ts-morph");
|
|
7
|
-
const path = require("path");
|
|
8
|
-
const lodash_1 = require("lodash");
|
|
9
|
-
const utils_1 = require("../../shared/utils");
|
|
10
|
-
function entityApiGenerator(tree, options) {
|
|
11
|
-
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
12
|
-
const { default: autocomplete } = yield (0, utils_1.dynamicImport)('inquirer-autocomplete-standalone');
|
|
13
|
-
const nxLibsPaths = (0, utils_1.getNxLibsPaths)([utils_1.LibraryType.DATA_ACCESS]);
|
|
14
|
-
const apiLibsPaths = (0, utils_1.searchNxLibsPaths)(nxLibsPaths, 'data-access/api/src', 'endsWith');
|
|
15
|
-
const apiClientLibsPaths = (0, utils_1.searchNxLibsPaths)(nxLibsPaths, 'data-access/api-client/src', 'endsWith');
|
|
16
|
-
if (!apiClientLibsPaths.length) {
|
|
17
|
-
throw new Error('Could not find API Client path.');
|
|
18
|
-
}
|
|
19
|
-
if (!apiLibsPaths.length) {
|
|
20
|
-
throw new Error('Could not find API path.');
|
|
21
|
-
}
|
|
22
|
-
if (apiClientLibsPaths.length > 1) {
|
|
23
|
-
apiClientLibsPaths[0] = yield autocomplete({
|
|
24
|
-
message: 'Select the api client library path:',
|
|
25
|
-
source: (input) => (0, utils_1.filterSource)(input, apiClientLibsPaths),
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
if (apiLibsPaths.length > 1) {
|
|
29
|
-
apiLibsPaths[0] = yield autocomplete({
|
|
30
|
-
message: 'Select the api library path:',
|
|
31
|
-
source: (input) => (0, utils_1.filterSource)(input, apiLibsPaths),
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
const apiDirectory = (0, utils_1.searchAliasPath)(apiLibsPaths[0]);
|
|
35
|
-
const apiClientDirectory = (0, utils_1.searchAliasPath)(apiClientLibsPaths[0]);
|
|
36
|
-
const libPath = apiLibsPaths[0];
|
|
37
|
-
const libRootPath = `${libPath}/lib`;
|
|
38
|
-
options.name = options.name || (yield (0, utils_1.askQuestion)('Enter the name of the entity (e.g: User): '));
|
|
39
|
-
const apiName = (0, lodash_1.kebabCase)(options.name);
|
|
40
|
-
options.baseEndpoint =
|
|
41
|
-
options.baseEndpoint || (yield (0, utils_1.askQuestion)('Enter the base endpoint (e.g: /users): ', `/${apiName}`));
|
|
42
|
-
const apiPath = `${libRootPath}/${apiName}`;
|
|
43
|
-
const entityName = (0, lodash_1.startCase)((0, lodash_1.camelCase)(apiName)).replace(/\s+/g, '');
|
|
44
|
-
(0, devkit_1.generateFiles)(tree, path.join(__dirname, `files`), apiPath, Object.assign(Object.assign({}, options), { apiName: (0, lodash_1.camelCase)(options.name), entityName, entityFileName: apiName, apiClientDirectory, baseEndpoint: options.baseEndpoint.startsWith('/') ? options.baseEndpoint : `/${options.baseEndpoint}` }));
|
|
45
|
-
tree.rename(`${apiPath}/models/entity.ts`, `${apiPath}/models/${apiName}.ts`);
|
|
46
|
-
(0, utils_1.appendFileContent)(`${libRootPath}/index.ts`, `export * from './${apiName}';\n`, tree);
|
|
47
|
-
const storeLibsPaths = (0, utils_1.searchNxLibsPaths)(nxLibsPaths, 'data-access/store/src', 'endsWith');
|
|
48
|
-
if (!storeLibsPaths.length) {
|
|
49
|
-
yield (0, devkit_1.formatFiles)(tree);
|
|
50
|
-
throw new Error('Could not find redux store path.');
|
|
51
|
-
}
|
|
52
|
-
if (storeLibsPaths.length > 1) {
|
|
53
|
-
storeLibsPaths[0] = yield autocomplete({
|
|
54
|
-
message: 'Select the store library path:',
|
|
55
|
-
source: (input) => (0, utils_1.filterSource)(input, storeLibsPaths),
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
// Update redux store
|
|
59
|
-
const apiNameDeclaration = (0, lodash_1.camelCase)(options.name + 'Api');
|
|
60
|
-
const project = new ts_morph_1.Project({
|
|
61
|
-
manipulationSettings: {
|
|
62
|
-
indentationText: ts_morph_1.IndentationText.TwoSpaces,
|
|
63
|
-
quoteKind: ts_morph_1.QuoteKind.Single,
|
|
64
|
-
},
|
|
65
|
-
});
|
|
66
|
-
const store = project.addSourceFileAtPath(`${storeLibsPaths[0]}/store.ts`);
|
|
67
|
-
(0, utils_1.addNamedImport)(apiNameDeclaration, apiDirectory, store);
|
|
68
|
-
const rootReducer = store.getVariableDeclarationOrThrow('rootReducer');
|
|
69
|
-
rootReducer.getInitializerIfKindOrThrow(ts_morph_1.SyntaxKind.ObjectLiteralExpression).addProperty({
|
|
70
|
-
name: `[${apiNameDeclaration}.reducerPath]`,
|
|
71
|
-
initializer: `${apiNameDeclaration}.reducer`,
|
|
72
|
-
kind: ts_morph_1.StructureKind.PropertyAssignment,
|
|
73
|
-
});
|
|
74
|
-
const middlewares = store.getVariableDeclarationOrThrow('middlewares');
|
|
75
|
-
middlewares
|
|
76
|
-
.getInitializerIfKindOrThrow(ts_morph_1.SyntaxKind.ArrayLiteralExpression)
|
|
77
|
-
.addElement(`${apiNameDeclaration}.middleware`);
|
|
78
|
-
project.saveSync();
|
|
79
|
-
yield (0, devkit_1.formatFiles)(tree);
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
exports.entityApiGenerator = entityApiGenerator;
|
|
83
|
-
exports.default = entityApiGenerator;
|
|
84
|
-
//# sourceMappingURL=generator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../plugin/src/generators/entity-api/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
EXPO_USE_METRO_WORKSPACE_ROOT=1
|