lincd-cli 1.2.3 → 1.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/defaults/app-with-backend/lincd.config.js +1 -1
  2. package/defaults/app-with-backend/src/backend.ts +2 -2
  3. package/defaults/app-with-backend/src/index.tsx +7 -3
  4. package/defaults/app-with-backend/src/routes.tsx +28 -16
  5. package/defaults/app-with-backend/src/utils/lazyWithPreload.tsx +42 -0
  6. package/defaults/app-with-backend/src/utils/preloadRoutes.ts +38 -0
  7. package/defaults/package/src/types.ts +0 -5
  8. package/lib/cjs/cli-methods.d.ts.map +1 -0
  9. package/lib/cjs/cli-methods.js +41 -17
  10. package/lib/cjs/cli-methods.js.map +1 -1
  11. package/lib/cjs/cli.d.ts.map +1 -0
  12. package/lib/cjs/config-grunt.d.cts +3 -0
  13. package/lib/cjs/config-grunt.d.cts.map +1 -0
  14. package/lib/cjs/config-webpack-app.d.ts.map +1 -0
  15. package/lib/cjs/config-webpack-app.js +147 -240
  16. package/lib/cjs/config-webpack-app.js.map +1 -1
  17. package/lib/cjs/config-webpack.d.ts.map +1 -0
  18. package/lib/cjs/config-webpack.js +37 -64
  19. package/lib/cjs/config-webpack.js.map +1 -1
  20. package/lib/cjs/defineConfig.d.ts.map +1 -0
  21. package/lib/cjs/defineConfig.js +13 -0
  22. package/lib/cjs/defineConfig.js.map +1 -0
  23. package/lib/cjs/index.d.ts.map +1 -0
  24. package/lib/cjs/index.js +3 -1
  25. package/lib/cjs/index.js.map +1 -1
  26. package/lib/cjs/interfaces.d.ts.map +1 -0
  27. package/lib/cjs/loaders/css-loader.d.mts +2 -0
  28. package/lib/cjs/loaders/css-loader.d.mts.map +1 -0
  29. package/lib/cjs/loaders/css-loader.mjs +10 -10
  30. package/lib/cjs/loaders/css-loader.mjs.map +1 -1
  31. package/lib/cjs/loaders/register-css-only.d.ts.map +1 -0
  32. package/lib/cjs/loaders/register-css-only.js +11 -0
  33. package/lib/cjs/loaders/register-css-only.js.map +1 -0
  34. package/lib/cjs/loaders/register.d.ts.map +1 -0
  35. package/lib/cjs/metadata.d.ts.map +1 -0
  36. package/lib/cjs/package.json +5 -5
  37. package/lib/cjs/plugins/check-imports.d.ts.map +1 -0
  38. package/lib/cjs/plugins/declaration-plugin.d.ts.map +1 -0
  39. package/lib/cjs/plugins/externalise-modules.d.ts.map +1 -0
  40. package/lib/cjs/plugins/lincd-tailwind-sources.d.ts.map +1 -0
  41. package/lib/cjs/plugins/watch-run.d.ts.map +1 -0
  42. package/lib/cjs/preflight.css +137 -0
  43. package/lib/cjs/tailwind.config.d.ts.map +1 -0
  44. package/lib/cjs/tailwind.config.js +3 -4
  45. package/lib/cjs/tailwind.config.js.map +1 -1
  46. package/lib/cjs/utils.d.ts.map +1 -0
  47. package/lib/cjs/utils.js +9 -5
  48. package/lib/cjs/utils.js.map +1 -1
  49. package/lib/esm/cli-methods.d.ts.map +1 -0
  50. package/lib/esm/cli-methods.js +41 -11
  51. package/lib/esm/cli-methods.js.map +1 -1
  52. package/lib/esm/cli.d.ts.map +1 -0
  53. package/lib/esm/config-grunt.d.cts +3 -0
  54. package/lib/esm/config-grunt.d.cts.map +1 -0
  55. package/lib/esm/config-webpack-app.d.ts.map +1 -0
  56. package/lib/esm/config-webpack-app.js +148 -241
  57. package/lib/esm/config-webpack-app.js.map +1 -1
  58. package/lib/esm/config-webpack.d.ts.map +1 -0
  59. package/lib/esm/config-webpack.js +38 -65
  60. package/lib/esm/config-webpack.js.map +1 -1
  61. package/lib/esm/defineConfig.d.ts.map +1 -0
  62. package/lib/esm/defineConfig.js +9 -0
  63. package/lib/esm/defineConfig.js.map +1 -0
  64. package/lib/esm/index.d.ts.map +1 -0
  65. package/lib/esm/index.js +1 -0
  66. package/lib/esm/index.js.map +1 -1
  67. package/lib/esm/interfaces.d.ts.map +1 -0
  68. package/lib/esm/loaders/css-loader.d.mts +2 -0
  69. package/lib/esm/loaders/css-loader.d.mts.map +1 -0
  70. package/lib/esm/loaders/css-loader.mjs +10 -10
  71. package/lib/esm/loaders/css-loader.mjs.map +1 -1
  72. package/lib/esm/loaders/register-css-only.d.ts.map +1 -0
  73. package/lib/esm/loaders/register-css-only.js +9 -0
  74. package/lib/esm/loaders/register-css-only.js.map +1 -0
  75. package/lib/esm/loaders/register.d.ts.map +1 -0
  76. package/lib/esm/metadata.d.ts.map +1 -0
  77. package/lib/esm/package.json +5 -5
  78. package/lib/esm/plugins/check-imports.d.ts.map +1 -0
  79. package/lib/esm/plugins/declaration-plugin.d.ts.map +1 -0
  80. package/lib/esm/plugins/externalise-modules.d.ts.map +1 -0
  81. package/lib/esm/plugins/lincd-tailwind-sources.d.ts.map +1 -0
  82. package/lib/esm/plugins/watch-run.d.ts.map +1 -0
  83. package/lib/esm/preflight.css +137 -0
  84. package/lib/esm/tailwind.config.d.ts.map +1 -0
  85. package/lib/esm/tailwind.config.js +3 -4
  86. package/lib/esm/tailwind.config.js.map +1 -1
  87. package/lib/esm/utils.d.ts.map +1 -0
  88. package/lib/esm/utils.js +9 -5
  89. package/lib/esm/utils.js.map +1 -1
  90. package/package.json +6 -5
  91. package/preflight.css +137 -0
@@ -1,5 +1,5 @@
1
1
  export default {
2
- cssMode: 'mixed',
2
+ cssMode: 'tailwind',
3
3
  cacheWebpack: true,
4
4
  analyse: false,
5
5
  };
@@ -3,7 +3,7 @@
3
3
  import { BackendProvider } from 'lincd-server-utils/utils/BackendProvider';
4
4
 
5
5
  export class Backend extends BackendProvider {
6
- constructor(server) {
7
- super(server);
6
+ constructor(server, lincdServer) {
7
+ super(server, lincdServer);
8
8
  }
9
9
  }
@@ -1,9 +1,10 @@
1
+ import { AppContextProvider } from 'lincd-server-utils/components/AppContext';
1
2
  import { initFrontend } from 'lincd-server-utils/utils/Frontend';
3
+ import React from 'react';
2
4
  import { hydrateRoot } from 'react-dom/client';
3
5
  import { BrowserRouter } from 'react-router-dom';
4
6
  import App from './App';
5
- import React from 'react';
6
- import { AppContextProvider } from 'lincd-server-utils/components/AppContext';
7
+ import { preloadMatchedRoute } from './utils/preloadRoutes';
7
8
 
8
9
  //import the storage & file configuration for the frontend
9
10
  import './config-frontend';
@@ -12,7 +13,10 @@ import './config-frontend';
12
13
  window['$RefreshReg$'] = () => {};
13
14
  window['$RefreshSig$'] = () => () => {};
14
15
 
15
- initFrontend().then(() => {
16
+ initFrontend().then(async () => {
17
+ // Preload matched route before hydration to avoid Suspense mismatch
18
+ await preloadMatchedRoute();
19
+
16
20
  hydrateRoot(
17
21
  document,
18
22
  <React.StrictMode>
@@ -1,37 +1,49 @@
1
+ import { RequireAuth } from 'lincd-auth/components/RequireAuth';
2
+ import type { RoutesConfig } from 'lincd-server/types/RouteConfig';
1
3
  import React, { lazy, Suspense } from 'react';
2
4
  import { Route, Routes } from 'react-router-dom';
3
5
  import { Spinner } from './components/Spinner';
4
- import { RequireAuth } from 'lincd-auth/components/RequireAuth';
5
6
  import PageNotFound from './pages/PageNotFound';
7
+ import { lazyWithPreload } from './utils/lazyWithPreload';
8
+
9
+ // Create preloadable lazy components for direct-entry routes
10
+ const HomePage = lazyWithPreload(
11
+ () => import(/* webpackChunkName: "home" */ './pages/Home')
12
+ );
13
+
14
+ const SigninPage = lazyWithPreload(
15
+ () => import(/* webpackChunkName: "signin" */ './pages/Signin')
16
+ );
17
+
18
+ // Export preloadable components for server-side preloading
19
+ export const PRELOADABLE_ROUTES = {
20
+ home: HomePage,
21
+ signin: SigninPage,
22
+ };
6
23
 
7
- //From React 18 you can use 'lazy' to import pages only when you need them.
8
- //This will cause webpack to create multiple bundles, and the right bundles are automatically loaded
9
- interface RouteObj {
10
- path: string;
11
- component?: React.LazyExoticComponent<() => JSX.Element>;
12
- render?: () => JSX.Element;
13
- requireAuth?: boolean;
14
- excludeFromMenu?: boolean;
15
- label?: string;
16
- }
17
24
 
18
- export const ROUTES: { [key: string]: RouteObj } = {
19
- index: {
25
+ export const ROUTES: RoutesConfig = {
26
+ home: {
20
27
  path: '/',
21
- component: lazy(() => import('./pages/Home' /* webpackPrefetch: true */)),
28
+ component: HomePage.Component,
22
29
  label: 'Home',
30
+ preloadChunks: ['home'],
23
31
  },
24
32
  page1: {
25
33
  path: '/page1',
26
- component: lazy(() => import('./pages/Page1' /* webpackPrefetch: true */)),
34
+ component: lazy(
35
+ () => import(/* webpackChunkName: "page1" */ './pages/Page1')
36
+ ),
27
37
  label: 'Protected page',
28
38
  requireAuth: true,
39
+ preloadChunks: ['page1'],
29
40
  },
30
41
  signin: {
31
42
  path: '/signin',
32
- component: lazy(() => import('./pages/Signin' /* webpackPrefetch: true */)),
43
+ component: SigninPage.Component,
33
44
  label: 'Sign In',
34
45
  excludeFromMenu: true,
46
+ preloadChunks: ['signin'],
35
47
  },
36
48
  };
37
49
 
@@ -0,0 +1,42 @@
1
+ import { ComponentType, lazy } from 'react';
2
+
3
+ export interface PreloadableComponent<T extends ComponentType<any>> {
4
+ preload: () => Promise<{ default: T }>;
5
+ Component: React.LazyExoticComponent<T>;
6
+ }
7
+
8
+ /**
9
+ * Creates a lazy-loaded component with a preload function
10
+ * This allows preloading the component before React needs it
11
+ *
12
+ * @example
13
+ * const SigninPage = lazyWithPreload(() => import('./pages/Signin'));
14
+ * // Later, before navigation or on server:
15
+ * SigninPage.preload();
16
+ */
17
+ export function lazyWithPreload<T extends ComponentType<any>>(
18
+ importFunc: () => Promise<{ default: T }>
19
+ ): PreloadableComponent<T> {
20
+ let modulePromise: Promise<{ default: T }> | null = null;
21
+
22
+ const preload = () => {
23
+ if (!modulePromise) {
24
+ modulePromise = importFunc();
25
+ }
26
+ return modulePromise;
27
+ };
28
+
29
+ const Component = lazy(() => {
30
+ // If preload was called, reuse the same promise
31
+ // This ensures React uses the already-loaded module
32
+ if (!modulePromise) {
33
+ modulePromise = importFunc();
34
+ }
35
+ return modulePromise;
36
+ });
37
+
38
+ return {
39
+ preload,
40
+ Component,
41
+ };
42
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Client-side script to preload lazy routes before hydration
3
+ * This should be called BEFORE React's hydrateRoot()
4
+ */
5
+
6
+ // This will be populated by the server with the routes that need preloading
7
+ declare global {
8
+ interface Window {
9
+ __PRELOAD_ROUTES__?: string[];
10
+ }
11
+ }
12
+
13
+ export async function preloadMatchedRoute() {
14
+ // Get the list of routes to preload from the server
15
+ const routesToPreload = window.__PRELOAD_ROUTES__ || [];
16
+
17
+ if (routesToPreload.length === 0) {
18
+ return;
19
+ }
20
+
21
+ // Dynamically import the routes module to access PRELOADABLE_ROUTES
22
+ const routesModule = await import('../routes');
23
+ const { PRELOADABLE_ROUTES } = routesModule;
24
+
25
+ // Preload each route
26
+ const preloadPromises = routesToPreload
27
+ .map((routeKey) => {
28
+ const preloadableRoute = PRELOADABLE_ROUTES[routeKey];
29
+ if (preloadableRoute && preloadableRoute.preload) {
30
+ return preloadableRoute.preload();
31
+ }
32
+ return null;
33
+ })
34
+ .filter(Boolean);
35
+
36
+ // Wait for all preloads to complete
37
+ await Promise.all(preloadPromises);
38
+ }
@@ -2,8 +2,3 @@ declare module '*.module.css' {
2
2
  const classes: {[key: string]: string};
3
3
  export default classes;
4
4
  }
5
-
6
- declare module '*.module.scss' {
7
- const classes: {[key: string]: string};
8
- export default classes;
9
- }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-methods.d.ts","sourceRoot":"","sources":["../../src/cli-methods.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAC,cAAc,EAAC,MAAM,YAAY,CAAC;AAkB1C,eAAO,MAAM,SAAS,iDAoDrB,CAAC;AAmBF,wBAAgB,IAAI,CAAC,GAAG,QAAQ,OAAA,QAK/B;AACD,wBAAgB,QAAQ,CAAC,GAAG,QAAQ,OAAA,QAInC;AACD,wBAAgB,cAAc,CAAC,MAAM,KAAA,EAAE,IAAI,KAAA,QAyB1C;AA2CD,wBAAgB,kCAAkC,CAChD,aAAa,KAAA,EACb,YAAY,EAAE,CACZ,YAAY,KAAA,EACZ,YAAY,KAAA,KACT,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,GAAG,CAAC,EAC1C,UAAU,KAAA,EACV,IAAI,UAAQ,QAoMb;AA+ID,wBAAgB,QAAQ,CAAC,OAAO,KAAA,QA6T/B;AAkCD,wBAAgB,gBAAgB,CAAC,QAAQ,SAAgB,GAAG,cAAc,EAAE,CA4B3E;AAyCD,eAAO,MAAM,cAAc,kEAgG1B,CAAC;AAwGF,eAAO,MAAM,gBAAgB;;;;;CAc5B,CAAC;AAgBF;;GAEG;AACH,eAAO,MAAM,YAAY,cAaxB,CAAC;AACF,eAAO,MAAM,WAAW,iDA2BvB,CAAC;AAEF,eAAO,MAAM,kBAAkB,iDAmC9B,CAAC;AACF,eAAO,MAAM,eAAe,iDAuC3B,CAAC;AAKF,eAAO,MAAM,YAAY,kBACT,MAAM,UACb,MAAM,mBACG,IAAI,MAAM,EAAE;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,EAAE,CAAC,qBAuFlE,CAAC;AAEF,eAAO,MAAM,cAAc,qBAuB1B,CAAC;AACF,eAAO,MAAM,QAAQ,iBAAuB,MAAM,qBAuDjD,CAAC;AACF,eAAO,MAAM,uBAAuB,qBA8CnC,CAAC;AACF,eAAO,MAAM,SAAS,gBACP,MAAM,UACX,MAAM,WACL;IAAC,KAAK,EAAE,OAAO,CAAA;CAAC,kBA2G1B,CAAC;AACF,eAAO,MAAM,WAAW,cACZ,OAAO,oCA+DlB,CAAC;AACF,eAAO,MAAM,QAAQ,sBAKpB,CAAC;AACF,eAAO,MAAM,aAAa,qBAmHzB,CAAC;AACF,eAAO,MAAM,YAAY,wBAiExB,CAAC;AAEF,eAAO,MAAM,eAAe,qBAoK3B,CAAC;AAEF,eAAO,MAAM,aAAa,gEA+GzB,CAAC;AAqBF,eAAO,MAAM,QAAQ,qCAuDpB,CAAC;AAEF,eAAO,MAAM,YAAY,iEAIX,OAAO,8BA4JpB,CAAC;AACF,eAAO,MAAM,cAAc,yCAyB1B,CAAC;AACF,eAAO,MAAM,iBAAiB,4CAQ7B,CAAC;AACF,eAAO,MAAM,iBAAiB;;EAW7B,CAAC;AAEF,eAAO,IAAI,cAAc,UAAmB,OAAO,kBA0KlD,CAAC;AAsBF,eAAO,IAAI,cAAc,8EAiExB,CAAC;AAEF,eAAO,IAAI,YAAY,iEAIE,OAAO,SACxB,OAAO,kBAiHd,CAAC;AAeF,eAAO,IAAI,4BAA4B,wFAgDtC,CAAC;AAOF,eAAO,IAAI,cAAc,uCAMxB,CAAC;AACF,eAAO,IAAI,YAAY,sCA8FtB,CAAC;AAEF,eAAO,IAAI,wBAAwB,0CA6BlC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,wCA8B1B,CAAC"}
@@ -1181,14 +1181,22 @@ const runMethod = async (packageName, method, options) => {
1181
1181
  await (0, exports.ensureEnvironmentLoaded)();
1182
1182
  if (options.spawn) {
1183
1183
  let lincdConfig = (await Promise.resolve(`${path_1.default.join(process.cwd(), 'lincd.config.js')}`).then(s => __importStar(require(s)))).default;
1184
+ // Set default loadAppComponent if not provided
1185
+ if (!lincdConfig.server) {
1186
+ lincdConfig.server = {};
1187
+ }
1188
+ if (!lincdConfig.server.loadAppComponent) {
1189
+ lincdConfig.server.loadAppComponent = async () => (await Promise.resolve(`${path_1.default.join(process.cwd(), 'src', 'App')}`).then(s => __importStar(require(s)))).default;
1190
+ }
1191
+ // Set default loadRoutes if not provided
1192
+ if (!lincdConfig.server.loadRoutes) {
1193
+ lincdConfig.server.loadRoutes = async () => await Promise.resolve(`${path_1.default.join(process.cwd(), 'src', 'routes.tsx')}`).then(s => __importStar(require(s)));
1194
+ }
1184
1195
  //@ts-ignore
1185
1196
  const ServerClass = (await Promise.resolve().then(() => __importStar(require('lincd-server/shapes/LincdServer'))))
1186
1197
  .LincdServer;
1187
1198
  await Promise.resolve(`${path_1.default.join(process.cwd(), 'scripts', 'storage-config.js')}`).then(s => __importStar(require(s)));
1188
- let server = new ServerClass({
1189
- loadAppComponent: async () => (await Promise.resolve(`${path_1.default.join(process.cwd(), 'src', 'App')}`).then(s => __importStar(require(s)))).default,
1190
- ...lincdConfig,
1191
- });
1199
+ let server = new ServerClass(lincdConfig);
1192
1200
  //init the server
1193
1201
  console.log('Initializing server...');
1194
1202
  server.initOnly().then(() => {
@@ -1278,21 +1286,36 @@ const startServer = async (initOnly = false, ServerClass = null) => {
1278
1286
  ServerClass = (await Promise.resolve().then(() => __importStar(require('lincd-server/shapes/LincdServer')))).LincdServer;
1279
1287
  }
1280
1288
  await Promise.resolve(`${path_1.default.join(process.cwd(), 'scripts', 'storage-config.js')}`).then(s => __importStar(require(s)));
1281
- let appPromise;
1282
- if (process.env.NODE_ENV !== 'development') {
1283
- appPromise = (await Promise.resolve(`${path_1.default.join(process.cwd(), 'lib', 'App.js')}`).then(s => __importStar(require(s))))
1284
- .default;
1289
+ // Set default loadAppComponent if not provided
1290
+ if (!lincdConfig.server) {
1291
+ lincdConfig.server = {};
1292
+ }
1293
+ if (!lincdConfig.server.loadAppComponent) {
1294
+ let appPromise;
1295
+ if (process.env.NODE_ENV !== 'development') {
1296
+ appPromise = (await Promise.resolve(`${path_1.default.join(process.cwd(), 'lib', 'App.js')}`).then(s => __importStar(require(s))))
1297
+ .default;
1298
+ }
1299
+ else {
1300
+ appPromise = (await Promise.resolve(`${path_1.default.join(process.cwd(), 'src', 'App.tsx')}`).then(s => __importStar(require(s))))
1301
+ .default;
1302
+ }
1303
+ lincdConfig.server.loadAppComponent = async () => {
1304
+ return appPromise;
1305
+ };
1285
1306
  }
1286
- else {
1287
- appPromise = (await Promise.resolve(`${path_1.default.join(process.cwd(), 'src', 'App.tsx')}`).then(s => __importStar(require(s))))
1288
- .default;
1307
+ // Set default loadRoutes if not provided
1308
+ if (!lincdConfig.server.loadRoutes) {
1309
+ lincdConfig.server.loadRoutes = async () => {
1310
+ if (process.env.NODE_ENV !== 'development') {
1311
+ return await Promise.resolve(`${path_1.default.join(process.cwd(), 'lib', 'routes.js')}`).then(s => __importStar(require(s)));
1312
+ }
1313
+ else {
1314
+ return await Promise.resolve(`${path_1.default.join(process.cwd(), 'src', 'routes.tsx')}`).then(s => __importStar(require(s)));
1315
+ }
1316
+ };
1289
1317
  }
1290
- let server = new ServerClass({
1291
- loadAppComponent: async () => {
1292
- return appPromise;
1293
- },
1294
- ...lincdConfig,
1295
- });
1318
+ let server = new ServerClass(lincdConfig);
1296
1319
  //Important to use slice, because when using clusers, child processes need to be able to read the same arguments
1297
1320
  let args = process.argv.slice(2);
1298
1321
  //if --initOnly is passed, only initialize the server and don't start it
@@ -1308,6 +1331,7 @@ const buildApp = async () => {
1308
1331
  await (0, exports.buildFrontend)();
1309
1332
  await (0, exports.buildBackend)();
1310
1333
  console.log(chalk_1.default.magenta(`✅ ${process.env.NODE_ENV} app build finished`));
1334
+ process.exit(0);
1311
1335
  };
1312
1336
  exports.buildApp = buildApp;
1313
1337
  const buildFrontend = async () => {