@no22/dison 1.1.0 → 1.3.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 +79 -4
- package/dist/ast.d.ts +3 -1
- package/dist/ast.d.ts.map +1 -1
- package/dist/codegen.d.ts.map +1 -1
- package/dist/codegen.js +69 -24
- package/dist/codegen.js.map +1 -1
- package/dist/core.d.ts +4 -3
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +12 -7
- package/dist/core.js.map +1 -1
- package/dist/generated-runtime.d.ts +22 -6
- package/dist/generated-runtime.d.ts.map +1 -1
- package/dist/generated-runtime.js +144 -28
- package/dist/generated-runtime.js.map +1 -1
- package/dist/parser.d.ts +1 -0
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +74 -22
- package/dist/parser.js.map +1 -1
- package/dist/runtime.d.ts +1 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +180 -64
- package/dist/runtime.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -93,8 +93,8 @@ class UserService {
|
|
|
93
93
|
|
|
94
94
|
### `configuration` / `activate`
|
|
95
95
|
|
|
96
|
-
Groups a set of `override`/`bind` statements
|
|
97
|
-
explicitly
|
|
96
|
+
Groups a set of `override`/`bind` statements. A **named** configuration
|
|
97
|
+
is activated explicitly with `activate`:
|
|
98
98
|
|
|
99
99
|
```dison
|
|
100
100
|
configuration TestConfig {
|
|
@@ -104,13 +104,53 @@ configuration TestConfig {
|
|
|
104
104
|
activate TestConfig;
|
|
105
105
|
```
|
|
106
106
|
|
|
107
|
-
|
|
108
|
-
configuration defined in another file:
|
|
107
|
+
To activate a configuration defined in another file:
|
|
109
108
|
|
|
110
109
|
```dison
|
|
111
110
|
activate TestConfig from "./configs";
|
|
112
111
|
```
|
|
113
112
|
|
|
113
|
+
#### Scoped configuration (new in 1.2.0)
|
|
114
|
+
|
|
115
|
+
Where you write a `configuration` decides how far it reaches. An
|
|
116
|
+
**anonymous** `configuration { ... }` is auto-active (no `activate`
|
|
117
|
+
needed) for the place it's written:
|
|
118
|
+
|
|
119
|
+
- **Top level** → global, as before.
|
|
120
|
+
- **Inside a function/method body** → a **local scope**, lexically
|
|
121
|
+
limited to the rest of that block. Great for per-test or per-request
|
|
122
|
+
isolation — the wiring is undone automatically when the block ends,
|
|
123
|
+
and concurrent async requests don't interfere.
|
|
124
|
+
- **Directly inside a class body** → a **class scope**: that class's
|
|
125
|
+
declarative DI wiring, shared by all its instances and inherited by
|
|
126
|
+
subclasses (which can override just the parts they change).
|
|
127
|
+
|
|
128
|
+
```dison
|
|
129
|
+
class UserService {
|
|
130
|
+
injectable repo: IUserRepository = new SqlUserRepository();
|
|
131
|
+
configuration { bind IUserRepository = CachedUserRepository; } // class scope
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function underTest(): void {
|
|
135
|
+
configuration { bind IUserRepository = MockUserRepository; } // local scope
|
|
136
|
+
new UserService().repo.findById("1"); // uses the Mock here...
|
|
137
|
+
}
|
|
138
|
+
// ...and the real (or class-scoped) wiring everywhere else.
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Resolution priority is **local > class > global > default initializer**.
|
|
142
|
+
A dependency is wired according to the scope active where its *root*
|
|
143
|
+
object was constructed, and the whole lazily-built object graph follows
|
|
144
|
+
that same scope consistently.
|
|
145
|
+
|
|
146
|
+
> Local scopes desugar to `using` + `AsyncLocalStorage`, so generated
|
|
147
|
+
> code that uses them needs `Symbol.dispose` (TypeScript 5.2+ / Node 20+)
|
|
148
|
+
> and `node:async_hooks` at runtime. See [Requirements](#requirements).
|
|
149
|
+
|
|
150
|
+
*(Named local/class configurations, and activating them by name, aren't
|
|
151
|
+
supported yet — use an anonymous `configuration { ... }` for local and
|
|
152
|
+
class scopes.)*
|
|
153
|
+
|
|
114
154
|
### `override`
|
|
115
155
|
|
|
116
156
|
Replaces a single property on a specific class:
|
|
@@ -121,6 +161,14 @@ override UserService {
|
|
|
121
161
|
}
|
|
122
162
|
```
|
|
123
163
|
|
|
164
|
+
An override targeting a base class also applies to instances of its
|
|
165
|
+
subclasses (new in 1.3.0) — consistent with the fact that `injectable`
|
|
166
|
+
properties are inherited. The most specific registration wins: if both
|
|
167
|
+
`override Service` and `override SubService` set the same property, a
|
|
168
|
+
`SubService` instance uses the latter. Across scopes the usual priority
|
|
169
|
+
(local > class > global) is checked first, so a local override targeting
|
|
170
|
+
a base class beats a global override targeting the subclass.
|
|
171
|
+
|
|
124
172
|
`override` can also be written standalone (not wrapped in a
|
|
125
173
|
`configuration`), which desugars to an immediate assignment — useful
|
|
126
174
|
inside a function to capture a lexical variable:
|
|
@@ -146,6 +194,16 @@ bind SqlUserRepository = MockUserRepository;
|
|
|
146
194
|
and can be written standalone or inside a `configuration`, same as
|
|
147
195
|
`override`.
|
|
148
196
|
|
|
197
|
+
The replacement can take **constructor arguments** (new in 1.2.0), so
|
|
198
|
+
you can bind types whose constructor needs values:
|
|
199
|
+
|
|
200
|
+
```dison
|
|
201
|
+
bind Repository = PostgresRepository("postgres://localhost/db");
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
The arguments are type-checked against the replacement's constructor,
|
|
205
|
+
and a standalone `bind`'s arguments can capture local variables.
|
|
206
|
+
|
|
149
207
|
### `token`
|
|
150
208
|
|
|
151
209
|
Most name clashes are resolved automatically (see *Automatic collision
|
|
@@ -208,6 +266,23 @@ classes defined in another — as long as they all resolve
|
|
|
208
266
|
`@no22/dison/runtime` to the same installed copy (in practice: they're part of the same project
|
|
209
267
|
and share a common `node_modules` ancestor, which is the normal case).
|
|
210
268
|
|
|
269
|
+
## Requirements
|
|
270
|
+
|
|
271
|
+
The generated code targets a modern TypeScript/Node toolchain:
|
|
272
|
+
|
|
273
|
+
- **TypeScript 5.2+** and **Node.js 20+** if you use **local scopes**
|
|
274
|
+
(an anonymous `configuration` inside a function/method body). Those
|
|
275
|
+
desugar to `using` + `AsyncLocalStorage`, which need `Symbol.dispose`
|
|
276
|
+
and `node:async_hooks`. Your `tsconfig.json` needs a `lib` that
|
|
277
|
+
includes `Symbol.dispose` (e.g. `"lib": ["esnext"]`) and
|
|
278
|
+
`@types/node`.
|
|
279
|
+
- Everything else (`injectable`/`override`/`bind`, global and class
|
|
280
|
+
scopes) has no special requirement beyond a current TypeScript.
|
|
281
|
+
|
|
282
|
+
The runtime module (`@no22/dison/runtime`) is shipped pre-compiled, so
|
|
283
|
+
these requirements apply to *your generated `.ts` files*, not to the
|
|
284
|
+
package itself.
|
|
285
|
+
|
|
211
286
|
## Samples
|
|
212
287
|
|
|
213
288
|
See [`sample/`](sample/) for runnable, self-contained examples covering
|
package/dist/ast.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ export interface BindEntry {
|
|
|
12
12
|
originalTypeKey: string;
|
|
13
13
|
replacementTypeName: string;
|
|
14
14
|
replacementTypeKey: string;
|
|
15
|
+
replacementArgs?: string;
|
|
15
16
|
token?: string;
|
|
16
17
|
}
|
|
17
18
|
export type ConfigEntry = OverrideEntry | BindEntry;
|
|
@@ -20,7 +21,8 @@ export type Node = {
|
|
|
20
21
|
text: string;
|
|
21
22
|
} | {
|
|
22
23
|
kind: "configuration";
|
|
23
|
-
name
|
|
24
|
+
name?: string;
|
|
25
|
+
scope: "global" | "local" | "class";
|
|
24
26
|
entries: ConfigEntry[];
|
|
25
27
|
} | {
|
|
26
28
|
kind: "injectable";
|
package/dist/ast.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACpD;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IAKb,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACpD;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IAKb,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAM3B,eAAe,CAAC,EAAE,MAAM,CAAC;IAKzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,SAAS,CAAC;AAEpD,MAAM,MAAM,IAAI,GACZ;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAQ7B;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;IAAC,OAAO,EAAE,WAAW,EAAE,CAAA;CAAE,GAErG;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAGjH;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAI/B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAGrD;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,KAAK,EAAE,aAAa,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC"}
|
package/dist/codegen.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../src/codegen.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAA4B,MAAM,UAAU,CAAC;AAI/D,MAAM,WAAW,WAAW;IAK1B,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IAKzC,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CACpD;AAID,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtD;AA+
|
|
1
|
+
{"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../src/codegen.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAA4B,MAAM,UAAU,CAAC;AAI/D,MAAM,WAAW,WAAW;IAK1B,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IAKzC,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CACpD;AAID,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtD;AA+LD,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAOD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAqB3F;AAOD,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,GAAG,MAAM,CAO/F;AAOD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAMrE;AAQD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CASpF;AAOD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAajE;AAED,wBAAgB,QAAQ,CACtB,KAAK,EAAE,IAAI,EAAE,EACb,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAC9C,QAAQ,EAAE,WAAW,GACpB,MAAM,CA4CR"}
|
package/dist/codegen.js
CHANGED
|
@@ -37,12 +37,15 @@ function keyExprFor(typeKey, token, strategy) {
|
|
|
37
37
|
// override 1件分のDI_REGISTRY代入文を生成する。configuration内(関数本体に
|
|
38
38
|
// 収集される場合)と、configurationで包まない単独のoverride(その場に直接
|
|
39
39
|
// 出力される場合)の両方から共有される。
|
|
40
|
-
|
|
40
|
+
// local=false: グローバルレジストリへ登録(registerOverride)。local=true: ローカル
|
|
41
|
+
// スコープフレームへ登録(__disonOverride。__disonEnterScope の setup 内で使う)。
|
|
42
|
+
function generateOverrideEntryLines(entry, local) {
|
|
41
43
|
// entry.className はクラスの実体を指す識別子としてそのまま埋め込む
|
|
42
|
-
//
|
|
43
|
-
//
|
|
44
|
-
//
|
|
45
|
-
|
|
44
|
+
// (文字列リテラルにはしない)。キーがクラスの実体そのものなので、className が
|
|
45
|
+
// スコープ内に存在しない(タイプミス・importし忘れ)場合は tsc が "Cannot find name"
|
|
46
|
+
// として検出する。
|
|
47
|
+
const fn = local ? "__disonOverride" : "registerOverride";
|
|
48
|
+
return entry.assignments.map((a) => ` ${fn}(${entry.className}, "${a.prop}", () => (${a.valueExpr}));`);
|
|
46
49
|
}
|
|
47
50
|
// bind 1件分のbindType呼び出し文を生成する(generateOverrideEntryLinesと同様、
|
|
48
51
|
// configuration内・単独bindの両方から共有される)。
|
|
@@ -70,32 +73,67 @@ function generateOverrideEntryLines(entry) {
|
|
|
70
73
|
// 連鎖: 差し替え先クラス自身がさらに bind されている可能性があるので、
|
|
71
74
|
// 直接 new せず resolveType を介して再帰的に解決する。
|
|
72
75
|
// (bind A = B; bind B = C; と書けば、Aの解決は最終的にCまで辿る)
|
|
73
|
-
|
|
76
|
+
// local=false: グローバル TYPE_BINDINGS へ登録(bindType<T>)。local=true: ローカル
|
|
77
|
+
// スコープフレームへ登録(__disonBind。__disonEnterScope の setup 内で使う)。
|
|
78
|
+
// bindType<T> は型引数で差し替え先の型互換を tsc に検査させるが、__disonBind は
|
|
79
|
+
// 型引数を取れないため、代わりに factory の返り値型注釈 `(): OrigType =>` で同じ検査を
|
|
80
|
+
// 得る(差し替え先が OrigType と非互換なら tsc がエラーにする)。
|
|
81
|
+
function generateBindEntryLines(entry, strategy, local) {
|
|
74
82
|
const originalKeyExpr = keyExprFor(entry.originalTypeKey, entry.token, strategy);
|
|
75
83
|
// 差し替え先(replacement)は `new` で実体化される具象クラスなので、それ自身が
|
|
76
84
|
// さらに bind の左辺になっている場合の連鎖解決キーも、左辺と同じ規則で決める
|
|
77
85
|
// (具象クラスなら実体参照、そうでなければ文字列/companion)。左辺と同じ戦略を使う
|
|
78
86
|
// ことで、ある型が「bindの左辺」と「別のbindの差し替え先」の両方に現れてもキーが一致する。
|
|
79
87
|
const replacementKeyExpr = keyExprFor(entry.replacementTypeKey, undefined, strategy);
|
|
88
|
+
// "bind Original = Replacement(args)" のコンストラクタ引数(あれば)を new 式に渡す。
|
|
89
|
+
const args = entry.replacementArgs ?? "";
|
|
90
|
+
const factory = `resolveType(${replacementKeyExpr}, () => new ${entry.replacementTypeName}(${args}))`;
|
|
80
91
|
return [
|
|
81
|
-
|
|
92
|
+
local
|
|
93
|
+
? ` __disonBind(${originalKeyExpr}, (): ${entry.originalTypeName} => ${factory});`
|
|
94
|
+
: ` bindType<${entry.originalTypeName}>(${originalKeyExpr}, () => ${factory});`,
|
|
82
95
|
];
|
|
83
96
|
}
|
|
84
|
-
|
|
97
|
+
// configuration を構文位置に応じて生成する(docs/scoped-configuration.md):
|
|
98
|
+
// - local(関数/メソッド本体・無名): `using __dison_scope_N = __disonEnterScope(...)` に
|
|
99
|
+
// 脱糖。囲みブロックの終端で自動的に元のスコープへ戻る(Symbol.dispose)。
|
|
100
|
+
// - class(クラス本体直下・無名): `static __dison_classScope_N = __disonBuildFrame(...)` に
|
|
101
|
+
// 脱糖。そのクラス(のインスタンス)の解決チェインに入る(プロトタイプ鎖で継承される)。
|
|
102
|
+
// - global 名前付き: `export function activateName() {...}`(activate で有効化)。
|
|
103
|
+
// - global 無名: auto-active。即時にグローバルへ適用する呼び出しをその場に出す。
|
|
104
|
+
// scopeId は複数の local/class configがあっても衝突しない連番(class は static フィールド名の
|
|
105
|
+
// 一意性に、local は using 変数名の一意性に使う)。
|
|
106
|
+
function generateConfiguration(node, strategy, scopeId) {
|
|
107
|
+
// local と class は「フレームへ差分を積む」形(__disonBind/__disonOverride)を共有する。
|
|
108
|
+
const frameForm = node.scope === "local" || node.scope === "class";
|
|
85
109
|
const lines = [];
|
|
86
110
|
for (const entry of node.entries) {
|
|
87
111
|
if (entry.kind === "override") {
|
|
88
|
-
lines.push(...generateOverrideEntryLines(entry));
|
|
112
|
+
lines.push(...generateOverrideEntryLines(entry, frameForm));
|
|
89
113
|
}
|
|
90
114
|
else {
|
|
91
|
-
lines.push(...generateBindEntryLines(entry, strategy));
|
|
115
|
+
lines.push(...generateBindEntryLines(entry, strategy, frameForm));
|
|
92
116
|
}
|
|
93
117
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
118
|
+
if (node.scope === "local") {
|
|
119
|
+
// 無名ローカル configuration。__disonEnterScope の setup で __disonBind/__disonOverride を
|
|
120
|
+
// 使ってフレームへ差分を積む。`using` で受けるのでブロック終端で自動的に戻る。
|
|
121
|
+
return (`using __dison_scope_${scopeId} = __disonEnterScope((__disonBind, __disonOverride) => {\n` +
|
|
122
|
+
`${lines.join("\n")}\n});`);
|
|
123
|
+
}
|
|
124
|
+
if (node.scope === "class") {
|
|
125
|
+
// 無名クラス configuration。クラス本体の static フィールドとしてフレームを構築する。
|
|
126
|
+
// __disonClassScopes が this.constructor のプロトタイプ鎖からこの static を集める。
|
|
127
|
+
return (`static __dison_classScope_${scopeId} = __disonBuildFrame((__disonBind, __disonOverride) => {\n` +
|
|
128
|
+
`${lines.join("\n")}\n});`);
|
|
129
|
+
}
|
|
130
|
+
if (node.name !== undefined) {
|
|
131
|
+
// 名前付きグローバル。export しておくと他ファイルから import して activate できる
|
|
132
|
+
// (docs/multi-file-support.md フェーズ1)。単一ファイルでもexportは無害。
|
|
133
|
+
return `export function activate${node.name}() {\n${lines.join("\n")}\n}`;
|
|
134
|
+
}
|
|
135
|
+
// 無名グローバル: auto-active。その場に即時適用する呼び出しを出す。
|
|
136
|
+
return lines.join("\n");
|
|
99
137
|
}
|
|
100
138
|
function generateInjectable(node, strategy) {
|
|
101
139
|
const { propName: p, typeName: t, typeKey: k, defaultExpr, token } = node;
|
|
@@ -116,17 +154,22 @@ function generateInjectable(node, strategy) {
|
|
|
116
154
|
// 同じキーで一致する。
|
|
117
155
|
const keyExpr = keyExprFor(k, token, strategy);
|
|
118
156
|
const fallback = simpleShape ? `resolveType(${keyExpr}, () => ${finalDefault})` : finalDefault;
|
|
157
|
+
// 構築時にその時点のスコープ(ローカルフレーム、無ければグローバル)を捕捉する
|
|
158
|
+
// (docs/scoped-configuration.md フェーズ1)。__disonResolveInjectable が解決時に
|
|
159
|
+
// このスコープへ再突入し、override > fallback(bind/既定初期化式)の順で解決する。
|
|
160
|
+
// 再突入により、fallback 内で遅延構築される依存の new も同じスコープの下で走る。
|
|
161
|
+
// 捕捉フィールドは injectable ごとに1つ(同じ値だが重複宣言を避けるため名前を分ける)。
|
|
162
|
+
//
|
|
119
163
|
// strictモードでは `if (!this._x) { this._x = f(); }` の後の `return this._x;` は
|
|
120
|
-
//
|
|
121
|
-
//
|
|
122
|
-
// そのためローカル変数を経由して確実に非undefined型として返す。
|
|
164
|
+
// 途中で挟まる関数呼び出しによりnarrowingが無効化され `T | undefined` とみなされて
|
|
165
|
+
// コンパイルエラーになる。そのため末尾で `!` を付けて確実に非undefined型として返す。
|
|
123
166
|
return [
|
|
124
167
|
``,
|
|
168
|
+
` private readonly __dison_scope_${p} = __disonCurrentScope();`,
|
|
125
169
|
` private _${p}?: ${t};`,
|
|
126
170
|
` get ${p}(): ${t} {`,
|
|
127
171
|
` if (!this._${p}) {`,
|
|
128
|
-
`
|
|
129
|
-
` this._${p} = factory ? factory() : ${fallback};`,
|
|
172
|
+
` this._${p} = __disonResolveInjectable(this.__dison_scope_${p}, this.constructor, "${p}", () => ${fallback});`,
|
|
130
173
|
` }`,
|
|
131
174
|
` return this._${p}!;`,
|
|
132
175
|
` }`,
|
|
@@ -221,13 +264,15 @@ export function collectDiUsedTypeNames(nodes) {
|
|
|
221
264
|
}
|
|
222
265
|
export function generate(nodes, fromBindings, strategy) {
|
|
223
266
|
let out = "";
|
|
267
|
+
// local/class 無名 configuration の連番(using 変数名 / static フィールド名の衝突回避)。
|
|
268
|
+
let scopeCounter = 0;
|
|
224
269
|
for (const node of nodes) {
|
|
225
270
|
switch (node.kind) {
|
|
226
271
|
case "raw":
|
|
227
272
|
out += node.text;
|
|
228
273
|
break;
|
|
229
274
|
case "configuration":
|
|
230
|
-
out += generateConfiguration(node, strategy);
|
|
275
|
+
out += generateConfiguration(node, strategy, node.scope === "local" || node.scope === "class" ? scopeCounter++ : -1);
|
|
231
276
|
break;
|
|
232
277
|
case "injectable":
|
|
233
278
|
out += generateInjectable(node, strategy);
|
|
@@ -248,12 +293,12 @@ export function generate(nodes, fromBindings, strategy) {
|
|
|
248
293
|
}
|
|
249
294
|
break;
|
|
250
295
|
case "standalone-override":
|
|
251
|
-
// configuration
|
|
296
|
+
// configurationで包まないため関数宣言にせず、その場に直接グローバルへの
|
|
252
297
|
// 代入文として出力する(書かれた位置で即座に実行される)。
|
|
253
|
-
out += generateOverrideEntryLines(node.entry).join("\n");
|
|
298
|
+
out += generateOverrideEntryLines(node.entry, false).join("\n");
|
|
254
299
|
break;
|
|
255
300
|
case "standalone-bind":
|
|
256
|
-
out += generateBindEntryLines(node.entry, strategy).join("\n");
|
|
301
|
+
out += generateBindEntryLines(node.entry, strategy, false).join("\n");
|
|
257
302
|
break;
|
|
258
303
|
}
|
|
259
304
|
}
|
package/dist/codegen.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegen.js","sourceRoot":"","sources":["../src/codegen.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,mBAAmB;AACnB,wEAAwE;AAGxE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAgBpE,wDAAwD;AACxD,6CAA6C;AAC7C,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,OAAO,iBAAiB,QAAQ,EAAE,CAAC;AACrC,CAAC;AAED,qCAAqC;AACrC,gDAAgD;AAChD,mDAAmD;AACnD,8CAA8C;AAC9C,iDAAiD;AACjD,2DAA2D;AAC3D,wCAAwC;AACxC,qDAAqD;AACrD,6DAA6D;AAC7D,gCAAgC;AAChC,8CAA8C;AAC9C,oDAAoD;AACpD,yDAAyD;AACzD,iDAAiD;AACjD,SAAS,UAAU,CAAC,OAAe,EAAE,KAAyB,EAAE,QAAqB;IACnF,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACtC,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB;IACxE,IAAI,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC9C,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,wDAAwD;AACxD,iDAAiD;AACjD,sBAAsB;AACtB,SAAS,0BAA0B,CAAC,KAAoB;
|
|
1
|
+
{"version":3,"file":"codegen.js","sourceRoot":"","sources":["../src/codegen.ts"],"names":[],"mappings":"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"}
|
package/dist/core.d.ts
CHANGED
|
@@ -64,12 +64,13 @@
|
|
|
64
64
|
* `override` はクラス内の特定プロパティ1つだけを差し替えるのに対し、
|
|
65
65
|
* `bind` は「その型が要求される場所すべて」を横断的に差し替える。
|
|
66
66
|
* 右辺は override と異なり任意の式ではなく、単一の型参照(具象クラス、
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
67
|
+
* ジェネリクス可)+任意のコンストラクタ引数リストのみを許可し、
|
|
68
|
+
* トランスパイラが自動的に `new Replacement(args)` を補う(引数は省略可。
|
|
69
|
+
* docs/bind-constructor-arguments.md)。
|
|
70
70
|
*
|
|
71
71
|
* configuration TestConfig {
|
|
72
72
|
* bind SqlUserRepository = MockUserRepository;
|
|
73
|
+
* bind Repository = PostgresRepository("postgres://..."); // 引数あり
|
|
73
74
|
* }
|
|
74
75
|
*
|
|
75
76
|
* 左辺(差し替え元)はクラスだけでなく interface / type エイリアスも許可される。
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2OG;AAgBH,OAAO,EAA+B,2BAA2B,EAAyB,MAAM,cAAc,CAAC;AAC/G,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,CAqE7F;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
|
@@ -64,12 +64,13 @@
|
|
|
64
64
|
* `override` はクラス内の特定プロパティ1つだけを差し替えるのに対し、
|
|
65
65
|
* `bind` は「その型が要求される場所すべて」を横断的に差し替える。
|
|
66
66
|
* 右辺は override と異なり任意の式ではなく、単一の型参照(具象クラス、
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
67
|
+
* ジェネリクス可)+任意のコンストラクタ引数リストのみを許可し、
|
|
68
|
+
* トランスパイラが自動的に `new Replacement(args)` を補う(引数は省略可。
|
|
69
|
+
* docs/bind-constructor-arguments.md)。
|
|
70
70
|
*
|
|
71
71
|
* configuration TestConfig {
|
|
72
72
|
* bind SqlUserRepository = MockUserRepository;
|
|
73
|
+
* bind Repository = PostgresRepository("postgres://..."); // 引数あり
|
|
73
74
|
* }
|
|
74
75
|
*
|
|
75
76
|
* 左辺(差し替え元)はクラスだけでなく interface / type エイリアスも許可される。
|
|
@@ -237,7 +238,7 @@ import { Lexer } from "./lexer.js";
|
|
|
237
238
|
import { collectDeclaredTypeKinds, trueInterfaceOrAliasNames, identityKeyableClassNames } from "./analysis.js";
|
|
238
239
|
import { Parser } from "./parser.js";
|
|
239
240
|
import { generate, resolveFromActivateBindings, generateFromImportStatements, generateCompanionDeclarations, generateCompanionImportStatements, collectDiUsedTypeNames, companionName, } from "./codegen.js";
|
|
240
|
-
import { generateRuntimeDeclarations, DISON_RUNTIME_MODULE_SOURCE } from "./runtime.js";
|
|
241
|
+
import { generateRuntimeDeclarations, DISON_RUNTIME_MODULE_SOURCE, DISON_RUNTIME_IMPORTS } from "./runtime.js";
|
|
241
242
|
import { findBindCollisions, computeIdentityKeyClassesByFile, computeCompanionPlanByFile } from "./collisions.js";
|
|
242
243
|
/**
|
|
243
244
|
* Dison言語のソースコードを受け取り、完全に動作するTypeScriptコードに変換する。
|
|
@@ -291,12 +292,16 @@ export function transpileDisonToTS(sourceCode, options = {}) {
|
|
|
291
292
|
companionImportList.push({ localName, originalName: info.originalName, specifier: info.specifier });
|
|
292
293
|
}
|
|
293
294
|
}
|
|
295
|
+
// スコープ対応(docs/scoped-configuration.md)で AsyncLocalStorage を使うため、
|
|
296
|
+
// ランタイムの import を生成物の先頭に置く。単一ファイル(インライン)モードでも
|
|
297
|
+
// ランタイム宣言が als を参照するので、この import が必要。
|
|
294
298
|
const header = `// --- Auto-generated TypeScript code ---\n\n`;
|
|
295
299
|
const prelude = options.runtimeModulePath
|
|
296
|
-
? `${header}import {\n` +
|
|
297
|
-
`
|
|
300
|
+
? `${header}${DISON_RUNTIME_IMPORTS}import {\n` +
|
|
301
|
+
` bindType,\n resolveType,\n registerOverride,\n` +
|
|
302
|
+
` __disonCurrentScope,\n __disonResolveInjectable,\n __disonEnterScope,\n __disonBuildFrame,\n` +
|
|
298
303
|
`} from ${JSON.stringify(options.runtimeModulePath)};\n\n`
|
|
299
|
-
: `${header}${generateRuntimeDeclarations("")}\n`;
|
|
304
|
+
: `${header}${DISON_RUNTIME_IMPORTS}\n${generateRuntimeDeclarations("")}\n`;
|
|
300
305
|
// ES Modules の import はファイル先頭にしか書けないため、import 系(companion import、
|
|
301
306
|
// "activate ... from" の import)を前置きの直後にまとめて出す。companion の const 宣言
|
|
302
307
|
// (export const __dison_token_X = Symbol(...))は import ではないので、すべての import
|
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,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
type __DisonFactory = () => any;
|
|
3
|
+
type __DisonKey = string | symbol | Function;
|
|
4
|
+
interface __DisonFrame {
|
|
5
|
+
binds: Map<__DisonKey, __DisonFactory>;
|
|
6
|
+
overrides: WeakMap<Function, Record<string, __DisonFactory>>;
|
|
7
|
+
parent: __DisonFrame | undefined;
|
|
8
|
+
}
|
|
9
|
+
export declare const __dison_als: AsyncLocalStorage<__DisonFrame | undefined>;
|
|
10
|
+
export declare function __disonCurrentScope(): __DisonFrame | undefined;
|
|
11
|
+
export declare function __disonBuildFrame(setup: (bind: (key: __DisonKey, factory: __DisonFactory) => void, override: (cls: Function, prop: string, factory: __DisonFactory) => void) => void): __DisonFrame;
|
|
12
|
+
export declare const DI_REGISTRY: WeakMap<Function, Record<string, __DisonFactory>>;
|
|
13
|
+
export declare function registerOverride(cls: Function, prop: string, factory: __DisonFactory): void;
|
|
14
|
+
export declare function getOverride(cls: Function, prop: string): __DisonFactory | undefined;
|
|
15
|
+
export declare const TYPE_BINDINGS: Map<__DisonKey, __DisonFactory>;
|
|
16
|
+
export declare function bindType<T>(typeKey: __DisonKey, factory: () => T): void;
|
|
17
|
+
export declare function resolveType<T>(typeKey: __DisonKey, defaultFactory: () => T): T;
|
|
18
|
+
export declare function __disonResolveInjectable<T>(scope: __DisonFrame | undefined, cls: Function, prop: string, fallback: () => T): T;
|
|
19
|
+
export declare function __disonEnterScope(setup: (bind: (key: __DisonKey, factory: __DisonFactory) => void, override: (cls: Function, prop: string, factory: __DisonFactory) => void) => void): {
|
|
20
|
+
[Symbol.dispose](): void;
|
|
21
|
+
};
|
|
22
|
+
export {};
|
|
7
23
|
//# sourceMappingURL=generated-runtime.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generated-runtime.d.ts","sourceRoot":"","sources":["../src/generated-runtime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generated-runtime.d.ts","sourceRoot":"","sources":["../src/generated-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAOrD,KAAK,cAAc,GAAG,MAAM,GAAG,CAAC;AAChC,KAAK,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;AAC7C,UAAU,YAAY;IACpB,KAAK,EAAE,GAAG,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IACvC,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAC7D,MAAM,EAAE,YAAY,GAAG,SAAS,CAAC;CAClC;AACD,eAAO,MAAM,WAAW,6CAAoD,CAAC;AAE7E,wBAAgB,mBAAmB,IAAI,YAAY,GAAG,SAAS,CAAmC;AAwBlG,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,KAAK,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,KAAK,IAAI,KAAK,IAAI,GAClJ,YAAY,CAWd;AAKD,eAAO,MAAM,WAAW,mDAA0D,CAAC;AAEnF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAI3F;AA2BD,wBAAgB,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAWnF;AAID,eAAO,MAAM,aAAa,iCAAwC,CAAC;AAKnE,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,IAAI,CAEvE;AAoBD,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,CAS9E;AASD,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAY9H;AAMD,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,KAAK,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,KAAK,IAAI,KAAK,IAAI,GAClJ;IAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAA;CAAE,CAa9B"}
|