Biome as it is now didn't work out for us 😢 

Summary for posterity:

* it IS much, much faster, fast enough to skip any sort of caching
* we couldn't fully replace Prettier just yet. We use Prettier
programmatically to format code in docs, and Biome's JS interface is
officially alpha and [had legacy peer deps
set](https://github.com/biomejs/biome/pull/1756) (which would fail our
CI build as we don't allow installation warnings)
* ternary formatting differs from Prettier, leading to a large diff
https://github.com/biomejs/biome/issues/1661
* import sorting differs from Prettier's
`prettier-plugin-organize-imports`, making the diff even bigger
* the deal breaker is a multi-second delay on saving large files (for us
it's
[Editor.ts](https://github.com/tldraw/tldraw/blob/main/packages/editor/src/lib/editor/Editor.ts))
in VSCode when import sorting is enabled. There is a seemingly relevant
Biome issue where I posted a small summary of our findings:
https://github.com/biomejs/biome/issues/1569#issuecomment-1930411623

Further actions:

* reevaluate in a few months as Biome matures

### Change Type

- [x] `internal` — Any other changes that don't affect the published
package
This commit is contained in:
Dan Groshev 2024-02-07 16:02:22 +00:00 committed by GitHub
parent f185edcb76
commit 86cce6d161
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
65 changed files with 502 additions and 502 deletions

View file

@ -38,12 +38,6 @@ jobs:
- name: Check for installation warnings - name: Check for installation warnings
run: 'yarn | grep -vzq "with warnings"' run: 'yarn | grep -vzq "with warnings"'
- name: Setup Biome CLI
uses: biomejs/setup-biome@v2
- name: Run Biome
run: biome ci --formatter-enabled=true --linter-enabled=false --organize-imports-enabled=false .
- name: Typecheck - name: Typecheck
run: yarn build-types run: yarn build-types

View file

@ -2,7 +2,7 @@ dist
.tsbuild-dev .tsbuild-dev
.tsbuild-pub .tsbuild-pub
.tsbuild .tsbuild
node_modules node\*modules
*.d.ts *.d.ts
*.md *.md
**/_archive **/_archive
@ -18,6 +18,4 @@ apps/example/www/index.css
*.cjs *.cjs
apps/docs/.next apps/docs/.next
e2e/**/*.png
packages/tldraw/tldraw.css packages/tldraw/tldraw.css

25
.prettierignore Normal file
View file

@ -0,0 +1,25 @@
**/node_modules/*
**/out/*
**/dist/*
**/dist-cjs/*
**/dist-esm/*
**/.next/*
**/api/*
!**/pages/api/*
**/.tsbuild*
**/.next/*
*.mdx
**/_archive/*
apps/docs/api-content.json
apps/docs/content.json
apps/vscode/extension/editor/*
apps/examples/www
content.json
apps/docs/utils/vector-db/index.json
**/gen/**/*.md
**/.vercel/*
**/.wrangler/*
**/.out/*
**/.temp/*
apps/dotcom/public/**/*.*

View file

@ -5,5 +5,5 @@
"printWidth": 100, "printWidth": 100,
"tabWidth": 2, "tabWidth": 2,
"useTabs": true, "useTabs": true,
"plugins": [] "plugins": ["prettier-plugin-organize-imports"]
} }

View file

@ -1,3 +0,0 @@
{
"recommendations": ["tldraw-org.tldraw-vscode", "biomejs.biome"]
}

View file

@ -39,7 +39,7 @@
"refresh-embeddings": "yarn run -T tsx --tsconfig ./tsconfig.content.json ./scripts/refresh-embeddings.ts", "refresh-embeddings": "yarn run -T tsx --tsconfig ./tsconfig.content.json ./scripts/refresh-embeddings.ts",
"refresh-everything": "yarn fetch-api-source && yarn fetch-releases && yarn create-api-markdown && yarn refresh-content && yarn refresh-embeddings && yarn format", "refresh-everything": "yarn fetch-api-source && yarn fetch-releases && yarn create-api-markdown && yarn refresh-content && yarn refresh-embeddings && yarn format",
"clean": "rm -rf node_modules .yarn", "clean": "rm -rf node_modules .yarn",
"format": "biome format --write .", "format": "yarn run -T prettier --write .",
"watch-content": "tsx ./watcher.ts" "watch-content": "tsx ./watcher.ts"
}, },
"dependencies": { "dependencies": {
@ -67,7 +67,10 @@
"next-themes": "^0.2.1", "next-themes": "^0.2.1",
"octokit": "^3.1.1", "octokit": "^3.1.1",
"openai": "^4.11.1", "openai": "^4.11.1",
"patch-package": "^8.0.0",
"postinstall-postinstall": "^2.1.0",
"prettier": "^3.0.3", "prettier": "^3.0.3",
"prettier-plugin-organize-imports": "^3.2.3",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-hotkeys-hook": "^4.4.1", "react-hotkeys-hook": "^4.4.1",

View file

@ -115,8 +115,8 @@ export function generateSection(section: InputSection, articles: Articles, index
section.id === 'getting-started' section.id === 'getting-started'
? `/${articleId}` ? `/${articleId}`
: isUncategorized : isUncategorized
? `/${section.id}/${articleId}` ? `/${section.id}/${articleId}`
: `/${section.id}/${categoryId}/${articleId}`, : `/${section.id}/${categoryId}/${articleId}`,
} }
if (isExamples) { if (isExamples) {

View file

@ -161,8 +161,8 @@ export class ContentDatabase {
sectionId === 'examples' sectionId === 'examples'
? this._sidebarExamplesContentLinks ? this._sidebarExamplesContentLinks
: sectionId === 'reference' : sectionId === 'reference'
? this._sidebarReferenceContentLinks ? this._sidebarReferenceContentLinks
: this._sidebarContentLinks : this._sidebarContentLinks
if (cachedLinks && process.env.NODE_ENV !== 'development') { if (cachedLinks && process.env.NODE_ENV !== 'development') {
// Use the previously cached sidebar links // Use the previously cached sidebar links
links = cachedLinks links = cachedLinks

View file

@ -217,8 +217,8 @@ export async function getVectorDb(
INCLUDE_API_CONTENT && INCLUDE_CONTENT INCLUDE_API_CONTENT && INCLUDE_CONTENT
? await db.all('SELECT * FROM articles') ? await db.all('SELECT * FROM articles')
: INCLUDE_API_CONTENT : INCLUDE_API_CONTENT
? await db.all('SELECT * FROM articles WHERE articles.sectionId = ?', 'reference') ? await db.all('SELECT * FROM articles WHERE articles.sectionId = ?', 'reference')
: await db.all('SELECT * FROM articles WHERE articles.sectionId != ?', 'reference') : await db.all('SELECT * FROM articles WHERE articles.sectionId != ?', 'reference')
nicelog(`Adding articles to index`) nicelog(`Adding articles to index`)
const max = Math.min(articles.length, MAX_ARTICLES) const max = Math.min(articles.length, MAX_ARTICLES)

View file

@ -3,11 +3,9 @@ import { AlarmScheduler } from './AlarmScheduler'
jest.useFakeTimers() jest.useFakeTimers()
function makeMockAlarmScheduler<Key extends string>( function makeMockAlarmScheduler<Key extends string>(alarms: {
alarms: { [K in Key]: jest.Mock<Promise<void>, []>
[K in Key]: jest.Mock<Promise<void>, []> }) {
}
) {
const data = new Map<string, number>() const data = new Map<string, number>()
let scheduledAlarm: number | null = null let scheduledAlarm: number | null = null

View file

@ -38,7 +38,7 @@ export function BoardHistorySnapshot({
...(token ...(token
? { ? {
Authorization: 'Bearer ' + token, Authorization: 'Bearer ' + token,
} }
: {}), : {}),
}, },
body: JSON.stringify({ timestamp }), body: JSON.stringify({ timestamp }),

View file

@ -50,8 +50,8 @@ export const PeopleMenuItem = track(function PeopleMenuItem({ userId }: { userId
theyAreFollowingYou theyAreFollowingYou
? msg('people-menu.leading') ? msg('people-menu.leading')
: youAreFollowingThem : youAreFollowingThem
? msg('people-menu.following') ? msg('people-menu.following')
: msg('people-menu.follow') : msg('people-menu.follow')
} }
icon={theyAreFollowingYou ? 'leading' : youAreFollowingThem ? 'following' : 'follow'} icon={theyAreFollowingYou ? 'leading' : youAreFollowingThem ? 'following' : 'follow'}
onClick={handleFollowClick} onClick={handleFollowClick}

View file

@ -188,8 +188,8 @@ export const ShareMenu = React.memo(function ShareMenu() {
shareState.state === 'offline' shareState.state === 'offline'
? 'share-menu.offline-note' ? 'share-menu.offline-note'
: isReadOnlyLink : isReadOnlyLink
? 'share-menu.copy-readonly-link-note' ? 'share-menu.copy-readonly-link-note'
: 'share-menu.copy-link-note' : 'share-menu.copy-link-note'
)} )}
</p> </p>
</div> </div>

View file

@ -10,7 +10,7 @@ const { loader, useData } = defineLoader(async (args) => {
? ((await result.json()) as { ? ((await result.json()) as {
schema: SerializedSchema schema: SerializedSchema
records: TLRecord[] records: TLRecord[]
}) })
: null : null
}) })

View file

@ -97,7 +97,7 @@ export function useFileSystem({ isMultiplayer }: { isMultiplayer: boolean }): TL
const newItem = menuItem(actions[NEW_PROJECT_ACTION]) const newItem = menuItem(actions[NEW_PROJECT_ACTION])
const group = isMultiplayer const group = isMultiplayer
? // open is not currently supported in multiplayer ? // open is not currently supported in multiplayer
menuGroup('filesystem', saveItem) menuGroup('filesystem', saveItem)
: menuGroup('filesystem', newItem, openItem, saveItem) : menuGroup('filesystem', newItem, openItem, saveItem)
fileMenu.children.unshift(group!) fileMenu.children.unshift(group!)

View file

@ -60,11 +60,11 @@ export default function UserPresenceExample() {
t < 1 t < 1
? '' ? ''
: t > 2 : t > 2
? CURSOR_CHAT_MESSAGE ? CURSOR_CHAT_MESSAGE
: CURSOR_CHAT_MESSAGE.slice( : CURSOR_CHAT_MESSAGE.slice(
0, 0,
Math.ceil((t - 1) * CURSOR_CHAT_MESSAGE.length) Math.ceil((t - 1) * CURSOR_CHAT_MESSAGE.length)
) )
} }
editor.store.put([ editor.store.put([

View file

@ -1,77 +0,0 @@
{
"$schema": "https://biomejs.dev/schemas/1.5.3/schema.json",
"organizeImports": {
"enabled": true
},
"vcs": {
"enabled": true,
"clientKind": "git",
"useIgnoreFile": true,
"defaultBranch": "main"
},
"files": {
"ignoreUnknown": true,
"ignore": [
"dist",
"node_modules",
"**/*.d.ts",
".next",
".vercel",
".vscode",
".lazy",
".husky",
"index.json",
"*.api.json",
"api.json",
"**/out/*",
"**/dist/*",
"**/dist-cjs/*",
"**/dist-esm/*",
"**/.next/*",
"**/packages/**/api/*",
"**/.tsbuild*",
"*.mdx",
"**/_archive/*",
"apps/docs/api-content.json",
"apps/docs/content.json",
"apps/vscode/extension/editor/*",
"apps/examples/www",
"content.json",
"apps/docs/utils/vector-db/index.json",
"**/gen/**/*.md",
"**/.vercel/*",
"**/.wrangler/*",
"**/.out/*",
"**/.temp/*",
"apps/dotcom/public/**/*.*"
]
},
"formatter": {
"enabled": true,
"formatWithErrors": true,
"indentStyle": "tab",
"indentWidth": 2,
"lineEnding": "lf",
"lineWidth": 100
},
"javascript": {
"formatter": {
"semicolons": "asNeeded",
"trailingComma": "es5",
"quoteStyle": "single",
"jsxQuoteStyle": "double",
"quoteProperties": "asNeeded",
"arrowParentheses": "always",
"bracketSameLine": false,
"bracketSpacing": true
}
},
"json": {
"formatter": {
"lineWidth": 80
}
},
"linter": {
"enabled": false
}
}

View file

@ -50,7 +50,7 @@
"build-package": "lazy build-package", "build-package": "lazy build-package",
"preview-app": "VITE_PREVIEW=1 yarn dev-app", "preview-app": "VITE_PREVIEW=1 yarn dev-app",
"lint": "lazy lint", "lint": "lazy lint",
"format": "biome format --write .", "format": "prettier --write --cache \"**/*.{ts,tsx,js,jsx,json}\"",
"typecheck": "yarn refresh-assets && tsx scripts/typecheck.ts", "typecheck": "yarn refresh-assets && tsx scripts/typecheck.ts",
"check-scripts": "tsx scripts/check-scripts.ts", "check-scripts": "tsx scripts/check-scripts.ts",
"api-check": "lazy api-check", "api-check": "lazy api-check",
@ -65,11 +65,10 @@
"packageManager": "yarn@4.0.2", "packageManager": "yarn@4.0.2",
"lint-staged": { "lint-staged": {
"*.{js,jsx,ts,tsx,json}": [ "*.{js,jsx,ts,tsx,json}": [
"biome format --write --no-errors-on-unmatched" "prettier --write --cache"
] ]
}, },
"devDependencies": { "devDependencies": {
"@biomejs/biome": "1.5.3",
"@microsoft/api-extractor": "^7.35.4", "@microsoft/api-extractor": "^7.35.4",
"@next/eslint-plugin-next": "^13.3.0", "@next/eslint-plugin-next": "^13.3.0",
"@swc/core": "^1.3.55", "@swc/core": "^1.3.55",
@ -96,14 +95,13 @@
"json5": "^2.2.3", "json5": "^2.2.3",
"lazyrepo": "0.0.0-alpha.27", "lazyrepo": "0.0.0-alpha.27",
"lint-staged": ">=10", "lint-staged": ">=10",
"prettier": "^3.0.3",
"prettier-plugin-organize-imports": "^3.2.3",
"rimraf": "^4.4.0", "rimraf": "^4.4.0",
"tsx": "^4.0.0", "tsx": "^4.0.0",
"typescript": "^5.2.2", "typescript": "^5.2.2",
"vercel": "^28.16.15" "vercel": "^28.16.15"
}, },
"devDependenciesComments": {
"@biomejs/biome": "biome recommends pinning the particular version, see https://github.com/marketplace/actions/setup-biome"
},
"resolutions": { "resolutions": {
"@microsoft/api-extractor@^7.35.4": "patch:@microsoft/api-extractor@npm%3A7.35.4#./.yarn/patches/@microsoft-api-extractor-npm-7.35.4-5f4f0357b4.patch", "@microsoft/api-extractor@^7.35.4": "patch:@microsoft/api-extractor@npm%3A7.35.4#./.yarn/patches/@microsoft-api-extractor-npm-7.35.4-5f4f0357b4.patch",
"vectra@^0.4.4": "patch:vectra@npm%3A0.4.4#./.yarn/patches/vectra-npm-0.4.4-6aac3f6c29.patch", "vectra@^0.4.4": "patch:vectra@npm%3A0.4.4#./.yarn/patches/vectra-npm-0.4.4-6aac3f6c29.patch",

View file

@ -5,6 +5,23 @@
/// <reference path="./modules.d.ts" /> /// <reference path="./modules.d.ts" />
import { formatAssetUrl } from './utils.js' import { formatAssetUrl } from './utils.js'
import embedIconsCodepen from './embed-icons/codepen.png'
import embedIconsCodesandbox from './embed-icons/codesandbox.png'
import embedIconsExcalidraw from './embed-icons/excalidraw.png'
import embedIconsFelt from './embed-icons/felt.png'
import embedIconsFigma from './embed-icons/figma.png'
import embedIconsGithubGist from './embed-icons/github_gist.png'
import embedIconsGoogleCalendar from './embed-icons/google_calendar.png'
import embedIconsGoogleMaps from './embed-icons/google_maps.png'
import embedIconsGoogleSlides from './embed-icons/google_slides.png'
import embedIconsObservable from './embed-icons/observable.png'
import embedIconsReplit from './embed-icons/replit.png'
import embedIconsScratch from './embed-icons/scratch.png'
import embedIconsSpotify from './embed-icons/spotify.png'
import embedIconsTldraw from './embed-icons/tldraw.png'
import embedIconsValTown from './embed-icons/val_town.png'
import embedIconsVimeo from './embed-icons/vimeo.png'
import embedIconsYoutube from './embed-icons/youtube.png'
import fontsMonospace from './fonts/IBMPlexMono-Medium.woff2' import fontsMonospace from './fonts/IBMPlexMono-Medium.woff2'
import fontsSansSerif from './fonts/IBMPlexSans-Medium.woff2' import fontsSansSerif from './fonts/IBMPlexSans-Medium.woff2'
import fontsSerif from './fonts/IBMPlexSerif-Medium.woff2' import fontsSerif from './fonts/IBMPlexSerif-Medium.woff2'
@ -209,23 +226,6 @@ import translationsUk from './translations/uk.json'
import translationsVi from './translations/vi.json' import translationsVi from './translations/vi.json'
import translationsZhCn from './translations/zh-cn.json' import translationsZhCn from './translations/zh-cn.json'
import translationsZhTw from './translations/zh-tw.json' import translationsZhTw from './translations/zh-tw.json'
import embedIconsCodepen from './embed-icons/codepen.png'
import embedIconsCodesandbox from './embed-icons/codesandbox.png'
import embedIconsExcalidraw from './embed-icons/excalidraw.png'
import embedIconsFelt from './embed-icons/felt.png'
import embedIconsFigma from './embed-icons/figma.png'
import embedIconsGithubGist from './embed-icons/github_gist.png'
import embedIconsGoogleCalendar from './embed-icons/google_calendar.png'
import embedIconsGoogleMaps from './embed-icons/google_maps.png'
import embedIconsGoogleSlides from './embed-icons/google_slides.png'
import embedIconsObservable from './embed-icons/observable.png'
import embedIconsReplit from './embed-icons/replit.png'
import embedIconsScratch from './embed-icons/scratch.png'
import embedIconsSpotify from './embed-icons/spotify.png'
import embedIconsTldraw from './embed-icons/tldraw.png'
import embedIconsValTown from './embed-icons/val_town.png'
import embedIconsVimeo from './embed-icons/vimeo.png'
import embedIconsYoutube from './embed-icons/youtube.png'
/** /**
* @param {AssetUrlOptions} [opts] * @param {AssetUrlOptions} [opts]

View file

@ -5,6 +5,23 @@
/// <reference path="./modules.d.ts" /> /// <reference path="./modules.d.ts" />
import { formatAssetUrl } from './utils.js' import { formatAssetUrl } from './utils.js'
import embedIconsCodepen from './embed-icons/codepen.png?url'
import embedIconsCodesandbox from './embed-icons/codesandbox.png?url'
import embedIconsExcalidraw from './embed-icons/excalidraw.png?url'
import embedIconsFelt from './embed-icons/felt.png?url'
import embedIconsFigma from './embed-icons/figma.png?url'
import embedIconsGithubGist from './embed-icons/github_gist.png?url'
import embedIconsGoogleCalendar from './embed-icons/google_calendar.png?url'
import embedIconsGoogleMaps from './embed-icons/google_maps.png?url'
import embedIconsGoogleSlides from './embed-icons/google_slides.png?url'
import embedIconsObservable from './embed-icons/observable.png?url'
import embedIconsReplit from './embed-icons/replit.png?url'
import embedIconsScratch from './embed-icons/scratch.png?url'
import embedIconsSpotify from './embed-icons/spotify.png?url'
import embedIconsTldraw from './embed-icons/tldraw.png?url'
import embedIconsValTown from './embed-icons/val_town.png?url'
import embedIconsVimeo from './embed-icons/vimeo.png?url'
import embedIconsYoutube from './embed-icons/youtube.png?url'
import fontsMonospace from './fonts/IBMPlexMono-Medium.woff2?url' import fontsMonospace from './fonts/IBMPlexMono-Medium.woff2?url'
import fontsSansSerif from './fonts/IBMPlexSans-Medium.woff2?url' import fontsSansSerif from './fonts/IBMPlexSans-Medium.woff2?url'
import fontsSerif from './fonts/IBMPlexSerif-Medium.woff2?url' import fontsSerif from './fonts/IBMPlexSerif-Medium.woff2?url'
@ -209,23 +226,6 @@ import translationsUk from './translations/uk.json?url'
import translationsVi from './translations/vi.json?url' import translationsVi from './translations/vi.json?url'
import translationsZhCn from './translations/zh-cn.json?url' import translationsZhCn from './translations/zh-cn.json?url'
import translationsZhTw from './translations/zh-tw.json?url' import translationsZhTw from './translations/zh-tw.json?url'
import embedIconsCodepen from './embed-icons/codepen.png?url'
import embedIconsCodesandbox from './embed-icons/codesandbox.png?url'
import embedIconsExcalidraw from './embed-icons/excalidraw.png?url'
import embedIconsFelt from './embed-icons/felt.png?url'
import embedIconsFigma from './embed-icons/figma.png?url'
import embedIconsGithubGist from './embed-icons/github_gist.png?url'
import embedIconsGoogleCalendar from './embed-icons/google_calendar.png?url'
import embedIconsGoogleMaps from './embed-icons/google_maps.png?url'
import embedIconsGoogleSlides from './embed-icons/google_slides.png?url'
import embedIconsObservable from './embed-icons/observable.png?url'
import embedIconsReplit from './embed-icons/replit.png?url'
import embedIconsScratch from './embed-icons/scratch.png?url'
import embedIconsSpotify from './embed-icons/spotify.png?url'
import embedIconsTldraw from './embed-icons/tldraw.png?url'
import embedIconsValTown from './embed-icons/val_town.png?url'
import embedIconsVimeo from './embed-icons/vimeo.png?url'
import embedIconsYoutube from './embed-icons/youtube.png?url'
/** /**
* @param {AssetUrlOptions} [opts] * @param {AssetUrlOptions} [opts]

View file

@ -157,8 +157,8 @@ function getStateFromElapsedTime(elapsed: number) {
return elapsed > COLLABORATOR_INACTIVE_TIMEOUT return elapsed > COLLABORATOR_INACTIVE_TIMEOUT
? 'inactive' ? 'inactive'
: elapsed > COLLABORATOR_IDLE_TIMEOUT : elapsed > COLLABORATOR_IDLE_TIMEOUT
? 'idle' ? 'idle'
: 'active' : 'active'
} }
function useCollaboratorState(latestPresence: TLInstancePresence | null) { function useCollaboratorState(latestPresence: TLInstancePresence | null) {

View file

@ -32,13 +32,13 @@ export function createTLStore({ initialData, defaultName = '', ...rest }: TLStor
const schema = const schema =
'schema' in rest && rest.schema 'schema' in rest && rest.schema
? // we have a schema ? // we have a schema
rest.schema rest.schema
: // we need a schema : // we need a schema
createTLSchema({ createTLSchema({
shapes: currentPageShapesToShapeMap( shapes: currentPageShapesToShapeMap(
checkShapesAndAddCore('shapeUtils' in rest && rest.shapeUtils ? rest.shapeUtils : []) checkShapesAndAddCore('shapeUtils' in rest && rest.shapeUtils ? rest.shapeUtils : [])
), ),
}) })
return new Store({ return new Store({
schema, schema,

View file

@ -5759,12 +5759,12 @@ export class Editor extends EventEmitter<TLEventMap> {
? { ? {
...translateStartChanges, ...translateStartChanges,
[val]: shape[val] + localDelta[val], [val]: shape[val] + localDelta[val],
} }
: { : {
id: shape.id as any, id: shape.id as any,
type: shape.type, type: shape.type,
[val]: shape[val] + localDelta[val], [val]: shape[val] + localDelta[val],
} }
) )
v += pageBounds[shape.id][dim] + shapeGap v += pageBounds[shape.id][dim] + shapeGap
@ -7850,16 +7850,16 @@ export class Editor extends EventEmitter<TLEventMap> {
newShape.props.start = mappedId newShape.props.start = mappedId
? { ...newShape.props.start, boundShapeId: mappedId } ? { ...newShape.props.start, boundShapeId: mappedId }
: // this shouldn't happen, if you copy an arrow but not it's bound shape it should : // this shouldn't happen, if you copy an arrow but not it's bound shape it should
// convert the binding to a point at the time of copying // convert the binding to a point at the time of copying
{ type: 'point', x: 0, y: 0 } { type: 'point', x: 0, y: 0 }
} }
if (newShape.props.end.type === 'binding') { if (newShape.props.end.type === 'binding') {
const mappedId = idMap.get(newShape.props.end.boundShapeId) const mappedId = idMap.get(newShape.props.end.boundShapeId)
newShape.props.end = mappedId newShape.props.end = mappedId
? { ...newShape.props.end, boundShapeId: mappedId } ? { ...newShape.props.end, boundShapeId: mappedId }
: // this shouldn't happen, if you copy an arrow but not it's bound shape it should : // this shouldn't happen, if you copy an arrow but not it's bound shape it should
// convert the binding to a point at the time of copying // convert the binding to a point at the time of copying
{ type: 'point', x: 0, y: 0 } { type: 'point', x: 0, y: 0 }
} }
} }

View file

@ -499,8 +499,8 @@ export class BoundsSnaps {
? 'x' ? 'x'
: 'y' : 'y'
: nearestSnapsX.length : nearestSnapsX.length
? 'x' ? 'x'
: 'y' : 'y'
const ratio = initialSelectionPageBounds.aspectRatio const ratio = initialSelectionPageBounds.aspectRatio
@ -1049,7 +1049,7 @@ export class BoundsSnaps {
'forward', 'forward',
gapBreadthIntersection gapBreadthIntersection
), ),
] ]
: [ : [
...findAdjacentGaps( ...findAdjacentGaps(
horizontal, horizontal,
@ -1065,7 +1065,7 @@ export class BoundsSnaps {
) as [Vec, Vec], ) as [Vec, Vec],
endEdge: selectionSides.left, endEdge: selectionSides.left,
}, },
], ],
}) })
break break
@ -1153,7 +1153,7 @@ export class BoundsSnaps {
'forward', 'forward',
gapBreadthIntersection gapBreadthIntersection
), ),
] ]
: [ : [
...findAdjacentGaps( ...findAdjacentGaps(
vertical, vertical,
@ -1169,7 +1169,7 @@ export class BoundsSnaps {
) as [Vec, Vec], ) as [Vec, Vec],
endEdge: selectionSides.top, endEdge: selectionSides.top,
}, },
], ],
}) })
} }
break break

View file

@ -23,10 +23,10 @@ export const EASINGS = {
t <= 0 t <= 0
? 0 ? 0
: t >= 1 : t >= 1
? 1 ? 1
: t < 0.5 : t < 0.5
? Math.pow(2, 20 * t - 10) / 2 ? Math.pow(2, 20 * t - 10) / 2
: (2 - Math.pow(2, -20 * t + 10)) / 2, : (2 - Math.pow(2, -20 * t + 10)) / 2,
} as const } as const
/** @public */ /** @public */

View file

@ -14,7 +14,7 @@ export function getIncrementedName(name: string, others: string[]) {
result = /^.*(\d+)$/.exec(result)?.[1] result = /^.*(\d+)$/.exec(result)?.[1]
? result.replace(/(\d+)(?=\D?)$/, (m) => { ? result.replace(/(\d+)(?=\D?)$/, (m) => {
return (+m + 1).toString() return (+m + 1).toString()
}) })
: `${result} 1` : `${result} 1`
} }

View file

@ -1,8 +1,5 @@
[ [
[ ["functions", ["atom-1", "computed-1", "react", "reactor-1", "transact", "transaction"]],
"functions",
["atom-1", "computed-1", "react", "reactor-1", "transact", "transaction"]
],
["classes"], ["classes"],
["interfaces", ["Signal"]] ["interfaces", ["Signal"]]
] ]

View file

@ -121,13 +121,13 @@ export class StoreSchema<R extends UnknownRecord, P = unknown> {
migrations: ourType.migrations, migrations: ourType.migrations,
fromVersion: persistedVersion, fromVersion: persistedVersion,
toVersion: ourVersion, toVersion: ourVersion,
}) })
: migrateRecord<R>({ : migrateRecord<R>({
record, record,
migrations: ourType.migrations, migrations: ourType.migrations,
fromVersion: ourVersion, fromVersion: ourVersion,
toVersion: persistedVersion, toVersion: persistedVersion,
}) })
if (result.type === 'error') { if (result.type === 'error') {
return result return result
} }
@ -174,13 +174,13 @@ export class StoreSchema<R extends UnknownRecord, P = unknown> {
migrations: ourSubTypeMigrations, migrations: ourSubTypeMigrations,
fromVersion: persistedSubTypeVersion, fromVersion: persistedSubTypeVersion,
toVersion: ourSubTypeMigrations.currentVersion, toVersion: ourSubTypeMigrations.currentVersion,
}) })
: migrateRecord<R>({ : migrateRecord<R>({
record, record,
migrations: ourSubTypeMigrations, migrations: ourSubTypeMigrations,
fromVersion: ourSubTypeMigrations.currentVersion, fromVersion: ourSubTypeMigrations.currentVersion,
toVersion: persistedSubTypeVersion, toVersion: persistedSubTypeVersion,
}) })
if (result.type === 'error') { if (result.type === 'error') {
return result return result
@ -258,12 +258,12 @@ export class StoreSchema<R extends UnknownRecord, P = unknown> {
k, k,
v.currentVersion, v.currentVersion,
]) ])
) )
: undefined, : undefined,
} }
: { : {
version: type.migrations.currentVersion, version: type.migrations.currentVersion,
}, },
]) ])
), ),
} }
@ -286,12 +286,12 @@ export class StoreSchema<R extends UnknownRecord, P = unknown> {
k, k,
v.firstVersion, v.firstVersion,
]) ])
) )
: undefined, : undefined,
} }
: { : {
version: type.migrations.firstVersion, version: type.migrations.firstVersion,
}, },
]) ])
), ),
} }

View file

@ -213,105 +213,105 @@ type Range<From extends number, To extends number> = To extends From
type Decrement<n extends number> = n extends 0 type Decrement<n extends number> = n extends 0
? never ? never
: n extends 1 : n extends 1
? 0 ? 0
: n extends 2 : n extends 2
? 1 ? 1
: n extends 3 : n extends 3
? 2 ? 2
: n extends 4 : n extends 4
? 3 ? 3
: n extends 5 : n extends 5
? 4 ? 4
: n extends 6 : n extends 6
? 5 ? 5
: n extends 7 : n extends 7
? 6 ? 6
: n extends 8 : n extends 8
? 7 ? 7
: n extends 9 : n extends 9
? 8 ? 8
: n extends 10 : n extends 10
? 9 ? 9
: n extends 11 : n extends 11
? 10 ? 10
: n extends 12 : n extends 12
? 11 ? 11
: n extends 13 : n extends 13
? 12 ? 12
: n extends 14 : n extends 14
? 13 ? 13
: n extends 15 : n extends 15
? 14 ? 14
: n extends 16 : n extends 16
? 15 ? 15
: n extends 17 : n extends 17
? 16 ? 16
: n extends 18 : n extends 18
? 17 ? 17
: n extends 19 : n extends 19
? 18 ? 18
: n extends 20 : n extends 20
? 19 ? 19
: n extends 21 : n extends 21
? 20 ? 20
: n extends 22 : n extends 22
? 21 ? 21
: n extends 23 : n extends 23
? 22 ? 22
: n extends 24 : n extends 24
? 23 ? 23
: n extends 25 : n extends 25
? 24 ? 24
: n extends 26 : n extends 26
? 25 ? 25
: n extends 27 : n extends 27
? 26 ? 26
: n extends 28 : n extends 28
? 27 ? 27
: n extends 29 : n extends 29
? 28 ? 28
: n extends 30 : n extends 30
? 29 ? 29
: n extends 31 : n extends 31
? 30 ? 30
: n extends 32 : n extends 32
? 31 ? 31
: n extends 33 : n extends 33
? 32 ? 32
: n extends 34 : n extends 34
? 33 ? 33
: n extends 35 : n extends 35
? 34 ? 34
: n extends 36 : n extends 36
? 35 ? 35
: n extends 37 : n extends 37
? 36 ? 36
: n extends 38 : n extends 38
? 37 ? 37
: n extends 39 : n extends 39
? 38 ? 38
: n extends 40 : n extends 40
? 39 ? 39
: n extends 41 : n extends 41
? 40 ? 40
: n extends 42 : n extends 42
? 41 ? 41
: n extends 43 : n extends 43
? 42 ? 42
: n extends 44 : n extends 44
? 43 ? 43
: n extends 45 : n extends 45
? 44 ? 44
: n extends 46 : n extends 46
? 45 ? 45
: n extends 47 : n extends 47
? 46 ? 46
: n extends 48 : n extends 48
? 47 ? 47
: n extends 49 : n extends 49
? 48 ? 48
: n extends 50 : n extends 50
? 49 ? 49
: n extends 51 : n extends 51
? 50 ? 50
: never : never

View file

@ -140,7 +140,7 @@ export const TldrawSelectionForeground: TLSelectionForegroundComponent = track(
shouldDisplayControls && shouldDisplayControls &&
(onlyShape (onlyShape
? editor.getShapeUtil(onlyShape).canResize(onlyShape) && ? editor.getShapeUtil(onlyShape).canResize(onlyShape) &&
!editor.getShapeUtil(onlyShape).hideResizeHandles(onlyShape) !editor.getShapeUtil(onlyShape).hideResizeHandles(onlyShape)
: true) && : true) &&
!showCropHandles && !showCropHandles &&
!isLockedShape !isLockedShape

View file

@ -104,7 +104,7 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
? new Edge2d({ ? new Edge2d({
start: Vec.From(info.start.point), start: Vec.From(info.start.point),
end: Vec.From(info.end.point), end: Vec.From(info.end.point),
}) })
: new Arc2d({ : new Arc2d({
center: Vec.Cast(info.handleArc.center), center: Vec.Cast(info.handleArc.center),
radius: info.handleArc.radius, radius: info.handleArc.radius,
@ -112,7 +112,7 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
end: Vec.Cast(info.end.point), end: Vec.Cast(info.end.point),
sweepFlag: info.bodyArc.sweepFlag, sweepFlag: info.bodyArc.sweepFlag,
largeArcFlag: info.bodyArc.largeArcFlag, largeArcFlag: info.bodyArc.largeArcFlag,
}) })
let labelGeom let labelGeom
if (shape.props.text.trim()) { if (shape.props.text.trim()) {
@ -583,8 +583,8 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
? shape.props.start.isExact ? shape.props.start.isExact
? '' ? ''
: shape.props.start.isPrecise : shape.props.start.isPrecise
? 'url(#arrowhead-cross)' ? 'url(#arrowhead-cross)'
: 'url(#arrowhead-dot)' : 'url(#arrowhead-dot)'
: '' : ''
} }
markerEnd={ markerEnd={
@ -592,8 +592,8 @@ export class ArrowShapeUtil extends ShapeUtil<TLArrowShape> {
? shape.props.end.isExact ? shape.props.end.isExact
? '' ? ''
: shape.props.end.isPrecise : shape.props.end.isPrecise
? 'url(#arrowhead-cross)' ? 'url(#arrowhead-cross)'
: 'url(#arrowhead-dot)' : 'url(#arrowhead-dot)'
: '' : ''
} }
opacity={0.16} opacity={0.16}

View file

@ -39,7 +39,7 @@ export function getArrowLabelSize(editor: Editor, shape: TLArrowShape) {
? new Edge2d({ ? new Edge2d({
start: Vec.From(info.start.point), start: Vec.From(info.start.point),
end: Vec.From(info.end.point), end: Vec.From(info.end.point),
}) })
: new Arc2d({ : new Arc2d({
center: Vec.Cast(info.handleArc.center), center: Vec.Cast(info.handleArc.center),
radius: info.handleArc.radius, radius: info.handleArc.radius,
@ -47,7 +47,7 @@ export function getArrowLabelSize(editor: Editor, shape: TLArrowShape) {
end: Vec.Cast(info.end.point), end: Vec.Cast(info.end.point),
sweepFlag: info.bodyArc.sweepFlag, sweepFlag: info.bodyArc.sweepFlag,
largeArcFlag: info.bodyArc.largeArcFlag, largeArcFlag: info.bodyArc.largeArcFlag,
}) })
if (shape.props.text.trim()) { if (shape.props.text.trim()) {
const bodyBounds = bodyGeom.bounds const bodyBounds = bodyGeom.bounds

View file

@ -29,8 +29,8 @@ function getArrowPoints(
? ints[0] ? ints[0]
: ints[1] : ints[1]
: info.handleArc.sweepFlag : info.handleArc.sweepFlag
? ints[1] ? ints[1]
: ints[0] : ints[0]
} }
if (Vec.IsNaN(P0)) { if (Vec.IsNaN(P0)) {

View file

@ -72,10 +72,10 @@ export function getFreehandOptions(
...(forceSolid ...(forceSolid
? solidSettings(strokeWidth) ? solidSettings(strokeWidth)
: shapeProps.dash === 'draw' : shapeProps.dash === 'draw'
? shapeProps.isPen ? shapeProps.isPen
? realPressureSettings(strokeWidth) ? realPressureSettings(strokeWidth)
: simulatePressureSettings(strokeWidth) : simulatePressureSettings(strokeWidth)
: solidSettings(strokeWidth)), : solidSettings(strokeWidth)),
last: shapeProps.isComplete || forceComplete, last: shapeProps.isComplete || forceComplete,
} }
} }

View file

@ -322,14 +322,14 @@ export class GeoShapeUtil extends BaseBoxShapeUtil<TLGeoShape> {
shape.props.align === 'start' shape.props.align === 'start'
? 0 ? 0
: shape.props.align === 'end' : shape.props.align === 'end'
? w - labelWidth ? w - labelWidth
: (w - labelWidth) / 2, : (w - labelWidth) / 2,
y: y:
shape.props.verticalAlign === 'start' shape.props.verticalAlign === 'start'
? 0 ? 0
: shape.props.verticalAlign === 'end' : shape.props.verticalAlign === 'end'
? h - labelHeight ? h - labelHeight
: (h - labelHeight) / 2, : (h - labelHeight) / 2,
width: labelWidth, width: labelWidth,
height: labelHeight, height: labelHeight,
isFilled: true, isFilled: true,

View file

@ -59,7 +59,7 @@ export function getPillPoints(width: number, height: number, numPoints: number)
center: new Vec(radius, radius), center: new Vec(radius, radius),
startAngle: PI / 2, startAngle: PI / 2,
}, },
] ]
: [ : [
{ {
type: 'straight', type: 'straight',
@ -81,7 +81,7 @@ export function getPillPoints(width: number, height: number, numPoints: number)
center: new Vec(radius, radius), center: new Vec(radius, radius),
startAngle: PI, startAngle: PI,
}, },
] ]
let sectionOffset = 0 let sectionOffset = 0

View file

@ -39,10 +39,10 @@ export const DashStyleCloud = React.memo(function DashStylePolygon({
{arcs.map(({ leftPoint, rightPoint, center, radius }, i) => { {arcs.map(({ leftPoint, rightPoint, center, radius }, i) => {
const arcLength = center const arcLength = center
? radius * ? radius *
canonicalizeRotation( canonicalizeRotation(
canonicalizeRotation(Vec.Angle(center, rightPoint)) - canonicalizeRotation(Vec.Angle(center, rightPoint)) -
canonicalizeRotation(Vec.Angle(center, leftPoint)) canonicalizeRotation(Vec.Angle(center, leftPoint))
) )
: Vec.Dist(leftPoint, rightPoint) : Vec.Dist(leftPoint, rightPoint)
const { strokeDasharray, strokeDashoffset } = getPerfectDashProps( const { strokeDasharray, strokeDashoffset } = getPerfectDashProps(
@ -99,10 +99,10 @@ export function DashStyleCloudSvg({
for (const { leftPoint, rightPoint, center, radius } of arcs) { for (const { leftPoint, rightPoint, center, radius } of arcs) {
const arcLength = center const arcLength = center
? radius * ? radius *
canonicalizeRotation( canonicalizeRotation(
canonicalizeRotation(Vec.Angle(center, rightPoint)) - canonicalizeRotation(Vec.Angle(center, rightPoint)) -
canonicalizeRotation(Vec.Angle(center, leftPoint)) canonicalizeRotation(Vec.Angle(center, leftPoint))
) )
: Vec.Dist(leftPoint, rightPoint) : Vec.Dist(leftPoint, rightPoint)
const { strokeDasharray, strokeDashoffset } = getPerfectDashProps(arcLength, strokeWidth, { const { strokeDasharray, strokeDashoffset } = getPerfectDashProps(arcLength, strokeWidth, {

View file

@ -94,8 +94,8 @@ export class Pointing extends StateNode {
shape.props.geo === 'star' shape.props.geo === 'star'
? new Box(0, 0, 200, 190) ? new Box(0, 0, 200, 190)
: shape.props.geo === 'cloud' : shape.props.geo === 'cloud'
? new Box(0, 0, 300, 180) ? new Box(0, 0, 300, 180)
: new Box(0, 0, 200, 200) : new Box(0, 0, 200, 200)
const delta = bounds.center const delta = bounds.center
const parentTransform = this.editor.getShapeParentTransform(shape) const parentTransform = this.editor.getShapeParentTransform(shape)

View file

@ -82,7 +82,7 @@ export const TextLabel = React.memo(function TextLabel<
width: bounds.width, width: bounds.width,
height: bounds.height, height: bounds.height,
position: 'absolute', position: 'absolute',
} }
: {}), : {}),
}} }}
> >

View file

@ -59,8 +59,8 @@ export function createTextSvgElementFromSpans(
(opts.verticalTextAlign === 'start' (opts.verticalTextAlign === 'start'
? padding ? padding
: opts.verticalTextAlign === 'end' : opts.verticalTextAlign === 'end'
? opts.height - padding - bounds.height ? opts.height - padding - bounds.height
: (Math.ceil(opts.height) - bounds.height) / 2) : (Math.ceil(opts.height) - bounds.height) / 2)
// Create text span elements for each word // Create text span elements for each word
let currentLineTop = null let currentLineTop = null

View file

@ -207,15 +207,15 @@ export function getStrokeOutlinePoints(
start.taper === false start.taper === false
? 0 ? 0
: start.taper === true : start.taper === true
? Math.max(size, totalLength) ? Math.max(size, totalLength)
: (start.taper as number) : (start.taper as number)
const taperEnd = const taperEnd =
end.taper === false end.taper === false
? 0 ? 0
: end.taper === true : end.taper === true
? Math.max(size, totalLength) ? Math.max(size, totalLength)
: (end.taper as number) : (end.taper as number)
// The minimum allowed distance between points (squared) // The minimum allowed distance between points (squared)
// Our collected left and right points // Our collected left and right points

View file

@ -89,15 +89,15 @@ export function setStrokePointRadii(strokePoints: StrokePoint[], options: Stroke
start.taper === false start.taper === false
? 0 ? 0
: start.taper === true : start.taper === true
? Math.max(size, totalLength) ? Math.max(size, totalLength)
: (start.taper as number) : (start.taper as number)
const taperEnd = const taperEnd =
end.taper === false end.taper === false
? 0 ? 0
: end.taper === true : end.taper === true
? Math.max(size, totalLength) ? Math.max(size, totalLength)
: (end.taper as number) : (end.taper as number)
if (taperStart || taperEnd) { if (taperStart || taperEnd) {
for (let i = 0; i < strokePoints.length; i++) { for (let i = 0; i < strokePoints.length; i++) {

View file

@ -378,7 +378,7 @@ function getTextSize(editor: Editor, props: TLTextShape['props']) {
const cw = autoSize const cw = autoSize
? null ? null
: // `measureText` floors the number so we need to do the same here to avoid issues. : // `measureText` floors the number so we need to do the same here to avoid issues.
Math.floor(Math.max(minWidth, w)) Math.floor(Math.max(minWidth, w))
const result = editor.textMeasure.measureText(text, { const result = editor.textMeasure.measureText(text, {
...TEXT_PROPS, ...TEXT_PROPS,

View file

@ -195,10 +195,10 @@ export class Idle extends StateNode {
hoveredShape && !this.editor.isShapeOfType<TLGroupShape>(hoveredShape, 'group') hoveredShape && !this.editor.isShapeOfType<TLGroupShape>(hoveredShape, 'group')
? hoveredShape ? hoveredShape
: this.editor.getSelectedShapeAtPoint(this.editor.inputs.currentPagePoint) ?? : this.editor.getSelectedShapeAtPoint(this.editor.inputs.currentPagePoint) ??
this.editor.getShapeAtPoint(this.editor.inputs.currentPagePoint, { this.editor.getShapeAtPoint(this.editor.inputs.currentPagePoint, {
margin: HIT_TEST_MARGIN / this.editor.getZoomLevel(), margin: HIT_TEST_MARGIN / this.editor.getZoomLevel(),
hitInside: false, hitInside: false,
}) })
const focusedGroupId = this.editor.getFocusedGroupId() const focusedGroupId = this.editor.getFocusedGroupId()
@ -354,7 +354,7 @@ export class Idle extends StateNode {
hitLabels: true, hitLabels: true,
hitFrameInside: false, hitFrameInside: false,
renderingOnly: true, renderingOnly: true,
}) })
if (hitShape) { if (hitShape) {
this.onRightClick({ this.onRightClick({
@ -585,8 +585,8 @@ export class Idle extends StateNode {
? gridSize * GRID_INCREMENT ? gridSize * GRID_INCREMENT
: gridSize : gridSize
: shiftKey : shiftKey
? MAJOR_NUDGE_FACTOR ? MAJOR_NUDGE_FACTOR
: MINOR_NUDGE_FACTOR : MINOR_NUDGE_FACTOR
this.editor.nudgeShapes(this.editor.getSelectedShapeIds(), delta.mul(step)) this.editor.nudgeShapes(this.editor.getSelectedShapeIds(), delta.mul(step))
} }

View file

@ -39,7 +39,7 @@ export class PointingSelection extends StateNode {
hitInside: true, hitInside: true,
margin: 0, margin: 0,
renderingOnly: true, renderingOnly: true,
}) })
if (hitShape) { if (hitShape) {
// todo: extract the double click shape logic from idle so that we can share it here // todo: extract the double click shape logic from idle so that we can share it here

View file

@ -35,8 +35,8 @@ export const ActionsMenu = memo(function ActionsMenu() {
? `${msg(label)} ${kbdStr(kbd)}` ? `${msg(label)} ${kbdStr(kbd)}`
: `${msg(label)}` : `${msg(label)}`
: kbd : kbd
? `${kbdStr(kbd)}` ? `${kbdStr(kbd)}`
: '' : ''
} }
onClick={() => onSelect('actions-menu')} onClick={() => onSelect('actions-menu')}
disabled={item.disabled} disabled={item.disabled}

View file

@ -93,14 +93,14 @@ const CurrentState = track(function CurrentState() {
shape && path.includes('select.') shape && path.includes('select.')
? ` / ${shape.type || ''}${ ? ` / ${shape.type || ''}${
'geo' in shape.props ? ' / ' + shape.props.geo : '' 'geo' in shape.props ? ' / ' + shape.props.geo : ''
} / [${Vec.ToFixed(editor.getPointInShapeSpace(shape, editor.inputs.currentPagePoint), 0)}]` } / [${Vec.ToFixed(editor.getPointInShapeSpace(shape, editor.inputs.currentPagePoint), 0)}]`
: '' : ''
const ruler = const ruler =
path.startsWith('select.') && !path.includes('.idle') path.startsWith('select.') && !path.includes('.idle')
? ` / [${Vec.ToFixed(editor.inputs.originPagePoint, 0)}] → [${Vec.ToFixed( ? ` / [${Vec.ToFixed(editor.inputs.originPagePoint, 0)}] → [${Vec.ToFixed(
editor.inputs.currentPagePoint, editor.inputs.currentPagePoint,
0 0
)}] = ${Vec.Dist(editor.inputs.originPagePoint, editor.inputs.currentPagePoint).toFixed(0)}` )}] = ${Vec.Dist(editor.inputs.originPagePoint, editor.inputs.currentPagePoint).toFixed(0)}`
: '' : ''
return <div className="tlui-debug-panel__current-state">{`${path}${shapeInfo}${ruler}`}</div> return <div className="tlui-debug-panel__current-state">{`${path}${shapeInfo}${ruler}`}</div>

View file

@ -65,8 +65,8 @@ function MenuContent() {
depth <= 1 depth <= 1
? 'medium' ? 'medium'
: breakpoint < 3 || (parent?.type === 'submenu' && depth > 2) : breakpoint < 3 || (parent?.type === 'submenu' && depth > 2)
? 'tiny' ? 'tiny'
: 'medium' : 'medium'
} }
key={item.id} key={item.id}
> >

View file

@ -129,7 +129,7 @@ function CommonStylePickerSet({
minBy(tldrawSupportedOpacities, (supportedOpacity) => minBy(tldrawSupportedOpacities, (supportedOpacity) =>
Math.abs(supportedOpacity - opacity.value) Math.abs(supportedOpacity - opacity.value)
)! )!
) )
return ( return (
<> <>

View file

@ -244,12 +244,12 @@ export async function pasteExcalidrawContent(editor: Editor, clipboard: any, poi
normalizedAnchor: { x: 0.5, y: 0.5 }, normalizedAnchor: { x: 0.5, y: 0.5 },
isPrecise: false, isPrecise: false,
isExact: false, isExact: false,
} }
: { : {
type: 'point', type: 'point',
x: start[0], x: start[0],
y: start[1], y: start[1],
}, },
end: endTargetId end: endTargetId
? { ? {
type: 'binding', type: 'binding',
@ -257,12 +257,12 @@ export async function pasteExcalidrawContent(editor: Editor, clipboard: any, poi
normalizedAnchor: { x: 0.5, y: 0.5 }, normalizedAnchor: { x: 0.5, y: 0.5 },
isPrecise: false, isPrecise: false,
isExact: false, isExact: false,
} }
: { : {
type: 'point', type: 'point',
x: end[0], x: end[0],
y: end[1], y: end[1],
}, },
arrowheadEnd: arrowheadsToArrowheadTypes[element.endArrowhead] ?? 'none', arrowheadEnd: arrowheadsToArrowheadTypes[element.endArrowhead] ?? 'none',
arrowheadStart: arrowheadsToArrowheadTypes[element.startArrowhead] ?? 'none', arrowheadStart: arrowheadsToArrowheadTypes[element.startArrowhead] ?? 'none',
}, },

View file

@ -420,11 +420,11 @@ export function ActionsProvider({ overrides, children }: ActionsProviderProps) {
? { ? {
x: commonBounds.width + 10, x: commonBounds.width + 10,
y: 0, y: 0,
} }
: { : {
x: 16 / editor.getZoomLevel(), x: 16 / editor.getZoomLevel(),
y: 16 / editor.getZoomLevel(), y: 16 / editor.getZoomLevel(),
} }
} }
editor.mark('duplicate shapes') editor.mark('duplicate shapes')

View file

@ -80,8 +80,8 @@ export const ActionsMenuSchemaProvider = ({
allowGroup allowGroup
? menuItem(actions['group'], { disabled: !twoSelected }) ? menuItem(actions['group'], { disabled: !twoSelected })
: allowUngroup : allowUngroup
? menuItem(actions['ungroup']) ? menuItem(actions['ungroup'])
: menuItem(actions['group'], { disabled: !twoSelected }), : menuItem(actions['group'], { disabled: !twoSelected }),
] ]
if (overrides) { if (overrides) {

View file

@ -50,12 +50,10 @@ type DefaultHelpers = ReturnType<typeof useDefaultHelpers>
export type TLUiOverride<Type, Helpers> = (editor: Editor, schema: Type, helpers: Helpers) => Type export type TLUiOverride<Type, Helpers> = (editor: Editor, schema: Type, helpers: Helpers) => Type
type WithDefaultHelpers<T extends TLUiOverride<any, any>> = T extends TLUiOverride< type WithDefaultHelpers<T extends TLUiOverride<any, any>> =
infer Type, T extends TLUiOverride<infer Type, infer Helpers>
infer Helpers ? TLUiOverride<Type, Helpers extends undefined ? DefaultHelpers : Helpers & DefaultHelpers>
> : never
? TLUiOverride<Type, Helpers extends undefined ? DefaultHelpers : Helpers & DefaultHelpers>
: never
/** @public */ /** @public */
export type TLUiOverrides = Partial<{ export type TLUiOverrides = Partial<{

View file

@ -222,7 +222,7 @@ export class TestEditor extends Editor {
? ({ ? ({
target: 'shape', target: 'shape',
shape: this.getShape(info as any), shape: this.getShape(info as any),
} as T) } as T)
: info : info
} }
@ -267,18 +267,18 @@ export class TestEditor extends Editor {
key === 'Shift' key === 'Shift'
? 'ShiftLeft' ? 'ShiftLeft'
: key === 'Alt' : key === 'Alt'
? 'AltLeft' ? 'AltLeft'
: key === 'Control' || key === 'Meta' : key === 'Control' || key === 'Meta'
? 'CtrlLeft' ? 'CtrlLeft'
: key === ' ' : key === ' '
? 'Space' ? 'Space'
: key === 'Enter' || : key === 'Enter' ||
key === 'ArrowRight' || key === 'ArrowRight' ||
key === 'ArrowLeft' || key === 'ArrowLeft' ||
key === 'ArrowUp' || key === 'ArrowUp' ||
key === 'ArrowDown' key === 'ArrowDown'
? key ? key
: 'Key' + key[0].toUpperCase() + key.slice(1), : 'Key' + key[0].toUpperCase() + key.slice(1),
type: 'keyboard', type: 'keyboard',
key, key,
} }

View file

@ -34,6 +34,7 @@
"test-dev": "yarn run -T jest --watch", "test-dev": "yarn run -T jest --watch",
"test-coverage": "lazy inherit", "test-coverage": "lazy inherit",
"index": "node ./scripts/build-index.js && yarn format", "index": "node ./scripts/build-index.js && yarn format",
"format": "yarn run -T prettier --write --cache \"src/**/*.{ts,tsx,js,jsx,json,md}\"",
"build": "yarn run -T tsx ../../scripts/build-package.ts", "build": "yarn run -T tsx ../../scripts/build-package.ts",
"build-api": "yarn run -T tsx ../../scripts/build-api.ts", "build-api": "yarn run -T tsx ../../scripts/build-api.ts",
"prepack": "yarn run -T tsx ../../scripts/prepack.ts", "prepack": "yarn run -T tsx ../../scripts/prepack.ts",

View file

@ -61,7 +61,7 @@ export type TLAssetPartial<T extends TLAsset = TLAsset> = T extends T
type: T['type'] type: T['type']
props?: Partial<T['props']> props?: Partial<T['props']>
meta?: Partial<T['meta']> meta?: Partial<T['meta']>
} & Partial<Omit<T, 'type' | 'id' | 'props' | 'meta'>> } & Partial<Omit<T, 'type' | 'id' | 'props' | 'meta'>>
: never : never
/** @public */ /** @public */

View file

@ -364,12 +364,12 @@ export const instanceMigrations = defineMigrations({
opacity < 0.175 opacity < 0.175
? '0.1' ? '0.1'
: opacity < 0.375 : opacity < 0.375
? '0.25' ? '0.25'
: opacity < 0.625 : opacity < 0.625
? '0.5' ? '0.5'
: opacity < 0.875 : opacity < 0.875
? '0.75' ? '0.75'
: '1', : '1',
}, },
} }
}, },

View file

@ -60,7 +60,7 @@ export type TLShapePartial<T extends TLShape = TLShape> = T extends T
type: T['type'] type: T['type']
props?: Partial<T['props']> props?: Partial<T['props']>
meta?: Partial<T['meta']> meta?: Partial<T['meta']>
} & Partial<Omit<T, 'type' | 'id' | 'props' | 'meta'>> } & Partial<Omit<T, 'type' | 'id' | 'props' | 'meta'>>
: never : never
/** @public */ /** @public */
@ -124,12 +124,12 @@ export const rootShapeMigrations = defineMigrations({
opacity < 0.175 opacity < 0.175
? '0.1' ? '0.1'
: opacity < 0.375 : opacity < 0.375
? '0.25' ? '0.25'
: opacity < 0.625 : opacity < 0.625
? '0.5' ? '0.5'
: opacity < 0.875 : opacity < 0.875
? '0.75' ? '0.75'
: '1', : '1',
}, },
} }
}, },

View file

@ -121,14 +121,14 @@ export const arrowShapeMigrations = defineMigrations({
isPrecise: !( isPrecise: !(
start.normalizedAnchor.x === 0.5 && start.normalizedAnchor.y === 0.5 start.normalizedAnchor.x === 0.5 && start.normalizedAnchor.y === 0.5
), ),
} }
: start, : start,
end: end:
(end as TLArrowShapeTerminal).type === 'binding' (end as TLArrowShapeTerminal).type === 'binding'
? { ? {
...end, ...end,
isPrecise: !(end.normalizedAnchor.x === 0.5 && end.normalizedAnchor.y === 0.5), isPrecise: !(end.normalizedAnchor.x === 0.5 && end.normalizedAnchor.y === 0.5),
} }
: end, : end,
}, },
} }

View file

@ -58,11 +58,9 @@ export function deepCopy<T = unknown>(obj: T): T {
* *
* @internal * @internal
*/ */
export function objectMapKeys<Key extends string>( export function objectMapKeys<Key extends string>(object: {
object: { readonly [K in Key]: unknown
readonly [K in Key]: unknown }): Array<Key> {
}
): Array<Key> {
return Object.keys(object) as Key[] return Object.keys(object) as Key[]
} }
@ -72,11 +70,9 @@ export function objectMapKeys<Key extends string>(
* *
* @internal * @internal
*/ */
export function objectMapValues<Key extends string, Value>( export function objectMapValues<Key extends string, Value>(object: {
object: { [K in Key]: Value
[K in Key]: Value }): Array<Value> {
}
): Array<Value> {
return Object.values(object) as Value[] return Object.values(object) as Value[]
} }
@ -86,11 +82,9 @@ export function objectMapValues<Key extends string, Value>(
* *
* @internal * @internal
*/ */
export function objectMapEntries<Key extends string, Value>( export function objectMapEntries<Key extends string, Value>(object: {
object: { [K in Key]: Value
[K in Key]: Value }): Array<[Key, Value]> {
}
): Array<[Key, Value]> {
return Object.entries(object) as [Key, Value][] return Object.entries(object) as [Key, Value][]
} }

View file

@ -242,11 +242,9 @@ export class ObjectValidator<Shape extends object> extends Validator<Shape> {
* }) * })
* ``` * ```
*/ */
extend<Extension extends Record<string, unknown>>( extend<Extension extends Record<string, unknown>>(extension: {
extension: { readonly [K in keyof Extension]: Validatable<Extension[K]>
readonly [K in keyof Extension]: Validatable<Extension[K]> }): ObjectValidator<Shape & Extension> {
}
): ObjectValidator<Shape & Extension> {
return new ObjectValidator({ ...this.config, ...extension }) as ObjectValidator< return new ObjectValidator({ ...this.config, ...extension }) as ObjectValidator<
Shape & Extension Shape & Extension
> >
@ -472,11 +470,9 @@ export const unknownObject = new Validator<Record<string, unknown>>((value) => {
* *
* @public * @public
*/ */
export function object<Shape extends object>( export function object<Shape extends object>(config: {
config: { readonly [K in keyof Shape]: Validatable<Shape[K]>
readonly [K in keyof Shape]: Validatable<Shape[K]> }): ObjectValidator<Shape> {
}
): ObjectValidator<Shape> {
return new ObjectValidator(config) return new ObjectValidator(config)
} }

View file

@ -4,6 +4,7 @@ import { exec } from './lib/exec'
import { REPO_ROOT, readFileIfExists } from './lib/file' import { REPO_ROOT, readFileIfExists } from './lib/file'
const ESLINT_EXTENSIONS = ['js', 'jsx', 'ts', 'tsx'] const ESLINT_EXTENSIONS = ['js', 'jsx', 'ts', 'tsx']
const PRETTIER_EXTENSIONS = ['js', 'jsx', 'ts', 'tsx', 'json']
async function main() { async function main() {
const shouldFix = process.argv.includes('--fix') const shouldFix = process.argv.includes('--fix')
@ -26,10 +27,19 @@ async function main() {
files.push(file) files.push(file)
} }
let prettierFiles = PRETTIER_EXTENSIONS.flatMap((ext) => filesByExtension.get(ext) ?? [])
let eslintFiles = ESLINT_EXTENSIONS.flatMap((ext) => filesByExtension.get(ext) ?? []) let eslintFiles = ESLINT_EXTENSIONS.flatMap((ext) => filesByExtension.get(ext) ?? [])
const relativeCwd = path.relative(REPO_ROOT, process.cwd()) const relativeCwd = path.relative(REPO_ROOT, process.cwd())
const prettierIgnoreFile = await readFileIfExists(path.join(REPO_ROOT, '.prettierignore'))
if (prettierIgnoreFile) {
prettierFiles = prettierFiles
.map((f) => path.join(relativeCwd, f))
.filter(ignore().add(prettierIgnoreFile).createFilter())
.map((f) => path.relative(relativeCwd, f))
}
const eslintIgnoreFile = await readFileIfExists(path.join(REPO_ROOT, '.eslintignore')) const eslintIgnoreFile = await readFileIfExists(path.join(REPO_ROOT, '.eslintignore'))
if (eslintIgnoreFile) { if (eslintIgnoreFile) {
eslintFiles = eslintFiles eslintFiles = eslintFiles
@ -39,6 +49,14 @@ async function main() {
} }
try { try {
await exec('yarn', [
'run',
'-T',
'prettier',
shouldFix ? '--write' : '--check',
'--cache',
...prettierFiles,
])
await exec('yarn', [ await exec('yarn', [
'run', 'run',
'-T', '-T',

View file

@ -10,7 +10,7 @@ async function main() {
const nextVersion = latestVersion.prerelease.length const nextVersion = latestVersion.prerelease.length
? // if the package is in prerelease mode, we want to release a canary for the current version rather than bumping ? // if the package is in prerelease mode, we want to release a canary for the current version rather than bumping
latestVersion latestVersion
: latestVersion?.inc(bump) : latestVersion?.inc(bump)
const versionString = `${nextVersion.major}.${nextVersion.minor}.${nextVersion.patch}-canary.${sha}` const versionString = `${nextVersion.major}.${nextVersion.minor}.${nextVersion.patch}-canary.${sha}`

View file

@ -46,7 +46,7 @@ async function main() {
const nextVersion = prereleaseTag const nextVersion = prereleaseTag
? `${latestVersion.major}.${latestVersion.minor}.${latestVersion.patch}-${prereleaseTag}.${ ? `${latestVersion.major}.${latestVersion.minor}.${latestVersion.patch}-${prereleaseTag}.${
Number(prereleaseNumber) + 1 Number(prereleaseNumber) + 1
}` }`
: latestVersion.inc(bump).format() : latestVersion.inc(bump).format()
setAllVersions(nextVersion) setAllVersions(nextVersion)

252
yarn.lock
View file

@ -2338,97 +2338,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@biomejs/biome@npm:1.5.3":
version: 1.5.3
resolution: "@biomejs/biome@npm:1.5.3"
dependencies:
"@biomejs/cli-darwin-arm64": "npm:1.5.3"
"@biomejs/cli-darwin-x64": "npm:1.5.3"
"@biomejs/cli-linux-arm64": "npm:1.5.3"
"@biomejs/cli-linux-arm64-musl": "npm:1.5.3"
"@biomejs/cli-linux-x64": "npm:1.5.3"
"@biomejs/cli-linux-x64-musl": "npm:1.5.3"
"@biomejs/cli-win32-arm64": "npm:1.5.3"
"@biomejs/cli-win32-x64": "npm:1.5.3"
dependenciesMeta:
"@biomejs/cli-darwin-arm64":
optional: true
"@biomejs/cli-darwin-x64":
optional: true
"@biomejs/cli-linux-arm64":
optional: true
"@biomejs/cli-linux-arm64-musl":
optional: true
"@biomejs/cli-linux-x64":
optional: true
"@biomejs/cli-linux-x64-musl":
optional: true
"@biomejs/cli-win32-arm64":
optional: true
"@biomejs/cli-win32-x64":
optional: true
bin:
biome: bin/biome
checksum: 1bcdcc3a34de0871d91ecf37eae67f71847f3578723001f81616b1fd1d694d584accce37cf582f07aef3b920b47c32716e7244b7f67f52926c7c8526bc7cd5d9
languageName: node
linkType: hard
"@biomejs/cli-darwin-arm64@npm:1.5.3":
version: 1.5.3
resolution: "@biomejs/cli-darwin-arm64@npm:1.5.3"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
"@biomejs/cli-darwin-x64@npm:1.5.3":
version: 1.5.3
resolution: "@biomejs/cli-darwin-x64@npm:1.5.3"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
"@biomejs/cli-linux-arm64-musl@npm:1.5.3":
version: 1.5.3
resolution: "@biomejs/cli-linux-arm64-musl@npm:1.5.3"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
"@biomejs/cli-linux-arm64@npm:1.5.3":
version: 1.5.3
resolution: "@biomejs/cli-linux-arm64@npm:1.5.3"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
"@biomejs/cli-linux-x64-musl@npm:1.5.3":
version: 1.5.3
resolution: "@biomejs/cli-linux-x64-musl@npm:1.5.3"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
"@biomejs/cli-linux-x64@npm:1.5.3":
version: 1.5.3
resolution: "@biomejs/cli-linux-x64@npm:1.5.3"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
"@biomejs/cli-win32-arm64@npm:1.5.3":
version: 1.5.3
resolution: "@biomejs/cli-win32-arm64@npm:1.5.3"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
"@biomejs/cli-win32-x64@npm:1.5.3":
version: 1.5.3
resolution: "@biomejs/cli-win32-x64@npm:1.5.3"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"@cloudflare/kv-asset-handler@npm:^0.2.0": "@cloudflare/kv-asset-handler@npm:^0.2.0":
version: 0.2.0 version: 0.2.0
resolution: "@cloudflare/kv-asset-handler@npm:0.2.0" resolution: "@cloudflare/kv-asset-handler@npm:0.2.0"
@ -7368,7 +7277,10 @@ __metadata:
next-themes: "npm:^0.2.1" next-themes: "npm:^0.2.1"
octokit: "npm:^3.1.1" octokit: "npm:^3.1.1"
openai: "npm:^4.11.1" openai: "npm:^4.11.1"
patch-package: "npm:^8.0.0"
postinstall-postinstall: "npm:^2.1.0"
prettier: "npm:^3.0.3" prettier: "npm:^3.0.3"
prettier-plugin-organize-imports: "npm:^3.2.3"
react: "npm:^18.2.0" react: "npm:^18.2.0"
react-dom: "npm:^18.2.0" react-dom: "npm:^18.2.0"
react-hotkeys-hook: "npm:^4.4.1" react-hotkeys-hook: "npm:^4.4.1"
@ -7458,7 +7370,6 @@ __metadata:
version: 0.0.0-use.local version: 0.0.0-use.local
resolution: "@tldraw/monorepo@workspace:." resolution: "@tldraw/monorepo@workspace:."
dependencies: dependencies:
"@biomejs/biome": "npm:1.5.3"
"@microsoft/api-extractor": "npm:^7.35.4" "@microsoft/api-extractor": "npm:^7.35.4"
"@next/eslint-plugin-next": "npm:^13.3.0" "@next/eslint-plugin-next": "npm:^13.3.0"
"@sentry/cli": "npm:^2.25.0" "@sentry/cli": "npm:^2.25.0"
@ -7488,6 +7399,8 @@ __metadata:
json5: "npm:^2.2.3" json5: "npm:^2.2.3"
lazyrepo: "npm:0.0.0-alpha.27" lazyrepo: "npm:0.0.0-alpha.27"
lint-staged: "npm:>=10" lint-staged: "npm:>=10"
prettier: "npm:^3.0.3"
prettier-plugin-organize-imports: "npm:^3.2.3"
purgecss: "npm:^5.0.0" purgecss: "npm:^5.0.0"
rimraf: "npm:^4.4.0" rimraf: "npm:^4.4.0"
svgo: "npm:^3.0.2" svgo: "npm:^3.0.2"
@ -9123,6 +9036,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@yarnpkg/lockfile@npm:^1.1.0":
version: 1.1.0
resolution: "@yarnpkg/lockfile@npm:1.1.0"
checksum: cd19e1114aaf10a05126aeea8833ef4ca8af8a46e88e12884f8359d19333fd19711036dbc2698dbe937f81f037070cf9a8da45c2e8c6ca19cafd7d15659094ed
languageName: node
linkType: hard
"@yarnpkg/types@npm:^4.0.0": "@yarnpkg/types@npm:^4.0.0":
version: 4.0.0 version: 4.0.0
resolution: "@yarnpkg/types@npm:4.0.0" resolution: "@yarnpkg/types@npm:4.0.0"
@ -9810,6 +9730,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"at-least-node@npm:^1.0.0":
version: 1.0.0
resolution: "at-least-node@npm:1.0.0"
checksum: 463e2f8e43384f1afb54bc68485c436d7622acec08b6fad269b421cb1d29cebb5af751426793d0961ed243146fe4dc983402f6d5a51b720b277818dbf6f2e49e
languageName: node
linkType: hard
"author-regex@npm:^1.0.0": "author-regex@npm:^1.0.0":
version: 1.0.0 version: 1.0.0
resolution: "author-regex@npm:1.0.0" resolution: "author-regex@npm:1.0.0"
@ -10756,7 +10683,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"ci-info@npm:^3.1.0, ci-info@npm:^3.2.0, ci-info@npm:^3.8.0": "ci-info@npm:^3.1.0, ci-info@npm:^3.2.0, ci-info@npm:^3.7.0, ci-info@npm:^3.8.0":
version: 3.9.0 version: 3.9.0
resolution: "ci-info@npm:3.9.0" resolution: "ci-info@npm:3.9.0"
checksum: 75bc67902b4d1c7b435497adeb91598f6d52a3389398e44294f6601b20cfef32cf2176f7be0eb961d9e085bb333a8a5cae121cb22f81cf238ae7f58eb80e9397 checksum: 75bc67902b4d1c7b435497adeb91598f6d52a3389398e44294f6601b20cfef32cf2176f7be0eb961d9e085bb333a8a5cae121cb22f81cf238ae7f58eb80e9397
@ -14060,6 +13987,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"find-yarn-workspace-root@npm:^2.0.0":
version: 2.0.0
resolution: "find-yarn-workspace-root@npm:2.0.0"
dependencies:
micromatch: "npm:^4.0.2"
checksum: 7fa7942849eef4d5385ee96a0a9a5a9afe885836fd72ed6a4280312a38690afea275e7d09b343fe97daf0412d833f8ac4b78c17fc756386d9ebebf0759d707a7
languageName: node
linkType: hard
"flat-cache@npm:^3.0.4": "flat-cache@npm:^3.0.4":
version: 3.2.0 version: 3.2.0
resolution: "flat-cache@npm:3.2.0" resolution: "flat-cache@npm:3.2.0"
@ -14268,6 +14204,18 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"fs-extra@npm:^9.0.0":
version: 9.1.0
resolution: "fs-extra@npm:9.1.0"
dependencies:
at-least-node: "npm:^1.0.0"
graceful-fs: "npm:^4.2.0"
jsonfile: "npm:^6.0.1"
universalify: "npm:^2.0.0"
checksum: 08600da1b49552ed23dfac598c8fc909c66776dd130fea54fbcad22e330f7fcc13488bb995f6bc9ce5651aa35b65702faf616fe76370ee56f1aade55da982dca
languageName: node
linkType: hard
"fs-extra@npm:~7.0.1": "fs-extra@npm:~7.0.1":
version: 7.0.1 version: 7.0.1
resolution: "fs-extra@npm:7.0.1" resolution: "fs-extra@npm:7.0.1"
@ -14817,7 +14765,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": "graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9":
version: 4.2.11 version: 4.2.11
resolution: "graceful-fs@npm:4.2.11" resolution: "graceful-fs@npm:4.2.11"
checksum: bf152d0ed1dc159239db1ba1f74fdbc40cb02f626770dcd5815c427ce0688c2635a06ed69af364396da4636d0408fcf7d4afdf7881724c3307e46aff30ca49e2 checksum: bf152d0ed1dc159239db1ba1f74fdbc40cb02f626770dcd5815c427ce0688c2635a06ed69af364396da4636d0408fcf7d4afdf7881724c3307e46aff30ca49e2
@ -15824,6 +15772,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"is-docker@npm:^2.0.0":
version: 2.2.1
resolution: "is-docker@npm:2.2.1"
bin:
is-docker: cli.js
checksum: 3fef7ddbf0be25958e8991ad941901bf5922ab2753c46980b60b05c1bf9c9c2402d35e6dc32e4380b980ef5e1970a5d9d5e5aa2e02d77727c3b6b5e918474c56
languageName: node
linkType: hard
"is-extendable@npm:^0.1.0": "is-extendable@npm:^0.1.0":
version: 0.1.1 version: 0.1.1
resolution: "is-extendable@npm:0.1.1" resolution: "is-extendable@npm:0.1.1"
@ -16142,6 +16099,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"is-wsl@npm:^2.1.1":
version: 2.2.0
resolution: "is-wsl@npm:2.2.0"
dependencies:
is-docker: "npm:^2.0.0"
checksum: 20849846ae414997d290b75e16868e5261e86ff5047f104027026fd61d8b5a9b0b3ade16239f35e1a067b3c7cc02f70183cb661010ed16f4b6c7c93dad1b19d8
languageName: node
linkType: hard
"isarray@npm:0.0.1": "isarray@npm:0.0.1":
version: 0.0.1 version: 0.0.1
resolution: "isarray@npm:0.0.1" resolution: "isarray@npm:0.0.1"
@ -17093,6 +17059,18 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"json-stable-stringify@npm:^1.0.2":
version: 1.1.0
resolution: "json-stable-stringify@npm:1.1.0"
dependencies:
call-bind: "npm:^1.0.5"
isarray: "npm:^2.0.5"
jsonify: "npm:^0.0.1"
object-keys: "npm:^1.1.1"
checksum: 2889eca4f39574905bde288791d3fcc79fc9952f445a5fefb82af175a7992ec48c64161421c1e142f553a14a5f541de2e173cb22ce61d7fffc36d4bb44720541
languageName: node
linkType: hard
"json-stringify-safe@npm:~5.0.1": "json-stringify-safe@npm:~5.0.1":
version: 5.0.1 version: 5.0.1
resolution: "json-stringify-safe@npm:5.0.1" resolution: "json-stringify-safe@npm:5.0.1"
@ -17152,6 +17130,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"jsonify@npm:^0.0.1":
version: 0.0.1
resolution: "jsonify@npm:0.0.1"
checksum: 7b86b6f4518582ff1d8b7624ed6c6277affd5246445e864615dbdef843a4057ac58587684faf129ea111eeb80e01c15f0a4d9d03820eb3f3985fa67e81b12398
languageName: node
linkType: hard
"jsonwebtoken@npm:^9.0.0, jsonwebtoken@npm:^9.0.2": "jsonwebtoken@npm:^9.0.0, jsonwebtoken@npm:^9.0.2":
version: 9.0.2 version: 9.0.2
resolution: "jsonwebtoken@npm:9.0.2" resolution: "jsonwebtoken@npm:9.0.2"
@ -17242,6 +17227,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"klaw-sync@npm:^6.0.0":
version: 6.0.0
resolution: "klaw-sync@npm:6.0.0"
dependencies:
graceful-fs: "npm:^4.1.11"
checksum: 0da397f8961313c3ef8f79fb63af9002cde5a8fb2aeb1a37351feff0dd6006129c790400c3f5c3b4e757bedcabb13d21ec0a5eaef5a593d59515d4f2c291e475
languageName: node
linkType: hard
"kleur@npm:^4.0.3, kleur@npm:^4.1.5": "kleur@npm:^4.0.3, kleur@npm:^4.1.5":
version: 4.1.5 version: 4.1.5
resolution: "kleur@npm:4.1.5" resolution: "kleur@npm:4.1.5"
@ -19819,6 +19813,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"open@npm:^7.4.2":
version: 7.4.2
resolution: "open@npm:7.4.2"
dependencies:
is-docker: "npm:^2.0.0"
is-wsl: "npm:^2.1.1"
checksum: 4fc02ed3368dcd5d7247ad3566433ea2695b0713b041ebc0eeb2f0f9e5d4e29fc2068f5cdd500976b3464e77fe8b61662b1b059c73233ccc601fe8b16d6c1cd6
languageName: node
linkType: hard
"openai@npm:^3.2.1": "openai@npm:^3.2.1":
version: 3.3.0 version: 3.3.0
resolution: "openai@npm:3.3.0" resolution: "openai@npm:3.3.0"
@ -20202,6 +20206,31 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"patch-package@npm:^8.0.0":
version: 8.0.0
resolution: "patch-package@npm:8.0.0"
dependencies:
"@yarnpkg/lockfile": "npm:^1.1.0"
chalk: "npm:^4.1.2"
ci-info: "npm:^3.7.0"
cross-spawn: "npm:^7.0.3"
find-yarn-workspace-root: "npm:^2.0.0"
fs-extra: "npm:^9.0.0"
json-stable-stringify: "npm:^1.0.2"
klaw-sync: "npm:^6.0.0"
minimist: "npm:^1.2.6"
open: "npm:^7.4.2"
rimraf: "npm:^2.6.3"
semver: "npm:^7.5.3"
slash: "npm:^2.0.0"
tmp: "npm:^0.0.33"
yaml: "npm:^2.2.2"
bin:
patch-package: index.js
checksum: 8714322c35b29266e71c82d58443ce5322400a546a3327f1b8907b8eeb7e366dff33c4fdfbd25e3f0b3a9927189c26e9ac60636ca1e4140d6dbc11cca10f9b5d
languageName: node
linkType: hard
"path-browserify@npm:^1.0.1": "path-browserify@npm:^1.0.1":
version: 1.0.1 version: 1.0.1
resolution: "path-browserify@npm:1.0.1" resolution: "path-browserify@npm:1.0.1"
@ -20588,6 +20617,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"postinstall-postinstall@npm:^2.1.0":
version: 2.1.0
resolution: "postinstall-postinstall@npm:2.1.0"
checksum: dae45fe6b22f3c1c1590721df1d4d4a7cdf848c48f55c1a37e72ce5df14c2f5103d86d857c8d7572e59b9228478c72c6888c5620c816b262b499ee5148b88553
languageName: node
linkType: hard
"prebuild-install@npm:^7.0.1, prebuild-install@npm:^7.1.1": "prebuild-install@npm:^7.0.1, prebuild-install@npm:^7.1.1":
version: 7.1.1 version: 7.1.1
resolution: "prebuild-install@npm:7.1.1" resolution: "prebuild-install@npm:7.1.1"
@ -20624,6 +20660,23 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"prettier-plugin-organize-imports@npm:^3.2.3":
version: 3.2.4
resolution: "prettier-plugin-organize-imports@npm:3.2.4"
peerDependencies:
"@volar/vue-language-plugin-pug": ^1.0.4
"@volar/vue-typescript": ^1.0.4
prettier: ">=2.0"
typescript: ">=2.9"
peerDependenciesMeta:
"@volar/vue-language-plugin-pug":
optional: true
"@volar/vue-typescript":
optional: true
checksum: 93c98d365af500aa4c72f5330d82c20a20d0e7661a9692e6f26a76a2f4f88b99e0f85dcb8871e98b6d687d6e19ea5f1dcc937f9e29fd0778e888675ecafed233
languageName: node
linkType: hard
"prettier@npm:2.7.1": "prettier@npm:2.7.1":
version: 2.7.1 version: 2.7.1
resolution: "prettier@npm:2.7.1" resolution: "prettier@npm:2.7.1"
@ -21907,7 +21960,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"rimraf@npm:^2.6.1": "rimraf@npm:^2.6.1, rimraf@npm:^2.6.3":
version: 2.7.1 version: 2.7.1
resolution: "rimraf@npm:2.7.1" resolution: "rimraf@npm:2.7.1"
dependencies: dependencies:
@ -22452,6 +22505,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"slash@npm:^2.0.0":
version: 2.0.0
resolution: "slash@npm:2.0.0"
checksum: 512d4350735375bd11647233cb0e2f93beca6f53441015eea241fe784d8068281c3987fbaa93e7ef1c38df68d9c60013045c92837423c69115297d6169aa85e6
languageName: node
linkType: hard
"slash@npm:^3.0.0": "slash@npm:^3.0.0":
version: 3.0.0 version: 3.0.0
resolution: "slash@npm:3.0.0" resolution: "slash@npm:3.0.0"
@ -25667,7 +25727,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"yaml@npm:2.3.4, yaml@npm:^2.0.0, yaml@npm:^2.2.1, yaml@npm:^2.3.4": "yaml@npm:2.3.4, yaml@npm:^2.0.0, yaml@npm:^2.2.1, yaml@npm:^2.2.2, yaml@npm:^2.3.4":
version: 2.3.4 version: 2.3.4
resolution: "yaml@npm:2.3.4" resolution: "yaml@npm:2.3.4"
checksum: f8207ce43065a22268a2806ea6a0fa3974c6fde92b4b2fa0082357e487bc333e85dc518910007e7ac001b532c7c84bd3eccb6c7757e94182b564028b0008f44b checksum: f8207ce43065a22268a2806ea6a0fa3974c6fde92b4b2fa0082357e487bc333e85dc518910007e7ac001b532c7c84bd3eccb6c7757e94182b564028b0008f44b