Skip to main content

jsii

Dependabot Status Build Status Build Status npm docker Join the chat at https://gitter.im/aws/jsii

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!

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 hello-jsii@1.0.0 No description
npm WARN hello-jsii@1.0.0 No repository field.

+ jsii-pacmak@0.14.3
+ jsii@0.14.3
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

> hello-jsii@1.0.0 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
│   └── hello-jsii@1.0.0.jsii.tgz
└── 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.

Contributing

See CONTRIBUTING.

License

jsii is distributed under the Apache License, Version 2.0.

See LICENSE and NOTICE for more information.

Release files for jsii 0.20.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for jsii 0.20.1
File Size Uploaded
jsii-0.20.1.tar.gz 253.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for jsii 0.20.1
File Interpreter ABI Platform
jsii-0.20.1-py3-none-any.whl Python 3 none any Details

Total release size: 508.1 kB

Release files / jsii-0.20.1.tar.gz

Download URL jsii-0.20.1.tar.gz
Size 253.4 kB
Tags Source
SHA-256 checksum
How to use checksums
119ea923358c8797f0ff8018e1c6a38ee3123d584ab40b64d62ffaff2e01ddd3
BLAKE2b-256 checksum
How to use checksums
e7840bfa967e6df30b727994343186c305ab874c25a790e87f0960aa041f1f93
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/39.0.1 requests-toolbelt/0.9.1 tqdm/4.37.0 CPython/3.6.5

Release files / jsii-0.20.1-py3-none-any.whl

Download URL jsii-0.20.1-py3-none-any.whl
Size 254.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
33cb0b79f54ffda50e61617de9758e4dfc2f20291f9e0a7b8a5d349072696098
BLAKE2b-256 checksum
How to use checksums
fbade1dc172be9b27bb05a208196f613978abbaca060b89d5427152a7966dd18
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/39.0.1 requests-toolbelt/0.9.1 tqdm/4.37.0 CPython/3.6.5

Release history Release notifications | RSS feed

1.98.0

2 release files

1.96.0

2 release files

1.92.0

2 release files

1.91.0

2 release files

1.89.0

2 release files

1.88.0

2 release files

1.87.0

2 release files

1.85.0

2 release files

1.84.0

2 release files

1.82.0

2 release files

1.81.0

2 release files

1.79.0

2 release files

1.78.1

2 release files

1.78.0

2 release files

1.76.0

2 release files

1.75.0

2 release files

1.74.0

2 release files

1.70.0

2 release files

1.69.0

2 release files

1.68.0

2 release files

1.66.0

2 release files

1.65.1

2 release files

1.65.0

2 release files

1.64.0

2 release files

1.63.2

2 release files

1.63.1

2 release files

1.63.0

2 release files

1.62.0

2 release files

1.61.0

2 release files

1.59.0

2 release files

1.57.0

2 release files

1.55.1

2 release files

1.55.0

2 release files

1.54.0

2 release files

1.52.1

2 release files

1.50.0

2 release files

1.49.0

2 release files

1.48.0

2 release files

1.46.0

2 release files

1.45.0

2 release files

1.44.2

2 release files

1.44.1

2 release files

1.44.0

2 release files

1.41.0

2 release files

1.40.0

2 release files

1.39.0

2 release files

1.35.0

2 release files

1.34.0

2 release files

1.33.0

2 release files

1.32.0

2 release files

1.30.0

2 release files

1.29.0

2 release files

1.28.0

2 release files

1.27.1

2 release files

1.26.0

2 release files

1.25.0

2 release files

1.22.0

2 release files

1.21.0

2 release files

1.18.0

2 release files

1.17.1

2 release files

1.17.0

2 release files

1.15.0

2 release files

1.14.0

2 release files

1.13.0

2 release files

1.12.0

2 release files

1.11.0

2 release files

1.9.0

2 release files

1.8.0

2 release files

1.7.0

2 release files

1.6.0

2 release files

1.5.0

2 release files

1.4.1

2 release files

1.4.0

2 release files

1.3.2

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.0

2 release files

0.21.2

2 release files

0.20.9

2 release files

0.20.8

2 release files

0.20.7

2 release files

0.20.6

2 release files

0.20.5

2 release files

0.20.4

2 release files

0.20.3

2 release files

This release

0.20.1 This release

2 release files

0.20.0

2 release files

0.19.0

2 release files

0.17.1

2 release files

0.17.0

2 release files

0.16.0

2 release files

0.15.2

2 release files

0.15.1

2 release files

0.15.0

2 release files

0.14.2

2 release files

0.14.1

2 release files

0.13.1

2 release files

0.13.0

2 release files

0.12.1

2 release files

0.12.0

2 release files

0.11.3

2 release files

0.11.2

2 release files

0.11.0

2 release files

0.10.3

2 release files

0.10.2

2 release files

0.10.1

2 release files

0.10.0

2 release files

0.9.0

2 release files

0.8.2

2 release files

0.8.1

2 release files

0.8.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page