Skip to content

Commit e211edd

Browse files
committed
feat: add isValidScriptlet api
1 parent 1c38190 commit e211edd

3 files changed

Lines changed: 41 additions & 0 deletions

File tree

.changeset/afraid-radios-begin.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"htmljs-parser": minor
3+
---
4+
5+
Add "isValidScriptlet" api.

src/__tests__/validate.test.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import assert from "node:assert/strict";
22
import { isValidAttrValue, isValidStatement } from "..";
3+
import { isValidScriptlet } from "../util/validators";
34

45
describe("validation helpers", () => {
56
describe("isValidStatement", () => {
@@ -28,6 +29,32 @@ describe("validation helpers", () => {
2829
});
2930
});
3031

32+
describe("isValidScriptlet", () => {
33+
it("accepts single-line expressions", () => {
34+
assert.equal(isValidScriptlet("foo + bar"), 2);
35+
});
36+
37+
it("rejects indented continuation lines", () => {
38+
assert.equal(isValidScriptlet("foo\n + bar"), 0);
39+
});
40+
41+
it("rejects unindented continuation lines", () => {
42+
assert.equal(isValidScriptlet("foo\nbar"), 0);
43+
});
44+
45+
it("accepts indented ternary continuation", () => {
46+
assert.equal(isValidScriptlet("foo ?\n bar : baz"), 2);
47+
});
48+
49+
it("rejects unterminated groups", () => {
50+
assert.equal(isValidScriptlet("(foo"), 0);
51+
});
52+
53+
it("rejects mismatched closing groups", () => {
54+
assert.equal(isValidScriptlet(")"), 0);
55+
});
56+
});
57+
3158
describe("isValidAttrValue", () => {
3259
it("accepts html attr values with operators", () => {
3360
assert.equal(isValidAttrValue("foo + bar", false), 2);

src/util/validators.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,15 @@ function prepareStatement(expr: STATE.ExpressionMeta) {
4444
expr.consumeIndentedContent = true;
4545
}
4646

47+
export function isValidScriptlet(code: string): Validity {
48+
return isValid(code, true, prepareScriptlet);
49+
}
50+
51+
function prepareScriptlet(expr: STATE.ExpressionMeta) {
52+
expr.operators = true;
53+
expr.terminatedByEOL = true;
54+
}
55+
4756
export function isValidAttrValue(code: string, concise: boolean): Validity {
4857
return isValid(code, concise, prepareAttrValue);
4958
}

0 commit comments

Comments
 (0)