From 25b5e9868ab07eae10c0442250950a9ad605d129 Mon Sep 17 00:00:00 2001 From: Christian Bager Bach Houmann Date: Mon, 12 Oct 2026 20:24:55 +0200 Subject: [PATCH 1/3] build(deps-dev): add svelte-policy from a packed tarball The package is not on npm yet. The vendored tarball is packed from chhoumann/svelte-policy at d10fa59 and is replaced by the published ^0.1.0 before this branch merges. --- package.json | 1 + pnpm-lock.yaml | 17 +++++++++++++++++ vendor/svelte-policy-0.0.0.tgz | Bin 0 -> 37828 bytes 3 files changed, 18 insertions(+) create mode 100644 vendor/svelte-policy-0.0.0.tgz diff --git a/package.json b/package.json index 943868c8e..57f10e7a8 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "oxlint-tsgolint": "7.0.2004", "svelte": "^5.57.2", "svelte-check": "^4.7.6", + "svelte-policy": "file:vendor/svelte-policy-0.0.0.tgz", "tslib": "^2.8.1", "typescript": "npm:@typescript/typescript6@6.0.2", "vite": "^8.3.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0f17fc4d6..d3a0ed2a8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -79,6 +79,9 @@ importers: svelte-check: specifier: ^4.7.6 version: 4.7.6(@typescript/typescript6@6.0.2)(picomatch@4.0.7)(svelte@5.57.2(@typescript-eslint/types@8.71.1)) + svelte-policy: + specifier: file:vendor/svelte-policy-0.0.0.tgz + version: file:vendor/svelte-policy-0.0.0.tgz(svelte@5.57.2(@typescript-eslint/types@8.71.1)) tslib: specifier: ^2.8.1 version: 2.8.1 @@ -1752,6 +1755,14 @@ packages: peerDependencies: svelte: '>=3.23.0 || ^5.0.0-next.0' + svelte-policy@file:vendor/svelte-policy-0.0.0.tgz: + resolution: {integrity: sha512-pqoy5qcA1xkll8sJArpphB5lTaUbA8gguOHVTW/A2TGnqAPQipmlKPBT4pMBN5KftPRGeUbLPiM59RzpbQzp+A==, tarball: file:vendor/svelte-policy-0.0.0.tgz} + version: 0.0.0 + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + svelte: ^5.57.0 + svelte@5.57.2: resolution: {integrity: sha512-1YiPCAXT0Ct6g1vOMmSLa0Nsc3QRMvtDF32ihgglGVrugIuIK38RyDiFNXVDhtQ81TJjSO57NdMw6DyYLqSGDQ==} engines: {node: '>=18'} @@ -3162,6 +3173,12 @@ snapshots: dependencies: svelte: 5.57.2(@typescript-eslint/types@8.71.1) + svelte-policy@file:vendor/svelte-policy-0.0.0.tgz(svelte@5.57.2(@typescript-eslint/types@8.71.1)): + dependencies: + esquery: 1.7.0 + svelte: 5.57.2(@typescript-eslint/types@8.71.1) + zimmerframe: 1.1.5 + svelte@5.57.2(@typescript-eslint/types@8.71.1): dependencies: '@jridgewell/remapping': 2.3.5 diff --git a/vendor/svelte-policy-0.0.0.tgz b/vendor/svelte-policy-0.0.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..af93aa41abcacf1f1c31fa639c18cd443a357130 GIT binary patch literal 37828 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

}Z19LWY1|@Ec1E}_CaHmqaC zvQvVYTXTLkldC=H9BAoK+GzIEEeE%pEO-RK1R7lK8aC#|lcTXE#lC!vN1^#V4~TPrPH9b2uk-xi$nQ1(!nxiX8kyv^im#(;A+- zz(3ZT@IZ9CUH8CwqWw8(()duQVBtZKkc5nj4}9(!nFUl98n-=Z6U3Kebs?)H8IIk7 z+2yl$1?Ou^Tv5jtYJr3mzl!#@zNMZymb0#at=>{(67Eb^4aRg4SHPC(`u}jOdKx0L zc17|gX`5Qw$&0qGx=o)-X1tB;AOSp;evjZB)RVC7B#MKEdQDji|vvMkpov zO$pOE6}Q_HPrQlUR0AvWDNGnSMB5E{z?U}g0oS(NjCldj^V+d&0pzut1LCs<^R<=~ zQM8>G1=w)Gg_)~wi7odr9HrX)q|=N;(8Q`Dfu|92E&^zcFQG=?0)SsuIlouLyZ*s- z^q3UBT*=ZpzW+}weI zTO{6e2xb@k8WAIQO2*FJNVm}&8~m|9_CoO8jL}1L3!GQ8UhqpV41Ymq;eqxeJ|MqQ z?KX^#o&BKfg<%OrqnY+Oj($>Qqr&FgQ{ zh&-qpV2qaHvbnD?j6U?Y!tgD+)SvgX1NA!k)PLxcC$sl~9`#`uO~6TdkJrw}Ubyq9 zXL&w**ADQ->u~TB{0!j(?ixgE*u|rsz6=4b>`~E&g&AdokRFkjHLTU$i=KHjkCdlB zJI6<}fpxn8`^CZHPcwGt3-1i{kqC(r89?R7t?;wPNQ=VgM{*@sF7pX80sH`}#Ny#T zl=-1g0O4}j55uXt#$X)T^$iB-BaN(U4a(#EBLbHWEW{)5=mM{&kOpa-`c;z;2Ue5H z)&3kyene=h9qaahJ8SUzd!9;krZ?X52Ac+5+U=jN0x0Ks2LiQx>8{4FOb)j=&qFIe z^cz}1%tvXz5jAH1;TyDZ(MQTrG>%K_wd$E5Dwu9?q~8&5F*i8OwFmo(LsSj?8#|`7 znUSkr7+%p0pT2d`z<_R^?cxH*Hq9*s{Fe7{N=&Ov_gMCR6o&T!C3_!stm__z*v!=w zW)Yfbcn8BuFzlc8?THdWe#qeP0t8I;{6Ql;-k|@{3&ZcQd^YfJS73FVDnmoM4ctZh zeit|%uL~v~e5z`G>RSZM_f*uTY+cL2ePkcs?1j;DDtX=uqgU45l4oHw>Cw{BmxZkR zC+d#Q_mMSCyab~MJ!^$3IDYNHUKsko=!#o3{nny@Aw7VF80l+C(T~)g45Oz(xue@d zG?ajE!1~}v_y{dD)+oor=4BLyB`&Lt9qW=81EW?v-Kok^MA-o9j|SE(F$0Ot=$UuH zr;fUZk;S5I78d>5^WQKM2cLQtCRhj{>g|WoLjY_*cY(Hcohwi9^Q~E=AkE>{_^_{U z9`&7zJx%)tPV`%r3!@J^bgKvj9PDxrN@DYSSZGfZlee$z(w(&EhkO5*QYf*2J%*qgkK^Q%Uj}Sl1jkzf8S#yW9W3NAR zH4Z-zengwu>kKzlTg+q^nDdUcsWNGr*06CDFGJ+_wDU*Uu^Lm}^!9KqO3`eGU?Ihp7ypI)a9!`sMjzxQZknh= zkBbV8{y36vO7Y`?@(6_cM-&y8e$Pu;ZYi%pjv6Pj9DAipHVJ#?8E?mZEd3Iq9Jn5j zP-*e4L8^wB{8X8%YT;>_r*nuc5mys+wGK*3bg+>%zd#i}!*lcm(Az4ABiP_9w`-gk z3+}CjUZdg$9E$Q}ya;~0-mc@4A4> z6A-lN;;U2h8f*K5LZc9X{&*4WuV~J1f!@X~gXVbQmH-O<{wKrac@|r!di>b-rrOV> zxJWR-BZOr(uA(qR@Ng21aEY71q#1EjDBserKt z57*9S!(`iLK!vl~L|=U{E>sUEWYRt|0Kg64 z6P%YLQ^k0_2lm6}6>x1AanPku1efQMvg!!NOqZF*HS!7D_jb!}>&EK*q*HeWXfnF8 zA=g-<2cOWjvbJIx&G3(v)38I@Z6ezyKVof4#Vg3L+N?X%?uvsaUE5iLdmZ9}D18@g zvnG{g7Q0wxokhE>$IQ1Z$6n<^DaCo3pOzv`F5n8M7}%6yW_%q- ztw>^Cp8L1HYsBn}No2u|X9wA8md)zje(ai#$wntYt>AVf6PV@R3n_ai3tcdKX5hR6vyyXf4eUw9ddB z$+w;XTAr~Q>a_v|)X!R11mB(l>ev?NDPmY{6P+oAv1e34L~}5!jY#VN=6JM!(6g{> z>2*+{(z7O)Osv5OwM(8^!+dyQkw8s5<3l(b-Yj()s;c@5YD-THFCIqLi5>dG(zS=E zen5=;=ZOBl?aw*?m&Itcf3f=g!OvHFf1nm%>G^--yYJT@_~-wJ8xOw!&-wqa_-j1> z`*d(?AXuGd#)$w_j`EpwpU_4-%Ex}NAP7L|JfQ&UweA<($3P~e8bgF{n_gKems1(x1mCylF0W{|yT5+@m|4>Bpz{5%=O zsmN!th%3BPP~{jg2cKl)(mREz$1I%N!%%I2e0J|1M?w1h`MA}w%c&T%e3pP_x;PYa z9)C^%neuc^1dC}Pp{V+C%vY-6+~EM%P32i-pz5IKrCS0M3Ry)?j`>#h5xlm83aL3N zF(?UyEIK7U07|)hWoh_L{LN6vU*=G5c-)GQTf;yM*FSA!=J7@b&)~^8IXja|;vQ}c zJxr(6<1=~1xMmQ%Ygp*n-74fcg!~2hI>VC^qj$LW^)(F@3Up^c1Vwh^K0Qn0^YUi6 zWtuxp&XcTaYL6>Yftze-JJIrGEG*D?BkKt{qtWl=j0Q$UJLZO%_0SLN^fbQ|F?R4x z39e)yfF>nqxyD@)n%q$$lX47qQPV3V=Bk)i6NqVFq87rTdbq+riZgLaN1j6F#aI^9 zpuT#>vpy!3#c+FjdkAi*!>_ithZN;0R;_+hnre7umpTzi#qHxgS<;3~WKsz153WsD zvMAM&2x&`&^~L)@dT_k5uoJVwvGEXZM4e$|F;MsM8Y0P_2rbdfr3@5}m4O(31!Q^e z9(;cO44>P2Xf#Uf0Eb^gUrATM6J#$6%&vF|Hz_YC$aPR>Im+khSWpCfaVo1zDKl|e z#Mx+qtwTJCdCYN(A({%@*)5=(>Wa>-0i;+<&NB?tLC}qIS&U#gsAa5iXkuT-S)KvN zHLfK-*O_jhBOq_;8L%B)@q#F>z49_aS4qvpjO%J#!aWny=y7Y))1qJ{*rT?bD!j_; z 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 shon+@ Date: Mon, 12 Oct 2026 20:31:52 +0200 Subject: [PATCH 2/3] chore(lint): check Svelte components with svelte-policy Replace the tooling/ component checker and oxlint plugin with the shared svelte-policy package. svelte-policy.json holds the ten restricted selectors and messages, turns on no-svelte-store and runes-only, and keeps the logger message for no-console. Oxlint loads the package's plugin under the quickadd prefix, with each rule on the same file globs and severities as before. Every message is unchanged. These rule ids change: - Component checker: svelte/store imports report no-svelte-store, svelte/internal imports report no-svelte-internal, and named createEventDispatcher imports report runes-only, instead of restricted-syntax. - Oxlint: quickadd(svelte-internal) becomes quickadd(no-svelte-internal). quickadd(svelte-runes) becomes quickadd(no-svelte-store) for store imports and quickadd(runes-only) for dispatcher imports. quickadd(svelte-debug) becomes quickadd(no-inspect). In shared .svelte.ts modules, runes-only also reports $: statements, which the old plugin did not check. The policy fixtures from #2224 now live in the package's own tests, so tests/tooling/sveltePolicy.test.ts keeps only the checks of QuickAdd's wiring. esquery is no longer a direct dependency. --- .oxlintrc.syntax.json | 9 +- package.json | 3 +- pnpm-lock.yaml | 3 - svelte-policy.json | 52 +++++ tests/tooling/sveltePolicy.test.ts | 176 +++-------------- tooling/README.md | 72 ++++--- tooling/oxlint-plugin.mjs | 108 ----------- tooling/svelte-policy.mjs | 300 ----------------------------- 8 files changed, 127 insertions(+), 596 deletions(-) create mode 100644 svelte-policy.json delete mode 100644 tooling/oxlint-plugin.mjs delete mode 100644 tooling/svelte-policy.mjs diff --git a/.oxlintrc.syntax.json b/.oxlintrc.syntax.json index 6afbef6f0..99476c882 100644 --- a/.oxlintrc.syntax.json +++ b/.oxlintrc.syntax.json @@ -227,7 +227,7 @@ "**/*.ts" ], "rules": { - "quickadd/svelte-internal": "error" + "quickadd/no-svelte-internal": "error" } }, { @@ -235,15 +235,16 @@ "**/*.svelte.ts" ], "rules": { - "quickadd/svelte-runes": "error", - "quickadd/svelte-debug": "warn" + "quickadd/no-svelte-store": "error", + "quickadd/runes-only": "error", + "quickadd/no-inspect": "warn" } } ], "jsPlugins": [ { "name": "quickadd", - "specifier": "./tooling/oxlint-plugin.mjs" + "specifier": "svelte-policy/oxlint" } ] } diff --git a/package.json b/package.json index 57f10e7a8..daafacef4 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "test:e2e": "vitest run --config vitest.e2e.config.mts", "test:e2e:orb": ".agents/run-e2e", "lint:native": "oxlint -c .oxlintrc.syntax.json src tests && oxlint --type-aware --ignore-pattern '**/*.test.ts' src", - "lint:svelte": "node tooling/svelte-policy.mjs" + "lint:svelte": "svelte-policy" }, "keywords": [], "author": "Christian B. B. Houmann", @@ -33,7 +33,6 @@ "@vitest/coverage-v8": "5.0.3", "esbuild": "^0.28.2", "esbuild-svelte": "^0.9.5", - "esquery": "^1.7.0", "jsdom": "^30.1.2", "moment": "2.31.0", "obsidian": "1.14.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d3a0ed2a8..0bb585d29 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -52,9 +52,6 @@ importers: esbuild-svelte: specifier: ^0.9.5 version: 0.9.5(esbuild@0.28.2)(svelte@5.57.2(@typescript-eslint/types@8.71.1)) - esquery: - specifier: ^1.7.0 - version: 1.7.0 jsdom: specifier: ^30.1.2 version: 30.1.2 diff --git a/svelte-policy.json b/svelte-policy.json new file mode 100644 index 000000000..f341ab9a2 --- /dev/null +++ b/svelte-policy.json @@ -0,0 +1,52 @@ +{ + "rules": { + "no-svelte-store": "error", + "runes-only": "error", + "no-console": { + "severity": "error", + "message": "Use the logger utilities instead of console methods." + } + }, + "restrictedSyntax": [ + { + "selector": "CallExpression[callee.type=\"MemberExpression\"][callee.property.name=\"createElement\"]", + "message": "Use Obsidian DOM helpers; use the owner document window for detached elements." + }, + { + "selector": "CallExpression[callee.property.name=\"createDocumentFragment\"]", + "message": "Use createFragment(), or the owner document window for a specific realm." + }, + { + "selector": "CallExpression:matches([callee.name=\"createEl\"], [callee.property.name=\"createEl\"])[arguments.0.value=/^(div|span)$/]", + "message": "Use createDiv() or createSpan() for these tags." + }, + { + "selector": "BinaryExpression[operator=\"instanceof\"][right.name=\"HTMLElement\"]", + "message": "Use node.instanceOf(HTMLElement) for cross-window checks." + }, + { + "selector": "CallExpression[callee.type=\"MemberExpression\"][callee.property.name=\"setDynamicTooltip\"]", + "message": "Slider values are shown inline; setDynamicTooltip has no effect." + }, + { + "selector": "Literal[regex.pattern=/\\(\\?<[=!]/]", + "message": "No regex lookbehind: iOS before 16.4 cannot parse it, and Obsidian runs on iOS 15.6, so QuickAdd would not load at all." + }, + { + "selector": "AssignmentExpression[left.object.type=\"MemberExpression\"][left.object.computed=false][left.object.property.name=\"style\"][right.type=\"Literal\"]", + "message": "Put a static style in styles.css; set a computed one with setCssStyles, or a CSS variable with setCssProps." + }, + { + "selector": "CallExpression[callee.property.name=\"setProperty\"][callee.object.property.name=\"style\"][arguments.1.type=\"Literal\"]", + "message": "Put a static style in styles.css; set a computed one with setCssStyles, or a CSS variable with setCssProps." + }, + { + "selector": "CallExpression[callee.property.name=\"setAttribute\"][arguments.0.value=\"style\"][arguments.1.type=\"Literal\"]", + "message": "Put a static style in styles.css; set a computed one with setCssStyles, or a CSS variable with setCssProps." + }, + { + "selector": "CallExpression[callee.property.name=/^setCss(Props|Styles)$/] > ObjectExpression > Property[key.type=\"Literal\"][key.value=/^(?!--)/]", + "message": "Put a static style in styles.css; set a computed one with setCssStyles, or a CSS variable with setCssProps." + } + ] +} diff --git a/tests/tooling/sveltePolicy.test.ts b/tests/tooling/sveltePolicy.test.ts index 464102a2c..c253ad284 100644 --- a/tests/tooling/sveltePolicy.test.ts +++ b/tests/tooling/sveltePolicy.test.ts @@ -3,10 +3,12 @@ import { copyFileSync, mkdirSync, mkdtempSync, rmSync, symlinkSync, writeFileSyn import { tmpdir } from "node:os"; import { basename, join } from "node:path"; import { fileURLToPath } from "node:url"; +import { checkSvelte } from "svelte-policy"; import { compile } from "svelte/compiler"; import { describe, expect, it } from "vitest"; -import { checkSvelte } from "../../tooling/svelte-policy.mjs"; +const root = fileURLToPath(new URL("../../", import.meta.url)); +const component = join(root, "src/Probe.svelte"); const forbidden = { "create-element": 'document.createElement("div");', "create-fragment": "document.createDocumentFragment();", @@ -26,36 +28,21 @@ const permitted = { "valid-dynamic-style": 'el.style.color = el.dataset.color ?? "";', "valid-forward-regex": "void /a(?=b)/;", }; -const contexts = { - script: (statement: string) => ``, - template: (statement: string) => ``, -}; +const template = (statement: string) => ``; describe("custom syntax guards without ESLint", () => { - for (const [context, component] of Object.entries(contexts)) { - it.each(Object.entries(forbidden))(`rejects %s in a Svelte ${context}`, (_name, statement) => { - const diagnostics = checkSvelte(component(statement)); - expect(diagnostics.filter(item => item.rule === "restricted-syntax")).toHaveLength(1); - }); - it.each(Object.entries(permitted))(`accepts %s in a Svelte ${context}`, (_name, statement) => { - expect(checkSvelte(component(statement))).toEqual([]); - }); - } - it("rejects the same ten TypeScript violations, accepts valid code, and excludes tests in Oxlint", () => { - const root = fileURLToPath(new URL("../../", import.meta.url)); const workspace = mkdtempSync(join(tmpdir(), "quickadd-lint-")); try { mkdirSync(join(workspace, "src")); - mkdirSync(join(workspace, "tooling")); - copyFileSync(join(root, ".oxlintrc.syntax.json"), join(workspace, ".oxlintrc.syntax.json")); - copyFileSync(join(root, "tooling/oxlint-plugin.mjs"), join(workspace, "tooling/oxlint-plugin.mjs")); + for (const file of [".oxlintrc.syntax.json", "svelte-policy.json"]) copyFileSync(join(root, file), join(workspace, file)); symlinkSync(join(root, "node_modules"), join(workspace, "node_modules"), process.platform === "win32" ? "junction" : "dir"); for (const [name, statement] of Object.entries({ ...forbidden, ...permitted })) { writeFileSync(join(workspace, `src/${name}.ts`), `export function probe(el: HTMLElement): void { ${statement} }`); } writeFileSync(join(workspace, "src/excluded.test.ts"), 'document.createElement("div");'); writeFileSync(join(workspace, "src/state.svelte.ts"), 'export { writable } from "svelte/store";'); + writeFileSync(join(workspace, "src/dispatcher.svelte.ts"), 'import { createEventDispatcher } from "svelte"; export const dispatch = createEventDispatcher();'); writeFileSync(join(workspace, "src/debug.svelte.ts"), 'const value = 1; $inspect(value);'); writeFileSync(join(workspace, "src/internal.ts"), 'import "svelte/internal/disclose-version";'); writeFileSync(join(workspace, "src/internal.svelte.ts"), 'export * from "svelte/internal/client";'); @@ -63,17 +50,19 @@ describe("custom syntax guards without ESLint", () => { const result = spawnSync(process.execPath, [join(root, "node_modules/oxlint/bin/oxlint"), "-c", ".oxlintrc.syntax.json", "src", "--format", "json"], { cwd: workspace, encoding: "utf8", timeout: 30_000 }); expect(result.error).toBeUndefined(); expect(result.status, result.stderr).toBe(1); - const output: { diagnostics: { filename: string; code: string; message: string }[] } = JSON.parse(result.stdout); + const output: { diagnostics: { filename: string; code: string; message: string; severity: string }[] } = JSON.parse(result.stdout); const custom = output.diagnostics.filter(item => item.code === "quickadd(restricted-syntax)"); expect(custom).toHaveLength(10); for (const [name, statement] of Object.entries(forbidden)) { const diagnostic = custom.find(item => item.filename.endsWith(`${name}.ts`)); expect(diagnostic).toBeDefined(); - expect(diagnostic?.message).toBe(checkSvelte(contexts.template(statement))[0].message); + expect(diagnostic?.message).toBe(checkSvelte(template(statement), component)[0].message); } - expect(output.diagnostics.filter(item => item.code === "quickadd(svelte-runes)").map(item => basename(item.filename))).toEqual(["state.svelte.ts"]); - expect(output.diagnostics.filter(item => item.code === "quickadd(svelte-debug)")).toHaveLength(1); - expect(output.diagnostics.filter(item => item.code === "quickadd(svelte-internal)").map(item => basename(item.filename)).sort()).toEqual(["internal.svelte.ts", "internal.test.ts", "internal.ts"]); + const reported = (code: string) => output.diagnostics.filter(item => item.code === code).map(item => basename(item.filename)).sort(); + expect(reported("quickadd(no-svelte-store)")).toEqual(["state.svelte.ts"]); + expect(reported("quickadd(runes-only)")).toEqual(["dispatcher.svelte.ts"]); + expect(output.diagnostics.filter(item => item.code === "quickadd(no-inspect)").map(item => [basename(item.filename), item.severity])).toEqual([["debug.svelte.ts", "warning"]]); + expect(reported("quickadd(no-svelte-internal)")).toEqual(["internal.svelte.ts", "internal.test.ts", "internal.ts"]); expect(output.diagnostics.filter(item => item.filename.includes("valid-") || item.filename.includes("excluded.test.ts"))).toEqual([]); } finally { rmSync(workspace, { recursive: true, force: true }); @@ -81,12 +70,10 @@ describe("custom syntax guards without ESLint", () => { }); it("retains type-aware promise and string-timer checks through the inherited Oxlint config", () => { - const root = fileURLToPath(new URL("../../", import.meta.url)); const workspace = mkdtempSync(join(tmpdir(), "quickadd-typed-lint-")); try { mkdirSync(join(workspace, "src")); - mkdirSync(join(workspace, "tooling")); - for (const file of [".oxlintrc.json", ".oxlintrc.syntax.json", "tooling/oxlint-plugin.mjs"]) copyFileSync(join(root, file), join(workspace, file)); + for (const file of [".oxlintrc.json", ".oxlintrc.syntax.json", "svelte-policy.json"]) copyFileSync(join(root, file), join(workspace, file)); symlinkSync(join(root, "node_modules"), join(workspace, "node_modules"), process.platform === "win32" ? "junction" : "dir"); writeFileSync(join(workspace, "tsconfig.json"), JSON.stringify({ compilerOptions: { target: "ES2022", module: "ESNext", moduleResolution: "bundler", lib: ["DOM", "ES2022"], skipLibCheck: true }, include: ["src/**/*.ts"] })); writeFileSync(join(workspace, "src/floating.ts"), "Promise.resolve(1);"); @@ -109,134 +96,17 @@ describe("custom syntax guards without ESLint", () => { }); describe("Svelte template policies", () => { - const invalid = [ - ["no-at-html-tags", "{@html html}"], - ["require-each-key", "{#each items as item}

{item}

{/each}"], - ["valid-each-key", "{#each items as item (42)}

{item}

{/each}"], - ["valid-each-key", "{#each items as item (obj.item)}

{item}

{/each}"], - ["valid-each-key", "{#each items as item ((item => item)(1))}

{item}

{/each}"], - ["valid-each-key", "{#each items as item ((function item() { return 42; })())}

{item}

{/each}"], - ["valid-each-key", "{#each items as item ((function item() { return item; })())}

{item}

{/each}"], - ["valid-each-key", "{#each items as item ((class item {}))}

{item}

{/each}"], - ["valid-each-key", "{#each items as item ((function key() { if (true) { var item = 42; } return item; })())}

{item}

{/each}"], - ["no-dom-manipulating", '
'], - ["no-dom-manipulating", "
"], - ["no-dom-manipulating", "
"], - ["no-dupe-directives", "
"], - ["no-dupe-directives", ""], - ["no-dupe-directives", ""], - ["no-dupe-directives", ""], - ["no-dupe-directives", ""], - ["no-dupe-else-if-blocks", "{#if a || b}A{:else if b && c}B{/if}"], - ["no-dupe-else-if-blocks", "{#if a}A{:else if b}B{:else if a || b}C{/if}"], - ["no-dupe-else-if-blocks", "{#if status === 'ready'}A{:else if status === 'ready'}B{/if}"], - ["no-dupe-else-if-blocks", "{#if value === 1n}A{:else if value === 1n}B{/if}"], - ["no-object-in-text-mustaches", "

{{name: 'value'}}

"], - ["no-raw-special-elements", ""], - ["no-at-debug-tags", "{@debug value}"], - ["no-inspect", ""], - ["runes-only", ""], - ["restricted-syntax", ''], - ["restricted-syntax", ''], - ["restricted-syntax", ''], - ["restricted-syntax", ''], - ["no-console", ""], - ["no-console", ""], - ["no-console", "{#await value then console}

{console.log('X')}

{:catch error}

{console.log('X')}

{/await}"], - ["no-console", "{#each console.log('X') as console (console.id)}

{console.id}

{/each}"], - ["no-console", "{#each items as console (console.id)}

{console.id}

{:else}

{console.log('X')}

{/each}"], - ["no-console", "{#each items as item, console (item.id)}

{item.id}

{:else}

{console.log('X')}

{/each}"], - ["no-console", ""], - ["no-console", ""], - ["no-console", "

{console.log('X')}

"], - ["no-console", ""], - ["no-console", ""], - ["no-console", ""], - ["no-new-func", ""], - ["no-new-func", ""], - ["no-implied-eval", ""], - ["no-implied-eval", ""], - ["no-implied-eval", ""], - ["no-implied-eval", ""], - ["no-implied-eval", ""], - ["no-implied-eval", ""], - ["no-unused-svelte-ignore", "

X

"], - ["no-unused-svelte-ignore", "
{}}>X
"], - ]; - it.each(invalid)("rejects %s: %s", (rule, source) => { - expect(checkSvelte(source).map(item => item.rule)).toContain(rule); - }); it.each([ - "{#each items as item (item.id)}

{item.name}

{/each}", - "{#each items as {id, name} (id)}

{name}

{/each}", - "{#each items as item, i (i)}

{item}

{/each}", - "{#each items as item ((function key() { return item.id; })())}

{item}

{/each}", - "{#each items as item ((function key() { function inner() { var item = 42; } return item.id; })())}

{item}

{/each}", - "{#if a}A{:else if b}B{/if}", - "{#if a}{#if a}A{/if}{/if}", - "{#if next()}A{:else if next()}B{/if}", - "{#if a && next()}A{:else if a && next()}B{/if}", - "{#if object.ready}A{:else if object.ready}B{/if}", - "{#if i++}A{:else if i++}B{/if}", - "{#if (a = next())}A{:else if (a = next())}B{/if}", - "{#if a < b}A{:else if a < b}B{/if}", - "{#if a}A{:else if next()}B{:else if a}C{/if}", - "", - "", - "", - "", - "
", - "", - "", - "", - "{#if value === 1n}A{:else if value === 1}B{/if}", - "
", - "
", - "
", - "
", - "
", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "

{console.log('X')}

", - "

{console.log('X')}

", - "

{console.log('X')}

", - "", - "", - "", - "", - "", - "", - "{#each entries as console (console.id)}

{console.log('X')}

{/each}", - "{#snippet render(console)}

{console.log('X')}

{/snippet}", - "{#await value then console}

{console.log('X')}

{/await}", - "{#await value}

Waiting

{:catch Function}

{Function('value')}

{/await}", - "{#if ready}{@const console = logger}

{console.log('X')}

{/if}", - "", - "", - "", - "", - "", - "", - "
{}}>X
", - "
{}}>X
", - ])("accepts valid template code: %s", source => { - expect(checkSvelte(source)).toEqual([]); - }); - it("reports template expressions at their original line and column", () => { - const [diagnostic] = checkSvelte("

Text

\n", "Probe.svelte"); - expect(diagnostic).toMatchObject({ filename: "Probe.svelte", line: 2, column: 24, rule: "restricted-syntax" }); + ["no-svelte-store", ''], + ["runes-only", ""], + ["runes-only", ''], + ])("rejects %s: %s", (rule, source) => { + expect(checkSvelte(source, component).map(item => item.rule)).toContain(rule); }); - it("rejects malformed components instead of skipping them", () => { - expect(checkSvelte("{#if ready}

X

")).toMatchObject([{ severity: "error" }]); + it("rejects console methods in templates with the logger message", () => { + expect(checkSvelte("", component)).toMatchObject([ + { rule: "no-console", message: "Use the logger utilities instead of console methods." }, + ]); }); it("uses compiler warnings for accessibility and unused CSS", () => { const inaccessible = compile("
{}}>X
", { generate: false, runes: true }); diff --git a/tooling/README.md b/tooling/README.md index 477713121..5a68718cd 100644 --- a/tooling/README.md +++ b/tooling/README.md @@ -1,15 +1,18 @@ # Tooling checks -`pnpm run lint` runs Oxlint, `svelte-policy.mjs`, and -`svelte-check --fail-on-warnings`. `pnpm run build-with-lint` runs the -same checks before producing the application bundle. CI also runs the policy -tests through `pnpm run test`. +`pnpm run lint` runs Oxlint, the +[`svelte-policy`](https://github.com/chhoumann/svelte-policy) component +checker, and `svelte-check --fail-on-warnings`. `pnpm run build-with-lint` +runs the same checks before producing the application bundle. CI also runs +the policy tests through `pnpm run test`. Oxlint checks TypeScript and extracted Svelte scripts. Its JavaScript plugin -API cannot inspect Svelte template expressions, so `svelte-policy.mjs` uses -the Svelte compiler's AST for complete components. Both tools use the ten -original selectors and messages exported by `oxlint-plugin.mjs`. `esquery` -matches these selectors without an ESLint runtime. +API cannot inspect Svelte template expressions, so the `svelte-policy` +checker uses the Svelte compiler's AST for complete components. The package +also provides the Oxlint plugin, which `.oxlintrc.syntax.json` loads under +the `quickadd` prefix. `svelte-policy.json` gives both tools the ten original +selectors and messages. For components, it also turns on the store and runes +rules and sets the `no-console` message. Oxlint's JavaScript plugin API is alpha and does not have a semver guarantee. The dependency is pinned. The selectors execute in JavaScript, while built-in @@ -19,8 +22,8 @@ uses the TypeScript 6 API package, because svelte-check 4.7.6 exits 0 under All current components use Svelte 5 runes. Svelte checking and production compilation require runes mode. The policy checker rejects `$:` statements -and `svelte/store` imports. Shared `.svelte.ts` modules receive the same import -restriction in Oxlint. These checks prevent legacy reactive statements and +and `svelte/store` imports. Shared `.svelte.ts` modules receive the same +restrictions in Oxlint. These checks prevent legacy reactive statements and store usage from returning. ## Svelte rule migration @@ -41,22 +44,22 @@ listed as retired below now depend on review. | `no-reactive-functions` | Legacy reactive statements are rejected. | | `no-reactive-literals` | Legacy reactive statements are rejected. | | `no-reactive-reassign` | Legacy reactive statements are rejected. | -| `no-store-async` | Legacy store imports are rejected in component code. | -| `require-store-reactive-access` | Legacy store imports are rejected in component code. Custom store objects are not inferred by the new checker. | -| `require-event-dispatcher-types` | Shared selector rejects named dispatcher imports, including aliases. Use callback props. Namespace and dynamic access are not traced. | +| `no-store-async` | `no-svelte-store` rejects legacy store imports in component code. | +| `require-store-reactive-access` | `no-svelte-store` rejects legacy store imports in component code. Custom store objects are not inferred by the new checker. | +| `require-event-dispatcher-types` | `runes-only` rejects named dispatcher imports, including aliases. Use callback props. Namespace and dynamic access are not traced. | | `no-at-html-tags` | Compiler-AST policy rejects `{@html}`. | -| `require-each-key` | Compiler-AST policy requires a key for every each block. | +| `require-each-key` | Compiler-AST policy requires a key for every each block with an item. | | `valid-each-key` | Compiler-AST policy requires the key to reference the block's item or index. This is not a uniqueness proof. | | `no-at-debug-tags` | Compiler-AST policy reports a warning. | -| `no-inspect` | Shared selector reports a warning in components and shared `.svelte.ts` modules. | +| `no-inspect` | `no-inspect` reports a warning in components and shared `.svelte.ts` modules. | | `no-dom-manipulating` | Compiler-AST policy rejects structural or text changes to the named binding used by `bind:this`. It distinguishes module, instance, and local scopes but does not follow arbitrary aliases. | | `no-dupe-else-if-blocks` | Compiler-AST policy checks duplicate and covered conditions using identifiers, literals, Boolean operators, and strict equality. It skips chains containing calls, property reads, mutations, or coercive operators because their values can change between evaluations. | | `no-dupe-on-directives` | Compiler-AST policy rejects identical event directives. | | `no-dupe-use-directives` | Compiler-AST policy rejects identical action directives. | -| `no-not-function-handler` | Svelte type checking verifies event-handler types. | +| `no-not-function-handler` | Compiler-AST policy rejects a literal, object, array, or class as an `on*` attribute or `on:` directive value, directly or through a `const`. Svelte type checking also verifies event-handler types. | | `no-object-in-text-mustaches` | Compiler-AST policy rejects object and function literals in text interpolation. | | `no-raw-special-elements` | Compiler-AST policy requires the `svelte:` prefix for special elements. | -| `no-svelte-internal` | Shared selector rejects imports and re-exports from Svelte internals in components and all TypeScript files. | +| `no-svelte-internal` | `no-svelte-internal` rejects imports and re-exports from Svelte internals in components and all TypeScript files. | | `no-unused-svelte-ignore` | Compiler-AST policy compares suppressed warnings with compiler diagnostics for the target element. | | `no-inner-declarations` | Removed. Svelte scripts are modules, and block-scoped functions were already allowed. | | `no-unused-props` | Removed. This rule required TypeScript parser services that the remaining ESLint fallback did not enable. | @@ -80,13 +83,33 @@ methods on unshadowed `window`, `globalThis`, `self`, and `global` objects. Type-aware promise, deprecation, and implied-eval checks still run on TypeScript through Oxlint, with the existing test and user-script exceptions. +The package closes gaps in the checker this migration first added: + +- `svelte-ignore` codes may be dashed, comma-separated, or on the next line, + and a markup comment applies to the next node past any text. +- `svelte-ignore` comments in legacy components are checked. +- Object, array, function, and class literals are rejected in attribute + values that mix text and mustaches. +- Each blocks without an item no longer need a key. +- `no-not-function-handler` is back as a compiler-AST rule. +- Member names written as backtick strings are resolved for + `no-implied-eval` and `no-dom-manipulating`. +- A `svelte-ignore` without a code is reported, and script `svelte-ignore` + comments are checked. +- Ignore codes are read per compile mode, including Svelte's legacy code + replacements. + ## Verification -`tests/tooling/sveltePolicy.test.ts` checks all ten forbidden examples in -TypeScript, component scripts, and inline template handlers. It also checks -valid examples, the test-file exclusion, matching diagnostics between Oxlint -and the component checker, and template policy failures. Temporary fixtures -are private and removed after the test. `tests/tooling/svelteCheck.test.ts` +`tests/tooling/sveltePolicy.test.ts` checks QuickAdd's wiring of the package. +Oxlint with `.oxlintrc.syntax.json` reports all ten forbidden examples in +TypeScript with the component checker's messages, the store, dispatcher, and +`$inspect` rules in shared `.svelte.ts` modules, and the internals guard in +every TypeScript file. Valid examples and test files pass the syntax guards. +The component checker applies the store, runes, and `no-console` settings +from `svelte-policy.json`. The package's own tests cover the policies, +including every fixture this file held before. Temporary fixtures are +private and removed after the test. `tests/tooling/svelteCheck.test.ts` requires `pnpm run check`'s command to fail on compiler warnings, legacy reactivity, and type errors, including when the native compiler cannot start. @@ -100,14 +123,11 @@ pnpm run test These refinements follow the tooling migration: -- Type the component checker against Svelte's official AST types and simplify - the scope and condition analysis. Keep the existing valid and forbidden - fixtures as upgrade checks. - Reconsider the blanket `svelte/store` ban. Stores remain supported in Svelte 5, and removing ESLint does not require banning them. - Review the retired CSS checks and decide which merit separate enforcement. - Move checks to upstream Oxlint or Svelte implementations when they cover - template expressions, reducing the code maintained here. + template expressions, reducing the code maintained in `svelte-policy`. - Remove the TypeScript 6 compatibility package when svelte-check runs on the native compiler's API and fails when that compiler cannot start. - Measure the final verification pipeline. Earlier evaluation timings predate diff --git a/tooling/oxlint-plugin.mjs b/tooling/oxlint-plugin.mjs deleted file mode 100644 index fb9d3a574..000000000 --- a/tooling/oxlint-plugin.mjs +++ /dev/null @@ -1,108 +0,0 @@ -export const guards = [ - { - "selector": "CallExpression[callee.type=\"MemberExpression\"][callee.property.name=\"createElement\"]", - "message": "Use Obsidian DOM helpers; use the owner document window for detached elements." - }, - { - "selector": "CallExpression[callee.property.name=\"createDocumentFragment\"]", - "message": "Use createFragment(), or the owner document window for a specific realm." - }, - { - "selector": "CallExpression:matches([callee.name=\"createEl\"], [callee.property.name=\"createEl\"])[arguments.0.value=/^(div|span)$/]", - "message": "Use createDiv() or createSpan() for these tags." - }, - { - "selector": "BinaryExpression[operator=\"instanceof\"][right.name=\"HTMLElement\"]", - "message": "Use node.instanceOf(HTMLElement) for cross-window checks." - }, - { - "selector": "CallExpression[callee.type=\"MemberExpression\"][callee.property.name=\"setDynamicTooltip\"]", - "message": "Slider values are shown inline; setDynamicTooltip has no effect." - }, - { - "selector": "Literal[regex.pattern=/\\(\\?<[=!]/]", - "message": "No regex lookbehind: iOS before 16.4 cannot parse it, and Obsidian runs on iOS 15.6, so QuickAdd would not load at all." - }, - { - "selector": "AssignmentExpression[left.object.type=\"MemberExpression\"][left.object.computed=false][left.object.property.name=\"style\"][right.type=\"Literal\"]", - "message": "Put a static style in styles.css; set a computed one with setCssStyles, or a CSS variable with setCssProps." - }, - { - "selector": "CallExpression[callee.property.name=\"setProperty\"][callee.object.property.name=\"style\"][arguments.1.type=\"Literal\"]", - "message": "Put a static style in styles.css; set a computed one with setCssStyles, or a CSS variable with setCssProps." - }, - { - "selector": "CallExpression[callee.property.name=\"setAttribute\"][arguments.0.value=\"style\"][arguments.1.type=\"Literal\"]", - "message": "Put a static style in styles.css; set a computed one with setCssStyles, or a CSS variable with setCssProps." - }, - { - "selector": "CallExpression[callee.property.name=/^setCss(Props|Styles)$/] > ObjectExpression > Property[key.type=\"Literal\"][key.value=/^(?!--)/]", - "message": "Put a static style in styles.css; set a computed one with setCssStyles, or a CSS variable with setCssProps." - } -]; - -export const svelteInternalGuards = [ - { - selector: ':matches(ImportDeclaration, ImportExpression, ExportNamedDeclaration, ExportAllDeclaration)[source.value=/^svelte\\/internal(\\/|$)/]', - message: "Use Svelte's public API instead of svelte/internal.", - }, -]; - -export const svelteRunesGuards = [ - { - selector: ':matches(ImportDeclaration, ImportExpression, ExportNamedDeclaration, ExportAllDeclaration)[source.value="svelte/store"]', - message: "Use Svelte runes for component state instead of legacy stores.", - }, - { - selector: 'ImportDeclaration[source.value="svelte"] > ImportSpecifier[imported.name="createEventDispatcher"]', - message: "Use callback props instead of createEventDispatcher.", - }, -]; - -export const svelteImportGuards = [...svelteInternalGuards, ...svelteRunesGuards]; - -export const svelteDebugGuards = [ - { - selector: 'CallExpression:matches([callee.name="$inspect"], [callee.object.name="$inspect"])', - message: "Remove $inspect before shipping.", - rule: "no-inspect", - severity: "warning", - }, -]; - -function createGuards(context, checks) { - return Object.fromEntries(checks.map(({ selector, message }) => [ - selector, - (node) => context.report({ node, message }), - ])); -} - -export default { - meta: { name: "quickadd" }, - rules: { - "restricted-syntax": { - meta: { type: "problem", schema: [] }, - create(context) { - return createGuards(context, guards); - }, - }, - "svelte-internal": { - meta: { type: "problem", schema: [] }, - create(context) { - return createGuards(context, svelteInternalGuards); - }, - }, - "svelte-runes": { - meta: { type: "problem", schema: [] }, - create(context) { - return createGuards(context, svelteRunesGuards); - }, - }, - "svelte-debug": { - meta: { type: "problem", schema: [] }, - create(context) { - return createGuards(context, svelteDebugGuards); - }, - }, - }, -}; diff --git a/tooling/svelte-policy.mjs b/tooling/svelte-policy.mjs deleted file mode 100644 index 0ed63304d..000000000 --- a/tooling/svelte-policy.mjs +++ /dev/null @@ -1,300 +0,0 @@ -import { readFileSync, readdirSync } from "node:fs"; -import { resolve } from "node:path"; -import { fileURLToPath } from "node:url"; -import esquery from "esquery"; -import { compile, parse } from "svelte/compiler"; -import { guards, svelteDebugGuards, svelteImportGuards } from "./oxlint-plugin.mjs"; - -const selectors = [...guards, ...svelteImportGuards, ...svelteDebugGuards].map(check => ({ - ...check, - query: esquery.parse(check.selector), -})); -const domMethods = new Set([ - "appendChild", "insertBefore", "normalize", "removeChild", "replaceChild", - "after", "append", "before", "insertAdjacentElement", "insertAdjacentHTML", - "insertAdjacentText", "prepend", "remove", "replaceChildren", "replaceWith", -]); -const domProperties = new Set(["textContent", "innerHTML", "outerHTML", "innerText", "outerText"]); -const timerFunctions = new Set(["setTimeout", "setInterval", "execScript"]); -const globalObjects = new Set(["window", "globalThis", "self", "global"]); -const specialElements = new Set(["head", "body", "window", "document", "element", "options"]); -const ignoredKeys = new Set(["loc", "name_loc", "metadata", "css"]); -const functionTypes = new Set(["FunctionExpression", "FunctionDeclaration", "ArrowFunctionExpression"]); -const hoistedBindings = new WeakMap(); - -function walk(node, visit, ancestors = []) { - if (!node || typeof node !== "object") return; - if (Array.isArray(node)) { - for (const item of node) walk(item, visit, ancestors); - return; - } - if (typeof node.type !== "string") return; - if (visit(node, ancestors) === false) return; - for (const [key, child] of Object.entries(node)) { - if (!ignoredKeys.has(key)) walk(child, visit, [node, ...ancestors]); - } -} - -function patternNames(node) { - if (!node) return []; - switch (node.type) { - case "Identifier": return [node.name]; - case "RestElement": - case "SpreadElement": return patternNames(node.argument); - case "AssignmentPattern": return patternNames(node.left); - case "ArrayPattern": - case "ArrayExpression": return node.elements.flatMap(patternNames); - case "ObjectPattern": - case "ObjectExpression": return node.properties.flatMap(property => patternNames(["RestElement", "SpreadElement"].includes(property.type) ? property.argument : property.value)); - default: return []; - } -} - -function references(node) { - const names = new Set(); - walk(node, (child, ancestors) => { - const [parent] = ancestors; - if (child.type !== "Identifier") return; - if (["FunctionExpression", "ClassExpression"].includes(parent?.type) && parent.id === child) return; - if (parent?.type === "MemberExpression" && parent.property === child && !parent.computed) return; - if (parent?.type === "Property" && parent.key === child && !parent.computed && !parent.shorthand) return; - if (isShadowed(child.name, ancestors)) return; - names.add(child.name); - }); - return names; -} - -function declaresName(statement, name) { - const declaration = statement.declaration ?? statement; - switch (declaration.type) { - case "VariableDeclaration": return declaration.kind !== "var" && declaration.declarations.some(item => patternNames(item.id).includes(name)); - case "FunctionDeclaration": - case "ClassDeclaration": return declaration.id?.name === name; - case "ImportDeclaration": return declaration.specifiers.some(item => item.local.name === name); - case "SnippetBlock": return declaration.expression.name === name; - default: return false; - } -} - -function hoistedVarNames(scope) { - if (hoistedBindings.has(scope)) return hoistedBindings.get(scope); - const names = new Set(); - walk(scope, node => { - if (node !== scope && (functionTypes.has(node.type) || ["ClassExpression", "ClassDeclaration", "StaticBlock"].includes(node.type))) return false; - if (node.type === "VariableDeclaration" && node.kind === "var") { - for (const declaration of node.declarations) { - for (const name of patternNames(declaration.id)) names.add(name); - } - } - }); - hoistedBindings.set(scope, names); - return names; -} - -function bindingScope(name, ancestors) { - for (const ancestor of ancestors) { - if (["FunctionExpression", "ClassExpression"].includes(ancestor.type) && ancestor.id?.name === name) return ancestor; - if (ancestor.params?.some(param => patternNames(param).includes(name))) return ancestor; - if (functionTypes.has(ancestor.type) && ancestors.includes(ancestor.body) && hoistedVarNames(ancestor.body).has(name)) return ancestor; - if (ancestor.type === "CatchClause" && patternNames(ancestor.param).includes(name)) return ancestor; - if (ancestor.type === "EachBlock" && (ancestors.includes(ancestor.body) || ancestors.includes(ancestor.key)) - && (ancestor.index === name || patternNames(ancestor.context).includes(name))) return ancestor; - if (ancestor.type === "SnippetBlock" && ancestor.parameters.some(param => patternNames(param).includes(name))) return ancestor; - if (ancestor.type === "AwaitBlock" && ancestors.includes(ancestor.then) && patternNames(ancestor.value).includes(name)) return ancestor.then; - if (ancestor.type === "AwaitBlock" && ancestors.includes(ancestor.catch) && patternNames(ancestor.error).includes(name)) return ancestor.catch; - if (ancestors.includes(ancestor.fragment) && ancestor.attributes?.some(attribute => attribute.type === "LetDirective" - && (attribute.expression ? patternNames(attribute.expression).includes(name) : attribute.name === name))) return ancestor.fragment; - if (ancestor.type === "SwitchStatement" && ancestors.some(child => ancestor.cases.includes(child)) - && ancestor.cases.some(branch => branch.consequent.some(statement => declaresName(statement, name)))) return ancestor; - if (["ForStatement", "ForInStatement", "ForOfStatement"].includes(ancestor.type)) { - const declaration = ancestor.init ?? ancestor.left; - if (declaration?.type === "VariableDeclaration" && declaresName(declaration, name)) return ancestor; - } - if (["BlockStatement", "Program", "StaticBlock"].includes(ancestor.type) && ancestor.body.some(statement => declaresName(statement, name))) return ancestor; - if (["Program", "StaticBlock"].includes(ancestor.type) && hoistedVarNames(ancestor).has(name)) return ancestor; - if (ancestor.type === "Fragment" && ancestor.nodes.some(statement => declaresName(statement, name))) return ancestor; - } - return undefined; -} - -function isShadowed(name, ancestors) { - return bindingScope(name, ancestors) !== undefined; -} - -function propertyName(node) { - return node?.computed ? node.property?.value : node?.property?.name; -} - -function globalIdentifier(node, ancestors) { - return node.type === "Identifier" && !isShadowed(node.name, ancestors); -} - -function globalTimer(callee, ancestors) { - if (callee.type === "Identifier") return timerFunctions.has(callee.name) && globalIdentifier(callee, ancestors); - return callee.type === "MemberExpression" && globalObjects.has(callee.object.name) - && globalIdentifier(callee.object, ancestors) && timerFunctions.has(propertyName(callee)); -} - -function fingerprint(node) { - return JSON.stringify(node, (name, value) => { - if (["start", "end", "loc", "raw"].includes(name)) return undefined; - return typeof value === "bigint" ? { bigint: value.toString() } : value; - }); -} - -function conditionFingerprint(node) { - if (node?.type === "LogicalExpression" && ["&&", "||"].includes(node.operator)) { - return `${node.operator}:${[conditionFingerprint(node.left), conditionFingerprint(node.right)].sort().join(":")}`; - } - return fingerprint(node); -} - -function splitCondition(node, operator) { - return node.type === "LogicalExpression" && node.operator === operator - ? [...splitCondition(node.left, operator), ...splitCondition(node.right, operator)] - : [node]; -} - -function stableCondition(node) { - switch (node.type) { - case "Identifier": - case "Literal": return true; - case "UnaryExpression": return node.operator === "!" && stableCondition(node.argument); - case "LogicalExpression": return ["&&", "||"].includes(node.operator) && stableCondition(node.left) && stableCondition(node.right); - case "BinaryExpression": return ["===", "!=="].includes(node.operator) && stableCondition(node.left) && stableCondition(node.right); - default: return false; - } -} - -function coveredCondition(node, ancestors) { - let current = node; - const previous = []; - for (let index = 0; index < ancestors.length; index += 2) { - const [fragment, block] = ancestors.slice(index, index + 2); - if (!current.elseif || fragment?.type !== "Fragment" || block?.type !== "IfBlock" || block.alternate !== fragment) break; - previous.push(block.test); - current = block; - } - if (![node.test, ...previous].every(stableCondition)) return false; - const candidates = node.test.type === "LogicalExpression" && node.test.operator === "&&" - ? [...splitCondition(node.test, "&&"), node.test] : [node.test]; - return candidates.some(candidate => { - let terms = splitCondition(candidate, "||").map(term => splitCondition(term, "&&").map(conditionFingerprint)); - for (const condition of previous) { - const priorTerms = splitCondition(condition, "||").map(term => splitCondition(term, "&&").map(conditionFingerprint)); - terms = terms.filter(term => !priorTerms.some(prior => prior.every(part => term.includes(part)))); - } - return terms.length === 0; - }); -} - -function checkIgnores(ast, source, filename, report) { - const directives = []; - walk(ast.fragment, (node, [parent]) => { - if (node.type !== "Comment" || !node.data.trim().startsWith("svelte-ignore ")) return; - const index = parent.nodes.indexOf(node); - const target = parent.nodes.slice(index + 1).find(item => item.type !== "Comment" && !(item.type === "Text" && !item.data.trim())); - const codes = node.data.trim().slice("svelte-ignore ".length).split("(")[0].match(/[a-z][a-z_0-9]*/g) ?? []; - directives.push({ node, target, codes }); - }); - if (!directives.length) return; - let unignored = source; - for (const { node } of [...directives].reverse()) { - unignored = unignored.slice(0, node.start) + source.slice(node.start, node.end).replace(/[^\n]/g, " ") + unignored.slice(node.end); - } - let warnings; - try { - warnings = compile(unignored, { filename, runes: true, generate: false }).warnings; - } catch { - // Strict svelte-check reports compiler errors before suppression checks can run. - return; - } - for (const { node, target, codes } of directives) { - for (const code of codes) { - if (!target || !warnings.some(warning => warning.code === code && warning.start.character >= target.start && warning.start.character < target.end)) report(node, "no-unused-svelte-ignore", `Remove the unused svelte-ignore for ${code}.`); - } - } -} - -export function checkSvelte(source, filename = "Component.svelte") { - const diagnostics = []; - function report(node, rule, message, severity = "error") { - const offset = node.start ?? 0; - const before = source.slice(0, offset); - diagnostics.push({ filename, line: before.split("\n").length, column: offset - before.lastIndexOf("\n"), rule, message, severity }); - } - let ast; - try { - ast = parse(source, { modern: true, filename }); - } catch (error) { - report({ start: error.position?.[0] }, error.code ?? "parse", error.message); - return diagnostics; - } - checkIgnores(ast, source, filename, report); - const componentScopes = [ast.instance?.content, ast.module?.content].filter(Boolean); - const boundElements = new Map(); - walk(ast.fragment, (node, ancestors) => { - if (!["RegularElement", "SvelteElement"].includes(node.type)) return; - for (const attribute of node.attributes) { - if (attribute.type !== "BindDirective" || attribute.name !== "this" || attribute.expression?.type !== "Identifier") continue; - const name = attribute.expression.name; - const scopes = boundElements.get(name) ?? new Set(); - scopes.add(bindingScope(name, [node, ...ancestors, ...componentScopes])); - boundElements.set(name, scopes); - } - }); - walk(ast, (node, ancestors) => { - const [parent] = ancestors; - const globalScopes = ancestors.includes(ast.module?.content) ? [node, ...ancestors] : [node, ...ancestors, ...componentScopes]; - for (const check of selectors) { - if (esquery.matches(node, check.query, ancestors, { fallback: "iteration" })) report(node, check.rule ?? "restricted-syntax", check.message, check.severity ?? "error"); - } - if (node.type === "HtmlTag") report(node, "no-at-html-tags", "Render text or a Svelte component instead of raw HTML."); - if (node.type === "DebugTag") report(node, "no-at-debug-tags", "Remove debugging tags before shipping.", "warning"); - if (node.type === "LabeledStatement" && node.label.name === "$") report(node, "runes-only", "Use $derived or $effect instead of legacy $: statements."); - if (node.type === "EachBlock") { - if (!node.key) report(node, "require-each-key", "Give each block a stable key."); - else { - const names = [...patternNames(node.context), node.index]; - if (!names.some(name => references(node.key).has(name))) report(node.key, "valid-each-key", "The key must reference this block's item or index."); - } - } - if (node.type === "IfBlock" && node.elseif && coveredCondition(node, ancestors)) report(node.test, "no-dupe-else-if-blocks", "This condition is already covered by an earlier branch."); - if (node.type === "ExpressionTag" && parent?.type === "Fragment" && ["ObjectExpression", "ArrayExpression", "ArrowFunctionExpression", "FunctionExpression", "ClassExpression"].includes(node.expression.type)) report(node, "no-object-in-text-mustaches", "Interpolate a display value instead of an object or function."); - if (node.type === "RegularElement" && specialElements.has(node.name)) report(node, "no-raw-special-elements", `Use for this special element.`); - if (node.attributes) { - const directives = new Set(); - for (const attribute of node.attributes) { - if (!["OnDirective", "UseDirective"].includes(attribute.type)) continue; - const key = `${attribute.type}:${attribute.name}:${[...(attribute.modifiers ?? [])].sort().join(",")}:${fingerprint(attribute.expression)}`; - if (directives.has(key)) report(attribute, "no-dupe-directives", "Remove the duplicate event or action directive."); - directives.add(key); - } - } - if (node.type === "MemberExpression" && node.object.type === "Identifier" && boundElements.get(node.object.name)?.has(bindingScope(node.object.name, globalScopes))) { - const name = propertyName(node); - const target = parent?.type === "ChainExpression" ? ancestors[1] : parent; - const callee = parent?.type === "ChainExpression" ? parent : node; - if (target?.type === "CallExpression" && target.callee === callee && domMethods.has(name) || target?.type === "AssignmentExpression" && target.left === node && domProperties.has(name)) report(node, "no-dom-manipulating", "Let Svelte update bound elements instead of changing their DOM structure or text directly."); - } - if (node.type === "MemberExpression" && node.object.name === "console" && globalIdentifier(node.object, globalScopes) && !["warn", "error"].includes(propertyName(node))) report(node, "no-console", "Use the logger utilities instead of console methods."); - if (["CallExpression", "NewExpression"].includes(node.type) && node.callee.name === "Function" && globalIdentifier(node.callee, globalScopes)) report(node, "no-new-func", "Do not construct code from strings."); - if (node.type === "CallExpression" && globalTimer(node.callee, globalScopes) && (typeof node.arguments[0]?.value === "string" || node.arguments[0]?.type === "TemplateLiteral")) report(node, "no-implied-eval", "Pass a callback instead of a code string."); - }); - return diagnostics; -} - -function componentFiles(directory) { - return readdirSync(directory, { withFileTypes: true }).flatMap(entry => { - const path = resolve(directory, entry.name); - return entry.isDirectory() ? componentFiles(path) : path.endsWith(".svelte") ? [path] : []; - }).sort(); -} - -if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { - const diagnostics = componentFiles("src").flatMap(filename => checkSvelte(readFileSync(filename, "utf8"), filename)); - for (const diagnostic of diagnostics) console.log(`${diagnostic.filename}:${diagnostic.line}:${diagnostic.column} ${diagnostic.severity} ${diagnostic.rule}: ${diagnostic.message}`); - const errors = diagnostics.filter(item => item.severity === "error").length; - console.log(`Svelte policies: ${errors} errors, ${diagnostics.length - errors} warnings.`); - process.exitCode = errors ? 1 : 0; -} From 4cc21004b84bb72e29ef47246421f0f6c2f8db19 Mon Sep 17 00:00:00 2001 From: Christian Bager Bach Houmann Date: Mon, 12 Oct 2026 20:58:42 +0200 Subject: [PATCH 3/3] build(deps-dev): repack svelte-policy at 32f1402 after verifier fixes --- pnpm-lock.yaml | 2 +- vendor/svelte-policy-0.0.0.tgz | Bin 37828 -> 38658 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0bb585d29..521635bcd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1753,7 +1753,7 @@ packages: svelte: '>=3.23.0 || ^5.0.0-next.0' svelte-policy@file:vendor/svelte-policy-0.0.0.tgz: - resolution: {integrity: sha512-pqoy5qcA1xkll8sJArpphB5lTaUbA8gguOHVTW/A2TGnqAPQipmlKPBT4pMBN5KftPRGeUbLPiM59RzpbQzp+A==, tarball: file:vendor/svelte-policy-0.0.0.tgz} + resolution: {integrity: sha512-sPvcsIxz/dynvf9gaWiUPvRb+qXDD7Gc9wq9xhzWWyebz2olRgSMuZObMkenhYQFpWF3RDETPWUoTi8md8vdJQ==, tarball: file:vendor/svelte-policy-0.0.0.tgz} version: 0.0.0 engines: {node: ^20.19.0 || >=22.12.0} hasBin: true diff --git a/vendor/svelte-policy-0.0.0.tgz b/vendor/svelte-policy-0.0.0.tgz index af93aa41abcacf1f1c31fa639c18cd443a357130..4c0f2f8f7235c2ddae5761b173a5b05ce1c616d3 100644 GIT binary patch literal 38658 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 z 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
do! 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

}Z19LWY1|@Ec1E}_CaHmqaC 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 z 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 shon+@