VueJS+TS แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ SonarQube-แƒ—แƒแƒœ

แƒฉแƒ•แƒ”แƒœ แƒแƒฅแƒขแƒ˜แƒฃแƒ แƒแƒ“ แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒžแƒšแƒแƒขแƒคแƒแƒ แƒ›แƒแƒก แƒฉแƒ•แƒ”แƒœแƒก แƒกแƒแƒฅแƒ›แƒ˜แƒแƒœแƒแƒ‘แƒแƒจแƒ˜ soundQube แƒ™แƒแƒ“แƒ˜แƒก แƒฎแƒแƒ แƒ˜แƒกแƒฎแƒ˜แƒก แƒ›แƒแƒฆแƒแƒš แƒ“แƒแƒœแƒ”แƒ–แƒ” แƒจแƒ”แƒœแƒแƒ แƒฉแƒฃแƒœแƒ”แƒ‘แƒ. แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ แƒ”แƒ แƒ—-แƒ”แƒ แƒ—แƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒกแƒแƒก VueJs+Typescript, แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒฌแƒแƒ แƒ›แƒแƒ˜แƒจแƒ•แƒ. แƒแƒ›แƒ˜แƒขแƒแƒ›, แƒฃแƒคแƒ แƒ แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ แƒแƒ“ แƒ›แƒ˜แƒœแƒ“แƒ แƒ’แƒ˜แƒ—แƒฎแƒ แƒแƒ—, แƒ แƒแƒ’แƒแƒ  แƒ›แƒแƒ•แƒแƒฎแƒ”แƒ แƒฎแƒ”แƒ— แƒ›แƒแƒ—แƒ˜ แƒ›แƒแƒ’แƒ•แƒแƒ แƒ”แƒ‘แƒ.

VueJS+TS แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ SonarQube-แƒ—แƒแƒœ

แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒ•แƒ˜แƒกแƒแƒฃแƒ‘แƒ แƒ”แƒ‘แƒ—, แƒ แƒแƒ’แƒแƒ แƒช แƒ–แƒ”แƒ›แƒแƒ— แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒ”, SonarQube แƒžแƒšแƒแƒขแƒคแƒแƒ แƒ›แƒแƒ–แƒ”. แƒžแƒแƒขแƒแƒ แƒ แƒ—แƒ”แƒแƒ แƒ˜แƒ - แƒ แƒ แƒแƒ แƒ˜แƒก แƒ–แƒแƒ’แƒแƒ“แƒแƒ“, แƒ›แƒแƒ—แƒ—แƒ•แƒ˜แƒก, แƒ•แƒ˜แƒœแƒช แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒแƒ“ แƒ”แƒกแƒ›แƒ˜แƒก แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘:

soundQube (แƒงแƒแƒคแƒ˜แƒšแƒ˜ แƒกแƒแƒœแƒแƒ แƒ˜) แƒแƒ แƒ˜แƒก แƒฆแƒ˜แƒ แƒ™แƒแƒ“แƒ˜แƒก แƒžแƒšแƒแƒขแƒคแƒแƒ แƒ›แƒ แƒฃแƒฌแƒงแƒ•แƒ”แƒขแƒ˜ แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒ™แƒแƒ“แƒ˜แƒก แƒฎแƒแƒ แƒ˜แƒกแƒฎแƒ˜แƒก แƒ’แƒแƒ–แƒแƒ›แƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.
แƒ›แƒฎแƒแƒ แƒก แƒฃแƒญแƒ”แƒ แƒก แƒ™แƒแƒ“แƒ˜แƒก แƒแƒœแƒแƒšแƒ˜แƒ–แƒก แƒ“แƒ แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ•แƒšแƒ”แƒœแƒแƒก MISRA C, MISRA C++, MITER/CWE แƒ“แƒ CERT Secure Coding Standards แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒกแƒขแƒแƒœแƒ“แƒแƒ แƒขแƒ”แƒ‘แƒ˜แƒก แƒฌแƒ”แƒกแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ—. แƒ›แƒแƒก แƒแƒกแƒ”แƒ•แƒ” แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒแƒ›แƒแƒชแƒœแƒแƒ‘แƒ OWASP แƒขแƒแƒž 10 แƒ“แƒ CWE/SANS แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒขแƒแƒž 25 แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒ˜แƒ“แƒแƒœ.
แƒ˜แƒ›แƒ˜แƒกแƒ“แƒ แƒ›แƒ˜แƒฃแƒฎแƒ”แƒ“แƒแƒ•แƒแƒ“, แƒ แƒแƒ› แƒžแƒšแƒแƒขแƒคแƒแƒ แƒ›แƒ แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ›แƒ–แƒ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒก, SonarQube แƒแƒ›แƒชแƒ˜แƒ แƒ”แƒ‘แƒก แƒจแƒ”แƒ“แƒ”แƒ’แƒ”แƒ‘แƒก แƒ”แƒ แƒ— แƒ“แƒแƒคแƒแƒ–แƒ”, แƒ˜แƒœแƒแƒฎแƒแƒ•แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ˜แƒกแƒขแƒแƒ แƒ˜แƒแƒก แƒ“แƒ แƒแƒ›แƒ˜แƒ— แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒœแƒแƒฎแƒแƒ— แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒฃแƒšแƒ˜ แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒ˜แƒก แƒฎแƒแƒ แƒ˜แƒกแƒฎแƒ˜แƒก แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ–แƒแƒ’แƒแƒ“แƒ˜ แƒขแƒ”แƒœแƒ“แƒ”แƒœแƒชแƒ˜แƒ แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒแƒก.

แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒ“แƒ”แƒขแƒแƒšแƒ”แƒ‘แƒ˜ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ˜แƒฎแƒ˜แƒšแƒแƒ— แƒแƒฅ แƒแƒคแƒ˜แƒชแƒ˜แƒแƒšแƒฃแƒ  แƒกแƒแƒ˜แƒขแƒ–แƒ”

แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒ“แƒ˜แƒ“แƒ˜ แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ˜แƒšแƒ˜แƒ. แƒ•แƒ˜แƒ›แƒกแƒฏแƒ”แƒšแƒ”แƒ‘แƒ— แƒ–แƒ”แƒ›แƒแƒ— แƒ›แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜ แƒ‘แƒ›แƒฃแƒšแƒ˜แƒ“แƒแƒœ แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ—, แƒ”แƒก แƒแƒ แƒ˜แƒก 25-แƒ–แƒ” แƒ›แƒ”แƒขแƒ˜ แƒ”แƒœแƒ. แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒ˜ แƒ”แƒœแƒ˜แƒก แƒ›แƒฎแƒแƒ แƒ“แƒแƒกแƒแƒญแƒ”แƒ แƒแƒ“, แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒแƒ— แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒ˜ แƒ“แƒแƒœแƒแƒ›แƒแƒขแƒ˜. แƒกแƒแƒ–แƒแƒ’แƒแƒ“แƒแƒ”แƒ‘แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ แƒ›แƒแƒ˜แƒชแƒแƒ•แƒก แƒ“แƒแƒœแƒแƒ›แƒแƒขแƒก แƒกแƒแƒ›แƒฃแƒจแƒแƒแƒ“ Javascript (แƒ›แƒแƒ— แƒจแƒแƒ แƒ˜แƒก typeัript), แƒ—แƒฃแƒ›แƒชแƒ แƒ•แƒ˜แƒ™แƒ˜ แƒกแƒแƒžแƒ˜แƒ แƒ˜แƒกแƒžแƒ˜แƒ แƒแƒก แƒแƒ›แƒ‘แƒแƒ‘แƒก. แƒฃแƒ™แƒแƒœ Javascript แƒ›แƒแƒ“แƒฃแƒšแƒ˜แƒก แƒžแƒแƒกแƒฃแƒฎแƒ”แƒ‘แƒ˜ SonarJS, Typescript-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก SonarTS แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒแƒ“.

แƒแƒคแƒ˜แƒชแƒ˜แƒแƒšแƒฃแƒ แƒ˜ แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒ“แƒแƒคแƒแƒ แƒ•แƒ˜แƒก แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒกแƒแƒ’แƒ–แƒแƒ•แƒœแƒแƒ“ sonarqube-แƒกแƒ™แƒแƒœแƒ”แƒ แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช, แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— config-แƒคแƒแƒ˜แƒšแƒ˜, แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒแƒ› แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒก แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ–แƒ” soundQube แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ›แƒ˜ แƒ™แƒแƒœแƒกแƒแƒšแƒ˜แƒ“แƒแƒชแƒ˜แƒ˜แƒกแƒ แƒ“แƒ แƒแƒ’แƒ แƒ”แƒ’แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒ˜แƒงแƒ˜แƒ“แƒ”แƒ‘แƒ Javascript แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก npm แƒจแƒ”แƒคแƒฃแƒ—แƒ•แƒ. แƒแƒกแƒ” แƒ แƒแƒ›, แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒแƒ— แƒ”แƒขแƒแƒžแƒแƒ‘แƒ แƒ˜แƒ•แƒ˜ แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ soundQube ะฒ Vue-แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— แƒขแƒ˜แƒžแƒแƒŸแƒ˜.

แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ’แƒแƒœแƒกแƒแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒšแƒแƒ“ soundQube แƒ•แƒ˜แƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒแƒ— แƒ“แƒแƒ™แƒ”แƒ แƒ˜-แƒ™แƒแƒ›แƒžแƒแƒ–แƒ˜แƒชแƒ˜แƒ.

แƒกแƒแƒœแƒแƒ แƒ˜.yaml:

version: '1'
    services:
        simplesample-sonar:
            image: sonarqube:lts
            ports:
                - 9001:9000
                - 9092:9092
            network_mode: bridge

แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ:

docker-compose -f sonar.yml up

แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ soundQube แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ: http://localhost:9001 .

VueJS+TS แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ SonarQube-แƒ—แƒแƒœ
แƒฏแƒ”แƒ  แƒแƒ  แƒแƒ แƒ˜แƒก แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ”แƒก แƒกแƒแƒ›แƒแƒ แƒ—แƒšแƒ˜แƒแƒœแƒ˜แƒ. แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ›แƒแƒ•แƒแƒกแƒฌแƒแƒ แƒ”แƒ‘แƒ— แƒแƒ› แƒกแƒ˜แƒขแƒฃแƒแƒชแƒ˜แƒแƒก. แƒ›แƒ” แƒแƒ•แƒ˜แƒฆแƒ” แƒแƒคแƒ˜แƒชแƒ˜แƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก VueJS+TS+Jest. แƒ›แƒแƒ“แƒ˜, แƒ›แƒ˜แƒ•แƒ›แƒแƒ แƒ—แƒแƒ— แƒกแƒแƒ™แƒฃแƒ—แƒแƒ  แƒ—แƒแƒ•แƒก:

git clone https://github.com/vuejs/vue-test-utils-typescript-example.git

แƒฏแƒ”แƒ  แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ•แƒแƒงแƒ”แƒœแƒแƒ— soundQube, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒฅแƒ•แƒ˜แƒ แƒกแƒแƒœแƒแƒ -แƒกแƒ™แƒแƒœแƒ”แƒ แƒ˜แƒแƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก npm แƒแƒ แƒ˜แƒก แƒจแƒ”แƒคแƒฃแƒ—แƒ•แƒ:

yarn add sonarqube-scanner

แƒ“แƒ แƒ“แƒแƒฃแƒงแƒแƒ•แƒœแƒ”แƒ‘แƒšแƒ˜แƒ• แƒ“แƒแƒแƒ›แƒแƒขแƒ”แƒ— แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ”แƒ‘แƒ˜ แƒ›แƒแƒกแƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ.

package.json:

{
 โ€ฆ 
   scripts: {
      ...
      "sonar": "sonar-scanner"
      ...
   },
 โ€ฆ
}

แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜, แƒกแƒ™แƒแƒœแƒ”แƒ แƒ˜แƒก แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒแƒงแƒ”แƒœแƒแƒ— แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜ แƒกแƒžแƒ”แƒชแƒ˜แƒแƒšแƒฃแƒ  แƒคแƒแƒ˜แƒšแƒจแƒ˜. แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒแƒ— แƒกแƒแƒคแƒฃแƒซแƒ•แƒšแƒ”แƒ‘แƒ˜แƒ—.

แƒกแƒแƒœแƒแƒ -แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜.แƒ—แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ”แƒ‘แƒ˜:

sonar.host.url=http://localhost:9001

sonar.projectKey=test-project-vuejs-ts
sonar.projectName=Test Application (VueJS+TS)

sonar.sources=src
# sonar.tests=
sonar.test.inclusions=src/**/*tests*/**
sonar.sourceEncoding=UTF-8

  • sonar.host.url - แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ˜ แƒกแƒแƒœแƒแƒ แƒ˜'A;
  • sonar.projectKey - แƒฃแƒœแƒ˜แƒ™แƒแƒšแƒฃแƒ แƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒ“แƒ”แƒœแƒขแƒ˜แƒคแƒ˜แƒ™แƒแƒขแƒแƒ แƒ˜ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ–แƒ” แƒกแƒแƒœแƒแƒ แƒ˜'A;
  • sonar.projectName โ€“ แƒ›แƒ˜แƒกแƒ˜ แƒกแƒแƒฎแƒ”แƒšแƒ˜, แƒ˜แƒก แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒจแƒ”แƒ˜แƒชแƒ•แƒแƒšแƒแƒก แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒ“แƒ แƒแƒก, แƒ•แƒ˜แƒœแƒแƒ˜แƒ“แƒแƒœ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜ แƒ˜แƒ“แƒ”แƒœแƒขแƒ˜แƒคแƒ˜แƒชแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜;
  • แƒกแƒแƒœแƒแƒ แƒ˜.แƒฌแƒงแƒแƒ แƒแƒ”แƒ‘แƒ˜ โ€“ แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ” แƒฌแƒงแƒแƒ แƒแƒ”แƒ‘แƒ˜แƒ—, แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ• แƒ”แƒก src, แƒ›แƒแƒ’แƒ แƒแƒ› แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ˜แƒงแƒแƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜. แƒ”แƒก แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ” แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ root แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ”แƒกแƒ—แƒแƒœ แƒจแƒ”แƒ“แƒแƒ แƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ แƒ˜แƒก แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ”, แƒกแƒแƒ˜แƒ“แƒแƒœแƒแƒช แƒกแƒ™แƒแƒœแƒ”แƒ แƒ˜ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ;
  • แƒกแƒแƒœแƒแƒ แƒ˜.แƒขแƒ”แƒกแƒขแƒ”แƒ‘แƒ˜ - แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ›แƒ˜แƒ“แƒ˜แƒก แƒฌแƒ˜แƒœแƒ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ—แƒแƒœ. แƒ”แƒก แƒแƒ แƒ˜แƒก แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ”, แƒกแƒแƒ“แƒแƒช แƒขแƒ”แƒกแƒขแƒ”แƒ‘แƒ˜แƒ แƒ’แƒแƒœแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒฃแƒšแƒ˜. แƒแƒ› แƒžแƒ แƒแƒ”แƒฅแƒขแƒจแƒ˜ แƒแƒกแƒ”แƒ—แƒ˜ แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ” แƒแƒ  แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒ“แƒ แƒขแƒ”แƒกแƒขแƒ˜ แƒ›แƒ“แƒ”แƒ‘แƒแƒ แƒ”แƒแƒ‘แƒก แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ”แƒจแƒ˜ แƒจแƒ”แƒกแƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒ˜แƒก แƒ’แƒ•แƒ”แƒ แƒ“แƒ˜แƒ—.แƒขแƒ”แƒกแƒขแƒ˜', แƒแƒกแƒ” แƒ แƒแƒ›, แƒฉแƒ•แƒ”แƒœ แƒแƒ› แƒ“แƒ แƒแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒฃแƒ’แƒฃแƒšแƒ”แƒ‘แƒ”แƒšแƒงแƒแƒคแƒ— แƒ“แƒ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒก;
  • แƒกแƒแƒœแƒแƒ แƒ˜.แƒขแƒ”แƒกแƒขแƒ˜.แƒฉแƒแƒœแƒแƒ แƒ—แƒ”แƒ‘แƒ˜ โ€“ แƒœแƒ˜แƒฆแƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— แƒขแƒ”แƒกแƒขแƒ”แƒ‘แƒ˜แƒก แƒ’แƒ–แƒ, แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ˜แƒงแƒแƒก แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ’แƒแƒ›แƒแƒงแƒแƒคแƒ˜แƒšแƒ˜แƒ แƒ›แƒซแƒ˜แƒ›แƒ”แƒ”แƒ‘แƒ˜แƒ—;
  • sonar.sourceEncoding - แƒ™แƒแƒ“แƒ˜แƒ แƒ”แƒ‘แƒ แƒฌแƒงแƒแƒ แƒ แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒกแƒ™แƒแƒœแƒ”แƒ แƒ˜แƒก แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ›แƒ–แƒแƒ“ แƒแƒ แƒ˜แƒก, แƒ’แƒแƒ แƒ“แƒ แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜ แƒฌแƒ˜แƒœแƒ แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒ˜แƒกแƒ: แƒ—แƒแƒ•แƒแƒ“ แƒกแƒแƒขแƒ”แƒกแƒขแƒ แƒซแƒ แƒแƒ•แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ, แƒ แƒแƒ—แƒ แƒ›แƒแƒœ แƒจแƒ”แƒซแƒšแƒแƒก แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ˜แƒก แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒ แƒ“แƒแƒคแƒแƒ แƒ•แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒกแƒ™แƒแƒœแƒ”แƒ แƒ˜ แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ› แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก.

แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒแƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒ˜แƒ แƒแƒ— แƒกแƒแƒขแƒ”แƒกแƒขแƒ แƒซแƒ แƒแƒ•แƒ แƒแƒ› แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ˜แƒก แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒแƒ› แƒžแƒ แƒแƒ”แƒฅแƒขแƒจแƒ˜ แƒกแƒแƒขแƒ”แƒกแƒขแƒ แƒซแƒ แƒแƒ•แƒแƒ แƒแƒ  แƒแƒ แƒ˜แƒก. แƒ“แƒ แƒ›แƒ˜แƒกแƒ˜ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜ แƒแƒ แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ˜แƒก แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒก แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒแƒจแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜.json.

แƒ›แƒแƒ“แƒ˜แƒ— แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒแƒ— แƒ”แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜:

"collectCoverage": true,
"collectCoverageFrom": [
      "src/**/*",
      "!src/main.ts",
      "!src/App.vue",
      "!src/**/*.d.*",
      "!src/**/*__tests__*"
],

แƒแƒœแƒฃ, แƒฉแƒ•แƒ”แƒœ แƒ—แƒแƒ•แƒแƒ“ แƒ•แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒ“แƒ แƒแƒจแƒแƒก แƒ“แƒแƒคแƒแƒ แƒ•แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ—แƒ•แƒšแƒ˜แƒก แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒแƒ–แƒ” แƒ“แƒ แƒฌแƒงแƒแƒ แƒแƒก (แƒ’แƒแƒ›แƒแƒœแƒแƒ™แƒšแƒ˜แƒกแƒ”แƒ‘แƒ—แƒแƒœ แƒ”แƒ แƒ—แƒแƒ“), แƒ แƒแƒ›แƒšแƒ˜แƒก แƒกแƒแƒคแƒฃแƒซแƒ•แƒ”แƒšแƒ–แƒ”แƒช แƒ˜แƒ’แƒ˜ แƒฉแƒแƒ›แƒแƒงแƒแƒšแƒ˜แƒ‘แƒ“แƒ”แƒ‘แƒ.

แƒแƒฎแƒšแƒ แƒฉแƒแƒ•แƒแƒขแƒแƒ แƒแƒ— แƒขแƒ”แƒกแƒขแƒ˜:

yarn test

แƒฉแƒ•แƒ”แƒœ แƒ•แƒœแƒแƒฎแƒแƒ•แƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒก:

VueJS+TS แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ SonarQube-แƒ—แƒแƒœ

แƒ›แƒ˜แƒ–แƒ”แƒ–แƒ˜ แƒ˜แƒก แƒแƒ แƒ˜แƒก, แƒ แƒแƒ› แƒ—แƒแƒ•แƒแƒ“ แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒจแƒ˜ แƒ™แƒแƒ“แƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก. แƒ’แƒแƒ›แƒแƒ•แƒแƒกแƒฌแƒแƒ แƒแƒ— แƒ”แƒก.

HelloWorld.vue:

...
methods: {
    calc(n) {
      return n + 1;
    }
  },
mounted() {
  this.msg1 = this.msg + this.calc(1);
},
...

แƒ”แƒก แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ“แƒแƒคแƒแƒ แƒ•แƒ˜แƒก แƒ’แƒแƒ›แƒแƒกแƒแƒ—แƒ•แƒšแƒ”แƒšแƒแƒ“.

แƒขแƒ”แƒกแƒขแƒ˜แƒก แƒ’แƒแƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ•แƒ แƒฌแƒ›แƒฃแƒœแƒ“แƒ”แƒ‘แƒ˜แƒ— แƒแƒ›แƒแƒจแƒ˜:

VueJS+TS แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ SonarQube-แƒ—แƒแƒœ

แƒ”แƒ™แƒ แƒแƒœแƒ–แƒ” แƒฃแƒœแƒ“แƒ แƒ•แƒœแƒแƒฎแƒแƒ— แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ แƒ“แƒแƒคแƒแƒ แƒ•แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒ“แƒ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ”แƒจแƒ˜ แƒจแƒ”แƒ˜แƒฅแƒ›แƒœแƒ”แƒ‘แƒ แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ” แƒ“แƒแƒคแƒแƒ แƒ•แƒ˜แƒก แƒขแƒ”แƒกแƒขแƒ˜แƒก แƒ“แƒแƒคแƒแƒ แƒ•แƒ˜แƒก แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ˜แƒ— แƒฃแƒœแƒ˜แƒ•แƒ”แƒ แƒกแƒแƒšแƒฃแƒ  แƒคแƒแƒ แƒ›แƒแƒขแƒจแƒ˜ LCOV (LTP GCOV แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒ).

แƒ’แƒฅแƒแƒ• แƒแƒ แƒ˜แƒก แƒ—แƒแƒ•แƒ˜แƒกแƒฃแƒคแƒšแƒแƒ“ แƒ’แƒแƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ แƒ™แƒแƒ“แƒ˜แƒก แƒ“แƒแƒคแƒแƒ แƒ•แƒ˜แƒก แƒจแƒ”แƒกแƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒšแƒแƒ“. Gcov แƒฌแƒแƒ แƒ›แƒแƒฅแƒ›แƒœแƒ˜แƒก แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒ–แƒฃแƒกแƒข แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒแƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒก แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ’แƒแƒœแƒชแƒฎแƒแƒ“แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒ“แƒแƒแƒ›แƒแƒขแƒแƒ— แƒแƒœแƒแƒขแƒแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒฌแƒงแƒแƒ แƒแƒก แƒ™แƒแƒ“แƒจแƒ˜. Gcov แƒ›แƒแƒ“แƒ˜แƒก แƒ แƒแƒ’แƒแƒ แƒช แƒกแƒขแƒแƒœแƒ“แƒแƒ แƒขแƒฃแƒšแƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ, แƒ แƒแƒ’แƒแƒ แƒช GCC แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒ˜.
แƒšแƒ™แƒแƒ• - แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒฃแƒšแƒ˜ แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ˜ gcov-แƒกแƒ—แƒ•แƒ˜แƒก. แƒ˜แƒก แƒแƒ’แƒ แƒแƒ•แƒ”แƒ‘แƒก gcov แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒก แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒฌแƒงแƒแƒ แƒแƒก แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒ แƒแƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘แƒก HTML แƒ’แƒ•แƒ”แƒ แƒ“แƒ”แƒ‘แƒ˜แƒก แƒ”แƒ แƒ—แƒแƒ‘แƒšแƒ˜แƒแƒ‘แƒแƒก แƒ™แƒแƒ“แƒ˜แƒ— แƒ“แƒ แƒ“แƒแƒคแƒแƒ แƒ•แƒ˜แƒก แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ˜แƒ—. แƒ’แƒ•แƒ”แƒ แƒ“แƒ”แƒ‘แƒ˜ แƒแƒกแƒ”แƒ•แƒ” แƒ˜แƒฅแƒ›แƒœแƒ”แƒ‘แƒ แƒœแƒแƒ•แƒ˜แƒ’แƒแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒกแƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒšแƒแƒ“. Lcov แƒ›แƒฎแƒแƒ แƒก แƒฃแƒญแƒ”แƒ แƒก แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ”แƒ‘แƒ˜แƒก, แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒขแƒแƒขแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒคแƒแƒ แƒ•แƒแƒก.

แƒขแƒ”แƒกแƒขแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ“แƒแƒคแƒแƒ แƒ•แƒ˜แƒก แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ แƒ’แƒแƒœแƒ—แƒแƒ•แƒกแƒ“แƒ”แƒ‘แƒ แƒ’แƒแƒจแƒฃแƒฅแƒ”แƒ‘แƒ/lcov.info.
แƒฃแƒœแƒ“แƒ แƒ•แƒ—แƒฅแƒ•แƒแƒ— แƒกแƒแƒœแƒแƒ แƒ˜'แƒกแƒแƒ˜แƒ“แƒแƒœ แƒจแƒ”แƒ›แƒ˜แƒซแƒšแƒ˜แƒ แƒ›แƒ˜แƒกแƒ˜ แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒ? แƒแƒ›แƒ˜แƒขแƒแƒ›, แƒ›แƒแƒ“แƒ˜แƒ— แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒแƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ”แƒ‘แƒ˜ แƒ›แƒ˜แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒจแƒ˜. แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ แƒ˜แƒก แƒ”แƒ แƒ—แƒ˜ แƒฌแƒ”แƒ แƒขแƒ˜แƒšแƒ˜: แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ˜แƒงแƒแƒก แƒ›แƒ แƒแƒ•แƒแƒšแƒ”แƒœแƒแƒ•แƒแƒœแƒ˜, แƒแƒœแƒฃ แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ”แƒจแƒ˜ src แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒ”แƒœแƒ˜แƒก แƒฌแƒงแƒแƒ แƒแƒก แƒ™แƒแƒ“แƒ˜ แƒ“แƒ แƒแƒ›แƒ แƒ—แƒฃ แƒ˜แƒ› แƒ”แƒœแƒ”แƒ‘แƒ—แƒแƒœ แƒ™แƒฃแƒ—แƒ•แƒœแƒ˜แƒšแƒ”แƒ‘แƒ แƒ“แƒ แƒ—แƒแƒ•แƒ˜แƒก แƒ›แƒฎแƒ แƒ˜แƒ•, แƒแƒ›แƒ แƒ—แƒฃ แƒ˜แƒ› แƒ›แƒแƒ“แƒฃแƒšแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒ’แƒแƒœแƒ˜แƒกแƒแƒ–แƒฆแƒ•แƒ แƒ”แƒ‘แƒ แƒ›แƒ˜แƒกแƒ˜ แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒ˜แƒ—. แƒ“แƒ แƒ“แƒแƒคแƒแƒ แƒ•แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒœแƒแƒฎแƒ•แƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒแƒ“แƒ’แƒ˜แƒšแƒแƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒ”แƒœแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒš แƒ”แƒœแƒแƒก แƒแƒฅแƒ•แƒก แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒ แƒแƒ›แƒ˜แƒก แƒ“แƒแƒกแƒแƒงแƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ“. แƒฉแƒ•แƒ”แƒœแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜ แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก แƒขแƒ˜แƒžแƒแƒŸแƒ˜แƒแƒกแƒ” แƒ แƒแƒ›, แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒแƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก:

แƒกแƒแƒœแƒแƒ -แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜.แƒ—แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ”แƒ‘แƒ˜:

sonar.typescript.coveragePlugin=lcov
sonar.typescript.lcov.reportPaths=coverage/lcov.info

แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ›แƒ–แƒแƒ“ แƒแƒ แƒ˜แƒก แƒกแƒ™แƒแƒœแƒ”แƒ แƒ˜แƒก แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ›แƒ˜แƒœแƒ“แƒ แƒแƒฆแƒ•แƒœแƒ˜แƒจแƒœแƒ, แƒ แƒแƒ› แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜ แƒแƒ แƒ˜แƒก แƒกแƒแƒœแƒแƒ แƒ˜'e แƒ˜แƒฅแƒ›แƒœแƒ”แƒ‘แƒ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒแƒ“, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒแƒ“ แƒแƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘แƒ— แƒกแƒ™แƒแƒœแƒ”แƒ แƒก แƒ›แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ›แƒจแƒ˜ แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ แƒ“แƒแƒ’แƒ แƒแƒ•แƒ“แƒ”แƒ‘แƒ, แƒ แƒแƒ—แƒ แƒ“แƒ แƒแƒ—แƒ แƒ’แƒแƒœแƒ›แƒแƒ•แƒšแƒแƒ‘แƒแƒจแƒ˜ แƒ“แƒแƒ˜แƒœแƒแƒฎแƒแƒก แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜แƒก แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ˜แƒœแƒแƒ›แƒ˜แƒ™แƒ.

แƒ›แƒแƒจ แƒแƒกแƒ”, แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒแƒ— แƒแƒ“แƒ แƒ” แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒšแƒ˜ แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜.json:

yarn run sonar 

แƒจแƒ”แƒœแƒ˜แƒจแƒ•แƒœแƒ: แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒกแƒ”แƒ•แƒ” แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜ -X แƒฃแƒคแƒ แƒ แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ แƒ˜ แƒจแƒ”แƒกแƒ•แƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒ—แƒฃ แƒกแƒ™แƒแƒœแƒ”แƒ แƒ˜ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒแƒ“ แƒแƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ“แƒ, แƒ›แƒแƒจแƒ˜แƒœ แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ แƒ˜แƒ’แƒจแƒ˜ แƒฉแƒแƒ›แƒแƒ˜แƒขแƒ•แƒ˜แƒ แƒ—แƒ”แƒ‘แƒ แƒ—แƒแƒ•แƒแƒ“ แƒกแƒ™แƒแƒœแƒ”แƒ แƒ˜แƒก แƒ‘แƒ˜แƒœแƒแƒ แƒ˜. แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ˜แƒก แƒ˜แƒฌแƒงแƒ”แƒ‘แƒ แƒ“แƒ แƒ˜แƒฌแƒงแƒ”แƒ‘แƒก แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒกแƒ™แƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒแƒก แƒกแƒแƒœแƒแƒ แƒ˜แƒ“แƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ“แƒแƒœแƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒ˜แƒ—แƒแƒช แƒ’แƒแƒ›แƒแƒ˜แƒ—แƒ•แƒšแƒ”แƒ‘แƒ แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ˜แƒšแƒ˜ แƒ”แƒœแƒ. แƒแƒกแƒ”แƒ•แƒ” แƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒฃแƒšแƒ˜แƒ แƒ›แƒ˜แƒกแƒ˜ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜: แƒฎแƒแƒ แƒ˜แƒกแƒฎแƒ˜แƒก แƒžแƒ แƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒ˜, แƒแƒฅแƒขแƒ˜แƒฃแƒ แƒ˜ แƒฌแƒ”แƒกแƒ”แƒ‘แƒ˜, แƒ›แƒ”แƒขแƒ แƒ˜แƒ™แƒ˜แƒก แƒกแƒแƒชแƒแƒ•แƒ˜, แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒฌแƒ”แƒกแƒ”แƒ‘แƒ˜.

VueJS+TS แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ SonarQube-แƒ—แƒแƒœ

VueJS+TS แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ SonarQube-แƒ—แƒแƒœ

แƒจแƒ”แƒœแƒ˜แƒจแƒ•แƒœแƒ: แƒฉแƒ•แƒ”แƒœ แƒ›แƒแƒ—แƒ–แƒ” แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ แƒแƒ“ แƒแƒ  แƒ•แƒ˜แƒกแƒแƒฃแƒ‘แƒ แƒ”แƒ‘แƒ— แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒ˜แƒก แƒคแƒแƒ แƒ’แƒšแƒ”แƒ‘แƒจแƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ› แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒฃแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ“แƒ”แƒ— แƒแƒคแƒ˜แƒชแƒ˜แƒแƒšแƒฃแƒ  แƒฌแƒงแƒแƒ แƒแƒ”แƒ‘แƒก.

แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜, แƒ˜แƒฌแƒงแƒ”แƒ‘แƒ แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ˜แƒก แƒแƒœแƒแƒšแƒ˜แƒ–แƒ˜ src แƒฌแƒงแƒแƒ แƒแƒก แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ˜แƒšแƒ˜ แƒ”แƒœแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก (แƒ—แƒฃ แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒแƒ“ แƒแƒ  แƒแƒ แƒ˜แƒก แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒฃแƒšแƒ˜), แƒ›แƒแƒ—แƒ˜ แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ›แƒ˜ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒ—.

VueJS+TS แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ SonarQube-แƒ—แƒแƒœ

แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ›แƒแƒ“แƒ˜แƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒกแƒฎแƒ•แƒ แƒแƒœแƒแƒšแƒ˜แƒ–แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ–แƒ”แƒช แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒงแƒฃแƒ แƒแƒ“แƒฆแƒ”แƒ‘แƒแƒก แƒแƒ  แƒ•แƒแƒ›แƒแƒฎแƒ•แƒ˜แƒšแƒ”แƒ‘แƒ— (แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒšแƒ˜แƒœแƒขแƒ˜แƒœแƒ’แƒ˜, แƒ™แƒแƒ“แƒ˜แƒก แƒ“แƒฃแƒ‘แƒšแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ•แƒšแƒ”แƒœแƒ แƒ“แƒ แƒ.แƒจ.).

แƒกแƒ™แƒแƒœแƒ”แƒ แƒ˜แƒก แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒ‘แƒแƒšแƒแƒก, แƒงแƒ•แƒ”แƒšแƒ แƒจแƒ”แƒ’แƒ แƒแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ แƒ’แƒ แƒแƒ•แƒ“แƒ”แƒ‘แƒ, แƒแƒ แƒฅแƒ˜แƒ•แƒ“แƒ”แƒ‘แƒ แƒ“แƒ แƒ˜แƒ’แƒ–แƒแƒ•แƒœแƒ”แƒ‘แƒ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ–แƒ”.

แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒฉแƒ•แƒ”แƒœ แƒฃแƒ™แƒ•แƒ” แƒ•แƒฎแƒ”แƒ“แƒแƒ•แƒ— แƒ แƒ แƒ›แƒแƒฎแƒ“แƒ แƒ•แƒ”แƒ‘ แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒจแƒ˜:

VueJS+TS แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ SonarQube-แƒ—แƒแƒœ

แƒ แƒแƒ’แƒแƒ แƒช แƒ•แƒฎแƒ”แƒ“แƒแƒ•แƒ—, แƒ แƒแƒฆแƒแƒช แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ“แƒ แƒ“แƒ แƒ แƒแƒฆแƒแƒช แƒ’แƒแƒจแƒฃแƒฅแƒ”แƒ‘แƒแƒกแƒแƒช แƒ™แƒ˜ แƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ”แƒก แƒแƒ  แƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ แƒฉแƒ•แƒ”แƒœแƒกแƒแƒก แƒแƒ  แƒแƒ แƒ˜แƒก- แƒ›แƒแƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒ.

แƒ›แƒแƒ“แƒ˜ แƒ’แƒแƒ•แƒแƒ แƒ™แƒ•แƒ˜แƒแƒ—. แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฎแƒ”แƒ“แƒแƒ— แƒžแƒ แƒแƒ”แƒฅแƒขแƒก แƒฃแƒคแƒ แƒ แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ แƒแƒ“, แƒ“แƒแƒแƒฌแƒ™แƒแƒžแƒฃแƒœแƒ”แƒ— แƒ“แƒแƒคแƒแƒ แƒ•แƒ˜แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒแƒ–แƒ” แƒ“แƒ โ€žแƒ’แƒแƒ“แƒแƒ•แƒแƒ แƒ—แƒแƒ—โ€œ แƒคแƒแƒ˜แƒšแƒ˜แƒก แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ  แƒแƒœแƒ’แƒแƒ แƒ˜แƒจแƒจแƒ˜:

VueJS+TS แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ SonarQube-แƒ—แƒแƒœ

แƒแƒฅ แƒฉแƒ•แƒ”แƒœ แƒ•แƒฎแƒ”แƒ“แƒแƒ•แƒ—, แƒ’แƒแƒ แƒ“แƒ แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜, แƒ’แƒแƒœแƒฎแƒ˜แƒšแƒฃแƒšแƒ˜ แƒคแƒแƒ˜แƒšแƒ˜แƒกแƒ HelloWorld.vue, แƒแƒ แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ˜แƒช แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜.แƒช, แƒ แƒแƒช แƒแƒคแƒฃแƒญแƒ”แƒ‘แƒก แƒ’แƒแƒจแƒฃแƒฅแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ—แƒ”แƒš แƒกแƒฃแƒ แƒแƒ—แƒก. แƒ›แƒแƒ’แƒ แƒแƒ› แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒ›แƒแƒ•แƒ แƒ˜แƒชแƒฎแƒ”แƒ— แƒ”แƒก แƒ“แƒแƒคแƒแƒ แƒ•แƒ˜แƒก แƒ’แƒแƒแƒœแƒ’แƒแƒ แƒ˜แƒจแƒ”แƒ‘แƒ˜แƒ“แƒแƒœ. แƒ“แƒ˜แƒแƒฎ, แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒกแƒฌแƒแƒ แƒ˜แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ”แƒก แƒ˜แƒงแƒ แƒ“แƒแƒœแƒ”แƒ–แƒ” แƒแƒ  แƒแƒ แƒ˜แƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒกแƒ™แƒแƒœแƒ”แƒ แƒ›แƒ แƒ›แƒแƒแƒฎแƒ“แƒ˜แƒœแƒ แƒ›แƒ˜แƒกแƒ˜ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜แƒ แƒ”แƒ‘แƒ, แƒแƒกแƒ” แƒ แƒแƒ›, แƒ˜แƒ’แƒ˜ แƒ“แƒแƒกแƒ แƒฃแƒšแƒ“แƒ แƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ—แƒ•แƒšแƒ”แƒ‘แƒจแƒ˜.

แƒ’แƒแƒ›แƒแƒ•แƒแƒกแƒฌแƒแƒ แƒแƒ— แƒ”แƒก:

แƒกแƒแƒœแƒแƒ -แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜.แƒ—แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ”แƒ‘แƒ˜:

...
sonar.exclusions=src/main.ts
...

แƒ›แƒ˜แƒœแƒ“แƒ แƒ“แƒแƒ•แƒแƒ–แƒฃแƒกแƒขแƒ: แƒแƒ› แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒจแƒ˜ แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ”แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ“แƒ, แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒจแƒ˜ แƒฉแƒแƒ›แƒแƒ—แƒ•แƒšแƒ˜แƒšแƒ˜ แƒงแƒ•แƒ”แƒšแƒ แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ”แƒช แƒ”แƒ›แƒแƒขแƒ”แƒ‘แƒ. แƒกแƒแƒœแƒแƒ แƒ˜.แƒขแƒ”แƒกแƒขแƒ˜.แƒฉแƒแƒœแƒแƒ แƒ—แƒ”แƒ‘แƒ˜.

แƒกแƒ™แƒแƒœแƒ”แƒ แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒฉแƒ•แƒ”แƒœ แƒ•แƒฎแƒ”แƒ“แƒแƒ•แƒ— แƒกแƒฌแƒแƒ  แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒแƒก:

VueJS+TS แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ SonarQube-แƒ—แƒแƒœ

VueJS+TS แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ SonarQube-แƒ—แƒแƒœ

แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ“แƒแƒ•แƒฎแƒ”แƒ“แƒแƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒžแƒฃแƒœแƒฅแƒขแƒก - แƒฎแƒแƒ แƒ˜แƒกแƒฎแƒ˜แƒก แƒžแƒ แƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒ˜. แƒ–แƒ”แƒ›แƒแƒ— แƒ•แƒ˜แƒกแƒแƒฃแƒ‘แƒ แƒ” แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒแƒ–แƒ” แƒกแƒแƒœแƒแƒ แƒ˜แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ”แƒœแƒแƒ–แƒ” แƒ”แƒ แƒ—แƒ“แƒ แƒแƒฃแƒšแƒแƒ“. แƒ”แƒก แƒแƒ แƒ˜แƒก แƒ–แƒฃแƒกแƒขแƒแƒ“ แƒ˜แƒก, แƒ แƒแƒกแƒแƒช แƒฉแƒ•แƒ”แƒœ แƒ•แƒฎแƒ”แƒ“แƒแƒ•แƒ—. แƒ›แƒแƒ’แƒ แƒแƒ› แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒชแƒ˜แƒ—, แƒ แƒแƒ› แƒฉแƒ•แƒ”แƒœแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜ แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜แƒ TSแƒ แƒแƒขแƒแƒ› แƒ“แƒแƒซแƒแƒ‘แƒ”แƒ— แƒกแƒ™แƒแƒœแƒ”แƒ แƒ˜ แƒแƒ แƒแƒกแƒแƒญแƒ˜แƒ แƒ แƒ›แƒแƒœแƒ˜แƒžแƒฃแƒšแƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒ—แƒ แƒ“แƒ แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒ—. แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ•แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒแƒœแƒแƒšแƒ˜แƒ–แƒ˜แƒก แƒ”แƒœแƒแƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒจแƒ˜ แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ”แƒ แƒ—แƒ˜ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ— แƒกแƒแƒœแƒแƒ แƒ˜'A:

แƒกแƒแƒœแƒแƒ -แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜.แƒ—แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ”แƒ‘แƒ˜:

...
sonar.language=ts
...

แƒ›แƒแƒ“แƒ˜แƒ— แƒ™แƒ•แƒšแƒแƒ• แƒ’แƒแƒ•แƒฃแƒจแƒ•แƒแƒ— แƒกแƒ™แƒแƒœแƒ”แƒ แƒ˜ แƒ“แƒ แƒ•แƒœแƒแƒฎแƒแƒ— แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜:

VueJS+TS แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ SonarQube-แƒ—แƒแƒœ

แƒ’แƒแƒจแƒฃแƒฅแƒ”แƒ‘แƒ แƒ›แƒ—แƒšแƒ˜แƒแƒœแƒแƒ“ แƒ’แƒแƒฅแƒ แƒ.

แƒ—แƒฃ แƒ’แƒแƒ“แƒแƒ•แƒฎแƒ”แƒ“แƒแƒ•แƒ— แƒกแƒ™แƒแƒœแƒ”แƒ แƒ˜แƒก แƒŸแƒฃแƒ แƒœแƒแƒšแƒก, แƒ•แƒฎแƒ”แƒ“แƒแƒ•แƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒฎแƒแƒ–แƒก:

VueJS+TS แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ SonarQube-แƒ—แƒแƒœ

แƒแƒœแƒฃ, แƒฉแƒ•แƒ”แƒœแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒแƒ  แƒ˜แƒงแƒ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜.

แƒกแƒ˜แƒขแƒฃแƒแƒชแƒ˜แƒ แƒแƒกแƒ”แƒ—แƒ˜แƒ: แƒแƒคแƒ˜แƒชแƒ˜แƒแƒšแƒฃแƒ แƒแƒ“ แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ˜แƒšแƒ˜ VueJs แƒแƒ แƒ˜แƒก แƒ“แƒแƒœแƒแƒ›แƒแƒขแƒจแƒ˜ SonarJSแƒ•แƒ˜แƒœแƒช แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒกแƒ›แƒ’แƒ”แƒ‘แƒ”แƒšแƒ˜แƒ Javascript.

VueJS+TS แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ SonarQube-แƒ—แƒแƒœ

แƒ›แƒแƒ’แƒ แƒแƒ› แƒ”แƒก แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ แƒแƒ  แƒแƒ แƒ˜แƒก แƒ“แƒแƒœแƒแƒ›แƒแƒขแƒจแƒ˜ SonarTS แƒแƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก TS, แƒ แƒแƒ›แƒšแƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘แƒแƒช แƒแƒคแƒ˜แƒชแƒ˜แƒแƒšแƒฃแƒ แƒ˜ แƒ‘แƒ˜แƒšแƒ”แƒ—แƒ˜ แƒ’แƒแƒ˜แƒฎแƒกแƒœแƒ bug tracker-แƒจแƒ˜ แƒกแƒแƒœแƒแƒ แƒ˜'A:

  1. https://jira.sonarsource.com/browse/MMF-1441
  2. https://github.com/SonarSource/SonarJS/issues/1281

แƒแƒฅ แƒแƒ แƒ˜แƒก แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒžแƒแƒกแƒฃแƒฎแƒ˜ SonarQube แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ”แƒ แƒ—-แƒ”แƒ แƒ—แƒ˜ แƒฌแƒแƒ แƒ›แƒแƒ›แƒแƒ“แƒ’แƒ”แƒœแƒšแƒ˜แƒกแƒ’แƒแƒœ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒก แƒแƒ› แƒคแƒแƒฅแƒขแƒก.

VueJS+TS แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ SonarQube-แƒ—แƒแƒœ

VueJS+TS แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ SonarQube-แƒ—แƒแƒœ

แƒ›แƒแƒ’แƒ แƒแƒ› แƒฉแƒ•แƒ”แƒœแƒ—แƒแƒœ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ“แƒ, แƒ—แƒฅแƒ•แƒ”แƒœ แƒฌแƒ˜แƒœแƒแƒแƒฆแƒ›แƒ“แƒ”แƒ’แƒ˜ แƒฎแƒแƒ แƒ—. แƒ“แƒ˜แƒแƒฎ, แƒ”แƒก แƒแƒ แƒ˜แƒก, แƒ›แƒแƒ“แƒ˜แƒ—, แƒชแƒแƒขแƒแƒ—แƒ˜ แƒ•แƒชแƒแƒ“แƒแƒ— "แƒ’แƒแƒขแƒ”แƒฎแƒ•แƒ".
แƒ—แƒฃ แƒแƒ แƒ˜แƒก แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ .แƒ•แƒฃ- แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜ แƒกแƒแƒœแƒแƒ แƒ˜โ€แƒแƒฐ, แƒ›แƒแƒจแƒ˜แƒœ แƒ›แƒแƒ“แƒ˜แƒ— แƒ•แƒชแƒ“แƒ˜แƒšแƒแƒ‘แƒ— แƒ•แƒฃแƒ—แƒฎแƒ แƒแƒ— แƒ›แƒแƒก, แƒ แƒแƒ› แƒ’แƒแƒœแƒ˜แƒฎแƒ˜แƒšแƒแƒก แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒขแƒ˜แƒžแƒแƒŸแƒ˜.

แƒ›แƒแƒ“แƒ˜แƒ— แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒแƒ— แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜:

แƒกแƒแƒœแƒแƒ -แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜.แƒ—แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ”แƒ‘แƒ˜:

...
sonar.typescript.file.suffixes=.ts,.tsx,.vue
...

แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒฃแƒจแƒ•แƒแƒ— แƒกแƒ™แƒแƒœแƒ”แƒ แƒ˜:

VueJS+TS แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ SonarQube-แƒ—แƒแƒœ

แƒ“แƒ, แƒ•แƒแƒ˜แƒšแƒ, แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒœแƒแƒ แƒ›แƒแƒšแƒฃแƒ แƒแƒ“ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ“แƒ แƒ“แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ”แƒ แƒ—แƒ˜ แƒžแƒ แƒแƒคแƒ˜แƒšแƒ˜แƒ— แƒขแƒ˜แƒžแƒแƒŸแƒ˜. แƒแƒœแƒฃ แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ˜แƒ— แƒ›แƒแƒ•แƒแƒฎแƒ”แƒ แƒฎแƒ”แƒ— แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ˜แƒก แƒ›แƒแƒ’แƒ•แƒแƒ แƒ”แƒ‘แƒ VueJs + TS แƒแƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก soundQube.

แƒจแƒ”แƒ•แƒ”แƒชแƒแƒ“แƒแƒ— แƒฃแƒคแƒ แƒ แƒจแƒแƒ แƒก แƒฌแƒแƒ•แƒ˜แƒ“แƒ”แƒ— แƒ“แƒ แƒชแƒแƒขแƒ แƒ’แƒแƒ•แƒแƒฃแƒ›แƒฏแƒแƒ‘แƒ”แƒกแƒแƒ— แƒ“แƒแƒคแƒแƒ แƒ•แƒ˜แƒก แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ.

แƒ แƒแƒช แƒแƒฅแƒแƒ›แƒ“แƒ” แƒ’แƒแƒ•แƒแƒ™แƒ”แƒ—แƒ”แƒ—:

  • แƒžแƒ แƒแƒ”แƒฅแƒขแƒก แƒ“แƒแƒ”แƒ›แƒแƒขแƒ แƒกแƒแƒœแƒแƒ แƒ˜-แƒกแƒ™แƒแƒœแƒ”แƒ แƒ˜;
  • แƒแƒฌแƒงแƒแƒ‘แƒ แƒแƒ  แƒแƒ แƒ˜แƒก แƒ“แƒแƒคแƒแƒ แƒ•แƒ˜แƒก แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ˜แƒก แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒ;
  • แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒแƒœแƒแƒ แƒ˜-แƒกแƒ™แƒแƒœแƒ”แƒ แƒ˜;
  • แƒ’แƒแƒ“แƒแƒญแƒ แƒ แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ˜แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ .แƒ•แƒฃ-แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜ + แƒขแƒ˜แƒžแƒแƒŸแƒ˜.

แƒขแƒ”แƒกแƒขแƒ˜แƒก แƒ’แƒแƒจแƒฃแƒฅแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ“แƒ, แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒกแƒฎแƒ•แƒ แƒกแƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒ แƒกแƒแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒ แƒ™แƒ แƒ˜แƒขแƒ”แƒ แƒ˜แƒฃแƒ›แƒ”แƒ‘แƒ˜ แƒ™แƒแƒ“แƒ˜แƒก แƒฎแƒแƒ แƒ˜แƒกแƒฎแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ™แƒแƒ“แƒ˜แƒก แƒ“แƒฃแƒ‘แƒšแƒ˜แƒ แƒ”แƒ‘แƒ แƒ“แƒ แƒฎแƒแƒ–แƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ (แƒฉแƒแƒ แƒ—แƒฃแƒšแƒ˜ แƒ™แƒแƒ“แƒ”แƒฅแƒกแƒ˜แƒก แƒกแƒ˜แƒ แƒ—แƒฃแƒšแƒ”แƒกแƒ—แƒแƒœ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ™แƒแƒ”แƒคแƒ˜แƒชแƒ˜แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ—แƒ•แƒšแƒแƒจแƒ˜).

แƒ›แƒแƒ“แƒฃแƒšแƒ˜แƒก แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒแƒจแƒ˜ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก TS (SonarTS) แƒแƒ  แƒ˜แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒก CPD (Copy Paste Detector) แƒ“แƒ แƒ˜แƒ—แƒ•แƒšแƒ˜แƒก แƒ™แƒแƒ“แƒ˜แƒก แƒฎแƒแƒ–แƒ”แƒ‘แƒก .แƒ•แƒฃ- แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜.

แƒ™แƒแƒ“แƒ˜แƒก แƒ“แƒฃแƒ‘แƒšแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒœแƒ—แƒ”แƒ–แƒฃแƒ แƒ˜ แƒกแƒ˜แƒขแƒฃแƒแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“, แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ“แƒแƒแƒ™แƒแƒžแƒ˜แƒ แƒ”แƒ— แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ˜ แƒกแƒฎแƒ•แƒ แƒกแƒแƒฎแƒ”แƒšแƒ˜แƒ— แƒ“แƒ แƒแƒกแƒ”แƒ•แƒ” แƒ“แƒแƒแƒ›แƒแƒขแƒ”แƒ— แƒ˜แƒ’แƒ˜ แƒ™แƒแƒ“แƒจแƒ˜ แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜.แƒช dummy แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒ“แƒ แƒ“แƒฃแƒ‘แƒšแƒ˜แƒ™แƒแƒขแƒ˜ แƒกแƒฎแƒ•แƒ แƒกแƒแƒฎแƒ”แƒšแƒ˜แƒ—. แƒ“แƒฃแƒ‘แƒšแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒšแƒแƒ“, แƒ แƒแƒ’แƒแƒ แƒช แƒ”แƒก .แƒ•แƒฃ, แƒ“แƒ .แƒฌ - แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜.

main.ts:

...
function name(params:string): void {
  console.log(params);
}
...

แƒแƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก แƒกแƒแƒญแƒ˜แƒ แƒแƒ แƒ“แƒ แƒแƒ”แƒ‘แƒ˜แƒ— แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜ แƒ’แƒแƒแƒ™แƒ”แƒ—แƒแƒ— แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒฎแƒแƒ–แƒ–แƒ”:

แƒกแƒแƒœแƒแƒ -แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜.แƒ—แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ”แƒ‘แƒ˜:

...
sonar.exclusions=src/main.ts
...

แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒแƒ— แƒกแƒ™แƒแƒœแƒ”แƒ แƒ˜ แƒขแƒ”แƒกแƒขแƒ˜แƒ แƒ”แƒ‘แƒแƒกแƒ—แƒแƒœ แƒ”แƒ แƒ—แƒแƒ“:

yarn test && yarn run sonar

แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ’แƒแƒจแƒฃแƒฅแƒ”แƒ‘แƒ แƒ“แƒแƒ”แƒชแƒ”แƒ›แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒฎแƒšแƒ แƒ”แƒก แƒแƒ  แƒ’แƒ•แƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒ”แƒ‘แƒก.

แƒ™แƒแƒ“แƒ˜แƒก แƒฎแƒแƒ–แƒ”แƒ‘แƒ˜แƒก แƒ“แƒฃแƒ‘แƒšแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒ—แƒ•แƒแƒšแƒกแƒแƒ–แƒ แƒ˜แƒกแƒ˜แƒ—, แƒฉแƒ•แƒ”แƒœ แƒ•แƒœแƒแƒฎแƒแƒ•แƒ—:

VueJS+TS แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ SonarQube-แƒ—แƒแƒœ

แƒจแƒ”แƒกแƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒšแƒแƒ“ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— CPD- แƒกแƒแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒ - jscpd:

npx jscpd src

VueJS+TS แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ SonarQube-แƒ—แƒแƒœ

แƒ™แƒแƒ“แƒ˜แƒก แƒฎแƒแƒ–แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก:

VueJS+TS แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ SonarQube-แƒ—แƒแƒœ

แƒจแƒ”แƒกแƒแƒซแƒšแƒแƒ, แƒ”แƒก แƒ›แƒแƒ’แƒ•แƒแƒ แƒ“แƒ”แƒก แƒ›แƒแƒ“แƒฃแƒšแƒ˜แƒก แƒ›แƒแƒ›แƒแƒ•แƒแƒš แƒ•แƒ”แƒ แƒกแƒ˜แƒ”แƒ‘แƒจแƒ˜ SonarJS (TS). แƒ›แƒ˜แƒœแƒ“แƒ แƒแƒฆแƒ•แƒœแƒ˜แƒจแƒœแƒ, แƒ แƒแƒ› แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒ—แƒแƒœแƒ“แƒแƒ—แƒแƒœ แƒ˜แƒฌแƒงแƒ”แƒ‘แƒ”แƒœ แƒแƒ› แƒแƒ แƒ˜ แƒ›แƒแƒ“แƒฃแƒšแƒ˜แƒก แƒ”แƒ แƒ—แƒจแƒ˜ แƒ’แƒแƒ”แƒ แƒ—แƒ˜แƒแƒœแƒ”แƒ‘แƒแƒก SonarJS, แƒ แƒแƒช แƒฉแƒ”แƒ›แƒ˜ แƒแƒ–แƒ แƒ˜แƒ— แƒกแƒฌแƒแƒ แƒ˜แƒ.

แƒแƒฎแƒšแƒ แƒ›แƒ˜แƒœแƒ“แƒแƒ“แƒ แƒ’แƒแƒœแƒ•แƒ˜แƒฎแƒ˜แƒšแƒ แƒ“แƒแƒคแƒแƒ แƒ•แƒ˜แƒก แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒฃแƒ›แƒฏแƒแƒ‘แƒ”แƒกแƒ”แƒ‘แƒ˜แƒก แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜.

แƒฏแƒ”แƒ แƒฏแƒ”แƒ แƒแƒ‘แƒ˜แƒ— แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒ•แƒœแƒแƒฎแƒแƒ— แƒขแƒ”แƒกแƒขแƒ˜แƒก แƒ’แƒแƒจแƒฃแƒฅแƒ”แƒ‘แƒ แƒžแƒ แƒแƒชแƒ”แƒœแƒขแƒฃแƒšแƒ˜ แƒ—แƒ•แƒแƒšแƒกแƒแƒ–แƒ แƒ˜แƒกแƒ˜แƒ— แƒ›แƒ—แƒ”แƒšแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒ แƒ™แƒ”แƒ แƒซแƒแƒ“ แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ› แƒ˜แƒœแƒ“แƒ˜แƒ™แƒแƒขแƒแƒ แƒ˜แƒก แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ˜แƒ— แƒ”แƒ แƒ—แƒ”แƒฃแƒšแƒ˜แƒก-แƒขแƒ”แƒกแƒขแƒ”แƒ‘แƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒกแƒ”แƒ•แƒ” แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒจแƒ˜.

แƒแƒ แƒ˜แƒก แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒแƒ  แƒแƒ แƒ˜แƒก- แƒ›แƒแƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒคแƒแƒ แƒ›แƒแƒขแƒจแƒ˜ แƒ’แƒแƒ“แƒแƒงแƒ•แƒแƒœแƒ แƒกแƒแƒœแƒแƒ แƒ˜'A:
แƒ–แƒแƒ’แƒแƒ“แƒ˜ แƒขแƒ”แƒกแƒขแƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ - https://docs.sonarqube.org/display/SONAR/Generic+Test+Data.

แƒ›แƒแƒ“แƒ˜แƒ— แƒ“แƒแƒ•แƒแƒงแƒ”แƒœแƒแƒ— แƒ”แƒก แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ แƒฉแƒ•แƒ”แƒœแƒก แƒžแƒ แƒแƒ”แƒฅแƒขแƒจแƒ˜:

yarn add jest-sonar-reporter

แƒ“แƒ แƒ“แƒแƒแƒ›แƒแƒขแƒ”แƒ— แƒ˜แƒ’แƒ˜ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒแƒจแƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก:

package.json:

โ€ฆ
"testResultsProcessor": "jest-sonar-reporter"
โ€ฆ

แƒแƒฎแƒšแƒ แƒฉแƒแƒ•แƒแƒขแƒแƒ แƒแƒ— แƒขแƒ”แƒกแƒขแƒ˜:

yarn test

แƒ แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒแƒช แƒจแƒ”แƒ˜แƒฅแƒ›แƒœแƒ”แƒ‘แƒ แƒคแƒแƒ˜แƒšแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก root-แƒจแƒ˜ test-report.xml.

แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ˜แƒ’แƒ˜ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒแƒจแƒ˜ แƒกแƒแƒœแƒแƒ แƒ˜'A:

แƒกแƒแƒœแƒแƒ -แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜.แƒ—แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ”แƒ‘แƒ˜:

โ€ฆ
sonar.testExecutionReportPaths=test-report.xml
โ€ฆ

แƒ“แƒ แƒ’แƒแƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ”แƒ— แƒกแƒ™แƒแƒœแƒ”แƒ แƒ˜:

yarn run sonar

แƒ•แƒœแƒแƒฎแƒแƒ—, แƒ แƒ แƒจแƒ”แƒ˜แƒชแƒ•แƒแƒšแƒ แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒจแƒ˜ แƒกแƒแƒœแƒแƒ แƒ˜'A:

VueJS+TS แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ SonarQube-แƒ—แƒแƒœ

แƒ“แƒ แƒแƒ แƒแƒคแƒ”แƒ แƒ˜ แƒจแƒ”แƒชแƒ•แƒšแƒ˜แƒšแƒ. แƒคแƒแƒฅแƒขแƒ˜แƒ, แƒ แƒแƒ› Sonar แƒแƒ  แƒ’แƒแƒœแƒ˜แƒฎแƒ˜แƒšแƒแƒ•แƒก Jest แƒแƒœแƒ’แƒแƒ แƒ˜แƒจแƒจแƒ˜ แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒš แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒก แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒแƒ“ แƒ”แƒ แƒ—แƒ”แƒฃแƒšแƒ˜แƒก- แƒขแƒ”แƒกแƒขแƒ”แƒ‘แƒ˜. แƒแƒ› แƒกแƒ˜แƒขแƒฃแƒแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒ›แƒแƒกแƒแƒกแƒฌแƒแƒ แƒ”แƒ‘แƒšแƒแƒ“, แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒก แƒกแƒแƒœแƒแƒ แƒ˜ แƒกแƒแƒœแƒแƒ แƒ˜.แƒขแƒ”แƒกแƒขแƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒจแƒ˜แƒช แƒชแƒแƒšแƒกแƒแƒฎแƒแƒ“ แƒ›แƒ˜แƒ•แƒฃแƒ—แƒ˜แƒ—แƒ”แƒ‘แƒ— แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ”แƒ”แƒ‘แƒก แƒขแƒ”แƒกแƒขแƒ”แƒ‘แƒ˜แƒ— (แƒแƒ›แƒŸแƒแƒ›แƒแƒ“ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ”แƒ แƒ—แƒ˜ แƒ’แƒ•แƒแƒฅแƒ•แƒก):

แƒกแƒแƒœแƒแƒ -แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜.แƒ—แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ”แƒ‘แƒ˜:

โ€ฆ
sonar.tests=src/components/__tests__
โ€ฆ

แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒแƒ— แƒกแƒ™แƒแƒœแƒ”แƒ แƒ˜:

yarn run sonar

แƒ•แƒœแƒแƒฎแƒแƒ—, แƒ แƒ แƒจแƒ”แƒ˜แƒชแƒ•แƒแƒšแƒ แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒจแƒ˜:

VueJS+TS แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ SonarQube-แƒ—แƒแƒœ

แƒแƒฎแƒšแƒ แƒฉแƒ•แƒ”แƒœ แƒ•แƒœแƒแƒฎแƒ”แƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ แƒ˜แƒชแƒฎแƒ•แƒ˜ แƒ”แƒ แƒ—แƒ”แƒฃแƒšแƒ˜แƒก-แƒขแƒ”แƒกแƒขแƒ”แƒ‘แƒ˜ แƒ“แƒ, แƒจแƒ˜แƒ’ แƒ“แƒแƒฌแƒ™แƒแƒžแƒฃแƒœแƒ”แƒ‘แƒ˜แƒ— แƒฉแƒแƒ•แƒแƒ แƒ“แƒœแƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒ“แƒแƒ•แƒ˜แƒœแƒแƒฎแƒแƒ— แƒแƒ› แƒ แƒ˜แƒชแƒฎแƒ•แƒ˜แƒก แƒ’แƒแƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒก แƒจแƒแƒ แƒ˜แƒก:

VueJS+TS แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ SonarQube-แƒ—แƒแƒœ

แƒ“แƒแƒกแƒ™แƒ•แƒœแƒ

แƒแƒกแƒ” แƒ แƒแƒ›, แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ•แƒฎแƒ”แƒ“แƒ”แƒ— แƒฃแƒฌแƒงแƒ•แƒ”แƒขแƒ˜ แƒแƒœแƒแƒšแƒ˜แƒ–แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒก soundQube. แƒฉแƒ•แƒ”แƒœ แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ— แƒฉแƒแƒ•แƒ แƒ—แƒ”แƒ— แƒ›แƒแƒกแƒจแƒ˜ แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜ VueJs + TS. แƒ“แƒแƒคแƒ˜แƒฅแƒกแƒ˜แƒ แƒ“แƒ แƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒแƒ‘แƒ˜แƒก แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ—แƒ˜ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ. แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ•แƒ–แƒแƒ แƒ“แƒ”แƒ— แƒขแƒ”แƒกแƒขแƒ˜แƒก แƒ“แƒแƒคแƒแƒ แƒ•แƒ˜แƒก แƒ˜แƒœแƒ“แƒ˜แƒ™แƒแƒขแƒแƒ แƒ˜แƒก แƒกแƒแƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ แƒจแƒ˜แƒœแƒแƒแƒ แƒกแƒ˜. แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒœแƒ•แƒ˜แƒฎแƒ˜แƒšแƒ”แƒ— แƒ™แƒแƒ“แƒ˜แƒก แƒฎแƒแƒ แƒ˜แƒกแƒฎแƒ˜แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ”แƒ แƒ—แƒ˜ แƒ™แƒ แƒ˜แƒขแƒ”แƒ แƒ˜แƒฃแƒ›แƒ˜ (แƒจแƒ”แƒกแƒแƒซแƒšแƒแƒ แƒ”แƒ แƒ—-แƒ”แƒ แƒ—แƒ˜ แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜), แƒ›แƒแƒ’แƒ แƒแƒ› soundQube แƒ›แƒฎแƒแƒ แƒก แƒฃแƒญแƒ”แƒ แƒก แƒฎแƒแƒ แƒ˜แƒกแƒฎแƒ˜แƒก แƒกแƒฎแƒ•แƒ แƒ™แƒ แƒ˜แƒขแƒ”แƒ แƒ˜แƒฃแƒ›แƒ”แƒ‘แƒก, แƒ›แƒแƒ— แƒจแƒแƒ แƒ˜แƒก แƒฃแƒกแƒแƒคแƒ แƒ—แƒฎแƒแƒ”แƒ‘แƒ˜แƒก แƒขแƒ”แƒกแƒขแƒ˜แƒ แƒ”แƒ‘แƒแƒก. แƒ›แƒแƒ’แƒ แƒแƒ› แƒงแƒ•แƒ”แƒšแƒ แƒ”แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒกแƒ แƒฃแƒšแƒแƒ“ แƒแƒ  แƒแƒ แƒ˜แƒก แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜ แƒกแƒแƒ–แƒแƒ’แƒแƒ“แƒแƒ”แƒ‘แƒ˜แƒก- แƒ•แƒ”แƒ แƒกแƒ˜แƒ”แƒ‘แƒ˜. แƒ”แƒ แƒ—-แƒ”แƒ แƒ—แƒ˜ แƒกแƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒ แƒ“แƒ แƒกแƒแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒ แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ soundQube แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ™แƒแƒ“แƒ˜แƒก แƒกแƒแƒชแƒแƒ•แƒ˜แƒก แƒ›แƒแƒ แƒ—แƒ•แƒ˜แƒก แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ GitLab แƒ“แƒ BitBucket. แฒ—แƒแƒ•แƒ˜แƒ“แƒแƒœ แƒแƒกแƒแƒชแƒ˜แƒšแƒ”แƒ‘แƒšแƒแƒ“ แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒ˜แƒก pull (แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒ˜แƒก) แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ'a แƒกแƒแƒชแƒแƒ•แƒ˜แƒก แƒ›แƒ—แƒแƒ•แƒแƒ  แƒคแƒ˜แƒšแƒ˜แƒแƒšแƒจแƒ˜, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ“แƒแƒคแƒแƒ แƒ•แƒ แƒ“แƒ”แƒ’แƒ แƒแƒ“แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ. แƒ›แƒแƒ’แƒ แƒแƒ› แƒ”แƒก แƒแƒ แƒ˜แƒก แƒแƒ›แƒ‘แƒแƒ•แƒ˜ แƒกแƒ แƒฃแƒšแƒ˜แƒแƒ“ แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒขแƒแƒขแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

PS: แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜, แƒ แƒแƒช แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜แƒ แƒ™แƒแƒ“แƒ˜แƒก แƒกแƒแƒฎแƒ˜แƒ—, แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒ แƒฉแƒ”แƒ›แƒ˜ แƒฉแƒแƒœแƒ’แƒแƒšแƒ˜.

แƒ’แƒแƒ›แƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒแƒจแƒ˜ แƒ›แƒแƒœแƒแƒฌแƒ˜แƒšแƒ”แƒแƒ‘แƒ แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒแƒ— แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ“แƒแƒ แƒ”แƒ’แƒ˜แƒกแƒขแƒ แƒ˜แƒ แƒ”แƒ‘แƒฃแƒš แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ”แƒ‘แƒก. แฒจแƒ”แƒ‘แƒ แƒซแƒแƒœแƒ“แƒ˜แƒ—แƒ’แƒ—แƒฎแƒแƒ•แƒ—

แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒ—แƒฃ แƒแƒ แƒ SonarQube แƒžแƒšแƒแƒขแƒคแƒแƒ แƒ›แƒแƒก:

  • 26,3%แƒ“แƒ˜แƒแƒฎ 5

  • 15,8%No3

  • 15,8%แƒ’แƒแƒ•แƒ˜แƒ’แƒ” แƒแƒ› แƒžแƒšแƒแƒขแƒคแƒแƒ แƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒ“แƒ แƒ›แƒ˜แƒœแƒ“แƒ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ3

  • 10,5%แƒ›แƒ” แƒ›แƒกแƒ›แƒ”แƒœแƒ˜แƒ แƒแƒ› แƒžแƒšแƒแƒขแƒคแƒแƒ แƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒ“แƒ แƒแƒ  แƒ›แƒ˜แƒœแƒ“แƒ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ2

  • 0,0%แƒ›แƒ” แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘ แƒกแƒฎแƒ•แƒ แƒžแƒšแƒแƒขแƒคแƒแƒ แƒ›แƒแƒก0

  • 31,6%แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒแƒ“ แƒ’แƒแƒ•แƒ˜แƒ’แƒ” แƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘6

แƒ›แƒ˜แƒกแƒชแƒ แƒฎแƒ›แƒ 19 แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒ›แƒ. 3 แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒ›แƒ แƒ—แƒแƒ•แƒ˜ แƒจแƒ”แƒ˜แƒ™แƒแƒ•แƒ.

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ