Files
flowdeck/eslint.config.mjs
T
bruno 6ff88237fc
FlowDeck CI / lint (push) Successful in 1m56s
FlowDeck CI / test (push) Successful in 15m32s
FlowDeck CI / docker (push) Successful in 1m51s
feat: A20 phase 3 LOT 1 — shell + library migres, harnais csp_preview vert (v7.38.0)
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)
2026-10-02 12:08:18 -04:00

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",
},
},
];