VS Code Setup: Difference between revisions

From bibbleWiki
Jump to navigation Jump to search
 
(6 intermediate revisions by the same user not shown)
Line 242: Line 242:
       }
       }
     ],
     ],
</syntaxhighlight>
==ES Lint 2023==
packages.json
<syntaxhighlight lang="json">
{
  "name": "testvite",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "tsc && vite build",
    "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
    "preview": "vite preview"
  },
  "dependencies": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0"
  },
  "devDependencies": {
    "@types/jest": "^29.5.5",
    "@types/react": "^18.2.15",
    "@types/react-dom": "^18.2.7",
    "@typescript-eslint/eslint-plugin": "^6.0.0",
    "@typescript-eslint/parser": "^6.0.0",
    "@vitejs/plugin-react": "^4.0.3",
    "eslint": "^8.45.0",
    "eslint-config-prettier": "^9.0.0",
    "eslint-import-resolver-typescript": "^3.6.0",
    "eslint-plugin-ban": "^1.6.0",
    "eslint-plugin-css-import-order": "^1.1.0",
    "eslint-plugin-etc": "^2.0.3",
    "eslint-plugin-import": "^2.28.0",
    "eslint-plugin-jest": "^27.2.3",
    "eslint-plugin-jest-dom": "^5.0.2",
    "eslint-plugin-jsdoc": "^46.8.1",
    "eslint-plugin-jsx-a11y": "^6.7.1",
    "eslint-plugin-prettier": "^5.0.0",
    "eslint-plugin-react": "^7.33.1",
    "eslint-plugin-react-hooks": "^4.6.0",
    "eslint-plugin-react-redux": "^4.0.0",
    "eslint-plugin-react-refresh": "^0.4.3",
    "eslint-plugin-unicorn": "^48.0.1",
    "eslint-plugin-unused-imports": "^3.0.0",
    "jest": "^29.7.0",
    "typescript": "^5.0.2",
    "vite": "^4.4.5"
  }
}
</syntaxhighlight>
.eslintrc.cjs
<syntaxhighlight lang="js">
module.exports = {
  root: true,
  env: { browser: true, es2021: true, jest: true },
 
  globals: {
    globalThis: false
  },
  extends: [
    // "react-app",
    // "react-app/jest",
    "eslint:recommended",
    "plugin:jsdoc/recommended",
    "plugin:react/recommended",
    "plugin:react-redux/recommended",
    "plugin:@typescript-eslint/eslint-recommended",
    // "plugin:@cspell/recommended",
    "plugin:@typescript-eslint/recommended",
    // "plugin:@typescript-eslint/recommended-type-checked",
    "plugin:@typescript-eslint/stylistic",
    // "plugin:@typescript-eslint/stylistic-type-checked",
    "plugin:import/recommended",
    "plugin:import/typescript",
    "plugin:jest/recommended",
    "plugin:import/errors",
    "plugin:import/warnings",
    "plugin:import/typescript",
    "plugin:css-import-order/recommended",
   
    "plugin:jest-dom/recommended",
    "plugin:jsx-a11y/recommended",
    "plugin:react/jsx-runtime",
    "prettier"
  ],
  ignorePatterns: ["dist", ".eslintrc.cjs"],
  // ----------------------------------------
  // Parser
  parser: "@typescript-eslint/parser",
  parserOptions: {
    ecmaVersion: "latest",
    ecmaFeatures: {
      jsx: true
    },
    sourceType: "module",
    project: [
      "./tsconfig.eslint.json"
    ]
  },
  // ----------------------------------------
  // Plugins
  plugins: [
    "react-refresh",
    "ban",
    "jsdoc",
    "react",
    "react-hooks",
    "react-redux",
    "etc",
    "jest",
    "jest-dom",
    "jsx-a11y",
    "unused-imports",
    "css-import-order",
    "import"
  ],
 
  // ----------------------------------------
  // Settings
  settings: {
    "import/parsers": {
      "@typescript-eslint/parser": [".ts", "*.tsx"]
    },
    "import/resolver": {
      "typescript": {
        "alwaysTryTypes": true,
        "project": [
          "./tsconfig.json"
        ]
      }
    },   
    "react": {
      "version": "detect"
    },
    "jsdoc": {
      "mode": "typescript"
    }
  },
  reportUnusedDisableDirectives: true,
  // ----------------------------------------
  // Rules
  rules: {
    "react-refresh/only-export-components": [
      "warn",
      { allowConstantExport: true },
    ],
    "jest/no-commented-out-tests": "off",
    "react/jsx-uses-react": "error",
    "ban/ban": [
      "error",
      {
        "name": ["*", "forEach"],
        "message": "Use a for-of loop instead"
      },
      {
        "name": ["describe", "only"],
        "message": "Don't forget to remove .only before committing"
      },
      {
        "name": ["it", "only"],
        "message": "Don't forget to remove .only before committing"
      },
      {
        "name": ["test", "only"],
        "message": "Don't forget to remove .only before committing"
      }
    ],
    "no-restricted-imports": [
      "error",
      {
        "paths": [
          {
            "name": "lodash",
            "importNames": ["isArray"],
            "message": "Use Array.isArray instead."
          }
        ]
      }
    ],
    "callback-return": "error",
    "complexity": "off",
    "constructor-super": "error",
    "dot-notation": "error",
    "eqeqeq": "error",
    "eol-last": "error",
    "guard-for-in": "error",
    "linebreak-style": "off",
    "max-classes-per-file": "off",
    "new-parens": "error",
    "newline-per-chained-call": "off",
    "no-bitwise": "off",
    "no-caller": "error",
    "no-cond-assign": "error",
    "no-console": "off",
    "no-constant-condition": [
      "error",
      {
        "checkLoops": false
      }
    ],
    "no-debugger": "error",
    "no-duplicate-imports": "error",
    "no-empty": "error",
    "no-else-return": [
      "error",
      {
        "allowElseIf": false
      }
    ],
    "no-eval": "error",
    "no-extra-bind": "error",
    "no-extra-semi": "off",
    "no-fallthrough": "off",
    "no-floating-decimal": "error",
    "no-inner-declarations": "off",
    "no-invalid-this": "off",
    "no-irregular-whitespace": "error",
    "no-lonely-if": "error",
    "no-magic-numbers": "off",
    "no-multiple-empty-lines": [
      "error",
      {
        "max": 1
      }
    ],
    "no-new-wrappers": "error",
    "no-redeclare": "off",
    "no-sparse-arrays": "error",
    "no-sync": [
      "error",
      {
        "allowAtRootLevel": true
      }
    ],
    "no-template-curly-in-string": "error",
    "no-throw-literal": "error",
    "no-undef-init": "error",
    "no-unneeded-ternary": [
      "error",
      {
        "defaultAssignment": false
      }
    ],
    "no-unsafe-finally": "error",
    "no-unused-expressions": "error",
    "no-unused-labels": "error",
    "no-useless-call": "error",
    "no-useless-concat": "error",
    "no-useless-constructor": "off",
    "no-var": "error",
    "no-void": "error",
    "object-shorthand": "error",
    "one-var": ["error", "never"],
    "prefer-arrow-callback": [
      "error",
      {
        "allowNamedFunctions": true
      }
    ],
    "prefer-const": [
      "error",
      {
        "destructuring": "all"
      }
    ],
    "prefer-object-spread": "error",
    "prefer-promise-reject-errors": "error",
    "prefer-rest-params": "error",
    "prefer-spread": "error",
    "prefer-template": "off",
    "radix": "error",
    "spaced-comment": [
      "error",
      "always",
      {
        "line": {
          "markers": ["/"]
        }
      }
    ],
    "sort-imports": "off",
    "use-isnan": "error",
    "valid-typeof": "off",
    "yoda": "error",
    "import/extensions": ["error", "never"],
    "import/no-deprecated": "warn",
    "import/no-unused-modules": "error",
    "import/no-cycle": "off",
    "import/no-self-import": "error",
    "import/no-dynamic-require": "error",
    "import/no-useless-path-segments": "error",
    "import/no-duplicates": "error",
    "import/no-default-export": "error",
    "import/order": [
      "error",
      {
        "newlines-between": "always",
        "groups": ["internal", "unknown", "external", "builtin", ["parent", "sibling", "index"]],
        "alphabetize": {
          "order": "asc",
          "caseInsensitive": true
        },
        "pathGroups": [
          {
            "pattern": "react",
            "group": "external",
            "position": "before"
          },
          {
            "pattern": "@sourcegraph/**",
            "group": "external",
            "position": "after"
          },
          {
            "pattern": "*.scss",
            "group": "index",
            "patternOptions": {
              "matchBase": true
            },
            "position": "after"
          }
        ],
        "pathGroupsExcludedImportTypes": []
      }
    ],
    "jsdoc/require-returns": "off",
    "jsdoc/require-jsdoc": "off",
    "jsdoc/require-param": "off",
    "jsdoc/no-bad-blocks": "error",
    "jsdoc/check-indentation": "off",
    "jsdoc/check-tag-names": [
      "error",
      {
        "definedTags": ["hidden", "internal"]
      }
    ],
    "react-hooks/exhaustive-deps": "error",
    "react-hooks/rules-of-hooks": "error",
    "react/button-has-type": "error",
    "react/display-name": "warn",
    "react/forbid-dom-props": [
      "error",
      {
        "forbid": ["style"]
      }
    ],
    "react/jsx-boolean-value": ["error", "always"],
    "react/jsx-curly-brace-presence": "error",
    "react/jsx-fragments": ["error", "syntax"],
    "react/jsx-key": "error",
    "react/jsx-no-bind": "off",
    "react/jsx-no-comment-textnodes": "error",
    "react/jsx-no-target-blank": "error",
    "react/no-access-state-in-setstate": "error",
    "react/no-array-index-key": "warn",
    "react/no-deprecated": "warn",
    "react/no-did-mount-set-state": "error",
    "react/no-did-update-set-state": "error",
    "react/no-direct-mutation-state": "error",
    "react/no-find-dom-node": "error",
    "react/no-is-mounted": "error",
    "react/no-multi-comp": [
      "off",
      {
        "ignoreStateless": true
      }
    ],
    "react/no-redundant-should-component-update": "error",
    "react/no-string-refs": "error",
    "react/no-this-in-sfc": "error",
    "react/no-typos": "error",
    "react/no-unescaped-entities": [
      "error",
      {
        "forbid": [">", "}"]
      }
    ],
    "react/no-unsafe": [
      "error",
      {
        "checkAliases": true
      }
    ],
    "react/no-unused-state": "error",
    "react/prefer-stateless-function": [
      "error",
      {
        "ignorePureComponents": true
      }
    ],
    "react/require-render-return": "error",
    "react/self-closing-comp": "error",
    "react/void-dom-elements-no-children": "error",
    "react/prop-types": "off",
    "etc/throw-error": "error",
    "etc/no-deprecated": "warn",
    "@typescript-eslint/no-var-requires": "off",
    "@typescript-eslint/prefer-regexp-exec": "off",
    "@typescript-eslint/no-unsafe-call": "warn",
    "@typescript-eslint/no-unsafe-member-access": "warn",
    "@typescript-eslint/no-unsafe-return": "off",
    "@typescript-eslint/no-unsafe-assignment": "warn",
    "id-length": [
      "error",
      {
        "min": 3,
        "properties": "never",
        "exceptions": ["to", "as", "id", "it", "fs", "os", "H", "a", "b"]
      }
    ],
    "unused-imports/no-unused-vars": "off",
    "no-unsafe-optional-chaining": "off",
    "@typescript-eslint/no-unsafe-argument": "off",
    "@typescript-eslint/no-unnecessary-type-constraint": "off"
  },
  // ----------------------------------------
  // Overrides
  overrides: [
    {
      "files": ["*.ts", "*.tsx"],
      "parser": "@typescript-eslint/parser",
      "plugins": ["@typescript-eslint"],
      "rules": {
        "@typescript-eslint/adjacent-overload-signatures": "error",
        "@typescript-eslint/array-type": "error",
        "@typescript-eslint/await-thenable": "error",
        "@typescript-eslint/ban-types": [
          "error",
          {
            "extendDefaults": true,
            "types": {
              "object": false,
              "{}": false
            }
          }
        ],
        "@typescript-eslint/naming-convention": [
          "off",
          {
            "selector": "default",
            "format": null
          },
          {
            "selector": "typeLike",
            "format": ["PascalCase"],
            "leadingUnderscore": "allow",
            "trailingUnderscore": "allow"
          }
        ],
        "@typescript-eslint/explicit-function-return-type": [
          "error",
          {
            "allowExpressions": true,
            "allowTypedFunctionExpressions": true,
            "allowHigherOrderFunctions": true
          }
        ],
        "@typescript-eslint/indent": "off",
        "@typescript-eslint/interface-name-prefix": "off",
        "@typescript-eslint/member-delimiter-style": "off",
        "@typescript-eslint/member-ordering": "off",
        "@typescript-eslint/no-empty-interface": "off",
        "@typescript-eslint/no-empty-function": [
          "error",
          {
            "allow": ["arrowFunctions"]
          }
        ],
        "@typescript-eslint/no-explicit-any": "warn",
        "@typescript-eslint/no-for-in-array": "error",
        "@typescript-eslint/no-floating-promises": "error",
        "@typescript-eslint/no-inferrable-types": [
          "error",
          {
            "ignoreParameters": true
          }
        ],
        "@typescript-eslint/no-misused-new": "error",
        "@typescript-eslint/no-misused-promises": "warn",
        "@typescript-eslint/no-non-null-assertion": "warn",
        "@typescript-eslint/no-unnecessary-condition": "off",
        "@typescript-eslint/consistent-type-assertions": [
          "warn",
          {
            "assertionStyle": "as",
            "objectLiteralTypeAssertions": "never"
          }
        ],
        "@typescript-eslint/consistent-type-definitions": ["error", "interface"],
        "@typescript-eslint/no-base-to-string": "error",
        "@typescript-eslint/no-parameter-properties": "off",
        "@typescript-eslint/no-require-imports": "error",
        "@typescript-eslint/no-unnecessary-qualifier": "error",
        "@typescript-eslint/no-unnecessary-type-assertion": "warn",
        "@typescript-eslint/no-unsafe-call": "warn",
        "@typescript-eslint/no-unsafe-member-access": "warn",
        "@typescript-eslint/no-unsafe-return": "off",
        "@typescript-eslint/no-unsafe-assignment": "warn",
        "@typescript-eslint/no-unused-vars": [
          "warn",
          {
            "varsIgnorePattern": ".*",
            "args": "after-used",
            "ignoreRestSiblings": true
          }
        ],
        "@typescript-eslint/no-use-before-define": "off",
        "@typescript-eslint/no-useless-constructor": "error",
        "@typescript-eslint/no-var-requires": "error",
        "@typescript-eslint/prefer-as-const": "error",
        "@typescript-eslint/prefer-string-starts-ends-with": "error",
        "@typescript-eslint/prefer-function-type": "error",
        "@typescript-eslint/prefer-includes": "error",
        "@typescript-eslint/prefer-namespace-keyword": "error",
        "@typescript-eslint/prefer-optional-chain": "error",
        "@typescript-eslint/prefer-nullish-coalescing": "off",
        "@typescript-eslint/type-annotation-spacing": "off",
        "@typescript-eslint/triple-slash-reference": "error",
        "@typescript-eslint/restrict-template-expressions": "off",
        "@typescript-eslint/return-await": "error",
        "@typescript-eslint/unbound-method": "error",
        "@typescript-eslint/unified-signatures": "error",
        "jsdoc/no-types": "error",
        "jsdoc/no-undefined-types": "off",
        "jsdoc/require-param-type": "off",
        "jsdoc/require-returns-type": "off",
        "jsdoc/valid-types": "off",
        "import/no-unresolved": "off",
        "import/default": "off",
        "import/named": "off",
        "import/namespace": "off",
        "import/no-deprecated": "off",
        "react/no-direct-mutation-state": "off",
        "react/jsx-no-undef": "off",
        "jsx-a11y/no-onchange": "off",
        "jsx-a11y/no-autofocus": "off",
        "jsx-a11y/accessible-emoji": "off",
        "no-undef": "off",
        "no-dupe-class-members": "off",
        "require-await": "off"
      }
    },
    {
      "files": "*.d.ts",
      "rules": {
        "no-var": "off",
        "@typescript-eslint/explicit-member-accessibility": "off",
        "id-length": "off",
        "import/no-default-export": "off"
      }
    },
    {
      "files": "*.@(test|story).ts?(x)",
      "rules": {
        "react/jsx-no-bind": "off",
        "@typescript-eslint/explicit-function-return-type": "off",
        "react/button-has-type": "off"
      }
    },
    {
      "files": "*.test.tsx",
      "rules": {
        "@typescript-eslint/no-floating-promises": "off",
        "unicorn/prefer-flat-map": "off"
      }
    }
  ]
};
</syntaxhighlight>
</syntaxhighlight>


Line 542: Line 1,125:
find_package(ImageMagick COMPONENTS Magick++)
find_package(ImageMagick COMPONENTS Magick++)
target_link_libraries(${PROJECT_NAME} PRIVATE "MagickCore-6.Q16")
target_link_libraries(${PROJECT_NAME} PRIVATE "MagickCore-6.Q16")
</syntaxhighlight>
=Debugging NODE_API_MODULE=
Below is how to debug a C++ binary inside of VS Code.
<syntaxhighlight lang="json">
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug",
            "preLaunchTask": "npm: build:dev",
            "program": "/usr/bin/node",
            "args": ["/home/iwiseman/dev/projects/nodeapi/basic-node-addon/index.js"]
        }
    ]
}
</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 00:43, 16 September 2023

Set up Java

Install Java JDK

sudo apt install default-jdk

Install Gradle

sudo add-apt-repository ppa:cwchien/gradle
sudo apt update
sudo apt install gradle

In Visual Studio install the Maven for Java and Gradle Tasks

Typescript

Install usual code but add the following to the setting for typescript. Search typescript in settings and change to json in settings.json. Dont forget to restart

"typescript.tsserver.experimental.enableProjectDiagnostics": true,

List of extensions

angular.ng-template-0.1001.0
dbaeumer.vscode-eslint-2.1.13
ecmel.vscode-html-css-0.2.3
eg2.vscode-npm-script-0.3.13
esbenp.prettier-vscode-5.7.1
gitlab.gitlab-workflow-3.6.0
golang.go-0.18.0
ivory-lab.jenkinsfile-support-1.1.0
janjoerke.jenkins-pipeline-linter-connector-1.2.0
johnpapa.angular2-9.1.2
johnpapa.angular-essentials-9.0.1
johnpapa.vscode-peacock-3.8.0
johnpapa.winteriscoming-1.4.3
maelvalais.autoconf-0.1.0
mikael.angular-beastcode-10.0.3
msjsdiag.debugger-for-chrome-4.12.11
msjsdiag.debugger-for-edge-1.0.15
ms-python.python-2020.10.332292344
ms-python.python-2020.9.114305
ms-vscode.cpptools-1.0.1
ms-vscode.vscode-typescript-tslint-plugin-1.2.3
nicolasvuillamy.vscode-groovy-lint-1.2.9
nrwl.angular-console-14.0.1
pkief.material-icon-theme-4.3.0
pranaygp.vscode-css-peek-4.0.0
richardwillis.vscode-gradle-3.5.2
vscjava.vscode-maven-0.25.0
xaver.clang-format-1.9.0
zignd.html-css-class-completion-1.19.0

Set up GO

Install the GO extension and tools
For Gitlab create directory

mkdir -p ${GOROOT}/src/gitlab.com/<username>


Make a config, the default with program changed to ${workspaceRoot}

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "remotePath": "",
            "port":2345,
            "host": "127.0.0.1",
            "program": "${workspaceRoot}",
            "env": {},
            "args": [],
            "showLog": true
        }
    ]
}

Set up Prettier

Install

sudo npm -g i prettier

Change vscode settings

{
    "prettier.semi": false
}

Change .vsocde/settings.json

{
    "prettier.semi": false
}

Change package settings in package.json. I think this is because it is broken

  "prettier": {
    "singleQuote": true,
    "semi": false
  }

Change package.json to run prettier

  "scripts": {
...
    "format": "prettier --write '**/*.{ts,js,css,html}'"
  },

Set up .prettierignore to ignore directories

build
coverage
dist

Other things

Web Server Setup

Install lws web server which is a better option than the default

sudo npm  i -g local-web-server

To get the famous green tick

cd /usr/local/lib/node_modules/local-web-server/node_modules/lws/ssl
sudo mv private-key.pem private-key.pem.old
sudo mv lws-cert.pem lws-cert.pem.old
sudo ln -s <your cert>/server.key private-key.pem
sudo ln -s <your cert>/server.crt lws-cert.pem

pwa setup angular

ng add @angular/pwa

Add this to your index.html

<meta name="Description" content="Put your description here.">
<link rel="apple-touch-icon" href="/assets/icons/icon-192x192.png"/>

Add this to tsconfig.app.json

"angularCompilerOptions": {
  "enableIvy": true
}

eslint setup

Install Packages

I set mine up using tslint which is being phased out. I did this using the migration tool. First install the packages

npm install @angular-eslint/eslint-plugin @angular-eslint/eslint-plugin-template @typescript-eslint/eslint-plugin @typescript-eslint/eslint-plugin-tslint @typescript-eslint/parser eslint-plugin-import eslint-plugin-jsdoc eslint-plugin-prefer-arrow eslint-plugin-react eslint-plugin-jest --save-dev

Run Conversion Tool

Install and run the conversion tools

npm i tslint-to-eslint-config --save-dev
npx  tslint-to-eslint-config
npx  tslint-to-eslint-config --prettier

Gave up

I gave up in the end and removed

npm r @typescript-eslint/eslint-plugin @typescript-eslint/eslint-plugin-tslint @typescript-eslint/parser codelyzer eslint eslint-config-prettier eslint-plugin-import eslint-plugin-jest eslint-plugin-jsdoc eslint-plugin-prefer-arrow eslint-plugin-prettier eslint-plugin-react
<br>
npm r @angular-eslint/builder @angular-eslint/eslint-plugin @angular-eslint/eslint-plugin-template @angular-eslint/schematics @angular-eslint/template-parser
<br>
npm r tslint
<br>

Then install

npm i eslint eslint-config-prettier eslint-plugin-prettier @typescript-eslint/eslint-plugin @typescript-eslint/parser
npm i @angular-eslint/builder @angular-eslint/eslint-plugin @angular-eslint/eslint-plugin-template @angular-eslint/schematics @angular-eslint/template-parser

Create a tslincrc.json

module.exports = {
  parser: '@typescript-eslint/parser',
  plugins: ['@typescript-eslint', 'prettier'],
  extends: [
    'plugin:@typescript-eslint/recommended',
    'plugin:prettier/recommended',
  ],
  rules: {
    '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
  },
}

Fix So it Runs

This needs to be addressed

        // "@angular-eslint/template/banana-in-box": "error",
        // "@angular-eslint/template/no-negated-async": "error",

Fix the Outfall

For Jest I had lots of problems until I removed .eslintrc.js and repeated the steps with the jest plugin in the list of npms to install
Now the rest of the issues
In .eslintrc.js Fix the rule to have unused underscore variables

"@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }],

Fix Promise's by adding void if we do not care about the result

// Changed from
this.router.navigateByUrl('home')
// To
void this.router.navigateByUrl('home')

Fix the Enums

Change the .eslintrc

    "no-shadow": "off",
    "@typescript-eslint/no-shadow": ["error"],
    // 'no-shadow': [
    //   'error',
    //   {
    //     hoist: 'all',
    //   },
    // ],

Fix the Http Header

You can have a | delimited list in the regex

    '@typescript-eslint/naming-convention': [
      "error",
      {
        "selector": "property",
        "format": ["strictCamelCase"],
        "filter": {
          // you can expand this regex as you find more cases that require quoting that you want to allow
          "regex": "[^(Content-type)$]",
          "match": false
        }
      }
    ],

ES Lint 2023

packages.json

{
  "name": "testvite",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "tsc && vite build",
    "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
    "preview": "vite preview"
  },
  "dependencies": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0"
  },
  "devDependencies": {
    "@types/jest": "^29.5.5",
    "@types/react": "^18.2.15",
    "@types/react-dom": "^18.2.7",
    "@typescript-eslint/eslint-plugin": "^6.0.0",
    "@typescript-eslint/parser": "^6.0.0",
    "@vitejs/plugin-react": "^4.0.3",
    "eslint": "^8.45.0",
    "eslint-config-prettier": "^9.0.0",
    "eslint-import-resolver-typescript": "^3.6.0",
    "eslint-plugin-ban": "^1.6.0",
    "eslint-plugin-css-import-order": "^1.1.0",
    "eslint-plugin-etc": "^2.0.3",
    "eslint-plugin-import": "^2.28.0",
    "eslint-plugin-jest": "^27.2.3",
    "eslint-plugin-jest-dom": "^5.0.2",
    "eslint-plugin-jsdoc": "^46.8.1",
    "eslint-plugin-jsx-a11y": "^6.7.1",
    "eslint-plugin-prettier": "^5.0.0",
    "eslint-plugin-react": "^7.33.1",
    "eslint-plugin-react-hooks": "^4.6.0",
    "eslint-plugin-react-redux": "^4.0.0",
    "eslint-plugin-react-refresh": "^0.4.3",
    "eslint-plugin-unicorn": "^48.0.1",
    "eslint-plugin-unused-imports": "^3.0.0",
    "jest": "^29.7.0",
    "typescript": "^5.0.2",
    "vite": "^4.4.5"
  }
}

.eslintrc.cjs

module.exports = {
  root: true,
  env: { browser: true, es2021: true, jest: true },
   
  globals: {
    globalThis: false
  },

  extends: [
    // "react-app",
    // "react-app/jest",

    "eslint:recommended",
    "plugin:jsdoc/recommended",
    "plugin:react/recommended",
    "plugin:react-redux/recommended",
    "plugin:@typescript-eslint/eslint-recommended",

    // "plugin:@cspell/recommended",

    "plugin:@typescript-eslint/recommended",
    // "plugin:@typescript-eslint/recommended-type-checked",
    "plugin:@typescript-eslint/stylistic",
    // "plugin:@typescript-eslint/stylistic-type-checked",

    "plugin:import/recommended",
    "plugin:import/typescript",
    "plugin:jest/recommended",

    "plugin:import/errors",
    "plugin:import/warnings",
    "plugin:import/typescript",
    "plugin:css-import-order/recommended",
    
    "plugin:jest-dom/recommended",
    "plugin:jsx-a11y/recommended",
    "plugin:react/jsx-runtime",

    "prettier"
  ],

  ignorePatterns: ["dist", ".eslintrc.cjs"],

  // ----------------------------------------
  // Parser
  parser: "@typescript-eslint/parser",

  parserOptions: {
    ecmaVersion: "latest",
    ecmaFeatures: {
      jsx: true
    },
    sourceType: "module",
    project: [
      "./tsconfig.eslint.json"
    ]
  },

  // ----------------------------------------
  // Plugins
  plugins: [
    "react-refresh",
    "ban",
    "jsdoc",
    "react",
    "react-hooks",
    "react-redux",
    "etc",
    "jest",
    "jest-dom",
    "jsx-a11y",
    "unused-imports",
    "css-import-order",
    "import"
  ],
  
  // ----------------------------------------
  // Settings
  settings: {

    "import/parsers": {
      "@typescript-eslint/parser": [".ts", "*.tsx"]
    },
    "import/resolver": {
      "typescript": {
        "alwaysTryTypes": true,
        "project": [
          "./tsconfig.json"
        ]
      }
    },    
    "react": {
      "version": "detect"
    },
    "jsdoc": {
      "mode": "typescript"
    }
  },

  reportUnusedDisableDirectives: true,

  // ----------------------------------------
  // Rules
  rules: {
    "react-refresh/only-export-components": [
      "warn",
      { allowConstantExport: true },
    ],
    "jest/no-commented-out-tests": "off",
    "react/jsx-uses-react": "error",
    "ban/ban": [
      "error",
      {
        "name": ["*", "forEach"],
        "message": "Use a for-of loop instead"
      },
      {
        "name": ["describe", "only"],
        "message": "Don't forget to remove .only before committing"
      },
      {
        "name": ["it", "only"],
        "message": "Don't forget to remove .only before committing"
      },
      {
        "name": ["test", "only"],
        "message": "Don't forget to remove .only before committing"
      }
    ],
    "no-restricted-imports": [
      "error",
      {
        "paths": [
          {
            "name": "lodash",
            "importNames": ["isArray"],
            "message": "Use Array.isArray instead."
          }
        ]
      }
    ],
    "callback-return": "error",
    "complexity": "off",
    "constructor-super": "error",
    "dot-notation": "error",
    "eqeqeq": "error",
    "eol-last": "error",
    "guard-for-in": "error",
    "linebreak-style": "off",
    "max-classes-per-file": "off",
    "new-parens": "error",
    "newline-per-chained-call": "off",
    "no-bitwise": "off",
    "no-caller": "error",
    "no-cond-assign": "error",
    "no-console": "off",
    "no-constant-condition": [
      "error",
      {
        "checkLoops": false
      }
    ],
    "no-debugger": "error",
    "no-duplicate-imports": "error",
    "no-empty": "error",
    "no-else-return": [
      "error",
      {
        "allowElseIf": false
      }
    ],
    "no-eval": "error",
    "no-extra-bind": "error",
    "no-extra-semi": "off",
    "no-fallthrough": "off",
    "no-floating-decimal": "error",
    "no-inner-declarations": "off",
    "no-invalid-this": "off",
    "no-irregular-whitespace": "error",
    "no-lonely-if": "error",
    "no-magic-numbers": "off",
    "no-multiple-empty-lines": [
      "error",
      {
        "max": 1
      }
    ],
    "no-new-wrappers": "error",
    "no-redeclare": "off",
    "no-sparse-arrays": "error",
    "no-sync": [
      "error",
      {
        "allowAtRootLevel": true
      }
    ],
    "no-template-curly-in-string": "error",
    "no-throw-literal": "error",
    "no-undef-init": "error",
    "no-unneeded-ternary": [
      "error",
      {
        "defaultAssignment": false
      }
    ],
    "no-unsafe-finally": "error",
    "no-unused-expressions": "error",
    "no-unused-labels": "error",
    "no-useless-call": "error",
    "no-useless-concat": "error",
    "no-useless-constructor": "off",
    "no-var": "error",
    "no-void": "error",
    "object-shorthand": "error",
    "one-var": ["error", "never"],
    "prefer-arrow-callback": [
      "error",
      {
        "allowNamedFunctions": true
      }
    ],
    "prefer-const": [
      "error",
      {
        "destructuring": "all"
      }
    ],
    "prefer-object-spread": "error",
    "prefer-promise-reject-errors": "error",
    "prefer-rest-params": "error",
    "prefer-spread": "error",
    "prefer-template": "off",
    "radix": "error",
    "spaced-comment": [
      "error",
      "always",
      {
        "line": {
          "markers": ["/"]
        }
      }
    ],
    "sort-imports": "off",
    "use-isnan": "error",
    "valid-typeof": "off",
    "yoda": "error",
    "import/extensions": ["error", "never"],
    "import/no-deprecated": "warn",
    "import/no-unused-modules": "error",
    "import/no-cycle": "off",
    "import/no-self-import": "error",
    "import/no-dynamic-require": "error",
    "import/no-useless-path-segments": "error",
    "import/no-duplicates": "error",
    "import/no-default-export": "error",
    "import/order": [
      "error",
      {
        "newlines-between": "always",
        "groups": ["internal", "unknown", "external", "builtin", ["parent", "sibling", "index"]],
        "alphabetize": {
          "order": "asc",
          "caseInsensitive": true
        },
        "pathGroups": [
          {
            "pattern": "react",
            "group": "external",
            "position": "before"
          },
          {
            "pattern": "@sourcegraph/**",
            "group": "external",
            "position": "after"
          },
          {
            "pattern": "*.scss",
            "group": "index",
            "patternOptions": {
              "matchBase": true
            },
            "position": "after"
          }
        ],
        "pathGroupsExcludedImportTypes": []
      }
    ],
    "jsdoc/require-returns": "off",
    "jsdoc/require-jsdoc": "off",
    "jsdoc/require-param": "off",
    "jsdoc/no-bad-blocks": "error",
    "jsdoc/check-indentation": "off",
    "jsdoc/check-tag-names": [
      "error",
      {
        "definedTags": ["hidden", "internal"]
      }
    ],
    "react-hooks/exhaustive-deps": "error",
    "react-hooks/rules-of-hooks": "error",
    "react/button-has-type": "error",
    "react/display-name": "warn",
    "react/forbid-dom-props": [
      "error",
      {
        "forbid": ["style"]
      }
    ],
    "react/jsx-boolean-value": ["error", "always"],
    "react/jsx-curly-brace-presence": "error",
    "react/jsx-fragments": ["error", "syntax"],
    "react/jsx-key": "error",
    "react/jsx-no-bind": "off",
    "react/jsx-no-comment-textnodes": "error",
    "react/jsx-no-target-blank": "error",
    "react/no-access-state-in-setstate": "error",
    "react/no-array-index-key": "warn",
    "react/no-deprecated": "warn",
    "react/no-did-mount-set-state": "error",
    "react/no-did-update-set-state": "error",
    "react/no-direct-mutation-state": "error",
    "react/no-find-dom-node": "error",
    "react/no-is-mounted": "error",
    "react/no-multi-comp": [
      "off",
      {
        "ignoreStateless": true
      }
    ],
    "react/no-redundant-should-component-update": "error",
    "react/no-string-refs": "error",
    "react/no-this-in-sfc": "error",
    "react/no-typos": "error",
    "react/no-unescaped-entities": [
      "error",
      {
        "forbid": [">", "}"]
      }
    ],
    "react/no-unsafe": [
      "error",
      {
        "checkAliases": true
      }
    ],
    "react/no-unused-state": "error",
    "react/prefer-stateless-function": [
      "error",
      {
        "ignorePureComponents": true
      }
    ],
    "react/require-render-return": "error",
    "react/self-closing-comp": "error",
    "react/void-dom-elements-no-children": "error",
    "react/prop-types": "off",
    "etc/throw-error": "error",
    "etc/no-deprecated": "warn",
    "@typescript-eslint/no-var-requires": "off",
    "@typescript-eslint/prefer-regexp-exec": "off",
    "@typescript-eslint/no-unsafe-call": "warn",
    "@typescript-eslint/no-unsafe-member-access": "warn",
    "@typescript-eslint/no-unsafe-return": "off",
    "@typescript-eslint/no-unsafe-assignment": "warn",
    "id-length": [
      "error",
      {
        "min": 3,
        "properties": "never",
        "exceptions": ["to", "as", "id", "it", "fs", "os", "H", "a", "b"]
      }
    ],
    "unused-imports/no-unused-vars": "off",
    "no-unsafe-optional-chaining": "off",
    "@typescript-eslint/no-unsafe-argument": "off",
    "@typescript-eslint/no-unnecessary-type-constraint": "off"
  },

  // ----------------------------------------
  // Overrides
  overrides: [
    {
      "files": ["*.ts", "*.tsx"],
      "parser": "@typescript-eslint/parser",
      "plugins": ["@typescript-eslint"],
      "rules": {
        "@typescript-eslint/adjacent-overload-signatures": "error",
        "@typescript-eslint/array-type": "error",
        "@typescript-eslint/await-thenable": "error",
        "@typescript-eslint/ban-types": [
          "error",
          {
            "extendDefaults": true,
            "types": {
              "object": false,
              "{}": false
            }
          }
        ],
        "@typescript-eslint/naming-convention": [
          "off",
          {
            "selector": "default",
            "format": null
          },
          {
            "selector": "typeLike",
            "format": ["PascalCase"],
            "leadingUnderscore": "allow",
            "trailingUnderscore": "allow"
          }
        ],
        "@typescript-eslint/explicit-function-return-type": [
          "error",
          {
            "allowExpressions": true,
            "allowTypedFunctionExpressions": true,
            "allowHigherOrderFunctions": true
          }
        ],
        "@typescript-eslint/indent": "off",
        "@typescript-eslint/interface-name-prefix": "off",
        "@typescript-eslint/member-delimiter-style": "off",
        "@typescript-eslint/member-ordering": "off",
        "@typescript-eslint/no-empty-interface": "off",
        "@typescript-eslint/no-empty-function": [
          "error",
          {
            "allow": ["arrowFunctions"]
          }
        ],
        "@typescript-eslint/no-explicit-any": "warn",
        "@typescript-eslint/no-for-in-array": "error",
        "@typescript-eslint/no-floating-promises": "error",
        "@typescript-eslint/no-inferrable-types": [
          "error",
          {
            "ignoreParameters": true
          }
        ],
        "@typescript-eslint/no-misused-new": "error",
        "@typescript-eslint/no-misused-promises": "warn",
        "@typescript-eslint/no-non-null-assertion": "warn",
        "@typescript-eslint/no-unnecessary-condition": "off",
        "@typescript-eslint/consistent-type-assertions": [
          "warn",
          {
            "assertionStyle": "as",
            "objectLiteralTypeAssertions": "never"
          }
        ],
        "@typescript-eslint/consistent-type-definitions": ["error", "interface"],
        "@typescript-eslint/no-base-to-string": "error",
        "@typescript-eslint/no-parameter-properties": "off",
        "@typescript-eslint/no-require-imports": "error",
        "@typescript-eslint/no-unnecessary-qualifier": "error",
        "@typescript-eslint/no-unnecessary-type-assertion": "warn",
        "@typescript-eslint/no-unsafe-call": "warn",
        "@typescript-eslint/no-unsafe-member-access": "warn",
        "@typescript-eslint/no-unsafe-return": "off",
        "@typescript-eslint/no-unsafe-assignment": "warn",
        "@typescript-eslint/no-unused-vars": [
          "warn",
          {
            "varsIgnorePattern": ".*",
            "args": "after-used",
            "ignoreRestSiblings": true
          }
        ],
        "@typescript-eslint/no-use-before-define": "off",
        "@typescript-eslint/no-useless-constructor": "error",
        "@typescript-eslint/no-var-requires": "error",
        "@typescript-eslint/prefer-as-const": "error",
        "@typescript-eslint/prefer-string-starts-ends-with": "error",
        "@typescript-eslint/prefer-function-type": "error",
        "@typescript-eslint/prefer-includes": "error",
        "@typescript-eslint/prefer-namespace-keyword": "error",
        "@typescript-eslint/prefer-optional-chain": "error",
        "@typescript-eslint/prefer-nullish-coalescing": "off",
        "@typescript-eslint/type-annotation-spacing": "off",
        "@typescript-eslint/triple-slash-reference": "error",
        "@typescript-eslint/restrict-template-expressions": "off",
        "@typescript-eslint/return-await": "error",
        "@typescript-eslint/unbound-method": "error",
        "@typescript-eslint/unified-signatures": "error",
        "jsdoc/no-types": "error",
        "jsdoc/no-undefined-types": "off",
        "jsdoc/require-param-type": "off",
        "jsdoc/require-returns-type": "off",
        "jsdoc/valid-types": "off",
        "import/no-unresolved": "off",
        "import/default": "off",
        "import/named": "off",
        "import/namespace": "off",
        "import/no-deprecated": "off",
        "react/no-direct-mutation-state": "off",
        "react/jsx-no-undef": "off",
        "jsx-a11y/no-onchange": "off",
        "jsx-a11y/no-autofocus": "off",
        "jsx-a11y/accessible-emoji": "off",
        "no-undef": "off",
        "no-dupe-class-members": "off",
        "require-await": "off"
      }
    },
    {
      "files": "*.d.ts",
      "rules": {
        "no-var": "off",
        "@typescript-eslint/explicit-member-accessibility": "off",
        "id-length": "off",
        "import/no-default-export": "off"
      }
    },
    {
      "files": "*.@(test|story).ts?(x)",
      "rules": {
        "react/jsx-no-bind": "off",
        "@typescript-eslint/explicit-function-return-type": "off",
        "react/button-has-type": "off"
      }
    },
    {
      "files": "*.test.tsx",
      "rules": {
        "@typescript-eslint/no-floating-promises": "off",
        "unicorn/prefer-flat-map": "off"
      }
    }
  ]
};

Set up Dev Container

So just git cloned https://github.com/microsoft/vscode-remote-try-python

Flask

For flask

  • Made a directory
  • Copied contents of vscode-remote-try-python
  • Add the requirements.txt project directory
  • Start vs code and it prompts to open the docker workspace
Flask==2.0.1
werkzeug==2.0.1
gunicorn==20.1.0

psycopg2==2.8.6
SQLAlchemy==1.4.15
SQLAlchemy-Utils==0.37.3
Flask-SQLAlchemy==2.5.1
alembic==1.6.3

redis==3.5.3
celery==5.0.5

pytest==6.2.4
pytest-cov==2.11.1
flake8==3.9.2
black==21.5b1

flask-debugtoolbar==0.11.0
Flask-Static-Digest==0.2.1
Flask-Secrets==0.1.0

pipreqs==0.4.10
Flask-Migrate==3.0.0
Flask-WTF==0.14.3
Flask-Script==2.0.6
Flask-Login==0.5.0
email-validator==1.1.2

Rebuild

Open the command pallete, search for and select Remote-Containers: Rebuild Container

Access to Localhost

To ensure you can access ports on the localhost you need to add.

{
	"name": "Python 3",

	"runArgs": [
        "--net", "host", 
	],
	"build": {
		"dockerfile": "Dockerfile",
		"context": ".",
		"args": {

Top Tips

Bindings

  • Ctrl + K - shows key bindings
  • Ctrl + P - command pallet
  • Ctrl + ` - command terminal
  • Ctrl + Space - intellisence
  • Ctrl + Shift [ Expand
  • Ctrl + Shift ] Collapse
  • F8 - Errors in file
  • File - Start typing filename
  • Shift + Alt + F - formatting

Extensions

  • Paste Json as code
  • Rename for renaming start and end tag
  • Template String convertor

tslint setup

Just a current version for reference

{
  "extends": "tslint:recommended",
  "rulesDirectory": [
    "codelyzer"
  ],
  "rules": {
    "align": {
      "options": [
        "parameters",
        "statements"
      ]
    },
    "array-type": false,
    "arrow-return-shorthand": true,
    "curly": true,
    "deprecation": {
      "severity": "warning"
    },
    "eofline": true,
    "import-blacklist": [
      true,
      "rxjs/Rx"
    ],
    "import-spacing": true,
    "indent": {
      "options": [
        "spaces"
      ]
    },
    "max-classes-per-file": false,
    "max-line-length": [
      true,
      140
    ],
    "member-ordering": [
      true,
      {
        "order": [
          "static-field",
          "instance-field",
          "static-method",
          "instance-method"
        ]
      }
    ],
    "no-console": [
      true,
      "debug",
      "info",
      "time",
      "timeEnd",
      "trace"
    ],
    "no-empty": false,
    "no-inferrable-types": [
      true,
      "ignore-params"
    ],
    "no-non-null-assertion": true,
    "no-redundant-jsdoc": true,
    "no-switch-case-fall-through": true,
    "no-var-requires": false,
    "object-literal-key-quotes": [
      true,
      "as-needed"
    ],
    "quotemark": [
      true,
      "single"
    ],
    "semicolon": {
      "options": [
        "never"
      ]
    },
    "space-before-function-paren": {
      "options": {
        "anonymous": "never",
        "asyncArrow": "always",
        "constructor": "never",
        "method": "never",
        "named": "never"
      }
    },
    "typedef": [
      true,
      "call-signature"
    ],
    "typedef-whitespace": {
      "options": [
        {
          "call-signature": "nospace",
          "index-signature": "nospace",
          "parameter": "nospace",
          "property-declaration": "nospace",
          "variable-declaration": "nospace"
        },
        {
          "call-signature": "onespace",
          "index-signature": "onespace",
          "parameter": "onespace",
          "property-declaration": "onespace",
          "variable-declaration": "onespace"
        }
      ]
    },
    "variable-name": {
      "options": [
        "ban-keywords",
        "check-format",
        "allow-pascal-case"
      ]
    },
    "whitespace": {
      "options": [
        "check-branch",
        "check-decl",
        "check-operator",
        "check-separator",
        "check-type",
        "check-typecast"
      ]
    },
    "component-class-suffix": true,
    "contextual-lifecycle": true,
    "directive-class-suffix": true,
    "no-conflicting-lifecycle": true,
    "no-host-metadata-property": true,
    "no-input-rename": true,
    "no-inputs-metadata-property": true,
    "no-output-native": true,
    "no-output-on-prefix": true,
    "no-output-rename": true,
    "no-outputs-metadata-property": true,
    "template-banana-in-box": true,
    "template-no-negated-async": true,
    "use-lifecycle-interface": true,
    "use-pipe-transform-interface": true,
    "directive-selector": [
      true,
      "attribute",
      "app",
      "camelCase"
    ],
    "component-selector": [
      true,
      "element",
      "app",
      "kebab-case"
    ]
  }
}

C++ Setup

This is an example of setting up C++. I use CMake because the c_cpp_properties.json is just for the code editor.

Exmaple C++ code

#include <iostream>
#include <Magick++.h>

int main()
{
    std::cout << MagickCore::GetMagickVersion(NULL) << std::endl;
    return 0;
}


Here is the c_cpp_properties.json noting that compilerPath is commented out. Not doing this will result in gcc swiggles suggesting includes missing for Magick++.h

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [],
            // "compilerPath": "/usr/bin/gcc",
            "cStandard": "c17",
            "cppStandard": "gnu++17",
            "intelliSenseMode": "linux-gcc-x64",
            "configurationProvider": "ms-vscode.cmake-tools"
        }
    ],
    "version": 4
}

And here is the cmake showing how to include a third-party file

cmake_minimum_required(VERSION 3.0.0)
project(testcpp VERSION 0.1.0)

include(CTest)
enable_testing()

add_definitions(-DMAGICKCORE_HDRI_ENABLE=0)
add_definitions(-DMAGICKCORE_QUANTUM_DEPTH=16)

add_executable(testcpp main.cpp)
include_directories(/usr/include/x86_64-linux-gnu/ImageMagick-6 /usr/include/ImageMagick-6)

target_include_directories(${PROJECT_NAME} PUBLIC "/usr/lib/x86_64-linux-gnu/")
target_link_libraries(${PROJECT_NAME} "MagickCore-6.Q16")

Probably a better way for a know library is use find_package but it is far more likely you are looking to know what is the equivalent of -L and -l in cmake

cmake_minimum_required(VERSION 3.0.0)
project(testcpp VERSION 0.1.0)

include(CTest)
enable_testing()

add_definitions(-DMAGICKCORE_HDRI_ENABLE=0)
add_definitions(-DMAGICKCORE_QUANTUM_DEPTH=16)

add_executable(testcpp main.cpp)
include_directories(/usr/include/x86_64-linux-gnu/ImageMagick-6 /usr/include/ImageMagick-6)

find_package(ImageMagick COMPONENTS Magick++)
target_link_libraries(${PROJECT_NAME} PRIVATE "MagickCore-6.Q16")

Debugging NODE_API_MODULE

Below is how to debug a C++ binary inside of VS Code.

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug",
            "preLaunchTask": "npm: build:dev",
            "program": "/usr/bin/node",
            "args": ["/home/iwiseman/dev/projects/nodeapi/basic-node-addon/index.js"]
        }
    ]
}