vla 0.1.3 → 0.1.5
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 +15 -6
- package/dist/index.d.mts +24 -21
- package/dist/index.mjs +2 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src=".github/logo-large.png" width="400px" align="center" alt="Vla Logo" />
|
|
3
|
+
<h1 align="center">Vla – Smooth TypeScript Backends</h1>
|
|
4
|
+
<p align="center">
|
|
5
|
+
Vla is the missing backend layer for scalable TypeScript apps that integrates into any framework and existing codebases.
|
|
6
|
+
</p>
|
|
7
|
+
</p>
|
|
8
|
+
<br/>
|
|
6
9
|
|
|
7
10
|
🚧 WIP, under development. Exports and names will very likely change often.
|
|
8
11
|
|
|
@@ -21,6 +24,12 @@ A TypeScript data layer kernel for backend- and fullstack apps. Compatible with
|
|
|
21
24
|
- 🏗️ error handling
|
|
22
25
|
- ...
|
|
23
26
|
|
|
27
|
+
## Install
|
|
28
|
+
|
|
29
|
+
```console
|
|
30
|
+
npm install vla
|
|
31
|
+
```
|
|
32
|
+
|
|
24
33
|
## Why?
|
|
25
34
|
|
|
26
35
|
Many fullstack frameworks lack structure and conventions on the backend side (data layer), but they have lots of good structure and conventions on the frontend side (presentation layer). They are still great frameworks and they all have their own strengths. This is where Vla comes in. It aims to fill in the missing gap in the data layer, allowing you to write well-structured maintainable, scalable and testable code.
|
|
@@ -119,7 +128,7 @@ class UserRepo extends Users.Repo {
|
|
|
119
128
|
}
|
|
120
129
|
|
|
121
130
|
class Database extends Vla.Resource {
|
|
122
|
-
static
|
|
131
|
+
static readonly unwrap = "db"
|
|
123
132
|
// Unwraps a property when injecting the resource:
|
|
124
133
|
// When another class injects the database with `this.inject(Database)`,
|
|
125
134
|
// the `unwrap` will cause that it doesn't return the instance of the
|
package/dist/index.d.mts
CHANGED
|
@@ -19,6 +19,8 @@ type ModuleClass<ModuleName extends string, LayerName extends Layer = Layer, TVi
|
|
|
19
19
|
readonly unwrap?: PropertyKey;
|
|
20
20
|
readonly parentLayers: readonly Layer[];
|
|
21
21
|
};
|
|
22
|
+
type VlaInternalKeys = "inject" | "memo" | "devStable";
|
|
23
|
+
type UserSurface<T> = T extends object ? Omit<T, VlaInternalKeys> : T;
|
|
22
24
|
//#endregion
|
|
23
25
|
//#region src/concerns/memo.d.ts
|
|
24
26
|
type BaseCtor$1<T = object> = abstract new (...args: any[]) => T;
|
|
@@ -84,16 +86,6 @@ declare abstract class BaseAction {
|
|
|
84
86
|
};
|
|
85
87
|
}
|
|
86
88
|
//#endregion
|
|
87
|
-
//#region src/kernel/scoped-als.d.ts
|
|
88
|
-
declare function withKernel<T>(scopedKernel: Kernel, fn: () => T): T;
|
|
89
|
-
//#endregion
|
|
90
|
-
//#region src/kernel/scoped-global.d.ts
|
|
91
|
-
declare function setGlobalInvokeKernel(kernel: Kernel): void;
|
|
92
|
-
//#endregion
|
|
93
|
-
//#region src/kernel/scoped-provider.d.ts
|
|
94
|
-
type CurrentKernelFn = () => Kernel | Promise<Kernel>;
|
|
95
|
-
declare function setInvokeKernelProvider(fn: CurrentKernelFn): void;
|
|
96
|
-
//#endregion
|
|
97
89
|
//#region src/concerns/devstable.d.ts
|
|
98
90
|
type BaseCtor<T = object> = abstract new (...args: any[]) => T;
|
|
99
91
|
declare function DevStable<TBase extends BaseCtor>(Base: TBase): ((abstract new (...args: any[]) => {
|
|
@@ -126,7 +118,7 @@ declare function createModule<const ModuleName extends string>(moduleName: Modul
|
|
|
126
118
|
readonly parentLayers: readonly Layer[];
|
|
127
119
|
} ? TKey extends ModuleClass<ModuleName, Layer> ? "service" extends infer T ? T extends "service" ? T extends TKey["parentLayers"][number] ? TKey : `A ${Capitalize<T>} is not allowed to inject a ${Capitalize<TargetLayer>}. Allowed parent layer: ${TKey["parentLayers"][number] extends Layer ? Capitalize<TKey["parentLayers"][number]> : never}` : never : never : TKey extends {
|
|
128
120
|
readonly __vla_visibility: "global" | "public";
|
|
129
|
-
} ? TKey : `Cross-module ${Capitalize<TargetLayer>} dependency is not allowed. Use a Facade or Resource.` : never : TKey, scope?: Scope): UserSurface<Resolved<
|
|
121
|
+
} ? TKey : `Cross-module ${Capitalize<TargetLayer>} dependency is not allowed. Use a Facade or Resource.` : never : TKey, scope?: Scope): UserSurface<Resolved<TKey>>;
|
|
130
122
|
}) & {
|
|
131
123
|
readonly __vla_module: ModuleName;
|
|
132
124
|
readonly __vla_layer: "service";
|
|
@@ -142,7 +134,7 @@ declare function createModule<const ModuleName extends string>(moduleName: Modul
|
|
|
142
134
|
readonly parentLayers: readonly Layer[];
|
|
143
135
|
} ? TKey extends ModuleClass<ModuleName, Layer> ? "service" extends infer T ? T extends "service" ? T extends TKey["parentLayers"][number] ? TKey : `A ${Capitalize<T>} is not allowed to inject a ${Capitalize<TargetLayer>}. Allowed parent layer: ${TKey["parentLayers"][number] extends Layer ? Capitalize<TKey["parentLayers"][number]> : never}` : never : never : TKey extends {
|
|
144
136
|
readonly __vla_visibility: "global" | "public";
|
|
145
|
-
} ? TKey : `Cross-module ${Capitalize<TargetLayer>} dependency is not allowed. Use a Facade or Resource.` : never : TKey, scope?: Scope): UserSurface<Resolved<
|
|
137
|
+
} ? TKey : `Cross-module ${Capitalize<TargetLayer>} dependency is not allowed. Use a Facade or Resource.` : never : TKey, scope?: Scope): UserSurface<Resolved<TKey>>;
|
|
146
138
|
}) & {
|
|
147
139
|
readonly __vla_module: ModuleName;
|
|
148
140
|
readonly __vla_layer: "service";
|
|
@@ -158,7 +150,7 @@ declare function createModule<const ModuleName extends string>(moduleName: Modul
|
|
|
158
150
|
readonly parentLayers: readonly Layer[];
|
|
159
151
|
} ? TKey extends ModuleClass<ModuleName, Layer> ? "repo" extends infer T ? T extends "repo" ? T extends TKey["parentLayers"][number] ? TKey : `A ${Capitalize<T>} is not allowed to inject a ${Capitalize<TargetLayer>}. Allowed parent layer: ${TKey["parentLayers"][number] extends Layer ? Capitalize<TKey["parentLayers"][number]> : never}` : never : never : TKey extends {
|
|
160
152
|
readonly __vla_visibility: "global" | "public";
|
|
161
|
-
} ? TKey : `Cross-module ${Capitalize<TargetLayer>} dependency is not allowed. Use a Facade or Resource.` : never : TKey, scope?: Scope): UserSurface<Resolved<
|
|
153
|
+
} ? TKey : `Cross-module ${Capitalize<TargetLayer>} dependency is not allowed. Use a Facade or Resource.` : never : TKey, scope?: Scope): UserSurface<Resolved<TKey>>;
|
|
162
154
|
memo<Args extends unknown[], R>(fn: (...args: Args) => R): Memoized<Args, R>;
|
|
163
155
|
}) & {
|
|
164
156
|
readonly __vla_module: ModuleName;
|
|
@@ -175,7 +167,7 @@ declare function createModule<const ModuleName extends string>(moduleName: Modul
|
|
|
175
167
|
readonly parentLayers: readonly Layer[];
|
|
176
168
|
} ? TKey extends ModuleClass<ModuleName, Layer> ? "action" extends infer T ? T extends "action" ? T extends TKey["parentLayers"][number] ? TKey : `A ${Capitalize<T>} is not allowed to inject a ${Capitalize<TargetLayer>}. Allowed parent layer: ${TKey["parentLayers"][number] extends Layer ? Capitalize<TKey["parentLayers"][number]> : never}` : never : never : TKey extends {
|
|
177
169
|
readonly __vla_visibility: "global" | "public";
|
|
178
|
-
} ? TKey : `Cross-module ${Capitalize<TargetLayer>} dependency is not allowed. Use a Facade or Resource.` : never : TKey, scope?: Scope): UserSurface<Resolved<
|
|
170
|
+
} ? TKey : `Cross-module ${Capitalize<TargetLayer>} dependency is not allowed. Use a Facade or Resource.` : never : TKey, scope?: Scope): UserSurface<Resolved<TKey>>;
|
|
179
171
|
handle(...args: unknown[]): unknown | Promise<unknown>;
|
|
180
172
|
}) & {
|
|
181
173
|
readonly __vla_module: ModuleName;
|
|
@@ -193,7 +185,7 @@ declare function createModule<const ModuleName extends string>(moduleName: Modul
|
|
|
193
185
|
readonly parentLayers: readonly Layer[];
|
|
194
186
|
} ? TKey extends ModuleClass<ModuleName, Layer> ? "resource" extends infer T ? T extends "resource" ? T extends TKey["parentLayers"][number] ? TKey : `A ${Capitalize<T>} is not allowed to inject a ${Capitalize<TargetLayer>}. Allowed parent layer: ${TKey["parentLayers"][number] extends Layer ? Capitalize<TKey["parentLayers"][number]> : never}` : never : never : TKey extends {
|
|
195
187
|
readonly __vla_visibility: "global" | "public";
|
|
196
|
-
} ? TKey : `Cross-module ${Capitalize<TargetLayer>} dependency is not allowed. Use a Facade or Resource.` : never : TKey, scope?: Scope): UserSurface<Resolved<
|
|
188
|
+
} ? TKey : `Cross-module ${Capitalize<TargetLayer>} dependency is not allowed. Use a Facade or Resource.` : never : TKey, scope?: Scope): UserSurface<Resolved<TKey>>;
|
|
197
189
|
devStable<T>(key: string, init: () => T): T;
|
|
198
190
|
}) & {
|
|
199
191
|
readonly __vla_module: ModuleName;
|
|
@@ -209,6 +201,16 @@ declare function createModule<const ModuleName extends string>(moduleName: Modul
|
|
|
209
201
|
DevStable: typeof DevStable;
|
|
210
202
|
};
|
|
211
203
|
//#endregion
|
|
204
|
+
//#region src/kernel/scoped-als.d.ts
|
|
205
|
+
declare function withKernel<T>(scopedKernel: Kernel, fn: () => T): T;
|
|
206
|
+
//#endregion
|
|
207
|
+
//#region src/kernel/scoped-global.d.ts
|
|
208
|
+
declare function setGlobalInvokeKernel(kernel: Kernel): void;
|
|
209
|
+
//#endregion
|
|
210
|
+
//#region src/kernel/scoped-provider.d.ts
|
|
211
|
+
type CurrentKernelFn = () => Kernel | Promise<Kernel>;
|
|
212
|
+
declare function setInvokeKernelProvider(fn: CurrentKernelFn): void;
|
|
213
|
+
//#endregion
|
|
212
214
|
//#region src/index.d.ts
|
|
213
215
|
declare const Vla: {
|
|
214
216
|
createModule: typeof createModule;
|
|
@@ -216,12 +218,13 @@ declare const Vla: {
|
|
|
216
218
|
withKernel: typeof withKernel;
|
|
217
219
|
setGlobalInvokeKernel: typeof setGlobalInvokeKernel;
|
|
218
220
|
setInvokeKernelProvider: typeof setInvokeKernelProvider;
|
|
221
|
+
Kernel: typeof Kernel;
|
|
219
222
|
Facade: (abstract new () => {
|
|
220
223
|
inject<TKey extends ModuleClass<string>>(key: TKey extends ModuleClass<string, infer TargetLayer extends Layer> ? TKey extends {
|
|
221
224
|
readonly parentLayers: readonly Layer[];
|
|
222
225
|
} ? TKey extends ModuleClass<"Vla", Layer> ? "service" extends infer T ? T extends "service" ? T extends TKey["parentLayers"][number] ? TKey : `A ${Capitalize<T>} is not allowed to inject a ${Capitalize<TargetLayer>}. Allowed parent layer: ${TKey["parentLayers"][number] extends Layer ? Capitalize<TKey["parentLayers"][number]> : never}` : never : never : TKey extends {
|
|
223
226
|
readonly __vla_visibility: "global" | "public";
|
|
224
|
-
} ? TKey : `Cross-module ${Capitalize<TargetLayer>} dependency is not allowed. Use a Facade or Resource.` : never : TKey, scope?: Scope): UserSurface<Resolved<
|
|
227
|
+
} ? TKey : `Cross-module ${Capitalize<TargetLayer>} dependency is not allowed. Use a Facade or Resource.` : never : TKey, scope?: Scope): UserSurface<Resolved<TKey>>;
|
|
225
228
|
}) & {
|
|
226
229
|
readonly __vla_module: "Vla";
|
|
227
230
|
readonly __vla_layer: "service";
|
|
@@ -237,7 +240,7 @@ declare const Vla: {
|
|
|
237
240
|
readonly parentLayers: readonly Layer[];
|
|
238
241
|
} ? TKey extends ModuleClass<"Vla", Layer> ? "service" extends infer T ? T extends "service" ? T extends TKey["parentLayers"][number] ? TKey : `A ${Capitalize<T>} is not allowed to inject a ${Capitalize<TargetLayer>}. Allowed parent layer: ${TKey["parentLayers"][number] extends Layer ? Capitalize<TKey["parentLayers"][number]> : never}` : never : never : TKey extends {
|
|
239
242
|
readonly __vla_visibility: "global" | "public";
|
|
240
|
-
} ? TKey : `Cross-module ${Capitalize<TargetLayer>} dependency is not allowed. Use a Facade or Resource.` : never : TKey, scope?: Scope): UserSurface<Resolved<
|
|
243
|
+
} ? TKey : `Cross-module ${Capitalize<TargetLayer>} dependency is not allowed. Use a Facade or Resource.` : never : TKey, scope?: Scope): UserSurface<Resolved<TKey>>;
|
|
241
244
|
}) & {
|
|
242
245
|
readonly __vla_module: "Vla";
|
|
243
246
|
readonly __vla_layer: "service";
|
|
@@ -253,7 +256,7 @@ declare const Vla: {
|
|
|
253
256
|
readonly parentLayers: readonly Layer[];
|
|
254
257
|
} ? TKey extends ModuleClass<"Vla", Layer> ? "repo" extends infer T ? T extends "repo" ? T extends TKey["parentLayers"][number] ? TKey : `A ${Capitalize<T>} is not allowed to inject a ${Capitalize<TargetLayer>}. Allowed parent layer: ${TKey["parentLayers"][number] extends Layer ? Capitalize<TKey["parentLayers"][number]> : never}` : never : never : TKey extends {
|
|
255
258
|
readonly __vla_visibility: "global" | "public";
|
|
256
|
-
} ? TKey : `Cross-module ${Capitalize<TargetLayer>} dependency is not allowed. Use a Facade or Resource.` : never : TKey, scope?: Scope): UserSurface<Resolved<
|
|
259
|
+
} ? TKey : `Cross-module ${Capitalize<TargetLayer>} dependency is not allowed. Use a Facade or Resource.` : never : TKey, scope?: Scope): UserSurface<Resolved<TKey>>;
|
|
257
260
|
memo<Args extends unknown[], R>(fn: (...args: Args) => R): Memoized<Args, R>;
|
|
258
261
|
}) & {
|
|
259
262
|
readonly __vla_module: "Vla";
|
|
@@ -270,7 +273,7 @@ declare const Vla: {
|
|
|
270
273
|
readonly parentLayers: readonly Layer[];
|
|
271
274
|
} ? TKey extends ModuleClass<"Vla", Layer> ? "action" extends infer T ? T extends "action" ? T extends TKey["parentLayers"][number] ? TKey : `A ${Capitalize<T>} is not allowed to inject a ${Capitalize<TargetLayer>}. Allowed parent layer: ${TKey["parentLayers"][number] extends Layer ? Capitalize<TKey["parentLayers"][number]> : never}` : never : never : TKey extends {
|
|
272
275
|
readonly __vla_visibility: "global" | "public";
|
|
273
|
-
} ? TKey : `Cross-module ${Capitalize<TargetLayer>} dependency is not allowed. Use a Facade or Resource.` : never : TKey, scope?: Scope): UserSurface<Resolved<
|
|
276
|
+
} ? TKey : `Cross-module ${Capitalize<TargetLayer>} dependency is not allowed. Use a Facade or Resource.` : never : TKey, scope?: Scope): UserSurface<Resolved<TKey>>;
|
|
274
277
|
handle(...args: unknown[]): unknown | Promise<unknown>;
|
|
275
278
|
}) & {
|
|
276
279
|
readonly __vla_module: "Vla";
|
|
@@ -288,7 +291,7 @@ declare const Vla: {
|
|
|
288
291
|
readonly parentLayers: readonly Layer[];
|
|
289
292
|
} ? TKey extends ModuleClass<"Vla", Layer> ? "resource" extends infer T ? T extends "resource" ? T extends TKey["parentLayers"][number] ? TKey : `A ${Capitalize<T>} is not allowed to inject a ${Capitalize<TargetLayer>}. Allowed parent layer: ${TKey["parentLayers"][number] extends Layer ? Capitalize<TKey["parentLayers"][number]> : never}` : never : never : TKey extends {
|
|
290
293
|
readonly __vla_visibility: "global" | "public";
|
|
291
|
-
} ? TKey : `Cross-module ${Capitalize<TargetLayer>} dependency is not allowed. Use a Facade or Resource.` : never : TKey, scope?: Scope): UserSurface<Resolved<
|
|
294
|
+
} ? TKey : `Cross-module ${Capitalize<TargetLayer>} dependency is not allowed. Use a Facade or Resource.` : never : TKey, scope?: Scope): UserSurface<Resolved<TKey>>;
|
|
292
295
|
devStable<T>(key: string, init: () => T): T;
|
|
293
296
|
}) & {
|
|
294
297
|
readonly __vla_module: "Vla";
|
|
@@ -304,4 +307,4 @@ declare const Vla: {
|
|
|
304
307
|
DevStable: typeof DevStable;
|
|
305
308
|
};
|
|
306
309
|
//#endregion
|
|
307
|
-
export { InstantiableClass, Kernel, Layer, ModuleClass, Resolved, Scope, Token, UnwrapKey, Visibility, Vla, createContext, createModule, setGlobalInvokeKernel, setInvokeKernelProvider, withKernel };
|
|
310
|
+
export { InstantiableClass, Kernel, Layer, ModuleClass, Resolved, Scope, Token, UnwrapKey, UserSurface, Visibility, Vla, VlaInternalKeys, createContext, createModule, setGlobalInvokeKernel, setInvokeKernelProvider, withKernel };
|
package/dist/index.mjs
CHANGED