Coder Social home page Coder Social logo

herbs-cli's Introduction

CD Build codecov

herbs CLI

CLI helps speed up your development cycle with HerbsJS by generating use cases and infrastructure layers (REST, GraphQL, Repositories, etc) based on your entities.

Installing and generating a CRUD project

To install herbs-cli:

npm i -g @herbsjs/herbs-cli

Then run:

herbs new

project-setup

project-structure

Default generated project structure

.
├── package-lock.json
├── package.json
└── src
    ├── domain
    │   ├── entities
    │   └── usecases
    └── infra
        ├── api
        │   ├── graphql
        │   ├── rest
        ├── config
        └── data
            ├── database
            │   └── migrations
            └── repositories

commands

herbs new

Generate a new project based on your entities(or not)

herbs new

Options

Question Description Default value e.g
Project name? This is the Project Name that will be used int the project folder name and package.json. herbs-project my-project
Project description? This is the Project description that will be used int the package.json project generated by herbs-cli my beautiful project
Project author's name? This is the author's name that will be used int the package.json. herbs CLI Charlie
What license do you want to use? Use arrow keys to choose your License. -- --
Generate graphql layer? This will generate a graphql layer for your domain. Y n
Generate rest layer? This will generate a rest layer for your domain. Y n
What database do you want to use? Use arrow keys to choose your Database. -- --
Do you want to initialize a Git repository? This will initialize a git repository for your project. N y
Do you want to install dependencies? This will run npm install and npm start for you no yes

You also can run the project passing the options though CLI

herbs new --name MyAwesomeProjectName --description "my description" --author "name of the author" --license MIT --graphql --rest --database postgres --npmInstall yes

herbs update

Generate all necessary layers(graphql, rest, repository, etc) based on your new entity added into entities folder

After had created a new entity into entities folder, type in your terminal:

herbs update

Debugging

If you want to debug and/or run the CLI locally, you can do it by following the steps below:

npm link # On the CLI project folder

herbs # On the folder where you want to use the CLI

Contribute

Come with us to make an awesome herbs-cli.

Now, if you do not have the technical knowledge and also have intended to help us, do not feel shy, click here to open an issue and collaborate their ideas, the contribution may be a criticism or a compliment (why not?)

If you would like to help contribute to this repository, please see CONTRIBUTING

herbs-cli's People

Contributors

anahelenamagit avatar anahelenasilva avatar britodoug avatar crizantottavx avatar dalssoft avatar danielrsous avatar danielsous avatar dependabot[bot] avatar devdougbrito avatar dls-vx avatar eduardo-vortx avatar endersoncosta avatar euduardo avatar guilhermemiua avatar italojs avatar jhomarolo avatar jhomarolo-vortx avatar mateuscovos avatar mellogab avatar mellogabvortx avatar mtperesvx avatar othonvv avatar pedrohaupenthal avatar pedromarquesfr avatar rodrigodosanjosoliveira avatar semantic-release-bot avatar tadvortx avatar vitorgamer58 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

Watchers

 avatar  avatar  avatar  avatar

herbs-cli's Issues

Error when running herbs new

Error when running herbs new
When I try to run the herbs new command using Windows 10 PowerShell, I get the following error:

image

To Reproduce
Steps to reproduce the behavior:

  1. Install herbs 1.10.2 or higher npm i -g @herbsjs/[email protected]
  2. Run herbs new command with the steps shown in the picture above
  3. Wait a bit
  4. See error

Expected behavior
The cli should have generated an awesome projetct structure for me 😄

Screenshots
image

Additional context
I'm running Windows 10 with PowerShell on Windows Terminal.
I also tried using node 14 version, but the result is the same (no project structed is generated)
Please let me know if it's just a problem with my machine and environment, but when I installed herbs-cli version 1.10.1, the project structure was generated correctly.

herbs update - Entity with methods

ex:

    entity('ToDoList', {
        id: field(Number),
        ...
        isEmpty() {
            ...
        },

error:

TypeError: Type is not a constructor
    at type2Str (C:\Users\David\AppData\Roaming\npm\node_modules\@herbsjs\herbs-cli\src\generators\new\infra\database\migrations\migrations.js:5:17)
    at C:\Users\David\AppData\Roaming\npm\node_modules\@herbsjs\herbs-cli\src\generators\new\infra\database\migrations\migrations.js:28:33  
    at Array.forEach (<anonymous>)
    at Object.migrations (C:\Users\David\AppData\Roaming\npm\node_modules\@herbsjs\herbs-cli\src\generators\new\infra\database\migrations\migrations.js:25:29)
    at Command.run (C:\Users\David\AppData\Roaming\npm\node_modules\@herbsjs\herbs-cli\src\commands\update.js:9:75)

Add read.me inside generated project

Is your feature request related to a problem? Please describe.
Since we have the herbsshelf, we should create a read.me as an example to show the user how to use Herbs.

Describe the solution you'd like
A read.me file with instructions about how to use/config the project generated by cli

Error when creating new project - v1.7.0

Describe the bug
I receive an error "Error: Cannot find module 'lodash.startCase'" when creating a new project.

To Reproduce

  1. Install the latest version of herbs-cli (1.7.0 here)
  2. Run "herbs new" command
  3. Fill all the options with default values
  4. See the error when the CLI is trying to create the project structure.

Expected behavior
The project structure to be created.

Screenshots
Screenshot from 2021-10-25 19-47-51

Additional context
I'm using Ubuntu 21.10, with NodeJS v14.18.1 and NPM 6.14.15
UPDATE: Also, Node and NPM installed using NVM.

adasd

Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

Describe the solution you'd like
A clear and concise description of what you want to happen.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

herbs update - Entities with fields with another entity as type

ex:

    entity('ToDoList', {
        id: field(Number),
        items: field([Item]),

error:

TypeError: Type is not a constructor
    at type2Str (C:\Users\David\AppData\Roaming\npm\node_modules\@herbsjs\herbs-cli\src\generators\new\infra\database\migrations\migrations.js:5:17)
    at C:\Users\David\AppData\Roaming\npm\node_modules\@herbsjs\herbs-cli\src\generators\new\infra\database\migrations\migrations.js:28:33  
    at Array.forEach (<anonymous>)
    at Object.migrations (C:\Users\David\AppData\Roaming\npm\node_modules\@herbsjs\herbs-cli\src\generators\new\infra\database\migrations\migrations.js:25:29)
    at Command.run (C:\Users\David\AppData\Roaming\npm\node_modules\@herbsjs\herbs-cli\src\commands\update.js:9:75)

Disable introspection on production

Hello everyone!

We have a problem with introspection when the environment config is production, even with the playground disabled, with introspection query we have access to mutations and queries of the api.

Playground disabled
image
image

But if we use introspection query
image

Introspection disabled
image
image

more at

https://www.apollographql.com/blog/graphql/security/why-you-should-disable-graphql-introspection-in-production/#:~:text=You%20can%20turn%20off%20introspection,%2C%20resolvers%2C%20introspection%3A%20process.

https://cheatsheetseries.owasp.org/cheatsheets/GraphQL_Cheat_Sheet.html

instrospection query:

{
  __schema {
    queryType {
      name
    }
    mutationType {
      name
    }
    subscriptionType {
      name
    }
    types {
      ...FullType
    }
    directives {
      name
      description
      locations
      args {
        ...InputValue
      }
    }
  }
}
fragment FullType on __Type {
  kind
  name
  description
  fields(includeDeprecated: true) {
    name
    description
    args {
      ...InputValue
    }
    type {
      ...TypeRef
    }
    isDeprecated
    deprecationReason
  }
  inputFields {
    ...InputValue
  }
  interfaces {
    ...TypeRef
  }
  enumValues(includeDeprecated: true) {
    name
    description
    isDeprecated
    deprecationReason
  }
  possibleTypes {
    ...TypeRef
  }
}
fragment InputValue on __InputValue {
  name
  description
  type {
    ...TypeRef
  }
  defaultValue
}
fragment TypeRef on __Type {
  kind
  name
  ofType {
    kind
    name
    ofType {
      kind
      name
      ofType {
        kind
        name
        ofType {
          kind
          name
          ofType {
            kind
            name
            ofType {
              kind
              name
              ofType {
                kind
                name
              }
            }
          }
        }
      }
    }
  }
}

ID field: use ID metadata from entity

With the upcoming release of the "ID field" feature (herbsjs/gotu#46), it would be possible to read the entity's metadata and generate better usecases, repos, etc.

const useCase = ({ userRepository }) => () =>
  usecase('Find one User', {
    // Input/Request metadata and validation 
    request: {
      id: Number,                   // <------ these fields (ex: multiple IDs) could come from entity metadata / IDs fields.
    },

Also, it's a opportunity to simplify the validation step for some usecases.

const useCase = ({ userRepository }) => () =>
  usecase('Create User', {
    // Input/Request metadata and validation 
    request: {
      nickname: String,
      password: String
    },
    ....
    //Step description and function
    'Check if the User is valid': step(ctx => {
      ctx.user = User.fromJSON(ctx.req)
      ctx.user.id = Math.floor(Math.random() * 100000)
      
      if (!.validate({ exceptIDs: true })) {                // instead of (!ctx.user.isValid()) 

REST endpoints with single quotes in their names

Ex:

'items' endpoints
    GET /'items'/:id -> Find one Item
    POST /'items' -> Create Item
    PUT /'items'/:id -> Update Item
    DELETE /'items'/:id -> Delete Item

Should be:

'items' endpoints
    GET /items/:id -> Find one Item
    POST /items -> Create Item
    PUT /items/:id -> Update Item
    DELETE /items/:id -> Delete Item

unit tests getting so much time to run

Today we have a problem to write unit tests into CLI, for most part of CLI functions I need to import something about generated project to collect the metadata, because this I need to install the node_modules every time I will test something, it make the test to take sooooooo much time to run.

My first suggestion is:

Install node_modules once and reuse it for all unit tests
pros:

  • The tests will run faster
  • The tests will reuse the node_modules

Cons:

  • node_modules will have more packages than necessary, I believe it can generate bugs.

Generating relations into repository layer

⚠️ WARN: I'm not proposing an ORM, just a smarter final generated code.

Most of our SQL based projects have relations, it's a super natural thing we need to have in our micro-services
e.g:

USERS_TABLE PRODUCTS_TABLESELES_TABLE
id name email
12 italo [email protected]
13 jhow [email protected]
14 david [email protected]
id name price
3 mouse 50
4 monitor 200
5 keyboard 40
id userId productId
34 12 3
35 12 5
36 13 3

Today when I generate a project based in my 3 entities (user, product, sales) using the CLI I got tree separated repositories like:

class UserRepository extends Repository {    
   constructor() {       
       super({            
         entity: User,            
         table: 'USER_TABLE',            
         ids: ['id'],            
         knex: connection        
       })   
     }
}
// -----------------------------------------
class ProductRepository extends Repository {    
   constructor() {       
       super({            
         entity: Product,            
         table: 'PRODUCTS_TABLE',            
         ids: ['id'],            
         knex: connection        
       })   
     }
}
// ----------------------------------------
class SaleRepository extends Repository {    
   constructor() {       
       super({            
         entity: Sale,            
         table: 'SALES_TABLE',            
         ids: ['id'], 
         // where is my  foreignKeys ?        
         knex: connection        
       })   
     }
}

Buuuuuuuuuuuttt I need my "SaleRepository" constains the "User FK" and "Product FK" configured like this:

input:

entity("Sale", {
    id: field(Number),
    product: field(Product), // or productId: field(Number)
    user: field(User), // or userId: field(Number)
})

output:

class SaleRepository extends Repository {    
   constructor() {       
       super({            
         entity: Sale,            
         table: 'SALES_TABLE',            
         ids: ['id'],    
         foreignKeys: [{ userId: Number, productId: Number }], 
         // it must to configure the migrations too, because today the
         // migration generated by CLI don't support foreignKeys.
         knex: connection        
       })   
     }

My usage suggestion is the CLI understand this entity:

entity("Sale", {
    id: field(Number),
    product: field(Product),
    user: field(User), 
})

so configure the foreignKeys and create repository's methods like findBy<fk_key>(Number), e.g.: findByUserId(Number) and findByProductId(Number)

Option to change which usecases can appear on the GraphQL layer

Description
This issue arose from the need for certain usecases not to be necessarily exposed in the graphQL layer, where only those with types query or mutation could appear.

Example
As the code demonstrates, only the usecase findAllUser would not be present in graphQL because its type has not been defined.

module.exports = [
    { usecase: require('./user/createUser'), tags: { group: 'Users', type: 'mutation'} },
    { usecase: require('./user/findOneUser'), tags: { group: 'Users', type: 'query'} },
    { usecase: require('./user/findAllUser'), tags: { group: 'Users'} }
]

Such an issue could cause only the desired usecases to be exposed to be used, making the application and documentation cleaner and more within the proposed business.

Delete entity use case - Wrong step description

current:

  usecase('Delete Item', {
    // Input/Request metadata and validation 
    request: {
      id: Number
    },

    // Output/Response metadata
    response: Boolean,

    //Authorization with Audit
    // authorize: user => (user.canDeleteItem ? Ok() : Err()),
    authorize: user => Ok(user),

    'Update the Item': step(async ctx => {
      await itemRepository.deleteByID(parseInt(ctx.req.id))
      return Ok()
    })
  })

module.exports = useCase

change to:

'Delete the Item': step(async ctx => {

Generated project dont creating the get and

I noted when we migrate the project to use the package @herbs/herbs2rest we didnt update the rest routes setup, so when I started my app it shows only this routes

users endpoints
    POST /users -> Create User
    DELETE /users/:id -> Delete User
 Server UP and :tornado: Spinning on port 3000

it's caused because the routes setup is wrong according the doc

const routes = [
    {
        name: ‘users’,
        post: { usecase: require(../../../domain/usecases/user/createUser’)(repositories) },
        update: { usecase: require(../../../domain/usecases/user/updateUser’)(repositories) },
        delete: { usecase: require(../../../domain/usecases/user/deleteUser’)(repositories) },
        getById: { usecase: require(../../../domain/usecases/user/findOneUser’)(repositories) }
    }

New project generation does not put the project name on package.json

Describe the bug
When generation a new project, the project name is not filled in the package.json file.

To Reproduce

  1. Run 'herbs new', with or without the --name option

Expected behavior
The package.json file should contain a propertyt name with the project name.

Screenshots
image

Herbs project must to born with version control

The project generated by herbs-cli must born with:

Git version control:

  • using .gitconfig information to suggest author information in initial setup, e.g: AuthorName - AuthorEmail
  • setting main with principal branch automatically
  • .gitignore standard to nodejs projects

Tests for entities

The only test currently being generated (from new or update command) is use case tests.

Since entities also can (and should) have logic, they should have tests for entities as well.

ex:
\src\domain\entities\user.js
\src\domain\entities\user.test.js

Delete UC / Repo - Better use of knex glue

current:

deleteItem.js

    'Delete the Item': step(async ctx => {
      await itemRepository.deleteByID(parseInt(ctx.req.id))
      return Ok()
    })

should be:

deleteItem.js

    'Delete the Item': step(async ctx => {
      const item = Item.fromJSON({ id: ctx.req.id })
      await itemRepository.delete(item)
      return Ok()
    })

and deleteByID from itemRepository.js should be removed.

`herbs new` fails when git is not installed

Describe the bug
While starting a new project with herbs new command, the process fails when trying to git init a repository, rather than informing the user that git isn't installed

To Reproduce

  1. Have a machine without git installed
  2. Run herbs new
  3. Select 'Do you want to initialize a Git repository? Yes'

image

discord test

Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

Describe the solution you'd like
A clear and concise description of what you want to happen.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

New project: could not find the file @herbsjs/herbs-cli/src/build/templates/knexFileTopostgres.ejs

Occurs an error when generating a new project with herbs new and selecting postgres as database. It says the template file @herbsjs/herbs-cli/src/build/templates/knexFileTopostgres.ejs was not found.

To Reproduce

  1. Run the following command to generate a new project: herbs new
  2. Choose Postgres on What database do you want to use?

Expected behavior
The new project should be created succesfully.

Screenshots
image

image

Additional context
Herbs CLI version: 1.4.0
Operation System: Linux

Possible problem:
The file templates/knexFileTopostgres.ejs is actually named knexFileToPostgres.ejs, so the Linux file system can't find the file.

Remove Infrastructure code from domain layer

Info about GraphQL (ex: type: 'mutation', type: 'query') should not be inside a file on the domain folder.

ex: src\domain\usecases\index.js

module.exports = [
    { usecase: require('./user/createUser'), tags: { group: 'Users', type: 'mutation'} },
    { usecase: require('./user/updateUser'), tags: { group: 'Users', type: 'mutation'} },
    { usecase: require('./user/deleteUser'), tags: { group: 'Users', type: 'mutation'} },
    { usecase: require('./user/findOneUser'), tags: { group: 'Users', type: 'query'} }
]

REST should have a GET all endpoint

Currently:

'items' endpoints
    GET /items/:id -> Find one Item
    POST /items -> Create Item
    PUT /items/:id -> Update Item
    DELETE /items/:id -> Delete Item

It should be:

'items' endpoints
    GET /items/ -> Find Item     // Return all Items. Could be the same UC as [GET /items/:id]
    GET /items/:id -> Find Item
    POST /items -> Create Item
    PUT /items/:id -> Update Item
    DELETE /items/:id -> Delete Item

ps: Already described in #61, but this issue is related to the endpoint only (not the UC that will give support to run).

Herbarium - Generate files with Herbarium

With the new release of Herbarium, CLI can generate files using it.

The best implementation reference is To Do List.

All entities, use cases and repositories should be added to Herbarium repo:

entity

...
const { herbarium } = require('@herbsjs/herbarium')

const Item =
  entity('Item', {
  ...
  })

module.exports =
  herbarium.entities
    .add(Item, 'Item')
    .entity

use case

...
const { herbarium } = require('@herbsjs/herbarium')
const { Item } = require('../entities/item')

const createItem = (injection) =>
  usecase('Create Item', {
    ...
  })

module.exports =
  herbarium.usecases
    .add(createItem, 'CreateItem')
    .metadata({ group: 'Items', operation: herbarium.crud.create, entity: Item })
    .usecase

repository

const { herbarium } = require('@herbsjs/herbarium')
const { Item } = require('../../../domain/entities/item')

class ItemRepository extends Repository {
...
}

module.exports =
    herbarium.repositories
        .add(ItemRepository, 'ItemRepository')
        .metadata({ entity: Item })
        .repository

And all glues like rest, gql and knex can use it:

Ex: gql mutation

const { herbarium } = require('@herbsjs/herbarium')

const usecases = herbarium.usecases
    .findBy({ operation: [herbarium.crud.create, herbarium.crud.update, herbarium.crud.delete] })
    .map(e => e.usecase)

const mutations = usecases.map(usecase => usecase2mutation(usecase(), defaultResolver(usecase)))

Rest, GQL, Herbs Shelf and REPL using Herbarium can be found on To Do List.

Herbs project must to born with Dockerfile

I was thinking the herbs-cli could have an option to create the project with an setup config, example

>herbs new
>Do you need a setup config file? [y/N] y
- Make file
- Dockerfile
- Dockerfile + docker-compose
- container engine1
- container engine2

herbs update - Entities with space in their names

Entities with space in their names throws a error when herbs update:

SyntaxError: Unexpected identifier
    at wrapSafe (internal/modules/cjs/loader.js:979:16)
    at Module._compile (internal/modules/cjs/loader.js:1027:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at Object.useCases (C:\Users\David\AppData\Roaming\npm\node_modules\@herbsjs\herbs-cli\src\generators\new\domain\useCases.js:28:20)     
    at Command.run (C:\Users\David\AppData\Roaming\npm\node_modules\@herbsjs\herbs-cli\src\commands\update.js:9:75)

Ex:

entity('To Do List', {

\src\domain\entities\index.js:

module.exports = {
    Item: require('./item.js'),
    To Do List: require('./todoList.js')  //bug
}

Get-all paginated route

I think would be nice to generate an "get-all" usecase/api-route that returns a paginated result for each entity.

Error in project generation

After running the "herbs new" command and skipping the project description steps, the following error appears:

Error: Cannot find module '@herbsjs/herbs'

Screenshot:
image

Repository file is not being generated when running the herbs update command

Describe the bug
The repository file is not being generated when running the herbs update command.

To Reproduce

  1. run herbs new to create a new herbs project
  2. select sql server or postgres as a database
  3. create any new entity using entity and field from @herbsjs/herbs
  4. run herbs update to add the usecases and the repositories
  5. the repository file is not generated automatically under infra/data/repository

Expected behavior
The repository file should be generated automatically under infra/data/repository.

Screenshots
image

image

image

Additional context

  1. I noticed it started to happen after version 1.3.0 of the CLI.
  2. I was using the 1.4.1 version of the CLI

discord test

Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

Describe the solution you'd like
A clear and concise description of what you want to happen.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

Find Item - Naming problems and multiples IDs allowed

apart from the naming, this issue rises a problem with being able to get multiples IDs from REST.

This issue highlits

  1. Fix file name
  2. Fix UC and step description
  3. Allow the same UC to handle single and multiple IDs request. /item/ (all), /item/?ids=1,2,3 (multiples) and /item/2 (single)

It is still needed:

  1. A fix to REST layer to handle /item/ (all), /item/?ids=1,2,3 (multiples) and /item/2 (single)

current:

getByIdItem.js:

const { usecase, step, Ok, Err } = require('@herbsjs/herbs')
const { Item } = require('../../entities')

const useCase = ({ itemRepository }) => () =>
  usecase('Find one Item', {
    // Input/Request metadata and validation 
    request: {
      id: Number,
    },

    // Output/Response metadata
    response: Item,

    //Authorization with Audit
    // authorize: user => (user.canFindOneItem ? Ok() : Err()),
    authorize: user => Ok(user),

    'Find the Item': step(async ctx => {
      // ctx.ret is the Use Case return
      const [result] = await itemRepository.findByID(parseInt(ctx.req.id)) 
      if (!result) return Err.notFound({ 
        message: `Item entity not found by id: ${ctx.req.id}`,
        payload: { entity: 'Item' }
      })
      
      return (ctx.ret = Item.fromJSON(result))
    })
  })

module.exports = useCase

should be:

findItemByIDs.js:

const { usecase, step, Ok, Err } = require('@herbsjs/herbs')
const { Item } = require('../../entities')

const useCase = ({ itemRepository }) => () =>
  usecase('Find Item by IDs', {
    // Input/Request metadata and validation 
    request: {
      ids: [Number],
    },

    // Output/Response metadata
    response: [Item],

    //Authorization with Audit
    // authorize: user => (user.canFindOneItem ? Ok() : Err()),
    authorize: user => Ok(user),

    'Find Item(s)': step(async ctx => {
      // ctx.ret is the Use Case return
      const result = await itemRepository.findByID(ctx.req.ids)
      if (!result) return Err.notFound({ 
        message: `Item entity not found by IDs: ${ctx.req.ids}`,
        payload: { entity: 'Item' }
      })
      
      return (ctx.ret = Item.fromJSON(result))
    })
  })

module.exports = useCase

Herbs generated project must to born with lint

I was thinking to have an option to add esLint into project

> Do you wanna use lint ? [y/N] y
- esLint
- tsLint
- jsHint

> What code style do you prefer to use?
- standard
- google
- airbnb

To start this feature, I was thinking to use only standard code style

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.