Skip to content

Commit

Permalink
Chore/minor-improvements (#11)
Browse files Browse the repository at this point in the history
* feat: add jest test ci workflow

* chore: improved .vscode settings

* chore: removed `@alessiofrittoli/post-install-scripts`

* chore: improved project structure

* feat: add `getRequestIp` utility function

* feat: add `readJsonBody` utility function
  • Loading branch information
alessiofrittoli authored Jan 3, 2025
1 parent b845cb4 commit b6ce250
Show file tree
Hide file tree
Showing 19 changed files with 364 additions and 150 deletions.
8 changes: 7 additions & 1 deletion .github/rulesets/Default branch ruleset.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
"parameters": {
"required_approving_review_count": 0,
"dismiss_stale_reviews_on_push": true,
"require_code_owner_review": true,
"require_last_push_approval": true,
"required_review_thread_resolution": true,
"automatic_copilot_code_review_enabled": false,
Expand All @@ -50,7 +51,12 @@
"parameters": {
"strict_required_status_checks_policy": true,
"do_not_enforce_on_create": false,
"required_status_checks": []
"required_status_checks": [
{
"context": "Run Unit Tests",
"integration_id": 15368
}
]
}
},
{
Expand Down
7 changes: 6 additions & 1 deletion .github/rulesets/Tagging ruleset.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,12 @@
"parameters": {
"strict_required_status_checks_policy": true,
"do_not_enforce_on_create": false,
"required_status_checks": []
"required_status_checks": [
{
"context": "Run Unit Tests",
"integration_id": 15368
}
]
}
}
],
Expand Down
25 changes: 25 additions & 0 deletions .github/workflows/tests-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
on: [ "push", "pull_request" ]

name: Unit Tests

jobs:
test:
name: Run Unit Tests
runs-on: ubuntu-latest
steps:

- uses: actions/checkout@v4

- name: Use Node.js 20.x
uses: actions/setup-node@v3
with:
node-version: 20.x

- name: Install dependencies
run: |
npm install -g pnpm@latest
pnpm i
- name: Run tests
run: |
pnpm test:ci:coverage
1 change: 1 addition & 0 deletions .vscode/extensions.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
"recommendations": [
"dbaeumer.vscode-eslint",
"davidanson.vscode-markdownlint",
"Orta.vscode-jest",
],
// List of extensions recommended by VS Code that should not be recommended for users of this workspace.
"unwantedRecommendations": []
Expand Down
23 changes: 23 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"configurations": [
{
"type": "node",
"name": "Debug Tests",
"request": "launch",
"args": [
"test",
"--",
"--runInBand",
"--watchAll=false",
"--testNamePattern",
"${jest.testNamePattern}",
"--runTestsByPath",
"${jest.testFile}"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen",
"disableOptimisticBPs": true,
"runtimeExecutable": "pnpm"
}
]
}
2 changes: 2 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,7 @@
"statusBar.border":"#484848",
"statusBar.foreground": "#F0F0F0",
"activityBar.activeBorder": "#484848",
"activityBarBadge.foreground":"#484848",
"activityBarBadge.background":"#F0F0F0",
},
}
32 changes: 20 additions & 12 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
"type": "git",
"url": "git+https://github.com/alessiofrittoli/next-api.git"
},
"main": "./dist/index.cjs",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"files": [
Expand All @@ -31,24 +31,32 @@
],
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.mjs",
"require": "./dist/index.cjs"
"require": "./dist/index.js"
},
"./error": {
"types": "./dist/error/index.d.ts",
"import": "./dist/error/index.mjs",
"require": "./dist/error/index.cjs"
"require": "./dist/error/index.js"
},
"./server": {
"types": "./dist/server/index.d.ts",
"import": "./dist/server/index.mjs",
"require": "./dist/server/index.cjs"
"./request": {
"types": "./dist/request/index.d.ts",
"import": "./dist/request/index.mjs",
"require": "./dist/request/index.js"
},
"./response": {
"types": "./dist/response/index.d.ts",
"import": "./dist/response/index.mjs",
"require": "./dist/response/index.js"
},
"./route-wrappers": {
"types": "./dist/route-wrappers/index.d.ts",
"import": "./dist/route-wrappers/index.mjs",
"require": "./dist/route-wrappers/index.js"
},
"./types": {
"types": "./dist/types/index.d.ts"
},
"./types/api": {
"types": "./dist/types/api.d.ts"
}
},
"sideEffects": false,
Expand All @@ -74,7 +82,7 @@
"test:next-response": "pnpm test next-response.test.ts"
},
"peerDependencies": {
"next": ">=14.0.0"
"next": ">=15.0.0"
},
"devDependencies": {
"@eslint/js": "^9.17.0",
Expand All @@ -100,7 +108,7 @@
"@alessiofrittoli/exception": "^2.0.0",
"@alessiofrittoli/http-server-status": "^1.0.0",
"@alessiofrittoli/node-scripts": "^2.2.1",
"@alessiofrittoli/post-install-scripts": "^0.3.0",
"@alessiofrittoli/stream-reader": "^1.1.0",
"@alessiofrittoli/type-utils": "^1.5.0",
"@alessiofrittoli/url-utils": "^1.0.0"
}
Expand Down
12 changes: 6 additions & 6 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 3 additions & 5 deletions src/error/index.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
import Exception from '@alessiofrittoli/exception/code'
import { ErrorCode as Exception } from '@alessiofrittoli/exception/code'

export enum Next
{
// other custom error codes...
}

const ErrorCode = { Exception, Next }
type ErrorCode = MergedEnumValue<typeof ErrorCode>

export default ErrorCode
export const ErrorCode = { Exception, Next }
export type ErrorCode = MergedEnumValue<typeof ErrorCode>
6 changes: 4 additions & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
export { default as NextResponse } from './server'
export { default as ErrorCode } from './error'
export * from '@/error'
export * from '@/request'
export * from '@/response'
export * from '@/route-wrappers'
export type * from './types'
20 changes: 20 additions & 0 deletions src/request/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import type { NextRequest } from 'next/server'

export * from './read'


/**
* Get request IP address.
*
* @param request The NextRequest Instance.
* @returns The Request IP address.
*/
export const getRequestIp = async ( request?: NextRequest ) => {

const headers = request?.headers || await ( await import( 'next/headers' ) ).headers()
const forwarded = headers.get( 'X-Forwarded-For' )?.replace( /\s/g, '' ).split( ',' ).at( -1 )
const realIp = headers.get( 'X-Real-Ip' )?.replace( /\s/g, '' ).split( ',' ).at( -1 )

return forwarded || realIp || null

}
24 changes: 24 additions & 0 deletions src/request/read.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import type { Api } from '@/types/api'

/**
* Read Incoming Request Json Body.
*
* @param body The Request|Body instance.
* @returns The Awaited result of {@link Body.json}, null if Body is empty, locked or invalid.
*/
export const readJsonBody = async <
T extends Api.Route.RequestBody = Api.Route.RequestBody
>( body: Api.Route.Request<T> ) => {

try {

return await body.clone().json<T>()

// eslint-disable-next-line @typescript-eslint/no-unused-vars
} catch ( error ) {

return null

}

}
Loading

0 comments on commit b6ce250

Please sign in to comment.