// // Copyright © 2020, 2021 Anticrm Platform Contributors. // Copyright © 2021 Hardcore Engineering Inc. // // Licensed under the Eclipse Public License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. You may // obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // // See the License for the specific language governing permissions and // limitations under the License. // import type { Asset, IntlString, Plugin } from '@hcengineering/platform' /** * @public */ export type Ref = string & { __ref: T } /** * @public */ export type PrimitiveType = number | string | boolean | undefined | Ref /** * @public */ export type Timestamp = number /** * @public */ export type Markup = string /** * @public */ export type Hyperlink = string /** * @public */ export interface Obj { _class: Ref> } /** * @public */ export interface Doc extends Obj { _id: Ref space: Ref modifiedOn: Timestamp modifiedBy: Ref createdBy?: Ref } /** * @public */ export type PropertyType = any /** * @public */ export interface UXObject extends Obj { label: IntlString icon?: Asset hidden?: boolean readonly?: boolean } /** * @public */ export interface AttachedDoc extends Doc { attachedTo: Ref attachedToClass: Ref> collection: string } /** * @public */ // eslint-disable-next-line @typescript-eslint/no-unused-vars export interface Type extends UXObject {} /** * @public */ export enum IndexKind { FullText, Indexed } /** * @public */ export interface Enum extends Doc { name: string enumValues: string[] } /** * @public */ export interface Attribute extends Doc, UXObject { attributeOf: Ref> name: string type: Type index?: IndexKind shortLabel?: IntlString isCustom?: boolean defaultValue?: any // Extra customization properties [key: string]: any } /** * @public */ export type AnyAttribute = Attribute> /** * @public */ export enum ClassifierKind { CLASS, INTERFACE, MIXIN } /** * @public */ export interface Classifier extends Doc, UXObject { kind: ClassifierKind } /** * @public */ export type Domain = string & { __domain: true } /** * @public */ // eslint-disable-next-line @typescript-eslint/no-unused-vars export interface Interface extends Classifier { extends?: Ref>[] } /** * @public */ // eslint-disable-next-line @typescript-eslint/no-unused-vars export interface Class extends Classifier { extends?: Ref> implements?: Ref>[] domain?: Domain shortLabel?: string sortingKey?: string } /** * @public * Define a set of plugin to model document bindings. */ export interface PluginConfiguration extends Doc { pluginId: Plugin transactions: Ref[] label?: IntlString icon?: Asset description?: IntlString enabled: boolean // If specified, will show beta/testing label in UI. beta: boolean // If defined, will only remove classes in list. classFilter?: Ref>[] } /** * @public */ export type Mixin = Class // D A T A /** * @public */ export type Data = Omit /** * @public */ export type AttachedData = Omit /** * @public */ export type DocData = T extends AttachedDoc ? AttachedData : Data // T Y P E S /** * @public */ export enum DateRangeMode { DATE = 'date', TIME = 'time', DATETIME = 'datetime' } /** * @public */ export interface TypeDate extends Type { // If not set date mode default mode: DateRangeMode // If not set to true, will be false withShift: boolean } /** * @public */ export interface RefTo extends Type>> { to: Ref> } /** * @public */ export interface Collection extends Type { of: Ref> itemLabel?: IntlString } /** * @public */ export type Arr = T[] /** * @public */ export interface ArrOf extends Type { of: Type } /** * @public */ export interface EnumOf extends Type { of: Ref } /** * @public */ export interface TypeHyperlink extends Type {} /** * @public */ export const DOMAIN_MODEL = 'model' as Domain /** * @public */ export const DOMAIN_CONFIGURATION = '_configuration' as Domain /** * @public */ export const DOMAIN_TRANSIENT = 'transient' as Domain /** * Special domain to access s3 blob data. * @public */ export const DOMAIN_BLOB = 'blob' as Domain /** * Special domain to access s3 blob data. * @public */ export const DOMAIN_FULLTEXT_BLOB = 'fulltext-blob' as Domain /** * Special domain to access s3 blob data. * @public */ export const DOMAIN_DOC_INDEX_STATE = 'doc-index-state' as Domain // S P A C E /** * @public */ export interface Space extends Doc { name: string description: string private: boolean members: Arr> archived: boolean } /** * @public */ export interface Account extends Doc { email: string role: AccountRole } /** * @public */ export enum AccountRole { User, Maintainer, Owner } /** * @public */ export interface UserStatus extends Doc { online: boolean } /** * @public */ export interface Version extends Doc { major: number minor: number patch: number } /** * @public */ export function versionToString (version: Version): string { return `${version?.major}.${version?.minor}.${version?.patch}` } /** * Blob data from s3 storage * @public */ export interface BlobData extends Doc { name: string size: number type: string base64Data: string // base64 encoded data } /** * Blob data from s3 storage * @public */ export interface FullTextData extends Doc { data: any } /** * @public * * Define status for full text indexing */ export interface DocIndexState extends Doc { objectClass: Ref> attachedTo?: Ref attachedToClass?: Ref> // States for stages stages: Record removed: boolean // Indexable attributes, including child ones. attributes: Record // Full Summary fullSummary?: Markup | null shortSummary?: Markup | null } /** * @public */ export interface IndexStageState extends Doc { stageId: string attributes: Record } /** * @public * * If defined for class, this class will be enabled for embedding search like openai. */ export interface FullTextSearchContext extends Class { fullTextSummary?: boolean forceIndex?: boolean // If defined, will propagate changes to child's with defined set of classes propagate?: Ref>[] // Do we need to propagate child value to parent one. Default(true) parentPropagate?: boolean } /** * @public */ export interface ConfigurationElement extends Class { // Title will be presented to owner. title: IntlString // Group for grouping. group: IntlString } /** * @public * * Define configuration value configuration for workspace. * * Configuration is accessible only for owners of workspace and under hood services. */ export interface Configuration extends Doc { enabled: boolean } /** * @public */ export type RelatedDocument = Pick /** * @public */ export enum IndexOrder { Ascending = 1, Descending = -1 } /** * @public */ export type FieldIndex = { [P in keyof T]?: IndexOrder } & { [key: string]: IndexOrder } /** * @public * * Mixin for extra indexing fields. */ export interface IndexingConfiguration extends Class { // Define a list of extra index definitions. indexes: (FieldIndex | string)[] }