@mlightcad/libredwg-converter 3.15.12 → 3.15.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- export declare function parseDwg(data: string): Promise<{
1
+ export declare function parseDwg(data: string | ArrayBuffer): Promise<{
2
2
  database: import("@mlightcad/libredwg-web").DwgDatabase;
3
3
  stats: {
4
4
  unknownEntityCount: number;
@@ -1 +1 @@
1
- {"version":3,"file":"AcDbLibreDwgConverterUtil.d.ts","sourceRoot":"","sources":["../src/AcDbLibreDwgConverterUtil.ts"],"names":[],"mappings":"AAEA,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM;;;;;GAiB1C"}
1
+ {"version":3,"file":"AcDbLibreDwgConverterUtil.d.ts","sourceRoot":"","sources":["../src/AcDbLibreDwgConverterUtil.ts"],"names":[],"mappings":"AAIA,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;;;;;GAyBxD"}
@@ -35,9 +35,10 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
35
35
  }
36
36
  };
37
37
  import { Dwg_File_Type, LibreDwg } from '@mlightcad/libredwg-web';
38
+ import { acdbEnsureDwgThumbnailImage } from './extractDwgThumbnailImage';
38
39
  export function parseDwg(data) {
39
40
  return __awaiter(this, void 0, void 0, function () {
40
- var libredwg, dwgDataPtr, result;
41
+ var libredwg, dwgDataPtr, result, fileBytes;
41
42
  return __generator(this, function (_a) {
42
43
  switch (_a.label) {
43
44
  case 0: return [4 /*yield*/, LibreDwg.create()];
@@ -52,6 +53,10 @@ export function parseDwg(data) {
52
53
  }
53
54
  result = libredwg.convertEx(dwgDataPtr);
54
55
  libredwg.dwg_free(dwgDataPtr);
56
+ fileBytes = typeof data === 'string' ? undefined : new Uint8Array(data);
57
+ if (fileBytes) {
58
+ acdbEnsureDwgThumbnailImage(result.database, fileBytes);
59
+ }
55
60
  return [2 /*return*/, result];
56
61
  }
57
62
  });
@@ -1 +1 @@
1
- {"version":3,"file":"AcDbLibreDwgConverterUtil.js","sourceRoot":"","sources":["../src/AcDbLibreDwgConverterUtil.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAEjE,MAAM,UAAgB,QAAQ,CAAC,IAAY;;;;;wBAIxB,qBAAM,QAAQ,CAAC,MAAM,EAAE,EAAA;;oBAAlC,QAAQ,GAAG,SAAuB;oBACxC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;wBACrB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;oBAC5C,CAAC;oBAEK,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,CAAA;oBAClE,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;wBACvB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;oBAC7C,CAAC;oBACK,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;oBAC7C,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;oBAE7B,sBAAO,MAAM,EAAA;;;;CACd"}
1
+ {"version":3,"file":"AcDbLibreDwgConverterUtil.js","sourceRoot":"","sources":["../src/AcDbLibreDwgConverterUtil.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAEjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAA;AAExE,MAAM,UAAgB,QAAQ,CAAC,IAA0B;;;;;wBAItC,qBAAM,QAAQ,CAAC,MAAM,EAAE,EAAA;;oBAAlC,QAAQ,GAAG,SAAuB;oBACxC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;wBACrB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;oBAC5C,CAAC;oBAEK,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,CAAA;oBAClE,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;wBACvB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;oBAC7C,CAAC;oBACK,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;oBAC7C,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;oBAIvB,SAAS,GACb,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAA;oBAC7D,IAAI,SAAS,EAAE,CAAC;wBACd,2BAA2B,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;oBACzD,CAAC;oBAED,sBAAO,MAAM,EAAA;;;;CACd"}
@@ -0,0 +1,18 @@
1
+ import type { AcDbDatabaseConverterConfig, AcDbParsingTaskResult } from '@mlightcad/data-model';
2
+ import type { DwgDatabase } from '@mlightcad/libredwg-web';
3
+ import { AcDbLibreDwgConverter } from './AcDbLibreDwgConverter';
4
+ /**
5
+ * LibreDWG converter that parses on the current thread (no Web Worker).
6
+ *
7
+ * Intended for Node and other environments without a reliable worker + WASM
8
+ * loader. Shares {@link parseDwg} with the browser worker, including the
9
+ * classic `previewAddress` thumbnail fallback.
10
+ *
11
+ * Import from `@mlightcad/libredwg-converter/node` so the browser UMD bundle
12
+ * stays free of LibreDWG WASM.
13
+ */
14
+ export declare class AcDbLibreDwgMainThreadConverter extends AcDbLibreDwgConverter {
15
+ constructor(config?: AcDbDatabaseConverterConfig);
16
+ protected parse(data: ArrayBuffer): Promise<AcDbParsingTaskResult<DwgDatabase>>;
17
+ }
18
+ //# sourceMappingURL=AcDbLibreDwgMainThreadConverter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AcDbLibreDwgMainThreadConverter.d.ts","sourceRoot":"","sources":["../src/AcDbLibreDwgMainThreadConverter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,2BAA2B,EAC3B,qBAAqB,EACtB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAE1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAG/D;;;;;;;;;GASG;AACH,qBAAa,+BAAgC,SAAQ,qBAAqB;gBAC5D,MAAM,GAAE,2BAAgC;cAK3B,KAAK,CAC5B,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;CAO/C"}
@@ -0,0 +1,102 @@
1
+ var __extends = (this && this.__extends) || (function () {
2
+ var extendStatics = function (d, b) {
3
+ extendStatics = Object.setPrototypeOf ||
4
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
5
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
6
+ return extendStatics(d, b);
7
+ };
8
+ return function (d, b) {
9
+ if (typeof b !== "function" && b !== null)
10
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
11
+ extendStatics(d, b);
12
+ function __() { this.constructor = d; }
13
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
14
+ };
15
+ })();
16
+ var __assign = (this && this.__assign) || function () {
17
+ __assign = Object.assign || function(t) {
18
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
19
+ s = arguments[i];
20
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
21
+ t[p] = s[p];
22
+ }
23
+ return t;
24
+ };
25
+ return __assign.apply(this, arguments);
26
+ };
27
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
28
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
29
+ return new (P || (P = Promise))(function (resolve, reject) {
30
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
31
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
32
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
33
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
34
+ });
35
+ };
36
+ var __generator = (this && this.__generator) || function (thisArg, body) {
37
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
38
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
39
+ function verb(n) { return function (v) { return step([n, v]); }; }
40
+ function step(op) {
41
+ if (f) throw new TypeError("Generator is already executing.");
42
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
43
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
44
+ if (y = 0, t) op = [op[0] & 2, t.value];
45
+ switch (op[0]) {
46
+ case 0: case 1: t = op; break;
47
+ case 4: _.label++; return { value: op[1], done: false };
48
+ case 5: _.label++; y = op[1]; op = [0]; continue;
49
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
50
+ default:
51
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
52
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
53
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
54
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
55
+ if (t[2]) _.ops.pop();
56
+ _.trys.pop(); continue;
57
+ }
58
+ op = body.call(thisArg, _);
59
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
60
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
61
+ }
62
+ };
63
+ import { AcDbLibreDwgConverter } from './AcDbLibreDwgConverter';
64
+ import { parseDwg } from './AcDbLibreDwgConverterUtil';
65
+ /**
66
+ * LibreDWG converter that parses on the current thread (no Web Worker).
67
+ *
68
+ * Intended for Node and other environments without a reliable worker + WASM
69
+ * loader. Shares {@link parseDwg} with the browser worker, including the
70
+ * classic `previewAddress` thumbnail fallback.
71
+ *
72
+ * Import from `@mlightcad/libredwg-converter/node` so the browser UMD bundle
73
+ * stays free of LibreDWG WASM.
74
+ */
75
+ var AcDbLibreDwgMainThreadConverter = /** @class */ (function (_super) {
76
+ __extends(AcDbLibreDwgMainThreadConverter, _super);
77
+ function AcDbLibreDwgMainThreadConverter(config) {
78
+ if (config === void 0) { config = {}; }
79
+ var _this = _super.call(this, __assign(__assign({}, config), { useWorker: false })) || this;
80
+ _this.config.useWorker = false;
81
+ return _this;
82
+ }
83
+ AcDbLibreDwgMainThreadConverter.prototype.parse = function (data) {
84
+ return __awaiter(this, void 0, void 0, function () {
85
+ var parsed;
86
+ return __generator(this, function (_a) {
87
+ switch (_a.label) {
88
+ case 0: return [4 /*yield*/, parseDwg(data)];
89
+ case 1:
90
+ parsed = _a.sent();
91
+ return [2 /*return*/, {
92
+ model: parsed.database,
93
+ data: parsed.stats
94
+ }];
95
+ }
96
+ });
97
+ });
98
+ };
99
+ return AcDbLibreDwgMainThreadConverter;
100
+ }(AcDbLibreDwgConverter));
101
+ export { AcDbLibreDwgMainThreadConverter };
102
+ //# sourceMappingURL=AcDbLibreDwgMainThreadConverter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AcDbLibreDwgMainThreadConverter.js","sourceRoot":"","sources":["../src/AcDbLibreDwgMainThreadConverter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAEtD;;;;;;;;;GASG;AACH;IAAqD,mDAAqB;IACxE,yCAAY,MAAwC;QAAxC,uBAAA,EAAA,WAAwC;QAClD,YAAA,MAAK,kCAAM,MAAM,KAAE,SAAS,EAAE,KAAK,IAAG,SAAA;QACtC,KAAI,CAAC,MAAM,CAAC,SAAS,GAAG,KAAK,CAAA;;IAC/B,CAAC;IAEwB,+CAAK,GAA9B,UACE,IAAiB;;;;;4BAEF,qBAAM,QAAQ,CAAC,IAAI,CAAC,EAAA;;wBAA7B,MAAM,GAAG,SAAoB;wBACnC,sBAAO;gCACL,KAAK,EAAE,MAAM,CAAC,QAAQ;gCACtB,IAAI,EAAE,MAAM,CAAC,KAAK;6BACnB,EAAA;;;;KACF;IACH,sCAAC;AAAD,CAAC,AAfD,CAAqD,qBAAqB,GAezE"}
@@ -60,12 +60,12 @@ var AcDbDwgParserWorker = /** @class */ (function (_super) {
60
60
  function AcDbDwgParserWorker() {
61
61
  return _super !== null && _super.apply(this, arguments) || this;
62
62
  }
63
- AcDbDwgParserWorker.prototype.executeTask = function (dxfString) {
63
+ AcDbDwgParserWorker.prototype.executeTask = function (data) {
64
64
  return __awaiter(this, void 0, void 0, function () {
65
65
  var result;
66
66
  return __generator(this, function (_a) {
67
67
  switch (_a.label) {
68
- case 0: return [4 /*yield*/, parseDwg(dxfString)];
68
+ case 0: return [4 /*yield*/, parseDwg(data)];
69
69
  case 1:
70
70
  result = _a.sent();
71
71
  return [2 /*return*/, {
@@ -1 +1 @@
1
- {"version":3,"file":"AcDbLibreDwgParserWorker.js","sourceRoot":"","sources":["../src/AcDbLibreDwgParserWorker.ts"],"names":[],"mappings":"AAAA,iCAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEjC,OAAO,EAAE,cAAc,EAAyB,MAAM,uBAAuB,CAAA;AAG7E,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AACtD;;GAEG;AACH;IAAkC,uCAGjC;IAHD;;IAWA,CAAC;IAPiB,yCAAW,GAA3B,UAA4B,SAAiB;;;;;4BAC5B,qBAAM,QAAQ,CAAC,SAAS,CAAC,EAAA;;wBAAlC,MAAM,GAAG,SAAyB;wBACxC,sBAAO;gCACL,KAAK,EAAE,MAAM,CAAC,QAAQ;gCACtB,IAAI,EAAE,MAAM,CAAC,KAAK;6BACnB,EAAA;;;;KACF;IACH,0BAAC;AAAD,CAAC,AAXD,CAAkC,cAAc,GAW/C;AAED,wBAAwB;AACxB,IAAI,mBAAmB,EAAE,CAAA"}
1
+ {"version":3,"file":"AcDbLibreDwgParserWorker.js","sourceRoot":"","sources":["../src/AcDbLibreDwgParserWorker.ts"],"names":[],"mappings":"AAAA,iCAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEjC,OAAO,EAAE,cAAc,EAAyB,MAAM,uBAAuB,CAAA;AAG7E,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AACtD;;GAEG;AACH;IAAkC,uCAGjC;IAHD;;IAWA,CAAC;IAPiB,yCAAW,GAA3B,UAA4B,IAAiB;;;;;4BAC5B,qBAAM,QAAQ,CAAC,IAAI,CAAC,EAAA;;wBAA7B,MAAM,GAAG,SAAoB;wBACnC,sBAAO;gCACL,KAAK,EAAE,MAAM,CAAC,QAAQ;gCACtB,IAAI,EAAE,MAAM,CAAC,KAAK;6BACnB,EAAA;;;;KACF;IACH,0BAAC;AAAD,CAAC,AAXD,CAAkC,cAAc,GAW/C;AAED,wBAAwB;AACxB,IAAI,mBAAmB,EAAE,CAAA"}
@@ -0,0 +1,24 @@
1
+ import type { DwgDatabase } from '@mlightcad/libredwg-web';
2
+ /**
3
+ * Extracts a drawing-level BMP/PNG thumbnail from raw DWG bytes.
4
+ *
5
+ * LibreDWG's `dwg_bmp` misses some files (notably AC1021 drawings that still
6
+ * store the classic header `previewAddress` image). This helper reads that
7
+ * layout so {@link DwgDatabase.thumbnailImage} can be filled when LibreDWG
8
+ * leaves it empty.
9
+ *
10
+ * Preview payloads are usually headerless DIBs (`biSize === 40`), not full BMP
11
+ * files — callers should run them through `acdbThumbnailImageToDataUrl` / a BMP
12
+ * decoder that accepts DIBs.
13
+ *
14
+ * When both BMP (code 2) and PNG (code 6) entries exist, PNG is preferred.
15
+ *
16
+ * @returns Thumbnail bytes (bmp/png entry), or `undefined` when none exist.
17
+ */
18
+ export declare function acdbExtractDwgThumbnailImage(fileBytes: Uint8Array): Uint8Array | undefined;
19
+ /**
20
+ * Ensures {@link DwgDatabase.thumbnailImage} is populated when LibreDWG's
21
+ * `dwg_bmp` / `convert` left it empty but the DWG file still embeds a preview.
22
+ */
23
+ export declare function acdbEnsureDwgThumbnailImage(model: DwgDatabase, fileBytes: Uint8Array): void;
24
+ //# sourceMappingURL=extractDwgThumbnailImage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractDwgThumbnailImage.d.ts","sourceRoot":"","sources":["../src/extractDwgThumbnailImage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAU1D;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,UAAU,GACpB,UAAU,GAAG,SAAS,CAuBxB;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,UAAU,GACpB,IAAI,CAMN"}
@@ -0,0 +1,157 @@
1
+ var __values = (this && this.__values) || function(o) {
2
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
3
+ if (m) return m.call(o);
4
+ if (o && typeof o.length === "number") return {
5
+ next: function () {
6
+ if (o && i >= o.length) o = void 0;
7
+ return { value: o && o[i++], done: !o };
8
+ }
9
+ };
10
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
11
+ };
12
+ /**
13
+ * Preview section start sentinel (Open Design Spec / AutoCAD DWG).
14
+ */
15
+ var PREVIEW_START_SENTINEL = new Uint8Array([
16
+ 0x1f, 0x25, 0x6d, 0x07, 0xd4, 0x36, 0x28, 0x28, 0x9d, 0x57, 0xca, 0x3f, 0x9d,
17
+ 0x44, 0x10, 0x2b
18
+ ]);
19
+ /**
20
+ * Extracts a drawing-level BMP/PNG thumbnail from raw DWG bytes.
21
+ *
22
+ * LibreDWG's `dwg_bmp` misses some files (notably AC1021 drawings that still
23
+ * store the classic header `previewAddress` image). This helper reads that
24
+ * layout so {@link DwgDatabase.thumbnailImage} can be filled when LibreDWG
25
+ * leaves it empty.
26
+ *
27
+ * Preview payloads are usually headerless DIBs (`biSize === 40`), not full BMP
28
+ * files — callers should run them through `acdbThumbnailImageToDataUrl` / a BMP
29
+ * decoder that accepts DIBs.
30
+ *
31
+ * When both BMP (code 2) and PNG (code 6) entries exist, PNG is preferred.
32
+ *
33
+ * @returns Thumbnail bytes (bmp/png entry), or `undefined` when none exist.
34
+ */
35
+ export function acdbExtractDwgThumbnailImage(fileBytes) {
36
+ if (fileBytes.length < 0x11)
37
+ return undefined;
38
+ var previewAddress = new DataView(fileBytes.buffer, fileBytes.byteOffset, fileBytes.byteLength).getUint32(0x0d, true);
39
+ var fromAddress = tryParsePreviewAt(fileBytes, previewAddress);
40
+ if (fromAddress)
41
+ return fromAddress;
42
+ // Some writers leave previewAddress stale; fall back to a sentinel scan near
43
+ // the start of the file (preview blocks are typically early).
44
+ var scanLimit = Math.min(fileBytes.length, 1024 * 1024);
45
+ for (var i = 0; i + PREVIEW_START_SENTINEL.length <= scanLimit; i++) {
46
+ if (!bytesEqualAt(fileBytes, i, PREVIEW_START_SENTINEL))
47
+ continue;
48
+ if (i === previewAddress)
49
+ continue;
50
+ var fromScan = tryParsePreviewAt(fileBytes, i);
51
+ if (fromScan)
52
+ return fromScan;
53
+ }
54
+ return undefined;
55
+ }
56
+ /**
57
+ * Ensures {@link DwgDatabase.thumbnailImage} is populated when LibreDWG's
58
+ * `dwg_bmp` / `convert` left it empty but the DWG file still embeds a preview.
59
+ */
60
+ export function acdbEnsureDwgThumbnailImage(model, fileBytes) {
61
+ var _a;
62
+ if ((_a = model.thumbnailImage) === null || _a === void 0 ? void 0 : _a.length)
63
+ return;
64
+ var extracted = acdbExtractDwgThumbnailImage(fileBytes);
65
+ if (extracted === null || extracted === void 0 ? void 0 : extracted.length) {
66
+ model.thumbnailImage = extracted;
67
+ }
68
+ }
69
+ function tryParsePreviewAt(fileBytes, offset) {
70
+ if (offset <= 0 || offset >= fileBytes.length)
71
+ return undefined;
72
+ if (!bytesEqualAt(fileBytes, offset, PREVIEW_START_SENTINEL))
73
+ return undefined;
74
+ var pos = offset + PREVIEW_START_SENTINEL.length;
75
+ if (pos + 5 > fileBytes.length)
76
+ return undefined;
77
+ var view = new DataView(fileBytes.buffer, fileBytes.byteOffset, fileBytes.byteLength);
78
+ // overallSize is recorded but not required to locate entries — truncated
79
+ // writers sometimes disagree with the real byte length.
80
+ view.getInt32(pos, true);
81
+ pos += 4;
82
+ var imageCount = fileBytes[pos];
83
+ pos += 1;
84
+ if (imageCount <= 0 || imageCount > 16)
85
+ return undefined;
86
+ var descriptors = [];
87
+ for (var i = 0; i < imageCount; i++) {
88
+ if (pos + 9 > fileBytes.length)
89
+ return undefined;
90
+ var code = fileBytes[pos];
91
+ pos += 1;
92
+ // Absolute file offset historically; some writers stream payloads
93
+ // sequentially after the descriptor table instead.
94
+ var start = view.getInt32(pos, true);
95
+ pos += 4;
96
+ var size = view.getInt32(pos, true);
97
+ pos += 4;
98
+ descriptors.push({ code: code, start: start, size: size });
99
+ }
100
+ var payloadStart = pos;
101
+ // Prefer absolute file offsets from the descriptor table (classic ODA layout).
102
+ var fromAbsolute = pickBmpOrPng(fileBytes, descriptors, 'absolute');
103
+ if (fromAbsolute)
104
+ return fromAbsolute;
105
+ // Some writers leave start offsets unset and stream payloads right after the
106
+ // descriptor table; walk them in order as a fallback.
107
+ return pickBmpOrPng(fileBytes, descriptors, 'sequential', payloadStart);
108
+ }
109
+ function pickBmpOrPng(fileBytes, descriptors, mode, sequentialPos) {
110
+ var e_1, _a;
111
+ if (sequentialPos === void 0) { sequentialPos = 0; }
112
+ var bmp;
113
+ var pos = sequentialPos;
114
+ try {
115
+ for (var descriptors_1 = __values(descriptors), descriptors_1_1 = descriptors_1.next(); !descriptors_1_1.done; descriptors_1_1 = descriptors_1.next()) {
116
+ var descriptor = descriptors_1_1.value;
117
+ var start = mode === 'absolute' ? descriptor.start : pos;
118
+ if (mode === 'sequential')
119
+ pos += Math.max(0, descriptor.size);
120
+ // code 1 = header descriptor, 2 = BMP/DIB, 3 = WMF, 6 = PNG
121
+ if (descriptor.code !== 2 && descriptor.code !== 6)
122
+ continue;
123
+ var data = sliceAt(fileBytes, start, descriptor.size);
124
+ if (!(data === null || data === void 0 ? void 0 : data.length))
125
+ continue;
126
+ if (descriptor.code === 6)
127
+ return data.slice();
128
+ if (!bmp)
129
+ bmp = data.slice();
130
+ }
131
+ }
132
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
133
+ finally {
134
+ try {
135
+ if (descriptors_1_1 && !descriptors_1_1.done && (_a = descriptors_1.return)) _a.call(descriptors_1);
136
+ }
137
+ finally { if (e_1) throw e_1.error; }
138
+ }
139
+ return bmp;
140
+ }
141
+ function sliceAt(fileBytes, start, size) {
142
+ if (start < 0 || size <= 0)
143
+ return undefined;
144
+ if (start + size > fileBytes.length)
145
+ return undefined;
146
+ return fileBytes.subarray(start, start + size);
147
+ }
148
+ function bytesEqualAt(haystack, offset, needle) {
149
+ if (offset + needle.length > haystack.length)
150
+ return false;
151
+ for (var i = 0; i < needle.length; i++) {
152
+ if (haystack[offset + i] !== needle[i])
153
+ return false;
154
+ }
155
+ return true;
156
+ }
157
+ //# sourceMappingURL=extractDwgThumbnailImage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractDwgThumbnailImage.js","sourceRoot":"","sources":["../src/extractDwgThumbnailImage.ts"],"names":[],"mappings":"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"}
package/lib/node.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export { AcDbLibreDwgMainThreadConverter } from './AcDbLibreDwgMainThreadConverter';
2
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAA"}
package/lib/node.js ADDED
@@ -0,0 +1,2 @@
1
+ export { AcDbLibreDwgMainThreadConverter } from './AcDbLibreDwgMainThreadConverter';
2
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mlightcad/libredwg-converter",
3
- "version": "3.15.12",
3
+ "version": "3.15.13",
4
4
  "license": "GPL-3.0",
5
5
  "type": "module",
6
6
  "repository": {
@@ -31,19 +31,25 @@
31
31
  "module": "./lib/index.js",
32
32
  "types": "./lib/index.d.ts",
33
33
  "exports": {
34
- "types": "./lib/index.d.ts",
35
- "import": "./lib/index.js",
36
- "require": "./dist/libredwg-converter.umd.cjs"
34
+ ".": {
35
+ "types": "./lib/index.d.ts",
36
+ "import": "./lib/index.js",
37
+ "require": "./dist/libredwg-converter.umd.cjs"
38
+ },
39
+ "./node": {
40
+ "types": "./lib/node.d.ts",
41
+ "import": "./lib/node.js"
42
+ }
37
43
  },
38
44
  "dependencies": {
39
45
  "@mlightcad/libredwg-web": "^0.8.1"
40
46
  },
41
47
  "devDependencies": {
42
48
  "vite": "^6.4.3",
43
- "@mlightcad/data-model": "1.15.12"
49
+ "@mlightcad/data-model": "1.15.13"
44
50
  },
45
51
  "peerDependencies": {
46
- "@mlightcad/data-model": "1.15.12"
52
+ "@mlightcad/data-model": "1.15.13"
47
53
  },
48
54
  "scripts": {
49
55
  "analyze": "pnpm run analyze:lib && pnpm run analyze:worker",