@common-stack/generate-plugin 5.0.6-alpha.5 → 5.0.6-alpha.8

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 (140) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +280 -10
  3. package/cde-config.json +86 -0
  4. package/lib/constants/index.cjs +2 -1
  5. package/lib/constants/index.cjs.map +1 -1
  6. package/lib/constants/index.d.ts +1 -0
  7. package/lib/constants/index.mjs +2 -1
  8. package/lib/constants/index.mjs.map +1 -1
  9. package/lib/generators/add-backend/files/CHANGELOG.md +0 -0
  10. package/lib/generators/add-backend/files/Dockerfile +1 -1
  11. package/lib/generators/add-backend/files/__tests__/test.ts.template +3 -2
  12. package/lib/generators/add-backend/files/package.json +2 -48
  13. package/lib/generators/add-backend/generator.cjs +21 -17
  14. package/lib/generators/add-backend/generator.cjs.map +1 -1
  15. package/lib/generators/add-backend/generator.d.ts +1 -0
  16. package/lib/generators/add-backend/generator.mjs +21 -17
  17. package/lib/generators/add-backend/generator.mjs.map +1 -1
  18. package/lib/generators/add-browser-package/files/package.json +1 -1
  19. package/lib/generators/add-browser-package/generator.cjs +14 -16
  20. package/lib/generators/add-browser-package/generator.cjs.map +1 -1
  21. package/lib/generators/add-browser-package/generator.d.ts +1 -0
  22. package/lib/generators/add-browser-package/generator.mjs +14 -16
  23. package/lib/generators/add-browser-package/generator.mjs.map +1 -1
  24. package/lib/generators/add-client-package/files/package.json +2 -3
  25. package/lib/generators/add-client-package/generator.cjs +14 -16
  26. package/lib/generators/add-client-package/generator.cjs.map +1 -1
  27. package/lib/generators/add-client-package/generator.d.ts +1 -0
  28. package/lib/generators/add-client-package/generator.mjs +14 -16
  29. package/lib/generators/add-client-package/generator.mjs.map +1 -1
  30. package/lib/generators/add-core-package/files/package.json +2 -3
  31. package/lib/generators/add-core-package/generator.cjs +14 -16
  32. package/lib/generators/add-core-package/generator.cjs.map +1 -1
  33. package/lib/generators/add-core-package/generator.d.ts +1 -0
  34. package/lib/generators/add-core-package/generator.mjs +14 -16
  35. package/lib/generators/add-core-package/generator.mjs.map +1 -1
  36. package/lib/generators/add-frontend/frameworks/chakraui/entry.client.tsx.template +30 -24
  37. package/lib/generators/add-frontend/frameworks/chakraui/entry.server.tsx.template +5 -8
  38. package/lib/generators/add-frontend/frameworks/chakraui/root.tsx.template +3 -3
  39. package/lib/generators/add-frontend/frameworks/tailwindui/entry.client.tsx.template +90 -0
  40. package/lib/generators/add-frontend/frameworks/tailwindui/entry.server.tsx.template +238 -0
  41. package/lib/generators/add-frontend/frameworks/tailwindui/root.tsx.template +117 -0
  42. package/lib/generators/add-frontend/frameworks/tailwindui/tailwind.css +3 -0
  43. package/lib/generators/add-frontend/generator.cjs +60 -42
  44. package/lib/generators/add-frontend/generator.cjs.map +1 -1
  45. package/lib/generators/add-frontend/generator.d.ts +1 -0
  46. package/lib/generators/add-frontend/generator.mjs +60 -42
  47. package/lib/generators/add-frontend/generator.mjs.map +1 -1
  48. package/lib/generators/add-frontend/schema.json +1 -1
  49. package/lib/generators/add-frontend/templates/package.json +18 -77
  50. package/lib/generators/add-frontend/templates/postcss.config.js +6 -0
  51. package/lib/generators/add-frontend/templates/tailwind.config.ts.template +12 -0
  52. package/lib/generators/add-fullstack/files/Jenkinsfile +3 -6
  53. package/lib/generators/add-fullstack/files/jest-mongodb-config.js +3 -2
  54. package/lib/generators/add-fullstack/files/jest.config.base.js +43 -4
  55. package/lib/generators/add-fullstack/files/jest.config.base.mjs +99 -0
  56. package/lib/generators/add-fullstack/files/jest.config.mongodb.mjs +3 -0
  57. package/lib/generators/add-fullstack/files/lint-staged.config.js +4 -1
  58. package/lib/generators/add-fullstack/files/nx.json +18 -13
  59. package/lib/generators/add-fullstack/files/package.json +12 -24
  60. package/lib/generators/add-fullstack/files/tools/cli/helpers/util.js +1 -1
  61. package/lib/generators/add-fullstack/files/tools/deploy-cli/updateLernaVersion.js +1 -1
  62. package/lib/generators/add-fullstack/files/tools/deploy-cli/updateYamlSettings.js +14 -15
  63. package/lib/generators/add-fullstack/files/tools/prettier.config.js +8 -0
  64. package/lib/generators/add-fullstack/files/tools/rollup/rollupPluginGenerateJson.mjs +48 -0
  65. package/lib/generators/add-fullstack/files/tools/rollup/rollupPluginModifyLibFiles.mjs +410 -0
  66. package/lib/generators/add-fullstack/files/tools/runLint.mjs +15 -0
  67. package/lib/generators/add-fullstack/files/tools/sortPackageJson.mjs +8 -2
  68. package/lib/generators/add-fullstack/files/tools/update-dependencies.mjs +95 -0
  69. package/lib/generators/add-fullstack/files/tools/update-dependency-link.mjs +138 -0
  70. package/lib/generators/add-fullstack/files/tools/update-dependency-version.js +104 -89
  71. package/lib/generators/add-fullstack/files/tools/updateUtils.mjs +77 -0
  72. package/lib/generators/add-fullstack/generator.cjs +71 -13
  73. package/lib/generators/add-fullstack/generator.cjs.map +1 -1
  74. package/lib/generators/add-fullstack/generator.mjs +71 -13
  75. package/lib/generators/add-fullstack/generator.mjs.map +1 -1
  76. package/lib/generators/add-fullstack/schema.json +9 -0
  77. package/lib/generators/add-fullstack/updates/index.d.ts +2 -0
  78. package/lib/generators/add-fullstack/updates/jenkinsfileUpdate.cjs +36 -0
  79. package/lib/generators/add-fullstack/updates/jenkinsfileUpdate.cjs.map +1 -0
  80. package/lib/generators/add-fullstack/updates/jenkinsfileUpdate.d.ts +1 -0
  81. package/lib/generators/add-fullstack/updates/jenkinsfileUpdate.mjs +36 -0
  82. package/lib/generators/add-fullstack/updates/jenkinsfileUpdate.mjs.map +1 -0
  83. package/lib/generators/add-fullstack/updates/packageJsonUpdate.cjs +8 -0
  84. package/lib/generators/add-fullstack/updates/packageJsonUpdate.cjs.map +1 -0
  85. package/lib/generators/add-fullstack/updates/packageJsonUpdate.d.ts +2 -0
  86. package/lib/generators/add-fullstack/updates/packageJsonUpdate.mjs +8 -0
  87. package/lib/generators/add-fullstack/updates/packageJsonUpdate.mjs.map +1 -0
  88. package/lib/generators/add-moleculer/files/package.json +3 -3
  89. package/lib/generators/add-moleculer/generator.cjs +14 -16
  90. package/lib/generators/add-moleculer/generator.cjs.map +1 -1
  91. package/lib/generators/add-moleculer/generator.d.ts +1 -0
  92. package/lib/generators/add-moleculer/generator.mjs +14 -16
  93. package/lib/generators/add-moleculer/generator.mjs.map +1 -1
  94. package/lib/generators/add-server-package/files/package.json +2 -2
  95. package/lib/generators/add-server-package/generator.cjs +14 -16
  96. package/lib/generators/add-server-package/generator.cjs.map +1 -1
  97. package/lib/generators/add-server-package/generator.d.ts +1 -0
  98. package/lib/generators/add-server-package/generator.mjs +14 -16
  99. package/lib/generators/add-server-package/generator.mjs.map +1 -1
  100. package/lib/index.cjs +1 -1
  101. package/lib/index.mjs +1 -1
  102. package/package.json +3 -2
  103. package/src/constants/index.ts +2 -1
  104. package/src/generators/add-backend/generator.ts +8 -4
  105. package/src/generators/add-browser-package/generator.ts +7 -6
  106. package/src/generators/add-client-package/generator.ts +7 -6
  107. package/src/generators/add-core-package/generator.ts +7 -6
  108. package/src/generators/add-frontend/frameworks/tailwindui/entry.client.tsx.template +90 -0
  109. package/src/generators/add-frontend/frameworks/tailwindui/entry.server.tsx.template +238 -0
  110. package/src/generators/add-frontend/frameworks/tailwindui/root.tsx.template +117 -0
  111. package/src/generators/add-frontend/frameworks/tailwindui/tailwind.css +3 -0
  112. package/src/generators/add-frontend/generator.ts +24 -2
  113. package/src/generators/add-frontend/schema.json +1 -1
  114. package/src/generators/add-fullstack/files/jest-mongodb-config.js +3 -2
  115. package/src/generators/add-fullstack/files/jest.config copy.js +27 -0
  116. package/src/generators/add-fullstack/files/jest.config.base.js +43 -4
  117. package/src/generators/add-fullstack/files/jest.config.base.mjs +99 -0
  118. package/src/generators/add-fullstack/files/jest.config.mongodb.mjs +3 -0
  119. package/src/generators/add-fullstack/files/lint-staged.config.js +4 -1
  120. package/src/generators/add-fullstack/files/nx.json +18 -13
  121. package/src/generators/add-fullstack/files/tools/cli/helpers/util.js +1 -1
  122. package/src/generators/add-fullstack/files/tools/deploy-cli/updateLernaVersion.js +1 -1
  123. package/src/generators/add-fullstack/files/tools/html-plugin-template.ejs +28 -0
  124. package/src/generators/add-fullstack/files/tools/prettier.config.js +8 -0
  125. package/src/generators/add-fullstack/files/tools/rollup/rollupPluginGenerateJson.mjs +48 -0
  126. package/src/generators/add-fullstack/files/tools/rollup/rollupPluginModifyLibFiles.mjs +410 -0
  127. package/src/generators/add-fullstack/files/tools/runLint.mjs +15 -0
  128. package/src/generators/add-fullstack/files/tools/sortPackageJson.mjs +0 -1
  129. package/src/generators/add-fullstack/files/tools/update-dependencies.mjs +95 -0
  130. package/src/generators/add-fullstack/files/tools/update-dependency-link.mjs +138 -0
  131. package/src/generators/add-fullstack/files/tools/update-dependency-version.js +104 -89
  132. package/src/generators/add-fullstack/files/tools/updateUtils.mjs +77 -0
  133. package/src/generators/add-fullstack/generator.ts +83 -1
  134. package/src/generators/add-fullstack/schema.d.ts +1 -0
  135. package/src/generators/add-fullstack/schema.json +4 -0
  136. package/src/generators/add-moleculer/files/package.json +1 -1
  137. package/src/generators/add-moleculer/generator.ts +7 -6
  138. package/src/generators/add-server-package/generator.ts +7 -6
  139. package/lib/generators/add-fullstack/files/tools/update-dependency-link.js +0 -107
  140. package/src/generators/add-fullstack/files/tools/update-dependency-link.js +0 -107
@@ -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
+ }
@@ -0,0 +1,117 @@
1
+ import 'reflect-metadata';
2
+ import * as React from 'react';
3
+ import { Links, Meta, Outlet, Scripts, ScrollRestoration, useLoaderData, useRouteError, json } from '@remix-run/react';
4
+ import type { LinksFunction } from "@remix-run/node";
5
+ // @ts-ignore
6
+ import publicEnv from '@src/config/public-config';
7
+ import { PluginArea } from '@common-stack/client-react';
8
+ import { subscribeReduxRouter } from '@common-stack/remix-router-redux';
9
+ // @ts-ignore
10
+ import clientModules, { plugins } from '@app/frontend-stack-react/modules.js';
11
+ // @ts-ignore
12
+ import { useChangeLanguage } from 'remix-i18next/react';
13
+ import { useTranslation } from 'react-i18next';
14
+ // @ts-ignore
15
+ import { i18nextInstance as i18next } from '@app/frontend-stack-react/i18n-localization/i18next.server.js';
16
+ import stylesheet from "./tailwind.css?url";
17
+
18
+ export const links: LinksFunction = () => [
19
+ { rel: "stylesheet", href: stylesheet },
20
+ ];
21
+
22
+ export const loader = async ({ request }) => {
23
+ const locale = await i18next.getLocale(request);
24
+ return json({
25
+ __ENV__: publicEnv,
26
+ locale,
27
+ });
28
+ };
29
+
30
+ export const handle = {
31
+ i18n: 'common',
32
+ };
33
+
34
+ export function shouldRevalidate(params: any) {
35
+ return params.defaultShouldRevalidate && params.currentUrl.pathname !== params.nextUrl.pathname;
36
+ }
37
+
38
+ export function Layout({ children }: { children: React.ReactNode }) {
39
+ const data = useLoaderData<{ locale: any }>();
40
+ const locale = data?.locale;
41
+
42
+ const { i18n } = useTranslation();
43
+
44
+ useChangeLanguage(locale);
45
+
46
+ React.useEffect(() => {
47
+ subscribeReduxRouter({ store: (window as any).__remixStore, router: window.__remixRouter } as any);
48
+ }, []);
49
+
50
+ const getConstants = () => {
51
+ if (typeof window === 'undefined') {
52
+ return (
53
+ <>
54
+ <script
55
+ dangerouslySetInnerHTML={{
56
+ __html: `window.__ENV__ = ${JSON.stringify((data as any)?.__ENV__)}`,
57
+ }}
58
+ />
59
+ <script
60
+ src="https://cdnjs.cloudflare.com/ajax/libs/reflect-metadata/0.1.13/Reflect.min.js"
61
+ integrity="sha512-jvbPH2TH5BSZumEfOJZn9IV+5bSwwN+qG4dvthYe3KCGC3/9HmxZ4phADbt9Pfcp+XSyyfc2vGZ/RMsSUZ9tbQ=="
62
+ crossOrigin="anonymous"
63
+ referrerPolicy="no-referrer"
64
+ ></script>
65
+ <script>window.__APOLLO_STATE__=[__APOLLO_STATE__]</script>
66
+ <script>window.__PRELOADED_STATE__=[__PRELOADED_STATE__]</script>
67
+ <script>window.__SLOT_FILLS__=[__SLOT_FILLS__]</script>
68
+ <script
69
+ dangerouslySetInnerHTML={{
70
+ __html: `if (global === undefined) { var global = window; }`,
71
+ }}
72
+ />
73
+ </>
74
+ );
75
+ }
76
+ return null;
77
+ };
78
+
79
+ return (
80
+ <html lang={locale} dir={i18n.dir()}>
81
+ <head>
82
+ <meta charSet="utf-8" />
83
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
84
+ <Meta />
85
+ <Links />
86
+ {typeof window === 'undefined' ? `[__STYLESHEET__]` : ''}
87
+ </head>
88
+ <body>
89
+ <PluginArea />
90
+ {clientModules.getWrappedRoot(children)}
91
+ <ScrollRestoration />
92
+ <Scripts />
93
+ {getConstants()}
94
+ </body>
95
+ </html>
96
+ );
97
+ }
98
+
99
+ const TestComponent = () => {
100
+ return (
101
+ <div className="min-h-screen flex items-center justify-center bg-gray-100">
102
+ <div className="p-6 max-w-sm mx-auto bg-white rounded-xl shadow-md space-y-4">
103
+ <h1 className="text-2xl font-bold text-center">Hello, Tailwind CSS!</h1>
104
+ <p className="text-gray-500 text-center">This is a test page using React and Tailwind CSS.</p>
105
+ </div>
106
+ </div>
107
+ );
108
+ }
109
+
110
+ export default function App() {
111
+ return (
112
+ // <Outlet />
113
+ <TestComponent />
114
+ );
115
+ }
116
+
117
+ // export { ErrorBoundary };
@@ -0,0 +1,3 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
@@ -1,14 +1,22 @@
1
1
  import { addProjectConfiguration, formatFiles, generateFiles, Tree, updateJson } from '@nx/devkit';
2
2
  import * as path from 'path';
3
+ import * as fs from 'node:fs';
4
+ import { deepMerge } from '@common-stack/rollup-vite-utils/lib/utils/setupConfig.cjs';
3
5
  import { AddFrontendGeneratorSchema } from './schema';
4
6
  import { isValid, getValid } from '../../utils';
5
- import { FRAMEWORK_ANTUI, FRAMEWORK_CHAKRAUI } from '../../constants';
7
+ import { FRAMEWORK_ANTUI, FRAMEWORK_CHAKRAUI, FRAMEWORK_TAILWINDUI } from '../../constants';
6
8
 
7
9
  const DEFAULT_FRAMEWORK = FRAMEWORK_ANTUI;
8
10
 
9
11
  export async function addFrontendGenerator(tree: Tree, options: AddFrontendGeneratorSchema) {
10
- // const basePath = process.cwd();
11
12
  const projectName = isValid(options.ns) ? `frontend-${getValid(options.ns)}-server` : 'frontend-server';
13
+ const configs: any = {...options, name: projectName};
14
+
15
+ return await generateFrontend(tree, configs);
16
+ }
17
+
18
+ export const generateFrontend = async (tree: Tree, options: any) => {
19
+ const projectName = getValid(options.name) ?? 'frontend-server';
12
20
  const projectRoot = isValid(options.directory) ? `${getValid(options.directory)}/${projectName}` : projectName;
13
21
  const projectSrc = `${projectRoot}/src`;
14
22
 
@@ -32,10 +40,19 @@ export async function addFrontendGenerator(tree: Tree, options: AddFrontendGener
32
40
  packageJson['dependencies']["@admin-layout/ant-design-pro"] = "latest";
33
41
  packageJson['dependencies']["@admin-layout/ant-ui"] = "latest";
34
42
  packageJson['dependencies']["@adminide-stack/user-auth0-browser-ant"] = "latest";
43
+ packageJson['dependencies']["@ant-design/pro-layout"] = "^7.6.1";
44
+ packageJson['dependencies']["@ant-design/static-style-extract"] = "^1.0.2";
45
+ packageJson['dependencies']["antd"] = "^5.14.0";
35
46
  } else if (framework === FRAMEWORK_CHAKRAUI) {
36
47
  packageJson['dependencies']["@admin-layout/chakra-design-pro"] = "latest";
37
48
  packageJson['dependencies']["@admin-layout/chakra-ui"] = "latest";
38
49
  packageJson['dependencies']["@adminide-stack/user-auth0-browser-chakra"] = "latest";
50
+ packageJson['dependencies']["@emotion/css"] = "^11.10.0";
51
+ packageJson['dependencies']["@emotion/styled"] = "^11.10.4";
52
+ } else if (framework === FRAMEWORK_TAILWINDUI) {
53
+ packageJson['devDependencies']["tailwindcss"] = "^3.4.10";
54
+ packageJson['devDependencies']["postcss"] = "^8.4.41";
55
+ packageJson['devDependencies']["autoprefixer"] = "^10.4.20";
39
56
  }
40
57
 
41
58
  return packageJson;
@@ -48,6 +65,11 @@ export async function addFrontendGenerator(tree: Tree, options: AddFrontendGener
48
65
  configJson['modules'].push("@admin-layout/chakra-design-pro");
49
66
  }
50
67
 
68
+ if (options['config.json']) {
69
+ const addtionalConfigs = options['config.json'];
70
+ configJson = deepMerge(configJson, addtionalConfigs);
71
+ }
72
+
51
73
  return configJson;
52
74
  });
53
75
 
@@ -17,7 +17,7 @@
17
17
  "framework": {
18
18
  "type": "string",
19
19
  "description": "",
20
- "x-prompt": "What UI framework would you like to use in [antui, chakraui]?"
20
+ "x-prompt": "What UI framework would you like to use in [antui, chakraui, tailwindui]?"
21
21
  }
22
22
  },
23
23
  "required": ["ns", "directory", "framework"]
@@ -1,10 +1,11 @@
1
1
  module.exports = {
2
2
  mongodbMemoryServerOptions: {
3
3
  instance: {
4
- dbName: 'jest'
4
+ dbName: 'jest',
5
+ storageEngine: 'wiredTiger',
5
6
  },
6
7
  binary: {
7
- version: '4.0.12', // Version of MongoDB
8
+ version: '4.0.27', // Version of MongoDB
8
9
  skipMD5: true
9
10
  },
10
11
  autoStart: false
@@ -0,0 +1,27 @@
1
+ const merge = require('merge')
2
+ const baseConfig = require('./jest.config.base');
3
+ const mongodbConfig = require('./jest.config.mongodb')
4
+ module.exports = merge.recursive(
5
+ baseConfig,
6
+ mongodbConfig,
7
+ {
8
+ globals: {
9
+
10
+ }
11
+ }, {
12
+ moduleDirectories: [
13
+ "node_modules",
14
+ "packages/adminide-core",
15
+ ],
16
+ }
17
+ // https://baltuta.eu/posts/typescript-lerna-monorepo-more-tools
18
+ // {
19
+ // roots: ['<rootDir>'],
20
+ // projects: [
21
+ // '<rootDir>/packages/ui',
22
+ // '<rootDir>/packages/api',
23
+ // '<rootDir>/packages/diceroll'
24
+ // ],
25
+ // }
26
+
27
+ );
@@ -2,6 +2,45 @@
2
2
  /* eslint-disable @typescript-eslint/no-var-requires */
3
3
  const { defaults } = require('jest-config');
4
4
 
5
+ const packagesToTransform = [
6
+ '@apollo/client',
7
+ '@common-stack/client-core',
8
+ '@common-stack/client-react',
9
+ '@common-stack/core',
10
+ '@admin-layout/client',
11
+ '@common-stack/components-pro',
12
+ '@common-stack/server-core',
13
+ '@common-stack/cache-api-server',
14
+ '@common-stack/remix-router-redux',
15
+ '@cdmbase/redux-auth-wrapper',
16
+ '@cdmbase/remix-redis-session',
17
+ '@cdm-logger/server',
18
+ '@cdm-logger/core',
19
+ '@cdm-logger/client',
20
+ '@files-stack/server-core',
21
+ '@vscode-alt/monaco-editor',
22
+ '@workbench-stack/core',
23
+ '@workbench-stack/platform-server',
24
+ 'abortable-rx',
25
+ 'lodash-es',
26
+ 'sort-keys',
27
+ 'is-plain-obj',
28
+ 'query-string',
29
+ 'decode-uri-component',
30
+ 'split-on-first',
31
+ 'filter-obj',
32
+ 'react-dnd-html5-backend',
33
+ 'react-sortable-tree',
34
+ 'react-dnd',
35
+ 'dnd-core',
36
+ ];
37
+
38
+ const generateTransformIgnorePattern = (packages) => {
39
+ const escapedPackages = packages.map((pkg) => pkg.replace(/\//g, '\\/'));
40
+ return `/node_modules/(?!(${escapedPackages.join('|')})/).+\\.js$`;
41
+ };
42
+ const transformIgnorePattern = generateTransformIgnorePattern(packagesToTransform);
43
+
5
44
  module.exports = {
6
45
  testEnvironment: 'node',
7
46
  setupFiles: [
@@ -10,11 +49,11 @@ module.exports = {
10
49
  ],
11
50
  preset: 'ts-jest',
12
51
  testMatch: null,
13
- testRegex: '.*test*\\.(ts|tsx|js)$',
14
- testPathIgnorePatterns: ['/node_modules/', '/dist/'],
52
+ testRegex: '.*test\\.(ts|tsx|js)$',
53
+ testPathIgnorePatterns: ['/node_modules/', '/lib', '/dist/'],
15
54
  transform: {
16
55
  '\\.(gql)$': 'jest-transform-graphql',
17
- '\\.(graphql|graphqls)$': 'jest-raw-loader',
56
+ '\\.(graphql|graphqls)$': '@glen/jest-raw-loader',
18
57
  '\\.(ts|tsx)$': 'ts-jest',
19
58
  // Use our custom transformer only for the *.js and *.jsx files
20
59
  '\\.(js|jsx)?$': './transform.js',
@@ -39,7 +78,7 @@ module.exports = {
39
78
  // because we don't need to use any kind of tree shaking right?!
40
79
  '^lodash-es$': '<rootDir>/node_modules/lodash/index.js',
41
80
  },
42
- transformIgnorePatterns: ['/node_modules/(?!(babel-runtime|antd)).*/', '<rootDir>/node_modules/(?!lodash-es/.*)'],
81
+ transformIgnorePatterns: [transformIgnorePattern],
43
82
  clearMocks: true,
44
83
  verbose: true,
45
84
  // projects: ['<rootDir>'], // TODO need to test with it https://github.com/bryan-hunter/yarn-workspace-lerna-monorepo/blob/master/jest.config.base.js
@@ -0,0 +1,99 @@
1
+ /* eslint-disable import/no-extraneous-dependencies */
2
+ /* eslint-disable @typescript-eslint/no-var-requires */
3
+ import { defaults } from 'jest-config';
4
+
5
+ const packagesToTransform = [
6
+ '@apollo/client',
7
+ '@apollo/server',
8
+ '@graphql-tools/schema',
9
+ '@graphql-tools/mock',
10
+ '@common-stack/client-core',
11
+ '@common-stack/client-react',
12
+ '@common-stack/core',
13
+ '@common-stack/server-core',
14
+ '@common-stack/cache-api-server',
15
+ '@common-stack/remix-router-redux',
16
+ '@common-stack/graphql-api',
17
+ '@cdmbase/graphql-type-uri',
18
+ '@cdm-logger/server',
19
+ '@cdm-logger/core',
20
+ '@cdm-logger/client',
21
+ '@files-stack/core',
22
+ '@files-stack/server-core',
23
+ '@vscode-alt/monaco-editor',
24
+ '@workbench-stack/core',
25
+ '@workbench-stack/platform-server',
26
+ 'graphql',
27
+ 'abortable-rx',
28
+ 'lodash-es',
29
+ 'sort-keys',
30
+ 'is-plain-obj',
31
+ 'query-string',
32
+ 'decode-uri-component',
33
+ 'split-on-first',
34
+ 'filter-obj',
35
+ 'react-dnd-html5-backend',
36
+ 'react-sortable-tree',
37
+ 'react-dnd',
38
+ 'dnd-core',
39
+ ];
40
+
41
+ const generateTransformIgnorePattern = (packages) => {
42
+ const escapedPackages = packages.map((pkg) => pkg.replace(/\//g, '\\/'));
43
+ return `/node_modules/(?!(${escapedPackages.join('|')})/).+\\.js$`;
44
+ };
45
+ const transformIgnorePattern = generateTransformIgnorePattern(packagesToTransform);
46
+
47
+ export default {
48
+ testEnvironment: 'node',
49
+ setupFiles: [
50
+ // needed for UI to mock canvas load
51
+ // "jest-canvas-mock"
52
+ ],
53
+ extensionsToTreatAsEsm: ['.ts', '.tsx'],
54
+ preset: 'ts-jest',
55
+ testMatch: null,
56
+ testRegex: '.*test\\.(ts|tsx|js)$',
57
+ testPathIgnorePatterns: ['/node_modules/', '/lib', '/dist/'],
58
+ transform: {
59
+ '\\.(gql)$': 'jest-transform-graphql',
60
+ '\\.(graphql|graphqls)$': '@glen/jest-raw-loader',
61
+ '\\.(ts|tsx)$': 'ts-jest',
62
+ // // Use our custom transformer only for the *.js and *.jsx files
63
+ '\\.(js|jsx)?$': './transform.mjs',
64
+ // future need to test with
65
+ // "^.+\\.(js|jsx|ts|tsx)$": "./transform.js",
66
+ '.+\\.(css|styl|less|sass|scss)$': 'jest-css-modules-transform',
67
+ },
68
+ roots: ['packages', 'packages-modules', 'servers'],
69
+ moduleFileExtensions: [
70
+ ...defaults.moduleFileExtensions,
71
+ 'json',
72
+ 'gql',
73
+ 'graphql',
74
+ ],
75
+ moduleNameMapper: {
76
+ '^__mocks__/(.*)$': '<rootDir>/../../__mocks__/$1',
77
+ // we'll use commonjs version of lodash for tests 👌
78
+ // because we don't need to use any kind of tree shaking right?!
79
+ '^lodash-es$': '<rootDir>/node_modules/lodash/index.js',
80
+ },
81
+ transformIgnorePatterns: [transformIgnorePattern],
82
+ clearMocks: true,
83
+ verbose: true,
84
+ // projects: ['<rootDir>'], // TODO need to test with it https://github.com/bryan-hunter/yarn-workspace-lerna-monorepo/blob/master/jest.config.base.js
85
+ coverageDirectory: '<rootDir>/coverage/',
86
+ coveragePathIgnorePatterns: ['<rootDir>/build/', '<rootDir>/lib/', '<rootDir>/dist/', '<rootDir>/node_modules/'],
87
+ globals: {
88
+ __BACKEND_URL__: 'http://localhost:3010',
89
+ __GRAPHQL_URL__: 'http://localhost:8085/graphql',
90
+ 'ts-jest': {
91
+ // tsConfig: "<rootDir>/src/__tests__/tsconfig.json",
92
+ // https://github.com/kulshekhar/ts-jest/issues/766
93
+ diagnostics: {
94
+ warnOnly: true,
95
+ },
96
+ // "skipBabel": true
97
+ },
98
+ },
99
+ };
@@ -0,0 +1,3 @@
1
+ export default {
2
+ preset: '@shelf/jest-mongodb',
3
+ };
@@ -1,4 +1,7 @@
1
1
  module.exports = {
2
2
  '*.{js,jsx,ts,tsx,json,md}': ['prettier --write', 'git add'],
3
3
  // '*.{ts,tsx}': ['eslint --fix'], // this can be tested
4
- };
4
+ 'package.json': ['sort-package-json', 'prettier --write'],
5
+ '*/**/package.json': ['sort-package-json', 'prettier --write'],
6
+ '**/**/*/package.json': ['sort-package-json', 'prettier --write'],
7
+ };