From f249c0cffa613ce692201c5b24f7e941e2d1a5bc Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 21 Apr 2021 22:32:00 -0400 Subject: [PATCH] account for the extremely helpful and intuitive npm behaviour - fixes #1159 --- .changeset/two-students-melt.md | 5 +++++ packages/create-svelte/bin.js | 10 ++++----- packages/create-svelte/package.json | 1 + .../create-svelte/scripts/build-templates.js | 4 ++-- packages/create-svelte/utils.js | 21 +++++++++++-------- pnpm-lock.yaml | 8 +++++++ 6 files changed, 33 insertions(+), 16 deletions(-) create mode 100644 .changeset/two-students-melt.md diff --git a/.changeset/two-students-melt.md b/.changeset/two-students-melt.md new file mode 100644 index 000000000000..dbc25b1a54da --- /dev/null +++ b/.changeset/two-students-melt.md @@ -0,0 +1,5 @@ +--- +'create-svelte': patch +--- + +Add .gitignore files to new projects diff --git a/packages/create-svelte/bin.js b/packages/create-svelte/bin.js index 7f2ff907dd4a..d8002f0b9ca8 100755 --- a/packages/create-svelte/bin.js +++ b/packages/create-svelte/bin.js @@ -38,7 +38,7 @@ async function main() { mkdirp(cwd); } - const options = /** @type {import('../types/internal').Options} */ (await prompts([ + const options = /** @type {import('./types/internal').Options} */ (await prompts([ { type: 'select', name: 'template', @@ -145,11 +145,11 @@ async function main() { */ function write_template_files(template, typescript, name, cwd) { const dir = dist(`templates/${template}`); - copy(`${dir}/assets`, cwd); + copy(`${dir}/assets`, cwd, (name) => name.replace('gitignore', '.gitignore')); copy(`${dir}/package.json`, `${cwd}/package.json`); const manifest = `${dir}/files.${typescript ? 'ts' : 'js'}.json`; - const files = /** @type {import('../types/internal').File[]} */ (JSON.parse( + const files = /** @type {import('./types/internal').File[]} */ (JSON.parse( fs.readFileSync(manifest, 'utf-8') )); @@ -164,11 +164,11 @@ function write_template_files(template, typescript, name, cwd) { /** * * @param {string} cwd - * @param {import('../types/internal').Options} options + * @param {import('./types/internal').Options} options */ function write_common_files(cwd, options) { const shared = dist('shared.json'); - const { files } = /** @type {import('../types/internal').Common} */ (JSON.parse( + const { files } = /** @type {import('./types/internal').Common} */ (JSON.parse( fs.readFileSync(shared, 'utf-8') )); diff --git a/packages/create-svelte/package.json b/packages/create-svelte/package.json index a3c9fe52a52f..fa7a29537eb9 100644 --- a/packages/create-svelte/package.json +++ b/packages/create-svelte/package.json @@ -10,6 +10,7 @@ "@sveltejs/kit": "workspace:*", "@types/gitignore-parser": "^0.0.0", "@types/prettier": "^2.2.3", + "@types/prompts": "^2.0.10", "gitignore-parser": "^0.0.2", "prettier": "^2.2.1", "prettier-plugin-svelte": "^2.2.0", diff --git a/packages/create-svelte/scripts/build-templates.js b/packages/create-svelte/scripts/build-templates.js index 984d7ed1447f..2459d62c4625 100644 --- a/packages/create-svelte/scripts/build-templates.js +++ b/packages/create-svelte/scripts/build-templates.js @@ -38,7 +38,7 @@ async function generate_templates(shared) { // ignore contents of .gitignore or .ignore if (!gitignore.accepts(name) || !ignore.accepts(name) || name === '.ignore') return; - // the package.template.json thing is a bit annoying — basically we want + // the package.template.json thing is a bit annoying — basically we want // to be able to develop and deploy the app from here, but have a different // package.json in newly created projects (based on package.template.json) if (/\.(js|ts|svelte|svelte\.md)$/.test(name) || name === 'package.template.json') { @@ -55,7 +55,7 @@ async function generate_templates(shared) { }); } } else { - const dest = path.join(assets, name); + const dest = path.join(assets, name).replace('.gitignore', 'gitignore'); // npm does wacky stuff to gitignores mkdirp(path.dirname(dest)); fs.copyFileSync(path.join(cwd, name), dest); } diff --git a/packages/create-svelte/utils.js b/packages/create-svelte/utils.js index 573434963f0a..9b0d8fb00fda 100644 --- a/packages/create-svelte/utils.js +++ b/packages/create-svelte/utils.js @@ -16,27 +16,30 @@ export function rimraf(path) { (fs.rmSync || fs.rmdirSync)(path, { recursive: true, force: true }); } +/** + * @template T + * @param {T} x + */ +function identity(x) { + return x; +} + /** * @param {string} from * @param {string} to - * @param {(basename: string) => boolean} filter + * @param {(basename: string) => string} rename */ -export function copy(from, to, filter = () => true) { - if (!fs.existsSync(from)) return []; - if (!filter(path.basename(from))) return []; +export function copy(from, to, rename = identity) { + if (!fs.existsSync(from)) return; - const files = []; const stats = fs.statSync(from); if (stats.isDirectory()) { fs.readdirSync(from).forEach((file) => { - files.push(...copy(path.join(from, file), path.join(to, file))); + copy(path.join(from, file), path.join(to, rename(file))); }); } else { mkdirp(path.dirname(to)); fs.copyFileSync(from, to); - files.push(to); } - - return files; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6c947ca9e824..e677caeb11fe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -153,6 +153,7 @@ importers: '@sveltejs/kit': workspace:* '@types/gitignore-parser': ^0.0.0 '@types/prettier': ^2.2.3 + '@types/prompts': ^2.0.10 gitignore-parser: ^0.0.2 kleur: ^4.1.4 prettier: ^2.2.1 @@ -168,6 +169,7 @@ importers: '@sveltejs/kit': link:../kit '@types/gitignore-parser': 0.0.0 '@types/prettier': 2.2.3 + '@types/prompts': 2.0.10 gitignore-parser: 0.0.2 prettier: 2.2.1 prettier-plugin-svelte: 2.2.0_prettier@2.2.1 @@ -770,6 +772,12 @@ packages: resolution: {integrity: sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==} dev: true + /@types/prompts/2.0.10: + resolution: {integrity: sha512-W3PEl3l4vmxdgfY6LUG7ysh+mLJOTOFYmSpiLe6MCo1OdEm8b5s6ZJfuTQgEpYNwcMiiaRzJespPS5Py2tqLlQ==} + dependencies: + '@types/node': 14.14.41 + dev: true + /@types/pug/2.0.4: resolution: {integrity: sha1-h3L80EGOPNLMFxVV1zAHQVBR9LI=} dev: true