qnce-engine 0.1.0 → 1.2.1
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/README.md +959 -5
- package/dist/cli/audit.js +6 -4
- package/dist/cli/audit.js.map +1 -1
- package/dist/cli/init.js +11 -9
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/perf.d.ts +30 -0
- package/dist/cli/perf.d.ts.map +1 -0
- package/dist/cli/perf.js +220 -0
- package/dist/cli/perf.js.map +1 -0
- package/dist/cli/play.d.ts +4 -0
- package/dist/cli/play.d.ts.map +1 -0
- package/dist/cli/play.js +259 -0
- package/dist/cli/play.js.map +1 -0
- package/dist/engine/condition.d.ts +69 -0
- package/dist/engine/condition.d.ts.map +1 -0
- package/dist/engine/condition.js +195 -0
- package/dist/engine/condition.js.map +1 -0
- package/dist/engine/core.d.ts +378 -11
- package/dist/engine/core.d.ts.map +1 -1
- package/dist/engine/core.js +1433 -13
- package/dist/engine/core.js.map +1 -1
- package/dist/engine/demo-story.d.ts.map +1 -1
- package/dist/engine/demo-story.js +103 -14
- package/dist/engine/demo-story.js.map +1 -1
- package/dist/engine/errors.d.ts +76 -0
- package/dist/engine/errors.d.ts.map +1 -0
- package/dist/engine/errors.js +178 -0
- package/dist/engine/errors.js.map +1 -0
- package/dist/engine/types.d.ts +445 -0
- package/dist/engine/types.d.ts.map +1 -0
- package/dist/engine/types.js +9 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/engine/validation.d.ts +110 -0
- package/dist/engine/validation.d.ts.map +1 -0
- package/dist/engine/validation.js +261 -0
- package/dist/engine/validation.js.map +1 -0
- package/dist/examples/examples/autosave-undo-demo.js +248 -0
- package/dist/examples/examples/persistence-demo.js +63 -0
- package/dist/examples/src/engine/condition.js +194 -0
- package/dist/examples/src/engine/core.js +1382 -0
- package/dist/examples/src/engine/demo-story.js +200 -0
- package/dist/examples/src/engine/types.js +8 -0
- package/dist/examples/src/index.js +35 -0
- package/dist/examples/src/integrations/react.js +322 -0
- package/dist/examples/src/narrative/branching/engine-simple.js +348 -0
- package/dist/examples/src/narrative/branching/index.js +55 -0
- package/dist/examples/src/narrative/branching/models.js +5 -0
- package/dist/examples/src/performance/ObjectPool.js +296 -0
- package/dist/examples/src/performance/PerfReporter.js +280 -0
- package/dist/examples/src/performance/ThreadPool.js +347 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35 -3
- package/dist/index.js.map +1 -1
- package/dist/integrations/react.d.ts +200 -0
- package/dist/integrations/react.d.ts.map +1 -0
- package/dist/integrations/react.js +365 -0
- package/dist/integrations/react.js.map +1 -0
- package/dist/narrative/branching/engine-simple.d.ts +84 -0
- package/dist/narrative/branching/engine-simple.d.ts.map +1 -0
- package/dist/narrative/branching/engine-simple.js +349 -0
- package/dist/narrative/branching/engine-simple.js.map +1 -0
- package/dist/narrative/branching/engine.d.ts +1 -0
- package/dist/narrative/branching/engine.d.ts.map +1 -0
- package/dist/narrative/branching/engine.js +2 -0
- package/dist/narrative/branching/engine.js.map +1 -0
- package/dist/narrative/branching/index.d.ts +12 -0
- package/dist/narrative/branching/index.d.ts.map +1 -0
- package/dist/narrative/branching/index.js +56 -0
- package/dist/narrative/branching/index.js.map +1 -0
- package/dist/narrative/branching/models.d.ts +223 -0
- package/dist/narrative/branching/models.d.ts.map +1 -0
- package/dist/narrative/branching/models.js +6 -0
- package/dist/narrative/branching/models.js.map +1 -0
- package/dist/performance/HotReloadDelta.d.ts +124 -0
- package/dist/performance/HotReloadDelta.d.ts.map +1 -0
- package/dist/performance/HotReloadDelta.js +328 -0
- package/dist/performance/HotReloadDelta.js.map +1 -0
- package/dist/performance/ObjectPool.d.ts +150 -0
- package/dist/performance/ObjectPool.d.ts.map +1 -0
- package/dist/performance/ObjectPool.js +297 -0
- package/dist/performance/ObjectPool.js.map +1 -0
- package/dist/performance/PerfReporter.d.ts +123 -0
- package/dist/performance/PerfReporter.d.ts.map +1 -0
- package/dist/performance/PerfReporter.js +281 -0
- package/dist/performance/PerfReporter.js.map +1 -0
- package/dist/performance/ThreadPool.d.ts +107 -0
- package/dist/performance/ThreadPool.d.ts.map +1 -0
- package/dist/performance/ThreadPool.js +348 -0
- package/dist/performance/ThreadPool.js.map +1 -0
- package/dist/ui/__tests__/AutosaveIndicator.test.d.ts +2 -0
- package/dist/ui/__tests__/AutosaveIndicator.test.d.ts.map +1 -0
- package/dist/ui/__tests__/AutosaveIndicator.test.js +329 -0
- package/dist/ui/__tests__/AutosaveIndicator.test.js.map +1 -0
- package/dist/ui/__tests__/UndoRedoControls.test.d.ts +2 -0
- package/dist/ui/__tests__/UndoRedoControls.test.d.ts.map +1 -0
- package/dist/ui/__tests__/UndoRedoControls.test.js +245 -0
- package/dist/ui/__tests__/UndoRedoControls.test.js.map +1 -0
- package/dist/ui/__tests__/autosave-simple.test.d.ts +2 -0
- package/dist/ui/__tests__/autosave-simple.test.d.ts.map +1 -0
- package/dist/ui/__tests__/autosave-simple.test.js +29 -0
- package/dist/ui/__tests__/autosave-simple.test.js.map +1 -0
- package/dist/ui/__tests__/setup.d.ts +2 -0
- package/dist/ui/__tests__/setup.d.ts.map +1 -0
- package/dist/ui/__tests__/setup.js +40 -0
- package/dist/ui/__tests__/setup.js.map +1 -0
- package/dist/ui/__tests__/smoke-test.d.ts +2 -0
- package/dist/ui/__tests__/smoke-test.d.ts.map +1 -0
- package/dist/ui/__tests__/smoke-test.js +18 -0
- package/dist/ui/__tests__/smoke-test.js.map +1 -0
- package/dist/ui/__tests__/smoke-test.test.d.ts +2 -0
- package/dist/ui/__tests__/smoke-test.test.d.ts.map +1 -0
- package/dist/ui/__tests__/smoke-test.test.js +18 -0
- package/dist/ui/__tests__/smoke-test.test.js.map +1 -0
- package/dist/ui/__tests__/useKeyboardShortcuts.test.d.ts +2 -0
- package/dist/ui/__tests__/useKeyboardShortcuts.test.d.ts.map +1 -0
- package/dist/ui/__tests__/useKeyboardShortcuts.test.js +374 -0
- package/dist/ui/__tests__/useKeyboardShortcuts.test.js.map +1 -0
- package/dist/ui/components/AutosaveIndicator.d.ts +18 -0
- package/dist/ui/components/AutosaveIndicator.d.ts.map +1 -0
- package/dist/ui/components/AutosaveIndicator.js +175 -0
- package/dist/ui/components/AutosaveIndicator.js.map +1 -0
- package/dist/ui/components/UndoRedoControls.d.ts +16 -0
- package/dist/ui/components/UndoRedoControls.d.ts.map +1 -0
- package/dist/ui/components/UndoRedoControls.js +144 -0
- package/dist/ui/components/UndoRedoControls.js.map +1 -0
- package/dist/ui/hooks/useKeyboardShortcuts.d.ts +22 -0
- package/dist/ui/hooks/useKeyboardShortcuts.d.ts.map +1 -0
- package/dist/ui/hooks/useKeyboardShortcuts.js +162 -0
- package/dist/ui/hooks/useKeyboardShortcuts.js.map +1 -0
- package/dist/ui/index.d.ts +9 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +14 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/types.d.ts +141 -0
- package/dist/ui/types.d.ts.map +1 -0
- package/dist/ui/types.js +51 -0
- package/dist/ui/types.js.map +1 -0
- package/docs/PERFORMANCE.md +355 -0
- package/docs/branching/ERD.md +214 -0
- package/docs/branching/PDM.md +443 -0
- package/docs/branching/RELEASE-v1.2.0.md +169 -0
- package/examples/autosave-undo-demo.ts +306 -0
- package/examples/branching-advanced-demo.ts +339 -0
- package/examples/branching-demo-simple.ts +0 -0
- package/examples/branching-demo.ts +0 -0
- package/examples/branching-quickstart.ts +314 -0
- package/examples/persistence-demo.ts +84 -0
- package/examples/quickstart-demo.js +82 -0
- package/examples/tsconfig.json +13 -0
- package/examples/ui-components-demo.tsx +320 -0
- package/examples/validation-demo-story.json +177 -0
- package/examples/validation-demo.js +163 -0
- package/package.json +41 -8
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { QNCEState } from './core';
|
|
2
|
+
/**
|
|
3
|
+
* Error thrown when condition evaluation fails
|
|
4
|
+
*/
|
|
5
|
+
export declare class ConditionEvaluationError extends Error {
|
|
6
|
+
readonly expression?: string | undefined;
|
|
7
|
+
readonly cause?: Error | undefined;
|
|
8
|
+
constructor(message: string, expression?: string | undefined, cause?: Error | undefined);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Context object passed to condition evaluators
|
|
12
|
+
*/
|
|
13
|
+
export interface ConditionContext {
|
|
14
|
+
/** Current engine state */
|
|
15
|
+
state: QNCEState;
|
|
16
|
+
/** Current timestamp for time-based conditions */
|
|
17
|
+
timestamp: number;
|
|
18
|
+
/** Additional custom context data */
|
|
19
|
+
customData?: Record<string, unknown>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Custom evaluator function signature
|
|
23
|
+
*/
|
|
24
|
+
export type CustomEvaluatorFunction = (expression: string, context: ConditionContext) => boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Condition evaluator service for parsing and executing conditional expressions
|
|
27
|
+
*/
|
|
28
|
+
export declare class ConditionEvaluator {
|
|
29
|
+
private customEvaluator?;
|
|
30
|
+
private functionCache;
|
|
31
|
+
private maxCacheSize;
|
|
32
|
+
/**
|
|
33
|
+
* Set a custom evaluator function for handling complex conditions
|
|
34
|
+
*/
|
|
35
|
+
setCustomEvaluator(evaluator: CustomEvaluatorFunction): void;
|
|
36
|
+
/**
|
|
37
|
+
* Clear the custom evaluator
|
|
38
|
+
*/
|
|
39
|
+
clearCustomEvaluator(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Evaluate a condition expression against the provided context
|
|
42
|
+
*/
|
|
43
|
+
evaluate(expression: string, context: ConditionContext): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Built-in expression evaluator with support for common patterns
|
|
46
|
+
*/
|
|
47
|
+
private evaluateBuiltIn;
|
|
48
|
+
/**
|
|
49
|
+
* Sanitize expression to prevent code injection
|
|
50
|
+
*/
|
|
51
|
+
private sanitizeExpression;
|
|
52
|
+
/**
|
|
53
|
+
* Create a safe evaluation context from the condition context
|
|
54
|
+
*/
|
|
55
|
+
private createEvaluationContext;
|
|
56
|
+
/**
|
|
57
|
+
* Validate that an expression is syntactically correct without evaluating it
|
|
58
|
+
*/
|
|
59
|
+
validateExpression(expression: string): {
|
|
60
|
+
valid: boolean;
|
|
61
|
+
error?: string;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Get list of flag names referenced in an expression
|
|
65
|
+
*/
|
|
66
|
+
getReferencedFlags(expression: string): string[];
|
|
67
|
+
}
|
|
68
|
+
export declare const conditionEvaluator: ConditionEvaluator;
|
|
69
|
+
//# sourceMappingURL=condition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"condition.d.ts","sourceRoot":"","sources":["../../src/engine/condition.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;aACJ,UAAU,CAAC,EAAE,MAAM;aAAkB,KAAK,CAAC,EAAE,KAAK;gBAAnF,OAAO,EAAE,MAAM,EAAkB,UAAU,CAAC,EAAE,MAAM,YAAA,EAAkB,KAAK,CAAC,EAAE,KAAK,YAAA;CAIhG;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2BAA2B;IAC3B,KAAK,EAAE,SAAS,CAAC;IACjB,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC;AAkBjG;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,eAAe,CAAC,CAA0B;IAGlD,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,YAAY,CAAe;IAEnC;;OAEG;IACH,kBAAkB,CAAC,SAAS,EAAE,uBAAuB,GAAG,IAAI;IAI5D;;OAEG;IACH,oBAAoB,IAAI,IAAI;IAI5B;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO;IAkBhE;;OAEG;IACH,OAAO,CAAC,eAAe;IA+DvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA8B1B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAa/B;;OAEG;IACH,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAmB1E;;OAEG;IACH,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE;CAWjD;AAGD,eAAO,MAAM,kBAAkB,oBAA2B,CAAC"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// QNCE Condition Evaluator - Sprint 3.4
|
|
3
|
+
// Parses and evaluates conditional expressions for choice visibility
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.conditionEvaluator = exports.ConditionEvaluator = exports.ConditionEvaluationError = void 0;
|
|
6
|
+
/**
|
|
7
|
+
* Error thrown when condition evaluation fails
|
|
8
|
+
*/
|
|
9
|
+
class ConditionEvaluationError extends Error {
|
|
10
|
+
expression;
|
|
11
|
+
cause;
|
|
12
|
+
constructor(message, expression, cause) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.expression = expression;
|
|
15
|
+
this.cause = cause;
|
|
16
|
+
this.name = 'ConditionEvaluationError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.ConditionEvaluationError = ConditionEvaluationError;
|
|
20
|
+
/**
|
|
21
|
+
* Built-in expression operators
|
|
22
|
+
*/
|
|
23
|
+
const OPERATORS = {
|
|
24
|
+
'>=': (a, b) => a >= b,
|
|
25
|
+
'<=': (a, b) => a <= b,
|
|
26
|
+
'>': (a, b) => a > b,
|
|
27
|
+
'<': (a, b) => a < b,
|
|
28
|
+
'==': (a, b) => a == b,
|
|
29
|
+
'===': (a, b) => a === b,
|
|
30
|
+
'!=': (a, b) => a != b,
|
|
31
|
+
'!==': (a, b) => a !== b,
|
|
32
|
+
'&&': (a, b) => a && b,
|
|
33
|
+
'||': (a, b) => a || b,
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Condition evaluator service for parsing and executing conditional expressions
|
|
37
|
+
*/
|
|
38
|
+
class ConditionEvaluator {
|
|
39
|
+
customEvaluator;
|
|
40
|
+
// Cache compiled functions for better performance
|
|
41
|
+
functionCache = new Map();
|
|
42
|
+
maxCacheSize = 100;
|
|
43
|
+
/**
|
|
44
|
+
* Set a custom evaluator function for handling complex conditions
|
|
45
|
+
*/
|
|
46
|
+
setCustomEvaluator(evaluator) {
|
|
47
|
+
this.customEvaluator = evaluator;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Clear the custom evaluator
|
|
51
|
+
*/
|
|
52
|
+
clearCustomEvaluator() {
|
|
53
|
+
this.customEvaluator = undefined;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Evaluate a condition expression against the provided context
|
|
57
|
+
*/
|
|
58
|
+
evaluate(expression, context) {
|
|
59
|
+
try {
|
|
60
|
+
// If custom evaluator is set, use it first
|
|
61
|
+
if (this.customEvaluator) {
|
|
62
|
+
return this.customEvaluator(expression, context);
|
|
63
|
+
}
|
|
64
|
+
// Use built-in evaluator
|
|
65
|
+
return this.evaluateBuiltIn(expression, context);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
throw new ConditionEvaluationError(`Failed to evaluate condition: ${expression}`, expression, error instanceof Error ? error : new Error(String(error)));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Built-in expression evaluator with support for common patterns
|
|
73
|
+
*/
|
|
74
|
+
evaluateBuiltIn(expression, context) {
|
|
75
|
+
// Handle empty expressions
|
|
76
|
+
if (!expression || expression.trim() === '') {
|
|
77
|
+
throw new ConditionEvaluationError('Empty or whitespace-only condition expression', expression);
|
|
78
|
+
}
|
|
79
|
+
// Sanitize and prepare expression
|
|
80
|
+
const sanitizedExpression = this.sanitizeExpression(expression);
|
|
81
|
+
// Handle simple cases first
|
|
82
|
+
if (sanitizedExpression === 'true')
|
|
83
|
+
return true;
|
|
84
|
+
if (sanitizedExpression === 'false')
|
|
85
|
+
return false;
|
|
86
|
+
// Create safe evaluation context
|
|
87
|
+
const evalContext = this.createEvaluationContext(context);
|
|
88
|
+
// Check function cache for performance
|
|
89
|
+
let func = this.functionCache.get(sanitizedExpression);
|
|
90
|
+
if (!func) {
|
|
91
|
+
try {
|
|
92
|
+
// Use Function constructor for safe evaluation (better than eval)
|
|
93
|
+
func = new Function('flags', 'state', 'timestamp', 'customData', `
|
|
94
|
+
"use strict";
|
|
95
|
+
return ${sanitizedExpression};
|
|
96
|
+
`);
|
|
97
|
+
// Cache the function for future use
|
|
98
|
+
if (this.functionCache.size >= this.maxCacheSize) {
|
|
99
|
+
// Remove oldest entry when cache is full
|
|
100
|
+
const firstKey = this.functionCache.keys().next().value;
|
|
101
|
+
if (firstKey) {
|
|
102
|
+
this.functionCache.delete(firstKey);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
this.functionCache.set(sanitizedExpression, func);
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
throw new ConditionEvaluationError(`Invalid expression syntax: ${expression}`, expression, error instanceof Error ? error : new Error(String(error)));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
return !!func(evalContext.flags, evalContext.state, evalContext.timestamp, evalContext.customData);
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
throw new ConditionEvaluationError(`Runtime error evaluating: ${expression}`, expression, error instanceof Error ? error : new Error(String(error)));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Sanitize expression to prevent code injection
|
|
120
|
+
*/
|
|
121
|
+
sanitizeExpression(expression) {
|
|
122
|
+
// Remove potentially dangerous patterns
|
|
123
|
+
const dangerous = [
|
|
124
|
+
/\beval\b/g,
|
|
125
|
+
/\bFunction\b/g,
|
|
126
|
+
/\bconstructor\b/g,
|
|
127
|
+
/\bprototype\b/g,
|
|
128
|
+
/\b__proto__\b/g,
|
|
129
|
+
/\bimport\b/g,
|
|
130
|
+
/\brequire\b/g,
|
|
131
|
+
/\bprocess\b/g,
|
|
132
|
+
/\bglobal\b/g,
|
|
133
|
+
/\bwindow\b/g,
|
|
134
|
+
/\bdocument\b/g,
|
|
135
|
+
];
|
|
136
|
+
let sanitized = expression.trim();
|
|
137
|
+
for (const pattern of dangerous) {
|
|
138
|
+
if (pattern.test(sanitized)) {
|
|
139
|
+
throw new ConditionEvaluationError(`Potentially unsafe expression detected: ${expression}`, expression);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return sanitized;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Create a safe evaluation context from the condition context
|
|
146
|
+
*/
|
|
147
|
+
createEvaluationContext(context) {
|
|
148
|
+
return {
|
|
149
|
+
flags: { ...context.state.flags },
|
|
150
|
+
state: {
|
|
151
|
+
currentNodeId: context.state.currentNodeId,
|
|
152
|
+
flags: { ...context.state.flags },
|
|
153
|
+
history: [...context.state.history],
|
|
154
|
+
},
|
|
155
|
+
timestamp: context.timestamp,
|
|
156
|
+
customData: context.customData ? { ...context.customData } : {},
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Validate that an expression is syntactically correct without evaluating it
|
|
161
|
+
*/
|
|
162
|
+
validateExpression(expression) {
|
|
163
|
+
try {
|
|
164
|
+
this.sanitizeExpression(expression);
|
|
165
|
+
// Try to create the function without executing it
|
|
166
|
+
new Function('flags', 'state', 'timestamp', 'customData', `
|
|
167
|
+
"use strict";
|
|
168
|
+
return ${expression};
|
|
169
|
+
`);
|
|
170
|
+
return { valid: true };
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
return {
|
|
174
|
+
valid: false,
|
|
175
|
+
error: error instanceof Error ? error.message : String(error)
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get list of flag names referenced in an expression
|
|
181
|
+
*/
|
|
182
|
+
getReferencedFlags(expression) {
|
|
183
|
+
const flagPattern = /flags\.([a-zA-Z_$][a-zA-Z0-9_$]*)/g;
|
|
184
|
+
const matches = [];
|
|
185
|
+
let match;
|
|
186
|
+
while ((match = flagPattern.exec(expression)) !== null) {
|
|
187
|
+
matches.push(match[1]);
|
|
188
|
+
}
|
|
189
|
+
return Array.from(new Set(matches)); // Remove duplicates
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
exports.ConditionEvaluator = ConditionEvaluator;
|
|
193
|
+
// Create a global instance for the engine to use
|
|
194
|
+
exports.conditionEvaluator = new ConditionEvaluator();
|
|
195
|
+
//# sourceMappingURL=condition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"condition.js","sourceRoot":"","sources":["../../src/engine/condition.ts"],"names":[],"mappings":"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"}
|