@nx/react-native 18.0.0-beta.0 → 18.0.0-beta.2

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/.eslintrc.json +6 -1
  2. package/executors.json +5 -0
  3. package/generators.json +12 -11
  4. package/migrations.json +73 -1
  5. package/package.json +10 -15
  6. package/plugins/metro-resolver.js +4 -1
  7. package/plugins/plugin.d.ts +2 -0
  8. package/plugins/plugin.js +12 -1
  9. package/plugins/with-nx-metro.js +6 -2
  10. package/src/executors/build-android/build-android.impl.js +1 -5
  11. package/src/executors/build-android/build-android.impl.ts +1 -5
  12. package/src/executors/build-android/schema.json +1 -1
  13. package/src/executors/build-ios/schema.json +1 -1
  14. package/src/executors/bundle/schema.d.ts +1 -1
  15. package/src/executors/bundle/schema.json +1 -1
  16. package/src/executors/ensure-symlink/ensure-symlink.impl.d.ts +4 -0
  17. package/src/executors/ensure-symlink/ensure-symlink.impl.js +4 -0
  18. package/src/executors/ensure-symlink/ensure-symlink.impl.ts +4 -0
  19. package/src/executors/ensure-symlink/schema.json +1 -1
  20. package/src/executors/pod-install/schema.json +1 -1
  21. package/src/executors/run-android/run-android.impl.js +4 -16
  22. package/src/executors/run-android/run-android.impl.ts +8 -17
  23. package/src/executors/run-android/schema.json +1 -1
  24. package/src/executors/run-ios/run-ios.impl.js +4 -16
  25. package/src/executors/run-ios/run-ios.impl.ts +9 -18
  26. package/src/executors/run-ios/schema.json +1 -1
  27. package/src/executors/start/schema.d.ts +1 -1
  28. package/src/executors/start/schema.json +1 -1
  29. package/src/executors/start/start.impl.js +11 -26
  30. package/src/executors/start/start.impl.ts +14 -28
  31. package/src/executors/storybook/storybook.impl.d.ts +4 -0
  32. package/src/executors/storybook/storybook.impl.js +8 -1
  33. package/src/executors/storybook/storybook.impl.ts +16 -5
  34. package/src/executors/sync-deps/schema.json +1 -1
  35. package/src/executors/sync-deps/sync-deps.impl.d.ts +3 -2
  36. package/src/executors/sync-deps/sync-deps.impl.js +28 -11
  37. package/src/executors/sync-deps/sync-deps.impl.ts +45 -19
  38. package/src/executors/upgrade/schema.d.ts +1 -0
  39. package/src/executors/upgrade/schema.json +11 -0
  40. package/src/executors/upgrade/upgrade.impl.d.ts +13 -0
  41. package/src/executors/upgrade/upgrade.impl.js +47 -0
  42. package/src/executors/upgrade/upgrade.impl.ts +64 -0
  43. package/src/generators/application/application.js +30 -7
  44. package/src/generators/application/application.spec.ts +29 -2
  45. package/src/generators/application/files/app/.babelrc.js.template +23 -0
  46. package/src/generators/application/files/app/android/app/build.gradle.template +12 -28
  47. package/src/generators/application/files/app/android/app/src/debug/AndroidManifest.xml.template +2 -6
  48. package/src/generators/application/files/app/android/app/src/main/java/com/__lowerCaseName__/MainActivity.kt.template +22 -0
  49. package/src/generators/application/files/app/android/app/src/main/java/com/__lowerCaseName__/MainApplication.kt.template +45 -0
  50. package/src/generators/application/files/app/android/build.gradle.template +7 -20
  51. package/src/generators/application/files/app/android/gradle/wrapper/gradle-wrapper.properties +2 -1
  52. package/src/generators/application/files/app/android/gradle.properties +0 -3
  53. package/src/generators/application/files/app/android/gradlew.template +12 -7
  54. package/src/generators/application/files/app/android/settings.gradle.template +2 -2
  55. package/src/generators/application/files/app/ios/Podfile.template +0 -7
  56. package/src/generators/application/files/app/ios/__className__/AppDelegate.mm.template +5 -0
  57. package/src/generators/application/files/app/ios/__className__/Info.plist.template +5 -8
  58. package/src/generators/application/files/app/ios/__className__.xcodeproj/project.pbxproj.template +11 -33
  59. package/src/generators/application/files/app/metro.config.js.template +0 -4
  60. package/src/generators/application/files/app/src/app/App.tsx.template +29 -2
  61. package/src/generators/application/lib/add-e2e.d.ts +3 -0
  62. package/src/generators/application/lib/add-e2e.js +47 -0
  63. package/src/generators/application/lib/add-project.js +13 -17
  64. package/src/generators/application/lib/normalize-options.d.ts +4 -0
  65. package/src/generators/application/lib/normalize-options.js +9 -3
  66. package/src/generators/application/lib/normalize-options.spec.ts +53 -5
  67. package/src/generators/application/schema.d.ts +5 -3
  68. package/src/generators/application/schema.json +14 -6
  69. package/src/generators/component/schema.d.ts +3 -3
  70. package/src/generators/component/schema.json +4 -4
  71. package/src/generators/component-story/component-story.d.ts +5 -8
  72. package/src/generators/component-story/component-story.js +8 -69
  73. package/src/generators/component-story/schema.d.ts +1 -0
  74. package/src/generators/component-story/schema.json +11 -3
  75. package/src/generators/init/init.d.ts +1 -0
  76. package/src/generators/init/init.js +14 -7
  77. package/src/generators/init/init.spec.ts +6 -2
  78. package/src/generators/init/schema.d.ts +1 -0
  79. package/src/generators/init/schema.json +1 -1
  80. package/src/generators/library/files/lib/.babelrc.js.template +21 -0
  81. package/src/generators/library/lib/normalize-options.js +1 -0
  82. package/src/generators/library/library.js +6 -1
  83. package/src/generators/library/library.spec.ts +12 -41
  84. package/src/generators/library/schema.d.ts +1 -0
  85. package/src/generators/library/schema.json +2 -2
  86. package/src/generators/stories/schema.d.ts +2 -0
  87. package/src/generators/stories/schema.json +15 -2
  88. package/src/generators/stories/stories.d.ts +5 -2
  89. package/src/generators/stories/stories.js +7 -50
  90. package/src/generators/storybook-configuration/configuration.d.ts +7 -2
  91. package/src/generators/storybook-configuration/configuration.js +15 -48
  92. package/src/generators/storybook-configuration/schema.d.ts +4 -2
  93. package/src/generators/storybook-configuration/schema.json +22 -12
  94. package/src/generators/upgrade-native/lib/normalize-options.d.ts +1 -1
  95. package/src/generators/upgrade-native/schema.d.ts +1 -1
  96. package/src/generators/upgrade-native/schema.json +3 -3
  97. package/src/generators/upgrade-native/upgrade-native.d.ts +2 -0
  98. package/src/generators/upgrade-native/upgrade-native.js +3 -0
  99. package/src/generators/web-configuration/files/base-vite/.babelrc.js.template +23 -0
  100. package/src/generators/web-configuration/files/base-vite/index.html__tmpl__ +15 -0
  101. package/src/generators/web-configuration/files/base-vite/public/favicon.ico +0 -0
  102. package/src/generators/web-configuration/files/base-vite/src/assets/.gitkeep +0 -0
  103. package/src/generators/web-configuration/files/base-vite/src/main-web.tsx__tmpl__ +9 -0
  104. package/src/generators/web-configuration/files/base-vite/vite.config.ts__tmpl__ +82 -0
  105. package/src/generators/web-configuration/files/base-webpack/.babelrc.js.template +23 -0
  106. package/src/generators/web-configuration/files/base-webpack/src/assets/.gitkeep +0 -0
  107. package/src/generators/web-configuration/files/base-webpack/src/favicon.ico +0 -0
  108. package/src/generators/web-configuration/files/base-webpack/src/index.html__tmpl__ +14 -0
  109. package/src/generators/web-configuration/files/base-webpack/src/main-web.tsx__tmpl__ +9 -0
  110. package/src/generators/web-configuration/files/base-webpack/webpack.config.js__tmpl__ +77 -0
  111. package/src/generators/web-configuration/lib/normalize-schema.d.ts +17 -0
  112. package/src/generators/web-configuration/lib/normalize-schema.js +16 -0
  113. package/src/generators/web-configuration/lib/webpack-targets.d.ts +7 -0
  114. package/src/generators/web-configuration/lib/webpack-targets.js +75 -0
  115. package/src/generators/web-configuration/schema.d.ts +6 -0
  116. package/src/generators/web-configuration/schema.json +42 -0
  117. package/src/generators/web-configuration/web-configuration.d.ts +12 -0
  118. package/src/generators/web-configuration/web-configuration.js +85 -0
  119. package/src/migrations/update-16-6-0/update-metro-config.js +0 -4
  120. package/src/migrations/update-16-9-0/remove-types-react-native.js +2 -9
  121. package/src/migrations/update-18-0-0/add-upgrade-target.d.ts +6 -0
  122. package/src/migrations/update-18-0-0/add-upgrade-target.js +33 -0
  123. package/src/migrations/update-18-0-0/add-web-configuration.d.ts +8 -0
  124. package/src/migrations/update-18-0-0/add-web-configuration.js +33 -0
  125. package/src/migrations/update-18-0-0/add-web-configuration.spec.ts +39 -0
  126. package/src/migrations/update-18-0-0/change-storybook-targets.d.ts +5 -0
  127. package/src/migrations/update-18-0-0/change-storybook-targets.js +57 -0
  128. package/src/migrations/update-18-0-0/remove-block-list.d.ts +6 -0
  129. package/src/migrations/update-18-0-0/remove-block-list.js +26 -0
  130. package/src/migrations/update-18-0-0/remove-block-list.spec.ts +68 -0
  131. package/src/migrations/update-18-0-0/remove-metro.d.ts +14 -0
  132. package/src/migrations/update-18-0-0/remove-metro.js +29 -0
  133. package/src/migrations/update-18-0-0/remove-symlink-target.d.ts +6 -0
  134. package/src/migrations/update-18-0-0/remove-symlink-target.js +30 -0
  135. package/src/migrations/update-18-0-0/remove-symlink-target.spec.ts +40 -0
  136. package/src/utils/add-jest.d.ts +1 -1
  137. package/src/utils/add-jest.js +13 -1
  138. package/src/utils/add-linting.d.ts +1 -0
  139. package/src/utils/add-linting.js +1 -0
  140. package/src/utils/add-linting.spec.ts +2 -4
  141. package/src/utils/ensure-dependencies.js +2 -6
  142. package/src/utils/testing-generators.js +1 -0
  143. package/src/utils/versions.d.ts +9 -12
  144. package/src/utils/versions.js +10 -13
  145. package/src/generators/application/files/app/android/app/src/debug/java/com/__lowerCaseName__/ReactNativeFlipper.java.template +0 -75
  146. package/src/generators/application/files/app/android/app/src/main/java/com/__lowerCaseName__/MainActivity.java.template +0 -32
  147. package/src/generators/application/files/app/android/app/src/main/java/com/__lowerCaseName__/MainApplication.java.template +0 -62
  148. package/src/generators/application/files/app/android/app/src/release/java/com/__lowerCaseName__/ReactNativeFlipper.java.template +0 -20
  149. package/src/generators/application/files/app/babel.config.json.template +0 -3
  150. package/src/generators/application/lib/add-detox.d.ts +0 -3
  151. package/src/generators/application/lib/add-detox.js +0 -23
  152. package/src/generators/component-story/component-story.spec.ts +0 -427
  153. package/src/generators/component-story/files/__componentFileName__.stories.__fileExt__ +0 -32
  154. package/src/generators/library/files/lib/babel.config.json.template +0 -17
  155. package/src/generators/stories/stories-app.spec.ts +0 -128
  156. package/src/generators/stories/stories-lib.spec.ts +0 -105
  157. package/src/generators/storybook-configuration/configuration.spec.ts +0 -135
  158. package/src/generators/storybook-configuration/files/app/storybook.ts.template +0 -9
  159. package/src/generators/storybook-configuration/files/app/toggle-storybook.tsx.template +0 -74
  160. package/src/generators/storybook-configuration/files/root/story-loader.ts.template +0 -5
  161. package/src/generators/storybook-configuration/lib/add-resolver-main-fields-to-metro-config.d.ts +0 -6
  162. package/src/generators/storybook-configuration/lib/add-resolver-main-fields-to-metro-config.js +0 -25
  163. package/src/generators/storybook-configuration/lib/add-resolver-main-fields-to-metro-config.spec.ts +0 -161
  164. package/src/generators/storybook-configuration/lib/create-storybook-files.d.ts +0 -6
  165. package/src/generators/storybook-configuration/lib/create-storybook-files.js +0 -42
  166. package/src/generators/storybook-configuration/lib/replace-app-import-with-storybook-toggle.d.ts +0 -7
  167. package/src/generators/storybook-configuration/lib/replace-app-import-with-storybook-toggle.js +0 -29
  168. package/src/generators/storybook-configuration/lib/replace-app-import-with-storybook-toggle.spec.ts +0 -65
  169. package/src/utils/find-all-npm-dependencies.d.ts +0 -2
  170. package/src/utils/find-all-npm-dependencies.js +0 -25
  171. package/src/utils/find-all-npm-dependencies.spec.ts +0 -95
  172. package/src/utils/symlink-task.d.ts +0 -2
  173. package/src/utils/symlink-task.js +0 -18
@@ -1,128 +0,0 @@
1
- import { Tree } from '@nx/devkit';
2
- import storiesGenerator from './stories';
3
- import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing';
4
- import applicationGenerator from '../application/application';
5
- import { Linter } from '@nx/eslint';
6
- import { reactNativeComponentGenerator } from '../component/component';
7
-
8
- describe('react:stories for applications', () => {
9
- let appTree: Tree;
10
-
11
- beforeEach(async () => {
12
- appTree = await createTestUIApp('test-ui-app');
13
- });
14
-
15
- it('should create the stories', async () => {
16
- await reactNativeComponentGenerator(appTree, {
17
- name: 'another-cmp',
18
- project: 'test-ui-app',
19
- });
20
- await storiesGenerator(appTree, {
21
- project: 'test-ui-app',
22
- });
23
-
24
- expect(appTree.exists('test-ui-app/src/app/App.tsx')).toBeTruthy();
25
- expect(appTree.exists('test-ui-app/src/app/App.stories.tsx')).toBeTruthy();
26
- expect(
27
- appTree.exists('test-ui-app/src/app/another-cmp/another-cmp.stories.tsx')
28
- ).toBeTruthy();
29
- });
30
-
31
- it('should ignore paths', async () => {
32
- await reactNativeComponentGenerator(appTree, {
33
- name: 'another-cmp',
34
- project: 'test-ui-app',
35
- });
36
- await storiesGenerator(appTree, {
37
- project: 'test-ui-app',
38
- ignorePaths: ['test-ui-app/src/app/**'],
39
- });
40
-
41
- expect(appTree.exists('test-ui-app/src/app/App.tsx')).toBeTruthy();
42
- expect(appTree.exists('test-ui-app/src/app/App.stories.tsx')).toBeFalsy();
43
- expect(
44
- appTree.exists('test-ui-app/src/app/another-cmp/another-cmp.stories.tsx')
45
- ).toBeFalsy();
46
- });
47
-
48
- it('should ignore paths with a direct path to a component', async () => {
49
- await reactNativeComponentGenerator(appTree, {
50
- name: 'another-new-cmp',
51
- project: 'test-ui-app',
52
- });
53
-
54
- await storiesGenerator(appTree, {
55
- project: 'test-ui-app',
56
- ignorePaths: ['test-ui-app/src/app/another-new-cmp/another-new-cmp.tsx'],
57
- });
58
-
59
- expect(appTree.exists('test-ui-app/src/app/App.tsx')).toBeTruthy();
60
- expect(appTree.exists('test-ui-app/src/app/App.stories.tsx')).toBeTruthy();
61
- expect(
62
- appTree.exists(
63
- 'test-ui-app/src/app/another-new-cmp/another-new-cmp.stories.tsx'
64
- )
65
- ).toBeFalsy();
66
- });
67
-
68
- it('should ignore a path that has a nested component, but still generate nested component stories', async () => {
69
- await reactNativeComponentGenerator(appTree, {
70
- name: 'another-new-cmp',
71
- project: 'test-ui-app',
72
- });
73
- await reactNativeComponentGenerator(appTree, {
74
- name: 'comp-a',
75
- directory: 'app/another-new-cmp',
76
- project: 'test-ui-app',
77
- });
78
- await storiesGenerator(appTree, {
79
- project: 'test-ui-app',
80
- ignorePaths: ['test-ui-app/src/app/another-new-cmp/another-new-cmp.tsx'],
81
- });
82
-
83
- expect(appTree.exists('test-ui-app/src/app/App.tsx')).toBeTruthy();
84
- expect(appTree.exists('test-ui-app/src/app/App.stories.tsx')).toBeTruthy();
85
- expect(
86
- appTree.exists(
87
- 'test-ui-app/src/app/another-new-cmp/comp-a/comp-a.stories.tsx'
88
- )
89
- ).toBeTruthy();
90
- expect(
91
- appTree.exists(
92
- 'test-ui-app/src/app/another-new-cmp/another-new-cmp.stories.tsx'
93
- )
94
- ).toBeFalsy();
95
- });
96
-
97
- it('should ignore files that do not contain components', async () => {
98
- // create another component
99
- appTree.write(
100
- 'test-ui-app/src/app/some-utils.js',
101
- `export const add = (a: number, b: number) => a + b;`
102
- );
103
-
104
- await storiesGenerator(appTree, {
105
- project: 'test-ui-app',
106
- });
107
-
108
- // should just create the story and not error, even though there's a js file
109
- // not containing any react component
110
- expect(appTree.exists('test-ui-app/src/app/App.stories.tsx')).toBeTruthy();
111
- });
112
- });
113
-
114
- export async function createTestUIApp(libName: string): Promise<Tree> {
115
- let appTree = createTreeWithEmptyWorkspace();
116
- appTree.write('.gitignore', '');
117
-
118
- await applicationGenerator(appTree, {
119
- linter: Linter.EsLint,
120
- skipFormat: false,
121
- style: 'css',
122
- unitTestRunner: 'none',
123
- name: libName,
124
- install: false,
125
- projectNameAndRootFormat: 'as-provided',
126
- });
127
- return appTree;
128
- }
@@ -1,105 +0,0 @@
1
- import { Tree } from '@nx/devkit';
2
- import storiesGenerator from './stories';
3
- import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing';
4
- import applicationGenerator from '../application/application';
5
- import { Linter } from '@nx/eslint';
6
- import libraryGenerator from '../library/library';
7
- import reactNativeComponentGenerator from '../component/component';
8
-
9
- describe('react-native:stories for libraries', () => {
10
- let appTree: Tree;
11
-
12
- beforeEach(async () => {
13
- appTree = await createTestUILib('test-ui-lib');
14
- });
15
-
16
- it('should create the stories', async () => {
17
- await reactNativeComponentGenerator(appTree, {
18
- name: 'test-ui-lib',
19
- project: 'test-ui-lib',
20
- });
21
- await reactNativeComponentGenerator(appTree, {
22
- name: 'another-cmp',
23
- project: 'test-ui-lib',
24
- });
25
- await storiesGenerator(appTree, {
26
- project: 'test-ui-lib',
27
- });
28
-
29
- expect(
30
- appTree.exists('test-ui-lib/src/lib/test-ui-lib/test-ui-lib.stories.tsx')
31
- ).toBeTruthy();
32
- expect(
33
- appTree.exists('test-ui-lib/src/lib/another-cmp/another-cmp.stories.tsx')
34
- ).toBeTruthy();
35
- });
36
-
37
- it('should ignore paths', async () => {
38
- await reactNativeComponentGenerator(appTree, {
39
- name: 'test-ui-lib',
40
- project: 'test-ui-lib',
41
- });
42
- await reactNativeComponentGenerator(appTree, {
43
- name: 'another-cmp',
44
- project: 'test-ui-lib',
45
- });
46
- await storiesGenerator(appTree, {
47
- project: 'test-ui-lib',
48
- ignorePaths: ['test-ui-lib/src/lib/another-cmp/**'],
49
- });
50
-
51
- expect(
52
- appTree.exists('test-ui-lib/src/lib/test-ui-lib/test-ui-lib.stories.tsx')
53
- ).toBeTruthy();
54
- expect(
55
- appTree.exists('test-ui-lib/src/lib/another-cmp/another-cmp.stories.tsx')
56
- ).toBeFalsy();
57
- });
58
-
59
- it('should ignore files that do not contain components', async () => {
60
- await reactNativeComponentGenerator(appTree, {
61
- name: 'test-ui-lib',
62
- project: 'test-ui-lib',
63
- });
64
- // create another component
65
- appTree.write(
66
- 'test-ui-lib/src/lib/some-command-line-utils.ts',
67
- `export const add = (a: number, b: number) => a + b;`
68
- );
69
-
70
- await storiesGenerator(appTree, {
71
- project: 'test-ui-lib',
72
- });
73
-
74
- // should just create the story and not error, even though there's a js file
75
- // not containing any react component
76
- expect(
77
- appTree.exists('test-ui-lib/src/lib/test-ui-lib/test-ui-lib.stories.tsx')
78
- ).toBeTruthy();
79
- });
80
- });
81
-
82
- export async function createTestUILib(libName: string): Promise<Tree> {
83
- let appTree = createTreeWithEmptyWorkspace();
84
- appTree.write('.gitignore', '');
85
-
86
- await libraryGenerator(appTree, {
87
- linter: Linter.EsLint,
88
- skipFormat: true,
89
- skipTsConfig: false,
90
- unitTestRunner: 'none',
91
- name: libName,
92
- projectNameAndRootFormat: 'as-provided',
93
- });
94
-
95
- await applicationGenerator(appTree, {
96
- e2eTestRunner: 'none',
97
- linter: Linter.EsLint,
98
- skipFormat: false,
99
- unitTestRunner: 'none',
100
- name: `${libName}-e2e`,
101
- install: false,
102
- projectNameAndRootFormat: 'as-provided',
103
- });
104
- return appTree;
105
- }
@@ -1,135 +0,0 @@
1
- import { Tree } from '@nx/devkit';
2
- import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing';
3
- import { Linter } from '@nx/eslint';
4
- import { logger } from '@nx/devkit';
5
-
6
- import libraryGenerator from '../library/library';
7
- import applicationGenerator from '../application/application';
8
- import componentGenerator from '../component/component';
9
- import storybookConfigurationGenerator from './configuration';
10
-
11
- // nested code imports graph from the repo, which might have innacurate graph version
12
- jest.mock('nx/src/project-graph/project-graph', () => ({
13
- ...jest.requireActual<any>('nx/src/project-graph/project-graph'),
14
- createProjectGraphAsync: jest
15
- .fn()
16
- .mockImplementation(async () => ({ nodes: {}, dependencies: {} })),
17
- }));
18
-
19
- describe('react-native:storybook-configuration', () => {
20
- let appTree;
21
-
22
- beforeEach(async () => {
23
- jest.spyOn(logger, 'warn').mockImplementation(() => {});
24
- jest.spyOn(logger, 'debug').mockImplementation(() => {});
25
- });
26
-
27
- afterEach(() => {
28
- jest.restoreAllMocks();
29
- });
30
-
31
- describe('should generate files for an app', () => {
32
- it('should configure everything at once', async () => {
33
- appTree = await createTestUILib('test-ui-lib');
34
- appTree.write('.gitignore', '');
35
- await storybookConfigurationGenerator(appTree, {
36
- name: 'test-ui-lib',
37
- });
38
-
39
- expect(appTree.exists('test-ui-lib/.storybook/main.js')).toBeTruthy();
40
- expect(
41
- appTree.exists('test-ui-lib/tsconfig.storybook.json')
42
- ).toBeTruthy();
43
- });
44
-
45
- it('should generate stories for components', async () => {
46
- appTree = await createTestUILib('test-ui-lib');
47
- await componentGenerator(appTree, {
48
- name: 'test-ui-lib',
49
- project: 'test-ui-lib',
50
- });
51
- await storybookConfigurationGenerator(appTree, {
52
- name: 'test-ui-lib',
53
- generateStories: true,
54
- });
55
-
56
- expect(
57
- appTree.exists(
58
- 'test-ui-lib/src/lib/test-ui-lib/test-ui-lib.stories.tsx'
59
- )
60
- ).toBeTruthy();
61
- });
62
- });
63
-
64
- describe('should generate files for lib', () => {
65
- it('should configure everything at once', async () => {
66
- appTree = await createTestAppLib('test-ui-app');
67
- await storybookConfigurationGenerator(appTree, {
68
- name: 'test-ui-app',
69
- });
70
-
71
- expect(appTree.exists('test-ui-app/.storybook/main.js')).toBeTruthy();
72
- expect(
73
- appTree.exists('test-ui-app/tsconfig.storybook.json')
74
- ).toBeTruthy();
75
- });
76
-
77
- it('should generate stories for components', async () => {
78
- appTree = await createTestAppLib('test-ui-app');
79
- await storybookConfigurationGenerator(appTree, {
80
- name: 'test-ui-app',
81
- generateStories: true,
82
- });
83
-
84
- // Currently the auto-generate stories feature only picks up components under the 'lib' directory.
85
- // In our 'createTestAppLib' function, we call @nx/react-native:component to generate a component
86
- // under the specified 'lib' directory
87
- expect(
88
- appTree.exists(
89
- 'test-ui-app/src/app/my-component/my-component.stories.tsx'
90
- )
91
- ).toBeTruthy();
92
- });
93
- });
94
- });
95
-
96
- export async function createTestUILib(libName: string): Promise<Tree> {
97
- let appTree = createTreeWithEmptyWorkspace();
98
-
99
- await libraryGenerator(appTree, {
100
- linter: Linter.EsLint,
101
- skipFormat: true,
102
- skipTsConfig: false,
103
- unitTestRunner: 'none',
104
- name: libName,
105
- projectNameAndRootFormat: 'as-provided',
106
- });
107
- return appTree;
108
- }
109
-
110
- export async function createTestAppLib(
111
- libName: string,
112
- plainJS = false
113
- ): Promise<Tree> {
114
- let appTree = createTreeWithEmptyWorkspace();
115
-
116
- await applicationGenerator(appTree, {
117
- e2eTestRunner: 'none',
118
- linter: Linter.EsLint,
119
- skipFormat: false,
120
- style: 'css',
121
- unitTestRunner: 'none',
122
- name: libName,
123
- js: plainJS,
124
- install: false,
125
- projectNameAndRootFormat: 'as-provided',
126
- });
127
-
128
- await componentGenerator(appTree, {
129
- name: 'my-component',
130
- project: libName,
131
- directory: 'app',
132
- });
133
-
134
- return appTree;
135
- }
@@ -1,9 +0,0 @@
1
- import { configure, getStorybookUI } from '@storybook/react-native';
2
-
3
- import { loadStories } from '<%= offsetFromRoot %>../.storybook/story-loader';
4
-
5
- configure(() => loadStories(), module);
6
-
7
- const StorybookUIRoot = getStorybookUI({});
8
-
9
- export default StorybookUIRoot;
@@ -1,74 +0,0 @@
1
- /**
2
- * Toggle inspired from https://github.com/infinitered/ignite/blob/master/boilerplate/storybook/toggle-storybook.tsx
3
- */
4
- import React, { useState, useEffect, useRef } from 'react';
5
- import { DevSettings } from 'react-native';
6
-
7
- import AppRoot from '../app/App';
8
-
9
- export const DEFAULT_REACTOTRON_WS_URI = 'ws://localhost:9090';
10
-
11
- /**
12
- * Toggle Storybook mode, in __DEV__ mode only.
13
- *
14
- * In non-__DEV__ mode, or when Storybook isn't toggled on,
15
- * renders its children.
16
- *
17
- * The mode flag is persisted in async storage, which means it
18
- * persists across reloads/restarts - this is handy when developing
19
- * new components in Storybook.
20
- */
21
- function ToggleStorybook(props) {
22
- const [showStorybook, setShowStorybook] = useState(false);
23
- const [StorybookUIRoot, setStorybookUIRoot] = useState(null);
24
- const ws = useRef(new WebSocket(DEFAULT_REACTOTRON_WS_URI));
25
-
26
- useEffect(() => {
27
- if (!__DEV__) {
28
- return undefined;
29
- }
30
-
31
- if (DevSettings) {
32
- // Add our toggle command to the menu
33
- DevSettings.addMenuItem('Toggle Storybook', () => {
34
- setShowStorybook((show) => {
35
- // On toggle, flip the current value
36
- show = !show;
37
-
38
- // Return it to change the local state
39
- return show;
40
- });
41
- });
42
- }
43
-
44
- // Load the storybook UI once
45
- // eslint-disable-next-line @typescript-eslint/no-var-requires
46
- setStorybookUIRoot(() => require('./storybook.ts').default);
47
-
48
- // Behave as Reactotron.storybookSwitcher(), not a HOC way.
49
- ws.current.onmessage = (e) => {
50
- const data = JSON.parse(e.data);
51
-
52
- if (data.type === 'storybook') {
53
- setShowStorybook(data.payload);
54
- }
55
- };
56
- ws.current.onerror = (e) => {
57
- setShowStorybook(false);
58
- };
59
- });
60
-
61
- if (showStorybook) {
62
- return StorybookUIRoot ? <StorybookUIRoot /> : null;
63
- } else {
64
- return props.children;
65
- }
66
- }
67
-
68
- export default () => {
69
- return (
70
- <ToggleStorybook>
71
- <AppRoot />
72
- </ToggleStorybook>
73
- );
74
- };
@@ -1,5 +0,0 @@
1
- // Auto-generated file created by nx
2
- // DO NOT EDIT.
3
- export function loadStories() {
4
- return [];
5
- }
@@ -1,6 +0,0 @@
1
- import { Tree } from '@nx/devkit';
2
- import { StorybookConfigureSchema } from '../schema';
3
- /**
4
- * Add resolverMainFields in metro.config.js
5
- */
6
- export declare function addResolverMainFieldsToMetroConfig(host: Tree, schema: StorybookConfigureSchema): void;
@@ -1,25 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.addResolverMainFieldsToMetroConfig = void 0;
4
- const devkit_1 = require("@nx/devkit");
5
- const path_1 = require("path");
6
- /**
7
- * Add resolverMainFields in metro.config.js
8
- */
9
- function addResolverMainFieldsToMetroConfig(host, schema) {
10
- const { root } = (0, devkit_1.readProjectConfiguration)(host, schema.name);
11
- const metroConfigPath = (0, path_1.join)(root, 'metro.config.js');
12
- try {
13
- devkit_1.logger.debug(`Updating resolverMainFields for ${metroConfigPath}`);
14
- const metroConfigContent = host.read(metroConfigPath, 'utf-8');
15
- if (metroConfigContent.includes('resolverMainFields:')) {
16
- devkit_1.logger.warn((0, devkit_1.stripIndents) `${metroConfigPath} is already udpated.`);
17
- return;
18
- }
19
- host.write(metroConfigPath, metroConfigContent.replace(/},\s+resolver: {/, `},resolver: { resolverMainFields: ['sbmodern', 'browser', 'main'],`));
20
- }
21
- catch {
22
- devkit_1.logger.error((0, devkit_1.stripIndents) `Unable to update ${metroConfigPath} for project ${root}.`);
23
- }
24
- }
25
- exports.addResolverMainFieldsToMetroConfig = addResolverMainFieldsToMetroConfig;
@@ -1,161 +0,0 @@
1
- import { addProjectConfiguration, Tree } from '@nx/devkit';
2
- import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing';
3
-
4
- import { formatFile } from '../../../utils/format-file';
5
-
6
- import { addResolverMainFieldsToMetroConfig } from './add-resolver-main-fields-to-metro-config';
7
-
8
- describe('addResolverMainFieldsToMetroConfig', () => {
9
- let tree: Tree;
10
-
11
- beforeEach(() => {
12
- tree = createTreeWithEmptyWorkspace();
13
-
14
- addProjectConfiguration(tree, 'products', {
15
- root: 'products',
16
- sourceRoot: 'products/src',
17
- });
18
- });
19
-
20
- it(`should update metro.config.js and add key projectRoot`, async () => {
21
- tree.write(
22
- 'products/metro.config.js',
23
- formatFile`
24
- const { withNxMetro } = require('@nx/react-native');
25
- const { getDefaultConfig } = require('metro-config');
26
- const exclusionList = require('metro-config/src/defaults/exclusionList');
27
-
28
- module.exports = (async () => {
29
- const {
30
- resolver: { sourceExts, assetExts },
31
- } = await getDefaultConfig();
32
- return withNxMetro(
33
- {
34
- transformer: {
35
- getTransformOptions: async () => ({
36
- transform: {
37
- experimentalImportSupport: false,
38
- inlineRequires: true,
39
- },
40
- }),
41
- babelTransformerPath: require.resolve('react-native-svg-transformer'),
42
- },
43
- resolver: {
44
-
45
- assetExts: assetExts.filter((ext) => ext !== 'svg'),
46
- sourceExts: [...sourceExts, 'svg'],
47
- blockList: exclusionList([/^(?!.*node_modules).*\/dist\/.*/]),
48
- },
49
- }
50
- );
51
- })();`
52
- );
53
- addResolverMainFieldsToMetroConfig(tree, {
54
- name: 'products',
55
- });
56
-
57
- expect(
58
- formatFile`${tree.read('products/metro.config.js', 'utf-8')}`
59
- ).toEqual(
60
- formatFile`
61
- const { withNxMetro } = require('@nx/react-native');
62
- const { getDefaultConfig } = require('metro-config');
63
- const exclusionList = require('metro-config/src/defaults/exclusionList');
64
-
65
- module.exports = (async () => {
66
- const {
67
- resolver: { sourceExts, assetExts },
68
- } = await getDefaultConfig();
69
- return withNxMetro(
70
- {
71
- transformer: {
72
- getTransformOptions: async () => ({
73
- transform: {
74
- experimentalImportSupport: false,
75
- inlineRequires: true,
76
- },
77
- }),
78
- babelTransformerPath: require.resolve('react-native-svg-transformer'),
79
- },
80
- resolver: {
81
- resolverMainFields: ['sbmodern', 'browser', 'main'],
82
- assetExts: assetExts.filter((ext) => ext !== 'svg'),
83
- sourceExts: [...sourceExts, 'svg'],
84
- blockList: exclusionList([/^(?!.*node_modules).*\/dist\/.*/]),
85
- },
86
- }
87
- );
88
- })();`
89
- );
90
- });
91
-
92
- it(`should not udpate metro.config.js if projectRoot already exists`, async () => {
93
- tree.write(
94
- 'products/metro.config.js',
95
- `
96
- const { withNxMetro } = require('@nx/react-native');
97
- const { getDefaultConfig } = require('metro-config');
98
-
99
- module.exports = (async () => {
100
- const {
101
- resolver: { sourceExts, assetExts },
102
- } = await getDefaultConfig();
103
- // console.log(getModulesRunBeforeMainModule);
104
- return withNxMetro(
105
- {
106
- transformer: {
107
- getTransformOptions: async () => ({
108
- transform: {
109
- experimentalImportSupport: false,
110
- inlineRequires: true,
111
- },
112
- }),
113
- babelTransformerPath: require.resolve('react-native-svg-transformer'),
114
- },
115
- resolver: {
116
- resolverMainFields: ['main'],
117
- assetExts: assetExts.filter((ext) => ext !== 'svg'),
118
- sourceExts: [...sourceExts, 'svg'],
119
- },
120
- },
121
- );
122
- })();
123
- `
124
- );
125
- addResolverMainFieldsToMetroConfig(tree, {
126
- name: 'products',
127
- });
128
-
129
- expect(tree.read('products/metro.config.js', 'utf-8')).toEqual(
130
- `
131
- const { withNxMetro } = require('@nx/react-native');
132
- const { getDefaultConfig } = require('metro-config');
133
-
134
- module.exports = (async () => {
135
- const {
136
- resolver: { sourceExts, assetExts },
137
- } = await getDefaultConfig();
138
- // console.log(getModulesRunBeforeMainModule);
139
- return withNxMetro(
140
- {
141
- transformer: {
142
- getTransformOptions: async () => ({
143
- transform: {
144
- experimentalImportSupport: false,
145
- inlineRequires: true,
146
- },
147
- }),
148
- babelTransformerPath: require.resolve('react-native-svg-transformer'),
149
- },
150
- resolver: {
151
- resolverMainFields: ['main'],
152
- assetExts: assetExts.filter((ext) => ext !== 'svg'),
153
- sourceExts: [...sourceExts, 'svg'],
154
- },
155
- },
156
- );
157
- })();
158
- `
159
- );
160
- });
161
- });
@@ -1,6 +0,0 @@
1
- import { Tree } from '@nx/devkit';
2
- import { StorybookConfigureSchema } from '../schema';
3
- /**
4
- * This function generate ./storybook under project root.
5
- */
6
- export declare function createStorybookFiles(host: Tree, schema: StorybookConfigureSchema): Promise<void>;