astro-lilypond 0.3.2 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/LilyPond.astro +18 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/rehype-plugin.d.ts +3 -1
- package/dist/rehype-plugin.d.ts.map +1 -1
- package/dist/rehype-plugin.js +4 -7
- package/dist/rehype-plugin.js.map +1 -1
- package/dist/remark-plugin.d.ts.map +1 -1
- package/dist/remark-plugin.js +4 -7
- package/dist/remark-plugin.js.map +1 -1
- package/dist/render.d.ts +9 -1
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +32 -8
- package/dist/render.js.map +1 -1
- package/dist/satteri-plugin.d.ts.map +1 -1
- package/dist/satteri-plugin.js +5 -9
- package/dist/satteri-plugin.js.map +1 -1
- package/dist/util.d.ts +6 -3
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +13 -15
- package/dist/util.js.map +1 -1
- package/package.json +3 -2
- package/components/virtual.d.ts +0 -14
|
@@ -1,18 +1,29 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
const HTML_ENTITIES: Record<string, string> = {
|
|
3
|
+
"&": "&",
|
|
4
|
+
"<": "<",
|
|
5
|
+
">": ">",
|
|
6
|
+
'"': """,
|
|
7
|
+
"'": "'",
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
function escapeHtml(text: unknown): string {
|
|
11
|
+
return String(text).replace(/[&<>"']/g, (c) => HTML_ENTITIES[c] ?? c);
|
|
12
|
+
}
|
|
4
13
|
|
|
5
14
|
interface Props {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
15
|
+
content: string;
|
|
16
|
+
class?: string | undefined;
|
|
17
|
+
style?: string | undefined;
|
|
9
18
|
}
|
|
10
19
|
|
|
11
20
|
const { content, class: className, style } = Astro.props;
|
|
12
21
|
|
|
13
22
|
let html = content;
|
|
14
|
-
if (className)
|
|
15
|
-
|
|
23
|
+
if (className)
|
|
24
|
+
html = html.replace('class="lilypond"', `class="lilypond ${className}"`);
|
|
25
|
+
if (style)
|
|
26
|
+
html = html.replace(/<(svg|img)\b/, `<$1 style="${escapeHtml(style)}"`);
|
|
16
27
|
---
|
|
17
28
|
|
|
18
29
|
<Fragment set:html={html} />
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAS9C,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAMrE,YAAY,EAAE,YAAY,EAAE,CAAC;AAC7B,YAAY,EAAE,qBAAqB,EAAE,CAAC;AAEtC,MAAM,WAAW,eAAgB,SAAQ,qBAAqB;IAC7D;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAS9C,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAMrE,YAAY,EAAE,YAAY,EAAE,CAAC;AAC7B,YAAY,EAAE,qBAAqB,EAAE,CAAC;AAEtC,MAAM,WAAW,eAAgB,SAAQ,qBAAqB;IAC7D;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAqBD,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,gBAAgB,CAiGhF"}
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import { remarkLilypondPlugin } from "./remark-plugin.js";
|
|
|
4
4
|
import { rehypeLilypondPlugin } from "./rehype-plugin.js";
|
|
5
5
|
import { satteriLilypondPlugin } from "./satteri-plugin.js";
|
|
6
6
|
import { render } from "./render.js";
|
|
7
|
-
import { prependVersion, renderToHtml, resolveFormat } from "./util.js";
|
|
7
|
+
import { includePathsFor, prependVersion, renderToHtml, resolveFormat } from "./util.js";
|
|
8
8
|
const execFileAsync = promisify(execFile);
|
|
9
9
|
const LY_EXTENSIONS = [".ly", ".lilypond", ".ily"];
|
|
10
10
|
function lyFilePlugin(options) {
|
|
@@ -16,7 +16,12 @@ function lyFilePlugin(options) {
|
|
|
16
16
|
return;
|
|
17
17
|
const src = options.version ? prependVersion(source, options.version) : source;
|
|
18
18
|
const { format, resolution } = resolveFormat(options.format ?? "svg");
|
|
19
|
-
const buf = await render(src, {
|
|
19
|
+
const buf = await render(src, {
|
|
20
|
+
format,
|
|
21
|
+
resolution,
|
|
22
|
+
crop: options.crop ?? true,
|
|
23
|
+
includePaths: includePathsFor(id),
|
|
24
|
+
});
|
|
20
25
|
return { code: `export default ${JSON.stringify(renderToHtml(buf, format))}` };
|
|
21
26
|
},
|
|
22
27
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/rehype-plugin.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { LilypondPluginOptions } from "./util.js";
|
|
2
2
|
export type RehypePluginOptions = LilypondPluginOptions;
|
|
3
|
-
export declare function rehypeLilypondPlugin(options?: RehypePluginOptions): (tree: any
|
|
3
|
+
export declare function rehypeLilypondPlugin(options?: RehypePluginOptions): (tree: any, file?: {
|
|
4
|
+
path?: string;
|
|
5
|
+
}) => Promise<void>;
|
|
4
6
|
//# sourceMappingURL=rehype-plugin.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rehype-plugin.d.ts","sourceRoot":"","sources":["../src/rehype-plugin.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAQvD,MAAM,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAKxD,wBAAgB,oBAAoB,CACnC,OAAO,GAAE,mBAAwB,GAC/B,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"rehype-plugin.d.ts","sourceRoot":"","sources":["../src/rehype-plugin.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAQvD,MAAM,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAKxD,wBAAgB,oBAAoB,CACnC,OAAO,GAAE,mBAAwB,GAC/B,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAgDxD"}
|
package/dist/rehype-plugin.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { visit } from "unist-util-visit";
|
|
2
2
|
import { render } from "./render.js";
|
|
3
|
-
import {
|
|
3
|
+
import { includePathsFor, isLilypondLang, prependVersion, renderToHtml, resolveFormat } from "./util.js";
|
|
4
4
|
// Typed loosely so it's assignable to both RehypePlugin and the unified
|
|
5
5
|
// Plugin generic regardless of which @types/hast version the host project pins.
|
|
6
6
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
7
7
|
export function rehypeLilypondPlugin(options = {}) {
|
|
8
|
-
return async (tree) => {
|
|
8
|
+
return async (tree, file) => {
|
|
9
9
|
const promises = [];
|
|
10
|
+
const includePaths = includePathsFor(file?.path);
|
|
10
11
|
visit(tree, "element", (node, index, parent) => {
|
|
11
12
|
if (node.tagName !== "pre" ||
|
|
12
13
|
node.children?.length !== 1 ||
|
|
@@ -30,17 +31,13 @@ export function rehypeLilypondPlugin(options = {}) {
|
|
|
30
31
|
? prependVersion(raw, options.version)
|
|
31
32
|
: raw;
|
|
32
33
|
const { format, resolution } = resolveFormat(options.format ?? "svg");
|
|
33
|
-
const promise = render(source, { format, resolution, crop: options.crop })
|
|
34
|
+
const promise = render(source, { format, resolution, crop: options.crop, includePaths })
|
|
34
35
|
.then((buf) => {
|
|
35
36
|
const rawNode = {
|
|
36
37
|
type: "raw",
|
|
37
38
|
value: renderToHtml(buf, format),
|
|
38
39
|
};
|
|
39
40
|
parent.children[index] = rawNode;
|
|
40
|
-
})
|
|
41
|
-
.catch((err) => {
|
|
42
|
-
const rawNode = { type: "raw", value: errorHtml(err) };
|
|
43
|
-
parent.children[index] = rawNode;
|
|
44
41
|
});
|
|
45
42
|
promises.push(promise);
|
|
46
43
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rehype-plugin.js","sourceRoot":"","sources":["../src/rehype-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"rehype-plugin.js","sourceRoot":"","sources":["../src/rehype-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAWzG,wEAAwE;AACxE,gFAAgF;AAChF,8DAA8D;AAC9D,MAAM,UAAU,oBAAoB,CACnC,OAAO,GAAwB,EAAE;IAEjC,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,QAAQ,GAAoB,EAAE,CAAC;QACrC,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAEjD,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAC9C,IACC,IAAI,CAAC,OAAO,KAAK,KAAK;gBACtB,IAAI,CAAC,QAAQ,EAAE,MAAM,KAAK,CAAC;gBAC3B,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS;gBACnC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM;gBACnC,KAAK,KAAK,SAAS;gBACnB,CAAC,MAAM;gBAEP,OAAO;YAER,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,EAAE,SAAoB,CAAC;YACtD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;gBAAE,OAAO;YAChC,MAAM,IAAI,GAAI,GAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACjG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;gBAAE,OAAO;YAElC,MAAM,GAAG,GACR,QAAQ,CAAC,QACT;iBACC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;iBAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;iBACnB,IAAI,CAAC,EAAE,CAAC,CAAC;YAEX,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO;gBAC7B,CAAC,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC;gBACtC,CAAC,CAAC,GAAG,CAAC;YACP,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;YAEtE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;iBACtF,IAAI,CAAC,CAAC,GAAG,EAAQ,EAAE;gBACnB,MAAM,OAAO,GAAY;oBACxB,IAAI,EAAE,KAAK;oBACX,KAAK,EAAE,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC;iBAChC,CAAC;gBACF,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;YAClC,CAAC,CAAC,CAAC;YAEJ,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remark-plugin.d.ts","sourceRoot":"","sources":["../src/remark-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,IAAI,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAItC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAEvD,MAAM,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAExD,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"remark-plugin.d.ts","sourceRoot":"","sources":["../src/remark-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,IAAI,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAItC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAEvD,MAAM,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAExD,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC,EAAE,IAAI,CA6BrE,CAAC"}
|
package/dist/remark-plugin.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { visit } from "unist-util-visit";
|
|
2
2
|
import { render } from "./render.js";
|
|
3
|
-
import {
|
|
3
|
+
import { includePathsFor, isLilypondLang, prependVersion, renderToHtml, resolveFormat } from "./util.js";
|
|
4
4
|
export const remarkLilypondPlugin = (options = {}) => {
|
|
5
|
-
return async (tree) => {
|
|
5
|
+
return async (tree, file) => {
|
|
6
6
|
const promises = [];
|
|
7
|
+
const includePaths = includePathsFor(file?.path);
|
|
7
8
|
visit(tree, "code", (node, index, parent) => {
|
|
8
9
|
if (!isLilypondLang(node.lang) || index === undefined || !parent)
|
|
9
10
|
return;
|
|
@@ -11,17 +12,13 @@ export const remarkLilypondPlugin = (options = {}) => {
|
|
|
11
12
|
? prependVersion(node.value, options.version)
|
|
12
13
|
: node.value;
|
|
13
14
|
const { format, resolution } = resolveFormat(options.format ?? "svg");
|
|
14
|
-
const promise = render(source, { format, resolution, crop: options.crop })
|
|
15
|
+
const promise = render(source, { format, resolution, crop: options.crop, includePaths })
|
|
15
16
|
.then((buf) => {
|
|
16
17
|
const htmlNode = {
|
|
17
18
|
type: "html",
|
|
18
19
|
value: renderToHtml(buf, format),
|
|
19
20
|
};
|
|
20
21
|
parent.children[index] = htmlNode;
|
|
21
|
-
})
|
|
22
|
-
.catch((err) => {
|
|
23
|
-
const htmlNode = { type: "html", value: errorHtml(err) };
|
|
24
|
-
parent.children[index] = htmlNode;
|
|
25
22
|
});
|
|
26
23
|
promises.push(promise);
|
|
27
24
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remark-plugin.js","sourceRoot":"","sources":["../src/remark-plugin.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"remark-plugin.js","sourceRoot":"","sources":["../src/remark-plugin.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAKzG,MAAM,CAAC,MAAM,oBAAoB,GAAyC,CACzE,OAAO,GAAG,EAAE,EACX,EAAE;IACH,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,QAAQ,GAAoB,EAAE,CAAC;QACrC,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAEjD,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAC3C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM;gBAAE,OAAO;YAEzE,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO;gBAC7B,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC;gBAC7C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;YACd,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;YAEtE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;iBACtF,IAAI,CAAC,CAAC,GAAG,EAAQ,EAAE;gBACnB,MAAM,QAAQ,GAAS;oBACtB,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC;iBAChC,CAAC;gBACF,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC;YACnC,CAAC,CAAC,CAAC;YAEJ,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC,CAAC;AACH,CAAC,CAAC"}
|
package/dist/render.d.ts
CHANGED
|
@@ -11,7 +11,15 @@ export interface RenderOptions {
|
|
|
11
11
|
* `--define-default crop`. Defaults to `true`.
|
|
12
12
|
*/
|
|
13
13
|
crop?: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Extra directories LilyPond should search for `\include`d files, in
|
|
16
|
+
* addition to its own library (via `-I`). Typically the directory
|
|
17
|
+
* containing the source `.ly`/Markdown file, so sibling
|
|
18
|
+
* `\include "foo.ily"` files resolve even though rendering happens in a
|
|
19
|
+
* temp directory.
|
|
20
|
+
*/
|
|
21
|
+
includePaths?: string[];
|
|
14
22
|
}
|
|
15
|
-
export declare const defaultOptions: Required<RenderOptions
|
|
23
|
+
export declare const defaultOptions: Required<Omit<RenderOptions, "includePaths">>;
|
|
16
24
|
export declare function render(source: string, options?: RenderOptions): Promise<Buffer>;
|
|
17
25
|
//# sourceMappingURL=render.d.ts.map
|
package/dist/render.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAWnE,MAAM,WAAW,aAAa;IAC7B,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAKxE,CAAC;AAEF,wBAAsB,MAAM,CAC3B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,aAAkB,GACzB,OAAO,CAAC,MAAM,CAAC,CAiDjB"}
|
package/dist/render.js
CHANGED
|
@@ -4,6 +4,14 @@ import { join } from "path";
|
|
|
4
4
|
import { tmpdir } from "os";
|
|
5
5
|
import { promisify } from "util";
|
|
6
6
|
const execFileAsync = promisify(execFile);
|
|
7
|
+
// LilyPond sometimes hits an internal programming error but recovers and
|
|
8
|
+
// still produces valid output (it logs "continuing, cross fingers" and exits
|
|
9
|
+
// zero). Complex real-world scores with cross-staff spacing can legitimately
|
|
10
|
+
// trigger this, so it shouldn't fail the build on its own.
|
|
11
|
+
const BENIGN_STDERR_RE = /^programming error:.*\n^continuing, cross fingers$/gm;
|
|
12
|
+
function isBenignStderr(stderr) {
|
|
13
|
+
return stderr.replace(BENIGN_STDERR_RE, "").trim() === "";
|
|
14
|
+
}
|
|
7
15
|
const FORMAT_FLAGS = {
|
|
8
16
|
midi: null,
|
|
9
17
|
pdf: "--pdf",
|
|
@@ -19,8 +27,8 @@ export const defaultOptions = {
|
|
|
19
27
|
crop: true,
|
|
20
28
|
};
|
|
21
29
|
export async function render(source, options = {}) {
|
|
22
|
-
const { format = defaultOptions.format, resolution = defaultOptions.resolution, binaryPath = defaultOptions.binaryPath, crop = defaultOptions.crop, } = options;
|
|
23
|
-
const opts = { format, resolution, binaryPath, crop };
|
|
30
|
+
const { format = defaultOptions.format, resolution = defaultOptions.resolution, binaryPath = defaultOptions.binaryPath, crop = defaultOptions.crop, includePaths = [], } = options;
|
|
31
|
+
const opts = { format, resolution, binaryPath, crop, includePaths };
|
|
24
32
|
if (!(opts.format in FORMAT_FLAGS)) {
|
|
25
33
|
throw new Error(`${opts.format} is not a supported format`);
|
|
26
34
|
}
|
|
@@ -34,13 +42,23 @@ export async function render(source, options = {}) {
|
|
|
34
42
|
`--define-default=resolution=${opts.resolution ?? 144}`,
|
|
35
43
|
"--define-default=no-point-and-click",
|
|
36
44
|
...(opts.crop ? ["--define-default=crop"] : []),
|
|
45
|
+
...opts.includePaths.map((p) => `--include=${p}`),
|
|
37
46
|
"--silent",
|
|
38
47
|
"--output",
|
|
39
48
|
outputBase,
|
|
40
49
|
inputPath,
|
|
41
50
|
].filter((a) => a !== null);
|
|
42
|
-
|
|
43
|
-
|
|
51
|
+
let stderr;
|
|
52
|
+
try {
|
|
53
|
+
({ stderr } = await execFileAsync(opts.binaryPath ?? "lilypond", args));
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
const errStderr = err && typeof err === "object" && "stderr" in err
|
|
57
|
+
? String(err.stderr)
|
|
58
|
+
: undefined;
|
|
59
|
+
throw new Error(errStderr || (err instanceof Error ? err.message : String(err)));
|
|
60
|
+
}
|
|
61
|
+
if (stderr && !isBenignStderr(stderr))
|
|
44
62
|
throw new Error(stderr);
|
|
45
63
|
return await readOutputFile(outputBase, opts.format, opts.crop);
|
|
46
64
|
}
|
|
@@ -54,16 +72,22 @@ async function readOutputFile(base, format, crop) {
|
|
|
54
72
|
try {
|
|
55
73
|
return await readFile(`${base}.cropped.${format}`);
|
|
56
74
|
}
|
|
57
|
-
catch {
|
|
58
|
-
|
|
75
|
+
catch (err) {
|
|
76
|
+
throw new Error(`expected cropped output at ${base}.cropped.${format} but it was not found: ${err instanceof Error ? err.message : String(err)}`);
|
|
59
77
|
}
|
|
60
78
|
}
|
|
61
|
-
// Regular output: single page → <base>.<format>, multi-page →
|
|
79
|
+
// Regular output: single page → <base>.<format>, multi-page →
|
|
80
|
+
// <base>-1.<format> (svg/pdf/ps/eps) or <base>-page1.<format> (png).
|
|
62
81
|
try {
|
|
63
82
|
return await readFile(`${base}.${format}`);
|
|
64
83
|
}
|
|
65
84
|
catch {
|
|
66
|
-
|
|
85
|
+
try {
|
|
86
|
+
return await readFile(`${base}-1.${format}`);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return await readFile(`${base}-page1.${format}`);
|
|
90
|
+
}
|
|
67
91
|
}
|
|
68
92
|
}
|
|
69
93
|
//# sourceMappingURL=render.js.map
|
package/dist/render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"satteri-plugin.d.ts","sourceRoot":"","sources":["../src/satteri-plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,qBAAqB,EAErB,MAAM,SAAS,CAAC;AAGjB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAEvD,MAAM,MAAM,oBAAoB,GAAG,qBAAqB,CAAC;AAEzD,wBAAgB,qBAAqB,CACpC,OAAO,GAAE,oBAAyB,GAChC,qBAAqB,
|
|
1
|
+
{"version":3,"file":"satteri-plugin.d.ts","sourceRoot":"","sources":["../src/satteri-plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,qBAAqB,EAErB,MAAM,SAAS,CAAC;AAGjB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAEvD,MAAM,MAAM,oBAAoB,GAAG,qBAAqB,CAAC;AAEzD,wBAAgB,qBAAqB,CACpC,OAAO,GAAE,oBAAyB,GAChC,qBAAqB,CAoBvB"}
|
package/dist/satteri-plugin.js
CHANGED
|
@@ -1,25 +1,21 @@
|
|
|
1
1
|
import { render } from "./render.js";
|
|
2
|
-
import {
|
|
2
|
+
import { includePathsFor, isLilypondLang, prependVersion, renderToHtml, resolveFormat } from "./util.js";
|
|
3
3
|
export function satteriLilypondPlugin(options = {}) {
|
|
4
4
|
return {
|
|
5
5
|
name: "astro-lilypond",
|
|
6
6
|
// Returning an mdast Html node (type: 'html') emits the value verbatim.
|
|
7
7
|
// Sätteri's { rawHtml } escape hatch applies MDX brace-escaping which
|
|
8
8
|
// would corrupt SVG content, so we use the plain html node form instead.
|
|
9
|
-
async code(node,
|
|
9
|
+
async code(node, ctx) {
|
|
10
10
|
if (!isLilypondLang(node.lang))
|
|
11
11
|
return undefined;
|
|
12
12
|
const source = options.version
|
|
13
13
|
? prependVersion(node.value, options.version)
|
|
14
14
|
: node.value;
|
|
15
15
|
const { format, resolution } = resolveFormat(options.format ?? "svg");
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
catch (err) {
|
|
21
|
-
return { type: "html", value: errorHtml(err) };
|
|
22
|
-
}
|
|
16
|
+
const includePaths = includePathsFor(ctx.fileURL);
|
|
17
|
+
const buf = await render(source, { format, resolution, crop: options.crop, includePaths });
|
|
18
|
+
return { type: "html", value: renderToHtml(buf, format) };
|
|
23
19
|
},
|
|
24
20
|
};
|
|
25
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"satteri-plugin.js","sourceRoot":"","sources":["../src/satteri-plugin.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"satteri-plugin.js","sourceRoot":"","sources":["../src/satteri-plugin.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAKzG,MAAM,UAAU,qBAAqB,CACpC,OAAO,GAAyB,EAAE;IAElC,OAAO;QACN,IAAI,EAAE,gBAAgB;QACtB,wEAAwE;QACxE,sEAAsE;QACtE,yEAAyE;QACzE,KAAK,CAAC,IAAI,CACT,IAAoB,EACpB,GAAwB;YAExB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,SAAS,CAAC;YACjD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO;gBAC7B,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC;gBAC7C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;YACd,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;YACtE,MAAM,YAAY,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAClD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;YAC3F,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;QAC3D,CAAC;KACD,CAAC;AACH,CAAC"}
|
package/dist/util.d.ts
CHANGED
|
@@ -14,14 +14,17 @@ export declare function resolveFormat(format: OutputFormat): {
|
|
|
14
14
|
format: "svg" | "png";
|
|
15
15
|
resolution?: number;
|
|
16
16
|
};
|
|
17
|
-
export declare function escapeHtml(text: unknown): string;
|
|
18
17
|
/**
|
|
19
18
|
* If `version` is provided and the source doesn't already declare `\version`,
|
|
20
19
|
* prepend `\version "X.X.X"` so users don't need to write it manually.
|
|
21
20
|
*/
|
|
22
21
|
export declare function prependVersion(source: string, version: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Derives `render()`'s `includePaths` from the source file's path or URL, so
|
|
24
|
+
* `\include`d sibling files resolve even though rendering happens in a temp
|
|
25
|
+
* directory. Returns `[]` when the source location is unknown.
|
|
26
|
+
*/
|
|
27
|
+
export declare function includePathsFor(source: string | URL | null | undefined): string[];
|
|
23
28
|
/** Converts a rendered LilyPond buffer to an HTML string suitable for inline embedding. */
|
|
24
29
|
export declare function renderToHtml(buf: Buffer, format: "svg" | "png"): string;
|
|
25
|
-
/** Returns a safe HTML string for an error block (no node wrapping). */
|
|
26
|
-
export declare function errorHtml(err: unknown): string;
|
|
27
30
|
//# sourceMappingURL=util.d.ts.map
|
package/dist/util.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/E,MAAM,WAAW,qBAAqB;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAED,yFAAyF;AACzF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAEvE;AAED,iGAAiG;AACjG,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG;IACpD,MAAM,EAAE,KAAK,GAAG,KAAK,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,CAGA;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAGtE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,CAIjF;AAED,2FAA2F;AAC3F,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAMvE"}
|
package/dist/util.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { dirname } from "path";
|
|
2
|
+
import { fileURLToPath } from "url";
|
|
1
3
|
/** Returns true for the fenced-block language identifiers that trigger SVG rendering. */
|
|
2
4
|
export function isLilypondLang(lang) {
|
|
3
5
|
return lang === "lilypond" || lang === "ly" || lang === "ily";
|
|
@@ -8,16 +10,6 @@ export function resolveFormat(format) {
|
|
|
8
10
|
return { format };
|
|
9
11
|
return { format: format.type, resolution: format.resolution };
|
|
10
12
|
}
|
|
11
|
-
const HTML_ENTITIES = {
|
|
12
|
-
"&": "&",
|
|
13
|
-
"<": "<",
|
|
14
|
-
">": ">",
|
|
15
|
-
'"': """,
|
|
16
|
-
"'": "'",
|
|
17
|
-
};
|
|
18
|
-
export function escapeHtml(text) {
|
|
19
|
-
return String(text).replace(/[&<>"']/g, (c) => HTML_ENTITIES[c] ?? c);
|
|
20
|
-
}
|
|
21
13
|
/**
|
|
22
14
|
* If `version` is provided and the source doesn't already declare `\version`,
|
|
23
15
|
* prepend `\version "X.X.X"` so users don't need to write it manually.
|
|
@@ -27,6 +19,17 @@ export function prependVersion(source, version) {
|
|
|
27
19
|
return source;
|
|
28
20
|
return `\\version "${version}"\n${source}`;
|
|
29
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Derives `render()`'s `includePaths` from the source file's path or URL, so
|
|
24
|
+
* `\include`d sibling files resolve even though rendering happens in a temp
|
|
25
|
+
* directory. Returns `[]` when the source location is unknown.
|
|
26
|
+
*/
|
|
27
|
+
export function includePathsFor(source) {
|
|
28
|
+
if (!source)
|
|
29
|
+
return [];
|
|
30
|
+
const path = typeof source === "string" ? source : fileURLToPath(source);
|
|
31
|
+
return [dirname(path)];
|
|
32
|
+
}
|
|
30
33
|
/** Converts a rendered LilyPond buffer to an HTML string suitable for inline embedding. */
|
|
31
34
|
export function renderToHtml(buf, format) {
|
|
32
35
|
if (format === "png") {
|
|
@@ -35,9 +38,4 @@ export function renderToHtml(buf, format) {
|
|
|
35
38
|
}
|
|
36
39
|
return buf.toString("utf-8").replace(/<svg\b/, '<svg class="lilypond"');
|
|
37
40
|
}
|
|
38
|
-
/** Returns a safe HTML string for an error block (no node wrapping). */
|
|
39
|
-
export function errorHtml(err) {
|
|
40
|
-
const msg = escapeHtml(err instanceof Error ? err.message : String(err));
|
|
41
|
-
return `<div class="lilypond-error" style="color:red;padding:1rem;border:1px solid red;border-radius:0.5rem;font-family:monospace"><strong>LilyPond error:</strong> ${msg}</div>`;
|
|
42
|
-
}
|
|
43
41
|
//# sourceMappingURL=util.js.map
|
package/dist/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAUpC,yFAAyF;AACzF,MAAM,UAAU,cAAc,CAAC,IAA+B;IAC7D,OAAO,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,CAAC;AAC/D,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,aAAa,CAAC,MAAoB;IAIjD,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,OAAe;IAC7D,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9C,OAAO,cAAc,OAAO,MAAM,MAAM,EAAE,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAAuC;IACtE,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACzE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AACxB,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,MAAqB;IAC9D,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,oDAAoD,GAAG,4BAA4B,CAAC;IAC5F,CAAC;IACD,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;AACzE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "astro-lilypond",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.4",
|
|
4
4
|
"description": "An Astro integration for rendering Lilypond scores to images in Markdown.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -53,6 +53,7 @@
|
|
|
53
53
|
},
|
|
54
54
|
"scripts": {
|
|
55
55
|
"build": "tsc --project tsconfig.json",
|
|
56
|
-
"test": "vitest"
|
|
56
|
+
"test": "vitest --project unit",
|
|
57
|
+
"test:integration": "vitest run --project integration"
|
|
57
58
|
}
|
|
58
59
|
}
|
package/components/virtual.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
declare module "*.ly" {
|
|
2
|
-
const exports: string;
|
|
3
|
-
export default exports;
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
declare module "*.lilypond" {
|
|
7
|
-
const exports: string;
|
|
8
|
-
export default exports;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
declare module "*.ily" {
|
|
12
|
-
const exports: string;
|
|
13
|
-
export default exports;
|
|
14
|
-
}
|