@anansi/core 0.7.4 → 0.10.0
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.
- package/CHANGELOG.md +60 -0
- package/dist/client.js +3 -2
- package/dist/client.js.map +1 -1
- package/dist/server.js +27 -23
- package/dist/server.js.map +1 -1
- package/lib/floodSpouts.d.ts +6 -0
- package/lib/floodSpouts.d.ts.map +1 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.server.d.ts +6 -0
- package/lib/index.server.d.ts.map +1 -0
- package/lib/laySpouts.d.ts +8 -0
- package/lib/laySpouts.d.ts.map +1 -0
- package/lib/scripts/getProxyMiddlewares.d.ts +3 -0
- package/lib/scripts/getProxyMiddlewares.d.ts.map +1 -0
- package/lib/scripts/getProxyMiddlewares.js +106 -0
- package/lib/scripts/index.d.ts +3 -0
- package/lib/scripts/index.d.ts.map +1 -0
- package/lib/scripts/index.js +15 -0
- package/lib/scripts/serve.d.ts +7 -0
- package/lib/scripts/serve.d.ts.map +1 -0
- package/lib/scripts/serve.js +188 -0
- package/lib/scripts/startDevserver.d.ts +4 -0
- package/lib/scripts/startDevserver.d.ts.map +1 -0
- package/lib/scripts/startDevserver.js +171 -167
- package/lib/scripts/types.d.ts +7 -0
- package/lib/scripts/types.d.ts.map +1 -0
- package/lib/spouts/DocumentComponent.d.ts +23 -0
- package/lib/spouts/DocumentComponent.d.ts.map +1 -0
- package/lib/spouts/DocumentComponent.js +10 -6
- package/lib/spouts/document.d.ts +13 -0
- package/lib/spouts/document.d.ts.map +1 -0
- package/lib/spouts/document.server.d.ts +17 -0
- package/lib/spouts/document.server.d.ts.map +1 -0
- package/lib/spouts/document.server.js +1 -1
- package/lib/spouts/prefetch.server.d.ts +8 -0
- package/lib/spouts/prefetch.server.d.ts.map +1 -0
- package/lib/spouts/restHooks.d.ts +8 -0
- package/lib/spouts/restHooks.d.ts.map +1 -0
- package/lib/spouts/restHooks.server.d.ts +9 -0
- package/lib/spouts/restHooks.server.d.ts.map +1 -0
- package/lib/spouts/router.d.ts +14 -0
- package/lib/spouts/router.d.ts.map +1 -0
- package/lib/spouts/router.js +3 -2
- package/lib/spouts/router.server.d.ts +12 -0
- package/lib/spouts/router.server.d.ts.map +1 -0
- package/lib/spouts/types.d.ts +16 -0
- package/lib/spouts/types.d.ts.map +1 -0
- package/package.json +15 -8
- package/src/scripts/getProxyMiddlewares.ts +129 -0
- package/src/scripts/index.ts +2 -0
- package/src/scripts/serve.ts +211 -0
- package/src/scripts/startDevserver.ts +204 -198
- package/src/spouts/DocumentComponent.tsx +8 -2
- package/src/spouts/document.server.tsx +2 -1
- package/src/spouts/router.tsx +7 -1
|
@@ -65,4 +65,4 @@ function childrenAssets(chunk) {
|
|
|
65
65
|
return (_c$assets = c.assets) != null ? _c$assets : [];
|
|
66
66
|
})) : [];
|
|
67
67
|
}
|
|
68
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
68
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEb2N1bWVudFNwb3V0Iiwib3B0aW9ucyIsIm5leHQiLCJwcm9wcyIsIm5leHRQcm9wcyIsInB1YmxpY1BhdGgiLCJjbGllbnRNYW5pZmVzdCIsIk9iamVjdCIsImtleXMiLCJlbnRyeXBvaW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsIkVycm9yIiwiYXNzZXRNYXAiLCJhc3NldHMiLCJtYXAiLCJuYW1lIiwiYXNzZXRMaXN0IiwidmFsdWVzIiwiZm9yRWFjaCIsImVudHJ5cG9pbnQiLCJwdXNoIiwiU2V0IiwibmFtZWRDaHVua0dyb3VwcyIsImZpbHRlciIsIm1hdGNoZWRSb3V0ZXMiLCJzb21lIiwicm91dGUiLCJpbmNsdWRlcyIsImZsYXRNYXAiLCJjaHVuayIsImNoaWxkcmVuQXNzZXRzIiwiYXNzZXQiLCJlbmRzV2l0aCIsImhyZWYiLCJyZWwiLCJhcyIsImFwcCIsInRpdGxlIiwicm9vdElkIiwiY2hpbGRyZW4iLCJwcmVsb2FkIiwiYyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcG91dHMvZG9jdW1lbnQuc2VydmVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBSb3V0ZSB9IGZyb20gJ0BhbmFuc2kvcm91dGVyJztcbmltcG9ydCB7IFN0YXRzQ2h1bmtHcm91cCB9IGZyb20gJ3dlYnBhY2snO1xuXG5pbXBvcnQgdHlwZSB7IFNlcnZlclByb3BzLCBSZXNvbHZlUHJvcHMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCBEb2N1bWVudCBmcm9tICcuL0RvY3VtZW50Q29tcG9uZW50JztcblxudHlwZSBOZWVkZWRQcm9wcyA9IHtcbiAgbWF0Y2hlZFJvdXRlczogUm91dGU8YW55PltdO1xuICB0aXRsZT86IHN0cmluZztcbn0gJiBSZXNvbHZlUHJvcHM7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERvY3VtZW50U3BvdXQob3B0aW9uczoge1xuICBoZWFkPzogUmVhY3QuUmVhY3ROb2RlO1xuICB0aXRsZTogc3RyaW5nO1xuICByb290SWQ/OiBzdHJpbmc7XG4gIGNoYXJTZXQ/OiBzdHJpbmc7XG59KSB7XG4gIHJldHVybiBmdW5jdGlvbiA8VCBleHRlbmRzIE5lZWRlZFByb3BzPihcbiAgICBuZXh0OiAocHJvcHM6IFNlcnZlclByb3BzKSA9PiBQcm9taXNlPFQ+LFxuICApIHtcbiAgICByZXR1cm4gYXN5bmMgKHByb3BzOiBTZXJ2ZXJQcm9wcykgPT4ge1xuICAgICAgY29uc3QgbmV4dFByb3BzID0gYXdhaXQgbmV4dChwcm9wcyk7XG5cbiAgICAgIGNvbnN0IHB1YmxpY1BhdGggPSBwcm9wcy5jbGllbnRNYW5pZmVzdC5wdWJsaWNQYXRoO1xuXG4gICAgICBpZiAoXG4gICAgICAgIE9iamVjdC5rZXlzKHByb3BzLmNsaWVudE1hbmlmZXN0Py5lbnRyeXBvaW50cyA/PyB7fSkubGVuZ3RoIDwgMSB8fFxuICAgICAgICBwdWJsaWNQYXRoID09PSB1bmRlZmluZWRcbiAgICAgIClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYW5pZmVzdCBtaXNzaW5nIGVudHJpZXMgbmVlZGVkJyk7XG5cbiAgICAgIC8vIFRPRE86IGNvbnNpZGVyIHVzaW5nIHRoaXMgcGFja2FnZSBmb3IgYnVpbGQgc3RhdHMgaW4gZnV0dXJlOlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3RyZWUvbWFpbi9wYWNrYWdlcy9yZWFjdC1zZXJ2ZXItZG9tLXdlYnBhY2tcbiAgICAgIGNvbnN0IGFzc2V0TWFwID0gKGFzc2V0czogeyBuYW1lOiBzdHJpbmc7IHNpemU/OiBudW1iZXIgfVtdKSA9PlxuICAgICAgICBhc3NldHMubWFwKCh7IG5hbWUgfSkgPT4gYCR7cHVibGljUGF0aH0ke25hbWV9YCk7XG5cbiAgICAgIGNvbnN0IGFzc2V0TGlzdDogc3RyaW5nW10gPSBbXTtcbiAgICAgIE9iamVjdC52YWx1ZXMocHJvcHMuY2xpZW50TWFuaWZlc3Q/LmVudHJ5cG9pbnRzID8/IHt9KS5mb3JFYWNoKFxuICAgICAgICBlbnRyeXBvaW50ID0+IHtcbiAgICAgICAgICBhc3NldExpc3QucHVzaCguLi5hc3NldE1hcChlbnRyeXBvaW50LmFzc2V0cyA/PyBbXSkpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIG5ldyBTZXQoXG4gICAgICAgIGFzc2V0TWFwKFxuICAgICAgICAgIE9iamVjdC52YWx1ZXMocHJvcHMuY2xpZW50TWFuaWZlc3QubmFtZWRDaHVua0dyb3VwcyA/PyB7fSlcbiAgICAgICAgICAgIC5maWx0ZXIoKHsgbmFtZSB9KSA9PlxuICAgICAgICAgICAgICBuZXh0UHJvcHMubWF0Y2hlZFJvdXRlcy5zb21lKHJvdXRlID0+IG5hbWU/LmluY2x1ZGVzKHJvdXRlLm5hbWUpKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5mbGF0TWFwKGNodW5rID0+IFtcbiAgICAgICAgICAgICAgLi4uKGNodW5rLmFzc2V0cyA/PyBbXSksXG4gICAgICAgICAgICAgIC8vIGFueSBjaHVuayBwcmVsb2Fkc1xuICAgICAgICAgICAgICAuLi5jaGlsZHJlbkFzc2V0cyhjaHVuayksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgKSxcbiAgICAgICkuZm9yRWFjaChhc3NldCA9PiBhc3NldExpc3QucHVzaChhc3NldCkpO1xuXG4gICAgICAvLyBmaW5kIGFkZGl0aW9uYWwgYXNzZXRzIHRvIHByZWxvYWQgYmFzZWQgb24gbWF0Y2hlZCByb3V0ZVxuICAgICAgY29uc3QgYXNzZXRzOiB7XG4gICAgICAgIGhyZWY6IHN0cmluZztcbiAgICAgICAgYXM/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIHJlbD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIH1bXSA9IGFzc2V0TGlzdFxuICAgICAgICAuZmlsdGVyKGFzc2V0ID0+ICFhc3NldC5lbmRzV2l0aCgnLmhvdC11cGRhdGUuanMnKSlcbiAgICAgICAgLm1hcChhc3NldCA9PlxuICAgICAgICAgIGFzc2V0LmVuZHNXaXRoKCcuY3NzJylcbiAgICAgICAgICAgID8geyBocmVmOiBhc3NldCwgcmVsOiAnc3R5bGVzaGVldCcgfVxuICAgICAgICAgICAgOiBhc3NldC5lbmRzV2l0aCgnLmpzJylcbiAgICAgICAgICAgID8geyBocmVmOiBhc3NldCwgYXM6ICdzY3JpcHQnIH1cbiAgICAgICAgICAgIDogeyBocmVmOiBhc3NldCB9LFxuICAgICAgICApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5uZXh0UHJvcHMsXG4gICAgICAgIGFwcDogKFxuICAgICAgICAgIDxEb2N1bWVudFxuICAgICAgICAgICAgey4uLm9wdGlvbnN9XG4gICAgICAgICAgICB0aXRsZT17bmV4dFByb3BzLnRpdGxlID8/IG9wdGlvbnMudGl0bGV9XG4gICAgICAgICAgICBhc3NldHM9e2Fzc2V0c31cbiAgICAgICAgICAgIHJvb3RJZD17b3B0aW9ucy5yb290SWR9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge25leHRQcm9wcy5hcHB9XG4gICAgICAgICAgPC9Eb2N1bWVudD5cbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2hpbGRyZW5Bc3NldHMoY2h1bms6IFN0YXRzQ2h1bmtHcm91cCkge1xuICByZXR1cm4gY2h1bmsuY2hpbGRyZW5cbiAgICA/IE9iamVjdC52YWx1ZXMoY2h1bmsuY2hpbGRyZW4pLmZsYXRNYXAocHJlbG9hZCA9PlxuICAgICAgICBwcmVsb2FkLmZsYXRNYXAoYyA9PiBjLmFzc2V0cyA/PyBbXSksXG4gICAgICApXG4gICAgOiBbXTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUtBOztBQU9lLFNBQVNBLGFBQVQsQ0FBdUJDLE9BQXZCLEVBS1o7RUFDRCxPQUFPLFVBQ0xDLElBREssRUFFTDtJQUNBLE9BQU8sTUFBT0MsS0FBUCxJQUE4QjtNQUFBOztNQUNuQyxNQUFNQyxTQUFTLEdBQUcsTUFBTUYsSUFBSSxDQUFDQyxL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
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Route } from '@anansi/router';
|
|
2
|
+
import type { ResolveProps, ServerProps } from './types';
|
|
3
|
+
declare type NeededProps<RouteWith> = {
|
|
4
|
+
matchedRoutes: Route<RouteWith>[];
|
|
5
|
+
} & ResolveProps;
|
|
6
|
+
export default function prefetchSpout<F extends string>(field: F): <RouteWith, T extends NeededProps<RouteWith>>(next: (props: ServerProps) => Promise<{ [K in F]: RouteWith; } & T>) => (props: ServerProps) => Promise<{ [K in F]: RouteWith; } & T>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=prefetch.server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefetch.server.d.ts","sourceRoot":"","sources":["../../src/spouts/prefetch.server.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEzD,aAAK,WAAW,CAAC,SAAS,IAAI;IAC5B,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;CACnC,GAAG,YAAY,CAAC;AAEjB,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,+DAE9C,WAAW,uDAMJ,WAAW,2CAiBnC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Manager } from '@rest-hooks/core';
|
|
2
|
+
import type { ResolveProps } from './types';
|
|
3
|
+
export default function restHooksSpout(options?: {
|
|
4
|
+
getManagers: () => Manager[];
|
|
5
|
+
}): <T extends ResolveProps>(next: () => Promise<T>) => () => Promise<T & {
|
|
6
|
+
app: JSX.Element;
|
|
7
|
+
}>;
|
|
8
|
+
//# sourceMappingURL=restHooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restHooks.d.ts","sourceRoot":"","sources":["../../src/spouts/restHooks.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,OAAO,EAAkB,MAAM,kBAAkB,CAAC;AAG1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5C,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,OAAO,GAAE;IACP,WAAW,EAAE,MAAM,OAAO,EAAE,CAAC;CACkB;;GAmBlD"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Manager } from '@rest-hooks/core';
|
|
2
|
+
import type { ResolveProps, ServerProps } from './types';
|
|
3
|
+
export default function restHooksSpout(options?: {
|
|
4
|
+
getManagers: () => Manager[];
|
|
5
|
+
}): <T extends ResolveProps>(next: (props: ServerProps) => Promise<T>) => (props: ServerProps) => Promise<T & {
|
|
6
|
+
controller: import("@rest-hooks/core").Controller;
|
|
7
|
+
app: JSX.Element;
|
|
8
|
+
}>;
|
|
9
|
+
//# sourceMappingURL=restHooks.server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restHooks.server.d.ts","sourceRoot":"","sources":["../../src/spouts/restHooks.server.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAkB,MAAM,kBAAkB,CAAC;AAG3D,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAIzD,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,OAAO,GAAE;IACP,WAAW,EAAE,MAAM,OAAO,EAAE,CAAC;CACkB,0CAGjC,WAAW,4BAEJ,WAAW;;;GAcnC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Route, RouteController } from '@anansi/router';
|
|
2
|
+
import type { Update } from 'history';
|
|
3
|
+
import type { ResolveProps, CreateRouter } from './types';
|
|
4
|
+
export default function routerSpout<ResolveWith>(options: {
|
|
5
|
+
resolveWith?: any;
|
|
6
|
+
useResolveWith: () => ResolveWith;
|
|
7
|
+
createRouter: CreateRouter<ResolveWith>;
|
|
8
|
+
onChange?: (update: Update, callback: () => void | undefined) => void;
|
|
9
|
+
}): <T extends ResolveProps>(next: () => Promise<T>) => () => Promise<T & {
|
|
10
|
+
matchedRoutes: (Route<ResolveWith, any> & object)[];
|
|
11
|
+
router: RouteController<Route<ResolveWith, any>>;
|
|
12
|
+
app: JSX.Element;
|
|
13
|
+
}>;
|
|
14
|
+
//# sourceMappingURL=router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/spouts/router.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAiB,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtC,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI1D,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,WAAW,EAAE,OAAO,EAAE;IACxD,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,cAAc,EAAE,MAAM,WAAW,CAAC;IAClC,YAAY,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,SAAS,KAAK,IAAI,CAAC;CACvE;;;;GAmCA"}
|
package/lib/spouts/router.js
CHANGED
|
@@ -20,7 +20,8 @@ function routerSpout(options) {
|
|
|
20
20
|
const resolveWith = options.useResolveWith();
|
|
21
21
|
return /*#__PURE__*/(0, _jsx2.default)(_router.RouteProvider, {
|
|
22
22
|
router: router,
|
|
23
|
-
resolveWith: resolveWith
|
|
23
|
+
resolveWith: resolveWith,
|
|
24
|
+
onChange: options.onChange
|
|
24
25
|
}, void 0, children);
|
|
25
26
|
};
|
|
26
27
|
|
|
@@ -39,4 +40,4 @@ function routerSpout(options) {
|
|
|
39
40
|
};
|
|
40
41
|
};
|
|
41
42
|
}
|
|
42
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyb3V0ZXJTcG91dCIsIm9wdGlvbnMiLCJjcmVhdGVSb3V0ZUNvbXBvbmVudCIsInJvdXRlciIsIlJvdXRlciIsImNoaWxkcmVuIiwicmVzb2x2ZVdpdGgiLCJ1c2VSZXNvbHZlV2l0aCIsIm9uQ2hhbmdlIiwibmV4dCIsImhpc3RvcnkiLCJjcmVhdGVCcm93c2VySGlzdG9yeSIsImNyZWF0ZVJvdXRlciIsIm1hdGNoZWRSb3V0ZXMiLCJnZXRNYXRjaGVkUm91dGVzIiwibG9jYXRpb24iLCJwYXRobmFtZSIsIm5leHRQcm9wcyIsImFwcCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcG91dHMvcm91dGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSb3V0ZSwgUm91dGVQcm92aWRlciwgUm91dGVDb250cm9sbGVyIH0gZnJvbSAnQGFuYW5zaS9yb3V0ZXInO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNyZWF0ZUJyb3dzZXJIaXN0b3J5IH0gZnJvbSAnaGlzdG9yeSc7XG5pbXBvcnQgdHlwZSB7IFVwZGF0ZSB9IGZyb20gJ2hpc3RvcnknO1xuXG5pbXBvcnQgdHlwZSB7IFJlc29sdmVQcm9wcywgQ3JlYXRlUm91dGVyIH0gZnJvbSAnLi90eXBlcyc7XG5cbnR5cGUgTmVlZGVkUHJvcHMgPSBSZXNvbHZlUHJvcHM7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJvdXRlclNwb3V0PFJlc29sdmVXaXRoPihvcHRpb25zOiB7XG4gIHJlc29sdmVXaXRoPzogYW55O1xuICB1c2VSZXNvbHZlV2l0aDogKCkgPT4gUmVzb2x2ZVdpdGg7XG4gIGNyZWF0ZVJvdXRlcjogQ3JlYXRlUm91dGVyPFJlc29sdmVXaXRoPjtcbiAgb25DaGFuZ2U/OiAodXBkYXRlOiBVcGRhdGUsIGNhbGxiYWNrOiAoKSA9PiB2b2lkIHwgdW5kZWZpbmVkKSA9PiB2b2lkO1xufSkge1xuICBjb25zdCBjcmVhdGVSb3V0ZUNvbXBvbmVudCA9IChcbiAgICByb3V0ZXI6IFJvdXRlQ29udHJvbGxlcjxSb3V0ZTxSZXNvbHZlV2l0aCwgYW55Pj4sXG4gICkgPT5cbiAgICBmdW5jdGlvbiBSb3V0ZXIoeyBjaGlsZHJlbiB9OiB7IGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUgfSkge1xuICAgICAgY29uc3QgcmVzb2x2ZVdpdGggPSBvcHRpb25zLnVzZVJlc29sdmVXaXRoKCk7XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxSb3V0ZVByb3ZpZGVyXG4gICAgICAgICAgcm91dGVyPXtyb3V0ZXJ9XG4gICAgICAgICAgcmVzb2x2ZVdpdGg9e3Jlc29sdmVXaXRofVxuICAgICAgICAgIG9uQ2hhbmdlPXtvcHRpb25zLm9uQ2hhbmdlfVxuICAgICAgICA+XG4gICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8L1JvdXRlUHJvdmlkZXI+XG4gICAgICApO1xuICAgIH07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIDxUIGV4dGVuZHMgTmVlZGVkUHJvcHM+KG5leHQ6ICgpID0+IFByb21pc2U8VD4pIHtcbiAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgaGlzdG9yeSA9IGNyZWF0ZUJyb3dzZXJIaXN0b3J5KCk7XG4gICAgICBjb25zdCByb3V0ZXIgPSBvcHRpb25zLmNyZWF0ZVJvdXRlcihoaXN0b3J5KTtcbiAgICAgIGNvbnN0IG1hdGNoZWRSb3V0ZXMgPSByb3V0ZXIuZ2V0TWF0Y2hlZFJvdXRlcyhoaXN0b3J5LmxvY2F0aW9uLnBhdGhuYW1lKTtcblxuICAgICAgY29uc3QgbmV4dFByb3BzID0gYXdhaXQgbmV4dCgpO1xuXG4gICAgICBjb25zdCBSb3V0ZXIgPSBjcmVhdGVSb3V0ZUNvbXBvbmVudChyb3V0ZXIpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ubmV4dFByb3BzLFxuICAgICAgICBtYXRjaGVkUm91dGVzLFxuICAgICAgICByb3V0ZXIsXG4gICAgICAgIGFwcDogPFJvdXRlcj57bmV4dFByb3BzLmFwcH08L1JvdXRlcj4sXG4gICAgICB9O1xuICAgIH07XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQU9lLFNBQVNBLFdBQVQsQ0FBa0NDLE9BQWxDLEVBS1o7RUFDRCxNQUFNQyxvQkFBb0IsR0FDeEJDLE1BRDJCLElBRzNCLFNBQVNDLE1BQVQsQ0FBZ0I7SUFBRUM7RUFBRixDQUFoQixFQUE2RDtJQUMzRCxNQUFNQyxXQUFXLEdBQUdMLE9BQU8sQ0FBQ00sY0FBUixFQUFwQjtJQUVBLG9CQUNFLG1CQUFDLHFCQUFEO01BQ0UsTUFBTSxFQUFFSixNQURWO01BRUUsV0FBVyxFQUFFRyxXQUZmO01BR0UsUUFBUSxFQUFFTCxPQUFPLENBQUNPO0lBSHBCLFdBS0dILFFBTEgsQ0FERjtFQVNELENBZkg7O0VBaUJBLE9BQU8sVUFBaUNJLElBQWpDLEVBQXlEO0lBQzlELE9BQU8sWUFBWTtNQUNqQixNQUFNQyxPQUFPLEdBQUcsSUFBQUMsNkJBQUEsR0FBaEI7TUFDQSxNQUFNUixNQUFNLEdBQUdGLE9BQU8sQ0FBQ1csWUFBUixDQUFxQkYsT0FBckIsQ0FBZjtNQUNBLE1BQU1HLGFBQWEsR0FBR1YsTUFBTSxDQUFDVyxnQkFBUCxDQUF3QkosT0FBTyxDQUFDSyxRQUFSLENBQWlCQyxRQUF6QyxDQUF0QjtNQUVBLE1BQU1DLFNBQVMsR0FBRyxNQUFNUixJQUFJLEVBQTVCO01BRUEsTUFBTUwsTUFBTSxHQUFHRixvQkFBb0IsQ0FBQ0MsTUFBRCxDQUFuQztNQUNBLE9BQU8sRUFDTCxHQUFHYyxTQURFO1FBRUxKLGFBRks7UUFHTFYsTUFISztRQUlMZSxHQUFHLGVBQUUsbUJBQUMsTUFBRCxjQUFTRCxTQUFTLENBQUNDLEdBQW5CO01BSkEsQ0FBUDtJQU1ELENBZEQ7RUFlRCxDQWhCRDtBQWlCRCJ9
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Route, RouteController } from '@anansi/router';
|
|
2
|
+
import type { ResolveProps, ServerProps, CreateRouter } from './types';
|
|
3
|
+
export default function routerSpout<ResolveWith>(options: {
|
|
4
|
+
resolveWith?: any;
|
|
5
|
+
useResolveWith: () => ResolveWith;
|
|
6
|
+
createRouter: CreateRouter<ResolveWith>;
|
|
7
|
+
}): <T extends ResolveProps>(next: (props: ServerProps) => Promise<T>) => (props: ServerProps) => Promise<T & {
|
|
8
|
+
matchedRoutes: Route<ResolveWith, any>[];
|
|
9
|
+
router: RouteController<Route<ResolveWith, any>>;
|
|
10
|
+
app: JSX.Element;
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=router.server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.server.d.ts","sourceRoot":"","sources":["../../src/spouts/router.server.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAiB,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAIvE,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAIvE,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,WAAW,EAAE,OAAO,EAAE;IACxD,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,cAAc,EAAE,MAAM,WAAW,CAAC;IAClC,YAAY,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;CACzC,0CAeiB,WAAW,4BAEJ,WAAW;;;;GAkBnC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { IncomingMessage, ServerResponse } from 'http';
|
|
3
|
+
import { Request, Response } from 'express';
|
|
4
|
+
import type { StatsCompilation } from 'webpack';
|
|
5
|
+
import { History } from 'history';
|
|
6
|
+
import { Route, RouteController } from '@anansi/router';
|
|
7
|
+
export declare type ServerProps = {
|
|
8
|
+
req: Request | IncomingMessage;
|
|
9
|
+
res: Response | ServerResponse;
|
|
10
|
+
clientManifest: StatsCompilation;
|
|
11
|
+
};
|
|
12
|
+
export declare type ResolveProps = {
|
|
13
|
+
app: JSX.Element;
|
|
14
|
+
};
|
|
15
|
+
export declare type CreateRouter<T> = (history: History) => RouteController<Route<T, any>>;
|
|
16
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/spouts/types.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGxD,oBAAY,WAAW,GAAG;IACxB,GAAG,EAAE,OAAO,GAAG,eAAe,CAAC;IAC/B,GAAG,EAAE,QAAQ,GAAG,cAAc,CAAC;IAC/B,cAAc,EAAE,gBAAgB,CAAC;CAClC,CAAC;AAGF,oBAAY,YAAY,GAAG;IACzB,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC;CAClB,CAAC;AAEF,oBAAY,YAAY,CAAC,CAAC,IAAI,CAC5B,OAAO,EAAE,OAAO,KACb,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anansi/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "React 18 Framework",
|
|
5
5
|
"homepage": "https://github.com/ntucker/anansi/tree/master/packages/core#readme",
|
|
6
6
|
"repository": {
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
"README.md"
|
|
24
24
|
],
|
|
25
25
|
"bin": {
|
|
26
|
+
"serve-anansi": "./lib/scripts/serve.js",
|
|
26
27
|
"start-anansi": "./lib/scripts/startDevserver.js"
|
|
27
28
|
},
|
|
28
29
|
"sideEffects": false,
|
|
@@ -48,6 +49,10 @@
|
|
|
48
49
|
"require": "./dist/server.js",
|
|
49
50
|
"default": "./lib/index.server.js"
|
|
50
51
|
},
|
|
52
|
+
"./scripts": {
|
|
53
|
+
"types": "./lib/scripts/index.d.ts",
|
|
54
|
+
"default": "./lib/scripts/index.js"
|
|
55
|
+
},
|
|
51
56
|
"./package.json": "./package.json"
|
|
52
57
|
},
|
|
53
58
|
"keywords": [
|
|
@@ -60,28 +65,30 @@
|
|
|
60
65
|
"browser"
|
|
61
66
|
],
|
|
62
67
|
"devDependencies": {
|
|
63
|
-
"@anansi/babel-preset": "^3.2.
|
|
68
|
+
"@anansi/babel-preset": "^3.2.4",
|
|
64
69
|
"@anansi/browserslist-config": "1.3.3",
|
|
65
|
-
"@anansi/webpack-config": "^11.6.
|
|
70
|
+
"@anansi/webpack-config": "^11.6.4",
|
|
66
71
|
"@babel/cli": "7.17.10",
|
|
67
72
|
"@babel/core": "7.18.2",
|
|
73
|
+
"@types/compression": "^1.7.2",
|
|
68
74
|
"@types/source-map-support": "^0.5.4",
|
|
69
75
|
"@types/tmp": "^0.2.3",
|
|
70
76
|
"@types/webpack-hot-middleware": "^2.25.6",
|
|
71
|
-
"jest": "28.1.
|
|
77
|
+
"jest": "28.1.1",
|
|
72
78
|
"rimraf": "^3.0.0",
|
|
73
79
|
"webpack": "^5.72.1",
|
|
74
80
|
"webpack-cli": "^4.9.2"
|
|
75
81
|
},
|
|
76
82
|
"dependencies": {
|
|
77
|
-
"@anansi/router": "^0.
|
|
83
|
+
"@anansi/router": "^0.6.0",
|
|
78
84
|
"@babel/runtime": "^7.10.5",
|
|
79
|
-
"@rest-hooks/ssr": "^0.
|
|
85
|
+
"@rest-hooks/ssr": "^0.2.0",
|
|
80
86
|
"chalk": "^4.0.0",
|
|
87
|
+
"compression": "^1.7.4",
|
|
81
88
|
"cross-fetch": "^3.1.5",
|
|
82
|
-
"fs-
|
|
89
|
+
"fs-require": "^1.4.0",
|
|
83
90
|
"history": "^5.3.0",
|
|
84
|
-
"
|
|
91
|
+
"http-proxy-middleware": "^2.0.6",
|
|
85
92
|
"memfs": "^3.4.1",
|
|
86
93
|
"ora": "^5.0.0",
|
|
87
94
|
"redux": "^4.1.2",
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import {
|
|
2
|
+
RequestHandler,
|
|
3
|
+
ProxyConfigArray,
|
|
4
|
+
Response,
|
|
5
|
+
Request,
|
|
6
|
+
NextFunction,
|
|
7
|
+
ByPass,
|
|
8
|
+
ProxyConfigArrayItem,
|
|
9
|
+
ProxyConfigMap,
|
|
10
|
+
} from 'webpack-dev-server';
|
|
11
|
+
|
|
12
|
+
// Essentially taken from https://github.com/webpack/webpack-dev-server/blob/b5e5b67398f97c7a2934e12ebe34fb03cc06c473/lib/Server.js#L2123
|
|
13
|
+
export default function getProxyMiddlewares(
|
|
14
|
+
proxyConfig: ProxyConfigArrayItem | ProxyConfigMap | ProxyConfigArray,
|
|
15
|
+
) {
|
|
16
|
+
const middlewares: any[] = [];
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
18
|
+
const { createProxyMiddleware } = require('http-proxy-middleware');
|
|
19
|
+
|
|
20
|
+
const proxy: ProxyConfigArray =
|
|
21
|
+
!Array.isArray(proxyConfig) && typeof proxyConfig === 'object'
|
|
22
|
+
? Object.keys(proxyConfig).length &&
|
|
23
|
+
Object.keys(proxyConfig)[0].startsWith('/')
|
|
24
|
+
? Object.entries(proxyConfig).map(([path, v]) => ({ path, ...v }))
|
|
25
|
+
: [proxyConfig]
|
|
26
|
+
: proxyConfig;
|
|
27
|
+
|
|
28
|
+
const getProxyMiddleware = (
|
|
29
|
+
proxyConfig: ProxyConfigArrayItem,
|
|
30
|
+
): RequestHandler | undefined => {
|
|
31
|
+
// It is possible to use the `bypass` method without a `target` or `router`.
|
|
32
|
+
// However, the proxy middleware has no use in this case, and will fail to instantiate.
|
|
33
|
+
if (proxyConfig.target) {
|
|
34
|
+
const context = proxyConfig.context || proxyConfig.path;
|
|
35
|
+
|
|
36
|
+
return createProxyMiddleware(/** @type {string} */ context, proxyConfig);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (proxyConfig.router) {
|
|
40
|
+
return createProxyMiddleware(proxyConfig);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Assume a proxy configuration specified as:
|
|
46
|
+
* proxy: [
|
|
47
|
+
* {
|
|
48
|
+
* context: "value",
|
|
49
|
+
* ...options,
|
|
50
|
+
* },
|
|
51
|
+
* // or:
|
|
52
|
+
* function() {
|
|
53
|
+
* return {
|
|
54
|
+
* context: "context",
|
|
55
|
+
* ...options,
|
|
56
|
+
* };
|
|
57
|
+
* }
|
|
58
|
+
* ]
|
|
59
|
+
*/
|
|
60
|
+
proxy.forEach(proxyConfigOrCallback => {
|
|
61
|
+
let proxyMiddleware: RequestHandler | undefined;
|
|
62
|
+
|
|
63
|
+
let proxyConfig =
|
|
64
|
+
typeof proxyConfigOrCallback === 'function'
|
|
65
|
+
? proxyConfigOrCallback()
|
|
66
|
+
: proxyConfigOrCallback;
|
|
67
|
+
|
|
68
|
+
proxyMiddleware = getProxyMiddleware(proxyConfig);
|
|
69
|
+
|
|
70
|
+
/* TODO: figure out how to make this work
|
|
71
|
+
if (proxyConfig.ws) {
|
|
72
|
+
this.webSocketProxies.push(proxyMiddleware);
|
|
73
|
+
}
|
|
74
|
+
*/
|
|
75
|
+
|
|
76
|
+
const handler = async (req: Request, res: Response, next: NextFunction) => {
|
|
77
|
+
if (typeof proxyConfigOrCallback === 'function') {
|
|
78
|
+
const newProxyConfig = proxyConfigOrCallback(req, res, next);
|
|
79
|
+
|
|
80
|
+
if (newProxyConfig !== proxyConfig) {
|
|
81
|
+
proxyConfig = newProxyConfig;
|
|
82
|
+
proxyMiddleware = getProxyMiddleware(proxyConfig);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// - Check if we have a bypass function defined
|
|
87
|
+
// - In case the bypass function is defined we'll retrieve the
|
|
88
|
+
// bypassUrl from it otherwise bypassUrl would be null
|
|
89
|
+
// TODO remove in the next major in favor `context` and `router` options
|
|
90
|
+
const bypassUrl: ByPass | null =
|
|
91
|
+
typeof proxyConfig.bypass === 'function'
|
|
92
|
+
? await proxyConfig.bypass(req, res, proxyConfig)
|
|
93
|
+
: null;
|
|
94
|
+
|
|
95
|
+
if (typeof bypassUrl === 'boolean') {
|
|
96
|
+
// skip the proxy
|
|
97
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
98
|
+
// @ts-ignore
|
|
99
|
+
req.url = null;
|
|
100
|
+
next();
|
|
101
|
+
} else if (typeof bypassUrl === 'string') {
|
|
102
|
+
// byPass to that url
|
|
103
|
+
req.url = bypassUrl;
|
|
104
|
+
next();
|
|
105
|
+
} else if (proxyMiddleware) {
|
|
106
|
+
return proxyMiddleware(req, res, next);
|
|
107
|
+
} else {
|
|
108
|
+
next();
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
middlewares.push({
|
|
113
|
+
name: 'http-proxy-middleware',
|
|
114
|
+
middleware: handler,
|
|
115
|
+
});
|
|
116
|
+
// Also forward error requests to the proxy so it can handle them.
|
|
117
|
+
middlewares.push({
|
|
118
|
+
name: 'http-proxy-middleware-error-handler',
|
|
119
|
+
middleware: (
|
|
120
|
+
error: Error,
|
|
121
|
+
req: Request,
|
|
122
|
+
res: Response,
|
|
123
|
+
next: NextFunction,
|
|
124
|
+
) => handler(req, res, next),
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
return middlewares;
|
|
129
|
+
}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { promisify } from 'util';
|
|
4
|
+
import diskFs from 'fs';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import webpack, { web } from 'webpack';
|
|
7
|
+
import { Server, IncomingMessage, ServerResponse } from 'http';
|
|
8
|
+
import express, { NextFunction } from 'express';
|
|
9
|
+
import ora from 'ora';
|
|
10
|
+
import compress from 'compression';
|
|
11
|
+
|
|
12
|
+
import 'cross-fetch/polyfill';
|
|
13
|
+
import { Render } from './types';
|
|
14
|
+
import getProxyMiddlewares from './getProxyMiddlewares';
|
|
15
|
+
|
|
16
|
+
// run directly from node
|
|
17
|
+
if (require.main === module) {
|
|
18
|
+
const entrypoint = process.argv[2];
|
|
19
|
+
|
|
20
|
+
if (!entrypoint) {
|
|
21
|
+
console.log(`Usage: ${process.argv[0]} <server-entrypoint>`);
|
|
22
|
+
process.exit(-1);
|
|
23
|
+
}
|
|
24
|
+
serve(entrypoint);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export default function serve(
|
|
28
|
+
entrypoint: string,
|
|
29
|
+
options: { serveAssets?: boolean; serveProxy?: boolean } = {},
|
|
30
|
+
) {
|
|
31
|
+
const PORT = process.env.PORT || 8080;
|
|
32
|
+
|
|
33
|
+
const loader = ora('Initializing').start();
|
|
34
|
+
|
|
35
|
+
const webpackConfig: (
|
|
36
|
+
env: any,
|
|
37
|
+
argv: any,
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
39
|
+
) => webpack.Configuration = require(require.resolve(
|
|
40
|
+
// TODO: use normal resolution algorithm to find webpack file
|
|
41
|
+
path.join(process.cwd(), 'webpack.config'),
|
|
42
|
+
));
|
|
43
|
+
|
|
44
|
+
const manifestPath = getManifestPathFromWebpackconfig(
|
|
45
|
+
webpackConfig({}, { mode: 'production' }),
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
const readFile = promisify(diskFs.readFile);
|
|
49
|
+
let server: Server | undefined;
|
|
50
|
+
|
|
51
|
+
function handleErrors<
|
|
52
|
+
F extends (
|
|
53
|
+
req: Request | IncomingMessage,
|
|
54
|
+
res: Response | ServerResponse,
|
|
55
|
+
) => Promise<void>,
|
|
56
|
+
>(fn: F) {
|
|
57
|
+
return async function (
|
|
58
|
+
req: Request | IncomingMessage,
|
|
59
|
+
res: Response | ServerResponse,
|
|
60
|
+
next: NextFunction,
|
|
61
|
+
) {
|
|
62
|
+
try {
|
|
63
|
+
return await fn(req, res);
|
|
64
|
+
} catch (x) {
|
|
65
|
+
next(x);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Start the express server after the first compilation
|
|
71
|
+
function initializeApp(clientManifest: webpack.StatsCompilation) {
|
|
72
|
+
loader.info('Launching server');
|
|
73
|
+
if (!clientManifest) {
|
|
74
|
+
loader.fail('Manifest not found');
|
|
75
|
+
// TODO: handle more gracefully
|
|
76
|
+
process.exit(-1);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const wrappingApp = express();
|
|
80
|
+
// eslint-disable-next-line
|
|
81
|
+
//@ts-ignore
|
|
82
|
+
wrappingApp.use(compress());
|
|
83
|
+
|
|
84
|
+
// ASSETS
|
|
85
|
+
if (options.serveAssets) {
|
|
86
|
+
wrappingApp.use(
|
|
87
|
+
async (
|
|
88
|
+
req: Request | IncomingMessage,
|
|
89
|
+
res: any,
|
|
90
|
+
next: NextFunction,
|
|
91
|
+
) => {
|
|
92
|
+
const filename =
|
|
93
|
+
req.url?.substr(
|
|
94
|
+
(process.env.WEBPACK_PUBLIC_PATH as string).length,
|
|
95
|
+
) ?? '';
|
|
96
|
+
const assetPath = path.join(
|
|
97
|
+
clientManifest.outputPath ?? '',
|
|
98
|
+
filename,
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
if (
|
|
102
|
+
diskFs.existsSync(assetPath) &&
|
|
103
|
+
!diskFs.lstatSync(assetPath).isDirectory()
|
|
104
|
+
) {
|
|
105
|
+
try {
|
|
106
|
+
const fileContent = (await readFile(assetPath)).toString();
|
|
107
|
+
res.contentType(filename);
|
|
108
|
+
res.send(fileContent);
|
|
109
|
+
} catch (e) {
|
|
110
|
+
return next();
|
|
111
|
+
}
|
|
112
|
+
} else {
|
|
113
|
+
next();
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// PROXIES
|
|
120
|
+
if (options.serveProxy) {
|
|
121
|
+
const devConfig: webpack.Configuration = webpackConfig(
|
|
122
|
+
{},
|
|
123
|
+
{ mode: 'development' },
|
|
124
|
+
);
|
|
125
|
+
if (devConfig.devServer?.proxy) {
|
|
126
|
+
const middlewares = getProxyMiddlewares(devConfig.devServer?.proxy);
|
|
127
|
+
if (middlewares) {
|
|
128
|
+
wrappingApp.use(...middlewares.map(({ middleware }) => middleware));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// SERVER SIDE RENDERING
|
|
134
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
135
|
+
const render: Render = require(path.join(
|
|
136
|
+
process.cwd(),
|
|
137
|
+
entrypoint,
|
|
138
|
+
)).default;
|
|
139
|
+
|
|
140
|
+
wrappingApp.get(
|
|
141
|
+
'/*',
|
|
142
|
+
handleErrors(async function (req: any, res: any) {
|
|
143
|
+
if (req.url.endsWith('favicon.ico')) {
|
|
144
|
+
res.statusCode = 404;
|
|
145
|
+
res.setHeader('Content-type', 'text/html');
|
|
146
|
+
res.send('not found');
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
res.socket.on('error', (error: unknown) => {
|
|
150
|
+
console.error('Fatal', error);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
await render(clientManifest, req, res);
|
|
154
|
+
}),
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
server = wrappingApp
|
|
158
|
+
.listen(PORT, () => {
|
|
159
|
+
loader.info(`Listening at ${PORT}...`);
|
|
160
|
+
})
|
|
161
|
+
.on('error', function (error: any) {
|
|
162
|
+
if (error.syscall !== 'listen') {
|
|
163
|
+
throw error;
|
|
164
|
+
}
|
|
165
|
+
const isPipe = (portOrPipe: string | number) =>
|
|
166
|
+
Number.isNaN(portOrPipe);
|
|
167
|
+
const bind = isPipe(PORT) ? 'Pipe ' + PORT : 'Port ' + PORT;
|
|
168
|
+
switch (error.code) {
|
|
169
|
+
case 'EACCES':
|
|
170
|
+
loader.fail(bind + ' requires elevated privileges');
|
|
171
|
+
process.exit(1);
|
|
172
|
+
// eslint-disable-next-line no-fallthrough
|
|
173
|
+
case 'EADDRINUSE':
|
|
174
|
+
loader.fail(bind + ' is already in use');
|
|
175
|
+
process.exit(1);
|
|
176
|
+
// eslint-disable-next-line no-fallthrough
|
|
177
|
+
default:
|
|
178
|
+
throw error;
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
184
|
+
initializeApp(require(manifestPath));
|
|
185
|
+
|
|
186
|
+
process.on('SIGINT', () => {
|
|
187
|
+
loader.warn('Received SIGINT, devserver shutting down');
|
|
188
|
+
if (server) console.log('Closing server');
|
|
189
|
+
server?.close(() => {
|
|
190
|
+
loader.info('Server closed');
|
|
191
|
+
});
|
|
192
|
+
process.exit(-1);
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function getManifestPathFromWebpackconfig(
|
|
197
|
+
webpackConfig: webpack.Configuration,
|
|
198
|
+
) {
|
|
199
|
+
const manifestFilename: string =
|
|
200
|
+
(
|
|
201
|
+
webpackConfig?.plugins?.find(plugin => {
|
|
202
|
+
return plugin.constructor.name === 'StatsWriterPlugin';
|
|
203
|
+
}) as any
|
|
204
|
+
)?.opts?.filename ?? 'manifest.json';
|
|
205
|
+
|
|
206
|
+
const manifestPath = path.join(
|
|
207
|
+
webpackConfig?.output?.path ?? '',
|
|
208
|
+
manifestFilename,
|
|
209
|
+
);
|
|
210
|
+
return manifestPath;
|
|
211
|
+
}
|