@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.
Files changed (216) hide show
  1. package/.eslintrc.json +37 -0
  2. package/jest.config.ts +10 -0
  3. package/package.json +2 -2
  4. package/project.json +61 -0
  5. package/src/generators/code-checks/config.ts +17 -0
  6. package/src/generators/code-checks/generator.ts +72 -0
  7. package/src/generators/code-checks/scripts.ts +5 -0
  8. package/src/generators/entity-api/generator.ts +127 -0
  9. package/src/generators/expo-app/app-files/app.config.ts.template +1 -0
  10. package/src/generators/expo-app/generator.ts +152 -0
  11. package/src/generators/expo-app/scripts.ts +12 -0
  12. package/src/generators/form/generator.ts +53 -0
  13. package/src/generators/form/utils/add-form-usage.ts +86 -0
  14. package/src/generators/form/utils/get-app-name.ts +3 -0
  15. package/src/generators/form/utils/get-form-utils-directory.ts +46 -0
  16. package/src/generators/form/utils/update-index.ts +14 -0
  17. package/src/generators/lib-move/generator.ts +57 -0
  18. package/src/generators/lib-remove/generator.ts +25 -0
  19. package/src/generators/lib-rename/generator.ts +25 -0
  20. package/src/generators/lib-tags/generator.ts +68 -0
  21. package/src/generators/lib-tags/interfaces/context.ts +9 -0
  22. package/src/generators/lib-tags/interfaces/index.ts +2 -0
  23. package/src/generators/lib-tags/interfaces/verify-tag-config.ts +12 -0
  24. package/src/generators/lib-tags/types/index.ts +1 -0
  25. package/src/generators/lib-tags/types/tag.ts +1 -0
  26. package/src/generators/lib-tags/utils/check-lib-tags.ts +143 -0
  27. package/src/generators/next-app/generator.ts +99 -0
  28. package/src/generators/react-component/generator.ts +80 -0
  29. package/src/generators/react-lib/generator.ts +86 -0
  30. package/src/generators/repo-config/generator.ts +44 -0
  31. package/src/generators/repo-config/scripts.ts +3 -0
  32. package/src/shared/dependencies.ts +76 -0
  33. package/src/shared/enums/base-generator-type.ts +4 -0
  34. package/src/shared/generators/api-client/generator.ts +49 -0
  35. package/src/shared/generators/app-env/generator.ts +37 -0
  36. package/src/shared/generators/app-env/lib-files/shared/utils/app-env/src/app-env.ts.template +1 -1
  37. package/src/shared/generators/auth/generator.ts +107 -0
  38. package/src/shared/generators/form-utils/generator.ts +23 -0
  39. package/src/shared/generators/rn-styles/generator.ts +49 -0
  40. package/src/shared/generators/storage/generator.ts +34 -0
  41. package/src/shared/generators/store/generator.ts +48 -0
  42. package/src/shared/generators/store/schema.d.ts +1 -1
  43. package/src/shared/generators/ui-kitten/generator.ts +55 -0
  44. package/src/shared/utils/cli-utils.ts +149 -0
  45. package/src/shared/utils/config-utils.ts +146 -0
  46. package/src/shared/utils/constants.ts +3 -0
  47. package/src/shared/utils/dynamic-import.ts +4 -0
  48. package/src/shared/utils/format-utils.ts +16 -0
  49. package/src/shared/utils/get-lib-directory-name.ts +12 -0
  50. package/src/shared/utils/ts-utils.ts +17 -0
  51. package/tsconfig.json +16 -0
  52. package/tsconfig.lib.json +10 -0
  53. package/tsconfig.spec.json +14 -0
  54. package/src/generators/code-checks/config.d.ts +0 -18
  55. package/src/generators/code-checks/config.js +0 -20
  56. package/src/generators/code-checks/config.js.map +0 -1
  57. package/src/generators/code-checks/generator.d.ts +0 -4
  58. package/src/generators/code-checks/generator.js +0 -53
  59. package/src/generators/code-checks/generator.js.map +0 -1
  60. package/src/generators/code-checks/scripts.d.ts +0 -6
  61. package/src/generators/code-checks/scripts.js +0 -8
  62. package/src/generators/code-checks/scripts.js.map +0 -1
  63. package/src/generators/entity-api/generator.d.ts +0 -4
  64. package/src/generators/entity-api/generator.js +0 -84
  65. package/src/generators/entity-api/generator.js.map +0 -1
  66. package/src/generators/expo-app/app-files/.env.development.template +0 -1
  67. package/src/generators/expo-app/generator.d.ts +0 -4
  68. package/src/generators/expo-app/generator.js +0 -93
  69. package/src/generators/expo-app/generator.js.map +0 -1
  70. package/src/generators/expo-app/scripts.d.ts +0 -13
  71. package/src/generators/expo-app/scripts.js +0 -15
  72. package/src/generators/expo-app/scripts.js.map +0 -1
  73. package/src/generators/form/generator.d.ts +0 -4
  74. package/src/generators/form/generator.js +0 -48
  75. package/src/generators/form/generator.js.map +0 -1
  76. package/src/generators/form/utils/add-form-usage.d.ts +0 -1
  77. package/src/generators/form/utils/add-form-usage.js +0 -67
  78. package/src/generators/form/utils/add-form-usage.js.map +0 -1
  79. package/src/generators/form/utils/get-app-name.d.ts +0 -1
  80. package/src/generators/form/utils/get-app-name.js +0 -8
  81. package/src/generators/form/utils/get-app-name.js.map +0 -1
  82. package/src/generators/form/utils/get-form-utils-directory.d.ts +0 -2
  83. package/src/generators/form/utils/get-form-utils-directory.js +0 -34
  84. package/src/generators/form/utils/get-form-utils-directory.js.map +0 -1
  85. package/src/generators/form/utils/index.js +0 -8
  86. package/src/generators/form/utils/index.js.map +0 -1
  87. package/src/generators/form/utils/update-index.d.ts +0 -2
  88. package/src/generators/form/utils/update-index.js +0 -18
  89. package/src/generators/form/utils/update-index.js.map +0 -1
  90. package/src/generators/lib-move/generator.d.ts +0 -4
  91. package/src/generators/lib-move/generator.js +0 -34
  92. package/src/generators/lib-move/generator.js.map +0 -1
  93. package/src/generators/lib-remove/generator.d.ts +0 -4
  94. package/src/generators/lib-remove/generator.js +0 -22
  95. package/src/generators/lib-remove/generator.js.map +0 -1
  96. package/src/generators/lib-rename/generator.d.ts +0 -4
  97. package/src/generators/lib-rename/generator.js +0 -24
  98. package/src/generators/lib-rename/generator.js.map +0 -1
  99. package/src/generators/lib-tags/generator.d.ts +0 -4
  100. package/src/generators/lib-tags/generator.js +0 -56
  101. package/src/generators/lib-tags/generator.js.map +0 -1
  102. package/src/generators/lib-tags/interfaces/context.d.ts +0 -8
  103. package/src/generators/lib-tags/interfaces/context.js +0 -3
  104. package/src/generators/lib-tags/interfaces/context.js.map +0 -1
  105. package/src/generators/lib-tags/interfaces/index.d.ts +0 -1
  106. package/src/generators/lib-tags/interfaces/index.js +0 -5
  107. package/src/generators/lib-tags/interfaces/index.js.map +0 -1
  108. package/src/generators/lib-tags/utils/check-lib-tags.d.ts +0 -4
  109. package/src/generators/lib-tags/utils/check-lib-tags.js +0 -99
  110. package/src/generators/lib-tags/utils/check-lib-tags.js.map +0 -1
  111. package/src/generators/lib-tags/utils/index.js +0 -5
  112. package/src/generators/lib-tags/utils/index.js.map +0 -1
  113. package/src/generators/next-app/generator.d.ts +0 -4
  114. package/src/generators/next-app/generator.js +0 -71
  115. package/src/generators/next-app/generator.js.map +0 -1
  116. package/src/generators/react-component/generator.d.ts +0 -4
  117. package/src/generators/react-component/generator.js +0 -55
  118. package/src/generators/react-component/generator.js.map +0 -1
  119. package/src/generators/react-lib/generator.d.ts +0 -4
  120. package/src/generators/react-lib/generator.js +0 -49
  121. package/src/generators/react-lib/generator.js.map +0 -1
  122. package/src/generators/repo-config/generator.d.ts +0 -3
  123. package/src/generators/repo-config/generator.js +0 -36
  124. package/src/generators/repo-config/generator.js.map +0 -1
  125. package/src/generators/repo-config/scripts.d.ts +0 -4
  126. package/src/generators/repo-config/scripts.js +0 -6
  127. package/src/generators/repo-config/scripts.js.map +0 -1
  128. package/src/index.js +0 -1
  129. package/src/index.js.map +0 -1
  130. package/src/shared/dependencies.d.ts +0 -73
  131. package/src/shared/dependencies.js +0 -79
  132. package/src/shared/dependencies.js.map +0 -1
  133. package/src/shared/enums/base-generator-type.d.ts +0 -4
  134. package/src/shared/enums/base-generator-type.js +0 -9
  135. package/src/shared/enums/base-generator-type.js.map +0 -1
  136. package/src/shared/enums/index.js +0 -5
  137. package/src/shared/enums/index.js.map +0 -1
  138. package/src/shared/generators/api-client/generator.d.ts +0 -6
  139. package/src/shared/generators/api-client/generator.js +0 -35
  140. package/src/shared/generators/api-client/generator.js.map +0 -1
  141. package/src/shared/generators/api-client/index.js +0 -5
  142. package/src/shared/generators/api-client/index.js.map +0 -1
  143. package/src/shared/generators/app-env/generator.d.ts +0 -6
  144. package/src/shared/generators/app-env/generator.js +0 -25
  145. package/src/shared/generators/app-env/generator.js.map +0 -1
  146. package/src/shared/generators/app-env/index.js +0 -5
  147. package/src/shared/generators/app-env/index.js.map +0 -1
  148. package/src/shared/generators/auth/generator.d.ts +0 -4
  149. package/src/shared/generators/auth/generator.js +0 -74
  150. package/src/shared/generators/auth/generator.js.map +0 -1
  151. package/src/shared/generators/auth/index.js +0 -5
  152. package/src/shared/generators/auth/index.js.map +0 -1
  153. package/src/shared/generators/form-utils/generator.d.ts +0 -5
  154. package/src/shared/generators/form-utils/generator.js +0 -22
  155. package/src/shared/generators/form-utils/generator.js.map +0 -1
  156. package/src/shared/generators/form-utils/index.js +0 -5
  157. package/src/shared/generators/form-utils/index.js.map +0 -1
  158. package/src/shared/generators/index.js +0 -12
  159. package/src/shared/generators/index.js.map +0 -1
  160. package/src/shared/generators/rn-styles/generator.d.ts +0 -6
  161. package/src/shared/generators/rn-styles/generator.js +0 -36
  162. package/src/shared/generators/rn-styles/generator.js.map +0 -1
  163. package/src/shared/generators/rn-styles/index.js +0 -5
  164. package/src/shared/generators/rn-styles/index.js.map +0 -1
  165. package/src/shared/generators/storage/generator.d.ts +0 -6
  166. package/src/shared/generators/storage/generator.js +0 -25
  167. package/src/shared/generators/storage/generator.js.map +0 -1
  168. package/src/shared/generators/storage/index.js +0 -5
  169. package/src/shared/generators/storage/index.js.map +0 -1
  170. package/src/shared/generators/store/generator.d.ts +0 -4
  171. package/src/shared/generators/store/generator.js +0 -34
  172. package/src/shared/generators/store/generator.js.map +0 -1
  173. package/src/shared/generators/store/index.js +0 -5
  174. package/src/shared/generators/store/index.js.map +0 -1
  175. package/src/shared/generators/ui-kitten/generator.d.ts +0 -6
  176. package/src/shared/generators/ui-kitten/generator.js +0 -40
  177. package/src/shared/generators/ui-kitten/generator.js.map +0 -1
  178. package/src/shared/generators/ui-kitten/index.js +0 -5
  179. package/src/shared/generators/ui-kitten/index.js.map +0 -1
  180. package/src/shared/utils/cli-utils.d.ts +0 -28
  181. package/src/shared/utils/cli-utils.js +0 -125
  182. package/src/shared/utils/cli-utils.js.map +0 -1
  183. package/src/shared/utils/config-utils.d.ts +0 -19
  184. package/src/shared/utils/config-utils.js +0 -115
  185. package/src/shared/utils/config-utils.js.map +0 -1
  186. package/src/shared/utils/constants.d.ts +0 -3
  187. package/src/shared/utils/constants.js +0 -7
  188. package/src/shared/utils/constants.js.map +0 -1
  189. package/src/shared/utils/dynamic-import.d.ts +0 -1
  190. package/src/shared/utils/dynamic-import.js +0 -5
  191. package/src/shared/utils/dynamic-import.js.map +0 -1
  192. package/src/shared/utils/format-utils.d.ts +0 -4
  193. package/src/shared/utils/format-utils.js +0 -18
  194. package/src/shared/utils/format-utils.js.map +0 -1
  195. package/src/shared/utils/get-lib-directory-name.d.ts +0 -1
  196. package/src/shared/utils/get-lib-directory-name.js +0 -15
  197. package/src/shared/utils/get-lib-directory-name.js.map +0 -1
  198. package/src/shared/utils/index.js +0 -11
  199. package/src/shared/utils/index.js.map +0 -1
  200. package/src/shared/utils/ts-utils.d.ts +0 -2
  201. package/src/shared/utils/ts-utils.js +0 -21
  202. package/src/shared/utils/ts-utils.js.map +0 -1
  203. /package/src/generators/form/utils/{index.d.ts → index.ts} +0 -0
  204. /package/src/generators/lib-tags/utils/{index.d.ts → index.ts} +0 -0
  205. /package/src/{index.d.ts → index.ts} +0 -0
  206. /package/src/shared/enums/{index.d.ts → index.ts} +0 -0
  207. /package/src/shared/generators/api-client/{index.d.ts → index.ts} +0 -0
  208. /package/src/shared/generators/app-env/{index.d.ts → index.ts} +0 -0
  209. /package/src/shared/generators/auth/{index.d.ts → index.ts} +0 -0
  210. /package/src/shared/generators/form-utils/{index.d.ts → index.ts} +0 -0
  211. /package/src/shared/generators/{index.d.ts → index.ts} +0 -0
  212. /package/src/shared/generators/rn-styles/{index.d.ts → index.ts} +0 -0
  213. /package/src/shared/generators/storage/{index.d.ts → index.ts} +0 -0
  214. /package/src/shared/generators/store/{index.d.ts → index.ts} +0 -0
  215. /package/src/shared/generators/ui-kitten/{index.d.ts → index.ts} +0 -0
  216. /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,3 @@
1
+ export const constants = {
2
+ sharedValue: 'shared'
3
+ };
@@ -0,0 +1,4 @@
1
+ export const dynamicImport = new Function(
2
+ 'specifier',
3
+ 'return import(specifier)'
4
+ ) as <T = never>(specifier: string) => Promise<T>;
@@ -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,16 @@
1
+ {
2
+ "extends": "../tsconfig.json",
3
+ "compilerOptions": {
4
+ "module": "commonjs"
5
+ },
6
+ "files": [],
7
+ "include": [],
8
+ "references": [
9
+ {
10
+ "path": "./tsconfig.lib.json"
11
+ },
12
+ {
13
+ "path": "./tsconfig.spec.json"
14
+ }
15
+ ]
16
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "../dist/out-tsc",
5
+ "declaration": true,
6
+ "types": ["node"]
7
+ },
8
+ "include": ["src/**/*.ts"],
9
+ "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"]
10
+ }
@@ -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,4 +0,0 @@
1
- import { Tree } from '@nx/devkit';
2
- import { CodeChecksGeneratorSchema } from './schema';
3
- export declare function codeChecksGenerator(tree: Tree, options: CodeChecksGeneratorSchema): Promise<() => void>;
4
- export default codeChecksGenerator;
@@ -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,6 +0,0 @@
1
- declare const _default: {
2
- lint: string;
3
- format: string;
4
- prepare: string;
5
- };
6
- export default _default;
@@ -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,4 +0,0 @@
1
- import { Tree } from '@nx/devkit';
2
- import { EntityApiGeneratorSchema } from './schema';
3
- export declare function entityApiGenerator(tree: Tree, options: EntityApiGeneratorSchema): Promise<void>;
4
- export default entityApiGenerator;
@@ -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
@@ -1,4 +0,0 @@
1
- import { Tree } from '@nx/devkit';
2
- import { ExpoAppGeneratorSchema } from './schema';
3
- export declare function expoAppGenerator(tree: Tree, options: ExpoAppGeneratorSchema): Promise<() => void>;
4
- export default expoAppGenerator;