Skip to content
forked from aws/jsii

jsii allows code in any language to naturally interact with JavaScript classes. It is the technology that enables the AWS Cloud Development Kit to deliver polyglot libraries from a single codebase!

License

Notifications You must be signed in to change notification settings

Kelvin-LDK/jsii

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

jsii

Join the chat at https://cdk.Dev All Contributors Build Status npm docker

Overview

jsii allows code in any language to naturally interact with JavaScript classes. It is the technology that enables the AWS Cloud Development Kit to deliver polyglot libraries from a single codebase!

A class library written in TypeScript can be used in projects authored in TypeScript or Javascript (as usual), but also in Python, Java, C# (and other languages from the .NET family), ...

NOTE: Due to performance of the hosted Javascript engine and marshaling costs, jsii modules are best suited for development and build tools, as opposed to performance-sensitive or resource-constrained applications.

See Runtime Architecture for more information.

An example is worth a thousand words

Consider the following TypeScript class:

export class HelloJsii {
  public sayHello(name: string) {
    return `Hello, ${name}!`;
  }
}

By compiling our source module using jsii, we can now package it as modules in one of the supported target languages. Each target module has the exact same API as the source. This allows users of that target language to use HelloJsii like any other class:

  • In Python:
    hello = HelloJsii()
    hello.say_hello("World"); # => Hello, World!
  • In Java
    final HelloJsii hello = new HelloJsii();
    hello.sayHello("World"); // => Hello, World!
  • In C#
    var hello = new HelloJsii();
    hello.SayHello("World"); // => Hello, World!
  • ... and more to come!

Toolchain

jsii consists of multiple single-purposed programs which can be used to compose various workflows.

We are considering creating an "umbrella entrypoint" to make it easier to consume.

Name Stability Description
jsii Stable Compiles TypeScript to jsii module
jsii-pacmak Stable Creates ready-to-publish language-specific packages from jsii modules
jsii-reflect Stable Strong-typed reflection library for jsii type systems
jsii-diff Stable API backwards compatibility checker
jsii-rosetta Experimental Transpile code snippets (in docs) from TypeScript to jsii languages
jsii-config Experimental Interactive tool for generating jsii configuration
jsii-release Community Publishes jsii modules to all supported package managers
jsii-srcmak Community Generates relocatable source code in jsii languages from typescript
jsii-docgen Community Generates markdown API documentation for jsii modules

"Community": a community-maintained project, not officially supported by the jsii team.

Getting Started

Let's create our first jsii TypeScript module (actual outputs may slightly differ):

$ mkdir hello-jsii
$ cd hello-jsii
$ npm init -y
Wrote to /tmp/hello-jsii/package.json:

{
  "name": "hello-jsii",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
$ npm i --save-dev jsii jsii-pacmak
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN [email protected] No description
npm WARN [email protected] No repository field.

+ [email protected]
+ [email protected]
added 65 packages from 54 contributors and audited 191 packages in 7.922s
found 0 vulnerabilities

Edit the package.json file:

/// package.json
{
  // ...
  "main": "lib/index.js",
  "types": "lib/index.d.ts",
  "scripts": {
    "build": "jsii",
    "build:watch": "jsii -w",
    "package": "jsii-pacmak"
  },
  "jsii": {
    "outdir": "dist",
    "targets": {
      "python": {
        "distName": "acme.hello-jsii",
        "module": "acme.hello_jsii"
      },
      "java": {
        "package": "com.acme.hello",
        "maven": {
          "groupId": "com.acme.hello",
          "artifactId": "hello-jsii"
        }
      },
      "dotnet": {
        "namespace": "Acme.HelloNamespace",
        "packageId": "Acme.HelloPackage"
      }
    }
  },
  "author": {
    "name": "John Doe"
  },
  "repository": {
    "url": "https://github.com/acme/hello-jsii.git"
  }
  // ...
}

Read more about what those configuration entries do in the configuration documentation.

Okay, we are ready to write some code. Create a lib/index.ts file:

/// lib/index.ts
export class HelloJsii {
  public sayHello(name: string) {
    return `Hello, ${name}!`;
  }
}

Build your module:

$ npm run build

If build succeeds, you will see the resulting lib/index.js and lib/index.d.ts files were produced, as well as the .jsii file (contents may vary):

/// .jsii
{
  "author": {
    "name": "John Doe",
    "roles": [
      "author"
    ]
  },
  "description": "hello-jsii",
  "homepage": "https://github.com/acme/hello-jsii.git",
  "jsiiVersion": "0.14.3 (build 1b1062d)",
  "license": "ISC",
  "name": "hello-jsii",
  "repository": {
    "type": "git",
    "url": "https://github.com/acme/hello-jsii.git"
  },
  "schema": "jsii/0.10.0",
  "targets": {
    "dotnet": {
      "namespace": "Acme.HelloNamespace",
      "packageId": "Acme.HelloPackage"
    },
    "java": {
      "maven": {
        "artifactId": "hello-jsii",
        "groupId": "com.acme.hello"
      },
      "package": "com.acme.hello"
    },
    "js": {
      "npm": "hello-jsii"
    },
    "python": {
      "distName": "acme.hello-jsii",
      "module": "acme.hello_jsii"
    }
  },
  "types": {
    "hello-jsii.HelloJsii": {
      "assembly": "hello-jsii",
      "fqn": "hello-jsii.HelloJsii",
      "initializer": {},
      "kind": "class",
      "locationInModule": {
        "filename": "lib/index.ts",
        "line": 1
      },
      "methods": [
        {
          "locationInModule": {
            "filename": "lib/index.ts",
            "line": 2
          },
          "name": "sayHello",
          "parameters": [
            {
              "name": "name",
              "type": {
                "primitive": "string"
              }
            }
          ],
          "returns": {
            "type": {
              "primitive": "string"
            }
          }
        }
      ],
      "name": "HelloJsii"
    }
  },
  "version": "1.0.0",
  "fingerprint": "XYWYOiOupH4MmIjFj84wTSRfWqSw8hW37vHkVMO7iuY="
}

This file includes all the information needed in order to package your module into every jsii-supported language. It contains the module metadata from package.json and a full declaration of your module's public API.

Okay, now the magic happens:

$ npm run package

> [email protected] package /Users/rmuller/Development/Demos/hello-jsii
> jsii-pacmak -v

[jsii-pacmak] [INFO] Building hello-jsii (python,java,dotnet,js) into dist
[jsii-pacmak] [INFO] Packaged. java (4.3s) | dotnet (2.0s) | python (0.9s) | npm pack (0.5s) | js (0.0s)

Now, if you check out the contents of dist, you'll find:

dist
β”œβ”€β”€ dotnet
β”‚   β”œβ”€β”€ Acme.HelloPackage.1.0.0.nupkg
β”‚   └── Acme.HelloPackage.1.0.0.symbols.nupkg
β”œβ”€β”€ java
β”‚   └── com
β”‚       └── acme
β”‚           └── hello
β”‚               └── hello-jsii
β”‚                   β”œβ”€β”€ 1.0.0
β”‚                   β”‚   β”œβ”€β”€ hello-jsii-1.0.0-javadoc.jar
β”‚                   β”‚   β”œβ”€β”€ hello-jsii-1.0.0-javadoc.jar.md5
β”‚                   β”‚   β”œβ”€β”€ hello-jsii-1.0.0-javadoc.jar.sha1
β”‚                   β”‚   β”œβ”€β”€ hello-jsii-1.0.0-sources.jar
β”‚                   β”‚   β”œβ”€β”€ hello-jsii-1.0.0-sources.jar.md5
β”‚                   β”‚   β”œβ”€β”€ hello-jsii-1.0.0-sources.jar.sha1
β”‚                   β”‚   β”œβ”€β”€ hello-jsii-1.0.0.jar
β”‚                   β”‚   β”œβ”€β”€ hello-jsii-1.0.0.jar.md5
β”‚                   β”‚   β”œβ”€β”€ hello-jsii-1.0.0.jar.sha1
β”‚                   β”‚   β”œβ”€β”€ hello-jsii-1.0.0.pom
β”‚                   β”‚   β”œβ”€β”€ hello-jsii-1.0.0.pom.md5
β”‚                   β”‚   └── hello-jsii-1.0.0.pom.sha1
β”‚                   β”œβ”€β”€ maven-metadata.xml
β”‚                   β”œβ”€β”€ maven-metadata.xml.md5
β”‚                   └── maven-metadata.xml.sha1
β”œβ”€β”€ js
β”‚   └── [email protected]
└── python
    β”œβ”€β”€ acme.hello-jsii-1.0.0.tar.gz
    └── acme.hello_jsii-1.0.0-py3-none-any.whl

These files are ready-to-publish artifacts for each target language. You can see the npm tarball under js, the python package under python, the Maven repo under java, etc...

That's it. You are ready to rock!

Features

Source Languages

Target Languages

  • Javascript - generates an NPM package implicitly (no configuration required).
  • Python - generates a ready-to-publish PyPI package.
  • Java - generates a ready-to-publish Maven package.
  • .NET - generates a ready-to-publish NuGet package.

See the configuration documentation for more information on configuring the various targets.

πŸ“– Blog Posts

Here's a collection of blog posts (in chronological order) related to jsii:

ℹ️ If you wrote blog posts about jsii and would like to have them referenced here, do not hesitate to file a pull request to add the links here!

βš™οΈ Contributing

See CONTRIBUTING.

Contributors ✨

Thanks goes to these wonderful people (emoji key):


AWS CDK Automation

🚧 πŸ‘€

Aaron Costley

πŸ› πŸ’» πŸ₯… πŸ€” πŸ‘€

Abdallah Hodieb

πŸ›

Adam Ruka

πŸ› πŸ’» 🚧 πŸ‘€

Alex Pulver

πŸ›

Andy Slezak

πŸ’»

Anshul Guleria

πŸ€”

Ari Palo

πŸ€”

BartΕ‚omiej Jurek

πŸ›

Ben Walters

πŸ€”

Benjamin Maizels

πŸ’» πŸ‘€

Bill Cauchois

πŸ€”

Brecht Verhoeve

πŸ€”

Breland Miley

πŸ’»

CaerusKaru

πŸ’» 🚧

Campion Fellin

πŸ’» β˜•οΈ

Carter Van Deuren

πŸ›

Christopher Currie

πŸ’» πŸ€”

CyrusNajmabadi

πŸ› πŸ€”

Daniel Dinu

πŸ› πŸ’»

Daniel Schroeder

πŸ› πŸ’» πŸ“– πŸ€” 🚧

Dave Slotnick

πŸ›

Donald Stufft

πŸ› πŸ’» πŸ€” 🐍 πŸ‘€

Dongie Agnir

πŸ’» β˜•οΈ πŸ‘€

Eduardo Sena S. Rosa

πŸ›

Elad Ben-Israel

πŸ› πŸ’» πŸ€” β˜•οΈ 🚧 πŸ‘€ πŸ“’

Eli Polonsky

πŸ› πŸ’» πŸ€” 🚧 πŸ‘€

Eric Z. Beard

πŸ“†

Erik Karlsson

πŸ›

Eugene Kozlov

πŸ’»

Fabio Gentile

πŸ›

Florian Eitel

πŸ€”

Graham Lea

πŸ€” πŸ‘€

Hamza Assyad

πŸ› πŸ’» πŸ₯… πŸ€” πŸ‘€

Hari Pachuveetil

πŸ“

Hsing-Hui Hsu

πŸ’» πŸ“– πŸšΆβ€β™€οΈ πŸ€” πŸ‘€

James Mead

πŸ’»

James Siri

πŸ’» 🚧

Jason Del Ponte

πŸšΆβ€β™€οΈ πŸ€” πŸ‘€

Jason Fulghum

πŸ€” πŸ“† πŸ‘€

Jerry Kindall

πŸ“– πŸ€”

Jimmy Gaussen

πŸ€”

Jon Steinich

πŸ› πŸ€”

Joseph Lawson

πŸ‘€

Joseph Martin

πŸ›

Junix

πŸ›

Justin Taylor

πŸ›

Kyle Thomson

β˜•οΈ πŸ‘€

Leandro Padua

πŸ›

Maja S Bratseth

πŸ›

Marcos Diez

πŸ›

Matthew Bonig

πŸ› πŸ“

Matthew Pirocchi

πŸ’» πŸ₯… πŸ€” πŸ‘€

Mike Lane

πŸ›

Mitch Garnaat

πŸ› πŸ’» πŸ€” 🐍 πŸ‘€

Mitchell Valine

πŸ› πŸ’» πŸšΆβ€β™€οΈ πŸ€” 🚧 πŸ‘€

Neta Nir

πŸ’» πŸ€” 🚧 πŸ‘€

Nick Lynch

πŸ› πŸ’» 🚧 πŸ‘€

Niranjan Jayakar

πŸ› πŸ’» πŸ€” 🚧 πŸ‘€

Noah Litov

πŸ’» 🚧 πŸ‘€

PIDZ - Bart

πŸ€”

Petra Barus

πŸ’»

Philip Cali

πŸ€”

Quentin Loos

πŸ€”

Raphael

πŸ›

Richard H Boyd

πŸ›

Rico Huijbers

πŸ› πŸ’» πŸ€” 🚧 🐍 πŸ‘€

Romain Marcadier

πŸ› πŸ’» 🎨 πŸ₯… πŸšΆβ€β™€οΈ πŸ€” β˜•οΈ 🚧 🐍 πŸ‘€

SADIK KUZU

πŸ‘€

SK

πŸ€”

Sam Fink

πŸ’» πŸ‘€

Sam Goodwin

πŸ‘€

Sebastian Korfmann

πŸ› πŸ’» πŸ€”

Shane Witbeck

πŸ€”

Shiv Lakshminarayan

πŸ’» 🚧 πŸ‘€

Somaya

πŸ’» πŸ€” 🚧 πŸ‘€

The Gitter Badger

πŸ’» 🚧

Thomas Poignant

πŸ›

Thomas Steinbach

πŸ›

Thorsten Hoeger

πŸ’»

Tim Wagner

πŸ› πŸ€”

Tobias Lidskog

πŸ’»

Ty Coghlan

πŸ›

Tyler van Hensbergen

πŸ€”

Vlad Hrybok

πŸ›

Vladimir Shchur

πŸ›

Yan Zhulanow

πŸ’»

ajnarang

πŸ€”

deccy-mcc

πŸ›

dependabot-preview[bot]

πŸ› 🚧

dependabot[bot]

🚧

dheffx

πŸ›

gregswdl

πŸ›

mergify[bot]

🚧

seiyashima42

πŸ› πŸ’» πŸ“–

sullis

πŸ’»

vaneek

πŸ›

This project follows the all-contributors specification. Contributions of any kind welcome!

βš–οΈ License

jsii is distributed under the Apache License, Version 2.0.

See LICENSE and NOTICE for more information.

About

jsii allows code in any language to naturally interact with JavaScript classes. It is the technology that enables the AWS Cloud Development Kit to deliver polyglot libraries from a single codebase!

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • TypeScript 68.2%
  • C# 12.8%
  • Java 7.2%
  • Go 5.4%
  • Python 3.4%
  • JavaScript 1.2%
  • Other 1.8%