@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,321 @@
|
|
|
1
|
+
import { ok, err, effectError } from './result.js';
|
|
2
|
+
import { evaluate } from '../expression/evaluator.js';
|
|
3
|
+
/**
|
|
4
|
+
* Effect 실행
|
|
5
|
+
*/
|
|
6
|
+
export async function runEffect(effect, config) {
|
|
7
|
+
const { handler, context } = config;
|
|
8
|
+
try {
|
|
9
|
+
switch (effect._tag) {
|
|
10
|
+
case 'SetValue':
|
|
11
|
+
return await runSetValue(effect, handler, context);
|
|
12
|
+
case 'SetState':
|
|
13
|
+
return await runSetState(effect, handler, context);
|
|
14
|
+
case 'ApiCall':
|
|
15
|
+
return await runApiCall(effect, handler, context);
|
|
16
|
+
case 'Navigate':
|
|
17
|
+
return await runNavigate(effect, handler, context);
|
|
18
|
+
case 'Delay':
|
|
19
|
+
return await runDelay(effect);
|
|
20
|
+
case 'Sequence':
|
|
21
|
+
return await runSequence(effect, config);
|
|
22
|
+
case 'Parallel':
|
|
23
|
+
return await runParallel(effect, config);
|
|
24
|
+
case 'Conditional':
|
|
25
|
+
return await runConditional(effect, config);
|
|
26
|
+
case 'Catch':
|
|
27
|
+
return await runCatch(effect, config);
|
|
28
|
+
case 'EmitEvent':
|
|
29
|
+
return await runEmitEvent(effect, handler);
|
|
30
|
+
default:
|
|
31
|
+
return err(effectError(effect, new Error(`Unknown effect type: ${effect._tag}`)));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
return err(effectError(effect, e instanceof Error ? e : new Error(String(e)), { context }));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* SetValue 실행
|
|
40
|
+
*/
|
|
41
|
+
async function runSetValue(effect, handler, context) {
|
|
42
|
+
const valueResult = evaluate(effect.value, context);
|
|
43
|
+
if (!valueResult.ok) {
|
|
44
|
+
return err(effectError(effect, new Error(valueResult.error)));
|
|
45
|
+
}
|
|
46
|
+
handler.setValue(effect.path, valueResult.value);
|
|
47
|
+
return ok(undefined);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* SetState 실행
|
|
51
|
+
*/
|
|
52
|
+
async function runSetState(effect, handler, context) {
|
|
53
|
+
const valueResult = evaluate(effect.value, context);
|
|
54
|
+
if (!valueResult.ok) {
|
|
55
|
+
return err(effectError(effect, new Error(valueResult.error)));
|
|
56
|
+
}
|
|
57
|
+
handler.setState(effect.path, valueResult.value);
|
|
58
|
+
return ok(undefined);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* ApiCall 실행
|
|
62
|
+
*/
|
|
63
|
+
async function runApiCall(effect, handler, context) {
|
|
64
|
+
// 엔드포인트 평가
|
|
65
|
+
let endpoint;
|
|
66
|
+
if (typeof effect.endpoint === 'string') {
|
|
67
|
+
endpoint = effect.endpoint;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
const endpointResult = evaluate(effect.endpoint, context);
|
|
71
|
+
if (!endpointResult.ok) {
|
|
72
|
+
return err(effectError(effect, new Error(endpointResult.error)));
|
|
73
|
+
}
|
|
74
|
+
endpoint = String(endpointResult.value);
|
|
75
|
+
}
|
|
76
|
+
// body 평가
|
|
77
|
+
let body = undefined;
|
|
78
|
+
if (effect.body) {
|
|
79
|
+
const evaluatedBody = {};
|
|
80
|
+
for (const [key, expr] of Object.entries(effect.body)) {
|
|
81
|
+
const result = evaluate(expr, context);
|
|
82
|
+
if (!result.ok) {
|
|
83
|
+
return err(effectError(effect, new Error(result.error)));
|
|
84
|
+
}
|
|
85
|
+
evaluatedBody[key] = result.value;
|
|
86
|
+
}
|
|
87
|
+
body = evaluatedBody;
|
|
88
|
+
}
|
|
89
|
+
// query 평가
|
|
90
|
+
let query = undefined;
|
|
91
|
+
if (effect.query) {
|
|
92
|
+
query = {};
|
|
93
|
+
for (const [key, expr] of Object.entries(effect.query)) {
|
|
94
|
+
const result = evaluate(expr, context);
|
|
95
|
+
if (!result.ok) {
|
|
96
|
+
return err(effectError(effect, new Error(result.error)));
|
|
97
|
+
}
|
|
98
|
+
query[key] = result.value;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
const response = await handler.apiCall({
|
|
103
|
+
endpoint,
|
|
104
|
+
method: effect.method,
|
|
105
|
+
body,
|
|
106
|
+
headers: effect.headers,
|
|
107
|
+
query,
|
|
108
|
+
timeout: effect.timeout,
|
|
109
|
+
});
|
|
110
|
+
return ok(response);
|
|
111
|
+
}
|
|
112
|
+
catch (e) {
|
|
113
|
+
return err(effectError(effect, e instanceof Error ? e : new Error(String(e)), {
|
|
114
|
+
code: 'API_CALL_FAILED',
|
|
115
|
+
}));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Navigate 실행
|
|
120
|
+
*/
|
|
121
|
+
async function runNavigate(effect, handler, context) {
|
|
122
|
+
let to;
|
|
123
|
+
if (typeof effect.to === 'string') {
|
|
124
|
+
to = effect.to;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
const toResult = evaluate(effect.to, context);
|
|
128
|
+
if (!toResult.ok) {
|
|
129
|
+
return err(effectError(effect, new Error(toResult.error)));
|
|
130
|
+
}
|
|
131
|
+
to = String(toResult.value);
|
|
132
|
+
}
|
|
133
|
+
handler.navigate(to, effect.mode);
|
|
134
|
+
return ok(undefined);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Delay 실행
|
|
138
|
+
*/
|
|
139
|
+
async function runDelay(effect) {
|
|
140
|
+
await new Promise((resolve) => setTimeout(resolve, effect.ms));
|
|
141
|
+
return ok(undefined);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Sequence 실행
|
|
145
|
+
*/
|
|
146
|
+
async function runSequence(effect, config) {
|
|
147
|
+
let lastResult = undefined;
|
|
148
|
+
for (const childEffect of effect.effects) {
|
|
149
|
+
const result = await runEffect(childEffect, config);
|
|
150
|
+
if (!result.ok) {
|
|
151
|
+
return result;
|
|
152
|
+
}
|
|
153
|
+
lastResult = result.value;
|
|
154
|
+
}
|
|
155
|
+
return ok(lastResult);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Parallel 실행
|
|
159
|
+
*/
|
|
160
|
+
async function runParallel(effect, config) {
|
|
161
|
+
const promises = effect.effects.map((e) => runEffect(e, config));
|
|
162
|
+
if (effect.waitAll !== false) {
|
|
163
|
+
const results = await Promise.all(promises);
|
|
164
|
+
const values = [];
|
|
165
|
+
for (const result of results) {
|
|
166
|
+
if (!result.ok) {
|
|
167
|
+
return result;
|
|
168
|
+
}
|
|
169
|
+
values.push(result.value);
|
|
170
|
+
}
|
|
171
|
+
return ok(values);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
// 하나라도 완료되면 반환
|
|
175
|
+
const result = await Promise.race(promises);
|
|
176
|
+
return result;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Conditional 실행
|
|
181
|
+
*/
|
|
182
|
+
async function runConditional(effect, config) {
|
|
183
|
+
const conditionResult = evaluate(effect.condition, config.context);
|
|
184
|
+
if (!conditionResult.ok) {
|
|
185
|
+
return err(effectError(effect, new Error(conditionResult.error)));
|
|
186
|
+
}
|
|
187
|
+
if (conditionResult.value) {
|
|
188
|
+
return runEffect(effect.then, config);
|
|
189
|
+
}
|
|
190
|
+
else if (effect.else) {
|
|
191
|
+
return runEffect(effect.else, config);
|
|
192
|
+
}
|
|
193
|
+
return ok(undefined);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Catch 실행
|
|
197
|
+
*/
|
|
198
|
+
async function runCatch(effect, config) {
|
|
199
|
+
let result;
|
|
200
|
+
try {
|
|
201
|
+
result = await runEffect(effect.try, config);
|
|
202
|
+
}
|
|
203
|
+
catch (e) {
|
|
204
|
+
result = err(effectError(effect.try, e instanceof Error ? e : new Error(String(e))));
|
|
205
|
+
}
|
|
206
|
+
// 에러 발생 시 catch 실행
|
|
207
|
+
if (!result.ok) {
|
|
208
|
+
result = await runEffect(effect.catch, config);
|
|
209
|
+
}
|
|
210
|
+
// finally 항상 실행
|
|
211
|
+
if (effect.finally) {
|
|
212
|
+
await runEffect(effect.finally, config);
|
|
213
|
+
}
|
|
214
|
+
return result;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* EmitEvent 실행
|
|
218
|
+
*/
|
|
219
|
+
async function runEmitEvent(effect, handler) {
|
|
220
|
+
handler.emitEvent(effect.channel, effect.payload);
|
|
221
|
+
return ok(undefined);
|
|
222
|
+
}
|
|
223
|
+
// =============================================================================
|
|
224
|
+
// Effect Builders
|
|
225
|
+
// =============================================================================
|
|
226
|
+
/**
|
|
227
|
+
* SetValue Effect 생성
|
|
228
|
+
*/
|
|
229
|
+
export function setValue(path, value, description) {
|
|
230
|
+
return { _tag: 'SetValue', path, value, description };
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* SetState Effect 생성
|
|
234
|
+
*/
|
|
235
|
+
export function setState(path, value, description) {
|
|
236
|
+
return { _tag: 'SetState', path, value, description };
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* ApiCall Effect 생성
|
|
240
|
+
*/
|
|
241
|
+
export function apiCall(options) {
|
|
242
|
+
return { _tag: 'ApiCall', ...options };
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Navigate Effect 생성
|
|
246
|
+
*/
|
|
247
|
+
export function navigate(to, options) {
|
|
248
|
+
return {
|
|
249
|
+
_tag: 'Navigate',
|
|
250
|
+
to,
|
|
251
|
+
mode: options?.mode,
|
|
252
|
+
description: options?.description ?? `Navigate to ${typeof to === 'string' ? to : 'computed path'}`,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Delay Effect 생성
|
|
257
|
+
*/
|
|
258
|
+
export function delay(ms, description) {
|
|
259
|
+
return {
|
|
260
|
+
_tag: 'Delay',
|
|
261
|
+
ms,
|
|
262
|
+
description: description ?? `Wait ${ms}ms`,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Sequence Effect 생성
|
|
267
|
+
*/
|
|
268
|
+
export function sequence(effects, description) {
|
|
269
|
+
return {
|
|
270
|
+
_tag: 'Sequence',
|
|
271
|
+
effects,
|
|
272
|
+
description: description ?? `Sequence of ${effects.length} effects`,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Parallel Effect 생성
|
|
277
|
+
*/
|
|
278
|
+
export function parallel(effects, options) {
|
|
279
|
+
return {
|
|
280
|
+
_tag: 'Parallel',
|
|
281
|
+
effects,
|
|
282
|
+
waitAll: options?.waitAll,
|
|
283
|
+
description: options?.description ?? `Parallel execution of ${effects.length} effects`,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Conditional Effect 생성
|
|
288
|
+
*/
|
|
289
|
+
export function conditional(options) {
|
|
290
|
+
return {
|
|
291
|
+
_tag: 'Conditional',
|
|
292
|
+
condition: options.condition,
|
|
293
|
+
then: options.then,
|
|
294
|
+
else: options.else,
|
|
295
|
+
description: options.description ?? 'Conditional effect',
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Catch Effect 생성
|
|
300
|
+
*/
|
|
301
|
+
export function catchEffect(options) {
|
|
302
|
+
return {
|
|
303
|
+
_tag: 'Catch',
|
|
304
|
+
try: options.try,
|
|
305
|
+
catch: options.catch,
|
|
306
|
+
finally: options.finally,
|
|
307
|
+
description: options.description ?? 'Try-catch effect',
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* EmitEvent Effect 생성
|
|
312
|
+
*/
|
|
313
|
+
export function emitEvent(channel, payload, description) {
|
|
314
|
+
return {
|
|
315
|
+
_tag: 'EmitEvent',
|
|
316
|
+
channel,
|
|
317
|
+
payload,
|
|
318
|
+
description: description ?? `Emit ${payload.type} event`,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/effect/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import type { Expression } from '../expression/types.js';
|
|
2
|
+
import type { SemanticPath } from '../domain/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Effect: 부수효과를 캡슐화하는 타입
|
|
5
|
+
*
|
|
6
|
+
* Monadic Design Principles:
|
|
7
|
+
* - 실행 전까지는 "설명"일 뿐 (데이터로서의 Effect)
|
|
8
|
+
* - 합성 가능 (Sequence, Parallel, Conditional)
|
|
9
|
+
* - 에러 처리 일관됨 (Result<T, E>)
|
|
10
|
+
* - AI가 "무슨 일이 일어날지" 이해 가능
|
|
11
|
+
*/
|
|
12
|
+
export type Effect = SetValueEffect | SetStateEffect | ApiCallEffect | DelayEffect | NavigateEffect | SequenceEffect | ParallelEffect | ConditionalEffect | CatchEffect | EmitEventEffect;
|
|
13
|
+
/**
|
|
14
|
+
* SetValueEffect: 데이터 값 설정
|
|
15
|
+
*/
|
|
16
|
+
export type SetValueEffect = {
|
|
17
|
+
_tag: 'SetValue';
|
|
18
|
+
/** 대상 경로 */
|
|
19
|
+
path: SemanticPath;
|
|
20
|
+
/** 설정할 값 (Expression으로 계산 가능) */
|
|
21
|
+
value: Expression;
|
|
22
|
+
/** 설명 */
|
|
23
|
+
description: string;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* SetStateEffect: 상태 값 설정
|
|
27
|
+
*/
|
|
28
|
+
export type SetStateEffect = {
|
|
29
|
+
_tag: 'SetState';
|
|
30
|
+
/** 대상 경로 */
|
|
31
|
+
path: SemanticPath;
|
|
32
|
+
/** 설정할 값 */
|
|
33
|
+
value: Expression;
|
|
34
|
+
/** 설명 */
|
|
35
|
+
description: string;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* ApiCallEffect: API 호출
|
|
39
|
+
*/
|
|
40
|
+
export type ApiCallEffect = {
|
|
41
|
+
_tag: 'ApiCall';
|
|
42
|
+
/** 엔드포인트 (Expression 가능) */
|
|
43
|
+
endpoint: string | Expression;
|
|
44
|
+
/** HTTP 메서드 */
|
|
45
|
+
method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
46
|
+
/** 요청 본문 */
|
|
47
|
+
body?: Record<string, Expression>;
|
|
48
|
+
/** 요청 헤더 */
|
|
49
|
+
headers?: Record<string, string>;
|
|
50
|
+
/** 쿼리 파라미터 */
|
|
51
|
+
query?: Record<string, Expression>;
|
|
52
|
+
/** 타임아웃 (ms) */
|
|
53
|
+
timeout?: number;
|
|
54
|
+
/** 설명 */
|
|
55
|
+
description: string;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* NavigateEffect: 페이지 이동
|
|
59
|
+
*/
|
|
60
|
+
export type NavigateEffect = {
|
|
61
|
+
_tag: 'Navigate';
|
|
62
|
+
/** 이동할 경로 (Expression 가능) */
|
|
63
|
+
to: string | Expression;
|
|
64
|
+
/** 히스토리 모드 */
|
|
65
|
+
mode?: 'push' | 'replace';
|
|
66
|
+
/** 설명 */
|
|
67
|
+
description: string;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* DelayEffect: 대기
|
|
71
|
+
*/
|
|
72
|
+
export type DelayEffect = {
|
|
73
|
+
_tag: 'Delay';
|
|
74
|
+
/** 대기 시간 (ms) */
|
|
75
|
+
ms: number;
|
|
76
|
+
/** 설명 */
|
|
77
|
+
description: string;
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* SequenceEffect: 순차 실행
|
|
81
|
+
*/
|
|
82
|
+
export type SequenceEffect = {
|
|
83
|
+
_tag: 'Sequence';
|
|
84
|
+
/** 순차 실행할 Effect들 */
|
|
85
|
+
effects: Effect[];
|
|
86
|
+
/** 설명 */
|
|
87
|
+
description: string;
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* ParallelEffect: 병렬 실행
|
|
91
|
+
*/
|
|
92
|
+
export type ParallelEffect = {
|
|
93
|
+
_tag: 'Parallel';
|
|
94
|
+
/** 병렬 실행할 Effect들 */
|
|
95
|
+
effects: Effect[];
|
|
96
|
+
/** 모두 완료 대기 여부 */
|
|
97
|
+
waitAll?: boolean;
|
|
98
|
+
/** 설명 */
|
|
99
|
+
description: string;
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* ConditionalEffect: 조건부 실행
|
|
103
|
+
*/
|
|
104
|
+
export type ConditionalEffect = {
|
|
105
|
+
_tag: 'Conditional';
|
|
106
|
+
/** 조건 */
|
|
107
|
+
condition: Expression;
|
|
108
|
+
/** 참일 때 실행 */
|
|
109
|
+
then: Effect;
|
|
110
|
+
/** 거짓일 때 실행 (선택) */
|
|
111
|
+
else?: Effect;
|
|
112
|
+
/** 설명 */
|
|
113
|
+
description: string;
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* CatchEffect: 에러 처리
|
|
117
|
+
*/
|
|
118
|
+
export type CatchEffect = {
|
|
119
|
+
_tag: 'Catch';
|
|
120
|
+
/** 시도할 Effect */
|
|
121
|
+
try: Effect;
|
|
122
|
+
/** 에러 시 실행할 Effect */
|
|
123
|
+
catch: Effect;
|
|
124
|
+
/** 항상 실행할 Effect (선택) */
|
|
125
|
+
finally?: Effect;
|
|
126
|
+
/** 설명 */
|
|
127
|
+
description: string;
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* EmitEventEffect: 일회성 이벤트 발행
|
|
131
|
+
*
|
|
132
|
+
* State와 달리 Snapshot에 저장되지 않음.
|
|
133
|
+
* Projection Layer에서 구독하여 처리.
|
|
134
|
+
*/
|
|
135
|
+
export type EmitEventEffect = {
|
|
136
|
+
_tag: 'EmitEvent';
|
|
137
|
+
/** 이벤트 채널 */
|
|
138
|
+
channel: 'ui' | 'domain' | 'analytics';
|
|
139
|
+
/** 이벤트 페이로드 */
|
|
140
|
+
payload: {
|
|
141
|
+
/** 이벤트 타입 */
|
|
142
|
+
type: string;
|
|
143
|
+
/** 메시지 (선택) */
|
|
144
|
+
message?: string;
|
|
145
|
+
/** 추가 데이터 (선택) */
|
|
146
|
+
data?: unknown;
|
|
147
|
+
/** 이벤트 심각도 (선택, UI 채널용) */
|
|
148
|
+
severity?: 'success' | 'info' | 'warning' | 'error';
|
|
149
|
+
/** 지속 시간 (선택, 토스트 등) */
|
|
150
|
+
duration?: number;
|
|
151
|
+
};
|
|
152
|
+
/** 설명 */
|
|
153
|
+
description: string;
|
|
154
|
+
};
|
|
155
|
+
/**
|
|
156
|
+
* Effect 타입 가드
|
|
157
|
+
*/
|
|
158
|
+
export declare function isEffect(value: unknown): value is Effect;
|
|
159
|
+
/**
|
|
160
|
+
* Effect 태그 타입
|
|
161
|
+
*/
|
|
162
|
+
export type EffectTag = Effect['_tag'];
|
|
163
|
+
/**
|
|
164
|
+
* 특정 태그의 Effect인지 확인
|
|
165
|
+
*/
|
|
166
|
+
export declare function isEffectOfType<T extends EffectTag>(effect: Effect, tag: T): effect is Extract<Effect, {
|
|
167
|
+
_tag: T;
|
|
168
|
+
}>;
|
|
169
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/effect/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// Effect Helpers
|
|
3
|
+
// =============================================================================
|
|
4
|
+
/**
|
|
5
|
+
* Effect 타입 가드
|
|
6
|
+
*/
|
|
7
|
+
export function isEffect(value) {
|
|
8
|
+
if (!value || typeof value !== 'object')
|
|
9
|
+
return false;
|
|
10
|
+
const { _tag } = value;
|
|
11
|
+
return (_tag === 'SetValue' ||
|
|
12
|
+
_tag === 'SetState' ||
|
|
13
|
+
_tag === 'ApiCall' ||
|
|
14
|
+
_tag === 'Navigate' ||
|
|
15
|
+
_tag === 'Delay' ||
|
|
16
|
+
_tag === 'Sequence' ||
|
|
17
|
+
_tag === 'Parallel' ||
|
|
18
|
+
_tag === 'Conditional' ||
|
|
19
|
+
_tag === 'Catch' ||
|
|
20
|
+
_tag === 'EmitEvent');
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 특정 태그의 Effect인지 확인
|
|
24
|
+
*/
|
|
25
|
+
export function isEffectOfType(effect, tag) {
|
|
26
|
+
return effect._tag === tag;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/effect/types.ts"],"names":[],"mappings":"AAoMA,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,EAAE,IAAI,EAAE,GAAG,KAA0B,CAAC;IAC5C,OAAO,CACL,IAAI,KAAK,UAAU;QACnB,IAAI,KAAK,UAAU;QACnB,IAAI,KAAK,SAAS;QAClB,IAAI,KAAK,UAAU;QACnB,IAAI,KAAK,OAAO;QAChB,IAAI,KAAK,UAAU;QACnB,IAAI,KAAK,UAAU;QACnB,IAAI,KAAK,aAAa;QACtB,IAAI,KAAK,OAAO;QAChB,IAAI,KAAK,WAAW,CACrB,CAAC;AACJ,CAAC;AAOD;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAc,EACd,GAAM;IAEN,OAAO,MAAM,CAAC,IAAI,KAAK,GAAG,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { Expression } from './types.js';
|
|
2
|
+
import type { SemanticPath } from '../domain/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* 의존성 분석 결과
|
|
5
|
+
*/
|
|
6
|
+
export type DependencyAnalysis = {
|
|
7
|
+
/** 직접 의존하는 경로들 */
|
|
8
|
+
directDeps: SemanticPath[];
|
|
9
|
+
/** 사용된 연산자들 */
|
|
10
|
+
operators: string[];
|
|
11
|
+
/** 표현식의 복잡도 (노드 수) */
|
|
12
|
+
complexity: number;
|
|
13
|
+
/** 부분 표현식에서 사용되는 컨텍스트 변수 */
|
|
14
|
+
usesContext: boolean;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Expression 의존성 분석
|
|
18
|
+
*/
|
|
19
|
+
export declare function analyzeExpression(expr: Expression): DependencyAnalysis;
|
|
20
|
+
/**
|
|
21
|
+
* Expression이 순수한지 확인 (부수효과 없음)
|
|
22
|
+
* 모든 Expression은 순수해야 하지만, 추가 검증용
|
|
23
|
+
*/
|
|
24
|
+
export declare function isPureExpression(expr: Expression): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Expression이 상수인지 확인 (의존성 없음)
|
|
27
|
+
*/
|
|
28
|
+
export declare function isConstantExpression(expr: Expression): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* 두 Expression이 동일한지 확인 (구조적 동등성)
|
|
31
|
+
*/
|
|
32
|
+
export declare function areExpressionsEqual(a: Expression, b: Expression): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Expression 최적화 (기본적인 상수 폴딩)
|
|
35
|
+
*/
|
|
36
|
+
export declare function optimizeExpression(expr: Expression): Expression;
|
|
37
|
+
/**
|
|
38
|
+
* Expression에서 특정 경로에 대한 의존성 제거
|
|
39
|
+
* (경로가 상수로 대체되었을 때 사용)
|
|
40
|
+
*/
|
|
41
|
+
export declare function substitutePathWithValue(expr: Expression, path: SemanticPath, value: Expression): Expression;
|
|
42
|
+
//# sourceMappingURL=analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../src/expression/analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,kBAAkB;IAClB,UAAU,EAAE,YAAY,EAAE,CAAC;IAE3B,eAAe;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IAEpB,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAC;IAEnB,4BAA4B;IAC5B,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,kBAAkB,CAsCtE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAI1D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAG9D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAmBzE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CA6C/D;AA2BD;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,UAAU,GAChB,UAAU,CAgBZ"}
|