Skip to content

Commit 3e4a72e

Browse files
committed
feat: ♻️ Move api to elysia
1 parent 638f849 commit 3e4a72e

File tree

8 files changed

+244
-98
lines changed

8 files changed

+244
-98
lines changed

apps/api/.gitignore

Lines changed: 38 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,42 @@
1-
# dev
2-
.yarn/
3-
!.yarn/releases
4-
.vscode/*
5-
!.vscode/launch.json
6-
!.vscode/*.code-snippets
7-
.idea/workspace.xml
8-
.idea/usage.statistics.xml
9-
.idea/shelf
10-
11-
# deps
12-
node_modules/
13-
14-
# env
15-
.env
16-
.env.production
17-
18-
# logs
19-
logs/
20-
*.log
1+
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2+
3+
# dependencies
4+
/node_modules
5+
/.pnp
6+
.pnp.js
7+
8+
# testing
9+
/coverage
10+
11+
# next.js
12+
/.next/
13+
/out/
14+
15+
# production
16+
/build
17+
18+
# misc
19+
.DS_Store
20+
*.pem
21+
22+
# debug
2123
npm-debug.log*
2224
yarn-debug.log*
2325
yarn-error.log*
24-
pnpm-debug.log*
25-
lerna-debug.log*
2626

27-
# misc
28-
.DS_Store
27+
# local env files
28+
.env.local
29+
.env.development.local
30+
.env.test.local
31+
.env.production.local
32+
33+
# vercel
34+
.vercel
35+
36+
**/*.trace
37+
**/*.zip
38+
**/*.tar.gz
39+
**/*.tgz
40+
**/*.log
41+
package-lock.json
42+
**/*.bun

apps/api/README.md

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1-
```
2-
npm install
3-
npm run dev
4-
```
1+
# Elysia with Bun runtime
52

3+
## Getting Started
4+
To get started with this template, simply paste this command into your terminal:
5+
```bash
6+
bun create elysia ./elysia-example
67
```
7-
open http://localhost:3000
8+
9+
## Development
10+
To start the development server run:
11+
```bash
12+
bun run dev
813
```
14+
15+
Open http://localhost:3000/ with your browser to see the result.

apps/api/bun.lockb

45.7 KB
Binary file not shown.

apps/api/package.json

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
{
22
"name": "api",
3-
"type": "module",
3+
"version": "1.1.0",
4+
"description": "Invoicelink.io API Endpoints",
45
"scripts": {
5-
"dev": "tsx watch src/index.ts",
6-
"build": "tsc"
6+
"dev": "bun --watch src/index.ts",
7+
"build": "bun build src/index.ts --outdir=dist",
8+
"start": "NODE_ENV=production bun src/index.ts",
9+
"test": "bun test"
710
},
811
"dependencies": {
9-
"@hono/node-server": "^1.12.0",
10-
"hono": "^4.5.4",
11-
"puppeteer": "^22.15.0"
12+
"@elysiajs/swagger": "^1.1.0",
13+
"elysia": "latest",
14+
"puppeteer": "^23.0.2"
1215
},
1316
"devDependencies": {
14-
"@types/node": "^20.11.17",
15-
"tsx": "^4.7.1",
16-
"typescript": "^5.5.4"
17-
}
17+
"bun-types": "latest"
18+
},
19+
"module": "src/index.js"
1820
}

apps/api/src/index.ts

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,13 @@
1-
import { serve } from '@hono/node-server'
2-
import { Hono } from 'hono'
3-
import { csrf } from 'hono/csrf'
1+
import { Elysia } from "elysia";
2+
import { swagger } from '@elysiajs/swagger'
3+
import invoice from "./invoice";
44

5-
import invoice from './invoice'
65

7-
const app = new Hono()
6+
const app = new Elysia().use(invoice).use(swagger({
7+
path: "/",
8+
version: "1.1.0",
9+
})).listen(3000);
810

9-
// middleware
10-
app.use(
11-
csrf({
12-
origin: ['app.invoicelink.io', 'pay.invoicelink.io', "invoicelink.io"],
13-
})
14-
)
15-
16-
// mount routes
17-
app.route('/invoice', invoice)
18-
19-
app.get('/', (c) => {
20-
return c.text('Hello from api.invoicelink.io!')
21-
})
22-
23-
const port = 3000
24-
console.log(`Server is running on port ${port}`)
25-
26-
serve({
27-
fetch: app.fetch,
28-
port
29-
})
11+
console.log(
12+
`🦊 Elysia is running at http://${app.server?.hostname}:${app.server?.port}`
13+
);

apps/api/src/invoice.ts

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1+
import { Elysia } from 'elysia'
12
import puppeteer from 'puppeteer';
2-
import { Hono } from 'hono'
33

4-
const app = new Hono()
54

65
const getBrowser = () => puppeteer.launch({ headless: true });
76

8-
app.get('/', async (c) => {
9-
const {id, type, download} = c.req.queries()
7+
const plugin = new Elysia()
8+
.get('/invoice', async ({
9+
query
10+
}) => {
11+
console.log(query)
12+
const { id, type, download } = query
1013

11-
let browser = null;
12-
13-
try {
14-
browser = await getBrowser();
14+
let browser = await getBrowser();
1515
const page = await browser.newPage();
1616

1717
await page.goto(`https://app.invoicelink.io/invoice?id=${id}&type=${type}&download=${download}`);
@@ -25,17 +25,7 @@ app.get('/', async (c) => {
2525
'Content-Type': 'application/pdf',
2626
'Content-Disposition': download ? `attachment; filename="invoice.pdf"` : `inline`
2727
}
28-
});
29-
} catch (error: unknown) {
30-
if (error instanceof Error) {
31-
return c.json({ error: error.message });
32-
}
33-
} finally {
34-
if (browser) {
35-
browser.close();
36-
}
37-
}
38-
return c.text('Hello from invoice!')
39-
})
28+
});
29+
});
4030

41-
export default app
31+
export default plugin

apps/api/tsconfig.json

Lines changed: 101 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,103 @@
11
{
2-
"compilerOptions": {
3-
"target": "ESNext",
4-
"module": "ESNext",
5-
"moduleResolution": "Bundler",
6-
"strict": true,
7-
"skipLibCheck": true,
8-
"types": ["node"],
9-
"jsx": "react-jsx",
10-
"jsxImportSource": "hono/jsx",
11-
"outDir": "dist"
12-
},
13-
"exclude": ["node_modules"]
2+
"compilerOptions": {
3+
/* Visit https://aka.ms/tsconfig to read more about this file */
4+
5+
/* Projects */
6+
// "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
7+
// "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
8+
// "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */
9+
// "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */
10+
// "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
11+
// "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
12+
13+
/* Language and Environment */
14+
"target": "ES2021", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
15+
// "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
16+
// "jsx": "preserve", /* Specify what JSX code is generated. */
17+
// "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */
18+
// "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
19+
// "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
20+
// "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
21+
// "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
22+
// "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
23+
// "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
24+
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
25+
// "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */
26+
27+
/* Modules */
28+
"module": "ES2022", /* Specify what module code is generated. */
29+
// "rootDir": "./", /* Specify the root folder within your source files. */
30+
"moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */
31+
// "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
32+
// "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
33+
// "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
34+
// "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */
35+
"types": ["bun-types"], /* Specify type package names to be included without being referenced in a source file. */
36+
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
37+
// "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
38+
// "resolveJsonModule": true, /* Enable importing .json files. */
39+
// "noResolve": true, /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */
40+
41+
/* JavaScript Support */
42+
// "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
43+
// "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
44+
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
45+
46+
/* Emit */
47+
// "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
48+
// "declarationMap": true, /* Create sourcemaps for d.ts files. */
49+
// "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
50+
// "sourceMap": true, /* Create source map files for emitted JavaScript files. */
51+
// "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
52+
// "outDir": "./", /* Specify an output folder for all emitted files. */
53+
// "removeComments": true, /* Disable emitting comments. */
54+
// "noEmit": true, /* Disable emitting files from a compilation. */
55+
// "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
56+
// "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */
57+
// "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
58+
// "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
59+
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
60+
// "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
61+
// "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
62+
// "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
63+
// "newLine": "crlf", /* Set the newline character for emitting files. */
64+
// "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
65+
// "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */
66+
// "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
67+
// "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */
68+
// "declarationDir": "./", /* Specify the output directory for generated declaration files. */
69+
// "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */
70+
71+
/* Interop Constraints */
72+
// "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
73+
// "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
74+
"esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
75+
// "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
76+
"forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
77+
78+
/* Type Checking */
79+
"strict": true, /* Enable all strict type-checking options. */
80+
// "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */
81+
// "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */
82+
// "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
83+
// "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
84+
// "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
85+
// "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */
86+
// "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
87+
// "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
88+
// "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */
89+
// "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */
90+
// "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
91+
// "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
92+
// "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
93+
// "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */
94+
// "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
95+
// "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */
96+
// "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
97+
// "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
98+
99+
/* Completeness */
100+
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
101+
"skipLibCheck": true /* Skip type checking all .d.ts files. */
102+
}
14103
}

0 commit comments

Comments
 (0)