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,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* identifier-collector: `HandlerIR` → ルート識別子の `IdentifierRef[]`
|
|
4
|
+
*
|
|
5
|
+
* Task 4.3:
|
|
6
|
+
* - HandlerIR を入力にハンドラ本体内のルート識別子一覧を返す
|
|
7
|
+
* - プロパティアクセスはルートのみ拾い、チェーン先は収集しない
|
|
8
|
+
* - paramName に一致する識別子は `event-param`
|
|
9
|
+
* - localDecls に含まれる識別子は `local`
|
|
10
|
+
* - それ以外は `unknown`
|
|
11
|
+
* - 同名識別子は最初の出現のみ(dedupe)
|
|
12
|
+
*
|
|
13
|
+
* 対応 requirements: 2.3, 3.4
|
|
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.collectIdentifiers = collectIdentifiers;
|
|
50
|
+
const ts = __importStar(require("typescript"));
|
|
51
|
+
// ---- ヘルパー ----------------------------------------------------------------
|
|
52
|
+
/**
|
|
53
|
+
* 識別子ノードが PropertyAccessExpression のプロパティ名側(右辺)かどうか判定する。
|
|
54
|
+
* `a.b` の `b` は右辺、`a` は左辺(ルート候補)。
|
|
55
|
+
*/
|
|
56
|
+
function isPropertyAccessRhs(node) {
|
|
57
|
+
const parent = node.parent;
|
|
58
|
+
if (ts.isPropertyAccessExpression(parent)) {
|
|
59
|
+
// parent.name === node ならプロパティ名側(右辺)
|
|
60
|
+
return parent.name === node;
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 識別子ノードがオブジェクトリテラルのプロパティキー側かどうか判定する。
|
|
66
|
+
* `{ text: txt, done: false }` の `text` や `done` はプロパティキーなのでスキップする。
|
|
67
|
+
* ただし短縮プロパティ記法 `{ txt }` の場合は値側として収集する。
|
|
68
|
+
*/
|
|
69
|
+
function isObjectLiteralPropertyKey(node) {
|
|
70
|
+
const parent = node.parent;
|
|
71
|
+
if (ts.isPropertyAssignment(parent)) {
|
|
72
|
+
// parent.name === node かつ ShorthandPropertyAssignment でない場合はキー
|
|
73
|
+
return parent.name === node;
|
|
74
|
+
}
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 識別子ノードが型位置(型注釈・型アサーション・型パラメータ等)にあるかを判定する。
|
|
79
|
+
* `(e as KeyboardEvent)` の `KeyboardEvent` や `: HTMLInputElement` の `HTMLInputElement`
|
|
80
|
+
* はランタイムには存在しないため、ホワイトリスト検査の対象外とする(Req 3.1)。
|
|
81
|
+
*/
|
|
82
|
+
function isInTypePosition(node) {
|
|
83
|
+
let current = node;
|
|
84
|
+
while (current.parent !== undefined) {
|
|
85
|
+
const parent = current.parent;
|
|
86
|
+
// AsExpression の type 側
|
|
87
|
+
if (ts.isAsExpression(parent) && parent.type === current)
|
|
88
|
+
return true;
|
|
89
|
+
// TypeAssertion の type 側 (<Type>expr)
|
|
90
|
+
if (ts.isTypeAssertionExpression(parent) && parent.type === current)
|
|
91
|
+
return true;
|
|
92
|
+
// TypeReference の typeName
|
|
93
|
+
if (ts.isTypeReferenceNode(parent))
|
|
94
|
+
return true;
|
|
95
|
+
// Parameter の type 注釈
|
|
96
|
+
if (ts.isParameter(parent) && parent.type === current)
|
|
97
|
+
return true;
|
|
98
|
+
// VariableDeclaration の type 注釈
|
|
99
|
+
if (ts.isVariableDeclaration(parent) && parent.type === current)
|
|
100
|
+
return true;
|
|
101
|
+
// 純粋型ノード(TypeNode 系)の中
|
|
102
|
+
if (ts.isFunctionTypeNode(parent) ||
|
|
103
|
+
ts.isConstructorTypeNode(parent) ||
|
|
104
|
+
ts.isArrayTypeNode(parent) ||
|
|
105
|
+
ts.isUnionTypeNode(parent) ||
|
|
106
|
+
ts.isIntersectionTypeNode(parent) ||
|
|
107
|
+
ts.isParenthesizedTypeNode(parent) ||
|
|
108
|
+
ts.isTypeLiteralNode(parent) ||
|
|
109
|
+
ts.isMappedTypeNode(parent)) {
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
current = parent;
|
|
113
|
+
}
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* IdentifierRef の kind を決定する。
|
|
118
|
+
*/
|
|
119
|
+
function resolveKind(name, paramName, localDecls) {
|
|
120
|
+
if (paramName !== null && name === paramName) {
|
|
121
|
+
return { tag: 'event-param' };
|
|
122
|
+
}
|
|
123
|
+
if (localDecls.has(name)) {
|
|
124
|
+
return { tag: 'local' };
|
|
125
|
+
}
|
|
126
|
+
return { tag: 'unknown' };
|
|
127
|
+
}
|
|
128
|
+
// ---- メイン実装 --------------------------------------------------------------
|
|
129
|
+
/**
|
|
130
|
+
* `HandlerIR` からハンドラ本体内のルート識別子一覧を収集して返す。
|
|
131
|
+
*
|
|
132
|
+
* - プロパティアクセス(`a.b.c`)ではルート(`a`)のみ収集し、`b`・`c` は除外する
|
|
133
|
+
* - 同名識別子は最初の出現のみを返す(名前ベースで dedupe)
|
|
134
|
+
* - `HandlerIR.paramName` に一致するものは `event-param`
|
|
135
|
+
* - `HandlerIR.localDecls` に含まれるものは `local`
|
|
136
|
+
* - それ以外は `unknown`(`whitelist-validator` が後続で分類する)
|
|
137
|
+
*
|
|
138
|
+
* @param ir `extractHandlerIR` が返した `HandlerIR`
|
|
139
|
+
* @returns ルート識別子の `IdentifierRef[]`
|
|
140
|
+
*/
|
|
141
|
+
function collectIdentifiers(ir) {
|
|
142
|
+
const { node: arrowFn, paramName, localDecls } = ir;
|
|
143
|
+
const body = arrowFn.body;
|
|
144
|
+
const seen = new Set();
|
|
145
|
+
const result = [];
|
|
146
|
+
function visit(node) {
|
|
147
|
+
if (ts.isIdentifier(node)) {
|
|
148
|
+
// プロパティアクセスの右辺(チェーン先)はスキップ
|
|
149
|
+
if (isPropertyAccessRhs(node)) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
// オブジェクトリテラルのプロパティキー({ text: ..., done: ... } の text/done)はスキップ
|
|
153
|
+
if (isObjectLiteralPropertyKey(node)) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
// 型位置(型アサーション・型注釈・TypeReference 等)の識別子はスキップ
|
|
157
|
+
if (isInTypePosition(node)) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
const name = node.text;
|
|
161
|
+
// 重複をスキップ(名前ベース dedupe)
|
|
162
|
+
if (seen.has(name)) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
seen.add(name);
|
|
166
|
+
const kind = resolveKind(name, paramName, localDecls);
|
|
167
|
+
result.push({
|
|
168
|
+
name,
|
|
169
|
+
node,
|
|
170
|
+
symbol: undefined,
|
|
171
|
+
kind,
|
|
172
|
+
});
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
ts.forEachChild(node, visit);
|
|
176
|
+
}
|
|
177
|
+
// パラメータ宣言も走査することで paramName 識別子を収集する
|
|
178
|
+
for (const param of arrowFn.parameters) {
|
|
179
|
+
visit(param.name);
|
|
180
|
+
}
|
|
181
|
+
visit(body);
|
|
182
|
+
return result;
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=identifier-collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identifier-collector.js","sourceRoot":"","sources":["../../src/transformer/identifier-collector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* draftole-transformer エントリポイント
|
|
3
|
+
*
|
|
4
|
+
* Task 6.3: transformer 本体への結線
|
|
5
|
+
*
|
|
6
|
+
* パイプライン:
|
|
7
|
+
* call-detector → ir-extractor → identifier-collector
|
|
8
|
+
* → whitelist-validator → handler-serializer → command-injector
|
|
9
|
+
*
|
|
10
|
+
* ファイル単位で ts.Diagnostic[] を集約し、1 件でも error があれば
|
|
11
|
+
* 当該ファイルの AST 書き換えを抑制する。
|
|
12
|
+
*
|
|
13
|
+
* 対応 requirements: 2.7, 4.1, 4.2, 5.1, 5.3, 5.4
|
|
14
|
+
*/
|
|
15
|
+
import * as ts from 'typescript';
|
|
16
|
+
export interface DraftoleTransformerOptions {
|
|
17
|
+
/** 追加のホワイトリスト識別子(利用者側拡張、通常不要)*/
|
|
18
|
+
extraWhitelist?: readonly string[];
|
|
19
|
+
/** デバッグ出力 */
|
|
20
|
+
debug?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* true の場合、ヘルパー採否診断 (DT012) を Warning カテゴリで発行する。
|
|
23
|
+
* 既定 false(Suggestion)。Error ではないため、いずれもファイル全体の
|
|
24
|
+
* rewrite 抑制 (`hasFileError`) には寄与しない。
|
|
25
|
+
* 仕様: transformer-inline-recovery-spec design §6.1
|
|
26
|
+
*/
|
|
27
|
+
strictHelpers?: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* 集約された `ts.Diagnostic` を受け取るコールバック。テスト用途。
|
|
30
|
+
* ファイル単位で全診断を蓄積した時点で 1 度だけ呼ばれる。
|
|
31
|
+
*/
|
|
32
|
+
onDiagnostics?: (diagnostics: readonly ts.Diagnostic[], sourceFile: ts.SourceFile) => void;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* draftole TypeScript transformer.
|
|
36
|
+
*
|
|
37
|
+
* パイプライン:
|
|
38
|
+
* createCallDetector(program) → detectResult
|
|
39
|
+
* for each OnCallInfo:
|
|
40
|
+
* extractHandlerIR(arrowFn, sourceFile) → HandlerIRResult
|
|
41
|
+
* collectIdentifiers(ir) → IdentifierRef[]
|
|
42
|
+
* validateHandler(ir, refs, program, sourceFile, extraWhitelist) → ts.Diagnostic[]
|
|
43
|
+
* if no errors:
|
|
44
|
+
* buildStateIdMap(arrowFn, checker) → stateIdMap
|
|
45
|
+
* serializeHandler({ ir, stateIdMap }) → SerializedHandler
|
|
46
|
+
* injectCommand(callExpr, serialized) → new CallExpression
|
|
47
|
+
*
|
|
48
|
+
* ファイル単位で ts.Diagnostic[] を集約。
|
|
49
|
+
* 1 件でも error があれば、ファイル全体の AST 書き換えを抑制する。
|
|
50
|
+
*
|
|
51
|
+
* @param program ts.Program インスタンス(TypeChecker 取得に使用)
|
|
52
|
+
* @param options 任意オプション
|
|
53
|
+
* @returns ts.TransformerFactory<ts.SourceFile>
|
|
54
|
+
*/
|
|
55
|
+
export default function draftoleTransformer(program: ts.Program, options?: DraftoleTransformerOptions): ts.TransformerFactory<ts.SourceFile>;
|
|
56
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transformer/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAiCjC,MAAM,WAAW,0BAA0B;IACzC,gCAAgC;IAChC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,aAAa;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,UAAU,KAAK,IAAI,CAAC;CAC5F;AAgID;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,OAAO,UAAU,mBAAmB,CACzC,OAAO,EAAE,EAAE,CAAC,OAAO,EACnB,OAAO,CAAC,EAAE,0BAA0B,GACnC,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC,UAAU,CAAC,CA6JtC"}
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* draftole-transformer エントリポイント
|
|
4
|
+
*
|
|
5
|
+
* Task 6.3: transformer 本体への結線
|
|
6
|
+
*
|
|
7
|
+
* パイプライン:
|
|
8
|
+
* call-detector → ir-extractor → identifier-collector
|
|
9
|
+
* → whitelist-validator → handler-serializer → command-injector
|
|
10
|
+
*
|
|
11
|
+
* ファイル単位で ts.Diagnostic[] を集約し、1 件でも error があれば
|
|
12
|
+
* 当該ファイルの AST 書き換えを抑制する。
|
|
13
|
+
*
|
|
14
|
+
* 対応 requirements: 2.7, 4.1, 4.2, 5.1, 5.3, 5.4
|
|
15
|
+
*/
|
|
16
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
19
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
20
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
21
|
+
}
|
|
22
|
+
Object.defineProperty(o, k2, desc);
|
|
23
|
+
}) : (function(o, m, k, k2) {
|
|
24
|
+
if (k2 === undefined) k2 = k;
|
|
25
|
+
o[k2] = m[k];
|
|
26
|
+
}));
|
|
27
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
28
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
29
|
+
}) : function(o, v) {
|
|
30
|
+
o["default"] = v;
|
|
31
|
+
});
|
|
32
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
33
|
+
var ownKeys = function(o) {
|
|
34
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
35
|
+
var ar = [];
|
|
36
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
37
|
+
return ar;
|
|
38
|
+
};
|
|
39
|
+
return ownKeys(o);
|
|
40
|
+
};
|
|
41
|
+
return function (mod) {
|
|
42
|
+
if (mod && mod.__esModule) return mod;
|
|
43
|
+
var result = {};
|
|
44
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
45
|
+
__setModuleDefault(result, mod);
|
|
46
|
+
return result;
|
|
47
|
+
};
|
|
48
|
+
})();
|
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
exports.default = draftoleTransformer;
|
|
51
|
+
const ts = __importStar(require("typescript"));
|
|
52
|
+
const call_detector_1 = require("./call-detector");
|
|
53
|
+
const command_injector_1 = require("./command-injector");
|
|
54
|
+
const diagnostic_reporter_1 = require("./diagnostic-reporter");
|
|
55
|
+
const each_scope_branch_1 = require("./each-scope-branch");
|
|
56
|
+
const format_diagnostics_js_1 = require("./format-diagnostics.js");
|
|
57
|
+
const handler_ir_extractor_1 = require("./handler-ir-extractor");
|
|
58
|
+
const handler_serializer_1 = require("./handler-serializer");
|
|
59
|
+
const helper_context_resolver_1 = require("./helper-context-resolver");
|
|
60
|
+
const identifier_collector_1 = require("./identifier-collector");
|
|
61
|
+
const inline_recovery_1 = require("./inline-recovery");
|
|
62
|
+
const label_injector_1 = require("./label-injector");
|
|
63
|
+
const state_id_fallback_1 = require("./state-id-fallback");
|
|
64
|
+
const theme_class_detector_1 = require("./theme-class-detector");
|
|
65
|
+
const varname_resolver_1 = require("./varname-resolver");
|
|
66
|
+
const whitelist_validator_1 = require("./whitelist-validator");
|
|
67
|
+
// ---- フィーチャーフラグ ------------------------------------------------------
|
|
68
|
+
/**
|
|
69
|
+
* Task 6.3: パイプライン結線フィーチャーフラグ。
|
|
70
|
+
*
|
|
71
|
+
* Feature Flag Protocol に従い:
|
|
72
|
+
* - false: 素通し(従来動作)
|
|
73
|
+
* - true: call-detector → ... → command-injector パイプラインを有効化
|
|
74
|
+
*
|
|
75
|
+
* GREEN フェーズで true に設定し、テスト通過後にフラグを削除して直書きにする。
|
|
76
|
+
*/
|
|
77
|
+
const PIPELINE_ENABLED = true;
|
|
78
|
+
// ---- module-private helpers (transformer-index-pipeline-split task 4.1) -----
|
|
79
|
+
/**
|
|
80
|
+
* `serializeHandler` 入力を `PerCallContext` から構築する。
|
|
81
|
+
* recovery / each-scope 分岐の outcome から stateIdMap / inlineMap / eachScopeParams を抽出する。
|
|
82
|
+
*/
|
|
83
|
+
function serializeInputFromContext(ctx) {
|
|
84
|
+
const ir = ctx.extraction.ir;
|
|
85
|
+
if (ctx.resolution.kind === 'recovery') {
|
|
86
|
+
return {
|
|
87
|
+
ir,
|
|
88
|
+
stateIdMap: ctx.resolution.outcome.stateIdMap,
|
|
89
|
+
inlineMap: ctx.resolution.outcome.inlineMap,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
if (ctx.resolution.kind === 'each-scope') {
|
|
93
|
+
return {
|
|
94
|
+
ir,
|
|
95
|
+
stateIdMap: ctx.resolution.outcome.stateIdMap,
|
|
96
|
+
eachScopeParams: ctx.resolution.outcome.eachScopeParams,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
return { ir, stateIdMap: new Map() };
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* 全 phase outcome の diagnostics を結合する。
|
|
103
|
+
* - recovery 分岐: composeRecoveryDiagnostics が既に元の validation と DT012 を mix 済みのため
|
|
104
|
+
* ctx.validation.diagnostics は二重発行しない
|
|
105
|
+
* - each-scope 分岐: validation diagnostics (warnings) + each-scope diagnostics の両方を発行
|
|
106
|
+
* - skipped: preCheck + extraction + resolution の独自 diagnostics のみ
|
|
107
|
+
*/
|
|
108
|
+
function collectAllDiagnostics(ctx) {
|
|
109
|
+
const base = [...ctx.preCheck.diagnostics, ...ctx.extraction.diagnostics];
|
|
110
|
+
if (ctx.resolution.kind === 'each-scope') {
|
|
111
|
+
return [...base, ...ctx.validation.diagnostics, ...ctx.resolution.outcome.diagnostics];
|
|
112
|
+
}
|
|
113
|
+
if (ctx.resolution.kind === 'recovery') {
|
|
114
|
+
return [...base, ...ctx.resolution.outcome.diagnostics];
|
|
115
|
+
}
|
|
116
|
+
return [...base, ...ctx.resolution.diagnostics];
|
|
117
|
+
}
|
|
118
|
+
/** serialize + inject を実行すべきかを判定する。失敗・skip 経路では false。 */
|
|
119
|
+
function shouldSerialize(ctx) {
|
|
120
|
+
if (ctx.resolution.kind === 'skipped')
|
|
121
|
+
return false;
|
|
122
|
+
if (ctx.resolution.kind === 'recovery')
|
|
123
|
+
return ctx.resolution.outcome.success;
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* 匿名 theme.class(...) 呼び出しを検出して varName ラベルを付与し、rewriteMap に
|
|
128
|
+
* 書き換えを追加する。__draftole_label__ import 注入が必要なら moduleSpecifier を返す。
|
|
129
|
+
* (旧実装で行っていた既存 ImportDeclaration の 1:1 更新は emit 経路で binder に拾われず
|
|
130
|
+
* ReferenceError を引き起こすため、新規 import 文を別途追加する。)
|
|
131
|
+
*/
|
|
132
|
+
function processThemeClassLabeling(sourceFile, checker, rewriteMap, fileDiagnostics) {
|
|
133
|
+
const themeClassCalls = (0, theme_class_detector_1.detectThemeClassCalls)(sourceFile, checker);
|
|
134
|
+
const alreadyHasLabelImport = (0, label_injector_1.hasLabelImport)(sourceFile);
|
|
135
|
+
const labelImportSite = (0, label_injector_1.findDraftOleImport)(sourceFile);
|
|
136
|
+
let needsLabelImport = false;
|
|
137
|
+
let labelImportModuleSpecifier;
|
|
138
|
+
for (const { callExpr } of themeClassCalls) {
|
|
139
|
+
const varName = (0, varname_resolver_1.resolveVarName)(callExpr, sourceFile, checker);
|
|
140
|
+
if (varName === undefined)
|
|
141
|
+
continue;
|
|
142
|
+
if (!alreadyHasLabelImport && labelImportSite === undefined) {
|
|
143
|
+
fileDiagnostics.push((0, diagnostic_reporter_1.createDiagnostic)('DT013', callExpr, sourceFile, {
|
|
144
|
+
identifierName: varName,
|
|
145
|
+
fixExample: `import { Root } from 'draft-ole';`,
|
|
146
|
+
}));
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
rewriteMap.set(callExpr, (0, label_injector_1.buildLabeledCall)(callExpr, varName));
|
|
150
|
+
if (!alreadyHasLabelImport) {
|
|
151
|
+
needsLabelImport = true;
|
|
152
|
+
if (labelImportSite !== undefined) {
|
|
153
|
+
labelImportModuleSpecifier = labelImportSite.moduleSpecifier;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return { needsLabelImport, labelImportModuleSpecifier };
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* SourceFile 先頭に __draftole_label__ の取り込み文を prepend する。
|
|
161
|
+
* CommonJS 出力では require 形式 (TS の ES→CJS modules transformer による
|
|
162
|
+
* 識別子置換が transformer 由来の新規シンボルを認識しないため)、
|
|
163
|
+
* ESM 出力では ImportDeclaration を生成する。
|
|
164
|
+
*/
|
|
165
|
+
function prependLabelImport(visited, moduleSpecifier, moduleKind) {
|
|
166
|
+
const isCjs = moduleKind === ts.ModuleKind.CommonJS ||
|
|
167
|
+
moduleKind === ts.ModuleKind.Node16 ||
|
|
168
|
+
moduleKind === ts.ModuleKind.NodeNext;
|
|
169
|
+
const newStmt = isCjs
|
|
170
|
+
? (0, label_injector_1.createLabelRequireStatement)(moduleSpecifier)
|
|
171
|
+
: (0, label_injector_1.createLabelImportDeclaration)(moduleSpecifier);
|
|
172
|
+
return ts.factory.updateSourceFile(visited, [newStmt, ...visited.statements]);
|
|
173
|
+
}
|
|
174
|
+
// ---- ファクトリ関数 ---------------------------------------------------------
|
|
175
|
+
/**
|
|
176
|
+
* draftole TypeScript transformer.
|
|
177
|
+
*
|
|
178
|
+
* パイプライン:
|
|
179
|
+
* createCallDetector(program) → detectResult
|
|
180
|
+
* for each OnCallInfo:
|
|
181
|
+
* extractHandlerIR(arrowFn, sourceFile) → HandlerIRResult
|
|
182
|
+
* collectIdentifiers(ir) → IdentifierRef[]
|
|
183
|
+
* validateHandler(ir, refs, program, sourceFile, extraWhitelist) → ts.Diagnostic[]
|
|
184
|
+
* if no errors:
|
|
185
|
+
* buildStateIdMap(arrowFn, checker) → stateIdMap
|
|
186
|
+
* serializeHandler({ ir, stateIdMap }) → SerializedHandler
|
|
187
|
+
* injectCommand(callExpr, serialized) → new CallExpression
|
|
188
|
+
*
|
|
189
|
+
* ファイル単位で ts.Diagnostic[] を集約。
|
|
190
|
+
* 1 件でも error があれば、ファイル全体の AST 書き換えを抑制する。
|
|
191
|
+
*
|
|
192
|
+
* @param program ts.Program インスタンス(TypeChecker 取得に使用)
|
|
193
|
+
* @param options 任意オプション
|
|
194
|
+
* @returns ts.TransformerFactory<ts.SourceFile>
|
|
195
|
+
*/
|
|
196
|
+
function draftoleTransformer(program, options) {
|
|
197
|
+
var _a;
|
|
198
|
+
// program が undefined(pass-through テスト等)または PIPELINE_ENABLED === false: 素通し
|
|
199
|
+
if (!PIPELINE_ENABLED || program == null) {
|
|
200
|
+
return (_context) => (sourceFile) => sourceFile;
|
|
201
|
+
}
|
|
202
|
+
const checker = program.getTypeChecker();
|
|
203
|
+
const detect = (0, call_detector_1.createCallDetector)(program);
|
|
204
|
+
const extraWhitelist = options === null || options === void 0 ? void 0 : options.extraWhitelist;
|
|
205
|
+
const debugMode = (_a = options === null || options === void 0 ? void 0 : options.debug) !== null && _a !== void 0 ? _a : false;
|
|
206
|
+
const onDiagnostics = options === null || options === void 0 ? void 0 : options.onDiagnostics;
|
|
207
|
+
return (context) => (sourceFile) => {
|
|
208
|
+
var _a, _b;
|
|
209
|
+
// ---- Step 1: call-detector で .on(event, arrow) を検出 -----------------
|
|
210
|
+
const detectResult = detect(sourceFile);
|
|
211
|
+
// call-detector のエラー診断を収集
|
|
212
|
+
const fileDiagnostics = [...detectResult.diagnostics];
|
|
213
|
+
if (debugMode) {
|
|
214
|
+
console.log(`[draftole-transformer] ${sourceFile.fileName}: detected=${detectResult.detected.length}`);
|
|
215
|
+
}
|
|
216
|
+
// ---- Step 1.5: ソースファイルスキャンで StateIdFallback を構築 ------------
|
|
217
|
+
// StateRegistry.allocateId() の実行順を静的に再現し、型システムに
|
|
218
|
+
// 文字列リテラル型がない場合のフォールバックとして使用する。
|
|
219
|
+
// Task 2.2: フォールバック責務を `state-id-fallback.ts` へ局所化。
|
|
220
|
+
// 本ファイルは pass-through adapter のみを担う(フォールバック注入経路の差し替え)。
|
|
221
|
+
const fallback = (0, state_id_fallback_1.createSourceStateNameFallback)(sourceFile, checker);
|
|
222
|
+
// ---- Step 2: 各 OnCallInfo に対して IR 抽出 → 検証 → シリアライズ --------
|
|
223
|
+
// エラーなしの場合のみ書き換え用マップを構築する
|
|
224
|
+
const rewriteMap = new Map();
|
|
225
|
+
const base = {
|
|
226
|
+
program,
|
|
227
|
+
checker,
|
|
228
|
+
sourceFile,
|
|
229
|
+
extraWhitelist: extraWhitelist !== null && extraWhitelist !== void 0 ? extraWhitelist : [],
|
|
230
|
+
strictHelpers: (_a = options === null || options === void 0 ? void 0 : options.strictHelpers) !== null && _a !== void 0 ? _a : false,
|
|
231
|
+
helperCallSites: [],
|
|
232
|
+
fallback,
|
|
233
|
+
debug: debugMode,
|
|
234
|
+
};
|
|
235
|
+
for (const callInfo of detectResult.detected) {
|
|
236
|
+
// Phase 1: helper-aware pre-check
|
|
237
|
+
const preCheck = (0, helper_context_resolver_1.runHelperAwarePreCheck)(base, callInfo);
|
|
238
|
+
if (preCheck.diagnostics.some((d) => d.category === ts.DiagnosticCategory.Error)) {
|
|
239
|
+
fileDiagnostics.push(...preCheck.diagnostics);
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
// Phase 2a: IR extraction (ir-undefined は早期 skip)
|
|
243
|
+
const extractResult = (0, handler_ir_extractor_1.extractHandlerIR)(callInfo.handlerArg, sourceFile);
|
|
244
|
+
if (extractResult.ir === undefined) {
|
|
245
|
+
if (extractResult.warning !== undefined)
|
|
246
|
+
fileDiagnostics.push(extractResult.warning);
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
const extraction = {
|
|
250
|
+
ir: extractResult.ir,
|
|
251
|
+
diagnostics: extractResult.warning !== undefined ? [extractResult.warning] : [],
|
|
252
|
+
};
|
|
253
|
+
// Phase 2b: identifier collection
|
|
254
|
+
const refs = (0, identifier_collector_1.collectIdentifiers)(extraction.ir);
|
|
255
|
+
const identifiers = { refs };
|
|
256
|
+
// Phase 3: whitelist validation (helper-aware 経路では paramSymbols を伝播)
|
|
257
|
+
const validationDiags = (0, whitelist_validator_1.validateHandler)(extraction.ir, refs, program, sourceFile, extraWhitelist, preCheck.helperPathUsed
|
|
258
|
+
? { paramSymbols: preCheck.inheritedEachParamSymbols }
|
|
259
|
+
: undefined);
|
|
260
|
+
const validation = {
|
|
261
|
+
hasErrors: validationDiags.some((d) => d.category === ts.DiagnosticCategory.Error),
|
|
262
|
+
diagnostics: validationDiags,
|
|
263
|
+
};
|
|
264
|
+
// Phase 4: state resolution branch (recovery vs each-scope)
|
|
265
|
+
const resolution = validation.hasErrors
|
|
266
|
+
? { kind: 'recovery', outcome: (0, inline_recovery_1.runInlineRecoveryBranch)(base, callInfo, extraction.ir, validation) }
|
|
267
|
+
: { kind: 'each-scope', outcome: (0, each_scope_branch_1.runEachScopeBranch)(base, callInfo, preCheck) };
|
|
268
|
+
// PerCallContext を assembled-at-end pattern で組み立て
|
|
269
|
+
const ctx = {
|
|
270
|
+
base, callInfo, preCheck, extraction, identifiers, validation, resolution,
|
|
271
|
+
};
|
|
272
|
+
// 全 phase の diagnostics を集約 (closure capture 廃止)
|
|
273
|
+
fileDiagnostics.push(...collectAllDiagnostics(ctx));
|
|
274
|
+
if (!shouldSerialize(ctx))
|
|
275
|
+
continue;
|
|
276
|
+
// Phase 5: serialize + inject
|
|
277
|
+
let serialized;
|
|
278
|
+
try {
|
|
279
|
+
serialized = (0, handler_serializer_1.serializeHandler)(serializeInputFromContext(ctx));
|
|
280
|
+
}
|
|
281
|
+
catch (e) {
|
|
282
|
+
if (debugMode)
|
|
283
|
+
console.error('[draftole-transformer] serializeHandler failed:', e);
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
if (debugMode) {
|
|
287
|
+
console.log(`[draftole-transformer] serialized: code="${serialized.code}", params=${JSON.stringify(serialized.params)}`);
|
|
288
|
+
}
|
|
289
|
+
rewriteMap.set(callInfo.callExpr, (0, command_injector_1.injectCommand)(callInfo.callExpr, serialized));
|
|
290
|
+
}
|
|
291
|
+
// ---- Step 2.5: theme.class() varName ラベリング ------------------------
|
|
292
|
+
const { needsLabelImport, labelImportModuleSpecifier } = processThemeClassLabeling(sourceFile, checker, rewriteMap, fileDiagnostics);
|
|
293
|
+
// ---- Step 2.9: 観測用コールバック(テスト等)---------------------------
|
|
294
|
+
if (onDiagnostics !== undefined) {
|
|
295
|
+
onDiagnostics(fileDiagnostics, sourceFile);
|
|
296
|
+
}
|
|
297
|
+
else if (fileDiagnostics.length > 0) {
|
|
298
|
+
(0, format_diagnostics_js_1.writeTransformerDiagnostics)(fileDiagnostics, process.stderr);
|
|
299
|
+
}
|
|
300
|
+
// ---- Step 3: error があればファイル全体の書き換えを抑制 -----------------
|
|
301
|
+
// DT014 (enclosing-helper rejection) は当該 handler のみスキップ済みなので除外する。
|
|
302
|
+
const hasFileError = fileDiagnostics.some((d) => d.category === ts.DiagnosticCategory.Error && d.code !== helper_context_resolver_1.DT014_CODE);
|
|
303
|
+
if (hasFileError) {
|
|
304
|
+
if (debugMode) {
|
|
305
|
+
console.log(`[draftole-transformer] ${sourceFile.fileName}: has errors, suppressing all rewrites`);
|
|
306
|
+
}
|
|
307
|
+
return sourceFile;
|
|
308
|
+
}
|
|
309
|
+
// ---- Step 4: rewriteMap に従って AST 書き換えを適用 ---------------------
|
|
310
|
+
if (rewriteMap.size === 0 && !needsLabelImport)
|
|
311
|
+
return sourceFile;
|
|
312
|
+
// チェーン内の内側 .on() 呼び出しを到達可能にするため replacement の children も
|
|
313
|
+
// 再帰的に visit する。theme.class ラベル注入では replacement に元の node 自身が
|
|
314
|
+
// 子として含まれるため、再帰前にキーを削除して無限再帰を防ぐ。
|
|
315
|
+
function visitor(node) {
|
|
316
|
+
if (ts.isCallExpression(node)) {
|
|
317
|
+
const replacement = rewriteMap.get(node);
|
|
318
|
+
if (replacement !== undefined) {
|
|
319
|
+
rewriteMap.delete(node);
|
|
320
|
+
return ts.visitEachChild(replacement, visitor, context);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
return ts.visitEachChild(node, visitor, context);
|
|
324
|
+
}
|
|
325
|
+
const visited = ts.visitEachChild(sourceFile, visitor, context);
|
|
326
|
+
if (needsLabelImport && labelImportModuleSpecifier !== undefined) {
|
|
327
|
+
const moduleKind = (_b = program.getCompilerOptions().module) !== null && _b !== void 0 ? _b : ts.ModuleKind.ESNext;
|
|
328
|
+
return prependLabelImport(visited, labelImportModuleSpecifier, moduleKind);
|
|
329
|
+
}
|
|
330
|
+
return visited;
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transformer/index.ts"],"names":[],"mappings":"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"}
|