# HG changeset patch
# User cin
# Date 2020-09-08 11:31:55
# Node ID 17c7de5d346c0a5be1fc9dfcea918c25a2b46b89
# Parent 03e32ec7c20bff5e5d5643bd23827167f906dda5
tests
diff --git a/.project b/.project
--- a/.project
+++ b/.project
@@ -14,4 +14,15 @@
org.eclipse.buildship.core.gradleprojectnature
+
+
+ 1599549685358
+
+ 30
+
+ org.eclipse.core.resources.regexFilterMatcher
+ node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__
+
+
+
diff --git a/src/main/ts/di/Configuration.ts b/src/main/ts/di/Configuration.ts
--- a/src/main/ts/di/Configuration.ts
+++ b/src/main/ts/di/Configuration.ts
@@ -185,10 +185,11 @@ export class Configuration, contextRequire?: any, ct = Cancellation.none) {
+ async applyConfiguration(data: RegistrationMap, opts: { contextRequire?: any; baseModule?: string }, ct = Cancellation.none) {
argumentNotNull(data, "data");
+ const _opts = opts || {};
- await this._applyConfiguration(data, await makeResolver(void (0), contextRequire), ct);
+ await this._applyConfiguration(data, await makeResolver(_opts.baseModule, _opts.contextRequire), ct);
}
async _applyConfiguration(data: RegistrationMap, resolver?: ModuleResolver, ct = Cancellation.none) {
diff --git a/src/main/ts/di/Container.ts b/src/main/ts/di/Container.ts
--- a/src/main/ts/di/Container.ts
+++ b/src/main/ts/di/Container.ts
@@ -110,24 +110,34 @@ export class Container, opts?: any, ct = Cancellation.none) {
- const c = new Configuration(this);
+ async configure(config: string | RegistrationMap, opts?: { contextRequire: any; baseModule?: string }, ct = Cancellation.none) {
+ const _opts = Object.create(opts || null);
if (typeof (config) === "string") {
- return c.loadConfiguration(config, opts && opts.contextRequire, ct);
+ _opts.baseModule = config;
+
+ const module = await import(config);
+ if (module && module.default && typeof (module.default.apply) === "function")
+ return module.default.apply(this);
+ else
+ return this._applyLegacyConfig(module, _opts, ct);
} else {
- return c.applyConfiguration(config, opts && opts.contextRequire, ct);
+ return this._applyLegacyConfig(config, _opts, ct);
}
}
+ async _applyLegacyConfig(config: RegistrationMap, opts: { contextRequire: any; baseModule?: string }, ct = Cancellation.none) {
+ return new Configuration(this).applyConfiguration(config, opts);
+ }
+
async fluent(config: FluentRegistrations, ct = Cancellation.none): Promise {
await new FluentConfiguration().register(config).apply(this, ct);
return this;
diff --git a/src/main/ts/di/fluent/FluentConfiguration.ts b/src/main/ts/di/fluent/FluentConfiguration.ts
--- a/src/main/ts/di/fluent/FluentConfiguration.ts
+++ b/src/main/ts/di/fluent/FluentConfiguration.ts
@@ -21,11 +21,13 @@ export class FluentConfiguration, ct = Cancellation.none) {
+ apply(target: Container, ct = Cancellation.none) {
let pending = 1;
- return new Promise((resolve, reject) => {
+ const _t2 = target as unknown as Container;
+
+ return new Promise>((resolve, reject) => {
function guard(v: void | Promise) {
if (isPromise(v))
v.catch(reject);
@@ -33,13 +35,13 @@ export class FluentConfiguration {
pending++;
- const d = new DescriptorBuilder(target,
+ const d = new DescriptorBuilder(_t2,
result => {
- target.register(k, result);
+ _t2.register(k, result);
complete();
},
reject
diff --git a/src/test/ts/mock/config.ts b/src/test/ts/mock/config.ts
--- a/src/test/ts/mock/config.ts
+++ b/src/test/ts/mock/config.ts
@@ -1,26 +1,14 @@
import { Services } from "./services";
import { fluent } from "../di/traits";
+import { Box } from "./Box";
export default fluent().register({
host: it => it.value("example.com"),
- bar2: it => Promise.all([import("./Foo"), import("./Bar")])
- .then(([{ Foo }, { Bar }]) => it
- .lifetime("container")
- .override({
- host: it2 => it2.value("simple.org"),
- foo: it2 => it2.value(new Foo())
- })
- .factory(resolve => {
- const bar = new Bar({
- foo: new Foo(),
- nested: {
- lazy: resolve("foo", { lazy: true })
- },
- host: resolve("host")
- }, "some text");
- bar.setName(resolve("host"));
- return bar;
- })
- )
+ foo: it => import("./Foo").then(({ Foo }) => it
+ .factory(() => new Foo())
+ ),
+
+ box: it => it
+ .factory($dependency => new Box($dependency("foo")))
});
diff --git a/src/test/ts/mock/services.ts b/src/test/ts/mock/services.ts
--- a/src/test/ts/mock/services.ts
+++ b/src/test/ts/mock/services.ts
@@ -8,11 +8,7 @@ import { Box } from "./Box";
export interface Services {
foo: Foo;
- bar: Bar;
-
- bar2: Bar;
-
- box: Box;
+ box: Box;
host: string;
diff --git a/src/test/ts/tests/FluentContainerTests.ts b/src/test/ts/tests/FluentContainerTests.ts
--- a/src/test/ts/tests/FluentContainerTests.ts
+++ b/src/test/ts/tests/FluentContainerTests.ts
@@ -5,6 +5,7 @@ import { Container } from "../di/Contain
import { Foo } from "../mock/Foo";
import { Box } from "../mock/Box";
import { delay } from "../safe";
+import { Services } from "../mock/services";
test("Simple fluent config", async t => {
const config = fluent<{ host: string; bar: Bar; foo: Foo }>()
@@ -14,8 +15,8 @@ test("Simple fluent config", async t =>
foo: it => import("../mock/Foo").then(m => it.lifetime("container").factory(() => new m.Foo()))
});
- const container = new Container<{ host: string; bar: Bar; foo: Foo; }>();
- await config.apply(container);
+ const c1 = new Container<{}>();
+ const container = await config.apply(c1);
t.equal(container.resolve("host"), "example.com", "The value should be resolved");
t.assert(container.resolve("bar"), "The service should de activated");
@@ -52,3 +53,11 @@ test("Bad fluent config", async t => {
t.equal(e.message, "bad override", "the error should pass");
}
});
+
+test("Load fluent config", async t => {
+ const container = new Container();
+
+ await container.configure("../mock/config", { contextRequire: require });
+
+ t.assert(container.resolve("host"), "Should resolve simple value");
+});
diff --git a/src/testCjs/ts/tests/plan.ts b/src/testCjs/ts/tests/plan.ts
--- a/src/testCjs/ts/tests/plan.ts
+++ b/src/testCjs/ts/tests/plan.ts
@@ -5,3 +5,4 @@ import "./ObservableTests";
import "./ContainerTests";
import "./SafeTests";
import "./TextTests";
+import "./FluentContainerTests";