0

I'm studying node express, particularly express written in typescript. I have the basic setup in place and can see my .ts files being converted to js in my dist folder. I have also created an angular 10 library and successfully published the library to npm registry.

This is the express project folder and file structure:

project-name
-src
--services
---api.ts
.env
package.json
tsconfig.json
tslint.json

package.json: please note the dependency to @mycompany/my-custom-lib

"scripts": {
    "prebuild": "tslint -c tslint.json -p tsconfig.json --fix",
    "build": "tsc",
    "prestart": "npm run build",
    "start": "node .",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@mycompany/my-custom-lib": "0.0.1",
    "dotenv": "^8.2.0",
    "express": "^4.17.1"
  },
  "devDependencies": {
    "@types/dotenv": "^8.2.0",
    "@types/express": "^4.17.8",
    "@types/node": "^14.14.7",
    "tslint": "^6.1.3",
    "typescript": "^4.0.5",
    "ts-node": "8.6.2"
  }
}

tsconfig.json

{
    "compilerOptions": {
        "module": "commonjs",
        "esModuleInterop": true,
        "target": "es6",
        "noImplicitAny": true,
        "moduleResolution": "node",
        "sourceMap": true,
        "outDir": "dist",
        "declaration": true,
        "declarationMap": true,
        "strict": true
    },
    "include": ["src"]
}

src/index.ts:

import express from "express";
import https from "https";
import fs from "fs";
import dotenv from "dotenv";
import { TestApi } from "./services/api";

dotenv.config();
const port = process.env.SERVER_PORT;
const app = express();
const api = new TestApi();

// define a route handler for the default home page
app.get("/", (req, res) => {
    const lawyers = api.getLawers();
    res.send(lawyers);
});

https.createServer({
    key: fs.readFileSync('./src/server.key'),
    cert: fs.readFileSync('./src/server.crt')
}, app).listen(port);

src/services/api.ts

import { CustomerDataModel } from "@mycompany/my-custom-lib/lib/customer.datamodel";

export class TestApi {

    public getCustomers(): CustomerDataModel[] {

        const customer1 = new CustomerDataModel();
        customer1.id = '0001';
        customer2.name = 'Customer 1';

        const customer2 = new CustomerDataModel();
        customer2.id = '0002';
        customer2.name = 'Customer 2';

        const customers = [
            customer1,
            customer2
        ];

        return customers;
    }
}

When I execute npm run start, I get the following error:

Error: Cannot find module '@mycompany/my-custom-library/lib/customer.datamodel'
Require stack:
- C:\projects\test-angular-express\test-api\dist\services\api.js
- C:\projects\test-angular-express\test-api\dist\index.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:965:15)
    at Function.Module._load (internal/modules/cjs/loader.js:841:27)
    at Module.require (internal/modules/cjs/loader.js:1025:19)
    at require (internal/modules/cjs/helpers.js:72:18)
    at Object.<anonymous> (C:\projects\test-angular-express\test-api\dist\services\api.js:4:28)
    at Module._compile (internal/modules/cjs/loader.js:1137:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
    at Module.load (internal/modules/cjs/loader.js:985:32)
    at Function.Module._load (internal/modules/cjs/loader.js:878:14)
    at Module.require (internal/modules/cjs/loader.js:1025:19) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    'C:\\projects\\test-angular-express\\test-api\\dist\\services\\api.js',
    'C:\\projects\\test-angular-express\\test-api\\dist\\index.js'
  ]
}

Looking at the js generated code I see this: dist/services/api.js

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TestApi = void 0;
const customer_datamodel_1 = require("@mycompany/domain/lib/customer.datamodel"); // <- THIS iS FAILING
class TestApi {
    getCustomers() {
        const customer1 = new customer_datamodel_1.CustomerDataModel();
        customer1.id = '0001';
        customer1.name = 'Customer 1';
        const customer2 = new customer_datamodel_1.CustomerDataModel();
        customer2.id = '0002';
        customer2.name = 'Customer 2';
        const customers = [
            customer1,
            customer2
        ];
        return customers;
    }
}
exports.TestApi = TestApi;
//# sourceMappingURL=api.js.map

1 Answer 1

1

For those who are interested, this is what I did:

I gave up on trying to make an Angular library to work as described in the question. Instead, I followed this the following tutorial to create a typescript library that is compatible with node and made little adjustments to make it compatible with Angular. By "compatible" I mean: I can npm install the library and use it normally in both Angular and node. Tutorial link: https://dev.to/charperbonaroo/creating-a-ts-written-npm-package-for-use-in-node-js-or-browser-5gm3

To make it work with Angular, I just added "declaration": true and "declarationMap": true to my tsconfig.json file, so the build generates the d.ts files.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.