Giter VIP home page Giter VIP logo

ibm-cloud-cli-sdk's Introduction

IBM Cloud CLI SDK

IBM Cloud CLI plugin SDK provides predefined plugin interface, utilities and libraries to develop plugins for IBM Cloud cli.

Get started

You firstly need Go installed on your machine. Then clone this repository into $GOPATH/src/github.com/IBM-Cloud/ibm-cloud-cli-sdk.

This project uses go modules to manage dependencies. Go to the project directory and run the following command to restore the dependencies into vendor folder:

$ go mod vendor

and then run tests:

$ go test ./...

Build and run plugin

Download and install the IBM Cloud CLI. See instructions here.

Compile the plugin source code with go build command, for example

$ go build plugin_examples/hello.go

Install the plugin:

$ ibmcloud plugin install ./hello

List installed plugins:

$ ibmcloud plugin list

# list plugin commands with '-c' flag
$ ibmcloud plugin list -c

Uninstall the plugin:

$ ibmcloud plugin uninstall SayHello # SayHello is the plugin name

For more usage of plugin management, run ibmcloud help plugin

Develop plugins

Refer to plugin developer guide for how to develop a plugin.

See plugin examples here

Publish plugins

IBM Cloud has a public plugin repository by default installed in IBM Cloud CLI. Run ibmcloud plugin, you can see a repository named IBM Cloud (https://plugins.cloud.ibm.com). The repository support multiple version of plugin. You can list all plugins in the repository by using ibmcloud plugin repo-plugins -r 'IBM Cloud'.

To publish, update or remove your plugin in IBM Cloud plugin repository, you can simply create an issue on GitHub following below samples:

Example to publish a new plugin:

Title: [plugin-publish] Request to publish a new plugin 'SayHello'

Content:

- name: SayHello
  description: Say hello
  company: YYY
  authors:
  - name: xxx
    contact: [email protected]
  homepage: http://www.example.com/hello
  version: 0.0.1
  binaries:
  - platform: osx
    url: http://www.example.com/downloads/hello/hello-darwin-amd64-0.0.1
    checksum: xxxxx
  - platform: win32
    url: http://www.example.com/downloads/hello/hello-windows-386-0.0.1.exe
    checksum: xxxxx
  - platform: win64
    url: http://www.example.com/downloads/hello/hello-windows-amd64-0.0.1.exe
    checksum: xxxxx
  - platform: linux32
    url: http://www.example.com/downloads/hello/hello-linux-386-0.0.1.exe
    checksum: xxxxx
  - platform: linux64
    url: http://www.example.com/downloads/hello/hello-linux-amd64-0.0.1.exe
    checksum: xxxxx

The following descibes each field's usage.

Field Description
name Name of your plugin, must not conflict with other existing plugins in the repo.
description Describe your plugin in a line or two. This description will show up when your plugin is listed on the command line. Avoid saying "A plugin to ..." as it's redundant. Just briefly describe what the plugin provides.
company Optional
authors authors of the plugin: name: name of author; homepage: Optional link to the homepage of the author; contact: Optional ways to contact author, email, twitter, phone etc ...
homepage Link to the homepage
version Version number of your plugin, in [major].[minor].[build] form
binaries This section has fields detailing the various binary versions of your plugin. To reach as large an audience as possible, we encourage contributors to cross-compile their plugins on as many platforms as possible. Go provides everything you need to cross-compile for different platforms. platform: The os for this binary. Supports osx, linux32, linux64, win32, win64; url: Link to the binary file itself; checksum: SHA-1 of the binary file for verification.

Example to update a plugin:

Title: [plugin-update] Request to update plugin 'SayHello'

Content:

- name: SayHello
  description: Updated description of plugin Hello
  company: YYY
  authors:
  - name: xxx
    contact: [email protected]
  homepage: http://www.example.com/hello

Example to remove a plugin:

Title: [plugin-remove] Request to remove plugin 'SayHello'

Example to submit/update a version:

Title: [plugin-version-update] Request to submit a new version of plugin 'SayHello'

Content:

- name: SayHello
  version: 0.0.2
  binaries:
  - platform: osx
    url: http://www.example.com/downloads/hello/hello-darwin-amd64-0.0.2
    checksum: xxxxx
  - platform: win32
    url: http://www.example.com/downloads/hello/hello-windows-386-0.0.2.exe
    checksum: xxxxx
  - platform: win64
    url: http://www.example.com/downloads/hello/hello-windows-amd64-0.0.2.exe
    checksum: xxxxx
  - platform: linux32
    url: http://www.example.com/downloads/hello/hello-linux-386-0.0.2.exe
    checksum: xxxxx
  - platform: linux64
    url: http://www.example.com/downloads/hello/hello-linux-amd64-0.0.2.exe
    checksum: xxxxx

Example to remove plugin versions:

Title: [plugin-remove] Request to remove plugin 'SayHello'

Content:

- name: SayHello
  versions:
    - 0.0.1
      0.0.2

Issues

Report problems by adding an issue on GitHub.

License

This project is released under version 2.0 of the Apache License

ibm-cloud-cli-sdk's People

Contributors

aerex avatar allmightyspiff avatar archerzz avatar artberger avatar boyang9527 avatar brackendawson avatar dependabot[bot] avatar devexdev avatar edsonarios avatar ericmillin avatar giltohar avatar jorge-ibm avatar junliwang avatar lmosca avatar powellquiring avatar rmkeezer avatar rws-github avatar schmidtp0740 avatar steveclay avatar tonystarkjr3 avatar weieigao avatar youhangwang 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ibm-cloud-cli-sdk's Issues

Docs and IBM Style review of plug-in instructions

Background:
Hello! I'm a technical writer on the IBM Cloud platform. Recently, I've been working on reviewing the CLI messages for a new plug-in, and the Bluemix CLI Plugin Developer's Guide has been very helpful!

Issue:
As I've used it, I've noticed a few places where the doc is inconsistent within itself or IBM Style. I was planning to fork the repo and submit a PR to clean up the doc in a few places. I would comment the explanation of each change in the PR to make reviewing easier.

I wasn't sure who owned this or the contribution guidelines, so thought I'd submit this issue to start the conversation first. Looking forward to collaborating on this!

Art Berger / [email protected] / @arthur.berger in Slack

Lazy write configuration changes

Initiative

We should keep the changes of CLI (or maybe include plugin) configuration in memory, until the end of CLI process. That can avoid side effect when CLI is used simultaneously.

ChoicePrompt should provide a way to return index of chosen item

Description

It vey common that for a list of choices, the labels of each choice is different from the value. A common use case of ChoicePrompt is like below

index, err := terminal.ui.NewChoicePrompt("Please select one:", choices, &terminal.PromptOptions{....}).ResolveChoice()
if err != nil {
    return err
}
switch(index) {
    case XXX:
        ...
}

bx cf help -a incomplete

after updating from bx cli 0.5.4 (cf 6.18.0) to bx cli 0.5.5 (cf 6.26.0); bx cf help -a doesn't show the complete list of commands anymore. I tried cf 6.26.0 on a separate machine, and it seems to work just fine, so I guess it might be a bx issue
screen shot 2017-07-05 at 3 06 12 pm

Install to $HOME

Please add an option in the install_bluemix_cli installer script to install to $HOME without requiring root access.

$HOME/.local/bin etc, is a well-established convention that I'd be very happy if you supported.

Provide `PluginConfig.EraseAll()`

Requirement

Sometimes, we need bulk clearance of plugin configuration. A similar example is cf login which will reset the configuration (e.g. erase skip-ssl-valiation). It's cumbersome to write repetitive code to clear every config options.

Furthermore, we could consider support variable argument list here. So people can choose to bulk clear a series of options, not all options.

Installation plugins is failed when OS is alpine

Hi,
I want to install the following clis and plugins into alpine linux to control IBM Container service automatically:

  • bx cli
  • container-registry plugin
  • container-service plugin, and
  • kubectl cli

Installation bx cli , kubectl cli, and container-registry plugin was successful, but container-service plugin was failed.

Error I faced is as follows:

# This output is for container-registry
Looking up 'container-registry' from repository 'Bluemix'...
Plug-in 'container-registry 0.1.304' found in repository 'Bluemix'
Attempting to download the binary file...
 29.30 MiB / 29.30 MiB  100.00% 19s2ss
30725403 bytes downloaded
Installing binary...
OK
Plug-in 'container-registry 0.1.304' was successfully installed into /root/.bluemix/plugins/container-registry. Use 'bx plugin show container-registry' to show its details.

# This output is for container-service
Looking up 'container-service' from repository 'Bluemix'...
Plug-in 'container-service 0.1.481' found in repository 'Bluemix'
Attempting to download the binary file...
 20.21 MiB / 20.21 MiB  100.00% 14ssss
21188481 bytes downloaded
Installing binary...
FAILED
Unable to obtain plug-in's metadata. Error: fork/exec /tmp/BluemixFileDownload104351476/container-service-linux-amd64-0.1.481: no such file or directory

Is Alpine Linux not supported?

provide headless table

Problem

It's a quite command pattern that a series of key/value pairs are printed on console. Such table doesn't need to have headers. Existing Table API requires header definition. Now we use empty headers as a work-around, but that will leave a blank line which will cause issues in layout.

Accessing info from plugin context blows up

I need to access the contextual information for using values in the command help text for substitution values.
In support for that, need the ability to get the plugin context since its not available in the GetMetadata() flow...Currently, when I try to access anything from the plugin context, the install of my plugin blows up (builds fine) with the following error -

FAILED
Unable to obtain plug-in's metadata. Error: exit status 2```

Provide option for hidden commands and flags

We'd like to make a change to some commands and flags, but we'd need to support the older versions of each for backward compatibility. However, I'd like the older versions to not appear in the help.

CLI SDK vendor management compatible

Hello,

we would like to use the govendor as the SDK itself uses it. But if we define for example

{
	"comment": "",
	"ignore": "test",
	"package": [
		{
			"checksumSHA1": "DOig49oydC6YhPNlgJCH6tD+jJw=",
			"path": "github.com/IBM-Cloud/ibm-cloud-cli-sdk",
			"revision": "843691b1a0aec009f450569121229275a5488c07",
			"revisionTime": "2018-04-19T04:18:56Z"
		},
		{
			"checksumSHA1": "5rPfda8jFccr3A6heL+JAmi9K9g=",
			"path": "github.com/davecgh/go-spew/spew",
			"revision": "5215b55f46b2b919f50a1df0eaa5886afe4e3b3d",
			"revisionTime": "2015-11-05T21:09:06Z"
		}
	],
	"rootPath": "my-plugin"
}

there are no GO files:

.
+--- github.com
|   +--- davecgh
|   |   +--- go-spew
|   |   |   +--- LICENSE
|   |   |   +--- spew
|   |   |   |   +--- bypass.go
|   |   |   |   +--- bypasssafe.go
|   |   |   |   +--- common.go
|   |   |   |   +--- config.go
|   |   |   |   +--- doc.go
|   |   |   |   +--- dump.go
|   |   |   |   +--- format.go
|   |   |   |   +--- spew.go
|   +--- IBM-Cloud
|   |   +--- ibm-cloud-cli-sdk
|   |   |   +--- LICENSE
|   |   |   +--- README.md
+--- vendor.json

Hence the compilation is failing.

It would be great, if the IBM CLI SDK would be also govendor compatible, as it uses govendo itself.

Regards

Several bx commands not working

Hello. Have a T460 w/Win10 and installed bluemix CLI version 0.5.6+5b886b4-2017-08-14T08:16:22+00:00.
Today I needed to run 2 commands and both failed:

  1. bx cf ssh
    when trying to ssh a bluemix app, the terminal hangs and gets blocked: keystrokes are no longer recognized, including Ctrl-X and Ctrl-Z or any other combination. I have no other option than to close the unusable terminal.

  2. bx service rename

C:\Users\LUCASKuperman>bx service rename "dashDB for Analytics-s5" "glaim"
Invoking 'cf rename-service dashDB for Analytics-s5 glaim'...

Renaming service dashDB for Analytics-s5 to glaim in org GLAIM - Global Logistics Americas Information Management / space test as [email protected]...
FAILED
Server error, status code: 404, error code: 340001, message: The service instance could not be found: 23c82ba3-ac7d-4958-abe9-0b1cd4de582b

I had to ask bluemix admin to rename it for me, using the cf CLI instead

I downloaded installer from bluemix dedicated 'get started' official page (https://console.w3ibm.bluemix.net/apps/f3518642-eec8-44de-a581-959e053058fb?paneId=startcoding&ace_config=%7B%22region%22%3A%22%22%2C%22orgGuid%22%3A%22cb3f78e5-5fdf-4335-8cd9-2599fdbc153f%22%2C%22spaceGuid%22%3A%22592e6bbf-ea95-4846-ba65-6620e0adcd44%22%2C%22redirect%22%3A%22https%3A%2F%2Fconsole.w3ibm.bluemix.net%2Fdashboard%2Fapps%22%2C%22bluemixUIVersion%22%3A%22Atlas%22%7D)

Excessive spaces at the end of each line

Problem

It seems that for every line in the console output, there is two spaces at the end. This will cause problems for testing or automation scripts which uses pattern matching (like regular expression).
image

Help command produces invalid output with invalid flag

If you issue a help command on any plugin and add a flag, the help command fails and produces odd output.

Eg.

Entering bx pr help -n xxx or bx help -n xxx

Produces:

Incorrect Usage.

NAME:
   help - 

USAGE:

Expected behaviour would be for help to ignore any flag parsing, but if output was needed, something a bit more meaningful might be better.

Plugin's config data is not dynamically loaded

Based on my findings and discussion with Bo Yang, Bluemix is loading the config data for a given plugin at plugin install time and thereafter only uses those initially loaded values. So there is no opportunity to use/load config values that are dynamic/dependent on where the service itself is running since that data would be available at bx cs init time.

Use Case
Wanda is a Cloud company in China that IBM has signed a contract with to deliver the Cloud solution to for Wanda to sell as its own. There are a specific set of services that are included in the Wanda contract, Container Service being one of them. Hence, we need the ability to rebrand our container service. This means we need the ability to replace phrases like IBM 'IBM Bluemix`, etc with phrases that are provided by Wanda. The replacement focus is on the areas that are exposed to the end user - one of these areas being the CLI messages, including the --help messages.
Many other services will also have this need that are included in the Wanda contract.

Options I see are as follows -

  1. Provide the ability to update the plugin metadata after its been installed. This might be the most flexible.

  2. Allow plugins to specify a config file with the rebranding information for the plugin that is uploaded along with the plugin binary to the bluemix cli repo. This would allow us to provide a config file for IBM if its being uploaded to the IBM Bluemix repo or provide a Wanda config file if the plugin is being uploaded for the Wanda repo.

Run in non-interactive mode

Regardless of the possibility to turn off version checks (#86), I think a non-interactive mode would still be a nice feature.

Our use case is running the CLI in CI processes. After a build succeeds we deploy the application to a k8s cluster. To do that we need the cluster config.

With the version check turned off and providing every option it's somewhat a good compromise, but if there is ever a change that requires additional information or different options the process will hang instead of failing since it interactively asks a question and waits for the answer.

A no-interactive option would solve that problem.

Allow use of backticks (`)

Hi there--I've noticed that back ticks (`) do not render in the CLI at all. Bluemix Style requires backticks in some situations, and using single quotes isn't sufficient. When I replaced any single quotes (') with (`), the output didn't show the punctuation at all. We've tried a few other things (like replacing with `) and still nothing renders.

Would like to be able to use this functionality. Thanks!

Corporate plugin?

How would a company make a custom plug-in that is not published to the Bluemix repository? Would you recommend just downloading the plugin files and running install on a local copy? It doesn't appear that I can specify multiple repositories...

provide API to invoke CF CLI

Requirement

In latest version, we remove explicit dependency on CF CLI. However, some plugins requires CF CLI as well. Some of them invoke the CF CLI directly from environment, like below:

os.exec("cf push")

Such codes depend on the assumption that users will install a CF CLI, which is not valid any more.

Solution

We should consider whether to provide an API to invoke the CF CLI:

  1. Invoke embedded CF CLI
  2. Invoke CF CLI on $PATH if 1 fails.
    [optional] provide option to reverse the invocation sequence.

Unable to obtain plug-in's metadata. Error: invalid character 'H' looking for beginning of value

Hello,

we try just to get the hello would plugin up and running according to https://github.com/IBM-Cloud/ibm-cloud-cli-sdk#build-and-run-plugin , but we fail:

plugin\src\github.com\IBM-Cloud\ibm-cloud-cli-sdk>go build plugin_examples/hello.go

plugin\src\github.com\IBM-Cloud\ibm-cloud-cli-sdk>bluemix plugin install ..\..\..\..\bin\hello.exe
Installing binary...
FAILED
Unable to obtain plug-in's metadata. Error: invalid character 'H' looking for beginning of value
plugin\src\github.com\IBM-Cloud\ibm-cloud-cli-sdk>bx --version
bx version 0.6.6+d4d59ab-2018-03-20T07:38:15+00:00

Tests are failing

Hello,

we followed the manual https://github.com/IBM-Cloud/ibm-cloud-cli-sdk#get-started , but it looks like, either the code or the tests are not correct:

+ Failure [0.000 seconds]
ListCommand
plugin/src/github.com/IBM-Cloud/ibm-cloud-cli-sdk/plugin_examples/list_plugin/commands/list_test.go:15
  When API endpoint not set
plugin/src/github.com/IBM-Cloud/ibm-cloud-cli-sdk/plugin_examples/list_plugin/commands/list_test.go:43
    Should fail [It]
plugin/src/github.com/IBM-Cloud/ibm-cloud-cli-sdk/plugin_examples/list_plugin/commands/list_test.go:48

    Expected
        <string>: No CF API endpoint set. Use '{{.Command}}' to target a CloudFoundry environment.
    to contain substring
        <string>: No API endpoint set

Provider utils to set up plugin skeleton quickly

Overview

As a Bluemix CLI plugin developer, I can easily set up the basic project structure.

Although there are various ways to implement the CLI plugin, for people getting started with plugin development or people not familiar with Go programming, it would be better that certain util tools are provided to quickly create the project following a standard structure.

Details

Prerequisites

We assume that the following tools are installed:

How to create plugin project

  1. Create the project folder
  2. Copy setup-project.sh and new-command.sh under the project root folder
  3. Compose project.properties under the project root folder
  4. Run ./setup-project.sh

setup-project.sh

Syntax
setup-project.sh [-travis] [-h]
Flags:

  • -travis: create a Travis build file
  • -h: show help

project.properties

To generate the project, you need to provide a project.properties file with the following contents.

# name of the plugin, will be shown in base CLI when `bx plugin list`
plugin_name=test-plugin

# base name of the plugin binary files, i.e. ${base_name}-${os}-${arch}
plugin_file_basename=test-plugin

# major namespace used in this plugin, this will be used as the namespace of "hello" command
# You can always change it later
default_namespace=catalog

# new namespaces used by this plugin
#new_namespaces=("test1" "test2")

# Go version, if not specified, then deduce from the current context
#go_version=1.8.1

# go package path, please align with the project
project_path=github.ibm.com/Bluemix/test-plugin

How to add a new command

Run new-command.sh
Syntax
new-command.sh NAME [-d DESCRIPTION] [-u USAGE] [-n NAMESPACE] [-p PACKAGE] [-h]

Flags

  • -d DESCRIPTION: description of the command
  • -u USAGE: usage of the command, e.g. command syntax
  • -n NAMESPACE: namespace of the command
  • -p PACKAGE: package of the command under the project, i.e. exclude the domain of the project.
  • -h: show help

provide an option to specify that the cli is being used in a non-interactive session

I frequently use the bx cli in scripts that don't have a human to interact with them. Occasionally, the sdk prompts for input which requires messy code to handle this interaction programatically.

An example prompt:

! bx login --apikey @'/mydir/myapikey.json'

Results in:

API endpoint: https://api.ng.bluemix.net
Authenticating...
OK
...
A new version of Bluemix CLI is available. Do you want to update? (yes/no) [yes]>

It would be great if I could tell the cli that I don't want these prompts. Here is one example from debian telling the cli that it shouldn't prompt for user input:

DEBIAN_FRONTEND=noninteractive apt-get ...

I think in terms of updating the bx cli, the default response should be 'no' in noninteractive mode.

Table calculates calculates unicode string length incorrectly

Using the terminal.PrintableTable, cells containing unicode characters are incorrectly padded. The visual length of a unicode character is the same as a non-unicode character, so the padding shouldn't depends on which characters set it comes from.

Example

package main

import (
	"github.com/IBM-Cloud/ibm-cloud-cli-sdk/bluemix/terminal"
	"os"
)

func main() {
	table := terminal.NewTable(os.Stdout, []string{"name", "message", "comments"})
	table.Add("foo", "long test message", "this works fine")
	table.Add("bar", "unicode✣", "wrong indent")
	table.Print()
}

Output
image

${COMMAND_NAME} has not been updated with the correct value

I defined my command with usage message:

Usage:  "${COMMAND_NAME} cis instance-set INSTANCE_NAME\n\t INSTANCE_NAME is the name of CIS service instance.",

When I run the help, it works well:

bx cis help instance-set
NAME:
   instance-set - Set the CIS service instance to operate.

USAGE:
   bx cis instance-set INSTANCE_NAME
   INSTANCE_NAME is the name of CIS service instance.

But when I test with wrong inputs, call cli.ShowCommandHelp(ctx, ctx.Command.Name), I get:

bx cis instance-set
FAILED
Incorrect Usage.

NAME:
   cloud-internet-service instance-set - Set the CIS service instance to operate.

USAGE:
   ${COMMAND_NAME} cis instance-set INSTANCE_NAME
   INSTANCE_NAME is the name of CIS service instance.

For the NAME section, I don't want the plug-in name cloud-internet-service to show up.
For the USAGE section, I expect ${COMMAND_NAME} to be replaces with bx.

Provide automatic token refresh for plugins

Today, each plugin is responsible for validating the current token(s) it needs and refreshing those expired tokens. Since this is a common plugin practice, this capability could be centralized in the plugin SDK.

Some implementation options:

  • Provide a PluginMetadata setting through which the plugin communicates the need for a valid token. The SDK will then ensure the token(s) are valid when the plugin is invoked.
  • Provide an API that validates and optionally refreshes the token

go get fails

$ go get github.com/IBM-Bluemix/bluemix-cli-sdk/plugin
# github.com/IBM-Bluemix/bluemix-cli-sdk/bluemix/configuration/core_config
../../../github.com/IBM-Bluemix/bluemix-cli-sdk/bluemix/configuration/core_config/repository.go:50: cannot use NewCFConfigAdapterFromPersistor(cfPersistor, errHandler) (type *cfConfigAdapter) as type CFReadWriter in field value:
	*cfConfigAdapter does not implement CFReadWriter (missing LoggregatorEndpoint method)

I run go 1.7.5 on macOS.

Fine-grained update of configuration

Problem

Right now we always write the whole configuration to the configuration file, regardless of whether each individual property has been modified or not. That's not good for compatibility. If a plugin uses an old SDK to set a property, it could remove new properties introduced in new version of SDK. Thus causes unexpected error.

Solution

To improve the compatibility, we should only update the properties which have been modified.

Use IPC to manage configuration

Problem

Right now the codes to manage configuration in SDK is independent from base CLI. That could cause compatibility issue when the logic in both is different.

Solution

We should consider change the SDK implementation. Instead of manage the configuration by our own, we can wrap IPC to base CLI to do that.

[Note]: This will be a break change. We should think carefully and thoroughly.

Table break when the content to display contains "\t"

For code:

table := cmd.ui.Table([]string{"ID", "Name", "Type", "Content", "Proxiable", "Proxied", "TTL"})
for _, i := range records.Result {
         table.Add(i.ID, i.Name, i.Type, i.Content, strconv.FormatBool(i.Proxiable), strconv.FormatBool(i.Proxied), strconv.Itoa(i.Ttl))
}
table.Print()

I get:

277d8015adaa9547

content is: "123\t555\twww.test.com"

setting namespace to any other valid namespace is ignored

bx wsk property get --namespace
whisk namespace		_

bx wsk property set --namespace <namespace>
ok: whisk namespace set to <namespace>

bx wsk property get --namespace
whisk namespace		_
bx -v
bx version 0.6.1+724c406b-2017-10-09T03:12:39+00:00

P.S. I am not sure where this should be reported, I found this repo as a best fit for now.

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.