Skip to content

Commit

Permalink
fix: underscore escaping for dotfiles (#1737)
Browse files Browse the repository at this point in the history
* WIP: fix undersocre escaping for dotfiles 

(fix #1732)

* Fix charAt

* adding a short explanation to the docs.

* improved wording
  • Loading branch information
LinusBorg authored and Akryum committed Jul 4, 2018
1 parent 286d75e commit a9aa3de
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 1 deletion.
24 changes: 24 additions & 0 deletions docs/dev-guide/plugin-dev.md
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,30 @@ export default {
<%# END_REPLACE %>
```

#### Filename edge cases

If you want to render a template file that either begins with a dot (i.e. `.env`) you will have to follow a specific naming convention, since dotfiles are ignored when publishing your plugin to npm:
```
# dotfile templates have to use an underscore instead of the dot:
/generator/template/_env
# When calling api.render('./template'), this will be rendered in the project folder as:
.env
```
Consequently, this means that you also have to follow a special naming convention if you want to render file whose name actually begins with an underscore:
```
# such templates have to use two underscores instead of the dot:
/generator/template/__variables.scss
# When calling api.render('./template'), this will be rendered in the project folder as:
_variables.scss
```


### Prompts

#### Prompts for Built-in Plugins
Expand Down
5 changes: 4 additions & 1 deletion packages/@vue/cli/lib/GeneratorAPI.js
Original file line number Diff line number Diff line change
Expand Up @@ -138,9 +138,12 @@ class GeneratorAPI {
let filename = path.basename(rawPath)
// dotfiles are ignored when published to npm, therefore in templates
// we need to use underscore instead (e.g. "_gitignore")
if (filename.charAt(0) === '_') {
if (filename.charAt(0) === '_' && filename.charAt(1) !== '_') {
filename = `.${filename.slice(1)}`
}
if (filename.charAt(0) === '_' && filename.charAt(1) === '_') {
filename = `${filename.slice(1)}`
}
const targetPath = path.join(path.dirname(rawPath), filename)
const sourcePath = path.resolve(source, rawPath)
const content = renderFile(sourcePath, data, ejsOptions)
Expand Down

1 comment on commit a9aa3de

@kaysonli
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These changes do not appear to have been published to npm yet?

Please sign in to comment.