Compare commits

..

No commits in common. "e62b2c3fbc3a8c8ab8ced358682916861b5b6d0f" and "0ac018073cff7909fe614fc9ba138666c21512ec" have entirely different histories.

6 changed files with 114 additions and 479 deletions

20
dist/index.js vendored
View File

@ -3,7 +3,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod }; return (mod && mod.__esModule) ? mod : { "default": mod };
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.ImageGenerator = void 0;
//Modules //Modules
// const AdmZip = require('adm-zip'); // const AdmZip = require('adm-zip');
const adm_zip_1 = __importDefault(require("adm-zip")); const adm_zip_1 = __importDefault(require("adm-zip"));
@ -118,6 +117,7 @@ class ImageGenerator {
} }
} }
// Check temp and output dirs exist // Check temp and output dirs exist
try {
if (!(0, node_fs_1.existsSync)(gerber)) { if (!(0, node_fs_1.existsSync)(gerber)) {
throw Error('Archive does not exist.'); throw Error('Archive does not exist.');
} }
@ -127,8 +127,11 @@ class ImageGenerator {
if (!(0, node_fs_1.existsSync)(this.folderConfig.imgDir)) { if (!(0, node_fs_1.existsSync)(this.folderConfig.imgDir)) {
throw Error('Output folder does not exist.'); throw Error('Output folder does not exist.');
} }
else { }
console.error(`output dir: ${this.folderConfig.imgDir}`); catch (error) {
if (error instanceof Error) {
console.error(error.message);
}
} }
// Set filenames // Set filenames
//Use the filename of the gerber zip to determine the output png filename //Use the filename of the gerber zip to determine the output png filename
@ -167,6 +170,7 @@ class ImageGenerator {
*/ */
gerberToStream(gerber) { gerberToStream(gerber) {
// Check temp and output dirs exist // Check temp and output dirs exist
try {
if (!(0, node_fs_1.existsSync)(gerber)) { if (!(0, node_fs_1.existsSync)(gerber)) {
throw Error('Archive does not exist.'); throw Error('Archive does not exist.');
} }
@ -176,6 +180,12 @@ class ImageGenerator {
if (!(0, node_fs_1.existsSync)(this.folderConfig.imgDir)) { if (!(0, node_fs_1.existsSync)(this.folderConfig.imgDir)) {
throw Error('Output folder does not exist.'); throw Error('Output folder does not exist.');
} }
}
catch (error) {
if (error instanceof Error) {
console.error(error.message);
}
}
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.extractArchive(gerber, this.folderConfig.tmpDir); this.extractArchive(gerber, this.folderConfig.tmpDir);
if (!this.layerNames) if (!this.layerNames)
@ -204,4 +214,6 @@ class ImageGenerator {
}); });
} }
} }
exports.ImageGenerator = ImageGenerator; module.exports = {
ImageGenerator,
};

381
package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "@nplayfair/npe_gerber", "name": "@nplayfair/npe_gerber",
"version": "1.0.1", "version": "1.0.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "@nplayfair/npe_gerber", "name": "@nplayfair/npe_gerber",
"version": "1.0.1", "version": "1.0.0",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"adm-zip": "^0.5.16", "adm-zip": "^0.5.16",
@ -18,11 +18,9 @@
"@eslint/js": "^9.29.0", "@eslint/js": "^9.29.0",
"@types/adm-zip": "^0.5.7", "@types/adm-zip": "^0.5.7",
"@types/fs-extra": "^11.0.4", "@types/fs-extra": "^11.0.4",
"@types/jest": "^29.5.14",
"eslint": "^9.29.0", "eslint": "^9.29.0",
"jest": "^30.0.0", "jest": "^30.0.0",
"prettier": "^3.5.3", "prettier": "^3.5.3",
"ts-jest": "^29.4.0",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"typescript": "^5.8.3", "typescript": "^5.8.3",
"typescript-eslint": "^8.34.0" "typescript-eslint": "^8.34.0"
@ -2001,187 +1999,6 @@
"@types/istanbul-lib-report": "*" "@types/istanbul-lib-report": "*"
} }
}, },
"node_modules/@types/jest": {
"version": "29.5.14",
"resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz",
"integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"expect": "^29.0.0",
"pretty-format": "^29.0.0"
}
},
"node_modules/@types/jest/node_modules/@jest/expect-utils": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz",
"integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==",
"dev": true,
"license": "MIT",
"dependencies": {
"jest-get-type": "^29.6.3"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@types/jest/node_modules/@jest/schemas": {
"version": "29.6.3",
"resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
"integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@sinclair/typebox": "^0.27.8"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@types/jest/node_modules/@jest/types": {
"version": "29.6.3",
"resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
"integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/schemas": "^29.6.3",
"@types/istanbul-lib-coverage": "^2.0.0",
"@types/istanbul-reports": "^3.0.0",
"@types/node": "*",
"@types/yargs": "^17.0.8",
"chalk": "^4.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@types/jest/node_modules/@sinclair/typebox": {
"version": "0.27.8",
"resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
"integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/jest/node_modules/ci-info": {
"version": "3.9.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
"integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/sibiraj-s"
}
],
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/@types/jest/node_modules/expect": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
"integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/expect-utils": "^29.7.0",
"jest-get-type": "^29.6.3",
"jest-matcher-utils": "^29.7.0",
"jest-message-util": "^29.7.0",
"jest-util": "^29.7.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@types/jest/node_modules/jest-diff": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
"integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==",
"dev": true,
"license": "MIT",
"dependencies": {
"chalk": "^4.0.0",
"diff-sequences": "^29.6.3",
"jest-get-type": "^29.6.3",
"pretty-format": "^29.7.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@types/jest/node_modules/jest-matcher-utils": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz",
"integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==",
"dev": true,
"license": "MIT",
"dependencies": {
"chalk": "^4.0.0",
"jest-diff": "^29.7.0",
"jest-get-type": "^29.6.3",
"pretty-format": "^29.7.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@types/jest/node_modules/jest-message-util": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
"integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.12.13",
"@jest/types": "^29.6.3",
"@types/stack-utils": "^2.0.0",
"chalk": "^4.0.0",
"graceful-fs": "^4.2.9",
"micromatch": "^4.0.4",
"pretty-format": "^29.7.0",
"slash": "^3.0.0",
"stack-utils": "^2.0.3"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@types/jest/node_modules/jest-util": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
"integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/types": "^29.6.3",
"@types/node": "*",
"chalk": "^4.0.0",
"ci-info": "^3.2.0",
"graceful-fs": "^4.2.9",
"picomatch": "^2.2.3"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@types/jest/node_modules/pretty-format": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
"integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/schemas": "^29.6.3",
"ansi-styles": "^5.0.0",
"react-is": "^18.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@types/json-schema": { "node_modules/@types/json-schema": {
"version": "7.0.15", "version": "7.0.15",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
@ -2910,13 +2727,6 @@
"dev": true, "dev": true,
"license": "Python-2.0" "license": "Python-2.0"
}, },
"node_modules/async": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
"integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
"dev": true,
"license": "MIT"
},
"node_modules/babel-jest": { "node_modules/babel-jest": {
"version": "30.0.0", "version": "30.0.0",
"resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.0.0.tgz", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.0.0.tgz",
@ -3079,19 +2889,6 @@
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
} }
}, },
"node_modules/bs-logger": {
"version": "0.2.6",
"resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz",
"integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==",
"dev": true,
"license": "MIT",
"dependencies": {
"fast-json-stable-stringify": "2.x"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/bser": { "node_modules/bser": {
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
@ -3482,16 +3279,6 @@
"node": ">=0.3.1" "node": ">=0.3.1"
} }
}, },
"node_modules/diff-sequences": {
"version": "29.6.3",
"resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
"integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/eastasianwidth": { "node_modules/eastasianwidth": {
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
@ -3499,22 +3286,6 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/ejs": {
"version": "3.1.10",
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
"integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"jake": "^10.8.5"
},
"bin": {
"ejs": "bin/cli.js"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/electron-to-chromium": { "node_modules/electron-to-chromium": {
"version": "1.5.167", "version": "1.5.167",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.167.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.167.tgz",
@ -3890,39 +3661,6 @@
"node": ">=16.0.0" "node": ">=16.0.0"
} }
}, },
"node_modules/filelist": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
"integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"minimatch": "^5.0.1"
}
},
"node_modules/filelist/node_modules/brace-expansion": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/filelist/node_modules/minimatch": {
"version": "5.1.6",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
"integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
"dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
"engines": {
"node": ">=10"
}
},
"node_modules/fill-range": { "node_modules/fill-range": {
"version": "7.1.1", "version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
@ -4489,25 +4227,6 @@
"@pkgjs/parseargs": "^0.11.0" "@pkgjs/parseargs": "^0.11.0"
} }
}, },
"node_modules/jake": {
"version": "10.9.2",
"resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz",
"integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"async": "^3.2.3",
"chalk": "^4.0.2",
"filelist": "^1.0.4",
"minimatch": "^3.1.2"
},
"bin": {
"jake": "bin/cli.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/jest": { "node_modules/jest": {
"version": "30.0.0", "version": "30.0.0",
"resolved": "https://registry.npmjs.org/jest/-/jest-30.0.0.tgz", "resolved": "https://registry.npmjs.org/jest/-/jest-30.0.0.tgz",
@ -4732,16 +4451,6 @@
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
} }
}, },
"node_modules/jest-get-type": {
"version": "29.6.3",
"resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
"integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-haste-map": { "node_modules/jest-haste-map": {
"version": "30.0.0", "version": "30.0.0",
"resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.0.0.tgz", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.0.0.tgz",
@ -5282,13 +4991,6 @@
"integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/lodash.memoize": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
"integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
"dev": true,
"license": "MIT"
},
"node_modules/lodash.merge": { "node_modules/lodash.merge": {
"version": "4.6.2", "version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@ -6473,85 +6175,6 @@
"typescript": ">=4.8.4" "typescript": ">=4.8.4"
} }
}, },
"node_modules/ts-jest": {
"version": "29.4.0",
"resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.0.tgz",
"integrity": "sha512-d423TJMnJGu80/eSgfQ5w/R+0zFJvdtTxwtF9KzFFunOpSeD+79lHJQIiAhluJoyGRbvj9NZJsl9WjCUo0ND7Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"bs-logger": "^0.2.6",
"ejs": "^3.1.10",
"fast-json-stable-stringify": "^2.1.0",
"json5": "^2.2.3",
"lodash.memoize": "^4.1.2",
"make-error": "^1.3.6",
"semver": "^7.7.2",
"type-fest": "^4.41.0",
"yargs-parser": "^21.1.1"
},
"bin": {
"ts-jest": "cli.js"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0"
},
"peerDependencies": {
"@babel/core": ">=7.0.0-beta.0 <8",
"@jest/transform": "^29.0.0 || ^30.0.0",
"@jest/types": "^29.0.0 || ^30.0.0",
"babel-jest": "^29.0.0 || ^30.0.0",
"jest": "^29.0.0 || ^30.0.0",
"jest-util": "^29.0.0 || ^30.0.0",
"typescript": ">=4.3 <6"
},
"peerDependenciesMeta": {
"@babel/core": {
"optional": true
},
"@jest/transform": {
"optional": true
},
"@jest/types": {
"optional": true
},
"babel-jest": {
"optional": true
},
"esbuild": {
"optional": true
},
"jest-util": {
"optional": true
}
}
},
"node_modules/ts-jest/node_modules/semver": {
"version": "7.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/ts-jest/node_modules/type-fest": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
"integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
"dev": true,
"license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/ts-node": { "node_modules/ts-node": {
"version": "10.9.2", "version": "10.9.2",
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",

View File

@ -1,12 +1,11 @@
{ {
"name": "@nplayfair/npe_gerber", "name": "@nplayfair/npe_gerber",
"version": "1.0.1", "version": "1.0.0",
"description": "Create a PCB image from gerber files", "description": "Create a PCB image from gerber files",
"main": "dist/index.js", "main": "dist/index.js",
"types": "types/npe_gerber.d.ts", "types": "types/npe_gerber.d.ts",
"scripts": { "scripts": {
"test": "NODE_ENV=test PORT=7788 jest", "test": "jest",
"test:watch": "npm run test -- --watchAll",
"lint": "eslint ." "lint": "eslint ."
}, },
"repository": { "repository": {
@ -24,31 +23,6 @@
"image", "image",
"gerber" "gerber"
], ],
"jest": {
"verbose": true,
"modulePathIgnorePatterns": [
"<rootDir>/node_modules"
],
"roots": [
"<rootDir>/test"
],
"transform": {
"^.+\\.tsx?$": "ts-jest"
},
"testEnvironment": "node",
"testPathIgnorePatterns": [
"/node_modules"
],
"testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$",
"moduleFileExtensions": [
"ts",
"tsx",
"js",
"jsx",
"json",
"node"
]
},
"dependencies": { "dependencies": {
"adm-zip": "^0.5.16", "adm-zip": "^0.5.16",
"fs-extra": "^11.3.0", "fs-extra": "^11.3.0",
@ -59,11 +33,9 @@
"@eslint/js": "^9.29.0", "@eslint/js": "^9.29.0",
"@types/adm-zip": "^0.5.7", "@types/adm-zip": "^0.5.7",
"@types/fs-extra": "^11.0.4", "@types/fs-extra": "^11.0.4",
"@types/jest": "^29.5.14",
"eslint": "^9.29.0", "eslint": "^9.29.0",
"jest": "^30.0.0", "jest": "^30.0.0",
"prettier": "^3.5.3", "prettier": "^3.5.3",
"ts-jest": "^29.4.0",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"typescript": "^5.8.3", "typescript": "^5.8.3",
"typescript-eslint": "^8.34.0" "typescript-eslint": "^8.34.0"

View File

@ -9,7 +9,7 @@ import { Readable } from 'node:stream';
import { existsSync, accessSync, createReadStream, constants } from 'node:fs'; import { existsSync, accessSync, createReadStream, constants } from 'node:fs';
//Class definition //Class definition
export class ImageGenerator implements ZipExtractor, LayerGenerator { class ImageGenerator implements ZipExtractor, LayerGenerator {
constructor( constructor(
public folderConfig: FolderConfig, public folderConfig: FolderConfig,
public imgConfig: ImageConfig, public imgConfig: ImageConfig,
@ -47,7 +47,10 @@ export class ImageGenerator implements ZipExtractor, LayerGenerator {
return zip.getEntries().length; return zip.getEntries().length;
} }
//Test archive /**
* Temporary test method zip file
*/
public testArchive(fileName: string, tmpDir: string): number { public testArchive(fileName: string, tmpDir: string): number {
// Check archive exists // Check archive exists
try { try {
@ -118,6 +121,7 @@ export class ImageGenerator implements ZipExtractor, LayerGenerator {
} }
// Check temp and output dirs exist // Check temp and output dirs exist
try {
if (!existsSync(gerber)) { if (!existsSync(gerber)) {
throw Error('Archive does not exist.'); throw Error('Archive does not exist.');
} }
@ -127,6 +131,11 @@ export class ImageGenerator implements ZipExtractor, LayerGenerator {
if (!existsSync(this.folderConfig.imgDir)) { if (!existsSync(this.folderConfig.imgDir)) {
throw Error('Output folder does not exist.'); throw Error('Output folder does not exist.');
} }
} catch (error) {
if (error instanceof Error) {
console.error(error.message);
}
}
// Set filenames // Set filenames
//Use the filename of the gerber zip to determine the output png filename //Use the filename of the gerber zip to determine the output png filename
@ -164,10 +173,13 @@ export class ImageGenerator implements ZipExtractor, LayerGenerator {
/** /**
* Take an archive containing gerber files and return a stream containing * Take an archive containing gerber files and return a stream containing
* a PNG image from the gerber */ * a PNG image from the gerber
* @param {string} gerber Path to an archive file containing gerber
* @returns {Promise.<stream.Readable>} Promise that resolves to a PNG stream
*/
gerberToStream(gerber: string) { gerberToStream(gerber: string) {
// Check temp and output dirs exist // Check temp and output dirs exist
try {
if (!existsSync(gerber)) { if (!existsSync(gerber)) {
throw Error('Archive does not exist.'); throw Error('Archive does not exist.');
} }
@ -177,6 +189,11 @@ export class ImageGenerator implements ZipExtractor, LayerGenerator {
if (!existsSync(this.folderConfig.imgDir)) { if (!existsSync(this.folderConfig.imgDir)) {
throw Error('Output folder does not exist.'); throw Error('Output folder does not exist.');
} }
} catch (error) {
if (error instanceof Error) {
console.error(error.message);
}
}
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.extractArchive(gerber, this.folderConfig.tmpDir); this.extractArchive(gerber, this.folderConfig.tmpDir);
@ -208,3 +225,7 @@ export class ImageGenerator implements ZipExtractor, LayerGenerator {
}); });
} }
} }
module.exports = {
ImageGenerator,
};

View File

@ -1,9 +1,8 @@
import path from 'path'; const path = require('path');
import { readdirSync } from 'node:fs'; const { readdirSync, ReadStream } = require('node:fs');
import { emptyDirSync } from 'fs-extra'; const { Readable } = require('node:stream');
import { Readable } from 'node:stream'; const { ImageGenerator } = require('../dist/index.js');
import { ImageGenerator } from '../src/index'; require('../dist/index.js');
import { tmpdir } from 'node:os';
const testGerber = path.join(__dirname, 'Arduino-Pro-Mini.zip'); const testGerber = path.join(__dirname, 'Arduino-Pro-Mini.zip');
const incompleteGerber = path.join(__dirname, 'incomplete.zip'); const incompleteGerber = path.join(__dirname, 'incomplete.zip');
@ -53,19 +52,17 @@ const layerNames = [
]; ];
const fileProc = new ImageGenerator(folderConfig, imgConfig, layerNames); const fileProc = new ImageGenerator(folderConfig, imgConfig, layerNames);
const fileProcNoTemp = new ImageGenerator(noTempConfig, imgConfig, layerNames);
const fileProcNoImage = new ImageGenerator(
noImageConfig,
imgConfig,
layerNames,
);
/************** /**************
* Tests * Tests
***************/ ***************/
beforeAll(() => {
return emptyDirSync(folderConfig.tmpDir);
});
beforeEach(() => {
return emptyDirSync(emptyFolder);
});
// Test constructor // Test constructor
describe('Creating an ImageGenerator object', () => { describe('Creating an ImageGenerator object', () => {
const imgGen = new ImageGenerator(folderConfig, imgConfig); const imgGen = new ImageGenerator(folderConfig, imgConfig);
@ -86,9 +83,6 @@ describe('Creating an ImageGenerator object', () => {
expect(imgGen.folderConfig.tmpDir).toBe(path.join(__dirname, 'tmp')); expect(imgGen.folderConfig.tmpDir).toBe(path.join(__dirname, 'tmp'));
expect(imgGen.folderConfig.imgDir).toBe(path.join(__dirname, 'tmp')); expect(imgGen.folderConfig.imgDir).toBe(path.join(__dirname, 'tmp'));
}); });
afterAll(() => {
return emptyDirSync(folderConfig.tmpDir);
});
}); });
// Testing folder config // Testing folder config
@ -124,6 +118,12 @@ describe('Getting layers', () => {
); );
}); });
// test('should return a promise of array of layers', () => {
// return imgGen.getLayers(testLayers, layerNames).then((data) => {
// expect(data).toBeInstanceOf(Array);
// });
// });
test('should throw error if the layers folder is not valid', () => { test('should throw error if the layers folder is not valid', () => {
expect(() => { expect(() => {
imgGen.getLayers('some_invalid_folder', layerNames); imgGen.getLayers('some_invalid_folder', layerNames);
@ -166,27 +166,34 @@ describe('When extracting an archive', () => {
const numOutputFiles = dirents.filter((dirent) => dirent.isFile()); const numOutputFiles = dirents.filter((dirent) => dirent.isFile());
expect(numOutputFiles).toHaveLength(12); expect(numOutputFiles).toHaveLength(12);
}); });
//clear archive
afterAll(() => {
return emptyDirSync(archiveTestFolder);
});
}); });
//Gerber methods //Gerber methods
describe('Converting a gerber to an image', () => { describe('Converting a gerber to an image', () => {
beforeEach(() => { test('temp dir not existing should throw an error', () => {
return emptyDirSync(emptyFolder); expect(() =>
fileProcNoTemp
.gerberToImage(testGerber)
.toThrow(new Error('Temporary folder does not exist.')),
);
}); });
afterAll(() => { test('output dir not existing should throw an error', () => {
return emptyDirSync(emptyFolder); expect(() =>
fileProcNoImage
.gerberToImage(testGerber)
.toThrow(new Error('Output folder does not exist.')),
);
}); });
test('invalid archive file should throw an error', () => { test('invalid archive file should throw an error', () => {
expect(() => fileProc.gerberToImage('invalid.zip')).toThrow(); expect(() =>
fileProc
.gerberToImage('invalid.zip')
.toThrow(new Error('Archive does not exist.')),
);
});
test('an archive with incomplete set of layers should throw an error', () => {
expect(() => fileProc.gerberToImage(incompleteGerber).toThrow(Error));
}); });
// test('an archive with incomplete set of layers should throw an error', () => {
// expect(() => fileProc.gerberToImage(incompleteGerber)).toThrow();
// });
test('gerber archive should resolve promise and return a filename of an image', () => { test('gerber archive should resolve promise and return a filename of an image', () => {
expect.assertions(1); expect.assertions(1);
return expect(fileProc.gerberToImage(testGerber)).resolves.toEqual( return expect(fileProc.gerberToImage(testGerber)).resolves.toEqual(

View File

@ -110,6 +110,6 @@
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
"skipLibCheck": true /* Skip type checking all .d.ts files. */ "skipLibCheck": true /* Skip type checking all .d.ts files. */
}, },
"include": ["src/**/*", "types/npe_gerber.d.ts"], "include": ["src", "types/npe_gerber.d.ts"],
"exclude": ["node_modules", "dist/**/*", "test/**/*"] "exclude": ["node_modules", "dist/**/*", "test/**/*"]
} }