diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 8cf1144..dc31225 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -42,8 +42,8 @@ "@lezer/lr": "^1.4.5", "@prettier/plugin-xml": "^3.4.2", "@replit/codemirror-lang-svelte": "^6.0.0", - "@toml-tools/lexer": "^1.0.0", - "@toml-tools/parser": "^1.0.0", + "@toml-tools/lexer": "^1.0.1", + "@toml-tools/parser": "^1.0.1", "@types/katex": "^0.16.7", "@zumer/snapdom": "^2.0.1", "codemirror": "^6.0.2", @@ -2468,21 +2468,21 @@ "license": "MIT" }, "node_modules/@toml-tools/lexer": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/@toml-tools/lexer/-/lexer-1.0.0.tgz", - "integrity": "sha512-rVoOC9FibF2CICwCBWQnYcjAEOmLCJExer178K2AsY0Nk9FjJNVoVJuR5UAtuq42BZOajvH+ainf6Gj2GpCnXQ==", + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@toml-tools/lexer/-/lexer-1.0.1.tgz", + "integrity": "sha512-jn2fl8m/9QPcUD507Hbt2W3TVMKzF5HEY8xKIxqY2r2dTG2udeCKlo2ejJ5k/RSOJsWNIuw+Ir/nxW5PItUApA==", "license": "MIT", "dependencies": { "chevrotain": "^11.0.1" } }, "node_modules/@toml-tools/parser": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/@toml-tools/parser/-/parser-1.0.0.tgz", - "integrity": "sha512-j8cd3A3ccLHppGoWI69urbiVJslrpwI6sZ61ySDUPxM/FTkQWRx/JkkF8aipnl0Ds0feWXyjyvmWzn70mIohYg==", + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@toml-tools/parser/-/parser-1.0.1.tgz", + "integrity": "sha512-W+YdnB8KDgKjIqhoArEXjiTTPnKSXVvI/B+raHfou9+sip3rxhzVsELn46GG7dZyNHyu9pS+gYgYrdF9c5AQDg==", "license": "MIT", "dependencies": { - "@toml-tools/lexer": "^1.0.0", + "@toml-tools/lexer": "^1.0.1", "chevrotain": "^11.0.1" } }, diff --git a/frontend/src/common/prettier/plugins/toml/printer.ts b/frontend/src/common/prettier/plugins/toml/printer.ts index a2c3e0f..5c7fc09 100644 --- a/frontend/src/common/prettier/plugins/toml/printer.ts +++ b/frontend/src/common/prettier/plugins/toml/printer.ts @@ -35,7 +35,6 @@ class TomlBeautifierVisitor extends BaseTomlCstVisitor { // Helper methods public mapVisit: (elements: TomlCstNode[] | undefined) => (Doc | string)[]; public visitSingle: (ctx: TomlContext) => Doc | string; - public visit: (ctx: TomlCstNode, inParam?: any) => Doc | string; constructor() { super(); @@ -57,26 +56,38 @@ class TomlBeautifierVisitor extends BaseTomlCstVisitor { const singleElement = getSingle(ctx); return this.visit(singleElement); }; + } - // Store reference to inherited visit method and override it - const originalVisit = Object.getPrototypeOf(this).visit?.bind(this); - this.visit = (ctx: TomlCstNode, inParam?: any): Doc | string => { - if (!ctx) { - return ''; - } - + /** + * Override visit method to handle TOML CST nodes + * Accepts both single node and array of nodes as per base class signature + */ + visit(cstNode: any, param?: any): any { + // Handle array of nodes + if (Array.isArray(cstNode)) { + return cstNode.map(node => this.visit(node, param)); + } + + const ctx = cstNode; + if (!ctx) { + return ''; + } + + // 确保节点有name属性才调用基类方法 + if (ctx.name) { // Try to use the inherited visit method first + const originalVisit = super.visit; if (originalVisit) { try { - return originalVisit(ctx, inParam); + return originalVisit.call(this, ctx, param); } catch (error) { - console.warn('Original visit method failed:', error); + // Fallback to manual dispatch } } - + // Fallback: manually dispatch based on node name/type const methodName = ctx.name; - if (methodName && typeof (this as any)[methodName] === 'function') { + if (typeof (this as any)[methodName] === 'function') { const visitMethod = (this as any)[methodName]; try { if (ctx.children) { @@ -88,16 +99,16 @@ class TomlBeautifierVisitor extends BaseTomlCstVisitor { console.warn(`Visit method ${methodName} failed:`, error); } } - - // Final fallback: return image if available - return ctx.image || ''; - }; + } + + // Final fallback: return image if available + return ctx.image || ''; } /** * Visit the root TOML document */ - toml(ctx: TomlDocument): Doc { + toml(ctx: any): Doc { // Handle empty toml document if (!ctx.expression) { return [line]; @@ -164,7 +175,7 @@ class TomlBeautifierVisitor extends BaseTomlCstVisitor { /** * Visit an expression (keyval, table, or comment) */ - expression(ctx: TomlExpression): Doc | string { + expression(ctx: any): Doc | string { if (ctx.keyval) { let keyValDoc = this.visit(ctx.keyval[0]); if (ctx.Comment) { @@ -189,7 +200,7 @@ class TomlBeautifierVisitor extends BaseTomlCstVisitor { /** * Visit a key-value pair */ - keyval(ctx: TomlKeyVal): Doc { + keyval(ctx: any): Doc { const keyDoc = this.visit(ctx.key[0]); const valueDoc = this.visit(ctx.val[0]); return [keyDoc, ' = ', valueDoc]; diff --git a/frontend/src/stores/editorStateStore.ts b/frontend/src/stores/editorStateStore.ts index aae440a..dd85dc8 100644 --- a/frontend/src/stores/editorStateStore.ts +++ b/frontend/src/stores/editorStateStore.ts @@ -7,6 +7,16 @@ export interface DocumentStats { selectedCharacters: number; } +export interface FoldRange { + // 字符偏移(备用) + from: number; + to: number; + + // 行号 + fromLine: number; + toLine: number; +} + export const useEditorStateStore = defineStore('editorState', () => { // 光标位置存储 Record const cursorPositions = ref>({}); @@ -14,6 +24,9 @@ export const useEditorStateStore = defineStore('editorState', () => { // 文档统计数据存储 Record const documentStats = ref>({}); + // 折叠状态存储 Record + const foldStates = ref>({}); + // 保存光标位置 const saveCursorPosition = (docId: number, position: number) => { cursorPositions.value[docId] = position; @@ -38,25 +51,40 @@ export const useEditorStateStore = defineStore('editorState', () => { }; }; + // 保存折叠状态 + const saveFoldState = (docId: number, foldRanges: FoldRange[]) => { + foldStates.value[docId] = foldRanges; + }; + + // 获取折叠状态 + const getFoldState = (docId: number): FoldRange[] => { + return foldStates.value[docId] || []; + }; + // 清除文档状态 const clearDocumentState = (docId: number) => { delete cursorPositions.value[docId]; delete documentStats.value[docId]; + delete foldStates.value[docId]; }; // 清除所有状态 const clearAllStates = () => { cursorPositions.value = {}; documentStats.value = {}; + foldStates.value = {}; }; return { cursorPositions, documentStats, + foldStates, saveCursorPosition, getCursorPosition, saveDocumentStats, getDocumentStats, + saveFoldState, + getFoldState, clearDocumentState, clearAllStates }; @@ -64,7 +92,7 @@ export const useEditorStateStore = defineStore('editorState', () => { persist: { key: 'voidraft-editor-state', storage: localStorage, - pick: ['cursorPositions'] + pick: ['cursorPositions', 'foldStates'] } }); diff --git a/frontend/src/stores/editorStore.ts b/frontend/src/stores/editorStore.ts index 0538d35..10678fc 100644 --- a/frontend/src/stores/editorStore.ts +++ b/frontend/src/stores/editorStore.ts @@ -13,6 +13,7 @@ import {createStatsUpdateExtension} from '@/views/editor/basic/statsExtension'; import {createContentChangePlugin} from '@/views/editor/basic/contentChangeExtension'; import {createWheelZoomExtension} from '@/views/editor/basic/wheelZoomExtension'; import {createCursorPositionExtension, scrollToCursor} from '@/views/editor/basic/cursorPositionExtension'; +import {createFoldStateExtension, restoreFoldState} from '@/views/editor/basic/foldStateExtension'; import {createDynamicKeymapExtension, updateKeymapExtension} from '@/views/editor/keymap'; import { createDynamicExtensions, @@ -118,6 +119,9 @@ export const useEditorStore = defineStore('editor', () => { // 光标位置持久化扩展 const cursorPositionExtension = createCursorPositionExtension(docId); + // 折叠状态持久化扩展 + const foldStateExtension = createFoldStateExtension(docId); + // 快捷键扩展 const keymapExtension = await createDynamicKeymapExtension(); @@ -136,6 +140,7 @@ export const useEditorStore = defineStore('editor', () => { contentChangeExtension, codeBlockExtension, cursorPositionExtension, + foldStateExtension, ...dynamicExtensions, ]; @@ -227,6 +232,12 @@ export const useEditorStore = defineStore('editor', () => { requestAnimationFrame(() => { scrollToCursor(instance.view); instance.view.focus(); + + // 恢复折叠状态 + const savedFoldState = editorStateStore.getFoldState(instance.documentId); + if (savedFoldState.length > 0) { + restoreFoldState(instance.view, savedFoldState); + } }); } catch (error) { console.error('Error showing editor:', error); diff --git a/frontend/src/views/editor/basic/foldStateExtension.ts b/frontend/src/views/editor/basic/foldStateExtension.ts new file mode 100644 index 0000000..7291714 --- /dev/null +++ b/frontend/src/views/editor/basic/foldStateExtension.ts @@ -0,0 +1,113 @@ +import {EditorView, ViewPlugin, ViewUpdate} from '@codemirror/view'; +import {foldedRanges, foldEffect, unfoldEffect} from '@codemirror/language'; +import {StateEffect} from '@codemirror/state'; +import {useEditorStateStore, type FoldRange} from '@/stores/editorStateStore'; +import {createDebounce} from '@/common/utils/debounce'; + +/** + * 折叠状态持久化扩展 + */ +export function createFoldStateExtension(documentId: number) { + return ViewPlugin.fromClass( + class FoldStatePlugin { + private readonly editorStateStore = useEditorStateStore(); + private readonly debouncedSave; + + constructor(private view: EditorView) { + const {debouncedFn, flush} = createDebounce( + () => this.saveFoldState(), + {delay: 500} + ); + this.debouncedSave = {fn: debouncedFn, flush}; + } + + update(update: ViewUpdate) { + // 检查是否有折叠/展开操作 + const hasFoldChange = update.transactions.some(tr => + tr.effects.some(effect => + effect.is(foldEffect) || effect.is(unfoldEffect) + ) + ); + + if (hasFoldChange) { + this.debouncedSave.fn(); + } + } + + destroy() { + // 销毁时立即执行待保存的操作 + this.debouncedSave.flush(); + // 再保存一次确保最新状态 + this.saveFoldState(); + } + + private saveFoldState() { + const foldRanges: FoldRange[] = []; + const foldCursor = foldedRanges(this.view.state).iter(); + const doc = this.view.state.doc; + + // 遍历所有折叠区间 + while (foldCursor.value !== null) { + const from = foldCursor.from; + const to = foldCursor.to; + + // 同时记录字符偏移和行号 + const fromLine = doc.lineAt(from).number; + const toLine = doc.lineAt(to).number; + + foldRanges.push({ + from, + to, + fromLine, + toLine + }); + + foldCursor.next(); + } + + this.editorStateStore.saveFoldState(documentId, foldRanges); + } + } + ); +} + +/** + * 恢复折叠状态(基于行号,更稳定) + * @param view 编辑器视图 + * @param foldRanges 要恢复的折叠区间 + */ +export function restoreFoldState(view: EditorView, foldRanges: FoldRange[]) { + if (foldRanges.length === 0) return; + + const doc = view.state.doc; + const effects: StateEffect[] = []; + + for (const range of foldRanges) { + try { + // 优先使用行号恢复 + if (range.fromLine && range.toLine) { + // 确保行号在有效范围内 + if (range.fromLine >= 1 && range.toLine <= doc.lines && range.fromLine <= range.toLine) { + const fromPos = doc.line(range.fromLine).from; + const toPos = doc.line(range.toLine).to; + + effects.push(foldEffect.of({from: fromPos, to: toPos})); + continue; + } + } + + // 使用字符偏移 + if (range.from >= 0 && range.to <= doc.length && range.from < range.to) { + effects.push(foldEffect.of({from: range.from, to: range.to})); + } + } catch (error) { + // 忽略无效的折叠区间 + console.warn('Failed to restore fold range:', range, error); + } + } + + if (effects.length > 0) { + view.dispatch({effects}); + } +} + diff --git a/frontend/src/views/editor/extensions/codeblock/index.ts b/frontend/src/views/editor/extensions/codeblock/index.ts index a2e5acb..c9cff98 100644 --- a/frontend/src/views/editor/extensions/codeblock/index.ts +++ b/frontend/src/views/editor/extensions/codeblock/index.ts @@ -89,7 +89,6 @@ export function createCodeBlockExtension(options: CodeBlockOptions = {}): Extens showBackground = true, enableAutoDetection = true, defaultLanguage = 'text', - separatorHeight = 12, } = options; return [ @@ -108,8 +107,7 @@ export function createCodeBlockExtension(options: CodeBlockOptions = {}): Extens // 视觉装饰系统 ...getBlockDecorationExtensions({ - showBackground, - separatorHeight + showBackground }), // 光标保护(防止方向键移动到分隔符上) diff --git a/go.mod b/go.mod index 0f06906..1e11711 100644 --- a/go.mod +++ b/go.mod @@ -11,9 +11,9 @@ require ( github.com/knadh/koanf/providers/file v1.2.1 github.com/knadh/koanf/providers/structs v1.0.0 github.com/knadh/koanf/v2 v2.3.0 - github.com/mattn/go-sqlite3 v1.14.32 + github.com/mattn/go-sqlite3 v1.14.33 github.com/stretchr/testify v1.11.1 - github.com/wailsapp/wails/v3 v3.0.0-alpha.54 + github.com/wailsapp/wails/v3 v3.0.0-alpha.55 golang.org/x/net v0.48.0 golang.org/x/sys v0.39.0 golang.org/x/text v0.32.0 @@ -48,6 +48,7 @@ require ( github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-openapi/inflect v0.21.5 // indirect github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/goccy/go-json v0.10.5 // indirect github.com/godbus/dbus/v5 v5.2.2 // indirect github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/google/go-cmp v0.7.0 // indirect @@ -79,7 +80,6 @@ require ( github.com/skeema/knownhosts v1.3.2 // indirect github.com/ulikunitz/xz v0.5.15 // indirect github.com/wailsapp/go-webview2 v1.0.23 // indirect - github.com/wailsapp/mimetype v1.4.1 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/zclconf/go-cty v1.17.0 // indirect github.com/zclconf/go-cty-yaml v1.2.0 // indirect @@ -92,7 +92,6 @@ require ( golang.org/x/sync v0.19.0 // indirect golang.org/x/time v0.14.0 // indirect golang.org/x/tools v0.40.0 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 2f0b190..1859f42 100644 --- a/go.sum +++ b/go.sum @@ -33,8 +33,16 @@ github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= github.com/bmatcuk/doublestar v1.3.4 h1:gPypJ5xD31uhX6Tf54sDPUOBXTqKH4c9aPY66CyQrS0= github.com/bmatcuk/doublestar v1.3.4/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE= +github.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M= +github.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM= +github.com/bytedance/sonic v1.14.2 h1:k1twIoe97C1DtYUo+fZQy865IuHia4PR5RPiuGPPIIE= +github.com/bytedance/sonic v1.14.2/go.mod h1:T80iDELeHiHKSc0C9tubFygiuXoGzrkjKzX2quAx980= +github.com/bytedance/sonic/loader v0.4.0 h1:olZ7lEqcxtZygCK9EKYKADnpQoYkRQxaeY2NYzevs+o= +github.com/bytedance/sonic/loader v0.4.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo= github.com/cloudflare/circl v1.6.2 h1:hL7VBpHHKzrV5WTfHCaBsgx/HGbBYlgrwvNXEVDYYsQ= github.com/cloudflare/circl v1.6.2/go.mod h1:2eXP6Qfat4O/Yhh8BznvKnJ+uzEoTQ6jVKJRn81BiS4= +github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= +github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= github.com/creativeprojects/go-selfupdate v1.5.2 h1:3KR3JLrq70oplb9yZzbmJ89qRP78D1AN/9u+l3k0LJ4= github.com/creativeprojects/go-selfupdate v1.5.2/go.mod h1:BCOuwIl1dRRCmPNRPH0amULeZqayhKyY2mH/h4va7Dk= github.com/cyphar/filepath-securejoin v0.6.1 h1:5CeZ1jPXEiYt3+Z6zqprSAgSWiggmpVyciv8syjIpVE= @@ -68,6 +76,8 @@ github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMj github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= github.com/go-git/go-git/v5 v5.16.4 h1:7ajIEZHZJULcyJebDLo99bGgS0jRrOxzZG4uCk2Yb2Y= github.com/go-git/go-git/v5 v5.16.4/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8= +github.com/go-json-experiment/json v0.0.0-20251027170946-4849db3c2f7e h1:Lf/gRkoycfOBPa42vU2bbgPurFong6zXeFtPoxholzU= +github.com/go-json-experiment/json v0.0.0-20251027170946-4849db3c2f7e/go.mod h1:uNVvRXArCGbZ508SxYYTC5v1JWoz2voff5pm25jU1Ok= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-openapi/inflect v0.21.5 h1:M2RCq6PPS3YbIaL7CXosGL3BbzAcmfBAT0nC3YfesZA= @@ -76,6 +86,8 @@ github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/godbus/dbus/v5 v5.2.2 h1:TUR3TgtSVDmjiXOgAAyaZbYmIeP3DPkld3jgKGV8mXQ= github.com/godbus/dbus/v5 v5.2.2/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= @@ -103,6 +115,8 @@ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOl github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jchv/go-winloader v0.0.0-20250406163304-c1995be93bd1 h1:njuLRcjAuMKr7kI3D85AXWkw6/+v9PwtV6M6o11sWHQ= github.com/jchv/go-winloader v0.0.0-20250406163304-c1995be93bd1/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kevinburke/ssh_config v1.4.0 h1:6xxtP5bZ2E4NF5tuQulISpTO2z8XbtH8cg1PWkxoFkQ= github.com/kevinburke/ssh_config v1.4.0/go.mod h1:q2RIzfka+BXARoNexmF9gkxEX7DmvbW9P4hIVx2Kg4M= github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= @@ -137,14 +151,18 @@ github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHP github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuErjs= -github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/mattn/go-sqlite3 v1.14.33 h1:A5blZ5ulQo2AtayQ9/limgHEkFreKj1Dv226a1K73s0= +github.com/mattn/go-sqlite3 v1.14.33/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= github.com/pjbgf/sha1cd v0.5.0 h1:a+UkboSi1znleCDUNT3M5YxjOnN1fz2FhN48FlwCxs0= @@ -172,14 +190,14 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/wailsapp/go-webview2 v1.0.23 h1:jmv8qhz1lHibCc79bMM/a/FqOnnzOGEisLav+a0b9P0= github.com/wailsapp/go-webview2 v1.0.23/go.mod h1:qJmWAmAmaniuKGZPWwne+uor3AHMB5PFhqiK0Bbj8kc= -github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs= -github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o= -github.com/wailsapp/wails/v3 v3.0.0-alpha.54 h1:XlQ+9dwDtOyfxIyA0h1AeT0zdUP3SFdhLkpIgPjWnWc= -github.com/wailsapp/wails/v3 v3.0.0-alpha.54/go.mod h1:yaz8baG0+YzoiN8J6osn0wKiEi0iUux0ZU5NsZFu6OQ= +github.com/wailsapp/wails/v3 v3.0.0-alpha.55 h1:Wxwxc4EN6axDAvH/O5n3uoZQ+XRY/HQZ5rMdn0npq78= +github.com/wailsapp/wails/v3 v3.0.0-alpha.55/go.mod h1:AyH9vRcseorpL3p5XvxKgK0Lv/agJ7pTmcPdy25xZPo= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/zclconf/go-cty v1.17.0 h1:seZvECve6XX4tmnvRzWtJNHdscMtYEx5R7bnnVyd/d0= @@ -190,6 +208,8 @@ github.com/zclconf/go-cty-yaml v1.2.0 h1:GDyL4+e/Qe/S0B7YaecMLbVvAR/Mp21CXMOSiCT github.com/zclconf/go-cty-yaml v1.2.0/go.mod h1:9YLUH4g7lOhVWqUbctnVlZ5KLpg7JAprQNgxSZ1Gyxs= gitlab.com/gitlab-org/api/client-go v1.10.0 h1:VlB9gXQdG6w643lH53VduUHVnCWQG5Ty86VbXnyi70A= gitlab.com/gitlab-org/api/client-go v1.10.0/go.mod h1:U3QKvjbT1J1FrgLsA7w/XlhoBIendUqB4o3/Ht3UhEQ= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= @@ -204,7 +224,6 @@ golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI= golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= @@ -242,8 +261,6 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=