@nx/remix 16.8.2 → 17.2.5

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 (173) hide show
  1. package/README.md +32 -89
  2. package/executors.json +0 -12
  3. package/generators.d.ts +14 -0
  4. package/generators.js +17 -0
  5. package/generators.json +3 -9
  6. package/index.d.ts +1 -0
  7. package/index.js +5 -0
  8. package/migrations.json +23 -123
  9. package/package.json +42 -12
  10. package/plugins/component-testing/index.js +11 -6
  11. package/src/executors/build/build.impl.js +64 -74
  12. package/src/executors/serve/serve.impl.js +43 -43
  13. package/src/generators/action/action.impl.js +24 -26
  14. package/src/generators/action/schema.d.ts +7 -1
  15. package/src/generators/action/schema.json +10 -3
  16. package/src/generators/application/__snapshots__/application.impl.spec.ts.snap +776 -149
  17. package/src/generators/application/application.impl.js +181 -131
  18. package/src/generators/application/files/common/app/root.tsx__tmpl__ +3 -3
  19. package/src/generators/application/files/common/tests/routes/_index.spec.tsx__tmpl__ +16 -0
  20. package/src/generators/application/files/integrated/package.json__tmpl__ +1 -0
  21. package/src/generators/application/lib/index.js +0 -1
  22. package/src/generators/application/lib/normalize-options.d.ts +5 -3
  23. package/src/generators/application/lib/normalize-options.js +23 -15
  24. package/src/generators/application/lib/update-unit-test-config.js +8 -3
  25. package/src/generators/application/schema.d.ts +5 -0
  26. package/src/generators/application/schema.json +14 -9
  27. package/src/generators/cypress/cypress.impl.js +52 -42
  28. package/src/generators/cypress/schema.d.ts +5 -1
  29. package/src/generators/cypress/schema.json +6 -0
  30. package/src/generators/cypress-component-configuration/cypress-component-configuration.impl.js +13 -18
  31. package/src/generators/error-boundary/__snapshots__/error-boundary.impl.spec.ts.snap +39 -27
  32. package/src/generators/error-boundary/error-boundary.impl.js +6 -15
  33. package/src/generators/error-boundary/lib/add-v2-error-boundary.js +11 -16
  34. package/src/generators/error-boundary/lib/index.d.ts +0 -1
  35. package/src/generators/error-boundary/lib/index.js +0 -2
  36. package/src/generators/error-boundary/lib/normalize-options.d.ts +1 -1
  37. package/src/generators/error-boundary/lib/normalize-options.js +9 -5
  38. package/src/generators/error-boundary/schema.d.ts +7 -2
  39. package/src/generators/error-boundary/schema.json +14 -12
  40. package/src/generators/library/__snapshots__/library.impl.spec.ts.snap +157 -0
  41. package/src/generators/library/lib/add-tsconfig-entry-points.js +0 -1
  42. package/src/generators/library/lib/add-unit-testing.js +4 -6
  43. package/src/generators/library/lib/index.js +0 -1
  44. package/src/generators/library/lib/normalize-options.d.ts +2 -1
  45. package/src/generators/library/lib/normalize-options.js +16 -13
  46. package/src/generators/library/lib/update-buildable-config.js +5 -2
  47. package/src/generators/library/library.impl.js +30 -33
  48. package/src/generators/library/schema.d.ts +2 -0
  49. package/src/generators/library/schema.json +6 -0
  50. package/src/generators/loader/loader.impl.js +24 -26
  51. package/src/generators/loader/schema.d.ts +7 -1
  52. package/src/generators/loader/schema.json +10 -3
  53. package/src/generators/meta/lib/v2.impl.js +14 -16
  54. package/src/generators/meta/meta.impl.js +2 -17
  55. package/src/generators/meta/schema.d.ts +7 -2
  56. package/src/generators/meta/schema.json +10 -7
  57. package/src/generators/preset/lib/normalize-options.js +5 -3
  58. package/src/generators/preset/preset.impl.js +18 -23
  59. package/src/generators/preset/schema.json +1 -0
  60. package/src/generators/resource-route/__snapshots__/resource-route.impl.spec.ts.snap +21 -0
  61. package/src/generators/resource-route/resource-route.impl.js +32 -26
  62. package/src/generators/resource-route/schema.d.ts +7 -1
  63. package/src/generators/resource-route/schema.json +10 -3
  64. package/src/generators/route/__snapshots__/route.impl.spec.ts.snap +62 -9
  65. package/src/generators/route/route.impl.js +55 -43
  66. package/src/generators/route/schema.d.ts +7 -1
  67. package/src/generators/route/schema.json +11 -4
  68. package/src/generators/setup/schema.json +1 -0
  69. package/src/generators/setup/setup.impl.js +23 -23
  70. package/src/generators/setup-tailwind/__snapshots__/setup-tailwind.impl.spec.ts.snap +27 -23
  71. package/src/generators/setup-tailwind/lib/index.js +0 -1
  72. package/src/generators/setup-tailwind/lib/update-remix-config.js +2 -3
  73. package/src/generators/setup-tailwind/schema.json +1 -0
  74. package/src/generators/setup-tailwind/setup-tailwind.impl.js +25 -29
  75. package/src/generators/storybook-configuration/schema.d.ts +2 -2
  76. package/src/generators/storybook-configuration/schema.json +4 -11
  77. package/src/generators/storybook-configuration/storybook-configuration.impl.js +8 -13
  78. package/src/generators/style/schema.d.ts +7 -1
  79. package/src/generators/style/schema.json +12 -5
  80. package/src/generators/style/style.impl.js +32 -24
  81. package/src/utils/create-watch-paths.js +8 -13
  82. package/src/utils/get-default-export-name.js +1 -3
  83. package/src/utils/get-default-export.js +0 -1
  84. package/src/utils/insert-import.js +0 -1
  85. package/src/utils/insert-statement-after-imports.js +0 -1
  86. package/src/utils/insert-statement-in-default-function.js +0 -1
  87. package/src/utils/remix-config.d.ts +1 -2
  88. package/src/utils/remix-config.js +8 -9
  89. package/src/utils/remix-route-utils.d.ts +2 -2
  90. package/src/utils/remix-route-utils.js +23 -17
  91. package/src/utils/testing-config-utils.js +0 -1
  92. package/src/utils/upsert-links-function.js +0 -1
  93. package/src/utils/versions.d.ts +9 -8
  94. package/src/utils/versions.js +14 -14
  95. package/plugins/component-testing/index.js.map +0 -1
  96. package/src/executors/build/build.impl.js.map +0 -1
  97. package/src/executors/build/compat.d.ts +0 -2
  98. package/src/executors/build/compat.js +0 -6
  99. package/src/executors/build/compat.js.map +0 -1
  100. package/src/executors/serve/compat.d.ts +0 -2
  101. package/src/executors/serve/compat.js +0 -6
  102. package/src/executors/serve/compat.js.map +0 -1
  103. package/src/executors/serve/serve.impl.js.map +0 -1
  104. package/src/generators/action/action.impl.js.map +0 -1
  105. package/src/generators/application/application.impl.js.map +0 -1
  106. package/src/generators/application/lib/index.js.map +0 -1
  107. package/src/generators/application/lib/normalize-options.js.map +0 -1
  108. package/src/generators/application/lib/update-unit-test-config.js.map +0 -1
  109. package/src/generators/cypress/cypress.impl.js.map +0 -1
  110. package/src/generators/cypress-component-configuration/cypress-component-configuration.impl.js.map +0 -1
  111. package/src/generators/error-boundary/error-boundary.impl.js.map +0 -1
  112. package/src/generators/error-boundary/lib/add-v1-error-boundary.d.ts +0 -3
  113. package/src/generators/error-boundary/lib/add-v1-error-boundary.js +0 -21
  114. package/src/generators/error-boundary/lib/add-v1-error-boundary.js.map +0 -1
  115. package/src/generators/error-boundary/lib/add-v2-error-boundary.js.map +0 -1
  116. package/src/generators/error-boundary/lib/index.js.map +0 -1
  117. package/src/generators/error-boundary/lib/normalize-options.js.map +0 -1
  118. package/src/generators/library/lib/add-tsconfig-entry-points.js.map +0 -1
  119. package/src/generators/library/lib/add-unit-testing.js.map +0 -1
  120. package/src/generators/library/lib/index.js.map +0 -1
  121. package/src/generators/library/lib/normalize-options.js.map +0 -1
  122. package/src/generators/library/lib/update-buildable-config.js.map +0 -1
  123. package/src/generators/library/library.impl.js.map +0 -1
  124. package/src/generators/loader/loader.impl.js.map +0 -1
  125. package/src/generators/meta/lib/normalize-options.d.ts +0 -3
  126. package/src/generators/meta/lib/normalize-options.js +0 -15
  127. package/src/generators/meta/lib/normalize-options.js.map +0 -1
  128. package/src/generators/meta/lib/v1.impl.d.ts +0 -3
  129. package/src/generators/meta/lib/v1.impl.js +0 -30
  130. package/src/generators/meta/lib/v1.impl.js.map +0 -1
  131. package/src/generators/meta/lib/v2.impl.js.map +0 -1
  132. package/src/generators/meta/meta.impl.js.map +0 -1
  133. package/src/generators/preset/lib/normalize-options.js.map +0 -1
  134. package/src/generators/preset/preset.impl.js.map +0 -1
  135. package/src/generators/resource-route/resource-route.impl.js.map +0 -1
  136. package/src/generators/route/route.impl.js.map +0 -1
  137. package/src/generators/setup/setup.impl.js.map +0 -1
  138. package/src/generators/setup-tailwind/lib/index.js.map +0 -1
  139. package/src/generators/setup-tailwind/lib/update-remix-config.js.map +0 -1
  140. package/src/generators/setup-tailwind/setup-tailwind.impl.js.map +0 -1
  141. package/src/generators/storybook-configuration/storybook-configuration.impl.js.map +0 -1
  142. package/src/generators/style/style.impl.js.map +0 -1
  143. package/src/index.d.ts +0 -15
  144. package/src/index.js +0 -21
  145. package/src/index.js.map +0 -1
  146. package/src/migrations/update-14-5-4/update-tsconfig-and-remix-config-for-1-6-8.d.ts +0 -6
  147. package/src/migrations/update-14-5-4/update-tsconfig-and-remix-config-for-1-6-8.js +0 -45
  148. package/src/migrations/update-14-5-4/update-tsconfig-and-remix-config-for-1-6-8.js.map +0 -1
  149. package/src/migrations/update-15-8-6/update-remix-env-d.d.ts +0 -6
  150. package/src/migrations/update-15-8-6/update-remix-env-d.js +0 -27
  151. package/src/migrations/update-15-8-6/update-remix-env-d.js.map +0 -1
  152. package/src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages.d.ts +0 -2
  153. package/src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages.js +0 -13
  154. package/src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages.js.map +0 -1
  155. package/src/utils/create-watch-paths.js.map +0 -1
  156. package/src/utils/get-default-export-name.js.map +0 -1
  157. package/src/utils/get-default-export.js.map +0 -1
  158. package/src/utils/get-remix-projects.d.ts +0 -2
  159. package/src/utils/get-remix-projects.js +0 -15
  160. package/src/utils/get-remix-projects.js.map +0 -1
  161. package/src/utils/insert-import.js.map +0 -1
  162. package/src/utils/insert-statement-after-imports.js.map +0 -1
  163. package/src/utils/insert-statement-in-default-function.js.map +0 -1
  164. package/src/utils/project.d.ts +0 -2
  165. package/src/utils/project.js +0 -15
  166. package/src/utils/project.js.map +0 -1
  167. package/src/utils/remix-config.js.map +0 -1
  168. package/src/utils/remix-route-utils.js.map +0 -1
  169. package/src/utils/testing-config-utils.js.map +0 -1
  170. package/src/utils/upsert-links-function.js.map +0 -1
  171. package/src/utils/versions.js.map +0 -1
  172. /package/src/generators/application/files/common/app/routes/{index.tsx__tmpl__ → _index.tsx__tmpl__} +0 -0
  173. /package/src/generators/application/files/common/{remix.config.js__tmpl__ → remix.config.cjs__tmpl__} +0 -0
@@ -1,150 +1,200 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
3
  const devkit_1 = require("@nx/devkit");
5
4
  const create_ts_config_1 = require("@nx/js/src/utils/typescript/create-ts-config");
6
5
  const versions_1 = require("../../utils/versions");
7
- const cypress_impl_1 = require("../cypress/cypress.impl");
8
6
  const lib_1 = require("./lib");
9
- function default_1(tree, _options) {
10
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
11
- const options = (0, lib_1.normalizeOptions)(tree, _options);
12
- const tasks = [];
13
- (0, devkit_1.addProjectConfiguration)(tree, options.projectName, {
14
- root: options.projectRoot,
15
- sourceRoot: `${options.projectRoot}`,
16
- projectType: 'application',
17
- tags: options.parsedTags,
18
- targets: {
19
- build: {
20
- executor: '@nx/remix:build',
21
- outputs: ['{options.outputPath}'],
22
- options: {
23
- outputPath: (0, devkit_1.joinPathFragments)('dist', options.projectRoot),
24
- },
7
+ async function default_1(tree, _options) {
8
+ const options = await (0, lib_1.normalizeOptions)(tree, _options);
9
+ const tasks = [];
10
+ (0, devkit_1.addProjectConfiguration)(tree, options.projectName, {
11
+ root: options.projectRoot,
12
+ sourceRoot: `${options.projectRoot}`,
13
+ projectType: 'application',
14
+ tags: options.parsedTags,
15
+ targets: {
16
+ build: {
17
+ executor: '@nx/remix:build',
18
+ outputs: ['{options.outputPath}'],
19
+ options: {
20
+ outputPath: (0, devkit_1.joinPathFragments)('dist', options.projectRoot),
25
21
  },
26
- serve: {
27
- executor: `@nx/remix:serve`,
28
- options: {
29
- port: 4200,
30
- },
22
+ },
23
+ serve: {
24
+ executor: `@nx/remix:serve`,
25
+ options: {
26
+ command: `${(0, devkit_1.getPackageManagerCommand)().exec} remix-serve build/index.js`,
27
+ manual: true,
28
+ port: 4200,
31
29
  },
32
- start: {
33
- dependsOn: ['build'],
34
- command: `remix-serve build`,
35
- options: {
36
- cwd: options.projectRoot,
37
- },
30
+ },
31
+ start: {
32
+ dependsOn: ['build'],
33
+ command: `remix-serve build/index.js`,
34
+ options: {
35
+ cwd: options.projectRoot,
38
36
  },
39
- typecheck: {
40
- command: `tsc`,
41
- options: {
42
- cwd: options.projectRoot,
43
- },
37
+ },
38
+ typecheck: {
39
+ command: `tsc`,
40
+ options: {
41
+ cwd: options.projectRoot,
44
42
  },
45
43
  },
46
- });
47
- const installTask = (0, devkit_1.addDependenciesToPackageJson)(tree, {
48
- '@remix-run/node': versions_1.remixVersion,
49
- '@remix-run/react': versions_1.remixVersion,
50
- '@remix-run/serve': versions_1.remixVersion,
51
- isbot: versions_1.isbotVersion,
52
- react: versions_1.reactVersion,
53
- 'react-dom': versions_1.reactDomVersion,
54
- }, {
55
- '@remix-run/dev': versions_1.remixVersion,
56
- '@remix-run/eslint-config': versions_1.remixVersion,
57
- '@types/react': versions_1.typesReactVersion,
58
- '@types/react-dom': versions_1.typesReactDomVersion,
59
- eslint: versions_1.eslintVersion,
60
- typescript: versions_1.typescriptVersion,
61
- });
62
- tasks.push(installTask);
63
- const vars = Object.assign(Object.assign({}, options), { tmpl: '', offsetFromRoot: (0, devkit_1.offsetFromRoot)(options.projectRoot), remixVersion: versions_1.remixVersion,
64
- isbotVersion: versions_1.isbotVersion,
65
- reactVersion: versions_1.reactVersion,
66
- reactDomVersion: versions_1.reactDomVersion,
67
- typesReactVersion: versions_1.typesReactVersion,
68
- typesReactDomVersion: versions_1.typesReactDomVersion,
69
- eslintVersion: versions_1.eslintVersion,
70
- typescriptVersion: versions_1.typescriptVersion });
71
- (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files/common'), options.projectRoot, vars);
72
- if (options.rootProject) {
73
- const gitignore = tree.read('.gitignore', 'utf-8');
74
- tree.write('.gitignore', `${gitignore}\n.cache\nbuild\npublic/build\n.env\n`);
75
- }
76
- else {
77
- (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files/integrated'), options.projectRoot, vars);
78
- }
79
- if (options.unitTestRunner !== 'none') {
80
- if (options.unitTestRunner === 'vitest') {
81
- const { vitestGenerator } = (0, devkit_1.ensurePackage)('@nx/vite', (0, versions_1.getPackageVersion)(tree, 'nx'));
82
- const vitestTask = yield vitestGenerator(tree, {
83
- uiFramework: 'react',
84
- project: options.projectName,
85
- coverageProvider: 'c8',
86
- inSourceTests: false,
87
- skipFormat: true,
88
- testEnvironment: 'jsdom',
89
- });
90
- tasks.push(vitestTask);
91
- }
92
- else {
93
- const { jestProjectGenerator } = (0, devkit_1.ensurePackage)('@nx/jest', (0, versions_1.getPackageVersion)(tree, 'nx'));
94
- const jestTask = yield jestProjectGenerator(tree, {
95
- project: options.projectName,
96
- skipFormat: true,
97
- setupFile: 'none',
98
- supportTsx: true,
99
- });
100
- tasks.push(jestTask);
101
- }
102
- const pkgInstallTask = (0, lib_1.updateUnitTestConfig)(tree, options.projectRoot, options.unitTestRunner);
103
- tasks.push(pkgInstallTask);
104
- }
105
- if (options.js) {
106
- (0, devkit_1.toJS)(tree);
107
- }
108
- if (options.rootProject && tree.exists('tsconfig.base.json')) {
109
- // If this is a standalone project, merge tsconfig.json and tsconfig.base.json.
110
- const tsConfigBaseJson = (0, devkit_1.readJson)(tree, 'tsconfig.base.json');
111
- (0, devkit_1.updateJson)(tree, 'tsconfig.json', (json) => {
112
- var _a, _b, _c, _d;
113
- delete json.extends;
114
- json.compilerOptions = Object.assign(Object.assign(Object.assign({}, tsConfigBaseJson.compilerOptions), json.compilerOptions), {
115
- // Taken from remix default setup
116
- // https://github.com/remix-run/remix/blob/68c8982/templates/remix/tsconfig.json#L15-L17
117
- paths: {
118
- '~/*': ['./app/*'],
119
- } });
120
- json.include = [
121
- ...((_a = tsConfigBaseJson.include) !== null && _a !== void 0 ? _a : []),
122
- ...((_b = json.include) !== null && _b !== void 0 ? _b : []),
123
- ];
124
- json.exclude = [
125
- ...((_c = tsConfigBaseJson.exclude) !== null && _c !== void 0 ? _c : []),
126
- ...((_d = json.exclude) !== null && _d !== void 0 ? _d : []),
127
- ];
128
- return json;
44
+ },
45
+ });
46
+ const installTask = (0, devkit_1.addDependenciesToPackageJson)(tree, {
47
+ '@remix-run/node': versions_1.remixVersion,
48
+ '@remix-run/react': versions_1.remixVersion,
49
+ '@remix-run/serve': versions_1.remixVersion,
50
+ isbot: versions_1.isbotVersion,
51
+ react: versions_1.reactVersion,
52
+ 'react-dom': versions_1.reactDomVersion,
53
+ }, {
54
+ '@remix-run/dev': versions_1.remixVersion,
55
+ '@remix-run/eslint-config': versions_1.remixVersion,
56
+ '@types/react': versions_1.typesReactVersion,
57
+ '@types/react-dom': versions_1.typesReactDomVersion,
58
+ eslint: versions_1.eslintVersion,
59
+ typescript: versions_1.typescriptVersion,
60
+ });
61
+ tasks.push(installTask);
62
+ const vars = {
63
+ ...options,
64
+ tmpl: '',
65
+ offsetFromRoot: (0, devkit_1.offsetFromRoot)(options.projectRoot),
66
+ remixVersion: versions_1.remixVersion,
67
+ isbotVersion: versions_1.isbotVersion,
68
+ reactVersion: versions_1.reactVersion,
69
+ reactDomVersion: versions_1.reactDomVersion,
70
+ typesReactVersion: versions_1.typesReactVersion,
71
+ typesReactDomVersion: versions_1.typesReactDomVersion,
72
+ eslintVersion: versions_1.eslintVersion,
73
+ typescriptVersion: versions_1.typescriptVersion,
74
+ };
75
+ (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files/common'), options.projectRoot, vars);
76
+ if (options.rootProject) {
77
+ const gitignore = tree.read('.gitignore', 'utf-8');
78
+ tree.write('.gitignore', `${gitignore}\n.cache\nbuild\npublic/build\n.env\n`);
79
+ }
80
+ else {
81
+ (0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files/integrated'), options.projectRoot, vars);
82
+ }
83
+ if (options.unitTestRunner !== 'none') {
84
+ if (options.unitTestRunner === 'vitest') {
85
+ const { vitestGenerator } = (0, devkit_1.ensurePackage)('@nx/vite', (0, versions_1.getPackageVersion)(tree, 'nx'));
86
+ const vitestTask = await vitestGenerator(tree, {
87
+ uiFramework: 'react',
88
+ project: options.projectName,
89
+ coverageProvider: 'v8',
90
+ inSourceTests: false,
91
+ skipFormat: true,
92
+ testEnvironment: 'jsdom',
129
93
  });
130
- tree.delete('tsconfig.base.json');
94
+ tasks.push(vitestTask);
131
95
  }
132
96
  else {
133
- // Otherwise, extract the tsconfig.base.json from tsconfig.json so we can share settings.
134
- (0, create_ts_config_1.extractTsConfigBase)(tree);
135
- }
136
- if (options.e2eTestRunner === 'cypress') {
137
- const cypressTasks = yield (0, cypress_impl_1.default)(tree, {
97
+ const { configurationGenerator: jestConfigurationGenerator } = (0, devkit_1.ensurePackage)('@nx/jest', (0, versions_1.getPackageVersion)(tree, 'nx'));
98
+ const jestTask = await jestConfigurationGenerator(tree, {
138
99
  project: options.projectName,
139
- name: options.rootProject ? `e2e` : `${options.projectName}-e2e`,
100
+ setupFile: 'none',
101
+ supportTsx: true,
102
+ skipSerializers: false,
103
+ skipPackageJson: false,
104
+ skipFormat: true,
140
105
  });
141
- tasks.push(cypressTasks);
106
+ const projectConfig = (0, devkit_1.readProjectConfiguration)(tree, options.projectName);
107
+ projectConfig.targets['test'].options.passWithNoTests = true;
108
+ (0, devkit_1.updateProjectConfiguration)(tree, options.projectName, projectConfig);
109
+ tasks.push(jestTask);
142
110
  }
143
- if (!options.skipFormat) {
144
- yield (0, devkit_1.formatFiles)(tree);
145
- }
146
- return (0, devkit_1.runTasksInSerial)(...tasks);
147
- });
111
+ const pkgInstallTask = (0, lib_1.updateUnitTestConfig)(tree, options.projectRoot, options.unitTestRunner);
112
+ tasks.push(pkgInstallTask);
113
+ }
114
+ else {
115
+ tree.delete((0, devkit_1.joinPathFragments)(options.projectRoot, `tests/routes/_index.spec.tsx`));
116
+ }
117
+ if (options.linter !== 'none') {
118
+ const { lintProjectGenerator } = (0, devkit_1.ensurePackage)('@nx/eslint', (0, versions_1.getPackageVersion)(tree, 'nx'));
119
+ const eslintTask = await lintProjectGenerator(tree, {
120
+ linter: options.linter,
121
+ project: options.projectName,
122
+ tsConfigPaths: [
123
+ (0, devkit_1.joinPathFragments)(options.projectRoot, 'tsconfig.app.json'),
124
+ ],
125
+ unitTestRunner: options.unitTestRunner,
126
+ skipFormat: true,
127
+ rootProject: options.rootProject,
128
+ });
129
+ tasks.push(eslintTask);
130
+ }
131
+ if (options.js) {
132
+ (0, devkit_1.toJS)(tree);
133
+ }
134
+ if (options.rootProject && tree.exists('tsconfig.base.json')) {
135
+ // If this is a standalone project, merge tsconfig.json and tsconfig.base.json.
136
+ const tsConfigBaseJson = (0, devkit_1.readJson)(tree, 'tsconfig.base.json');
137
+ (0, devkit_1.updateJson)(tree, 'tsconfig.json', (json) => {
138
+ delete json.extends;
139
+ json.compilerOptions = {
140
+ ...tsConfigBaseJson.compilerOptions,
141
+ ...json.compilerOptions,
142
+ // Taken from remix default setup
143
+ // https://github.com/remix-run/remix/blob/68c8982/templates/remix/tsconfig.json#L15-L17
144
+ paths: {
145
+ '~/*': ['./app/*'],
146
+ },
147
+ };
148
+ json.include = [
149
+ ...(tsConfigBaseJson.include ?? []),
150
+ ...(json.include ?? []),
151
+ ];
152
+ json.exclude = [
153
+ ...(tsConfigBaseJson.exclude ?? []),
154
+ ...(json.exclude ?? []),
155
+ ];
156
+ return json;
157
+ });
158
+ tree.delete('tsconfig.base.json');
159
+ }
160
+ else {
161
+ // Otherwise, extract the tsconfig.base.json from tsconfig.json so we can share settings.
162
+ (0, create_ts_config_1.extractTsConfigBase)(tree);
163
+ }
164
+ if (options.e2eTestRunner === 'cypress') {
165
+ const { configurationGenerator } = (0, devkit_1.ensurePackage)('@nx/cypress', (0, versions_1.getPackageVersion)(tree, 'nx'));
166
+ addFileServerTarget(tree, options, 'serve-static');
167
+ (0, devkit_1.addProjectConfiguration)(tree, options.e2eProjectName, {
168
+ projectType: 'application',
169
+ root: options.e2eProjectRoot,
170
+ sourceRoot: (0, devkit_1.joinPathFragments)(options.e2eProjectRoot, 'src'),
171
+ targets: {},
172
+ tags: [],
173
+ implicitDependencies: [options.projectName],
174
+ });
175
+ tasks.push(await configurationGenerator(tree, {
176
+ project: options.e2eProjectName,
177
+ directory: 'src',
178
+ skipFormat: true,
179
+ devServerTarget: `${options.projectName}:serve:development`,
180
+ baseUrl: 'http://localhost:4200',
181
+ }));
182
+ }
183
+ if (!options.skipFormat) {
184
+ await (0, devkit_1.formatFiles)(tree);
185
+ }
186
+ return (0, devkit_1.runTasksInSerial)(...tasks);
148
187
  }
149
188
  exports.default = default_1;
150
- //# sourceMappingURL=application.impl.js.map
189
+ function addFileServerTarget(tree, options, targetName) {
190
+ (0, devkit_1.addDependenciesToPackageJson)(tree, {}, { '@nx/web': (0, versions_1.getPackageVersion)(tree, 'nx') });
191
+ const projectConfig = (0, devkit_1.readProjectConfiguration)(tree, options.projectName);
192
+ projectConfig.targets[targetName] = {
193
+ executor: '@nx/web:file-server',
194
+ options: {
195
+ buildTarget: `${options.projectName}:build`,
196
+ port: 4200,
197
+ },
198
+ };
199
+ (0, devkit_1.updateProjectConfiguration)(tree, options.projectName, projectConfig);
200
+ }
@@ -8,11 +8,11 @@ import {
8
8
  ScrollRestoration,
9
9
  } from "@remix-run/react";
10
10
 
11
- export const meta: MetaFunction = () => ({
11
+ export const meta: MetaFunction = () => ([{
12
12
  charset: "utf-8",
13
13
  title: "New Remix App",
14
14
  viewport: "width=device-width,initial-scale=1",
15
- });
15
+ }]);
16
16
 
17
17
  export default function App() {
18
18
  return (
@@ -29,4 +29,4 @@ export default function App() {
29
29
  </body>
30
30
  </html>
31
31
  );
32
- }
32
+ }
@@ -0,0 +1,16 @@
1
+ import { createRemixStub } from '@remix-run/testing';
2
+ import { render, screen, waitFor } from '@testing-library/react';
3
+ import Index from '../../app/routes/_index';
4
+
5
+ test('renders loader data', async () => {
6
+ const RemixStub = createRemixStub([
7
+ {
8
+ path: '/',
9
+ Component: Index,
10
+ },
11
+ ]);
12
+
13
+ render(<RemixStub />);
14
+
15
+ await waitFor(() => screen.findByText('Welcome to Remix'));
16
+ });
@@ -4,6 +4,7 @@
4
4
  "description": "",
5
5
  "license": "",
6
6
  "scripts": {},
7
+ "type": "module",
7
8
  "dependencies": {
8
9
  "@remix-run/node": "<%= remixVersion %>",
9
10
  "@remix-run/react": "<%= remixVersion %>",
@@ -3,4 +3,3 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  tslib_1.__exportStar(require("./normalize-options"), exports);
5
5
  tslib_1.__exportStar(require("./update-unit-test-config"), exports);
6
- //# sourceMappingURL=index.js.map
@@ -1,8 +1,10 @@
1
- import { Tree } from '@nx/devkit';
2
- import { NxRemixGeneratorSchema } from '../schema';
1
+ import { type Tree } from '@nx/devkit';
2
+ import { type NxRemixGeneratorSchema } from '../schema';
3
3
  export interface NormalizedSchema extends NxRemixGeneratorSchema {
4
4
  projectName: string;
5
5
  projectRoot: string;
6
+ e2eProjectName: string;
7
+ e2eProjectRoot: string;
6
8
  parsedTags: string[];
7
9
  }
8
- export declare function normalizeOptions(tree: Tree, options: NxRemixGeneratorSchema): NormalizedSchema;
10
+ export declare function normalizeOptions(tree: Tree, options: NxRemixGeneratorSchema): Promise<NormalizedSchema>;
@@ -1,24 +1,32 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.normalizeOptions = void 0;
4
- const devkit_1 = require("@nx/devkit");
5
- const project_1 = require("../../../utils/project");
6
- function normalizeOptions(tree, options) {
7
- const { layoutDirectory, projectDirectory } = (0, devkit_1.extractLayoutDirectory)(options.directory);
8
- const appDirectory = (0, project_1.normalizeDirectory)(options.name, projectDirectory);
9
- const appName = (0, project_1.normalizeProjectName)(options.name, projectDirectory);
10
- const { appsDir: defaultAppsDir } = (0, devkit_1.getWorkspaceLayout)(tree);
11
- const appsDir = layoutDirectory !== null && layoutDirectory !== void 0 ? layoutDirectory : defaultAppsDir;
12
- const projectName = appName;
13
- const projectRoot = options.rootProject
14
- ? '.'
15
- : (0, devkit_1.joinPathFragments)(appsDir, appDirectory);
4
+ const project_name_and_root_utils_1 = require("@nx/devkit/src/generators/project-name-and-root-utils");
5
+ const eslint_1 = require("@nx/eslint");
6
+ async function normalizeOptions(tree, options) {
7
+ const { projectName, projectRoot, projectNameAndRootFormat } = await (0, project_name_and_root_utils_1.determineProjectNameAndRootOptions)(tree, {
8
+ name: options.name,
9
+ projectType: 'application',
10
+ directory: options.directory,
11
+ projectNameAndRootFormat: options.projectNameAndRootFormat,
12
+ rootProject: options.rootProject,
13
+ callingGenerator: '@nx/remix:application',
14
+ });
15
+ options.rootProject = projectRoot === '.';
16
+ options.projectNameAndRootFormat = projectNameAndRootFormat;
17
+ const e2eProjectName = options.rootProject ? 'e2e' : `${projectName}-e2e`;
18
+ const e2eProjectRoot = options.rootProject ? 'e2e' : `${projectRoot}-e2e`;
16
19
  const parsedTags = options.tags
17
20
  ? options.tags.split(',').map((s) => s.trim())
18
21
  : [];
19
- return Object.assign(Object.assign({}, options), { projectName,
22
+ return {
23
+ ...options,
24
+ linter: options.linter ?? eslint_1.Linter.EsLint,
25
+ projectName,
20
26
  projectRoot,
21
- parsedTags });
27
+ e2eProjectName,
28
+ e2eProjectRoot,
29
+ parsedTags,
30
+ };
22
31
  }
23
32
  exports.normalizeOptions = normalizeOptions;
24
- //# sourceMappingURL=normalize-options.js.map
@@ -8,23 +8,28 @@ function updateUnitTestConfig(tree, pathToRoot, unitTestRunner) {
8
8
  const pathToTestSetup = (0, devkit_1.joinPathFragments)(pathToRoot, `test-setup.ts`);
9
9
  tree.write(pathToTestSetup, (0, devkit_1.stripIndents) `
10
10
  import { installGlobals } from '@remix-run/node';
11
- import '@testing-library/jest-dom/extend-expect';
11
+ import '@testing-library/jest-dom/matchers';
12
12
  installGlobals();`);
13
13
  if (unitTestRunner === 'vitest') {
14
14
  const pathToViteConfig = (0, devkit_1.joinPathFragments)(pathToRoot, 'vite.config.ts');
15
15
  (0, testing_config_utils_1.updateViteTestIncludes)(tree, pathToViteConfig, './app/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}');
16
- (0, testing_config_utils_1.updateViteTestSetup)(tree, pathToViteConfig, './test-setup.ts');
16
+ (0, testing_config_utils_1.updateViteTestIncludes)(tree, pathToViteConfig, './tests/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}');
17
+ (0, testing_config_utils_1.updateViteTestSetup)(tree, pathToViteConfig, 'test-setup.ts');
17
18
  }
18
19
  else if (unitTestRunner === 'jest') {
19
20
  const pathToJestConfig = (0, devkit_1.joinPathFragments)(pathToRoot, 'jest.config.ts');
21
+ tree.rename('jest.preset.js', 'jest.preset.cjs');
20
22
  (0, testing_config_utils_1.updateJestTestSetup)(tree, pathToJestConfig, `<rootDir>/test-setup.ts`);
23
+ tree.write(pathToJestConfig, tree
24
+ .read(pathToJestConfig, 'utf-8')
25
+ .replace('jest.preset.js', 'jest.preset.cjs'));
21
26
  }
22
27
  return (0, devkit_1.addDependenciesToPackageJson)(tree, {}, {
23
28
  '@testing-library/jest-dom': versions_1.testingLibraryJestDomVersion,
24
29
  '@testing-library/react': versions_1.testingLibraryReactVersion,
25
30
  '@testing-library/user-event': versions_1.testingLibraryUserEventsVersion,
26
31
  '@remix-run/node': (0, versions_1.getRemixVersion)(tree),
32
+ '@remix-run/testing': (0, versions_1.getRemixVersion)(tree),
27
33
  });
28
34
  }
29
35
  exports.updateUnitTestConfig = updateUnitTestConfig;
30
- //# sourceMappingURL=update-unit-test-config.js.map
@@ -1,8 +1,13 @@
1
+ import { ProjectNameAndRootFormat } from '@nx/devkit/src/generators/project-name-and-root-utils';
2
+ import type { Linter } from '@nx/eslint';
3
+
1
4
  export interface NxRemixGeneratorSchema {
2
5
  name: string;
3
6
  tags?: string;
4
7
  js?: boolean;
5
8
  directory?: string;
9
+ projectNameAndRootFormat?: ProjectNameAndRootFormat;
10
+ linter?: Linter;
6
11
  unitTestRunner?: 'vitest' | 'jest' | 'none';
7
12
  e2eTestRunner?: 'cypress' | 'none';
8
13
  skipFormat?: boolean;
@@ -2,6 +2,7 @@
2
2
  "$schema": "http://json-schema.org/schema",
3
3
  "$id": "NxRemixApplication",
4
4
  "title": "Create an Application",
5
+ "description": "Generate a new Remix application.",
5
6
  "type": "object",
6
7
  "properties": {
7
8
  "name": {
@@ -24,23 +25,27 @@
24
25
  "alias": "dir",
25
26
  "x-priority": "important"
26
27
  },
28
+ "projectNameAndRootFormat": {
29
+ "description": "Whether to generate the project name and root directory as provided (`as-provided`) or generate them composing their values and taking the configured layout into account (`derived`).",
30
+ "type": "string",
31
+ "enum": ["as-provided", "derived"]
32
+ },
33
+ "linter": {
34
+ "description": "The tool to use for running lint checks.",
35
+ "type": "string",
36
+ "enum": ["eslint", "none"],
37
+ "default": "eslint"
38
+ },
27
39
  "unitTestRunner": {
28
40
  "type": "string",
29
- "enum": [
30
- "vitest",
31
- "jest",
32
- "none"
33
- ],
41
+ "enum": ["vitest", "jest", "none"],
34
42
  "default": "vitest",
35
43
  "description": "Test runner to use for unit tests.",
36
44
  "x-prompt": "What unit test runner should be used?"
37
45
  },
38
46
  "e2eTestRunner": {
39
47
  "type": "string",
40
- "enum": [
41
- "cypress",
42
- "none"
43
- ],
48
+ "enum": ["cypress", "none"],
44
49
  "default": "cypress",
45
50
  "description": "Test runner to use for e2e tests"
46
51
  },