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,221 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* label-injector: 抽出済み varName を用いて、対象 CallExpression を
|
|
4
|
+
* `__draftole_label__(<origCall>, "<varName>")` の形にラップする AST プリミティブを提供する。
|
|
5
|
+
*
|
|
6
|
+
* # 役割
|
|
7
|
+
* - 本モジュールは **AST ノードを構築するだけ** で、SourceFile への変異は一切行わない。
|
|
8
|
+
* 呼び出し側(task 4.7 の transformer pipeline)が printer / replace で適用する。
|
|
9
|
+
*
|
|
10
|
+
* # `__draftole_label__` の import 戦略(reuse-existing-import)
|
|
11
|
+
* design §label-injector の方針:
|
|
12
|
+
* 1. 既に DraftOle が export している識別子(`KNOWN_DRAFTOLE_IDENTIFIERS`)のいずれかを
|
|
13
|
+
* named import で取り込んでいる ImportDeclaration をファイル先頭から探索する。
|
|
14
|
+
* 2. 見つかった ImportDeclaration の `moduleSpecifier` をそのまま再利用し、
|
|
15
|
+
* その named imports に `__draftole_label__` を **追加** する。
|
|
16
|
+
* 3. 見つからない場合は新規 import を生成せず、対象ファイルの書き換えをスキップし、
|
|
17
|
+
* pipeline 側で diagnostic コード `DT013`(Suggestion カテゴリ)を発行する。
|
|
18
|
+
*
|
|
19
|
+
* # DT013 フォールバック方針
|
|
20
|
+
* `findDraftOleImport` が `undefined` を返した場合、呼び出し側 pipeline は:
|
|
21
|
+
* - 新規 import を作らない
|
|
22
|
+
* - 当該ファイルの label 注入をスキップする
|
|
23
|
+
* - `fileDiagnostics` に Suggestion カテゴリ・コード `DT013` の `ts.Diagnostic` を push する
|
|
24
|
+
* 本モジュールはあくまでプリミティブを提供するのみで、上記オーケストレーションは行わない。
|
|
25
|
+
*
|
|
26
|
+
* 対応 requirements: 4.1, 4.2, 4.5
|
|
27
|
+
* 対応 design: §label-injector
|
|
28
|
+
*/
|
|
29
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
30
|
+
if (k2 === undefined) k2 = k;
|
|
31
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
32
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
33
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
34
|
+
}
|
|
35
|
+
Object.defineProperty(o, k2, desc);
|
|
36
|
+
}) : (function(o, m, k, k2) {
|
|
37
|
+
if (k2 === undefined) k2 = k;
|
|
38
|
+
o[k2] = m[k];
|
|
39
|
+
}));
|
|
40
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
41
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
42
|
+
}) : function(o, v) {
|
|
43
|
+
o["default"] = v;
|
|
44
|
+
});
|
|
45
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
46
|
+
var ownKeys = function(o) {
|
|
47
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
48
|
+
var ar = [];
|
|
49
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
50
|
+
return ar;
|
|
51
|
+
};
|
|
52
|
+
return ownKeys(o);
|
|
53
|
+
};
|
|
54
|
+
return function (mod) {
|
|
55
|
+
if (mod && mod.__esModule) return mod;
|
|
56
|
+
var result = {};
|
|
57
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
58
|
+
__setModuleDefault(result, mod);
|
|
59
|
+
return result;
|
|
60
|
+
};
|
|
61
|
+
})();
|
|
62
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
63
|
+
exports.findDraftOleImport = findDraftOleImport;
|
|
64
|
+
exports.hasLabelImport = hasLabelImport;
|
|
65
|
+
exports.buildLabeledCall = buildLabeledCall;
|
|
66
|
+
exports.createLabelImportDeclaration = createLabelImportDeclaration;
|
|
67
|
+
exports.createLabelRequireStatement = createLabelRequireStatement;
|
|
68
|
+
const ts = __importStar(require("typescript"));
|
|
69
|
+
// ---- 既知 DraftOle 識別子セット(import site 検出用) -----------------------
|
|
70
|
+
/**
|
|
71
|
+
* DraftOle が公開している代表的な named export 群。
|
|
72
|
+
* このうちいずれか1つでも named import に含まれている ImportDeclaration を
|
|
73
|
+
* 「DraftOle import site」とみなす。
|
|
74
|
+
*/
|
|
75
|
+
const KNOWN_DRAFTOLE_IDENTIFIERS = new Set([
|
|
76
|
+
'el',
|
|
77
|
+
'theme',
|
|
78
|
+
'css',
|
|
79
|
+
'Root',
|
|
80
|
+
'FileExporter',
|
|
81
|
+
'button',
|
|
82
|
+
'div',
|
|
83
|
+
'html',
|
|
84
|
+
'body',
|
|
85
|
+
'view',
|
|
86
|
+
'Page',
|
|
87
|
+
'App',
|
|
88
|
+
'bindEach',
|
|
89
|
+
]);
|
|
90
|
+
const LABEL_IDENTIFIER = '__draftole_label__';
|
|
91
|
+
/**
|
|
92
|
+
* SourceFile を走査し、再利用可能な DraftOle named import を探す。
|
|
93
|
+
*
|
|
94
|
+
* 仕様:
|
|
95
|
+
* - `ts.ImportDeclaration` を順に検査する。
|
|
96
|
+
* - `importClause.namedBindings` が `ts.NamedImports` の場合のみ対象。
|
|
97
|
+
* (`NamespaceImport` の場合は本モジュールでは扱わない。)
|
|
98
|
+
* - いずれかの `ImportSpecifier.name.text` が `KNOWN_DRAFTOLE_IDENTIFIERS` に含まれていれば
|
|
99
|
+
* その import を採用する(**ファイル中で最初に一致したもの**)。
|
|
100
|
+
* - 該当が無ければ `undefined` を返す。
|
|
101
|
+
*
|
|
102
|
+
* # 呼び出し側への期待
|
|
103
|
+
* `undefined` が返った場合、pipeline は label 注入をスキップし、
|
|
104
|
+
* Suggestion カテゴリの diagnostic(コード `DT013`)を発行すること。
|
|
105
|
+
*/
|
|
106
|
+
function findDraftOleImport(sourceFile) {
|
|
107
|
+
for (const stmt of sourceFile.statements) {
|
|
108
|
+
if (!ts.isImportDeclaration(stmt))
|
|
109
|
+
continue;
|
|
110
|
+
const importClause = stmt.importClause;
|
|
111
|
+
if (!importClause)
|
|
112
|
+
continue;
|
|
113
|
+
const namedBindings = importClause.namedBindings;
|
|
114
|
+
if (!namedBindings || !ts.isNamedImports(namedBindings))
|
|
115
|
+
continue;
|
|
116
|
+
const hasKnown = namedBindings.elements.some((spec) => KNOWN_DRAFTOLE_IDENTIFIERS.has(spec.name.text));
|
|
117
|
+
if (!hasKnown)
|
|
118
|
+
continue;
|
|
119
|
+
// ImportDeclaration の moduleSpecifier は必ず StringLiteral。
|
|
120
|
+
const moduleSpecifier = stmt.moduleSpecifier.text;
|
|
121
|
+
return {
|
|
122
|
+
importDecl: stmt,
|
|
123
|
+
moduleSpecifier,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* `__draftole_label__` が既に SourceFile の named imports に存在するかを判定する。
|
|
130
|
+
* 存在する場合は pipeline 側で import 追加処理をスキップできる。
|
|
131
|
+
*/
|
|
132
|
+
function hasLabelImport(sourceFile) {
|
|
133
|
+
for (const stmt of sourceFile.statements) {
|
|
134
|
+
if (!ts.isImportDeclaration(stmt))
|
|
135
|
+
continue;
|
|
136
|
+
const importClause = stmt.importClause;
|
|
137
|
+
if (!importClause)
|
|
138
|
+
continue;
|
|
139
|
+
const namedBindings = importClause.namedBindings;
|
|
140
|
+
if (!namedBindings || !ts.isNamedImports(namedBindings))
|
|
141
|
+
continue;
|
|
142
|
+
if (namedBindings.elements.some((spec) => spec.name.text === LABEL_IDENTIFIER)) {
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* `__draftole_label__(<callExpr>, "<varName>")` の CallExpression を構築する。
|
|
150
|
+
*
|
|
151
|
+
* - 純粋な AST 構築のみ。SourceFile への変異は行わない。
|
|
152
|
+
* - 返り値の型は元の式と同じ(runtime helper の signature が identity 型透過のため)。
|
|
153
|
+
*/
|
|
154
|
+
function buildLabeledCall(callExpr, varName) {
|
|
155
|
+
return ts.factory.createCallExpression(ts.factory.createIdentifier(LABEL_IDENTIFIER),
|
|
156
|
+
/* typeArguments */ undefined, [callExpr, ts.factory.createStringLiteral(varName)]);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* `__draftole_label__` を単独で named import する新規 ImportDeclaration を生成する。
|
|
160
|
+
*
|
|
161
|
+
* # 用途: emit-safe な import 注入
|
|
162
|
+
* 呼び出し側 pipeline は、本関数で生成した ImportDeclaration を
|
|
163
|
+
* SourceFile の statements 先頭に prepend することで `__draftole_label__` を
|
|
164
|
+
* 取り込む。`updateImportDeclaration` で既存 import を mutate する方式は
|
|
165
|
+
* TS→TS printing では問題なく動作するが、`program.emit()` 経由の TS→JS では
|
|
166
|
+
* binder が pre-transform 時点のシンボル表で識別子解決を行うため、後付けで
|
|
167
|
+
* 加えた named specifier が「bare identifier」として未解決化される。
|
|
168
|
+
*
|
|
169
|
+
* # 重要: emit substitution の限界
|
|
170
|
+
* TypeScript の ES→CJS modules transformer は、シンボル束縛済みの識別子のみ
|
|
171
|
+
* `draft_ole_N.__draftole_label__` 形に書き換える。transformer が新規追加した
|
|
172
|
+
* 識別子はシンボル束縛を持たないため、`import` 構文を新規追加するだけでは
|
|
173
|
+
* call site が bare identifier のまま emit され ReferenceError になる。
|
|
174
|
+
*
|
|
175
|
+
* このため、CommonJS ターゲット時は本関数ではなく
|
|
176
|
+
* {@link createLabelRequireStatement} を使い、`const { __draftole_label__ } = require(...)`
|
|
177
|
+
* を直接生成すること。本関数は ESM ターゲット / TS→TS printing 用途に残す。
|
|
178
|
+
*
|
|
179
|
+
* @param moduleSpecifier `findDraftOleImport` で取得した既存 draft-ole import の
|
|
180
|
+
* module path をそのまま渡す。新規 import は同一 module を参照する必要がある。
|
|
181
|
+
*/
|
|
182
|
+
function createLabelImportDeclaration(moduleSpecifier) {
|
|
183
|
+
const factory = ts.factory;
|
|
184
|
+
return factory.createImportDeclaration(
|
|
185
|
+
/* modifiers */ undefined, factory.createImportClause(
|
|
186
|
+
/* isTypeOnly */ false,
|
|
187
|
+
/* name */ undefined, factory.createNamedImports([
|
|
188
|
+
factory.createImportSpecifier(
|
|
189
|
+
/* isTypeOnly */ false,
|
|
190
|
+
/* propertyName */ undefined, factory.createIdentifier(LABEL_IDENTIFIER)),
|
|
191
|
+
])), factory.createStringLiteral(moduleSpecifier));
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* CommonJS 出力向けの `__draftole_label__` 取り込み文を生成する。
|
|
195
|
+
*
|
|
196
|
+
* 生成形:
|
|
197
|
+
* `const { __draftole_label__ } = require('<moduleSpecifier>');`
|
|
198
|
+
*
|
|
199
|
+
* TS の ES→CJS modules transformer による識別子置換に依存しないため、
|
|
200
|
+
* transformer が新規追加した識別子でも安全に解決される。
|
|
201
|
+
*
|
|
202
|
+
* 呼び出し側 pipeline は、`compilerOptions.module` が CommonJS 系の場合に
|
|
203
|
+
* 本関数の戻り値を SourceFile.statements の先頭に prepend する。
|
|
204
|
+
*/
|
|
205
|
+
function createLabelRequireStatement(moduleSpecifier) {
|
|
206
|
+
const factory = ts.factory;
|
|
207
|
+
const labelIdent = factory.createIdentifier(LABEL_IDENTIFIER);
|
|
208
|
+
return factory.createVariableStatement(
|
|
209
|
+
/* modifiers */ undefined, factory.createVariableDeclarationList([
|
|
210
|
+
factory.createVariableDeclaration(factory.createObjectBindingPattern([
|
|
211
|
+
factory.createBindingElement(
|
|
212
|
+
/* dotDotDotToken */ undefined,
|
|
213
|
+
/* propertyName */ undefined, labelIdent,
|
|
214
|
+
/* initializer */ undefined),
|
|
215
|
+
]),
|
|
216
|
+
/* exclamationToken */ undefined,
|
|
217
|
+
/* type */ undefined, factory.createCallExpression(factory.createIdentifier('require'),
|
|
218
|
+
/* typeArguments */ undefined, [factory.createStringLiteral(moduleSpecifier)])),
|
|
219
|
+
], ts.NodeFlags.Const));
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=label-injector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"label-injector.js","sourceRoot":"","sources":["../../src/transformer/label-injector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type * as ts from 'typescript';
|
|
2
|
+
import type { OnCallInfo } from './call-detector';
|
|
3
|
+
import type { EachScopeContext } from './each-state-rewriter';
|
|
4
|
+
import type { HandlerIR, IdentifierRef } from './handler-ir-extractor';
|
|
5
|
+
import type { StateIdFallback } from './state-id-fallback';
|
|
6
|
+
/**
|
|
7
|
+
* factory invocation 全体で共有される base context。
|
|
8
|
+
* 1 つの SourceFile 変換中、すべての per-call step に同一の base が渡される。
|
|
9
|
+
*/
|
|
10
|
+
export interface TransformerBaseContext {
|
|
11
|
+
readonly program: ts.Program;
|
|
12
|
+
readonly checker: ts.TypeChecker;
|
|
13
|
+
readonly sourceFile: ts.SourceFile;
|
|
14
|
+
readonly extraWhitelist: readonly string[];
|
|
15
|
+
readonly strictHelpers: boolean;
|
|
16
|
+
readonly helperCallSites: readonly ts.CallExpression[];
|
|
17
|
+
/** state-id-fallback: SourceFile 全体スキャンで構築した stateIdMap フォールバック契約。 */
|
|
18
|
+
readonly fallback: StateIdFallback;
|
|
19
|
+
/** デバッグログ出力フラグ (options.debug 由来)。inline-recovery 等で console 出力に使用。 */
|
|
20
|
+
readonly debug: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 1 件の .on(event, arrow) 呼出に対する pipeline 完了時点の不変記録 (assembled-at-end pattern)。
|
|
24
|
+
* 各 step は本 context 全体ではなく必要 field のみを個別 parameter で受け取る (Req 6.2)。
|
|
25
|
+
* factory main loop が末尾で literal として組み立てる。詳細は design.md / research.md 参照。
|
|
26
|
+
*/
|
|
27
|
+
export interface PerCallContext {
|
|
28
|
+
readonly base: TransformerBaseContext;
|
|
29
|
+
readonly callInfo: OnCallInfo;
|
|
30
|
+
readonly preCheck: PreCheckOutcome;
|
|
31
|
+
readonly extraction: IRExtractionOutcome;
|
|
32
|
+
readonly identifiers: IdentifierCollectionOutcome;
|
|
33
|
+
readonly validation: ValidationOutcome;
|
|
34
|
+
readonly resolution: StateResolutionOutcome;
|
|
35
|
+
}
|
|
36
|
+
/** Phase 1: helper-aware pre-check の outcome */
|
|
37
|
+
export interface PreCheckOutcome {
|
|
38
|
+
readonly helperPathUsed: boolean;
|
|
39
|
+
readonly inheritedEachContext: EachScopeContext | null;
|
|
40
|
+
readonly inheritedEachParamSymbols: ReadonlySet<ts.Symbol> | undefined;
|
|
41
|
+
readonly diagnostics: readonly ts.Diagnostic[];
|
|
42
|
+
}
|
|
43
|
+
/** Phase 2a: handler IR 抽出の outcome */
|
|
44
|
+
export interface IRExtractionOutcome {
|
|
45
|
+
readonly ir: HandlerIR;
|
|
46
|
+
readonly diagnostics: readonly ts.Diagnostic[];
|
|
47
|
+
}
|
|
48
|
+
/** Phase 2b: identifier collection の outcome */
|
|
49
|
+
export interface IdentifierCollectionOutcome {
|
|
50
|
+
readonly refs: readonly IdentifierRef[];
|
|
51
|
+
}
|
|
52
|
+
/** Phase 3: whitelist validation の outcome */
|
|
53
|
+
export interface ValidationOutcome {
|
|
54
|
+
readonly hasErrors: boolean;
|
|
55
|
+
readonly diagnostics: readonly ts.Diagnostic[];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Phase 4: state resolution の outcome。
|
|
59
|
+
* discriminated union で recovery / each-scope / skipped 分岐を型レベルに表現する (Req 4.5)。
|
|
60
|
+
*/
|
|
61
|
+
export type StateResolutionOutcome = {
|
|
62
|
+
readonly kind: 'recovery';
|
|
63
|
+
readonly outcome: RecoveryOutcome;
|
|
64
|
+
} | {
|
|
65
|
+
readonly kind: 'each-scope';
|
|
66
|
+
readonly outcome: EachScopeOutcome;
|
|
67
|
+
} | {
|
|
68
|
+
readonly kind: 'skipped';
|
|
69
|
+
readonly diagnostics: readonly ts.Diagnostic[];
|
|
70
|
+
};
|
|
71
|
+
/** Phase 4a: inline recovery branch の outcome */
|
|
72
|
+
export interface RecoveryOutcome {
|
|
73
|
+
readonly success: boolean;
|
|
74
|
+
readonly stateIdMap: ReadonlyMap<ts.Symbol, string>;
|
|
75
|
+
readonly inlineMap: ReadonlyMap<string, ts.ArrowFunction> | undefined;
|
|
76
|
+
readonly diagnostics: readonly ts.Diagnostic[];
|
|
77
|
+
}
|
|
78
|
+
/** Phase 4b: each-scope branch の outcome */
|
|
79
|
+
export interface EachScopeOutcome {
|
|
80
|
+
readonly stateIdMap: ReadonlyMap<ts.Symbol, string>;
|
|
81
|
+
readonly eachScopeParams: ReadonlyMap<string, string> | undefined;
|
|
82
|
+
readonly diagnostics: readonly ts.Diagnostic[];
|
|
83
|
+
}
|
|
84
|
+
/** Phase 5: handler serialization の outcome (既存 serializeHandler 戻り値の wrapper) */
|
|
85
|
+
export interface SerializationOutcome {
|
|
86
|
+
readonly serialized: {
|
|
87
|
+
readonly code: string;
|
|
88
|
+
readonly params: readonly string[];
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/** Phase 6: command injection の outcome (既存 injectCommand 戻り値の wrapper) */
|
|
92
|
+
export interface InjectionOutcome {
|
|
93
|
+
readonly rewritten: ts.CallExpression;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=per-call-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"per-call-context.d.ts","sourceRoot":"","sources":["../../src/transformer/per-call-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"per-call-context.js","sourceRoot":"","sources":["../../src/transformer/per-call-context.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* state-id-fallback.ts
|
|
3
|
+
*
|
|
4
|
+
* State ランタイム ID 解決の補助経路(フォールバック)を局所化するモジュール。
|
|
5
|
+
*
|
|
6
|
+
* canonical 経路(型リテラル `_runtimeId` の抽出)が値を返せない場合に限り、
|
|
7
|
+
* AST 後順走査で構築した「変数名 → ランタイム ID」マップを参照する。
|
|
8
|
+
*
|
|
9
|
+
* Task 2.1: フォールバック責務を `state-id-resolver.ts` から分離する。
|
|
10
|
+
*
|
|
11
|
+
* 公開 API:
|
|
12
|
+
* - StateIdFallback : フォールバック契約のインタフェース
|
|
13
|
+
* - createSourceStateNameFallback(sourceFile, checker)
|
|
14
|
+
* : 単一ソースファイル走査ベースの StateIdFallback を生成するファクトリ
|
|
15
|
+
* - buildSourceStateNameMap(sourceFile, checker)
|
|
16
|
+
* : 旧 API(後方互換のため公開)
|
|
17
|
+
*
|
|
18
|
+
* 受容パターン(resolve が値を返せる構造):
|
|
19
|
+
* - 単一 Root インスタンスを持つソースファイル
|
|
20
|
+
* - `const x = state(...)` のように VariableDeclaration の initializer に
|
|
21
|
+
* 直接 State/Computed 生成式が代入されているケース
|
|
22
|
+
*
|
|
23
|
+
* 非受容パターン(フォールバックでは解決不可):
|
|
24
|
+
* - 複数 Root インスタンス(カウンタが共有されないため)
|
|
25
|
+
* - ヘルパー関数で State 生成をラップしたケース
|
|
26
|
+
* - 分割代入で受け取るケース
|
|
27
|
+
* - オブジェクトリテラルのプロパティに代入するケース
|
|
28
|
+
* - 関数からの直接 return(変数名が存在しない)
|
|
29
|
+
*/
|
|
30
|
+
import * as ts from 'typescript';
|
|
31
|
+
/**
|
|
32
|
+
* State ランタイム ID 解決のフォールバック契約。
|
|
33
|
+
*
|
|
34
|
+
* canonical 経路(`resolveStateIdByType`)が null を返した識別子に対して、
|
|
35
|
+
* このインタフェースの `resolve` が補助的に値を返せる場合に使用される。
|
|
36
|
+
*/
|
|
37
|
+
export interface StateIdFallback {
|
|
38
|
+
/**
|
|
39
|
+
* 識別子ノードからランタイム ID を解決する。
|
|
40
|
+
*
|
|
41
|
+
* @param identNode 解決対象の識別子ノード
|
|
42
|
+
* @returns ランタイム ID("s0" など)または null(解決不可)
|
|
43
|
+
*/
|
|
44
|
+
resolve(identNode: ts.Identifier): string | null;
|
|
45
|
+
/**
|
|
46
|
+
* 当該識別子がフォールバック適用対象かを判定する。
|
|
47
|
+
*
|
|
48
|
+
* 真値条件: `_runtimeId` の文字列リテラル型が取得不能(canonical 経路で null)
|
|
49
|
+
* かつ `isStateTypeNode` が true(State/Computed 型である)。
|
|
50
|
+
*
|
|
51
|
+
* @param identNode 検査対象の識別子ノード
|
|
52
|
+
* @returns フォールバック適用対象であれば true
|
|
53
|
+
*/
|
|
54
|
+
supportsPattern(identNode: ts.Identifier): boolean;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* ソースファイル全体を後順走査し、`StateIdFallback` を生成するファクトリ。
|
|
58
|
+
*
|
|
59
|
+
* 構築時に一度だけ `buildSourceStateNameMap` を実行し、以降の `resolve` は
|
|
60
|
+
* 構築済みマップへのルックアップに委譲する(O(1))。
|
|
61
|
+
*
|
|
62
|
+
* @param sourceFile 走査対象のソースファイル
|
|
63
|
+
* @param checker TypeChecker
|
|
64
|
+
* @returns StateIdFallback 実装
|
|
65
|
+
*/
|
|
66
|
+
export declare function createSourceStateNameFallback(sourceFile: ts.SourceFile, checker: ts.TypeChecker): StateIdFallback;
|
|
67
|
+
/**
|
|
68
|
+
* ソースファイル内の State/Computed 生成呼び出しを後順走査でカウントし、
|
|
69
|
+
* 変数名 → ランタイム ID("s0", "s1", …)のマップを構築する。
|
|
70
|
+
*
|
|
71
|
+
* StateRegistry.allocateId() の実行順を静的に再現する。
|
|
72
|
+
* 後順走査はチェーン `x.state().map()` の内側呼び出しを先にカウントするため
|
|
73
|
+
* ランタイムの左辺優先評価と一致する。
|
|
74
|
+
*
|
|
75
|
+
* @param sourceFile 走査対象のソースファイル
|
|
76
|
+
* @param checker TypeChecker
|
|
77
|
+
* @returns 変数名 → ランタイム ID の ReadonlyMap
|
|
78
|
+
*
|
|
79
|
+
* @remarks
|
|
80
|
+
* **制約**:
|
|
81
|
+
* - 単一 Root インスタンスを持つファイルでのみ信頼できる
|
|
82
|
+
* - ネストされたスコープ・ヘルパー抽象化内の State 生成はサポート外
|
|
83
|
+
*/
|
|
84
|
+
export declare function buildSourceStateNameMap(sourceFile: ts.SourceFile, checker: ts.TypeChecker): ReadonlyMap<string, string>;
|
|
85
|
+
//# sourceMappingURL=state-id-fallback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-id-fallback.d.ts","sourceRoot":"","sources":["../../src/transformer/state-id-fallback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAGjC;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,GAAG,MAAM,GAAG,IAAI,CAAC;IAEjD;;;;;;;;OAQG;IACH,eAAe,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,GAAG,OAAO,CAAC;CACpD;AAED;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,OAAO,EAAE,EAAE,CAAC,WAAW,GACtB,eAAe,CAcjB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,OAAO,EAAE,EAAE,CAAC,WAAW,GACtB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CA4B7B"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* state-id-fallback.ts
|
|
4
|
+
*
|
|
5
|
+
* State ランタイム ID 解決の補助経路(フォールバック)を局所化するモジュール。
|
|
6
|
+
*
|
|
7
|
+
* canonical 経路(型リテラル `_runtimeId` の抽出)が値を返せない場合に限り、
|
|
8
|
+
* AST 後順走査で構築した「変数名 → ランタイム ID」マップを参照する。
|
|
9
|
+
*
|
|
10
|
+
* Task 2.1: フォールバック責務を `state-id-resolver.ts` から分離する。
|
|
11
|
+
*
|
|
12
|
+
* 公開 API:
|
|
13
|
+
* - StateIdFallback : フォールバック契約のインタフェース
|
|
14
|
+
* - createSourceStateNameFallback(sourceFile, checker)
|
|
15
|
+
* : 単一ソースファイル走査ベースの StateIdFallback を生成するファクトリ
|
|
16
|
+
* - buildSourceStateNameMap(sourceFile, checker)
|
|
17
|
+
* : 旧 API(後方互換のため公開)
|
|
18
|
+
*
|
|
19
|
+
* 受容パターン(resolve が値を返せる構造):
|
|
20
|
+
* - 単一 Root インスタンスを持つソースファイル
|
|
21
|
+
* - `const x = state(...)` のように VariableDeclaration の initializer に
|
|
22
|
+
* 直接 State/Computed 生成式が代入されているケース
|
|
23
|
+
*
|
|
24
|
+
* 非受容パターン(フォールバックでは解決不可):
|
|
25
|
+
* - 複数 Root インスタンス(カウンタが共有されないため)
|
|
26
|
+
* - ヘルパー関数で State 生成をラップしたケース
|
|
27
|
+
* - 分割代入で受け取るケース
|
|
28
|
+
* - オブジェクトリテラルのプロパティに代入するケース
|
|
29
|
+
* - 関数からの直接 return(変数名が存在しない)
|
|
30
|
+
*/
|
|
31
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
32
|
+
if (k2 === undefined) k2 = k;
|
|
33
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
34
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
35
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
36
|
+
}
|
|
37
|
+
Object.defineProperty(o, k2, desc);
|
|
38
|
+
}) : (function(o, m, k, k2) {
|
|
39
|
+
if (k2 === undefined) k2 = k;
|
|
40
|
+
o[k2] = m[k];
|
|
41
|
+
}));
|
|
42
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
43
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
44
|
+
}) : function(o, v) {
|
|
45
|
+
o["default"] = v;
|
|
46
|
+
});
|
|
47
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
48
|
+
var ownKeys = function(o) {
|
|
49
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
50
|
+
var ar = [];
|
|
51
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
52
|
+
return ar;
|
|
53
|
+
};
|
|
54
|
+
return ownKeys(o);
|
|
55
|
+
};
|
|
56
|
+
return function (mod) {
|
|
57
|
+
if (mod && mod.__esModule) return mod;
|
|
58
|
+
var result = {};
|
|
59
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
60
|
+
__setModuleDefault(result, mod);
|
|
61
|
+
return result;
|
|
62
|
+
};
|
|
63
|
+
})();
|
|
64
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
65
|
+
exports.createSourceStateNameFallback = createSourceStateNameFallback;
|
|
66
|
+
exports.buildSourceStateNameMap = buildSourceStateNameMap;
|
|
67
|
+
const ts = __importStar(require("typescript"));
|
|
68
|
+
const state_id_resolver_1 = require("./state-id-resolver");
|
|
69
|
+
/**
|
|
70
|
+
* ソースファイル全体を後順走査し、`StateIdFallback` を生成するファクトリ。
|
|
71
|
+
*
|
|
72
|
+
* 構築時に一度だけ `buildSourceStateNameMap` を実行し、以降の `resolve` は
|
|
73
|
+
* 構築済みマップへのルックアップに委譲する(O(1))。
|
|
74
|
+
*
|
|
75
|
+
* @param sourceFile 走査対象のソースファイル
|
|
76
|
+
* @param checker TypeChecker
|
|
77
|
+
* @returns StateIdFallback 実装
|
|
78
|
+
*/
|
|
79
|
+
function createSourceStateNameFallback(sourceFile, checker) {
|
|
80
|
+
const nameToId = buildSourceStateNameMap(sourceFile, checker);
|
|
81
|
+
return {
|
|
82
|
+
resolve(identNode) {
|
|
83
|
+
var _a;
|
|
84
|
+
return (_a = nameToId.get(identNode.text)) !== null && _a !== void 0 ? _a : null;
|
|
85
|
+
},
|
|
86
|
+
supportsPattern(identNode) {
|
|
87
|
+
return ((0, state_id_resolver_1.resolveStateIdByType)(identNode, checker) === null &&
|
|
88
|
+
(0, state_id_resolver_1.isStateTypeNode)(identNode, checker));
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* ソースファイル内の State/Computed 生成呼び出しを後順走査でカウントし、
|
|
94
|
+
* 変数名 → ランタイム ID("s0", "s1", …)のマップを構築する。
|
|
95
|
+
*
|
|
96
|
+
* StateRegistry.allocateId() の実行順を静的に再現する。
|
|
97
|
+
* 後順走査はチェーン `x.state().map()` の内側呼び出しを先にカウントするため
|
|
98
|
+
* ランタイムの左辺優先評価と一致する。
|
|
99
|
+
*
|
|
100
|
+
* @param sourceFile 走査対象のソースファイル
|
|
101
|
+
* @param checker TypeChecker
|
|
102
|
+
* @returns 変数名 → ランタイム ID の ReadonlyMap
|
|
103
|
+
*
|
|
104
|
+
* @remarks
|
|
105
|
+
* **制約**:
|
|
106
|
+
* - 単一 Root インスタンスを持つファイルでのみ信頼できる
|
|
107
|
+
* - ネストされたスコープ・ヘルパー抽象化内の State 生成はサポート外
|
|
108
|
+
*/
|
|
109
|
+
function buildSourceStateNameMap(sourceFile, checker) {
|
|
110
|
+
const nameToId = new Map();
|
|
111
|
+
let counter = 0;
|
|
112
|
+
function visit(node) {
|
|
113
|
+
// 後順: 子を先に走査
|
|
114
|
+
ts.forEachChild(node, visit);
|
|
115
|
+
if (!ts.isCallExpression(node))
|
|
116
|
+
return;
|
|
117
|
+
// 返り値が State/Computed 型である CallExpression のみカウント
|
|
118
|
+
if (!(0, state_id_resolver_1.isStateTypeNode)(node, checker))
|
|
119
|
+
return;
|
|
120
|
+
const id = `s${counter++}`;
|
|
121
|
+
// このノードが VariableDeclaration の initializer に直接代入されているか確認
|
|
122
|
+
const parent = node.parent;
|
|
123
|
+
if (parent !== undefined &&
|
|
124
|
+
ts.isVariableDeclaration(parent) &&
|
|
125
|
+
ts.isIdentifier(parent.name)) {
|
|
126
|
+
nameToId.set(parent.name.text, id);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
visit(sourceFile);
|
|
130
|
+
return nameToId;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=state-id-fallback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-id-fallback.js","sourceRoot":"","sources":["../../src/transformer/state-id-fallback.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CH,sEAiBC;AAmBD,0DA+BC;AA3GD,+CAAiC;AACjC,2DAA4E;AA6B5E;;;;;;;;;GASG;AACH,SAAgB,6BAA6B,CAC3C,UAAyB,EACzB,OAAuB;IAEvB,MAAM,QAAQ,GAAG,uBAAuB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAE9D,OAAO;QACL,OAAO,CAAC,SAAwB;;YAC9B,OAAO,MAAA,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,mCAAI,IAAI,CAAC;QAC9C,CAAC;QACD,eAAe,CAAC,SAAwB;YACtC,OAAO,CACL,IAAA,wCAAoB,EAAC,SAAS,EAAE,OAAO,CAAC,KAAK,IAAI;gBACjD,IAAA,mCAAe,EAAC,SAAS,EAAE,OAAO,CAAC,CACpC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,uBAAuB,CACrC,UAAyB,EACzB,OAAuB;IAEvB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,SAAS,KAAK,CAAC,IAAa;QAC1B,aAAa;QACb,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAE7B,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC;YAAE,OAAO;QAEvC,iDAAiD;QACjD,IAAI,CAAC,IAAA,mCAAe,EAAC,IAAI,EAAE,OAAO,CAAC;YAAE,OAAO;QAE5C,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,EAAE,CAAC;QAE3B,yDAAyD;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IACE,MAAM,KAAK,SAAS;YACpB,EAAE,CAAC,qBAAqB,CAAC,MAAM,CAAC;YAChC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,EAC5B,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,CAAC;IAClB,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|