@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,204 @@
|
|
|
1
|
+
const DEFAULT_OPTIONS = {
|
|
2
|
+
checkCycles: true,
|
|
3
|
+
checkUnused: true,
|
|
4
|
+
checkMissingDeps: true,
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* 도메인 정의 유효성 검증
|
|
8
|
+
*/
|
|
9
|
+
export function validateDomain(domain, options = DEFAULT_OPTIONS) {
|
|
10
|
+
const issues = [];
|
|
11
|
+
// 1. 기본 필드 검증
|
|
12
|
+
if (!domain.id || domain.id.trim() === '') {
|
|
13
|
+
issues.push({
|
|
14
|
+
code: 'DOMAIN_ID_REQUIRED',
|
|
15
|
+
message: 'Domain id is required',
|
|
16
|
+
path: 'id',
|
|
17
|
+
severity: 'error',
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
if (!domain.name || domain.name.trim() === '') {
|
|
21
|
+
issues.push({
|
|
22
|
+
code: 'DOMAIN_NAME_REQUIRED',
|
|
23
|
+
message: 'Domain name is required',
|
|
24
|
+
path: 'name',
|
|
25
|
+
severity: 'error',
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
// 2. 모든 정의된 경로 수집
|
|
29
|
+
const allPaths = collectAllPaths(domain);
|
|
30
|
+
// 3. 누락된 의존성 검사
|
|
31
|
+
if (options.checkMissingDeps) {
|
|
32
|
+
const missingDeps = findMissingDependencies(domain, allPaths);
|
|
33
|
+
issues.push(...missingDeps);
|
|
34
|
+
}
|
|
35
|
+
// 4. 순환 의존성 검사
|
|
36
|
+
if (options.checkCycles) {
|
|
37
|
+
const cycles = findCyclicDependencies(domain);
|
|
38
|
+
issues.push(...cycles);
|
|
39
|
+
}
|
|
40
|
+
// 5. 액션 preconditions 검사
|
|
41
|
+
const actionIssues = validateActions(domain, allPaths);
|
|
42
|
+
issues.push(...actionIssues);
|
|
43
|
+
return {
|
|
44
|
+
valid: issues.filter((i) => i.severity === 'error').length === 0,
|
|
45
|
+
issues,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 도메인에 정의된 모든 경로 수집
|
|
50
|
+
*/
|
|
51
|
+
function collectAllPaths(domain) {
|
|
52
|
+
const paths = new Set();
|
|
53
|
+
// Sources
|
|
54
|
+
for (const path of Object.keys(domain.paths.sources)) {
|
|
55
|
+
paths.add(path);
|
|
56
|
+
}
|
|
57
|
+
// Derived
|
|
58
|
+
for (const path of Object.keys(domain.paths.derived)) {
|
|
59
|
+
paths.add(path);
|
|
60
|
+
}
|
|
61
|
+
// Async
|
|
62
|
+
for (const path of Object.keys(domain.paths.async)) {
|
|
63
|
+
paths.add(path);
|
|
64
|
+
const asyncDef = domain.paths.async[path];
|
|
65
|
+
if (asyncDef) {
|
|
66
|
+
paths.add(asyncDef.resultPath);
|
|
67
|
+
paths.add(asyncDef.loadingPath);
|
|
68
|
+
paths.add(asyncDef.errorPath);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return paths;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 누락된 의존성 찾기
|
|
75
|
+
*/
|
|
76
|
+
function findMissingDependencies(domain, allPaths) {
|
|
77
|
+
const issues = [];
|
|
78
|
+
// Derived deps 검사
|
|
79
|
+
for (const [path, def] of Object.entries(domain.paths.derived)) {
|
|
80
|
+
for (const dep of def.deps) {
|
|
81
|
+
if (!allPaths.has(dep) && !isBuiltInPath(dep)) {
|
|
82
|
+
issues.push({
|
|
83
|
+
code: 'MISSING_DEPENDENCY',
|
|
84
|
+
message: `Derived path "${path}" depends on undefined path "${dep}"`,
|
|
85
|
+
path,
|
|
86
|
+
severity: 'error',
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Async deps 검사
|
|
92
|
+
for (const [path, def] of Object.entries(domain.paths.async)) {
|
|
93
|
+
for (const dep of def.deps) {
|
|
94
|
+
if (!allPaths.has(dep) && !isBuiltInPath(dep)) {
|
|
95
|
+
issues.push({
|
|
96
|
+
code: 'MISSING_DEPENDENCY',
|
|
97
|
+
message: `Async path "${path}" depends on undefined path "${dep}"`,
|
|
98
|
+
path,
|
|
99
|
+
severity: 'error',
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Action deps 검사
|
|
105
|
+
for (const [actionId, def] of Object.entries(domain.actions)) {
|
|
106
|
+
for (const dep of def.deps) {
|
|
107
|
+
if (!allPaths.has(dep) && !isBuiltInPath(dep)) {
|
|
108
|
+
issues.push({
|
|
109
|
+
code: 'MISSING_DEPENDENCY',
|
|
110
|
+
message: `Action "${actionId}" depends on undefined path "${dep}"`,
|
|
111
|
+
path: `actions.${actionId}`,
|
|
112
|
+
severity: 'error',
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return issues;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* 순환 의존성 찾기 (DFS)
|
|
121
|
+
*/
|
|
122
|
+
function findCyclicDependencies(domain) {
|
|
123
|
+
const issues = [];
|
|
124
|
+
// 의존성 그래프 구축
|
|
125
|
+
const graph = new Map();
|
|
126
|
+
for (const [path, def] of Object.entries(domain.paths.derived)) {
|
|
127
|
+
graph.set(path, def.deps);
|
|
128
|
+
}
|
|
129
|
+
for (const [path, def] of Object.entries(domain.paths.async)) {
|
|
130
|
+
graph.set(path, def.deps);
|
|
131
|
+
}
|
|
132
|
+
// DFS로 순환 탐지
|
|
133
|
+
const visited = new Set();
|
|
134
|
+
const recursionStack = new Set();
|
|
135
|
+
function dfs(node, pathStack) {
|
|
136
|
+
visited.add(node);
|
|
137
|
+
recursionStack.add(node);
|
|
138
|
+
const deps = graph.get(node) ?? [];
|
|
139
|
+
for (const dep of deps) {
|
|
140
|
+
if (!visited.has(dep)) {
|
|
141
|
+
if (dfs(dep, [...pathStack, dep])) {
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
else if (recursionStack.has(dep)) {
|
|
146
|
+
const cycleStart = pathStack.indexOf(dep);
|
|
147
|
+
const cycle = pathStack.slice(cycleStart).concat(dep);
|
|
148
|
+
issues.push({
|
|
149
|
+
code: 'CYCLIC_DEPENDENCY',
|
|
150
|
+
message: `Cyclic dependency detected: ${cycle.join(' -> ')}`,
|
|
151
|
+
path: node,
|
|
152
|
+
severity: 'error',
|
|
153
|
+
});
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
recursionStack.delete(node);
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
for (const node of graph.keys()) {
|
|
161
|
+
if (!visited.has(node)) {
|
|
162
|
+
dfs(node, [node]);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return issues;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* 액션 유효성 검사
|
|
169
|
+
*/
|
|
170
|
+
function validateActions(domain, allPaths) {
|
|
171
|
+
const issues = [];
|
|
172
|
+
for (const [actionId, def] of Object.entries(domain.actions)) {
|
|
173
|
+
// Preconditions 경로 검사
|
|
174
|
+
if (def.preconditions) {
|
|
175
|
+
for (const cond of def.preconditions) {
|
|
176
|
+
if (!allPaths.has(cond.path) && !isBuiltInPath(cond.path)) {
|
|
177
|
+
issues.push({
|
|
178
|
+
code: 'INVALID_PRECONDITION_PATH',
|
|
179
|
+
message: `Action "${actionId}" has precondition referencing undefined path "${cond.path}"`,
|
|
180
|
+
path: `actions.${actionId}`,
|
|
181
|
+
severity: 'error',
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Semantic verb 필수
|
|
187
|
+
if (!def.semantic.verb || def.semantic.verb.trim() === '') {
|
|
188
|
+
issues.push({
|
|
189
|
+
code: 'ACTION_VERB_REQUIRED',
|
|
190
|
+
message: `Action "${actionId}" requires a verb in semantic metadata`,
|
|
191
|
+
path: `actions.${actionId}`,
|
|
192
|
+
severity: 'warning',
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return issues;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* 빌트인 경로 여부 확인 ($ 등)
|
|
200
|
+
*/
|
|
201
|
+
function isBuiltInPath(path) {
|
|
202
|
+
return path.startsWith('$');
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/domain/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/effect/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/effect/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import type { Effect } from './types.js';
|
|
2
|
+
import type { EvaluationContext } from '../expression/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Result: 성공/실패를 명시적으로 표현
|
|
5
|
+
*/
|
|
6
|
+
export type Result<T, E = EffectError> = {
|
|
7
|
+
ok: true;
|
|
8
|
+
value: T;
|
|
9
|
+
} | {
|
|
10
|
+
ok: false;
|
|
11
|
+
error: E;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* EffectError: Effect 실행 에러
|
|
15
|
+
*/
|
|
16
|
+
export type EffectError = {
|
|
17
|
+
_tag: 'EffectError';
|
|
18
|
+
/** 실패한 Effect */
|
|
19
|
+
effect: Effect;
|
|
20
|
+
/** 에러 원인 */
|
|
21
|
+
cause: Error;
|
|
22
|
+
/** 실패 시점 컨텍스트 */
|
|
23
|
+
context?: EvaluationContext;
|
|
24
|
+
/** 에러 코드 (있으면) */
|
|
25
|
+
code?: string;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* 성공 Result 생성
|
|
29
|
+
*/
|
|
30
|
+
export declare function ok<T>(value: T): Result<T, never>;
|
|
31
|
+
/**
|
|
32
|
+
* 실패 Result 생성
|
|
33
|
+
*/
|
|
34
|
+
export declare function err<E>(error: E): Result<never, E>;
|
|
35
|
+
/**
|
|
36
|
+
* EffectError 생성
|
|
37
|
+
*/
|
|
38
|
+
export declare function effectError(effect: Effect, cause: Error, options?: {
|
|
39
|
+
context?: EvaluationContext;
|
|
40
|
+
code?: string;
|
|
41
|
+
}): EffectError;
|
|
42
|
+
/**
|
|
43
|
+
* Result가 성공인지 확인
|
|
44
|
+
*/
|
|
45
|
+
export declare function isOk<T, E>(result: Result<T, E>): result is {
|
|
46
|
+
ok: true;
|
|
47
|
+
value: T;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Result가 실패인지 확인
|
|
51
|
+
*/
|
|
52
|
+
export declare function isErr<T, E>(result: Result<T, E>): result is {
|
|
53
|
+
ok: false;
|
|
54
|
+
error: E;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Result에서 값 추출 (실패 시 예외)
|
|
58
|
+
*/
|
|
59
|
+
export declare function unwrap<T, E>(result: Result<T, E>): T;
|
|
60
|
+
/**
|
|
61
|
+
* Result에서 값 추출 (실패 시 기본값)
|
|
62
|
+
*/
|
|
63
|
+
export declare function unwrapOr<T, E>(result: Result<T, E>, defaultValue: T): T;
|
|
64
|
+
/**
|
|
65
|
+
* Result에서 에러 추출 (성공 시 undefined)
|
|
66
|
+
*/
|
|
67
|
+
export declare function unwrapErr<T, E>(result: Result<T, E>): E | undefined;
|
|
68
|
+
/**
|
|
69
|
+
* Result.map: 성공 값 변환
|
|
70
|
+
*/
|
|
71
|
+
export declare function map<T, U, E>(result: Result<T, E>, fn: (value: T) => U): Result<U, E>;
|
|
72
|
+
/**
|
|
73
|
+
* Result.mapErr: 에러 값 변환
|
|
74
|
+
*/
|
|
75
|
+
export declare function mapErr<T, E, F>(result: Result<T, E>, fn: (error: E) => F): Result<T, F>;
|
|
76
|
+
/**
|
|
77
|
+
* Result.flatMap (bind/chain): 연쇄 연산
|
|
78
|
+
*/
|
|
79
|
+
export declare function flatMap<T, U, E>(result: Result<T, E>, fn: (value: T) => Result<U, E>): Result<U, E>;
|
|
80
|
+
/**
|
|
81
|
+
* Result.flatten: 중첩 Result 평탄화
|
|
82
|
+
*/
|
|
83
|
+
export declare function flatten<T, E>(result: Result<Result<T, E>, E>): Result<T, E>;
|
|
84
|
+
/**
|
|
85
|
+
* 여러 Result를 하나로 합침 (모두 성공해야 성공)
|
|
86
|
+
*/
|
|
87
|
+
export declare function all<T, E>(results: Result<T, E>[]): Result<T[], E>;
|
|
88
|
+
/**
|
|
89
|
+
* 첫 번째 성공 Result 반환
|
|
90
|
+
*/
|
|
91
|
+
export declare function any<T, E>(results: Result<T, E>[]): Result<T, E[]>;
|
|
92
|
+
/**
|
|
93
|
+
* Promise를 Result로 변환
|
|
94
|
+
*/
|
|
95
|
+
export declare function fromPromise<T>(promise: Promise<T>, mapError?: (e: unknown) => Error): Promise<Result<T, Error>>;
|
|
96
|
+
/**
|
|
97
|
+
* try-catch를 Result로 변환
|
|
98
|
+
*/
|
|
99
|
+
export declare function tryCatch<T>(fn: () => T, mapError?: (e: unknown) => Error): Result<T, Error>;
|
|
100
|
+
//# sourceMappingURL=result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/effect/result.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// Result Constructors
|
|
3
|
+
// =============================================================================
|
|
4
|
+
/**
|
|
5
|
+
* 성공 Result 생성
|
|
6
|
+
*/
|
|
7
|
+
export function ok(value) {
|
|
8
|
+
return { ok: true, value };
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 실패 Result 생성
|
|
12
|
+
*/
|
|
13
|
+
export function err(error) {
|
|
14
|
+
return { ok: false, error };
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* EffectError 생성
|
|
18
|
+
*/
|
|
19
|
+
export function effectError(effect, cause, options) {
|
|
20
|
+
return {
|
|
21
|
+
_tag: 'EffectError',
|
|
22
|
+
effect,
|
|
23
|
+
cause,
|
|
24
|
+
context: options?.context,
|
|
25
|
+
code: options?.code,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
// =============================================================================
|
|
29
|
+
// Result Utilities
|
|
30
|
+
// =============================================================================
|
|
31
|
+
/**
|
|
32
|
+
* Result가 성공인지 확인
|
|
33
|
+
*/
|
|
34
|
+
export function isOk(result) {
|
|
35
|
+
return result.ok;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Result가 실패인지 확인
|
|
39
|
+
*/
|
|
40
|
+
export function isErr(result) {
|
|
41
|
+
return !result.ok;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Result에서 값 추출 (실패 시 예외)
|
|
45
|
+
*/
|
|
46
|
+
export function unwrap(result) {
|
|
47
|
+
if (result.ok) {
|
|
48
|
+
return result.value;
|
|
49
|
+
}
|
|
50
|
+
throw result.error;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Result에서 값 추출 (실패 시 기본값)
|
|
54
|
+
*/
|
|
55
|
+
export function unwrapOr(result, defaultValue) {
|
|
56
|
+
if (result.ok) {
|
|
57
|
+
return result.value;
|
|
58
|
+
}
|
|
59
|
+
return defaultValue;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Result에서 에러 추출 (성공 시 undefined)
|
|
63
|
+
*/
|
|
64
|
+
export function unwrapErr(result) {
|
|
65
|
+
if (!result.ok) {
|
|
66
|
+
return result.error;
|
|
67
|
+
}
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
// =============================================================================
|
|
71
|
+
// Result Transformations (Monadic Operations)
|
|
72
|
+
// =============================================================================
|
|
73
|
+
/**
|
|
74
|
+
* Result.map: 성공 값 변환
|
|
75
|
+
*/
|
|
76
|
+
export function map(result, fn) {
|
|
77
|
+
if (result.ok) {
|
|
78
|
+
return ok(fn(result.value));
|
|
79
|
+
}
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Result.mapErr: 에러 값 변환
|
|
84
|
+
*/
|
|
85
|
+
export function mapErr(result, fn) {
|
|
86
|
+
if (!result.ok) {
|
|
87
|
+
return err(fn(result.error));
|
|
88
|
+
}
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Result.flatMap (bind/chain): 연쇄 연산
|
|
93
|
+
*/
|
|
94
|
+
export function flatMap(result, fn) {
|
|
95
|
+
if (result.ok) {
|
|
96
|
+
return fn(result.value);
|
|
97
|
+
}
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Result.flatten: 중첩 Result 평탄화
|
|
102
|
+
*/
|
|
103
|
+
export function flatten(result) {
|
|
104
|
+
if (result.ok) {
|
|
105
|
+
return result.value;
|
|
106
|
+
}
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
// =============================================================================
|
|
110
|
+
// Result Combinators
|
|
111
|
+
// =============================================================================
|
|
112
|
+
/**
|
|
113
|
+
* 여러 Result를 하나로 합침 (모두 성공해야 성공)
|
|
114
|
+
*/
|
|
115
|
+
export function all(results) {
|
|
116
|
+
const values = [];
|
|
117
|
+
for (const result of results) {
|
|
118
|
+
if (!result.ok) {
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
values.push(result.value);
|
|
122
|
+
}
|
|
123
|
+
return ok(values);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* 첫 번째 성공 Result 반환
|
|
127
|
+
*/
|
|
128
|
+
export function any(results) {
|
|
129
|
+
const errors = [];
|
|
130
|
+
for (const result of results) {
|
|
131
|
+
if (result.ok) {
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
errors.push(result.error);
|
|
135
|
+
}
|
|
136
|
+
return err(errors);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Promise를 Result로 변환
|
|
140
|
+
*/
|
|
141
|
+
export async function fromPromise(promise, mapError) {
|
|
142
|
+
try {
|
|
143
|
+
const value = await promise;
|
|
144
|
+
return ok(value);
|
|
145
|
+
}
|
|
146
|
+
catch (e) {
|
|
147
|
+
const error = mapError ? mapError(e) : e instanceof Error ? e : new Error(String(e));
|
|
148
|
+
return err(error);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* try-catch를 Result로 변환
|
|
153
|
+
*/
|
|
154
|
+
export function tryCatch(fn, mapError) {
|
|
155
|
+
try {
|
|
156
|
+
return ok(fn());
|
|
157
|
+
}
|
|
158
|
+
catch (e) {
|
|
159
|
+
const error = mapError ? mapError(e) : e instanceof Error ? e : new Error(String(e));
|
|
160
|
+
return err(error);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/effect/result.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import type { Effect, SetValueEffect, SetStateEffect, ApiCallEffect, NavigateEffect, DelayEffect, SequenceEffect, ParallelEffect, ConditionalEffect, CatchEffect, EmitEventEffect } from './types.js';
|
|
2
|
+
import type { Result } from './result.js';
|
|
3
|
+
import type { EvaluationContext, Expression } from '../expression/types.js';
|
|
4
|
+
import type { SemanticPath } from '../domain/types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Effect 실행 핸들러
|
|
7
|
+
*/
|
|
8
|
+
export type EffectHandler = {
|
|
9
|
+
/** 데이터 값 설정 */
|
|
10
|
+
setValue: (path: SemanticPath, value: unknown) => void;
|
|
11
|
+
/** 상태 값 설정 */
|
|
12
|
+
setState: (path: SemanticPath, value: unknown) => void;
|
|
13
|
+
/** API 호출 */
|
|
14
|
+
apiCall: (request: {
|
|
15
|
+
endpoint: string;
|
|
16
|
+
method: string;
|
|
17
|
+
body?: unknown;
|
|
18
|
+
headers?: Record<string, string>;
|
|
19
|
+
query?: Record<string, unknown>;
|
|
20
|
+
timeout?: number;
|
|
21
|
+
}) => Promise<unknown>;
|
|
22
|
+
/** 네비게이션 */
|
|
23
|
+
navigate: (to: string, mode?: 'push' | 'replace') => void;
|
|
24
|
+
/** 이벤트 발행 */
|
|
25
|
+
emitEvent: (channel: string, payload: unknown) => void;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Effect Runner 설정
|
|
29
|
+
*/
|
|
30
|
+
export type EffectRunnerConfig = {
|
|
31
|
+
handler: EffectHandler;
|
|
32
|
+
context: EvaluationContext;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Effect 실행 결과
|
|
36
|
+
*/
|
|
37
|
+
export type EffectResult = Result<unknown, import('./result.js').EffectError>;
|
|
38
|
+
/**
|
|
39
|
+
* Effect 실행
|
|
40
|
+
*/
|
|
41
|
+
export declare function runEffect(effect: Effect, config: EffectRunnerConfig): Promise<EffectResult>;
|
|
42
|
+
/**
|
|
43
|
+
* SetValue Effect 생성
|
|
44
|
+
*/
|
|
45
|
+
export declare function setValue(path: SemanticPath, value: Expression, description: string): SetValueEffect;
|
|
46
|
+
/**
|
|
47
|
+
* SetState Effect 생성
|
|
48
|
+
*/
|
|
49
|
+
export declare function setState(path: SemanticPath, value: Expression, description: string): SetStateEffect;
|
|
50
|
+
/**
|
|
51
|
+
* ApiCall Effect 생성
|
|
52
|
+
*/
|
|
53
|
+
export declare function apiCall(options: Omit<ApiCallEffect, '_tag'>): ApiCallEffect;
|
|
54
|
+
/**
|
|
55
|
+
* Navigate Effect 생성
|
|
56
|
+
*/
|
|
57
|
+
export declare function navigate(to: string | Expression, options?: {
|
|
58
|
+
mode?: 'push' | 'replace';
|
|
59
|
+
description?: string;
|
|
60
|
+
}): NavigateEffect;
|
|
61
|
+
/**
|
|
62
|
+
* Delay Effect 생성
|
|
63
|
+
*/
|
|
64
|
+
export declare function delay(ms: number, description?: string): DelayEffect;
|
|
65
|
+
/**
|
|
66
|
+
* Sequence Effect 생성
|
|
67
|
+
*/
|
|
68
|
+
export declare function sequence(effects: Effect[], description?: string): SequenceEffect;
|
|
69
|
+
/**
|
|
70
|
+
* Parallel Effect 생성
|
|
71
|
+
*/
|
|
72
|
+
export declare function parallel(effects: Effect[], options?: {
|
|
73
|
+
waitAll?: boolean;
|
|
74
|
+
description?: string;
|
|
75
|
+
}): ParallelEffect;
|
|
76
|
+
/**
|
|
77
|
+
* Conditional Effect 생성
|
|
78
|
+
*/
|
|
79
|
+
export declare function conditional(options: {
|
|
80
|
+
condition: Expression;
|
|
81
|
+
then: Effect;
|
|
82
|
+
else?: Effect;
|
|
83
|
+
description?: string;
|
|
84
|
+
}): ConditionalEffect;
|
|
85
|
+
/**
|
|
86
|
+
* Catch Effect 생성
|
|
87
|
+
*/
|
|
88
|
+
export declare function catchEffect(options: {
|
|
89
|
+
try: Effect;
|
|
90
|
+
catch: Effect;
|
|
91
|
+
finally?: Effect;
|
|
92
|
+
description?: string;
|
|
93
|
+
}): CatchEffect;
|
|
94
|
+
/**
|
|
95
|
+
* EmitEvent Effect 생성
|
|
96
|
+
*/
|
|
97
|
+
export declare function emitEvent(channel: 'ui' | 'domain' | 'analytics', payload: EmitEventEffect['payload'], description?: string): EmitEventEffect;
|
|
98
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/effect/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,cAAc,EACd,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACX,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,eAAe,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,eAAe;IACf,QAAQ,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAEvD,cAAc;IACd,QAAQ,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAEvD,aAAa;IACb,OAAO,EAAE,CAAC,OAAO,EAAE;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAEvB,YAAY;IACZ,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAE1D,aAAa;IACb,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACxD,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE,iBAAiB,CAAC;CAC5B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,aAAa,EAAE,WAAW,CAAC,CAAC;AAE9E;;GAEG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,YAAY,CAAC,CA6CvB;AAmPD;;GAEG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,UAAU,EACjB,WAAW,EAAE,MAAM,GAClB,cAAc,CAEhB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,UAAU,EACjB,WAAW,EAAE,MAAM,GAClB,cAAc,CAEhB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,aAAa,CAE3E;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACtB,EAAE,EAAE,MAAM,GAAG,UAAU,EACvB,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5D,cAAc,CAOhB;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,WAAW,CAMnE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,cAAc,CAMhF;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD,cAAc,CAOhB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE;IACnC,SAAS,EAAE,UAAU,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,iBAAiB,CAQpB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,WAAW,CAQd;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,IAAI,GAAG,QAAQ,GAAG,WAAW,EACtC,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC,EACnC,WAAW,CAAC,EAAE,MAAM,GACnB,eAAe,CAOjB"}
|