feat(core): Added GuardError
This commit is contained in:
parent
425477548f
commit
1d06c878e1
140
.gitlab-ci.yml
140
.gitlab-ci.yml
@ -1,140 +0,0 @@
|
|||||||
# gitzone ci_default
|
|
||||||
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
|
||||||
|
|
||||||
cache:
|
|
||||||
paths:
|
|
||||||
- .npmci_cache/
|
|
||||||
key: '$CI_BUILD_STAGE'
|
|
||||||
|
|
||||||
stages:
|
|
||||||
- security
|
|
||||||
- test
|
|
||||||
- release
|
|
||||||
- metadata
|
|
||||||
|
|
||||||
before_script:
|
|
||||||
- npm install -g @shipzone/npmci
|
|
||||||
|
|
||||||
# ====================
|
|
||||||
# security stage
|
|
||||||
# ====================
|
|
||||||
mirror:
|
|
||||||
stage: security
|
|
||||||
script:
|
|
||||||
- npmci git mirror
|
|
||||||
only:
|
|
||||||
- tags
|
|
||||||
tags:
|
|
||||||
- lossless
|
|
||||||
- docker
|
|
||||||
- notpriv
|
|
||||||
|
|
||||||
auditProductionDependencies:
|
|
||||||
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
|
||||||
stage: security
|
|
||||||
script:
|
|
||||||
- npmci npm prepare
|
|
||||||
- npmci command npm install --production --ignore-scripts
|
|
||||||
- npmci command npm config set registry https://registry.npmjs.org
|
|
||||||
- npmci command npm audit --audit-level=high --only=prod --production
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
allow_failure: true
|
|
||||||
|
|
||||||
auditDevDependencies:
|
|
||||||
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
|
||||||
stage: security
|
|
||||||
script:
|
|
||||||
- npmci npm prepare
|
|
||||||
- npmci command npm install --ignore-scripts
|
|
||||||
- npmci command npm config set registry https://registry.npmjs.org
|
|
||||||
- npmci command npm audit --audit-level=high --only=dev
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
allow_failure: true
|
|
||||||
|
|
||||||
# ====================
|
|
||||||
# test stage
|
|
||||||
# ====================
|
|
||||||
|
|
||||||
testStable:
|
|
||||||
stage: test
|
|
||||||
script:
|
|
||||||
- npmci npm prepare
|
|
||||||
- npmci node install stable
|
|
||||||
- npmci npm install
|
|
||||||
- npmci npm test
|
|
||||||
coverage: /\d+.?\d+?\%\s*coverage/
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
|
|
||||||
testBuild:
|
|
||||||
stage: test
|
|
||||||
script:
|
|
||||||
- npmci npm prepare
|
|
||||||
- npmci node install stable
|
|
||||||
- npmci npm install
|
|
||||||
- npmci command npm run build
|
|
||||||
coverage: /\d+.?\d+?\%\s*coverage/
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
|
|
||||||
release:
|
|
||||||
stage: release
|
|
||||||
script:
|
|
||||||
- npmci node install stable
|
|
||||||
- npmci npm publish
|
|
||||||
only:
|
|
||||||
- tags
|
|
||||||
tags:
|
|
||||||
- lossless
|
|
||||||
- docker
|
|
||||||
- notpriv
|
|
||||||
|
|
||||||
# ====================
|
|
||||||
# metadata stage
|
|
||||||
# ====================
|
|
||||||
codequality:
|
|
||||||
stage: metadata
|
|
||||||
allow_failure: true
|
|
||||||
only:
|
|
||||||
- tags
|
|
||||||
script:
|
|
||||||
- npmci command npm install -g typescript
|
|
||||||
- npmci npm prepare
|
|
||||||
- npmci npm install
|
|
||||||
tags:
|
|
||||||
- lossless
|
|
||||||
- docker
|
|
||||||
- priv
|
|
||||||
|
|
||||||
trigger:
|
|
||||||
stage: metadata
|
|
||||||
script:
|
|
||||||
- npmci trigger
|
|
||||||
only:
|
|
||||||
- tags
|
|
||||||
tags:
|
|
||||||
- lossless
|
|
||||||
- docker
|
|
||||||
- notpriv
|
|
||||||
|
|
||||||
pages:
|
|
||||||
stage: metadata
|
|
||||||
script:
|
|
||||||
- npmci node install lts
|
|
||||||
- npmci command npm install -g @git.zone/tsdoc
|
|
||||||
- npmci npm prepare
|
|
||||||
- npmci npm install
|
|
||||||
- npmci command tsdoc
|
|
||||||
tags:
|
|
||||||
- lossless
|
|
||||||
- docker
|
|
||||||
- notpriv
|
|
||||||
only:
|
|
||||||
- tags
|
|
||||||
artifacts:
|
|
||||||
expire_in: 1 week
|
|
||||||
paths:
|
|
||||||
- public
|
|
||||||
allow_failure: true
|
|
26
changelog.md
Normal file
26
changelog.md
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## 2024-08-25 - 3.1.0 - feat(core)
|
||||||
|
Added Guard Handling and Removed npmci from CI
|
||||||
|
|
||||||
|
- Refactored Guard and GuardSet classes for better modularization
|
||||||
|
- Introduced GuardError for detailed error handling
|
||||||
|
- Updated dependencies versions in package.json
|
||||||
|
- Removed `npmci` configuration from GitLab CI
|
||||||
|
|
||||||
|
## 2024-05-30 - 3.0.0 to 3.0.2 - Core and API updates
|
||||||
|
Series of updates and fixes.
|
||||||
|
|
||||||
|
- BREAKING CHANGE(api): changed API to be more concise
|
||||||
|
- fix(core): update
|
||||||
|
|
||||||
|
## 2022-03-21 - 1.0.5 to 2.0.1 - Core updates and new org scheme
|
||||||
|
Multiple updates including breaking changes and new organizational scheme.
|
||||||
|
|
||||||
|
- BREAKING CHANGE(core): updated to esm
|
||||||
|
- switch to new org scheme
|
||||||
|
|
||||||
|
## 2019-08-07 - 1.0.3 to 1.0.5 - Core updates
|
||||||
|
Fixes for core components.
|
||||||
|
|
||||||
|
- fix(core): update
|
10
package.json
10
package.json
@ -15,14 +15,14 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@api.global/typedserver": "^3.0.50",
|
"@api.global/typedserver": "^3.0.50",
|
||||||
"@git.zone/tsbuild": "^2.1.66",
|
"@git.zone/tsbuild": "^2.1.84",
|
||||||
"@git.zone/tsrun": "^1.2.46",
|
"@git.zone/tsrun": "^1.2.49",
|
||||||
"@git.zone/tstest": "^1.0.77",
|
"@git.zone/tstest": "^1.0.77",
|
||||||
"@push.rocks/tapbundle": "^5.0.8",
|
"@push.rocks/tapbundle": "^5.0.24",
|
||||||
"@types/node": "^20.12.13"
|
"@types/node": "^22.5.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@push.rocks/smartpromise": "^4.0.2",
|
"@push.rocks/smartpromise": "^4.0.4",
|
||||||
"@push.rocks/smartrequest": "^2.0.15"
|
"@push.rocks/smartrequest": "^2.0.15"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
|
723
pnpm-lock.yaml
generated
723
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@ -3,10 +3,10 @@ import * as smartguard from '../ts/index.js';
|
|||||||
import * as typedserver from '@api.global/typedserver';
|
import * as typedserver from '@api.global/typedserver';
|
||||||
import * as smartrequest from '@push.rocks/smartrequest';
|
import * as smartrequest from '@push.rocks/smartrequest';
|
||||||
|
|
||||||
let smartexpressInstance: typedserver.servertools.Server;
|
let typedserverInstance: typedserver.servertools.Server;
|
||||||
|
|
||||||
tap.test('should create a demo smartexpress instance', async () => {
|
tap.test('should create a demo smartexpress instance', async () => {
|
||||||
smartexpressInstance = new typedserver.servertools.Server({
|
typedserverInstance = new typedserver.servertools.Server({
|
||||||
cors: true,
|
cors: true,
|
||||||
forceSsl: false,
|
forceSsl: false,
|
||||||
defaultAnswer: async () => 'hi there',
|
defaultAnswer: async () => 'hi there',
|
||||||
@ -30,7 +30,7 @@ tap.test('should be able to create smartguards for a request', async () => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
smartexpressInstance.addRoute(
|
typedserverInstance.addRoute(
|
||||||
'/testroute',
|
'/testroute',
|
||||||
new typedserver.servertools.Handler('ALL', async (req, res) => {
|
new typedserver.servertools.Handler('ALL', async (req, res) => {
|
||||||
await smartguard.passGuardsOrReject(
|
await smartguard.passGuardsOrReject(
|
||||||
@ -49,7 +49,7 @@ tap.test('should be able to create smartguards for a request', async () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
tap.test('should start server with guards in place', async () => {
|
tap.test('should start server with guards in place', async () => {
|
||||||
await smartexpressInstance.start();
|
await typedserverInstance.start();
|
||||||
});
|
});
|
||||||
|
|
||||||
tap.test('should execute a request', async () => {
|
tap.test('should execute a request', async () => {
|
||||||
@ -59,7 +59,7 @@ tap.test('should execute a request', async () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
tap.test('should end the demo smartexpress instance', async () => {
|
tap.test('should end the demo smartexpress instance', async () => {
|
||||||
await smartexpressInstance.stop();
|
await typedserverInstance.stop();
|
||||||
});
|
});
|
||||||
|
|
||||||
tap.start();
|
tap.start();
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
/**
|
/**
|
||||||
* autocreated commitinfo by @pushrocks/commitinfo
|
* autocreated commitinfo by @push.rocks/commitinfo
|
||||||
*/
|
*/
|
||||||
export const commitinfo = {
|
export const commitinfo = {
|
||||||
name: '@push.rocks/smartguard',
|
name: '@push.rocks/smartguard',
|
||||||
version: '3.0.2',
|
version: '3.1.0',
|
||||||
description: 'A TypeScript library for creating and managing validation guards, aiding in data validation and security checks.'
|
description: 'A TypeScript library for creating and managing validation guards, aiding in data validation and security checks.'
|
||||||
}
|
}
|
||||||
|
@ -9,10 +9,10 @@ export interface IGuardOptions {
|
|||||||
|
|
||||||
export class Guard<T> {
|
export class Guard<T> {
|
||||||
private guardFunction: TGuardFunction<T>;
|
private guardFunction: TGuardFunction<T>;
|
||||||
public guardoOptions: IGuardOptions;
|
public options: IGuardOptions;
|
||||||
constructor(guardFunctionArg: TGuardFunction<T>, optionsArg?: IGuardOptions) {
|
constructor(guardFunctionArg: TGuardFunction<T>, optionsArg?: IGuardOptions) {
|
||||||
this.guardFunction = guardFunctionArg;
|
this.guardFunction = guardFunctionArg;
|
||||||
this.guardoOptions = optionsArg;
|
this.options = optionsArg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -27,7 +27,7 @@ export class Guard<T> {
|
|||||||
public async getFailedHint(dataArg: T) {
|
public async getFailedHint(dataArg: T) {
|
||||||
const result = await this.exec(dataArg);
|
const result = await this.exec(dataArg);
|
||||||
if (!result) {
|
if (!result) {
|
||||||
return this.guardoOptions.failedHint;
|
return this.options.failedHint;
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
8
ts/classes.guarderror.ts
Normal file
8
ts/classes.guarderror.ts
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import * as plugins from './smartguard.plugins.js';
|
||||||
|
|
||||||
|
export class GuardError extends Error {
|
||||||
|
constructor(message: string) {
|
||||||
|
super(message);
|
||||||
|
this.name = 'GuardError';
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
import * as plugins from './smartguard.plugins.js';
|
import * as plugins from './smartguard.plugins.js';
|
||||||
import { Guard, type TGuardFunction } from './smartguard.classes.guard.js';
|
import { Guard, type TGuardFunction } from './classes.guard.js';
|
||||||
|
|
||||||
export interface IExecOptions {
|
export interface IExecOptions {
|
||||||
mode?: 'parallel' | 'serial';
|
mode?: 'parallel' | 'serial';
|
15
ts/index.ts
15
ts/index.ts
@ -1,14 +1,19 @@
|
|||||||
import * as plugins from './smartguard.plugins.js';
|
import * as plugins from './smartguard.plugins.js';
|
||||||
import { Guard } from './smartguard.classes.guard.js';
|
import { Guard } from './classes.guard.js';
|
||||||
import { GuardSet } from './smartguard.classes.guardset.js';
|
export * from './classes.guarderror.js';
|
||||||
export * from './smartguard.classes.guard.js';
|
export * from './classes.guard.js';
|
||||||
export * from './smartguard.classes.guardset.js';
|
export * from './classes.guardset.js';
|
||||||
|
|
||||||
|
import { GuardSet } from './classes.guardset.js';
|
||||||
|
import { GuardError } from './classes.guarderror.js';
|
||||||
export const passGuardsOrReject = async <T>(dataArg: T, guards: Array<Guard<T>>) => {
|
export const passGuardsOrReject = async <T>(dataArg: T, guards: Array<Guard<T>>) => {
|
||||||
const guardSet = new GuardSet<T>(guards);
|
const guardSet = new GuardSet<T>(guards);
|
||||||
const result = await guardSet.allGuardsPass(dataArg);
|
const result = await guardSet.allGuardsPass(dataArg);
|
||||||
if (!result) {
|
if (!result) {
|
||||||
throw new Error('Guard failed');
|
const failedHint = await guardSet.getFailedHint(dataArg);
|
||||||
|
throw new GuardError(`Guards failed:
|
||||||
|
${failedHint}
|
||||||
|
`);
|
||||||
}
|
}
|
||||||
return ;
|
return ;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user