@meldscience/meld
Version:
pipeable one-shot prompt scripting toolkit
114 lines (103 loc) • 3.25 kB
text/typescript
import { describe, it, expect } from 'vitest';
import { extractPlaceholders } from '../src/extractPlaceholders';
describe('extractPlaceholders', () => {
it('extracts @cmd placeholders', () => {
const content = `
@cmd[echo "hello"]
Some text
@cmd[ls -la]
`;
const placeholders = extractPlaceholders(content);
expect(placeholders).toHaveLength(2);
expect(placeholders[0]).toMatchObject({
type: 'cmd',
command: 'echo "hello"',
lineNumber: 2
});
expect(placeholders[1]).toMatchObject({
type: 'cmd',
command: 'ls -la',
lineNumber: 4
});
});
it('extracts @import placeholders for markdown headings', () => {
const content = `
@import[../docs/setup.md # Installation]
@import[../docs/api.md # Endpoints] as ###
@import[../docs/guide.md # Setup] as ### Quick Start
`;
const placeholders = extractPlaceholders(content);
expect(placeholders).toHaveLength(3);
expect(placeholders[0]).toMatchObject({
type: 'import',
importPath: '../docs/setup.md',
heading: 'Installation',
lineNumber: 2
});
expect(placeholders[1]).toMatchObject({
type: 'import',
importPath: '../docs/api.md',
heading: 'Endpoints',
headingLevelOverride: '###',
lineNumber: 3
});
expect(placeholders[2]).toMatchObject({
type: 'import',
importPath: '../docs/guide.md',
heading: 'Setup',
headingLevelOverride: '###',
headingTextOverride: 'Quick Start',
lineNumber: 4
});
});
it('extracts @import placeholders for code symbols', () => {
const content = `
@import[src/meld.ts # myFunction]
@import[src/meld.ts # {interface}]
@import[src/meld.ts # [myFunction, otherFunction]]
`;
const placeholders = extractPlaceholders(content);
expect(placeholders).toHaveLength(3);
expect(placeholders[0]).toMatchObject({
type: 'import',
importPath: 'src/meld.ts',
importSymbol: 'myFunction',
lineNumber: 2
});
expect(placeholders[1]).toMatchObject({
type: 'import',
importPath: 'src/meld.ts',
importSymbol: '{interface}',
lineNumber: 3
});
expect(placeholders[2]).toMatchObject({
type: 'import',
importPath: 'src/meld.ts',
importSymbolList: ['myFunction', 'otherFunction'],
lineNumber: 4
});
});
it('handles multiple placeholders on the same line', () => {
const content = '@cmd[echo "hi"] some text @import[file.md # Title] more text @cmd[ls]';
const placeholders = extractPlaceholders(content);
expect(placeholders).toHaveLength(3);
expect(placeholders[0]).toMatchObject({
type: 'cmd',
command: 'echo "hi"'
});
expect(placeholders[1]).toMatchObject({
type: 'import',
importPath: 'file.md',
heading: 'Title'
});
expect(placeholders[2]).toMatchObject({
type: 'cmd',
command: 'ls'
});
});
it('handles empty or malformed input gracefully', () => {
expect(extractPlaceholders('')).toHaveLength(0);
expect(extractPlaceholders('@cmd[]')).toHaveLength(1);
expect(extractPlaceholders('@import[]')).toHaveLength(1);
});
});