@markitdownjs/api 0.1.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/dist/app.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import { Hono } from 'hono';
2
+ declare const app: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
3
+ export default app;
4
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,QAAA,MAAM,GAAG,4EAAa,CAAC;AAyCvB,eAAe,GAAG,CAAC"}
package/dist/app.js ADDED
@@ -0,0 +1,35 @@
1
+ import { Hono } from 'hono';
2
+ import { cors } from 'hono/cors';
3
+ import { getSupportedExtensions, getSupportedMimeTypes } from '@markitdownjs/shared';
4
+ const app = new Hono();
5
+ app.use('/*', cors());
6
+ app.get('/health', (c) => c.json({ status: 'ok', timestamp: new Date().toISOString() }));
7
+ app.get('/formats', async (c) => {
8
+ return c.json({
9
+ extensions: getSupportedExtensions(),
10
+ mimeTypes: getSupportedMimeTypes(),
11
+ });
12
+ });
13
+ app.post('/convert', async (c) => {
14
+ try {
15
+ const body = await c.req.parseBody();
16
+ const file = body['file'];
17
+ if (!file || !(file instanceof File)) {
18
+ return c.json({ error: 'No file provided' }, 400);
19
+ }
20
+ const { MarkItDown } = await import('@markitdownjs/core');
21
+ const parser = new MarkItDown();
22
+ const arrayBuffer = await file.arrayBuffer();
23
+ const result = await parser.convert({
24
+ data: new Uint8Array(arrayBuffer),
25
+ fileName: file.name,
26
+ mimeType: file.type || undefined,
27
+ });
28
+ return c.json(result);
29
+ }
30
+ catch (error) {
31
+ return c.json({ error: error instanceof Error ? error.message : 'Conversion failed' }, 500);
32
+ }
33
+ });
34
+ export default app;
35
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAErF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;AAEvB,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AAEtB,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;AAEzF,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC9B,OAAO,CAAC,CAAC,IAAI,CAAC;QACZ,UAAU,EAAE,sBAAsB,EAAE;QACpC,SAAS,EAAE,qBAAqB,EAAE;KACnC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC/B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAE1B,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,GAAG,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAEhC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;YAClC,IAAI,EAAE,IAAI,UAAU,CAAC,WAAW,CAAC;YACjC,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,QAAQ,EAAE,IAAI,CAAC,IAAI,IAAI,SAAS;SACjC,CAAC,CAAC;QAEH,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,EAAE,EACvE,GAAG,CACJ,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,eAAe,GAAG,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { default as app } from './app.js';
2
+ export { rateLimit, validateFileSize } from './middleware.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { default as app } from './app.js';
2
+ export { rateLimit, validateFileSize } from './middleware.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Context, Next } from 'hono';
2
+ export declare function rateLimit(options?: {
3
+ windowMs?: number;
4
+ max?: number;
5
+ }): (c: Context, next: Next) => Promise<void | Response>;
6
+ export declare function validateFileSize(c: Context, next: Next): Promise<void | Response>;
7
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI1C,wBAAgB,SAAS,CAAC,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,IAI3D,GAAG,OAAO,EAAE,MAAM,IAAI,KAAG,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,CAiBhE;AAID,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,CAMvF"}
@@ -0,0 +1,28 @@
1
+ const requestCounts = new Map();
2
+ export function rateLimit(options = {}) {
3
+ const windowMs = options.windowMs ?? 60_000;
4
+ const max = options.max ?? 100;
5
+ return async (c, next) => {
6
+ const ip = c.req.header('x-forwarded-for') ?? c.req.header('x-real-ip') ?? 'unknown';
7
+ const now = Date.now();
8
+ const record = requestCounts.get(ip);
9
+ if (!record || now > record.resetTime) {
10
+ requestCounts.set(ip, { count: 1, resetTime: now + windowMs });
11
+ return next();
12
+ }
13
+ record.count++;
14
+ if (record.count > max) {
15
+ return c.json({ error: 'Too many requests' }, 429);
16
+ }
17
+ return next();
18
+ };
19
+ }
20
+ const MAX_FILE_SIZE = 50 * 1024 * 1024;
21
+ export async function validateFileSize(c, next) {
22
+ const contentLength = c.req.header('content-length');
23
+ if (contentLength && parseInt(contentLength, 10) > MAX_FILE_SIZE) {
24
+ return c.json({ error: 'File too large. Maximum size is 50MB' }, 413);
25
+ }
26
+ return next();
27
+ }
28
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa,GAAG,IAAI,GAAG,EAAgD,CAAC;AAE9E,MAAM,UAAU,SAAS,CAAC,UAA+C,EAAE;IACzE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC;IAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC;IAE/B,OAAO,KAAK,EAAE,CAAU,EAAE,IAAU,EAA4B,EAAE;QAChE,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC;QACrF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAErC,IAAI,CAAC,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YACtC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,GAAG,QAAQ,EAAE,CAAC,CAAC;YAC/D,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,IAAI,MAAM,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC;YACvB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,aAAa,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEvC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,CAAU,EAAE,IAAU;IAC3D,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACrD,IAAI,aAAa,IAAI,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC;QACjE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sCAAsC,EAAE,EAAE,GAAG,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,IAAI,EAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":""}
package/dist/server.js ADDED
@@ -0,0 +1,7 @@
1
+ import { serve } from '@hono/node-server';
2
+ import app from './app.js';
3
+ const port = parseInt(process.env.PORT ?? '3000', 10);
4
+ serve({ fetch: app.fetch, port }, (info) => {
5
+ console.log(`MarkItDownJS API server running on http://localhost:${info.port}`);
6
+ });
7
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,GAAG,MAAM,UAAU,CAAC;AAE3B,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;AAEtD,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;IACzC,OAAO,CAAC,GAAG,CAAC,uDAAuD,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAClF,CAAC,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@markitdownjs/api",
3
+ "version": "0.1.0",
4
+ "description": "HTTP API server for MarkItDownJS document conversion",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "import": "./dist/index.js",
13
+ "types": "./dist/index.d.ts"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "dependencies": {
20
+ "hono": "^4.0.0",
21
+ "@markitdownjs/core": "0.1.0",
22
+ "@markitdownjs/shared": "0.1.0"
23
+ },
24
+ "devDependencies": {
25
+ "typescript": "^5.5.0",
26
+ "@hono/node-server": "^1.0.0",
27
+ "@types/node": "^20.0.0"
28
+ },
29
+ "scripts": {
30
+ "build": "tsc --project tsconfig.json",
31
+ "dev": "tsc --watch --project tsconfig.json",
32
+ "typecheck": "tsc --noEmit",
33
+ "clean": "rm -rf dist tsconfig.tsbuildinfo"
34
+ }
35
+ }