feat(desktop): embed BoosAPI Desktop client as a subproject
Vendor the rebranded BoosAPI Desktop client (Tauri + Vue) into metapi as a monorepo subdirectory under desktop/. Source only — node_modules, dist, Cargo target and the upstream .git history are excluded. desktop/ keeps its own independent Cargo workspace (desktop/src-tauri with crates/*); it is not part of the backend boosapi crate, so a `cargo check` at the metapi root still compiles only the backend. Build the desktop app from desktop/src-tauri per desktop/README.md. Note: app icons are still placeholder assets pending the final BoosAPI logo. The updater signing keys live outside the repo and are not included.
This commit is contained in:
@@ -0,0 +1,127 @@
|
||||
import { describe, expect, it } from 'vitest'
|
||||
import { getMarkdown, parseMarkdownToStructure } from '../src'
|
||||
|
||||
describe('parser inline code multiple spans', () => {
|
||||
it('parses multiple inline code spans and emphasis correctly', () => {
|
||||
const md = getMarkdown()
|
||||
const markdown = '1. **整合冗余条款:** 将原`1-(5)`、`3-(3)`、`3-(4)`中关于“缴纳费用”和“告知法律状态变化”的核心义务合并,统一放入`1-(4)`“法律状态维护与通知义务”中,使其逻辑更集中,避免了在不同部分重复提及相似义务。'
|
||||
|
||||
const nodes = parseMarkdownToStructure(markdown, md)
|
||||
|
||||
const serialized = JSON.stringify(nodes)
|
||||
// Ensure we produced a strong node
|
||||
expect(serialized).toContain('"type":"strong"')
|
||||
|
||||
// Also ensure code spans exist and expected snippets appear
|
||||
expect(serialized).toContain('1-(5)')
|
||||
expect(serialized).toContain('3-(3)')
|
||||
expect(serialized).toContain('3-(4)')
|
||||
expect(serialized).toContain('1-(4)')
|
||||
})
|
||||
|
||||
it('handles mid-state with trailing opening backtick in list item', () => {
|
||||
const md = getMarkdown()
|
||||
// mid-state: trailing opening backtick after a comma
|
||||
const markdownMid = '1. **整合冗余条款:** 将原`1-(5)`、`'
|
||||
const nodesMid = parseMarkdownToStructure(markdownMid, md)
|
||||
const serializedMid = JSON.stringify(nodesMid)
|
||||
// debug: dump nodes for diagnostic
|
||||
|
||||
console.log('DEBUG_NODES_MID_FULL:', JSON.stringify(nodesMid, null, 2))
|
||||
// debug output removed
|
||||
|
||||
// Should contain a strong node for the leading bold and an inline_code mid-state
|
||||
expect(serializedMid).toContain('"type":"strong"')
|
||||
// mid-state inline code: there may be an inline_code node with empty code or raw ending in backtick
|
||||
expect(serializedMid.includes('inline_code') || serializedMid.includes('`')).toBeTruthy()
|
||||
})
|
||||
|
||||
it('handles mid-state with trailing opening backtick in list item mid-state 1', () => {
|
||||
const md = getMarkdown()
|
||||
// mid-state: trailing opening backtick after a comma
|
||||
const markdownMid = '1. **整合冗余条款:** 将原`1-(5)`、`3'
|
||||
const nodesMid = parseMarkdownToStructure(markdownMid, md)
|
||||
const children = nodesMid[0].items[0].children[0].children
|
||||
// Should contain a strong node for the leading bold and an inline_code mid-state
|
||||
expect(children[0].type).toBe('strong')
|
||||
expect(children[0].raw).toBe('**整合冗余条款:**')
|
||||
expect(children[1].type).toBe('text')
|
||||
expect(children[1].content).toBe(' 将原')
|
||||
expect(children[2].type).toBe('inline_code')
|
||||
expect(children[2].code).toBe('1-(5)')
|
||||
// The punctuation between code spans may be parsed as text or as a tiny
|
||||
// inline_code node in mid-state scenarios depending on token boundaries.
|
||||
// Accept either a text node or an inline_code node for the punctuation
|
||||
expect(['text', 'inline_code']).toContain(children[3]?.type)
|
||||
// Ensure at least one child contains the punctuation '、' either as content or as inline code
|
||||
const hasPunctuation = children.some((c: any) => (c.content === '、') || (c.code === '、'))
|
||||
expect(hasPunctuation).toBeTruthy()
|
||||
})
|
||||
|
||||
it('handles mid-state with trailing opening backtick in list item mid-state 2', () => {
|
||||
const md = getMarkdown()
|
||||
// mid-state: trailing opening backtick after a comma
|
||||
const markdownMid = '1. **整合冗余条款:** 将原`1-(5)`、`3-(3)`、`3-(4)`中关于“缴纳费用”和“告知法律状态变化”的核心义务合并,统一放入`1-'
|
||||
const nodesMid = parseMarkdownToStructure(markdownMid, md)
|
||||
const children = nodesMid[0].items[0].children[0].children
|
||||
// Should contain a strong node for the leading bold and an inline_code mid-state
|
||||
expect(children[0].type).toBe('strong')
|
||||
expect(children[0].raw).toBe('**整合冗余条款:**')
|
||||
expect(children[1].type).toBe('text')
|
||||
expect(children[1].content).toBe(' 将原')
|
||||
expect(children[2].type).toBe('inline_code')
|
||||
expect(children[2].code).toBe('1-(5)')
|
||||
expect(children[3].type).toBe('text')
|
||||
expect(children[3].content).toBe('、')
|
||||
expect(children[4].type).toBe('inline_code')
|
||||
expect(children[4].code).toBe('3-(3)')
|
||||
expect(children[5].type).toBe('text')
|
||||
expect(children[5].content).toBe('、')
|
||||
expect(children[6].type).toBe('inline_code')
|
||||
expect(children[6].code).toBe('3-(4)')
|
||||
expect(children[7].type).toBe('text')
|
||||
expect(children[7].content).toBe('中关于“缴纳费用”和“告知法律状态变化”的核心义务合并,统一放入')
|
||||
expect(children[8].type).toBe('inline_code')
|
||||
expect(children[8].code).toBe('1-')
|
||||
})
|
||||
|
||||
it('handles mid-state with trailing opening backtick in list item mid-state 3', () => {
|
||||
const md = getMarkdown()
|
||||
// mid-state: trailing opening backtick after a comma
|
||||
const markdownMid = '1. **整合冗余条款:** 将原\`1-(5)\`、\`3-(3)\`、\`3-(4)\`中关于“缴纳费用”和“告知法律状态变化”的核心义务合并,统一放入\`1-(4)\`“法律状态维护与通知义务”中,使其逻辑更集中,避免了在不同部分重复提及相似义务。'
|
||||
const nodesMid = parseMarkdownToStructure(markdownMid, md)
|
||||
const children = nodesMid[0].items[0].children[0].children
|
||||
// Should contain a strong node for the leading bold and an inline_code mid-state
|
||||
expect(children[0].type).toBe('strong')
|
||||
expect(children[0].raw).toBe('**整合冗余条款:**')
|
||||
expect(children[1].type).toBe('text')
|
||||
expect(children[1].content).toBe(' 将原')
|
||||
expect(children[2].type).toBe('inline_code')
|
||||
expect(children[2].code).toBe('1-(5)')
|
||||
expect(children[3].type).toBe('text')
|
||||
expect(children[3].content).toBe('、')
|
||||
expect(children[4].type).toBe('inline_code')
|
||||
expect(children[4].code).toBe('3-(3)')
|
||||
expect(children[5].type).toBe('text')
|
||||
expect(children[5].content).toBe('、')
|
||||
expect(children[6].type).toBe('inline_code')
|
||||
expect(children[6].code).toBe('3-(4)')
|
||||
expect(children[7].type).toBe('text')
|
||||
expect(children[7].content).toBe('中关于“缴纳费用”和“告知法律状态变化”的核心义务合并,统一放入')
|
||||
expect(children[8].type).toBe('inline_code')
|
||||
expect(children[8].code).toBe('1-(4)')
|
||||
expect(children[9].type).toBe('text')
|
||||
expect(children[9].content).toBe('“法律状态维护与通知义务”中,使其逻辑更集中,避免了在不同部分重复提及相似义务。')
|
||||
})
|
||||
|
||||
it('handles mid-state with trailing opening backtick in list item mid-state 4', () => {
|
||||
const md = getMarkdown()
|
||||
// mid-state: trailing opening backtick after a comma
|
||||
const markdownMid = '1. **整合冗余条款:** 将原 **hello world:** \`1-(5)\`、\`3-(3)\`、\`3-(4)\`中关于“缴纳费用”和“告知法律状态变化”的核心义务合并,统一放入\`1-(4)\`“法律状态维护与通知义务”中,使其逻辑更集中,避免了在不同部分重复提及相似义务。'
|
||||
const nodesMid = parseMarkdownToStructure(markdownMid, md)
|
||||
const children = nodesMid[0].items[0].children[0].children
|
||||
// Should contain a strong node for the leading bold and an inline_code mid-state
|
||||
const types = children.map((c: any) => c.type)
|
||||
expect(types).toEqual(['strong', 'text', 'strong', 'text', 'inline_code', 'text', 'inline_code', 'text', 'inline_code', 'text', 'inline_code', 'text'])
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user