@trackunit/iris-app-build-utilities 1.12.42 → 1.12.43
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 +4 -0
- package/package.json +1 -1
- package/src/createInvokeProxyMiddleware.d.ts +13 -0
- package/src/createInvokeProxyMiddleware.js +67 -0
- package/src/createInvokeProxyMiddleware.js.map +1 -0
- package/src/getIrisAppDevServer.js +2 -55
- package/src/getIrisAppDevServer.js.map +1 -1
- package/src/index.d.ts +1 -0
- package/src/index.js +1 -0
- package/src/index.js.map +1 -1
package/CHANGELOG.md
CHANGED
package/package.json
CHANGED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import type { ServerlessPortMap } from "./spawnServerlessExtensions";
|
|
3
|
+
type MiddlewareRequest = IncomingMessage & {
|
|
4
|
+
originalUrl?: string;
|
|
5
|
+
};
|
|
6
|
+
type MiddlewareResponse = ServerResponse<IncomingMessage>;
|
|
7
|
+
type MiddlewareNext = () => void;
|
|
8
|
+
type ProxyHandler = (req: MiddlewareRequest, res: MiddlewareResponse, next: MiddlewareNext) => void;
|
|
9
|
+
/**
|
|
10
|
+
* Creates /invoke middleware that routes to local serverless processes when available.
|
|
11
|
+
*/
|
|
12
|
+
export declare const createInvokeProxyMiddleware: (serverlessPortMap: ServerlessPortMap | undefined) => ProxyHandler;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createInvokeProxyMiddleware = void 0;
|
|
4
|
+
const http_proxy_middleware_1 = require("http-proxy-middleware");
|
|
5
|
+
const devServerUtils_1 = require("./devServerUtils");
|
|
6
|
+
const consoleUtils_1 = require("./plugin-shared/consoleUtils");
|
|
7
|
+
const createRemoteIrisProxy = () => {
|
|
8
|
+
const proxy = (0, http_proxy_middleware_1.createProxyMiddleware)({
|
|
9
|
+
target: "https://dev.iris.trackunit.app",
|
|
10
|
+
changeOrigin: true,
|
|
11
|
+
secure: true,
|
|
12
|
+
});
|
|
13
|
+
return (req, res, next) => {
|
|
14
|
+
void proxy(req, res, next);
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
const createLocalExtensionProxy = (target, extensionId) => {
|
|
18
|
+
const proxy = (0, http_proxy_middleware_1.createProxyMiddleware)({
|
|
19
|
+
target,
|
|
20
|
+
changeOrigin: true,
|
|
21
|
+
pathRewrite: path => (0, devServerUtils_1.extractEndpointPath)(path),
|
|
22
|
+
on: {
|
|
23
|
+
error: (err, _proxyReq, proxyRes) => {
|
|
24
|
+
(0, consoleUtils_1.logError)(`[Proxy] Error proxying to ${extensionId}: ${err.message}`);
|
|
25
|
+
if ("writeHead" in proxyRes && "end" in proxyRes) {
|
|
26
|
+
proxyRes.writeHead(502, { "Content-Type": "application/json" });
|
|
27
|
+
proxyRes.end(JSON.stringify({ error: `Serverless extension ${extensionId} unavailable` }));
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
return (req, res, next) => {
|
|
33
|
+
void proxy(req, res, next);
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
const getOrCreateLocalProxy = (cache, extensionId, port) => {
|
|
37
|
+
const existing = cache.get(extensionId);
|
|
38
|
+
if (existing !== undefined) {
|
|
39
|
+
return existing;
|
|
40
|
+
}
|
|
41
|
+
const target = (0, devServerUtils_1.buildLocalTarget)(port);
|
|
42
|
+
const newProxy = createLocalExtensionProxy(target, extensionId);
|
|
43
|
+
cache.set(extensionId, newProxy);
|
|
44
|
+
return newProxy;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Creates /invoke middleware that routes to local serverless processes when available.
|
|
48
|
+
*/
|
|
49
|
+
const createInvokeProxyMiddleware = (serverlessPortMap) => {
|
|
50
|
+
const localProxyCache = new Map();
|
|
51
|
+
const remoteProxy = createRemoteIrisProxy();
|
|
52
|
+
return (req, res, next) => {
|
|
53
|
+
const fullPath = req.originalUrl ?? `/invoke${req.url ?? ""}`;
|
|
54
|
+
const extensionId = (0, devServerUtils_1.parseExtensionIdFromPath)(fullPath);
|
|
55
|
+
const localPort = (0, devServerUtils_1.getLocalPort)(extensionId, serverlessPortMap);
|
|
56
|
+
if (localPort !== undefined && extensionId !== undefined) {
|
|
57
|
+
const endpointPath = (0, devServerUtils_1.extractEndpointPath)(fullPath);
|
|
58
|
+
(0, consoleUtils_1.logInfo)(`[Proxy] ${fullPath} -> ${(0, devServerUtils_1.buildLocalTarget)(localPort)}${endpointPath}`);
|
|
59
|
+
const proxy = getOrCreateLocalProxy(localProxyCache, extensionId, localPort);
|
|
60
|
+
proxy(req, res, next);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
remoteProxy(req, res, next);
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
exports.createInvokeProxyMiddleware = createInvokeProxyMiddleware;
|
|
67
|
+
//# sourceMappingURL=createInvokeProxyMiddleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createInvokeProxyMiddleware.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/createInvokeProxyMiddleware.ts"],"names":[],"mappings":"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","sourcesContent":["import { createProxyMiddleware } from \"http-proxy-middleware\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { buildLocalTarget, extractEndpointPath, getLocalPort, parseExtensionIdFromPath } from \"./devServerUtils\";\nimport { logError, logInfo } from \"./plugin-shared/consoleUtils\";\nimport type { ServerlessPortMap } from \"./spawnServerlessExtensions\";\n\ntype MiddlewareRequest = IncomingMessage & {\n originalUrl?: string;\n};\ntype MiddlewareResponse = ServerResponse<IncomingMessage>;\n\ntype MiddlewareNext = () => void;\ntype ProxyHandler = (req: MiddlewareRequest, res: MiddlewareResponse, next: MiddlewareNext) => void;\n\nconst createRemoteIrisProxy = (): ProxyHandler => {\n const proxy = createProxyMiddleware({\n target: \"https://dev.iris.trackunit.app\",\n changeOrigin: true,\n secure: true,\n });\n return (req, res, next) => {\n void proxy(req, res, next);\n };\n};\n\nconst createLocalExtensionProxy = (target: string, extensionId: string): ProxyHandler => {\n const proxy = createProxyMiddleware({\n target,\n changeOrigin: true,\n pathRewrite: path => extractEndpointPath(path),\n on: {\n error: (err, _proxyReq, proxyRes) => {\n logError(`[Proxy] Error proxying to ${extensionId}: ${err.message}`);\n if (\"writeHead\" in proxyRes && \"end\" in proxyRes) {\n proxyRes.writeHead(502, { \"Content-Type\": \"application/json\" });\n proxyRes.end(JSON.stringify({ error: `Serverless extension ${extensionId} unavailable` }));\n }\n },\n },\n });\n\n return (req, res, next) => {\n void proxy(req, res, next);\n };\n};\n\nconst getOrCreateLocalProxy = (cache: Map<string, ProxyHandler>, extensionId: string, port: number): ProxyHandler => {\n const existing = cache.get(extensionId);\n if (existing !== undefined) {\n return existing;\n }\n\n const target = buildLocalTarget(port);\n const newProxy = createLocalExtensionProxy(target, extensionId);\n cache.set(extensionId, newProxy);\n return newProxy;\n};\n\n/**\n * Creates /invoke middleware that routes to local serverless processes when available.\n */\nexport const createInvokeProxyMiddleware = (serverlessPortMap: ServerlessPortMap | undefined): ProxyHandler => {\n const localProxyCache = new Map<string, ProxyHandler>();\n const remoteProxy = createRemoteIrisProxy();\n\n return (req: MiddlewareRequest, res: MiddlewareResponse, next: MiddlewareNext): void => {\n const fullPath = req.originalUrl ?? `/invoke${req.url ?? \"\"}`;\n const extensionId = parseExtensionIdFromPath(fullPath);\n const localPort = getLocalPort(extensionId, serverlessPortMap);\n\n if (localPort !== undefined && extensionId !== undefined) {\n const endpointPath = extractEndpointPath(fullPath);\n logInfo(`[Proxy] ${fullPath} -> ${buildLocalTarget(localPort)}${endpointPath}`);\n\n const proxy = getOrCreateLocalProxy(localProxyCache, extensionId, localPort);\n proxy(req, res, next);\n return;\n }\n\n remoteProxy(req, res, next);\n };\n};\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getIrisAppRspackDevServer = exports.getIrisAppWebpackDevServer = void 0;
|
|
4
|
-
const
|
|
4
|
+
const createInvokeProxyMiddleware_1 = require("./createInvokeProxyMiddleware");
|
|
5
5
|
const devServerUtils_1 = require("./devServerUtils");
|
|
6
6
|
const getAvailablePort_1 = require("./getAvailablePort");
|
|
7
7
|
/** Sets CORS headers on the response. */
|
|
@@ -9,57 +9,6 @@ const setCorsHeaders = (response, headers) => {
|
|
|
9
9
|
response.header("Access-Control-Allow-Origin", (0, devServerUtils_1.getOrigin)(headers));
|
|
10
10
|
response.header("Access-Control-Allow-Headers", devServerUtils_1.CORS_ALLOWED_HEADERS);
|
|
11
11
|
};
|
|
12
|
-
/** Creates a proxy for the remote Iris platform (used when extension is not running locally). */
|
|
13
|
-
const createRemoteIrisProxy = () => (0, http_proxy_middleware_1.createProxyMiddleware)({
|
|
14
|
-
target: "https://dev.iris.trackunit.app",
|
|
15
|
-
changeOrigin: true,
|
|
16
|
-
secure: true,
|
|
17
|
-
});
|
|
18
|
-
/** Creates a proxy for a local serverless extension. */
|
|
19
|
-
const createLocalExtensionProxy = (target, extensionId) => (0, http_proxy_middleware_1.createProxyMiddleware)({
|
|
20
|
-
target,
|
|
21
|
-
changeOrigin: true,
|
|
22
|
-
pathRewrite: path => (0, devServerUtils_1.extractEndpointPath)(path),
|
|
23
|
-
on: {
|
|
24
|
-
error: (err, _proxyReq, proxyRes) => {
|
|
25
|
-
// eslint-disable-next-line no-console
|
|
26
|
-
console.error(`[Proxy] Error proxying to ${extensionId}:`, err.message);
|
|
27
|
-
if ("writeHead" in proxyRes) {
|
|
28
|
-
proxyRes.writeHead(502, { "Content-Type": "application/json" });
|
|
29
|
-
proxyRes.end(JSON.stringify({ error: `Serverless extension ${extensionId} unavailable` }));
|
|
30
|
-
}
|
|
31
|
-
},
|
|
32
|
-
},
|
|
33
|
-
});
|
|
34
|
-
/** Gets or creates a cached proxy for a local extension. */
|
|
35
|
-
const getOrCreateLocalProxy = (cache, extensionId, port) => {
|
|
36
|
-
const existing = cache.get(extensionId);
|
|
37
|
-
if (existing !== undefined) {
|
|
38
|
-
return existing;
|
|
39
|
-
}
|
|
40
|
-
const target = (0, devServerUtils_1.buildLocalTarget)(port);
|
|
41
|
-
const newProxy = createLocalExtensionProxy(target, extensionId);
|
|
42
|
-
cache.set(extensionId, newProxy);
|
|
43
|
-
return newProxy;
|
|
44
|
-
};
|
|
45
|
-
/** Creates the /invoke proxy middleware that routes to local or remote extensions. */
|
|
46
|
-
const createInvokeProxyHandler = (serverlessPortMap, localProxyCache, remoteProxy) => {
|
|
47
|
-
return (req, res, next) => {
|
|
48
|
-
const fullPath = req.originalUrl ?? `/invoke${req.url ?? ""}`;
|
|
49
|
-
const extensionId = (0, devServerUtils_1.parseExtensionIdFromPath)(fullPath);
|
|
50
|
-
const localPort = (0, devServerUtils_1.getLocalPort)(extensionId, serverlessPortMap);
|
|
51
|
-
if (localPort !== undefined && extensionId !== undefined) {
|
|
52
|
-
const endpointPath = (0, devServerUtils_1.extractEndpointPath)(fullPath);
|
|
53
|
-
// eslint-disable-next-line no-console
|
|
54
|
-
console.log(`[Proxy] ${fullPath} -> ${(0, devServerUtils_1.buildLocalTarget)(localPort)}${endpointPath}`);
|
|
55
|
-
const proxy = getOrCreateLocalProxy(localProxyCache, extensionId, localPort);
|
|
56
|
-
proxy(req, res, next);
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
remoteProxy(req, res, next);
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
};
|
|
63
12
|
/** CORS preflight middleware - responds to non-GET requests with allowed methods. */
|
|
64
13
|
const corsPreflightMiddleware = (req, res, next) => {
|
|
65
14
|
if (req.method === "GET") {
|
|
@@ -115,10 +64,8 @@ const createExtensionLoaderHandler = () => {
|
|
|
115
64
|
};
|
|
116
65
|
/** Registers all middlewares on the dev server app. */
|
|
117
66
|
const registerMiddlewares = (app, middlewares, port, options) => {
|
|
118
|
-
const localProxyCache = new Map();
|
|
119
|
-
const remoteProxy = createRemoteIrisProxy();
|
|
120
67
|
// Register /invoke proxy
|
|
121
|
-
app.use("/invoke",
|
|
68
|
+
app.use("/invoke", (0, createInvokeProxyMiddleware_1.createInvokeProxyMiddleware)(options.serverlessPortMap));
|
|
122
69
|
// Register CORS origin handler on all routes
|
|
123
70
|
app.use("/", createCorsOriginHandler());
|
|
124
71
|
// Register endpoint handlers
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getIrisAppDevServer.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/getIrisAppDevServer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DevServer as RspackDevServer } from \"@rspack/core\";\nimport { createProxyMiddleware } from \"http-proxy-middleware\";\nimport type { Configuration as WebpackDevServerConfiguration } from \"webpack-dev-server\";\nimport {\n buildLocalTarget,\n CORS_ALLOWED_HEADERS,\n CORS_HEADERS,\n extractEndpointPath,\n getLocalPort,\n getOrigin,\n IRIS_APP_PORT_MAX,\n IRIS_APP_PORT_MIN,\n parseExtensionIdFromPath,\n} from \"./devServerUtils\";\nimport { getAvailablePort } from \"./getAvailablePort\";\nimport type { ServerlessPortMap } from \"./spawnServerlessExtensions\";\n\nexport interface DevServerOptions {\n serverlessPortMap?: ServerlessPortMap;\n}\n\ntype MiddlewareRequest = {\n url?: string;\n originalUrl?: string;\n method?: string;\n headers: { origin?: string } & Record<string, string | undefined>;\n};\n\ntype MiddlewareResponse = {\n header: (name: string, value: string) => void;\n writeHead: (status: number, headers?: Record<string, string>) => void;\n end: (body?: string) => void;\n send: (body: unknown) => void;\n status: (code: number) => void;\n};\n\ntype MiddlewareNext = () => void;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- http-proxy-middleware types are complex\ntype ProxyHandler = (req: any, res: any, next: MiddlewareNext) => void;\n\ntype DevServerApp = { use: (path: string, handler: unknown) => void };\n\ntype MiddlewareEntry = { name?: string; path?: string; middleware: unknown };\n\n/** Sets CORS headers on the response. */\nconst setCorsHeaders = (response: Pick<MiddlewareResponse, \"header\">, headers: { origin?: string }): void => {\n response.header(\"Access-Control-Allow-Origin\", getOrigin(headers));\n response.header(\"Access-Control-Allow-Headers\", CORS_ALLOWED_HEADERS);\n};\n\n/** Creates a proxy for the remote Iris platform (used when extension is not running locally). */\nconst createRemoteIrisProxy = (): ProxyHandler =>\n createProxyMiddleware({\n target: \"https://dev.iris.trackunit.app\",\n changeOrigin: true,\n secure: true,\n });\n\n/** Creates a proxy for a local serverless extension. */\nconst createLocalExtensionProxy = (target: string, extensionId: string): ProxyHandler =>\n createProxyMiddleware({\n target,\n changeOrigin: true,\n pathRewrite: path => extractEndpointPath(path),\n on: {\n error: (err, _proxyReq, proxyRes) => {\n // eslint-disable-next-line no-console\n console.error(`[Proxy] Error proxying to ${extensionId}:`, err.message);\n if (\"writeHead\" in proxyRes) {\n proxyRes.writeHead(502, { \"Content-Type\": \"application/json\" });\n proxyRes.end(JSON.stringify({ error: `Serverless extension ${extensionId} unavailable` }));\n }\n },\n },\n });\n\n/** Gets or creates a cached proxy for a local extension. */\nconst getOrCreateLocalProxy = (cache: Map<string, ProxyHandler>, extensionId: string, port: number): ProxyHandler => {\n const existing = cache.get(extensionId);\n if (existing !== undefined) {\n return existing;\n }\n\n const target = buildLocalTarget(port);\n const newProxy = createLocalExtensionProxy(target, extensionId);\n cache.set(extensionId, newProxy);\n return newProxy;\n};\n\n/** Creates the /invoke proxy middleware that routes to local or remote extensions. */\nconst createInvokeProxyHandler = (\n serverlessPortMap: ServerlessPortMap | undefined,\n localProxyCache: Map<string, ProxyHandler>,\n remoteProxy: ProxyHandler\n) => {\n return (req: MiddlewareRequest, res: MiddlewareResponse, next: MiddlewareNext): void => {\n const fullPath = req.originalUrl ?? `/invoke${req.url ?? \"\"}`;\n const extensionId = parseExtensionIdFromPath(fullPath);\n const localPort = getLocalPort(extensionId, serverlessPortMap);\n\n if (localPort !== undefined && extensionId !== undefined) {\n const endpointPath = extractEndpointPath(fullPath);\n // eslint-disable-next-line no-console\n console.log(`[Proxy] ${fullPath} -> ${buildLocalTarget(localPort)}${endpointPath}`);\n\n const proxy = getOrCreateLocalProxy(localProxyCache, extensionId, localPort);\n proxy(req, res, next);\n } else {\n remoteProxy(req, res, next);\n }\n };\n};\n\n/** CORS preflight middleware - responds to non-GET requests with allowed methods. */\nconst corsPreflightMiddleware = (\n req: Pick<MiddlewareRequest, \"method\">,\n res: Pick<MiddlewareResponse, \"end\">,\n next: MiddlewareNext\n): void => {\n if (req.method === \"GET\") {\n next();\n } else {\n res.end(\"GET, HEAD\");\n }\n};\n\n/** CORS origin header middleware - sets Access-Control-Allow-Origin on all requests. */\nconst createCorsOriginHandler = () => {\n return (\n request: Pick<MiddlewareRequest, \"headers\">,\n response: Pick<MiddlewareResponse, \"header\">,\n next: MiddlewareNext\n ): void => {\n response.header(\"Access-Control-Allow-Origin\", getOrigin(request.headers));\n next();\n };\n};\n\n/** Creates the /manifestAndToken endpoint handler. */\nconst createManifestAndTokenHandler = (port: number) => {\n return async (\n request: Pick<MiddlewareRequest, \"headers\">,\n response: Pick<MiddlewareResponse, \"header\" | \"send\" | \"status\">\n ): Promise<void> => {\n setCorsHeaders(response, request.headers);\n try {\n const resp = await fetch(`http://localhost:${port}/manifest.json`);\n const body = await resp.json();\n response.send({ manifest: body });\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(\"ERROR: \", e);\n response.status(500);\n response.send(e);\n }\n };\n};\n\n/** Creates the /extensionloader.js endpoint handler. */\nconst createExtensionLoaderHandler = () => {\n return async (\n request: Pick<MiddlewareRequest, \"headers\">,\n response: Pick<MiddlewareResponse, \"header\" | \"send\" | \"status\">\n ): Promise<void> => {\n setCorsHeaders(response, request.headers);\n try {\n const url =\n process.env.LOCAL === \"true\"\n ? \"http://localhost:3000/extensionloader.js\"\n : \"https://iris.trackunit.app/extensionloader.js\";\n const resp = await fetch(url);\n const body = await resp.text();\n response.send(body);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(\"ERROR: \", e);\n response.status(500);\n response.send(e);\n }\n };\n};\n\n/** Registers all middlewares on the dev server app. */\nconst registerMiddlewares = (\n app: DevServerApp,\n middlewares: Array<MiddlewareEntry>,\n port: number,\n options: DevServerOptions\n): Array<MiddlewareEntry> => {\n const localProxyCache = new Map<string, ProxyHandler>();\n const remoteProxy = createRemoteIrisProxy();\n\n // Register /invoke proxy\n app.use(\"/invoke\", createInvokeProxyHandler(options.serverlessPortMap, localProxyCache, remoteProxy));\n\n // Register CORS origin handler on all routes\n app.use(\"/\", createCorsOriginHandler());\n\n // Register endpoint handlers\n app.use(\"/manifestAndToken\", createManifestAndTokenHandler(port));\n app.use(\"/extensionloader.js\", createExtensionLoaderHandler());\n\n // Add CORS preflight to middleware array\n middlewares.push({\n name: \"cors-preflight\",\n path: \"/\",\n middleware: corsPreflightMiddleware,\n });\n\n return middlewares;\n};\n\n/** Creates the base Iris App dev server configuration. */\nconst createIrisAppDevServerConfig = async (port: number, options: DevServerOptions = {}) => ({\n port,\n historyApiFallback: true,\n headers: CORS_HEADERS,\n onListening: () => {},\n setupMiddlewares: (middlewares: Array<MiddlewareEntry>, devServer: { app?: DevServerApp }) => {\n if (devServer.app) {\n return registerMiddlewares(devServer.app, middlewares, port, options);\n }\n return middlewares;\n },\n});\n\n/** Generates a dev server configuration for webpack. */\nexport const getIrisAppWebpackDevServer = async (\n webpackDevServerConfiguration: WebpackDevServerConfiguration = {},\n options: DevServerOptions = {}\n): Promise<WebpackDevServerConfiguration> => {\n const port = await getAvailablePort(IRIS_APP_PORT_MIN, IRIS_APP_PORT_MAX);\n const baseConfig = await createIrisAppDevServerConfig(port, options);\n\n // Type assertion required: webpack-dev-server and rspack have nominally different but\n // structurally identical DevServer types. This is a known limitation acknowledged by\n // the rspack team. See: https://github.com/web-infra-dev/rspack/blob/main/packages/rspack-dev-server/src/server.ts\n // eslint-disable-next-line local-rules/no-typescript-assertion\n return { ...baseConfig, ...webpackDevServerConfiguration } as unknown as WebpackDevServerConfiguration;\n};\n\n/** Generates a dev server configuration for rspack. */\nexport const getIrisAppRspackDevServer = async (\n rspackDevServerConfiguration: RspackDevServer = {},\n options: DevServerOptions = {}\n): Promise<RspackDevServer> => {\n const port = await getAvailablePort(IRIS_APP_PORT_MIN, IRIS_APP_PORT_MAX);\n const baseConfig = await createIrisAppDevServerConfig(port, options);\n\n // Type assertion required: webpack-dev-server and rspack have nominally different but\n // structurally identical DevServer types. This is a known limitation acknowledged by\n // the rspack team. See: https://github.com/web-infra-dev/rspack/blob/main/packages/rspack-dev-server/src/server.ts\n // eslint-disable-next-line local-rules/no-typescript-assertion\n return { ...baseConfig, ...rspackDevServerConfiguration } as unknown as RspackDevServer;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"getIrisAppDevServer.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/getIrisAppDevServer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DevServer as RspackDevServer } from \"@rspack/core\";\nimport type { Configuration as WebpackDevServerConfiguration } from \"webpack-dev-server\";\nimport { createInvokeProxyMiddleware } from \"./createInvokeProxyMiddleware\";\nimport { CORS_ALLOWED_HEADERS, CORS_HEADERS, getOrigin, IRIS_APP_PORT_MAX, IRIS_APP_PORT_MIN } from \"./devServerUtils\";\nimport { getAvailablePort } from \"./getAvailablePort\";\nimport type { ServerlessPortMap } from \"./spawnServerlessExtensions\";\n\nexport interface DevServerOptions {\n serverlessPortMap?: ServerlessPortMap;\n}\n\ntype MiddlewareRequest = {\n url?: string;\n originalUrl?: string;\n method?: string;\n headers: { origin?: string } & Record<string, string | undefined>;\n};\n\ntype MiddlewareResponse = {\n header: (name: string, value: string) => void;\n writeHead: (status: number, headers?: Record<string, string>) => void;\n end: (body?: string) => void;\n send: (body: unknown) => void;\n status: (code: number) => void;\n};\n\ntype MiddlewareNext = () => void;\n\ntype DevServerApp = { use: (path: string, handler: unknown) => void };\n\ntype MiddlewareEntry = { name?: string; path?: string; middleware: unknown };\n\n/** Sets CORS headers on the response. */\nconst setCorsHeaders = (response: Pick<MiddlewareResponse, \"header\">, headers: { origin?: string }): void => {\n response.header(\"Access-Control-Allow-Origin\", getOrigin(headers));\n response.header(\"Access-Control-Allow-Headers\", CORS_ALLOWED_HEADERS);\n};\n\n/** CORS preflight middleware - responds to non-GET requests with allowed methods. */\nconst corsPreflightMiddleware = (\n req: Pick<MiddlewareRequest, \"method\">,\n res: Pick<MiddlewareResponse, \"end\">,\n next: MiddlewareNext\n): void => {\n if (req.method === \"GET\") {\n next();\n } else {\n res.end(\"GET, HEAD\");\n }\n};\n\n/** CORS origin header middleware - sets Access-Control-Allow-Origin on all requests. */\nconst createCorsOriginHandler = () => {\n return (\n request: Pick<MiddlewareRequest, \"headers\">,\n response: Pick<MiddlewareResponse, \"header\">,\n next: MiddlewareNext\n ): void => {\n response.header(\"Access-Control-Allow-Origin\", getOrigin(request.headers));\n next();\n };\n};\n\n/** Creates the /manifestAndToken endpoint handler. */\nconst createManifestAndTokenHandler = (port: number) => {\n return async (\n request: Pick<MiddlewareRequest, \"headers\">,\n response: Pick<MiddlewareResponse, \"header\" | \"send\" | \"status\">\n ): Promise<void> => {\n setCorsHeaders(response, request.headers);\n try {\n const resp = await fetch(`http://localhost:${port}/manifest.json`);\n const body = await resp.json();\n response.send({ manifest: body });\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(\"ERROR: \", e);\n response.status(500);\n response.send(e);\n }\n };\n};\n\n/** Creates the /extensionloader.js endpoint handler. */\nconst createExtensionLoaderHandler = () => {\n return async (\n request: Pick<MiddlewareRequest, \"headers\">,\n response: Pick<MiddlewareResponse, \"header\" | \"send\" | \"status\">\n ): Promise<void> => {\n setCorsHeaders(response, request.headers);\n try {\n const url =\n process.env.LOCAL === \"true\"\n ? \"http://localhost:3000/extensionloader.js\"\n : \"https://iris.trackunit.app/extensionloader.js\";\n const resp = await fetch(url);\n const body = await resp.text();\n response.send(body);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(\"ERROR: \", e);\n response.status(500);\n response.send(e);\n }\n };\n};\n\n/** Registers all middlewares on the dev server app. */\nconst registerMiddlewares = (\n app: DevServerApp,\n middlewares: Array<MiddlewareEntry>,\n port: number,\n options: DevServerOptions\n): Array<MiddlewareEntry> => {\n // Register /invoke proxy\n app.use(\"/invoke\", createInvokeProxyMiddleware(options.serverlessPortMap));\n\n // Register CORS origin handler on all routes\n app.use(\"/\", createCorsOriginHandler());\n\n // Register endpoint handlers\n app.use(\"/manifestAndToken\", createManifestAndTokenHandler(port));\n app.use(\"/extensionloader.js\", createExtensionLoaderHandler());\n\n // Add CORS preflight to middleware array\n middlewares.push({\n name: \"cors-preflight\",\n path: \"/\",\n middleware: corsPreflightMiddleware,\n });\n\n return middlewares;\n};\n\n/** Creates the base Iris App dev server configuration. */\nconst createIrisAppDevServerConfig = async (port: number, options: DevServerOptions = {}) => ({\n port,\n historyApiFallback: true,\n headers: CORS_HEADERS,\n onListening: () => {},\n setupMiddlewares: (middlewares: Array<MiddlewareEntry>, devServer: { app?: DevServerApp }) => {\n if (devServer.app) {\n return registerMiddlewares(devServer.app, middlewares, port, options);\n }\n return middlewares;\n },\n});\n\n/** Generates a dev server configuration for webpack. */\nexport const getIrisAppWebpackDevServer = async (\n webpackDevServerConfiguration: WebpackDevServerConfiguration = {},\n options: DevServerOptions = {}\n): Promise<WebpackDevServerConfiguration> => {\n const port = await getAvailablePort(IRIS_APP_PORT_MIN, IRIS_APP_PORT_MAX);\n const baseConfig = await createIrisAppDevServerConfig(port, options);\n\n // Type assertion required: webpack-dev-server and rspack have nominally different but\n // structurally identical DevServer types. This is a known limitation acknowledged by\n // the rspack team. See: https://github.com/web-infra-dev/rspack/blob/main/packages/rspack-dev-server/src/server.ts\n // eslint-disable-next-line local-rules/no-typescript-assertion\n return { ...baseConfig, ...webpackDevServerConfiguration } as unknown as WebpackDevServerConfiguration;\n};\n\n/** Generates a dev server configuration for rspack. */\nexport const getIrisAppRspackDevServer = async (\n rspackDevServerConfiguration: RspackDevServer = {},\n options: DevServerOptions = {}\n): Promise<RspackDevServer> => {\n const port = await getAvailablePort(IRIS_APP_PORT_MIN, IRIS_APP_PORT_MAX);\n const baseConfig = await createIrisAppDevServerConfig(port, options);\n\n // Type assertion required: webpack-dev-server and rspack have nominally different but\n // structurally identical DevServer types. This is a known limitation acknowledged by\n // the rspack team. See: https://github.com/web-infra-dev/rspack/blob/main/packages/rspack-dev-server/src/server.ts\n // eslint-disable-next-line local-rules/no-typescript-assertion\n return { ...baseConfig, ...rspackDevServerConfiguration } as unknown as RspackDevServer;\n};\n"]}
|
package/src/index.d.ts
CHANGED
package/src/index.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const tslib_1 = require("tslib");
|
|
4
4
|
tslib_1.__exportStar(require("./checkPackageVersion"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./createInvokeProxyMiddleware"), exports);
|
|
5
6
|
tslib_1.__exportStar(require("./enableTsConfigPath"), exports);
|
|
6
7
|
tslib_1.__exportStar(require("./getAliasesFromTsConfig"), exports);
|
|
7
8
|
tslib_1.__exportStar(require("./getAvailablePort"), exports);
|
package/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/index.ts"],"names":[],"mappings":";;;AAAA,gEAAsC;AACtC,+DAAqC;AACrC,mEAAyC;AACzC,6DAAmC;AACnC,4DAAkC;AAClC,iEAAuC;AACvC,oEAA0C;AAC1C,gEAAsC;AACtC,kEAAwC;AACxC,qEAA2C;AAC3C,uEAA6C;AAC7C,0EAAgD;AAChD,wEAA8C;AAC9C,wEAA8C;AAC9C,sEAA4C","sourcesContent":["export * from \"./checkPackageVersion\";\nexport * from \"./enableTsConfigPath\";\nexport * from \"./getAliasesFromTsConfig\";\nexport * from \"./getAvailablePort\";\nexport * from \"./getCopyPatterns\";\nexport * from \"./getExposedExtensions\";\nexport * from \"./getGraphqlCodeGenConfig\";\nexport * from \"./getIrisAppDevServer\";\nexport * from \"./getSharedDependencies\";\nexport * from \"./getTailwindContentForApp\";\nexport * from \"./plugin-shared/consoleUtils\";\nexport * from \"./plugin-shared/customFieldUtil\";\nexport * from \"./plugin-shared/extensionUtil\";\nexport * from \"./plugin-shared/indexHtmlUtil\";\nexport * from \"./spawnServerlessExtensions\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/index.ts"],"names":[],"mappings":";;;AAAA,gEAAsC;AACtC,wEAA8C;AAC9C,+DAAqC;AACrC,mEAAyC;AACzC,6DAAmC;AACnC,4DAAkC;AAClC,iEAAuC;AACvC,oEAA0C;AAC1C,gEAAsC;AACtC,kEAAwC;AACxC,qEAA2C;AAC3C,uEAA6C;AAC7C,0EAAgD;AAChD,wEAA8C;AAC9C,wEAA8C;AAC9C,sEAA4C","sourcesContent":["export * from \"./checkPackageVersion\";\nexport * from \"./createInvokeProxyMiddleware\";\nexport * from \"./enableTsConfigPath\";\nexport * from \"./getAliasesFromTsConfig\";\nexport * from \"./getAvailablePort\";\nexport * from \"./getCopyPatterns\";\nexport * from \"./getExposedExtensions\";\nexport * from \"./getGraphqlCodeGenConfig\";\nexport * from \"./getIrisAppDevServer\";\nexport * from \"./getSharedDependencies\";\nexport * from \"./getTailwindContentForApp\";\nexport * from \"./plugin-shared/consoleUtils\";\nexport * from \"./plugin-shared/customFieldUtil\";\nexport * from \"./plugin-shared/extensionUtil\";\nexport * from \"./plugin-shared/indexHtmlUtil\";\nexport * from \"./spawnServerlessExtensions\";\n"]}
|