Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Publish Typescript classes as npm package

I have written a set of Typescript classes that I am publishing as an NPM module to our internal package server. My other projects are able to retrieve this dependency using NPM.

I'd like to publish the classes in such a way that I can import them by referencing the package itself, similar to some other packages that I am using like Angular.

import { SomeClass } from 'mylibrary'

This is my current setup:

I've written a ./mylibrary.d.ts file:

export * from './dist/foldera/folderb'
//etc

./package.json:

"name": "mylibrary",
"main": "mylibrary.d.ts",
"files": [
  "mylibrary.d.ts",
  "dist/"
],
"types": "mylibrary.d.ts",
//ommitted other settings

src/tsconfig.json:

{
  "compileOnSave": false,
  "compilerOptions": {
    "outDir": "../dist/",
    "baseUrl": "src",
    "sourceMap": true,
    "declaration": true,
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "es5",
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2016",
      "dom"
    ]
  }
}

When I try to import the package using the desired syntax, MS VS Code says everything is ok, but running my project results in a rather cryptic error message:

Module build failed: Error: Debug Failure. False expression: Output generation failed

I'm feeling lost in the jargon of modules, namespaces and packages. Any help is greatly appreciated.

like image 677
Boris van Katwijk Avatar asked Aug 01 '17 08:08

Boris van Katwijk


People also ask

Do npm packages work with TypeScript?

An NPM module must supply JavaScript (not TypeScript) code. It's important to provide JavaScript so the modules work with JavaScript projects.


1 Answers

If you place an index.ts file in the root folder of your package (same level as package.json), so that it re-exports all the functionality from your src/ folder, than you can publish it without building to js, keeping in mind that it will only be used in TS projects.

The negative side of this approach is that, your package will be compiled with your project every time, and possible changes in TS environment may lead to inability to compile the whole project (I have problems compiling one of my packages on versions < 2.4.2, for example).

// index.ts
export { Class1 } from 'src/Class1'
export { Class2 } from 'src/Class2'
like image 55
Daniel Khoroshko Avatar answered Sep 24 '22 14:09

Daniel Khoroshko