prettier / prettier-vscode

Visual Studio Code extension for Prettier
https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode
MIT License
5.03k stars 447 forks source link

Prettier extension deletes line of code after pasting #3371

Open teinett opened 3 weeks ago

teinett commented 3 weeks ago

I create new project of StrapiJS 5, which is in beta now: npx create-strapi-app@beta learn-strapi-5 --quickstart.

They have package.json with commands:

"scripts": {
    "build": "strapi build",
    "develop": "strapi develop",
    "start": "strapi start",
    "strapi": "strapi"
  },

I don't like command "develop", I usually use "dev". So I want to create this additional command for myself.

My actions:

What happened: The moment I paste this line, it disappears. I can do CMD-Z, and the copied line appears. Something deleted my line on the moment of paste and not saving.

What I expected: nothing will disappear at the moment of paste. In this case, I don't have code to work with.

I disabled Prettier in the settings of VS Code, and this strange behavior stopped.

I use:

Code of package.json:

{
  "name": "learn-strapi-5",
  "version": "0.1.0",
  "private": true,
  "description": "A Strapi application",
  "license": "MIT",
  "scripts": {
    "build": "strapi build",
    "develop": "strapi develop",
    "start": "strapi start",
    "strapi": "strapi"
  },
  "dependencies": {
    "@strapi/plugin-cloud": "5.0.0-beta.3",
    "@strapi/plugin-users-permissions": "5.0.0-beta.3",
    "@strapi/strapi": "5.0.0-beta.1",
    "better-sqlite3": "9.4.3",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "react-router-dom": "^6.0.0",
    "styled-components": "5.3.3"
  },
  "engines": {
    "node": ">=18.0.0 <=20.x.x",
    "npm": ">=6.0.0"
  }
}

Video of this unwanted behavior is attached.

https://github.com/prettier/prettier-vscode/assets/1038168/c8e231b9-a195-411e-9406-d8d2a24088aa

Prettier logs:

Details

``` ["INFO" - 10:15:48] Extension Name: esbenp.prettier-vscode. ["INFO" - 10:15:48] Extension Version: 10.4.0. ["INFO" - 10:16:00] Formatting file:///Users/teine/Development/learn-strapi-5/package.json ["INFO" - 10:16:00] PrettierInstance: { "modulePath": "/Users/teine/Development/learn-strapi-5/node_modules/prettier/index.js", "version": "2.8.4", "prettierModule": { "doc": { "builders": { "line": { "type": "line" }, "softline": { "type": "line", "soft": true }, "hardline": { "type": "concat", "parts": [ { "type": "line", "hard": true }, { "type": "break-parent" } ] }, "literalline": { "type": "concat", "parts": [ { "type": "line", "hard": true, "literal": true }, { "type": "break-parent" } ] }, "lineSuffixBoundary": { "type": "line-suffix-boundary" }, "cursor": { "type": "cursor" }, "breakParent": { "type": "break-parent" }, "trim": { "type": "trim" }, "hardlineWithoutBreakParent": { "type": "line", "hard": true }, "literallineWithoutBreakParent": { "type": "line", "hard": true, "literal": true } }, "printer": {}, "utils": {}, "debug": {} }, "version": "2.8.4", "util": {}, "__internal": { "errors": {}, "coreOptions": { "CATEGORY_CONFIG": "Config", "CATEGORY_EDITOR": "Editor", "CATEGORY_FORMAT": "Format", "CATEGORY_OTHER": "Other", "CATEGORY_OUTPUT": "Output", "CATEGORY_GLOBAL": "Global", "CATEGORY_SPECIAL": "Special", "options": { "cursorOffset": { "since": "1.4.0", "category": "Special", "type": "int", "default": -1, "range": { "start": -1, "end": null, "step": 1 }, "description": "Print (to stderr) where a cursor at the given position would move to after formatting.\nThis option cannot be used with --range-start and --range-end.", "cliCategory": "Editor" }, "endOfLine": { "since": "1.15.0", "category": "Global", "type": "choice", "default": [ { "since": "1.15.0", "value": "auto" }, { "since": "2.0.0", "value": "lf" } ], "description": "Which end of line characters to apply.", "choices": [ { "value": "lf", "description": "Line Feed only (\\n), common on Linux and macOS as well as inside git repos" }, { "value": "crlf", "description": "Carriage Return + Line Feed characters (\\r\\n), common on Windows" }, { "value": "cr", "description": "Carriage Return character only (\\r), used very rarely" }, { "value": "auto", "description": "Maintain existing\n(mixed values within one file are normalised by looking at what's used after the first line)" } ] }, "filepath": { "since": "1.4.0", "category": "Special", "type": "path", "description": "Specify the input filepath. This will be used to do parser inference.", "cliName": "stdin-filepath", "cliCategory": "Other", "cliDescription": "Path to the file to pretend that stdin comes from." }, "insertPragma": { "since": "1.8.0", "category": "Special", "type": "boolean", "default": false, "description": "Insert @format pragma into file's first docblock comment.", "cliCategory": "Other" }, "parser": { "since": "0.0.10", "category": "Global", "type": "choice", "default": [ { "since": "0.0.10", "value": "babylon" }, { "since": "1.13.0" } ], "description": "Which parser to use.", "choices": [ { "value": "flow", "description": "Flow" }, { "value": "babel", "since": "1.16.0", "description": "JavaScript" }, { "value": "babel-flow", "since": "1.16.0", "description": "Flow" }, { "value": "babel-ts", "since": "2.0.0", "description": "TypeScript" }, { "value": "typescript", "since": "1.4.0", "description": "TypeScript" }, { "value": "acorn", "since": "2.6.0", "description": "JavaScript" }, { "value": "espree", "since": "2.2.0", "description": "JavaScript" }, { "value": "meriyah", "since": "2.2.0", "description": "JavaScript" }, { "value": "css", "since": "1.7.1", "description": "CSS" }, { "value": "less", "since": "1.7.1", "description": "Less" }, { "value": "scss", "since": "1.7.1", "description": "SCSS" }, { "value": "json", "since": "1.5.0", "description": "JSON" }, { "value": "json5", "since": "1.13.0", "description": "JSON5" }, { "value": "json-stringify", "since": "1.13.0", "description": "JSON.stringify" }, { "value": "graphql", "since": "1.5.0", "description": "GraphQL" }, { "value": "markdown", "since": "1.8.0", "description": "Markdown" }, { "value": "mdx", "since": "1.15.0", "description": "MDX" }, { "value": "vue", "since": "1.10.0", "description": "Vue" }, { "value": "yaml", "since": "1.14.0", "description": "YAML" }, { "value": "glimmer", "since": "2.3.0", "description": "Ember / Handlebars" }, { "value": "html", "since": "1.15.0", "description": "HTML" }, { "value": "angular", "since": "1.15.0", "description": "Angular" }, { "value": "lwc", "since": "1.17.0", "description": "Lightning Web Components" } ] }, "plugins": { "since": "1.10.0", "type": "path", "array": true, "default": [ { "value": [] } ], "category": "Global", "description": "Add a plugin. Multiple plugins can be passed as separate `--plugin`s.", "cliName": "plugin", "cliCategory": "Config" }, "pluginSearchDirs": { "since": "1.13.0", "type": "path", "array": true, "default": [ { "value": [] } ], "category": "Global", "description": "Custom directory that contains prettier plugins in node_modules subdirectory.\nOverrides default behavior when plugins are searched relatively to the location of Prettier.\nMultiple values are accepted.", "cliName": "plugin-search-dir", "cliCategory": "Config" }, "printWidth": { "since": "0.0.0", "category": "Global", "type": "int", "default": 80, "description": "The line length where Prettier will try wrap.", "range": { "start": 0, "end": null, "step": 1 } }, "rangeEnd": { "since": "1.4.0", "category": "Special", "type": "int", "default": null, "range": { "start": 0, "end": null, "step": 1 }, "description": "Format code ending at a given character offset (exclusive).\nThe range will extend forwards to the end of the selected statement.\nThis option cannot be used with --cursor-offset.", "cliCategory": "Editor" }, "rangeStart": { "since": "1.4.0", "category": "Special", "type": "int", "default": 0, "range": { "start": 0, "end": null, "step": 1 }, "description": "Format code starting at a given character offset.\nThe range will extend backwards to the start of the first line containing the selected statement.\nThis option cannot be used with --cursor-offset.", "cliCategory": "Editor" }, "requirePragma": { "since": "1.7.0", "category": "Special", "type": "boolean", "default": false, "description": "Require either '@prettier' or '@format' to be present in the file's first docblock comment\nin order for it to be formatted.", "cliCategory": "Other" }, "tabWidth": { "type": "int", "category": "Global", "default": 2, "description": "Number of spaces per indentation level.", "range": { "start": 0, "end": null, "step": 1 } }, "useTabs": { "since": "1.0.0", "category": "Global", "type": "boolean", "default": false, "description": "Indent with tabs instead of spaces." }, "embeddedLanguageFormatting": { "since": "2.1.0", "category": "Global", "type": "choice", "default": [ { "since": "2.1.0", "value": "auto" } ], "description": "Control how Prettier formats quoted code embedded in the file.", "choices": [ { "value": "auto", "description": "Format embedded code if Prettier can automatically identify it." }, { "value": "off", "description": "Never automatically format embedded code." } ] } } }, "optionsModule": { "hiddenDefaults": { "astFormat": "estree", "printer": {}, "locStart": null, "locEnd": null } }, "optionsNormalizer": {}, "utils": {} }, "__debug": {} } } ["INFO" - 10:16:00] Using ignore file (if present) at /Users/teine/Development/learn-strapi-5/.prettierignore ["INFO" - 10:16:00] File Info: { "ignored": false, "inferredParser": "json-stringify" } ["INFO" - 10:16:00] Detected local configuration (i.e. .prettierrc or .editorconfig), VS Code configuration will not be used ["INFO" - 10:16:00] Prettier Options: { "filepath": "/Users/teine/Development/learn-strapi-5/package.json", "parser": "json-stringify", "rangeEnd": 241, "rangeStart": 213, "useTabs": false, "tabWidth": 2, "endOfLine": "lf" } ["INFO" - 10:16:00] Formatting completed in 21ms. ["INFO" - 10:16:04] Formatting file:///Users/teine/Development/learn-strapi-5/package.json ["INFO" - 10:16:04] PrettierInstance: { "modulePath": "/Users/teine/Development/learn-strapi-5/node_modules/prettier/index.js", "version": "2.8.4", "prettierModule": { "doc": { "builders": { "line": { "type": "line" }, "softline": { "type": "line", "soft": true }, "hardline": { "type": "concat", "parts": [ { "type": "line", "hard": true }, { "type": "break-parent" } ] }, "literalline": { "type": "concat", "parts": [ { "type": "line", "hard": true, "literal": true }, { "type": "break-parent" } ] }, "lineSuffixBoundary": { "type": "line-suffix-boundary" }, "cursor": { "type": "cursor" }, "breakParent": { "type": "break-parent" }, "trim": { "type": "trim" }, "hardlineWithoutBreakParent": { "type": "line", "hard": true }, "literallineWithoutBreakParent": { "type": "line", "hard": true, "literal": true } }, "printer": {}, "utils": {}, "debug": {} }, "version": "2.8.4", "util": {}, "__internal": { "errors": {}, "coreOptions": { "CATEGORY_CONFIG": "Config", "CATEGORY_EDITOR": "Editor", "CATEGORY_FORMAT": "Format", "CATEGORY_OTHER": "Other", "CATEGORY_OUTPUT": "Output", "CATEGORY_GLOBAL": "Global", "CATEGORY_SPECIAL": "Special", "options": { "cursorOffset": { "since": "1.4.0", "category": "Special", "type": "int", "default": -1, "range": { "start": -1, "end": null, "step": 1 }, "description": "Print (to stderr) where a cursor at the given position would move to after formatting.\nThis option cannot be used with --range-start and --range-end.", "cliCategory": "Editor" }, "endOfLine": { "since": "1.15.0", "category": "Global", "type": "choice", "default": [ { "since": "1.15.0", "value": "auto" }, { "since": "2.0.0", "value": "lf" } ], "description": "Which end of line characters to apply.", "choices": [ { "value": "lf", "description": "Line Feed only (\\n), common on Linux and macOS as well as inside git repos" }, { "value": "crlf", "description": "Carriage Return + Line Feed characters (\\r\\n), common on Windows" }, { "value": "cr", "description": "Carriage Return character only (\\r), used very rarely" }, { "value": "auto", "description": "Maintain existing\n(mixed values within one file are normalised by looking at what's used after the first line)" } ] }, "filepath": { "since": "1.4.0", "category": "Special", "type": "path", "description": "Specify the input filepath. This will be used to do parser inference.", "cliName": "stdin-filepath", "cliCategory": "Other", "cliDescription": "Path to the file to pretend that stdin comes from." }, "insertPragma": { "since": "1.8.0", "category": "Special", "type": "boolean", "default": false, "description": "Insert @format pragma into file's first docblock comment.", "cliCategory": "Other" }, "parser": { "since": "0.0.10", "category": "Global", "type": "choice", "default": [ { "since": "0.0.10", "value": "babylon" }, { "since": "1.13.0" } ], "description": "Which parser to use.", "choices": [ { "value": "flow", "description": "Flow" }, { "value": "babel", "since": "1.16.0", "description": "JavaScript" }, { "value": "babel-flow", "since": "1.16.0", "description": "Flow" }, { "value": "babel-ts", "since": "2.0.0", "description": "TypeScript" }, { "value": "typescript", "since": "1.4.0", "description": "TypeScript" }, { "value": "acorn", "since": "2.6.0", "description": "JavaScript" }, { "value": "espree", "since": "2.2.0", "description": "JavaScript" }, { "value": "meriyah", "since": "2.2.0", "description": "JavaScript" }, { "value": "css", "since": "1.7.1", "description": "CSS" }, { "value": "less", "since": "1.7.1", "description": "Less" }, { "value": "scss", "since": "1.7.1", "description": "SCSS" }, { "value": "json", "since": "1.5.0", "description": "JSON" }, { "value": "json5", "since": "1.13.0", "description": "JSON5" }, { "value": "json-stringify", "since": "1.13.0", "description": "JSON.stringify" }, { "value": "graphql", "since": "1.5.0", "description": "GraphQL" }, { "value": "markdown", "since": "1.8.0", "description": "Markdown" }, { "value": "mdx", "since": "1.15.0", "description": "MDX" }, { "value": "vue", "since": "1.10.0", "description": "Vue" }, { "value": "yaml", "since": "1.14.0", "description": "YAML" }, { "value": "glimmer", "since": "2.3.0", "description": "Ember / Handlebars" }, { "value": "html", "since": "1.15.0", "description": "HTML" }, { "value": "angular", "since": "1.15.0", "description": "Angular" }, { "value": "lwc", "since": "1.17.0", "description": "Lightning Web Components" } ] }, "plugins": { "since": "1.10.0", "type": "path", "array": true, "default": [ { "value": [] } ], "category": "Global", "description": "Add a plugin. Multiple plugins can be passed as separate `--plugin`s.", "cliName": "plugin", "cliCategory": "Config" }, "pluginSearchDirs": { "since": "1.13.0", "type": "path", "array": true, "default": [ { "value": [] } ], "category": "Global", "description": "Custom directory that contains prettier plugins in node_modules subdirectory.\nOverrides default behavior when plugins are searched relatively to the location of Prettier.\nMultiple values are accepted.", "cliName": "plugin-search-dir", "cliCategory": "Config" }, "printWidth": { "since": "0.0.0", "category": "Global", "type": "int", "default": 80, "description": "The line length where Prettier will try wrap.", "range": { "start": 0, "end": null, "step": 1 } }, "rangeEnd": { "since": "1.4.0", "category": "Special", "type": "int", "default": null, "range": { "start": 0, "end": null, "step": 1 }, "description": "Format code ending at a given character offset (exclusive).\nThe range will extend forwards to the end of the selected statement.\nThis option cannot be used with --cursor-offset.", "cliCategory": "Editor" }, "rangeStart": { "since": "1.4.0", "category": "Special", "type": "int", "default": 0, "range": { "start": 0, "end": null, "step": 1 }, "description": "Format code starting at a given character offset.\nThe range will extend backwards to the start of the first line containing the selected statement.\nThis option cannot be used with --cursor-offset.", "cliCategory": "Editor" }, "requirePragma": { "since": "1.7.0", "category": "Special", "type": "boolean", "default": false, "description": "Require either '@prettier' or '@format' to be present in the file's first docblock comment\nin order for it to be formatted.", "cliCategory": "Other" }, "tabWidth": { "type": "int", "category": "Global", "default": 2, "description": "Number of spaces per indentation level.", "range": { "start": 0, "end": null, "step": 1 } }, "useTabs": { "since": "1.0.0", "category": "Global", "type": "boolean", "default": false, "description": "Indent with tabs instead of spaces." }, "embeddedLanguageFormatting": { "since": "2.1.0", "category": "Global", "type": "choice", "default": [ { "since": "2.1.0", "value": "auto" } ], "description": "Control how Prettier formats quoted code embedded in the file.", "choices": [ { "value": "auto", "description": "Format embedded code if Prettier can automatically identify it." }, { "value": "off", "description": "Never automatically format embedded code." } ] } } }, "optionsModule": { "hiddenDefaults": { "astFormat": "estree", "printer": {}, "locStart": null, "locEnd": null } }, "optionsNormalizer": {}, "utils": {} }, "__debug": {} } } ["INFO" - 10:16:04] Using ignore file (if present) at /Users/teine/Development/learn-strapi-5/.prettierignore ["INFO" - 10:16:04] File Info: { "ignored": false, "inferredParser": "json-stringify" } ["INFO" - 10:16:04] Detected local configuration (i.e. .prettierrc or .editorconfig), VS Code configuration will not be used ["INFO" - 10:16:04] Prettier Options: { "filepath": "/Users/teine/Development/learn-strapi-5/package.json", "parser": "json-stringify", "rangeEnd": 241, "rangeStart": 213, "useTabs": false, "tabWidth": 2, "endOfLine": "lf" } ["INFO" - 10:16:04] Formatting completed in 22ms. ```