@manifesto-ai/core 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +434 -0
- package/dist/dag/graph.d.ts +62 -0
- package/dist/dag/graph.d.ts.map +1 -0
- package/dist/dag/graph.js +244 -0
- package/dist/dag/graph.js.map +1 -0
- package/dist/dag/index.d.ts +4 -0
- package/dist/dag/index.d.ts.map +1 -0
- package/dist/dag/index.js +4 -0
- package/dist/dag/index.js.map +1 -0
- package/dist/dag/propagation.d.ts +58 -0
- package/dist/dag/propagation.d.ts.map +1 -0
- package/dist/dag/propagation.js +224 -0
- package/dist/dag/propagation.js.map +1 -0
- package/dist/dag/topological.d.ts +33 -0
- package/dist/dag/topological.d.ts.map +1 -0
- package/dist/dag/topological.js +173 -0
- package/dist/dag/topological.js.map +1 -0
- package/dist/domain/define.d.ts +82 -0
- package/dist/domain/define.d.ts.map +1 -0
- package/dist/domain/define.js +91 -0
- package/dist/domain/define.js.map +1 -0
- package/dist/domain/index.d.ts +4 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +4 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/types.d.ts +203 -0
- package/dist/domain/types.d.ts.map +1 -0
- package/dist/domain/types.js +2 -0
- package/dist/domain/types.js.map +1 -0
- package/dist/domain/validate.d.ts +17 -0
- package/dist/domain/validate.d.ts.map +1 -0
- package/dist/domain/validate.js +204 -0
- package/dist/domain/validate.js.map +1 -0
- package/dist/effect/index.d.ts +4 -0
- package/dist/effect/index.d.ts.map +1 -0
- package/dist/effect/index.js +4 -0
- package/dist/effect/index.js.map +1 -0
- package/dist/effect/result.d.ts +100 -0
- package/dist/effect/result.d.ts.map +1 -0
- package/dist/effect/result.js +163 -0
- package/dist/effect/result.js.map +1 -0
- package/dist/effect/runner.d.ts +98 -0
- package/dist/effect/runner.d.ts.map +1 -0
- package/dist/effect/runner.js +321 -0
- package/dist/effect/runner.js.map +1 -0
- package/dist/effect/types.d.ts +169 -0
- package/dist/effect/types.d.ts.map +1 -0
- package/dist/effect/types.js +28 -0
- package/dist/effect/types.js.map +1 -0
- package/dist/expression/analyzer.d.ts +42 -0
- package/dist/expression/analyzer.d.ts.map +1 -0
- package/dist/expression/analyzer.js +166 -0
- package/dist/expression/analyzer.js.map +1 -0
- package/dist/expression/evaluator.d.ts +16 -0
- package/dist/expression/evaluator.d.ts.map +1 -0
- package/dist/expression/evaluator.js +382 -0
- package/dist/expression/evaluator.js.map +1 -0
- package/dist/expression/index.d.ts +5 -0
- package/dist/expression/index.d.ts.map +1 -0
- package/dist/expression/index.js +5 -0
- package/dist/expression/index.js.map +1 -0
- package/dist/expression/parser.d.ts +37 -0
- package/dist/expression/parser.d.ts.map +1 -0
- package/dist/expression/parser.js +201 -0
- package/dist/expression/parser.js.map +1 -0
- package/dist/expression/types.d.ts +123 -0
- package/dist/expression/types.d.ts.map +1 -0
- package/dist/expression/types.js +10 -0
- package/dist/expression/types.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/policy/field-policy.d.ts +63 -0
- package/dist/policy/field-policy.d.ts.map +1 -0
- package/dist/policy/field-policy.js +138 -0
- package/dist/policy/field-policy.js.map +1 -0
- package/dist/policy/index.d.ts +3 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +3 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/precondition.d.ts +58 -0
- package/dist/policy/precondition.d.ts.map +1 -0
- package/dist/policy/precondition.js +115 -0
- package/dist/policy/precondition.js.map +1 -0
- package/dist/runtime/index.d.ts +4 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +4 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/runtime.d.ts +94 -0
- package/dist/runtime/runtime.d.ts.map +1 -0
- package/dist/runtime/runtime.js +294 -0
- package/dist/runtime/runtime.js.map +1 -0
- package/dist/runtime/snapshot.d.ts +39 -0
- package/dist/runtime/snapshot.d.ts.map +1 -0
- package/dist/runtime/snapshot.js +264 -0
- package/dist/runtime/snapshot.js.map +1 -0
- package/dist/runtime/subscription.d.ts +82 -0
- package/dist/runtime/subscription.d.ts.map +1 -0
- package/dist/runtime/subscription.js +222 -0
- package/dist/runtime/subscription.js.map +1 -0
- package/dist/schema/index.d.ts +3 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +3 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/integration.d.ts +89 -0
- package/dist/schema/integration.d.ts.map +1 -0
- package/dist/schema/integration.js +171 -0
- package/dist/schema/integration.js.map +1 -0
- package/dist/schema/validation.d.ts +51 -0
- package/dist/schema/validation.d.ts.map +1 -0
- package/dist/schema/validation.js +212 -0
- package/dist/schema/validation.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { z, type ZodType } from 'zod';
|
|
2
|
+
import type { SourceDefinition, SemanticMeta } from '../domain/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Zod 스키마에서 Manifesto SourceDefinition 생성
|
|
5
|
+
*/
|
|
6
|
+
export declare function schemaToSource<T>(schema: ZodType<T>, semantic: SemanticMeta, options?: {
|
|
7
|
+
defaultValue?: T;
|
|
8
|
+
}): SourceDefinition;
|
|
9
|
+
/**
|
|
10
|
+
* 공통 스키마 타입들
|
|
11
|
+
*/
|
|
12
|
+
export declare const CommonSchemas: {
|
|
13
|
+
/** 이메일 */
|
|
14
|
+
readonly email: () => z.ZodString;
|
|
15
|
+
/** URL */
|
|
16
|
+
readonly url: () => z.ZodString;
|
|
17
|
+
/** 전화번호 (한국) */
|
|
18
|
+
readonly phoneKR: () => z.ZodString;
|
|
19
|
+
/** 사업자등록번호 */
|
|
20
|
+
readonly businessNumber: () => z.ZodString;
|
|
21
|
+
/** 양의 정수 */
|
|
22
|
+
readonly positiveInt: () => z.ZodNumber;
|
|
23
|
+
/** 비음수 정수 */
|
|
24
|
+
readonly nonNegativeInt: () => z.ZodNumber;
|
|
25
|
+
/** 금액 */
|
|
26
|
+
readonly money: () => z.ZodNumber;
|
|
27
|
+
/** 퍼센트 (0-100) */
|
|
28
|
+
readonly percent: () => z.ZodNumber;
|
|
29
|
+
/** 날짜 문자열 (ISO) */
|
|
30
|
+
readonly dateString: () => z.ZodString;
|
|
31
|
+
/** ID 문자열 */
|
|
32
|
+
readonly id: () => z.ZodString;
|
|
33
|
+
/** 선택 옵션 */
|
|
34
|
+
readonly selectOption: <T extends string>(options: readonly T[]) => z.ZodEnum<[T, ...T[]]>;
|
|
35
|
+
/** nullable 래퍼 */
|
|
36
|
+
readonly nullable: <T>(schema: ZodType<T>) => z.ZodNullable<z.ZodType<T, z.ZodTypeDef, T>>;
|
|
37
|
+
/** optional 래퍼 */
|
|
38
|
+
readonly optional: <T>(schema: ZodType<T>) => z.ZodOptional<z.ZodType<T, z.ZodTypeDef, T>>;
|
|
39
|
+
/** 배열 */
|
|
40
|
+
readonly array: <T>(schema: ZodType<T>) => z.ZodArray<z.ZodType<T, z.ZodTypeDef, T>, "many">;
|
|
41
|
+
/** 레코드 */
|
|
42
|
+
readonly record: <T>(schema: ZodType<T>) => z.ZodRecord<z.ZodString, z.ZodType<T, z.ZodTypeDef, T>>;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* 스키마 조합 유틸리티
|
|
46
|
+
*/
|
|
47
|
+
export declare const SchemaUtils: {
|
|
48
|
+
/**
|
|
49
|
+
* 조건부 필수 스키마 생성
|
|
50
|
+
*/
|
|
51
|
+
conditionalRequired<T>(schema: ZodType<T>, condition: (ctx: unknown) => boolean): ZodType<T | undefined>;
|
|
52
|
+
/**
|
|
53
|
+
* 상호 의존 스키마 (둘 중 하나 필수)
|
|
54
|
+
*/
|
|
55
|
+
eitherRequired<T, U>(schema1: ZodType<T>, schema2: ZodType<U>): ZodType<{
|
|
56
|
+
field1?: T;
|
|
57
|
+
field2?: U;
|
|
58
|
+
}>;
|
|
59
|
+
/**
|
|
60
|
+
* 범위 스키마 (min/max)
|
|
61
|
+
*/
|
|
62
|
+
range(min: number, max: number): ZodType<number>;
|
|
63
|
+
/**
|
|
64
|
+
* 길이 제한 문자열
|
|
65
|
+
*/
|
|
66
|
+
stringLength(min: number, max: number): ZodType<string>;
|
|
67
|
+
/**
|
|
68
|
+
* enum 유니온
|
|
69
|
+
*/
|
|
70
|
+
enumUnion<T extends string>(...values: T[]): ZodType<T>;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* 스키마에서 기본값 추출
|
|
74
|
+
*/
|
|
75
|
+
export declare function getSchemaDefault<T>(schema: ZodType<T>): T | undefined;
|
|
76
|
+
/**
|
|
77
|
+
* 스키마 메타데이터 추출
|
|
78
|
+
*/
|
|
79
|
+
export declare function getSchemaMetadata(schema: ZodType): {
|
|
80
|
+
type: string;
|
|
81
|
+
isOptional: boolean;
|
|
82
|
+
isNullable: boolean;
|
|
83
|
+
description?: string;
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Zod 스키마를 JSON Schema로 변환 (간략화)
|
|
87
|
+
*/
|
|
88
|
+
export declare function toJsonSchema(schema: ZodType): Record<string, unknown>;
|
|
89
|
+
//# sourceMappingURL=integration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../../src/schema/integration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,KAAK,OAAO,EAAmB,MAAM,KAAK,CAAC;AACvD,OAAO,KAAK,EAAgB,gBAAgB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvF;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAClB,QAAQ,EAAE,YAAY,EACtB,OAAO,CAAC,EAAE;IACR,YAAY,CAAC,EAAE,CAAC,CAAC;CAClB,GACA,gBAAgB,CAUlB;AAED;;GAEG;AACH,eAAO,MAAM,aAAa;IACxB,UAAU;;IAGV,UAAU;;IAGV,gBAAgB;;IAIhB,cAAc;;IAId,YAAY;;IAGZ,aAAa;;IAGb,SAAS;;IAGT,kBAAkB;;IAGlB,mBAAmB;;IAGnB,aAAa;;IAGb,YAAY;4BACG,CAAC,SAAS,MAAM,WAAW,SAAS,CAAC,EAAE;IAEtD,kBAAkB;wBACP,CAAC,UAAU,OAAO,CAAC,CAAC,CAAC;IAEhC,kBAAkB;wBACP,CAAC,UAAU,OAAO,CAAC,CAAC,CAAC;IAEhC,SAAS;qBACD,CAAC,UAAU,OAAO,CAAC,CAAC,CAAC;IAE7B,UAAU;sBACD,CAAC,UAAU,OAAO,CAAC,CAAC,CAAC;CACtB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,WAAW;IACtB;;OAEG;wBACiB,CAAC,UACX,OAAO,CAAC,CAAC,CAAC,aACP,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,GACnC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAOzB;;OAEG;mBACY,CAAC,EAAE,CAAC,WACR,OAAO,CAAC,CAAC,CAAC,WACV,OAAO,CAAC,CAAC,CAAC,GAClB,OAAO,CAAC;QAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAAC,MAAM,CAAC,EAAE,CAAC,CAAA;KAAE,CAAC;IAWtC;;OAEG;eACQ,MAAM,OAAO,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIhD;;OAEG;sBACe,MAAM,OAAO,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIvD;;OAEG;cACO,CAAC,SAAS,MAAM,aAAa,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;CAMxD,CAAC;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAWrE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CA6BA;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAyBrE"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Zod 스키마에서 Manifesto SourceDefinition 생성
|
|
4
|
+
*/
|
|
5
|
+
export function schemaToSource(schema, semantic, options) {
|
|
6
|
+
return {
|
|
7
|
+
schema,
|
|
8
|
+
defaultValue: options?.defaultValue,
|
|
9
|
+
semantic: {
|
|
10
|
+
readable: true,
|
|
11
|
+
writable: true,
|
|
12
|
+
...semantic,
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 공통 스키마 타입들
|
|
18
|
+
*/
|
|
19
|
+
export const CommonSchemas = {
|
|
20
|
+
/** 이메일 */
|
|
21
|
+
email: () => z.string().email(),
|
|
22
|
+
/** URL */
|
|
23
|
+
url: () => z.string().url(),
|
|
24
|
+
/** 전화번호 (한국) */
|
|
25
|
+
phoneKR: () => z.string().regex(/^01[0-9]-?[0-9]{3,4}-?[0-9]{4}$/, 'Invalid Korean phone number'),
|
|
26
|
+
/** 사업자등록번호 */
|
|
27
|
+
businessNumber: () => z.string().regex(/^[0-9]{3}-?[0-9]{2}-?[0-9]{5}$/, 'Invalid business number'),
|
|
28
|
+
/** 양의 정수 */
|
|
29
|
+
positiveInt: () => z.number().int().positive(),
|
|
30
|
+
/** 비음수 정수 */
|
|
31
|
+
nonNegativeInt: () => z.number().int().nonnegative(),
|
|
32
|
+
/** 금액 */
|
|
33
|
+
money: () => z.number().nonnegative(),
|
|
34
|
+
/** 퍼센트 (0-100) */
|
|
35
|
+
percent: () => z.number().min(0).max(100),
|
|
36
|
+
/** 날짜 문자열 (ISO) */
|
|
37
|
+
dateString: () => z.string().datetime(),
|
|
38
|
+
/** ID 문자열 */
|
|
39
|
+
id: () => z.string().min(1),
|
|
40
|
+
/** 선택 옵션 */
|
|
41
|
+
selectOption: (options) => z.enum(options),
|
|
42
|
+
/** nullable 래퍼 */
|
|
43
|
+
nullable: (schema) => schema.nullable(),
|
|
44
|
+
/** optional 래퍼 */
|
|
45
|
+
optional: (schema) => schema.optional(),
|
|
46
|
+
/** 배열 */
|
|
47
|
+
array: (schema) => z.array(schema),
|
|
48
|
+
/** 레코드 */
|
|
49
|
+
record: (schema) => z.record(schema),
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* 스키마 조합 유틸리티
|
|
53
|
+
*/
|
|
54
|
+
export const SchemaUtils = {
|
|
55
|
+
/**
|
|
56
|
+
* 조건부 필수 스키마 생성
|
|
57
|
+
*/
|
|
58
|
+
conditionalRequired(schema, condition) {
|
|
59
|
+
return schema.optional().superRefine((val, ctx) => {
|
|
60
|
+
// 실제 조건 평가는 런타임에서 수행
|
|
61
|
+
// 여기서는 타입만 정의
|
|
62
|
+
});
|
|
63
|
+
},
|
|
64
|
+
/**
|
|
65
|
+
* 상호 의존 스키마 (둘 중 하나 필수)
|
|
66
|
+
*/
|
|
67
|
+
eitherRequired(schema1, schema2) {
|
|
68
|
+
return z
|
|
69
|
+
.object({
|
|
70
|
+
field1: schema1.optional(),
|
|
71
|
+
field2: schema2.optional(),
|
|
72
|
+
})
|
|
73
|
+
.refine((data) => data.field1 !== undefined || data.field2 !== undefined, {
|
|
74
|
+
message: 'At least one field is required',
|
|
75
|
+
});
|
|
76
|
+
},
|
|
77
|
+
/**
|
|
78
|
+
* 범위 스키마 (min/max)
|
|
79
|
+
*/
|
|
80
|
+
range(min, max) {
|
|
81
|
+
return z.number().min(min).max(max);
|
|
82
|
+
},
|
|
83
|
+
/**
|
|
84
|
+
* 길이 제한 문자열
|
|
85
|
+
*/
|
|
86
|
+
stringLength(min, max) {
|
|
87
|
+
return z.string().min(min).max(max);
|
|
88
|
+
},
|
|
89
|
+
/**
|
|
90
|
+
* enum 유니온
|
|
91
|
+
*/
|
|
92
|
+
enumUnion(...values) {
|
|
93
|
+
if (values.length === 0) {
|
|
94
|
+
throw new Error('At least one value is required');
|
|
95
|
+
}
|
|
96
|
+
return z.enum(values);
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* 스키마에서 기본값 추출
|
|
101
|
+
*/
|
|
102
|
+
export function getSchemaDefault(schema) {
|
|
103
|
+
try {
|
|
104
|
+
// Zod 스키마에서 기본값 추출 시도
|
|
105
|
+
const def = schema._def;
|
|
106
|
+
if ('defaultValue' in def) {
|
|
107
|
+
return def.defaultValue();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// 기본값 없음
|
|
112
|
+
}
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* 스키마 메타데이터 추출
|
|
117
|
+
*/
|
|
118
|
+
export function getSchemaMetadata(schema) {
|
|
119
|
+
const def = schema._def;
|
|
120
|
+
let isOptional = false;
|
|
121
|
+
let isNullable = false;
|
|
122
|
+
let currentSchema = schema;
|
|
123
|
+
let currentDef = def;
|
|
124
|
+
// 래퍼 스키마 언래핑
|
|
125
|
+
while (true) {
|
|
126
|
+
if (currentDef.typeName === 'ZodOptional') {
|
|
127
|
+
isOptional = true;
|
|
128
|
+
currentSchema = currentDef.innerType;
|
|
129
|
+
currentDef = currentSchema._def;
|
|
130
|
+
}
|
|
131
|
+
else if (currentDef.typeName === 'ZodNullable') {
|
|
132
|
+
isNullable = true;
|
|
133
|
+
currentSchema = currentDef.innerType;
|
|
134
|
+
currentDef = currentSchema._def;
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
type: currentDef.typeName ?? 'unknown',
|
|
142
|
+
isOptional,
|
|
143
|
+
isNullable,
|
|
144
|
+
description: currentDef.description,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Zod 스키마를 JSON Schema로 변환 (간략화)
|
|
149
|
+
*/
|
|
150
|
+
export function toJsonSchema(schema) {
|
|
151
|
+
const meta = getSchemaMetadata(schema);
|
|
152
|
+
const typeMap = {
|
|
153
|
+
ZodString: 'string',
|
|
154
|
+
ZodNumber: 'number',
|
|
155
|
+
ZodBoolean: 'boolean',
|
|
156
|
+
ZodArray: 'array',
|
|
157
|
+
ZodObject: 'object',
|
|
158
|
+
ZodNull: 'null',
|
|
159
|
+
};
|
|
160
|
+
const result = {
|
|
161
|
+
type: typeMap[meta.type] ?? meta.type,
|
|
162
|
+
};
|
|
163
|
+
if (meta.description) {
|
|
164
|
+
result.description = meta.description;
|
|
165
|
+
}
|
|
166
|
+
if (meta.isNullable) {
|
|
167
|
+
result.nullable = true;
|
|
168
|
+
}
|
|
169
|
+
return result;
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=integration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.js","sourceRoot":"","sources":["../../src/schema/integration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { z, type ZodType, type ZodError } from 'zod';
|
|
2
|
+
import type { SemanticPath, ValidationResult, ValidationIssue, ManifestoDomain } from '../domain/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Zod 에러를 ValidationResult로 변환
|
|
5
|
+
*/
|
|
6
|
+
export declare function zodErrorToValidationResult(error: ZodError, basePath: SemanticPath): ValidationResult;
|
|
7
|
+
/**
|
|
8
|
+
* 값 검증
|
|
9
|
+
*/
|
|
10
|
+
export declare function validateValue(schema: ZodType, value: unknown, path: SemanticPath): ValidationResult;
|
|
11
|
+
/**
|
|
12
|
+
* 부분 데이터 검증
|
|
13
|
+
*/
|
|
14
|
+
export declare function validatePartial<T extends z.ZodRawShape>(schema: z.ZodObject<T>, data: Partial<z.infer<z.ZodObject<T>>>, basePath: SemanticPath): ValidationResult;
|
|
15
|
+
/**
|
|
16
|
+
* 전체 도메인 데이터 검증
|
|
17
|
+
*/
|
|
18
|
+
export declare function validateDomainData<TData, TState>(domain: ManifestoDomain<TData, TState>, data: TData): ValidationResult;
|
|
19
|
+
/**
|
|
20
|
+
* 필드별 검증 결과 수집
|
|
21
|
+
*/
|
|
22
|
+
export declare function validateFields<TData, TState>(domain: ManifestoDomain<TData, TState>, data: TData): Record<SemanticPath, ValidationResult>;
|
|
23
|
+
/**
|
|
24
|
+
* 비동기 검증 (API 호출 등)
|
|
25
|
+
*/
|
|
26
|
+
export declare function validateAsync(value: unknown, path: SemanticPath, validator: (value: unknown) => Promise<boolean | string>): Promise<ValidationResult>;
|
|
27
|
+
/**
|
|
28
|
+
* 검증 결과 병합
|
|
29
|
+
*/
|
|
30
|
+
export declare function mergeValidationResults(...results: ValidationResult[]): ValidationResult;
|
|
31
|
+
/**
|
|
32
|
+
* 경로별 검증 결과 그룹화
|
|
33
|
+
*/
|
|
34
|
+
export declare function groupValidationByPath(result: ValidationResult): Record<SemanticPath, ValidationIssue[]>;
|
|
35
|
+
/**
|
|
36
|
+
* 심각도별 이슈 필터링
|
|
37
|
+
*/
|
|
38
|
+
export declare function filterBySeverity(result: ValidationResult, severity: ValidationIssue['severity']): ValidationIssue[];
|
|
39
|
+
/**
|
|
40
|
+
* 에러만 추출
|
|
41
|
+
*/
|
|
42
|
+
export declare function getErrors(result: ValidationResult): ValidationIssue[];
|
|
43
|
+
/**
|
|
44
|
+
* 경고만 추출
|
|
45
|
+
*/
|
|
46
|
+
export declare function getWarnings(result: ValidationResult): ValidationIssue[];
|
|
47
|
+
/**
|
|
48
|
+
* 제안만 추출
|
|
49
|
+
*/
|
|
50
|
+
export declare function getSuggestions(result: ValidationResult): ValidationIssue[];
|
|
51
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/schema/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAiB,MAAM,KAAK,CAAC;AACpE,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAG5B;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,YAAY,GACrB,gBAAgB,CASlB;AA0ED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,YAAY,GACjB,gBAAgB,CAQlB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,EACrD,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EACtB,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EACtC,QAAQ,EAAE,YAAY,GACrB,gBAAgB,CAIlB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAC9C,MAAM,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,EACtC,IAAI,EAAE,KAAK,GACV,gBAAgB,CAQlB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAC1C,MAAM,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,EACtC,IAAI,EAAE,KAAK,GACV,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC,CASxC;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,YAAY,EAClB,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,GACvD,OAAO,CAAC,gBAAgB,CAAC,CAgC3B;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,OAAO,EAAE,gBAAgB,EAAE,GAC7B,gBAAgB,CAWlB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,gBAAgB,GACvB,MAAM,CAAC,YAAY,EAAE,eAAe,EAAE,CAAC,CAYzC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,GACpC,eAAe,EAAE,CAEnB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAAG,eAAe,EAAE,CAErE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,eAAe,EAAE,CAEvE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,eAAe,EAAE,CAE1E"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Zod 에러를 ValidationResult로 변환
|
|
4
|
+
*/
|
|
5
|
+
export function zodErrorToValidationResult(error, basePath) {
|
|
6
|
+
const issues = error.issues.map((issue) => zodIssueToValidationIssue(issue, basePath));
|
|
7
|
+
return {
|
|
8
|
+
valid: false,
|
|
9
|
+
issues,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Zod Issue를 ValidationIssue로 변환
|
|
14
|
+
*/
|
|
15
|
+
function zodIssueToValidationIssue(issue, basePath) {
|
|
16
|
+
const pathSuffix = issue.path.join('.');
|
|
17
|
+
const fullPath = pathSuffix ? `${basePath}.${pathSuffix}` : basePath;
|
|
18
|
+
return {
|
|
19
|
+
code: issue.code,
|
|
20
|
+
message: issue.message,
|
|
21
|
+
path: fullPath,
|
|
22
|
+
severity: 'error',
|
|
23
|
+
suggestedFix: generateSuggestedFix(issue),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 자동 수정 제안 생성
|
|
28
|
+
*/
|
|
29
|
+
function generateSuggestedFix(issue) {
|
|
30
|
+
switch (issue.code) {
|
|
31
|
+
case 'invalid_type':
|
|
32
|
+
if (issue.expected === 'string' && issue.received === 'number') {
|
|
33
|
+
return {
|
|
34
|
+
description: 'Convert to string',
|
|
35
|
+
value: ['toString', ['get', '$input']],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
if (issue.expected === 'number' && issue.received === 'string') {
|
|
39
|
+
return {
|
|
40
|
+
description: 'Convert to number',
|
|
41
|
+
value: ['toNumber', ['get', '$input']],
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
break;
|
|
45
|
+
case 'too_small':
|
|
46
|
+
if ('minimum' in issue) {
|
|
47
|
+
return {
|
|
48
|
+
description: `Set to minimum value (${issue.minimum})`,
|
|
49
|
+
value: issue.minimum,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
break;
|
|
53
|
+
case 'too_big':
|
|
54
|
+
if ('maximum' in issue) {
|
|
55
|
+
return {
|
|
56
|
+
description: `Set to maximum value (${issue.maximum})`,
|
|
57
|
+
value: issue.maximum,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
break;
|
|
61
|
+
case 'invalid_string':
|
|
62
|
+
if (issue.validation === 'email') {
|
|
63
|
+
return {
|
|
64
|
+
description: 'Enter a valid email address',
|
|
65
|
+
value: null,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 값 검증
|
|
74
|
+
*/
|
|
75
|
+
export function validateValue(schema, value, path) {
|
|
76
|
+
const result = schema.safeParse(value);
|
|
77
|
+
if (result.success) {
|
|
78
|
+
return { valid: true, issues: [] };
|
|
79
|
+
}
|
|
80
|
+
return zodErrorToValidationResult(result.error, path);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 부분 데이터 검증
|
|
84
|
+
*/
|
|
85
|
+
export function validatePartial(schema, data, basePath) {
|
|
86
|
+
// Partial 스키마로 변환
|
|
87
|
+
const partialSchema = schema.partial();
|
|
88
|
+
return validateValue(partialSchema, data, basePath);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 전체 도메인 데이터 검증
|
|
92
|
+
*/
|
|
93
|
+
export function validateDomainData(domain, data) {
|
|
94
|
+
const result = domain.dataSchema.safeParse(data);
|
|
95
|
+
if (result.success) {
|
|
96
|
+
return { valid: true, issues: [] };
|
|
97
|
+
}
|
|
98
|
+
return zodErrorToValidationResult(result.error, 'data');
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* 필드별 검증 결과 수집
|
|
102
|
+
*/
|
|
103
|
+
export function validateFields(domain, data) {
|
|
104
|
+
const results = {};
|
|
105
|
+
for (const [path, source] of Object.entries(domain.paths.sources)) {
|
|
106
|
+
const value = getNestedValue(data, path.replace('data.', ''));
|
|
107
|
+
results[path] = validateValue(source.schema, value, path);
|
|
108
|
+
}
|
|
109
|
+
return results;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* 비동기 검증 (API 호출 등)
|
|
113
|
+
*/
|
|
114
|
+
export async function validateAsync(value, path, validator) {
|
|
115
|
+
try {
|
|
116
|
+
const result = await validator(value);
|
|
117
|
+
if (result === true) {
|
|
118
|
+
return { valid: true, issues: [] };
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
valid: false,
|
|
122
|
+
issues: [
|
|
123
|
+
{
|
|
124
|
+
code: 'ASYNC_VALIDATION_FAILED',
|
|
125
|
+
message: typeof result === 'string' ? result : 'Validation failed',
|
|
126
|
+
path,
|
|
127
|
+
severity: 'error',
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
catch (e) {
|
|
133
|
+
return {
|
|
134
|
+
valid: false,
|
|
135
|
+
issues: [
|
|
136
|
+
{
|
|
137
|
+
code: 'ASYNC_VALIDATION_ERROR',
|
|
138
|
+
message: e instanceof Error ? e.message : 'Validation error',
|
|
139
|
+
path,
|
|
140
|
+
severity: 'error',
|
|
141
|
+
},
|
|
142
|
+
],
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* 검증 결과 병합
|
|
148
|
+
*/
|
|
149
|
+
export function mergeValidationResults(...results) {
|
|
150
|
+
const allIssues = [];
|
|
151
|
+
for (const result of results) {
|
|
152
|
+
allIssues.push(...result.issues);
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
valid: allIssues.filter((i) => i.severity === 'error').length === 0,
|
|
156
|
+
issues: allIssues,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* 경로별 검증 결과 그룹화
|
|
161
|
+
*/
|
|
162
|
+
export function groupValidationByPath(result) {
|
|
163
|
+
const grouped = {};
|
|
164
|
+
for (const issue of result.issues) {
|
|
165
|
+
const pathIssues = grouped[issue.path];
|
|
166
|
+
if (!pathIssues) {
|
|
167
|
+
grouped[issue.path] = [];
|
|
168
|
+
}
|
|
169
|
+
grouped[issue.path].push(issue);
|
|
170
|
+
}
|
|
171
|
+
return grouped;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* 심각도별 이슈 필터링
|
|
175
|
+
*/
|
|
176
|
+
export function filterBySeverity(result, severity) {
|
|
177
|
+
return result.issues.filter((i) => i.severity === severity);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* 에러만 추출
|
|
181
|
+
*/
|
|
182
|
+
export function getErrors(result) {
|
|
183
|
+
return filterBySeverity(result, 'error');
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* 경고만 추출
|
|
187
|
+
*/
|
|
188
|
+
export function getWarnings(result) {
|
|
189
|
+
return filterBySeverity(result, 'warning');
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* 제안만 추출
|
|
193
|
+
*/
|
|
194
|
+
export function getSuggestions(result) {
|
|
195
|
+
return filterBySeverity(result, 'suggestion');
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* 중첩된 값 가져오기
|
|
199
|
+
*/
|
|
200
|
+
function getNestedValue(obj, path) {
|
|
201
|
+
if (!path)
|
|
202
|
+
return obj;
|
|
203
|
+
const parts = path.split('.');
|
|
204
|
+
let current = obj;
|
|
205
|
+
for (const part of parts) {
|
|
206
|
+
if (current === null || current === undefined)
|
|
207
|
+
return undefined;
|
|
208
|
+
current = current[part];
|
|
209
|
+
}
|
|
210
|
+
return current;
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/schema/validation.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@manifesto-ai/core",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "AI Native Semantic Layer for SaaS Business Logic",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md",
|
|
18
|
+
"LICENSE"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsc",
|
|
22
|
+
"test": "vitest run",
|
|
23
|
+
"test:watch": "vitest",
|
|
24
|
+
"test:coverage": "vitest run --coverage",
|
|
25
|
+
"typecheck": "tsc --noEmit",
|
|
26
|
+
"clean": "rm -rf dist"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"manifesto",
|
|
30
|
+
"ai",
|
|
31
|
+
"semantic",
|
|
32
|
+
"domain",
|
|
33
|
+
"dsl"
|
|
34
|
+
],
|
|
35
|
+
"author": "Manifesto Team",
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "git+https://github.com/manifesto-ai/core.git",
|
|
40
|
+
"directory": "packages/core"
|
|
41
|
+
},
|
|
42
|
+
"homepage": "https://github.com/manifesto-ai/core/tree/main/packages/core#readme",
|
|
43
|
+
"bugs": {
|
|
44
|
+
"url": "https://github.com/manifesto-ai/core/issues"
|
|
45
|
+
},
|
|
46
|
+
"publishConfig": {
|
|
47
|
+
"access": "public"
|
|
48
|
+
},
|
|
49
|
+
"dependencies": {
|
|
50
|
+
"zod": "^3.24.1"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@types/node": "^22.10.2",
|
|
54
|
+
"@vitest/coverage-v8": "^2.1.9",
|
|
55
|
+
"typescript": "^5.7.2",
|
|
56
|
+
"vitest": "^2.1.9"
|
|
57
|
+
}
|
|
58
|
+
}
|