Git Product home page Git Product logo

conventional-changelog's Introduction

Conventional Changelog

Build status Coverage status

Generate a CHANGELOG from git metadata.

About this Repo

The conventional-changelog repo is managed as a monorepo; it's composed of many npm packages.

The original conventional-changelog/conventional-changelog API repo can be found in packages/conventional-changelog.

Getting started

It's recommended you use the high level commit-and-tag-version library, which is a drop-in replacement for npm's version command, handling automated version bumping, tagging and CHANGELOG generation.

Alternatively, if you'd like to move towards completely automating your release process as an output from CI/CD, consider using semantic-release.

You can also use one of the plugins if you are already using the tool:

Plugins Supporting Conventional Changelog

Modules Important to Conventional Changelog Ecosystem

Node Support Policy

We only support Long-Term Support versions of Node.

We specifically limit our support to LTS versions of Node, not because this package won't work on other versions, but because we have a limited amount of time, and supporting LTS offers the greatest return on that investment.

It's possible this package will work correctly on newer versions of Node. It may even be possible to use this package on older versions of Node, though that's more unlikely as we'll make every effort to take advantage of features available in the oldest LTS version we support.

As each Node LTS version reaches its end-of-life we will remove that version from the node engines property of our package's package.json file. Removing a Node version is considered a breaking change and will entail the publishing of a new major version of this package. We will not accept any requests to support an end-of-life version of Node. Any merge requests or issues supporting an end-of-life version of Node will be closed.

We will accept code that allows this package to run on newer, non-LTS, versions of Node. Furthermore, we will attempt to ensure our own changes work on the latest version of Node. To help in that commitment, our continuous integration setup runs against all LTS versions of Node in addition the most recent Node release; called current.

JavaScript package managers should allow you to install this package with any version of Node, with, at most, a warning if your version of Node does not fall within the range specified by our node engines property. If you encounter issues installing this package, please report the issue to your package manager.

conventional-changelog's People

Contributors

ajoslin avatar armano2 avatar bcoe avatar chalkygames123 avatar dangreen avatar dlmr avatar evocateur avatar github-actions[bot] avatar gitter-badger avatar hutson avatar ingmarh avatar jakxz avatar jbottigliero avatar marionebl avatar mattlewis92 avatar nikaspran avatar nileshmali avatar nlunets avatar noelebrun avatar pvdlg avatar raybenefield avatar renovate-bot avatar renovate[bot] avatar roggervalf avatar stephanebachelier avatar stevemao avatar tapppi avatar thedancingcode avatar tommywo avatar yoannmoinet 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  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

conventional-changelog's Issues

Request: Format output as JSON

It'd be really nice to have the ability to get JSON-formatted Changelogs. I realize the standard is .md, but having JSON output would help immensely in creating a view pertaining to all changes that end-users and binding the .json output as the data source and never have to worry about updating the view itself once the logic is in place.

Request for release

Hey, I'd like to request a release because of 69cfb5c. The newest release is now 9 months old and some other fixes appeared in the master branch, too, so it could be a good time :).

Thanks!

Unexpected output if "closes #bug" appears in PR title

Not sure if this is exactly the issue, but it was the only consistency I could see between the output in https://github.com/btford/grunt-conventional-changelog/blob/master/CHANGELOG.md and the commits.

Examples:

- changelog: cannot generate changelog for first tag () (706a284b, closes `#27`)
- allow 100 characters in commit message () (9982d897, closes `#28`)

Note the odd () in each of those messages before the commit SHA.

Clicking either of those SHAs in the grunt-conventional-changelog repo's CHANGELOG file gives you these two commits:

feat(config): Add issuePrefix configuration paramater.

Hi.

For some projects it makes sense to have issue number which are not just digits.
I.e. Jira issues like PRJ-1337.
It is not desirable to strip down "PRJ-" and prepend it again in issueLink function since other systems like Bamboo/Stash will not recognise issue reference.

Patch bellow can be used to fix this.
It adds additional configuration parameter issuePrefix.

From e05e5a1bc69de9a6a13c0fd6ab1b9996885f56c2 Mon Sep 17 00:00:00 2001
From: Mykhailo Lieibenson <[email protected]>
Date: Tue, 2 Dec 2014 00:01:54 +0100
Subject: [PATCH] feat(config): Adding issuePrefix configuration option

---
 index.js   |  1 +
 lib/git.js | 25 +++++++++++++++++++------
 2 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/index.js b/index.js
index a5d02a4..c5e99f7 100644
--- a/index.js
+++ b/index.js
@@ -33,6 +33,7 @@ function generate(options, done) {
     git.getCommits({
       from: options.from,
       to: options.to,
+      issuePrefix: options.issuePrefix
     }, function(err, commits) {
       if (err) return done('Failed to read git log.\n'+err);
       writeLog(commits);
diff --git a/lib/git.js b/lib/git.js
index 6583cb4..91f00b0 100644
--- a/lib/git.js
+++ b/lib/git.js
@@ -73,25 +73,38 @@ function parseRawCommit(raw, options) {
   var lines = raw.split('\n');
   var msg = {}, match;

+  var prefix = options.issuePrefix || "";
+  prefix.replace("-", "\\-");
+
+  var parse = !prefix ? parseInt : function(val){ return val; }
+
   msg.hash = lines.shift();
   msg.subject = lines.shift();
   msg.closes = [];
   msg.breaks = [];

-  msg.subject = msg.subject.replace(/\s*(?:Closes|Fixes|Resolves)\s#(\d+)/ig, function(_, i) {
-    msg.closes.push(parseInt(i, 10));
-    return '';
-  });
+  msg.subject = msg.subject.replace(
+    new RegExp("\\s*(?:Closes|Fixes|Resolves)\\s#" + prefix + "(\\d+)", "ig"), function(_, i) {
+      msg.closes.push(parse(i, 10));
+      return '';
+    }
+  );

   lines.forEach(function(line) {
-    match = line.match(/(?:Closes|Fixes|Resolves)\s((?:#\d+(?:\,\s)?)+)/ig);
+    match = line.match(new RegExp("(?:Closes|Fixes|Resolves)\\s((?:#" + prefix + "\\d+(?:\\,\\s)?)+)", "ig"));

     match && match.forEach(function(m) {
       m && m.split(',').forEach(function(i) {
         var issue = i.match(/\d+/);
-        issue && msg.closes.push(parseInt(issue[0], 10));
+        issue && msg.closes.push(parse(issue[0], 10));
       });
     });
+
+    if (match) {
+      match[1].replace(/[\s#]/g, '').split(',').forEach(function(i) {
+        msg.closes.push(parse(i, 10));
+      });
+    }
   });

   match = raw.match(/BREAKING CHANGE:\s([\s\S]*)/);
-- 
2.2.0

Uncaught, unspecified "error" event.

Hi, I'm having an uncaught error when using the CLI.

Environment

  • conventional-changelog@next
  • Windows 7
  • Node v0.12.5 & IOjs v2.3.2
  • NPM v2.11.2 & v2.11.3

Is it Unix only maybe?

Repro

It happens when running either :

node ./node_modules/conventional-changelog/cli -i CHANGELOG.md -w -b
convetional-changelog -i CHANGELOG.md -w -b

with or without flags

Stack

Here's the stack :

events.js:87
      throw Error('Uncaught, unspecified "error" event.');
            ^
Error: Uncaught, unspecified "error" event.
    at Error (native)
    at Readable.emit (events.js:87:13)
    at Readable.<anonymous> (.\node_modules\conventional-changelog\index.js:144:20)
    at Readable.emit (events.js:107:17)
    at DestroyableTransform._transform (.\node_modules\conventional-changelog\node_modules\git-raw-commits\index.js:48:16)
    at DestroyableTransform.Transform._read (.\node_modules\conventional-changelog\node_modules\through2\node_modules\readable-stream\lib\_stream_transform.js:172:10)
    at DestroyableTransform.Transform._write (.\node_modules\conventional-changelog\node_modules\through2\node_modules\readable-stream\lib\_stream_transform.js:160:12)
    at doWrite (.\node_modules\conventional-changelog\node_modules\through2\node_modules\readable-stream\lib\_stream_writable.js:323:12)
    at writeOrBuffer (.\node_modules\conventional-changelog\node_modules\through2\node_modules\readable-stream\lib\_stream_writable.js:309:5)
    at DestroyableTransform.Writable.write (.\node_modules\conventional-changelog\node_modules\through2\node_modules\readable-stream\lib\_stream_writable.js:236:11)

When handling Readable's errors :

I've tried handling the readable's errors with :

readable.on('error', function(err) {
    console.log(err);
});

It's removed the Uncaught Error and printed

Error in git-raw-commits. fatal: unrecognized argument: ------------------------'

I've also printed the options passed to gitRawCommits :

{
    format: '%B%n-hash-%n%H%n-gitTags-%n%d%n-committerDate-%n%ci',
    from: 'v2.0.0'
}

Git Log

Here's my git log if it can help :

feat: try to trigger changelog
docs: update changelog generation
docs: update changelog
docs: clean generated changelog
docs: update changelog
v2.0.0
feat(npm): add scripts
feat: add changelog
fix: README
fix: README
feat: add Travis CI
feat: add linting
feat: add defaults template values
style: clarify function's name
style: use private variables, setters and getters
style: add new lines, semi-colons and move variables
chore: v1.6.0
fix: return object when the result is an object and not a9f931e2e10acf4108574cff365274d80819bbb3b chore: v1.5.0
feat: add `langs` to list all available languages
fix(has): check for the language before the key
chore: v1.4.0
test: add tests
fix: use default `lng` in `has` function
fix: return `key` if inexistant
fix: use default object if `data` isn't provided
chore: change `string` to `dico`
chore: v1.3.0
docs(get): update docs with new feature for overwrite
feat(get): add the possibility to overwrite language
chore: v1.2.0
docs: update docs with `has` and other small adjustements
feat: add `has` function to check on availability of loca
chore: add badges to readme
v1.1.0
fix: update commonjs and amd support
v1.0.1
chore: update readme
chore: format readme
docs: add documentation
feat: change `t` to `get`
chore: typo in readme
feat: npm support
feat: bower support
feat: add lib
Initial commit

Thanks for your awesome tool anyway.

Cant make it work

Hi !

Im trying to set up a new workflow for a new project Im working at. I really would like to use conventional-changelog, but for the moment is being impossible to me to make it work.

First of all, I cant even make the cli tool working. I did installed globally, but each time Im trying to run:
conventional-changelog --help on the shell, it said: conventional-changelog: command not found, but if I make npm ls -g -depth=0 I can see [email protected] package listed.

Another issue Im having is that I cant create the changelog.

I have already some commits (indeed only one) on the angular format. Its like this:

feat(): onUrlChange event (popstate/hashchange/polling) (this is an example copied from the docs, for debugging)

I also have a CHANGELOG.md empty file on the root and I have created a test.js with the following:


var conventionalChangelog = require('conventional-changelog');

conventionalChangelog({
  preset: 'angular'
})
  .pipe(process.stdout);

Whenever run node test I get :

conventionalChangelog().pipe(process.stdout);
                       ^
TypeError: Cannot read property 'pipe' of undefined
    at Object.<anonymous> (/Users/antonio/Projects/cabesa/test.js:45:24)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at startup (node.js:129:16)
    at node.js:814:3

Any suggestion to put me on the right spot ?

My final goal will be to create some gulp tasks that manage all process automatically: deploying, documentation, testing, etc... but Im stuck here.

Thanks

angular commit types not being expanded

Hi there,

Trying to get alpha 3 to work and at the moment although I can get a bare changelog produced, a commit message like:

feat(blah): my message

Comes out as

### feat

* feat(blah): my message

Looking at the docs and the tests, I was expecting:

### New features

* blah: My message

Problems with version 0.0.14

Hi, I think there is an issue with the last version on this task. If you have a project without tags and some commits, when you try to execute the task, the console shows "Generating changelog from undefined to undefined".

However, if you have a tag or you use the versión 0.0.11 the task works. Maybe the problem is related with the else in the getFirstCommit function, because if the repository has commits executes this line: done(null, ''); (with the second parameter empty).

The versión 0.0.11 uses this line instead:

done(null, String(stdout).split('\n')[0].split(' ')[0].trim());

Regards.

`allBlocks` is not good enough.

It should be an option to set from previous how many semver tag and generate how many versions.

options.versionRange = {
    start: -1, // Index of semver tags at which to start. If greater than the number of existing semver tags, actual starting index will be set to the number of the tags. If negative, it will begin that many from the end. If a absolute negative number is greater than the number of existing semver tags or 0, it is 1.
    count: 1 // How many versions to generate.
}

This is much better than allBlocks 😄 please suggest better option name.

shortcut repository url format

npm allows users to specify repository as 'npm/npm' - when there is no htttp:// nor git:// in url it assumes github. The address is created by github-url-from-username-repo. Currently this format is not understood properly by conventional-changelog. This format is not very pupular but at least in generator-angular it caused issues.

I will try to prepare PR in the free time.

Nested List Spacing option

I am using Stash which uses 4 spaces for Nested Lists instead of the 2 that Github uses. It would be nice to have the ability to change how many spaces are used for nested lists.

Add support for non-numeric issues

Currently, this plugin only supports numeric issues. When using Jira, issues are (possibly) prefixed with non numeric characters (e.g. PROJECT-123). When adding a comment like 'Closes PROJECT-123', these lines are not appended in the changelog, because it expects a hash, followed by a number.

Expose the `grep` option, add "Other fixes" section

How about exposing the grep(ref) option, this way you can set which conventions you want in the changelog. The additional commits with conventions that don't match Fix, Feature, Breaking would be grouped as "Other fixes" in the changelog.

Thoughts?

Why it returns the whole change log

Whats the reason for not writing the change log into a the file but returning it as a string. I expected that it would write into the file in the first place. After thinking about it I can see reasons for just returning the string but then I would expect that it would only return the last changes not the whole change log, cause this can be done by the user if needed.

Pull Requests

Does this include pull requests? Currently I'm running it against my project but am seeing 0 commits -- however we've contributed dozens of PRs since the last release, but no direct commits. Does this mean this only reads direct commits? Is there a way to turn on PRs?

Changelog URLs not always generated correctly when using shorthand or git: syntax

In our package.json, we're using the shorthand format for the repository field, "mozilla/fxa-content-server". We noticed that when generating the changelog (via grunt-conventional-changelog) that the links in the CHANGELOG.md don't resolve properly:

Using shorthand in the package.json:

"repository": "mozilla/fxa-content-server",

Generates this:

<a name="0.33.0"></a>
## 0.33.0 (2015-03-23)


#### Bug Fixes

* **test:** Fix the account locked tests when run against latest. ([45073cf6](mozilla/fxa-content-server/commit/45073cf66cf69118251c85846f6ce0e330f8bafd))


#### Features

* **client:** Add the account locked flows. ([8e405298](mozilla/fxa-content-server/commit/8e405298b8fee3b1e5c4e495a006d42580432c49))

If we switch to the long version of repository:

  "repository": {
    "type": "git",
    "url": "https://github.com/mozilla/fxa-content-server"
  },

We get this (fully qualified URLs):

<a name="0.33.0"></a>
## 0.33.0 (2015-03-23)


#### Bug Fixes

* **test:** Fix the account locked tests when run against latest. ([45073cf6](https://github.com/mozilla/fxa-content-server/commit/45073cf66cf69118251c85846f6ce0e330f8bafd))


#### Features

* **client:** Add the account locked flows. ([8e405298](https://github.com/mozilla/fxa-content-server/commit/8e405298b8fee3b1e5c4e495a006d42580432c49))

Similarly, if you use a repository url of git:// then it isn't convertingand parsing correctly:

  "repository": {
    "type": "git",
    "url": "[email protected]:mozilla/fxa-content-server.git"
  },

Then it generates links like this:

<a name="0.33.0"></a>
## 0.33.0 (2015-03-23)


#### Bug Fixes

* **test:** Fix the account locked tests when run against latest. ([45073cf6]([email protected]:mozilla/fxa-content-server/commit/45073cf66cf69118251c85846f6ce0e330f8bafd))


#### Features

* **client:** Add the account locked flows. ([8e405298]([email protected]:mozilla/fxa-content-server/commit/8e405298b8fee3b1e5c4e495a006d42580432c49))

Long story longer, it doesn't look like we're normalizing the Git URLs everywhere and assuming that the repository URL is HTTP-esque.

function latestTag does not work under Windows shell

hi, if you execute the command inside function latestTag under Windows shell (not the Git shell) throws an error unknow option max-count=1 due to backtick.

I have made a quick test by making two calls instead of only one, using the output of a command to pass to the other one. With this change, it finds the tag.

Allow to configure the headerPattern

Hi,
First of all, thanks for this great tool 👍
I would like to be able to configure the regexp headerPattern a bit to allow these variations:

<type>(<scope>): <subject>
 <type>(<scope>) : <subject>
 <type>(<scope>) <subject>

Thanks

Add an option to respect the tags while using "allBlocks"

When I generate using "allBlocks" option, I get a changelog that holds everyting from the from to HEAD and uses just the latest version information from the package.json as the header for everything it found the logs.

I need to rebuild my log on every build, so I would like to have all the GIT-tags I set taken into account when generating the log.

My options:

{
    // Task-specific options go here.
    from : '1.0.0',
    allBlocks: true
}

Version not parsed from package.json if "repository" field not set in file.

The issue occurs on line 88 of index.js. getPkgRepo fails if there is no repository information, which prevents the version information from being added to the context object, causing blank values in the changelog output.

I'll see if I can get a PR out for this.

Steps to recreate:

  1. Have an NPM repository without a repository field:
{
  "name": "my-package",
  "version": "1.0.1",
}
  1. Run conventional-changelog
  2. See that output does not pick up version information

Generating a changelog when there's a git tag present

I've been working with conventional-changelog over the past two days and ran into some behavior that seemed odd. I'm not sure if it's an issue or not but since the version I'm using is the latest beta I thought I'd report it in case it is an issue or in case I'm doing something wrong.

I'm using conventional-changelog@^0.1.0-beta.3 on Mac OS X 10.10.4 with Node.js v0.12.4. I'm able to generate CHANGELOG.md using the following code but only under certain conditions.

conventional-changelog -o CHANGELOG.md -p angular -v

Scenario 1:
If I have conventional-changelog installed as a global npm module the code works. If it's installed as a local npm module I get the following error:

-bash: conventional-changelog: command not found

This could be an issue with something I'm doing. Or not doing.

Scenario 2:
If I have created a tag with git tag -a v0.0.1 -m "Initial testing release." the code above doesn't work. A changelog file is created but it's blank/empty. If I delete the git tag and rerun conventional-changelog, a changelog is generated and has content as expected.

Thanks for the work on this tool. Our engineering team is looking at using it to help us with better process and better documentation right from our commit logs.

Option to only include breaking changes in the changelog

When we create a release on our project, we want to include all the changes (bug fixes, features, breaking changes) in the github release notes. However, in our changelog we only want to include the breaking changes.

It would be nice if there was a option that we could pass in to configure this. I.e.

changelog({
  ...
  changeLevels: ['features', 'breaking']
}, function(err, log) {
  ...
});

This would only include new features and breaking changes. If the argument isn't supplied, it defaults to all types.

Would you be open to a PR?

@gpleiss, @bebepeng @stubbornella, @DrPep

Colons (:) are not allowed in scope name

I'd like to update the regex that's used in parseRawCommit() in git.js.

I have a few commits that aren't being added to changelog that aren't being detected because they're formatted as such:

fix(category:subcategory): My subject

I've updated locally for myself, here's the regex that I've added:

var COMMIT_PATTERN = /^(\w*)(\(([\w\:\$\.\-\*]*)\))?\: (.*)$/;

Does not have CLI

This is a natural extension of the library. This way we can install tool globally and use it for all sorts of projects.

I want to PR myself but I'm kinda squeezed atm. Will notify if I decide to. Thanks again!

Option for commits patterns

I would like to be able to use a custom commit pattern. It would be nice to have an option to customize the following regex:

var COMMIT_PATTERN = /^(\w*)(\(([\w\$\.\-\* ]*)\))?\: (.*)$/;

And also I would like to be able to list more than just feat & fix commits in the changelog (docs for example, and probably other things later), it would be nice to be able to provide a list of the headers to parse.

If you don't have the time to do it but think it's a good idea, just tell me and I'll work on it and send a PR.

"commits" links with bitbuckets

Bitbucket commit URL contains "commits" instead of "commit". So the issues URL references are broken link in the generated change log file.

More generally, how do we do when commit and issue repositories are different.
In my case I have :

In my package.json I have :

"bugs": { // standard package.json field
"url" : "https://company/browse"
, "email" : "[email protected]"
},
"commits": "https://bitbucket.org/company/commits/" // Custom field

It would be convenient to be able to specify those parameters

conventionalChangelog({
repository: repository.url,
issues: bugs.url,
commits: commits,
...
})

Changelog for a release without fixes / features is empty

Arguably no release should take place where there are no functional changes from the user point of view (feat, fix) but it might happen that such a release is done nevertheless... In such a case a generated log looks a bit bizarre, here is an example:
https://github.com/karma-runner/karma/blob/master/CHANGELOG.md#v0126-2014-04-09

Maybe adding a small comment, sth like:

_There are no functional changes in this release, only documentation updates, refactorings, [list type of changes here] _

@ajoslin WDYT?

deprecate options.file

Since this module will return a stream, we should let wrapper modules to deal with how they want to handle logs (prepend or append texts etc...) and let this module focus on generating logs.

eg in bash we could do

changelog --from 277ebe3a68fd1e72cf7ed15c2b605b847dd3c683 >> CHANGELOG.md

Split up this repo into commits parsing and writing

@ajoslin I'm working on several build-related topics atm and can see number of use-cases where I could use just the git-related part, ex.:

  • figure out next semver based on the commit names
  • use completely different writing format / target (I think GH releases were mentioned).

In short: IMO splitting up the repo into 2 distinct parts would make each part more useful and easier to maintain. The interface between 2 parts would be output generated by git parsing.

I can surely just require lib/git.js from this repo (might break without warning) or just fork the whole thing (not so great for the community / ecosystem) but yeh, I feel like the sum of parts could be greater than the combined thing. WDYT? I know you are busy on other topics but I will need this type of think so willing to put some effort into it.

Setting option defaults

We should make our option defaults all be set in index.js, if possible. It's getting too scattered and confusing (all the files except Writer.js change the options)

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.