Metadata should not depend on absolute text spans (#11390)

close #11304

Changelog:
- update: add `ide.snapshot` optional metadata field containing the source code of the file
- update: `syncFileContents` method tries to repair the metadata spans when it detects that the source file was edited and the received code does not match the code stored in the `ide.snapshot` metadata field

# Important Notes
Tested in gui
This commit is contained in:
Dmitry Bushev 2024-10-28 12:41:46 +03:00 committed by GitHub
parent d16fd63525
commit db0582d11c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 129 additions and 76 deletions

View File

@ -25,6 +25,7 @@
"debug": "^4.3.6", "debug": "^4.3.6",
"fast-diff": "^1.3.0", "fast-diff": "^1.3.0",
"isomorphic-ws": "^5.0.0", "isomorphic-ws": "^5.0.0",
"js-base64": "^3.7.7",
"lib0": "^0.2.85", "lib0": "^0.2.85",
"y-protocols": "^1.0.5", "y-protocols": "^1.0.5",
"ydoc-shared": "workspace:*", "ydoc-shared": "workspace:*",

View File

@ -42,6 +42,7 @@ export const ideMetadata = z
.object({ .object({
node: z.record(z.string().uuid(), nodeMetadata), node: z.record(z.string().uuid(), nodeMetadata),
import: z.record(z.string(), importMetadata), import: z.record(z.string(), importMetadata),
snapshot: z.string().optional(),
}) })
.passthrough() .passthrough()
.default(() => defaultMetadata().ide) .default(() => defaultMetadata().ide)

View File

@ -1,4 +1,5 @@
import createDebug from 'debug' import createDebug from 'debug'
import { Base64 } from 'js-base64'
import * as json from 'lib0/json' import * as json from 'lib0/json'
import * as map from 'lib0/map' import * as map from 'lib0/map'
import { ObservableV2 } from 'lib0/observable' import { ObservableV2 } from 'lib0/observable'
@ -483,6 +484,14 @@ class ModulePersistence extends ObservableV2<{ removed: () => void }> {
} }
} }
private static encodeCodeSnapshot(code: string): string {
return Base64.encode(code)
}
private static decodeCodeSnapshot(snapshot: string): string {
return Base64.decode(snapshot)
}
private sendLsUpdate( private sendLsUpdate(
synced: EnsoFileParts, synced: EnsoFileParts,
newCode: string | undefined, newCode: string | undefined,
@ -491,17 +500,24 @@ class ModulePersistence extends ObservableV2<{ removed: () => void }> {
) { ) {
if (this.syncedContent == null || this.syncedVersion == null) return if (this.syncedContent == null || this.syncedVersion == null) return
const code = newCode ?? synced.code const newSnapshot = newCode && {
snapshot: ModulePersistence.encodeCodeSnapshot(newCode),
}
const newMetadataJson = const newMetadataJson =
newMetadata && newMetadata &&
json.stringify({ json.stringify({
...this.syncedMeta, ...this.syncedMeta,
ide: { ...this.syncedMeta.ide, node: newMetadata }, ide: {
...this.syncedMeta.ide,
...newSnapshot,
node: newMetadata,
},
}) })
const idMapToPersist = const idMapToPersist =
(newIdMap || newMetadata) && (newIdMap || newMetadata) &&
ModulePersistence.getIdMapToPersist(newIdMap, newMetadata ?? this.syncedMeta.ide.node) ModulePersistence.getIdMapToPersist(newIdMap, newMetadata ?? this.syncedMeta.ide.node)
const newIdMapToPersistJson = idMapToPersist && serializeIdMap(idMapToPersist) const newIdMapToPersistJson = idMapToPersist && serializeIdMap(idMapToPersist)
const code = newCode ?? synced.code
const newContent = combineFileParts({ const newContent = combineFileParts({
code, code,
idMapJson: newIdMapToPersistJson ?? synced.idMapJson ?? '[]', idMapJson: newIdMapToPersistJson ?? synced.idMapJson ?? '[]',
@ -510,7 +526,7 @@ class ModulePersistence extends ObservableV2<{ removed: () => void }> {
const edits: TextEdit[] = [] const edits: TextEdit[] = []
if (newCode) edits.push(...applyDiffAsTextEdits(0, synced.code, newCode)) if (newCode) edits.push(...applyDiffAsTextEdits(0, synced.code, newCode))
if (newIdMap || newMetadata) { if (newIdMap || newMetadata || newSnapshot) {
const oldMetaContent = this.syncedContent.slice(synced.code.length) const oldMetaContent = this.syncedContent.slice(synced.code.length)
const metaContent = newContent.slice(code.length) const metaContent = newContent.slice(code.length)
const metaStartLine = (code.match(/\n/g) ?? []).length const metaStartLine = (code.match(/\n/g) ?? []).length
@ -569,6 +585,7 @@ class ModulePersistence extends ObservableV2<{ removed: () => void }> {
const nodeMeta = Object.entries(metadata.ide.node) const nodeMeta = Object.entries(metadata.ide.node)
let parsedSpans let parsedSpans
let parsedIdMap
const syncModule = new Ast.MutableModule(this.doc.ydoc) const syncModule = new Ast.MutableModule(this.doc.ydoc)
if (code !== this.syncedCode) { if (code !== this.syncedCode) {
const syncRoot = syncModule.root() const syncRoot = syncModule.root()
@ -579,16 +596,33 @@ class ModulePersistence extends ObservableV2<{ removed: () => void }> {
if (editedRoot instanceof Ast.BodyBlock) Ast.repair(editedRoot, edit) if (editedRoot instanceof Ast.BodyBlock) Ast.repair(editedRoot, edit)
syncModule.applyEdit(edit) syncModule.applyEdit(edit)
} else { } else {
const { root, spans } = Ast.parseModuleWithSpans(code, syncModule) const metadataSnapshot = metadata.ide.snapshot
syncModule.syncRoot(root) const snapshotCode =
parsedSpans = spans metadataSnapshot && ModulePersistence.decodeCodeSnapshot(metadataSnapshot)
if (metadataSnapshot && idMapJson && snapshotCode && snapshotCode !== code) {
// When the received code does not match the saved code snapshot, it means that
// the code was externally edited. In this case we try to fix the spans by running
// the `syncToCode` on the saved code snapshot.
const { root, spans } = Ast.parseModuleWithSpans(snapshotCode, syncModule)
syncModule.syncRoot(root)
parsedIdMap = deserializeIdMap(idMapJson)
const edit = syncModule.edit()
Ast.setExternalIds(edit, spans, parsedIdMap)
edit.getVersion(root).syncToCode(code)
syncModule.applyEdit(edit)
} else {
const { root, spans } = Ast.parseModuleWithSpans(code, syncModule)
syncModule.syncRoot(root)
parsedSpans = spans
}
} }
} }
const astRoot = syncModule.root() const astRoot = syncModule.root()
if (!astRoot) return if (!astRoot) return
if ((code !== this.syncedCode || idMapJson !== this.syncedIdMap) && idMapJson) { if ((code !== this.syncedCode || idMapJson !== this.syncedIdMap) && idMapJson) {
const spans = parsedSpans ?? Ast.print(astRoot).info const spans = parsedSpans ?? Ast.print(astRoot).info
if (idMapJson !== this.syncedIdMap) { if (idMapJson !== this.syncedIdMap && parsedIdMap === undefined) {
const idMap = deserializeIdMap(idMapJson) const idMap = deserializeIdMap(idMapJson)
const idsAssigned = Ast.setExternalIds(syncModule, spans, idMap) const idsAssigned = Ast.setExternalIds(syncModule, spans, idMap)
const numberOfAsts = astCount(astRoot) const numberOfAsts = astCount(astRoot)
@ -646,7 +680,13 @@ class ModulePersistence extends ObservableV2<{ removed: () => void }> {
this.syncedMeta = metadata this.syncedMeta = metadata
this.syncedMetaJson = metadataJson this.syncedMetaJson = metadataJson
}, 'file') }, 'file')
if (unsyncedIdMap) this.sendLsUpdate(contentsReceived, undefined, unsyncedIdMap, undefined) if (unsyncedIdMap)
this.sendLsUpdate(
contentsReceived,
this.syncedCode ?? undefined,
unsyncedIdMap,
this.syncedMeta?.ide?.node,
)
} }
async close() { async close() {

View File

@ -30,13 +30,13 @@ importers:
version: 9.13.0 version: 9.13.0
'@typescript-eslint/eslint-plugin': '@typescript-eslint/eslint-plugin':
specifier: ^8.10.0 specifier: ^8.10.0
version: 8.10.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3) version: 8.11.0(@typescript-eslint/parser@8.11.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3)
'@typescript-eslint/parser': '@typescript-eslint/parser':
specifier: ^8.10.0 specifier: ^8.10.0
version: 8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3) version: 8.11.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3)
'@vue/eslint-config-typescript': '@vue/eslint-config-typescript':
specifier: ^14.1.1 specifier: ^14.1.1
version: 14.1.1(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint-plugin-vue@9.29.1(eslint@9.13.0(jiti@1.21.6)))(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3) version: 14.1.3(@typescript-eslint/parser@8.11.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint-plugin-vue@9.29.1(eslint@9.13.0(jiti@1.21.6)))(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3)
eslint: eslint:
specifier: ^9.13.0 specifier: ^9.13.0
version: 9.13.0(jiti@1.21.6) version: 9.13.0(jiti@1.21.6)
@ -493,7 +493,7 @@ importers:
version: 4.0.0(prettier@3.3.2)(typescript@5.5.3)(vue-tsc@2.0.24(typescript@5.5.3)) version: 4.0.0(prettier@3.3.2)(typescript@5.5.3)(vue-tsc@2.0.24(typescript@5.5.3))
prettier-plugin-tailwindcss: prettier-plugin-tailwindcss:
specifier: ^0.5.11 specifier: ^0.5.11
version: 0.5.14(@ianvs/prettier-plugin-sort-imports@4.3.0(prettier@3.3.2))(prettier-plugin-organize-imports@4.0.0(prettier@3.3.2)(typescript@5.5.3)(vue-tsc@2.0.24(typescript@5.5.3)))(prettier@3.3.2) version: 0.5.14(@ianvs/prettier-plugin-sort-imports@4.3.0(@vue/compiler-sfc@3.5.2)(prettier@3.3.2))(prettier-plugin-organize-imports@4.0.0(prettier@3.3.2)(typescript@5.5.3)(vue-tsc@2.0.24(typescript@5.5.3)))(prettier@3.3.2)
shuffle-seed: shuffle-seed:
specifier: ^1.1.6 specifier: ^1.1.6
version: 1.1.6 version: 1.1.6
@ -614,7 +614,7 @@ importers:
version: 31.2.0 version: 31.2.0
electron-builder: electron-builder:
specifier: ^24.13.3 specifier: ^24.13.3
version: 24.13.3(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)) version: 24.13.3(electron-builder-squirrel-windows@24.13.3)
enso-common: enso-common:
specifier: workspace:* specifier: workspace:*
version: link:../../common version: link:../../common
@ -674,6 +674,9 @@ importers:
isomorphic-ws: isomorphic-ws:
specifier: ^5.0.0 specifier: ^5.0.0
version: 5.0.0(ws@8.18.0) version: 5.0.0(ws@8.18.0)
js-base64:
specifier: ^3.7.7
version: 3.7.7
lib0: lib0:
specifier: ^0.2.85 specifier: ^0.2.85
version: 0.2.94 version: 0.2.94
@ -3097,8 +3100,8 @@ packages:
'@types/yauzl@2.10.3': '@types/yauzl@2.10.3':
resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
'@typescript-eslint/eslint-plugin@8.10.0': '@typescript-eslint/eslint-plugin@8.11.0':
resolution: {integrity: sha512-phuB3hoP7FFKbRXxjl+DRlQDuJqhpOnm5MmtROXyWi3uS/Xg2ZXqiQfcG2BJHiN4QKyzdOJi3NEn/qTnjUlkmQ==} resolution: {integrity: sha512-KhGn2LjW1PJT2A/GfDpiyOfS4a8xHQv2myUagTM5+zsormOmBlYsnQ6pobJ8XxJmh6hnHwa2Mbe3fPrDJoDhbA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
'@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
@ -3108,8 +3111,8 @@ packages:
typescript: typescript:
optional: true optional: true
'@typescript-eslint/parser@8.10.0': '@typescript-eslint/parser@8.11.0':
resolution: {integrity: sha512-E24l90SxuJhytWJ0pTQydFT46Nk0Z+bsLKo/L8rtQSL93rQ6byd1V/QbDpHUTdLPOMsBCcYXZweADNCfOCmOAg==} resolution: {integrity: sha512-lmt73NeHdy1Q/2ul295Qy3uninSqi6wQI18XwSpm8w0ZbQXUpjCAWP1Vlv/obudoBiIjJVjlztjQ+d/Md98Yxg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
@ -3118,12 +3121,12 @@ packages:
typescript: typescript:
optional: true optional: true
'@typescript-eslint/scope-manager@8.10.0': '@typescript-eslint/scope-manager@8.11.0':
resolution: {integrity: sha512-AgCaEjhfql9MDKjMUxWvH7HjLeBqMCBfIaBbzzIcBbQPZE7CPh1m6FF+L75NUMJFMLYhCywJXIDEMa3//1A0dw==} resolution: {integrity: sha512-Uholz7tWhXmA4r6epo+vaeV7yjdKy5QFCERMjs1kMVsLRKIrSdM6o21W2He9ftp5PP6aWOVpD5zvrvuHZC0bMQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/type-utils@8.10.0': '@typescript-eslint/type-utils@8.11.0':
resolution: {integrity: sha512-PCpUOpyQSpxBn230yIcK+LeCQaXuxrgCm2Zk1S+PTIRJsEfU6nJ0TtwyH8pIwPK/vJoA+7TZtzyAJSGBz+s/dg==} resolution: {integrity: sha512-ItiMfJS6pQU0NIKAaybBKkuVzo6IdnAhPFZA/2Mba/uBjuPQPet/8+zh5GtLHwmuFRShZx+8lhIs7/QeDHflOg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '*' typescript: '*'
@ -3131,12 +3134,12 @@ packages:
typescript: typescript:
optional: true optional: true
'@typescript-eslint/types@8.10.0': '@typescript-eslint/types@8.11.0':
resolution: {integrity: sha512-k/E48uzsfJCRRbGLapdZgrX52csmWJ2rcowwPvOZ8lwPUv3xW6CcFeJAXgx4uJm+Ge4+a4tFOkdYvSpxhRhg1w==} resolution: {integrity: sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/typescript-estree@8.10.0': '@typescript-eslint/typescript-estree@8.11.0':
resolution: {integrity: sha512-3OE0nlcOHaMvQ8Xu5gAfME3/tWVDpb/HxtpUZ1WeOAksZ/h/gwrBzCklaGzwZT97/lBbbxJ16dMA98JMEngW4w==} resolution: {integrity: sha512-yHC3s1z1RCHoCz5t06gf7jH24rr3vns08XXhfEqzYpd6Hll3z/3g23JRi0jM8A47UFKNc3u/y5KIMx8Ynbjohg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '*' typescript: '*'
@ -3144,14 +3147,14 @@ packages:
typescript: typescript:
optional: true optional: true
'@typescript-eslint/utils@8.10.0': '@typescript-eslint/utils@8.11.0':
resolution: {integrity: sha512-Oq4uZ7JFr9d1ZunE/QKy5egcDRXT/FrS2z/nlxzPua2VHFtmMvFNDvpq1m/hq0ra+T52aUezfcjGRIB7vNJF9w==} resolution: {integrity: sha512-CYiX6WZcbXNJV7UNB4PLDIBtSdRmRI/nb0FMyqHPTQD1rMjA0foPLaPUV39C/MxkTd/QKSeX+Gb34PPsDVC35g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
'@typescript-eslint/visitor-keys@8.10.0': '@typescript-eslint/visitor-keys@8.11.0':
resolution: {integrity: sha512-k8nekgqwr7FadWk548Lfph6V3r9OVqjzAIVskE7orMZR23cGJjAOVazsZSJW+ElyjfTM4wx/1g88Mi70DDtG9A==} resolution: {integrity: sha512-EaewX6lxSjRJnc+99+dqzTeoDZUfyrA52d2/HRrkI830kgovWsmIiTfmr0NZorzqic7ga+1bS60lRBUgR3n/Bw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@vitejs/plugin-react@4.3.1': '@vitejs/plugin-react@4.3.1':
@ -3242,8 +3245,8 @@ packages:
'@vue/devtools-shared@7.3.7': '@vue/devtools-shared@7.3.7':
resolution: {integrity: sha512-M9EU1/bWi5GNS/+IZrAhwGOVZmUTN4MH22Hvh35nUZZg9AZP2R2OhfCb+MG4EtAsrUEYlu3R43/SIj3G7EZYtQ==} resolution: {integrity: sha512-M9EU1/bWi5GNS/+IZrAhwGOVZmUTN4MH22Hvh35nUZZg9AZP2R2OhfCb+MG4EtAsrUEYlu3R43/SIj3G7EZYtQ==}
'@vue/eslint-config-typescript@14.1.1': '@vue/eslint-config-typescript@14.1.3':
resolution: {integrity: sha512-zw6q8pXUuFHfdZsdKYr344giBRhnq6WmWSO2abFHajxR8wDX2p2hkj0/Mf6W2phTkerU4b8WF2jgq2Z/c+PdMA==} resolution: {integrity: sha512-L4NUJQz/0We2QYtrNwRAGRy4KfpOagl5V3MpZZ+rQ51a+bKjlKYYrugi7lp7PIX8LolRgu06ZwDoswnSGWnAmA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^9.10.0 eslint: ^9.10.0
@ -3557,6 +3560,7 @@ packages:
boolean@3.2.0: boolean@3.2.0:
resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==}
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
bowser@2.11.0: bowser@2.11.0:
resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==}
@ -5262,6 +5266,9 @@ packages:
jpeg-js@0.2.0: jpeg-js@0.2.0:
resolution: {integrity: sha512-Ni9PffhJtYtdD7VwxH6V2MnievekGfUefosGCHadog0/jAevRu6HPjYeMHbUemn0IPE8d4wGa8UsOGsX+iKy2g==} resolution: {integrity: sha512-Ni9PffhJtYtdD7VwxH6V2MnievekGfUefosGCHadog0/jAevRu6HPjYeMHbUemn0IPE8d4wGa8UsOGsX+iKy2g==}
js-base64@3.7.7:
resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==}
js-beautify@1.15.1: js-beautify@1.15.1:
resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==}
engines: {node: '>=14'} engines: {node: '>=14'}
@ -7092,8 +7099,8 @@ packages:
resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
typescript-eslint@8.10.0: typescript-eslint@8.11.0:
resolution: {integrity: sha512-YIu230PeN7z9zpu/EtqCIuRVHPs4iSlqW6TEvjbyDAE3MZsSl2RXBo+5ag+lbABCG8sFM1WVKEXhlQ8Ml8A3Fw==} resolution: {integrity: sha512-cBRGnW3FSlxaYwU8KfAewxFK5uzeOAp0l2KebIlPDOT5olVi65KDG/yjBooPBG0kGW/HLkoz1c/iuBFehcS3IA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '*' typescript: '*'
@ -8782,7 +8789,7 @@ snapshots:
'@humanwhocodes/retry@0.3.1': {} '@humanwhocodes/retry@0.3.1': {}
'@ianvs/prettier-plugin-sort-imports@4.3.0(prettier@3.3.2)': '@ianvs/prettier-plugin-sort-imports@4.3.0(@vue/compiler-sfc@3.5.2)(prettier@3.3.2)':
dependencies: dependencies:
'@babel/core': 7.25.2 '@babel/core': 7.25.2
'@babel/generator': 7.25.6 '@babel/generator': 7.25.6
@ -8791,6 +8798,8 @@ snapshots:
'@babel/types': 7.25.6 '@babel/types': 7.25.6
prettier: 3.3.2 prettier: 3.3.2
semver: 7.6.3 semver: 7.6.3
optionalDependencies:
'@vue/compiler-sfc': 3.5.2
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
optional: true optional: true
@ -10522,14 +10531,14 @@ snapshots:
'@types/node': 20.11.21 '@types/node': 20.11.21
optional: true optional: true
'@typescript-eslint/eslint-plugin@8.10.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3)': '@typescript-eslint/eslint-plugin@8.11.0(@typescript-eslint/parser@8.11.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3)':
dependencies: dependencies:
'@eslint-community/regexpp': 4.11.0 '@eslint-community/regexpp': 4.11.0
'@typescript-eslint/parser': 8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3) '@typescript-eslint/parser': 8.11.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3)
'@typescript-eslint/scope-manager': 8.10.0 '@typescript-eslint/scope-manager': 8.11.0
'@typescript-eslint/type-utils': 8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3) '@typescript-eslint/type-utils': 8.11.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3)
'@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3) '@typescript-eslint/utils': 8.11.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3)
'@typescript-eslint/visitor-keys': 8.10.0 '@typescript-eslint/visitor-keys': 8.11.0
eslint: 9.13.0(jiti@1.21.6) eslint: 9.13.0(jiti@1.21.6)
graphemer: 1.4.0 graphemer: 1.4.0
ignore: 5.3.1 ignore: 5.3.1
@ -10540,12 +10549,12 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3)': '@typescript-eslint/parser@8.11.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3)':
dependencies: dependencies:
'@typescript-eslint/scope-manager': 8.10.0 '@typescript-eslint/scope-manager': 8.11.0
'@typescript-eslint/types': 8.10.0 '@typescript-eslint/types': 8.11.0
'@typescript-eslint/typescript-estree': 8.10.0(typescript@5.5.3) '@typescript-eslint/typescript-estree': 8.11.0(typescript@5.5.3)
'@typescript-eslint/visitor-keys': 8.10.0 '@typescript-eslint/visitor-keys': 8.11.0
debug: 4.3.7 debug: 4.3.7
eslint: 9.13.0(jiti@1.21.6) eslint: 9.13.0(jiti@1.21.6)
optionalDependencies: optionalDependencies:
@ -10553,15 +10562,15 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/scope-manager@8.10.0': '@typescript-eslint/scope-manager@8.11.0':
dependencies: dependencies:
'@typescript-eslint/types': 8.10.0 '@typescript-eslint/types': 8.11.0
'@typescript-eslint/visitor-keys': 8.10.0 '@typescript-eslint/visitor-keys': 8.11.0
'@typescript-eslint/type-utils@8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3)': '@typescript-eslint/type-utils@8.11.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3)':
dependencies: dependencies:
'@typescript-eslint/typescript-estree': 8.10.0(typescript@5.5.3) '@typescript-eslint/typescript-estree': 8.11.0(typescript@5.5.3)
'@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3) '@typescript-eslint/utils': 8.11.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3)
debug: 4.3.7 debug: 4.3.7
ts-api-utils: 1.3.0(typescript@5.5.3) ts-api-utils: 1.3.0(typescript@5.5.3)
optionalDependencies: optionalDependencies:
@ -10570,12 +10579,12 @@ snapshots:
- eslint - eslint
- supports-color - supports-color
'@typescript-eslint/types@8.10.0': {} '@typescript-eslint/types@8.11.0': {}
'@typescript-eslint/typescript-estree@8.10.0(typescript@5.5.3)': '@typescript-eslint/typescript-estree@8.11.0(typescript@5.5.3)':
dependencies: dependencies:
'@typescript-eslint/types': 8.10.0 '@typescript-eslint/types': 8.11.0
'@typescript-eslint/visitor-keys': 8.10.0 '@typescript-eslint/visitor-keys': 8.11.0
debug: 4.3.7 debug: 4.3.7
fast-glob: 3.3.2 fast-glob: 3.3.2
is-glob: 4.0.3 is-glob: 4.0.3
@ -10587,20 +10596,20 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/utils@8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3)': '@typescript-eslint/utils@8.11.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3)':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@1.21.6)) '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@1.21.6))
'@typescript-eslint/scope-manager': 8.10.0 '@typescript-eslint/scope-manager': 8.11.0
'@typescript-eslint/types': 8.10.0 '@typescript-eslint/types': 8.11.0
'@typescript-eslint/typescript-estree': 8.10.0(typescript@5.5.3) '@typescript-eslint/typescript-estree': 8.11.0(typescript@5.5.3)
eslint: 9.13.0(jiti@1.21.6) eslint: 9.13.0(jiti@1.21.6)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
- typescript - typescript
'@typescript-eslint/visitor-keys@8.10.0': '@typescript-eslint/visitor-keys@8.11.0':
dependencies: dependencies:
'@typescript-eslint/types': 8.10.0 '@typescript-eslint/types': 8.11.0
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3
'@vitejs/plugin-react@4.3.1(vite@5.3.5(@types/node@20.11.21)(lightningcss@1.25.1))': '@vitejs/plugin-react@4.3.1(vite@5.3.5(@types/node@20.11.21)(lightningcss@1.25.1))':
@ -10768,13 +10777,13 @@ snapshots:
dependencies: dependencies:
rfdc: 1.4.1 rfdc: 1.4.1
'@vue/eslint-config-typescript@14.1.1(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint-plugin-vue@9.29.1(eslint@9.13.0(jiti@1.21.6)))(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3)': '@vue/eslint-config-typescript@14.1.3(@typescript-eslint/parser@8.11.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint-plugin-vue@9.29.1(eslint@9.13.0(jiti@1.21.6)))(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3)':
dependencies: dependencies:
'@typescript-eslint/eslint-plugin': 8.10.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3) '@typescript-eslint/eslint-plugin': 8.11.0(@typescript-eslint/parser@8.11.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3)
eslint: 9.13.0(jiti@1.21.6) eslint: 9.13.0(jiti@1.21.6)
eslint-plugin-vue: 9.29.1(eslint@9.13.0(jiti@1.21.6)) eslint-plugin-vue: 9.29.1(eslint@9.13.0(jiti@1.21.6))
fast-glob: 3.3.2 fast-glob: 3.3.2
typescript-eslint: 8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3) typescript-eslint: 8.11.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3)
vue-eslint-parser: 9.4.3(eslint@9.13.0(jiti@1.21.6)) vue-eslint-parser: 9.4.3(eslint@9.13.0(jiti@1.21.6))
optionalDependencies: optionalDependencies:
typescript: 5.5.3 typescript: 5.5.3
@ -10966,7 +10975,7 @@ snapshots:
app-builder-bin@4.0.0: {} app-builder-bin@4.0.0: {}
app-builder-lib@24.13.3(dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3))(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)): app-builder-lib@24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3):
dependencies: dependencies:
'@develar/schema-utils': 2.6.5 '@develar/schema-utils': 2.6.5
'@electron/notarize': 2.2.1 '@electron/notarize': 2.2.1
@ -11884,7 +11893,7 @@ snapshots:
dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3): dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3):
dependencies: dependencies:
app-builder-lib: 24.13.3(dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3))(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)) app-builder-lib: 24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3)
builder-util: 24.13.1 builder-util: 24.13.1
builder-util-runtime: 9.2.4 builder-util-runtime: 9.2.4
fs-extra: 10.1.0 fs-extra: 10.1.0
@ -11965,7 +11974,7 @@ snapshots:
electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3): electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3):
dependencies: dependencies:
app-builder-lib: 24.13.3(dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3))(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)) app-builder-lib: 24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3)
archiver: 5.3.2 archiver: 5.3.2
builder-util: 24.13.1 builder-util: 24.13.1
fs-extra: 10.1.0 fs-extra: 10.1.0
@ -11973,9 +11982,9 @@ snapshots:
- dmg-builder - dmg-builder
- supports-color - supports-color
electron-builder@24.13.3(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)): electron-builder@24.13.3(electron-builder-squirrel-windows@24.13.3):
dependencies: dependencies:
app-builder-lib: 24.13.3(dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3))(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)) app-builder-lib: 24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3)
builder-util: 24.13.1 builder-util: 24.13.1
builder-util-runtime: 9.2.4 builder-util-runtime: 9.2.4
chalk: 4.1.2 chalk: 4.1.2
@ -12415,7 +12424,7 @@ snapshots:
estree-walker@3.0.3: estree-walker@3.0.3:
dependencies: dependencies:
'@types/estree': 1.0.5 '@types/estree': 1.0.6
esutils@2.0.3: {} esutils@2.0.3: {}
@ -13253,6 +13262,8 @@ snapshots:
jpeg-js@0.2.0: {} jpeg-js@0.2.0: {}
js-base64@3.7.7: {}
js-beautify@1.15.1: js-beautify@1.15.1:
dependencies: dependencies:
config-chain: 1.1.13 config-chain: 1.1.13
@ -14167,11 +14178,11 @@ snapshots:
optionalDependencies: optionalDependencies:
vue-tsc: 2.0.24(typescript@5.5.3) vue-tsc: 2.0.24(typescript@5.5.3)
prettier-plugin-tailwindcss@0.5.14(@ianvs/prettier-plugin-sort-imports@4.3.0(prettier@3.3.2))(prettier-plugin-organize-imports@4.0.0(prettier@3.3.2)(typescript@5.5.3)(vue-tsc@2.0.24(typescript@5.5.3)))(prettier@3.3.2): prettier-plugin-tailwindcss@0.5.14(@ianvs/prettier-plugin-sort-imports@4.3.0(@vue/compiler-sfc@3.5.2)(prettier@3.3.2))(prettier-plugin-organize-imports@4.0.0(prettier@3.3.2)(typescript@5.5.3)(vue-tsc@2.0.24(typescript@5.5.3)))(prettier@3.3.2):
dependencies: dependencies:
prettier: 3.3.2 prettier: 3.3.2
optionalDependencies: optionalDependencies:
'@ianvs/prettier-plugin-sort-imports': 4.3.0(prettier@3.3.2) '@ianvs/prettier-plugin-sort-imports': 4.3.0(@vue/compiler-sfc@3.5.2)(prettier@3.3.2)
prettier-plugin-organize-imports: 4.0.0(prettier@3.3.2)(typescript@5.5.3)(vue-tsc@2.0.24(typescript@5.5.3)) prettier-plugin-organize-imports: 4.0.0(prettier@3.3.2)(typescript@5.5.3)(vue-tsc@2.0.24(typescript@5.5.3))
prettier@3.3.2: {} prettier@3.3.2: {}
@ -15192,11 +15203,11 @@ snapshots:
is-typed-array: 1.1.13 is-typed-array: 1.1.13
possible-typed-array-names: 1.0.0 possible-typed-array-names: 1.0.0
typescript-eslint@8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3): typescript-eslint@8.11.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3):
dependencies: dependencies:
'@typescript-eslint/eslint-plugin': 8.10.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3) '@typescript-eslint/eslint-plugin': 8.11.0(@typescript-eslint/parser@8.11.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3)
'@typescript-eslint/parser': 8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3) '@typescript-eslint/parser': 8.11.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3)
'@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3) '@typescript-eslint/utils': 8.11.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3)
optionalDependencies: optionalDependencies:
typescript: 5.5.3 typescript: 5.5.3
transitivePeerDependencies: transitivePeerDependencies: