I'm developing an Angular 13 custom library using NPM V8.19.3, and it makes use of Dynamsoft WebTwain v18.1.0 library to manage a scanner. It should be later consumed locally - e.g. via NPM link - by an Angular application in the same workspace for development reasons, later it will published on an NPM registry and made available for "real" applications. I started a new workspace because it is simply a "proof of concept", if it works will be made the same job on the real one.
Below I will summarize the context and the steps I followed.
- create an empty workspace
- add to it two projects, one of type library (poc-scan-package) and one of type application (poc-scan-showcase)
- add to the application its own package.json (so that the dependencies won't fall in the common one)
- add the Dynamsoft WebTwain library as bundled dependency of my custom package (following this link as starting guide, but adapted to be used in a package instead of into an application) and
- add to the common package.json a script to build the package and copy the required assets to the built package as declared in the starting guide
- create a global link to my "
dist/<package name>" folder using npm link and use that link in the application project - add to angular.json "
projects/<application name>/architect/build/options/assets" the path where I copied the WebTwain assets - last step has been to change the html of the application to refer the package component, and the package component itself.
After these steps these are the relevant files/sections:
Workspace content
angular.json
{
...
"projects": {
...
"poc-scan-showcase": {
"projectType": "application",
"root": "projects/poc-scan-showcase",
...
"architect": {
"build": {
"options": {
...
"assets": [
...,
{
"glob": "**/*",
"input": "projects/poc-scan-showcase/node_modules/poc-scan-package/assets/dwt-resources/dist/",
"output": "assets/dwt-resources"
}
]
}
}
}
}
}
}
package.json - build command:
"scripts": {
"build:lib": "npm run build -- --project poc-scan-package && mkdir -p ./dist/poc-scan-package/assets/dwt-resources && cp ./projects/poc-scan-package/node_modules/dwt/dist ./dist/poc-scan-package/assets/dwt-resources -r"
}
Library content
package.json
{
"name": "poc-scan-package",
"version": "0.0.1",
"peerDependencies": {
"@angular/common": "^13.3.0",
"@angular/core": "^13.3.0"
},
"dependencies": {
"dwt": "^18.1.0",
"tslib": "^2.3.0"
},
"bundledDependencies": [
"dwt"
]
}
ng-package.json
{
"$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
"dest": "../../dist/poc-scan-package",
"lib": {
"entryFile": "src/public-api.ts"
},
"allowedNonPeerDependencies": ["dwt"]
}
poc-scan-package.component.ts
import { Component, OnInit } from "@angular/core";
import Dynamsoft from "dwt";
import { WebTwain } from "dwt/dist/types/WebTwain";
@Component({
selector: "lib-poc-scan-package",
template: `
<button (click)="acquireImage()">Acquire Images</button>
<div id="dwtcontrolContainer"></div>
`
})
export class PocScanPackageComponent implements OnInit {
DWObject: WebTwain | any = null;
ngOnInit(): void {
.
.
.
Dynamsoft.DWT.RegisterEvent("OnWebTwainReady", () => {
this.Dynamsoft_OnReady();
});
Dynamsoft.DWT.ProductKey = "YOUR-PRODUCT-KEY";
Dynamsoft.DWT.ResourcesPath = "assets/dwt-resources"; // <--expected path for setup delivery
Dynamsoft.DWT.Load();
}
.
.
.
}
Application content
app.component.ts
@Component({
selector: "poc-root",
template: ` <lib-poc-scan-package></lib-poc-scan-package> `,
styles: [],
})
export class AppComponent {
title = "poc-scan-showcase";
}
So both the Dynamsoft object and the WebTwain interface seems to be not found during runtime.
This is part of the output of the application build:
./dist/poc-scan-package/fesm2015/poc-scan-package.mjs:3:0-28 - Error: Module not found: Error: Can't resolve 'dwt' in '`/home/<username>/repos/test/poc/EmbedScanIntoPackage/dist/poc-scan-package/fesm2015`'
Error: dist/poc-scan-package/lib/poc-scan-package.component.d.ts:2:26 - error TS2307: Cannot find module 'dwt/dist/types/WebTwain' or its corresponding type declarations.
`import { WebTwain } from "dwt/dist/types/WebTwain";`
~~~~~~~~~~~~~~~~~~~~~~~~~
I think to understand that the compiler is right because the built library has the expected directory remapped to "assets/dwt-resources/dist/types", but I'm not sure why it has to look there.
I'm thinking to unlink the "dist" directory and make NPM point to the source library project, but every example I've ever seen make it point to it.
Here the link to the repo with the work I did up to now.
Let me know if I'm missing some useful information.
You can refer to my ngx-web-document-scanner project, which is a custom Angular module built with Dynamic Web TWAIN.
The
projects/ngx-web-document-scanner/package.jsonfile is very simple. You just adddwtas the peer dependency:When creating an Angular project with the custom Angular module, add the asset output directory of Dynamic Web TWAIN resources in the
angular.jsonfile:In the meantime, you need to specify the resource path in TypeScript code:
Try https://www.npmjs.com/package/ngx-web-document-scanner