Skip to content

Package root

Import path: @sdcorejs/nestjs

The root entrypoint bootstraps the library and re-exports the contracts most applications need in their root module. Use the documented subpaths for complete feature-specific APIs.

Bootstrap

ts
import { Module } from '@nestjs/common';
import { SdCoreModule } from '@sdcorejs/nestjs';
import { z } from 'zod';

const PrincipalSchema = z.object({
  sub: z.string().min(1),
  tenant: z.string().min(1).max(64),
  roles: z.array(z.string().min(1)).optional(),
});

@Module({
  imports: [
    SdCoreModule.forRoot({
      context: {
        identity: {
          principalResolver: (principal: unknown) => {
            const claims = PrincipalSchema.parse(principal);
            return {
              userId: claims.sub,
              tenant: claims.tenant,
              roles: claims.roles,
            };
          },
        },
      },
      cache: { backend: 'memory', ttl: 60, maxEntries: 1_000 },
      http: {
        baseURL: 'https://inventory.internal.example',
        trustedOrigins: ['https://inventory.internal.example'],
      },
      jwt: {
        jwks: { allowedIssuerHosts: ['https://identity.example.com'] },
        audience: 'inventory-api',
      },
      i18n: { supportedLanguages: ['en', 'vi'], fallbackLanguage: 'en' },
    }),
  ],
})
export class AppModule {}

SdCoreModule.forRoot(options?: SdCoreModuleOptions): DynamicModule is global. Context, tenancy, audit, permission, cache and HTTP modules are always wired. JWT, i18n, uploaded files, action history, job scheduler and BullMQ are wired only when their corresponding option is present.

SdCoreModuleOptions

PropertyTypeDefault / effect
contextContextModuleOptionsDefault headers; verified-principal mapper; trusted-header mode off
tenancyTenancyModuleOptionsFail-closed default strategy for scoped entities
auditAuditModuleOptionsDefaultAuditStrategy
permissionPermissionModuleOptionsDeny-all DefaultPermissionStrategy
cacheCacheConfigIn-memory LRU, TTL 60 seconds, 1,000 entries
httpHttpClientConfig30-second timeout; no trusted propagation origins
jwtJwtConfigOmit to disable JWT module wiring
i18nI18nModuleOptionsOmit to leave library error messages untranslated
internalSecret{ envVar?: string } | { key: string }Omit to register no built-in internal secret; static key is deprecated
uploadedFileUploadedFileConfigOmit to disable uploaded-file providers
actionHistoryActionHistoryModuleOptionsOmit to disable action-history providers
jobSchedulerJobSchedulerModuleOptionsOmit to disable database job-lock providers
queueQueueModuleConfigOmit to disable BullMQ wiring
providersProvider[]Extra global extension providers

Prefer an environment-backed or rotating implementation of IInternalSecretProvider; never embed production secrets in source.

Root export table

ExportKindPurpose
SdCoreModuleclassGlobal composition module; forRoot(options?)
SdCoreModuleOptions, InternalSecretConfigtypesRoot configuration contracts
ContextServiceclassAsyncLocalStorage-backed request context
ContextIdentityOptions, HeadersConfig, IdentityContextSource, RequestContexttypesRequest-context configuration and store shape
ResolvedContextIdentity, ResolvedContextIdentityOptions, TrustedHeaderIdentityOptions, VerifiedPrincipalResolvertypesTrusted identity mapping contracts
defaultVerifiedPrincipalResolverfunctionConservative mapper for sub/userId/id claims
CONTEXT_HEADERS_CONFIG, CONTEXT_IDENTITY_CONFIGvaluesContext DI tokens
ITenancyStrategy, IAuditStrategy, IPermissionStrategytypesTenancy, audit and permission extension contracts
TENANCY_STRATEGY, AUDIT_STRATEGY, PERMISSION_STRATEGYvaluesStrategy DI tokens
PERMISSION_METADATA_KEYvaluePermission decorator metadata key
HasPermission, HasAnyPermissiondecoratorsAttach required permission codes
InternalGuard, INTERNAL_SECRET_HEADERclass/valueInternal-call guard and default x-internal-secret header
IInternalSecretProvider, INTERNAL_SECRET_PROVIDERtype/valueRotatable secret source and DI token
IInternalContextEnricher, INTERNAL_CONTEXT_ENRICHERtype/valuePost-secret trusted-context hook and DI token
ApiErrorBody, ApiResponseEnvelopetypesStandard error and response shapes
apiError, ApiResponsevaluesResponse-envelope helpers
ZodValidationGuard, parseZodfunctionsZod request guard factory and direct parser
ZodSchemaMap, ZodSource, ZodIssueDetailtypesValidation source and issue contracts
II18nResolver, ILanguageResolvertypesTranslation and language-resolution contracts
I18N_RESOLVER, LANGUAGE_RESOLVERvaluesi18n DI tokens

Response helpers

ts
interface ApiErrorBody {
  code: string;
  message: string;
  data?: Record<string, unknown>;
}

interface ApiResponseEnvelope<T = unknown> {
  data?: T;
  error?: ApiErrorBody;
}

ApiResponse.ok(data), ApiResponse.noContent() and ApiResponse.error(code, message, data?) construct envelopes. apiError(code, message, data?) constructs the body expected by library exception handling.

Released under the MIT License.