Giter Site home page Giter Site logo

cpy's Introduction

cpy

Copy files

IMPORTANT: This package has a lot of problems and I unfortunately don't have time to fix them. I would recommend against using this package until these problems are resolved. Help welcome (see the issue tracker) πŸ™

Why

  • Fast by cloning the files whenever possible.
  • Resilient by using graceful-fs.
  • User-friendly by accepting globs and creating non-existent destination directories.
  • User-friendly error messages.
  • Progress reporting.

Install

npm install cpy

Usage

import cpy from 'cpy';

await cpy([
	'source/*.png', // Copy all .png files
	'!source/goat.png', // Ignore goat.png
], 'destination');

// Copy node_modules to destination/node_modules
await cpy('node_modules', 'destination');

// Copy node_modules content to destination
await cpy('node_modules/**', 'destination');

// Copy node_modules structure but skip all files except package.json files
await cpy('node_modules/**/*.json', 'destination');

// Copy all png files into destination without keeping directory structure
await cpy('**/*.png', 'destination', {flat: true});

console.log('Files copied!');

API

cpy(source, destination, options?)

Returns a Promise<string[]> with the destination file paths.

source

Type: string | string[]

Files to copy.

If any of the files do not exist, an error will be thrown (does not apply to globs).

destination

Type: string

Destination directory.

options

Type: object

Options are passed to globby.

In addition, you can specify the below options.

cwd

Type: string
Default: process.cwd()

Working directory to find source files.

overwrite

Type: boolean
Default: true

Overwrite existing files.

flat

Type: boolean
Default: false

Flatten directory structure. All copied files will be put in the same directory.

import cpy from 'cpy';

await cpy('src/**/*.js', 'destination', {
	flat: true
});
rename

Type: string | Function

Filename or function returning a filename used to rename every file in source.

import cpy from 'cpy';

await cpy('foo.js', 'destination', {
	// The `basename` is the filename with extension.
	rename: basename => `prefix-${basename}`
});

await cpy('foo.js', 'destination', {
	rename: 'new-name'
});
concurrency

Type: number
Default: (os.cpus().length || 1) * 2

Number of files being copied concurrently.

ignoreJunk

Type: boolean
Default: true

Ignores junk files.

filter

Type: Function

Function to filter files to copy.

Receives a source file object as the first argument.

Return true to include, false to exclude. You can also return a Promise that resolves to true or false.

import cpy from 'cpy';

await cpy('foo', 'destination', {
	filter: file => file.extension !== 'nocopy'
});
Source file object
path

Type: string
Example: '/tmp/dir/foo.js'

Resolved path to the file.

relativePath

Type: string
Example: 'dir/foo.js' if cwd was '/tmp'

Relative path to the file from cwd.

name

Type: string
Example: 'foo.js'

Filename with extension.

nameWithoutExtension

Type: string
Example: 'foo'

Filename without extension.

extension

Type: string
Example: 'js'

File extension.

Progress reporting

cpy.on('progress', handler)

handler(progress)

Type: Function

progress
{
	completedFiles: number,
	totalFiles: number,
	completedSize: number,
	percent: number,
	sourcePath: string,
	destinationPath: string,
}
  • completedSize is in bytes
  • percent is a value between 0 and 1
  • sourcePath is the absolute source path of the current file being copied.
  • destinationPath is The absolute destination path of the current file being copied.

Note that the .on() method is available only right after the initial cpy call, so make sure you add a handler before awaiting the promise:

import cpy from 'cpy';

await cpy(source, destination).on('progress', progress => {
	// …
});

Related

cpy's People

Contributors

andarist avatar andrefgneves avatar antongolub avatar bendingbender avatar brandon93s avatar dpilafian avatar floatdrop avatar guillaumevincent avatar idered avatar jamiebuilds avatar karaggeorge avatar kevva avatar kittaakos avatar ragingwind avatar richienb avatar samverschueren avatar sanemat avatar schnittstabil avatar scrum avatar sibiraj-s avatar simonsiefke avatar sinchang avatar sindresorhus avatar stevenvachon avatar stroncium avatar threequartersjohn avatar whitecrownclown avatar yurysolovyov avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cpy's Issues

Copy separate file, with possible new name

I'd like to copy an existing file to a new path, with a possible new name. The idea would be something like

cpy package.json Build/$npm_package_name-$npm_package_version.json

I think we would need an option for that. Or we could check for a trailing slash, like cp does. I would prefer the later one, I'm not sure if that's a good idea because it might break existing use cases.

The file doesn't exist, even though it does

If I try to copy a folder using cpy-cli, I get an error message saying the file doesn't exist. The "file" is a folder, and it does exist.

The error is in index.js, line 81. I don't know the intent of the check
!sourcePaths.every(value => files.includes(value))
but that's the reason it fails.

That check was added September 22.

cpy has transitive dependencies with a CVE vulnerability

cpy depends on globby @ ^12.0.2. Following the dependency chain, this also pulls in globby @ 9.2.0. That version of globby depends on fast-glob which depends on glob-parent at a specific version with a vulnerability.

| +-- [email protected]
| | +-- @types/[email protected]
| | | +-- @types/[email protected]
| | | `-- @types/[email protected]
| | +-- [email protected]
| | | `-- [email protected]
| | +-- [email protected]
| | | `-- [email protected]
| | |   `-- [email protected]
| | +-- [email protected]
| | | +-- @mrmlnc/[email protected]
| | | | +-- [email protected]
| | | | `-- [email protected]
| | | +-- @nodelib/[email protected]
| | | +-- [email protected] <---
| | | | +-- [email protected]
| | | | | `-- [email protected] deduped
| | | | `-- [email protected]
+-------------+------------------+----------+-------------------+---------------+---------------------------------------+
|   LIBRARY   | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION |                 TITLE                 |
+-------------+------------------+----------+-------------------+---------------+---------------------------------------+
| glob-parent | CVE-2020-28469   | HIGH     | 3.1.0             | 5.1.2         | nodejs-glob-parent: Regular           |
|             |                  |          |                   |               | expression denial of service          |
|             |                  |          |                   |               | -->avd.aquasec.com/nvd/cve-2020-28469 |
+-------------+------------------+----------+-------------------+---------------+---------------------------------------+

The latest version of globby has a dependency tree which does pull in a fixed version of glob-parent.

option to preserve folder structure of copied folder

Currently the only way to preserve the folder structure from the sources is to specify cwd to the parent of the source and parents: true.

This is already a bit cumbersome if all you want to do is preserve the folder structure of what you are copying, but if the dest is a relative path then you must also make it absolute as well so that it isn't affected by cwd. Overall that results in more verbose and confusing code.

There should be an option that will preserve the folder structure of all copied sources into the destination without having the specify cwd.

Add `filter` option

Issuehunt badges

Can be useful for situations when glob patterns are not good enough.

It would receive the absolute source and destination path and is expected to return a boolean of whether or not to copy it.

Inspiration: https://github.com/jprichardson/node-fs-extra/blob/master/docs/copy.md


IssueHunt Summary

stroncium stroncium has been rewarded.

Backers (Total: $40.00)

Submitted pull Requests


Tips


IssueHunt has been backed by the following sponsors. Become a sponsor

ES2015ify – Part 2

ES2015ify – Part 2

  • Drop support for Node v0.10 and v0.12
  • Upgrade cp-file to ^v4.0
  • Remove pinkie-promise and object-assign
  • Use class, arrow functions etc.

Rename option with glob

With:

cpy('src/**/*.{js,css}', 'dest', { parents: true, rename: 'foo' });

I was expecting the src directory to be renamed to foo (perhaps unreasonably?)

dest/
  |
  + foo/
     |
     + file.js
     + file.css

But in fact, I get

dest/
  |
  + file.js
  + file.css
  + foo

[Windows] not working in npm script if use '

If I use npm script
"copy": "cpy './package.json' dist"

npm run copy
it will give me error
Cannot copy './package.json': the file doesn't exist

But if I remove ' like this cpy ./package.json dist it will run correctly

Dependency globby security vulnerability

There is a vulnerability in the glob-parent library used.
cpy>globby 9.2.0 >fast-glob 2.2.6 > glob-parent 3.1.0

GHSA-ww39-953v-wcq6

Is there a change to update globby to v12.0.0 or a later one, so that it ends up using glop-parent v5.1.2 which is the patched version?

Add `followSymlinks` option

Issuehunt badges

Should be off by default.

This task also involves adding it to https://github.com/sindresorhus/cpy-cli

Inspiration:


IssueHunt Summary

Sponsors (Total: $40.00)

Become a sponsor now!

Or submit a pull request to get the deposits!

Tips

Strange behavior on latest `recursive` mode

I installed latest cpy with yarn add cpy@sindresorhus/cpy.

// copy.js

// @ts-check

import cpy from 'cpy'

const args = process.argv.slice(2)

cpy(args, args.pop())
node copy 'node_modules/shiki/{dist/*.wasm,languages,themes}/**' public/shiki

image

node copy 'node_modules/shiki/{dist/*.wasm,languages,themes}/**' public/shiki/_ # note the `/_` here

image

I also tried the following one and it failed.

node copy 'node_modules/shiki/{dist/*.wasm,languages/**,themes/**}' public/shiki

But the following one also worked

node copy 'node_modules/shiki/{dist/*.wasm,languages/**,themes/**}' public/shiki/_

Upgrade globby to latest version

Now I have warnings in console log:

warning cpy > globby > fast-glob > micromatch > snapdragon > source-map-resolve > [email protected]: https://github.com/lydell/resolve-url#deprecated
warning cpy > globby > fast-glob > micromatch > snapdragon > source-map-resolve > [email protected]: Please see https://github.com/lydell/urix#deprecated

These warnings already fixed in all libraries. All what you need - upgarde globby to version 11.0.3

Wrong dependencies resolution

According to package.json the dependencies list is:

{
  "dependencies": {
    "arrify": "^3.0.0",
    "cp-file": "^9.1.0",
    "globby": "^12.0.0",
    "junk": "^3.1.0",
    "nested-error-stacks": "^2.1.0",
    "p-filter": "^2.1.0",
    "p-map": "^5.0.0"
}

However checking against my package-lock.json, cpy resolves dependencies like so:

Schermata 2021-10-12 alle 21 58 53

As shown, almost all packages are resolved with a version different than the one in the package.json and I can't figure out why. Could someone explain?

Doesn't copy "__"-prefixed files

cpy("path/to/__*.ext", destination)

doesn't copy, and throws no errors.

With the files renamed, this copies just fine:

cpy("path/to/_*.ext", destination)

Create destination directory if doesn't exist?

When no destination directory is present, the attempt to copy files there results in error:

CpyError: `src` and `dest` required

Is there any way to configure to have it instead created like e.g. the default cp?

Copy folder and preserve folder structure of the copied folder only

If we have the following tree:

src
  static
    images
      img1.jpg
      img2.jpg
    file1.txt
  ignoreme.txt

If I want to copy this entire folder contents of src/static to build/static and keep the folder structure, as far as I can tell there is no way to do it with this module. Using parents will also move src into build folder.

Adding cwd to the mix will pass the same option to dest parameter so instead of moving files to build folder it will copy them to src/build/....

Am I missing anything? Is there a way to copy a folder contests and preserve the contents folder structure to another destination?

cli fails silently

Actually cpy fails silently, which @kevva figured out.
For example cpy fails at the moment to (non-recursively) copy a directory:

$ cpy node_modules temp
$ echo $?
0

A quick-and-dirty fix would be:

--- a/cli.js
+++ b/cli.js
@@ -17,4 +17,8 @@ var cli = meow({
        string: ['_']
 });

-cpy([cli.input[0]], cli.input[1], {overwrite: cli.flags.overwrite});
+cpy([cli.input[0]], cli.input[1], {overwrite: cli.flags.overwrite}, function (err) {
+       if (err) {
+               throw err;
+       }
+});

But I hope theres something more informative:

$ cpy node_modules temp
cpy/cli.js:22
        throw err;
              ^
Error: EISDIR, read
    at Error (native)

Copy in serial?

It seems really unlikely to me that copying a bunch of files in parallel would speed anything up. Indeed, I would not be surprised to find it slowed things down. Increasing the number of files read simultaneously seems likely to encourage lots of seek delays for HDD's, and SSD's should be able to saturate their bandwidth regardless of how many files are being copied simultaneously.

It's probably worth running some benchmarks to prove this, but I think you would have seen Operating Systems commands / GUI's doing parallel copies if there were any advantage to it.

I guess technically, you could be copying from multiple slow network mounted drives - in which case parallelization might make sense. But I think that's a very small (possibly non-existent) percentage of users.

import error

Hi,

import cpy from "cpy";

Do you know how to remove this warning/error?

// tsconfig.json
    "allowSyntheticDefaultImports": true,
can only be default-imported using the 'esModuleInterop' flag  index.d.ts(161, 1): This module is declared with using 'export =', and can only be used with a default import when using the 'esModuleInterop' flag.

Progress reporting

It would be nice to have an ability to hook into underlying stream(s) to have this. This might be more tricky to get right WRT multiple files, though. Opening issue first to discuss.

Doesn’t overwrite in npm scripts

When I run cpy from a package.json script, It only copies the file if it doesn't already exist.
If the file exist, it doesn't overwrite, it does nothing.

When I run the same line in the terminal, not from an npm script, it does overwrite.

Error when glob matches directory

Currently it throws an error (EISDIR) when the glob matches a directory. I want to copy all files and directory structure to another directory. I am using cpy(['**/*'], '../output/dist', { cwd: 'assets', parents: true }, cb);. This does not work since **/* also matches the directory names.

I could make a PR to fix this if you know what behavior we should have. Should we just ignore empty directories or create them? I'm currently leaning toward creating any directories, which I think is the most intuitive.

Grunt log are not displayed accordingly

var svnTmpDir    = path.resolve( path.join( 'tmp', 'test-svn-plugin' ) );
var svnTagsDir   = path.join( svnTmpDir, 'tags', '1.0.0' );
var svnTrunkDir  = path.join( svnTmpDir, 'trunk' );
var svnAssetsDir = path.join( svnTmpDir, 'assets' );

// Copy and delete :)
var cpy = require( 'cpy' );
var del  = require( 'del' );

if ( grunt.file.isDir( assetsDir ) ) {
    grunt.log.writeln( 'Processing Plug-in assets...' );

    del(['*.{svg,png,jpg,gif}'], { cwd: svnAssetsDir }, function( err ) {
        grunt.log.warn( 'Plug-in assets deleted.' );

        cpy([
            'icon.svg',
            'icon-*.{png,jpg}',
            'banner-*.{png,jpg}',
            'screenshot-*.{png,jpg}'
        ], svnAssetsDir, { cwd: assetsDir }, function( err ) {
            grunt.log.ok( 'Plug-in icons, banners and screenshots copied.' );
        });
    });
}

if ( grunt.file.exists( svnTagsDir ) ) {
    grunt.log.writeln( 'Copying Plug-in to trunk...' );

    del(['**'], { cwd: svnTrunkDir }, function( err ) {
        grunt.log.warn( 'Plug-in trunk deleted.' );

        cpy(['**'], svnTrunkDir, { cwd: deployDir }, function( err ) {
            grunt.log.ok( 'Plug-in copied from deploy -> trunk repository.' );
        });
    });
}

But this display zigzag result. grunt.log.warn together, trunk log is displayed first instead of assets xD
capture

Add option to ignore a file in the source files

I would like to have an option to ignore some file in the source file list. Sometime I need to filter a file in the source which I don't want to copy them to destination. So I added code and test for testing. As a result I think It's not bad. What do you think about?

Failed to copy files into a drive (C:, D:) on Windows

I tried cpy and it's awesome! However, when I try it on windows, copying a file from C: to the basedir of E:, I got an error saying it failed to create the E: directory. This is the error message:

Cannot copy from `C:/hello.txt` to `E:\hello.txt`: Cannot create directory `E:\`: EPERM: operation not permitted, mkdir 'E:\'

Hope it will be fixed soon :)

Pattern-based rename

Use case
Copy files to the same directory with different extension - creating .mjs files based on .js files.

Solution
Either allow for bash like capturing groups or some string based patterns like i.e.

const options = {
  rename: '[basename].mjs' // could support also `[ext]`
}

Intention to implement
Yes, if you agree that is something u'd like to support.

Support preserving folder structure (recursive)

Issuehunt badges

This would fix: #30, #10, #40, #60
(If you want to take on this issue, ensure you read those issue threads too, for context)

And see #32 for a previous attempt.

This tasks also includes adding support for it in https://github.com/sindresorhus/cpy-cli.

This tasks also requires you to write a lot of tests.

And some inspiration from other tools:

Question: Should it be recursive by default? Why? Why not? Include reasoning.


Note: This is not an easy issue. It requires you to have good JavaScript and Node.js experience. I expect you to do a good job. Instead of asking to many questions, present solutions. The point of a issue bounty is to give me less work, not more. πŸ™Œ


IssueHunt Summary

idered idered has been rewarded.

Backers (Total: $120.00)

Submitted pull Requests


Tips

simplify API for --parents option

Hi,

If I want to copy all the html in assets directory and keep the directory structure inside dist directory I have to do the following command :

cpy '**/*.html' '../dist/' --cwd=assets --parents

I think the following command would be easier :

cpy 'assets/**/*.html' dist --parents
assets
β”œβ”€β”€ index.html
β”œβ”€β”€ robots.txt
└── test
    └── test.html

should return

dist
β”œβ”€β”€ index.html
└── test
    └── test.html

not

dist
└── assets
    β”œβ”€β”€ index.html
    └── test
        └── test.html
npm -v
2.14.7

node -v
4.2.3

uname -a
Linux guillaume-x240 3.19.0-39-generic #44~14.04.1-Ubuntu SMP Wed Dec 2 10:00:35 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

here the red test guillaumevincent@fad2b31

EISDIR: illegal operation on a directory

cpy('/project/lib/**/*', '/project/dupe')

Dir structure:

└── project/
    β”œβ”€β”€ lib/
    β”‚   β”œβ”€β”€ include/
    β”‚   β”‚   β”œβ”€β”€ file1.js
    β”‚   β”‚   └── file2.js
    β”‚   └── file.js
    └── package.json

Results in:

Cannot copy from `/project/lib/include` to `/project/temp/include`: cannot read from `/project/lib/include`: EISDIR: illegal operation on a directory, read

If I remove the lib/include dir, it works fine, but the structure of temp/ has been flattened.

This appears to be related to cpy/issues/10.

Source paths always preserved

Is this expected behavior for the CLI?

(at root of module)

flet@lappy:~/code/someproject$ ls assets/markup/
mock.html

flet@lappy:~/code/someproject$ cpy assets/markup/*.html dist

flet@lappy:~/code/someproject$ tree dist
dist
└── assets
    └── markup
        └── mock.html

I guess I was expecting it to work similarly to cp in linux?

flet@lappy:~/code/someproject$ cp assets/markup/*.html dist

flet@lappy:~/code/someproject$ tree dist
dist
└── mock.html

I realize this might not be the goal of this module and I'm prepared for this issue to be closed immediately :)

[Security] Update globby dependency to mitigate issue in glob-parent

globby dependency should be updated to mitigate a security flaw in glob-parent.

globby has a newer versions released that uses a fixed version of glob-parent, but cpy requires glob-parent ^9.2.0.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ moderate      β”‚ Regular expression denial of service                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Package       β”‚ glob-parent                                                  β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Patched in    β”‚ >=5.1.2                                                      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Dependency of β”‚ cpy-cli                                                      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Path          β”‚ cpy-cli > cpy > globby > fast-glob > glob-parent             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ More info     β”‚ https://www.npmjs.com/advisories/1751                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Suggestion: noJunk option

to exclude junk files (such as .DS_Store). This could be made available to the CLI and would reduce project dependencies.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.