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,53 @@
|
|
|
1
|
+
import * as ts from 'typescript';
|
|
2
|
+
/**
|
|
3
|
+
* varname-resolver
|
|
4
|
+
* =================
|
|
5
|
+
*
|
|
6
|
+
* `theme.class(...)` の CallExpression に対して、ビルド時に AST 文脈から
|
|
7
|
+
* 「この呼び出しがどのような名前を持つ場所に書かれているか」を読み取り、
|
|
8
|
+
* scoped CSS class name に埋め込むためのラベル文字列(varName)を返す。
|
|
9
|
+
*
|
|
10
|
+
* 戦略は 3 階層で、上から順に評価し、最初に該当した tier の結果を採用する。
|
|
11
|
+
*
|
|
12
|
+
* Tier 1 — declaration (requirements §1, §2)
|
|
13
|
+
* 親が `ts.VariableDeclaration` でその initializer が当該 callExpr の場合、
|
|
14
|
+
* 宣言名 (Identifier) を採用する。const / let / var は区別しない。
|
|
15
|
+
* 親チェーンを辿る必要はない(AST 上「直接の親」が最内の宣言である)。
|
|
16
|
+
*
|
|
17
|
+
* Tier 2 — class carrier prop (requirements §3.1, §3.3)
|
|
18
|
+
* 親が `ts.PropertyAssignment` でその value が当該 callExpr、かつ prop 名が
|
|
19
|
+
* `CLASS_CARRIER_PROP_NAMES` に含まれる場合のみ発動。
|
|
20
|
+
* prop 名自体は varName に採用せず、以下の優先順位で fallback ラベルを合成する:
|
|
21
|
+
* (a) 同じ ObjectLiteralExpression 内の `id` / `name` / `data-testid` 文字列リテラル
|
|
22
|
+
* (b) 親 factory 呼び出しのタグ名と役割属性(`button` / `input` の `type`)
|
|
23
|
+
* (c) いずれも該当しない場合は undefined を返し、Tier 3 へフォールスルー
|
|
24
|
+
*
|
|
25
|
+
* Tier 3 — function argument (requirements §3.4, §3.5)
|
|
26
|
+
* 親が `ts.CallExpression` で当該 callExpr がその引数の 1 つの場合、
|
|
27
|
+
* 親呼び出しの関数名(Identifier / PropertyAccessExpression の末尾 name)を採用。
|
|
28
|
+
*
|
|
29
|
+
* すべての出力は `sanitizeVarName` で正規化・24 文字制限を経由する。
|
|
30
|
+
* 正規化結果が空文字列になる場合は undefined を返す。
|
|
31
|
+
*/
|
|
32
|
+
/**
|
|
33
|
+
* Tier 2 で「class carrier」と認識する prop 名集合。
|
|
34
|
+
* 将来 `style` や `cssClass` などが追加された場合はここ 1 箇所を変更する。
|
|
35
|
+
* design ↔ requirements §3.1 の同期を保つために export 公開する。
|
|
36
|
+
*/
|
|
37
|
+
export declare const CLASS_CARRIER_PROP_NAMES: readonly ["css"];
|
|
38
|
+
/**
|
|
39
|
+
* CSS class name フラグメント用に varName を正規化する。
|
|
40
|
+
* - lower-case 化
|
|
41
|
+
* - [a-z0-9-] 以外を `-` に置換
|
|
42
|
+
* - 連続する `-` を 1 つに畳む
|
|
43
|
+
* - 端の `-` を除去
|
|
44
|
+
* - 24 文字で切り詰め(末尾 `-` は再除去)
|
|
45
|
+
* - 結果が空なら空文字列を返す
|
|
46
|
+
*/
|
|
47
|
+
export declare function sanitizeVarName(raw: string): string;
|
|
48
|
+
/**
|
|
49
|
+
* theme.class(...) CallExpression に対して 3-tier 戦略で varName を解決する。
|
|
50
|
+
* 抽出不能時、または sanitize 後に空文字列になる場合は undefined を返す。
|
|
51
|
+
*/
|
|
52
|
+
export declare function resolveVarName(callExpr: ts.CallExpression, sourceFile: ts.SourceFile, _checker: ts.TypeChecker): string | undefined;
|
|
53
|
+
//# sourceMappingURL=varname-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"varname-resolver.d.ts","sourceRoot":"","sources":["../../src/transformer/varname-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,kBAAmB,CAAC;AAIzD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAWnD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,EAAE,CAAC,cAAc,EAC3B,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,QAAQ,EAAE,EAAE,CAAC,WAAW,GACvB,MAAM,GAAG,SAAS,CAQpB"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.CLASS_CARRIER_PROP_NAMES = void 0;
|
|
37
|
+
exports.sanitizeVarName = sanitizeVarName;
|
|
38
|
+
exports.resolveVarName = resolveVarName;
|
|
39
|
+
const ts = __importStar(require("typescript"));
|
|
40
|
+
/**
|
|
41
|
+
* varname-resolver
|
|
42
|
+
* =================
|
|
43
|
+
*
|
|
44
|
+
* `theme.class(...)` の CallExpression に対して、ビルド時に AST 文脈から
|
|
45
|
+
* 「この呼び出しがどのような名前を持つ場所に書かれているか」を読み取り、
|
|
46
|
+
* scoped CSS class name に埋め込むためのラベル文字列(varName)を返す。
|
|
47
|
+
*
|
|
48
|
+
* 戦略は 3 階層で、上から順に評価し、最初に該当した tier の結果を採用する。
|
|
49
|
+
*
|
|
50
|
+
* Tier 1 — declaration (requirements §1, §2)
|
|
51
|
+
* 親が `ts.VariableDeclaration` でその initializer が当該 callExpr の場合、
|
|
52
|
+
* 宣言名 (Identifier) を採用する。const / let / var は区別しない。
|
|
53
|
+
* 親チェーンを辿る必要はない(AST 上「直接の親」が最内の宣言である)。
|
|
54
|
+
*
|
|
55
|
+
* Tier 2 — class carrier prop (requirements §3.1, §3.3)
|
|
56
|
+
* 親が `ts.PropertyAssignment` でその value が当該 callExpr、かつ prop 名が
|
|
57
|
+
* `CLASS_CARRIER_PROP_NAMES` に含まれる場合のみ発動。
|
|
58
|
+
* prop 名自体は varName に採用せず、以下の優先順位で fallback ラベルを合成する:
|
|
59
|
+
* (a) 同じ ObjectLiteralExpression 内の `id` / `name` / `data-testid` 文字列リテラル
|
|
60
|
+
* (b) 親 factory 呼び出しのタグ名と役割属性(`button` / `input` の `type`)
|
|
61
|
+
* (c) いずれも該当しない場合は undefined を返し、Tier 3 へフォールスルー
|
|
62
|
+
*
|
|
63
|
+
* Tier 3 — function argument (requirements §3.4, §3.5)
|
|
64
|
+
* 親が `ts.CallExpression` で当該 callExpr がその引数の 1 つの場合、
|
|
65
|
+
* 親呼び出しの関数名(Identifier / PropertyAccessExpression の末尾 name)を採用。
|
|
66
|
+
*
|
|
67
|
+
* すべての出力は `sanitizeVarName` で正規化・24 文字制限を経由する。
|
|
68
|
+
* 正規化結果が空文字列になる場合は undefined を返す。
|
|
69
|
+
*/
|
|
70
|
+
/**
|
|
71
|
+
* Tier 2 で「class carrier」と認識する prop 名集合。
|
|
72
|
+
* 将来 `style` や `cssClass` などが追加された場合はここ 1 箇所を変更する。
|
|
73
|
+
* design ↔ requirements §3.1 の同期を保つために export 公開する。
|
|
74
|
+
*/
|
|
75
|
+
exports.CLASS_CARRIER_PROP_NAMES = ['css'];
|
|
76
|
+
const SIBLING_LABEL_PROP_PRIORITY = ['id', 'name', 'data-testid'];
|
|
77
|
+
/**
|
|
78
|
+
* CSS class name フラグメント用に varName を正規化する。
|
|
79
|
+
* - lower-case 化
|
|
80
|
+
* - [a-z0-9-] 以外を `-` に置換
|
|
81
|
+
* - 連続する `-` を 1 つに畳む
|
|
82
|
+
* - 端の `-` を除去
|
|
83
|
+
* - 24 文字で切り詰め(末尾 `-` は再除去)
|
|
84
|
+
* - 結果が空なら空文字列を返す
|
|
85
|
+
*/
|
|
86
|
+
function sanitizeVarName(raw) {
|
|
87
|
+
if (!raw)
|
|
88
|
+
return '';
|
|
89
|
+
let s = raw.toLowerCase();
|
|
90
|
+
s = s.replace(/[^a-z0-9-]/g, '-');
|
|
91
|
+
s = s.replace(/-+/g, '-');
|
|
92
|
+
s = s.replace(/^-+|-+$/g, '');
|
|
93
|
+
if (s.length > 24) {
|
|
94
|
+
s = s.slice(0, 24);
|
|
95
|
+
s = s.replace(/-+$/g, '');
|
|
96
|
+
}
|
|
97
|
+
return s;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* theme.class(...) CallExpression に対して 3-tier 戦略で varName を解決する。
|
|
101
|
+
* 抽出不能時、または sanitize 後に空文字列になる場合は undefined を返す。
|
|
102
|
+
*/
|
|
103
|
+
function resolveVarName(callExpr, sourceFile, _checker) {
|
|
104
|
+
var _a, _b;
|
|
105
|
+
const raw = (_b = (_a = tryTier1(callExpr, sourceFile)) !== null && _a !== void 0 ? _a : tryTier2(callExpr, sourceFile)) !== null && _b !== void 0 ? _b : tryTier3(callExpr, sourceFile);
|
|
106
|
+
if (raw === undefined)
|
|
107
|
+
return undefined;
|
|
108
|
+
const sanitized = sanitizeVarName(raw);
|
|
109
|
+
return sanitized.length > 0 ? sanitized : undefined;
|
|
110
|
+
}
|
|
111
|
+
// ----- Tier 1 ---------------------------------------------------------------
|
|
112
|
+
function tryTier1(callExpr, sourceFile) {
|
|
113
|
+
const parent = callExpr.parent;
|
|
114
|
+
if (!parent || !ts.isVariableDeclaration(parent))
|
|
115
|
+
return undefined;
|
|
116
|
+
if (parent.initializer !== callExpr)
|
|
117
|
+
return undefined;
|
|
118
|
+
if (!ts.isIdentifier(parent.name))
|
|
119
|
+
return undefined;
|
|
120
|
+
return parent.name.getText(sourceFile);
|
|
121
|
+
}
|
|
122
|
+
// ----- Tier 2 ---------------------------------------------------------------
|
|
123
|
+
function tryTier2(callExpr, sourceFile) {
|
|
124
|
+
const propAssign = callExpr.parent;
|
|
125
|
+
if (!propAssign || !ts.isPropertyAssignment(propAssign))
|
|
126
|
+
return undefined;
|
|
127
|
+
if (propAssign.initializer !== callExpr)
|
|
128
|
+
return undefined;
|
|
129
|
+
const propName = getPropertyName(propAssign);
|
|
130
|
+
if (propName === undefined)
|
|
131
|
+
return undefined;
|
|
132
|
+
if (!exports.CLASS_CARRIER_PROP_NAMES.includes(propName)) {
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
const objLit = propAssign.parent;
|
|
136
|
+
if (!objLit || !ts.isObjectLiteralExpression(objLit))
|
|
137
|
+
return undefined;
|
|
138
|
+
// (a) Sibling label props
|
|
139
|
+
const sibling = scanSiblingLabelProps(objLit, sourceFile);
|
|
140
|
+
if (sibling !== undefined)
|
|
141
|
+
return sibling;
|
|
142
|
+
// (b) Parent factory tag + role attribute
|
|
143
|
+
const factoryLabel = tryFactoryRoleLabel(objLit, sourceFile);
|
|
144
|
+
if (factoryLabel !== undefined)
|
|
145
|
+
return factoryLabel;
|
|
146
|
+
// (c) Fall through to Tier 3
|
|
147
|
+
return undefined;
|
|
148
|
+
}
|
|
149
|
+
function getPropertyName(prop) {
|
|
150
|
+
const name = prop.name;
|
|
151
|
+
if (ts.isIdentifier(name))
|
|
152
|
+
return name.text;
|
|
153
|
+
if (ts.isStringLiteral(name))
|
|
154
|
+
return name.text;
|
|
155
|
+
if (ts.isNoSubstitutionTemplateLiteral(name))
|
|
156
|
+
return name.text;
|
|
157
|
+
return undefined;
|
|
158
|
+
}
|
|
159
|
+
function getStringLiteralValue(node) {
|
|
160
|
+
if (ts.isStringLiteral(node))
|
|
161
|
+
return node.text;
|
|
162
|
+
if (ts.isNoSubstitutionTemplateLiteral(node))
|
|
163
|
+
return node.text;
|
|
164
|
+
return undefined;
|
|
165
|
+
}
|
|
166
|
+
function scanSiblingLabelProps(objLit, _sourceFile) {
|
|
167
|
+
for (const target of SIBLING_LABEL_PROP_PRIORITY) {
|
|
168
|
+
for (const member of objLit.properties) {
|
|
169
|
+
if (!ts.isPropertyAssignment(member))
|
|
170
|
+
continue;
|
|
171
|
+
const name = getPropertyName(member);
|
|
172
|
+
if (name !== target)
|
|
173
|
+
continue;
|
|
174
|
+
const value = getStringLiteralValue(member.initializer);
|
|
175
|
+
if (value !== undefined && value.length > 0) {
|
|
176
|
+
return value;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return undefined;
|
|
181
|
+
}
|
|
182
|
+
function tryFactoryRoleLabel(objLit, _sourceFile) {
|
|
183
|
+
const parent = objLit.parent;
|
|
184
|
+
if (!parent || !ts.isCallExpression(parent))
|
|
185
|
+
return undefined;
|
|
186
|
+
if (parent.arguments.length === 0 || parent.arguments[0] !== objLit) {
|
|
187
|
+
return undefined;
|
|
188
|
+
}
|
|
189
|
+
const tag = extractTagName(parent.expression);
|
|
190
|
+
if (tag === undefined)
|
|
191
|
+
return undefined;
|
|
192
|
+
if (tag === 'button' || tag === 'input') {
|
|
193
|
+
for (const member of objLit.properties) {
|
|
194
|
+
if (!ts.isPropertyAssignment(member))
|
|
195
|
+
continue;
|
|
196
|
+
if (getPropertyName(member) !== 'type')
|
|
197
|
+
continue;
|
|
198
|
+
const value = getStringLiteralValue(member.initializer);
|
|
199
|
+
if (value !== undefined && value.length > 0)
|
|
200
|
+
return value;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return undefined;
|
|
204
|
+
}
|
|
205
|
+
function extractTagName(expr) {
|
|
206
|
+
if (ts.isIdentifier(expr))
|
|
207
|
+
return expr.text;
|
|
208
|
+
if (ts.isPropertyAccessExpression(expr))
|
|
209
|
+
return expr.name.text;
|
|
210
|
+
return undefined;
|
|
211
|
+
}
|
|
212
|
+
// ----- Tier 3 ---------------------------------------------------------------
|
|
213
|
+
function tryTier3(callExpr, _sourceFile) {
|
|
214
|
+
const parent = callExpr.parent;
|
|
215
|
+
if (!parent || !ts.isCallExpression(parent))
|
|
216
|
+
return undefined;
|
|
217
|
+
// callExpr must be an argument (not the callee itself).
|
|
218
|
+
if (parent.expression === callExpr)
|
|
219
|
+
return undefined;
|
|
220
|
+
let isArg = false;
|
|
221
|
+
for (const arg of parent.arguments) {
|
|
222
|
+
if (arg === callExpr) {
|
|
223
|
+
isArg = true;
|
|
224
|
+
break;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
if (!isArg)
|
|
228
|
+
return undefined;
|
|
229
|
+
return extractTagName(parent.expression);
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=varname-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"varname-resolver.js","sourceRoot":"","sources":["../../src/transformer/varname-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* whitelist-registry — ホワイトリストのデータ駆動定義
|
|
3
|
+
*
|
|
4
|
+
* Task 5.1: BUILTIN_GLOBALS 表と FORBIDDEN_SYNTAX 表を export const で定義する。
|
|
5
|
+
* テスト・validator・ドキュメントはこのモジュールの定数を直接参照することで、
|
|
6
|
+
* ホワイトリスト定義の「真実の源泉は 1 つ」原則(Design D-6)を実現する。
|
|
7
|
+
*
|
|
8
|
+
* - BUILTIN_GLOBALS: ハンドラ本体から参照可能な組み込みグローバル識別子の表
|
|
9
|
+
* - FORBIDDEN_SYNTAX: ハンドラ本体で禁止される TypeScript AST SyntaxKind の表
|
|
10
|
+
*
|
|
11
|
+
* 対応 requirements: 3.1, 3.7
|
|
12
|
+
* 対応 design: WhitelistRegistry, D-6
|
|
13
|
+
*/
|
|
14
|
+
import * as ts from 'typescript';
|
|
15
|
+
/**
|
|
16
|
+
* ホワイトリストエントリ。
|
|
17
|
+
* tag に基づいて validator が参照する種別を識別する。
|
|
18
|
+
*/
|
|
19
|
+
export interface WhitelistEntry {
|
|
20
|
+
readonly tag: 'builtin-global' | 'builtin-method';
|
|
21
|
+
/** 識別子名(ルート識別子の名前) */
|
|
22
|
+
readonly name: string;
|
|
23
|
+
/** 許可する静的メソッド名(省略時はオブジェクト自体の参照のみ許可) */
|
|
24
|
+
readonly children?: readonly string[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* ハンドラ本体で参照可能な組み込みグローバル識別子の表。
|
|
28
|
+
*
|
|
29
|
+
* ホワイトリスト検査は「ルート識別子」のみを対象とする(Design D-1, Req 3.4)。
|
|
30
|
+
* children はドキュメント・IDE ヒント用であり、検査の対象外(チェーン先は検査しない)。
|
|
31
|
+
*
|
|
32
|
+
* 許可根拠(Req 3.1「純粋ビルトイン」):
|
|
33
|
+
* String, Number, Boolean — プリミティブラッパー型変換
|
|
34
|
+
* Array / Array.isArray / Array.from / Array.of — 配列操作
|
|
35
|
+
* Math — 数値演算(Math.floor, Math.max 等)
|
|
36
|
+
* JSON — シリアライズ(JSON.stringify, JSON.parse)
|
|
37
|
+
* Object — オブジェクト操作(Object.keys, Object.values 等)
|
|
38
|
+
*/
|
|
39
|
+
export declare const BUILTIN_GLOBALS: readonly WhitelistEntry[];
|
|
40
|
+
/**
|
|
41
|
+
* ハンドラ本体で禁止される TypeScript AST の SyntaxKind 表。
|
|
42
|
+
*
|
|
43
|
+
* whitelist-validator はハンドラ AST を走査し、この表に含まれる SyntaxKind を
|
|
44
|
+
* 発見した場合に ts.Diagnostic error を生成してビルドを停止する(Req 4.8)。
|
|
45
|
+
*
|
|
46
|
+
* 禁止根拠:
|
|
47
|
+
* AwaitExpression — async/await はシリアライズ対象外(Req 4.8, Boundary §対象外)
|
|
48
|
+
* YieldExpression — generator はシリアライズ対象外(同上)
|
|
49
|
+
* PostfixUnaryExpression — ++ / -- の後置演算子(副作用あり、Req 4.8)
|
|
50
|
+
* PrefixUnaryExpression — ++ / -- の前置演算子(副作用あり、Req 4.8)
|
|
51
|
+
* Decorator — デコレータはシリアライズ対象外(Req 4.8)
|
|
52
|
+
*
|
|
53
|
+
* 注意: PrefixUnaryExpression は ! (論理否定) や - (単項マイナス) も含むが、
|
|
54
|
+
* whitelist-validator 側で演算子種別(SyntaxKind.PlusPlusToken など)を
|
|
55
|
+
* 確認してから違反判定する。ここでは種別登録のみ行う。
|
|
56
|
+
*/
|
|
57
|
+
export declare const FORBIDDEN_SYNTAX: readonly ts.SyntaxKind[];
|
|
58
|
+
/**
|
|
59
|
+
* 識別子名が BUILTIN_GLOBALS に含まれるかを返す。
|
|
60
|
+
* whitelist-validator から呼び出す。
|
|
61
|
+
*/
|
|
62
|
+
export declare function isBuiltinGlobal(name: string): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* SyntaxKind が FORBIDDEN_SYNTAX に含まれるかを返す。
|
|
65
|
+
* whitelist-validator から呼び出す。
|
|
66
|
+
*/
|
|
67
|
+
export declare function isForbiddenSyntaxKind(kind: ts.SyntaxKind): boolean;
|
|
68
|
+
//# sourceMappingURL=whitelist-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whitelist-registry.d.ts","sourceRoot":"","sources":["../../src/transformer/whitelist-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAIjC;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,gBAAgB,GAAG,gBAAgB,CAAC;IAClD,sBAAsB;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uCAAuC;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AAID;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,cAAc,EAcpD,CAAC;AAIF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,EAAE,CAAC,UAAU,EAMpD,CAAC;AAIF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,GAAG,OAAO,CAElE"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* whitelist-registry — ホワイトリストのデータ駆動定義
|
|
4
|
+
*
|
|
5
|
+
* Task 5.1: BUILTIN_GLOBALS 表と FORBIDDEN_SYNTAX 表を export const で定義する。
|
|
6
|
+
* テスト・validator・ドキュメントはこのモジュールの定数を直接参照することで、
|
|
7
|
+
* ホワイトリスト定義の「真実の源泉は 1 つ」原則(Design D-6)を実現する。
|
|
8
|
+
*
|
|
9
|
+
* - BUILTIN_GLOBALS: ハンドラ本体から参照可能な組み込みグローバル識別子の表
|
|
10
|
+
* - FORBIDDEN_SYNTAX: ハンドラ本体で禁止される TypeScript AST SyntaxKind の表
|
|
11
|
+
*
|
|
12
|
+
* 対応 requirements: 3.1, 3.7
|
|
13
|
+
* 対応 design: WhitelistRegistry, D-6
|
|
14
|
+
*/
|
|
15
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
18
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
19
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
20
|
+
}
|
|
21
|
+
Object.defineProperty(o, k2, desc);
|
|
22
|
+
}) : (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
o[k2] = m[k];
|
|
25
|
+
}));
|
|
26
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
27
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
28
|
+
}) : function(o, v) {
|
|
29
|
+
o["default"] = v;
|
|
30
|
+
});
|
|
31
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
32
|
+
var ownKeys = function(o) {
|
|
33
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
34
|
+
var ar = [];
|
|
35
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
36
|
+
return ar;
|
|
37
|
+
};
|
|
38
|
+
return ownKeys(o);
|
|
39
|
+
};
|
|
40
|
+
return function (mod) {
|
|
41
|
+
if (mod && mod.__esModule) return mod;
|
|
42
|
+
var result = {};
|
|
43
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
44
|
+
__setModuleDefault(result, mod);
|
|
45
|
+
return result;
|
|
46
|
+
};
|
|
47
|
+
})();
|
|
48
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
+
exports.FORBIDDEN_SYNTAX = exports.BUILTIN_GLOBALS = void 0;
|
|
50
|
+
exports.isBuiltinGlobal = isBuiltinGlobal;
|
|
51
|
+
exports.isForbiddenSyntaxKind = isForbiddenSyntaxKind;
|
|
52
|
+
const ts = __importStar(require("typescript"));
|
|
53
|
+
// ---- BUILTIN_GLOBALS --------------------------------------------------------
|
|
54
|
+
/**
|
|
55
|
+
* ハンドラ本体で参照可能な組み込みグローバル識別子の表。
|
|
56
|
+
*
|
|
57
|
+
* ホワイトリスト検査は「ルート識別子」のみを対象とする(Design D-1, Req 3.4)。
|
|
58
|
+
* children はドキュメント・IDE ヒント用であり、検査の対象外(チェーン先は検査しない)。
|
|
59
|
+
*
|
|
60
|
+
* 許可根拠(Req 3.1「純粋ビルトイン」):
|
|
61
|
+
* String, Number, Boolean — プリミティブラッパー型変換
|
|
62
|
+
* Array / Array.isArray / Array.from / Array.of — 配列操作
|
|
63
|
+
* Math — 数値演算(Math.floor, Math.max 等)
|
|
64
|
+
* JSON — シリアライズ(JSON.stringify, JSON.parse)
|
|
65
|
+
* Object — オブジェクト操作(Object.keys, Object.values 等)
|
|
66
|
+
*/
|
|
67
|
+
exports.BUILTIN_GLOBALS = [
|
|
68
|
+
{ tag: 'builtin-global', name: 'String' },
|
|
69
|
+
{ tag: 'builtin-global', name: 'Number' },
|
|
70
|
+
{ tag: 'builtin-global', name: 'Boolean' },
|
|
71
|
+
{ tag: 'builtin-global', name: 'Array', children: ['isArray', 'from', 'of'] },
|
|
72
|
+
{ tag: 'builtin-global', name: 'Math' },
|
|
73
|
+
{ tag: 'builtin-global', name: 'JSON', children: ['stringify', 'parse'] },
|
|
74
|
+
{ tag: 'builtin-global', name: 'Object', children: ['keys', 'values', 'entries', 'assign'] },
|
|
75
|
+
// console はデバッグ用として許可(Req 3.1「純粋ビルトイン」の補足)
|
|
76
|
+
{ tag: 'builtin-global', name: 'console' },
|
|
77
|
+
// ブラウザ組み込みダイアログ(confirm / alert / prompt)はハンドラ内で常用される
|
|
78
|
+
{ tag: 'builtin-global', name: 'confirm' },
|
|
79
|
+
{ tag: 'builtin-global', name: 'alert' },
|
|
80
|
+
{ tag: 'builtin-global', name: 'prompt' },
|
|
81
|
+
];
|
|
82
|
+
// ---- FORBIDDEN_SYNTAX -------------------------------------------------------
|
|
83
|
+
/**
|
|
84
|
+
* ハンドラ本体で禁止される TypeScript AST の SyntaxKind 表。
|
|
85
|
+
*
|
|
86
|
+
* whitelist-validator はハンドラ AST を走査し、この表に含まれる SyntaxKind を
|
|
87
|
+
* 発見した場合に ts.Diagnostic error を生成してビルドを停止する(Req 4.8)。
|
|
88
|
+
*
|
|
89
|
+
* 禁止根拠:
|
|
90
|
+
* AwaitExpression — async/await はシリアライズ対象外(Req 4.8, Boundary §対象外)
|
|
91
|
+
* YieldExpression — generator はシリアライズ対象外(同上)
|
|
92
|
+
* PostfixUnaryExpression — ++ / -- の後置演算子(副作用あり、Req 4.8)
|
|
93
|
+
* PrefixUnaryExpression — ++ / -- の前置演算子(副作用あり、Req 4.8)
|
|
94
|
+
* Decorator — デコレータはシリアライズ対象外(Req 4.8)
|
|
95
|
+
*
|
|
96
|
+
* 注意: PrefixUnaryExpression は ! (論理否定) や - (単項マイナス) も含むが、
|
|
97
|
+
* whitelist-validator 側で演算子種別(SyntaxKind.PlusPlusToken など)を
|
|
98
|
+
* 確認してから違反判定する。ここでは種別登録のみ行う。
|
|
99
|
+
*/
|
|
100
|
+
exports.FORBIDDEN_SYNTAX = [
|
|
101
|
+
ts.SyntaxKind.AwaitExpression,
|
|
102
|
+
ts.SyntaxKind.YieldExpression,
|
|
103
|
+
ts.SyntaxKind.PostfixUnaryExpression, // ++ / -- (後置)
|
|
104
|
+
ts.SyntaxKind.PrefixUnaryExpression, // ++ / -- (前置)
|
|
105
|
+
ts.SyntaxKind.Decorator, // デコレータ(Req 4.8)
|
|
106
|
+
];
|
|
107
|
+
// ---- ヘルパー関数 ------------------------------------------------------------
|
|
108
|
+
/**
|
|
109
|
+
* 識別子名が BUILTIN_GLOBALS に含まれるかを返す。
|
|
110
|
+
* whitelist-validator から呼び出す。
|
|
111
|
+
*/
|
|
112
|
+
function isBuiltinGlobal(name) {
|
|
113
|
+
return exports.BUILTIN_GLOBALS.some((entry) => entry.name === name);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* SyntaxKind が FORBIDDEN_SYNTAX に含まれるかを返す。
|
|
117
|
+
* whitelist-validator から呼び出す。
|
|
118
|
+
*/
|
|
119
|
+
function isForbiddenSyntaxKind(kind) {
|
|
120
|
+
return exports.FORBIDDEN_SYNTAX.includes(kind);
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=whitelist-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whitelist-registry.js","sourceRoot":"","sources":["../../src/transformer/whitelist-registry.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkFH,0CAEC;AAMD,sDAEC;AA1FD,+CAAiC;AAgBjC,gFAAgF;AAEhF;;;;;;;;;;;;GAYG;AACU,QAAA,eAAe,GAA8B;IACxD,EAAE,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE;IACzC,EAAE,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE;IACzC,EAAE,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,EAAE;IAC1C,EAAE,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAC7E,EAAE,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE;IACvC,EAAE,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE;IACzE,EAAE,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE;IAC5F,2CAA2C;IAC3C,EAAE,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,EAAE;IAC1C,sDAAsD;IACtD,EAAE,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,EAAE;IAC1C,EAAE,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,OAAO,EAAE;IACxC,EAAE,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE;CAC1C,CAAC;AAEF,gFAAgF;AAEhF;;;;;;;;;;;;;;;;GAgBG;AACU,QAAA,gBAAgB,GAA6B;IACxD,EAAE,CAAC,UAAU,CAAC,eAAe;IAC7B,EAAE,CAAC,UAAU,CAAC,eAAe;IAC7B,EAAE,CAAC,UAAU,CAAC,sBAAsB,EAAE,eAAe;IACrD,EAAE,CAAC,UAAU,CAAC,qBAAqB,EAAG,eAAe;IACrD,EAAE,CAAC,UAAU,CAAC,SAAS,EAAe,iBAAiB;CACxD,CAAC;AAEF,2EAA2E;AAE3E;;;GAGG;AACH,SAAgB,eAAe,CAAC,IAAY;IAC1C,OAAO,uBAAe,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC9D,CAAC;AAED;;;GAGG;AACH,SAAgB,qBAAqB,CAAC,IAAmB;IACvD,OAAQ,wBAAsC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* whitelist-validator — ルート識別子・構文の検査
|
|
3
|
+
*
|
|
4
|
+
* Task 5.2:
|
|
5
|
+
* - `validateHandler(ir, refs, program, sourceFile, extraWhitelist?)` を export
|
|
6
|
+
* - 各 IdentifierRef を TypeChecker で型判定し `IdentifierKind` に分類
|
|
7
|
+
* 1. state/state-handle: DraftoleStateMarker プロパティの有無で判定
|
|
8
|
+
* 2. event-param: HandlerIR.paramName との一致
|
|
9
|
+
* 3. local: HandlerIR.localDecls との一致
|
|
10
|
+
* 4. builtin: BUILTIN_GLOBALS 照合(console を含む)
|
|
11
|
+
* 5. extraWhitelist: 追加ホワイトリスト識別子
|
|
12
|
+
* - unknown 検出時は ts.Diagnostic error を蓄積(全件走査)
|
|
13
|
+
*
|
|
14
|
+
* Task 5.3:
|
|
15
|
+
* - 二次コールバック再帰検査
|
|
16
|
+
* - .map(inner => ...) / .update(inner => ...) / .each(inner => ...) の
|
|
17
|
+
* 内部 ArrowFunction も同規則で検査
|
|
18
|
+
* - 内部アロー引数は event-param ではなく local として扱う
|
|
19
|
+
*
|
|
20
|
+
* 対応 requirements: 3.1, 3.2, 3.4, 3.5, 3.6
|
|
21
|
+
* 対応 design: whitelist-validator, D-1, D-7
|
|
22
|
+
*/
|
|
23
|
+
import * as ts from 'typescript';
|
|
24
|
+
import type { HandlerIR, IdentifierRef } from './handler-ir-extractor.ts';
|
|
25
|
+
/**
|
|
26
|
+
* `validateHandler` の任意オプション。
|
|
27
|
+
*
|
|
28
|
+
* Task 3.3 (TXDX-DX):
|
|
29
|
+
* - `paramSymbols` を helper-aware な each-scope param Symbol 集合として受け取り、
|
|
30
|
+
* `checker.getSymbolAtLocation(node)` が当該集合に含まれる識別子は
|
|
31
|
+
* each-scope 内参照として許可する。
|
|
32
|
+
* - helper 経由で `.each(item => helper())` の helper body 内 `item.set(...)` を
|
|
33
|
+
* unknown 識別子として誤拒否しないために使用する。
|
|
34
|
+
* - 直接 enclosing `.each` 経路でも同じ集合 (call-site の itemParam Symbol) を渡す
|
|
35
|
+
* ことで分岐ロジックを統一する。
|
|
36
|
+
* - 集合は inner-callback 再帰 (`.map/.update/.each` の内側 ArrowFunction) にも
|
|
37
|
+
* 継承される (helper-aware case (b) を inner-callback 内で誤拒否させない)。
|
|
38
|
+
*/
|
|
39
|
+
export interface ValidateHandlerOptions {
|
|
40
|
+
/** helper-aware で構築された each-scope param Symbol 集合 (Task 3.3) */
|
|
41
|
+
readonly paramSymbols?: ReadonlySet<ts.Symbol>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* ハンドラ内の識別子参照リストを検証し、unknown な識別子に対して
|
|
45
|
+
* `ts.Diagnostic` エラーを返す。
|
|
46
|
+
*
|
|
47
|
+
* - IdentifierRef の各要素を順番に判定する(全件走査)
|
|
48
|
+
* - unknown 検出時は即終了せず蓄積して全件返す(Req 2.7)
|
|
49
|
+
*
|
|
50
|
+
* @param ir HandlerIR(paramName / localDecls を使用)
|
|
51
|
+
* @param refs collectIdentifiers が返した IdentifierRef[]
|
|
52
|
+
* @param program ts.Program(TypeChecker 取得に使用)
|
|
53
|
+
* @param sourceFile 対象ソースファイル(診断情報の位置用)
|
|
54
|
+
* @param extraWhitelist 追加ホワイトリスト識別子(DraftoleTransformerOptions.extraWhitelist)
|
|
55
|
+
* @param options 任意オプション (Task 3.3: helper-aware paramSymbols 等)
|
|
56
|
+
* @returns unknown 識別子に対する ts.Diagnostic[](PASS なら空配列)
|
|
57
|
+
*/
|
|
58
|
+
export declare function validateHandler(ir: HandlerIR, refs: IdentifierRef[], program: ts.Program, sourceFile: ts.SourceFile, extraWhitelist?: readonly string[], options?: ValidateHandlerOptions): ts.Diagnostic[];
|
|
59
|
+
//# sourceMappingURL=whitelist-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whitelist-validator.d.ts","sourceRoot":"","sources":["../../src/transformer/whitelist-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAyW1E;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,sBAAsB;IACrC,gEAAgE;IAChE,QAAQ,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;CAChD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,SAAS,EACb,IAAI,EAAE,aAAa,EAAE,EACrB,OAAO,EAAE,EAAE,CAAC,OAAO,EACnB,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,EAClC,OAAO,CAAC,EAAE,sBAAsB,GAC/B,EAAE,CAAC,UAAU,EAAE,CAiGjB"}
|