UNPKG

@cap-js/cds-types

Version:

Type definitions for main packages of CAP, like `@sap/cds`

1,849 lines (1,552 loc) 102 kB
declare module '@sap/cds' { export * from "@sap/cds-dk"; export type __any_ = classes.any_ export type __array = classes.array export type __aspect = classes.aspect export type __Association = classes.Association export type __Binary = classes.Binary export type __Boolean = classes.Boolean export type __Composition = classes.Composition export type __context_ = classes.context_ export type __Date = classes.Date export type __date = classes.date export type __DateTime = classes.DateTime export type __Decimal = classes.Decimal export type __Double = classes.Double export type __entity = classes.entity export type __Float = classes.Float export type __Int16 = classes.Int16 export type __Int32 = classes.Int32 export type __Int64 = classes.Int64 export type __Integer = classes.Integer export type __LargeBinary = classes.LargeBinary export type __LargeString = classes.LargeString export type __scalar = classes.scalar export type __service = classes.service_ export type __String = classes.String export type __struct = classes.struct export type __Time = classes.Time export type __TimeStamp = classes.TimeStamp export type __type = classes.type export type __UInt8 = classes.UInt8 export type __UUID = classes.UUID export type __Vector = classes.Vector class action extends any_<'action' | 'function'> {} export interface ActionEventHandler<P, R> { // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type (req: Omit<Request_2, 'data'> & { data: P }, next: Function): Promise<R> | R } interface And { and: TaggedTemplateQueryPart<this> & ((predicate: object) => this) & ((...expr: any[]) => this) } /** * Subclass representing unauthenticated users. */ export class Anonymous extends User { constructor () is (): boolean } const any: typeof any_; interface any_ extends csn.any_ {} class any_<K extends kinds = kinds> { private _: K // break covariance constructor (...aspects: any[]) readonly name: string // parked, might be deprecated // is (kind: kinds | 'Association' | 'Composition'): boolean } interface any__2 { kind?: kinds /** * only available when compiled with docs:true * @see [capire docs](https://cap.cloud.sap/docs/cds/cdl#comments) */ doc?: string } /** * The {@link https://expressjs.com/en/4x/api.html#app| express.js application} constructed by the server implementation. * * @see [capire](https://cap.cloud.sap/docs/node.js/cds-server#cds-app) */ export const app: import('express').Application; export class ApplicationService extends Service { new<T extends Constructable>(draft: T, data: {[K in keyof InstanceType<T>]?: InstanceType<T>[K]}): Promise<unknown> new<T extends Constructable>(draft: T): { for(keys: Key[]): Promise<unknown>, } discard(draft: Constructable, keys: Key[]): Promise<unknown> edit(draft: Constructable, keys: Key[]): Promise<unknown> save(draft: Constructable, keys: Key[]): Promise<unknown> } export class array extends type<'type' | 'elements'> { } interface ArrayConstructable<T = any> { new(...args: any[]): T[] } class aspect<K extends kinds = 'aspect'> extends type<K> implements WithElements { elements: Definitions<type<'type'>> } /** * @see [capire](https://cap.cloud.sap/docs/node.js/cds-reflect#cds-association) */ export interface Association extends Omit<csn.Association, 'type' | 'items'> {} export class Association extends type { _target: entity isAssociation: true is2one: boolean is2many: boolean } interface Association_2 extends type_2 { target: FQN /** * The specified cardinality. to-one = `{max:1}`, to-many = `{max:'*'}` */ cardinality?: { src?: 1, min?: 1 | 0, max?: 1 | '*' } /** * The parsed on condition in case of unmanaged Associations */ on?: predicate /** * The optionally specified keys in case of managed Associations */ keys?: (ref & { as: string })[] } type Awaitable<T, I> = T & Promise<I> class Axios { get axios (): import('axios').AxiosInstance get: import('axios').AxiosInstance['get'] & TaggedTemplateRequest put: import('axios').AxiosInstance['put'] & TaggedTemplateRequest post: import('axios').AxiosInstance['post'] & TaggedTemplateRequest patch: import('axios').AxiosInstance['patch'] & TaggedTemplateRequest delete: import('axios').AxiosInstance['delete'] & TaggedTemplateRequest options: import('axios').AxiosInstance['options'] & TaggedTemplateRequest get GET (): Axios['get'] get PUT (): Axios['put'] get POST (): Axios['post'] get PATCH (): Axios['patch'] get DELETE (): Axios['delete'] get OPTIONS (): Axios['options'] } class Binary extends string { } const boolean: typeof boolean_; class boolean_ extends scalar { } class Boolean_2 extends boolean { } export const builtin: { /** * @see {@link models.linked.classes} */ classes: typeof models.linked.classes, types: Record<string, object>, // FIXME: value should be any class part of linked.classes }; interface ByKey { byKey (primaryKey?: PK): this } export type CDL = string namespace cds { export { log, debug, test, ql, QLExtensions, csn, delete_ as delete, version, home, root, cli, requires, extend, lazify, lazified, entity, event, type, array, struct, Association, Composition, builtin, on, once, exit, _cds, cds_services, connect, server, serve, services, service, cds_serve_fluent, cds_connect_options, Middlewares, middlewares, app, env, _TODO, get, load, resolve, minify, reflect, _flavor, _odata_options, _options, JSON_2 as JSON, YAML, CDL, SQL, XML, EDM, EDMX, filename, model, parse, linked, __type, __aspect, __any_, __scalar, __Boolean, __UUID, __String, __LargeString, __Binary, __LargeBinary, __Vector, __Integer, __UInt8, __Int16, __Int32, __Int64, __Float, __Double, __Decimal, __date, __Date, __Time, __DateTime, __TimeStamp, __array, __struct, __context_, __service, __entity, __Association, __Composition, compile, spawn, Key, QueryAPI, PropertiesOf, Service, ApplicationService, MessagingService, RemoteService, DatabaseService, Transaction, ResultSet, ServiceImpl, EventHandler, OnEventHandler, OnErrorHandler, Partial_2 as Partial, OneOrMany, CdsFunction, CdsFunctions, HandlerFunction, CRUDEventHandler, ActionEventHandler, ResultsHandler, SpawnEvents, SpawnEventEmitter, types, SpawnOptions, context, tx, entities, run, foreach, stream, read, create, insert, update, transaction, db, outboxed, unboxed, EventContext, Event_2 as Event, Request_2 as Request, User, Anonymous, Privileged, utils, Query, SELECT_2 as SELECT, INSERT_2 as INSERT, UPSERT_2 as UPSERT, UPDATE_2 as UPDATE, DELETE_2 as DELETE, CREATE_2 as CREATE, DROP_2 as DROP, primitive, data, name, source, column_expr, predicate, ordering_term, expr, ref, _segment, _named, val, xpr, _xpr, operator, function_call, enum_literal, expr_literal, Texts, I18nBundle, I18nFacade, I18nFilesOptions, I18nFiles, i18n } } export default cds; export type _cds = typeof cds_2 namespace cds_2 { export { cds as default, log, debug, test, ql, QLExtensions, csn, delete_ as delete, version, home, root, cli, requires, extend, lazify, lazified, entity, event, type, array, struct, Association, Composition, builtin, on, once, exit, _cds, cds_services, connect, server, serve, services, service, cds_serve_fluent, cds_connect_options, Middlewares, middlewares, app, env, _TODO, get, load, resolve, minify, reflect, _flavor, _odata_options, _options, JSON_2 as JSON, YAML, CDL, SQL, XML, EDM, EDMX, filename, model, parse, linked, __type, __aspect, __any_, __scalar, __Boolean, __UUID, __String, __LargeString, __Binary, __LargeBinary, __Vector, __Integer, __UInt8, __Int16, __Int32, __Int64, __Float, __Double, __Decimal, __date, __Date, __Time, __DateTime, __TimeStamp, __array, __struct, __context_, __service, __entity, __Association, __Composition, compile, spawn, Key, QueryAPI, PropertiesOf, Service, ApplicationService, MessagingService, RemoteService, DatabaseService, Transaction, ResultSet, ServiceImpl, EventHandler, OnEventHandler, OnErrorHandler, Partial_2 as Partial, OneOrMany, CdsFunction, CdsFunctions, HandlerFunction, CRUDEventHandler, ActionEventHandler, ResultsHandler, SpawnEvents, SpawnEventEmitter, types, SpawnOptions, context, tx, entities, run, foreach, stream, read, create, insert, update, transaction, db, outboxed, unboxed, EventContext, Event_2 as Event, Request_2 as Request, User, Anonymous, Privileged, utils, Query, SELECT_2 as SELECT, INSERT_2 as INSERT, UPSERT_2 as UPSERT, UPDATE_2 as UPDATE, DELETE_2 as DELETE, CREATE_2 as CREATE, DROP_2 as DROP, primitive, data, name, source, column_expr, predicate, ordering_term, expr, ref, _segment, _named, val, xpr, _xpr, operator, function_call, enum_literal, expr_literal, Texts, I18nBundle, I18nFacade, I18nFilesOptions, I18nFiles, i18n } } type _cds_2 = typeof cds_2 export interface cds_connect_options { impl?: string service?: string kind?: string model?: string | CSN credentials?: object } export interface cds_serve_fluent { from (model: string | CSN): cds_serve_fluent to (protocol: string): cds_serve_fluent at (path: string): cds_serve_fluent in (app: import('express').Application): cds_serve_fluent with (impl: ServiceImpl | string): cds_serve_fluent // (req,res) : void } export interface cds_services { [name: string]: Service } /** * @beta helper */ export type CdsFunction = { (...args: any[]): any, __parameters: object, __returns: any, } /** * @beta helper */ export type CdsFunctions<T> = Pick<T, { [K in keyof T]: T[K] extends CdsFunction ? K : never }[keyof T]> namespace classes { export { mixin, Protocol, Column, Definitions, WithElements, any_, any, aspect, type, scalar, boolean, Boolean_2 as Boolean, string, UUID, String_2 as String, LargeString, Binary, LargeBinary, Vector, number, Integer, UInt8, Int16, Int32, Int64, Float, Double, Decimal, date, Date_2 as Date, Time, DateTime, TimeStamp, array, struct, Map_3 as Map, context_, service_, action, event, entity, Association, Composition, ManagedAssociation, MixedIn } } /** * The parsed effective `cds` CLI command and arguments. * May be undefined if not started from the `cds` CLI. * @see https://cap.cloud.sap/docs/node.js/cds-facade#cds-cli */ export const cli: { /** Basic command like `serve` */ command?: CliCommands, /** Positional arguments */ argv?: string[], /** Named arguments */ options?: Record<string, any>, } | undefined; type CliCommands = 'add' | 'build' | 'compile' | 'deploy' | 'import' | 'init' | 'serve' | (string & {}) type Column = { ref: [string], as?: string } export type column_expr = UnionToIntersection<expr> & { as?: name, cast?: any, expand?: column_expr[], inline?: column_expr[] } interface Columns<T, This = undefined> { columns: ((...col: KeyOfSingular<T>[]) => This extends undefined ? this : This) & ((col: KeyOfSingular<T>[]) => This extends undefined ? this : This) & ((...col: (string | column_expr)[]) => This extends undefined ? this : This) & ((col: (string | column_expr)[]) => This extends undefined ? this : This) & TaggedTemplateQueryPart<This extends undefined ? this : This> } type ColumnValue = Primitive | Readonly<Primitive[]> | SELECT<any> /** * Provides a set of methods to parse a given model, query or expression. * You can also use `cds.compile(csn).to('<output>')` as a fluent variant. */ export const compile: { /** Shortcut for `cds.compile.to.csn()` */ cdl (model: CDL, o?: _options): csn.CSN, for: { odata (model: csn.CSN, o?: _options): csn.CSN, sql (model: csn.CSN, o?: _options): csn.CSN, nodejs (model: csn.CSN, o?: _options): linked.LinkedCSN, }, to: { parsed: { csn (files: filename[], o?: _options): Promise<csn.CSN>, csn (model: CDL, o?: _options): csn.CSN, }, xtended: { csn (files: filename[], o?: _options): Promise<csn.CSN>, csn (model: CDL, o?: _options): csn.CSN, }, inferred: { csn (files: filename[], o?: _options): Promise<csn.CSN>, csn (model: CDL, o?: _options): csn.CSN, }, csn (files: filename[], o?: _options): Promise<csn.CSN>, csn (model: CDL, o?: _options): csn.CSN, yml (model: csn.CSN, o?: _options): YAML, yaml (model: csn.CSN, o?: _options): YAML, json (model: csn.CSN, o?: _options): JSON_2, sql (model: csn.CSN, o?: _options): SQL[], cdl (model: csn.CSN, o?: _options): CDL | Iterable<[CDL, { file: filename }]>, edm (model: csn.CSN, o?: _options | _odata_options): EDM | string, edmx (model: csn.CSN, o?: _options | _odata_options): EDMX | Iterable<[EDMX, { file: filename }]>, hdbcds (model: csn.CSN, o?: _options): SQL | Iterable<[SQL, { file: filename }]>, hdbtable (model: csn.CSN, o?: _options): SQL | Iterable<[SQL, { file: filename }]>, }, /** Fluent API variant */ (model: csn.CSN | CDL): { for: { odata (o?: _options): csn.CSN, sql (o?: _options): csn.CSN, }, to: { parsed: { csn (o?: _options): csn.CSN }, xtended: { csn (o?: _options): csn.CSN }, inferred: { csn (o?: _options): csn.CSN }, csn (o?: _options): csn.CSN, yml (o?: _options): YAML, yaml (o?: _options): YAML, json (o?: _options): JSON_2, sql (o?: _options): SQL[], cdl (o?: _options): CDL | Iterable<[CDL, { file: filename }]>, edm (o?: _options | _odata_options): EDM | string, edmx (o?: _options | _odata_options): EDMX | Iterable<[EDMX, { file: filename }]>, hdbcds (o?: _options): SQL | Iterable<[SQL, { file: filename }]>, hdbtable (o?: _options): SQL | Iterable<[SQL, { file: filename }]>, }, }, /** Async fluent variant reading from files */ (files: filename[]): { for: { odata (o?: _options): Promise<csn.CSN>, sql (o?: _options): Promise<csn.CSN>, }, to: { parsed: { csn (o?: _options): Promise <csn.CSN> }, xtended: { csn (o?: _options): Promise <csn.CSN> }, inferred: { csn (o?: _options): Promise <csn.CSN> }, csn (o?: _options): Promise <csn.CSN>, yml (o?: _options): Promise <YAML>, yaml (o?: _options): Promise <YAML>, json (o?: _options): Promise <JSON_2>, sql (o?: _options): Promise <SQL[]>, cdl (o?: _options): Promise <CDL | Iterable<[CDL, { file: filename }]>>, edm (o?: _options | _odata_options): Promise <EDM | string>, edmx (o?: _options | _odata_options): Promise <EDMX | Iterable<[EDMX, { file: filename }]>>, hdbcds (o?: _options): Promise <SQL | Iterable<[SQL, { file: filename }]>>, hdbtable (o?: _options): Promise <SQL | Iterable<[SQL, { file: filename }]>>, }, }, }; export class Composition extends Association { isComposition: true } export const connect: { /** * Connects to a specific datasource. * @example await cds.connect.to ('service') * @see [capire](https://cap.cloud.sap/docs/node.js/cds-connect#cds-connect-to) */ to(datasource: string, options?: cds_connect_options): Promise<Service>, /** * Shortcut for 'db' as the primary database returning `cds.DatabaseService` * @example await cds.connect.to ('db') */ to(datasource: 'db', options?: cds_connect_options): Promise<cds_2.DatabaseService>, /** * Connects to a specific datasource via a Service subclass * @example await cds.connect.to (ServiceClass) * @see [capire](https://cap.cloud.sap/docs/node.js/cds-connect#cds-connect-to) */ to<S extends Service>(datasource: {new(): S}, options?: cds_connect_options): Promise<S>, /** * Connects to a specific datasource via a Service class from cds-typer * @example * import ServiceClass from '#cds-models/SomeService' * await cds.connect.to (ServiceClass) * @see [capire](https://cap.cloud.sap/docs/node.js/cds-connect#cds-connect-to) */ to<S>(datasource: S, options?: cds_connect_options): Promise<cds_2.CdsFunctions<S> & Service>, /** * Connects to a specific datasource via options. * @example cds.connect.to ({ kind:..., impl:... }) * @see [capire](https://cap.cloud.sap/docs/node.js/cds-connect#cds-connect-to) */ to(options: cds_connect_options): Promise<Service>, /** * Connects the primary datasource. * @see [capire](https://cap.cloud.sap/docs/node.js/cds-connect) */ // API extractor cannot handle the direct usages of the cds namespace in typeof cds, so add an indirection. (options?: string | cds_connect_options): Promise<_cds>, // > cds.connect(<options>) }; interface Constructable<T = any> { new(...args: any[]): T } class ConstructedQuery<T> { // branded type to break covariance for the subclasses // that don't make explicit use of the generic. So `UPDATE<Books> !<: UPDATE<number>` private _: T then (_resolved: (x: any) => any, _rejected: (e: Error) => any): any bind (service: Service): this } /** * @see [docs](https://cap.cloud.sap/docs/node.js/cds-tx#event-contexts */ export let context: EventContext | undefined; interface context_ extends csn.context {} class context_ extends any_ { } interface context_2 extends any__2 { } namespace CQN { export { Query, SELECT_2 as SELECT, INSERT_2 as INSERT, UPSERT_2 as UPSERT, UPDATE_2 as UPDATE, DELETE_2 as DELETE, CREATE_2 as CREATE, DROP_2 as DROP, primitive, data, name, source, column_expr, predicate, ordering_term, expr, ref, _segment, _named, val, xpr, _xpr, operator, function_call, enum_literal, expr_literal } } export const create: Service['create']; type CREATE_2 = { CREATE: { entity: entity_2 | name, as: SELECT_2, }, } export { CREATE_2 as CREATE } class CREATE_3<T> extends ConstructedQuery<T> { private constructor(); static entity (entity: EntityDescription): CREATE_3<EntityDescription> CREATE: CQN.CREATE['CREATE'] } export namespace CRUDEventHandler { export type Before<P, R = P | void | Error> = (req: Request_2<P>) => Promise<R> | R export type On<P, R = P | void | Error> = (req: Request_2<P>, next: (...args: any[]) => Promise<R> | R) => Promise<R> | R export type After<P, R = P | void | Error> = (data: undefined | P, req: Request_2<P>) => Promise<R> | R } /** * A parsed CDS model in CSN object notation. */ interface CSN { /** * The assigned namespace. If parsed from multiple sources, * this is the topmost model's namespace, if any, not the * ones of imported models. */ namespace?: string /** * The list of usings in this parsed model. Not available after * imports have been resolved into a merged model. */ requires?: string[] /** * All definitions in the model including those from imported models. */ definitions?: Record<FQN, Definition> /** * All extensions in the model including those from imported models. * Not available after extensions have been applied. */ extensions?: Extension[] /** * The names of the files from which this model has been loaded. */ $sources?: string[] } namespace csn { export { CSN, FQN, Definition, Extension, Element, kinds, any__2 as any_, context_2 as context, service_2 as service, type_2 as type, struct_2 as struct, Map_2 as Map, entity_2 as entity, EntityElements, Association_2 as Association } } export { csn } /** @private */ export type data = Record<string, any> export class DatabaseService extends Service { deploy (model?: csn.CSN | string): Promise<csn.CSN> begin (): Promise<void> commit (): Promise<void> rollback (): Promise<void> } class DataUtil { delete (db?: Service): Promise<void> reset (db?: Service): Promise<void> /** * @deprecated if needed, call `reset()`, considering test performance */ autoReset (enabled: boolean): this } class date extends scalar { } class Date_2 extends date { } class DateTime extends date { } export const db: DatabaseService; /** * Shortcut to `cds.log(...).debug`, returning `undefined` if `cds.log(...)._debug` is `false`. * Use like this: * @example * ```js * const dbg = cds.debug('foo') * ... * dbg && dbg('message') * ``` * * @param name - logger name */ export function debug (name: string): undefined | Log class Decimal extends Float { precision?: number scale?: number } /** * Definitions are the central elements of a CDS model. */ type Definition = context_2 & service_2 & type_2 & struct_2 & entity_2 & Association_2 type Definition_2 = any_ /** * @see [capire](https://cap.cloud.sap/docs/node.js/cds-reflect#iterable) */ type Definitions<T extends any_ = any_> = IterableMap<T> const delete_: Service['delete']; export { delete_ as delete }; type DELETE_2 = { DELETE: { from: ref | name, where?: predicate, }, } export { DELETE_2 as DELETE } interface DELETE_3<T> extends Where<T>, And, ByKey {} class DELETE_3<T> extends ConstructedQuery<T> { private constructor(); static from: TaggedTemplateQueryPart<Awaitable<SELECT_3<unknown>, InstanceType<StaticAny>>> & (<T>(entity: EntityDescription | ArrayConstructable, primaryKey?: PK) => DELETE_3<T>) & ((subject: ref) => DELETE_3<_TODO_2>) DELETE: CQN.DELETE['DELETE'] } class Double extends Float { } type DROP_2 = { DROP: { entity: name, table: ref, view: ref, }, } export { DROP_2 as DROP } class DROP_3<T> extends ConstructedQuery<T> { private constructor(); static entity (entity: EntityDescription): DROP_3<EntityDescription> DROP: CQN.DROP['DROP'] } export type EDM = { $version: string } export type EDMX = XML type Element = type_2 & struct_2 & Association_2 export const entities: Service['entities']; /** * @see [capire](https://cap.cloud.sap/docs/node.js/cds-reflect#cds-entity) */ export interface entity extends Omit<csn.entity, 'elements' | 'items' | 'keys' | 'drafts'> {} export class entity extends struct<'entity'> { is_entity: true keys: Definitions<type> associations: Definitions<Association> compositions: Definitions<Composition> actions: Definitions<action> texts?: entity drafts?: entity } interface entity_2 extends Omit<struct_2, 'elements'> { /** * Entities with a query signify a view */ query?: SELECT_2 /** * Elements of entities may have additional qualifiers */ elements: EntityElements // REVISIT: following should move to LinkedCSN keys: { [name: string]: Definition } drafts?: entity_2 } type EntityDescription = entity | Definition | string type EntityElements = { [name: string]: Element & { key?: boolean, virtual?: boolean, unique?: boolean, notNull?: boolean, precision?: number, scale?: number, length?: number, }, } type Entries<T = any> = {[key:string]: T} | {[key:string]: T} export type enum_literal = { '#': string } /** * Access to the configuration for Node.js runtime and tools. * The object is the effective result of configuration merged from various sources, * filtered through the currently active profiles, thus highly dependent on the current working * directory and process environment. */ export const env: { build: _TODO, hana: _TODO, i18n: { languages: string[], default_language: string, folders: string[], [key: string]: any, }, profiles: string[], log: { user: boolean, levels: Record<string, Lowercase<keyof typeof levels>>, als_custom_fields: Record<string, number>, cls_custom_fields: string[], }, requires: env.Requires, folders: { app: string, db: string, srv: string, fts: string, [key: string]: string, // to allow additional values }, odata: _TODO, query: _TODO, sql: _TODO, } & { [key: string]: any }; export namespace env { export interface MockUser { tenant?: string roles?: string[] features?: string[] } export interface MockUsers { alice: MockUser bob: MockUser carol: MockUser dave: MockUser erin: MockUser fred: MockUser [key: string]: MockUser | undefined } export type Requires = { auth: { kind: 'dummy' | 'mocked' | 'basic' | 'xsuaa' | 'ias' | string, impl: string, users?: MockUsers, tenants?: { [key: string]: { features?: string[], }, }, credentials?: Credentials, binding?: Binding, [key: string]: any, }, db: { kind: 'hana' | 'sqlite' | 'sql' | string, binding?: Binding, [key: string]: any, }, multitenancy?: boolean | { kind: string, jobs: { clusterSize: number, workerSize: number, t0: string, [key: string]: any, },}, toggles?: boolean, extensibility?: boolean | { model: string[], tenantCheckInterval: number, [key: string]: any, }, messaging?: { kind: 'file-based-messaging' | 'redis-messaging' | 'local-messaging' | 'enterprise-messaging' | 'enterprise-messaging-shared' | string, format: 'cloudevents' | string, [key: string]: any, }, 'cds.xt.SaasProvisioningService'?: { model: string, kind: string, alwaysUpgradeModel?: boolean, [key: string]: any, }, 'cds.xt.SmsProvisioningService'?: { model: string, kind: string, [key: string]: any, }, 'cds.xt.ExtensibilityService'?: { model: string, kind?: string, [key: string]: any, }, 'cds.xt.ModelProviderService'?: { model: string, root: string, kind?: string, [key: string]: any, }, 'cds.xt.DeploymentService'?: { model: string, kind?: string, [key: string]: any, }, [key: string]: any, } export type Binding = { type: 'cf' | 'k8s' | string, apiEndpoint?: string, org?: string, space?: string, instance?: string, key?: string, } export type Credentials = { clientid?: string, clientsecret?: string, url?: string, xsappname?: string, certurl?: string, certificate?: string, [key: string]: any, } } export class event extends aspect<'event'> {} /** * @see [capire docs](https://cap.cloud.sap/docs/node.js/events) */ class Event_2<T = unknown> extends EventContext { event: string data: T headers: any before(phase: 'commit', handler: () => void) on(phase: 'succeeded' | 'failed' | 'done', handler: () => void) } export { Event_2 as Event } /** * Represents the invocation context of incoming request and event messages. * @see [capire docs](https://cap.cloud.sap/docs/node.js/events) */ export class EventContext { constructor (properties: { event: string, data?: object, query?: object, headers?: object }) http?: { req: import('express').Request, res: import('express').Response } tenant: string user: User id: string locale: `${string}_${string}` timestamp: Date features?: { [key: string]: boolean } model: LinkedCSN } export interface EventHandler { // (msg : types.EventMessage) : Promise<any> | any | void (req: Request_2): Promise<any> | any | void } /** * Provides a graceful shutdown for running servers, by first emitting `cds.emit('shutdown')`. * @see [capire](https://cap.cloud.sap/docs/node.js/cds-facade#cds-exit) */ export function exit (): void export type expr = ref | val | xpr | function_call | SELECT_2 export type expr_literal = { '=': string } type Expression<E extends string | number | bigint | boolean> = `${E}${WS}${Op}${WS}` type Expressions<L,E> = KVPairs<L, Expression<Exclude<keyof E, symbol>>, ColumnValue> extends true ? L // fallback: allow for any string. Important for when user renamed properties : KVPairs<L, Expression<string>, ColumnValue> extends true ? L : never /** * Add aspects to a given object, for example: * * @example * ```js * extend (Object.prototype) .with (class { * get foo() { return ... } * bar() {...} * }.prototype) * ``` */ export function extend<T> (target: T): { with<E extends readonly any[]>(...ext: E): T & Intersect<E>, } /** * Extensions capture `extend Foo with { ... }` directives. */ type Extension = { extend: FQN, elements?: { [name: string]: Element }, includes?: FQN[], } export type filename = string type Filter = string | (<T extends any_ = any_>(def: T) => boolean) export type _flavor = 'parsed' | 'xtended' | 'inferred' class Float extends number { } export const foreach: Service['foreach']; type Formatter = { /** * Custom format function * * @param module - logger name * @param level - log level * @param args - additional arguments * @returns an array of arguments, which are passed to the logger (for example, `console.log()`) */ (module: string, level: number, args: any[]): any[], } /** * The fully-quality name of a definition. */ type FQN = string /** @private */ export type function_call = { func: string, args: { [key: string]: any }[] } /** * Loads and parses models from the specified files. * Uses `cds.resolve` to fetch the respective models. * Essentially a shortcut for `cds.compile.to.csn(files)` * @param files - filenames of models or if folder containing models */ export function get (files: '*' | filename | filename[], o?: _options): Promise<csn.CSN> interface GroupBy { groupBy: TaggedTemplateQueryPart<this> & ((columns: Partial<{[column in KeyOfTarget<this extends ConstructedQuery<infer E> ? E : never, never>]: any}>) => this) & ((...expr: string[]) => this) & ((ref: ref) => this) // columns currently not being auto-completed due to complexity } /** * Types herein can be used to type handler functions that are not declared in line: * @example * ```ts * import { myAction } from '#cds-models/myService' * * function onMyFunction (req: HandlerFunction<typeof myAction>['parameters']['req']): HandlerFunction<typeof myAction>['returns'] { * ... * } * * srv.on(myAction, onMyFunction) * ``` */ export type HandlerFunction<F extends CdsFunction> = { parameters: { /** @beta helper */ req: Request_2<F['__parameters']>, }, /** @beta helper */ returns: F['__returns'], } interface Having<T> { having: HavingWhere<this, T> } type HavingWhere<This, E> = /** * @param predicate - An object with keys that are valid fields of the target entity and values that are compared to the respective fields. * @example * ```js * SELECT.from(Books).where({ ID: 42 }) // where ID is a valid field of Book * SELECT.from(Books).having({ ID: 42 }) // where ID is a valid field of Book * ``` */ ((predicate: Partial<{[column in KeyOfTarget<This extends ConstructedQuery<infer E> ? E : never, never>]: any}>) => This) /** * @param expr - An array of expressions, where every odd element is a valid field of the target entity and every even element is a value that is compared to the respective field. * @example * ```js * SELECT.from(Books).where(['ID =', 42 ]) // where ID is a valid, numerical field of Book * SELECT.from(Books).having(['ID =', 42 ]) // where ID is a valid, numerical field of Book *``` */ & (<const L extends unknown[]>(...expr: Expressions<L, UnwrappedInstanceType<E>>) => This) & ((...expr: string[]) => This) & TaggedTemplateQueryPart<This> interface Hints { hints: ((...hints: string[]) => this) & ((hints: string[]) => this) } export const home: string; export const i18n: I18nFacade; export class I18nBundle { constructor(options: I18nFilesOptions) for(key: number | string | object, locale?: string | object, args?: object): string | undefined at(key: number | string | object, locale?: string | object, args?: object): string | undefined files: I18nFiles get defaults(): Record<string, string> get fallback(): Record<string, string> key4(definition: entity): string texts4 (locale: string): Texts translations4 (...locales : string[]) : { [locale: string]: Texts } translations4 (locale : 'all' ) : { [locale: string]: Texts } all () : Record<string, Texts> } export interface I18nFacade { Bundle: typeof I18nBundle Facade: I18nFacade Files: typeof I18nFiles get file(): string get folders(): string[] get labels(): I18nBundle get messages(): I18nBundle bundle4 (file: string, options?: I18nFilesOptions): I18nBundle bundle4 (model: csn.CSN): I18nBundle } export class I18nFiles { constructor (options: I18nFilesOptions) get options(): I18nFilesOptions get basename(): string content4(locale: string, suffix: string): Array<object> } export interface I18nFilesOptions { file? : string model? : csn.CSN roots? : string[] leafs? : string[] folders? : string[] } export const insert: Service['insert']; type INSERT_2 = { INSERT: { into: ref | name, entries: data[], columns: string[], values: primitive[], rows: primitive[][], from: SELECT_2, }, } export { INSERT_2 as INSERT } interface INSERT_3<T> extends Columns<T>, InUpsert<T> {} class INSERT_3<T> extends ConstructedQuery<T> { private constructor(); static into: (<T extends ArrayConstructable> (entity: T, ...entries: SingularInstanceType<T>[]) => INSERT_3<SingularInstanceType<T>>) & (<T extends ArrayConstructable> (entity: T, entries?: SingularInstanceType<T>[]) => INSERT_3<SingularInstanceType<T>>) & (TaggedTemplateQueryPart<INSERT_3<unknown>>) & ((entity: EntityDescription, ...entries: Entries[]) => INSERT_3<StaticAny>) & ((entity: EntityDescription, entries?: Entries) => INSERT_3<StaticAny>) & (<T> (entity: Constructable<T>, ...entries: T[]) => INSERT_3<T>) & (<T> (entity: Constructable<T>, entries?: T[]) => INSERT_3<T>) from (select: SELECT_3<T>): this INSERT: CQN.INSERT['INSERT'] } class Int16 extends Integer { } class Int32 extends Integer { } class Int64 extends Integer { } class Integer extends number { } type Intersect<T extends readonly unknown[]> = T extends [infer Head, ...infer Tail] ? Head & Intersect<Tail> : unknown interface InUpsert<T> { data (block: (e: T) => void): this entries (...entries: T[]): this entries (entries: T[]): this values (...val: (null | Primitive)[]): this values (val: (null | Primitive)[]): this rows (...row: (null | Primitive)[][]): this rows (row: (null | Primitive)[][]): this into: (<T extends ArrayConstructable> (entity: T) => this) & TaggedTemplateQueryPart<this> & ((entity: EntityDescription) => this) } /** * Object structure that exposes both array-like and object-like behaviour. * @see [capire](https://cap.cloud.sap/docs/node.js/cds-reflect#iterable) */ type IterableMap<T> = { [name: string]: T } & Iterable<T> type JSON_2 = string export { JSON_2 as JSON } export type Key = number | string | any type KeyOfSingular<T> = Unwrap<T> extends T ? keyof T : keyof Unwrap<T> type KeyOfTarget<T, F = string | column_expr> = T extends ConstructedQuery<infer U> ? (U extends ArrayConstructable // Books ? keyof SingularInstanceType<U> : U extends Constructable // Book ? keyof InstanceType<U> : F) : F type kinds = 'aspect' | 'entity' | 'type' | 'event' | 'action' | 'function' | 'service' | 'context' | 'elements' | 'element' /** * T is a tuple of alternating K, V pairs -> true, else false * Allows for variadic parameter lists with alternating expecing types, * like we have in cql.SELECT.where */ type KVPairs<T,K,V> = T extends [] ? true : T extends [K, V, ...infer R] ? KVPairs<R,K,V> : false class LargeBinary extends Binary { } class LargeString extends String_2 { } /** * @deprecated since version 8.1 */ export function lazified<T> (target: T): T /** * @deprecated since version 8.1 */ export function lazify<T> (target: T): T enum levels { // SILLY and VERBOSE are aliases for TRACE /* eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values */ SILENT = 0, ERROR = 1, WARN = 2, INFO = 3, DEBUG = 4, TRACE = 5, SILLY = 5, VERBOSE = 5 } interface Limit { limit: TaggedTemplateQueryPart<this> & ((rows: number, offset?: number) => this) } export const linked: { /** * Turns the given plain CSN model into a linked model * @see [capire](https://cap.cloud.sap/docs/node.js/cds-reflect) */ (model: csn.CSN): linked_2.LinkedCSN, /** * Base classes of linked definitions from reflected models. * @see [capire](https://cap.cloud.sap/docs/node.js/cds-reflect#cds-builtin-classes) */ classes: typeof classes, /** * @see [capire](https://cap.cloud.sap/docs/node.js/cds-reflect#linked-csn) */ LinkedCSN: linked_2.LinkedCSN, /** * @see [capire](https://cap.cloud.sap/docs/node.js/cds-reflect#iterable) */ LinkedDefinitions: IterableMap<linked_2.classes.any_>, }; export namespace linked { export type LinkedDefinitions = IterableMap<linked_2.classes.any_> export type LinkedCSN = linked_2.LinkedCSN // synthetic class that is prominently featured in capire, // but described as "accessible through cds.linked.classes.any" export type LinkedDefinition = linked_2.classes.any_ export namespace classes { export type type = __type export type aspect = __aspect export type any_ = __any_ export type scalar = __scalar // can not shadow builtins. Same for string and number... //export type boolean = LinkedClasses.Boolean // on purpose export type Boolean = __Boolean export type UUID = __UUID //export type string = LinkedClasses.String // on purpose export type String = __String export type LargeString = __LargeString export type Binary = __Binary export type LargeBinary = __LargeBinary export type Vector = __Vector //export type number = LinkedClasses.scalar // currently no better way to do this export type Integer = __Integer export type UInt8 = __UInt8 export type Int16 = __Int16 export type Int32 = __Int32 export type Int64 = __Int64 export type Float = __Float export type Double = __Double export type Decimal = __Decimal export type date = __date export type Date = __Date export type Time = __Time export type DateTime = __DateTime export type TimeStamp = __TimeStamp export type array = __array export type struct = __struct export type context_ = __context_ export type service = __service export type entity = __entity export type Association = __Association export type Composition = __Composition } } namespace linked_2 { export { ModelPart, Definition_2 as Definition, LinkedCSN, classes } } interface LinkedCSN extends Omit<csn.CSN, 'definitions'> { /** * Fetches definitions matching the given filter, returning an iterator on them. * @example * ```js * let m = cds.reflect (aParsedModel) * for (let d of m.each('entity')) console.log (d.kind, d.name) * let entities = [...m.each('entity')] //> capture all * let entities = m.all('entity') //> equivalent shortcut * ``` */ each<T extends any_>(x: Filter, defs?: Definitions<T>): IterableIterator<T> /** * Fetches definitions matching the given filter, returning them in an array. * Convenience shortcut for `[...reflect.each('entity')]` */ all<T extends any_>(x: Filter, defs?: Definitions<T>): T[] /** * Fetches definitions matching the given filter, returning the first match, if any. * @example * let service = model.find('service') * @param x - the filter * @param defs - the definitions to fetch in, default: `this.definitions` */ find<T extends any_>(x: Filter, defs?: Definitions<T>): T | undefined /** * Calls the visitor for each definition matching the given filter. * @see [capire](https://cap.cloud.sap/docs/node.js/cds-reflect#foreach) */ foreach(x: Filter, visitor: Visitor, defs?: Definitions): this foreach(visitor: Visitor, defs?: Definitions): this /** * Same as foreach but recursively visits each element definition * @see [capire](https://cap.cloud.sap/docs/node.js/cds-reflect#foreach) */ forall(x: Filter, visitor: Visitor, defs?: Definitions): this forall(visitor: Visitor, defs?: Definitions): this /** * Fetches definitions declared as children of a given parent context or service. * It fetches all definitions whose fully-qualified names start with the parent's name. * Returns the found definitions as an object with the local names as keys. * @example * ```js * let service = model.find ('service') * let entities = m.childrenOf (service) * ``` * @param parent - either the parent itself or its fully-qualified name * @param filter - an optional filter to apply before picking a child */ childrenOf(parent: any | string, filter?: ((def: any_) => boolean)): Definitions /** * Provides convenient access to the model's top-level definitions. * For example, you can use it in an es6-import-like fashion to avoid * working with fully-qualified names as follows: * * @example * ```js * let model = cds.reflect (cds.parse(` * namespace our.lovely.bookshop; * entity Books {...} * entity Authors {...} * `)) * const {Books,Authors} = model.exports * SELECT.from (Books) .where ({ID:11}) * ``` */ exports: IterableMap<any_> definitions: IterableMap<any_> entities: ModelPart<entity> services: ModelPart<service_> } /** * Shortcut for `cds.get(files, 'inferred')` * @param files - filenames of models or if folder containing models */ export function load (files: '*' | filename | filename[], o?: _options): Promise<csn.CSN> type Log = { /** * Logs a message * * @param message - text to log * @param optionalParams - additional parameters, same as in `console.log(text, param1, ...)` */ (message?: any, ...optionalParams: any[]): void, } /** * Create a new logger, or install a custom log formatter */ export const log: LogFactory; type LogFactory = { /** * Returns a trace logger for the given module if trace is switched on for it, * otherwise returns null. All cds runtime packages use this method for their * trace and debug output. * * By default this logger would prefix all output with `[sql] - ` * You can change this by specifying another prefix in the options: * @example * ```js * const LOG = cds.log('sql|db', { prefix: 'cds.ql' }) * ``` * * Call `cds.log()` for a given module again to dynamically change the log level * of all formerly created loggers, for example: * @example * ```js * const LOG = cds.log('sql') * LOG.info ('this will show, as default level is info') * cds.log('sql', 'warn') * LOG.info('this will be suppressed now') * ``` * * @param name - logger name