mirror of
https://github.com/kou029w/_.git
synced 2025-01-30 22:08:02 +00:00
kita
This commit is contained in:
parent
07d437da3d
commit
acabdaec8c
11 changed files with 2812 additions and 0 deletions
72
kita/README.md
Normal file
72
kita/README.md
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
# kita
|
||||||
|
|
||||||
|
## Installing the project
|
||||||
|
|
||||||
|
Run the following command to install the project:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
## Running in development mode
|
||||||
|
|
||||||
|
Run the following command to start the server in development mode:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
You can now open your browser and navigate to [`http://localhost:1227`](http://localhost:1227).
|
||||||
|
|
||||||
|
## Building for production
|
||||||
|
|
||||||
|
Run the following command to build the project:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
Run the following command to start the server in production mode:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm start
|
||||||
|
```
|
||||||
|
|
||||||
|
You can now open your browser and navigate to [`http://localhost:1227`](http://localhost:1227).
|
||||||
|
|
||||||
|
## Running tests
|
||||||
|
|
||||||
|
You can run the tests using the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm test
|
||||||
|
```
|
||||||
|
|
||||||
|
## Environment variables
|
||||||
|
|
||||||
|
Environment variables are loaded from a [`.env`](./.env) file in the root of the project. These are the available
|
||||||
|
variables:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Port and host for the server
|
||||||
|
PORT=1227
|
||||||
|
HOST=0.0.0.0
|
||||||
|
```
|
||||||
|
|
||||||
|
## Linting and Formatting
|
||||||
|
|
||||||
|
You can run the following commands to lint and format your code:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Formats your code
|
||||||
|
npm run format
|
||||||
|
|
||||||
|
# Lints your code
|
||||||
|
npm run lint
|
||||||
|
|
||||||
|
# Lints and fixes your code
|
||||||
|
npm run lint:fix
|
||||||
|
|
||||||
|
# Lints your code in CI mode
|
||||||
|
npm run lint:ci
|
||||||
|
```
|
25
kita/biome.json
Normal file
25
kita/biome.json
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
{
|
||||||
|
"$schema": "https://biomejs.dev/schemas/1.6.3/schema.json",
|
||||||
|
"organizeImports": {
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
"linter": {
|
||||||
|
"enabled": true,
|
||||||
|
"rules": {
|
||||||
|
"recommended": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"formatter": {
|
||||||
|
"lineWidth": 100,
|
||||||
|
"indentStyle": "space"
|
||||||
|
},
|
||||||
|
"javascript": {
|
||||||
|
"formatter": {
|
||||||
|
"quoteStyle": "single",
|
||||||
|
"trailingComma": "none"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"files": {
|
||||||
|
"ignore": ["node_modules", "dist", "coverage"]
|
||||||
|
}
|
||||||
|
}
|
44
kita/package.json
Normal file
44
kita/package.json
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
{
|
||||||
|
"name": "kita",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"build": "kita build && tsc -p tsconfig.build.json",
|
||||||
|
"dev": "concurrently --raw --restart-tries 0 \"npm:dev:*\"",
|
||||||
|
"dev:kita": "kita watch",
|
||||||
|
"dev:server": "node --env-file=.env --enable-source-maps -r @swc-node/register --watch src/index.ts",
|
||||||
|
"dev:tsc": "tsc -p tsconfig.build.json --watch --preserveWatchOutput",
|
||||||
|
"format": "biome format --write .",
|
||||||
|
"lint": "biome check .",
|
||||||
|
"lint:ci": "biome ci .",
|
||||||
|
"lint:fix": "biome check --apply-unsafe .",
|
||||||
|
"start": "node --env-file=.env --enable-source-maps dist/index.js",
|
||||||
|
"test": "kita build && node --env-file=.env --enable-source-maps -r @swc-node/register --test test/**/*.test.ts",
|
||||||
|
"test:types": "kita build --dry-run && tsc --noEmit"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@fastify/helmet": "^11.1.1",
|
||||||
|
"@fastify/multipart": "^8.2.0",
|
||||||
|
"@fastify/sensible": "^5.5.0",
|
||||||
|
"@fastify/under-pressure": "^8.3.0",
|
||||||
|
"@kitajs/runtime": "^1.1.17",
|
||||||
|
"close-with-grace": "^1.3.0",
|
||||||
|
"fastify": "^4.26.2",
|
||||||
|
"fastify-plugin": "^4.5.1",
|
||||||
|
"pino": "^8.19.0",
|
||||||
|
"tslib": "^2.6.2"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@biomejs/biome": "1.6.3",
|
||||||
|
"@kitajs/cli": "1.1.34",
|
||||||
|
"@swc-node/register": "^1.9.0",
|
||||||
|
"@swc/helpers": "^0.5.8",
|
||||||
|
"@types/node": "^20.12.2",
|
||||||
|
"concurrently": "^8.2.2",
|
||||||
|
"pino-pretty": "^11.0.0",
|
||||||
|
"typescript": "^5.4.3"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=20"
|
||||||
|
}
|
||||||
|
}
|
2427
kita/pnpm-lock.yaml
generated
Normal file
2427
kita/pnpm-lock.yaml
generated
Normal file
File diff suppressed because it is too large
Load diff
31
kita/src/index.ts
Normal file
31
kita/src/index.ts
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
import { ajvFilePlugin } from '@fastify/multipart';
|
||||||
|
import fastify from 'fastify';
|
||||||
|
import { isMainThread } from 'node:worker_threads';
|
||||||
|
import backendPlugin from './plugin';
|
||||||
|
|
||||||
|
// Ensures this file is not executed in test context
|
||||||
|
if (process.env.NODE_TEST_CONTEXT) {
|
||||||
|
throw new Error('This file should not be executed in test context');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensures this file is not executed in worker context
|
||||||
|
if (!isMainThread) {
|
||||||
|
throw new Error('This file should not be executed in worker context');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensures PORT are set
|
||||||
|
if (!process.env.PORT) {
|
||||||
|
throw new Error('PORT must be set');
|
||||||
|
}
|
||||||
|
|
||||||
|
fastify({
|
||||||
|
logger: { transport: { target: 'pino-pretty' } },
|
||||||
|
ajv: { plugins: [ajvFilePlugin] }
|
||||||
|
})
|
||||||
|
// Registers our backend
|
||||||
|
.register(backendPlugin)
|
||||||
|
// Starts the server
|
||||||
|
.listen({
|
||||||
|
port: +process.env.PORT,
|
||||||
|
host: process.env.HOST || ''
|
||||||
|
});
|
43
kita/src/plugin.ts
Normal file
43
kita/src/plugin.ts
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
import './prelude';
|
||||||
|
|
||||||
|
import fastifyHelmet from '@fastify/helmet';
|
||||||
|
import fastifyUnderPressure from '@fastify/under-pressure';
|
||||||
|
import { Kita } from '@kitajs/runtime';
|
||||||
|
import closeWithGrace from 'close-with-grace';
|
||||||
|
import fp from 'fastify-plugin';
|
||||||
|
|
||||||
|
export default fp(async (app) => {
|
||||||
|
// Registers the generated kita plugin
|
||||||
|
app.register(Kita);
|
||||||
|
|
||||||
|
// Measures process load with automatic handling of "Service Unavailable"
|
||||||
|
app.register(fastifyUnderPressure, {
|
||||||
|
maxEventLoopDelay: 1000,
|
||||||
|
maxHeapUsedBytes: 1000000000,
|
||||||
|
maxRssBytes: 1000000000,
|
||||||
|
maxEventLoopUtilization: 0.98
|
||||||
|
});
|
||||||
|
|
||||||
|
// Important security headers for Fastify
|
||||||
|
app.register(fastifyHelmet, {
|
||||||
|
global: true
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add your custom stuff here
|
||||||
|
// app.register(myPlugin)
|
||||||
|
// ...
|
||||||
|
|
||||||
|
// Delay is the number of milliseconds for the graceful close to finish
|
||||||
|
const closeListeners = closeWithGrace({ delay: 500 }, async ({ err }) => {
|
||||||
|
if (err) {
|
||||||
|
app.log.error(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
await app.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Cancelling the close listeners
|
||||||
|
app.addHook('onClose', async () => {
|
||||||
|
closeListeners.uninstall();
|
||||||
|
});
|
||||||
|
});
|
2
kita/src/prelude.ts
Normal file
2
kita/src/prelude.ts
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
// This tells kita where to find the root of your project
|
||||||
|
globalThis.KITA_PROJECT_ROOT ??= __dirname;
|
13
kita/src/routes/index.ts
Normal file
13
kita/src/routes/index.ts
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
import type { Query } from '@kitajs/runtime';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @tag Hello
|
||||||
|
* @operationId getHello
|
||||||
|
* @summary Get a hello message with date
|
||||||
|
*/
|
||||||
|
export function get(name: Query = 'World') {
|
||||||
|
return {
|
||||||
|
name,
|
||||||
|
message: `Hello ${name}!`
|
||||||
|
};
|
||||||
|
}
|
39
kita/test/index.test.ts
Normal file
39
kita/test/index.test.ts
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
import fastify from 'fastify';
|
||||||
|
import assert from 'node:assert';
|
||||||
|
import test, { describe } from 'node:test';
|
||||||
|
import backendPlugin from '../src/plugin';
|
||||||
|
|
||||||
|
describe('Creates route', () => {
|
||||||
|
test('GET /', async () => {
|
||||||
|
await using app = fastify();
|
||||||
|
app.register(backendPlugin);
|
||||||
|
|
||||||
|
const response = await app.inject({
|
||||||
|
method: 'GET',
|
||||||
|
url: '/'
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.strictEqual(response.statusCode, 200);
|
||||||
|
assert.deepStrictEqual(response.json(), {
|
||||||
|
name: 'World',
|
||||||
|
message: 'Hello World!'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('GET /?name=Kita', async () => {
|
||||||
|
await using app = fastify();
|
||||||
|
app.register(backendPlugin);
|
||||||
|
|
||||||
|
const response = await app.inject({
|
||||||
|
method: 'GET',
|
||||||
|
url: '/',
|
||||||
|
query: { name: 'Kita' }
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.strictEqual(response.statusCode, 200);
|
||||||
|
assert.deepStrictEqual(response.json(), {
|
||||||
|
name: 'Kita',
|
||||||
|
message: 'Hello Kita!'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
4
kita/tsconfig.build.json
Normal file
4
kita/tsconfig.build.json
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"extends": "./tsconfig.json",
|
||||||
|
"include": ["src"]
|
||||||
|
}
|
112
kita/tsconfig.json
Normal file
112
kita/tsconfig.json
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
{
|
||||||
|
"$schema": "https://json.schemastore.org/tsconfig",
|
||||||
|
"compilerOptions": {
|
||||||
|
/* Visit https://aka.ms/tsconfig to read more about this file */
|
||||||
|
|
||||||
|
/* Projects */
|
||||||
|
"incremental": true,
|
||||||
|
// "composite": true,
|
||||||
|
// "tsBuildInfoFile": "./.tsbuildinfo",
|
||||||
|
// "disableSourceOfProjectReferenceRedirect": true,
|
||||||
|
// "disableSolutionSearching": true,
|
||||||
|
// "disableReferencedProjectLoad": true,
|
||||||
|
|
||||||
|
/* Language and Environment */
|
||||||
|
"target": "ESNext",
|
||||||
|
// "lib": [],
|
||||||
|
// "jsx": "preserve",
|
||||||
|
// "experimentalDecorators": true,
|
||||||
|
// "emitDecoratorMetadata": true,
|
||||||
|
// "jsxFactory": "",
|
||||||
|
// "jsxFragmentFactory": "",
|
||||||
|
// "jsxImportSource": "",
|
||||||
|
// "reactNamespace": "",
|
||||||
|
// "noLib": true,
|
||||||
|
// "useDefineForClassFields": true,
|
||||||
|
// "moduleDetection": "auto", ,
|
||||||
|
"preserveWatchOutput": true,
|
||||||
|
|
||||||
|
/* Modules */
|
||||||
|
"module": "CommonJS",
|
||||||
|
// "rootDir": "./",
|
||||||
|
"moduleResolution": "Node10",
|
||||||
|
// "baseUrl": "./",
|
||||||
|
// "paths": {},
|
||||||
|
// "rootDirs": [],
|
||||||
|
// "typeRoots": [],
|
||||||
|
// "types": [],
|
||||||
|
// "allowUmdGlobalAccess": true,
|
||||||
|
// "moduleSuffixes": [],
|
||||||
|
// "allowImportingTsExtensions": true,
|
||||||
|
// "resolvePackageJsonExports": true,
|
||||||
|
// "resolvePackageJsonImports": true,
|
||||||
|
// "customConditions": [],
|
||||||
|
// "resolveJsonModule": true,
|
||||||
|
// "allowArbitraryExtensions": true,
|
||||||
|
// "noResolve": true,
|
||||||
|
|
||||||
|
/* JavaScript Support */
|
||||||
|
// "allowJs": true,
|
||||||
|
// "checkJs": true,
|
||||||
|
// "maxNodeModuleJsDepth": 1,
|
||||||
|
|
||||||
|
/* Emit */
|
||||||
|
// "declaration": true,
|
||||||
|
// "declarationMap": true,
|
||||||
|
// "emitDeclarationOnly": true,
|
||||||
|
"sourceMap": true,
|
||||||
|
// "inlineSourceMap": true,
|
||||||
|
// "outFile": "./",
|
||||||
|
"outDir": "./dist",
|
||||||
|
// "removeComments": true,
|
||||||
|
// "noEmit": true,
|
||||||
|
"importHelpers": true,
|
||||||
|
// "importsNotUsedAsValues": "remove",
|
||||||
|
// "downlevelIteration": true,
|
||||||
|
// "sourceRoot": "",
|
||||||
|
// "mapRoot": "",
|
||||||
|
// "inlineSources": true,
|
||||||
|
// "emitBOM": true,
|
||||||
|
// "newLine": "crlf",
|
||||||
|
// "stripInternal": true,
|
||||||
|
// "noEmitHelpers": true,
|
||||||
|
// "noEmitOnError": true,
|
||||||
|
// "preserveConstEnums": true,
|
||||||
|
// "declarationDir": "./",
|
||||||
|
// "preserveValueImports": true,
|
||||||
|
|
||||||
|
/* Interop Constraints */
|
||||||
|
"isolatedModules": true,
|
||||||
|
"verbatimModuleSyntax": false,
|
||||||
|
"allowSyntheticDefaultImports": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"preserveSymlinks": true,
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
|
||||||
|
/* Type Checking */
|
||||||
|
"strict": true,
|
||||||
|
"noImplicitAny": true,
|
||||||
|
"strictNullChecks": true,
|
||||||
|
"strictFunctionTypes": true,
|
||||||
|
"strictBindCallApply": true,
|
||||||
|
"strictPropertyInitialization": true,
|
||||||
|
"noImplicitThis": true,
|
||||||
|
"useUnknownInCatchVariables": true,
|
||||||
|
"alwaysStrict": true,
|
||||||
|
"noUnusedLocals": true,
|
||||||
|
"noUnusedParameters": true,
|
||||||
|
"exactOptionalPropertyTypes": true,
|
||||||
|
"noImplicitReturns": true,
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
"noUncheckedIndexedAccess": true,
|
||||||
|
"noImplicitOverride": true,
|
||||||
|
// "noPropertyAccessFromIndexSignature": true,
|
||||||
|
// "allowUnusedLabels": true,
|
||||||
|
// "allowUnreachableCode": true,
|
||||||
|
|
||||||
|
/* Completeness */
|
||||||
|
"skipDefaultLibCheck": true,
|
||||||
|
"skipLibCheck": true
|
||||||
|
},
|
||||||
|
"include": ["src", "test"]
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue