draft-ole 0.9.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.ja.md +134 -0
- package/README.md +128 -0
- package/dist/chunk-5BNNDTRT.js +95 -0
- package/dist/chunk-5BNNDTRT.js.map +1 -0
- package/dist/chunk-STLTIBMA.js +7658 -0
- package/dist/chunk-STLTIBMA.js.map +1 -0
- package/dist/chunk-YK4Y4ENL.js +389 -0
- package/dist/chunk-YK4Y4ENL.js.map +1 -0
- package/dist/entries/app.cjs +7337 -0
- package/dist/entries/app.cjs.map +1 -0
- package/dist/entries/app.d.cts +115 -0
- package/dist/entries/app.d.ts +115 -0
- package/dist/entries/app.js +10 -0
- package/dist/entries/app.js.map +1 -0
- package/dist/entries/page.cjs +7558 -0
- package/dist/entries/page.cjs.map +1 -0
- package/dist/entries/page.d.cts +2 -0
- package/dist/entries/page.d.ts +2 -0
- package/dist/entries/page.js +30 -0
- package/dist/entries/page.js.map +1 -0
- package/dist/index.cjs +10524 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +4700 -0
- package/dist/index.d.ts +4700 -0
- package/dist/index.js +2573 -0
- package/dist/index.js.map +1 -0
- package/dist/page-DylNkWXm.d.ts +366 -0
- package/dist/page-h3DPzs8l.d.cts +366 -0
- package/dist/transformer/call-detector.d.ts +38 -0
- package/dist/transformer/call-detector.d.ts.map +1 -0
- package/dist/transformer/call-detector.js +151 -0
- package/dist/transformer/call-detector.js.map +1 -0
- package/dist/transformer/command-injector.d.ts +27 -0
- package/dist/transformer/command-injector.d.ts.map +1 -0
- package/dist/transformer/command-injector.js +111 -0
- package/dist/transformer/command-injector.js.map +1 -0
- package/dist/transformer/diagnostic-reporter.d.ts +81 -0
- package/dist/transformer/diagnostic-reporter.d.ts.map +1 -0
- package/dist/transformer/diagnostic-reporter.js +330 -0
- package/dist/transformer/diagnostic-reporter.js.map +1 -0
- package/dist/transformer/each-scope-branch.d.ts +28 -0
- package/dist/transformer/each-scope-branch.d.ts.map +1 -0
- package/dist/transformer/each-scope-branch.js +95 -0
- package/dist/transformer/each-scope-branch.js.map +1 -0
- package/dist/transformer/each-state-rewriter.d.ts +117 -0
- package/dist/transformer/each-state-rewriter.d.ts.map +1 -0
- package/dist/transformer/each-state-rewriter.js +393 -0
- package/dist/transformer/each-state-rewriter.js.map +1 -0
- package/dist/transformer/format-diagnostics.d.ts +27 -0
- package/dist/transformer/format-diagnostics.d.ts.map +1 -0
- package/dist/transformer/format-diagnostics.js +50 -0
- package/dist/transformer/format-diagnostics.js.map +1 -0
- package/dist/transformer/handler-ir-extractor.d.ts +71 -0
- package/dist/transformer/handler-ir-extractor.d.ts.map +1 -0
- package/dist/transformer/handler-ir-extractor.js +171 -0
- package/dist/transformer/handler-ir-extractor.js.map +1 -0
- package/dist/transformer/handler-serializer.d.ts +56 -0
- package/dist/transformer/handler-serializer.d.ts.map +1 -0
- package/dist/transformer/handler-serializer.js +315 -0
- package/dist/transformer/handler-serializer.js.map +1 -0
- package/dist/transformer/helper-context-resolver.d.ts +180 -0
- package/dist/transformer/helper-context-resolver.d.ts.map +1 -0
- package/dist/transformer/helper-context-resolver.js +376 -0
- package/dist/transformer/helper-context-resolver.js.map +1 -0
- package/dist/transformer/helper-decl-utils.d.ts +28 -0
- package/dist/transformer/helper-decl-utils.d.ts.map +1 -0
- package/dist/transformer/helper-decl-utils.js +92 -0
- package/dist/transformer/helper-decl-utils.js.map +1 -0
- package/dist/transformer/identifier-collector.d.ts +28 -0
- package/dist/transformer/identifier-collector.d.ts.map +1 -0
- package/dist/transformer/identifier-collector.js +184 -0
- package/dist/transformer/identifier-collector.js.map +1 -0
- package/dist/transformer/index.d.ts +56 -0
- package/dist/transformer/index.d.ts.map +1 -0
- package/dist/transformer/index.js +333 -0
- package/dist/transformer/index.js.map +1 -0
- package/dist/transformer/inline-recovery.d.ts +109 -0
- package/dist/transformer/inline-recovery.d.ts.map +1 -0
- package/dist/transformer/inline-recovery.js +369 -0
- package/dist/transformer/inline-recovery.js.map +1 -0
- package/dist/transformer/label-injector.d.ts +105 -0
- package/dist/transformer/label-injector.d.ts.map +1 -0
- package/dist/transformer/label-injector.js +221 -0
- package/dist/transformer/label-injector.js.map +1 -0
- package/dist/transformer/package.json +3 -0
- package/dist/transformer/per-call-context.d.ts +95 -0
- package/dist/transformer/per-call-context.d.ts.map +1 -0
- package/dist/transformer/per-call-context.js +3 -0
- package/dist/transformer/per-call-context.js.map +1 -0
- package/dist/transformer/state-id-fallback.d.ts +85 -0
- package/dist/transformer/state-id-fallback.d.ts.map +1 -0
- package/dist/transformer/state-id-fallback.js +132 -0
- package/dist/transformer/state-id-fallback.js.map +1 -0
- package/dist/transformer/state-id-resolver.d.ts +104 -0
- package/dist/transformer/state-id-resolver.d.ts.map +1 -0
- package/dist/transformer/state-id-resolver.js +222 -0
- package/dist/transformer/state-id-resolver.js.map +1 -0
- package/dist/transformer/theme-class-detector.d.ts +47 -0
- package/dist/transformer/theme-class-detector.d.ts.map +1 -0
- package/dist/transformer/theme-class-detector.js +242 -0
- package/dist/transformer/theme-class-detector.js.map +1 -0
- package/dist/transformer/varname-resolver.d.ts +53 -0
- package/dist/transformer/varname-resolver.d.ts.map +1 -0
- package/dist/transformer/varname-resolver.js +231 -0
- package/dist/transformer/varname-resolver.js.map +1 -0
- package/dist/transformer/whitelist-registry.d.ts +68 -0
- package/dist/transformer/whitelist-registry.d.ts.map +1 -0
- package/dist/transformer/whitelist-registry.js +122 -0
- package/dist/transformer/whitelist-registry.js.map +1 -0
- package/dist/transformer/whitelist-validator.d.ts +59 -0
- package/dist/transformer/whitelist-validator.d.ts.map +1 -0
- package/dist/transformer/whitelist-validator.js +493 -0
- package/dist/transformer/whitelist-validator.js.map +1 -0
- package/dist/types-BXV3vhHS.d.cts +4590 -0
- package/dist/types-BXV3vhHS.d.ts +4590 -0
- package/package.json +121 -0
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* whitelist-validator — ルート識別子・構文の検査
|
|
4
|
+
*
|
|
5
|
+
* Task 5.2:
|
|
6
|
+
* - `validateHandler(ir, refs, program, sourceFile, extraWhitelist?)` を export
|
|
7
|
+
* - 各 IdentifierRef を TypeChecker で型判定し `IdentifierKind` に分類
|
|
8
|
+
* 1. state/state-handle: DraftoleStateMarker プロパティの有無で判定
|
|
9
|
+
* 2. event-param: HandlerIR.paramName との一致
|
|
10
|
+
* 3. local: HandlerIR.localDecls との一致
|
|
11
|
+
* 4. builtin: BUILTIN_GLOBALS 照合(console を含む)
|
|
12
|
+
* 5. extraWhitelist: 追加ホワイトリスト識別子
|
|
13
|
+
* - unknown 検出時は ts.Diagnostic error を蓄積(全件走査)
|
|
14
|
+
*
|
|
15
|
+
* Task 5.3:
|
|
16
|
+
* - 二次コールバック再帰検査
|
|
17
|
+
* - .map(inner => ...) / .update(inner => ...) / .each(inner => ...) の
|
|
18
|
+
* 内部 ArrowFunction も同規則で検査
|
|
19
|
+
* - 内部アロー引数は event-param ではなく local として扱う
|
|
20
|
+
*
|
|
21
|
+
* 対応 requirements: 3.1, 3.2, 3.4, 3.5, 3.6
|
|
22
|
+
* 対応 design: whitelist-validator, D-1, D-7
|
|
23
|
+
*/
|
|
24
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
27
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
28
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
29
|
+
}
|
|
30
|
+
Object.defineProperty(o, k2, desc);
|
|
31
|
+
}) : (function(o, m, k, k2) {
|
|
32
|
+
if (k2 === undefined) k2 = k;
|
|
33
|
+
o[k2] = m[k];
|
|
34
|
+
}));
|
|
35
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
36
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
37
|
+
}) : function(o, v) {
|
|
38
|
+
o["default"] = v;
|
|
39
|
+
});
|
|
40
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
41
|
+
var ownKeys = function(o) {
|
|
42
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
43
|
+
var ar = [];
|
|
44
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
45
|
+
return ar;
|
|
46
|
+
};
|
|
47
|
+
return ownKeys(o);
|
|
48
|
+
};
|
|
49
|
+
return function (mod) {
|
|
50
|
+
if (mod && mod.__esModule) return mod;
|
|
51
|
+
var result = {};
|
|
52
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
53
|
+
__setModuleDefault(result, mod);
|
|
54
|
+
return result;
|
|
55
|
+
};
|
|
56
|
+
})();
|
|
57
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
58
|
+
exports.validateHandler = validateHandler;
|
|
59
|
+
const ts = __importStar(require("typescript"));
|
|
60
|
+
const whitelist_registry_1 = require("./whitelist-registry");
|
|
61
|
+
// ---- 定数 -------------------------------------------------------------------
|
|
62
|
+
/**
|
|
63
|
+
* 二次コールバックとして再帰検査するメソッド名。
|
|
64
|
+
* state.map(fn) / state.update(fn) / state.each(fn) の fn を対象とする。
|
|
65
|
+
* また、Array.prototype.filter / find / reduce / forEach / flatMap 等の
|
|
66
|
+
* 一般配列メソッドのコールバックも同規則で扱う(Req 3.1)。
|
|
67
|
+
*/
|
|
68
|
+
const NESTED_CALLBACK_METHODS = new Set([
|
|
69
|
+
'map', 'update', 'each',
|
|
70
|
+
'filter', 'find', 'findIndex', 'reduce', 'reduceRight',
|
|
71
|
+
'forEach', 'some', 'every', 'flatMap', 'sort',
|
|
72
|
+
]);
|
|
73
|
+
/**
|
|
74
|
+
* DraftoleStateMarker プロパティ名。
|
|
75
|
+
* state.ts で `declare const DraftoleStateMarker: unique symbol` として定義されており、
|
|
76
|
+
* TypeChecker から getProperty() で存在確認する(Design D-7)。
|
|
77
|
+
*
|
|
78
|
+
* unique symbol は通常プロパティ名で直接検索できないため、
|
|
79
|
+
* 型のプロパティシンボル一覧を走査して `__draftoleStateMarker__` または
|
|
80
|
+
* description に "DraftoleStateMarker" / "draftoleState" を含むシンボルを探す。
|
|
81
|
+
*/
|
|
82
|
+
const STATE_MARKER_CANDIDATES = [
|
|
83
|
+
'__draftoleStateMarker__',
|
|
84
|
+
'DraftoleStateMarker',
|
|
85
|
+
'_draftoleState',
|
|
86
|
+
];
|
|
87
|
+
/**
|
|
88
|
+
* 明示的に禁止するグローバル識別子。
|
|
89
|
+
*
|
|
90
|
+
* - `window` / `globalThis` / `global` / `self`: 直接 DOM/Node global へ触らせない
|
|
91
|
+
* - `undefined`: identifier として参照不可(再代入可能で安全な保証ができないため)。
|
|
92
|
+
* 利用側は `=== undefined` の比較ではなく `length === 0` 等の構造的判定に置換する。
|
|
93
|
+
* 値として必要な場合は `void 0` を使う(builtin として許可)。
|
|
94
|
+
*/
|
|
95
|
+
const FORBIDDEN_GLOBALS = new Set(['window', 'globalThis', 'global', 'self', 'undefined']);
|
|
96
|
+
/**
|
|
97
|
+
* Diagnostic エラーコード(DT001)
|
|
98
|
+
*/
|
|
99
|
+
const DT001_CODE = 9001;
|
|
100
|
+
// ---- 禁止構文ラベルマップ -----------------------------------------------------
|
|
101
|
+
/**
|
|
102
|
+
* 禁止 SyntaxKind → エラーメッセージ用の人間可読ラベル。
|
|
103
|
+
* PostfixUnaryExpression は ++ / -- のどちらか演算子種別で絞り込む。
|
|
104
|
+
*/
|
|
105
|
+
const FORBIDDEN_SYNTAX_LABELS = new Map([
|
|
106
|
+
[ts.SyntaxKind.AwaitExpression, 'await'],
|
|
107
|
+
[ts.SyntaxKind.YieldExpression, 'yield'],
|
|
108
|
+
[ts.SyntaxKind.PostfixUnaryExpression, 'postfix ++ / --'],
|
|
109
|
+
[ts.SyntaxKind.PrefixUnaryExpression, 'prefix ++ / --'],
|
|
110
|
+
[ts.SyntaxKind.Decorator, 'decorator'],
|
|
111
|
+
]);
|
|
112
|
+
// ---- ヘルパー ----------------------------------------------------------------
|
|
113
|
+
/**
|
|
114
|
+
* TypeChecker の型が DraftoleStateMarker プロパティを持つかを確認する。
|
|
115
|
+
*
|
|
116
|
+
* State<T> / Computed<T> / ScriptStateHandle<T> はすべて
|
|
117
|
+
* `readonly [DraftoleStateMarker]: 'state'` を持つ(Design D-7)。
|
|
118
|
+
*
|
|
119
|
+
* unique symbol プロパティは以下の方法で検出する:
|
|
120
|
+
* 1. 型の全プロパティシンボルを取得
|
|
121
|
+
* 2. 各シンボルの name に STATE_MARKER_CANDIDATES のいずれかを含むか確認
|
|
122
|
+
* 3. または `_runtimeId: string` プロパティを持つかも確認(補助判定)
|
|
123
|
+
*/
|
|
124
|
+
function hasStateMarker(type, checker) {
|
|
125
|
+
var _a, _b, _c;
|
|
126
|
+
// アプローチ1: 型のプロパティシンボルを全走査
|
|
127
|
+
const props = type.getProperties();
|
|
128
|
+
for (const prop of props) {
|
|
129
|
+
const name = prop.getName();
|
|
130
|
+
// STATE_MARKER_CANDIDATES との照合
|
|
131
|
+
for (const candidate of STATE_MARKER_CANDIDATES) {
|
|
132
|
+
if (name === candidate || name.includes('DraftoleState') || name.includes('draftoleState')) {
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// unique symbol プロパティ: シンボル名に "__draftole" を含む
|
|
137
|
+
if (name.toLowerCase().includes('draftole')) {
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// アプローチ2: `_runtimeId` と `get()` を持つ型を State と判定(構造的マーカー補助)
|
|
142
|
+
const runtimeIdProp = type.getProperty('_runtimeId');
|
|
143
|
+
const getProp = type.getProperty('get');
|
|
144
|
+
if (runtimeIdProp !== undefined && getProp !== undefined) {
|
|
145
|
+
// _runtimeId: string かつ get が関数である場合は State とみなす
|
|
146
|
+
const runtimeIdType = checker.getTypeOfSymbolAtLocation(runtimeIdProp, (_c = (_a = runtimeIdProp.valueDeclaration) !== null && _a !== void 0 ? _a : (_b = runtimeIdProp.declarations) === null || _b === void 0 ? void 0 : _b[0]) !== null && _c !== void 0 ? _c : {});
|
|
147
|
+
if ((runtimeIdType.flags & ts.TypeFlags.String) !== 0 ||
|
|
148
|
+
(runtimeIdType.flags & ts.TypeFlags.StringLiteral) !== 0) {
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// アプローチ3: 型名に State / Computed / StateHandle を含む
|
|
153
|
+
const typeName = checker.typeToString(type);
|
|
154
|
+
if (typeName.includes('State<') ||
|
|
155
|
+
typeName.includes('Computed<') ||
|
|
156
|
+
typeName.includes('StateHandle<') ||
|
|
157
|
+
typeName.includes('ReadableState<')) {
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* ts.Diagnostic error を生成するヘルパー。
|
|
164
|
+
*/
|
|
165
|
+
function createErrorDiagnostic(node, messageText, sourceFile) {
|
|
166
|
+
const start = node.getStart(sourceFile, false);
|
|
167
|
+
const length = node.getWidth(sourceFile);
|
|
168
|
+
return {
|
|
169
|
+
file: sourceFile,
|
|
170
|
+
start,
|
|
171
|
+
length,
|
|
172
|
+
messageText,
|
|
173
|
+
category: ts.DiagnosticCategory.Error,
|
|
174
|
+
code: DT001_CODE,
|
|
175
|
+
source: 'draftole-transformer',
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* 識別子が event-param かどうかを判定する。
|
|
180
|
+
*/
|
|
181
|
+
function isEventParam(name, ir) {
|
|
182
|
+
return ir.paramName !== null && name === ir.paramName;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* 識別子が local かどうかを判定する。
|
|
186
|
+
*/
|
|
187
|
+
function isLocal(name, ir) {
|
|
188
|
+
return ir.localDecls.has(name);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* ノードが二次コールバック呼び出し(state.map/update/each の ArrowFunction 引数)
|
|
192
|
+
* かどうかを確認し、該当する ArrowFunction を返す。
|
|
193
|
+
*
|
|
194
|
+
* 例: `myState.map(inner => inner + 1)` → `inner => inner + 1` を返す
|
|
195
|
+
*/
|
|
196
|
+
function findNestedCallbackArrow(node) {
|
|
197
|
+
// CallExpression かどうか確認
|
|
198
|
+
if (!ts.isCallExpression(node))
|
|
199
|
+
return undefined;
|
|
200
|
+
const callExpr = node;
|
|
201
|
+
// メソッドアクセス(obj.method(...))か確認
|
|
202
|
+
const expr = callExpr.expression;
|
|
203
|
+
if (!ts.isPropertyAccessExpression(expr))
|
|
204
|
+
return undefined;
|
|
205
|
+
// メソッド名が map/update/each か確認
|
|
206
|
+
const methodName = expr.name.text;
|
|
207
|
+
if (!NESTED_CALLBACK_METHODS.has(methodName))
|
|
208
|
+
return undefined;
|
|
209
|
+
// 引数リストに ArrowFunction が含まれるか確認(最初の引数を対象)
|
|
210
|
+
for (const arg of callExpr.arguments) {
|
|
211
|
+
if (ts.isArrowFunction(arg)) {
|
|
212
|
+
return arg;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return undefined;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* 指定ノードが outerArrow 内の .map/.update/.each コールバック ArrowFunction の
|
|
219
|
+
* 内部(その body または parameters の子孫)に属するかを確認する。
|
|
220
|
+
* 属する場合、ネストされた ArrowFunction を返す(外側の検査でスキップするため)。
|
|
221
|
+
*/
|
|
222
|
+
function findEnclosingNestedArrow(node, outerArrow) {
|
|
223
|
+
// outerArrow 本体全体を走査して .map/.update/.each(Arrow) パターンを収集
|
|
224
|
+
const nestedArrows = [];
|
|
225
|
+
function collectNested(n) {
|
|
226
|
+
const found = findNestedCallbackArrow(n);
|
|
227
|
+
if (found !== undefined) {
|
|
228
|
+
nestedArrows.push(found);
|
|
229
|
+
// found の内部はさらに深いネストとして別途収集しない(ここでは1段のみ)
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
ts.forEachChild(n, collectNested);
|
|
233
|
+
}
|
|
234
|
+
collectNested(outerArrow.body);
|
|
235
|
+
// node がいずれかの nestedArrow の子孫かを確認
|
|
236
|
+
for (const nestedArrow of nestedArrows) {
|
|
237
|
+
if (isDescendantOf(node, nestedArrow)) {
|
|
238
|
+
return nestedArrow;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return undefined;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* target が ancestor の子孫ノードかを確認する。
|
|
245
|
+
*/
|
|
246
|
+
function isDescendantOf(target, ancestor) {
|
|
247
|
+
let current = target;
|
|
248
|
+
while (current !== undefined) {
|
|
249
|
+
if (current === ancestor)
|
|
250
|
+
return true;
|
|
251
|
+
current = current.parent;
|
|
252
|
+
}
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* ArrowFunction の仮引数名リストを返す。
|
|
257
|
+
*/
|
|
258
|
+
function getArrowParamNames(arrowFn) {
|
|
259
|
+
return arrowFn.parameters.map((p) => {
|
|
260
|
+
if (ts.isIdentifier(p.name)) {
|
|
261
|
+
return p.name.text;
|
|
262
|
+
}
|
|
263
|
+
return '';
|
|
264
|
+
}).filter((n) => n.length > 0);
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* 内部アロー関数の識別子を収集する(内部アロー自身のネストは含めない)。
|
|
268
|
+
* collectRefs と同様のロジックだが、inner arrow の body のみを対象にする。
|
|
269
|
+
*/
|
|
270
|
+
function collectNestedRefs(arrowFn, checker, outerSeen) {
|
|
271
|
+
const refs = [];
|
|
272
|
+
const seen = new Set(outerSeen);
|
|
273
|
+
function collect(node) {
|
|
274
|
+
// 内部にさらに ArrowFunction がある場合は再帰しない(別途処理)
|
|
275
|
+
if (ts.isArrowFunction(node) && node !== arrowFn)
|
|
276
|
+
return;
|
|
277
|
+
if (ts.isIdentifier(node)) {
|
|
278
|
+
const parent = node.parent;
|
|
279
|
+
if (ts.isPropertyAccessExpression(parent) && parent.name === node)
|
|
280
|
+
return;
|
|
281
|
+
if (ts.isPropertyAssignment(parent) && parent.name === node)
|
|
282
|
+
return;
|
|
283
|
+
const name = node.text;
|
|
284
|
+
if (seen.has(name))
|
|
285
|
+
return;
|
|
286
|
+
seen.add(name);
|
|
287
|
+
const symbol = checker.getSymbolAtLocation(node);
|
|
288
|
+
refs.push({ name, node, symbol, kind: { tag: 'unknown' } });
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
ts.forEachChild(node, collect);
|
|
292
|
+
}
|
|
293
|
+
// 仮引数を収集
|
|
294
|
+
for (const param of arrowFn.parameters) {
|
|
295
|
+
collect(param.name);
|
|
296
|
+
}
|
|
297
|
+
// 本体を収集
|
|
298
|
+
collect(arrowFn.body);
|
|
299
|
+
return refs;
|
|
300
|
+
}
|
|
301
|
+
// ---- 禁止構文ウォーカー -------------------------------------------------------
|
|
302
|
+
/**
|
|
303
|
+
* ハンドラ本体 AST を走査し、FORBIDDEN_SYNTAX に該当するノードに対して
|
|
304
|
+
* ts.Diagnostic error を生成する(Req 4.8)。
|
|
305
|
+
*
|
|
306
|
+
* - AwaitExpression / YieldExpression: 無条件禁止
|
|
307
|
+
* - PostfixUnaryExpression: 演算子が ++ / -- のときのみ禁止
|
|
308
|
+
* - PrefixUnaryExpression: 演算子が ++ / -- のときのみ禁止(! や - は許可)
|
|
309
|
+
*
|
|
310
|
+
* @param handlerBody ハンドラの ArrowFunction の body ノード
|
|
311
|
+
* @param sourceFile 対象ソースファイル(診断情報の位置用)
|
|
312
|
+
* @param diagnostics 結果を蓄積する配列(破壊的追加)
|
|
313
|
+
*/
|
|
314
|
+
function validateForbiddenSyntax(handlerBody, sourceFile, diagnostics) {
|
|
315
|
+
function visit(node) {
|
|
316
|
+
var _a;
|
|
317
|
+
if (!(0, whitelist_registry_1.isForbiddenSyntaxKind)(node.kind)) {
|
|
318
|
+
ts.forEachChild(node, visit);
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
// PostfixUnaryExpression / PrefixUnaryExpression は ++ / -- のみ禁止
|
|
322
|
+
if (node.kind === ts.SyntaxKind.PostfixUnaryExpression ||
|
|
323
|
+
node.kind === ts.SyntaxKind.PrefixUnaryExpression) {
|
|
324
|
+
const unary = node;
|
|
325
|
+
const op = unary.operator;
|
|
326
|
+
if (op !== ts.SyntaxKind.PlusPlusToken &&
|
|
327
|
+
op !== ts.SyntaxKind.MinusMinusToken) {
|
|
328
|
+
// ! や - は許可 → 子ノードを継続走査
|
|
329
|
+
ts.forEachChild(node, visit);
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
const opText = op === ts.SyntaxKind.PlusPlusToken ? '++' : '--';
|
|
333
|
+
const isPostfix = node.kind === ts.SyntaxKind.PostfixUnaryExpression;
|
|
334
|
+
const label = isPostfix ? `postfix ${opText}` : `prefix ${opText}`;
|
|
335
|
+
diagnostics.push(createErrorDiagnostic(node, `DraftOle DT001: Forbidden syntax '${label}' is not allowed in DraftOle handlers. ` +
|
|
336
|
+
`Use state.update(fn) or state.set(state.get() ${opText === '++' ? '+ 1' : '- 1'}) instead. See docs/api/handler-serialization.md`, sourceFile));
|
|
337
|
+
ts.forEachChild(node, visit);
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
// AwaitExpression / YieldExpression / Decorator: 無条件禁止
|
|
341
|
+
const label = (_a = FORBIDDEN_SYNTAX_LABELS.get(node.kind)) !== null && _a !== void 0 ? _a : ts.SyntaxKind[node.kind];
|
|
342
|
+
const detail = node.kind === ts.SyntaxKind.Decorator
|
|
343
|
+
? 'Decorators are not serializable.'
|
|
344
|
+
: 'async/await and yield are not serializable.';
|
|
345
|
+
diagnostics.push(createErrorDiagnostic(node, `DraftOle DT001: Forbidden syntax '${label}' is not allowed in DraftOle handlers. ` +
|
|
346
|
+
`${detail} See docs/api/handler-serialization.md`, sourceFile));
|
|
347
|
+
ts.forEachChild(node, visit);
|
|
348
|
+
}
|
|
349
|
+
visit(handlerBody);
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* ハンドラ内の識別子参照リストを検証し、unknown な識別子に対して
|
|
353
|
+
* `ts.Diagnostic` エラーを返す。
|
|
354
|
+
*
|
|
355
|
+
* - IdentifierRef の各要素を順番に判定する(全件走査)
|
|
356
|
+
* - unknown 検出時は即終了せず蓄積して全件返す(Req 2.7)
|
|
357
|
+
*
|
|
358
|
+
* @param ir HandlerIR(paramName / localDecls を使用)
|
|
359
|
+
* @param refs collectIdentifiers が返した IdentifierRef[]
|
|
360
|
+
* @param program ts.Program(TypeChecker 取得に使用)
|
|
361
|
+
* @param sourceFile 対象ソースファイル(診断情報の位置用)
|
|
362
|
+
* @param extraWhitelist 追加ホワイトリスト識別子(DraftoleTransformerOptions.extraWhitelist)
|
|
363
|
+
* @param options 任意オプション (Task 3.3: helper-aware paramSymbols 等)
|
|
364
|
+
* @returns unknown 識別子に対する ts.Diagnostic[](PASS なら空配列)
|
|
365
|
+
*/
|
|
366
|
+
function validateHandler(ir, refs, program, sourceFile, extraWhitelist, options) {
|
|
367
|
+
const checker = program.getTypeChecker();
|
|
368
|
+
const diagnostics = [];
|
|
369
|
+
const extra = new Set(extraWhitelist !== null && extraWhitelist !== void 0 ? extraWhitelist : []);
|
|
370
|
+
const paramSymbols = options === null || options === void 0 ? void 0 : options.paramSymbols;
|
|
371
|
+
// ---- 禁止構文チェック (Req 4.8) -------------------------------------------
|
|
372
|
+
validateForbiddenSyntax(ir.node.body, sourceFile, diagnostics);
|
|
373
|
+
for (const ref of refs) {
|
|
374
|
+
const { name, node } = ref;
|
|
375
|
+
// ---- 0. nested callback scope ----------------------------------------
|
|
376
|
+
// refs が外部から収集されていて nested arrow 内の識別子を含む場合、
|
|
377
|
+
// その識別子は nested validator が処理するためここでスキップする。
|
|
378
|
+
if (findEnclosingNestedArrow(node, ir.node) !== undefined) {
|
|
379
|
+
continue;
|
|
380
|
+
}
|
|
381
|
+
// ---- 1. event-param --------------------------------------------------
|
|
382
|
+
if (isEventParam(name, ir)) {
|
|
383
|
+
continue;
|
|
384
|
+
}
|
|
385
|
+
// ---- 1b. helper-aware each-scope param Symbol (Task 3.3) -------------
|
|
386
|
+
// helper 経由で `.each(item => helper())` の helper body 内に現れる `item` 等は
|
|
387
|
+
// 通常 `event-param` / `local` / `builtin` のいずれにも該当せず、また
|
|
388
|
+
// `getTypeAtLocation` も State<T> 系として解決されないため、従来は
|
|
389
|
+
// unknown 識別子として誤拒否されていた。
|
|
390
|
+
// `tryEnclosingHelperRecovery` が helper-aware に構築した paramSymbols 集合
|
|
391
|
+
// (call-site `.each(itemParam)` の Symbol + helper body 内同名 Identifier の
|
|
392
|
+
// Symbol) と一致する場合は each-scope 内参照として許可する。
|
|
393
|
+
if (paramSymbols !== undefined && paramSymbols.size > 0) {
|
|
394
|
+
const sym = checker.getSymbolAtLocation(node);
|
|
395
|
+
if (sym !== undefined && paramSymbols.has(sym)) {
|
|
396
|
+
continue;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
// ---- 2. local --------------------------------------------------------
|
|
400
|
+
if (isLocal(name, ir)) {
|
|
401
|
+
continue;
|
|
402
|
+
}
|
|
403
|
+
// ---- 3. builtin (BUILTIN_GLOBALS + console) --------------------------
|
|
404
|
+
if ((0, whitelist_registry_1.isBuiltinGlobal)(name)) {
|
|
405
|
+
continue;
|
|
406
|
+
}
|
|
407
|
+
// ---- 4. extraWhitelist -----------------------------------------------
|
|
408
|
+
if (extra.has(name)) {
|
|
409
|
+
continue;
|
|
410
|
+
}
|
|
411
|
+
// ---- 5. FORBIDDEN_GLOBALS (window / globalThis / undefined / ...) -----
|
|
412
|
+
if (FORBIDDEN_GLOBALS.has(name)) {
|
|
413
|
+
const hint = name === 'undefined'
|
|
414
|
+
? `Use structural checks (e.g., 'arr.length === 0', '.includes(x)') or 'void 0' literal instead of '=== undefined' comparisons.`
|
|
415
|
+
: `Use state API or event parameters instead.`;
|
|
416
|
+
diagnostics.push(createErrorDiagnostic(node, `DraftOle DT001: Identifier '${name}' is forbidden in DraftOle handlers. ` +
|
|
417
|
+
`${hint} See docs/api/handler-serialization.md`, sourceFile));
|
|
418
|
+
continue;
|
|
419
|
+
}
|
|
420
|
+
// ---- 6. State/Computed/ScriptStateHandle 型判定 (TypeChecker) --------
|
|
421
|
+
const type = checker.getTypeAtLocation(node);
|
|
422
|
+
if (hasStateMarker(type, checker)) {
|
|
423
|
+
// State 系型と判定: 許可
|
|
424
|
+
continue;
|
|
425
|
+
}
|
|
426
|
+
// ---- 7. unknown → エラー蓄積 -----------------------------------------
|
|
427
|
+
diagnostics.push(createErrorDiagnostic(node, `DraftOle DT001: Identifier '${name}' is not allowed in DraftOle handlers. ` +
|
|
428
|
+
`Only state API references, event parameters, local declarations, and built-ins are permitted. ` +
|
|
429
|
+
`If '${name}' is a state, declare it via 'root.state(...)'. See docs/api/handler-serialization.md`, sourceFile));
|
|
430
|
+
}
|
|
431
|
+
// ---- 二次コールバック再帰検査 (Req 3.5) ------------------------------------
|
|
432
|
+
// outer ハンドラの AST ノードを走査して .map/.update/.each(ArrowFunction) を探し、
|
|
433
|
+
// 内部アローを同じホワイトリスト規則で再帰検査する。
|
|
434
|
+
// 内部アロー引数は event-param ではなく local として扱う。
|
|
435
|
+
// Task 3.3: helper-aware paramSymbols は inner-callback 再帰にも伝播する。
|
|
436
|
+
validateNestedCallbacks(ir, program, sourceFile, extra, diagnostics, checker, paramSymbols);
|
|
437
|
+
return diagnostics;
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* outer ハンドラの AST 全体を走査し、
|
|
441
|
+
* .map/.update/.each(ArrowFunction) パターンを見つけて再帰検査する。
|
|
442
|
+
*
|
|
443
|
+
* @param ir outer HandlerIR(paramName / localDecls を含む)
|
|
444
|
+
* @param program ts.Program
|
|
445
|
+
* @param sourceFile 対象ソースファイル
|
|
446
|
+
* @param extra extraWhitelist の Set
|
|
447
|
+
* @param diagnostics 結果を蓄積する配列(破壊的追加)
|
|
448
|
+
* @param checker TypeChecker
|
|
449
|
+
*/
|
|
450
|
+
function validateNestedCallbacks(ir, program, sourceFile, extra, diagnostics, checker, paramSymbols) {
|
|
451
|
+
function visitNode(node) {
|
|
452
|
+
// .map/.update/.each(ArrowFunction) パターンを検出
|
|
453
|
+
const nestedArrow = findNestedCallbackArrow(node);
|
|
454
|
+
if (nestedArrow !== undefined) {
|
|
455
|
+
// 内部アローのパラメータ名を収集して local として追加
|
|
456
|
+
const innerParamNames = getArrowParamNames(nestedArrow);
|
|
457
|
+
// outer の localDecls + event-param + inner params を合わせた localDecls を作成
|
|
458
|
+
const innerLocalDecls = new Set(ir.localDecls);
|
|
459
|
+
if (ir.paramName !== null) {
|
|
460
|
+
innerLocalDecls.add(ir.paramName);
|
|
461
|
+
}
|
|
462
|
+
for (const paramName of innerParamNames) {
|
|
463
|
+
innerLocalDecls.add(paramName);
|
|
464
|
+
}
|
|
465
|
+
// 内部アロー用の HandlerIR(paramName は null、inner params は全て local 扱い)
|
|
466
|
+
const innerIR = {
|
|
467
|
+
node: nestedArrow,
|
|
468
|
+
paramName: null,
|
|
469
|
+
paramTypeText: null,
|
|
470
|
+
localDecls: innerLocalDecls,
|
|
471
|
+
referencedIdentifiers: [],
|
|
472
|
+
isExpressionBody: !ts.isBlock(nestedArrow.body),
|
|
473
|
+
};
|
|
474
|
+
// 内部アローの識別子を収集(既に outer で見た識別子も再チェックする)
|
|
475
|
+
const innerRefs = collectNestedRefs(nestedArrow, checker, new Set());
|
|
476
|
+
// 内部アローを同規則で検査(diagnostics に直接追加)
|
|
477
|
+
// Task 3.3: helper-aware paramSymbols を inner-callback にも伝播する。
|
|
478
|
+
// helper 経由 each-scope の `item` Symbol が、inner `.map(inner => item...)`
|
|
479
|
+
// 等の中で参照されても誤拒否されないようにするため。
|
|
480
|
+
const innerDiags = validateHandler(innerIR, innerRefs, program, sourceFile, [...extra], { paramSymbols });
|
|
481
|
+
for (const d of innerDiags) {
|
|
482
|
+
diagnostics.push(d);
|
|
483
|
+
}
|
|
484
|
+
// 内部アロー自体のさらなるネストは validateHandler 内の再帰呼び出しが処理するため、
|
|
485
|
+
// ここでは内部アローの子ノードを再帰的に visitNode しない
|
|
486
|
+
return;
|
|
487
|
+
}
|
|
488
|
+
ts.forEachChild(node, visitNode);
|
|
489
|
+
}
|
|
490
|
+
// outer ハンドラ本体を走査
|
|
491
|
+
visitNode(ir.node.body);
|
|
492
|
+
}
|
|
493
|
+
//# sourceMappingURL=whitelist-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whitelist-validator.js","sourceRoot":"","sources":["../../src/transformer/whitelist-validator.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8YH,0CAwGC;AApfD,+CAAiC;AAEjC,6DAA8E;AAE9E,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IACtC,KAAK,EAAE,QAAQ,EAAE,MAAM;IACvB,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa;IACtD,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM;CAC9C,CAAC,CAAC;AAEH;;;;;;;;GAQG;AACH,MAAM,uBAAuB,GAAG;IAC9B,yBAAyB;IACzB,qBAAqB;IACrB,gBAAgB;CACjB,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;AAE3F;;GAEG;AACH,MAAM,UAAU,GAAG,IAAqC,CAAC;AAEzD,wEAAwE;AAExE;;;GAGG;AACH,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAwB;IAC7D,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,EAAE,OAAO,CAAC;IACxC,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,EAAE,OAAO,CAAC;IACxC,CAAC,EAAE,CAAC,UAAU,CAAC,sBAAsB,EAAE,iBAAiB,CAAC;IACzD,CAAC,EAAE,CAAC,UAAU,CAAC,qBAAqB,EAAE,gBAAgB,CAAC;IACvD,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,WAAW,CAAC;CACvC,CAAC,CAAC;AAEH,6EAA6E;AAE7E;;;;;;;;;;GAUG;AACH,SAAS,cAAc,CAAC,IAAa,EAAE,OAAuB;;IAC5D,0BAA0B;IAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,+BAA+B;QAC/B,KAAK,MAAM,SAAS,IAAI,uBAAuB,EAAE,CAAC;YAChD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC3F,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,+CAA+C;QAC/C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,aAAa,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACzD,iDAAiD;QACjD,MAAM,aAAa,GAAG,OAAO,CAAC,yBAAyB,CACrD,aAAa,EACb,MAAA,MAAA,aAAa,CAAC,gBAAgB,mCAAI,MAAA,aAAa,CAAC,YAAY,0CAAG,CAAC,CAAC,mCAAK,EAAc,CACrF,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;YACjD,CAAC,aAAa,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5C,IACE,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC3B,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC9B,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC;QACjC,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EACnC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAC5B,IAAa,EACb,WAAmB,EACnB,UAAyB;IAEzB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACzC,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,KAAK;QACL,MAAM;QACN,WAAW;QACX,QAAQ,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK;QACrC,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,sBAAsB;KAC/B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,IAAY,EAAE,EAAa;IAC/C,OAAO,EAAE,CAAC,SAAS,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC,SAAS,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,SAAS,OAAO,CAAC,IAAY,EAAE,EAAa;IAC1C,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED;;;;;GAKG;AACH,SAAS,uBAAuB,CAC9B,IAAa;IAEb,wBAAwB;IACxB,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC;IAEtB,+BAA+B;IAC/B,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC;IACjC,IAAI,CAAC,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAE3D,6BAA6B;IAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IAClC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IAE/D,0CAA0C;IAC1C,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QACrC,IAAI,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,SAAS,wBAAwB,CAC/B,IAAa,EACb,UAA4B;IAE5B,yDAAyD;IACzD,MAAM,YAAY,GAAuB,EAAE,CAAC;IAE5C,SAAS,aAAa,CAAC,CAAU;QAC/B,MAAM,KAAK,GAAG,uBAAuB,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,yCAAyC;YACzC,OAAO;QACT,CAAC;QACD,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;IACpC,CAAC;IACD,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAE/B,kCAAkC;IAClC,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,IAAI,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;YACtC,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,MAAe,EAAE,QAAiB;IACxD,IAAI,OAAO,GAAwB,MAAM,CAAC;IAC1C,OAAO,OAAO,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,OAAO,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACtC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAC3B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,OAAyB;IACnD,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAClC,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACrB,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CACxB,OAAyB,EACzB,OAAuB,EACvB,SAAsB;IAEtB,MAAM,IAAI,GAAoB,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,SAAS,CAAC,CAAC;IAExC,SAAS,OAAO,CAAC,IAAa;QAC5B,yCAAyC;QACzC,IAAI,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,OAAO;YAAE,OAAO;QAEzD,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,IAAI,EAAE,CAAC,0BAA0B,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI;gBAAE,OAAO;YAC1E,IAAI,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI;gBAAE,OAAO;YAEpE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACvB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO;YAC3B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAEf,MAAM,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YACjD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QACD,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,SAAS;IACT,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IACD,QAAQ;IACR,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yEAAyE;AAEzE;;;;;;;;;;;GAWG;AACH,SAAS,uBAAuB,CAC9B,WAAoB,EACpB,UAAyB,EACzB,WAA4B;IAE5B,SAAS,KAAK,CAAC,IAAa;;QAC1B,IAAI,CAAC,IAAA,0CAAqB,EAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,gEAAgE;QAChE,IACE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,sBAAsB;YAClD,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,qBAAqB,EACjD,CAAC;YACD,MAAM,KAAK,GAAG,IAA4D,CAAC;YAC3E,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC;YAC1B,IACE,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,aAAa;gBAClC,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,eAAe,EACpC,CAAC;gBACD,wBAAwB;gBACxB,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAC7B,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAChE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,sBAAsB,CAAC;YACrE,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC,CAAC,UAAU,MAAM,EAAE,CAAC;YACnE,WAAW,CAAC,IAAI,CACd,qBAAqB,CACnB,IAAI,EACJ,qCAAqC,KAAK,yCAAyC;gBACjF,iDAAiD,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,kDAAkD,EACpI,UAAU,CACX,CACF,CAAC;YACF,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,uDAAuD;QACvD,MAAM,KAAK,GAAG,MAAA,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,mCAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjF,MAAM,MAAM,GACV,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,SAAS;YACnC,CAAC,CAAC,kCAAkC;YACpC,CAAC,CAAC,6CAA6C,CAAC;QACpD,WAAW,CAAC,IAAI,CACd,qBAAqB,CACnB,IAAI,EACJ,qCAAqC,KAAK,yCAAyC;YACjF,GAAG,MAAM,wCAAwC,EACnD,UAAU,CACX,CACF,CAAC;QACF,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,CAAC;AACrB,CAAC;AAuBD;;;;;;;;;;;;;;GAcG;AACH,SAAgB,eAAe,CAC7B,EAAa,EACb,IAAqB,EACrB,OAAmB,EACnB,UAAyB,EACzB,cAAkC,EAClC,OAAgC;IAEhC,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IACzC,MAAM,WAAW,GAAoB,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAS,cAAc,aAAd,cAAc,cAAd,cAAc,GAAI,EAAE,CAAC,CAAC;IACpD,MAAM,YAAY,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,YAAY,CAAC;IAE3C,sEAAsE;IACtE,uBAAuB,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAE/D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;QAE3B,yEAAyE;QACzE,6CAA6C;QAC7C,4CAA4C;QAC5C,IAAI,wBAAwB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YAC1D,SAAS;QACX,CAAC;QAED,yEAAyE;QACzE,IAAI,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,yEAAyE;QACzE,qEAAqE;QACrE,uDAAuD;QACvD,kDAAkD;QAClD,0BAA0B;QAC1B,oEAAoE;QACpE,wEAAwE;QACxE,0CAA0C;QAC1C,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACxD,MAAM,GAAG,GAAG,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC9C,IAAI,GAAG,KAAK,SAAS,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/C,SAAS;YACX,CAAC;QACH,CAAC;QAED,yEAAyE;QACzE,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;YACtB,SAAS;QACX,CAAC;QAED,yEAAyE;QACzE,IAAI,IAAA,oCAAe,EAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,yEAAyE;QACzE,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,SAAS;QACX,CAAC;QAED,0EAA0E;QAC1E,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,KAAK,WAAW;gBAC/B,CAAC,CAAC,8HAA8H;gBAChI,CAAC,CAAC,4CAA4C,CAAC;YACjD,WAAW,CAAC,IAAI,CACd,qBAAqB,CACnB,IAAI,EACJ,+BAA+B,IAAI,uCAAuC;gBACxE,GAAG,IAAI,wCAAwC,EACjD,UAAU,CACX,CACF,CAAC;YACF,SAAS;QACX,CAAC;QAED,sEAAsE;QACtE,MAAM,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;YAClC,kBAAkB;YAClB,SAAS;QACX,CAAC;QAED,oEAAoE;QACpE,WAAW,CAAC,IAAI,CACd,qBAAqB,CACnB,IAAI,EACJ,+BAA+B,IAAI,yCAAyC;YAC1E,gGAAgG;YAChG,OAAO,IAAI,uFAAuF,EACpG,UAAU,CACX,CACF,CAAC;IACJ,CAAC;IAED,mEAAmE;IACnE,kEAAkE;IAClE,4BAA4B;IAC5B,yCAAyC;IACzC,iEAAiE;IACjE,uBAAuB,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IAE5F,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,uBAAuB,CAC9B,EAAa,EACb,OAAmB,EACnB,UAAyB,EACzB,KAAkB,EAClB,WAA4B,EAC5B,OAAuB,EACvB,YAAgD;IAEhD,SAAS,SAAS,CAAC,IAAa;QAC9B,4CAA4C;QAC5C,MAAM,WAAW,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,gCAAgC;YAChC,MAAM,eAAe,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAExD,uEAAuE;YACvE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAS,EAAE,CAAC,UAAU,CAAC,CAAC;YACvD,IAAI,EAAE,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;gBAC1B,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;YACpC,CAAC;YACD,KAAK,MAAM,SAAS,IAAI,eAAe,EAAE,CAAC;gBACxC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACjC,CAAC;YAED,gEAAgE;YAChE,MAAM,OAAO,GAAc;gBACzB,IAAI,EAAE,WAAW;gBACjB,SAAS,EAAE,IAAI;gBACf,aAAa,EAAE,IAAI;gBACnB,UAAU,EAAE,eAAe;gBAC3B,qBAAqB,EAAE,EAAE;gBACzB,gBAAgB,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;aAChD,CAAC;YAEF,wCAAwC;YACxC,MAAM,SAAS,GAAG,iBAAiB,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC;YAE7E,kCAAkC;YAClC,+DAA+D;YAC/D,0EAA0E;YAC1E,8BAA8B;YAC9B,MAAM,UAAU,GAAG,eAAe,CAChC,OAAO,EACP,SAAS,EACT,OAAO,EACP,UAAU,EACV,CAAC,GAAG,KAAK,CAAC,EACV,EAAE,YAAY,EAAE,CACjB,CAAC;YACF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;gBAC3B,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACtB,CAAC;YAED,oDAAoD;YACpD,oCAAoC;YACpC,OAAO;QACT,CAAC;QAED,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACnC,CAAC;IAED,kBAAkB;IAClB,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|