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,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.formatTransformerDiagnostic = formatTransformerDiagnostic;
|
|
7
|
+
exports.writeTransformerDiagnostics = writeTransformerDiagnostics;
|
|
8
|
+
/**
|
|
9
|
+
* draftole-transformer 由来の TypeScript Diagnostic を 1 件 1 行のフラット形式に整形する。
|
|
10
|
+
*
|
|
11
|
+
* 形式:
|
|
12
|
+
* - file + start 有り: `[draftole-transformer <Category>] <fileName>:<line>:<col> <message>\n`
|
|
13
|
+
* - それ以外 : `[draftole-transformer <Category>] <message>\n`
|
|
14
|
+
*
|
|
15
|
+
* 行・列は 1-origin、message は `DiagnosticMessageChain` の場合 top-level のみ採用する。
|
|
16
|
+
*
|
|
17
|
+
* 本モジュールは副作用を持たず、文字列の整形のみを行う純関数群。
|
|
18
|
+
* 書き出し先(stderr / 集約配列等)の選択は呼び出し側の責務。
|
|
19
|
+
*
|
|
20
|
+
* Requirements: TXDX-1(transformer 診断の silent drop 解消)
|
|
21
|
+
*
|
|
22
|
+
* @module transformer/format-diagnostics
|
|
23
|
+
*/
|
|
24
|
+
const typescript_1 = __importDefault(require("typescript"));
|
|
25
|
+
/**
|
|
26
|
+
* 単一の Diagnostic を 1 行のテキストに整形する(改行を含む)。
|
|
27
|
+
*/
|
|
28
|
+
function formatTransformerDiagnostic(diag) {
|
|
29
|
+
const category = typescript_1.default.DiagnosticCategory[diag.category];
|
|
30
|
+
const message = typeof diag.messageText === 'string'
|
|
31
|
+
? diag.messageText
|
|
32
|
+
: diag.messageText.messageText;
|
|
33
|
+
if (diag.file !== undefined && diag.start !== undefined) {
|
|
34
|
+
const { line, character } = diag.file.getLineAndCharacterOfPosition(diag.start);
|
|
35
|
+
return `[draftole-transformer ${category}] ${diag.file.fileName}:${line + 1}:${character + 1} ${message}\n`;
|
|
36
|
+
}
|
|
37
|
+
return `[draftole-transformer ${category}] ${message}\n`;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Diagnostic 配列を整形して与えられた `WritableStream` に書き出す。
|
|
41
|
+
* 空配列の場合は何もしない。
|
|
42
|
+
*/
|
|
43
|
+
function writeTransformerDiagnostics(diags, stream) {
|
|
44
|
+
if (diags.length === 0)
|
|
45
|
+
return;
|
|
46
|
+
for (const d of diags) {
|
|
47
|
+
stream.write(formatTransformerDiagnostic(d));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=format-diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-diagnostics.js","sourceRoot":"","sources":["../../src/transformer/format-diagnostics.ts"],"names":[],"mappings":";;;;;AAqBA,kEAWC;AAMD,kEAQC;AA9CD;;;;;;;;;;;;;;;GAeG;AACH,4DAA4B;AAE5B;;GAEG;AACH,SAAgB,2BAA2B,CAAC,IAAmB;IAC7D,MAAM,QAAQ,GAAG,oBAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,OAAO,GACX,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;QAClC,CAAC,CAAC,IAAI,CAAC,WAAW;QAClB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;IACnC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACxD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChF,OAAO,yBAAyB,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC;IAC9G,CAAC;IACD,OAAO,yBAAyB,QAAQ,KAAK,OAAO,IAAI,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,SAAgB,2BAA2B,CACzC,KAA+B,EAC/B,MAA6B;IAE7B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC/B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* handler-ir-extractor: `ts.ArrowFunction` → `HandlerIR`
|
|
3
|
+
*
|
|
4
|
+
* Task 4.2:
|
|
5
|
+
* - 引数名・式本体/ブロック本体の正規化
|
|
6
|
+
* - `const`/`let`/パラメータの `localDecls` 収集
|
|
7
|
+
* - 空本体 `() => {}` は warning を発しつつ継続
|
|
8
|
+
*
|
|
9
|
+
* 対応 requirements: 2.2, 2.6, 4.6
|
|
10
|
+
*/
|
|
11
|
+
import * as ts from 'typescript';
|
|
12
|
+
/**
|
|
13
|
+
* ハンドラ識別子の種別
|
|
14
|
+
*/
|
|
15
|
+
export type IdentifierKind = {
|
|
16
|
+
tag: 'state';
|
|
17
|
+
runtimeId: string;
|
|
18
|
+
} | {
|
|
19
|
+
tag: 'event-param';
|
|
20
|
+
} | {
|
|
21
|
+
tag: 'local';
|
|
22
|
+
} | {
|
|
23
|
+
tag: 'builtin';
|
|
24
|
+
name: string;
|
|
25
|
+
} | {
|
|
26
|
+
tag: 'unknown';
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* ハンドラ本体内の識別子参照
|
|
30
|
+
*/
|
|
31
|
+
export interface IdentifierRef {
|
|
32
|
+
readonly name: string;
|
|
33
|
+
readonly node: ts.Identifier;
|
|
34
|
+
readonly symbol: ts.Symbol | undefined;
|
|
35
|
+
readonly kind: IdentifierKind;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* アロー関数ハンドラの中間表現
|
|
39
|
+
*/
|
|
40
|
+
export interface HandlerIR {
|
|
41
|
+
/** 元の ArrowFunction AST ノード */
|
|
42
|
+
readonly node: ts.ArrowFunction;
|
|
43
|
+
/** 第1引数名("e" / "event" / null: 引数なし) */
|
|
44
|
+
readonly paramName: string | null;
|
|
45
|
+
/** 第1引数の型テキスト("MouseEvent" 等、情報用。null: 型注釈なし or 引数なし) */
|
|
46
|
+
readonly paramTypeText: string | null;
|
|
47
|
+
/** const/let/パラメータで束縛されるローカル名の集合 */
|
|
48
|
+
readonly localDecls: Set<string>;
|
|
49
|
+
/** 本体内の参照識別子一覧(後続の whitelist-validator が使用) */
|
|
50
|
+
readonly referencedIdentifiers: IdentifierRef[];
|
|
51
|
+
/** 式本体アロー(ブロックでない)なら true */
|
|
52
|
+
readonly isExpressionBody: boolean;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* extractHandlerIR の戻り値
|
|
56
|
+
*/
|
|
57
|
+
export interface HandlerIRResult {
|
|
58
|
+
/** 抽出された IR(空本体の場合も返す) */
|
|
59
|
+
readonly ir: HandlerIR | undefined;
|
|
60
|
+
/** 空本体の場合に生成される warning(それ以外は undefined) */
|
|
61
|
+
readonly warning: ts.Diagnostic | undefined;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* `ts.ArrowFunction` から `HandlerIR` を抽出する。
|
|
65
|
+
*
|
|
66
|
+
* @param arrowFn 対象のアロー関数 AST ノード
|
|
67
|
+
* @param sourceFile ソースファイル(診断情報用)
|
|
68
|
+
* @returns HandlerIRResult
|
|
69
|
+
*/
|
|
70
|
+
export declare function extractHandlerIR(arrowFn: ts.ArrowFunction, sourceFile: ts.SourceFile): HandlerIRResult;
|
|
71
|
+
//# sourceMappingURL=handler-ir-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler-ir-extractor.d.ts","sourceRoot":"","sources":["../../src/transformer/handler-ir-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAIjC;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,GAAG,EAAE,aAAa,CAAA;CAAE,GACtB;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,GAChB;IAAE,GAAG,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,GAAG,EAAE,SAAS,CAAA;CAAE,CAAC;AAEvB;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,+BAA+B;IAC/B,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC;IAChC,wCAAwC;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,yDAAyD;IACzD,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,oCAAoC;IACpC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,+CAA+C;IAC/C,QAAQ,CAAC,qBAAqB,EAAE,aAAa,EAAE,CAAC;IAChD,6BAA6B;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,EAAE,SAAS,GAAG,SAAS,CAAC;IACnC,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,GAAG,SAAS,CAAC;CAC7C;AAiFD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,EAAE,CAAC,aAAa,EACzB,UAAU,EAAE,EAAE,CAAC,UAAU,GACxB,eAAe,CAoDjB"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* handler-ir-extractor: `ts.ArrowFunction` → `HandlerIR`
|
|
4
|
+
*
|
|
5
|
+
* Task 4.2:
|
|
6
|
+
* - 引数名・式本体/ブロック本体の正規化
|
|
7
|
+
* - `const`/`let`/パラメータの `localDecls` 収集
|
|
8
|
+
* - 空本体 `() => {}` は warning を発しつつ継続
|
|
9
|
+
*
|
|
10
|
+
* 対応 requirements: 2.2, 2.6, 4.6
|
|
11
|
+
*/
|
|
12
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(o, k2, desc);
|
|
19
|
+
}) : (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
o[k2] = m[k];
|
|
22
|
+
}));
|
|
23
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
24
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
+
}) : function(o, v) {
|
|
26
|
+
o["default"] = v;
|
|
27
|
+
});
|
|
28
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
29
|
+
var ownKeys = function(o) {
|
|
30
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
31
|
+
var ar = [];
|
|
32
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
33
|
+
return ar;
|
|
34
|
+
};
|
|
35
|
+
return ownKeys(o);
|
|
36
|
+
};
|
|
37
|
+
return function (mod) {
|
|
38
|
+
if (mod && mod.__esModule) return mod;
|
|
39
|
+
var result = {};
|
|
40
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
41
|
+
__setModuleDefault(result, mod);
|
|
42
|
+
return result;
|
|
43
|
+
};
|
|
44
|
+
})();
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.extractHandlerIR = extractHandlerIR;
|
|
47
|
+
const ts = __importStar(require("typescript"));
|
|
48
|
+
// ---- ヘルパー ----------------------------------------------------------------
|
|
49
|
+
/**
|
|
50
|
+
* ブロック本体が空かどうかを判定する
|
|
51
|
+
*/
|
|
52
|
+
function isEmptyBlock(block) {
|
|
53
|
+
return block.statements.length === 0;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* ブロック内の const/let 宣言変数名を収集する(ネストされたブロックも再帰的に走査)
|
|
57
|
+
*
|
|
58
|
+
* ネストされた if/for/while ブロック内の `const` / `let` も
|
|
59
|
+
* 同一ハンドラ内のローカルとして扱う(Req 3.1「ハンドラ内ローカル」)。
|
|
60
|
+
*/
|
|
61
|
+
function collectLocalDeclsFromBlock(block) {
|
|
62
|
+
const decls = new Set();
|
|
63
|
+
function visitStatement(stmt) {
|
|
64
|
+
if (ts.isVariableStatement(stmt)) {
|
|
65
|
+
for (const decl of stmt.declarationList.declarations) {
|
|
66
|
+
if (ts.isIdentifier(decl.name)) {
|
|
67
|
+
decls.add(decl.name.text);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else if (ts.isBlock(stmt)) {
|
|
72
|
+
for (const s of stmt.statements) {
|
|
73
|
+
visitStatement(s);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else if (ts.isIfStatement(stmt)) {
|
|
77
|
+
visitStatement(stmt.thenStatement);
|
|
78
|
+
if (stmt.elseStatement !== undefined) {
|
|
79
|
+
visitStatement(stmt.elseStatement);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else if (ts.isForStatement(stmt) || ts.isForInStatement(stmt) || ts.isForOfStatement(stmt)) {
|
|
83
|
+
visitStatement(stmt.statement);
|
|
84
|
+
}
|
|
85
|
+
else if (ts.isWhileStatement(stmt) || ts.isDoStatement(stmt)) {
|
|
86
|
+
visitStatement(stmt.statement);
|
|
87
|
+
}
|
|
88
|
+
else if (ts.isTryStatement(stmt)) {
|
|
89
|
+
visitStatement(stmt.tryBlock);
|
|
90
|
+
if (stmt.catchClause !== undefined) {
|
|
91
|
+
visitStatement(stmt.catchClause.block);
|
|
92
|
+
}
|
|
93
|
+
if (stmt.finallyBlock !== undefined) {
|
|
94
|
+
visitStatement(stmt.finallyBlock);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
for (const stmt of block.statements) {
|
|
99
|
+
visitStatement(stmt);
|
|
100
|
+
}
|
|
101
|
+
return decls;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 警告 ts.Diagnostic を生成するヘルパー
|
|
105
|
+
*/
|
|
106
|
+
function createWarningDiagnostic(node, messageText) {
|
|
107
|
+
const sourceFile = node.getSourceFile();
|
|
108
|
+
const start = node.getStart(sourceFile, false);
|
|
109
|
+
const length = node.getWidth(sourceFile);
|
|
110
|
+
return {
|
|
111
|
+
file: sourceFile,
|
|
112
|
+
start,
|
|
113
|
+
length,
|
|
114
|
+
messageText,
|
|
115
|
+
category: ts.DiagnosticCategory.Warning,
|
|
116
|
+
code: 9002,
|
|
117
|
+
source: 'draftole-transformer',
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
// ---- メイン実装 --------------------------------------------------------------
|
|
121
|
+
/**
|
|
122
|
+
* `ts.ArrowFunction` から `HandlerIR` を抽出する。
|
|
123
|
+
*
|
|
124
|
+
* @param arrowFn 対象のアロー関数 AST ノード
|
|
125
|
+
* @param sourceFile ソースファイル(診断情報用)
|
|
126
|
+
* @returns HandlerIRResult
|
|
127
|
+
*/
|
|
128
|
+
function extractHandlerIR(arrowFn, sourceFile) {
|
|
129
|
+
// ---- 引数情報の抽出 ---------------------------------------------------------
|
|
130
|
+
let paramName = null;
|
|
131
|
+
let paramTypeText = null;
|
|
132
|
+
const localDecls = new Set();
|
|
133
|
+
if (arrowFn.parameters.length > 0) {
|
|
134
|
+
const firstParam = arrowFn.parameters[0];
|
|
135
|
+
if (ts.isIdentifier(firstParam.name)) {
|
|
136
|
+
paramName = firstParam.name.text;
|
|
137
|
+
localDecls.add(paramName);
|
|
138
|
+
}
|
|
139
|
+
if (firstParam.type !== undefined) {
|
|
140
|
+
paramTypeText = firstParam.type.getText(sourceFile);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// ---- 本体の判定 -------------------------------------------------------------
|
|
144
|
+
const body = arrowFn.body;
|
|
145
|
+
const isExpressionBody = !ts.isBlock(body);
|
|
146
|
+
// ---- 空本体の検出 -----------------------------------------------------------
|
|
147
|
+
let warning;
|
|
148
|
+
if (ts.isBlock(body) && isEmptyBlock(body)) {
|
|
149
|
+
warning = createWarningDiagnostic(arrowFn, 'DraftOle DT002: arrow function handler has empty body `() => {}`. ' +
|
|
150
|
+
'This handler will be registered but will have no effect.');
|
|
151
|
+
}
|
|
152
|
+
// ---- ブロック本体の localDecls 収集 -----------------------------------------
|
|
153
|
+
if (ts.isBlock(body)) {
|
|
154
|
+
const blockDecls = collectLocalDeclsFromBlock(body);
|
|
155
|
+
for (const name of blockDecls) {
|
|
156
|
+
localDecls.add(name);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// ---- 参照識別子は空(後続の identifier-collector が担当) -------------------
|
|
160
|
+
const referencedIdentifiers = [];
|
|
161
|
+
const ir = {
|
|
162
|
+
node: arrowFn,
|
|
163
|
+
paramName,
|
|
164
|
+
paramTypeText,
|
|
165
|
+
localDecls,
|
|
166
|
+
referencedIdentifiers,
|
|
167
|
+
isExpressionBody,
|
|
168
|
+
};
|
|
169
|
+
return { ir, warning };
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=handler-ir-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler-ir-extractor.js","sourceRoot":"","sources":["../../src/transformer/handler-ir-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* handler-serializer: `HandlerIR` + `stateIdMap` → `SerializedHandler { code, params }`
|
|
3
|
+
*
|
|
4
|
+
* Task 6.1:
|
|
5
|
+
* - `HandlerIR` と `stateIdMap: Map<ts.Symbol, string>` を受け取り、
|
|
6
|
+
* ハンドラ本体のアロー関数を `__draftole__.state("<runtimeId>")...` 形式の JS 文字列に変換する
|
|
7
|
+
* - `ts.transform` + 自家製 visitor で識別子を PropertyAccess 連鎖に置換
|
|
8
|
+
* - 最終 JS は `ts.createPrinter()` で emit(型注釈は tsc が自動除去)
|
|
9
|
+
* - 式本体アロー (`() => expr`) もブロック本体 (`() => { ... }`) も同一 IR で処理
|
|
10
|
+
*
|
|
11
|
+
* 対応 requirements: 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.9
|
|
12
|
+
* 対応 design: handler-serializer, D-8
|
|
13
|
+
*/
|
|
14
|
+
import * as ts from 'typescript';
|
|
15
|
+
import type { HandlerIR } from './handler-ir-extractor.ts';
|
|
16
|
+
/**
|
|
17
|
+
* serializeHandler の入力
|
|
18
|
+
*/
|
|
19
|
+
export interface HandlerSerializerInput {
|
|
20
|
+
/** 抽出済み HandlerIR */
|
|
21
|
+
readonly ir: HandlerIR;
|
|
22
|
+
/** State シンボル → _runtimeId 文字列 のマップ */
|
|
23
|
+
readonly stateIdMap: Map<ts.Symbol, string>;
|
|
24
|
+
/**
|
|
25
|
+
* each スコープのパラメータ識別子名 → ランタイム変数名 のマップ。
|
|
26
|
+
* `.each()` 内ハンドラで `item.get()` などを `__draftole__.state(itemId).get()` に変換するために使用。
|
|
27
|
+
* Identifier 引数(非 StringLiteral)で state() を生成する点が stateIdMap と異なる。
|
|
28
|
+
*/
|
|
29
|
+
readonly eachScopeParams?: Map<string, string>;
|
|
30
|
+
/**
|
|
31
|
+
* モジュールレベルのゼロ引数アロー関数をインライン展開するマップ。
|
|
32
|
+
* `addTodo()` のような呼び出しをハンドラ直書きコードに変換するために使用。
|
|
33
|
+
*/
|
|
34
|
+
readonly inlineMap?: ReadonlyMap<string, ts.ArrowFunction>;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* serializeHandler の出力
|
|
38
|
+
*/
|
|
39
|
+
export interface SerializedHandler {
|
|
40
|
+
/** 変換後の JS コード文字列(ハンドラ本体相当) */
|
|
41
|
+
readonly code: string;
|
|
42
|
+
/** イベントリスナ関数の仮引数名リスト(e.g. ["e"] or []) */
|
|
43
|
+
readonly params: readonly string[];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* `HandlerIR` と `stateIdMap` からハンドラ本体を `SerializedHandler` に変換する。
|
|
47
|
+
*
|
|
48
|
+
* - `ts.transform` + 自家製 visitor で識別子を `__draftole__.state(id)...` 連鎖に置換
|
|
49
|
+
* - `ts.createPrinter()` で JS として emit(型注釈は TypeScript が自動除去)
|
|
50
|
+
* - 識別子の置換対象: stateIdMap に Symbol が含まれる Identifier ノード
|
|
51
|
+
*
|
|
52
|
+
* @param input HandlerSerializerInput
|
|
53
|
+
* @returns SerializedHandler
|
|
54
|
+
*/
|
|
55
|
+
export declare function serializeHandler(input: HandlerSerializerInput): SerializedHandler;
|
|
56
|
+
//# sourceMappingURL=handler-serializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler-serializer.d.ts","sourceRoot":"","sources":["../../src/transformer/handler-serializer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAI3D;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,qBAAqB;IACrB,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC;IACvB,uCAAuC;IACvC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C;;;;OAIG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC;CAC5D;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,+BAA+B;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AA+OD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,sBAAsB,GAAG,iBAAiB,CAwGjF"}
|