tldraw/packages/validate/api/api.json

5018 lines
166 KiB
JSON
Raw Normal View History

{
"metadata": {
"toolPackage": "@microsoft/api-extractor",
New migrations again (#3220) Describe what your pull request does. If appropriate, add GIFs or images showing the before and after. ### Change Type - [x] `sdk` — Changes the tldraw SDK - [x] `galaxy brain` — Architectural changes ### Test Plan 1. Add a step-by-step description of how to test your PR here. 2. - [ ] Unit Tests - [ ] End to end tests ### Release Notes #### BREAKING CHANGES - The `Migrations` type is now called `LegacyMigrations`. - The serialized schema format (e.g. returned by `StoreSchema.serialize()` and `Store.getSnapshot()`) has changed. You don't need to do anything about it unless you were reading data directly from the schema for some reason. In which case it'd be best to avoid that in the future! We have no plans to change the schema format again (this time was traumatic enough) but you never know. - `compareRecordVersions` and the `RecordVersion` type have both disappeared. There is no replacement. These were public by mistake anyway, so hopefully nobody had been using it. - `compareSchemas` is a bit less useful now. Our migrations system has become a little fuzzy to allow for simpler UX when adding/removing custom extensions and 3rd party dependencies, and as a result we can no longer compare serialized schemas in any rigorous manner. You can rely on this function to return `0` if the schemas are the same. Otherwise it will return `-1` if the schema on the right _seems_ to be newer than the schema on the left, but it cannot guarantee that in situations where migration sequences have been removed over time (e.g. if you remove one of the builtin tldraw shapes). Generally speaking, the best way to check schema compatibility now is to call `store.schema.getMigrationsSince(persistedSchema)`. This will throw an error if there is no upgrade path from the `persistedSchema` to the current version. - `defineMigrations` has been deprecated and will be removed in a future release. For upgrade instructions see https://tldraw.dev/docs/persistence#Updating-legacy-shape-migrations-defineMigrations - `migrate` has been removed. Nobody should have been using this but if you were you'll need to find an alternative. For migrating tldraw data, you should stick to using `schema.migrateStoreSnapshot` and, if you are building a nuanced sync engine that supports some amount of backwards compatibility, also feel free to use `schema.migratePersistedRecord`. - the `Migration` type has changed. If you need the old one for some reason it has been renamed to `LegacyMigration`. It will be removed in a future release. - the `Migrations` type has been renamed to `LegacyMigrations` and will be removed in a future release. - the `SerializedSchema` type has been augmented. If you need the old version specifically you can use `SerializedSchemaV1` --------- Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
2024-04-15 12:53:42 +00:00
"toolVersion": "7.43.1",
"schemaVersion": 1011,
"oldestForwardsCompatibleVersion": 1001,
"tsdocConfig": {
"$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json",
"noStandardTags": true,
"tagDefinitions": [
{
"tagName": "@alpha",
"syntaxKind": "modifier"
},
{
"tagName": "@beta",
"syntaxKind": "modifier"
},
{
"tagName": "@defaultValue",
"syntaxKind": "block"
},
{
"tagName": "@decorator",
"syntaxKind": "block",
"allowMultiple": true
},
{
"tagName": "@deprecated",
"syntaxKind": "block"
},
{
"tagName": "@eventProperty",
"syntaxKind": "modifier"
},
{
"tagName": "@example",
"syntaxKind": "block",
"allowMultiple": true
},
{
"tagName": "@experimental",
"syntaxKind": "modifier"
},
{
"tagName": "@inheritDoc",
"syntaxKind": "inline"
},
{
"tagName": "@internal",
"syntaxKind": "modifier"
},
{
"tagName": "@label",
"syntaxKind": "inline"
},
{
"tagName": "@link",
"syntaxKind": "inline",
"allowMultiple": true
},
{
"tagName": "@override",
"syntaxKind": "modifier"
},
{
"tagName": "@packageDocumentation",
"syntaxKind": "modifier"
},
{
"tagName": "@param",
"syntaxKind": "block",
"allowMultiple": true
},
{
"tagName": "@privateRemarks",
"syntaxKind": "block"
},
{
"tagName": "@public",
"syntaxKind": "modifier"
},
{
"tagName": "@readonly",
"syntaxKind": "modifier"
},
{
"tagName": "@remarks",
"syntaxKind": "block"
},
{
"tagName": "@returns",
"syntaxKind": "block"
},
{
"tagName": "@sealed",
"syntaxKind": "modifier"
},
{
"tagName": "@see",
"syntaxKind": "block"
},
{
"tagName": "@throws",
"syntaxKind": "block",
"allowMultiple": true
},
{
"tagName": "@typeParam",
"syntaxKind": "block",
"allowMultiple": true
},
{
"tagName": "@virtual",
"syntaxKind": "modifier"
},
{
"tagName": "@betaDocumentation",
"syntaxKind": "modifier"
},
{
"tagName": "@internalRemarks",
"syntaxKind": "block"
},
{
"tagName": "@preapproved",
"syntaxKind": "modifier"
}
],
"supportForTags": {
"@alpha": true,
"@beta": true,
"@defaultValue": true,
"@decorator": true,
"@deprecated": true,
"@eventProperty": true,
"@example": true,
"@experimental": true,
"@inheritDoc": true,
"@internal": true,
"@label": true,
"@link": true,
"@override": true,
"@packageDocumentation": true,
"@param": true,
"@privateRemarks": true,
"@public": true,
"@readonly": true,
"@remarks": true,
"@returns": true,
"@sealed": true,
"@see": true,
"@throws": true,
"@typeParam": true,
"@virtual": true,
"@betaDocumentation": true,
"@internalRemarks": true,
"@preapproved": true
},
"reportUnsupportedHtmlElements": false
}
},
"kind": "Package",
"canonicalReference": "@tldraw/validate!",
"docComment": "",
"name": "@tldraw/validate",
"preserveMemberOrder": false,
"members": [
{
"kind": "EntryPoint",
"canonicalReference": "@tldraw/validate!",
"name": "",
"preserveMemberOrder": false,
"members": [
{
"kind": "Class",
"canonicalReference": "@tldraw/validate!ArrayOfValidator:class",
"docComment": "/**\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export declare class ArrayOfValidator<T> extends "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<T[]>"
},
{
"kind": "Content",
"text": " "
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"releaseTag": "Public",
"typeParameters": [
{
"typeParameterName": "T",
"constraintTokenRange": {
"startIndex": 0,
"endIndex": 0
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"isAbstract": false,
"name": "ArrayOfValidator",
"preserveMemberOrder": false,
"members": [
{
"kind": "Constructor",
"canonicalReference": "@tldraw/validate!ArrayOfValidator:constructor(1)",
"docComment": "/**\n * Constructs a new instance of the `ArrayOfValidator` class\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "constructor(itemValidator: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<T>"
},
{
"kind": "Content",
"text": ");"
}
],
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "itemValidator",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"isOptional": false
}
]
},
{
"kind": "Property",
"canonicalReference": "@tldraw/validate!ArrayOfValidator#itemValidator:member",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "readonly itemValidator: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<T>"
},
{
"kind": "Content",
"text": ";"
}
],
"isReadonly": true,
"isOptional": false,
"releaseTag": "Public",
"name": "itemValidator",
"propertyTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"isStatic": false,
"isProtected": false,
"isAbstract": false
},
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!ArrayOfValidator#lengthGreaterThan1:member(1)",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "lengthGreaterThan1(): "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<T[]>"
},
{
"kind": "Content",
"text": ";"
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [],
"isOptional": false,
"isAbstract": false,
"name": "lengthGreaterThan1"
},
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!ArrayOfValidator#nonEmpty:member(1)",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "nonEmpty(): "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<T[]>"
},
{
"kind": "Content",
"text": ";"
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [],
"isOptional": false,
"isAbstract": false,
"name": "nonEmpty"
}
],
"extendsTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"implementsTokenRanges": []
},
{
"kind": "Class",
"canonicalReference": "@tldraw/validate!DictValidator:class",
"docComment": "/**\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export declare class DictValidator<Key extends "
},
{
"kind": "Content",
"text": "string"
},
{
"kind": "Content",
"text": ", Value> extends "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<"
},
{
"kind": "Reference",
"text": "Record",
"canonicalReference": "!Record:type"
},
{
"kind": "Content",
"text": "<Key, Value>>"
},
{
"kind": "Content",
"text": " "
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"releaseTag": "Public",
"typeParameters": [
{
"typeParameterName": "Key",
"constraintTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
},
{
"typeParameterName": "Value",
"constraintTokenRange": {
"startIndex": 0,
"endIndex": 0
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"isAbstract": false,
"name": "DictValidator",
"preserveMemberOrder": false,
"members": [
{
"kind": "Constructor",
"canonicalReference": "@tldraw/validate!DictValidator:constructor(1)",
"docComment": "/**\n * Constructs a new instance of the `DictValidator` class\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "constructor(keyValidator: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<Key>"
},
{
"kind": "Content",
"text": ", valueValidator: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<Value>"
},
{
"kind": "Content",
"text": ");"
}
],
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "keyValidator",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"isOptional": false
},
{
"parameterName": "valueValidator",
"parameterTypeTokenRange": {
"startIndex": 4,
"endIndex": 6
},
"isOptional": false
}
]
},
{
"kind": "Property",
"canonicalReference": "@tldraw/validate!DictValidator#keyValidator:member",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "readonly keyValidator: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<Key>"
},
{
"kind": "Content",
"text": ";"
}
],
"isReadonly": true,
"isOptional": false,
"releaseTag": "Public",
"name": "keyValidator",
"propertyTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"isStatic": false,
"isProtected": false,
"isAbstract": false
},
{
"kind": "Property",
"canonicalReference": "@tldraw/validate!DictValidator#valueValidator:member",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "readonly valueValidator: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<Value>"
},
{
"kind": "Content",
"text": ";"
}
],
"isReadonly": true,
"isOptional": false,
"releaseTag": "Public",
"name": "valueValidator",
"propertyTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"isStatic": false,
"isProtected": false,
"isAbstract": false
}
],
"extendsTokenRange": {
"startIndex": 3,
"endIndex": 7
},
"implementsTokenRanges": []
},
{
"kind": "Class",
"canonicalReference": "@tldraw/validate!ObjectValidator:class",
"docComment": "/**\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export declare class ObjectValidator<Shape extends "
},
{
"kind": "Content",
"text": "object"
},
{
"kind": "Content",
"text": "> extends "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<Shape>"
},
{
"kind": "Content",
"text": " "
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"releaseTag": "Public",
"typeParameters": [
{
"typeParameterName": "Shape",
"constraintTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"isAbstract": false,
"name": "ObjectValidator",
"preserveMemberOrder": false,
"members": [
{
"kind": "Constructor",
"canonicalReference": "@tldraw/validate!ObjectValidator:constructor(1)",
"docComment": "/**\n * Constructs a new instance of the `ObjectValidator` class\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "constructor(config: "
},
{
"kind": "Content",
"text": "{\n readonly [K in keyof Shape]: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<Shape[K]>;\n }"
},
{
"kind": "Content",
"text": ", shouldAllowUnknownProperties?: "
},
{
"kind": "Content",
"text": "boolean"
},
{
"kind": "Content",
"text": ");"
}
],
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "config",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 4
},
"isOptional": false
},
{
"parameterName": "shouldAllowUnknownProperties",
"parameterTypeTokenRange": {
"startIndex": 5,
"endIndex": 6
},
"isOptional": true
}
]
},
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!ObjectValidator#allowUnknownProperties:member(1)",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "allowUnknownProperties(): "
},
{
"kind": "Reference",
"text": "ObjectValidator",
"canonicalReference": "@tldraw/validate!ObjectValidator:class"
},
{
"kind": "Content",
"text": "<Shape>"
},
{
"kind": "Content",
"text": ";"
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [],
"isOptional": false,
"isAbstract": false,
"name": "allowUnknownProperties"
},
{
"kind": "Property",
"canonicalReference": "@tldraw/validate!ObjectValidator#config:member",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "readonly config: "
},
{
"kind": "Content",
"text": "{\n readonly [K in keyof Shape]: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<Shape[K]>;\n }"
},
{
"kind": "Content",
"text": ";"
}
],
"isReadonly": true,
"isOptional": false,
"releaseTag": "Public",
"name": "config",
"propertyTypeTokenRange": {
"startIndex": 1,
"endIndex": 4
},
"isStatic": false,
"isProtected": false,
"isAbstract": false
},
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!ObjectValidator#extend:member(1)",
"docComment": "/**\n * Extend an object validator by adding additional properties.\n *\n * @example\n * ```ts\n * const animalValidator = T.object({\n * \tname: T.string,\n * })\n * const catValidator = animalValidator.extend({\n * \tmeowVolume: T.number,\n * })\n * ```\n *\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "extend<Extension extends "
},
{
"kind": "Reference",
"text": "Record",
"canonicalReference": "!Record:type"
},
{
"kind": "Content",
"text": "<string, unknown>"
},
{
"kind": "Content",
"text": ">(extension: "
},
{
"kind": "Content",
"text": "{\n readonly [K in keyof Extension]: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<Extension[K]>;\n }"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Reference",
"text": "ObjectValidator",
"canonicalReference": "@tldraw/validate!ObjectValidator:class"
},
{
"kind": "Content",
"text": "<Shape & Extension>"
},
{
"kind": "Content",
"text": ";"
}
],
"typeParameters": [
{
"typeParameterName": "Extension",
"constraintTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 8,
"endIndex": 10
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "extension",
"parameterTypeTokenRange": {
"startIndex": 4,
"endIndex": 7
},
"isOptional": false
}
],
"isOptional": false,
"isAbstract": false,
"name": "extend"
}
],
"extendsTokenRange": {
"startIndex": 3,
"endIndex": 5
},
"implementsTokenRanges": []
},
{
"kind": "Namespace",
"canonicalReference": "@tldraw/validate!T:namespace",
"docComment": "",
"excerptTokens": [],
"fileUrlPath": "packages/validate/src/index.ts",
"releaseTag": "None",
"name": "T",
"preserveMemberOrder": false,
"members": [
{
"kind": "Variable",
"canonicalReference": "@tldraw/validate!T.any:var",
"docComment": "/**\n * Validation that accepts any value. Generally this should be avoided, but you can use it as an escape hatch if you want to work without validations for e.g. a prototype.\n *\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "any: "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<any>"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"isReadonly": true,
"releaseTag": "Public",
"name": "any",
"variableTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
}
},
{
"kind": "Variable",
"canonicalReference": "@tldraw/validate!T.array:var",
"docComment": "/**\n * Validates that a value is an array. To check the contents of the array, use T.arrayOf.\n *\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "array: "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<unknown[]>"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"isReadonly": true,
"releaseTag": "Public",
"name": "array",
"variableTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
}
},
{
"kind": "Function",
"canonicalReference": "@tldraw/validate!T.arrayOf:function(1)",
"docComment": "/**\n * Validates that a value is an array whose contents matches the passed-in validator.\n *\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export declare function arrayOf<T>(itemValidator: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<T>"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Reference",
"text": "ArrayOfValidator",
"canonicalReference": "@tldraw/validate!ArrayOfValidator:class"
},
{
"kind": "Content",
"text": "<T>"
},
{
"kind": "Content",
"text": ";"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"returnTypeTokenRange": {
"startIndex": 4,
"endIndex": 6
},
"releaseTag": "Public",
"overloadIndex": 1,
"parameters": [
{
"parameterName": "itemValidator",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"isOptional": false
}
],
"typeParameters": [
{
"typeParameterName": "T",
"constraintTokenRange": {
"startIndex": 0,
"endIndex": 0
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"name": "arrayOf"
},
{
"kind": "Class",
"canonicalReference": "@tldraw/validate!T.ArrayOfValidator:class",
"docComment": "/**\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export declare class ArrayOfValidator<T> extends "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<T[]>"
},
{
"kind": "Content",
"text": " "
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"releaseTag": "Public",
"typeParameters": [
{
"typeParameterName": "T",
"constraintTokenRange": {
"startIndex": 0,
"endIndex": 0
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"isAbstract": false,
"name": "ArrayOfValidator",
"preserveMemberOrder": false,
"members": [
{
"kind": "Constructor",
"canonicalReference": "@tldraw/validate!T.ArrayOfValidator:constructor(1)",
"docComment": "/**\n * Constructs a new instance of the `ArrayOfValidator` class\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "constructor(itemValidator: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<T>"
},
{
"kind": "Content",
"text": ");"
}
],
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "itemValidator",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"isOptional": false
}
]
},
{
"kind": "Property",
"canonicalReference": "@tldraw/validate!T.ArrayOfValidator#itemValidator:member",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "readonly itemValidator: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<T>"
},
{
"kind": "Content",
"text": ";"
}
],
"isReadonly": true,
"isOptional": false,
"releaseTag": "Public",
"name": "itemValidator",
"propertyTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"isStatic": false,
"isProtected": false,
"isAbstract": false
},
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!T.ArrayOfValidator#lengthGreaterThan1:member(1)",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "lengthGreaterThan1(): "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<T[]>"
},
{
"kind": "Content",
"text": ";"
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [],
"isOptional": false,
"isAbstract": false,
"name": "lengthGreaterThan1"
},
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!T.ArrayOfValidator#nonEmpty:member(1)",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "nonEmpty(): "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<T[]>"
},
{
"kind": "Content",
"text": ";"
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [],
"isOptional": false,
"isAbstract": false,
"name": "nonEmpty"
}
],
"extendsTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"implementsTokenRanges": []
},
{
"kind": "Variable",
"canonicalReference": "@tldraw/validate!T.bigint:var",
"docComment": "/**\n * Validates that a value is a bigint.\n *\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "bigint: "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<bigint>"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"isReadonly": true,
"releaseTag": "Public",
"name": "bigint",
"variableTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
}
},
{
"kind": "Variable",
"canonicalReference": "@tldraw/validate!T.boolean:var",
"docComment": "/**\n * Validates that a value is boolean.\n *\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "boolean: "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<boolean>"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"isReadonly": true,
"releaseTag": "Public",
"name": "boolean",
"variableTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
}
},
{
"kind": "Function",
"canonicalReference": "@tldraw/validate!T.dict:function(1)",
"docComment": "/**\n * Validation that an option is a dict with particular keys and values.\n *\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export declare function dict<Key extends "
},
{
"kind": "Content",
"text": "string"
},
{
"kind": "Content",
"text": ", Value>(keyValidator: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<Key>"
},
{
"kind": "Content",
"text": ", valueValidator: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<Value>"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Reference",
"text": "DictValidator",
"canonicalReference": "@tldraw/validate!DictValidator:class"
},
{
"kind": "Content",
"text": "<Key, Value>"
},
{
"kind": "Content",
"text": ";"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"returnTypeTokenRange": {
"startIndex": 9,
"endIndex": 11
},
"releaseTag": "Public",
"overloadIndex": 1,
"parameters": [
{
"parameterName": "keyValidator",
"parameterTypeTokenRange": {
"startIndex": 3,
"endIndex": 5
},
"isOptional": false
},
{
"parameterName": "valueValidator",
"parameterTypeTokenRange": {
"startIndex": 6,
"endIndex": 8
},
"isOptional": false
}
],
"typeParameters": [
{
"typeParameterName": "Key",
"constraintTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
},
{
"typeParameterName": "Value",
"constraintTokenRange": {
"startIndex": 0,
"endIndex": 0
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"name": "dict"
},
{
"kind": "Class",
"canonicalReference": "@tldraw/validate!T.DictValidator:class",
"docComment": "/**\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export declare class DictValidator<Key extends "
},
{
"kind": "Content",
"text": "string"
},
{
"kind": "Content",
"text": ", Value> extends "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<"
},
{
"kind": "Reference",
"text": "Record",
"canonicalReference": "!Record:type"
},
{
"kind": "Content",
"text": "<Key, Value>>"
},
{
"kind": "Content",
"text": " "
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"releaseTag": "Public",
"typeParameters": [
{
"typeParameterName": "Key",
"constraintTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
},
{
"typeParameterName": "Value",
"constraintTokenRange": {
"startIndex": 0,
"endIndex": 0
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"isAbstract": false,
"name": "DictValidator",
"preserveMemberOrder": false,
"members": [
{
"kind": "Constructor",
"canonicalReference": "@tldraw/validate!T.DictValidator:constructor(1)",
"docComment": "/**\n * Constructs a new instance of the `DictValidator` class\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "constructor(keyValidator: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<Key>"
},
{
"kind": "Content",
"text": ", valueValidator: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<Value>"
},
{
"kind": "Content",
"text": ");"
}
],
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "keyValidator",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"isOptional": false
},
{
"parameterName": "valueValidator",
"parameterTypeTokenRange": {
"startIndex": 4,
"endIndex": 6
},
"isOptional": false
}
]
},
{
"kind": "Property",
"canonicalReference": "@tldraw/validate!T.DictValidator#keyValidator:member",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "readonly keyValidator: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<Key>"
},
{
"kind": "Content",
"text": ";"
}
],
"isReadonly": true,
"isOptional": false,
"releaseTag": "Public",
"name": "keyValidator",
"propertyTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"isStatic": false,
"isProtected": false,
"isAbstract": false
},
{
"kind": "Property",
"canonicalReference": "@tldraw/validate!T.DictValidator#valueValidator:member",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "readonly valueValidator: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<Value>"
},
{
"kind": "Content",
"text": ";"
}
],
"isReadonly": true,
"isOptional": false,
"releaseTag": "Public",
"name": "valueValidator",
"propertyTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"isStatic": false,
"isProtected": false,
"isAbstract": false
}
],
"extendsTokenRange": {
"startIndex": 3,
"endIndex": 7
},
"implementsTokenRanges": []
},
{
"kind": "Variable",
"canonicalReference": "@tldraw/validate!T.indexKey:var",
"docComment": "/**\n * Validates that a value is an IndexKey.\n *\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "indexKey: "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<"
},
{
"kind": "Reference",
"text": "IndexKey",
"canonicalReference": "@tldraw/utils!IndexKey:type"
},
{
"kind": "Content",
"text": ">"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"isReadonly": true,
"releaseTag": "Public",
"name": "indexKey",
"variableTypeTokenRange": {
"startIndex": 1,
"endIndex": 5
}
},
{
"kind": "Variable",
"canonicalReference": "@tldraw/validate!T.integer:var",
"docComment": "/**\n * Fails if number is not an integer\n *\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "integer: "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<number>"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"isReadonly": true,
"releaseTag": "Public",
"name": "integer",
"variableTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
}
},
{
"kind": "Function",
"canonicalReference": "@tldraw/validate!T.jsonDict:function(1)",
"docComment": "/**\n * Validate an object has a particular shape.\n *\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export declare function jsonDict(): "
},
{
"kind": "Reference",
"text": "DictValidator",
"canonicalReference": "@tldraw/validate!DictValidator:class"
},
{
"kind": "Content",
"text": "<string, "
},
{
"kind": "Reference",
"text": "JsonValue",
"canonicalReference": "@tldraw/utils!JsonValue:type"
},
{
"kind": "Content",
"text": ">"
},
{
"kind": "Content",
"text": ";"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"returnTypeTokenRange": {
"startIndex": 1,
"endIndex": 5
},
"releaseTag": "Public",
"overloadIndex": 1,
"parameters": [],
"name": "jsonDict"
},
{
"kind": "Variable",
"canonicalReference": "@tldraw/validate!T.jsonValue:var",
"docComment": "/**\n * Validate that a value is valid JSON.\n *\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "jsonValue: "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<"
},
{
"kind": "Reference",
"text": "JsonValue",
"canonicalReference": "@tldraw/utils!JsonValue:type"
},
{
"kind": "Content",
"text": ">"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"isReadonly": true,
"releaseTag": "Public",
"name": "jsonValue",
"variableTypeTokenRange": {
"startIndex": 1,
"endIndex": 5
}
},
{
"kind": "Variable",
"canonicalReference": "@tldraw/validate!T.linkUrl:var",
"docComment": "/**\n * Validates that a value is a url safe to use as a link.\n *\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "linkUrl: "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<string>"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"isReadonly": true,
"releaseTag": "Public",
"name": "linkUrl",
"variableTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
}
},
{
"kind": "Function",
"canonicalReference": "@tldraw/validate!T.literal:function(1)",
"docComment": "/**\n * Validates that a value matches another that was passed in.\n *\n * @example\n * ```ts\n * const trueValidator = T.literal(true)\n * ```\n *\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export declare function literal<T extends "
},
{
"kind": "Content",
"text": "boolean | number | string"
},
{
"kind": "Content",
"text": ">(expectedValue: "
},
{
"kind": "Content",
"text": "T"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<T>"
},
{
"kind": "Content",
"text": ";"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"returnTypeTokenRange": {
"startIndex": 5,
"endIndex": 7
},
"releaseTag": "Public",
"overloadIndex": 1,
"parameters": [
{
"parameterName": "expectedValue",
"parameterTypeTokenRange": {
"startIndex": 3,
"endIndex": 4
},
"isOptional": false
}
],
"typeParameters": [
{
"typeParameterName": "T",
"constraintTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"name": "literal"
},
{
"kind": "Function",
"canonicalReference": "@tldraw/validate!T.literalEnum:function(1)",
"docComment": "/**\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export declare function literalEnum<const Values extends "
},
{
"kind": "Content",
"text": "readonly unknown[]"
},
{
"kind": "Content",
"text": ">(...values: "
},
{
"kind": "Content",
"text": "Values"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<Values[number]>"
},
{
"kind": "Content",
"text": ";"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"returnTypeTokenRange": {
"startIndex": 5,
"endIndex": 7
},
"releaseTag": "Public",
"overloadIndex": 1,
"parameters": [
{
"parameterName": "values",
"parameterTypeTokenRange": {
"startIndex": 3,
"endIndex": 4
},
"isOptional": false
}
],
"typeParameters": [
{
"typeParameterName": "Values",
"constraintTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"name": "literalEnum"
},
{
"kind": "Function",
"canonicalReference": "@tldraw/validate!T.model:function(1)",
"docComment": "/**\n * A named object with an ID. Errors will be reported as being part of the object with the given name.\n *\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export declare function model<T extends "
},
{
"kind": "Content",
"text": "{\n readonly id: string;\n}"
},
{
"kind": "Content",
"text": ">(name: "
},
{
"kind": "Content",
"text": "string"
},
{
"kind": "Content",
"text": ", validator: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<T>"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<T>"
},
{
"kind": "Content",
"text": ";"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"returnTypeTokenRange": {
"startIndex": 8,
"endIndex": 10
},
"releaseTag": "Public",
"overloadIndex": 1,
"parameters": [
{
"parameterName": "name",
"parameterTypeTokenRange": {
"startIndex": 3,
"endIndex": 4
},
"isOptional": false
},
{
"parameterName": "validator",
"parameterTypeTokenRange": {
"startIndex": 5,
"endIndex": 7
},
"isOptional": false
}
],
"typeParameters": [
{
"typeParameterName": "T",
"constraintTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"name": "model"
},
{
"kind": "Variable",
"canonicalReference": "@tldraw/validate!T.nonZeroInteger:var",
"docComment": "/**\n * Fails if value \\<= 0 and is not an integer\n *\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "nonZeroInteger: "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<number>"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"isReadonly": true,
"releaseTag": "Public",
"name": "nonZeroInteger",
"variableTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
}
},
{
"kind": "Variable",
"canonicalReference": "@tldraw/validate!T.nonZeroNumber:var",
"docComment": "/**\n * Fails if value \\<= 0\n *\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "nonZeroNumber: "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<number>"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"isReadonly": true,
"releaseTag": "Public",
"name": "nonZeroNumber",
"variableTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
}
},
{
"kind": "Function",
"canonicalReference": "@tldraw/validate!T.nullable:function(1)",
"docComment": "/**\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export declare function nullable<T>(validator: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<T>"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<null | T>"
},
{
"kind": "Content",
"text": ";"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"returnTypeTokenRange": {
"startIndex": 4,
"endIndex": 6
},
"releaseTag": "Public",
"overloadIndex": 1,
"parameters": [
{
"parameterName": "validator",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"isOptional": false
}
],
"typeParameters": [
{
"typeParameterName": "T",
"constraintTokenRange": {
"startIndex": 0,
"endIndex": 0
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"name": "nullable"
},
{
"kind": "Variable",
"canonicalReference": "@tldraw/validate!T.number:var",
"docComment": "/**\n * Validates that a value is a finite non-NaN number.\n *\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "number: "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<number>"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"isReadonly": true,
"releaseTag": "Public",
"name": "number",
"variableTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
}
},
{
"kind": "Function",
"canonicalReference": "@tldraw/validate!T.object:function(1)",
"docComment": "/**\n * Validate an object has a particular shape.\n *\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export declare function object<Shape extends "
},
{
"kind": "Content",
"text": "object"
},
{
"kind": "Content",
"text": ">(config: "
},
{
"kind": "Content",
"text": "{\n readonly [K in keyof Shape]: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<Shape[K]>;\n}"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Reference",
"text": "ObjectValidator",
"canonicalReference": "@tldraw/validate!ObjectValidator:class"
},
{
"kind": "Content",
Faster validations + record reference stability at the same time (#2848) This PR adds a validation mode whereby previous known-to-be-valid values can be used to speed up the validation process itself. At the same time it enables us to do fine-grained equality checking on records much more quickly than by using something like lodash isEqual, and using that we can prevent triggering effects for record updates that don't actually alter any values in the store. Here's some preliminary perf testing of average time spent in `store.put()` during some common interactions | task | before (ms) | after (ms) | | ---- | ---- | ---- | | drawing lines | 0.0403 | 0.0214 | | drawing boxes | 0.0408 | 0.0348 | | translating lines | 0.0352 | 0.0042 | | translating boxes | 0.0051 | 0.0032 | | rotating lines | 0.0312 | 0.0065 | | rotating boxes | 0.0053 | 0.0035 | | brush selecting boxes | 0.0200 | 0.0232 | | traversal with shapes | 0.0130 | 0.0108 | | traversal without shapes | 0.0201 | 0.0173 | **traversal** means moving the camera and pointer around the canvas #### Discussion At the scale of hundredths of a millisecond these .put operations are so fast that even if they became literally instantaneous the change would not be human perceptible. That said, there is an overall marked improvement here. Especially for dealing with draw shapes. These figures are also mostly in line with expectations, aside from a couple of things: - I don't understand why the `brush selecting boxes` task got slower after the change. - I don't understand why the `traversal` tasks are slower than the `translating boxes` task, both before and after. I would expect that .putting shape records would be much slower than .putting pointer/camera records (since the latter have fewer and simpler properties) ### Change Type - [x] `patch` — Bug fix ### Test Plan 1. Add a step-by-step description of how to test your PR here. 2. - [ ] Unit Tests - [ ] End to end tests ### Release Notes - Add a brief release note for your PR here.
2024-02-20 12:35:25 +00:00
"text": "<{\n [P in "
},
{
"kind": "Reference",
"text": "ExtractRequiredKeys",
"canonicalReference": "@tldraw/validate!~ExtractRequiredKeys:type"
},
{
"kind": "Content",
"text": "<Shape>]: Shape[P];\n} & {\n [P in "
},
{
"kind": "Reference",
"text": "ExtractOptionalKeys",
"canonicalReference": "@tldraw/validate!~ExtractOptionalKeys:type"
},
{
"kind": "Content",
"text": "<Shape>]?: Shape[P];\n}>"
},
{
"kind": "Content",
"text": ";"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"returnTypeTokenRange": {
"startIndex": 7,
Faster validations + record reference stability at the same time (#2848) This PR adds a validation mode whereby previous known-to-be-valid values can be used to speed up the validation process itself. At the same time it enables us to do fine-grained equality checking on records much more quickly than by using something like lodash isEqual, and using that we can prevent triggering effects for record updates that don't actually alter any values in the store. Here's some preliminary perf testing of average time spent in `store.put()` during some common interactions | task | before (ms) | after (ms) | | ---- | ---- | ---- | | drawing lines | 0.0403 | 0.0214 | | drawing boxes | 0.0408 | 0.0348 | | translating lines | 0.0352 | 0.0042 | | translating boxes | 0.0051 | 0.0032 | | rotating lines | 0.0312 | 0.0065 | | rotating boxes | 0.0053 | 0.0035 | | brush selecting boxes | 0.0200 | 0.0232 | | traversal with shapes | 0.0130 | 0.0108 | | traversal without shapes | 0.0201 | 0.0173 | **traversal** means moving the camera and pointer around the canvas #### Discussion At the scale of hundredths of a millisecond these .put operations are so fast that even if they became literally instantaneous the change would not be human perceptible. That said, there is an overall marked improvement here. Especially for dealing with draw shapes. These figures are also mostly in line with expectations, aside from a couple of things: - I don't understand why the `brush selecting boxes` task got slower after the change. - I don't understand why the `traversal` tasks are slower than the `translating boxes` task, both before and after. I would expect that .putting shape records would be much slower than .putting pointer/camera records (since the latter have fewer and simpler properties) ### Change Type - [x] `patch` — Bug fix ### Test Plan 1. Add a step-by-step description of how to test your PR here. 2. - [ ] Unit Tests - [ ] End to end tests ### Release Notes - Add a brief release note for your PR here.
2024-02-20 12:35:25 +00:00
"endIndex": 13
},
"releaseTag": "Public",
"overloadIndex": 1,
"parameters": [
{
"parameterName": "config",
"parameterTypeTokenRange": {
"startIndex": 3,
"endIndex": 6
},
"isOptional": false
}
],
"typeParameters": [
{
"typeParameterName": "Shape",
"constraintTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"name": "object"
},
{
"kind": "Class",
"canonicalReference": "@tldraw/validate!T.ObjectValidator:class",
"docComment": "/**\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export declare class ObjectValidator<Shape extends "
},
{
"kind": "Content",
"text": "object"
},
{
"kind": "Content",
"text": "> extends "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<Shape>"
},
{
"kind": "Content",
"text": " "
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"releaseTag": "Public",
"typeParameters": [
{
"typeParameterName": "Shape",
"constraintTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"isAbstract": false,
"name": "ObjectValidator",
"preserveMemberOrder": false,
"members": [
{
"kind": "Constructor",
"canonicalReference": "@tldraw/validate!T.ObjectValidator:constructor(1)",
"docComment": "/**\n * Constructs a new instance of the `ObjectValidator` class\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "constructor(config: "
},
{
"kind": "Content",
"text": "{\n readonly [K in keyof Shape]: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<Shape[K]>;\n }"
},
{
"kind": "Content",
"text": ", shouldAllowUnknownProperties?: "
},
{
"kind": "Content",
"text": "boolean"
},
{
"kind": "Content",
"text": ");"
}
],
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "config",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 4
},
"isOptional": false
},
{
"parameterName": "shouldAllowUnknownProperties",
"parameterTypeTokenRange": {
"startIndex": 5,
"endIndex": 6
},
"isOptional": true
}
]
},
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!T.ObjectValidator#allowUnknownProperties:member(1)",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "allowUnknownProperties(): "
},
{
"kind": "Reference",
"text": "ObjectValidator",
"canonicalReference": "@tldraw/validate!ObjectValidator:class"
},
{
"kind": "Content",
"text": "<Shape>"
},
{
"kind": "Content",
"text": ";"
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [],
"isOptional": false,
"isAbstract": false,
"name": "allowUnknownProperties"
},
{
"kind": "Property",
"canonicalReference": "@tldraw/validate!T.ObjectValidator#config:member",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "readonly config: "
},
{
"kind": "Content",
"text": "{\n readonly [K in keyof Shape]: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<Shape[K]>;\n }"
},
{
"kind": "Content",
"text": ";"
}
],
"isReadonly": true,
"isOptional": false,
"releaseTag": "Public",
"name": "config",
"propertyTypeTokenRange": {
"startIndex": 1,
"endIndex": 4
},
"isStatic": false,
"isProtected": false,
"isAbstract": false
},
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!T.ObjectValidator#extend:member(1)",
"docComment": "/**\n * Extend an object validator by adding additional properties.\n *\n * @example\n * ```ts\n * const animalValidator = T.object({\n * \tname: T.string,\n * })\n * const catValidator = animalValidator.extend({\n * \tmeowVolume: T.number,\n * })\n * ```\n *\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "extend<Extension extends "
},
{
"kind": "Reference",
"text": "Record",
"canonicalReference": "!Record:type"
},
{
"kind": "Content",
"text": "<string, unknown>"
},
{
"kind": "Content",
"text": ">(extension: "
},
{
"kind": "Content",
"text": "{\n readonly [K in keyof Extension]: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<Extension[K]>;\n }"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Reference",
"text": "ObjectValidator",
"canonicalReference": "@tldraw/validate!ObjectValidator:class"
},
{
"kind": "Content",
"text": "<Shape & Extension>"
},
{
"kind": "Content",
"text": ";"
}
],
"typeParameters": [
{
"typeParameterName": "Extension",
"constraintTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 8,
"endIndex": 10
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "extension",
"parameterTypeTokenRange": {
"startIndex": 4,
"endIndex": 7
},
"isOptional": false
}
],
"isOptional": false,
"isAbstract": false,
"name": "extend"
}
],
"extendsTokenRange": {
"startIndex": 3,
"endIndex": 5
},
"implementsTokenRanges": []
},
{
"kind": "Function",
"canonicalReference": "@tldraw/validate!T.optional:function(1)",
"docComment": "/**\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export declare function optional<T>(validator: "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<T>"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<T | undefined>"
},
{
"kind": "Content",
"text": ";"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"returnTypeTokenRange": {
"startIndex": 4,
"endIndex": 6
},
"releaseTag": "Public",
"overloadIndex": 1,
"parameters": [
{
"parameterName": "validator",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"isOptional": false
}
],
"typeParameters": [
{
"typeParameterName": "T",
"constraintTokenRange": {
"startIndex": 0,
"endIndex": 0
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"name": "optional"
},
{
"kind": "Variable",
"canonicalReference": "@tldraw/validate!T.positiveInteger:var",
"docComment": "/**\n * Fails if value \\< 0 and is not an integer\n *\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "positiveInteger: "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<number>"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"isReadonly": true,
"releaseTag": "Public",
"name": "positiveInteger",
"variableTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
}
},
{
"kind": "Variable",
"canonicalReference": "@tldraw/validate!T.positiveNumber:var",
"docComment": "/**\n * Fails if value \\< 0\n *\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "positiveNumber: "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<number>"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"isReadonly": true,
"releaseTag": "Public",
"name": "positiveNumber",
"variableTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
}
},
{
"kind": "Function",
"canonicalReference": "@tldraw/validate!T.setEnum:function(1)",
"docComment": "/**\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export declare function setEnum<T>(values: "
},
{
"kind": "Reference",
"text": "ReadonlySet",
"canonicalReference": "!ReadonlySet:interface"
},
{
"kind": "Content",
"text": "<T>"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<T>"
},
{
"kind": "Content",
"text": ";"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"returnTypeTokenRange": {
"startIndex": 4,
"endIndex": 6
},
"releaseTag": "Public",
"overloadIndex": 1,
"parameters": [
{
"parameterName": "values",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"isOptional": false
}
],
"typeParameters": [
{
"typeParameterName": "T",
"constraintTokenRange": {
"startIndex": 0,
"endIndex": 0
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"name": "setEnum"
},
{
"kind": "Variable",
"canonicalReference": "@tldraw/validate!T.srcUrl:var",
"docComment": "/**\n * Validates that a valid is a url safe to load as an asset.\n *\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "srcUrl: "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<string>"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"isReadonly": true,
"releaseTag": "Public",
"name": "srcUrl",
"variableTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
}
},
{
"kind": "Variable",
"canonicalReference": "@tldraw/validate!T.string:var",
"docComment": "/**\n * Validates that a value is a string.\n *\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "string: "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<string>"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"isReadonly": true,
"releaseTag": "Public",
"name": "string",
"variableTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
}
},
{
"kind": "TypeAlias",
"canonicalReference": "@tldraw/validate!T.TypeOf:type",
"docComment": "/**\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export type TypeOf<V extends "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
Faster validations + record reference stability at the same time (#2848) This PR adds a validation mode whereby previous known-to-be-valid values can be used to speed up the validation process itself. At the same time it enables us to do fine-grained equality checking on records much more quickly than by using something like lodash isEqual, and using that we can prevent triggering effects for record updates that don't actually alter any values in the store. Here's some preliminary perf testing of average time spent in `store.put()` during some common interactions | task | before (ms) | after (ms) | | ---- | ---- | ---- | | drawing lines | 0.0403 | 0.0214 | | drawing boxes | 0.0408 | 0.0348 | | translating lines | 0.0352 | 0.0042 | | translating boxes | 0.0051 | 0.0032 | | rotating lines | 0.0312 | 0.0065 | | rotating boxes | 0.0053 | 0.0035 | | brush selecting boxes | 0.0200 | 0.0232 | | traversal with shapes | 0.0130 | 0.0108 | | traversal without shapes | 0.0201 | 0.0173 | **traversal** means moving the camera and pointer around the canvas #### Discussion At the scale of hundredths of a millisecond these .put operations are so fast that even if they became literally instantaneous the change would not be human perceptible. That said, there is an overall marked improvement here. Especially for dealing with draw shapes. These figures are also mostly in line with expectations, aside from a couple of things: - I don't understand why the `brush selecting boxes` task got slower after the change. - I don't understand why the `traversal` tasks are slower than the `translating boxes` task, both before and after. I would expect that .putting shape records would be much slower than .putting pointer/camera records (since the latter have fewer and simpler properties) ### Change Type - [x] `patch` — Bug fix ### Test Plan 1. Add a step-by-step description of how to test your PR here. 2. - [ ] Unit Tests - [ ] End to end tests ### Release Notes - Add a brief release note for your PR here.
2024-02-20 12:35:25 +00:00
"text": "<any>"
},
{
"kind": "Content",
"text": "> = "
},
{
"kind": "Content",
"text": "V extends "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<infer T> ? T : never"
},
{
"kind": "Content",
"text": ";"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"releaseTag": "Public",
"name": "TypeOf",
"typeParameters": [
{
"typeParameterName": "V",
"constraintTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"typeTokenRange": {
"startIndex": 4,
"endIndex": 7
}
},
{
"kind": "Function",
"canonicalReference": "@tldraw/validate!T.union:function(1)",
"docComment": "/**\n * Validate a union of several object types. Each object must have a property matching `key` which should be a unique string.\n *\n * @example\n * ```ts\n * const catValidator = T.object({ kind: T.value('cat'), meow: T.boolean })\n * const dogValidator = T.object({ kind: T.value('dog'), bark: T.boolean })\n * const animalValidator = T.union('kind', { cat: catValidator, dog: dogValidator })\n * ```\n *\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export declare function union<Key extends "
},
{
"kind": "Content",
"text": "string"
},
{
"kind": "Content",
"text": ", Config extends "
},
{
"kind": "Reference",
"text": "UnionValidatorConfig",
"canonicalReference": "@tldraw/validate!~UnionValidatorConfig:type"
},
{
"kind": "Content",
"text": "<Key, Config>"
},
{
"kind": "Content",
"text": ">(key: "
},
{
"kind": "Content",
"text": "Key"
},
{
"kind": "Content",
"text": ", config: "
},
{
"kind": "Content",
"text": "Config"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Reference",
"text": "UnionValidator",
"canonicalReference": "@tldraw/validate!UnionValidator:class"
},
{
"kind": "Content",
"text": "<Key, Config>"
},
{
"kind": "Content",
"text": ";"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"returnTypeTokenRange": {
"startIndex": 10,
"endIndex": 12
},
"releaseTag": "Public",
"overloadIndex": 1,
"parameters": [
{
"parameterName": "key",
"parameterTypeTokenRange": {
"startIndex": 6,
"endIndex": 7
},
"isOptional": false
},
{
"parameterName": "config",
"parameterTypeTokenRange": {
"startIndex": 8,
"endIndex": 9
},
"isOptional": false
}
],
"typeParameters": [
{
"typeParameterName": "Key",
"constraintTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
},
{
"typeParameterName": "Config",
"constraintTokenRange": {
"startIndex": 3,
"endIndex": 5
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"name": "union"
},
{
"kind": "Class",
"canonicalReference": "@tldraw/validate!T.UnionValidator:class",
"docComment": "/**\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export declare class UnionValidator<Key extends "
},
{
"kind": "Content",
"text": "string"
},
{
"kind": "Content",
"text": ", Config extends "
},
{
"kind": "Reference",
"text": "UnionValidatorConfig",
"canonicalReference": "@tldraw/validate!~UnionValidatorConfig:type"
},
{
"kind": "Content",
"text": "<Key, Config>"
},
{
"kind": "Content",
"text": ", UnknownValue = "
},
{
"kind": "Content",
"text": "never"
},
{
"kind": "Content",
"text": "> extends "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<"
},
{
"kind": "Reference",
"text": "TypeOf",
"canonicalReference": "@tldraw/validate!T.TypeOf:type"
},
{
"kind": "Content",
"text": "<Config[keyof Config]> | UnknownValue>"
},
{
"kind": "Content",
"text": " "
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"releaseTag": "Public",
"typeParameters": [
{
"typeParameterName": "Key",
"constraintTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
},
{
"typeParameterName": "Config",
"constraintTokenRange": {
"startIndex": 3,
"endIndex": 5
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
},
{
"typeParameterName": "UnknownValue",
"constraintTokenRange": {
"startIndex": 0,
"endIndex": 0
},
"defaultTypeTokenRange": {
"startIndex": 6,
"endIndex": 7
}
}
],
"isAbstract": false,
"name": "UnionValidator",
"preserveMemberOrder": false,
"members": [
{
"kind": "Constructor",
"canonicalReference": "@tldraw/validate!T.UnionValidator:constructor(1)",
"docComment": "/**\n * Constructs a new instance of the `UnionValidator` class\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "constructor(key: "
},
{
"kind": "Content",
"text": "Key"
},
{
"kind": "Content",
"text": ", config: "
},
{
"kind": "Content",
"text": "Config"
},
{
"kind": "Content",
"text": ", unknownValueValidation: "
},
{
"kind": "Content",
"text": "(value: object, variant: string) => UnknownValue"
},
{
"kind": "Content",
"text": ", useNumberKeys: "
},
{
"kind": "Content",
"text": "boolean"
},
{
"kind": "Content",
"text": ");"
}
],
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "key",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"isOptional": false
},
{
"parameterName": "config",
"parameterTypeTokenRange": {
"startIndex": 3,
"endIndex": 4
},
"isOptional": false
},
{
"parameterName": "unknownValueValidation",
"parameterTypeTokenRange": {
"startIndex": 5,
"endIndex": 6
},
"isOptional": false
},
{
"parameterName": "useNumberKeys",
"parameterTypeTokenRange": {
"startIndex": 7,
"endIndex": 8
},
"isOptional": false
}
]
},
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!T.UnionValidator#validateUnknownVariants:member(1)",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "validateUnknownVariants<Unknown>(unknownValueValidation: "
},
{
"kind": "Content",
"text": "(value: object, variant: string) => Unknown"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Reference",
"text": "UnionValidator",
"canonicalReference": "@tldraw/validate!UnionValidator:class"
},
{
"kind": "Content",
"text": "<Key, Config, Unknown>"
},
{
"kind": "Content",
"text": ";"
}
],
"typeParameters": [
{
"typeParameterName": "Unknown",
"constraintTokenRange": {
"startIndex": 0,
"endIndex": 0
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 3,
"endIndex": 5
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "unknownValueValidation",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"isOptional": false
}
],
"isOptional": false,
"isAbstract": false,
"name": "validateUnknownVariants"
}
],
"extendsTokenRange": {
"startIndex": 8,
"endIndex": 12
},
"implementsTokenRanges": []
},
{
"kind": "Variable",
"canonicalReference": "@tldraw/validate!T.unknown:var",
"docComment": "/**\n * Validation that accepts any value. Useful as a starting point for building your own custom validations.\n *\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "unknown: "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<unknown>"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"isReadonly": true,
"releaseTag": "Public",
"name": "unknown",
"variableTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
}
},
{
"kind": "Variable",
"canonicalReference": "@tldraw/validate!T.unknownObject:var",
"docComment": "/**\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "unknownObject: "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<"
},
{
"kind": "Reference",
"text": "Record",
"canonicalReference": "!Record:type"
},
{
"kind": "Content",
"text": "<string, unknown>>"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"isReadonly": true,
"releaseTag": "Public",
"name": "unknownObject",
"variableTypeTokenRange": {
"startIndex": 1,
"endIndex": 5
}
},
{
"kind": "TypeAlias",
"canonicalReference": "@tldraw/validate!T.Validatable:type",
"docComment": "/**\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export type Validatable<T> = "
},
{
"kind": "Content",
New migrations again (#3220) Describe what your pull request does. If appropriate, add GIFs or images showing the before and after. ### Change Type - [x] `sdk` — Changes the tldraw SDK - [x] `galaxy brain` — Architectural changes ### Test Plan 1. Add a step-by-step description of how to test your PR here. 2. - [ ] Unit Tests - [ ] End to end tests ### Release Notes #### BREAKING CHANGES - The `Migrations` type is now called `LegacyMigrations`. - The serialized schema format (e.g. returned by `StoreSchema.serialize()` and `Store.getSnapshot()`) has changed. You don't need to do anything about it unless you were reading data directly from the schema for some reason. In which case it'd be best to avoid that in the future! We have no plans to change the schema format again (this time was traumatic enough) but you never know. - `compareRecordVersions` and the `RecordVersion` type have both disappeared. There is no replacement. These were public by mistake anyway, so hopefully nobody had been using it. - `compareSchemas` is a bit less useful now. Our migrations system has become a little fuzzy to allow for simpler UX when adding/removing custom extensions and 3rd party dependencies, and as a result we can no longer compare serialized schemas in any rigorous manner. You can rely on this function to return `0` if the schemas are the same. Otherwise it will return `-1` if the schema on the right _seems_ to be newer than the schema on the left, but it cannot guarantee that in situations where migration sequences have been removed over time (e.g. if you remove one of the builtin tldraw shapes). Generally speaking, the best way to check schema compatibility now is to call `store.schema.getMigrationsSince(persistedSchema)`. This will throw an error if there is no upgrade path from the `persistedSchema` to the current version. - `defineMigrations` has been deprecated and will be removed in a future release. For upgrade instructions see https://tldraw.dev/docs/persistence#Updating-legacy-shape-migrations-defineMigrations - `migrate` has been removed. Nobody should have been using this but if you were you'll need to find an alternative. For migrating tldraw data, you should stick to using `schema.migrateStoreSnapshot` and, if you are building a nuanced sync engine that supports some amount of backwards compatibility, also feel free to use `schema.migratePersistedRecord`. - the `Migration` type has changed. If you need the old one for some reason it has been renamed to `LegacyMigration`. It will be removed in a future release. - the `Migrations` type has been renamed to `LegacyMigrations` and will be removed in a future release. - the `SerializedSchema` type has been augmented. If you need the old version specifically you can use `SerializedSchemaV1` --------- Co-authored-by: Steve Ruiz <steveruizok@gmail.com>
2024-04-15 12:53:42 +00:00
"text": "{\n validateUsingKnownGoodVersion?: (knownGoodValue: T, newValue: unknown) => T;\n validate: (value: unknown) => T;\n}"
},
{
"kind": "Content",
"text": ";"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"releaseTag": "Public",
"name": "Validatable",
"typeParameters": [
{
"typeParameterName": "T",
"constraintTokenRange": {
"startIndex": 0,
"endIndex": 0
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"typeTokenRange": {
"startIndex": 1,
"endIndex": 2
}
},
{
"kind": "Class",
"canonicalReference": "@tldraw/validate!T.ValidationError:class",
"docComment": "/**\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export declare class ValidationError extends "
},
{
"kind": "Reference",
"text": "Error",
"canonicalReference": "!Error:interface"
},
{
"kind": "Content",
"text": " "
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"releaseTag": "Public",
"isAbstract": false,
"name": "ValidationError",
"preserveMemberOrder": false,
"members": [
{
"kind": "Constructor",
"canonicalReference": "@tldraw/validate!T.ValidationError:constructor(1)",
"docComment": "/**\n * Constructs a new instance of the `ValidationError` class\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "constructor(rawMessage: "
},
{
"kind": "Content",
"text": "string"
},
{
"kind": "Content",
"text": ", path?: "
},
{
"kind": "Reference",
"text": "ReadonlyArray",
"canonicalReference": "!ReadonlyArray:interface"
},
{
"kind": "Content",
"text": "<number | string>"
},
{
"kind": "Content",
"text": ");"
}
],
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "rawMessage",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"isOptional": false
},
{
"parameterName": "path",
"parameterTypeTokenRange": {
"startIndex": 3,
"endIndex": 5
},
"isOptional": true
}
]
},
{
"kind": "Property",
"canonicalReference": "@tldraw/validate!T.ValidationError#name:member",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "name: "
},
{
"kind": "Content",
"text": "string"
},
{
"kind": "Content",
"text": ";"
}
],
"isReadonly": false,
"isOptional": false,
"releaseTag": "Public",
"name": "name",
"propertyTypeTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"isStatic": false,
"isProtected": false,
"isAbstract": false
},
{
"kind": "Property",
"canonicalReference": "@tldraw/validate!T.ValidationError#path:member",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "readonly path: "
},
{
"kind": "Reference",
"text": "ReadonlyArray",
"canonicalReference": "!ReadonlyArray:interface"
},
{
"kind": "Content",
"text": "<number | string>"
},
{
"kind": "Content",
"text": ";"
}
],
"isReadonly": true,
"isOptional": false,
"releaseTag": "Public",
"name": "path",
"propertyTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"isStatic": false,
"isProtected": false,
"isAbstract": false
},
{
"kind": "Property",
"canonicalReference": "@tldraw/validate!T.ValidationError#rawMessage:member",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "readonly rawMessage: "
},
{
"kind": "Content",
"text": "string"
},
{
"kind": "Content",
"text": ";"
}
],
"isReadonly": true,
"isOptional": false,
"releaseTag": "Public",
"name": "rawMessage",
"propertyTypeTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"isStatic": false,
"isProtected": false,
"isAbstract": false
}
],
"extendsTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"implementsTokenRanges": []
},
{
"kind": "Class",
"canonicalReference": "@tldraw/validate!T.Validator:class",
"docComment": "/**\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export declare class Validator<T> implements "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<T>"
},
{
"kind": "Content",
"text": " "
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"releaseTag": "Public",
"typeParameters": [
{
"typeParameterName": "T",
"constraintTokenRange": {
"startIndex": 0,
"endIndex": 0
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"isAbstract": false,
"name": "Validator",
"preserveMemberOrder": false,
"members": [
{
"kind": "Constructor",
"canonicalReference": "@tldraw/validate!T.Validator:constructor(1)",
"docComment": "/**\n * Constructs a new instance of the `Validator` class\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "constructor(validationFn: "
},
{
"kind": "Reference",
"text": "ValidatorFn",
"canonicalReference": "@tldraw/validate!T.ValidatorFn:type"
},
{
"kind": "Content",
"text": "<T>"
},
Faster validations + record reference stability at the same time (#2848) This PR adds a validation mode whereby previous known-to-be-valid values can be used to speed up the validation process itself. At the same time it enables us to do fine-grained equality checking on records much more quickly than by using something like lodash isEqual, and using that we can prevent triggering effects for record updates that don't actually alter any values in the store. Here's some preliminary perf testing of average time spent in `store.put()` during some common interactions | task | before (ms) | after (ms) | | ---- | ---- | ---- | | drawing lines | 0.0403 | 0.0214 | | drawing boxes | 0.0408 | 0.0348 | | translating lines | 0.0352 | 0.0042 | | translating boxes | 0.0051 | 0.0032 | | rotating lines | 0.0312 | 0.0065 | | rotating boxes | 0.0053 | 0.0035 | | brush selecting boxes | 0.0200 | 0.0232 | | traversal with shapes | 0.0130 | 0.0108 | | traversal without shapes | 0.0201 | 0.0173 | **traversal** means moving the camera and pointer around the canvas #### Discussion At the scale of hundredths of a millisecond these .put operations are so fast that even if they became literally instantaneous the change would not be human perceptible. That said, there is an overall marked improvement here. Especially for dealing with draw shapes. These figures are also mostly in line with expectations, aside from a couple of things: - I don't understand why the `brush selecting boxes` task got slower after the change. - I don't understand why the `traversal` tasks are slower than the `translating boxes` task, both before and after. I would expect that .putting shape records would be much slower than .putting pointer/camera records (since the latter have fewer and simpler properties) ### Change Type - [x] `patch` — Bug fix ### Test Plan 1. Add a step-by-step description of how to test your PR here. 2. - [ ] Unit Tests - [ ] End to end tests ### Release Notes - Add a brief release note for your PR here.
2024-02-20 12:35:25 +00:00
{
"kind": "Content",
"text": ", validateUsingKnownGoodVersionFn?: "
},
{
"kind": "Content",
"text": "undefined | "
},
{
"kind": "Reference",
"text": "ValidatorUsingKnownGoodVersionFn",
"canonicalReference": "@tldraw/validate!T.ValidatorUsingKnownGoodVersionFn:type"
},
{
"kind": "Content",
"text": "<T, T>"
},
{
"kind": "Content",
"text": ");"
}
],
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "validationFn",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"isOptional": false
Faster validations + record reference stability at the same time (#2848) This PR adds a validation mode whereby previous known-to-be-valid values can be used to speed up the validation process itself. At the same time it enables us to do fine-grained equality checking on records much more quickly than by using something like lodash isEqual, and using that we can prevent triggering effects for record updates that don't actually alter any values in the store. Here's some preliminary perf testing of average time spent in `store.put()` during some common interactions | task | before (ms) | after (ms) | | ---- | ---- | ---- | | drawing lines | 0.0403 | 0.0214 | | drawing boxes | 0.0408 | 0.0348 | | translating lines | 0.0352 | 0.0042 | | translating boxes | 0.0051 | 0.0032 | | rotating lines | 0.0312 | 0.0065 | | rotating boxes | 0.0053 | 0.0035 | | brush selecting boxes | 0.0200 | 0.0232 | | traversal with shapes | 0.0130 | 0.0108 | | traversal without shapes | 0.0201 | 0.0173 | **traversal** means moving the camera and pointer around the canvas #### Discussion At the scale of hundredths of a millisecond these .put operations are so fast that even if they became literally instantaneous the change would not be human perceptible. That said, there is an overall marked improvement here. Especially for dealing with draw shapes. These figures are also mostly in line with expectations, aside from a couple of things: - I don't understand why the `brush selecting boxes` task got slower after the change. - I don't understand why the `traversal` tasks are slower than the `translating boxes` task, both before and after. I would expect that .putting shape records would be much slower than .putting pointer/camera records (since the latter have fewer and simpler properties) ### Change Type - [x] `patch` — Bug fix ### Test Plan 1. Add a step-by-step description of how to test your PR here. 2. - [ ] Unit Tests - [ ] End to end tests ### Release Notes - Add a brief release note for your PR here.
2024-02-20 12:35:25 +00:00
},
{
"parameterName": "validateUsingKnownGoodVersionFn",
"parameterTypeTokenRange": {
"startIndex": 4,
"endIndex": 7
},
"isOptional": true
}
]
},
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!T.Validator#check:member(1)",
"docComment": "/**\n * Refine this validation with an additional check that doesn't change the resulting value.\n *\n * @example\n * ```ts\n * const numberLessThan10Validator = T.number.check((value) => {\n * \tif (value >= 10) {\n * \t\tthrow new ValidationError(`Expected number less than 10, got ${value}`)\n * \t}\n * })\n * ```\n *\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "check(name: "
},
{
"kind": "Content",
"text": "string"
},
{
"kind": "Content",
"text": ", checkFn: "
},
{
"kind": "Content",
"text": "(value: T) => void"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<T>"
},
{
"kind": "Content",
"text": ";"
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 5,
"endIndex": 7
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "name",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"isOptional": false
},
{
"parameterName": "checkFn",
"parameterTypeTokenRange": {
"startIndex": 3,
"endIndex": 4
},
"isOptional": false
}
],
"isOptional": false,
"isAbstract": false,
"name": "check"
},
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!T.Validator#check:member(2)",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "check(checkFn: "
},
{
"kind": "Content",
"text": "(value: T) => void"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<T>"
},
{
"kind": "Content",
"text": ";"
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 3,
"endIndex": 5
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 2,
"parameters": [
{
"parameterName": "checkFn",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"isOptional": false
}
],
"isOptional": false,
"isAbstract": false,
"name": "check"
},
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!T.Validator#isValid:member(1)",
"docComment": "/**\n * Checks that the passed value is of the correct type.\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "isValid(value: "
},
{
"kind": "Content",
"text": "unknown"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Reference",
"text": "value",
"canonicalReference": "@tldraw/validate!~value"
},
{
"kind": "Content",
"text": " is T"
},
{
"kind": "Content",
"text": ";"
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 3,
"endIndex": 5
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "value",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"isOptional": false
}
],
"isOptional": false,
"isAbstract": false,
"name": "isValid"
},
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!T.Validator#nullable:member(1)",
"docComment": "/**\n * Returns a new validator that also accepts null or undefined. The resulting value will always be null.\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "nullable(): "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<null | T>"
},
{
"kind": "Content",
"text": ";"
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [],
"isOptional": false,
"isAbstract": false,
"name": "nullable"
},
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!T.Validator#optional:member(1)",
"docComment": "/**\n * Returns a new validator that also accepts null or undefined. The resulting value will always be null.\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "optional(): "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<T | undefined>"
},
{
"kind": "Content",
"text": ";"
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [],
"isOptional": false,
"isAbstract": false,
"name": "optional"
},
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!T.Validator#refine:member(1)",
"docComment": "/**\n * Refine this validation to a new type. The passed-in validation function should throw an error if the value can't be converted to the new type, or return the new type otherwise.\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "refine<U>(otherValidationFn: "
},
{
"kind": "Content",
"text": "(value: T) => U"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<U>"
},
{
"kind": "Content",
"text": ";"
}
],
"typeParameters": [
{
"typeParameterName": "U",
"constraintTokenRange": {
"startIndex": 0,
"endIndex": 0
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 3,
"endIndex": 5
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "otherValidationFn",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"isOptional": false
}
],
"isOptional": false,
"isAbstract": false,
"name": "refine"
},
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!T.Validator#validate:member(1)",
"docComment": "/**\n * Asserts that the passed value is of the correct type and returns it. The returned value is guaranteed to be referentially equal to the passed value.\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "validate(value: "
},
{
"kind": "Content",
"text": "unknown"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Content",
"text": "T"
},
{
"kind": "Content",
"text": ";"
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 3,
"endIndex": 4
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "value",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"isOptional": false
}
],
"isOptional": false,
"isAbstract": false,
"name": "validate"
},
Faster validations + record reference stability at the same time (#2848) This PR adds a validation mode whereby previous known-to-be-valid values can be used to speed up the validation process itself. At the same time it enables us to do fine-grained equality checking on records much more quickly than by using something like lodash isEqual, and using that we can prevent triggering effects for record updates that don't actually alter any values in the store. Here's some preliminary perf testing of average time spent in `store.put()` during some common interactions | task | before (ms) | after (ms) | | ---- | ---- | ---- | | drawing lines | 0.0403 | 0.0214 | | drawing boxes | 0.0408 | 0.0348 | | translating lines | 0.0352 | 0.0042 | | translating boxes | 0.0051 | 0.0032 | | rotating lines | 0.0312 | 0.0065 | | rotating boxes | 0.0053 | 0.0035 | | brush selecting boxes | 0.0200 | 0.0232 | | traversal with shapes | 0.0130 | 0.0108 | | traversal without shapes | 0.0201 | 0.0173 | **traversal** means moving the camera and pointer around the canvas #### Discussion At the scale of hundredths of a millisecond these .put operations are so fast that even if they became literally instantaneous the change would not be human perceptible. That said, there is an overall marked improvement here. Especially for dealing with draw shapes. These figures are also mostly in line with expectations, aside from a couple of things: - I don't understand why the `brush selecting boxes` task got slower after the change. - I don't understand why the `traversal` tasks are slower than the `translating boxes` task, both before and after. I would expect that .putting shape records would be much slower than .putting pointer/camera records (since the latter have fewer and simpler properties) ### Change Type - [x] `patch` — Bug fix ### Test Plan 1. Add a step-by-step description of how to test your PR here. 2. - [ ] Unit Tests - [ ] End to end tests ### Release Notes - Add a brief release note for your PR here.
2024-02-20 12:35:25 +00:00
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!T.Validator#validateUsingKnownGoodVersion:member(1)",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "validateUsingKnownGoodVersion(knownGoodValue: "
},
{
"kind": "Content",
"text": "T"
},
{
"kind": "Content",
"text": ", newValue: "
},
{
"kind": "Content",
"text": "unknown"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Content",
"text": "T"
},
{
"kind": "Content",
"text": ";"
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 5,
"endIndex": 6
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "knownGoodValue",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"isOptional": false
},
{
"parameterName": "newValue",
"parameterTypeTokenRange": {
"startIndex": 3,
"endIndex": 4
},
"isOptional": false
}
],
"isOptional": false,
"isAbstract": false,
"name": "validateUsingKnownGoodVersion"
},
{
"kind": "Property",
"canonicalReference": "@tldraw/validate!T.Validator#validateUsingKnownGoodVersionFn:member",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "readonly validateUsingKnownGoodVersionFn?: "
},
{
"kind": "Content",
"text": "undefined | "
},
{
"kind": "Reference",
"text": "ValidatorUsingKnownGoodVersionFn",
"canonicalReference": "@tldraw/validate!T.ValidatorUsingKnownGoodVersionFn:type"
},
{
"kind": "Content",
"text": "<T, T>"
},
{
"kind": "Content",
"text": ";"
}
],
"isReadonly": true,
"isOptional": true,
"releaseTag": "Public",
"name": "validateUsingKnownGoodVersionFn",
"propertyTypeTokenRange": {
"startIndex": 1,
"endIndex": 4
},
"isStatic": false,
"isProtected": false,
"isAbstract": false
},
{
"kind": "Property",
"canonicalReference": "@tldraw/validate!T.Validator#validationFn:member",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "readonly validationFn: "
},
{
"kind": "Reference",
"text": "ValidatorFn",
"canonicalReference": "@tldraw/validate!T.ValidatorFn:type"
},
{
"kind": "Content",
"text": "<T>"
},
{
"kind": "Content",
"text": ";"
}
],
"isReadonly": true,
"isOptional": false,
"releaseTag": "Public",
"name": "validationFn",
"propertyTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"isStatic": false,
"isProtected": false,
"isAbstract": false
}
],
"implementsTokenRanges": [
{
"startIndex": 1,
"endIndex": 3
}
]
},
{
"kind": "TypeAlias",
"canonicalReference": "@tldraw/validate!T.ValidatorFn:type",
"docComment": "/**\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export type ValidatorFn<T> = "
},
{
"kind": "Content",
"text": "(value: unknown) => T"
},
{
"kind": "Content",
"text": ";"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"releaseTag": "Public",
"name": "ValidatorFn",
"typeParameters": [
{
"typeParameterName": "T",
"constraintTokenRange": {
"startIndex": 0,
"endIndex": 0
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"typeTokenRange": {
"startIndex": 1,
"endIndex": 2
}
Faster validations + record reference stability at the same time (#2848) This PR adds a validation mode whereby previous known-to-be-valid values can be used to speed up the validation process itself. At the same time it enables us to do fine-grained equality checking on records much more quickly than by using something like lodash isEqual, and using that we can prevent triggering effects for record updates that don't actually alter any values in the store. Here's some preliminary perf testing of average time spent in `store.put()` during some common interactions | task | before (ms) | after (ms) | | ---- | ---- | ---- | | drawing lines | 0.0403 | 0.0214 | | drawing boxes | 0.0408 | 0.0348 | | translating lines | 0.0352 | 0.0042 | | translating boxes | 0.0051 | 0.0032 | | rotating lines | 0.0312 | 0.0065 | | rotating boxes | 0.0053 | 0.0035 | | brush selecting boxes | 0.0200 | 0.0232 | | traversal with shapes | 0.0130 | 0.0108 | | traversal without shapes | 0.0201 | 0.0173 | **traversal** means moving the camera and pointer around the canvas #### Discussion At the scale of hundredths of a millisecond these .put operations are so fast that even if they became literally instantaneous the change would not be human perceptible. That said, there is an overall marked improvement here. Especially for dealing with draw shapes. These figures are also mostly in line with expectations, aside from a couple of things: - I don't understand why the `brush selecting boxes` task got slower after the change. - I don't understand why the `traversal` tasks are slower than the `translating boxes` task, both before and after. I would expect that .putting shape records would be much slower than .putting pointer/camera records (since the latter have fewer and simpler properties) ### Change Type - [x] `patch` — Bug fix ### Test Plan 1. Add a step-by-step description of how to test your PR here. 2. - [ ] Unit Tests - [ ] End to end tests ### Release Notes - Add a brief release note for your PR here.
2024-02-20 12:35:25 +00:00
},
{
"kind": "TypeAlias",
"canonicalReference": "@tldraw/validate!T.ValidatorUsingKnownGoodVersionFn:type",
"docComment": "/**\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export type ValidatorUsingKnownGoodVersionFn<In, Out = "
},
{
"kind": "Content",
"text": "In"
},
{
"kind": "Content",
"text": "> = "
},
{
"kind": "Content",
"text": "(knownGoodValue: In, value: unknown) => Out"
},
{
"kind": "Content",
"text": ";"
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"releaseTag": "Public",
"name": "ValidatorUsingKnownGoodVersionFn",
"typeParameters": [
{
"typeParameterName": "In",
"constraintTokenRange": {
"startIndex": 0,
"endIndex": 0
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
},
{
"typeParameterName": "Out",
"constraintTokenRange": {
"startIndex": 0,
"endIndex": 0
},
"defaultTypeTokenRange": {
"startIndex": 1,
"endIndex": 2
}
}
],
"typeTokenRange": {
"startIndex": 3,
"endIndex": 4
}
}
]
},
{
"kind": "Class",
"canonicalReference": "@tldraw/validate!UnionValidator:class",
"docComment": "/**\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export declare class UnionValidator<Key extends "
},
{
"kind": "Content",
"text": "string"
},
{
"kind": "Content",
"text": ", Config extends "
},
{
"kind": "Reference",
"text": "UnionValidatorConfig",
"canonicalReference": "@tldraw/validate!~UnionValidatorConfig:type"
},
{
"kind": "Content",
"text": "<Key, Config>"
},
{
"kind": "Content",
"text": ", UnknownValue = "
},
{
"kind": "Content",
"text": "never"
},
{
"kind": "Content",
"text": "> extends "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<"
},
{
"kind": "Reference",
"text": "TypeOf",
"canonicalReference": "@tldraw/validate!T.TypeOf:type"
},
{
"kind": "Content",
"text": "<Config[keyof Config]> | UnknownValue>"
},
{
"kind": "Content",
"text": " "
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"releaseTag": "Public",
"typeParameters": [
{
"typeParameterName": "Key",
"constraintTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
},
{
"typeParameterName": "Config",
"constraintTokenRange": {
"startIndex": 3,
"endIndex": 5
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
},
{
"typeParameterName": "UnknownValue",
"constraintTokenRange": {
"startIndex": 0,
"endIndex": 0
},
"defaultTypeTokenRange": {
"startIndex": 6,
"endIndex": 7
}
}
],
"isAbstract": false,
"name": "UnionValidator",
"preserveMemberOrder": false,
"members": [
{
"kind": "Constructor",
"canonicalReference": "@tldraw/validate!UnionValidator:constructor(1)",
"docComment": "/**\n * Constructs a new instance of the `UnionValidator` class\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "constructor(key: "
},
{
"kind": "Content",
"text": "Key"
},
{
"kind": "Content",
"text": ", config: "
},
{
"kind": "Content",
"text": "Config"
},
{
"kind": "Content",
"text": ", unknownValueValidation: "
},
{
"kind": "Content",
"text": "(value: object, variant: string) => UnknownValue"
},
{
"kind": "Content",
"text": ", useNumberKeys: "
},
{
"kind": "Content",
"text": "boolean"
},
{
"kind": "Content",
"text": ");"
}
],
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "key",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"isOptional": false
},
{
"parameterName": "config",
"parameterTypeTokenRange": {
"startIndex": 3,
"endIndex": 4
},
"isOptional": false
},
{
"parameterName": "unknownValueValidation",
"parameterTypeTokenRange": {
"startIndex": 5,
"endIndex": 6
},
"isOptional": false
},
{
"parameterName": "useNumberKeys",
"parameterTypeTokenRange": {
"startIndex": 7,
"endIndex": 8
},
"isOptional": false
}
]
},
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!UnionValidator#validateUnknownVariants:member(1)",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "validateUnknownVariants<Unknown>(unknownValueValidation: "
},
{
"kind": "Content",
"text": "(value: object, variant: string) => Unknown"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Reference",
"text": "UnionValidator",
"canonicalReference": "@tldraw/validate!UnionValidator:class"
},
{
"kind": "Content",
"text": "<Key, Config, Unknown>"
},
{
"kind": "Content",
"text": ";"
}
],
"typeParameters": [
{
"typeParameterName": "Unknown",
"constraintTokenRange": {
"startIndex": 0,
"endIndex": 0
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 3,
"endIndex": 5
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "unknownValueValidation",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"isOptional": false
}
],
"isOptional": false,
"isAbstract": false,
"name": "validateUnknownVariants"
}
],
"extendsTokenRange": {
"startIndex": 8,
"endIndex": 12
},
"implementsTokenRanges": []
},
{
"kind": "Class",
"canonicalReference": "@tldraw/validate!Validator:class",
"docComment": "/**\n * @public\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "export declare class Validator<T> implements "
},
{
"kind": "Reference",
"text": "Validatable",
"canonicalReference": "@tldraw/validate!T.Validatable:type"
},
{
"kind": "Content",
"text": "<T>"
},
{
"kind": "Content",
"text": " "
}
],
"fileUrlPath": "packages/validate/src/lib/validation.ts",
"releaseTag": "Public",
"typeParameters": [
{
"typeParameterName": "T",
"constraintTokenRange": {
"startIndex": 0,
"endIndex": 0
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"isAbstract": false,
"name": "Validator",
"preserveMemberOrder": false,
"members": [
{
"kind": "Constructor",
"canonicalReference": "@tldraw/validate!Validator:constructor(1)",
"docComment": "/**\n * Constructs a new instance of the `Validator` class\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "constructor(validationFn: "
},
{
"kind": "Reference",
"text": "ValidatorFn",
"canonicalReference": "@tldraw/validate!T.ValidatorFn:type"
},
{
"kind": "Content",
"text": "<T>"
},
Faster validations + record reference stability at the same time (#2848) This PR adds a validation mode whereby previous known-to-be-valid values can be used to speed up the validation process itself. At the same time it enables us to do fine-grained equality checking on records much more quickly than by using something like lodash isEqual, and using that we can prevent triggering effects for record updates that don't actually alter any values in the store. Here's some preliminary perf testing of average time spent in `store.put()` during some common interactions | task | before (ms) | after (ms) | | ---- | ---- | ---- | | drawing lines | 0.0403 | 0.0214 | | drawing boxes | 0.0408 | 0.0348 | | translating lines | 0.0352 | 0.0042 | | translating boxes | 0.0051 | 0.0032 | | rotating lines | 0.0312 | 0.0065 | | rotating boxes | 0.0053 | 0.0035 | | brush selecting boxes | 0.0200 | 0.0232 | | traversal with shapes | 0.0130 | 0.0108 | | traversal without shapes | 0.0201 | 0.0173 | **traversal** means moving the camera and pointer around the canvas #### Discussion At the scale of hundredths of a millisecond these .put operations are so fast that even if they became literally instantaneous the change would not be human perceptible. That said, there is an overall marked improvement here. Especially for dealing with draw shapes. These figures are also mostly in line with expectations, aside from a couple of things: - I don't understand why the `brush selecting boxes` task got slower after the change. - I don't understand why the `traversal` tasks are slower than the `translating boxes` task, both before and after. I would expect that .putting shape records would be much slower than .putting pointer/camera records (since the latter have fewer and simpler properties) ### Change Type - [x] `patch` — Bug fix ### Test Plan 1. Add a step-by-step description of how to test your PR here. 2. - [ ] Unit Tests - [ ] End to end tests ### Release Notes - Add a brief release note for your PR here.
2024-02-20 12:35:25 +00:00
{
"kind": "Content",
"text": ", validateUsingKnownGoodVersionFn?: "
},
{
"kind": "Content",
"text": "undefined | "
},
{
"kind": "Reference",
"text": "ValidatorUsingKnownGoodVersionFn",
"canonicalReference": "@tldraw/validate!T.ValidatorUsingKnownGoodVersionFn:type"
},
{
"kind": "Content",
"text": "<T, T>"
},
{
"kind": "Content",
"text": ");"
}
],
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "validationFn",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"isOptional": false
Faster validations + record reference stability at the same time (#2848) This PR adds a validation mode whereby previous known-to-be-valid values can be used to speed up the validation process itself. At the same time it enables us to do fine-grained equality checking on records much more quickly than by using something like lodash isEqual, and using that we can prevent triggering effects for record updates that don't actually alter any values in the store. Here's some preliminary perf testing of average time spent in `store.put()` during some common interactions | task | before (ms) | after (ms) | | ---- | ---- | ---- | | drawing lines | 0.0403 | 0.0214 | | drawing boxes | 0.0408 | 0.0348 | | translating lines | 0.0352 | 0.0042 | | translating boxes | 0.0051 | 0.0032 | | rotating lines | 0.0312 | 0.0065 | | rotating boxes | 0.0053 | 0.0035 | | brush selecting boxes | 0.0200 | 0.0232 | | traversal with shapes | 0.0130 | 0.0108 | | traversal without shapes | 0.0201 | 0.0173 | **traversal** means moving the camera and pointer around the canvas #### Discussion At the scale of hundredths of a millisecond these .put operations are so fast that even if they became literally instantaneous the change would not be human perceptible. That said, there is an overall marked improvement here. Especially for dealing with draw shapes. These figures are also mostly in line with expectations, aside from a couple of things: - I don't understand why the `brush selecting boxes` task got slower after the change. - I don't understand why the `traversal` tasks are slower than the `translating boxes` task, both before and after. I would expect that .putting shape records would be much slower than .putting pointer/camera records (since the latter have fewer and simpler properties) ### Change Type - [x] `patch` — Bug fix ### Test Plan 1. Add a step-by-step description of how to test your PR here. 2. - [ ] Unit Tests - [ ] End to end tests ### Release Notes - Add a brief release note for your PR here.
2024-02-20 12:35:25 +00:00
},
{
"parameterName": "validateUsingKnownGoodVersionFn",
"parameterTypeTokenRange": {
"startIndex": 4,
"endIndex": 7
},
"isOptional": true
}
]
},
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!Validator#check:member(1)",
"docComment": "/**\n * Refine this validation with an additional check that doesn't change the resulting value.\n *\n * @example\n * ```ts\n * const numberLessThan10Validator = T.number.check((value) => {\n * \tif (value >= 10) {\n * \t\tthrow new ValidationError(`Expected number less than 10, got ${value}`)\n * \t}\n * })\n * ```\n *\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "check(name: "
},
{
"kind": "Content",
"text": "string"
},
{
"kind": "Content",
"text": ", checkFn: "
},
{
"kind": "Content",
"text": "(value: T) => void"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<T>"
},
{
"kind": "Content",
"text": ";"
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 5,
"endIndex": 7
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "name",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"isOptional": false
},
{
"parameterName": "checkFn",
"parameterTypeTokenRange": {
"startIndex": 3,
"endIndex": 4
},
"isOptional": false
}
],
"isOptional": false,
"isAbstract": false,
"name": "check"
},
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!Validator#check:member(2)",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "check(checkFn: "
},
{
"kind": "Content",
"text": "(value: T) => void"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<T>"
},
{
"kind": "Content",
"text": ";"
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 3,
"endIndex": 5
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 2,
"parameters": [
{
"parameterName": "checkFn",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"isOptional": false
}
],
"isOptional": false,
"isAbstract": false,
"name": "check"
},
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!Validator#isValid:member(1)",
"docComment": "/**\n * Checks that the passed value is of the correct type.\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "isValid(value: "
},
{
"kind": "Content",
"text": "unknown"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Reference",
"text": "value",
"canonicalReference": "@tldraw/validate!~value"
},
{
"kind": "Content",
"text": " is T"
},
{
"kind": "Content",
"text": ";"
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 3,
"endIndex": 5
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "value",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"isOptional": false
}
],
"isOptional": false,
"isAbstract": false,
"name": "isValid"
},
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!Validator#nullable:member(1)",
"docComment": "/**\n * Returns a new validator that also accepts null or undefined. The resulting value will always be null.\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "nullable(): "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<null | T>"
},
{
"kind": "Content",
"text": ";"
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [],
"isOptional": false,
"isAbstract": false,
"name": "nullable"
},
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!Validator#optional:member(1)",
"docComment": "/**\n * Returns a new validator that also accepts null or undefined. The resulting value will always be null.\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "optional(): "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<T | undefined>"
},
{
"kind": "Content",
"text": ";"
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [],
"isOptional": false,
"isAbstract": false,
"name": "optional"
},
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!Validator#refine:member(1)",
"docComment": "/**\n * Refine this validation to a new type. The passed-in validation function should throw an error if the value can't be converted to the new type, or return the new type otherwise.\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "refine<U>(otherValidationFn: "
},
{
"kind": "Content",
"text": "(value: T) => U"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Reference",
"text": "Validator",
"canonicalReference": "@tldraw/validate!Validator:class"
},
{
"kind": "Content",
"text": "<U>"
},
{
"kind": "Content",
"text": ";"
}
],
"typeParameters": [
{
"typeParameterName": "U",
"constraintTokenRange": {
"startIndex": 0,
"endIndex": 0
},
"defaultTypeTokenRange": {
"startIndex": 0,
"endIndex": 0
}
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 3,
"endIndex": 5
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "otherValidationFn",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"isOptional": false
}
],
"isOptional": false,
"isAbstract": false,
"name": "refine"
},
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!Validator#validate:member(1)",
"docComment": "/**\n * Asserts that the passed value is of the correct type and returns it. The returned value is guaranteed to be referentially equal to the passed value.\n */\n",
"excerptTokens": [
{
"kind": "Content",
"text": "validate(value: "
},
{
"kind": "Content",
"text": "unknown"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Content",
"text": "T"
},
{
"kind": "Content",
"text": ";"
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 3,
"endIndex": 4
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "value",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"isOptional": false
}
],
"isOptional": false,
"isAbstract": false,
"name": "validate"
},
Faster validations + record reference stability at the same time (#2848) This PR adds a validation mode whereby previous known-to-be-valid values can be used to speed up the validation process itself. At the same time it enables us to do fine-grained equality checking on records much more quickly than by using something like lodash isEqual, and using that we can prevent triggering effects for record updates that don't actually alter any values in the store. Here's some preliminary perf testing of average time spent in `store.put()` during some common interactions | task | before (ms) | after (ms) | | ---- | ---- | ---- | | drawing lines | 0.0403 | 0.0214 | | drawing boxes | 0.0408 | 0.0348 | | translating lines | 0.0352 | 0.0042 | | translating boxes | 0.0051 | 0.0032 | | rotating lines | 0.0312 | 0.0065 | | rotating boxes | 0.0053 | 0.0035 | | brush selecting boxes | 0.0200 | 0.0232 | | traversal with shapes | 0.0130 | 0.0108 | | traversal without shapes | 0.0201 | 0.0173 | **traversal** means moving the camera and pointer around the canvas #### Discussion At the scale of hundredths of a millisecond these .put operations are so fast that even if they became literally instantaneous the change would not be human perceptible. That said, there is an overall marked improvement here. Especially for dealing with draw shapes. These figures are also mostly in line with expectations, aside from a couple of things: - I don't understand why the `brush selecting boxes` task got slower after the change. - I don't understand why the `traversal` tasks are slower than the `translating boxes` task, both before and after. I would expect that .putting shape records would be much slower than .putting pointer/camera records (since the latter have fewer and simpler properties) ### Change Type - [x] `patch` — Bug fix ### Test Plan 1. Add a step-by-step description of how to test your PR here. 2. - [ ] Unit Tests - [ ] End to end tests ### Release Notes - Add a brief release note for your PR here.
2024-02-20 12:35:25 +00:00
{
"kind": "Method",
"canonicalReference": "@tldraw/validate!Validator#validateUsingKnownGoodVersion:member(1)",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "validateUsingKnownGoodVersion(knownGoodValue: "
},
{
"kind": "Content",
"text": "T"
},
{
"kind": "Content",
"text": ", newValue: "
},
{
"kind": "Content",
"text": "unknown"
},
{
"kind": "Content",
"text": "): "
},
{
"kind": "Content",
"text": "T"
},
{
"kind": "Content",
"text": ";"
}
],
"isStatic": false,
"returnTypeTokenRange": {
"startIndex": 5,
"endIndex": 6
},
"releaseTag": "Public",
"isProtected": false,
"overloadIndex": 1,
"parameters": [
{
"parameterName": "knownGoodValue",
"parameterTypeTokenRange": {
"startIndex": 1,
"endIndex": 2
},
"isOptional": false
},
{
"parameterName": "newValue",
"parameterTypeTokenRange": {
"startIndex": 3,
"endIndex": 4
},
"isOptional": false
}
],
"isOptional": false,
"isAbstract": false,
"name": "validateUsingKnownGoodVersion"
},
{
"kind": "Property",
"canonicalReference": "@tldraw/validate!Validator#validateUsingKnownGoodVersionFn:member",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "readonly validateUsingKnownGoodVersionFn?: "
},
{
"kind": "Content",
"text": "undefined | "
},
{
"kind": "Reference",
"text": "ValidatorUsingKnownGoodVersionFn",
"canonicalReference": "@tldraw/validate!T.ValidatorUsingKnownGoodVersionFn:type"
},
{
"kind": "Content",
"text": "<T, T>"
},
{
"kind": "Content",
"text": ";"
}
],
"isReadonly": true,
"isOptional": true,
"releaseTag": "Public",
"name": "validateUsingKnownGoodVersionFn",
"propertyTypeTokenRange": {
"startIndex": 1,
"endIndex": 4
},
"isStatic": false,
"isProtected": false,
"isAbstract": false
},
{
"kind": "Property",
"canonicalReference": "@tldraw/validate!Validator#validationFn:member",
"docComment": "",
"excerptTokens": [
{
"kind": "Content",
"text": "readonly validationFn: "
},
{
"kind": "Reference",
"text": "ValidatorFn",
"canonicalReference": "@tldraw/validate!T.ValidatorFn:type"
},
{
"kind": "Content",
"text": "<T>"
},
{
"kind": "Content",
"text": ";"
}
],
"isReadonly": true,
"isOptional": false,
"releaseTag": "Public",
"name": "validationFn",
"propertyTypeTokenRange": {
"startIndex": 1,
"endIndex": 3
},
"isStatic": false,
"isProtected": false,
"isAbstract": false
}
],
"implementsTokenRanges": [
{
"startIndex": 1,
"endIndex": 3
}
]
}
]
}
]
}