Skip to content

Commit

Permalink
feat: add createServerActionsValidator for Server Actions
Browse files Browse the repository at this point in the history
  • Loading branch information
kotarella1110 committed Oct 17, 2023
1 parent 17a7589 commit 21c13aa
Show file tree
Hide file tree
Showing 4 changed files with 331 additions and 1 deletion.
16 changes: 15 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,28 @@
"types": "./dist/index.d.ts",
"import": "./dist/index.esm.mjs",
"require": "./dist/index.cjs.js"
},
"./server": {
"types": "./dist/server/index.d.ts",
"import": "./dist/server/index.mjs",
"require": "./dist/server/index.cjs"
}
},
"typesVersions": {
"*": {
"server": [
"types/server/index.d.ts"
]
}
},
"scripts": {
"clean": "rimraf dist",
"prebuild": "pnpm clean",
"build": "pnpm build:modern",
"build": "pnpm build:modern && pnpm build:server",
"build:watch": "pnpm build:modern -w",
"postbuild": "rimraf dist/__tests__ && node ./scripts/rollup/assert-esm-exports.mjs && node ./scripts/rollup/assert-cjs-exports.cjs",
"build:modern": "rollup -c ./scripts/rollup/rollup.config.js",
"build:server": "esbuild src/server/index.ts --bundle --format=cjs --out-extension:.js=.cjs --outbase=src --outdir=dist && esbuild src/server/index.ts --bundle --format=esm --out-extension:.js=.mjs --outbase=src --outdir=dist",
"build:esm": "rollup -c ./scripts/rollup/rollup.esm.config.js",
"prettier:fix": "prettier --config .prettierrc --write \"**/*.{js,ts,tsx,css}\"",
"lint": "eslint '**/*.{js,ts,tsx}'",
Expand Down Expand Up @@ -86,6 +99,7 @@
"@typescript-eslint/parser": "^5.59.9",
"bundlewatch": "^0.3.3",
"cypress": "^10.11.0",
"esbuild": "^0.19.5",
"eslint": "^8.42.0",
"eslint-config-prettier": "^8.8.0",
"eslint-plugin-cypress": "^2.13.3",
Expand Down
230 changes: 230 additions & 0 deletions pnpm-lock.yaml

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

85 changes: 85 additions & 0 deletions src/server/createServerActionsValidator.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
import {
DeepMap,
DeepPartial,
ErrorOption,
FieldErrors,
FieldPath,
FieldValues,
RegisterOptions,
Resolver,
} from '../types';
import set from '../utils/set';

class ServerActionsValidator<TFieldValues extends FieldValues> {
private values: FieldValues | FormData;
private options: { resolver: Resolver<FieldValues> };
private rules: DeepMap<
DeepPartial<TFieldValues>,
RegisterOptions<TFieldValues>
> = {} as DeepMap<DeepPartial<TFieldValues>, RegisterOptions<TFieldValues>>;
private errors: FieldErrors<TFieldValues> = {};

constructor(
values: TFieldValues | FormData,
options: { resolver: Resolver<FieldValues> },
) {
this.values =
values instanceof FormData ? this.formDataToValues(values) : values;
this.options = options;
}

private formDataToValues(formData: FormData) {
return Object.fromEntries(formData.entries()) as TFieldValues;
}

public register(
name: FieldPath<TFieldValues>,
options: RegisterOptions<TFieldValues>,
) {
set(this.rules, name, options);
return this;
}

public async validate() {
if (this.options.resolver) {
const result = await this.options.resolver(this.values, undefined, {
fields: {},
shouldUseNativeValidation: false,
});
this.errors = {
...this.errors,
...result.errors,
};
return this;
}
// TODO: impl native validation
return this;
}

public setError(
name: FieldPath<TFieldValues> | `root.${string}` | 'root',
error: ErrorOption,
) {
set(this.errors, name, error);
return this;
}

public getErrorsResponse(): {
$RHF: true;
errors: FieldErrors<TFieldValues>;
} {
return {
$RHF: true,
errors: this.errors,
};
}

public isValid() {
return Object.keys(this.errors).length === 0;
}
}

export const createServerActionsValidator = <TFieldValues extends FieldValues>(
values: TFieldValues | FormData,
options: { resolver: Resolver<FieldValues> },
) => new ServerActionsValidator(values, options);
1 change: 1 addition & 0 deletions src/server/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './createServerActionsValidator';

0 comments on commit 21c13aa

Please sign in to comment.