μž‘κ°€:
    생성:2026-08-12λ§ˆμ§€λ§‰ μ—…λ°μ΄νŠΈ:2026-09-27

    ESLint x OXLint ν”ŒλŸ¬κ·ΈμΈ

    eslint-plugin-intlayerλŠ” TypeScriptκ°€ κ°μ§€ν•˜μ§€ λͺ»ν•˜λŠ” i18n μ‹€μˆ˜λ₯Ό μž‘μ•„λƒ…λ‹ˆλ‹€:

    1. 사전에 λ“±λ‘λ˜μ§€ μ•Šμ€ ν•˜λ“œμ½”λ”©λœ ν…μŠ€νŠΈ.
    2. νƒ€μž… 검사λ₯Ό ν†΅κ³Όν•˜κ³  μ‹€ν–‰λ˜μ§€λ§Œ Intlayer μ»΄νŒŒμΌλŸ¬κ°€ μ΅œμ ν™”ν•  수 μ—†λŠ” 동적 호좜.
    3. λ―Έμ‚¬μš© μ½˜ν…μΈ (Dead content): ν”„λ‘œμ νŠΈ λ‚΄μ—μ„œ 아무 κ³³μ—μ„œλ„ 읽지 μ•ŠλŠ” 사전 및 ν•„λ“œ(선택 사항).

    μ•Œ 수 μ—†λŠ” 사전 ν‚€, μ•Œ 수 μ—†λŠ” ν•„λ“œ 경둜 및 λˆ„λ½λœ λ‘œμΌ€μΌμ€ 이미 컴파일 μ—λŸ¬λ‘œ μ²˜λ¦¬λ˜λ―€λ‘œ ν”ŒλŸ¬κ·ΈμΈμ€ 이λ₯Ό 쀑볡 λ³΄κ³ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

    μ„€μΉ˜

    bash
    npm install --save-dev eslint-plugin-intlayer
    

    ESLint 9 이상(Flat config)이 ν•„μš”ν•©λ‹ˆλ‹€. ESLint 10을 μ§€μ›ν•©λ‹ˆλ‹€.

    μ‚¬μš©λ²•

    이 ν”ŒλŸ¬κ·ΈμΈμ€ ESLint와 oxlint λͺ¨λ‘μ—μ„œ λ™μΌν•œ κ·œμΉ™κ³Ό μ˜΅μ…˜μœΌλ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€.

    eslint.config.mjs
    import intlayer from "eslint-plugin-intlayer";
    
    export default [...intlayer.configs.recommended];
    

    λ˜λŠ” 섀정을 펼친 λ’€ 심각도λ₯Ό 직접 μ§€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

    eslint.config.mjs
    import intlayer from "eslint-plugin-intlayer";
    
    export default [
      ...intlayer.configs.recommended,
      {
        rules: {
          "intlayer/no-raw-text": "warn",
          "intlayer/static-dictionary-key": "error",
          "intlayer/no-dynamic-field-access": "error",
          "intlayer/enforce-adapter-import": "warn",
          "intlayer/no-unused-content": "warn",
        },
      },
    ];
    
    .oxlintrc.json
    {
      "jsPlugins": ["eslint-plugin-intlayer"],
      "rules": {
        "intlayer/no-raw-text": "warn",
        "intlayer/static-dictionary-key": "error",
        "intlayer/no-dynamic-field-access": "error",
        "intlayer/enforce-adapter-import": "warn"
      }
    }
    

    두 κ°€μ§€ 주의 사항: oxlint의 JS ν”ŒλŸ¬κ·ΈμΈ 지원은 아직 μ•ŒνŒŒ 단계이며, μ»€μŠ€ν…€ νŒŒμ„œλ₯Ό μ§€μ›ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ .vue, .svelte, .astro 및 Angular ν…œν”Œλ¦Ώμ€ oxlintμ—μ„œ λ¦°νŠΈλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. JS/TS/JSX νŒŒμΌμ—λŠ” oxlintλ₯Ό μ‚¬μš©ν•˜κ³  λ‚˜λ¨Έμ§€λŠ” ESLintλ₯Ό 계속 μ‚¬μš©ν•˜μ„Έμš”.

    no-unused-contentλŠ” μœ„μ—μ„œ μ˜λ„μ μœΌλ‘œ μ œμ™Έλ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이 κ·œμΉ™μ€ κ·œμΉ™ μ»¨ν…μŠ€νŠΈμ—μ„œ μž‘μ—… 디렉터리와 린트 λŒ€μƒ 파일 경둜λ₯Ό ν•„μš”λ‘œ ν•˜μ§€λ§Œ, μ•ŒνŒŒ λ‹¨κ³„μ˜ JS ν”ŒλŸ¬κ·ΈμΈ λΈŒλ¦¬μ§€μ—μ„œλŠ” 이λ₯Ό 보μž₯ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€. 이 κ·œμΉ™μ€ ESLintμ—μ„œ μ‹€ν–‰ν•˜μ„Έμš”.

    μ„€μ • (Configs)

    μ„€μ •no-raw-textstatic-dictionary-keyno-dynamic-field-accessenforce-adapter-importno-unused-content
    recommendedwarnerrorerroroffoff
    stricterror (+ λΉ„ JSX λ¦¬ν„°λŸ΄)errorerrorerroroff
    contract-onlyofferrorerroroffoff

    recommendedλŠ” μ˜λ„μ μœΌλ‘œ no-raw-textλ₯Ό warn으둜 μœ μ§€ν•©λ‹ˆλ‹€. κΈ°μ‘΄ μ½”λ“œλ² μ΄μŠ€μ— μ μš©ν–ˆμ„ λ•Œ λ²ˆμ—­λ˜μ§€ μ•Šμ€ λͺ¨λ“  λ¬Έμžμ—΄μ΄ ν•œ λ²ˆμ— λ³΄κ³ λ˜μ–΄ 첫날뢀터 λΉŒλ“œκ°€ μ€‘λ‹¨λ˜λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•¨μž…λ‹ˆλ‹€.

    enforce-adapter-importλŠ” 기본적으둜 κΊΌμ Έ μžˆμŠ΅λ‹ˆλ‹€. ν•„μš”ν•œ 경우 λͺ…μ‹œμ μœΌλ‘œ ν™œμ„±ν™”ν•˜μ„Έμš”.

    no-unused-contentλŠ” strictλ₯Ό ν¬ν•¨ν•œ λͺ¨λ“  사전 μ„€μ •μ—μ„œ κΊΌμ Έ μžˆμŠ΅λ‹ˆλ‹€. 이 κ·œμΉ™μ€ Intlayer 섀정을 읽고 λ””μŠ€ν¬μ˜ μ†ŒμŠ€ νŒŒμΌμ„ 직접 μˆœνšŒν•˜λ―€λ‘œ, 사전 섀정에 μ˜ν•΄ μžλ™μœΌλ‘œ μΌœμ§€κΈ°λ³΄λ‹€λŠ” μ‹ μ€‘ν•œ 선택에 따라 ν™œμ„±ν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€.

    κ·œμΉ™

    no-raw-text

    사전에 μ„ μ–Έλ˜μ§€ μ•Šμ€ μ‚¬μš©μž λŒ€λ©΄ ν…μŠ€νŠΈλ₯Ό λ³΄κ³ ν•©λ‹ˆλ‹€. intlayer extract와 λ™μΌν•œ 감지 방식을 μ‚¬μš©ν•˜λ―€λ‘œ λΈŒλžœλ“œ 이름, CSS 클래슀 및 기술적 μ‹λ³„μžλŠ” λ¬΄μ‹œλ©λ‹ˆλ‹€.

    jsx
    // βœ— 보고됨
    <h1>Welcome to our documentation</h1>
    <input placeholder="Enter your email address" />
    
    // βœ“ 정상
    const { title } = useIntlayer("home");
    <h1>{title}</h1>
    

    μ½˜ν…μΈ  μ„ μ–Έ 파일(*.content.ts, …)은 μ œμ™Έλ©λ‹ˆλ‹€.

    파일 전체λ₯Ό ν•œ λ²ˆμ— μˆ˜μ •ν•˜λ €λ©΄ npx intlayer extractλ₯Ό μ‹€ν–‰ν•˜μ—¬ μ»΄νŒŒμΌλŸ¬κ°€ λ¬Έμžμ—΄μ„ μ‚¬μ „μœΌλ‘œ μ΄λ™ν•˜λ„λ‘ ν•˜μ„Έμš”.

    μ˜΅μ…˜

    eslint.config.mjs
    {
      "intlayer/no-raw-text": [
        "warn",
        {
          // μ‚¬μš©μž λŒ€λ©΄ ν…μŠ€νŠΈκ°€ 값인 속성
          // κΈ°λ³Έκ°’: title, placeholder, alt, aria-label, label
          attributes: ["title", "placeholder", "alt", "aria-label", "label"],
    
          // μ½˜ν…μΈ κ°€ μ‚¬μš©μž λŒ€λ©΄ ν…μŠ€νŠΈκ°€ μ•„λ‹Œ μš”μ†Œ
          // κΈ°λ³Έκ°’: code, pre, script, style
          ignoreElements: ["code", "pre", "script", "style"],
    
          // λ³΄κ³ ν•˜μ§€ μ•Šμ„ ν…μŠ€νŠΈμ˜ μ •κ·œμ‹
          ignorePatterns: ["^Powered by"],
    
          // λ§ˆν¬μ—… μ™ΈλΆ€μ˜ λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄λ„ 보고할지 μ—¬λΆ€. κΈ°λ³Έκ°’: false
          includeStringLiterals: false,
        },
      ],
    }
    

    static-dictionary-key

    사전 ν‚€κ°€ λ°˜λ“œμ‹œ λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€.

    μ»΄νŒŒμΌλŸ¬λŠ” 호좜 μœ„μΉ˜μ—μ„œ ν‚€λ₯Ό 직접 읽을 수 μžˆμ„ λ•Œλ§Œ 사전을 사전 λ‘œλ“œ(pre-load)ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ³„μ‚°λœ ν‚€λ₯Ό μ‚¬μš©ν•˜λ©΄ μ΅œμ ν™”λ₯Ό μžλ™μœΌλ‘œ κ±΄λ„ˆλ›°κ³  λͺ¨λ“  사전을 λ²ˆλ“€μ— ν¬ν•¨ν•©λ‹ˆλ‹€.

    typescript
    // βœ— 보고됨
    useIntlayer(dictionaryKey);
    useIntlayer(`home-${suffix}`);
    getTranslations({ namespace: page });
    
    // βœ— λ³€μˆ˜λŠ” λ¦¬ν„°λŸ΄μ΄ μ•„λ‹™λ‹ˆλ‹€
    const key = "home";
    useIntlayer(key);
    
    // βœ“ 정상
    useIntlayer("home");
    getTranslations({ namespace: "home" });
    

    μ΄λŠ” useIntlayer, getIntlayer 및 λͺ¨λ“  ν˜Έν™˜ μ–΄λŒ‘ν„°(useTranslation, useTranslations, formatMessage, <FormattedMessage id>, <Trans i18nKey>, …)에 μ μš©λ©λ‹ˆλ‹€.

    no-dynamic-field-access

    μ‚¬μ „μ—μ„œ μ½λŠ” ν•„λ“œκ°€ μ •μ μœΌλ‘œ μ•Œλ €μ Έ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

    μ»΄νŒŒμΌλŸ¬λŠ” μ‚¬μš©λ˜μ§€ μ•ŠλŠ” κ²ƒμœΌλ‘œ νŒλ‹¨λ˜λŠ” ν•„λ“œλ₯Ό μ œκ±°ν•©λ‹ˆλ‹€. 동적 접근은 μ»΄νŒŒμΌλŸ¬κ°€ 감지할 수 μ—†μœΌλ―€λ‘œ λŸ°νƒ€μž„μ— 읽기 μž‘μ—…μ΄ undefinedλ₯Ό λ°˜ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    typescript
    // βœ— 보고됨
    const content = useIntlayer("home");
    content[fieldName];
    
    const t = useTranslations("home");
    t(messageKey);
    
    // βœ“ 정상
    content.title;
    content["title"];
    content.items[0];
    t("hero.title");
    

    enforce-adapter-import

    원본 νŒ¨ν‚€μ§€ λŒ€μ‹  @intlayer/* ν˜Έν™˜ μ–΄λŒ‘ν„°μ˜ μ‚¬μš©μ„ ꢌμž₯ν•©λ‹ˆλ‹€. 원본 νŒ¨ν‚€μ§€λŠ” λ²ˆλ“€λŸ¬ 별칭이 μ„€μ •λœ κ²½μš°μ—λ§Œ Intlayer둜 ν™•μΈλ˜μ§€λ§Œ, μ–΄λŒ‘ν„°λŠ” 항상 ν™•μΈλ©λ‹ˆλ‹€. --fix둜 μžλ™ μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    typescript
    // βœ— 보고됨
    import { useTranslation } from "react-i18next";
    import { getTranslations } from "next-intl/server";
    
    // βœ“ 정상
    import { useTranslation } from "@intlayer/react-i18next";
    import { getTranslations } from "@intlayer/next-intl/server";
    

    no-unused-content

    기본적으둜 κΊΌμ Έ μžˆμŠ΅λ‹ˆλ‹€. ν”„λ‘œμ νŠΈ λ‚΄μ—μ„œ 아무 κ³³μ—μ„œλ„ 읽지 μ•ŠλŠ” μ½˜ν…μΈ μ™€ μ—¬λŸ¬ μœ„μΉ˜μ—μ„œ μ„ μ–Έλœ 사전 ν‚€λ₯Ό λ³΄κ³ ν•©λ‹ˆλ‹€.

    src/home.content.ts
    export default {
      key: "home", // βœ— ν”„λ‘œμ νŠΈ λ‚΄ μ–΄λ–€ ν˜ΈμΆœμžλ„ "home"을 μš”μ²­ν•˜μ§€ μ•Šμ„ λ•Œ 보고됨
      content: {
        title: t({ ko: "제λͺ©", en: "Title" }),
    
        // βœ— `hero`λ₯Ό μ½λŠ” 곳이 없을 λ•Œ 보고됨
        hero: {
          subtitle: t({ ko: "μ†Œμ œλͺ©", en: "Subtitle" }),
        },
      },
    };
    

    λ‹€λ₯Έ κ·œμΉ™κ³Ό 달리 이 κ·œμΉ™μ€ ν˜„μž¬ 파일 ν•˜λ‚˜λ§ŒμœΌλ‘œ νŒλ‹¨ν•  수 μ—†μŠ΅λ‹ˆλ‹€. ν•„λ“œ μ‚¬μš© μ—¬λΆ€λŠ” 전체 ν”„λ‘œμ νŠΈμ™€μ˜ κ΄€κ³„μ—μ„œλ§Œ νŒŒμ•…ν•  수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. 린트 μ‹€ν–‰ μ‹œ 첫 번째 μ½˜ν…μΈ  선언을 λ§Œλ‚¬μ„ λ•Œ Intlayer 섀정을 λ‘œλ“œν•˜κ³ , ν•΄λ‹Ή 섀정에 μ„ μ–Έλœ μ†ŒμŠ€ 파일(build.traversePattern, compiler.transformPattern)을 μˆ˜μ§‘ν•œ ν›„ @intlayer/lsp 및 VS Code ν™•μž₯의 "λ―Έμ‚¬μš©" μ·¨μ†Œμ„ μ„ μ§€μ›ν•˜λŠ” λ™μΌν•œ μ‚¬μš©λŸ‰ 뢄석기λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€. κ²°κ³ΌλŠ” cacheTtl λ°€λ¦¬μ΄ˆ λ™μ•ˆ μΊμ‹œλ˜λ―€λ‘œ νŒŒμΌλ§ˆλ‹€ κ²€μ‚¬ν•˜μ§€ μ•Šκ³  1회 μ‹€ν–‰λ‹Ή ν•œ 번만 검사λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.

    μ˜΅μ…˜

    eslint.config.mjs
    {
      "intlayer/no-unused-content": [
        "warn",
        {
          // 아무 κ³³μ—μ„œλ„ μ°Έμ‘°ν•˜μ§€ μ•ŠλŠ” 사전 ν‚€ 보고. κΈ°λ³Έκ°’: true
          reportUnusedDictionaries: true,
    
          // 아무 κ³³μ—μ„œλ„ 읽지 μ•ŠλŠ” μ½˜ν…μΈ  ν•„λ“œ 보고. κΈ°λ³Έκ°’: true
          reportUnusedFields: true,
    
          // μ—¬λŸ¬ μœ„μΉ˜μ— μ„ μ–Έλœ 쀑볡 ν‚€ 보고. κΈ°λ³Έκ°’: true
          reportDuplicateKeys: true,
    
          // λ³΄κ³ ν•˜μ§€ μ•Šμ„ ν•„λ“œ 경둜의 μ •κ·œμ‹
          ignoreFields: ["^meta"],
    
          // 검사가 μ‹œμž‘λ˜λŠ” ν”„λ‘œμ νŠΈ 루트. κΈ°λ³Έκ°’: ESLint μž‘μ—… 디렉터리
          baseDir: process.cwd(),
    
          // ν•œ 번의 ν”„λ‘œμ νŠΈ 검사 κ²°κ³Όλ₯Ό μž¬μ‚¬μš©ν•˜λŠ” μ‹œκ°„(ms). κΈ°λ³Έκ°’: 30000
          cacheTtl: 30000,
        },
      ],
    }
    

    μ˜€λž«λ™μ•ˆ μ‹€ν–‰λ˜λŠ” 에디터 μ„œλ²„μ—μ„œ 린트λ₯Ό μˆ˜ν–‰ν•˜λ©° λ³€κ²½ 사항을 더 빨리 λ°˜μ˜ν•˜κ³  싢을 λ•ŒλŠ” cacheTtl을 μ€„μ΄μ„Έμš”. λͺ¨λ…Έλ ˆν¬μ—μ„œ 단일 린트 싀행이 μ—¬λŸ¬ Intlayer ν”„λ‘œμ νŠΈμ— 걸쳐 μžˆμ„ λ•ŒλŠ” baseDir을 μ„€μ •ν•˜μ„Έμš”.

    침묡을 μš°μ„ ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œ κ±°μ§“ μ–‘μ„±(false positive)이 λ°œμƒν•˜λ©΄ ν•„μš”ν•œ λ²ˆμ—­μ΄ μ‚­μ œλ  수 μžˆμœΌλ―€λ‘œ, 뢄석기가 좔적할 수 μ—†λŠ” λ°©μ‹μœΌλ‘œ 사전을 μ†ŒλΉ„ν•  λ•ŒλŠ” 아무것도 λ³΄κ³ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€: μ½˜ν…μΈ  객체 전체λ₯Ό κ·ΈλŒ€λ‘œ 전달, κ°μ²΄μ—μ„œ λ°”μΈλ”©λœ λ²ˆμ—­ ν•¨μˆ˜(const t = useTranslations("home")), 직접 κ°€μ Έμ˜€κΈ°λ₯Ό ν†΅ν•œ μ„ μ–Έ μ ‘κ·Ό(useDictionary(myDictionary)), λ‹€λ₯Έ μ‚¬μ „μ—μ„œμ˜ nest(), λ˜λŠ” μŠ€ν”„λ ˆλ“œ μ—°μ‚°μžλ‘œ λΆˆμ™„μ „ν•΄μ§„ ν•„λ“œ λͺ©λ‘ λ“±μž…λ‹ˆλ‹€. 단일 파일 μ»΄ν¬λ„ŒνŠΈ(.vue, .svelte, .astro)λŠ” 슀크립트 블둝이 μ—¬κΈ°μ„œ νŒŒμ‹±λ˜μ§€ μ•ŠμœΌλ―€λ‘œ μ–ΈκΈ‰λœ μ‚¬μ „μ˜ λͺ¨λ“  ν•„λ“œλ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμœΌλ‘œ κ°„μ£Όλ©λ‹ˆλ‹€.

    reportDuplicateKeysλŠ” λΉŒλ“œ μ‹œ .intlayer/에 κΈ°λ‘λ˜λŠ” λ³‘ν•©λ˜μ§€ μ•Šμ€ 사전을 μ½μœΌλ―€λ‘œ ν”„λ‘œμ νŠΈκ°€ μ΅œμ†Œ ν•œ 번 λΉŒλ“œλ  λ•ŒκΉŒμ§€λŠ” λ™μž‘ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν‚€λ₯Ό κ³΅μœ ν•˜λŠ” 두 선언은 λ³‘ν•©λ˜λ©° μ΄λŠ” μ˜¬λ°”λ₯Έ νŒ¨ν„΄μž…λ‹ˆλ‹€. λ‹€λ§Œ μ–‘μͺ½μ— μ •μ˜λœ ν•„λ“œκ°€ 쑰용히 λ‘˜ 쀑 ν•˜λ‚˜μ˜ κ°’λ§Œ μœ μ§€ν•˜κΈ° λ•Œλ¬Έμ— 이 보고 κΈ°λŠ₯이 μ œκ³΅λ©λ‹ˆλ‹€.

    λΆ„μ„κΈ°λŠ” ESM으둜 μ œκ³΅λ˜λŠ” @intlayer/lspμ—μ„œ λ‘œλ“œλ©λ‹ˆλ‹€. λ”°λΌμ„œ 이 κ·œμΉ™μ€ ES λͺ¨λ“ˆμ„ require()ν•  수 μžˆλŠ” Node 버전(Node 20.19+ λ˜λŠ” 22.12+)이 ν•„μš”ν•©λ‹ˆλ‹€. 이전 λ²„μ „μ—μ„œλŠ” 린트 싀행을 μ‹€νŒ¨μ‹œν‚€λŠ” λŒ€μ‹  아무것도 λ³΄κ³ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

    ν”„λ ˆμž„μ›Œν¬

    λͺ¨λ“  κ·œμΉ™μ€ Vue, Svelte 및 Angular ν…œν”Œλ¦Ώ λ‚΄λΆ€λ₯Ό ν¬ν•¨ν•˜μ—¬ λͺ¨λ“  Intlayer 톡합 ν™˜κ²½μ—μ„œ μž‘λ™ν•©λ‹ˆλ‹€. ESLint에 각 파일 ν˜•μ‹μ„ 읽을 νŒŒμ„œλ§Œ μ§€μ •ν•΄ μ£Όλ©΄ λ©λ‹ˆλ‹€.

    ν”„λ ˆμž„μ›Œν¬νŒŒμΌνŒŒμ„œ
    React, Preact, Solid, Lit.jsx .tsxtypescript-eslint
    Next.js.jsx .tsxtypescript-eslint
    Vue, Nuxt.vuevue-eslint-parser
    Svelte, SvelteKit.sveltesvelte-eslint-parser
    Angular.tstypescript-eslint
    Angular ν…œν”Œλ¦Ώ.component.html@angular-eslint/template-parser
    Astro.astroastro-eslint-parser
    eslint.config.mjs
    import intlayer from "eslint-plugin-intlayer";
    import tseslint from "typescript-eslint";
    import vueParser from "vue-eslint-parser";
    import svelteParser from "svelte-eslint-parser";
    import angularTemplateParser from "@angular-eslint/template-parser";
    
    export default [
      ...intlayer.configs.recommended,
    
      {
        files: ["**/*.{ts,tsx,jsx}"],
        languageOptions: { parser: tseslint.parser },
      },
      {
        files: ["**/*.vue"],
        languageOptions: {
          parser: vueParser,
          parserOptions: { parser: tseslint.parser },
        },
      },
      {
        files: ["**/*.svelte"],
        languageOptions: {
          parser: svelteParser,
          parserOptions: { parser: tseslint.parser },
        },
      },
      {
        files: ["**/*.component.html"],
        languageOptions: { parser: angularTemplateParser },
      },
    ];
    

    ν”„λ‘œμ νŠΈμ— ν•„μš”ν•œ νŒŒμ„œλ§Œ μ„€μΉ˜ν•˜μ„Έμš”.

    μ•Œλ €μ§„ μ œν•œ 사항. Vue 및 Angular ν…œν”Œλ¦Ώμ—μ„œ {{ content[key] }}와 같은 ν‘œν˜„μ‹μ€ no-dynamic-field-access에 μ˜ν•΄ κ²€μ‚¬λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 슀크립트 블둝에 μž‘μ„±λœ 동적 μ½κΈ°λŠ” μ •μƒμ μœΌλ‘œ κ°μ§€λ©λ‹ˆλ‹€.