@tldraw/tlschema
Version:
tldraw infinite canvas SDK (schema).
8 lines (7 loc) • 5.51 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../src/records/TLUser.ts"],
"sourcesContent": ["import {\n\tBaseRecord,\n\tcreateMigrationIds,\n\tcreateRecordMigrationSequence,\n\tcreateRecordType,\n\tRecordId,\n} from '@tldraw/store'\nimport { JsonObject } from '@tldraw/utils'\nimport { T } from '@tldraw/validate'\nimport { idValidator } from '../misc/id-validator'\n\n/**\n * A user record in a tldraw store. User records are document-scoped and\n * persist alongside shapes, assets, and pages. They are automatically\n * included in snapshots, clipboard content, and `.tldr` files so that\n * attribution display names survive across boards and sessions.\n *\n * User records are populated from the {@link @tldraw/tlschema#TLUserStore}\n * when the editor stamps attribution metadata onto shapes.\n *\n * Extend user records with custom metadata by passing validators to\n * {@link @tldraw/tlschema#createTLSchema} or {@link createUserRecordType}.\n *\n * @public\n */\nexport interface TLUser extends BaseRecord<'user', TLUserId> {\n\tname: string\n\tcolor: string\n\timageUrl: string\n\tmeta: JsonObject\n}\n\n/** @public */\nexport type TLUserId = RecordId<TLUser>\n\n/** @public */\nexport const userIdValidator = idValidator<TLUserId>('user')\n\n/** @public */\nexport const userVersions = createMigrationIds('com.tldraw.user', {\n\tInitial: 1,\n})\n\n/** @public */\nexport const userMigrations = createRecordMigrationSequence({\n\tsequenceId: 'com.tldraw.user',\n\trecordType: 'user',\n\tsequence: [\n\t\t{\n\t\t\tid: userVersions.Initial,\n\t\t\tup: (_record: any) => {\n\t\t\t\t// initial version \u2014 nothing to migrate\n\t\t\t},\n\t\t},\n\t],\n})\n\n/**\n * Creates a user record type with optional custom meta validation.\n *\n * When `meta` validators are provided, the user record's `meta` field will\n * validate those specific fields (when present) while still allowing\n * arbitrary additional JSON properties. Custom meta fields are treated as\n * optional so that user records created without them remain valid.\n *\n * @param config - Optional configuration for custom meta validators\n * @returns A configured user record type\n *\n * @example\n * ```ts\n * import { createUserRecordType } from '@tldraw/tlschema'\n * import { T } from '@tldraw/validate'\n *\n * const CustomUserRecordType = createUserRecordType({\n * meta: {\n * isAdmin: T.boolean,\n * department: T.string,\n * },\n * })\n * ```\n *\n * @public\n */\nexport function createUserRecordType(config?: { meta?: Record<string, T.Validatable<any>> }) {\n\tconst metaConfig = config?.meta\n\n\tconst metaValidator = metaConfig\n\t\t? T.object(\n\t\t\t\tObject.fromEntries(\n\t\t\t\t\tObject.entries(metaConfig).map(([key, v]) => [\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\tnew T.Validator((value) => {\n\t\t\t\t\t\t\tif (value === undefined) return undefined\n\t\t\t\t\t\t\treturn (v as T.Validator<unknown>).validate(value)\n\t\t\t\t\t\t}),\n\t\t\t\t\t])\n\t\t\t\t)\n\t\t\t).allowUnknownProperties()\n\t\t: (T.jsonValue as T.ObjectValidator<JsonObject>)\n\n\tconst validator: T.Validator<TLUser> = T.model(\n\t\t'user',\n\t\tT.object({\n\t\t\ttypeName: T.literal('user'),\n\t\t\tid: userIdValidator,\n\t\t\tname: T.string,\n\t\t\tcolor: T.string,\n\t\t\timageUrl: T.string,\n\t\t\tmeta: metaValidator as T.ObjectValidator<JsonObject>,\n\t\t})\n\t)\n\n\treturn createRecordType<TLUser>('user', {\n\t\tvalidator,\n\t\tscope: 'document',\n\t}).withDefaultProperties(() => ({\n\t\tname: '',\n\t\tcolor: '',\n\t\timageUrl: '',\n\t\tmeta: {},\n\t}))\n}\n\n/** @public */\nexport const userValidator: T.Validator<TLUser> = T.model(\n\t'user',\n\tT.object({\n\t\ttypeName: T.literal('user'),\n\t\tid: userIdValidator,\n\t\tname: T.string,\n\t\tcolor: T.string,\n\t\timageUrl: T.string,\n\t\tmeta: T.jsonValue as T.ObjectValidator<JsonObject>,\n\t})\n)\n\n/** @public */\nexport const UserRecordType = createUserRecordType()\n\n/** @public */\nexport function isUserId(id: string): id is TLUserId {\n\treturn UserRecordType.isId(id)\n}\n\n/** @public */\nexport function createUserId(id: string): TLUserId {\n\treturn UserRecordType.createId(id)\n}\n"],
"mappings": "AAAA;AAAA,EAEC;AAAA,EACA;AAAA,EACA;AAAA,OAEM;AAEP,SAAS,SAAS;AAClB,SAAS,mBAAmB;AA2BrB,MAAM,kBAAkB,YAAsB,MAAM;AAGpD,MAAM,eAAe,mBAAmB,mBAAmB;AAAA,EACjE,SAAS;AACV,CAAC;AAGM,MAAM,iBAAiB,8BAA8B;AAAA,EAC3D,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,IACT;AAAA,MACC,IAAI,aAAa;AAAA,MACjB,IAAI,CAAC,YAAiB;AAAA,MAEtB;AAAA,IACD;AAAA,EACD;AACD,CAAC;AA4BM,SAAS,qBAAqB,QAAwD;AAC5F,QAAM,aAAa,QAAQ;AAE3B,QAAM,gBAAgB,aACnB,EAAE;AAAA,IACF,OAAO;AAAA,MACN,OAAO,QAAQ,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM;AAAA,QAC5C;AAAA,QACA,IAAI,EAAE,UAAU,CAAC,UAAU;AAC1B,cAAI,UAAU,OAAW,QAAO;AAChC,iBAAQ,EAA2B,SAAS,KAAK;AAAA,QAClD,CAAC;AAAA,MACF,CAAC;AAAA,IACF;AAAA,EACD,EAAE,uBAAuB,IACvB,EAAE;AAEN,QAAM,YAAiC,EAAE;AAAA,IACxC;AAAA,IACA,EAAE,OAAO;AAAA,MACR,UAAU,EAAE,QAAQ,MAAM;AAAA,MAC1B,IAAI;AAAA,MACJ,MAAM,EAAE;AAAA,MACR,OAAO,EAAE;AAAA,MACT,UAAU,EAAE;AAAA,MACZ,MAAM;AAAA,IACP,CAAC;AAAA,EACF;AAEA,SAAO,iBAAyB,QAAQ;AAAA,IACvC;AAAA,IACA,OAAO;AAAA,EACR,CAAC,EAAE,sBAAsB,OAAO;AAAA,IAC/B,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,IACV,MAAM,CAAC;AAAA,EACR,EAAE;AACH;AAGO,MAAM,gBAAqC,EAAE;AAAA,EACnD;AAAA,EACA,EAAE,OAAO;AAAA,IACR,UAAU,EAAE,QAAQ,MAAM;AAAA,IAC1B,IAAI;AAAA,IACJ,MAAM,EAAE;AAAA,IACR,OAAO,EAAE;AAAA,IACT,UAAU,EAAE;AAAA,IACZ,MAAM,EAAE;AAAA,EACT,CAAC;AACF;AAGO,MAAM,iBAAiB,qBAAqB;AAG5C,SAAS,SAAS,IAA4B;AACpD,SAAO,eAAe,KAAK,EAAE;AAC9B;AAGO,SAAS,aAAa,IAAsB;AAClD,SAAO,eAAe,SAAS,EAAE;AAClC;",
"names": []
}