Giter Club home page Giter Club logo

knex-schema-inspector's Introduction

npm version npm downloads Coverage Status Dependencies Status Gitter chat

A SQL query builder that is flexible, portable, and fun to use!

A batteries-included, multi-dialect (PostgreSQL, MySQL, CockroachDB, MSSQL, SQLite3, Oracle (including Oracle Wallet Authentication)) query builder for Node.js, featuring:

Node.js versions 12+ are supported.

You can report bugs and discuss features on the GitHub issues page or send tweets to @kibertoad.

For support and questions, join our Gitter channel.

For knex-based Object Relational Mapper, see:

To see the SQL that Knex will generate for a given query, you can use Knex Query Lab

Examples

We have several examples on the website. Here is the first one to get you started:

const knex = require('knex')({
  client: 'sqlite3',
  connection: {
    filename: './data.db',
  },
});

try {
  // Create a table
  await knex.schema
    .createTable('users', (table) => {
      table.increments('id');
      table.string('user_name');
    })
    // ...and another
    .createTable('accounts', (table) => {
      table.increments('id');
      table.string('account_name');
      table.integer('user_id').unsigned().references('users.id');
    });

  // Then query the table...
  const insertedRows = await knex('users').insert({ user_name: 'Tim' });

  // ...and using the insert id, insert into the other table.
  await knex('accounts').insert({
    account_name: 'knex',
    user_id: insertedRows[0],
  });

  // Query both of the rows.
  const selectedRows = await knex('users')
    .join('accounts', 'users.id', 'accounts.user_id')
    .select('users.user_name as user', 'accounts.account_name as account');

  // map over the results
  const enrichedRows = selectedRows.map((row) => ({ ...row, active: true }));

  // Finally, add a catch statement
} catch (e) {
  console.error(e);
}

TypeScript example

import { Knex, knex } from 'knex';

interface User {
  id: number;
  age: number;
  name: string;
  active: boolean;
  departmentId: number;
}

const config: Knex.Config = {
  client: 'sqlite3',
  connection: {
    filename: './data.db',
  },
};

const knexInstance = knex(config);

try {
  const users = await knex<User>('users').select('id', 'age');
} catch (err) {
  // error handling
}

Usage as ESM module

If you are launching your Node application with --experimental-modules, knex.mjs should be picked up automatically and named ESM import should work out-of-the-box. Otherwise, if you want to use named imports, you'll have to import knex like this:

import { knex } from 'knex/knex.mjs';

You can also just do the default import:

import knex from 'knex';

If you are not using TypeScript and would like the IntelliSense of your IDE to work correctly, it is recommended to set the type explicitly:

/**
 * @type {Knex}
 */
const database = knex({
  client: 'mysql',
  connection: {
    host: '127.0.0.1',
    user: 'your_database_user',
    password: 'your_database_password',
    database: 'myapp_test',
  },
});
database.migrate.latest();

knex-schema-inspector's People

Contributors

aidenfoxx avatar chhpt avatar codeclown avatar d1ron avatar dependabot[bot] avatar eliashussary avatar faulpeltz avatar glenselle avatar joselcvarela avatar kibertoad avatar kukulaka avatar licitdev avatar martijnboland avatar minidigger avatar monkfromearth avatar oreilles avatar rijkvanzanten avatar u12206050 avatar wodka 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

knex-schema-inspector's Issues

MySQL Column Info Error

Hi,
when i try to do columnInfo() for a table its throw a errror like this:

const result = await inspector.columnInfo('posts')
console.log(result)

(node:19210) UnhandledPromiseRejectionWarning: Error: ER_BAD_FIELD_ERROR: Unknown column 'c.GENERATION_EXPRESSION' in 'field list'
    at Query.Sequence._packetToError (/Users/simonedellefave/Personal/react-express-crud-generator/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)
    at Query.ErrorPacket (/Users/simonedellefave/Personal/react-express-crud-generator/node_modules/mysql/lib/protocol/sequences/Query.js:79:18)
    at Protocol._parsePacket (/Users/simonedellefave/Personal/react-express-crud-generator/node_modules/mysql/lib/protocol/Protocol.js:291:23)
    at Parser._parsePacket (/Users/simonedellefave/Personal/react-express-crud-generator/node_modules/mysql/lib/protocol/Parser.js:433:10)
    at Parser.write (/Users/simonedellefave/Personal/react-express-crud-generator/node_modules/mysql/lib/protocol/Parser.js:43:10)
    at Protocol.write (/Users/simonedellefave/Personal/react-express-crud-generator/node_modules/mysql/lib/protocol/Protocol.js:38:16)
    at Socket.<anonymous> (/Users/simonedellefave/Personal/react-express-crud-generator/node_modules/mysql/lib/Connection.js:88:28)
    at Socket.<anonymous> (/Users/simonedellefave/Personal/react-express-crud-generator/node_modules/mysql/lib/Connection.js:526:10)
    at Socket.emit (events.js:400:28)
    at Socket.emit (domain.js:475:12)

I'm using a MySQL 5.5.62
What can i do?

Cannot use schema-inspector in AWS Aurora

So, my scenario is that i'm running a postgres AWS Aurora RDS database. When trying to use schema-inspector i get:
"errorMessage": "Error: Unsupported driver used: PostgresClientRDSDataAPI"
Obviously from knex-aurora-data-api-client

If i manually change the downloaded NPM package so that it always uses the postgres client it works fine again. But i haven't been able to run a full test-suite on that assumption yet.

Postgres issue with getting tables for a schema which has space in its name

code:

const inspector = schemaInspector(knex);
inspector.withSchema('test schema')
await inspector.tables();

error:

SELECT
        rel.relname AS name
      FROM
        pg_class rel
      WHERE
        rel.relnamespace IN ('test schema'::regnamespace)
        AND rel.relkind = 'r'
      ORDER BY rel.relname
     - invalid name syntax
    at Parser.parseErrorMessage (/Users/pavan/Documents/node-project/node_modules/.pnpm/[email protected]/node_modules/pg-protocol/dist/parser.js:287:98)
    at Parser.handlePacket (/Users/pavan/Documents/node-project/node_modules/.pnpm/[email protected]/node_modules/pg-protocol/dist/parser.js:126:29)
    at Parser.parse (/Users/pavan/Documents/node-project/node_modules/.pnpm/[email protected]/node_modules/pg-protocol/dist/parser.js:39:38)
    at Socket.<anonymous> (/Users/pavan/Documents/node-project/node_modules/.pnpm/[email protected]/node_modules/pg-protocol/dist/index.js:11:42)
    at Socket.emit (node:events:527:28)
    at addChunk (node:internal/streams/readable:315:12)
    at readableAddChunk (node:internal/streams/readable:289:9)
    at Socket.Readable.push (node:internal/streams/readable:228:10)
    at TCP.onStreamRead (node:internal/stream_base_commons:190:23) {
  length: 96,
  severity: 'ERROR',
  code: '42602',
  detail: undefined,
  hint: undefined,
  position: '116',
  internalPosition: undefined,
  internalQuery: undefined,
  where: undefined,
  schema: undefined,
  table: undefined,
  column: undefined,
  dataType: undefined,
  constraint: undefined,
  file: 'regproc.c',
  line: '1890',
  routine: 'stringToQualifiedNameList'
}

MySQL dialect reading column name from undefined

15:15:55 🚨 Cannot read property 'Column_name' of undefined 
TypeError: Cannot read property 'Column_name' of undefined
    at MySQL.<anonymous> (/var/www/directus_v9/node_modules/knex-schema-inspector/dist/dialects/mysql.js:275:60)
    at step (/var/www/directus_v9/node_modules/knex-schema-inspector/dist/dialects/mysql.js:33:23)
    at Object.next (/var/www/directus_v9/node_modules/knex-schema-inspector/dist/dialects/mysql.js:14:53)
    at fulfilled (/var/www/directus_v9/node_modules/knex-schema-inspector/dist/dialects/mysql.js:5:58)
    at process._tickCallback (internal/process/next_tick.js:68:7)

Get enum value

For native enums (pg), would be great to get the enum values

Multi-line JSON not properly unescaped

Hey, we noticed what we believe is a breaking change introduced in 1.3.0+ versions of knex-schema-inspector originating from b5cdeae which refactored parseDefaultValue. Previously, it correctly handled multi-line JSON but after the refactor, newlines are not properly matched and multi-line json causes Directus to crash with the following error:

17:05:04 🚨 Unexpected token ' in JSON at position 0 
SyntaxError: Unexpected token ' in JSON at position 0
    at JSON.parse (<anonymous>)
    at Object.parseDefaultValue (/Users/glen/Git/divvit/api/node_modules/knex-schema-inspector/dist/dialects/postgres.js:77:21)
    at _loop_1 (/Users/glen/Git/divvit/api/node_modules/@directus/schema/dist/dialects/postgres.js:115:50)
    at Postgres.<anonymous> (/Users/glen/Git/divvit/api/node_modules/@directus/schema/dist/dialects/postgres.js:119:29)
    at step (/Users/glen/Git/divvit/api/node_modules/@directus/schema/dist/dialects/postgres.js:78:23)
    at Object.next (/Users/glen/Git/divvit/api/node_modules/@directus/schema/dist/dialects/postgres.js:59:53)
    at fulfilled (/Users/glen/Git/divvit/api/node_modules/@directus/schema/dist/dialects/postgres.js:50:58)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)

The cause for this is related to a refactor of parseDefaultValue which changed checks from using startsWith and endsWith to a regex which doesn't properly handle multi-lines.

BEFORE (worked properly):

if (value.startsWith("'") && value.endsWith("'")) {
  value = value.slice(1, -1);
}

AFTER b5cdeae:

value = value.replace(/^\'(.*)\'$/, '$1');

To fix, the regex can be modified to use \s\S instead of .

value = value.replace(/^\'([\s\S]*)\'$/, '$1');

We first noticed this issue about a month ago but used older pre-built Docker images where the knex-schema-inspector dependency was still 1.2.2. Directus depends on knex-schema-inspector but it is not hard pinned so minors are pulled in. We are fairly certain versions 1.3.0+ have this breaking change.

We found the cause of this issue by printing values from parseDefaultValue and the last to print before erroring out was a json value that still had single quotes ' around it (see below). Running this through JSON.parse will of course fail. When we dug into the code and found the regex we noticed this formatted json string (with newlines) never matched properly. More digging and we stumbled on the old code which used startsWith and endsWith and it all started to make sense.

'[
    {
        "amount": "60",
        "label": "Min",
        "value": 6000
    },
    {
        "amount": "75",
        "label": "Average",
        "value": 7500,
        "default": true
    }
]'
17:05:04 🚨 Unexpected token ' in JSON at position 0 
SyntaxError: Unexpected token ' in JSON at position 0
    at JSON.parse (<anonymous>)
    at Object.parseDefaultValue (/Users/glen/Git/divvit/api/node_modules/knex-schema-inspector/dist/dialects/postgres.js:77:21)
    at _loop_1 (/Users/glen/Git/divvit/api/node_modules/@directus/schema/dist/dialects/postgres.js:115:50)
    at Postgres.<anonymous> (/Users/glen/Git/divvit/api/node_modules/@directus/schema/dist/dialects/postgres.js:119:29)
    at step (/Users/glen/Git/divvit/api/node_modules/@directus/schema/dist/dialects/postgres.js:78:23)
    at Object.next (/Users/glen/Git/divvit/api/node_modules/@directus/schema/dist/dialects/postgres.js:59:53)
    at fulfilled (/Users/glen/Git/divvit/api/node_modules/@directus/schema/dist/dialects/postgres.js:50:58)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)

Cannot read property 'column_name' of undefined

Using a postgres db, the query should be an insert, but am just a user, I am not sure.

Stacktrace:

/directus $ npx -n="--trace-warnings" directus roles create --name Administrator --admin 
(node:1094) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'column_name' of undefined
    at Postgres.<anonymous> (/directus/node_modules/knex-schema-inspector/dist/dialects/postgres.js:325:51)
    at step (/directus/node_modules/knex-schema-inspector/dist/dialects/postgres.js:33:23)
    at Object.next (/directus/node_modules/knex-schema-inspector/dist/dialects/postgres.js:14:53)
    at fulfilled (/directus/node_modules/knex-schema-inspector/dist/dialects/postgres.js:5:58)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
    at emitUnhandledRejectionWarning (internal/process/promises.js:168:15)
    at processPromiseRejections (internal/process/promises.js:247:11)
    at processTicksAndRejections (internal/process/task_queues.js:94:32)
(node:1094) TypeError: Cannot read property 'column_name' of undefined
    at Postgres.<anonymous> (/directus/node_modules/knex-schema-inspector/dist/dialects/postgres.js:325:51)
    at step (/directus/node_modules/knex-schema-inspector/dist/dialects/postgres.js:33:23)
    at Object.next (/directus/node_modules/knex-schema-inspector/dist/dialects/postgres.js:14:53)
    at fulfilled (/directus/node_modules/knex-schema-inspector/dist/dialects/postgres.js:5:58)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
(node:1094) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
    at emitDeprecationWarning (internal/process/promises.js:180:11)
    at processPromiseRejections (internal/process/promises.js:249:13)
    at processTicksAndRejections (internal/process/task_queues.js:94:32)
^C

for reference: https://github.com/directus/next/issues/807

Crash when reading PG table where user has no SELECT permissions

It appears that if there is a table in the schema for which the connected user does not have at least SELECT permissions, the following error occurs:

TypeError: Cannot set properties of undefined (setting 'primary')
    at Postgres.<anonymous> (node_modules/@directus/schema/dist/dialects/postgres.js:128:58)
    at step (node_modules/@directus/schema/dist/dialects/postgres.js:67:23)
    at Object.next (cms/node_modules/@directus/schema/dist/dialects/postgres.js:48:53)
    at fulfilled (node_modules/@directus/schema/dist/dialects/postgres.js:39:58)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)

I'm not sure what the correct response in this situation is. For my use case it would be enough to just ignore the table, but I am not sure if that is the correct response for other use cases where you might want the information that the table exists but you do not have access to it.
Either way at least a clear error message as to what is going on would go a long way, since now it is very unclear why the system crashes.

Uncaught error when retrieving columns info with jsonb[] with default values

Hi knex-schema-inspector team,

Due to the nature of this regex, it seems that the default value of columns defined as json[] or jsonb[] will be parsed as Json objects and throw an uncaught error.

Reproduction

  • define a table with the following column;
   my_column jsonb[] default ARRAY[]::jsonb[],
  • retrieve information for the columns in our table;

In this case, the parsing will look like JSON.parse("ARRAY[]"), which is not a valid format.

Cannot read property 'COLUMN_NAME' of undefined

When calling columnInfo with a table and column name, if the search query returns undefined the function throws Cannot read property 'COLUMN_NAME' of undefined when mapping the response to Column.

This can be easily fixed, but it feels like we should consider what return type we want in this scenario. Personally I think columnInfo should return Column | undefined in this instance, but this would be a breaking change.

package.json main and types entry point to wrong directory

I get the error:

Error: Cannot find module 'xxx\node_modules\knex-schema-inspector\dist\lib\index.js'. Please verify that the package.json has a valid "main" entry

It seems the main and types entries in package.json are wrong:

  "main": "dist/lib/index.js",
  "types": "dist/lib/index.d.ts",

If I change them to:

 "main": "dist/index.js",
  "types": "dist/index.d.ts",

everything works as expected

Improvements suggestions

  • Add schema and comment support in tableInfo and columnInfo for all vendors
  • Add primary information in tableInfo
  • Add is_view information in tableInfo and stop filtering them out
  • Delegate name aliasing and type conversion to the database query to bypass conversion from RawColumn to Column
  • Refactor knex queries to raw SQL to improve readability when appropriate
  • Unify test between vendors
  • Move table creation SQL code to test specs.

Opinion? πŸ₯¬

MSSQL columnInfo() not returning correct value for primary key

is_primary_key always returns false.

.leftJoin('INFORMATION_SCHEMA.KEY_COLUMN_USAGE as fk', function () { this.on('c.TABLE_NAME', '=', 'fk.TABLE_NAME') .andOn('fk.COLUMN_NAME', '=', 'c.COLUMN_NAME') .andOn('fk.CONSTRAINT_CATALOG', '=', 'c.TABLE_CATALOG'); })
in columnInfo() always returns false. This query should be amended to something like

LEFT JOIN ( SELECT COLUMN_NAME, TABLE_NAME, CONSTRAINT_NAME FROM {db_name}.INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE CONSTRAINT_NAME LIKE 'PK%' ) as PK

MS SQL columnInfo for a View returns empty result

When calling the columnInfo to retrieve the columns of a view, it returns an empty result for MS SQL.

Other drivers work fine.

Should this be fixed? Or are there plans to add more View related functions, now that Knex has more view support as well?

Working with PostgreSQL schemas

Hello,

I would like to ask for help regarding the usage of PostgreSQL schemas. I have a sample database whose structure contains two additional schemas besides the default public schema. When I use the following code:

import Knex from "knex";
import schemaInspector from "knex-schema-inspector"

const database = Knex({
    client: "postgres",
    connection: {
        host: "localhost",
        port: 5432,
        user: "postgres",
        password: "1234",
        database: "example_eCommerce",
    },
});

const inspector = schemaInspector(database);

async function main(): Promise<void> {
    console.log(await inspector.tables())

    await database.destroy();
}

main();

Only tables of the public schema are printed. I know there is a withSchema method that can be used to set schema for inspector instance, but this approach is not very useful when schemas are unknown. Is there any way to get information about schemas of PostgreSQL database?

primary() does not work properly for postgres

With the postgres dialect, the primary() function generates the following sql to retrieve the primary key of a table:

SELECT
  att.attname AS column
FROM
  pg_constraint con
LEFT JOIN pg_class rel ON con.conrelid = rel.oid
LEFT JOIN pg_attribute att ON att.attrelid = con.conrelid AND att.attnum = con.conkey[1]
WHERE con.connamespace IN ('public'::regnamespace)
  AND array_length(con.conkey, 1) <= 1
  AND rel.relname = 'directus_files'

After executing the query, the first result is returned. The problem however is that this query returns all constraints instead of just the primary key. When a table has more constraints, the wrong value is sometimes returned.

Adding

AND con.contype = 'p'

to the query should fix the problem.

MySQL columnInfo(): Duplicated rows when more than 1 index exists for a field

Hi,
I'm using MySQL 5.7, and it looks like a column with multiple indexes is displayed multiple times when using columnInfo('table_name').
I've seen this caused problems in directus/directus#6204.

I've been looking at the source code of columnInfo() and tested it on a MySQL instance, and found that the issue comes from the table INFORMATION_SCHEMA.KEY_COLUMN_USAGE and the LEFT JOIN done on it, duplicating the rows from INFORMATION_SCHEMA.COLUMNS (for MySQL).

Only the columnInfo('table_name', 'column_name') function seems to work properly (not showing any duplicate entries), since it only returns the first column found.
Using a GROUP BY c.TABLE_NAME, c.COLUMN_NAME on the query looks like it prevents the duplicate indexes to show up, but there might be loss of information in that case?

schemaInspector is not a function

Version 1.5.7 show me : schemaInspector is not a function.

import Knex from 'knex';
import schemaInspector from 'knex-schema-inspector';

const database = Knex({
    client: 'postgres',
    connection: {
        host: 'localhost',
        user: 'postgres',
        password: 'postgres',
        database: 'test',
        charset: 'utf8',
    },
});

database
    .select('*')
    .from('directus_users')
    .where('id', '093d8085-cfcf-4f88-b11c-ef3445838101')
    .then(function (meals) {
        console.log(meals);
        // [ { id: 1, description: 'Burrito', ... } ]
    });

const inspector = schemaInspector(database);
console.log(inspector);

The select works fine. But the schemaInpsector didnΒ΄t work. WhatΒ΄s wrong?

"dependencies": {
    "@directus/schema": "^9.0.0-rc.75",
    "axios": "^0.21.1",
    "command-line-args": "^5.1.1",
    "knex": "0.95",
    "knex-schema-inspector": "1.5",
    "listr": "^0.14.3",
    "pg": "^8.6.0"
  },

MSSQL primary key query

MSSQL driver primary failing with Invalid column name as query statement poorly formed. SQL tablename needs to be delimited by single quotes.

Initial feature list

An in works list of features that would be useful for a schema inspector like this:

Tables

  • List Tables
  • Retrieve table (by name)
  • Has Table

Columns

  • List Columns (in table)
  • Retrieve column (by name)
  • Has Column

(?) Relations

  • List foreign keys

How to generate migration with this tool?

Hello,

This is possible to generate a migration file with this tool?

I have a database with sample data, I need to generate the migration tool com structure and sample data for send to git.

This tool can do this? If not, do you can suggest another one?

Thanks πŸ‘

Add MariaDB detection and compatibility

Currently MariaDB knex connections are processed done with the MySQL driver and use the MySQL dialect.
This is all fine for the most cases, however more and more differences emerge between MySQL and MariaDB.

For example, database column DEFAULT values are quoted starting from MariaDB 10.2.7, see https://mariadb.com/kb/en/information-schema-columns-table/ while in MySQL they are not.

Furthermore in MariaDB the JSON data type doesn't existing, it is merely an alias that results in LONGTEXT data type for the JSON column. The columnInfo function doesn't detect it. See https://mariadb.com/kb/en/json-data-type/ - The LONGTEXT is created with a special CHECK constrain that validates the JSON, so an additional SQL needs to be added specially for MariaDB to fetch this constrain and detect that it is a JSON field.

Other possible differences are listed here:
https://mariadb.com/kb/en/incompatibilities-and-feature-differences-between-mariadb-104-and-mysql-80/

So maybe the knex-schema-inspector should do some db version detection on init and when MariaDB is detected, additional SQL commands can be added to retrieve extra information. Like executing first SELECT VERSION() and then setting some flags if it is MariaDB and what version, so that later on in columnInfo for the MySQL dialect, a conditional schema retrieval sql can be generated.

Anyone up to the task?

Add support for listing unique constraints

Hello there! I find working with unique constraints across multiple columns in knex pretty cumbersome due to inability to delete all of them them/check if they exist before redefining them. This leads to the need to remember what constraints have been defined before. This is why I propose adding uniqueConstraints method that will list all unique constraints. I'm more than willing to implement this feature for some dialects(oracledb is not working on my machine).

Figure out testing for OracleDB

I tried getting Oracle to run, but for the life of me can't get it to work.. I tried using Knex's setup, but that doesn't seem to run (I'm getting some vague ORA-01012: not logged on error) on my end and using the official (outdated) oracle/database-enterprise:12.2.0.1 image is out of the question, as per oracle/docker-images#1156

Setup "dialects" structure

@kibertoad would you be able to run me through the structure and ideas of the main Knex repo (primarily "dialects")? I'd like to keep the general structure / lingo the same here as for the main project, but I'm not that familiar with the internals of Knex itself yet.. (Also down to hop on a zoom/meet/whatever call if that's easier πŸ™‚ )

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.