Skip to content

Commit

Permalink
chore: working tests-example
Browse files Browse the repository at this point in the history
  • Loading branch information
magne4000 committed Jul 17, 2024
1 parent 5891cad commit 97e0042
Show file tree
Hide file tree
Showing 15 changed files with 267 additions and 88 deletions.
94 changes: 42 additions & 52 deletions examples/tool/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,64 +8,64 @@
],
"exports": {
"./dummy-handler": {
"types": "dist/dummy.d.ts",
"import": "dist/dummy.js",
"default": "dist/dummy.js"
"types": "./dist/dummy.d.ts",
"import": "./dist/dummy.js",
"default": "./dist/dummy.js"
},
"./middlewares/context-middleware": {
"types": "dist/middlewares/context.d.ts",
"import": "dist/middlewares/context.js",
"default": "dist/middlewares/context.js"
"types": "./dist/middlewares/context.d.ts",
"import": "./dist/middlewares/context.js",
"default": "./dist/middlewares/context.js"
},
"./middlewares/headers-middleware": {
"types": "dist/middlewares/headers.d.ts",
"import": "dist/middlewares/headers.js",
"default": "dist/middlewares/headers.js"
"types": "./dist/middlewares/headers.d.ts",
"import": "./dist/middlewares/headers.js",
"default": "./dist/middlewares/headers.js"
},
"./dummy-handler-hono": {
"types": "dist/handlers/universal-hono-handler-handler.d.ts",
"import": "dist/handlers/universal-hono-handler-handler.js",
"default": "dist/handlers/universal-hono-handler-handler.js"
"types": "./dist/handlers/universal-hono-handler-handler.d.ts",
"import": "./dist/handlers/universal-hono-handler-handler.js",
"default": "./dist/handlers/universal-hono-handler-handler.js"
},
"./dummy-handler-express": {
"types": "dist/handlers/universal-express-handler-handler.d.ts",
"import": "dist/handlers/universal-express-handler-handler.js",
"default": "dist/handlers/universal-express-handler-handler.js"
"types": "./dist/handlers/universal-express-handler-handler.d.ts",
"import": "./dist/handlers/universal-express-handler-handler.js",
"default": "./dist/handlers/universal-express-handler-handler.js"
},
"./dummy-handler-hattip": {
"types": "dist/handlers/universal-hattip-handler-handler.d.ts",
"import": "dist/handlers/universal-hattip-handler-handler.js",
"default": "dist/handlers/universal-hattip-handler-handler.js"
"types": "./dist/handlers/universal-hattip-handler-handler.d.ts",
"import": "./dist/handlers/universal-hattip-handler-handler.js",
"default": "./dist/handlers/universal-hattip-handler-handler.js"
},
"./middlewares/context-middleware-hono": {
"types": "dist/middlewares/universal-hono-middleware-context.middleware.d.ts",
"import": "dist/middlewares/universal-hono-middleware-context.middleware.js",
"default": "dist/middlewares/universal-hono-middleware-context.middleware.js"
"types": "./dist/middlewares/universal-hono-middleware-context.middleware.d.ts",
"import": "./dist/middlewares/universal-hono-middleware-context.middleware.js",
"default": "./dist/middlewares/universal-hono-middleware-context.middleware.js"
},
"./middlewares/context-middleware-express": {
"types": "dist/middlewares/universal-express-middleware-context.middleware.d.ts",
"import": "dist/middlewares/universal-express-middleware-context.middleware.js",
"default": "dist/middlewares/universal-express-middleware-context.middleware.js"
"types": "./dist/middlewares/universal-express-middleware-context.middleware.d.ts",
"import": "./dist/middlewares/universal-express-middleware-context.middleware.js",
"default": "./dist/middlewares/universal-express-middleware-context.middleware.js"
},
"./middlewares/context-middleware-hattip": {
"types": "dist/middlewares/universal-hattip-middleware-context.middleware.d.ts",
"import": "dist/middlewares/universal-hattip-middleware-context.middleware.js",
"default": "dist/middlewares/universal-hattip-middleware-context.middleware.js"
"types": "./dist/middlewares/universal-hattip-middleware-context.middleware.d.ts",
"import": "./dist/middlewares/universal-hattip-middleware-context.middleware.js",
"default": "./dist/middlewares/universal-hattip-middleware-context.middleware.js"
},
"./middlewares/headers-middleware-hono": {
"types": "dist/middlewares/universal-hono-middleware-headers.middleware.d.ts",
"import": "dist/middlewares/universal-hono-middleware-headers.middleware.js",
"default": "dist/middlewares/universal-hono-middleware-headers.middleware.js"
"types": "./dist/middlewares/universal-hono-middleware-headers.middleware.d.ts",
"import": "./dist/middlewares/universal-hono-middleware-headers.middleware.js",
"default": "./dist/middlewares/universal-hono-middleware-headers.middleware.js"
},
"./middlewares/headers-middleware-express": {
"types": "dist/middlewares/universal-express-middleware-headers.middleware.d.ts",
"import": "dist/middlewares/universal-express-middleware-headers.middleware.js",
"default": "dist/middlewares/universal-express-middleware-headers.middleware.js"
"types": "./dist/middlewares/universal-express-middleware-headers.middleware.d.ts",
"import": "./dist/middlewares/universal-express-middleware-headers.middleware.js",
"default": "./dist/middlewares/universal-express-middleware-headers.middleware.js"
},
"./middlewares/headers-middleware-hattip": {
"types": "dist/middlewares/universal-hattip-middleware-headers.middleware.d.ts",
"import": "dist/middlewares/universal-hattip-middleware-headers.middleware.js",
"default": "dist/middlewares/universal-hattip-middleware-headers.middleware.js"
"types": "./dist/middlewares/universal-hattip-middleware-headers.middleware.d.ts",
"import": "./dist/middlewares/universal-hattip-middleware-headers.middleware.js",
"default": "./dist/middlewares/universal-hattip-middleware-headers.middleware.js"
}
},
"author": "Joël Charles <[email protected]>",
Expand All @@ -77,28 +77,18 @@
"test:typecheck": "tsc -p tsconfig.json --noEmit"
},
"devDependencies": {
"universal-middleware": "*",
"@hono/node-server": "^1.12.0",
"@swc/core": "^1.6.13",
"@types/node": "^20.14.10",
"rimraf": "^6.0.0",
"tsup": "^8.1.0",
"typescript": "^5.5.3"
"typescript": "^5.5.3",
"universal-middleware": "*"
},
"peerDependencies": {
"optionalDependencies": {
"@universal-middleware/express": "^0",
"@universal-middleware/hono": "^0",
"@universal-middleware/hattip": "^0"
},
"peerDependenciesMeta": {
"@universal-middleware/express": {
"optional": true
},
"@universal-middleware/hono": {
"optional": true
},
"@universal-middleware/hattip": {
"optional": true
}
"@universal-middleware/hattip": "^0",
"@universal-middleware/hono": "^0"
},
"sideEffects": false
}
6 changes: 1 addition & 5 deletions examples/tool/tsup.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,7 @@ export default defineConfig([
platform: "neutral",
target: "es2022",
dts: true,
esbuildPlugins: [
universalMiddleware({
buildEnd: console.log,
}),
],
esbuildPlugins: [universalMiddleware()],
esbuildOptions(opts) {
opts.outbase = "src";
},
Expand Down
2 changes: 2 additions & 0 deletions packages/adapter-express/src/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ export type NodeMiddleware = (
next?: (err?: unknown) => void,
) => void;

export type NodeHandler = NodeMiddleware;

/** Adapter options */
export interface NodeAdapterHandlerOptions extends NodeRequestAdapterOptions {}
export interface NodeAdapterMiddlewareOptions
Expand Down
21 changes: 9 additions & 12 deletions packages/adapter-express/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
import type { DecoratedRequest, DecoratedServerResponse } from "./common.js";

export type { DecoratedRequest, DecoratedServerResponse };

/** Connect/Express style request listener/middleware */
export type NodeMiddleware = (
req: DecoratedRequest,
res: DecoratedServerResponse,
next?: () => void,
) => void;

export { createHandler, createMiddleware, getContext } from "./common.js";
export {
createHandler,
createMiddleware,
getContext,
type DecoratedRequest,
type DecoratedServerResponse,
type NodeMiddleware,
type NodeHandler,
} from "./common.js";
export { createRequestAdapter } from "./request.js";
export { sendResponse } from "./response.js";
3 changes: 3 additions & 0 deletions packages/adapter-hattip/src/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ declare module "@hattip/core" {
}
}

export type { HattipHandler };
export type HattipMiddleware = RequestHandler;

/**
* Creates a request handler to be passed to hattip
*/
Expand Down
8 changes: 7 additions & 1 deletion packages/adapter-hattip/src/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,7 @@
export { createHandler, createMiddleware, getContext } from "./common.js";
export {
createHandler,
createMiddleware,
getContext,
type HattipHandler,
type HattipMiddleware,
} from "./common.js";
3 changes: 3 additions & 0 deletions packages/adapter-hono/src/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ interface UniversalEnv {
Variables: Env["Variables"] & Record<symbol, Universal.Context>;
}

export type HonoHandler = Handler<UniversalEnv>;
export type HonoMiddleware = MiddlewareHandler<UniversalEnv>;

export const contextSymbol = Symbol("unContext");

/**
Expand Down
8 changes: 7 additions & 1 deletion packages/adapter-hono/src/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,7 @@
export { createHandler, createMiddleware, getContext } from "./common.js";
export {
createHandler,
createMiddleware,
getContext,
type HonoHandler,
type HonoMiddleware,
} from "./common.js";
1 change: 1 addition & 0 deletions packages/universal-middleware/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
"@universal-middleware/express": "^0.1.0",
"@universal-middleware/hattip": "^0.1.0",
"@universal-middleware/hono": "^0.1.1",
"oxc-transform": "^0.20.0",
"package-up": "^5.0.0",
"unplugin": "^1.11.0"
},
Expand Down
91 changes: 79 additions & 12 deletions packages/universal-middleware/src/plugin.ts
Original file line number Diff line number Diff line change
@@ -1,27 +1,30 @@
import { join, parse, posix, resolve } from "node:path";
import { dirname, join, parse, posix, resolve } from "node:path";
import { type UnpluginFactory } from "unplugin";
import { packageUp } from "package-up";
import { readFile, writeFile } from "node:fs/promises";
import { mkdir, readFile, writeFile } from "node:fs/promises";

export interface Options {
servers?: (typeof defaultWrappers)[number][];
serversExportNames?: string;
entryExportNames?: string;
ignoreRecommendations?: boolean;
doNotEditPackageJson?: boolean;
dts?: boolean;
buildEnd?: (report: Report[]) => void | Promise<void>;
}

export interface Report {
in: string;
out: string;
dts?: string;
type: "handler" | "middleware";
exports: string;
}

interface BundleInfo {
in: string;
out: string;
dts: string;
id: string;
dir: string;
name: string;
Expand Down Expand Up @@ -170,6 +173,36 @@ export default ${fn}(${type});
return { code };
}

const typesByServer: Record<string, { middleware: string; handler: string }> = {
hono: {
middleware: "HonoMiddleware",
handler: "HonoHandler",
},
express: {
middleware: "NodeMiddleware",
handler: "NodeHandler",
},
hattip: {
middleware: "HattipMiddleware",
handler: "HattipHandler",
},
};

function loadDts(
id: string,
resolve?: (handler: string, type: string) => string,
) {
const [, , server, type, handler] = id.split(":");

const fn = type === "handler" ? "createHandler" : "createMiddleware";
const t = typesByServer[server][type as "middleware" | "handler"];
const code = `import { ${fn}, type ${t} } from "@universal-middleware/${server}";
import ${type} from "${resolve ? resolve(handler, type) : handler}";
export default ${fn}(${type}) as ${t};
`;
return { code };
}

function findDuplicateReports(reports: Report[]): Map<string, Report[]> {
const exportCounts: Record<string, number> = {};
const duplicates = new Map<string, Report[]>();
Expand Down Expand Up @@ -223,6 +256,7 @@ function genBundleInfo(
{
in: v,
out: dest!,
dts: dest!.replace(/\.js$/, ".d.ts"),
id: k,
dir: parsed.dir,
name: parsed.name,
Expand Down Expand Up @@ -273,14 +307,40 @@ function fixBundleExports(
return bundle;
}

function genReport(bundle: Record<string, BundleInfo>) {
async function generateDts(content: string, outFile: string) {
const { isolatedDeclaration } = await import("oxc-transform");

const code = isolatedDeclaration("file.ts", content);

await mkdir(dirname(outFile), { recursive: true });

await writeFile(outFile, code.sourceText);
}

async function genDts(bundle: Record<string, BundleInfo>, options?: Options) {
if (options?.dts === false) return;

for (const value of Object.values(bundle)) {
if (!value.in.startsWith(namespace)) continue;

await generateDts(loadDts(value.in).code, value.dts);
}
}

function genReport(bundle: Record<string, BundleInfo>, options?: Options) {
const reports = Object.values(bundle).reduce((acc, curr) => {
acc.push({
const report: Report = {
in: curr.in,
out: curr.out,
type: curr.type,
exports: curr.exports,
});
};

if (options?.dts !== false) {
report.dts = curr.dts;
}

acc.push(report);

return acc;
}, [] as Report[]);
Expand All @@ -304,19 +364,19 @@ export async function readAndEditPackageJson(reports: Report[]) {

const packageJson = JSON.parse(await readFile(packageJsonPath, "utf8"));

packageJson.peerDependencies ??= {};
packageJson.optionalDependencies ??= {};
for (const external of externals) {
packageJson.peerDependencies[external] = versionRange;
packageJson.optionalDependencies[external] = versionRange;
}

packageJson.exports ??= {};

for (const report of reports) {
// No CJS support
packageJson.exports[report.exports] = {
types: report.out.replace(/\.js$/, ".d.ts"),
import: report.out,
default: report.out,
types: report.dts ? "./" + report.dts : undefined,
import: "./" + report.out,
default: "./" + report.out,
};
}

Expand Down Expand Up @@ -393,8 +453,13 @@ const universalMiddleware: UnpluginFactory<Options | undefined, boolean> = (
entryExportNames,
});

// Add dist folder to `out`
Object.values(mapping).forEach((v) => (v.out = join(out, v.out)));
// Add dist folder to `out` and `dts`
Object.values(mapping).forEach((v) => {
v.out = join(out, v.out);
v.dts = join(out, v.dts);
});

await genDts(mapping, options);

const report = genReport(mapping);

Expand Down Expand Up @@ -528,6 +593,8 @@ const universalMiddleware: UnpluginFactory<Options | undefined, boolean> = (
(v) => (v.exports = "./" + posix.relative(outdir, v.exports)),
);

await genDts(mapping, options);

const report = genReport(mapping);

if (!options?.doNotEditPackageJson) {
Expand Down
Loading

0 comments on commit 97e0042

Please sign in to comment.