@no22/dison 1.0.0 → 1.1.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/README.md +36 -9
- package/dist/analysis.d.ts +10 -0
- package/dist/analysis.d.ts.map +1 -1
- package/dist/analysis.js +109 -4
- package/dist/analysis.js.map +1 -1
- package/dist/cli.js +16 -2
- package/dist/cli.js.map +1 -1
- package/dist/codegen.d.ts +14 -1
- package/dist/codegen.d.ts.map +1 -1
- package/dist/codegen.js +100 -19
- package/dist/codegen.js.map +1 -1
- package/dist/collisions.d.ts +33 -0
- package/dist/collisions.d.ts.map +1 -1
- package/dist/collisions.js +180 -2
- package/dist/collisions.js.map +1 -1
- package/dist/core.d.ts +34 -10
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +80 -15
- package/dist/core.js.map +1 -1
- package/dist/generated-runtime.d.ts +3 -3
- package/dist/generated-runtime.d.ts.map +1 -1
- package/dist/generated-runtime.js +12 -4
- package/dist/generated-runtime.js.map +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +25 -13
- package/dist/runtime.js.map +1 -1
- package/package.json +1 -1
package/dist/collisions.d.ts
CHANGED
|
@@ -2,10 +2,43 @@ export interface DisonFileInput {
|
|
|
2
2
|
path: string;
|
|
3
3
|
source: string;
|
|
4
4
|
}
|
|
5
|
+
export interface CompanionImportInfo {
|
|
6
|
+
specifier: string;
|
|
7
|
+
originalName: string;
|
|
8
|
+
}
|
|
9
|
+
export interface CompanionPlan {
|
|
10
|
+
companionEmit: Set<string>;
|
|
11
|
+
companionImports: Map<string, CompanionImportInfo>;
|
|
12
|
+
}
|
|
5
13
|
export interface BindCollisionDiagnostic {
|
|
6
14
|
name: string;
|
|
7
15
|
message: string;
|
|
8
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* 複数ファイルモードで、各ファイルの `transpileDisonToTS` に渡す「実体キー化する
|
|
19
|
+
* 追加クラス識別子」の集合を計算する(docs/type-identity-matching.md 案A(a))。
|
|
20
|
+
*
|
|
21
|
+
* ローカル宣言の具象クラスは `transpileDisonToTS` 側が typeKinds から自動的に
|
|
22
|
+
* 実体キー化するため、ここには含めない。ここで返すのは「他のプロジェクトファイルから
|
|
23
|
+
* value-importされた具象クラスのローカル名」だけ。これにより、宣言元ファイル
|
|
24
|
+
* (ローカル実体キー化)と、それをimportして使う側ファイルの双方が、同じクラス実体を
|
|
25
|
+
* キーに使うようになり、複数ファイルモードでのキー食い違い(サイレントに bind が
|
|
26
|
+
* 効かなくなる回帰)を防ぐ。
|
|
27
|
+
*/
|
|
28
|
+
export declare function computeIdentityKeyClassesByFile(files: DisonFileInput[]): Map<string, Set<string>>;
|
|
29
|
+
/**
|
|
30
|
+
* 複数ファイルモードで、各ファイルの `transpileDisonToTS` に渡す companion 計画を
|
|
31
|
+
* 計算する(docs/type-identity-matching.md 案A(b)(c))。
|
|
32
|
+
*
|
|
33
|
+
* 真の interface/型エイリアスは実行時に値を持たないため、宣言ごとに一意な companion
|
|
34
|
+
* Symbol を自動生成してキーにする。emit は「プロジェクト内のどこかで DI利用される」
|
|
35
|
+
* ものだけに絞る(案2)。宣言元ファイルが companion を emit・export し、それを
|
|
36
|
+
* import して使う側ファイルには companion の import を注入する。
|
|
37
|
+
*
|
|
38
|
+
* 返り値: ファイルパス -> CompanionPlan(emit するローカル名の集合、import する
|
|
39
|
+
* 他ファイル由来 interface のローカル名 -> {specifier, 元名})。
|
|
40
|
+
*/
|
|
41
|
+
export declare function computeCompanionPlanByFile(files: DisonFileInput[]): Map<string, CompanionPlan>;
|
|
9
42
|
/**
|
|
10
43
|
* 複数の.disファイルを横断して、`bind`の左辺や`injectable`の型注釈に
|
|
11
44
|
* 使われている型名(クラス/interface/型エイリアスを問わない)の衝突を
|
package/dist/collisions.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collisions.d.ts","sourceRoot":"","sources":["../src/collisions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"collisions.d.ts","sourceRoot":"","sources":["../src/collisions.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,WAAW,aAAa;IAG5B,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAG3B,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAwFD;;;;;;;;;;GAUG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAOjG;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CA2D9F;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,uBAAuB,EAAE,CAiIrF"}
|
package/dist/collisions.js
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
// =====================================================================
|
|
4
4
|
import * as path from "path";
|
|
5
5
|
import { Lexer } from "./lexer.js";
|
|
6
|
-
import { collectDeclaredTypeKinds, collectImportOrigins, isSimpleTypeShape, baseIdentifierOf } from "./analysis.js";
|
|
6
|
+
import { collectDeclaredTypeKinds, collectImportOrigins, collectImportBindings, trueInterfaceOrAliasNames, identityKeyableClassNames, isSimpleTypeShape, baseIdentifierOf, } from "./analysis.js";
|
|
7
|
+
import { collectDiUsedTypeNames } from "./codegen.js";
|
|
7
8
|
import { Parser } from "./parser.js";
|
|
8
9
|
// ファイルパスを「絶対パス化し、拡張子を除いた」形に正規化する。
|
|
9
10
|
// findBindCollisionsで、あるファイルのローカル宣言と、それを相対パスで
|
|
@@ -14,6 +15,149 @@ function normalizeExtensionlessAbsolutePath(filePath) {
|
|
|
14
15
|
const ext = path.extname(abs);
|
|
15
16
|
return ext ? abs.slice(0, -ext.length) : abs;
|
|
16
17
|
}
|
|
18
|
+
// 全入力ファイルから「正規化パス -> そのファイルで宣言された実体キー化可能な
|
|
19
|
+
// クラス名(具象 + abstract)の集合」のインデックスを作る。value-importされた
|
|
20
|
+
// クラスの実体キー解決に使う。abstract class も実行時に値を持つので含める。
|
|
21
|
+
function buildProjectClassIndex(files) {
|
|
22
|
+
const index = new Map();
|
|
23
|
+
for (const file of files) {
|
|
24
|
+
const tokens = new Lexer(file.source).tokenize();
|
|
25
|
+
const kinds = collectDeclaredTypeKinds(tokens);
|
|
26
|
+
index.set(normalizeExtensionlessAbsolutePath(file.path), identityKeyableClassNames(kinds));
|
|
27
|
+
}
|
|
28
|
+
return index;
|
|
29
|
+
}
|
|
30
|
+
// 全入力ファイルから「正規化パス -> そのファイルで宣言された真の interface/型
|
|
31
|
+
// エイリアス名の集合」のインデックスを作る(abstract class は含めない=実体キー側)。
|
|
32
|
+
// companion Symbol でキー化する型のクロスファイル解決に使う(案A(b)(c))。
|
|
33
|
+
function buildProjectInterfaceIndex(files) {
|
|
34
|
+
const index = new Map();
|
|
35
|
+
for (const file of files) {
|
|
36
|
+
const tokens = new Lexer(file.source).tokenize();
|
|
37
|
+
const kinds = collectDeclaredTypeKinds(tokens);
|
|
38
|
+
index.set(normalizeExtensionlessAbsolutePath(file.path), trueInterfaceOrAliasNames(kinds));
|
|
39
|
+
}
|
|
40
|
+
return index;
|
|
41
|
+
}
|
|
42
|
+
// あるファイルが「他のプロジェクトファイルから import している真の interface/型
|
|
43
|
+
// エイリアス」を、ローカル名 -> {specifier, 元名} で返す。companion は値として別途
|
|
44
|
+
// import するため、interface 自体が型onlyインポート(import type)でも対象にする
|
|
45
|
+
// (実体キー化するクラスと違い、値importである必要がない。案A(b)(c))。
|
|
46
|
+
function importedProjectInterfaceLocalNames(file, interfaceIndex) {
|
|
47
|
+
const result = new Map();
|
|
48
|
+
const tokens = new Lexer(file.source).tokenize();
|
|
49
|
+
for (const imp of collectImportBindings(tokens)) {
|
|
50
|
+
if (!imp.specifier.startsWith("."))
|
|
51
|
+
continue; // 外部パッケージは companion が無いので対象外
|
|
52
|
+
const resolved = normalizeExtensionlessAbsolutePath(path.resolve(path.dirname(file.path), imp.specifier));
|
|
53
|
+
const interfaces = interfaceIndex.get(resolved);
|
|
54
|
+
if (interfaces && interfaces.has(imp.importedName)) {
|
|
55
|
+
result.set(imp.localName, { specifier: imp.specifier, originalName: imp.importedName });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
// あるファイルが「他のプロジェクトファイルからvalue-importしている具象クラス」の
|
|
61
|
+
// ローカル名の集合を返す(型onlyインポートや外部パッケージ由来は除く)。
|
|
62
|
+
// 宣言元ファイルはそのクラスをローカル宣言として実体キー化するので、import側も
|
|
63
|
+
// 同じ実体(ES Modulesの共有束縛)を実体キーにすることで、複数ファイルにまたがる
|
|
64
|
+
// bind/injectableが同じキーで一致する(docs/type-identity-matching.md 案A(a))。
|
|
65
|
+
function importedProjectClassLocalNames(file, classIndex) {
|
|
66
|
+
const names = new Set();
|
|
67
|
+
const tokens = new Lexer(file.source).tokenize();
|
|
68
|
+
for (const imp of collectImportBindings(tokens)) {
|
|
69
|
+
if (imp.typeOnly)
|
|
70
|
+
continue; // 型onlyインポートは実行時に値が無く実体キーに使えない
|
|
71
|
+
if (!imp.specifier.startsWith("."))
|
|
72
|
+
continue; // 外部パッケージは解決しない
|
|
73
|
+
const resolved = normalizeExtensionlessAbsolutePath(path.resolve(path.dirname(file.path), imp.specifier));
|
|
74
|
+
const classes = classIndex.get(resolved);
|
|
75
|
+
if (classes && classes.has(imp.importedName))
|
|
76
|
+
names.add(imp.localName);
|
|
77
|
+
}
|
|
78
|
+
return names;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 複数ファイルモードで、各ファイルの `transpileDisonToTS` に渡す「実体キー化する
|
|
82
|
+
* 追加クラス識別子」の集合を計算する(docs/type-identity-matching.md 案A(a))。
|
|
83
|
+
*
|
|
84
|
+
* ローカル宣言の具象クラスは `transpileDisonToTS` 側が typeKinds から自動的に
|
|
85
|
+
* 実体キー化するため、ここには含めない。ここで返すのは「他のプロジェクトファイルから
|
|
86
|
+
* value-importされた具象クラスのローカル名」だけ。これにより、宣言元ファイル
|
|
87
|
+
* (ローカル実体キー化)と、それをimportして使う側ファイルの双方が、同じクラス実体を
|
|
88
|
+
* キーに使うようになり、複数ファイルモードでのキー食い違い(サイレントに bind が
|
|
89
|
+
* 効かなくなる回帰)を防ぐ。
|
|
90
|
+
*/
|
|
91
|
+
export function computeIdentityKeyClassesByFile(files) {
|
|
92
|
+
const classIndex = buildProjectClassIndex(files);
|
|
93
|
+
const result = new Map();
|
|
94
|
+
for (const file of files) {
|
|
95
|
+
result.set(file.path, importedProjectClassLocalNames(file, classIndex));
|
|
96
|
+
}
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* 複数ファイルモードで、各ファイルの `transpileDisonToTS` に渡す companion 計画を
|
|
101
|
+
* 計算する(docs/type-identity-matching.md 案A(b)(c))。
|
|
102
|
+
*
|
|
103
|
+
* 真の interface/型エイリアスは実行時に値を持たないため、宣言ごとに一意な companion
|
|
104
|
+
* Symbol を自動生成してキーにする。emit は「プロジェクト内のどこかで DI利用される」
|
|
105
|
+
* ものだけに絞る(案2)。宣言元ファイルが companion を emit・export し、それを
|
|
106
|
+
* import して使う側ファイルには companion の import を注入する。
|
|
107
|
+
*
|
|
108
|
+
* 返り値: ファイルパス -> CompanionPlan(emit するローカル名の集合、import する
|
|
109
|
+
* 他ファイル由来 interface のローカル名 -> {specifier, 元名})。
|
|
110
|
+
*/
|
|
111
|
+
export function computeCompanionPlanByFile(files) {
|
|
112
|
+
const interfaceIndex = buildProjectInterfaceIndex(files);
|
|
113
|
+
const pre = files.map((file) => {
|
|
114
|
+
const tokens = new Lexer(file.source).tokenize();
|
|
115
|
+
const kinds = collectDeclaredTypeKinds(tokens);
|
|
116
|
+
const ast = new Parser(tokens, kinds).parseProgram();
|
|
117
|
+
return {
|
|
118
|
+
file,
|
|
119
|
+
normPath: normalizeExtensionlessAbsolutePath(file.path),
|
|
120
|
+
localTrueInterfaces: trueInterfaceOrAliasNames(kinds),
|
|
121
|
+
importedInterfaces: importedProjectInterfaceLocalNames(file, interfaceIndex),
|
|
122
|
+
diUsed: collectDiUsedTypeNames(ast),
|
|
123
|
+
};
|
|
124
|
+
});
|
|
125
|
+
// プロジェクト全体で DI利用される interface/型エイリアスの「宣言」の集合
|
|
126
|
+
// (declKey = 正規化パス::元名)。ローカル利用・import 利用の両方から集める。
|
|
127
|
+
const globalDiUsedDecls = new Set();
|
|
128
|
+
for (const p of pre) {
|
|
129
|
+
for (const name of p.diUsed) {
|
|
130
|
+
if (p.localTrueInterfaces.has(name)) {
|
|
131
|
+
globalDiUsedDecls.add(`${p.normPath}::${name}`);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
const imp = p.importedInterfaces.get(name);
|
|
135
|
+
if (imp) {
|
|
136
|
+
const declPath = normalizeExtensionlessAbsolutePath(path.resolve(path.dirname(p.file.path), imp.specifier));
|
|
137
|
+
globalDiUsedDecls.add(`${declPath}::${imp.originalName}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const result = new Map();
|
|
143
|
+
for (const p of pre) {
|
|
144
|
+
// emit: このファイルのローカル真interfaceのうち、プロジェクト内のどこかで DI利用
|
|
145
|
+
// されるもの。
|
|
146
|
+
const companionEmit = new Set();
|
|
147
|
+
for (const name of p.localTrueInterfaces) {
|
|
148
|
+
if (globalDiUsedDecls.has(`${p.normPath}::${name}`))
|
|
149
|
+
companionEmit.add(name);
|
|
150
|
+
}
|
|
151
|
+
// import: このファイルで DI利用される、他ファイル由来の interface。
|
|
152
|
+
const companionImports = new Map();
|
|
153
|
+
for (const [localName, info] of p.importedInterfaces) {
|
|
154
|
+
if (p.diUsed.has(localName))
|
|
155
|
+
companionImports.set(localName, info);
|
|
156
|
+
}
|
|
157
|
+
result.set(p.file.path, { companionEmit, companionImports });
|
|
158
|
+
}
|
|
159
|
+
return result;
|
|
160
|
+
}
|
|
17
161
|
/**
|
|
18
162
|
* 複数の.disファイルを横断して、`bind`の左辺や`injectable`の型注釈に
|
|
19
163
|
* 使われている型名(クラス/interface/型エイリアスを問わない)の衝突を
|
|
@@ -32,11 +176,41 @@ function normalizeExtensionlessAbsolutePath(filePath) {
|
|
|
32
176
|
*/
|
|
33
177
|
export function findBindCollisions(files) {
|
|
34
178
|
const occurrencesByName = new Map();
|
|
179
|
+
// 実体キー化される具象/abstractクラス、および companion Symbol でキー化される
|
|
180
|
+
// interface/型エイリアスは、文字列キーの共有プールに載らないため衝突しない
|
|
181
|
+
// (前者は宣言ごとに別の実体、後者は宣言ごとに別の Symbol がキーになる)。よって
|
|
182
|
+
// 衝突検出の対象から除外する。残るのは文字列キーのまま(外部パッケージ由来の
|
|
183
|
+
// interface/型エイリアスなど、companion を import できないもの)だけ。
|
|
184
|
+
// (docs/type-identity-matching.md 案A(a)(b))。
|
|
185
|
+
const classIndex = buildProjectClassIndex(files);
|
|
186
|
+
const interfaceIndex = buildProjectInterfaceIndex(files);
|
|
35
187
|
for (const file of files) {
|
|
36
188
|
const tokens = new Lexer(file.source).tokenize();
|
|
37
189
|
const typeKinds = collectDeclaredTypeKinds(tokens);
|
|
38
190
|
const importOrigins = collectImportOrigins(tokens);
|
|
39
191
|
const ast = new Parser(tokens, typeKinds).parseProgram();
|
|
192
|
+
// このファイルで実体キー化される裸のクラス識別子(ローカル具象+abstract ∪
|
|
193
|
+
// value-importされたプロジェクトのクラス)。
|
|
194
|
+
const identityClasses = identityKeyableClassNames(typeKinds);
|
|
195
|
+
for (const n of importedProjectClassLocalNames(file, classIndex))
|
|
196
|
+
identityClasses.add(n);
|
|
197
|
+
// このファイルで companion Symbol でキー化される裸の interface/型エイリアス識別子
|
|
198
|
+
// (ローカル宣言の真interface ∪ 他プロジェクトファイル由来の import)。
|
|
199
|
+
const companionTypes = trueInterfaceOrAliasNames(typeKinds);
|
|
200
|
+
for (const localName of importedProjectInterfaceLocalNames(file, interfaceIndex).keys()) {
|
|
201
|
+
companionTypes.add(localName);
|
|
202
|
+
}
|
|
203
|
+
// 型が実体参照 or companion でキー化されるか(=文字列プールに載らず衝突対象外か)。
|
|
204
|
+
// キー化は「as トークンなし」かつ「ジェネリクスを含まない裸の識別子」のときだけ
|
|
205
|
+
// 効く。keyExprFor(codegen)と同じ条件。
|
|
206
|
+
const isNonStringKeyed = (typeKey, hasToken) => {
|
|
207
|
+
if (hasToken)
|
|
208
|
+
return false;
|
|
209
|
+
const base = baseIdentifierOf(typeKey);
|
|
210
|
+
if (base !== typeKey)
|
|
211
|
+
return false;
|
|
212
|
+
return identityClasses.has(base) || companionTypes.has(base);
|
|
213
|
+
};
|
|
40
214
|
const originOf = (name) => {
|
|
41
215
|
if (typeKinds.classNames.has(name) || typeKinds.nonNewableTypeNames.has(name)) {
|
|
42
216
|
return { key: `P::${normalizeExtensionlessAbsolutePath(file.path)}`, label: `local declaration in ${file.path}` };
|
|
@@ -74,12 +248,16 @@ export function findBindCollisions(files) {
|
|
|
74
248
|
occurrencesByName.set(name, list);
|
|
75
249
|
};
|
|
76
250
|
const visitBindEntry = (entry, describe) => {
|
|
251
|
+
// 実体キー or companion でキー化される bind 左辺は衝突しないので記録しない。
|
|
252
|
+
if (isNonStringKeyed(entry.originalTypeKey, entry.token !== undefined))
|
|
253
|
+
return;
|
|
77
254
|
const base = baseIdentifierOf(entry.originalTypeKey);
|
|
78
255
|
record(base, describe, entry.token !== undefined);
|
|
79
256
|
};
|
|
80
257
|
for (const node of ast) {
|
|
81
258
|
if (node.kind === "injectable") {
|
|
82
|
-
|
|
259
|
+
// 実体キー or companion でキー化される injectable 型は衝突しないので記録しない。
|
|
260
|
+
if (isSimpleTypeShape(node.typeKey) && !isNonStringKeyed(node.typeKey, node.token !== undefined)) {
|
|
83
261
|
record(baseIdentifierOf(node.typeKey), `injectable "${node.propName}"`, node.token !== undefined);
|
|
84
262
|
}
|
|
85
263
|
}
|
package/dist/collisions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collisions.js","sourceRoot":"","sources":["../src/collisions.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,0CAA0C;AAC1C,wEAAwE;AAExE,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,
|
|
1
|
+
{"version":3,"file":"collisions.js","sourceRoot":"","sources":["../src/collisions.ts"],"names":[],"mappings":"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"}
|
package/dist/core.d.ts
CHANGED
|
@@ -178,13 +178,34 @@
|
|
|
178
178
|
* 単独のoverride/bindは、`configuration`同様クラス本体の直下だけは
|
|
179
179
|
* 書けない(代入文を置ける位置ではないため)。
|
|
180
180
|
*
|
|
181
|
+
* bind/injectableの照合キー(型の種別で決まる):
|
|
182
|
+
* `bind`/`injectable`の照合キーは型の種別で決まる(docs/type-identity-matching.md
|
|
183
|
+
* 案A、codegenのkeyExprFor):
|
|
184
|
+
* - 実行時に値を持つクラス(具象 or abstract)→ クラスの実体(Function)。案A(a)。
|
|
185
|
+
* - 真の interface/型エイリアス(実行時に値が無い)→ 宣言ごとに自動生成した
|
|
186
|
+
* companion Symbol(__dison_token_<型名>)。案A(b)。
|
|
187
|
+
* - 外部パッケージ由来の型、または具体的な型引数を持つジェネリクス
|
|
188
|
+
* (Repository<User>)→ 正規化済みの型名文字列(typeKey)。
|
|
189
|
+
* - "as <トークン>"句があればそのトークン参照が最優先(利用者の明示上書き)。
|
|
190
|
+
* クラスの実体キー化は`override`の`DI_REGISTRY`(WeakMap<Function>)と同じ発想。
|
|
191
|
+
* クラス値・companion Symbol いずれも「複数ファイルにまたがる同名の型が別の実体
|
|
192
|
+
* として自動的に区別され、手動tokenなしで衝突しなくなる」のが狙い。複数ファイル
|
|
193
|
+
* モードでは、宣言側とimport側でキーが食い違わないよう、CLIが他ファイルから
|
|
194
|
+
* importされたクラス(実体キー)・interface/型エイリアス(companion)を解決して
|
|
195
|
+
* 各ファイルの transpile に渡す(computeIdentityKeyClassesByFile/
|
|
196
|
+
* computeCompanionPlanByFile)。companion は DI利用されるものだけ emit し、他ファイル
|
|
197
|
+
* の型を使う側にはその companion の import を注入する(案A(c))。
|
|
198
|
+
*
|
|
181
199
|
* bindのinterface/型エイリアス問題への対応("as <トークン>" / token):
|
|
182
|
-
*
|
|
183
|
-
*
|
|
184
|
-
*
|
|
185
|
-
*
|
|
186
|
-
*
|
|
187
|
-
*
|
|
200
|
+
* プロジェクト内で宣言される interface/型エイリアスは上記 companion で自動的に
|
|
201
|
+
* 衝突回避されるが、**外部パッケージ由来**の interface/型エイリアスは、そのパッケージが
|
|
202
|
+
* companion をexportしていないため自動配線できず、文字列キーのままになる。単一
|
|
203
|
+
* ファイルでは問題にならないが、複数ファイルで共有ランタイムモジュールを使う場合
|
|
204
|
+
* (docs/multi-file-support.md)、互いに無関係な2ファイルが同名の外部interfaceを
|
|
205
|
+
* 別パッケージから import しているだけで、一方の`bind`がもう一方を汚染してしまう
|
|
206
|
+
* (元々の再現例はローカル宣言だったが、それは companion で解消済み。
|
|
207
|
+
* docs/bind-interface-token.md 1節)。この残った外部型のケースに以下のtoken対応が
|
|
208
|
+
* 必要(docs/type-identity-matching.md 案A(b) の「残る境界」)。
|
|
188
209
|
*
|
|
189
210
|
* 対応として、`injectable`/`bind`の左辺に任意の `as <トークン>` 句を
|
|
190
211
|
* 追加できるようにした。トークンは`token Name;`という新しい構文
|
|
@@ -213,10 +234,13 @@
|
|
|
213
234
|
* -----------------------------------------------------------
|
|
214
235
|
*/
|
|
215
236
|
import { DISON_RUNTIME_MODULE_SOURCE } from "./runtime.js";
|
|
216
|
-
import { findBindCollisions } from "./collisions.js";
|
|
217
|
-
import type { DisonFileInput, BindCollisionDiagnostic } from "./collisions.js";
|
|
237
|
+
import { findBindCollisions, computeIdentityKeyClassesByFile, computeCompanionPlanByFile } from "./collisions.js";
|
|
238
|
+
import type { DisonFileInput, BindCollisionDiagnostic, CompanionImportInfo } from "./collisions.js";
|
|
218
239
|
export interface TranspileOptions {
|
|
219
240
|
runtimeModulePath?: string;
|
|
241
|
+
identityKeyClasses?: Iterable<string>;
|
|
242
|
+
companionEmit?: Iterable<string>;
|
|
243
|
+
companionImports?: Map<string, CompanionImportInfo>;
|
|
220
244
|
}
|
|
221
245
|
/**
|
|
222
246
|
* Dison言語のソースコードを受け取り、完全に動作するTypeScriptコードに変換する。
|
|
@@ -224,6 +248,6 @@ export interface TranspileOptions {
|
|
|
224
248
|
* トークナイザ+パーサを経由してもなお100%元の文字列のまま出力される。
|
|
225
249
|
*/
|
|
226
250
|
export declare function transpileDisonToTS(sourceCode: string, options?: TranspileOptions): string;
|
|
227
|
-
export { DISON_RUNTIME_MODULE_SOURCE, findBindCollisions };
|
|
228
|
-
export type { DisonFileInput, BindCollisionDiagnostic };
|
|
251
|
+
export { DISON_RUNTIME_MODULE_SOURCE, findBindCollisions, computeIdentityKeyClassesByFile, computeCompanionPlanByFile };
|
|
252
|
+
export type { DisonFileInput, BindCollisionDiagnostic, CompanionImportInfo };
|
|
229
253
|
//# sourceMappingURL=core.d.ts.map
|
package/dist/core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0OG;AAgBH,OAAO,EAA+B,2BAA2B,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,kBAAkB,EAAE,+BAA+B,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAClH,OAAO,KAAK,EAAE,cAAc,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEpG,MAAM,WAAW,gBAAgB;IAI/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAW3B,kBAAkB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAQtC,aAAa,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAMjC,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CACrD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAiE7F;AAID,OAAO,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,+BAA+B,EAAE,0BAA0B,EAAE,CAAC;AACxH,YAAY,EAAE,cAAc,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,CAAC"}
|
package/dist/core.js
CHANGED
|
@@ -178,13 +178,34 @@
|
|
|
178
178
|
* 単独のoverride/bindは、`configuration`同様クラス本体の直下だけは
|
|
179
179
|
* 書けない(代入文を置ける位置ではないため)。
|
|
180
180
|
*
|
|
181
|
+
* bind/injectableの照合キー(型の種別で決まる):
|
|
182
|
+
* `bind`/`injectable`の照合キーは型の種別で決まる(docs/type-identity-matching.md
|
|
183
|
+
* 案A、codegenのkeyExprFor):
|
|
184
|
+
* - 実行時に値を持つクラス(具象 or abstract)→ クラスの実体(Function)。案A(a)。
|
|
185
|
+
* - 真の interface/型エイリアス(実行時に値が無い)→ 宣言ごとに自動生成した
|
|
186
|
+
* companion Symbol(__dison_token_<型名>)。案A(b)。
|
|
187
|
+
* - 外部パッケージ由来の型、または具体的な型引数を持つジェネリクス
|
|
188
|
+
* (Repository<User>)→ 正規化済みの型名文字列(typeKey)。
|
|
189
|
+
* - "as <トークン>"句があればそのトークン参照が最優先(利用者の明示上書き)。
|
|
190
|
+
* クラスの実体キー化は`override`の`DI_REGISTRY`(WeakMap<Function>)と同じ発想。
|
|
191
|
+
* クラス値・companion Symbol いずれも「複数ファイルにまたがる同名の型が別の実体
|
|
192
|
+
* として自動的に区別され、手動tokenなしで衝突しなくなる」のが狙い。複数ファイル
|
|
193
|
+
* モードでは、宣言側とimport側でキーが食い違わないよう、CLIが他ファイルから
|
|
194
|
+
* importされたクラス(実体キー)・interface/型エイリアス(companion)を解決して
|
|
195
|
+
* 各ファイルの transpile に渡す(computeIdentityKeyClassesByFile/
|
|
196
|
+
* computeCompanionPlanByFile)。companion は DI利用されるものだけ emit し、他ファイル
|
|
197
|
+
* の型を使う側にはその companion の import を注入する(案A(c))。
|
|
198
|
+
*
|
|
181
199
|
* bindのinterface/型エイリアス問題への対応("as <トークン>" / token):
|
|
182
|
-
*
|
|
183
|
-
*
|
|
184
|
-
*
|
|
185
|
-
*
|
|
186
|
-
*
|
|
187
|
-
*
|
|
200
|
+
* プロジェクト内で宣言される interface/型エイリアスは上記 companion で自動的に
|
|
201
|
+
* 衝突回避されるが、**外部パッケージ由来**の interface/型エイリアスは、そのパッケージが
|
|
202
|
+
* companion をexportしていないため自動配線できず、文字列キーのままになる。単一
|
|
203
|
+
* ファイルでは問題にならないが、複数ファイルで共有ランタイムモジュールを使う場合
|
|
204
|
+
* (docs/multi-file-support.md)、互いに無関係な2ファイルが同名の外部interfaceを
|
|
205
|
+
* 別パッケージから import しているだけで、一方の`bind`がもう一方を汚染してしまう
|
|
206
|
+
* (元々の再現例はローカル宣言だったが、それは companion で解消済み。
|
|
207
|
+
* docs/bind-interface-token.md 1節)。この残った外部型のケースに以下のtoken対応が
|
|
208
|
+
* 必要(docs/type-identity-matching.md 案A(b) の「残る境界」)。
|
|
188
209
|
*
|
|
189
210
|
* 対応として、`injectable`/`bind`の左辺に任意の `as <トークン>` 句を
|
|
190
211
|
* 追加できるようにした。トークンは`token Name;`という新しい構文
|
|
@@ -213,11 +234,11 @@
|
|
|
213
234
|
* -----------------------------------------------------------
|
|
214
235
|
*/
|
|
215
236
|
import { Lexer } from "./lexer.js";
|
|
216
|
-
import { collectDeclaredTypeKinds } from "./analysis.js";
|
|
237
|
+
import { collectDeclaredTypeKinds, trueInterfaceOrAliasNames, identityKeyableClassNames } from "./analysis.js";
|
|
217
238
|
import { Parser } from "./parser.js";
|
|
218
|
-
import { generate, resolveFromActivateBindings, generateFromImportStatements } from "./codegen.js";
|
|
239
|
+
import { generate, resolveFromActivateBindings, generateFromImportStatements, generateCompanionDeclarations, generateCompanionImportStatements, collectDiUsedTypeNames, companionName, } from "./codegen.js";
|
|
219
240
|
import { generateRuntimeDeclarations, DISON_RUNTIME_MODULE_SOURCE } from "./runtime.js";
|
|
220
|
-
import { findBindCollisions } from "./collisions.js";
|
|
241
|
+
import { findBindCollisions, computeIdentityKeyClassesByFile, computeCompanionPlanByFile } from "./collisions.js";
|
|
221
242
|
/**
|
|
222
243
|
* Dison言語のソースコードを受け取り、完全に動作するTypeScriptコードに変換する。
|
|
223
244
|
* DSL構文(configuration / override / injectable / activate / bind)以外の部分は、
|
|
@@ -228,20 +249,64 @@ export function transpileDisonToTS(sourceCode, options = {}) {
|
|
|
228
249
|
const typeKinds = collectDeclaredTypeKinds(tokens);
|
|
229
250
|
const ast = new Parser(tokens, typeKinds).parseProgram();
|
|
230
251
|
const fromBindings = resolveFromActivateBindings(ast);
|
|
231
|
-
|
|
252
|
+
// 実体キー化してよいクラス識別子の集合 = このファイルのローカル具象クラス
|
|
253
|
+
// +ローカル abstract class ∪ 呼び出し側が渡した集合(複数ファイルモードで
|
|
254
|
+
// value-importされたプロジェクトのクラス)。裸の識別子かつこの集合に含まれる型
|
|
255
|
+
// だけが実体参照でキー化される(docs/type-identity-matching.md 案A(a))。
|
|
256
|
+
const identityKeyClasses = identityKeyableClassNames(typeKinds);
|
|
257
|
+
for (const name of options.identityKeyClasses ?? [])
|
|
258
|
+
identityKeyClasses.add(name);
|
|
259
|
+
const isIdentityClass = (id) => identityKeyClasses.has(id);
|
|
260
|
+
// companion Symbol でキー化する真の interface/型エイリアス(案A(b))。
|
|
261
|
+
// - ローカル宣言の真の interface/型エイリアス → このファイルで emit した companion。
|
|
262
|
+
// - 他プロジェクトファイルから import したもの(options.companionImports)→ import
|
|
263
|
+
// した companion。
|
|
264
|
+
// どちらもキーには companionName(ローカル型名) を使う(宣言側の emit 名と import 側の
|
|
265
|
+
// ローカル別名が一致するよう、codegen 側で import 文にエイリアスを付ける)。
|
|
266
|
+
const localTrueInterfaces = trueInterfaceOrAliasNames(typeKinds);
|
|
267
|
+
const companionImports = options.companionImports ?? new Map();
|
|
268
|
+
const companionRefOf = (id) => {
|
|
269
|
+
if (localTrueInterfaces.has(id) || companionImports.has(id))
|
|
270
|
+
return companionName(id);
|
|
271
|
+
return undefined;
|
|
272
|
+
};
|
|
273
|
+
const strategy = { isIdentityClass, companionRefOf };
|
|
274
|
+
const body = generate(ast, fromBindings, strategy);
|
|
275
|
+
// emit する companion = このファイルで DI利用されるローカル真 interface
|
|
276
|
+
// ∪ 呼び出し側が渡した追加分(他ファイルで DI利用されるローカル宣言)。
|
|
277
|
+
const diUsed = collectDiUsedTypeNames(ast);
|
|
278
|
+
const companionEmitNames = new Set();
|
|
279
|
+
for (const name of localTrueInterfaces) {
|
|
280
|
+
if (diUsed.has(name))
|
|
281
|
+
companionEmitNames.add(name);
|
|
282
|
+
}
|
|
283
|
+
for (const name of options.companionEmit ?? []) {
|
|
284
|
+
if (localTrueInterfaces.has(name))
|
|
285
|
+
companionEmitNames.add(name);
|
|
286
|
+
}
|
|
287
|
+
// import する companion = このファイルで DI利用される、他ファイル由来の interface。
|
|
288
|
+
const companionImportList = [];
|
|
289
|
+
for (const [localName, info] of companionImports) {
|
|
290
|
+
if (diUsed.has(localName)) {
|
|
291
|
+
companionImportList.push({ localName, originalName: info.originalName, specifier: info.specifier });
|
|
292
|
+
}
|
|
293
|
+
}
|
|
232
294
|
const header = `// --- Auto-generated TypeScript code ---\n\n`;
|
|
233
295
|
const prelude = options.runtimeModulePath
|
|
234
296
|
? `${header}import {\n` +
|
|
235
297
|
` DI_REGISTRY,\n TYPE_BINDINGS,\n bindType,\n resolveType,\n registerOverride,\n getOverride,\n` +
|
|
236
298
|
`} from ${JSON.stringify(options.runtimeModulePath)};\n\n`
|
|
237
299
|
: `${header}${generateRuntimeDeclarations("")}\n`;
|
|
238
|
-
//
|
|
239
|
-
//
|
|
240
|
-
// (
|
|
300
|
+
// ES Modules の import はファイル先頭にしか書けないため、import 系(companion import、
|
|
301
|
+
// "activate ... from" の import)を前置きの直後にまとめて出す。companion の const 宣言
|
|
302
|
+
// (export const __dison_token_X = Symbol(...))は import ではないので、すべての import
|
|
303
|
+
// の後・生成本体の前に置く。
|
|
304
|
+
const companionImportsStr = generateCompanionImportStatements(companionImportList);
|
|
241
305
|
const fromImports = generateFromImportStatements(fromBindings);
|
|
242
|
-
|
|
306
|
+
const companionDecls = generateCompanionDeclarations([...companionEmitNames]);
|
|
307
|
+
return prelude + companionImportsStr + fromImports + companionDecls + body;
|
|
243
308
|
}
|
|
244
309
|
// 公開API: 複数ファイル対応(docs/multi-file-support.md、
|
|
245
310
|
// docs/bind-interface-token.md)。CLIが複数ファイルを一括処理する際に使う。
|
|
246
|
-
export { DISON_RUNTIME_MODULE_SOURCE, findBindCollisions };
|
|
311
|
+
export { DISON_RUNTIME_MODULE_SOURCE, findBindCollisions, computeIdentityKeyClassesByFile, computeCompanionPlanByFile };
|
|
247
312
|
//# sourceMappingURL=core.js.map
|
package/dist/core.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export declare const DI_REGISTRY: WeakMap<Function, Record<string, () => any>>;
|
|
2
2
|
export declare function registerOverride(cls: Function, prop: string, factory: () => any): void;
|
|
3
3
|
export declare function getOverride(cls: Function, prop: string): (() => any) | undefined;
|
|
4
|
-
export declare const TYPE_BINDINGS: Map<string | symbol, () => any>;
|
|
5
|
-
export declare function bindType<T>(typeKey: string | symbol, factory: () => T): void;
|
|
6
|
-
export declare function resolveType<T>(typeKey: string | symbol, defaultFactory: () => T): T;
|
|
4
|
+
export declare const TYPE_BINDINGS: Map<string | symbol | Function, () => any>;
|
|
5
|
+
export declare function bindType<T>(typeKey: string | symbol | Function, factory: () => T): void;
|
|
6
|
+
export declare function resolveType<T>(typeKey: string | symbol | Function, defaultFactory: () => T): T;
|
|
7
7
|
//# sourceMappingURL=generated-runtime.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generated-runtime.d.ts","sourceRoot":"","sources":["../src/generated-runtime.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,WAAW,yCAA8C,GAAG,EAAI,CAAC;AAE9E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,GAAG,IAAI,CAOtF;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,CAEhF;
|
|
1
|
+
{"version":3,"file":"generated-runtime.d.ts","sourceRoot":"","sources":["../src/generated-runtime.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,WAAW,yCAA8C,GAAG,EAAI,CAAC;AAE9E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,GAAG,IAAI,CAOtF;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,CAEhF;AAaD,eAAO,MAAM,aAAa,wCAA6C,GAAG,CAAG,CAAC;AAO9E,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,IAAI,CAEvF;AAKD,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,EAAE,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,CAa9F"}
|
|
@@ -18,9 +18,16 @@ export function getOverride(cls, prop) {
|
|
|
18
18
|
return DI_REGISTRY.get(cls)?.[prop];
|
|
19
19
|
}
|
|
20
20
|
// Global type-replacement registry (bind).
|
|
21
|
-
// The key is
|
|
22
|
-
//
|
|
23
|
-
// name
|
|
21
|
+
// The key is one of:
|
|
22
|
+
// - The class itself (Function). When a bind/injectable type is a concrete
|
|
23
|
+
// class, the class value (not its name string) is used as the key (same
|
|
24
|
+
// idea as DI_REGISTRY). Same-named classes across files no longer collide
|
|
25
|
+
// as a result (no manual token needed; with string keys, unrelated
|
|
26
|
+
// same-named classes used to pollute each other).
|
|
27
|
+
// - A type-name string. Used for interfaces/type aliases (no runtime value)
|
|
28
|
+
// and generics with concrete type arguments (Repository<User>).
|
|
29
|
+
// - A Symbol explicitly given via an "as <token>" clause (to avoid collisions
|
|
30
|
+
// between same-named interfaces/type aliases across files. docs/bind-interface-token.md).
|
|
24
31
|
export const TYPE_BINDINGS = new Map();
|
|
25
32
|
const _resolvingTypeBindings = new Set();
|
|
26
33
|
// bindType<T> takes T as an explicit type argument, so tsc raises a
|
|
@@ -38,7 +45,8 @@ export function resolveType(typeKey, defaultFactory) {
|
|
|
38
45
|
if (!bound)
|
|
39
46
|
return defaultFactory();
|
|
40
47
|
if (_resolvingTypeBindings.has(typeKey)) {
|
|
41
|
-
|
|
48
|
+
const label = typeof typeKey === 'function' ? (typeKey.name || '<anonymous class>') : String(typeKey);
|
|
49
|
+
throw new Error('Detected a circular "bind" reference ("' + label + '"). The bind chain loops back on itself.');
|
|
42
50
|
}
|
|
43
51
|
_resolvingTypeBindings.add(typeKey);
|
|
44
52
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generated-runtime.js","sourceRoot":"","sources":["../src/generated-runtime.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,qEAAqE;AACrE,qCAAqC;AACrC,uFAAuF;AAEvF,sDAAsD;AACtD,yEAAyE;AACzE,4DAA4D;AAC5D,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,EAAuC,CAAC;AAE9E,MAAM,UAAU,gBAAgB,CAAC,GAAa,EAAE,IAAY,EAAE,OAAkB;IAC9E,IAAI,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,GAAG,EAAE,CAAC;QACX,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAa,EAAE,IAAY;IACrD,OAAO,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,2CAA2C;AAC3C,
|
|
1
|
+
{"version":3,"file":"generated-runtime.js","sourceRoot":"","sources":["../src/generated-runtime.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,qEAAqE;AACrE,qCAAqC;AACrC,uFAAuF;AAEvF,sDAAsD;AACtD,yEAAyE;AACzE,4DAA4D;AAC5D,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,EAAuC,CAAC;AAE9E,MAAM,UAAU,gBAAgB,CAAC,GAAa,EAAE,IAAY,EAAE,OAAkB;IAC9E,IAAI,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,GAAG,EAAE,CAAC;QACX,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAa,EAAE,IAAY;IACrD,OAAO,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,2CAA2C;AAC3C,qBAAqB;AACrB,6EAA6E;AAC7E,4EAA4E;AAC5E,8EAA8E;AAC9E,uEAAuE;AACvE,sDAAsD;AACtD,8EAA8E;AAC9E,oEAAoE;AACpE,gFAAgF;AAChF,8FAA8F;AAC9F,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAyC,CAAC;AAC9E,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAA8B,CAAC;AAErE,oEAAoE;AACpE,qEAAqE;AACrE,qEAAqE;AACrE,kBAAkB;AAClB,MAAM,UAAU,QAAQ,CAAI,OAAmC,EAAE,OAAgB;IAC/E,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC;AAED,qEAAqE;AACrE,uEAAuE;AACvE,0EAA0E;AAC1E,MAAM,UAAU,WAAW,CAAI,OAAmC,EAAE,cAAuB;IACzF,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK;QAAE,OAAO,cAAc,EAAE,CAAC;IACpC,IAAI,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,mBAAmB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtG,MAAM,IAAI,KAAK,CAAC,yCAAyC,GAAG,KAAK,GAAG,0CAA0C,CAAC,CAAC;IAClH,CAAC;IACD,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC;QACH,OAAO,KAAK,EAAE,CAAC;IACjB,CAAC;YAAS,CAAC;QACT,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;AACH,CAAC"}
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AA4BA,wBAAgB,2BAA2B,CAAC,aAAa,EAAE,EAAE,GAAG,SAAS,GAAG,MAAM,CAuDjF;AAMD,eAAO,MAAM,2BAA2B,EAAE,MAKF,CAAC"}
|