Giter VIP home page Giter VIP logo

sails-generate-ember-blueprints's People

Contributors

aars avatar brandonocasey avatar globegitter avatar mdconaway avatar mphasize 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

sails-generate-ember-blueprints's Issues

sideloaded associations don't have their collection ids

if you see here:

http://api.test.sonatribe.com/listingevents

you can see that artists are side loaded. cool. however, the artists don't have the images property.

If you drill down to one of the artists you can see it here:

http://api.test.sonatribe.com/artists/54e34a2de4dbefd62c409ad2

While I don't want the associations loaded that deep, when ember receives the sideloaded artist it thinks it has it all so it doesn't try and fetch the images when I drill into the artist.images property. I would have thought that would be lazily loaded but it doesn't.

I could be wrong with all this, in which case please accept my apologies. I have asked this question on SO if there is any detail I may have left out please let me know:

http://stackoverflow.com/questions/28362406/ember-data-child-data-not-being-fetched-when-displayed-in-template

Enable and honour query parameters to include/exclude relationships and properties

This question actually popped up in the sane gitter chat and I was thinking of how to accomplish it so I'm glad to see in the road map. I found this issue:
balderdashy/sails#780 (comment)

So according to this the 2nd param in the find can let us accomplish this, if it is recognized by the blueprint and passed properly.

I did something similar by adding a basic mongo $near query to the old version of your blueprint which you can see here what I did to the_actionUtil:
mgenev/how-to-sane@8a27ebc

Ignore the changes to the find.js, that was from an early attempt and made unnecessary by adding to the criteria in the action util, so the latest version of find is as you wrote it:
https://github.com/mgenev/how-to-sane/blob/master/server/api/blueprints/find.js

This has allowed me to do geoQueries from Ember like this:
https://github.com/mgenev/how-to-sane/blob/master/client/app/pods/s/vendors/index/route.js#L8-L15

I'm not sure how you planned to go about the issue of including or omitting properties, but it seemed to me like this approach can work. Also if you can comment on what you think of the geo implementation that would be great. I want to add solid mongo support and I believe postGIS can allow that in PostgreSQL as well.

error with populate

I was facing with a strange problem. When I had a model X and it had collection Y, then the path /Xs/:parentid/Ys returnd [] even when there was data.

When looking into the details and spending a couple of days of debugging, I found that the problem is with blacklist. I was creating blacklist for some parameters that I passed to get specific queries, but that blacklist was not including parent id as expected in populate.js.

In populate.js, the line

'''javascript
    req.options.criteria.blacklist = req.options.criteria.blacklist || [ 'limit', 'skip', 'sort', 'id', 'parentid'] 
'''

assumes that if the blacklist is previously set, then the default items in the blacklist should already be there. However, to be successful with the queries, the blacklist needs to include [ 'limit', 'skip', 'sort', 'id', 'parentid'] even if they are not already included. A solution would be to rewrite the line as:

'''javascript
req.options.criteria.blacklist = req.options.criteria.blacklist || [];
req.options.criteria.blacklist = req.options.criteria.blacklist.concat([ 'limit', 'skip', 'sort', 'id', 'parentid']);
'''

This solution will however can create duplicate entries, but since the list is not too long, leaving the duplicates may not have big impact on the performance. I ended up creating a function uniqueList in the action util to filter the list to keep it unique.

The same issue is true for other codes where blacklist has been used - e.g. in actionUtil.js

I can add these blacklist items when creating blacklist, but the above approach would make sure the users of this module does not need to know what blacklist items they should include when they are creating blacklist! I will be better if the change is added in the source itself.

Please include better usage instructions

Just been testing the new SANE 2.0 project generator

sane/sane#2 (comment)

I end by creating a sails User resource. I assume that it will automatically be "hooked up" to be Ember Data compatible using the blueprints?

It would perhaps be interesting to be able to create a User resource on both ends with YAG (Yet Another Generator)? Wadda you think?

Would be nice with a full example tutorial for how to create such a resource like user, create the Ember Data User and have the full REST going on from Ember View to Sails backend. Thanks ;)

[feature] Add beforeAction and afterAction event callback

Hi,

What if we add an event hook base on sails service.
For example, we can change this part,

/* if ( req.user && req.user.id ) {
   sails.log.debug( 'Injecting req.user into blueprint create -> data.' );
  data.user = req.user.id;
} else {
  // exception for creating new users, otherwise any creative act needs a logged in user
  if ( Model.identity !== 'user' ) return res.forbidden( "Create blueprint needs an authenticated user!" );
} */

to this,

// call sails service
// Note: it's model, not Model
beforeCreate.process(req, res, model, data);

and inside beforeCreate service,

module.exports = {
  process: function ( req, res, model, data ) {

    // We can do a lot of thing here without need to override your blueprint
    // Check if you want to do something with this kind of model
    // Ex: you want to add user.id just only for foo model
    if ( model === 'foo' ) {

      // Do the logic
      if ( req.user && req.user.id ) {
        sails.log.debug( 'Injecting req.user into blueprint create -> data.' );
        data.user = req.user.id;
      } else {
        if ( Model.identity !== 'user' ) return res.forbidden( "Create blueprint needs an authenticated user!" );
      } 
    }
  }
};

List action:

etc.

Then, people will move their logic outside and we can easily support for backward compatibility.
If you want, I'll create a PR about this.

Btw. thanks for this awesome repo. ๐Ÿ˜„

Pluralizing sideloaded uncountable associations

Is there a way to stop this from pluralizing sideloaded uncountable associations?

Ex. We're using the basic api, and we have a sails.js model and controller named Hardware. Doing a find on different model with a relation to Hardware, causes the associations to be loaded as 'hardwares'

I think this is the offending section, https://github.com/mphasize/sails-generate-ember-blueprints/blob/master/templates/basic/api/blueprints/_util/actionUtil.js#L63.

As a temporary fix, we've overridden the blueprint, but it would be ideal if there was a way to configure the blueprint for this model. Is this possible now or is anything in the works?

Thanks!

slug vs primaryKey

I'd like the following route:
app.example/username
to call the following endpoint:
api.example/user/username

But the current findOne method only supports pkโ€™s for looking up records, therefore I tweaked the findOne method so it works the way i want to, like so:

// Custom User slug implementation
// When the model is `user` and the pk is
// not a digit, we'll assume its a username
// slug and query that in stead.

// original:
// var query = Model.findOne( pk );

// Ensure a model can be deduced from the request options.
var modelName = req.options.model || req.options.controller;
if ( !modelName ) throw new Error( util.format( 'No "model" specified in route options.' ) );

var query;
if(modelName === 'user' && (/\D/).test(pk)) {
    query = Model.findOne({ username: pk });
} else {
    query = Model.findOne( pk );
}
// end slugism

Could you perhaps suggest a more elegant way of working with slugs?

PS I'm really glad you continued working on this project. Just upgraded to latest and things feel much more mature now. Awesome!

following link model name is all lowercase

Not sure the title explains it very well!!

Here is an example:

http://api.test.sonatribe.com/users/5508636667da060300c13012/listingEvents

note the model name is all lowercase

where as if you go here: http://api.test.sonatribe.com/listingEvents/55085e9967da060300c12881

it is now camelcase.

here is my model for user:

module.exports = {

  attributes: require('waterlock').models.user.attributes({

    email: 'string',
    username: 'string',
    images: {
        collection: 'image',
        via: 'user'
    },
    avatarImage: {
      model: 'image'
    },

    listingEvents: {
      collection: 'listingEvent',
      via: 'users'
    }

  }),

  beforeCreate: require('waterlock').models.user.beforeCreate,
  beforeUpdate: require('waterlock').models.user.beforeUpdate
};

and listingEvent:

/**
* ListingEvent.js
*
* @description :: TODO: You might write a short summary of how this model works and what it represents here.
* @docs        :: http://sailsjs.org/#!documentation/models
*/

module.exports = {
//  identity: 'listing_event',
  tableName: 'listingEvent',
  attributes: {
    name: { type: 'string' },
    start: { type: 'date' },
    end: { type: 'date' },
    eventInstanceSlug: { type: 'string' },
    location: {
      model:'location'
    },
    artists: {
      collection: 'artist',
      via: 'listingEvents'
    },
    users: {
        collection: 'user',
        via: 'listingEvents'
    }
  }
};

This causes ember to blow out with:

WARNING: Encountered "listingevents" in payload, but no model was found for model name "listingevent" (resolved model name using sonatribe-ui@serializer:-rest:.typeForRoot("listingevents"))
ember.debug.js:28602 Error: Assertion Failed: The response from a findHasMany must be an Array, not undefined
    at new Error (native)

date queries appear broken

I tried out doing date queries the way the Sails docs has them

Model.find({ date: { '>': new Date('2/4/2014'), '<': new Date('2/7/2014') } })

this works when you have a custom controller.

The problem is in the case of the blueprint, http turns dates into strings and when the blueprint is oblivious that a date value comes it doesn't know to cast it and you get an error:

error: Sending 500 ("Server Error") response: 
 Error (E_UNKNOWN) :: Encountered an unexpected error
MongoError: invalid regular expression operator
    at Object.toError (/Users/mgenev/Projects/how-to-sane/server/node_modules/sails-mongo/node_modules/mongodb/lib/mongodb/utils.js:114:11)
    at /Users/mgenev/Projects/how-to-sane/server/node_modules/sails-mongo/node_modules/mongodb/lib/mongodb/cursor.js:700:54
    at Cursor.close (/Users/mgenev/Projects/how-to-sane/server/node_modules/sails-mongo/node_modules/mongodb/lib/mongodb/cursor.js:989:5)
    at commandHandler (/Users/mgenev/Projects/how-to-sane/server/node_modules/sails-mongo/node_modules/mongodb/lib/mongodb/cursor.js:700:21)
    at /Users/mgenev/Projects/how-to-sane/server/node_modules/sails-mongo/node_modules/mongodb/lib/mongodb/db.js:1874:9
    at Server.Base._callHandler (/Users/mgenev/Projects/how-to-sane/server/node_modules/sails-mongo/node_modules/mongodb/lib/mongodb/connection/base.js:453:41)

Please let me know if you have any solution for this.

A suggestion came up in the sane chat that the blueprint does a look up on a model's data types after it parses the model's name and figures out which ones should be dates and casts them...

I'm seeing that each model has the _attributes field which we can walk and check for datetime fields, then check if the client sent those fields in the request and if so cast them into dates. The createdAt and updatedAt fields are always such fields by default.

Single record responses have pluralized key

The response for /users/123 is currently:

{
  "users": [
    {
      "key": "value"
    }
  ]
}

while Ember seems to be expecting:

{
  "user": {
      "key": "value"
  }
}

My setup (ember-cli 0.2.2 / ember 1.11.0 / ember-data 1.0.0-beta.16.1 / sails 0.11 / sails-generate-ember-blueprints 0.0.6) crapped out when requesting a single record saying:

Expected an object as `data` in a call to `push` for ...

QUESTION: Best practices for integrating these blueprints with custom routes

Recently started using this library to get our sails backend to talk to the ember rest adapter. It's an awesome library so thanks!

I have one major question regarding how to implement this though:

As far as I know (and I'm very new to sails) custom defined routes do not ever interact with blueprints. After getting the blueprints running, our custom controller actions still return json in the old format.

Obviously we could construct the response object in the correct format inside of each action but I don't want to replicate that effort in every action.

Right now my work around is to require the actionUtil library and use its utilities to run emberizeJSON with the properly parsed data eg:

///userController.js
  create: function (req, res) {
  User.create (req.body)
 .then(function(user)
      var model = emberUtils.parseModel( req );
      var userJson =  emberizeJSON(model, user, null, false)
      return res.json(userJson);
})
}

(bear in mind this example is really contrived. I would do it slightly differently in reality)

Has anyone come up with a better way to do this? Is there a way to get the blueprints to interact with custom controller actions. Has anyone tried to implement a serializer object based off of the functions in the actionUtil library?

Thanks again for the help and for the awesome library!

Sockets.on([model]) not working with Ember blueprints

I have a resource user which pluralized is users of course so when I go to the browser console and type io.sockets.on() I dont get anything when using 'user' or 'users' if I update the resource. how do I fix that?

Library Modernization

Mphasize,

I can see you have moved on to other things, but my group heavily uses this library and has started to refactor it a bit with the goal of making it usable as sails moves into version 1.0+.

I just posted it on GitHub and NPM:
https://github.com/mdconaway/sails-ember-rest
https://www.npmjs.com/package/sails-ember-rest

Let me know if there is anything else I can do to cite your library as being the original source, and if you have any recommendations on implementing changes going forward.

Thanks for knocking out all the heavy lifting!

After policy

Hi,

I am trying to make use of the blueprints and have 2 hooks, for before and after create.
I guess before can be managed by policies, but how to do an after create ( before sending request ) hook ?

thanks

Move and improve this feature one sails.js 0.11.x hook

Sais core features are hooks then we can create new features for sails or change the core features with hooks, and the sails.js 0.11.x has suport to load hooks with npm modules.

Advantages:

  1. Suport to upgrades
  2. Easy to install ( npm install sails-hook-emberjs ) and done
  3. Has access to all sails.js apis, core features and events

Sails hooks docs: https://github.com/balderdashy/sails/tree/master/lib/hooks

this is the path that will follow but it would be nice move with you guys, if you do not agree, that's fine but it's what i will do.

Only filles relationship-array with 30 elements

This line https://github.com/mphasize/sails-generate-ember-blueprints/blob/master/templates/basic/api/blueprints/_util/actionUtil.js#L128 creates a bug in my ember app.

I am having a nested relationship (and organisation has many research projects and research projects can belong to many organisations, done via 1:n, n:1 relationship, since I need metadata on the join table) and when I load the research projects I am automatically getting the join table and then usually load the organisations 'manually' in ember:

// model of a researchProject
model.get('organisations').forEach(function (organisation) {));
      organisation.get('organisation');
    });

The problem now when I load these organisations they have also preload the keys to the join table, which ember then automatically updates. The issue here being that the keys are limited to 30 per default, so when the project that loads this relationship is not within the 30 keys ember just breaks the relationship.

If I change it to a higher number (e.g. 50) it does work in my case again but wonder if there is a better fix for that? Maybe even on the ember side?

Also if the example is not completely clear I can give more detail.

Roadmap 0.1.0

  • merge PR #9
  • add some tests, for example if proper configuration options are set
  • add examples and explain all the configuration options and their impact
  • adjust default behavior of advanced to emulate basic, unify the 2 sets
  • respect non-default settings for primaryKey on Sails models
  • simplify Ember service to always use sideloading (embedded style will be a separate set of blueprints)
  • bring the require lodash improvements from the basic blueprints into the advanced blueprints

The work being done can be coordinated here #19

Using an unserialized object as a model in actionUtil/emberizeJSON

Hi,

Thanks for the wonderful blueprint!

I'm manually calling the blueprint in one of my controllers for a special case and it's working great.

var actionUtil = require('sails-generate-ember-blueprints/templates/basic/api/blueprints/_util/actionUtil'),
    etc...

User.find(filter)
    .then(function (users) {
        res.ok(actionUtil.emberizeJSON(User, users, req.options.associations, false));
    });

Now I'm trying to add a cache layer to that same Sails controller but was having some issues when it comes to deserializing the stored data.

Perhaps I'm using the library in a way it wasn't intended but basically I'm using this process:

// Get my data from Sails model
User.find(filter)
    .then(function (users) {
        // Manually emberize the JSON data and return response
        res.ok(actionUtil.emberizeJSON(User, users, req.options.associations, false));
        // send the user result down the promise chain as a string
        return JSON.stringify(users);
    })
    .then(function (serializedUsers) {
        // Save results in my cache layer (in this case it's redis via redis-q)
        return client.hsetQ(CONST_REDIS_KEY_CONTENT, 'users', serializedUsers)
            .then(function () {
                return client.expireQ(CONST_REDIS_KEY_CONTENT, sails.config.cache.redis.featured.ttl);
            });
    })

Then on the next request, I check for the cache

client.hgetQ(CONST_REDIS_KEY_CONTENT, 'users')
    .then(function (data) {
        if (data && data.length) {
            data = JSON.parse(data);
            if (data.length && data[0] && data[0].content) {
                // load this stored data and again emberize the data for the response
                res.ok(actionUtil.emberizeJSON(Bump, data, req.options.associations, false));
                return true;
            }
        }
        return false;
    })
    .done(function (hasCache) {
        // original code here to get content based on having cache
    });

The problem comes in the actionUtil function where it tries to prepare the record

This portion of code in sails-generate-ember-blueprints/templates/basic/api/blueprints/_util/actionUtil ends up invoking an undefined function on record, as this time around, the records are just simple objects.

var prepareOneRecord = function ( record ) {
    // get rid of the record's prototype ( otherwise the .toJSON called in res.send would re-insert embedded records)
    record = create( {}, record.toJSON() );

I've added this change to solve this case

var prepareOneRecord = function ( record ) {
    // get rid of the record's prototype ( otherwise the .toJSON called in res.send would re-insert embedded records)
    record = create( {}, record.toJSON ? record.toJSON() : record );

But I wanted to ask:
Is this the proper method for serialized data usage?
If so, would you like a PR with the changes?

Somewhat related to this item:
#41

sideloaded models are not capitalized. (or, non-sideloaded models strangely capitalized)

Sideloaded models are not capitalized in the returned json, for example:

// GET /testmodels
{
  "testModels": [
    {
      "relations": [
        10
      ],
      "foo": "bar",
      "createdAt": "2015-05-11T14:26:07.238Z",
      "updatedAt": "2015-05-11T14:26:07.238Z",
      "id": 18
    }
  ],
  "testrelations": [
    {
      "someFoo": "someBar",
      "model": 18,
      "createdAt": "2015-05-11T14:26:07.243Z",
      "updatedAt": "2015-05-11T14:26:07.244Z",
      "id": 10
    }
  ],
  "meta": {
    "total": 1
  }
}

And the other way around:

// GET /testrelations
{
  "testRelations": [
    {
      "model": 18,
      "someFoo": "someBar",
      "createdAt": "2015-05-11T14:26:07.243Z",
      "updatedAt": "2015-05-11T14:26:07.244Z",
      "id": 10
    }
  ],
  "testmodels": [
    {
      "foo": "bar",
      "createdAt": "2015-05-11T14:26:07.238Z",
      "updatedAt": "2015-05-11T14:26:07.238Z",
      "id": 18,
      "links": {
        "relations": "/testmodels/18/relations"
      }
    }
  ],
  "meta": {
    "total": 1
  }
}

Here is the test setup I built to confirm this behaviour: https://github.com/aars/sails-generate-ember-blueprints-capitalisation

Of course now the issue is, Ember doesn't understand one of these since the ember models are either capitalized or not. (in this case the models name would be testmodel or testModel or 'TestModel`, neither of which matches all the cases).

Am I doing something wrong? Should I remove all capitalization from my serverside models?

I'm guessing I can resolve this by tweaking the Ember.buildResponse method, but I'm wondering if this is desired behaviour, and if so, how to handle it.

Cheers.

Associations between models

Hello,

first, thank you for these blueprints!

These sails-generate-ember-blueprints do not contain the "add" function in contrast to the original sails blueprints (http://sailsjs.org/documentation/reference/waterline-orm/populated-values/add).

We have two basic use cases:

  • via ember.js
  • in sails-only "scripts", like an initial data importer that needs to establish multiple associations while creating records.

For these 2 high level use cases, how are associations intended to be used via sails-generate-ember-blueprints, for

  • one-to-one
  • one-to-many and
  • many-to-many associations?

Should we just the add the "add" function of the original sails blueprints?

Thank you very much,
Manuel

`sails generate ember-blueprints` failed with code 1

Ran into this error when trying to setup a new sails/ember project. Any suggestions?

[server]$ npm install sails-generate-ember-blueprints
[email protected] node_modules/sails-generate-ember-blueprints
โ”œโ”€โ”€ [email protected]
โ”œโ”€โ”€ [email protected] ([email protected])
โ””โ”€โ”€ [email protected]
[server]$ sails generate ember-blueprints
Running generator (sails-generate-ember-blueprints) @ `/Users/jhliberty/work/Seeds-Master/DesiredResult/medicoreo/server`...
Installing "basic" of blueprints.
fs.js:521
  if (typeof m === 'string')
               ^
Error: ENOENT: no such file or directory, open '/Users/jhliberty/work/Seeds-Master/DesiredResult/medicoreo/server/api/blueprints/create.js'
    at Error (native)
    at Object.fs.openSync (fs.js:546:18)
    at Object.fs.writeFileSync (fs.js:1147:15)
    at /Users/jhliberty/work/Seeds-Master/DesiredResult/medicoreo/server/node_modules/sails-generate-ember-blueprints/lib/index.js:36:14
    at Array.forEach (native)
    at Object.module.exports.targets../.exec (/Users/jhliberty/work/Seeds-Master/DesiredResult/medicoreo/server/node_modules/sails-generate-ember-blueprints/lib/index.js:35:72)
    at afterwards (/Users/jhliberty/.nvm/versions/io.js/v1.6.2/lib/node_modules/sails/node_modules/sails-generate/lib/target.js:61:23)
    at Object.async.until (/Users/jhliberty/.nvm/versions/io.js/v1.6.2/lib/node_modules/sails/node_modules/sails-generate/node_modules/async/lib/async.js:655:13)
    at generateTarget (/Users/jhliberty/.nvm/versions/io.js/v1.6.2/lib/node_modules/sails/node_modules/sails-generate/lib/target.js:39:9)
    at /Users/jhliberty/.nvm/versions/io.js/v1.6.2/lib/node_modules/sails/node_modules/sails-generate/lib/generate.js:155:11

Specify association depth

Hi,

Could if be possible to allow the depth of associations ( or childs of childs ) to sideload, or specify the models to sideload?

so, something like a -> b , b -> c

and json send a, b and c?

Exclude particular associations

Passport is part of my setup. I used to delete the passports property in the toJSON method, but with the advanced blueprints it is part of the response. Do you perhaps have a way of preventing this? includeIn: false? ๐Ÿ˜ถ

Contributor access to project

Hey @mphasize thanks for creating this project. I was wondering if I could contributor access to this repository just so I could make changes/enhancement/merge PRs when needed?

I am not planning to do anything in the short-term, but would be great for when I have some more time in the following weeks when I might have a burst of time just so I can move on things quickly.

I am not planning to change anything hugely - the goal really just is to get as close as possible to http://jsonapi.org/ standard with embedded records support, good performance, etc.

Let me know :)

Missing "," in docs

There's a missing comma in the docs under "Accessing the REST interface without Ember Data".

{
  "post": {
    "title": "A new post"
    "content": "This is the wonderful content of this new post."
  }
}

Wanted to try it out and blindly copied the json - took me some minutes of my life to find the error ;>

Roadmap 0.2.0

Search for records with existing relationships

probably dependent on waterline#509

Quote from discussion on #9:

I just want to return models who actually have that relationship. So how you can now do http://localhost:1337/api/v1/project?category=bla with a normal attribute, I would love to be able to do http://localhost:1337/api/v1/project?topics=true or something, where-as topics is a relationship attribute in the model

Enable and honour query parameters to include/exclude relationships and properties

similar to json-api endpoints sideloading
maybe dependent on waterline#855

Quote from #9 discussion:

Also it would be cool to be able to turn sideloading off that way: I am trying here to really optimize the data I am sending to the client, because I am sending a lot of data already, so all that I can reduce really is a win and I actually don't need sideloading for a certain request.

And imo even more important would be something like ?select[]=fieldname1&select[]=fieldname2 to further optimize the json size.

JSON API compliance

As Ember Data moves close to full JSON API compliance and since projects like Ember Data Endpoints exist, it would be great to release a set of blueprints that is 100% JSON API compatible.

Ensure that Websockets are working fine alongside the blueprints

After a quick feedback from @huafu at the end of #13, we believe that the socket connections should work just fine alongside the blueprints, if you're using for instance the socket adapter from ember-data-sails for some models you want to fetch over sockets, and the standard REST adapter for the models you want to fetch over HTTP. However, looks like nobody tried it yet, so let's make sure that it works.

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.