gruntjs / grunt-contrib-copy Goto Github PK
View Code? Open in Web Editor NEWCopy files and folders.
Home Page: http://gruntjs.com/
License: MIT License
Copy files and folders.
Home Page: http://gruntjs.com/
License: MIT License
Hey guys,
I'm trying to copy images from two separate directories into one destination dir. It never worked with the two syntaxes:
copy: {
images: {
files: {
"dist/release/core/images/": "assets/core/images/**",
"dist/release/core/images/": "assets/core/vendor/jquery/images/**"
}
}
}
copy: {
images: {
files: {
"dist/release/core/images/": [ "assets/core/images/**", "assets/core/vendor/jquery/images/**"]
}
}
}
Is this achievable?
Thanks
Using
I'm working on a fairly basic copy task and it seems the entire src
path is being saved.
Example:
copy: {
main: {
files: {
src: 'css/fonts/**',
dest: 'dist/css/fonts/'
}
}
}
This is generating the following structure: dist/css/fonts/css/fonts/myfile.ttf
just ran into this one.
I was trying to do the following:
files: {
'foo/bar/css/themes/': 'hello/world/hello/code/css/themes/**'
}
There are two files in the hello/world/../themes folder, we'll call them style1.css and style2.css. I was expecting the output to be:
foo/
bar/
css/
themes/
style1.css
style2.css
Instead I got:
foo/
bar/
css/
themes/
hello/
world/
hello/
code/
css/
themes/
style1.css
style2.css
changing the path from hello/world/hello/...
to hello/world/something-else/...
seems to have fixed the problem.
Here's my current config:
copy: {
build: {
files: [
//Copy the javascript files
{
expand: true, // Enable dynamic expansion.
cwd: 'scripts/',
src: ['**/*.js'], // Actual pattern(s) to match.
dest: '../js/', // Destination path prefix.
ext: '.js', // Dest filepaths will have this extension.
rename: function(dest, src){
return dest + src; //this is actually much more complicated in my code
}
},
//Copy the javascript files -debug
{
expand: true, // Enable dynamic expansion.
cwd: '../js/',
src: ['**/*.js'], // Actual pattern(s) to match.
dest: '../js/', // Destination path prefix.
ext: '-debug.js', // Dest filepaths will have this extension.
},
],
}
}
What I want to do is this:
scripts
folder and do some processing and renaming so that the result lives in ../js
.../js
and go through each .js
file and for each file, make an exact copy in the exact location with the filename ending in -debug.js
.With my current config, if I run grunt the first time, only the first task (drop into scripts
and do the processing/copying)` would run.
I need to run grunt again in order for the second copy (debug) to be generated.
It seems to me that before performing any copy, it actually first check to see if all the copy rules can be executed even though the second copy rule depends on the first one.
Is there anyway to make grunt ignore that and just run the first then second rule sequentially?
Hey guys -
I need the cwd option, and it looks like that was first introduced in 0.4.0a. I know rc5 support is also needed, but it'd be a huge help if you could push 0.4.0a to npm in the interim.
Thanks!
Matt
So, I've spent alot of time and I realize that my use case is highly uncommon, however, for a variety of reasons I need to work with a dynamic loop and I'm doing grunt.config
inside of a loop of unknown length with unknown key values, so there's no way to point to index
without using standard javascript variables.
That background info being established, is there a way to escape variables in the associate-type value pairs like the files : {}
one? I need to be able to do something like this:
grunt.config( 'copy.'+thisTheme._name, {
files : {
'../{{thisTheme._name}}/' : '/child_themes/lib/*' // note that it can't use grunt templating since the loop is dynamic and the index is unknown. Unless there were a grunt template method for dynamic unkown meta values...
}
});
I find that the behavior of this plugin is very strange. I have the following task configuration in my grunt file:
copy:
{
bootstrap: {
files: [
{
src: ['components/bootstrap/img/*'],
dest: 'web/img/bootstrap/'
}
]
}
}
One would expect that components/bootstrap/img/myFile.png is copied to web/img/bootstrap/myFile.png. But it's being copied to web/img/components/bootstrap/img/myFile.png.
Is this the normal behavior, or am I doing something wrong ?
From #14
Yeah, it appears that
expand: true
also needs to be set to makeflatten: true
behave. Perhaps aREADME
update is in order.
Probably makes sense to just link out to the wiki -> https://github.com/gruntjs/grunt/wiki/grunt.file
What would folks think about adding an option to generate symlinks in the destination rather than perform a copy?
The tasks seem like natural siblings. There are a couple of symlink plugins written by others, but they don't work with the general files option the way grunt-contrib-copy does. I'd be happy to implement this and submit it as a fork request, but I wanted to see if it was even an idea that made sense.
I ask because I started to make my own symlinks plugin and found I was using 99% of the code from this one.
Logs all of the files in src/css
files: {
'dist/less/': 'src/less/**'
},
options: {
processContent: function(file) {
console.log(file);
}
}
Doesn't log anything
files: {
'dist/less/base.less': 'src/less/base.less'
},
options: {
processContent: function(file) {
console.log(file);
}
}
I found error(EMFILE) in copy module when I tried to copy almost 4000 files in 'watch' task.
I guess that this module may open files simultaneously, and it can cause error EMFILE.
It can be my mistake, but please check about situation that copying many file in 'watch' task.
Thank you.
I have a configuration file that contains a copy
section like this:
files: {
'Resources/': 'Assets/**'
}
Assets/
folder contains this:
Assets/A.png
Assets/B/B.png
Assets/B/C.png
And when grunt is executed it creates a correct copy:
Resources/A.png
Resources/B/B.png
Resources/B/C.png
But when I remove Assets/A.png
grunt creates:
Resources/B.png
Resources/C.png
I excepted:
Resources/B/B.png
Resources/B/C.png
¿Bug or feature?
when I run a copy task to send images from one dir to another, the image files aren't readable anymore. The source appears to be missing data from the source file.
Any ideas?
Thanks!
With the following code:
copy: {
assets: {
files: {'dist/': 'src/assets/**'}
}
}
It copies and creates directories src
and assets
in the dist
directory. Is there anyway omit the first directory? So the structure is dist/assets/
Thanks!
From my gruntfile:
copy: {
main: {
files: [
{src: ['index.html'], dest: '../production/index.html', filter: 'isFile'},
{src: ['config.xml'], dest: '../production/config.xml', filter: 'isFile'},
{src: ['img/phonegap/icon/ios/Icon-72.png'], dest: '../production/icon.png', filter: 'isFile'},
{src: ['img/**'], dest: '../production/img/'}, // includes files in path and its subdirs
{src: ['data/*'], dest: '../production/data/'} // includes files in path
]
}
},
Running "copy:main" (copy) task
TypeError: Cannot read property 'kindOf' of undefined
at Object.module.exports.detectDestType (/Users/per/Documents/Aptana Studio 3 Workspace/eeSVN/grete/trunk/node_modules/grunt-contrib-copy/tasks/copy.js:16:28)
at Object.task.registerMultiTask.thisTask (/usr/local/lib/node_modules/grunt/lib/grunt/task.js:109:15)
at Object.task.registerTask.thisTask.fn (/usr/local/lib/node_modules/grunt/lib/grunt/task.js:58:16)
at Task.<anonymous> (/usr/local/lib/node_modules/grunt/lib/util/task.js:341:36)
at Task.<anonymous> (/usr/local/lib/node_modules/grunt/lib/util/task.js:317:9)
at Task.<anonymous> (/usr/local/lib/node_modules/grunt/lib/util/task.js:344:11)
at Task.<anonymous> (/usr/local/lib/node_modules/grunt/lib/util/task.js:317:9)
at Task.<anonymous> (/usr/local/lib/node_modules/grunt/lib/util/task.js:344:11)
at Task.<anonymous> (/usr/local/lib/node_modules/grunt/lib/util/task.js:317:9)
at Task.<anonymous> (/usr/local/lib/node_modules/grunt/lib/util/task.js:344:11)
Hiya,
I'd like my dist dir to have two empty directories, so the future users of my project know that additional files can be placed there. I thought of providing 2 empty dirs in the source dir and copy them to the dist dir, since I couldn't find a "create dir" plugin for gruntjs and I like this copy plugin :)
I get the error: Unable to copy; no valid source files were found. Use --force to continue.
I'm using Windows.
folder structure:
sjaak/
dist
src/
modules (empty dir to be copied)
utils (empty dir to be copied)
core/
(src core files)
(src files)
Excerpt of grunt.js file:
...
copy: {
dist: {
files: {
'dist/': 'src/modules' // For now just /modules/ to test
}
}
}
..
This issue was also addressed in: https://github.com/gruntjs/grunt-contrib/issues/103
There it was noted that this issue was fixed, but to me it seems it's not.
I have been struggling (but nevertheless looking forward to using the new version) the last days to migrate my main project to Grunt 0.4.0. Right now I'm stuck when trying to use this plugin. I use a copy task like this:
copy: {
jquery: {
files: [
{expand: true, cwd: 'libs/jQuery/ui-lightness/images/', src: ['.'], dest: 'dist/css/img/'}
]
}
}
and would expect the dist/css/images directory to be created as needed.
Do I have wrong expectations, do I use it the wrong way or is this a problem with the plugin ?
Executing npm install grunt-contrib-copy --save-dev
gives me version 0.3.2 instead of 0.4.0. Is this a plugin issue or do I have something malconfigured in my local environment?
@ctalkington, any ideas?
>> copy - minimatch
>> AssertionMessage: should allow for minimatch dot option
>> AssertionError [ '.hidden', 'test.js' ] deepEqual [ 'test.js' ]
>> at Object.assertWrapper [as deepEqual] (/Users/tkellen/Code/node/grunt/grunt-contrib-copy/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/types.js:83:39)
>> at Object.exports.copy.minimatch (/Users/tkellen/Code/node/grunt/grunt-contrib-copy/test/copy_test.js:38:10)
>> at Object.wrapTest (/Users/tkellen/Code/node/grunt/grunt-contrib-copy/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/core.js:235:16)
>> at Object.wrapTest (/Users/tkellen/Code/node/grunt/grunt-contrib-copy/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/core.js:235:16)
>> at wrapTest (/Users/tkellen/Code/node/grunt/grunt-contrib-copy/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/core.js:235:16)
>> at Object.exports.runTest (/Users/tkellen/Code/node/grunt/grunt-contrib-copy/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/core.js:69:9)
>> at exports.runSuite (/Users/tkellen/Code/node/grunt/grunt-contrib-copy/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/core.js:117:25)
>> at _concat (/Users/tkellen/Code/node/grunt/grunt-contrib-copy/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/async.js:508:13)
>> at async.forEachSeries.iterate (/Users/tkellen/Code/node/grunt/grunt-contrib-copy/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/async.js:118:13)
>> at async.forEachSeries.iterate (/Users/tkellen/Code/node/grunt/grunt-contrib-copy/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/async.js:129:25)
Hi All,
I am trying to use this plugin and and have noticed that the following line returns an empty array with the following config
this.files = this.files || helpers.normalizeMultiTaskFiles(this.data, this.target);
copy: {
files: {
'/tmp/': '/img/de/topapps.png'
// 'img/de/topapps.png': 'tmp'
}
}
any ideas why this might be happening?
Hi,
I've encountered a strange issue where items that I wish to copy are corrupted upon transfer to the destination directory. They end up having different file sizes and cannot be opened.
The files I am copying are mostly images and fonts.
Sample config below:
copy: {
dist: {
files: {
"_build/dist/": [
"*.html",
"libs/**/*",
"assets/{fonts,images}/**/*",
"{src,element}/**/*"
]
}
}
}
If I have a copy task such as:
copy: {
build: {
files: {
'dest/': 'src/**'
}
}
}
and the file structure of src looks like:
src/
└──stuff
├── file1.js
└── file2.js
I would expect the output to be:
dest/
└──stuff
├── file1.js
└── file2.js
but instead, I get:
dest/
├──file1.js
└──file2.js
I imagine the issue is that there are no files at the same level as the intermediate "stuff" directory.
I was using version 0.3.2 of this task.
I'm using grunt-contrib-copy with grunt 0.4, and i get this error every time I try to use it:
Running "copy:publish" (copy) task
Warning: Cannot call method 'forEach' of undefined Use --force to continue.
This is my task, but I don't think it's related to it:
copy: {
publish: {
files: [
{src: ['tests/**', 'example/**', 'knockout.app.js'], dest: '_site'}
]
}
},
Is it possible to add banners to the copied files? I've tried several different things, but it's looking like this task isn't setup to do banners (probably for good reason, I just thought it could not hurt to ask)?
This does not work:
copy: {
options: {
banner: '<%= meta.banner_long %>'
},
main: {
files: [
{
src: ['src/jquery.<%= pkg.name %>.js'],
dest: '../',
expand: true,
flatten: true,
filter: 'isFile'
}
]
}
},
Thanks!
In the 0.3.x
, copying /Users/xxx/some/file.js
to /Users/xxx/test/
would properly copy file.js
to the test/
folder.
In 0.4.x
, the complete folder structure will be replicated: /Users/xxx/test/Users/xxx/some/file.js
What's the expected behavior here? Is this intentional or a bug?
I hunted it down to the source where file.copy is called passing contents and srcpath as arguments, but this doesn't seem to be documented. It would be useful to know that the signature of the function is processContent(content, srcpath).
Per #8 can we figure out the best way to handle this? Also, I think passing the filename into the process function as an argument might be handy, that way the process function could be branched based on the filename, if the author desired.
Sorry If I'm missing something, but I'm trying to copy some files inside the project to a subfolder of my home directory.
The configuration in the grunt.js looks like this:
copy: {
main: {
files: [
{
src: ['temp/plugins/**'],
dest: '~/Library/Application\ Support/sketch/Plugins/',
}
]
}
}
It creates a subfolder ~ and copies the whole thing there.
I need someone to help update this plugin to work with grunt 0.4.0rc5.
I had to revert the whole file src-dest mappings implicit iteration abstraction per gruntjs/grunt#606, and once again, multi tasks have to iterate over this.files
manually. In addition, there's a new this.filesSrc
array that contains a reduced, uniqued set of all matched src
files in case the task is read-only and only cares about source files.
See:
this.filesSrc
array.this.files
array.Notes:
nonull
in addition to src
to tell grunt to keep patterns or filepaths that don't actually match files. Because of this, the task shouldn't explode if a nonexistent src
filepath is encountered. I handle this in the grunt-contrib-concat by warning if not grunt.file.exists
but not failing the task.Guidelines for updating / publishing this plugin:
"*"
)README.md
file via grunt.node_modules
, run npm cache clean
and re-run npm install
to test.--tag=master
(not latest
)Since we're already doing custom expansion in this task, how about having source paths be relative to cwd
if it is set?
Instead of this:
copy: {
images: {
options: {
cwd: 'assets/img'
},
files: {
'public/' : 'assets/img/**/*'
}
}
}
We'd have this:
copy: {
images: {
options: {
cwd: 'assets/img'
},
files: {
'public/' : '**/*'
}
}
}
Are there plans, or a possiblity of having a "copy modified" instead of all?
When copying hundreds of files it would sometimes be nice to get a report of all files copied rather than a printed line for each file. Copied 257 files
for example.
I can add this feature if it has the green light.
Looks the relative path computation is wrong, probably due to Grunt changes. Looking into it.
Using this example:
copy: {
main: {
files: [
{src: ['test/**'], dest: 'dist/'}
]
}
}
the src
directory is included (along with all the contents of src
) in the dest
directory. From my understanding, the src
directory itself shouldn't be copied into dest
, only the contents of src
.
Here's the output;
Running "copy:main" (copy) task
Creating dist/test
Creating dist/test/css
Copying test/css/main.css -> dist/test/css/main.css
Creating dist/test/js
Copying test/js/app.js -> dist/test/js/app.js
I'm using
grunt-cli v0.1.6
grunt v0.4.0rc7
grunt-contrib-copy v0.4.0rc7
If I use:
copy: {
main: {
files: [
{expand: true, cwd: 'test/', src: ['**'], dest: 'dest/'}
]
}
}
it works as expected, not including the src
folder itself in dest
.
Here is the output using the above method:
Running "copy:main" (copy) task
Creating dist/
Creating dist/css
Copying temp/css/main.css -> dist/css/main.css
Creating dist/js
Copying temp/js/app.js -> dist/js/app.js
I'm new to Grunt (coming from Ant), so let me know if I'm off base.
As part of a copy
task I'd like to apply a template on content inside the files. In other words, if my project included this HTML:
<span>This project is at version: <%= project.version %></span>
in its source and project.version
was resolvable inside Grunt, the copied file would contain:
<span>This project is at version: 0.4.2</span>
Does it makes sense to have the copy
task take care of this? Or is there a more idiomatic way to do this with Grunt?
Warning: Object # has no method 'expandFiles'
"devDependencies": {
"grunt-crx": "~0.1.2",
"grunt-contrib-uglify": "~0.1.0",
"grunt-contrib-coffee": "~0.4.0rc7",
"grunt-regarde": "~0.1.1",
"grunt": "~0.4.0rc7",
"grunt-contrib-stylus": "~0.4.0rc7",
"grunt-contrib-copy": "~0.3.2"
},
Currently, the following configuration:
copy: {
libs: {
options: {
flatten: true
},
files: {
'build/js/libs/jquery.js': 'components/jquery/index.js',
'build/js/libs/underscore.js': 'components/underscore/index.js'
}
}
}
Results in build/js/libs/jquery.js/index.js
and build/js/libs/underscore.js/index.js
instead of build/js/libs/jquery.js
and build/js/libs/underscore.js
.
It is a common use case to copy single file under a different name. As far as I can tell, in order to achieve this, the individual files need to be broken out into their own sub-tasks (since the source filenames are the same) and given a processName function:
jquery: {
options: {
flatten: true,
processName: function(filename) {
return 'jquery.js';
}
},
files: {
'build/js/libs': 'components/jquery/index.js'
}
},
underscore: {
options: {
flatten: true,
processName: function(filename) {
return 'underscore.js';
}
},
files: {
'build/js/libs': 'components/underscore/index.js',
}
}
The documentation indicates "The key (destination) should be an unique path", so it looks like it's treating index.js as a directory name, not a file name. I'm aware of the fact that this shouldn't behave exactly like cp
, but it might sense to detect the lack of a trailing slash on the key and assume it's a file copy operation. Thoughts?
The following configuration:
copy: {
libs: {
files: {
'build/js/libs/jquery.js': '/folder/that/does/not/exist/jquery/index.js'
}
}
}
Results in the wrong error message:
<WARN> Unable to copy multiple files to the same destination filename, did you forget a trailing slash? Use --force to continue. </WARN>
Maybe the error message should be something like:
<WARN> Unable to copy; source file /folder/that/does/not/exist/jquery/index.js not found. Use --force to continue. </WARN>
I know there is no convention for this yet, but I personally believe it is helpful to warn when the file does not exist.
Thanks for the hard work and quick turnarounds!
TestCase:
{ src: ['release/**'], dest: ['temp/']}
Using path.sep instead of "/" should fix this:
var detectDestType = function(dest) {
if (grunt.util._.endsWith(dest, path.sep)) { // the dest passed in here actually is "temp" on Windows
return 'directory';
} else {
return 'file';
}
};
I was using a slightly older build of Grunt 0.4.0a with copy setup like this: Note that I have a task which attaches the files object to Grunt -- so that I can keep tabs on various file paths, globs, etc in a separate file.
This used to work fine using template syntatx.
copy: {
lib: {
files: {
"<%= files.js.libRoot %>" : '<%= files.js.vendor %>'
},
options: {
flatten: true
}
}
}
But it no longer seems to work -- instead, I have to copy the array definitions in explicitly like this. I was also unable to use a template in the destination, as the task barked about copying all files to a single file. I presume it wasn't parsing the template properly. Is this an expected change for 0.4?
copy: {
lib: {
files: {
"generated/lib/" :
//TODO: unfortunately Bower has no standard around dir layout
[
'components/AngularJS/*.js',
'components/Angular-Auth/*.js',
'components/bootstrap/docs/assets/js/bootstrap.js',
'components/jQuery/*.js',
'components/jquery.Cookie/jquery.cookie.js',
'components/lawnChair/src/**/*.js',
'components/modernizr/modernizr.js',
'components/requirejs/require.js',
'components/chai/chai.js',
'components/mocha/mocha.js'
]
},
options: {
flatten: true
}
}
}
When grunt-contrib-copy copies a file such as a shell script that has permissions of rwxrwxr-x, the destination copy has its permissions reset to rw-rw-r--.
In addition, no option is provided to set permissions for the copied file.
When saying something like this:
files: [
{
cwd: 'app/'
src: ['assets/**']
dest: 'public/'
}
]
The folders inside assets
gives an error about them not being a file.
Hi,
I've successfully intalled the grunt 0.4.x (see my issue post on the grunt repository).
And i've the same problem with this plugin. The installer always install the 0.3.x version instead of the 0.4.x, sugin the command "npm install grunt-contrib-copy --save-dev"
So i've manually added the good version in the package.json to install the good one : "grunt-contrib-copy": "~0.4.0"
Unfortunately there is a task with the same name (copy
) in grunt-contrib-build.
Hello,
I am trying to watch and copy the files to different directory if there's any change to the files. I've tried different combinations/options but still can't get only the files to new directory.
watch directory: src/html/*
new directory: build/html/
The best result I can get is: src/html/build/html/some-files.html
I also tried to give cwd the path (src/html) with the src:"*", but the result is a copy of every files and subdirs of the project root.
I've been googling and going through forums but still can't find an answer to my problem.
Your help is greatly appreciated,
Niusaul
why not follow others, like grunt-contrib-clean
I think this is better
copy: {
output: {
html: {
src: ["path/**", "path/*"],
dest: "../output",
options: {
}
},
options: {
// strip: /^_/
processName: function(filename) {
if (/^_/.test(filename) return false;
}
}
},
release: {
src: "<%= dirs.release %>",
dest: "<%= dirs.output %>"
}
if processName
function return false, strip?
ps:
path like "../output", error:
ReferenceError: path is not defined
at /data/dev/grunt/G/dev/node_modules/grunt-contrib/node_modules/grunt-contrib-copy/tasks/copy.js:95:17
at Array.forEach (native)
at module.exports.findBasePath (/data/dev/grunt/G/dev/node_modules/grunt-contrib/node_modules/grunt-contrib-copy/tasks/copy.js:94:14)
at module.exports.basePaths (/data/dev/grunt/G/dev/node_modules/grunt-contrib/node_modules/grunt-contrib-copy/tasks/copy.js:58:38)
at Array.forEach (native)
at Object.module.exports.basePaths (/data/dev/grunt/G/dev/node_modules/grunt-contrib/node_modules/grunt-contrib-copy/tasks/copy.js:54:16)
at Object.task.registerMultiTask.thisTask (/usr/local/share/npm/lib/node_modules/grunt/lib/grunt/task.js:109:15)
at Object.task.registerTask.thisTask.fn (/usr/local/share/npm/lib/node_modules/grunt/lib/grunt/task.js:58:16)
at Task.<anonymous> (/usr/local/share/npm/lib/node_modules/grunt/lib/util/task.js:341:36)
at Task.<anonymous> (/usr/local/share/npm/lib/node_modules/grunt/lib/util/task.js:317:9)
Is it possible to make the source check optional? I would really like to prepare some copy tasks for folders which content does not exist yet, because I prepare a project for my co-workers.
Is there any way to tell the copy task that it should copy files and folders, if they exist but does not fail (and stop copying), if something does not exist?
I want to copy client/js/**
to public/js
and exclude all files that end in .coffee - What's the best way to do this?
Right now I'm trying "./public/js/": ["./client/js/**","!./client/js/*.coffee"]
Hi,
I've successfully intalled the grunt 0.4.x (see my issue post on the grunt repository).
And i've the same problem with this plugin. The installer always install the 0.3.x version instead of the 0.4.x, sugin the command "npm install grunt-contrib-copy --save-dev"
So i've manually added the good version in the package.json to install the good one : "grunt-contrib-copy": "~0.4.0"
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.