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,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* state-id-resolver.ts
|
|
3
|
+
*
|
|
4
|
+
* State/Computed 型の識別と _runtimeId 文字列リテラルの抽出ユーティリティ。
|
|
5
|
+
*
|
|
6
|
+
* Task 1.1: state-id-resolver.ts の新規作成
|
|
7
|
+
* Task 2.2: canonical 経路への純化(フォールバック責務の完全分離)。
|
|
8
|
+
* - `buildSourceStateNameMap` の再エクスポートを削除
|
|
9
|
+
* - `buildStateIdMap` を `StateIdFallback` 注入式に変更
|
|
10
|
+
* - 戻り値を `StateIdResolution`(stateIdMap + unresolved)に拡張
|
|
11
|
+
*
|
|
12
|
+
* 公開 API:
|
|
13
|
+
* - isStateTypeNode(node, checker): State/Computed 型ノードを判定する型ガード
|
|
14
|
+
* - resolveStateIdByType(identNode, checker): _runtimeId の文字列リテラル値を返す
|
|
15
|
+
* - buildStateIdMap(arrowFn, checker, options?): StateIdResolution
|
|
16
|
+
*/
|
|
17
|
+
import * as ts from 'typescript';
|
|
18
|
+
import type { StateIdFallback } from './state-id-fallback';
|
|
19
|
+
/**
|
|
20
|
+
* `buildStateIdMap` の戻り値。
|
|
21
|
+
*
|
|
22
|
+
* - `stateIdMap`: 解決済み Symbol → ランタイム ID のマップ
|
|
23
|
+
* - `unresolved`: canonical/フォールバック双方で解決できなかった State 型の Symbol →
|
|
24
|
+
* 代表 Identifier ノードのマップ(同一 Symbol が複数回参照された場合は
|
|
25
|
+
* 最初に出現した Identifier を代表とする)
|
|
26
|
+
*/
|
|
27
|
+
export interface StateIdResolution {
|
|
28
|
+
readonly stateIdMap: Map<ts.Symbol, string>;
|
|
29
|
+
readonly unresolved: ReadonlyMap<ts.Symbol, ts.Identifier>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* `buildStateIdMap` のオプション。
|
|
33
|
+
*
|
|
34
|
+
* - `fallback`: canonical 経路(型リテラル)が null を返した場合に試みる補助経路。
|
|
35
|
+
* 未指定の場合、canonical 経路のみで動作する。
|
|
36
|
+
* - `eachScopeParamSymbols`: each スコープのパラメータ Symbol 集合。
|
|
37
|
+
* この集合に含まれる Symbol は unresolved への登録を
|
|
38
|
+
* silently skip する(TRANS-2 の責務範囲)。
|
|
39
|
+
*/
|
|
40
|
+
export interface BuildStateIdMapOptions {
|
|
41
|
+
readonly fallback?: StateIdFallback;
|
|
42
|
+
readonly eachScopeParamSymbols?: ReadonlySet<ts.Symbol>;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* ノードの型が State/Computed の構造的マーカーを持つか判定する。
|
|
46
|
+
*
|
|
47
|
+
* `_runtimeId: string` または `_runtimeId: StringLiteral` と `get()` を
|
|
48
|
+
* 両方持つ型を State/Computed と判定する。
|
|
49
|
+
*
|
|
50
|
+
* @param node 検査対象のノード
|
|
51
|
+
* @param checker TypeChecker
|
|
52
|
+
* @returns State/Computed 型であれば true
|
|
53
|
+
*/
|
|
54
|
+
export declare function isStateTypeNode(node: ts.Node, checker: ts.TypeChecker): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* アロー関数本体内で参照されている State/Computed 変数のシンボル → ランタイム ID マップを構築する。
|
|
57
|
+
*
|
|
58
|
+
* 解決優先順:
|
|
59
|
+
* 1. `resolveStateIdByType` で `_runtimeId` の文字列リテラル型を取得(canonical)
|
|
60
|
+
* 2. `options.fallback?.resolve(node)` を呼び出し補助経路で解決
|
|
61
|
+
* 3. 上記いずれも null かつ `isStateTypeNode` が true の場合、`unresolved` に登録
|
|
62
|
+
* (ただし `options.eachScopeParamSymbols` に含まれる Symbol は silently skip)
|
|
63
|
+
*
|
|
64
|
+
* 同一 Symbol が複数回参照された場合、最初に出現した Identifier が `unresolved` の
|
|
65
|
+
* 代表ノードとして採用される(1 Symbol につき 1 エントリ)。
|
|
66
|
+
*
|
|
67
|
+
* @param arrowFn 対象のアロー関数
|
|
68
|
+
* @param checker TypeChecker
|
|
69
|
+
* @param options オプション(フォールバック・each スコープ Symbol 集合)
|
|
70
|
+
* @returns 解決済みマップと未解決 Symbol マップ
|
|
71
|
+
*/
|
|
72
|
+
export declare function buildStateIdMap(arrowFn: ts.ArrowFunction, checker: ts.TypeChecker, options?: BuildStateIdMapOptions): StateIdResolution;
|
|
73
|
+
/**
|
|
74
|
+
* 状態識別子ノードから `_runtimeId` の型リテラル文字列を取得する。
|
|
75
|
+
*
|
|
76
|
+
* `extractRuntimeIdFromType` のリネーム版。
|
|
77
|
+
*
|
|
78
|
+
* State<T> のインスタンスが `const count: State<number> & { _runtimeId: "count-id" }`
|
|
79
|
+
* のように型付けされている場合、TypeChecker から文字列リテラル型を取り出す。
|
|
80
|
+
*
|
|
81
|
+
* - 型が string literal (e.g. "count-id") であれば返す
|
|
82
|
+
* - `string` 型(汎用)の場合は null を返す
|
|
83
|
+
* - Union 型の場合、最初の文字列リテラル型を試みる
|
|
84
|
+
*
|
|
85
|
+
* @param identNode State 型のルート識別子ノード
|
|
86
|
+
* @param checker TypeChecker
|
|
87
|
+
* @returns 文字列リテラル(runtimeId)または null
|
|
88
|
+
*/
|
|
89
|
+
export declare function resolveStateIdByType(identNode: ts.Identifier, checker: ts.TypeChecker): string | null;
|
|
90
|
+
/**
|
|
91
|
+
* ハンドラおよびインライン展開対象の関数本体から StateIdResolution を構築する。
|
|
92
|
+
*
|
|
93
|
+
* 本体スコープと各インライン関数スコープの解決結果を以下の規約でマージする:
|
|
94
|
+
*
|
|
95
|
+
* - `stateIdMap`: Symbol キーをユニオン化。衝突時は本体スコープの解決値を優先する
|
|
96
|
+
* (後勝ちではない: 既に存在する Symbol はインライン側の値で上書きしない)。
|
|
97
|
+
* - `unresolved`: 全スコープの未解決 Symbol をユニオン化。代表 Identifier は本体
|
|
98
|
+
* スコープを優先する。ただしいずれかのスコープで `stateIdMap` に解決された
|
|
99
|
+
* Symbol は「インライン展開後には既知」とみなして `unresolved` から除外する。
|
|
100
|
+
*
|
|
101
|
+
* relocated from index.ts (transformer-index-pipeline-split task 2.3).
|
|
102
|
+
*/
|
|
103
|
+
export declare function buildStateIdMapWithInlining(arrowFn: ts.ArrowFunction, checker: ts.TypeChecker, inlineMap: ReadonlyMap<string, ts.ArrowFunction>, fallback: StateIdFallback): StateIdResolution;
|
|
104
|
+
//# sourceMappingURL=state-id-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-id-resolver.d.ts","sourceRoot":"","sources":["../../src/transformer/state-id-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;CAC5D;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC;IACpC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;CACzD;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,GAAG,OAAO,CAS/E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,EAAE,CAAC,aAAa,EACzB,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,iBAAiB,CA+CnB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,EAAE,CAAC,UAAU,EACxB,OAAO,EAAE,EAAE,CAAC,WAAW,GACtB,MAAM,GAAG,IAAI,CAgCf;AAID;;;;;;;;;;;;GAYG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,EAAE,CAAC,aAAa,EACzB,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,EAChD,QAAQ,EAAE,eAAe,GACxB,iBAAiB,CA8BnB"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* state-id-resolver.ts
|
|
4
|
+
*
|
|
5
|
+
* State/Computed 型の識別と _runtimeId 文字列リテラルの抽出ユーティリティ。
|
|
6
|
+
*
|
|
7
|
+
* Task 1.1: state-id-resolver.ts の新規作成
|
|
8
|
+
* Task 2.2: canonical 経路への純化(フォールバック責務の完全分離)。
|
|
9
|
+
* - `buildSourceStateNameMap` の再エクスポートを削除
|
|
10
|
+
* - `buildStateIdMap` を `StateIdFallback` 注入式に変更
|
|
11
|
+
* - 戻り値を `StateIdResolution`(stateIdMap + unresolved)に拡張
|
|
12
|
+
*
|
|
13
|
+
* 公開 API:
|
|
14
|
+
* - isStateTypeNode(node, checker): State/Computed 型ノードを判定する型ガード
|
|
15
|
+
* - resolveStateIdByType(identNode, checker): _runtimeId の文字列リテラル値を返す
|
|
16
|
+
* - buildStateIdMap(arrowFn, checker, options?): StateIdResolution
|
|
17
|
+
*/
|
|
18
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
21
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
22
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
23
|
+
}
|
|
24
|
+
Object.defineProperty(o, k2, desc);
|
|
25
|
+
}) : (function(o, m, k, k2) {
|
|
26
|
+
if (k2 === undefined) k2 = k;
|
|
27
|
+
o[k2] = m[k];
|
|
28
|
+
}));
|
|
29
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
30
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
31
|
+
}) : function(o, v) {
|
|
32
|
+
o["default"] = v;
|
|
33
|
+
});
|
|
34
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
35
|
+
var ownKeys = function(o) {
|
|
36
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
37
|
+
var ar = [];
|
|
38
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
39
|
+
return ar;
|
|
40
|
+
};
|
|
41
|
+
return ownKeys(o);
|
|
42
|
+
};
|
|
43
|
+
return function (mod) {
|
|
44
|
+
if (mod && mod.__esModule) return mod;
|
|
45
|
+
var result = {};
|
|
46
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
47
|
+
__setModuleDefault(result, mod);
|
|
48
|
+
return result;
|
|
49
|
+
};
|
|
50
|
+
})();
|
|
51
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
52
|
+
exports.isStateTypeNode = isStateTypeNode;
|
|
53
|
+
exports.buildStateIdMap = buildStateIdMap;
|
|
54
|
+
exports.resolveStateIdByType = resolveStateIdByType;
|
|
55
|
+
exports.buildStateIdMapWithInlining = buildStateIdMapWithInlining;
|
|
56
|
+
const ts = __importStar(require("typescript"));
|
|
57
|
+
/**
|
|
58
|
+
* ノードの型が State/Computed の構造的マーカーを持つか判定する。
|
|
59
|
+
*
|
|
60
|
+
* `_runtimeId: string` または `_runtimeId: StringLiteral` と `get()` を
|
|
61
|
+
* 両方持つ型を State/Computed と判定する。
|
|
62
|
+
*
|
|
63
|
+
* @param node 検査対象のノード
|
|
64
|
+
* @param checker TypeChecker
|
|
65
|
+
* @returns State/Computed 型であれば true
|
|
66
|
+
*/
|
|
67
|
+
function isStateTypeNode(node, checker) {
|
|
68
|
+
var _a, _b;
|
|
69
|
+
const type = checker.getTypeAtLocation(node);
|
|
70
|
+
const runtimeIdProp = type.getProperty('_runtimeId');
|
|
71
|
+
const getProp = type.getProperty('get');
|
|
72
|
+
if (runtimeIdProp === undefined || getProp === undefined)
|
|
73
|
+
return false;
|
|
74
|
+
const declNode = (_a = runtimeIdProp.valueDeclaration) !== null && _a !== void 0 ? _a : (_b = runtimeIdProp.declarations) === null || _b === void 0 ? void 0 : _b[0];
|
|
75
|
+
if (declNode === undefined)
|
|
76
|
+
return false;
|
|
77
|
+
const propType = checker.getTypeOfSymbolAtLocation(runtimeIdProp, declNode);
|
|
78
|
+
return (propType.flags & (ts.TypeFlags.String | ts.TypeFlags.StringLiteral)) !== 0;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* アロー関数本体内で参照されている State/Computed 変数のシンボル → ランタイム ID マップを構築する。
|
|
82
|
+
*
|
|
83
|
+
* 解決優先順:
|
|
84
|
+
* 1. `resolveStateIdByType` で `_runtimeId` の文字列リテラル型を取得(canonical)
|
|
85
|
+
* 2. `options.fallback?.resolve(node)` を呼び出し補助経路で解決
|
|
86
|
+
* 3. 上記いずれも null かつ `isStateTypeNode` が true の場合、`unresolved` に登録
|
|
87
|
+
* (ただし `options.eachScopeParamSymbols` に含まれる Symbol は silently skip)
|
|
88
|
+
*
|
|
89
|
+
* 同一 Symbol が複数回参照された場合、最初に出現した Identifier が `unresolved` の
|
|
90
|
+
* 代表ノードとして採用される(1 Symbol につき 1 エントリ)。
|
|
91
|
+
*
|
|
92
|
+
* @param arrowFn 対象のアロー関数
|
|
93
|
+
* @param checker TypeChecker
|
|
94
|
+
* @param options オプション(フォールバック・each スコープ Symbol 集合)
|
|
95
|
+
* @returns 解決済みマップと未解決 Symbol マップ
|
|
96
|
+
*/
|
|
97
|
+
function buildStateIdMap(arrowFn, checker, options) {
|
|
98
|
+
const stateIdMap = new Map();
|
|
99
|
+
const unresolved = new Map();
|
|
100
|
+
const seen = new Set();
|
|
101
|
+
const fallback = options === null || options === void 0 ? void 0 : options.fallback;
|
|
102
|
+
const eachScopeParamSymbols = options === null || options === void 0 ? void 0 : options.eachScopeParamSymbols;
|
|
103
|
+
function visit(node) {
|
|
104
|
+
if (ts.isIdentifier(node)) {
|
|
105
|
+
// PropertyAccessExpression の name 側(右辺)はスキップ
|
|
106
|
+
const parent = node.parent;
|
|
107
|
+
if (ts.isPropertyAccessExpression(parent) && parent.name === node) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const symbol = checker.getSymbolAtLocation(node);
|
|
111
|
+
if (symbol !== undefined && !seen.has(symbol)) {
|
|
112
|
+
seen.add(symbol);
|
|
113
|
+
// 1. canonical: 文字列リテラル型から取得
|
|
114
|
+
let runtimeId = resolveStateIdByType(node, checker);
|
|
115
|
+
// 2. fallback: 注入された StateIdFallback で補助解決
|
|
116
|
+
if (runtimeId === null && fallback !== undefined) {
|
|
117
|
+
runtimeId = fallback.resolve(node);
|
|
118
|
+
}
|
|
119
|
+
if (runtimeId !== null) {
|
|
120
|
+
stateIdMap.set(symbol, runtimeId);
|
|
121
|
+
}
|
|
122
|
+
else if (isStateTypeNode(node, checker)) {
|
|
123
|
+
// 3. each スコープのパラメータは silently skip
|
|
124
|
+
if ((eachScopeParamSymbols === null || eachScopeParamSymbols === void 0 ? void 0 : eachScopeParamSymbols.has(symbol)) === true) {
|
|
125
|
+
// skip
|
|
126
|
+
}
|
|
127
|
+
else if (!unresolved.has(symbol)) {
|
|
128
|
+
unresolved.set(symbol, node);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
ts.forEachChild(node, visit);
|
|
134
|
+
}
|
|
135
|
+
// 本体のみを走査(パラメータは State でないため除外)
|
|
136
|
+
visit(arrowFn.body);
|
|
137
|
+
return { stateIdMap, unresolved };
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* 状態識別子ノードから `_runtimeId` の型リテラル文字列を取得する。
|
|
141
|
+
*
|
|
142
|
+
* `extractRuntimeIdFromType` のリネーム版。
|
|
143
|
+
*
|
|
144
|
+
* State<T> のインスタンスが `const count: State<number> & { _runtimeId: "count-id" }`
|
|
145
|
+
* のように型付けされている場合、TypeChecker から文字列リテラル型を取り出す。
|
|
146
|
+
*
|
|
147
|
+
* - 型が string literal (e.g. "count-id") であれば返す
|
|
148
|
+
* - `string` 型(汎用)の場合は null を返す
|
|
149
|
+
* - Union 型の場合、最初の文字列リテラル型を試みる
|
|
150
|
+
*
|
|
151
|
+
* @param identNode State 型のルート識別子ノード
|
|
152
|
+
* @param checker TypeChecker
|
|
153
|
+
* @returns 文字列リテラル(runtimeId)または null
|
|
154
|
+
*/
|
|
155
|
+
function resolveStateIdByType(identNode, checker) {
|
|
156
|
+
var _a;
|
|
157
|
+
const type = checker.getTypeAtLocation(identNode);
|
|
158
|
+
// _runtimeId プロパティのシンボルを取得
|
|
159
|
+
const runtimeIdProp = type.getProperty('_runtimeId');
|
|
160
|
+
if (runtimeIdProp === undefined)
|
|
161
|
+
return null;
|
|
162
|
+
// プロパティの型を取得
|
|
163
|
+
const declNode = (_a = runtimeIdProp.valueDeclaration) !== null && _a !== void 0 ? _a : (runtimeIdProp.declarations !== undefined && runtimeIdProp.declarations.length > 0
|
|
164
|
+
? runtimeIdProp.declarations[0]
|
|
165
|
+
: undefined);
|
|
166
|
+
if (declNode === undefined)
|
|
167
|
+
return null;
|
|
168
|
+
const propType = checker.getTypeOfSymbolAtLocation(runtimeIdProp, declNode);
|
|
169
|
+
// 文字列リテラル型かチェック
|
|
170
|
+
if (propType.isStringLiteral()) {
|
|
171
|
+
return propType.value;
|
|
172
|
+
}
|
|
173
|
+
// Union 型の場合、最初の文字列リテラル型を試みる
|
|
174
|
+
if (propType.isUnion()) {
|
|
175
|
+
for (const member of propType.types) {
|
|
176
|
+
if (member.isStringLiteral()) {
|
|
177
|
+
return member.value;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
// ---- インライン展開対応 StateIdResolution (relocated from index.ts) ---------
|
|
184
|
+
/**
|
|
185
|
+
* ハンドラおよびインライン展開対象の関数本体から StateIdResolution を構築する。
|
|
186
|
+
*
|
|
187
|
+
* 本体スコープと各インライン関数スコープの解決結果を以下の規約でマージする:
|
|
188
|
+
*
|
|
189
|
+
* - `stateIdMap`: Symbol キーをユニオン化。衝突時は本体スコープの解決値を優先する
|
|
190
|
+
* (後勝ちではない: 既に存在する Symbol はインライン側の値で上書きしない)。
|
|
191
|
+
* - `unresolved`: 全スコープの未解決 Symbol をユニオン化。代表 Identifier は本体
|
|
192
|
+
* スコープを優先する。ただしいずれかのスコープで `stateIdMap` に解決された
|
|
193
|
+
* Symbol は「インライン展開後には既知」とみなして `unresolved` から除外する。
|
|
194
|
+
*
|
|
195
|
+
* relocated from index.ts (transformer-index-pipeline-split task 2.3).
|
|
196
|
+
*/
|
|
197
|
+
function buildStateIdMapWithInlining(arrowFn, checker, inlineMap, fallback) {
|
|
198
|
+
const bodyResolution = buildStateIdMap(arrowFn, checker, { fallback });
|
|
199
|
+
const combinedStateIdMap = new Map(bodyResolution.stateIdMap);
|
|
200
|
+
const combinedUnresolved = new Map(bodyResolution.unresolved);
|
|
201
|
+
for (const funcArrow of inlineMap.values()) {
|
|
202
|
+
const inlineResolution = buildStateIdMap(funcArrow, checker, { fallback });
|
|
203
|
+
// stateIdMap マージ: 本体スコープが衝突時に勝つ → 既存キーをスキップ。
|
|
204
|
+
for (const [sym, runtimeId] of inlineResolution.stateIdMap) {
|
|
205
|
+
if (!combinedStateIdMap.has(sym)) {
|
|
206
|
+
combinedStateIdMap.set(sym, runtimeId);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// unresolved マージ: 本体スコープの代表 Identifier を優先 → 既存キーをスキップ。
|
|
210
|
+
for (const [sym, identNode] of inlineResolution.unresolved) {
|
|
211
|
+
if (!combinedUnresolved.has(sym)) {
|
|
212
|
+
combinedUnresolved.set(sym, identNode);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// いずれかのスコープで解決された Symbol は unresolved から除外する。
|
|
217
|
+
for (const sym of combinedStateIdMap.keys()) {
|
|
218
|
+
combinedUnresolved.delete(sym);
|
|
219
|
+
}
|
|
220
|
+
return { stateIdMap: combinedStateIdMap, unresolved: combinedUnresolved };
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=state-id-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-id-resolver.js","sourceRoot":"","sources":["../../src/transformer/state-id-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* theme-class-detector: `theme.class(...)` 呼び出しの AST 検出
|
|
3
|
+
*
|
|
4
|
+
* Task 4.1:
|
|
5
|
+
* - `ts.forEachChild` で全 `ts.CallExpression` を走査
|
|
6
|
+
* - `<expr>.class(...)` 形式の PropertyAccessExpression を持つ呼び出しを候補化
|
|
7
|
+
* - 候補の LHS が `UnifiedTheme.class` メソッドを持つ型であることを検証する
|
|
8
|
+
* - Primary: TypeChecker 経由で LHS の symbol/type を取得し、`class` プロパティが
|
|
9
|
+
* `ThemeClassMethod` 互換(properties-only / properties+selectors / named の overload を持つ)
|
|
10
|
+
* かを構造的に判定する
|
|
11
|
+
* - Fallback (HEURISTIC): TypeChecker での判定が確定しない場合は、LHS が識別子 `theme` で
|
|
12
|
+
* かつソースファイルの top-level import に DraftOle 由来の named import(`theme`, `createTheme`,
|
|
13
|
+
* `el`, `css`, `Root`, `FileExporter` 等)が存在するときに限り「`theme.class()` とみなす」
|
|
14
|
+
* - 無名 overload のみを採用する:
|
|
15
|
+
* - `theme.class({ ... })` または `theme.class({ ... }, { ... })` → INCLUDE
|
|
16
|
+
* - `theme.class('name', ...)` → EXCLUDE(varName が既知のためラベル注入不要)
|
|
17
|
+
* - 上記以外の形(spread / 0 args 等)→ スキップ
|
|
18
|
+
*
|
|
19
|
+
* 本モジュールは検出のみを担い、varName 抽出 / 書き換えは subsequent task が担当する。
|
|
20
|
+
*
|
|
21
|
+
* 対応 requirements: 1.1, 2.1, 3.1, 3.3
|
|
22
|
+
*/
|
|
23
|
+
import * as ts from 'typescript';
|
|
24
|
+
/**
|
|
25
|
+
* 検出された `theme.class(...)` 呼び出し 1 件分の情報。
|
|
26
|
+
*
|
|
27
|
+
* `overload` は無名 overload のみ採用するため常に `'anonymous'`。
|
|
28
|
+
* (将来 named 経路も拡張する場合は union を広げる)
|
|
29
|
+
*/
|
|
30
|
+
export interface ThemeClassDetectorResult {
|
|
31
|
+
/** `theme.class(...)` の CallExpression ノード */
|
|
32
|
+
readonly callExpr: ts.CallExpression;
|
|
33
|
+
/** overload 種別。本実装では常に `'anonymous'` */
|
|
34
|
+
readonly overload: 'anonymous';
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* `sourceFile` を AST 走査し、無名 overload の `theme.class(...)` 呼び出しを抽出する。
|
|
38
|
+
*
|
|
39
|
+
* 型チェッカーで判定が確定しない場合は構造的 HEURISTIC(`theme` 識別子 + DraftOle import)
|
|
40
|
+
* を fallback として使用する。型エラーや symbol 未解決でも例外を投げない。
|
|
41
|
+
*
|
|
42
|
+
* @param sourceFile 走査対象のソースファイル
|
|
43
|
+
* @param checker `ts.Program#getTypeChecker()` から取得した型チェッカー
|
|
44
|
+
* @returns 検出された呼び出し情報の配列(挿入順)
|
|
45
|
+
*/
|
|
46
|
+
export declare function detectThemeClassCalls(sourceFile: ts.SourceFile, checker: ts.TypeChecker): readonly ThemeClassDetectorResult[];
|
|
47
|
+
//# sourceMappingURL=theme-class-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-class-detector.d.ts","sourceRoot":"","sources":["../../src/transformer/theme-class-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAIjC;;;;;GAKG;AACH,MAAM,WAAW,wBAAwB;IACvC,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,cAAc,CAAC;IACrC,wCAAwC;IACxC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;CAChC;AA2KD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,OAAO,EAAE,EAAE,CAAC,WAAW,GACtB,SAAS,wBAAwB,EAAE,CAqBrC"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* theme-class-detector: `theme.class(...)` 呼び出しの AST 検出
|
|
4
|
+
*
|
|
5
|
+
* Task 4.1:
|
|
6
|
+
* - `ts.forEachChild` で全 `ts.CallExpression` を走査
|
|
7
|
+
* - `<expr>.class(...)` 形式の PropertyAccessExpression を持つ呼び出しを候補化
|
|
8
|
+
* - 候補の LHS が `UnifiedTheme.class` メソッドを持つ型であることを検証する
|
|
9
|
+
* - Primary: TypeChecker 経由で LHS の symbol/type を取得し、`class` プロパティが
|
|
10
|
+
* `ThemeClassMethod` 互換(properties-only / properties+selectors / named の overload を持つ)
|
|
11
|
+
* かを構造的に判定する
|
|
12
|
+
* - Fallback (HEURISTIC): TypeChecker での判定が確定しない場合は、LHS が識別子 `theme` で
|
|
13
|
+
* かつソースファイルの top-level import に DraftOle 由来の named import(`theme`, `createTheme`,
|
|
14
|
+
* `el`, `css`, `Root`, `FileExporter` 等)が存在するときに限り「`theme.class()` とみなす」
|
|
15
|
+
* - 無名 overload のみを採用する:
|
|
16
|
+
* - `theme.class({ ... })` または `theme.class({ ... }, { ... })` → INCLUDE
|
|
17
|
+
* - `theme.class('name', ...)` → EXCLUDE(varName が既知のためラベル注入不要)
|
|
18
|
+
* - 上記以外の形(spread / 0 args 等)→ スキップ
|
|
19
|
+
*
|
|
20
|
+
* 本モジュールは検出のみを担い、varName 抽出 / 書き換えは subsequent task が担当する。
|
|
21
|
+
*
|
|
22
|
+
* 対応 requirements: 1.1, 2.1, 3.1, 3.3
|
|
23
|
+
*/
|
|
24
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
27
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
28
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
29
|
+
}
|
|
30
|
+
Object.defineProperty(o, k2, desc);
|
|
31
|
+
}) : (function(o, m, k, k2) {
|
|
32
|
+
if (k2 === undefined) k2 = k;
|
|
33
|
+
o[k2] = m[k];
|
|
34
|
+
}));
|
|
35
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
36
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
37
|
+
}) : function(o, v) {
|
|
38
|
+
o["default"] = v;
|
|
39
|
+
});
|
|
40
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
41
|
+
var ownKeys = function(o) {
|
|
42
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
43
|
+
var ar = [];
|
|
44
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
45
|
+
return ar;
|
|
46
|
+
};
|
|
47
|
+
return ownKeys(o);
|
|
48
|
+
};
|
|
49
|
+
return function (mod) {
|
|
50
|
+
if (mod && mod.__esModule) return mod;
|
|
51
|
+
var result = {};
|
|
52
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
53
|
+
__setModuleDefault(result, mod);
|
|
54
|
+
return result;
|
|
55
|
+
};
|
|
56
|
+
})();
|
|
57
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
58
|
+
exports.detectThemeClassCalls = detectThemeClassCalls;
|
|
59
|
+
const ts = __importStar(require("typescript"));
|
|
60
|
+
// ---- 内部ヘルパー ------------------------------------------------------------
|
|
61
|
+
/**
|
|
62
|
+
* DraftOle 由来の named import で「theme が import されているか」を雑に判定するための
|
|
63
|
+
* 既知シンボル集合。HEURISTIC fallback でのみ参照する。
|
|
64
|
+
*/
|
|
65
|
+
const DRAFTOLE_KNOWN_IMPORTS = new Set([
|
|
66
|
+
'theme',
|
|
67
|
+
'createTheme',
|
|
68
|
+
'el',
|
|
69
|
+
'css',
|
|
70
|
+
'Root',
|
|
71
|
+
'FileExporter',
|
|
72
|
+
'button',
|
|
73
|
+
'div',
|
|
74
|
+
'html',
|
|
75
|
+
'body',
|
|
76
|
+
'view',
|
|
77
|
+
'Page',
|
|
78
|
+
'App',
|
|
79
|
+
'bindEach',
|
|
80
|
+
]);
|
|
81
|
+
/**
|
|
82
|
+
* ソースファイル top-level の ImportDeclaration から、named import に
|
|
83
|
+
* `DRAFTOLE_KNOWN_IMPORTS` のいずれかが含まれるかを判定する。
|
|
84
|
+
*
|
|
85
|
+
* HEURISTIC fallback の前提条件として使用する。
|
|
86
|
+
*/
|
|
87
|
+
function hasDraftOleImport(sourceFile) {
|
|
88
|
+
for (const stmt of sourceFile.statements) {
|
|
89
|
+
if (!ts.isImportDeclaration(stmt))
|
|
90
|
+
continue;
|
|
91
|
+
const clause = stmt.importClause;
|
|
92
|
+
if (clause === undefined)
|
|
93
|
+
continue;
|
|
94
|
+
const bindings = clause.namedBindings;
|
|
95
|
+
if (bindings === undefined || !ts.isNamedImports(bindings))
|
|
96
|
+
continue;
|
|
97
|
+
for (const spec of bindings.elements) {
|
|
98
|
+
const name = spec.name.text;
|
|
99
|
+
if (DRAFTOLE_KNOWN_IMPORTS.has(name)) {
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 型 `t` が `ThemeClassMethod` 互換の `class` プロパティを持つかを判定する。
|
|
108
|
+
*
|
|
109
|
+
* `ThemeClassMethod` は overload セット:
|
|
110
|
+
* (properties) => StyleTemplate
|
|
111
|
+
* (properties, selectors) => StyleTemplate
|
|
112
|
+
* (name, properties, selectors?) => SharedStyle
|
|
113
|
+
*
|
|
114
|
+
* 実装は「`class` プロパティが存在し、その型が call signature を 1 つ以上持つ」
|
|
115
|
+
* 程度の緩い判定に留める(厳密に overload を見ると brittle になるため)。
|
|
116
|
+
*
|
|
117
|
+
* 判定不能(symbol 解決失敗等)の場合は `false` を返し、呼び出し側で
|
|
118
|
+
* HEURISTIC fallback に委ねる。
|
|
119
|
+
*/
|
|
120
|
+
function typeLooksLikeUnifiedTheme(type, checker) {
|
|
121
|
+
const classProp = type.getProperty('class');
|
|
122
|
+
if (classProp === undefined)
|
|
123
|
+
return false;
|
|
124
|
+
// class プロパティの宣言位置から型を取得
|
|
125
|
+
const decls = classProp.getDeclarations();
|
|
126
|
+
if (decls === undefined || decls.length === 0) {
|
|
127
|
+
// 宣言取得失敗 → 緩めに OK 扱い(class プロパティが存在する事実のみで判定)
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
const classType = checker.getTypeOfSymbolAtLocation(classProp, decls[0]);
|
|
132
|
+
const signatures = classType.getCallSignatures();
|
|
133
|
+
return signatures.length > 0;
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// 型解決例外時は class プロパティ存在のみで OK 扱い
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* CallExpression が `theme.class(...)` 形式かを判定する。
|
|
142
|
+
*
|
|
143
|
+
* - PropertyAccessExpression で `.name.text === 'class'`
|
|
144
|
+
* - LHS(`expr.expression`)が UnifiedTheme 互換型 — TypeChecker 経由で判定
|
|
145
|
+
* - 判定不能時は HEURISTIC fallback(LHS が識別子 `theme` かつ DraftOle import が存在)
|
|
146
|
+
*/
|
|
147
|
+
function isThemeClassCall(node, sourceFile, checker) {
|
|
148
|
+
const expr = node.expression;
|
|
149
|
+
if (!ts.isPropertyAccessExpression(expr))
|
|
150
|
+
return false;
|
|
151
|
+
if (expr.name.text !== 'class')
|
|
152
|
+
return false;
|
|
153
|
+
const lhs = expr.expression;
|
|
154
|
+
// Primary: TypeChecker 経由
|
|
155
|
+
// 例外や undefined symbol を許容しつつ、最も robust な経路を試す
|
|
156
|
+
let typeCheckOk = false;
|
|
157
|
+
try {
|
|
158
|
+
const symbol = checker.getSymbolAtLocation(lhs);
|
|
159
|
+
if (symbol !== undefined) {
|
|
160
|
+
const lhsType = checker.getTypeOfSymbolAtLocation(symbol, lhs);
|
|
161
|
+
if (typeLooksLikeUnifiedTheme(lhsType, checker)) {
|
|
162
|
+
typeCheckOk = true;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
// symbol が取れない場合でも、型推論で取得を試みる
|
|
167
|
+
const lhsType = checker.getTypeAtLocation(lhs);
|
|
168
|
+
if (typeLooksLikeUnifiedTheme(lhsType, checker)) {
|
|
169
|
+
typeCheckOk = true;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
// 型チェッカー側の不具合や未解決参照は無視して fallback に委ねる
|
|
175
|
+
}
|
|
176
|
+
if (typeCheckOk)
|
|
177
|
+
return true;
|
|
178
|
+
// HEURISTIC fallback: LHS が識別子 `theme` かつ DraftOle import が存在
|
|
179
|
+
if (ts.isIdentifier(lhs) && lhs.text === 'theme' && hasDraftOleImport(sourceFile)) {
|
|
180
|
+
return true; // HEURISTIC
|
|
181
|
+
}
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* 引数列が「無名 overload」に該当するかを判定する。
|
|
186
|
+
*
|
|
187
|
+
* - 1 引数: ObjectLiteralExpression → 無名(properties のみ)
|
|
188
|
+
* - 2 引数: 第 1 が ObjectLiteralExpression かつ 第 2 が ObjectLiteralExpression → 無名 + selectors
|
|
189
|
+
* - 第 1 引数が StringLiteral → named overload(除外)
|
|
190
|
+
* - それ以外(spread / 0 引数 / 識別子参照等)→ 除外
|
|
191
|
+
*/
|
|
192
|
+
function isAnonymousOverloadArgs(args) {
|
|
193
|
+
if (args.length === 0)
|
|
194
|
+
return false;
|
|
195
|
+
const first = args[0];
|
|
196
|
+
// named overload は除外
|
|
197
|
+
if (ts.isStringLiteral(first) || ts.isNoSubstitutionTemplateLiteral(first)) {
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
// spread 要素を含む形は対象外
|
|
201
|
+
for (const a of args) {
|
|
202
|
+
if (ts.isSpreadElement(a))
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
if (args.length === 1) {
|
|
206
|
+
return ts.isObjectLiteralExpression(first);
|
|
207
|
+
}
|
|
208
|
+
if (args.length === 2) {
|
|
209
|
+
return (ts.isObjectLiteralExpression(first) &&
|
|
210
|
+
ts.isObjectLiteralExpression(args[1]));
|
|
211
|
+
}
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
// ---- メイン実装 --------------------------------------------------------------
|
|
215
|
+
/**
|
|
216
|
+
* `sourceFile` を AST 走査し、無名 overload の `theme.class(...)` 呼び出しを抽出する。
|
|
217
|
+
*
|
|
218
|
+
* 型チェッカーで判定が確定しない場合は構造的 HEURISTIC(`theme` 識別子 + DraftOle import)
|
|
219
|
+
* を fallback として使用する。型エラーや symbol 未解決でも例外を投げない。
|
|
220
|
+
*
|
|
221
|
+
* @param sourceFile 走査対象のソースファイル
|
|
222
|
+
* @param checker `ts.Program#getTypeChecker()` から取得した型チェッカー
|
|
223
|
+
* @returns 検出された呼び出し情報の配列(挿入順)
|
|
224
|
+
*/
|
|
225
|
+
function detectThemeClassCalls(sourceFile, checker) {
|
|
226
|
+
const results = [];
|
|
227
|
+
function visit(node) {
|
|
228
|
+
if (ts.isCallExpression(node)) {
|
|
229
|
+
if (isThemeClassCall(node, sourceFile, checker) &&
|
|
230
|
+
isAnonymousOverloadArgs(node.arguments)) {
|
|
231
|
+
results.push({
|
|
232
|
+
callExpr: node,
|
|
233
|
+
overload: 'anonymous',
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
ts.forEachChild(node, visit);
|
|
238
|
+
}
|
|
239
|
+
visit(sourceFile);
|
|
240
|
+
return results;
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=theme-class-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-class-detector.js","sourceRoot":"","sources":["../../src/transformer/theme-class-detector.ts"],"names":[],"mappings":"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"}
|