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,315 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* handler-serializer: `HandlerIR` + `stateIdMap` → `SerializedHandler { code, params }`
|
|
4
|
+
*
|
|
5
|
+
* Task 6.1:
|
|
6
|
+
* - `HandlerIR` と `stateIdMap: Map<ts.Symbol, string>` を受け取り、
|
|
7
|
+
* ハンドラ本体のアロー関数を `__draftole__.state("<runtimeId>")...` 形式の JS 文字列に変換する
|
|
8
|
+
* - `ts.transform` + 自家製 visitor で識別子を PropertyAccess 連鎖に置換
|
|
9
|
+
* - 最終 JS は `ts.createPrinter()` で emit(型注釈は tsc が自動除去)
|
|
10
|
+
* - 式本体アロー (`() => expr`) もブロック本体 (`() => { ... }`) も同一 IR で処理
|
|
11
|
+
*
|
|
12
|
+
* 対応 requirements: 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.9
|
|
13
|
+
* 対応 design: handler-serializer, D-8
|
|
14
|
+
*/
|
|
15
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
18
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
19
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
20
|
+
}
|
|
21
|
+
Object.defineProperty(o, k2, desc);
|
|
22
|
+
}) : (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
o[k2] = m[k];
|
|
25
|
+
}));
|
|
26
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
27
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
28
|
+
}) : function(o, v) {
|
|
29
|
+
o["default"] = v;
|
|
30
|
+
});
|
|
31
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
32
|
+
var ownKeys = function(o) {
|
|
33
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
34
|
+
var ar = [];
|
|
35
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
36
|
+
return ar;
|
|
37
|
+
};
|
|
38
|
+
return ownKeys(o);
|
|
39
|
+
};
|
|
40
|
+
return function (mod) {
|
|
41
|
+
if (mod && mod.__esModule) return mod;
|
|
42
|
+
var result = {};
|
|
43
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
44
|
+
__setModuleDefault(result, mod);
|
|
45
|
+
return result;
|
|
46
|
+
};
|
|
47
|
+
})();
|
|
48
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
+
exports.serializeHandler = serializeHandler;
|
|
50
|
+
const ts = __importStar(require("typescript"));
|
|
51
|
+
// ---- ランタイム API 名 -------------------------------------------------------
|
|
52
|
+
/** ランタイムグローバル名 */
|
|
53
|
+
const RUNTIME_GLOBAL = '__draftole__';
|
|
54
|
+
/** state() メソッド名 */
|
|
55
|
+
const RUNTIME_STATE_METHOD = 'state';
|
|
56
|
+
// ---- ヘルパー ----------------------------------------------------------------
|
|
57
|
+
/**
|
|
58
|
+
* `__draftole__.state("<runtimeId>")` の CallExpression を生成する。
|
|
59
|
+
*
|
|
60
|
+
* 生成 AST:
|
|
61
|
+
* __draftole__.state("<runtimeId>")
|
|
62
|
+
* = CallExpression(
|
|
63
|
+
* PropertyAccessExpression(Identifier("__draftole__"), "state"),
|
|
64
|
+
* [StringLiteral("<runtimeId>")]
|
|
65
|
+
* )
|
|
66
|
+
*/
|
|
67
|
+
function createStateCall(runtimeId, factory) {
|
|
68
|
+
const draftoleIdent = factory.createIdentifier(RUNTIME_GLOBAL);
|
|
69
|
+
const stateAccess = factory.createPropertyAccessExpression(draftoleIdent, factory.createIdentifier(RUNTIME_STATE_METHOD));
|
|
70
|
+
return factory.createCallExpression(stateAccess,
|
|
71
|
+
/* typeArgs */ undefined, [factory.createStringLiteral(runtimeId)]);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* `__draftole__.state(paramVar)` の CallExpression を生成する。
|
|
75
|
+
*
|
|
76
|
+
* `createStateCall` との違い: 引数が StringLiteral ではなく Identifier である。
|
|
77
|
+
* `.each()` 内ハンドラで `item` のような each スコープパラメータを動的に解決するために使用する。
|
|
78
|
+
*
|
|
79
|
+
* 生成 AST:
|
|
80
|
+
* __draftole__.state(itemId)
|
|
81
|
+
* = CallExpression(
|
|
82
|
+
* PropertyAccessExpression(Identifier("__draftole__"), "state"),
|
|
83
|
+
* [Identifier(paramVar)] ← StringLiteral ではない
|
|
84
|
+
* )
|
|
85
|
+
*
|
|
86
|
+
* @param paramVar ランタイム変数名(例: "itemId")
|
|
87
|
+
* @param factory ts.NodeFactory
|
|
88
|
+
*/
|
|
89
|
+
function createDynamicStateCall(paramVar, factory) {
|
|
90
|
+
const draftoleIdent = factory.createIdentifier(RUNTIME_GLOBAL);
|
|
91
|
+
const stateAccess = factory.createPropertyAccessExpression(draftoleIdent, factory.createIdentifier(RUNTIME_STATE_METHOD));
|
|
92
|
+
return factory.createCallExpression(stateAccess,
|
|
93
|
+
/* typeArgs */ undefined, [factory.createIdentifier(paramVar)]);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* stateIdMap から「識別子名 → runtimeId」のシンプルなマップを構築する。
|
|
97
|
+
* whitelist-validator によって事前チェック済みの識別子のみが変換対象となるため、
|
|
98
|
+
* 名前ベースの照合で十分。
|
|
99
|
+
*/
|
|
100
|
+
function buildNameMap(stateIdMap) {
|
|
101
|
+
const nameMap = new Map();
|
|
102
|
+
for (const [sym, runtimeId] of stateIdMap) {
|
|
103
|
+
nameMap.set(sym.getName(), runtimeId);
|
|
104
|
+
}
|
|
105
|
+
return nameMap;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* ArrowFunction の内部アロー(二次コールバック)を function 式に変換するノードファクトリ。
|
|
109
|
+
*
|
|
110
|
+
* `state.update(t => expr)` の `t => expr` を
|
|
111
|
+
* `function(t) { return expr; }` に変換する(Req 4.3, D-8)。
|
|
112
|
+
*/
|
|
113
|
+
function arrowToFunctionExpression(arrow, factory, visitor, context) {
|
|
114
|
+
// パラメータを変換(型注釈を除去するため visitEachChild を通す)
|
|
115
|
+
const transformedParams = arrow.parameters.map((p) => ts.visitEachChild(p, visitor, context));
|
|
116
|
+
// 本体を変換
|
|
117
|
+
let block;
|
|
118
|
+
if (ts.isBlock(arrow.body)) {
|
|
119
|
+
const transformedBlock = ts.visitEachChild(arrow.body, visitor, context);
|
|
120
|
+
block = transformedBlock;
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
// 式本体 → return 文に変換してから再帰的に visitor を適用
|
|
124
|
+
const transformedExpr = ts.visitNode(arrow.body, visitor);
|
|
125
|
+
block = factory.createBlock([factory.createReturnStatement(transformedExpr)],
|
|
126
|
+
/* multiline */ true);
|
|
127
|
+
}
|
|
128
|
+
return factory.createFunctionExpression(
|
|
129
|
+
/* modifiers */ undefined,
|
|
130
|
+
/* asteriskToken */ undefined,
|
|
131
|
+
/* name */ undefined,
|
|
132
|
+
/* typeParams */ undefined, transformedParams,
|
|
133
|
+
/* returnType */ undefined, block);
|
|
134
|
+
}
|
|
135
|
+
// ---- visitor ----------------------------------------------------------------
|
|
136
|
+
/**
|
|
137
|
+
* ハンドラ本体を走査し、state 識別子を `__draftole__.state(id)` に置換する visitor を返す。
|
|
138
|
+
*
|
|
139
|
+
* 置換ルール(design §handler-serializer 変換規則表):
|
|
140
|
+
* - `stateIdent` (stateIdMap に名前が含まれる) → `__draftole__.state("<runtimeId>")`
|
|
141
|
+
* - PropertyAccessExpression の name 側(右辺)は置換対象外
|
|
142
|
+
* - ArrowFunction(内部アロー: outerArrow と異なる)→ function 式に変換
|
|
143
|
+
* - ExpressionStatement のゼロ引数呼び出しで inlineMap に含まれる → 本体をインライン展開
|
|
144
|
+
* - その他ノードは再帰的に走査
|
|
145
|
+
*
|
|
146
|
+
* @param nameMap 識別子名 → runtimeId のマップ
|
|
147
|
+
* @param outerArrow 外側の ArrowFunction(これ自体は変換対象外)
|
|
148
|
+
* @param context ts.TransformationContext
|
|
149
|
+
* @param inlineMap ゼロ引数モジュールレベル関数インライン展開マップ(省略可)
|
|
150
|
+
*/
|
|
151
|
+
function createStateReplacingVisitor(nameMap, outerArrow, context, inlineMap, eachScopeParams) {
|
|
152
|
+
const factory = context.factory;
|
|
153
|
+
function visitor(node) {
|
|
154
|
+
// ---- ゼロ引数モジュールレベル関数呼び出しをインライン展開 ----------------
|
|
155
|
+
// `addTodo()` のような ExpressionStatement を関数本体のステートメントで置換する。
|
|
156
|
+
// Block 内の Statement ノードに対してのみ適用(visitEachChild が配列を処理)。
|
|
157
|
+
if (inlineMap !== undefined && ts.isExpressionStatement(node)) {
|
|
158
|
+
const expr = node.expression;
|
|
159
|
+
if (ts.isCallExpression(expr) &&
|
|
160
|
+
ts.isIdentifier(expr.expression) &&
|
|
161
|
+
expr.arguments.length === 0) {
|
|
162
|
+
const funcArrow = inlineMap.get(expr.expression.text);
|
|
163
|
+
if (funcArrow !== undefined && ts.isBlock(funcArrow.body)) {
|
|
164
|
+
// インライン展開: 関数本体の各ステートメントを visitor で変換して返す
|
|
165
|
+
return funcArrow.body.statements.map((s) => ts.visitEachChild(s, visitor, context));
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// ---- ArrowFunction(内部アロー)を function 式に変換 --------------------
|
|
170
|
+
// outerArrow 自体は変換しない(body だけを変換する)
|
|
171
|
+
if (ts.isArrowFunction(node) && node !== outerArrow) {
|
|
172
|
+
return arrowToFunctionExpression(node, factory, visitor, context);
|
|
173
|
+
}
|
|
174
|
+
// ---- TypeScript 型アサーション(`expr as T`)を除去 ----------------------
|
|
175
|
+
// シリアライズ後のコードは JavaScript として評価されるため型アサーションを除去する。
|
|
176
|
+
if (ts.isAsExpression(node)) {
|
|
177
|
+
return ts.visitNode(node.expression, visitor);
|
|
178
|
+
}
|
|
179
|
+
// `<T>expr` 形式の型アサーションも除去(古い TS 記法)
|
|
180
|
+
if (ts.isTypeAssertionExpression(node)) {
|
|
181
|
+
return ts.visitNode(node.expression, visitor);
|
|
182
|
+
}
|
|
183
|
+
// ---- Identifier の置換 --------------------------------------------------
|
|
184
|
+
if (ts.isIdentifier(node)) {
|
|
185
|
+
// PropertyAccessExpression の name 側(右辺)はスキップ
|
|
186
|
+
// 例: `count.get()` の `get` は変換しない
|
|
187
|
+
const parent = node.parent;
|
|
188
|
+
if (ts.isPropertyAccessExpression(parent) &&
|
|
189
|
+
parent.name === node) {
|
|
190
|
+
return node;
|
|
191
|
+
}
|
|
192
|
+
// each スコープパラメータなら Identifier 引数で動的置換(nameMap より先に評価)
|
|
193
|
+
const dynamicParamVar = eachScopeParams === null || eachScopeParams === void 0 ? void 0 : eachScopeParams.get(node.text);
|
|
194
|
+
if (dynamicParamVar !== undefined) {
|
|
195
|
+
return createDynamicStateCall(dynamicParamVar, factory);
|
|
196
|
+
}
|
|
197
|
+
// stateIdMap に含まれる名前なら置換
|
|
198
|
+
const runtimeId = nameMap.get(node.text);
|
|
199
|
+
if (runtimeId !== undefined) {
|
|
200
|
+
return createStateCall(runtimeId, factory);
|
|
201
|
+
}
|
|
202
|
+
return node;
|
|
203
|
+
}
|
|
204
|
+
// ---- TypeAssertion / AsExpression: 型注釈を除去 -------------------------
|
|
205
|
+
// `(e.target as HTMLInputElement)` → `(e.target)` ではなく、
|
|
206
|
+
// TypeScript Printer が --target ES2019 では as 式のまま出力するため
|
|
207
|
+
// ここでは変換せず、Printer の emitFlags に任せる。
|
|
208
|
+
// (型注釈除去は本来 tsc の仕事: TypeScript の transform emit でのみ除去される)
|
|
209
|
+
// ---- その他ノード: 再帰的に走査 -----------------------------------------
|
|
210
|
+
return ts.visitEachChild(node, visitor, context);
|
|
211
|
+
}
|
|
212
|
+
return visitor;
|
|
213
|
+
}
|
|
214
|
+
// ---- emit ヘルパー -----------------------------------------------------------
|
|
215
|
+
/**
|
|
216
|
+
* 変換済みの Statement[] を結合して JS コード文字列を返す。
|
|
217
|
+
*/
|
|
218
|
+
function printStatements(statements, sourceFile, printer) {
|
|
219
|
+
return statements
|
|
220
|
+
.map((stmt) => printer.printNode(ts.EmitHint.Unspecified, stmt, sourceFile))
|
|
221
|
+
.join('\n');
|
|
222
|
+
}
|
|
223
|
+
// ---- メイン実装 -------------------------------------------------------------
|
|
224
|
+
/**
|
|
225
|
+
* `HandlerIR` と `stateIdMap` からハンドラ本体を `SerializedHandler` に変換する。
|
|
226
|
+
*
|
|
227
|
+
* - `ts.transform` + 自家製 visitor で識別子を `__draftole__.state(id)...` 連鎖に置換
|
|
228
|
+
* - `ts.createPrinter()` で JS として emit(型注釈は TypeScript が自動除去)
|
|
229
|
+
* - 識別子の置換対象: stateIdMap に Symbol が含まれる Identifier ノード
|
|
230
|
+
*
|
|
231
|
+
* @param input HandlerSerializerInput
|
|
232
|
+
* @returns SerializedHandler
|
|
233
|
+
*/
|
|
234
|
+
function serializeHandler(input) {
|
|
235
|
+
const { ir, stateIdMap } = input;
|
|
236
|
+
// ---- params の決定 (Req 4.4) -----------------------------------------------
|
|
237
|
+
const params = ir.paramName !== null ? [ir.paramName] : [];
|
|
238
|
+
// ---- 準備 -------------------------------------------------------------------
|
|
239
|
+
const arrowFn = ir.node;
|
|
240
|
+
const sourceFile = arrowFn.getSourceFile();
|
|
241
|
+
const nameMap = buildNameMap(stateIdMap);
|
|
242
|
+
// ---- ts.transform で AST 変換 -----------------------------------------------
|
|
243
|
+
// ArrowFunction の body を含む SourceFile を transform する。
|
|
244
|
+
// visitor は body 内のノードのみを実質的に書き換える(outerArrow の body から走査)。
|
|
245
|
+
const transformResult = ts.transform(sourceFile, [
|
|
246
|
+
(context) => {
|
|
247
|
+
const visitor = createStateReplacingVisitor(nameMap, arrowFn, context, input.inlineMap, input.eachScopeParams);
|
|
248
|
+
return (sf) => {
|
|
249
|
+
// SourceFile 全体を走査するが、変換対象は arrowFn 内のノードのみ
|
|
250
|
+
return ts.visitEachChild(sf, visitor, context);
|
|
251
|
+
};
|
|
252
|
+
},
|
|
253
|
+
], {
|
|
254
|
+
target: ts.ScriptTarget.ES2019,
|
|
255
|
+
module: ts.ModuleKind.CommonJS,
|
|
256
|
+
});
|
|
257
|
+
const transformedSf = transformResult.transformed[0];
|
|
258
|
+
// ---- 変換後の ArrowFunction を探す -----------------------------------------
|
|
259
|
+
// 変換後 SourceFile から元の arrowFn に対応するノードを探す。
|
|
260
|
+
// transform は元のノードと対応する変換後ノードを返すが、
|
|
261
|
+
// visitEachChild は新しいノードを作成するため pos は保持しない。
|
|
262
|
+
// 代わりに、元の arrowFn の pos/end と合致するノードを探す。
|
|
263
|
+
let transformedArrow;
|
|
264
|
+
const targetPos = arrowFn.pos;
|
|
265
|
+
const targetEnd = arrowFn.end;
|
|
266
|
+
function findTransformedArrow(node) {
|
|
267
|
+
if (ts.isArrowFunction(node) &&
|
|
268
|
+
node.pos === targetPos &&
|
|
269
|
+
node.end === targetEnd) {
|
|
270
|
+
transformedArrow = node;
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
// 変換で pos が変わった場合のフォールバック: 最初の ArrowFunction
|
|
274
|
+
ts.forEachChild(node, findTransformedArrow);
|
|
275
|
+
}
|
|
276
|
+
findTransformedArrow(transformedSf);
|
|
277
|
+
// pos/end で見つからない場合、変換後の SourceFile 内の最初の ArrowFunction を使う
|
|
278
|
+
// (変換によって pos が変わることがある)
|
|
279
|
+
if (transformedArrow === undefined) {
|
|
280
|
+
function findFirstArrow(node) {
|
|
281
|
+
if (transformedArrow !== undefined)
|
|
282
|
+
return;
|
|
283
|
+
if (ts.isArrowFunction(node)) {
|
|
284
|
+
transformedArrow = node;
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
ts.forEachChild(node, findFirstArrow);
|
|
288
|
+
}
|
|
289
|
+
findFirstArrow(transformedSf);
|
|
290
|
+
}
|
|
291
|
+
transformResult.dispose();
|
|
292
|
+
// ---- emit -------------------------------------------------------------------
|
|
293
|
+
const printer = ts.createPrinter({
|
|
294
|
+
newLine: ts.NewLineKind.LineFeed,
|
|
295
|
+
omitTrailingSemicolon: false,
|
|
296
|
+
removeComments: false,
|
|
297
|
+
});
|
|
298
|
+
// 変換後の ArrowFunction が見つからなかった場合はエラー
|
|
299
|
+
if (transformedArrow === undefined) {
|
|
300
|
+
throw new Error('[handler-serializer] Failed to locate transformed ArrowFunction');
|
|
301
|
+
}
|
|
302
|
+
let code;
|
|
303
|
+
if (ir.isExpressionBody) {
|
|
304
|
+
// 式本体: body expression を直接 emit
|
|
305
|
+
const bodyExpr = transformedArrow.body;
|
|
306
|
+
code = printer.printNode(ts.EmitHint.Expression, bodyExpr, transformedSf);
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
// ブロック本体: 各 statement を emit して結合
|
|
310
|
+
const block = transformedArrow.body;
|
|
311
|
+
code = printStatements(block.statements, transformedSf, printer);
|
|
312
|
+
}
|
|
313
|
+
return { code, params };
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=handler-serializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler-serializer.js","sourceRoot":"","sources":["../../src/transformer/handler-serializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* helper-context-resolver — `.on(arrow)` を内包する helper の発見・eligibility 判定・call-site 列挙
|
|
3
|
+
*
|
|
4
|
+
* 仕様: `.kiro/specs/helper-inline-recovery/`
|
|
5
|
+
* - design.md §Components and Interfaces / helper-context-resolver.ts
|
|
6
|
+
* - requirements.md 1.1, 1.4, 2.3, 3.1, 3.2, 3.3
|
|
7
|
+
*
|
|
8
|
+
* 単一責任:
|
|
9
|
+
* 1. `.on` CallExpression の AST 上方向 walk-up で直近 helper 宣言を発見
|
|
10
|
+
* 2. helper の eligibility(module-level / const / zero-param / arrow initializer)を判定
|
|
11
|
+
* 3. accepted helper の call-site を同一 SourceFile から列挙
|
|
12
|
+
* 4. rejected helper から DT014 診断を生成
|
|
13
|
+
*
|
|
14
|
+
* 副作用なしの純粋関数のみ。`fileDiagnostics` への push は呼び出し側(index.ts)の責務。
|
|
15
|
+
*
|
|
16
|
+
* Task 1.1: 型定義と内部 helper(symbol 解決・宣言形状判定)のみを実装する。
|
|
17
|
+
* findEnclosingHelper / findHelperCallSites / buildEnclosingHelperDiagnostic は
|
|
18
|
+
* それぞれ task 1.2 / 1.3 / 1.4 で追加する。
|
|
19
|
+
*/
|
|
20
|
+
import * as ts from 'typescript';
|
|
21
|
+
import type { OnCallInfo } from './call-detector';
|
|
22
|
+
import { type EachScopeContext } from './each-state-rewriter';
|
|
23
|
+
import type { PreCheckOutcome, TransformerBaseContext } from './per-call-context';
|
|
24
|
+
/** `.on` を内包する直近 helper を発見した結果(discriminated union)。 */
|
|
25
|
+
export type EnclosingHelperResult = {
|
|
26
|
+
readonly kind: 'none';
|
|
27
|
+
} | {
|
|
28
|
+
readonly kind: 'accepted';
|
|
29
|
+
readonly helper: AcceptedEnclosingHelper;
|
|
30
|
+
} | {
|
|
31
|
+
readonly kind: 'rejected';
|
|
32
|
+
readonly rejection: RejectedEnclosingHelper;
|
|
33
|
+
};
|
|
34
|
+
/** 採用された helper。call-site をすべて含む。 */
|
|
35
|
+
export interface AcceptedEnclosingHelper {
|
|
36
|
+
readonly name: string;
|
|
37
|
+
/** モジュールレベル `const name = () => ...` の VariableDeclaration */
|
|
38
|
+
readonly declaration: ts.VariableDeclaration;
|
|
39
|
+
/** 宣言右辺の ArrowFunction(zero-param) */
|
|
40
|
+
readonly arrow: ts.ArrowFunction;
|
|
41
|
+
/** 同一 SourceFile 内のすべての呼び出し位置(helper 自身の `.on` 内包 CallExpression は除外) */
|
|
42
|
+
readonly callSites: readonly ts.CallExpression[];
|
|
43
|
+
}
|
|
44
|
+
/** 不採用理由(discriminated union)。 */
|
|
45
|
+
export type EnclosingHelperRejectionReason = {
|
|
46
|
+
readonly code: 'not-module-level';
|
|
47
|
+
} | {
|
|
48
|
+
readonly code: 'mutable-binding';
|
|
49
|
+
} | {
|
|
50
|
+
readonly code: 'function-declaration';
|
|
51
|
+
} | {
|
|
52
|
+
readonly code: 'non-arrow-initializer';
|
|
53
|
+
} | {
|
|
54
|
+
readonly code: 'has-parameters';
|
|
55
|
+
readonly paramCount: number;
|
|
56
|
+
} | {
|
|
57
|
+
readonly code: 'no-call-sites';
|
|
58
|
+
} | {
|
|
59
|
+
readonly code: 'ambiguous-call-sites';
|
|
60
|
+
readonly callSiteCount: number;
|
|
61
|
+
};
|
|
62
|
+
/** 不採用 helper の情報(DT014 診断生成元)。 */
|
|
63
|
+
export interface RejectedEnclosingHelper {
|
|
64
|
+
readonly name: string;
|
|
65
|
+
/** 不採用となった helper 宣言(VariableDeclaration / FunctionDeclaration / Parameter 等) */
|
|
66
|
+
readonly declaration: ts.Declaration;
|
|
67
|
+
/** トリガとなった `.on` CallExpression(診断アンカー) */
|
|
68
|
+
readonly onCallExpr: ts.CallExpression;
|
|
69
|
+
readonly reason: EnclosingHelperRejectionReason;
|
|
70
|
+
}
|
|
71
|
+
/** DT014 診断コード: enclosing-helper recovery 不可能な helper 形状。`hasFileError` 集計除外用に index.ts へも export する。 */
|
|
72
|
+
export declare const DT014_CODE: number & {
|
|
73
|
+
__brand: "DT014";
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* `RejectedEnclosingHelper` から DT014 診断を生成する。
|
|
77
|
+
*
|
|
78
|
+
* - `code`: 9014(`__brand: 'DT014'`)
|
|
79
|
+
* - `source`: `'draftole-transformer'`
|
|
80
|
+
* - `relatedInformation`: reason code + helper 宣言位置 1 件
|
|
81
|
+
*
|
|
82
|
+
* 診断アンカーはトリガとなった `.on` CallExpression。helper 宣言位置は
|
|
83
|
+
* `relatedInformation` 経由でユーザに提示する。
|
|
84
|
+
*
|
|
85
|
+
* @param rejection findEnclosingHelper の rejection
|
|
86
|
+
* @param sourceFile 該当 SourceFile
|
|
87
|
+
* @param category `ts.DiagnosticCategory.Error | Warning | Suggestion`
|
|
88
|
+
* @returns DT014 診断
|
|
89
|
+
*/
|
|
90
|
+
export declare function buildEnclosingHelperDiagnostic(rejection: RejectedEnclosingHelper, sourceFile: ts.SourceFile, category: ts.DiagnosticCategory): ts.Diagnostic;
|
|
91
|
+
/**
|
|
92
|
+
* 同一 SourceFile 内で `helperDecl` を呼び出している CallExpression を列挙する。
|
|
93
|
+
*
|
|
94
|
+
* マッチ条件:
|
|
95
|
+
* - CallExpression の `expression` が Identifier
|
|
96
|
+
* - その Identifier から `resolveValueDeclaration` を辿った結果が `helperDecl` と同一
|
|
97
|
+
*
|
|
98
|
+
* helper 自身の body 内からの自己再帰呼び出しも CallExpression として列挙される
|
|
99
|
+
* (実用上は再帰 helper はそもそも task 1.2 で reject されるため問題にならない)。
|
|
100
|
+
*
|
|
101
|
+
* @param helperDecl helper の宣言(VariableDeclaration)
|
|
102
|
+
* @param sourceFile 探索対象 SourceFile
|
|
103
|
+
* @param checker TypeChecker(symbol 解決に使用)
|
|
104
|
+
* @returns call-site CallExpression の配列(出現順)
|
|
105
|
+
*/
|
|
106
|
+
export declare function findHelperCallSites(helperDecl: ts.VariableDeclaration, sourceFile: ts.SourceFile, checker: ts.TypeChecker): readonly ts.CallExpression[];
|
|
107
|
+
/**
|
|
108
|
+
* `.on(arrow)` CallExpression を内包する直近 helper を探索する。
|
|
109
|
+
*
|
|
110
|
+
* アルゴリズム:
|
|
111
|
+
* 1. `onCallExpr.parent` から SourceFile に達するまで AST 親方向に walk-up
|
|
112
|
+
* 2. 最初に出会う関数式(ArrowFunction / FunctionExpression)または FunctionDeclaration を
|
|
113
|
+
* enclosing function 候補とする
|
|
114
|
+
* 3. 候補が ArrowFunction かつ親が VariableDeclaration の場合のみ eligibility を判定
|
|
115
|
+
* 4. それ以外(callback として使われた arrow、function expression、function declaration 等)は
|
|
116
|
+
* reject または `none` を返す
|
|
117
|
+
*
|
|
118
|
+
* 注意:
|
|
119
|
+
* - `.on` の **handler 引数**(`.on("click", () => ...)` の第 2 引数)は走査しない
|
|
120
|
+
* (node.parent チェインは `.on` 自身を経由するため、handler 内へ降りない)
|
|
121
|
+
* - callSites の列挙は本関数では行わない(task 1.3 で `findHelperCallSites` 統合)
|
|
122
|
+
* - accepted の callSites は本実装段階では常に空配列。完全な統合は task 1.3 完了後。
|
|
123
|
+
*
|
|
124
|
+
* @param onCallExpr `.on(event, arrow)` の CallExpression
|
|
125
|
+
* @param sourceFile 解析対象 SourceFile
|
|
126
|
+
* @param checker TypeChecker(将来の型ベース拡張用、現時点では未使用)
|
|
127
|
+
* @returns 採否判定結果
|
|
128
|
+
*/
|
|
129
|
+
export declare function findEnclosingHelper(onCallExpr: ts.CallExpression, sourceFile: ts.SourceFile, checker: ts.TypeChecker): EnclosingHelperResult;
|
|
130
|
+
/** `tryEnclosingHelperRecovery` の戻り値。 */
|
|
131
|
+
export type EnclosingHelperRecovery =
|
|
132
|
+
/** helper を内包しない通常の `.on(arrow)` → 既存パイプライン続行 */
|
|
133
|
+
{
|
|
134
|
+
readonly kind: 'pass-through';
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* helper 経由で each scope を継承した(または each 外で確定した)→ context を使う
|
|
138
|
+
*
|
|
139
|
+
* Task 3.2: `paramSymbols` は helper-aware 経路で
|
|
140
|
+
* `collectEachScopeParamSymbols` を `helperCallSites` 付きで呼んだ結果。
|
|
141
|
+
* `context === null` (each 外確定) や Symbol 取得不可の場合は `undefined`。
|
|
142
|
+
*/
|
|
143
|
+
| {
|
|
144
|
+
readonly kind: 'inherited';
|
|
145
|
+
readonly context: EachScopeContext | null;
|
|
146
|
+
readonly paramSymbols: Set<ts.Symbol> | undefined;
|
|
147
|
+
}
|
|
148
|
+
/** 採用不能な helper 形状 → DT014 を発行して当該 handler はスキップ */
|
|
149
|
+
| {
|
|
150
|
+
readonly kind: 'rejected';
|
|
151
|
+
readonly diagnostic: ts.Diagnostic;
|
|
152
|
+
};
|
|
153
|
+
/**
|
|
154
|
+
* `.on(arrow)` を内包する helper を発見し、each scope 継承または DT014 発行を決定する。
|
|
155
|
+
*
|
|
156
|
+
* 分岐:
|
|
157
|
+
* - helper 不在 (`kind: 'none'`): `pass-through`(既存ロジックに委ねる)
|
|
158
|
+
* - helper 採用 (`kind: 'accepted'`): `detectEachScopeContext` を helperCallSites 付きで
|
|
159
|
+
* 呼び出し、結果を `inherited` で返す。null(全 call-site が each 外 / ambiguous)の
|
|
160
|
+
* 場合も `inherited { context: null }` として返し、呼び出し側が ambiguous を判定する。
|
|
161
|
+
* - helper 不採用 (`kind: 'rejected'`): DT014 を生成して返す
|
|
162
|
+
*/
|
|
163
|
+
export declare function tryEnclosingHelperRecovery(onCallExpr: ts.CallExpression, sourceFile: ts.SourceFile, checker: ts.TypeChecker): EnclosingHelperRecovery;
|
|
164
|
+
/**
|
|
165
|
+
* Phase 1 per-call delegate: helper-aware pre-check の outcome を構築する。
|
|
166
|
+
*
|
|
167
|
+
* 内部で `tryEnclosingHelperRecovery` を呼び、3 経路の discriminated union を
|
|
168
|
+
* `PreCheckOutcome` (flat shape) に変換する薄いラッパ。factory main loop は本関数を
|
|
169
|
+
* 呼んで `PreCheckOutcome` を受け取り、`diagnostics` に Error カテゴリが含まれる場合に
|
|
170
|
+
* 当該 .on() 呼出をスキップする。
|
|
171
|
+
*
|
|
172
|
+
* Mapping:
|
|
173
|
+
* - pass-through → { helperPathUsed: false, inheritedEachContext: null, ..., diagnostics: [] }
|
|
174
|
+
* - inherited → { helperPathUsed: true, inheritedEachContext: ctx, inheritedEachParamSymbols, diagnostics: [] }
|
|
175
|
+
* - rejected → { helperPathUsed: false, inheritedEachContext: null, ..., diagnostics: [diag] }
|
|
176
|
+
*
|
|
177
|
+
* relocated/added in transformer-index-pipeline-split task 3.1.
|
|
178
|
+
*/
|
|
179
|
+
export declare function runHelperAwarePreCheck(base: TransformerBaseContext, callInfo: OnCallInfo): PreCheckOutcome;
|
|
180
|
+
//# sourceMappingURL=helper-context-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helper-context-resolver.d.ts","sourceRoot":"","sources":["../../src/transformer/helper-context-resolver.ts"],"names":[],"mappings":"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"}
|