kubricate
Version:
A TypeScript framework for building reusable, type-safe Kubernetes infrastructure — without the YAML mess.
71 lines (59 loc) • 2.67 kB
text/typescript
import type { BaseProvider } from '@kubricate/core';
import type { BaseStack } from '../stack/BaseStack.js';
import { SecretInjectionBuilder } from './SecretInjectionBuilder.js';
import type { SecretManager } from './SecretManager.js';
import type { AnySecretManager, ExtractSecretManager } from './types.js';
export type ExtractProviderKeyFromSecretManager<
SM extends AnySecretManager,
Key extends keyof ExtractSecretManager<SM>['secretEntries'],
> = ExtractSecretManager<SM>['secretEntries'][Key] extends { provider: infer P } ? P : never;
export type GetProviderKindFromConnector<SM extends AnySecretManager, ProviderKey> = ProviderKey extends string
? // eslint-disable-next-line @typescript-eslint/no-explicit-any
ExtractSecretManager<SM>['providerInstances'][ProviderKey] extends BaseProvider<any, infer Instance>
? Instance
: never
: never;
export type GetProviderKinds<
SM extends AnySecretManager,
Key extends keyof ExtractSecretManager<SM>['secretEntries'],
> = GetProviderKindFromConnector<SM, ExtractProviderKeyFromSecretManager<SM, Key>>;
export class SecretsInjectionContext<SM extends SecretManager = AnySecretManager> {
private defaultResourceId: string | undefined;
private builders: SecretInjectionBuilder[] = [];
constructor(
private stack: BaseStack,
private manager: SM,
private secretManagerId: number
) {}
/**
* Set the default resourceId to use when no explicit resource is defined in a secret injection.
*/
setDefaultResourceId(id: string): void {
this.defaultResourceId = id;
}
/**
* Start defining how a secret will be injected into a resource.
* This only resolves the provider, not the actual secret value.
*
* @param secretName - The name of the secret to inject.
* @returns A SecretInjectionBuilder for chaining inject behavior.
*/
secrets<
NewKey extends keyof ExtractSecretManager<SM>['secretEntries'] = keyof ExtractSecretManager<SM>['secretEntries'],
ProviderKinds extends GetProviderKinds<SM, NewKey> = GetProviderKinds<SM, NewKey>,
>(secretName: NewKey): SecretInjectionBuilder<ProviderKinds> {
const { providerInstance, providerId } = this.manager.resolveProviderFor(String(secretName));
const builder = new SecretInjectionBuilder(this.stack, String(secretName), providerInstance, {
defaultResourceId: this.defaultResourceId,
secretManagerId: this.secretManagerId,
providerId,
});
this.builders.push(builder);
return builder as unknown as SecretInjectionBuilder<ProviderKinds>;
}
resolveAll(): void {
for (const builder of this.builders) {
builder.resolveInjection();
}
}
}