Ajout : - e2e/csp_preview.spec.js — apercu CSP strict SANS deployer : le build officiel @alpinejs/csp (e2e/fixtures/alpine.csp.js, 0 eval) est servi a la place de alpine.min.js par interception Playwright ; toute expression que le parseur maison ne digere pas = pageerror (filet). Premiere surface VERTE : library (composant lie, icones SVG via Alpine.effect, recherche ouverte + focalisee, 0 erreur). Changed : - 16 composants x-data="fn()" enregistres via Alpine.data (registre = seule resolution du build CSP, probe « Undefined variable » ; scripts classiques executes pendant le parsing => alpine:init toujours joint) : appState, libraryPage, workspacesPage, editorState, board x4, settings/import/table_view/team_load/trash/workspace/welcome/accounts/ card_detail. - base.html (shell) migre : x-effect document.* -> syncSidebarClass(), $nextTick(arrow) -> initSidebarSort(), window.FlowDeck.* -> fdCreatePage/fdCreateFolder/fdGwRefresh, Object.keys/Math.min/ window.innerWidth dans x-for et :style -> sidebarSections()/ sectionMenuPos() — tout = simple appel de methode. - x-html restants du shell -> x-init + Alpine.effect : icone agent, carte projet, library x3 ; recherche library -> toggleSearch() (Alpine.nextTick) ; openMoveSelected() pour Object.keys en expression. - eslint : 70 warnings -> 0/0 (globals getCsrf depuis A38 ph1, /* exported openCardDetail */ + /* global owner, repo */, 3 ;; residuels). suite **1093/1093** · ruff OK · eslint 0/0 · E2E 3/3 (csp_preview + smoke x2) · docs a jour (ROADMAP ph3 LOT 1, CHANGELOG, WORKLOAD, VERSION)
69 lines
3.1 KiB
JavaScript
69 lines
3.1 KiB
JavaScript
// FlowDeck — ESLint flat config (v5.2.0).
|
|
// ESLint v9+ requires the flat config format; the legacy `.eslintrc.json`
|
|
// is no longer read. Run with: `npx eslint static/js`.
|
|
//
|
|
// Self-contained on purpose: no dependency on the `globals` npm package so the
|
|
// config works with a globally-installed ESLint (no node_modules required).
|
|
|
|
const browserGlobals = {
|
|
// Browser / DOM
|
|
window: "readonly", document: "readonly", navigator: "readonly",
|
|
location: "readonly", history: "readonly", screen: "readonly",
|
|
localStorage: "readonly", sessionStorage: "readonly", console: "readonly",
|
|
alert: "readonly", confirm: "readonly", prompt: "readonly", fetch: "readonly",
|
|
setTimeout: "readonly", clearTimeout: "readonly", setInterval: "readonly",
|
|
clearInterval: "readonly", requestAnimationFrame: "readonly",
|
|
cancelAnimationFrame: "readonly", requestIdleCallback: "readonly",
|
|
cancelIdleCallback: "readonly", queueMicrotask: "readonly",
|
|
XMLHttpRequest: "readonly", FormData: "readonly", Blob: "readonly",
|
|
File: "readonly", FileReader: "readonly", URL: "readonly",
|
|
URLSearchParams: "readonly", Image: "readonly", Event: "readonly",
|
|
CustomEvent: "readonly", EventSource: "readonly", WebSocket: "readonly",
|
|
DOMParser: "readonly", Node: "readonly", NodeList: "readonly",
|
|
Element: "readonly", HTMLElement: "readonly", getComputedStyle: "readonly",
|
|
matchMedia: "readonly", IntersectionObserver: "readonly",
|
|
MutationObserver: "readonly", ResizeObserver: "readonly",
|
|
performance: "readonly", crypto: "readonly", btoa: "readonly",
|
|
atob: "readonly", structuredClone: "readonly",
|
|
// ECMAScript built-ins
|
|
JSON: "readonly", Math: "readonly", Date: "readonly", Promise: "readonly",
|
|
Object: "readonly", Array: "readonly", String: "readonly", Number: "readonly",
|
|
Boolean: "readonly", Symbol: "readonly", Map: "readonly", Set: "readonly",
|
|
WeakMap: "readonly", WeakSet: "readonly", Error: "readonly",
|
|
TypeError: "readonly", RangeError: "readonly", RegExp: "readonly",
|
|
Proxy: "readonly", Reflect: "readonly", Intl: "readonly",
|
|
parseInt: "readonly", parseFloat: "readonly", isNaN: "readonly",
|
|
isFinite: "readonly", encodeURIComponent: "readonly",
|
|
decodeURIComponent: "readonly", encodeURI: "readonly", decodeURI: "readonly",
|
|
globalThis: "readonly", Infinity: "readonly", NaN: "readonly",
|
|
// FlowDeck front-end libraries
|
|
Alpine: "readonly", htmx: "readonly", Sortable: "readonly",
|
|
// Globals exposed on window by app.js
|
|
openModal: "readonly", closeModal: "readonly",
|
|
// getCsrf : helper unique posé dans le <head> de base.html (A38 phase 1)
|
|
getCsrf: "readonly",
|
|
// getSvgIcon : script inline de base.html (nonce) ; Prism : CDN des vues ;
|
|
// TextDecoder : API navigateur (ES2015)
|
|
getSvgIcon: "readonly", Prism: "readonly", TextDecoder: "readonly",
|
|
};
|
|
|
|
export default [
|
|
{
|
|
ignores: ["static/js/*.min.js", "static/js/vendor/**"],
|
|
},
|
|
{
|
|
files: ["static/js/**/*.js"],
|
|
languageOptions: {
|
|
ecmaVersion: 2022,
|
|
sourceType: "script",
|
|
globals: browserGlobals,
|
|
},
|
|
rules: {
|
|
"no-unused-vars": ["warn", { args: "none" }],
|
|
"no-undef": "warn",
|
|
"no-extra-semi": "warn",
|
|
"no-empty": "warn",
|
|
},
|
|
},
|
|
];
|