Skip to content

Commit

Permalink
Fix commiting injection method to lazy-recursive
Browse files Browse the repository at this point in the history
  • Loading branch information
ApexCaptain committed Mar 10, 2022
1 parent 2d9c47b commit 10650ce
Show file tree
Hide file tree
Showing 12 changed files with 127 additions and 62 deletions.
8 changes: 4 additions & 4 deletions docs/classes/TerraformInjectorStack.html

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions docs/classes/TerraformInjectorStackAsync.html

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/interfaces/Reference.TerraformInjectorCommon.html

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions docs/interfaces/TerraformInjector.html

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions docs/interfaces/TerraformInjectorAsync.html

Large diffs are not rendered by default.

10 changes: 5 additions & 5 deletions docs/interfaces/TerraformInjectorElementContainer.html

Large diffs are not rendered by default.

10 changes: 5 additions & 5 deletions docs/interfaces/TerraformInjectorElementContainerAsync.html

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion docs/modules.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>cdktf-injector</title><meta name="description" content="Documentation for cdktf-injector"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="assets/style.css"/><link rel="stylesheet" href="assets/highlight.css"/><script async src="assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base="."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="index.html" class="title">cdktf-injector</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><h1>cdktf-injector</h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Namespaces</h3><ul class="tsd-index-list"><li class="tsd-kind-namespace"><a href="modules/Reference.html" class="tsd-kind-icon">Reference</a></li></ul></section><section class="tsd-index-section "><h3>Classes</h3><ul class="tsd-index-list"><li class="tsd-kind-class"><a href="classes/TerraformInjectorStack.html" class="tsd-kind-icon">Terraform<wbr/>Injector<wbr/>Stack</a></li><li class="tsd-kind-class"><a href="classes/TerraformInjectorStackAsync.html" class="tsd-kind-icon">Terraform<wbr/>Injector<wbr/>Stack<wbr/>Async</a></li></ul></section><section class="tsd-index-section "><h3>Interfaces</h3><ul class="tsd-index-list"><li class="tsd-kind-interface"><a href="interfaces/TerraformInjector.html" class="tsd-kind-icon">Terraform<wbr/>Injector</a></li><li class="tsd-kind-interface"><a href="interfaces/TerraformInjectorAsync.html" class="tsd-kind-icon">Terraform<wbr/>Injector<wbr/>Async</a></li><li class="tsd-kind-interface tsd-has-type-parameter"><a href="interfaces/TerraformInjectorElementContainer.html" class="tsd-kind-icon">Terraform<wbr/>Injector<wbr/>Element<wbr/>Container</a></li><li class="tsd-kind-interface tsd-has-type-parameter"><a href="interfaces/TerraformInjectorElementContainerAsync.html" class="tsd-kind-icon">Terraform<wbr/>Injector<wbr/>Element<wbr/>Container<wbr/>Async</a></li></ul></section><section class="tsd-index-section "><h3>Variables</h3><ul class="tsd-index-list"><li class="tsd-kind-variable"><a href="modules.html#TerraformInjectorFactory" class="tsd-kind-icon">Terraform<wbr/>Injector<wbr/>Factory</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Variables</h2><section class="tsd-panel tsd-member tsd-kind-variable"><a id="TerraformInjectorFactory" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span class="tsd-flag ts-flagConst">Const</span> Terraform<wbr/>Injector<wbr/>Factory<a href="#TerraformInjectorFactory" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">Terraform<wbr/>Injector<wbr/>Factory<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>scopesOn<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">(</span>scope<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Construct</span>, description<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> =&gt; </span><a href="interfaces/TerraformInjector.html" class="tsd-signature-type" data-tsd-kind="Interface">TerraformInjector</a><span class="tsd-signature-symbol">; </span>scopesOnAsync<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">(</span>scope<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Construct</span>, description<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> =&gt; </span><a href="interfaces/TerraformInjectorAsync.html" class="tsd-signature-type" data-tsd-kind="Interface">TerraformInjectorAsync</a><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol"> = ...</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/ApexCaptain/cdktf-injector/blob/d93709b/src/components/core/constants/terraform-injector.factory.constant.ts#L41">components/core/constants/terraform-injector.factory.constant.ts:41</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>cdktf-injector</title><meta name="description" content="Documentation for cdktf-injector"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="assets/style.css"/><link rel="stylesheet" href="assets/highlight.css"/><script async src="assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base="."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="index.html" class="title">cdktf-injector</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><h1>cdktf-injector</h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Namespaces</h3><ul class="tsd-index-list"><li class="tsd-kind-namespace"><a href="modules/Reference.html" class="tsd-kind-icon">Reference</a></li></ul></section><section class="tsd-index-section "><h3>Classes</h3><ul class="tsd-index-list"><li class="tsd-kind-class"><a href="classes/TerraformInjectorStack.html" class="tsd-kind-icon">Terraform<wbr/>Injector<wbr/>Stack</a></li><li class="tsd-kind-class"><a href="classes/TerraformInjectorStackAsync.html" class="tsd-kind-icon">Terraform<wbr/>Injector<wbr/>Stack<wbr/>Async</a></li></ul></section><section class="tsd-index-section "><h3>Interfaces</h3><ul class="tsd-index-list"><li class="tsd-kind-interface"><a href="interfaces/TerraformInjector.html" class="tsd-kind-icon">Terraform<wbr/>Injector</a></li><li class="tsd-kind-interface"><a href="interfaces/TerraformInjectorAsync.html" class="tsd-kind-icon">Terraform<wbr/>Injector<wbr/>Async</a></li><li class="tsd-kind-interface tsd-has-type-parameter"><a href="interfaces/TerraformInjectorElementContainer.html" class="tsd-kind-icon">Terraform<wbr/>Injector<wbr/>Element<wbr/>Container</a></li><li class="tsd-kind-interface tsd-has-type-parameter"><a href="interfaces/TerraformInjectorElementContainerAsync.html" class="tsd-kind-icon">Terraform<wbr/>Injector<wbr/>Element<wbr/>Container<wbr/>Async</a></li></ul></section><section class="tsd-index-section "><h3>Variables</h3><ul class="tsd-index-list"><li class="tsd-kind-variable"><a href="modules.html#TerraformInjectorFactory" class="tsd-kind-icon">Terraform<wbr/>Injector<wbr/>Factory</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Variables</h2><section class="tsd-panel tsd-member tsd-kind-variable"><a id="TerraformInjectorFactory" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span class="tsd-flag ts-flagConst">Const</span> Terraform<wbr/>Injector<wbr/>Factory<a href="#TerraformInjectorFactory" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">Terraform<wbr/>Injector<wbr/>Factory<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>scopesOn<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">(</span>scope<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Construct</span>, description<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> =&gt; </span><a href="interfaces/TerraformInjector.html" class="tsd-signature-type" data-tsd-kind="Interface">TerraformInjector</a><span class="tsd-signature-symbol">; </span>scopesOnAsync<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">(</span>scope<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Construct</span>, description<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> =&gt; </span><a href="interfaces/TerraformInjectorAsync.html" class="tsd-signature-type" data-tsd-kind="Interface">TerraformInjectorAsync</a><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol"> = ...</span></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/ApexCaptain/cdktf-injector/blob/2d9c47b/src/components/core/constants/terraform-injector.factory.constant.ts#L41">components/core/constants/terraform-injector.factory.constant.ts:41</a></li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead">
<p>Constant object for creating <a href="interfaces/TerraformInjector.html">TerraformInjector</a> or <a href="interfaces/TerraformInjectorAsync.html">TerraformInjectorAsync</a> instance.
You can use only one of <code>scopesOn</code> or <code>scopesOnAsync</code> function for one <a href="https://www.npmjs.com/package/constructs" class="external">Construct</a> instance, not both.</p>
</div><dl class="tsd-comment-tags"><dt>see</dt><dd><p><a href="https://www.terraform.io/cdktf/concepts/constructs">https://www.terraform.io/cdktf/concepts/constructs</a></p>
Expand Down
2 changes: 1 addition & 1 deletion docs/modules/Reference.html

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,20 @@ export class TerraformInjectorElementContainerClass<
dependents = new Set<TerraformInjectorElementContainerClass<any, any, any>>();
isInitialized = false;
terraformElementContainerNonInitializedError: TerraformInjectorElementContainerUninitializedError;
afterInitElementCallbackArray = new Array<
(element: TerraformElementType, shared: SharedType) => void | Promise<void>
>();
afterDependenciesInjectedCallbackArray = new Array<
(element: TerraformElementType, shared: SharedType) => void | Promise<void>
>();
afterInitElementCallbackContainerArray = new Array<{
isCalled: boolean;
callback: (
element: TerraformElementType,
shared: SharedType,
) => void | Promise<void>;
}>();
afterDependenciesInjectedCallbackContainerArray = new Array<{
isCalled: boolean;
callback: (
element: TerraformElementType,
shared: SharedType,
) => void | Promise<void>;
}>();

// Getters
_shared!: SharedType;
Expand Down Expand Up @@ -100,7 +108,10 @@ export class TerraformInjectorElementContainerClass<
shared: SharedType,
) => void | Promise<void>,
) {
this.afterInitElementCallbackArray.push(afterInitCallback);
this.afterInitElementCallbackContainerArray.push({
isCalled: false,
callback: afterInitCallback,
});
return this;
}

Expand All @@ -110,9 +121,10 @@ export class TerraformInjectorElementContainerClass<
shared: SharedType,
) => void | Promise<void>,
) {
this.afterDependenciesInjectedCallbackArray.push(
afterDependenciesInjectedCallback,
);
this.afterDependenciesInjectedCallbackContainerArray.push({
isCalled: false,
callback: afterDependenciesInjectedCallback,
});
return this;
}

Expand Down Expand Up @@ -143,8 +155,15 @@ export class TerraformInjectorElementContainerClass<
>
)(this.id),
);
for (const eachAfterInitCallback of this.afterInitElementCallbackArray) {
void eachAfterInitCallback(this.element, this.shared);
for (const eachAfterInitCallbackContainer of this
.afterInitElementCallbackContainerArray) {
if (!eachAfterInitCallbackContainer.isCalled) {
void eachAfterInitCallbackContainer.callback(
this.element,
this.shared,
);
eachAfterInitCallbackContainer.isCalled = true;
}
}
} catch (error) {
if (
Expand Down Expand Up @@ -172,8 +191,15 @@ export class TerraformInjectorElementContainerClass<
>
)(this.id),
);
for (const eachAfterInitCallback of this.afterInitElementCallbackArray) {
await eachAfterInitCallback(this.element, this.shared);
for (const eachAfterInitCallbackContainer of this
.afterInitElementCallbackContainerArray) {
if (!eachAfterInitCallbackContainer.isCalled) {
await eachAfterInitCallbackContainer.callback(
this.element,
this.shared,
);
eachAfterInitCallbackContainer.isCalled = true;
}
}
} catch (error) {
if (
Expand Down
43 changes: 28 additions & 15 deletions src/components/core/functions/commit-injection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ export const commitInjection = (
const parentDepthLength = parentScopePath.split('/').length;

const injectorEntries = Array.from(injectorMap.entries());
const children = (
parentScopePath === ''
const getChildren = () =>
(parentScopePath === ''
? injectorEntries
: injectorEntries.filter(
([eachScope]) =>
Expand All @@ -25,8 +25,8 @@ export const commitInjection = (
.slice(0, parentDepthLength)
.join('/') == parentScopePath,
)
).map(([_, eachInjector]) => eachInjector);

).map(([_, eachInjector]) => eachInjector);
const children = getChildren();
if (!parentInjector.useAsync) {
children.forEach((eachInjector) => {
if (eachInjector.useAsync && !eachInjector.isInjected) {
Expand Down Expand Up @@ -80,12 +80,18 @@ export const commitInjection = (
}
}
for (const eachContainer of elementContainerSet)
for (const eachAfterDependencyInjectedCallback of eachContainer.afterDependenciesInjectedCallbackArray)
await eachAfterDependencyInjectedCallback(
eachContainer.element,
eachContainer.shared,
);
resolve();
for (const eachAfterDependencyInjectedCallbackContainer of eachContainer.afterDependenciesInjectedCallbackContainerArray) {
if (!eachAfterDependencyInjectedCallbackContainer.isCalled) {
await eachAfterDependencyInjectedCallbackContainer.callback(
eachContainer.element,
eachContainer.shared,
);
eachAfterDependencyInjectedCallbackContainer.isCalled = true;
}
}
if (!getChildren().every((eachChild) => eachChild.isInjected))
await commitInjection(parentInjector);
else resolve();
} catch (error) {
reject(error);
}
Expand Down Expand Up @@ -119,9 +125,16 @@ export const commitInjection = (
}
}
for (const eachContainer of elementContainerSet)
for (const eachAfterDependencyInjectedCallback of eachContainer.afterDependenciesInjectedCallbackArray)
void eachAfterDependencyInjectedCallback(
eachContainer.element,
eachContainer.shared,
);
for (const eachAfterDependencyInjectedCallbackContainer of eachContainer.afterDependenciesInjectedCallbackContainerArray) {
if (!eachAfterDependencyInjectedCallbackContainer.isCalled) {
void eachAfterDependencyInjectedCallbackContainer.callback(
eachContainer.element,
eachContainer.shared,
);
eachAfterDependencyInjectedCallbackContainer.isCalled = true;
}
}

if (!getChildren().every((eachChild) => eachChild.isInjected))
void commitInjection(parentInjector);
};
30 changes: 28 additions & 2 deletions test/tmp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,48 @@ import { vpc } from '@cdktf/provider-aws';
import { App } from 'cdktf';
import { TerraformInjectorFactory, TerraformInjectorStackAsync } from '../src';

let a: any;
let b: any;

class MyStack extends TerraformInjectorStackAsync {
myVpc1 = this.provide(vpc.Vpc, 'mv', () => ({
cidrBlock: '10.1.0.0/16',
}));
})).afterDependenciesInjected((element) => {
b = this.provide(vpc.Vpc, 'mv4', () => {
console.log(element);
return {};
});
});
myVpc2 = this.provide(vpc.Vpc, 'mv2', () => ({
cidrBlock: '10.2.0.0/16',
dependsOn: [this.myVpc1.element],
}));
})).afterInitElement((element) => {
a = this.provide(vpc.Vpc, 'mv3', () => {
console.log(element);
return {};
});
});
}

type nonP<T> = Exclude<T, Promise<T>>;

const someFunction = <T>(
someCallback: () => T extends Promise<unknown> ? never : T,
): T => {
return someCallback();
};

const x = someFunction(() => 3);
const y = someFunction(async () => 4);

const app = new App();
const myStack = new MyStack(app, 'my-stack');
console.log('start injection');
TerraformInjectorFactory.scopesOnAsync(app)
.inject()
.then(() => {
console.log(myStack.myVpc1.element);
console.log(a.element);
console.log(b.element);
})
.catch((e) => console.error(e));

0 comments on commit 10650ce

Please sign in to comment.