diff --git a/benchmark/package.json b/benchmark/package.json index e9af195fbc..369647e529 100644 --- a/benchmark/package.json +++ b/benchmark/package.json @@ -73,6 +73,6 @@ "suppress-warnings": "^1.0.2", "tstl": "^2.5.13", "uuid": "^9.0.1", - "typia": "D:\\github\\samchon\\typia\\typia-5.5.0.tgz" + "typia": "D:\\github\\samchon\\typia\\typia-5.5.1.tgz" } } \ No newline at end of file diff --git a/debug/features/functional.ts b/debug/features/functional.ts index 763b3eb892..eef97aae99 100644 --- a/debug/features/functional.ts +++ b/debug/features/functional.ts @@ -1,12 +1,13 @@ import fs from "fs"; import typia from "typia"; +type Something = Promise; +const plus = async (x: number, y: number): Something => x + y; + try { fs.mkdirSync(__dirname + "/../bin"); } catch {} -const func = typia.functional.validateFunction( - (x: number, y: number): number => x + y, -); +const func = typia.functional.isReturn(plus); fs.writeFileSync(`${__dirname}/../bin/functional.js`, func.toString(), "utf8"); console.log(func(3, 4)); diff --git a/debug/package.json b/debug/package.json index e49a94a17f..e52e7816bd 100644 --- a/debug/package.json +++ b/debug/package.json @@ -15,6 +15,6 @@ "typescript": "^5.3.2" }, "dependencies": { - "typia": "D:\\github\\samchon\\typia\\typia-5.5.0-dev.20240305.tgz" + "typia": "D:\\github\\samchon\\typia\\typia-5.5.1-dev.20240307-2.tgz" } } \ No newline at end of file diff --git a/errors/package.json b/errors/package.json index 66f12a41ad..278274f309 100644 --- a/errors/package.json +++ b/errors/package.json @@ -32,6 +32,6 @@ "typescript": "^5.3.2" }, "dependencies": { - "typia": "D:\\github\\samchon\\typia\\typia-5.5.0.tgz" + "typia": "D:\\github\\samchon\\typia\\typia-5.5.1.tgz" } } \ No newline at end of file diff --git a/package.json b/package.json index 3cac70a3c7..0094c8ca87 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "typia", - "version": "5.5.0", + "version": "5.5.1", "description": "Superfast runtime validators with only one line", "main": "lib/index.js", "typings": "lib/index.d.ts", diff --git a/packages/typescript-json/package.json b/packages/typescript-json/package.json index 8d6542d0c4..b974e44d2a 100644 --- a/packages/typescript-json/package.json +++ b/packages/typescript-json/package.json @@ -1,6 +1,6 @@ { "name": "typescript-json", - "version": "5.5.0", + "version": "5.5.1", "description": "Superfast runtime validators with only one line", "main": "lib/index.js", "typings": "lib/index.d.ts", @@ -62,7 +62,7 @@ }, "homepage": "https://typia.io", "dependencies": { - "typia": "5.5.0" + "typia": "5.5.1" }, "peerDependencies": { "typescript": ">=4.8.0 <5.5.0" diff --git a/src/programmers/functional/FunctionalAssertFunctionProgrammer.ts b/src/programmers/functional/FunctionalAssertFunctionProgrammer.ts index 3e2942602a..5dba56c1f7 100644 --- a/src/programmers/functional/FunctionalAssertFunctionProgrammer.ts +++ b/src/programmers/functional/FunctionalAssertFunctionProgrammer.ts @@ -24,14 +24,7 @@ export namespace FunctionalAssertFunctionProgrammer { const wrapper = errorFactoryWrapper(modulo)(declaration.parameters)(init); const { async, returns } = FunctionAssertReturnProgrammer.returnStatement( project, - )(modulo)(equals)( - expression, - declaration.type, - declaration.parameters.map((p) => - ts.factory.createIdentifier(p.name.getText()), - ), - wrapper.name, - ); + )(modulo)(equals)(expression, declaration, wrapper.name); return ts.factory.createArrowFunction( async ? [ts.factory.createModifier(ts.SyntaxKind.AsyncKeyword)] diff --git a/src/programmers/functional/FunctionalAssertParametersProgrammer.ts b/src/programmers/functional/FunctionalAssertParametersProgrammer.ts index 601cee2250..03e0e32b11 100644 --- a/src/programmers/functional/FunctionalAssertParametersProgrammer.ts +++ b/src/programmers/functional/FunctionalAssertParametersProgrammer.ts @@ -6,6 +6,7 @@ import { IProject } from "../../transformers/IProject"; import { AssertProgrammer } from "../AssertProgrammer"; import { FunctionalAssertFunctionProgrammer } from "./FunctionalAssertFunctionProgrammer"; +import { FunctionalGeneralProgrammer } from "./internal/FunctionalGeneralProgrammer"; export namespace FunctionalAssertParametersProgrammer { export const write = @@ -20,13 +21,9 @@ export namespace FunctionalAssertParametersProgrammer { const wrapper = FunctionalAssertFunctionProgrammer.errorFactoryWrapper( modulo, )(declaration.parameters)(init); - const async: boolean = (() => { - if (declaration.type === undefined) return false; - const type: ts.Type = project.checker.getTypeFromTypeNode( - declaration.type, - ); - return type.isTypeParameter() && type.symbol.name === "Promise"; - })(); + const { async } = FunctionalGeneralProgrammer.getReturnType( + project.checker, + )(declaration); return ts.factory.createArrowFunction( async ? [ts.factory.createModifier(ts.SyntaxKind.AsyncKeyword)] diff --git a/src/programmers/functional/FunctionalAssertReturnProgrammer.ts b/src/programmers/functional/FunctionalAssertReturnProgrammer.ts index e2e0a9f4c0..6555fa50d9 100644 --- a/src/programmers/functional/FunctionalAssertReturnProgrammer.ts +++ b/src/programmers/functional/FunctionalAssertReturnProgrammer.ts @@ -1,11 +1,10 @@ import ts from "typescript"; -import { TypeFactory } from "../../factories/TypeFactory"; - import { IProject } from "../../transformers/IProject"; import { AssertProgrammer } from "../AssertProgrammer"; import { FunctionalAssertFunctionProgrammer } from "./FunctionalAssertFunctionProgrammer"; +import { FunctionalGeneralProgrammer } from "./internal/FunctionalGeneralProgrammer"; export namespace FunctionAssertReturnProgrammer { export const write = @@ -22,14 +21,7 @@ export namespace FunctionAssertReturnProgrammer { )(declaration.parameters)(init); const { async, returns: statement } = returnStatement(project)(modulo)( equals, - )( - expression, - declaration.type, - declaration.parameters.map((p) => - ts.factory.createIdentifier(p.name.getText()), - ), - wrapper.name, - ); + )(expression, declaration, wrapper.name); return ts.factory.createArrowFunction( async ? [ts.factory.createModifier(ts.SyntaxKind.AsyncKeyword)] @@ -48,25 +40,21 @@ export namespace FunctionAssertReturnProgrammer { (equals: boolean) => ( expression: ts.Expression, - typeNode: ts.TypeNode | undefined, - argumentExpressions: ts.Expression[], + declaration: ts.FunctionDeclaration, wrapper: string, ): { async: boolean; returns: ts.ReturnStatement; } => { - const [type, async]: [ts.Type, boolean] = (() => { - const type: ts.Type = project.checker.getTypeFromTypeNode( - typeNode ?? TypeFactory.keyword("any"), - ); - return type.isTypeParameter() && type.symbol.name === "Promise" - ? [type.aliasTypeArguments![0]!, true] - : [type, false]; - })(); + const { type, async } = FunctionalGeneralProgrammer.getReturnType( + project.checker, + )(declaration); const caller: ts.CallExpression = ts.factory.createCallExpression( expression, undefined, - argumentExpressions, + declaration.parameters.map((p) => + ts.factory.createIdentifier(p.name.getText()), + ), ); return { async, diff --git a/src/programmers/functional/FunctionalIsFunctionProgrammer.ts b/src/programmers/functional/FunctionalIsFunctionProgrammer.ts index 6505c0e77e..39ec9f339a 100644 --- a/src/programmers/functional/FunctionalIsFunctionProgrammer.ts +++ b/src/programmers/functional/FunctionalIsFunctionProgrammer.ts @@ -25,11 +25,12 @@ export namespace FunctionalIsFunctionProgrammer { : undefined, undefined, declaration.parameters, - ts.factory.createUnionTypeNode([ - declaration.type ?? - ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword), - ts.factory.createTypeReferenceNode("null"), - ]), + declaration.type + ? ts.factory.createUnionTypeNode([ + declaration.type, + ts.factory.createTypeReferenceNode("null"), + ]) + : undefined, undefined, ts.factory.createBlock( [ diff --git a/src/programmers/functional/FunctionalIsParametersProgrammer.ts b/src/programmers/functional/FunctionalIsParametersProgrammer.ts index 2ecc2321e5..c31b3fb8ef 100644 --- a/src/programmers/functional/FunctionalIsParametersProgrammer.ts +++ b/src/programmers/functional/FunctionalIsParametersProgrammer.ts @@ -5,6 +5,7 @@ import { TypeFactory } from "../../factories/TypeFactory"; import { IProject } from "../../transformers/IProject"; import { IsProgrammer } from "../IsProgrammer"; +import { FunctionalGeneralProgrammer } from "./internal/FunctionalGeneralProgrammer"; export namespace FunctionalIsParametersProgrammer { export const write = @@ -15,23 +16,21 @@ export namespace FunctionalIsParametersProgrammer { expression: ts.Expression, declaration: ts.FunctionDeclaration, ): ts.ArrowFunction => { - const async: boolean = (() => { - if (declaration.type === undefined) return false; - const type: ts.Type = project.checker.getTypeFromTypeNode( - declaration.type, - ); - return type.isTypeParameter() && type.symbol.name === "Promise"; - })(); + const { async } = FunctionalGeneralProgrammer.getReturnType( + project.checker, + )(declaration); return ts.factory.createArrowFunction( async ? [ts.factory.createModifier(ts.SyntaxKind.AsyncKeyword)] : undefined, undefined, declaration.parameters, - ts.factory.createUnionTypeNode([ - declaration.type ?? TypeFactory.keyword("any"), - ts.factory.createTypeReferenceNode("null"), - ]), + declaration.type + ? ts.factory.createUnionTypeNode([ + declaration.type, + ts.factory.createTypeReferenceNode("null"), + ]) + : undefined, undefined, ts.factory.createBlock( [ diff --git a/src/programmers/functional/FunctionalIsReturnProgrammer.ts b/src/programmers/functional/FunctionalIsReturnProgrammer.ts index 9c0b050e3d..1f3cb5c14b 100644 --- a/src/programmers/functional/FunctionalIsReturnProgrammer.ts +++ b/src/programmers/functional/FunctionalIsReturnProgrammer.ts @@ -1,13 +1,13 @@ import ts from "typescript"; import { StatementFactory } from "../../factories/StatementFactory"; -import { TypeFactory } from "../../factories/TypeFactory"; import { IProject } from "../../transformers/IProject"; import { StringUtil } from "../../utils/StringUtil"; import { IsProgrammer } from "../IsProgrammer"; +import { FunctionalGeneralProgrammer } from "./internal/FunctionalGeneralProgrammer"; export namespace FunctionalIsReturnProgrammer { export const write = @@ -28,10 +28,12 @@ export namespace FunctionalIsReturnProgrammer { : undefined, undefined, declaration.parameters, - ts.factory.createUnionTypeNode([ - declaration.type ?? TypeFactory.keyword("any"), - ts.factory.createTypeReferenceNode("null"), - ]), + declaration.type + ? ts.factory.createUnionTypeNode([ + declaration.type, + ts.factory.createTypeReferenceNode("null"), + ]) + : undefined, undefined, ts.factory.createBlock(statements, true), ); @@ -48,14 +50,9 @@ export namespace FunctionalIsReturnProgrammer { async: boolean; statements: ts.Statement[]; } => { - const [type, async]: [ts.Type, boolean] = (() => { - const type: ts.Type = project.checker.getTypeFromTypeNode( - declaration.type ?? TypeFactory.keyword("any"), - ); - return type.isTypeParameter() && type.symbol.name === "Promise" - ? [type.aliasTypeArguments![0]!, true] - : [type, false]; - })(); + const { type, async } = FunctionalGeneralProgrammer.getReturnType( + project.checker, + )(declaration); const caller: ts.CallExpression = ts.factory.createCallExpression( expression, undefined, diff --git a/src/programmers/functional/FunctionalValidateParametersProgrammer.ts b/src/programmers/functional/FunctionalValidateParametersProgrammer.ts index 1844735f60..dd98e7ec5d 100644 --- a/src/programmers/functional/FunctionalValidateParametersProgrammer.ts +++ b/src/programmers/functional/FunctionalValidateParametersProgrammer.ts @@ -10,6 +10,7 @@ import { StringUtil } from "../../utils/StringUtil"; import { ValidateProgrammer } from "../ValidateProgrammer"; import { FunctionalValidateFunctionProgrammer } from "./FunctionalValidateFunctionProgrammer"; +import { FunctionalGeneralProgrammer } from "./internal/FunctionalGeneralProgrammer"; export namespace FunctionalValidateParametersProgrammer { export const write = @@ -20,13 +21,9 @@ export namespace FunctionalValidateParametersProgrammer { expression: ts.Expression, declaration: ts.FunctionDeclaration, ): ts.ArrowFunction => { - const async: boolean = (() => { - if (declaration.type === undefined) return false; - const type: ts.Type = project.checker.getTypeFromTypeNode( - declaration.type, - ); - return type.isTypeParameter() && type.symbol.name === "Promise"; - })(); + const { async } = FunctionalGeneralProgrammer.getReturnType( + project.checker, + )(declaration); const caller: ts.CallExpression = ts.factory.createCallExpression( expression, undefined, diff --git a/src/programmers/functional/FunctionalValidateReturnProgrammer.ts b/src/programmers/functional/FunctionalValidateReturnProgrammer.ts index f4a1800115..7191db6419 100644 --- a/src/programmers/functional/FunctionalValidateReturnProgrammer.ts +++ b/src/programmers/functional/FunctionalValidateReturnProgrammer.ts @@ -1,7 +1,6 @@ import ts from "typescript"; import { StatementFactory } from "../../factories/StatementFactory"; -import { TypeFactory } from "../../factories/TypeFactory"; import { IProject } from "../../transformers/IProject"; @@ -9,6 +8,7 @@ import { StringUtil } from "../../utils/StringUtil"; import { ValidateProgrammer } from "../ValidateProgrammer"; import { FunctionalValidateFunctionProgrammer } from "./FunctionalValidateFunctionProgrammer"; +import { FunctionalGeneralProgrammer } from "./internal/FunctionalGeneralProgrammer"; export namespace FunctionalValidateReturnProgrammer { export const write = @@ -55,14 +55,9 @@ export namespace FunctionalValidateReturnProgrammer { async: boolean; statements: ts.Statement[]; } => { - const [type, async]: [ts.Type, boolean] = (() => { - const type: ts.Type = project.checker.getTypeFromTypeNode( - declaration.type ?? TypeFactory.keyword("any"), - ); - return type.isTypeParameter() && type.symbol.name === "Promise" - ? [type.aliasTypeArguments![0]!, true] - : [type, false]; - })(); + const { type, async } = FunctionalGeneralProgrammer.getReturnType( + project.checker, + )(declaration); const caller: ts.CallExpression = ts.factory.createCallExpression( expression, undefined, diff --git a/src/programmers/functional/internal/FunctionalGeneralProgrammer.ts b/src/programmers/functional/internal/FunctionalGeneralProgrammer.ts new file mode 100644 index 0000000000..36c458ff30 --- /dev/null +++ b/src/programmers/functional/internal/FunctionalGeneralProgrammer.ts @@ -0,0 +1,32 @@ +import ts from "typescript"; + +import { TypeFactory } from "../../../factories/TypeFactory"; + +export namespace FunctionalGeneralProgrammer { + export interface IOutput { + type: ts.Type; + async: boolean; + } + export const getReturnType = + (checker: ts.TypeChecker) => + (declaration: ts.FunctionDeclaration): IOutput => { + const signature: ts.Signature | undefined = + checker.getSignatureFromDeclaration(declaration); + const type: ts.Type = + signature?.getReturnType() ?? + checker.getTypeFromTypeNode(TypeFactory.keyword("any")); + + if (type.symbol?.name === "Promise") { + const generic: readonly ts.Type[] = checker.getTypeArguments( + type as ts.TypeReference, + ); + return generic.length === 1 + ? { type: generic[0]!, async: true } + : { + type: checker.getTypeFromTypeNode(TypeFactory.keyword("any")), + async: false, + }; + } + return { type, async: false }; + }; +} diff --git a/test/package.json b/test/package.json index aef163c664..34e3898aed 100644 --- a/test/package.json +++ b/test/package.json @@ -49,6 +49,6 @@ "suppress-warnings": "^1.0.2", "tstl": "^2.5.13", "uuid": "^9.0.1", - "typia": "D:\\github\\samchon\\typia\\typia-5.5.0.tgz" + "typia": "D:\\github\\samchon\\typia\\typia-5.5.1.tgz" } } \ No newline at end of file diff --git a/website/package-lock.json b/website/package-lock.json index 0e5f00c540..a92b354f4b 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -33,7 +33,7 @@ "next-sitemap": "^4.0.7", "rimraf": "^5.0.0", "ts-node": "^10.9.1", - "typia": "^5.5.0" + "typia": "^5.5.1" } }, "node_modules/@babel/code-frame": { @@ -7731,9 +7731,9 @@ } }, "node_modules/typia": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/typia/-/typia-5.5.0.tgz", - "integrity": "sha512-nr6MfHRjfY67IcNbTu4pG/BqfRDezaCQrDF1eoHYQXlr2qTo9clBVOvjIkABZMXjsvb5ZR8sIwC44O7TO/eZsQ==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/typia/-/typia-5.5.1.tgz", + "integrity": "sha512-BSOsqzokAP5kqaghWDho4YkV1W5ob2YHEyMvLVkC/Bfhgm8GRjg4fyzmg4LT28/2emy/Zojtb7go8Yhg33AJrA==", "dev": true, "dependencies": { "commander": "^10.0.0", diff --git a/website/package.json b/website/package.json index e350be0085..b0dcd3e791 100644 --- a/website/package.json +++ b/website/package.json @@ -43,6 +43,6 @@ "next-sitemap": "^4.0.7", "rimraf": "^5.0.0", "ts-node": "^10.9.1", - "typia": "^5.5.0" + "typia": "^5.5.1" } } diff --git a/website/pages/docs/validators/functional.mdx b/website/pages/docs/validators/functional.mdx index 5ee9fc239d..18c0582e29 100644 --- a/website/pages/docs/validators/functional.mdx +++ b/website/pages/docs/validators/functional.mdx @@ -50,9 +50,11 @@ Also, if what you want is not just finding the first type error through assertio ```typescript copy filename="examples/src/assertFunction.ts" showLineNumbers import typia from "typia"; -typia.functional.assertFunction( - (x: number, y: number) => x + y, -)(3, 4); +const func = typia.functional.assertFunction( + (x: number, y: number): number => x + y, +); +func(3, 4); +func(4, 5); ``` @@ -65,7 +67,7 @@ var __importDefault = }; Object.defineProperty(exports, "__esModule", { value: true }); const typia_1 = __importDefault(require("typia")); -((x, y) => { +const func = (x, y) => { const errorFactoryWrapper = typia_1.default.functional.assertFunction.errorFactory; (( @@ -139,15 +141,29 @@ const typia_1 = __importDefault(require("typia")); }), ) => { const __is = (input) => { - return true; + return "number" === typeof input; }; if (false === __is(input)) ((input, _path, _exceptionable = true) => { - return true; + const $guard = typia_1.default.functional.assertFunction.guard; + return ( + "number" === typeof input || + $guard( + true, + { + path: _path + "", + expected: "number", + value: input, + }, + errorFactory, + ) + ); })(input, "$input", true); return input; })(((x, y) => x + y)(x, y)); -})(3, 4); +}; +func(3, 4); +func(4, 5); ``` @@ -187,9 +203,11 @@ Also, if what you want is not just type checking, but want to know the detailed ```typescript copy filename="examples/src/isFunction.ts" showLineNumbers import typia from "typia"; -typia.functional.isFunction( - (x: number, y: number) => x + y, -)(3, 4); +const func = typia.functional.isFunction( + (x: number, y: number): number => x + y, +); +func(3, 4); +func(4, 5); ``` @@ -202,7 +220,7 @@ var __importDefault = }; Object.defineProperty(exports, "__esModule", { value: true }); const typia_1 = __importDefault(require("typia")); -((x, y) => { +const func = (x, y) => { if ( false === ((input) => { @@ -219,60 +237,13 @@ const typia_1 = __importDefault(require("typia")); return null; const result = ((x, y) => x + y)(x, y); return ((input) => { - return true; + return "number" === typeof input; })(result) ? result : null; -})(3, 4); -``` - - - - - - -## `validateFunction()` -typia, - IValidation.ts -]}> - -```typescript showLineNumbers -export namespace functional { - export function validateFunction any>( - func: T, - ): T extends (...args: infer Arguments) => infer Output - ? Output extends Promise - ? (...args: Arguments) => Promise> - : (...args: Arguments) => IValidation - : never; - export function validateParameters; - export function validateReturn; - - export function validateEqualsFunction; - export function validateEqualsParameters; - export function validateEqualsReturn; -} -``` - - -```typescript showLineNumbers -export type IValidation = IValidation.ISuccess | IValidation.IFailure; -export namespace IValidation { - export interface ISuccess { - success: true; - data: T; - } - export interface IFailure { - success: false; - errors: IError[]; - } - export interface IError { - path: string; - expected: string; - value: any; - } -} +}; +func(3, 4); +func(4, 5); ``` @@ -295,9 +266,11 @@ Also, if what you want is not retrieving every type errors, but just finding the ```typescript copy filename="examples/src/validateFunction.ts" showLineNumbers import typia from "typia"; -typia.functional.validateFunction( - (x: number, y: number) => x + y, -)(3, 4); +const func = typia.functional.validateFunction( + (x: number, y: number): number => x + y, +); +func(3, 4); +func(4, 5); ``` @@ -310,7 +283,7 @@ var __importDefault = }; Object.defineProperty(exports, "__esModule", { value: true }); const typia_1 = __importDefault(require("typia")); -((x, y) => { +const func = (x, y) => { const paramResults = [ ((input) => { const errors = []; @@ -380,13 +353,20 @@ const typia_1 = __importDefault(require("typia")); const result = ((input) => { const errors = []; const __is = (input) => { - return true; + return "number" === typeof input; }; if (false === __is(input)) { const $report = typia_1.default.functional.validateFunction.report(errors); ((input, _path, _exceptionable = true) => { - return true; + return ( + "number" === typeof input || + $report(true, { + path: _path + "", + expected: "number", + value: input, + }) + ); })(input, "$input", true); } const success = 0 === errors.length; @@ -402,7 +382,9 @@ const typia_1 = __importDefault(require("typia")); path: error.path.replace("$input", "$input.return"), })); return result; -})(3, 4); +}; +func(3, 4); +func(4, 5); ``` \ No newline at end of file diff --git a/website/public/sitemap-0.xml b/website/public/sitemap-0.xml index 6c417eb6dd..14b5303488 100644 --- a/website/public/sitemap-0.xml +++ b/website/public/sitemap-0.xml @@ -1,24 +1,24 @@ -https://typia.io/2024-03-05T18:08:20.500Zdaily0.7 -https://typia.io/docs/2024-03-05T18:08:20.501Zdaily0.7 -https://typia.io/docs/json/parse/2024-03-05T18:08:20.501Zdaily0.7 -https://typia.io/docs/json/schema/2024-03-05T18:08:20.501Zdaily0.7 -https://typia.io/docs/json/stringify/2024-03-05T18:08:20.501Zdaily0.7 -https://typia.io/docs/misc/2024-03-05T18:08:20.501Zdaily0.7 -https://typia.io/docs/protobuf/decode/2024-03-05T18:08:20.501Zdaily0.7 -https://typia.io/docs/protobuf/encode/2024-03-05T18:08:20.501Zdaily0.7 -https://typia.io/docs/protobuf/message/2024-03-05T18:08:20.501Zdaily0.7 -https://typia.io/docs/pure/2024-03-05T18:08:20.501Zdaily0.7 -https://typia.io/docs/random/2024-03-05T18:08:20.501Zdaily0.7 -https://typia.io/docs/setup/2024-03-05T18:08:20.501Zdaily0.7 -https://typia.io/docs/utilization/nestjs/2024-03-05T18:08:20.501Zdaily0.7 -https://typia.io/docs/utilization/prisma/2024-03-05T18:08:20.501Zdaily0.7 -https://typia.io/docs/utilization/trpc/2024-03-05T18:08:20.501Zdaily0.7 -https://typia.io/docs/validators/assert/2024-03-05T18:08:20.501Zdaily0.7 -https://typia.io/docs/validators/functional/2024-03-05T18:08:20.501Zdaily0.7 -https://typia.io/docs/validators/is/2024-03-05T18:08:20.501Zdaily0.7 -https://typia.io/docs/validators/tags/2024-03-05T18:08:20.501Zdaily0.7 -https://typia.io/docs/validators/validate/2024-03-05T18:08:20.501Zdaily0.7 -https://typia.io/playground/2024-03-05T18:08:20.501Zdaily0.7 +https://typia.io/2024-03-06T19:17:13.960Zdaily0.7 +https://typia.io/docs/2024-03-06T19:17:13.961Zdaily0.7 +https://typia.io/docs/json/parse/2024-03-06T19:17:13.961Zdaily0.7 +https://typia.io/docs/json/schema/2024-03-06T19:17:13.961Zdaily0.7 +https://typia.io/docs/json/stringify/2024-03-06T19:17:13.961Zdaily0.7 +https://typia.io/docs/misc/2024-03-06T19:17:13.961Zdaily0.7 +https://typia.io/docs/protobuf/decode/2024-03-06T19:17:13.961Zdaily0.7 +https://typia.io/docs/protobuf/encode/2024-03-06T19:17:13.961Zdaily0.7 +https://typia.io/docs/protobuf/message/2024-03-06T19:17:13.961Zdaily0.7 +https://typia.io/docs/pure/2024-03-06T19:17:13.961Zdaily0.7 +https://typia.io/docs/random/2024-03-06T19:17:13.961Zdaily0.7 +https://typia.io/docs/setup/2024-03-06T19:17:13.961Zdaily0.7 +https://typia.io/docs/utilization/nestjs/2024-03-06T19:17:13.961Zdaily0.7 +https://typia.io/docs/utilization/prisma/2024-03-06T19:17:13.961Zdaily0.7 +https://typia.io/docs/utilization/trpc/2024-03-06T19:17:13.961Zdaily0.7 +https://typia.io/docs/validators/assert/2024-03-06T19:17:13.961Zdaily0.7 +https://typia.io/docs/validators/functional/2024-03-06T19:17:13.961Zdaily0.7 +https://typia.io/docs/validators/is/2024-03-06T19:17:13.961Zdaily0.7 +https://typia.io/docs/validators/tags/2024-03-06T19:17:13.961Zdaily0.7 +https://typia.io/docs/validators/validate/2024-03-06T19:17:13.961Zdaily0.7 +https://typia.io/playground/2024-03-06T19:17:13.961Zdaily0.7 \ No newline at end of file