prettier-vscode icon indicating copy to clipboard operation
prettier-vscode copied to clipboard

Prettier extension deletes line of code after pasting

Open teinett opened this issue 10 months ago • 3 comments

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:

  • copy row "develop": "strapi develop", with CMD-C,
  • paste with CMD-V (so I can edit it later).

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:

  • VS Code - 1.88.1 (Universal) (latest for the moment) Commit: e170252f762678dec6ca2cc69aba1570769a5d39 Date: 2024-04-10T17:42:52.765Z (2 days ago) Electron: 28.2.8 ElectronBuildId: 27744544 Chromium: 120.0.6099.291 Node.js: 18.18.2 V8: 12.0.267.19-electron.0 OS: Darwin arm64 23.4.0

  • Prettier extension - v10.4.0 (latest for the moment)

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.

teinett avatar Apr 13 '24 13:04 teinett

This issue has been labeled as stale due to inactivity. Reply to keep this issue open.

github-actions[bot] avatar Jun 13 '24 01:06 github-actions[bot]

This issue has been labeled as stale due to inactivity. Reply to keep this issue open.

Please, fix the issue. It's not stale.

teinett avatar Jun 13 '24 10:06 teinett

This issue has been labeled as stale due to inactivity. Reply to keep this issue open.

github-actions[bot] avatar Aug 13 '24 01:08 github-actions[bot]