Git Product home page Git Product logo

node-zendesk's People

Contributors

basdewachter avatar bh42 avatar blairanderson avatar blakmatrix avatar cryptomail avatar dependabot[bot] avatar dkapell-delphix avatar eikecm avatar erikzrekz avatar fmsouza avatar iconecd avatar ignigena avatar jamesmgreene avatar jamesw-mso avatar jfrerich avatar karolisg avatar magiobus avatar mattcasey avatar mfrye avatar moshikeilon avatar nhim175 avatar nnabuuu avatar onhate avatar rubadeau avatar rubyistdotjs avatar shortcuts avatar svishwanath-tw avatar teebot avatar tresni avatar wibisono 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

node-zendesk's Issues

Undefined result: "Cannot read property 'next_page' of undefined"

I have an application occasionally requesting a list of tickets from zendesk, in which i get the following error:

.../node_modules/node-zendesk/lib/client/client.js:134
    nextPage = result.next_page;
                     ^
TypeError: Cannot read property 'next_page' of undefined
    at .../node_modules/node-zendesk/lib/client/client.js:134:22
    at .../node_modules/node-zendesk/lib/client/client.js:258:12
    at checkRequestResponse (.../node_modules/node-zendesk/lib/client/client.js:227:10)
    at requestCallback (.../node_modules/node-zendesk/lib/client/client.js:235:3)
    at Request._callback (.../node_modules/node-zendesk/lib/client/client.js:105:5)
    at Request.self.callback (.../node_modules/node-zendesk/node_modules/request/request.js:373:22)
    at emitTwo (events.js:87:13)
    at Request.emit (events.js:169:7)
    at Request.<anonymous> (.../node_modules/node-zendesk/node_modules/request/request.js:1318:14)
    at emitOne (events.js:82:20)
    at Request.emit (events.js:166:7)

Using node-zendesk v. 1.0.2

I'm not very much into http requests in general, but could a check be introduced on the result object - or am i doing something wrong?

Regards.

EDIT: I think it might be due to a request timeout, but i don't see how the error would slip past the error handling.

"Unprocessable Entity" when creating a category

I am using the categories.create() method. Each time, I am getting the following error:

Error: Zendesk Error (422): Unprocessable Entity
    at checkRequestResponse (/Users/zenahirsch/Documents/Projects/desk-to-zd-articles/node_modules/node-zendesk/lib/client/client.js:230:13)
    at requestCallback (/Users/zenahirsch/Documents/Projects/desk-to-zd-articles/node_modules/node-zendesk/lib/client/client.js:245:3)
    at Request._callback (/Users/zenahirsch/Documents/Projects/desk-to-zd-articles/node_modules/node-zendesk/lib/client/client.js:103:5)
    at Request.self.callback (/Users/zenahirsch/Documents/Projects/desk-to-zd-articles/node_modules/request/request.js:198:22)
    at emitTwo (events.js:100:13)
    at Request.emit (events.js:185:7)
    at Request.<anonymous> (/Users/zenahirsch/Documents/Projects/desk-to-zd-articles/node_modules/request/request.js:1035:10)
    at emitOne (events.js:95:20)
    at Request.emit (events.js:182:7)
    at IncomingMessage.<anonymous> (/Users/zenahirsch/Documents/Projects/desk-to-zd-articles/node_modules/request/request.js:962:12)

When I make the request via curl, it succeeds:

curl https://<hidden>.zendesk.com/api/v2/help_center/categories.json -d '{"category":{"locale":"en-us","name":"Legal Stuff"}}' -i -X POST -H "Content-Type: application/json" -H "Accept: application/json" -H "User-Agent: node-zendesk/1.1.8 (node/5.6.0)" -H "Authorization: Basic <hidden>"

Here's the code I'm using:

var zendesk = require('node-zendesk');

var client = zendesk.createClient({
    username: <hidden>
    token: <hidden>
    remoteUri: <hidden>
});

var categoryNames = [
    'Category One',
    'Category Two',
    'Category Three'
];

categoryNames.forEach((name) => {
    var category = {
        category: {
            locale: 'en-us',
            name: name
        }
    };

    client.categories.create(category, (err, req, result) => {
        if (err) throw err;
        // do stuff with result
    });
});

Any ideas? Thank you!

Incorrect error handling if "retry-after" header is present

Problem

It appears that node-zendesk checks for a 'Retry-After' header on the response from the Zendesk API, and if it finds one it overrides the status code to 429 and uses a specific - and incorrect - error string "Zendesk rate limits 200 requests per minute".

Details

  1. Zendesk will include a 'Retry-After' for more than just 429 errors. Specifically we include one for a 503 error: https://developer.zendesk.com/rest_api/docs/core/introduction#500-range
  2. Zendesk's rate limit is not fixed at 200rpm. It differs by account, as well as by end-point. This confusing message should probably be removed as it will rarely be correct.

Possible Fix

As far as I can tell all of this could be removed so it falls back to the regular error handling:

retryAfter = response.headers['retry-after'];
if (retryAfter) {
error = new Error('Zendesk rate limits 200 requests per minute');
error.statusCode = 429;
error.result = result;
error.retryAfter = retryAfter;
return callback(error);
}

This way a 429 error would return 'Too Many Requests' and a 503 would return 'Service Unavailable', as intended.

It would be nice to have a importWithSideload

It would be nice to be able to just pass a string into ticketexport.export so i can specify the objects to side load. I have already tried it. You could use it like this

var sideload = '&include=metric_sets';
    client.ticketexport.exportWithSideload(startTime, sideload, function (err, statusList, body, responseList, resultList) {
      if (err) {
        sails.log.error(ErrorMessages.ZENDESK_TICKET_ERR + err.message);
        return callback(err);
      }
      callback(null, body);
    });

Helpcenter returns 404

I have used the following for my createClient:

var client = zendesk.createClient({
  username:  name
  token:    toke,
  remoteUri: 'https://test.zendesk.com/api/v2',
  helpcenter: true
});

It returns nothing but 404's for all the helpcenter methods. I have had no major issues accessing ticket information. Have verified that api can be accessed by using CURL.

_Update_ if helpcenter is true you still need to add help_center to the uri. As you can see above I did not and this caused the 404's. This seems like a minor thing but is annoying and counter intuitive.

User Identity Update doesn't support updating values

https://developer.zendesk.com/rest_api/docs/core/user_identities#update-a-given-user-identity

There are two modes of this command, one to update "verified" and one to update "value". The current implementation does this:

UserIdentities.prototype.update = function (userID, userIDentityID, cb) {
    this.request('PUT', ['users', userID, 'identities', userIDentityID], {"identity": {"verified": true}}, cb);
};

which handles the first case. I need to update the identity value, which does not appear to be supported.

Subdomain changes when passing params to macros.listByParams()

I'm running into a strange bug, and I'm not sure if it's on my end or not. I'm building a CLI for ZenDesk; one of the things it does is allow the user to list macros, and optionally control the sort order by using an option: -s <sort>. If this option is not specified, my code defaults to alphabetical. See below:

console.log(options.sort); // undefined

client.macros.listByParams({
    sort_by: options.sort ? options.sort : `alphabetical`
}, (err, req, result) => {  
    if (err) throw err;
    // do something with result
});

Above, no sort option was passed, and the request URI is built correctly:

{ stores: 
   { defaults: 
      Literal {
        type: 'literal',
        store: [Object],
        mtimes: {},
        readOnly: true,
        loadFrom: null,
        logicalSeparator: ':' } },
  sources: [],
  headers: 
   { 'Content-Type': 'application/json',
     Accept: 'application/json',
     'User-Agent': 'node-zendesk/1.1.8 (node/5.6.0)',
     Authorization: 'Basic <hidden>' },
  uri: 'https://vimeo.zendesk.com/api/v2/macros.json?sort_by=alphabetical',
  method: 'GET' }
{ statusCode: 200,
  result: ... }

However, when the user does pass in a sort value (for example, usage_7d), something strange happens to the request URI:

console.log(options.sort); // 'usage_7d'

client.macros.listByParams({
    sort_by: options.sort ? options.sort : `alphabetical`
}, (err, req, result) => {  
    if (err) throw err;
    // do something with result
});
{ stores: 
   { defaults: 
      Literal {
        type: 'literal',
        store: [Object],
        mtimes: {},
        readOnly: true,
        loadFrom: null,
        logicalSeparator: ':' } },
  sources: [],
  headers: 
   { 'Content-Type': 'application/json',
     Accept: 'application/json',
     'User-Agent': 'node-zendesk/1.1.8 (node/5.6.0)',
     Authorization: 'Basic <hidden>' },
  uri: 'https://usage_7d.zendesk.com/api/v2/macros.json?sort_by=usage_7d',
  method: 'GET' }
{ statusCode: 404,
  result: ... }

Note that the request URI has becomes https://usage_7d.zendesk.com/api/v2/macros.json?sort_by=usage_7d. The param is appended correctly, but the subdomain has also changed to usage_7d.

The relevant code can be viewed in context here.

Any help would be much appreciated!

Getting List of tickets for Assignee

Hi, which method should I use to get a list of tickets assigned to a User? This is the API call: GET /api/v2/users/{user_id}/tickets/assigned.json

Unable to update Custom Field value

When running update(80, {“ticket": {"custom_fields": [{"id": 31186457, "value": false}] }});

The response returns a JSON object without error and the custom field value does not change.

Please advise.

use of jsonAPIName and jsonAPIName2

I've just started to try and use this module, but it doesn't seem to work as the documentation and examples would lead you to believe. The client code appears to try to pull out the appropriate part of the result into the 'body' parameter to the callback:

  if (self.jsonAPIName !== null) {
    body = res[(self.jsonAPIName.toString())];
  } else if (self.jsonAPIName2 !== null) {
    body = res[(self.jsonAPIName2.toString())];
  } else { //should not come here but it could happen
    body = res;
  }

But using the basic example of client.user.auth(), the names are set to:

this.jsonAPIName = 'users';
this.jsonAPIName2 = 'user';

It then tries to pull res['users'], but this is invalid - the response only contains 'user' as described here:

http://developer.zendesk.com/documentation/rest_api/users.html#show-user

The list APIs will return 'users', so it looks like the above code may need to be:

  if (self.jsonAPIName !== null)
    body = res[(self.jsonAPIName.toString())];
  if (!body && self.jsonAPIName2 !== null)
    body = res[(self.jsonAPIName2.toString())];
  if (!body)
    body = res;

To handle both list and get requests?

requestAll callback only called after all pages have been loaded

It seems to me that requestAll callback only gets called when the whole request has been called. I was kind of hoping that there was an option to do the callback after each page, so that I wouldn't overload my process memory, when querying all tickets ever...

HelpCenter methods returning 404

Using the client, i've set helpcenter: true and have tried both searchArticlesByLabels and searchArticles, both of these are returning errors with 404 and a buffer in the result.

This is the request being made (note: I replaced our subdomain here):

{ stores: 
   { defaults: 
      { type: 'literal',
        store: [Object],
        mtimes: {},
        readOnly: true,
        loadFrom: null,
        logicalSeparator: ':' } },
  sources: [],
  headers: 
   { 'Content-Type': 'application/json',
     Accept: 'application/json',
     'User-Agent': 'node-zendesk/1.1.2 (node/0.10.35)',
     Authorization: 'Basic dGVjaEBjbG91ZG2WQuY2ZtL3Rva2VuOmdwVlAz1dlBldFBsVz1U4eW5iekZvU3xNWVsSWhEY1lj33BVRTBqZEU=' },
  uri: 'https://XXXXXXX.zendesk.com/api/v2/articles/search.json',
  method: 'GET',
  body: '{"query":"files"}' }

Unable to hide console logging

I'd like to remove the console logging that occurs on requests in my production app, and have passed: debug: false as an option when creating the client. Looking into line 47 on client.js, my hope was that this would prevent the console logs.

However, in client/client.js each request emits to debug. For some reason, it doesn't look like the debug function in client.js respects the debug.false option and I am unfortunately unfamiliar with nconf and what is happening there to suggest a patch.

Search.query escapes search term

Hello,

I want to do following query to search api:

var query = 'type:ticket+status<solved'

when I'm using search endpoint

client.search.query(query, cb)

actual request sent to server turns into

/api/v2/search.json?query=type%3Aticket%2Bstatus%3Csolved

and cannot be processed by search api

However code below works ( in case somebody needs workaround):

client.search.requestAll('GET', ['search', '?query='+query], cb)

it sends correct request

/api/v2/search.json?query=type:ticket+status<solved

setImage functionality

I have not seen a way to set an image for the user. Is this functionality included with node-zendesk?

No support for deep links when searching help articles

There's currently no way to filter articles either by label_name or by any of the other options (sort_by, sort_order).

This is the endpoint that we'd need to support in most article methods.
GET /api/v2/help_center/articles.json?label_names=photos,camera

API throttling versus bulk data reporting

I'm trying to build a report for some higher-ups that summarizes a vast amount of data, a month's worth of tickets and comments at a time. Naturally, once I start requesting comments from the zendesk API, I run up against the API throttle pretty quick.

Because zendesk doesn't provide a way to batch comment requests, a request denied due to throttling should be re-requested at or shortly after the provided 'Retry-After' header attached to the HTTP 429 statusCode response.

I don't see any reason for this to go into Client#request() but it certainly fits nicely into Client#requestAll() -- I'll be working on this on my fork, and with any luck can come up with a decent solution.

Cannot read property 'next_page' of undefined

Sometimes have error. I didn't catch url or body, but if i will i write here.

TypeError: Cannot read property 'next_page' of undefined

TypeError: Cannot read property 'next_page' of undefined
    at www/node_modules/node-zendesk/lib/client/client.js:179:22
    at Request._callback (www/node_modules/node-zendesk/lib/client/client.js:155:5)
    at Request.self.callback (www/node_modules/node-zendesk/node_modules/request/main.js:127:22)
    at Request.EventEmitter.emit (events.js:98:17)
    at Request.<anonymous> (www/node_modules/node-zendesk/node_modules/request/main.js:767:16)
    at Request.EventEmitter.emit (events.js:117:20)
    at IncomingMessage.<anonymous> (www/node_modules/node-zendesk/node_modules/request/main.js:729:14)
    at IncomingMessage.EventEmitter.emit (events.js:117:20)
    at _stream_readable.js:920:16
    at process._tickDomainCallback (node.js:459:13)

Can't disable reading process.argv and process.env (really?)

First off, it's a little bit insane to read global state from inside a library, but ignoring that, it's even more insane to not provide a way to disable that behaviour. This reminds me of this systemd bug.

As it happens, I have an application that reads its own command-line arguments and uses some of the same flags as this... Library. This third-party library that, without prompting, reads process.argv and process.env. Ugh.

Anyway. It'd be great if there were a way to disable this. I'll probably put together a pull request later on or something.

Change Client Session

Hi blakmatrix,
I was trying to copy tickets from one instance to the other, so the workflow is this:
-Create a zendesk client to get the ticket I want;
-Create the new client to create the tickets in the other instances;
-Call the function (tickets.create);
Debugging I see I'm still querying the initial client. Is There any method to kill the session and create a new one live?
Thanks!!

nconf collision

We use nconf in our app. When we integrate node-zendesk the nconf collides and causes our app to break. After looking into how nconf is used in node-zendesk I think it needs to be declared at the top of client.js to work correctly and not collide with other apps use nconf.

Create Articles

// ====================================== Creating Articles
Articles.prototype.create = function (article, cb) {
this.request('POST', ['articles'], article, cb);
};

It should be
// ====================================== Creating Articles
Articles.prototype.create = function (sectionID, article, cb) {
this.request('POST',['sections', sectionID, 'articles'], article, cb);
};

Ticket Creation

How would one go about using this to create a ticket from outside of Zendesk and having it appear in Zendesk?

Client part not loaded (requestAll etc)

Has Client accidentally been forgotten in the list of parts pulled together by the main lib file (here)?

I was expecting to be able to call .client.request as per the readme but it didn't exist.

tickets.exportAudit now a List

Hi,

I see that the callback of exportAudit is now a list.

I expected it to be the same as Zendesk doc: https://developer.zendesk.com/rest_api/docs/core/ticket_audits
This part is missing in the callback:

{
  "previous_page": null,
  "next_page": null,
  "count": 5,
  "audits": ...
}

The previous version (about a year ago) conformed to the Zendesk doc.

Is there a reason this changed?

btw, thanks for fixing the attachment upload issue, that's why I downloaded the latest version.

Socket hanging up on `.queryAll`

Hey!

I have this code:

const query = `checkout-failure order_by:created sort:desc`;
zendeskClient.search.queryAll(query, function (err, req, res) {
    console.log(err);
});

I'm getting this error:

{ [Error: socket hang up] code: 'ECONNRESET' }

There are only 550 or so tickets being returned, which is 6 pages of results. Any ideas why it isn't working?

HPE_INVALID_CONSTANT when uploading a picture

When uploading an image via attachments#upload I receive an strange error: [Error: Parse Error] bytesParsed: 1708, code: HPE_INVALID_CONSTANT

Unfortunately there is no stack trace available, which makes it difficult to search for the error. Could it be that the zendesk-module sets the wrong headers for that call?

Create Tickets

Hi blakmatrix,
in these days I faced an issue which is blocking me:
the create function, for ticket, groups, users, don' t work properly. Debugging them I notice, in the json sent, there is no body, and the ticket I'm passing, using a simple curl request, is created.

         { method: 'POST',
           uri: 'https://our_domain.zendesk.com/api/v2/tickets.json',
           headers: 
                 { 'Content-Type': 'application/json',
                   Accept: 'application/json',
                   'User-Agent': 'node-zendesk/0.0.18 (node/0.10.25)',
                   Authorization: 'Basic    auth_string' },
           body: '{}' }

Can you please help me, at least to understand where should I work on your code?
Thanks
Cheers!!

Update many users Zendesk REST API option. Coming?

Hi creators of node-zendesk.....

I was wondering if there are any plans for implementing the Zendesk Update-many-users endpoint. It can be found here: https://developer.zendesk.com/rest_api/docs/core/users#update-many-users

It would be far easier than having to iterate over users and create them 1by1. Before then requesting the Zendesk REST API to create each user by individual requests. I hope you follow me, I will gladly elaborate further.

I see that you have it listed as not implemented yet: https://github.com/blakmatrix/node-zendesk/blob/master/doc/api-coverage.md - clearly telling me that you are aware.

So basically a kind request for a status on the update endpoint :-)

Thank you sincerely and I'm looking forward to hear from you.
Kind regards
/Lars

TypeError: Cannot read property 'next_page' of undefined

hello,

I am using your node module for my Zendesk project.

My application does interval reads for gathering the latest ticket information (client.tickets.list).

Periodically this fails with the above error. Full error:
TypeError: Cannot read property 'next_page' of undefined
at /Users/ops/node/StrapTickets/node_modules/node-zendesk/lib/client/client.js:193:28
at Request._callback (/Users/ops/node/StrapTickets/node_modules/node-zendesk/lib/client/client.js:155:5)
at Request.self.callback (/Users/ops/node/StrapTickets/node_modules/node-zendesk/node_modules/request/main.js:127:22)
at Request.EventEmitter.emit (events.js:98:17)
at Request. (/Users/ops/node/StrapTickets/node_modules/node-zendesk/node_modules/request/main.js:767:16)
at Request.EventEmitter.emit (events.js:117:20)
at IncomingMessage. (/Users/ops/node/StrapTickets/node_modules/node-zendesk/node_modules/request/main.js:729:14)
at IncomingMessage.EventEmitter.emit (events.js:117:20)
at _stream_readable.js:920:16
at process._tickCallback (node.js:415:13)

I have modified the clients.js to resolve this as follows for NULL result or not so as not to error and only return nextPage if TRUE:
Where you see:

    nextPage = result.next_page;

Update:

    if (! result)
         return callback("Result is NULL");

    if (result)
         nextPage = result.next_page;  

Let me know if this can be added to the project.

Thanks,
Dave

Working Group Request

Hey, I'd like to get some help on this project, I'd like to get a Working Group of a minimum of 2 other heads to help drive this project along, We would have to commit meeting at least monthly (if there is anything to meet about) over skype/hangout or gitter. The objective is simply to help drive changes forward and get a regular set of eyes on the project.

Get results one page at a time

I would prefer to not have paging handled by this library. Is there a way to expose that so I can get results one page at a time?

Subdomain parameter not working in Library mode

The client initialization code for getting the subdomain option nconf.get('subdomain') does not return the subdomain when it is set from the createClient method options:

var client = zendesk.createClient({
  username:  '[email protected]',
  token:     'testing_token',
  remoteUri: 'https://test.zendesk.com/api/v2',
  subdomain: 'wtp',
  helpcenter: true,
  debug: true,
  disableGlobalState: true
});

Replacing nconf.get('subdomain') with options.stores.defaults.store.subdomain seems to fix the issue.

https://github.com/blakmatrix/node-zendesk/blob/master/lib/client.js#L57

use of global request library prohibits multi-tenant use

I was trying to use this library as the backend for a server that would take user credentials and use them for zendesk queries. In the context of a single app, there could be multiple instances of the node-zendesk client, each with different authentication credentials.

This seems to be defeated by the use of the simplified 'request' module, as it uses a global cookie cache. Once anyone successfully logs in, those credentials will be used for any connection, regardless of how many clients are instantiated. From the node-zendesk API, it seems that the cookies should be associated with each client, not globally across all clients. If that is the intent, then the credentials should be configured globally, not per-client. It seems more desirable, however, to enable per-client credentials to support a wider variety of use cases.

Alternatively, since the credentials are sent with each request, cookies could simply be turned off, but the effects of doing this are unclear.

Record validation

I'm trying to use this library to create new users on the support system, but it does not seem to work. users.create responds with:

{"error":"RecordInvalid","description":"Record validation errors","details":{"name":[{"description":"Name: is too short (minimum is 1 characters)"}]}}

I am most probably doing something wrong with the data formatting, but I cannot figure out what exactly. I would appreciate if you could provide a working example using users.create function.

Should we allow optional arguments or not?

I am making up the missing HelpCenter endpoints, and I meet this one:

POST /api/v2/help_center/{locale}/sections/{id}/articles.json

Generally this end point act the same as:

POST /api/v2/help_center/sections/{id}/articles.json

The only different is the first one would put locale code in URL like api/v2/help_center/**fr**/sections/{id}/articles.json

And the second one need to specify the locale code in article object {locale: 'fr'}

So I would like to query you if we have a pattern for this condition.

I myself is using code like:

// ====================================== Creating Articles
Articles.prototype.create = function (/*Optional*/locale, sectionID, article, cb) {
  var args = Array.prototype.slice.call(arguments);

  if(args.length >= 4){
    this.request('POST', [locale, 'sections', sectionID, 'articles'], article, cb);
  }
  else{
    sectionID = args[0];
    article = args[1];
    cb = args[2];
    this.request('POST', ['sections', sectionID, 'articles'], article, cb);
  }

@blakmatrix @erikzrekz
Could you propose any better format for this? I found section / category / article all facing this question.

Helpcenter get articles list

I try to get article list and see { [Error: socket hang up] code: 'ECONNRESET' }
NodeJS 4.1.1

PS: category list and section list work fine

Search users by external_id

Zendesk docs have this call, is it possible to directly use the external_id search rather than using it in a query. I think zendesk has specifically optimized the other query.

Search Users

GET /api/v2/users/search.json?query={query}

GET /api/v2/users/search.json?external_id={external_id}

Specify a partial or full name or email address as the value of the query attribute. Example: query="Gerry". Specify an id number as the value of the external_id attribute. For more advanced searches of users, use the Search API.

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.