@common-stack/generate-plugin 6.0.1-alpha.9 → 6.0.2-alpha.10

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 (265) hide show
  1. package/.eslintrc.json +1 -1
  2. package/CHANGELOG.md +44 -0
  3. package/README.md +280 -10
  4. package/cde-config.json +86 -0
  5. package/executors.json +14 -0
  6. package/generators.json +15 -0
  7. package/lib/constants/index.cjs +2 -1
  8. package/lib/constants/index.cjs.map +1 -1
  9. package/lib/constants/index.d.ts +1 -0
  10. package/lib/constants/index.mjs +2 -1
  11. package/lib/constants/index.mjs.map +1 -1
  12. package/lib/executors/sort-package-json/executor.cjs +46 -0
  13. package/lib/executors/sort-package-json/executor.cjs.map +1 -0
  14. package/lib/executors/sort-package-json/executor.d.ts +4 -0
  15. package/lib/executors/sort-package-json/executor.mjs +46 -0
  16. package/lib/executors/sort-package-json/executor.mjs.map +1 -0
  17. package/lib/executors/sort-package-json/executor.spec.d.ts +1 -0
  18. package/lib/executors/sort-package-json/schema.json +9 -0
  19. package/lib/executors/update-deploy-version/executor.cjs +22 -0
  20. package/lib/executors/update-deploy-version/executor.cjs.map +1 -0
  21. package/lib/executors/update-deploy-version/executor.d.ts +4 -0
  22. package/lib/executors/update-deploy-version/executor.mjs +22 -0
  23. package/lib/executors/update-deploy-version/executor.mjs.map +1 -0
  24. package/lib/executors/update-deploy-version/executor.spec.d.ts +1 -0
  25. package/lib/executors/update-deploy-version/schema.json +14 -0
  26. package/lib/generators/add-backend/files/CHANGELOG.md +0 -0
  27. package/lib/generators/add-backend/files/Dockerfile +1 -1
  28. package/lib/generators/add-backend/files/config.json +0 -1
  29. package/lib/generators/add-backend/files/package.json +1 -53
  30. package/lib/generators/add-backend/files/src/api/root-schema.graphqls +9 -0
  31. package/lib/generators/add-backend/files/src/config/env-config.ts.template +2 -24
  32. package/lib/generators/add-backend/files/src/service.ts.template +4 -5
  33. package/lib/generators/add-backend/files/tsconfig.json +1 -1
  34. package/lib/generators/add-backend/files/webpack.config.js +6 -10
  35. package/lib/generators/add-backend/generator.cjs +21 -17
  36. package/lib/generators/add-backend/generator.cjs.map +1 -1
  37. package/lib/generators/add-backend/generator.d.ts +1 -0
  38. package/lib/generators/add-backend/generator.mjs +21 -17
  39. package/lib/generators/add-backend/generator.mjs.map +1 -1
  40. package/lib/generators/add-browser-package/files/package.json +2 -2
  41. package/lib/generators/add-browser-package/generator.cjs +14 -16
  42. package/lib/generators/add-browser-package/generator.cjs.map +1 -1
  43. package/lib/generators/add-browser-package/generator.d.ts +1 -0
  44. package/lib/generators/add-browser-package/generator.mjs +14 -16
  45. package/lib/generators/add-browser-package/generator.mjs.map +1 -1
  46. package/lib/generators/add-client-package/files/CHANGELOG.md +807 -0
  47. package/lib/generators/add-client-package/files/LICENSE +674 -0
  48. package/lib/generators/add-client-package/files/jest.config.js +13 -0
  49. package/lib/generators/add-client-package/files/package.json +30 -0
  50. package/lib/generators/add-client-package/files/rollup.config.mjs +29 -0
  51. package/lib/generators/add-client-package/files/src/components/index.tsx.template +1 -0
  52. package/lib/generators/add-client-package/files/src/index.ts.template +1 -0
  53. package/lib/generators/add-client-package/files/tsconfig.json +27 -0
  54. package/lib/generators/add-client-package/files/webpack.config.js +72 -0
  55. package/lib/generators/add-client-package/generator.cjs +17 -0
  56. package/lib/generators/add-client-package/generator.cjs.map +1 -0
  57. package/lib/generators/add-client-package/generator.d.ts +5 -0
  58. package/lib/generators/add-client-package/generator.mjs +17 -0
  59. package/lib/generators/add-client-package/generator.mjs.map +1 -0
  60. package/lib/generators/add-client-package/generator.spec.d.ts +1 -0
  61. package/lib/generators/add-client-package/schema.json +19 -0
  62. package/lib/generators/add-core-package/files/CHANGELOG.md +1076 -0
  63. package/lib/generators/add-core-package/files/LICENSE +39 -0
  64. package/lib/generators/add-core-package/files/jest.config.js +3 -0
  65. package/lib/generators/add-core-package/files/package.json +30 -0
  66. package/lib/generators/add-core-package/files/rollup.config.mjs +65 -0
  67. package/lib/generators/add-core-package/files/src/constants/index.ts.template +1 -0
  68. package/lib/generators/add-core-package/files/src/constants/types.ts.template +3 -0
  69. package/lib/generators/add-core-package/files/src/index.ts.template +2 -0
  70. package/lib/generators/add-core-package/files/src/types/index.ts.template +1 -0
  71. package/lib/generators/add-core-package/files/src/types/types.ts.template +17 -0
  72. package/lib/generators/add-core-package/files/tsconfig.json +22 -0
  73. package/lib/generators/add-core-package/files/webpack.config.js +53 -0
  74. package/lib/generators/add-core-package/generator.cjs +17 -0
  75. package/lib/generators/add-core-package/generator.cjs.map +1 -0
  76. package/lib/generators/add-core-package/generator.d.ts +5 -0
  77. package/lib/generators/add-core-package/generator.mjs +17 -0
  78. package/lib/generators/add-core-package/generator.mjs.map +1 -0
  79. package/lib/generators/add-core-package/generator.spec.d.ts +1 -0
  80. package/lib/generators/add-core-package/schema.json +19 -0
  81. package/lib/generators/add-frontend/frameworks/chakraui/entry.client.tsx.template +30 -24
  82. package/lib/generators/add-frontend/frameworks/chakraui/entry.server.tsx.template +5 -8
  83. package/lib/generators/add-frontend/frameworks/chakraui/root.tsx.template +3 -3
  84. package/lib/generators/add-frontend/frameworks/tailwindui/entry.client.tsx.template +90 -0
  85. package/lib/generators/add-frontend/frameworks/tailwindui/entry.server.tsx.template +238 -0
  86. package/lib/generators/add-frontend/frameworks/tailwindui/root.tsx.template +117 -0
  87. package/lib/generators/add-frontend/frameworks/tailwindui/tailwind.css +3 -0
  88. package/lib/generators/add-frontend/generator.cjs +60 -42
  89. package/lib/generators/add-frontend/generator.cjs.map +1 -1
  90. package/lib/generators/add-frontend/generator.d.ts +1 -0
  91. package/lib/generators/add-frontend/generator.mjs +60 -42
  92. package/lib/generators/add-frontend/generator.mjs.map +1 -1
  93. package/lib/generators/add-frontend/schema.json +1 -1
  94. package/lib/generators/add-frontend/templates/Dockerfile +1 -1
  95. package/lib/generators/add-frontend/templates/package.json +4 -80
  96. package/lib/generators/add-frontend/templates/postcss.config.js +6 -0
  97. package/lib/generators/add-frontend/templates/src/config/public-config.ts.template +6 -0
  98. package/lib/generators/add-frontend/templates/tailwind.config.ts.template +12 -0
  99. package/lib/generators/add-fullstack/files/Jenkinsfile +4 -7
  100. package/lib/generators/add-fullstack/files/jest-mongodb-config.js +3 -2
  101. package/lib/generators/add-fullstack/files/jest.config.base.js +43 -4
  102. package/lib/generators/add-fullstack/files/jest.config.base.mjs +99 -0
  103. package/lib/generators/add-fullstack/files/jest.config.mongodb.mjs +3 -0
  104. package/lib/generators/add-fullstack/files/lint-staged.config.js +4 -1
  105. package/lib/generators/add-fullstack/files/nx.json +18 -13
  106. package/lib/generators/add-fullstack/files/package.json +12 -24
  107. package/lib/generators/add-fullstack/files/tools/cli/helpers/util.js +1 -1
  108. package/lib/generators/add-fullstack/files/tools/deploy-cli/updateLernaVersion.js +1 -1
  109. package/lib/generators/add-fullstack/files/tools/deploy-cli/updateYamlSettings.js +14 -15
  110. package/lib/generators/add-fullstack/files/tools/prettier.config.js +8 -0
  111. package/lib/generators/add-fullstack/files/tools/rollup/rollupPluginGenerateJson.mjs +48 -0
  112. package/lib/generators/add-fullstack/files/tools/rollup/rollupPluginModifyLibFiles.mjs +410 -0
  113. package/lib/generators/add-fullstack/files/tools/runLint.mjs +15 -0
  114. package/lib/generators/add-fullstack/files/tools/sortPackageJson.mjs +8 -2
  115. package/lib/generators/add-fullstack/files/tools/update-dependencies.mjs +95 -0
  116. package/lib/generators/add-fullstack/files/tools/update-dependency-link.mjs +138 -0
  117. package/lib/generators/add-fullstack/files/tools/update-dependency-version.js +104 -89
  118. package/lib/generators/add-fullstack/files/tools/updateUtils.mjs +77 -0
  119. package/lib/generators/add-fullstack/generator.cjs +71 -13
  120. package/lib/generators/add-fullstack/generator.cjs.map +1 -1
  121. package/lib/generators/add-fullstack/generator.mjs +71 -13
  122. package/lib/generators/add-fullstack/generator.mjs.map +1 -1
  123. package/lib/generators/add-fullstack/schema.json +9 -0
  124. package/lib/generators/add-fullstack/updates/index.d.ts +2 -0
  125. package/lib/generators/add-fullstack/updates/jenkinsfileUpdate.cjs +36 -0
  126. package/lib/generators/add-fullstack/updates/jenkinsfileUpdate.cjs.map +1 -0
  127. package/lib/generators/add-fullstack/updates/jenkinsfileUpdate.d.ts +1 -0
  128. package/lib/generators/add-fullstack/updates/jenkinsfileUpdate.mjs +36 -0
  129. package/lib/generators/add-fullstack/updates/jenkinsfileUpdate.mjs.map +1 -0
  130. package/lib/generators/add-fullstack/updates/packageJsonUpdate.cjs +8 -0
  131. package/lib/generators/add-fullstack/updates/packageJsonUpdate.cjs.map +1 -0
  132. package/lib/generators/add-fullstack/updates/packageJsonUpdate.d.ts +2 -0
  133. package/lib/generators/add-fullstack/updates/packageJsonUpdate.mjs +8 -0
  134. package/lib/generators/add-fullstack/updates/packageJsonUpdate.mjs.map +1 -0
  135. package/lib/generators/add-moleculer/files/Dockerfile +1 -1
  136. package/lib/generators/add-moleculer/files/package.json +6 -25
  137. package/lib/generators/add-moleculer/generator.cjs +14 -16
  138. package/lib/generators/add-moleculer/generator.cjs.map +1 -1
  139. package/lib/generators/add-moleculer/generator.d.ts +1 -0
  140. package/lib/generators/add-moleculer/generator.mjs +14 -16
  141. package/lib/generators/add-moleculer/generator.mjs.map +1 -1
  142. package/lib/generators/add-server-package/files/CHANGELOG.md +2599 -0
  143. package/lib/generators/add-server-package/files/LICENSE +674 -0
  144. package/lib/generators/add-server-package/files/jest.config.js +32 -0
  145. package/lib/generators/add-server-package/files/package.json +78 -0
  146. package/lib/generators/add-server-package/files/rollup.config.mjs +30 -0
  147. package/lib/generators/add-server-package/files/src/constants/constants.ts.template +62 -0
  148. package/lib/generators/add-server-package/files/src/constants/index.ts.template +1 -0
  149. package/lib/generators/add-server-package/files/src/constants/types.ts.template +21 -0
  150. package/lib/generators/add-server-package/files/src/index.ts.template +6 -0
  151. package/lib/generators/add-server-package/files/src/module.ts.template +6 -0
  152. package/lib/generators/add-server-package/files/tsconfig.json +27 -0
  153. package/lib/generators/add-server-package/generator.cjs +17 -0
  154. package/lib/generators/add-server-package/generator.cjs.map +1 -0
  155. package/lib/generators/add-server-package/generator.d.ts +5 -0
  156. package/lib/generators/add-server-package/generator.mjs +17 -0
  157. package/lib/generators/add-server-package/generator.mjs.map +1 -0
  158. package/lib/generators/add-server-package/generator.spec.d.ts +1 -0
  159. package/lib/generators/add-server-package/schema.json +19 -0
  160. package/lib/index.cjs +1 -1
  161. package/lib/index.d.ts +5 -0
  162. package/lib/index.mjs +1 -1
  163. package/package.json +4 -2
  164. package/project.json +12 -1
  165. package/rollup.config.mjs +8 -0
  166. package/src/constants/index.ts +2 -1
  167. package/src/executors/sort-package-json/executor.spec.ts +18 -0
  168. package/src/executors/sort-package-json/executor.ts +53 -0
  169. package/src/executors/sort-package-json/schema.d.ts +1 -0
  170. package/src/executors/sort-package-json/schema.json +9 -0
  171. package/src/executors/update-deploy-version/executor.spec.ts +18 -0
  172. package/src/executors/update-deploy-version/executor.ts +36 -0
  173. package/src/executors/update-deploy-version/schema.d.ts +3 -0
  174. package/src/executors/update-deploy-version/schema.json +14 -0
  175. package/src/generators/add-backend/generator.ts +8 -4
  176. package/src/generators/add-browser-package/generator.ts +7 -6
  177. package/src/generators/add-client-package/generator.spec.ts +20 -0
  178. package/src/generators/add-client-package/generator.ts +24 -0
  179. package/src/generators/add-client-package/schema.d.ts +4 -0
  180. package/src/generators/add-client-package/schema.json +19 -0
  181. package/src/generators/add-core-package/generator.spec.ts +20 -0
  182. package/src/generators/add-core-package/generator.ts +24 -0
  183. package/src/generators/add-core-package/schema.d.ts +4 -0
  184. package/src/generators/add-core-package/schema.json +19 -0
  185. package/src/generators/add-frontend/frameworks/chakraui/entry.client.tsx.template +30 -24
  186. package/src/generators/add-frontend/frameworks/chakraui/entry.server.tsx.template +5 -8
  187. package/src/generators/add-frontend/frameworks/chakraui/root.tsx.template +3 -3
  188. package/src/generators/add-frontend/frameworks/tailwindui/entry.client.tsx.template +90 -0
  189. package/src/generators/add-frontend/frameworks/tailwindui/entry.server.tsx.template +238 -0
  190. package/src/generators/add-frontend/frameworks/tailwindui/root.tsx.template +117 -0
  191. package/src/generators/add-frontend/frameworks/tailwindui/tailwind.css +3 -0
  192. package/src/generators/add-frontend/generator.ts +24 -2
  193. package/src/generators/add-frontend/schema.json +1 -1
  194. package/src/generators/add-fullstack/files/Jenkinsfile +4 -7
  195. package/src/generators/add-fullstack/files/jest-mongodb-config.js +3 -2
  196. package/src/generators/add-fullstack/files/jest.config.base.js +43 -4
  197. package/src/generators/add-fullstack/files/jest.config.base.mjs +99 -0
  198. package/src/generators/add-fullstack/files/jest.config.mongodb.mjs +3 -0
  199. package/src/generators/add-fullstack/files/lint-staged.config.js +4 -1
  200. package/src/generators/add-fullstack/files/nx.json +18 -13
  201. package/src/generators/add-fullstack/files/package.json +12 -24
  202. package/src/generators/add-fullstack/files/tools/cli/helpers/util.js +1 -1
  203. package/src/generators/add-fullstack/files/tools/deploy-cli/updateLernaVersion.js +1 -1
  204. package/src/generators/add-fullstack/files/tools/deploy-cli/updateYamlSettings.js +14 -15
  205. package/src/generators/add-fullstack/files/tools/prettier.config.js +8 -0
  206. package/src/generators/add-fullstack/files/tools/rollup/rollupPluginGenerateJson.mjs +48 -0
  207. package/src/generators/add-fullstack/files/tools/rollup/rollupPluginModifyLibFiles.mjs +410 -0
  208. package/src/generators/add-fullstack/files/tools/runLint.mjs +15 -0
  209. package/src/generators/add-fullstack/files/tools/sortPackageJson.mjs +8 -2
  210. package/src/generators/add-fullstack/files/tools/update-dependencies.mjs +95 -0
  211. package/src/generators/add-fullstack/files/tools/update-dependency-link.mjs +138 -0
  212. package/src/generators/add-fullstack/files/tools/update-dependency-version.js +104 -89
  213. package/src/generators/add-fullstack/files/tools/updateUtils.mjs +77 -0
  214. package/src/generators/add-fullstack/generator.ts +101 -13
  215. package/src/generators/add-fullstack/schema.d.ts +3 -1
  216. package/src/generators/add-fullstack/schema.json +9 -0
  217. package/src/generators/add-fullstack/updates/index.ts +2 -0
  218. package/src/generators/add-fullstack/updates/jenkinsfileUpdate.ts +47 -0
  219. package/src/generators/add-fullstack/updates/packageJsonUpdate.ts +11 -0
  220. package/src/generators/add-moleculer/files/Dockerfile +1 -1
  221. package/src/generators/add-moleculer/files/package.json +6 -25
  222. package/src/generators/add-moleculer/generator.ts +7 -6
  223. package/src/generators/add-server-package/generator.spec.ts +20 -0
  224. package/src/generators/add-server-package/generator.ts +24 -0
  225. package/src/generators/add-server-package/schema.d.ts +4 -0
  226. package/src/generators/add-server-package/schema.json +19 -0
  227. package/src/index.ts +5 -0
  228. package/lib/generators/add-backend/files/generated-schema.graphql +0 -235
  229. package/lib/generators/add-backend/files/knexfile.js +0 -63
  230. package/lib/generators/add-backend/files/src/api/remote-config.ts.template +0 -11
  231. package/lib/generators/add-backend/files/src/api/resolver.ts.template +0 -15
  232. package/lib/generators/add-backend/files/src/api/scalar.ts.template +0 -16
  233. package/lib/generators/add-backend/files/src/api/schema-builder.ts.template +0 -189
  234. package/lib/generators/add-backend/files/src/api/utils.ts.template +0 -44
  235. package/lib/generators/add-backend/files/src/config/moleculer.config.ts.template +0 -228
  236. package/lib/generators/add-backend/files/src/connectors/connection-broker.ts.template +0 -80
  237. package/lib/generators/add-backend/files/src/connectors/graphql-pubsub-connector.ts.template +0 -43
  238. package/lib/generators/add-backend/files/src/connectors/mongo-connector.ts.template +0 -78
  239. package/lib/generators/add-backend/files/src/connectors/nats-connector.ts.template +0 -82
  240. package/lib/generators/add-backend/files/src/connectors/redis-connector.ts.template +0 -73
  241. package/lib/generators/add-backend/files/src/express-app.ts.template +0 -67
  242. package/lib/generators/add-backend/files/src/interfaces/index.ts.template +0 -1
  243. package/lib/generators/add-backend/files/src/interfaces/module-interface.ts.template +0 -16
  244. package/lib/generators/add-backend/files/src/main.spec.ts.template +0 -129
  245. package/lib/generators/add-backend/files/src/middleware/__tests__/cors.test.ts.template +0 -12
  246. package/lib/generators/add-backend/files/src/middleware/cors.ts.template +0 -31
  247. package/lib/generators/add-backend/files/src/middleware/error.ts.template +0 -63
  248. package/lib/generators/add-backend/files/src/middleware/moleculer-inter-namespace.ts.template +0 -60
  249. package/lib/generators/add-backend/files/src/middleware/persistedQuery.ts.template +0 -40
  250. package/lib/generators/add-backend/files/src/middleware/sentry.ts.template +0 -9
  251. package/lib/generators/add-backend/files/src/middleware/services.ts.template +0 -16
  252. package/lib/generators/add-backend/files/src/middleware/tracer.ts.template +0 -24
  253. package/lib/generators/add-backend/files/src/modules/auth/schema/auth-schema.graphql +0 -25
  254. package/lib/generators/add-backend/files/src/server-setup/graphql-server.ts.template +0 -185
  255. package/lib/generators/add-backend/files/src/server-setup/graphql-subscription-server.ts.template +0 -113
  256. package/lib/generators/add-backend/files/src/server-setup/graphql-ws.ts.template +0 -158
  257. package/lib/generators/add-backend/files/src/server-setup/mongodb-migration-update.ts.template +0 -47
  258. package/lib/generators/add-backend/files/src/server-setup/utils.ts.template +0 -43
  259. package/lib/generators/add-backend/files/src/server-setup/websocket-multipath-update.ts.template +0 -88
  260. package/lib/generators/add-backend/files/src/stack-server.ts.template +0 -277
  261. package/lib/generators/add-backend/files/src/utils/migrations.ts.template +0 -32
  262. package/lib/generators/add-backend/files/uploads/3986781.ppt +0 -0
  263. package/lib/generators/add-frontend/templates/public/css/dashboard.css +0 -491
  264. package/lib/generators/add-fullstack/files/tools/update-dependency-link.js +0 -107
  265. package/src/generators/add-fullstack/files/tools/update-dependency-link.js +0 -107
@@ -4,19 +4,20 @@ import { AddBrowserPackageGeneratorSchema } from './schema';
4
4
  import { isValid, getValid } from '../../utils';
5
5
 
6
6
  export async function addBrowserPackageGenerator(tree: Tree, options: AddBrowserPackageGeneratorSchema) {
7
+ const configs: any = {...options};
8
+ return await generateBrowserPackage(tree, configs);
9
+ }
10
+
11
+ export const generateBrowserPackage = async (tree: Tree, options: any) => {
7
12
  const projectName = getValid(options.name) ?? 'browser-package';
8
13
  const projectRoot = isValid(options.directory) ? `${getValid(options.directory)}/${projectName}` : projectName;
9
- // addProjectConfiguration(tree, options.name, {
10
- // root: projectRoot,
11
- // projectType: 'library',
12
- // sourceRoot: `${projectRoot}/src`,
13
- // targets: {},
14
- // });
14
+
15
15
  generateFiles(tree, path.join(__dirname, 'files'), projectRoot, options);
16
16
  updateJson(tree, `${projectRoot}/package.json`, (packageJson) => {
17
17
  packageJson['name'] = projectName;
18
18
  return packageJson;
19
19
  });
20
+
20
21
  await formatFiles(tree);
21
22
  }
22
23
 
@@ -0,0 +1,20 @@
1
+ import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing';
2
+ import { Tree, readProjectConfiguration } from '@nx/devkit';
3
+
4
+ import { addClientPackageGenerator } from './generator';
5
+ import { AddClientPackageGeneratorSchema } from './schema';
6
+
7
+ describe('add-client-package generator', () => {
8
+ let tree: Tree;
9
+ const options: AddClientPackageGeneratorSchema = { name: 'test', directory: 'lib' };
10
+
11
+ beforeEach(() => {
12
+ tree = createTreeWithEmptyWorkspace();
13
+ });
14
+
15
+ it('should run successfully', async () => {
16
+ await addClientPackageGenerator(tree, options);
17
+ const config = readProjectConfiguration(tree, 'test');
18
+ expect(config).toBeDefined();
19
+ });
20
+ });
@@ -0,0 +1,24 @@
1
+ import { addProjectConfiguration, formatFiles, generateFiles, Tree, updateJson } from '@nx/devkit';
2
+ import * as path from 'path';
3
+ import { AddClientPackageGeneratorSchema } from './schema';
4
+ import { isValid, getValid } from '../../utils';
5
+
6
+ export async function addClientPackageGenerator(tree: Tree, options: AddClientPackageGeneratorSchema) {
7
+ const configs: any = {...options};
8
+ return await generateClientPackage(tree, configs);
9
+ }
10
+
11
+ export const generateClientPackage = async (tree: Tree, options: any) => {
12
+ const projectName = getValid(options.name) ?? 'client-package';
13
+ const projectRoot = isValid(options.directory) ? `${getValid(options.directory)}/${projectName}` : projectName;
14
+
15
+ generateFiles(tree, path.join(__dirname, 'files'), projectRoot, options);
16
+ updateJson(tree, `${projectRoot}/package.json`, (packageJson) => {
17
+ packageJson['name'] = projectName;
18
+ return packageJson;
19
+ });
20
+
21
+ await formatFiles(tree);
22
+ }
23
+
24
+ export default addClientPackageGenerator;
@@ -0,0 +1,4 @@
1
+ export interface AddClientPackageGeneratorSchema {
2
+ name: string;
3
+ directory: string;
4
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "$schema": "https://json-schema.org/schema",
3
+ "$id": "AddClientPackage",
4
+ "title": "",
5
+ "type": "object",
6
+ "properties": {
7
+ "name": {
8
+ "type": "string",
9
+ "description": "",
10
+ "x-prompt": "What name would you like to use?"
11
+ },
12
+ "directory": {
13
+ "type": "string",
14
+ "description": "",
15
+ "x-prompt": "What directory would you like to create in?"
16
+ }
17
+ },
18
+ "required": ["name", "directory"]
19
+ }
@@ -0,0 +1,20 @@
1
+ import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing';
2
+ import { Tree, readProjectConfiguration } from '@nx/devkit';
3
+
4
+ import { addCorePackageGenerator } from './generator';
5
+ import { AddCorePackageGeneratorSchema } from './schema';
6
+
7
+ describe('add-core-package generator', () => {
8
+ let tree: Tree;
9
+ const options: AddCorePackageGeneratorSchema = { name: 'test', directory: 'lib' };
10
+
11
+ beforeEach(() => {
12
+ tree = createTreeWithEmptyWorkspace();
13
+ });
14
+
15
+ it('should run successfully', async () => {
16
+ await addCorePackageGenerator(tree, options);
17
+ const config = readProjectConfiguration(tree, 'test');
18
+ expect(config).toBeDefined();
19
+ });
20
+ });
@@ -0,0 +1,24 @@
1
+ import { addProjectConfiguration, formatFiles, generateFiles, Tree, updateJson } from '@nx/devkit';
2
+ import * as path from 'path';
3
+ import { AddCorePackageGeneratorSchema } from './schema';
4
+ import { isValid, getValid } from '../../utils';
5
+
6
+ export async function addCorePackageGenerator(tree: Tree, options: AddCorePackageGeneratorSchema) {
7
+ const configs: any = {...options};
8
+ return await generateCorePackage(tree, configs);
9
+ }
10
+
11
+ export const generateCorePackage = async (tree: Tree, options: any) => {
12
+ const projectName = getValid(options.name) ?? 'core-package';
13
+ const projectRoot = isValid(options.directory) ? `${getValid(options.directory)}/${projectName}` : projectName;
14
+
15
+ generateFiles(tree, path.join(__dirname, 'files'), projectRoot, options);
16
+ updateJson(tree, `${projectRoot}/package.json`, (packageJson) => {
17
+ packageJson['name'] = projectName;
18
+ return packageJson;
19
+ });
20
+
21
+ await formatFiles(tree);
22
+ }
23
+
24
+ export default addCorePackageGenerator;
@@ -0,0 +1,4 @@
1
+ export interface AddCorePackageGeneratorSchema {
2
+ name: string;
3
+ directory: string;
4
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "$schema": "https://json-schema.org/schema",
3
+ "$id": "AddCorePackage",
4
+ "title": "",
5
+ "type": "object",
6
+ "properties": {
7
+ "name": {
8
+ "type": "string",
9
+ "description": "",
10
+ "x-prompt": "What name would you like to use?"
11
+ },
12
+ "directory": {
13
+ "type": "string",
14
+ "description": "",
15
+ "x-prompt": "What directory would you like to create in?"
16
+ }
17
+ },
18
+ "required": ["name", "directory"]
19
+ }
@@ -1,4 +1,4 @@
1
- import React, { useState, startTransition, StrictMode } from 'react';
1
+ import React, { useState, startTransition, StrictMode, useMemo, createContext, useContext } from 'react';
2
2
  import 'reflect-metadata';
3
3
  import { RemixBrowser } from '@remix-run/react';
4
4
  import { hydrateRoot } from 'react-dom/client';
@@ -27,7 +27,8 @@ import Backend from 'i18next-http-backend';
27
27
  import { getInitialNamespaces } from 'remix-i18next/client';
28
28
  import config from '@app/cde-webconfig.json';
29
29
  // @ts-ignore
30
- import { ClientStyleContext } from '@app/frontend-stack-react/entries/chakraui/context.js';
30
+ // import { ClientStyleContext } from '@app/frontend-stack-react/entries/chakraui/context.js';
31
+ import { ClientStyleContext } from './context';
31
32
 
32
33
  const { apolloClient: client, container, serviceFunc } = createClientContainer();
33
34
  const { store } = createReduxStore(client, serviceFunc(), container);
@@ -40,16 +41,21 @@ interface ClientCacheProviderProps {
40
41
  children: React.ReactNode;
41
42
  }
42
43
 
44
+ export function useClientStyleContext() {
45
+ return useContext(ClientStyleContext);
46
+ }
47
+
43
48
  function ClientCacheProvider({ children }: ClientCacheProviderProps) {
44
- const [cache, setCache] = useState(defaultCache);
49
+ const [count, setCount] = useState(0);
50
+ const defaultCache = useMemo(() => createEmotionCache(), [count]);
45
51
 
46
- function reset() {
47
- setCache(createEmotionCache());
48
- }
52
+ const reset = () => {
53
+ setCount((prev) => prev + 1);
54
+ };
49
55
 
50
56
  return (
51
57
  <ClientStyleContext.Provider value={{ reset }}>
52
- <CacheProvider value={cache}>{children}</CacheProvider>
58
+ <CacheProvider value={defaultCache}>{children}</CacheProvider>
53
59
  </ClientStyleContext.Provider>
54
60
  );
55
61
  }
@@ -75,23 +81,23 @@ async function hydrate() {
75
81
  }
76
82
  hydrateRoot(
77
83
  document.getElementById('root')!,
78
- <StrictMode>
79
- <I18nextProvider i18n={i18next}>
80
- <ClientCacheProvider>
81
- <ApolloProvider client={client}>
82
- <ReduxProvider store={store}>
83
- <SlotFillProvider>
84
- <InversifyProvider container={container} modules={clientModules}>
85
- <PersistGate loading={null} persistor={persistor}>
86
- {() => <RemixBrowser />}
87
- </PersistGate>
88
- </InversifyProvider>
89
- </SlotFillProvider>
90
- </ReduxProvider>
91
- </ApolloProvider>
92
- </ClientCacheProvider>
93
- </I18nextProvider>
94
- </StrictMode>,
84
+ // <StrictMode>
85
+ <I18nextProvider i18n={i18next}>
86
+ <ClientCacheProvider>
87
+ <ApolloProvider client={client}>
88
+ <ReduxProvider store={store}>
89
+ <SlotFillProvider>
90
+ <InversifyProvider container={container} modules={clientModules}>
91
+ <PersistGate loading={null} persistor={persistor}>
92
+ {() => <RemixBrowser />}
93
+ </PersistGate>
94
+ </InversifyProvider>
95
+ </SlotFillProvider>
96
+ </ReduxProvider>
97
+ </ApolloProvider>
98
+ </ClientCacheProvider>
99
+ </I18nextProvider>,
100
+ // </StrictMode>,
95
101
  );
96
102
  // });
97
103
  }
@@ -36,8 +36,10 @@ import config from '@app/cde-webconfig.json';
36
36
 
37
37
  import { Head } from './root';
38
38
  import type { IAppLoadContext } from '@common-stack/client-core';
39
- import { ServerStyleContext } from '@app/frontend-stack-react/entries/chakraui/context.js';
39
+ // import { ServerStyleContext } from '@app/frontend-stack-react/entries/chakraui/context.js';
40
+ import { ServerStyleContext } from './context';
40
41
  import { i18nextInstance as i18next } from '@app/frontend-stack-react/i18n-localization/i18next.server.js';
42
+
41
43
  const { extractCriticalToChunks } = createEmotionServer(defaultCache);
42
44
 
43
45
  const ABORT_DELAY = 5000;
@@ -124,12 +126,7 @@ async function handleBrowserRequest(
124
126
  // And here we detect what namespaces the routes about to render want to use
125
127
  const ns = i18next.getRouteNamespaces(remixContext);
126
128
  const slotFillContext = { fills: {} };
127
- const {
128
- modules: clientModules,
129
- container,
130
- apolloClient: client,
131
- store,
132
- }: IAppLoadContext = loadContext;
129
+ const { modules: clientModules, container, apolloClient: client, store }: IAppLoadContext = loadContext;
133
130
 
134
131
  // First, we create a new instance of i18next so every request will have a
135
132
  // completely unique instance and not share any state.
@@ -145,7 +142,7 @@ async function handleBrowserRequest(
145
142
  lng, // The locale we detected above
146
143
  ns, // The namespaces the routes about to render want to use
147
144
  backend: {
148
- loadPath: resolve(config.i18n.backend.loadServerPath),
145
+ loadPath: config.i18n.backend.loadServerPath,
149
146
  },
150
147
  });
151
148
  }
@@ -79,8 +79,8 @@ export function shouldRevalidate(params: any) {
79
79
  }
80
80
 
81
81
  export default function App() {
82
- let { locale } = useLoaderData();
83
-
82
+ // const { locale } = useLoaderData();
83
+ const locale = 'en';
84
84
  useChangeLanguage(locale);
85
85
 
86
86
  React.useEffect(() => {
@@ -94,4 +94,4 @@ export default function App() {
94
94
  );
95
95
  }
96
96
 
97
- export { ErrorBoundary };
97
+ export { ErrorBoundary };
@@ -0,0 +1,90 @@
1
+ /**
2
+ * By default, Remix will handle hydrating your app on the client for you.
3
+ * You are free to delete this file if you'd like to, but if you ever want it revealed again, you can run `npx remix reveal` ✨
4
+ * For more information, see https://remix.run/file-conventions/entry.client
5
+ */
6
+ import * as React from 'react';
7
+ import 'reflect-metadata';
8
+ import { RemixBrowser } from '@remix-run/react';
9
+ import { startTransition, StrictMode } from 'react';
10
+ import { hydrateRoot } from 'react-dom/client';
11
+ import { ApolloProvider } from '@apollo/client/index.js';
12
+ import { SlotFillProvider, removeUniversalPortals } from '@common-stack/components-pro';
13
+ import { InversifyProvider } from '@common-stack/client-react';
14
+ import { Provider as ReduxProvider } from 'react-redux';
15
+ import { PersistGate } from 'redux-persist/integration/react';
16
+ import { persistStore } from 'redux-persist';
17
+ import i18next from 'i18next';
18
+ import { I18nextProvider, initReactI18next } from 'react-i18next';
19
+ import LanguageDetector from 'i18next-browser-languagedetector';
20
+ import Backend from 'i18next-http-backend';
21
+ // @ts-ignore
22
+ import { getInitialNamespaces } from 'remix-i18next/client';
23
+ // @ts-ignore
24
+ import { createReduxStore } from '@app/frontend-stack-react/config/redux-config.js';
25
+ // @ts-ignore
26
+ import { createClientContainer } from '@app/frontend-stack-react/config/client.service';
27
+ // @ts-ignore
28
+ import clientModules from '@app/frontend-stack-react/modules.js';
29
+ // @ts-ignore
30
+ import config from '@app/cde-webconfig.json';
31
+
32
+ const { apolloClient: client, container, serviceFunc } = createClientContainer();
33
+ const { store } = createReduxStore(client, serviceFunc(), container);
34
+ const persistor = persistStore(store);
35
+
36
+ (window as any).__remixStore = store;
37
+ removeUniversalPortals((window as any).__SLOT_FILLS__ || []);
38
+
39
+ async function hydrate() {
40
+ if (!i18next.isInitialized && config.i18n.enabled) {
41
+ await i18next
42
+ .use(initReactI18next)
43
+ .use(LanguageDetector)
44
+ .use(Backend)
45
+ .init({
46
+ fallbackLng: config.i18n.fallbackLng,
47
+ defaultNS: config.i18n.defaultNS,
48
+ react: config.i18n.react,
49
+ supportedLngs: config.i18n.supportedLngs,
50
+ backend: config.i18n.backend,
51
+ ns: getInitialNamespaces(),
52
+ detection: {
53
+ order: ['htmlTag'],
54
+ caches: [],
55
+ },
56
+ });
57
+ }
58
+ startTransition(() => {
59
+ hydrateRoot(
60
+ document,
61
+ (
62
+ <I18nextProvider i18n={i18next}>
63
+ <StrictMode>
64
+ <ReduxProvider store={store}>
65
+ <SlotFillProvider>
66
+ <InversifyProvider container={container} modules={clientModules}>
67
+ <PersistGate loading={null} persistor={persistor}>
68
+ {() => (
69
+ <ApolloProvider client={client}>
70
+ <RemixBrowser />
71
+ </ApolloProvider>
72
+ )}
73
+ </PersistGate>
74
+ </InversifyProvider>
75
+ </SlotFillProvider>
76
+ </ReduxProvider>
77
+ </StrictMode>
78
+ </I18nextProvider>
79
+ ) as any,
80
+ );
81
+ });
82
+ }
83
+
84
+ if (window.requestIdleCallback) {
85
+ window.requestIdleCallback(hydrate);
86
+ } else {
87
+ // Safari doesn't support requestIdleCallback
88
+ // https://caniuse.com/requestidlecallback
89
+ window.setTimeout(hydrate, 1);
90
+ }
@@ -0,0 +1,238 @@
1
+ /**
2
+ * By default, Remix will handle generating the HTTP Response for you.
3
+ * You are free to delete this file if you'd like to, but if you ever want it revealed again, you can run `npx remix reveal` ✨
4
+ * For more information, see https://remix.run/file-conventions/entry.server
5
+ */
6
+ import * as React from 'react';
7
+ (global as any).__CLIENT__ = false;
8
+ (global as any).__SERVER__ = true;
9
+ import { PassThrough, Transform } from 'node:stream';
10
+ import type { EntryContext } from '@remix-run/node';
11
+ import { createReadableStreamFromReadable } from '@remix-run/node';
12
+ import { RemixServer } from '@remix-run/react';
13
+ import { isbot } from 'isbot';
14
+ import { ApolloProvider } from '@apollo/client/index.js';
15
+ import { SlotFillProvider } from '@common-stack/components-pro';
16
+ import { InversifyProvider } from '@common-stack/client-react';
17
+ import { renderToPipeableStream } from 'react-dom/server';
18
+ import { Provider as ReduxProvider } from 'react-redux';
19
+ import { LOCATION_CHANGE } from '@common-stack/remix-router-redux';
20
+ import serialize from 'serialize-javascript';
21
+ import { createInstance } from 'i18next';
22
+ import { I18nextProvider, initReactI18next } from 'react-i18next';
23
+ import Backend from 'i18next-fs-backend';
24
+ import { resolve } from 'node:path';
25
+ // @ts-ignore
26
+ import { i18nextInstance as i18next } from '@app/frontend-stack-react/i18n-localization/i18next.server.js';
27
+ import config from '@app/cde-webconfig.json';
28
+ // @ts-ignore
29
+ import type { IAppLoadContext } from '@common-stack/client-core';
30
+
31
+ const ABORT_DELAY = 5_000;
32
+
33
+ class ConstantsTransform extends Transform {
34
+ _fills: string[];
35
+ _apolloState: any;
36
+ _reduxState: any;
37
+ _styleSheet: string;
38
+
39
+ constructor(fills: string[], apolloState: any, reduxState: any, styleSheet: any) {
40
+ super();
41
+ this._fills = fills;
42
+ this._apolloState = apolloState;
43
+ this._reduxState = reduxState;
44
+ this._styleSheet = styleSheet;
45
+ }
46
+
47
+ _transform(chunk, encoding, callback) {
48
+ let transformedChunk = chunk.toString();
49
+
50
+ if (transformedChunk.includes('[__APOLLO_STATE__]')) {
51
+ transformedChunk = transformedChunk.replace(
52
+ '[__APOLLO_STATE__]',
53
+ serialize(this._apolloState, { isJSON: true }),
54
+ );
55
+ }
56
+ if (transformedChunk.includes('[__PRELOADED_STATE__]')) {
57
+ transformedChunk = transformedChunk.replace(
58
+ '[__PRELOADED_STATE__]',
59
+ serialize(this._reduxState, { isJSON: true }),
60
+ );
61
+ }
62
+ if (transformedChunk.includes('[__SLOT_FILLS__]')) {
63
+ transformedChunk = transformedChunk.replace('[__SLOT_FILLS__]', serialize(this._fills, { isJSON: true }));
64
+ }
65
+ if (transformedChunk.includes('[__STYLESHEET__]')) {
66
+ transformedChunk = transformedChunk.replace('[__STYLESHEET__]', this._styleSheet);
67
+ }
68
+
69
+ callback(null, transformedChunk);
70
+ }
71
+ }
72
+
73
+ export default async function handleRequest(
74
+ request: Request,
75
+ responseStatusCode: number,
76
+ responseHeaders: Headers,
77
+ remixContext: EntryContext,
78
+ // This is ignored so we can keep it in the template for visibility. Feel
79
+ // free to delete this parameter in your app if you're not using it!
80
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
81
+ loadContext: IAppLoadContext,
82
+ ) {
83
+ const instance = createInstance();
84
+ const lng = await i18next.getLocale(request);
85
+ const ns = i18next.getRouteNamespaces(remixContext);
86
+
87
+ // First, we create a new instance of i18next so every request will have a
88
+ // completely unique instance and not share any state.
89
+ if (config.i18n.enabled) {
90
+ await instance
91
+ .use(initReactI18next) // Tell our instance to use react-i18next
92
+ .use(Backend) // Setup our backend.init({
93
+ .init({
94
+ fallbackLng: config.i18n.fallbackLng,
95
+ defaultNS: config.i18n.defaultNS,
96
+ react: config.i18n.react,
97
+ supportedLngs: config.i18n.supportedLngs,
98
+ lng, // The locale we detected above
99
+ ns, // The namespaces the routes about to render want to use
100
+ backend: {
101
+ loadPath: resolve(config.i18n.backend.loadServerPath),
102
+ },
103
+ });
104
+ }
105
+
106
+ return isbot(request.headers.get('user-agent') || '')
107
+ ? handleBotRequest(request, responseStatusCode, responseHeaders, remixContext, loadContext, instance)
108
+ : handleBrowserRequest(request, responseStatusCode, responseHeaders, remixContext, loadContext, instance);
109
+ }
110
+
111
+ function handleBotRequest(
112
+ request: Request,
113
+ responseStatusCode: number,
114
+ responseHeaders: Headers,
115
+ remixContext: EntryContext,
116
+ loadContext: IAppLoadContext,
117
+ i18nInstance: i18next,
118
+ ) {
119
+ return new Promise((resolve, reject) => {
120
+ let shellRendered = false;
121
+ const { pipe, abort } = renderToPipeableStream(
122
+ <I18nextProvider i18n={i18nInstance}>
123
+ <RemixServer context={remixContext} url={request.url} abortDelay={ABORT_DELAY} />
124
+ </I18nextProvider>,
125
+ {
126
+ onAllReady() {
127
+ shellRendered = true;
128
+ const body = new PassThrough();
129
+ const stream = createReadableStreamFromReadable(body);
130
+
131
+ responseHeaders.set('Content-Type', 'text/html');
132
+
133
+ resolve(
134
+ new Response(stream, {
135
+ headers: responseHeaders,
136
+ status: responseStatusCode,
137
+ }),
138
+ );
139
+
140
+ pipe(body);
141
+ },
142
+ onShellError(error: unknown) {
143
+ reject(error);
144
+ },
145
+ onError(error: unknown) {
146
+ responseStatusCode = 500;
147
+ // Log streaming rendering errors from inside the shell. Don't log
148
+ // errors encountered during initial shell rendering since they'll
149
+ // reject and get logged in handleDocumentRequest.
150
+ if (shellRendered) {
151
+ console.error(error);
152
+ }
153
+ },
154
+ },
155
+ );
156
+
157
+ setTimeout(abort, ABORT_DELAY);
158
+ });
159
+ }
160
+
161
+ function handleBrowserRequest(
162
+ request: Request,
163
+ responseStatusCode: number,
164
+ responseHeaders: Headers,
165
+ remixContext: EntryContext,
166
+ loadContext: IAppLoadContext,
167
+ i18nInstance: i18next,
168
+ ) {
169
+ return new Promise((resolve, reject) => {
170
+ let shellRendered = false;
171
+ const slotFillContext = { fills: {} };
172
+ const { modules: clientModules, container, apolloClient: client, store } = loadContext;
173
+
174
+ const { pathname, search, hash } = new URL(request.url);
175
+ store.dispatch({
176
+ type: LOCATION_CHANGE,
177
+ payload: { location: { pathname, search, hash }, action: 'POP' },
178
+ });
179
+
180
+ const { pipe, abort } = renderToPipeableStream(
181
+ (
182
+ <I18nextProvider i18n={i18nInstance}>
183
+ <ReduxProvider store={store}>
184
+ <SlotFillProvider context={slotFillContext}>
185
+ <InversifyProvider container={container} modules={clientModules as any}>
186
+ <ApolloProvider client={client}>
187
+ <RemixServer
188
+ context={remixContext}
189
+ url={request.url}
190
+ abortDelay={ABORT_DELAY}
191
+ />
192
+ </ApolloProvider>
193
+ </InversifyProvider>
194
+ </SlotFillProvider>
195
+ </ReduxProvider>
196
+ </I18nextProvider>
197
+ ) as any,
198
+ {
199
+ onShellReady() {
200
+ shellRendered = true;
201
+ const body = new PassThrough();
202
+ const stream = createReadableStreamFromReadable(body);
203
+ const apolloState = { ...client.extract() };
204
+ const reduxState = { ...store.getState() };
205
+ const fills = Object.keys(slotFillContext.fills);
206
+
207
+ const transform = new ConstantsTransform(fills, apolloState, reduxState, []);
208
+
209
+ responseHeaders.set('Content-Type', 'text/html');
210
+
211
+ resolve(
212
+ new Response(stream, {
213
+ headers: responseHeaders,
214
+ status: responseStatusCode,
215
+ }),
216
+ );
217
+
218
+ pipe(transform).pipe(body);
219
+ },
220
+ onShellError(error: unknown) {
221
+ reject(error);
222
+ },
223
+ onError(error: unknown) {
224
+ responseStatusCode = 500;
225
+ // Log streaming rendering errors from inside the shell. Don't log
226
+ // errors encountered during initial shell rendering since they'll
227
+ // reject and get logged in handleDocumentRequest.
228
+ if (shellRendered) {
229
+ console.error(error);
230
+ }
231
+ reject(error);
232
+ },
233
+ },
234
+ );
235
+
236
+ setTimeout(abort, ABORT_DELAY);
237
+ });
238
+ }