lave
lave copied to clipboard
Lave generates invalid JS
Example:
const path = require("path");
const fs = require("fs");
const pdfjs = require("pdfjs-dist/legacy/build/pdf.js");
const lave = require("lave");
const { generate } = require("escodegen");
async function go() {
const pdf = fs.readFileSync(path.join(__dirname, "sample.pdf"));
const docTask = pdfjs.getDocument(pdf);
const doc = await docTask.promise;
const firstPage = await doc.getPage(1);
const viewport = firstPage.getViewport();
const proto = Object.getPrototypeOf(viewport);
const classCode = lave(proto, { generate, format: "module" });
const DIR = `tests/generated`;
fs.mkdirSync(DIR, { recursive: true });
if (!fs.existsSync(DIR)) {
fs.mkdirSync(DIR, { recursive: true });
}
fs.writeFileSync(path.join(DIR, "mock_viewport.js"), classCode);
}
go();
will generate invalid JS.
Specifically, we get (error on last 2 lines):
var a = {
'constructor': function PageViewport(_ref2) {
var viewBox = _ref2.viewBox,
scale = _ref2.scale,
rotation = _ref2.rotation,
_ref2$offsetX = _ref2.offsetX,
offsetX = _ref2$offsetX === void 0 ? 0 : _ref2$offsetX,
_ref2$offsetY = _ref2.offsetY,
offsetY = _ref2$offsetY === void 0 ? 0 : _ref2$offsetY,
_ref2$dontFlip = _ref2.dontFlip,
dontFlip = _ref2$dontFlip === void 0 ? false : _ref2$dontFlip;
_classCallCheck(this, PageViewport);
this.viewBox = viewBox;
this.scale = scale;
this.rotation = rotation;
this.offsetX = offsetX;
this.offsetY = offsetY;
var centerX = (viewBox[2] + viewBox[0]) / 2;
var centerY = (viewBox[3] + viewBox[1]) / 2;
var rotateA, rotateB, rotateC, rotateD;
rotation %= 360;
if (rotation < 0) {
rotation += 360;
}
switch (rotation) {
case 180:
rotateA = -1;
rotateB = 0;
rotateC = 0;
rotateD = 1;
break;
case 90:
rotateA = 0;
rotateB = 1;
rotateC = 1;
rotateD = 0;
break;
case 270:
rotateA = 0;
rotateB = -1;
rotateC = -1;
rotateD = 0;
break;
case 0:
rotateA = 1;
rotateB = 0;
rotateC = 0;
rotateD = -1;
break;
default:
throw new Error("PageViewport: Invalid rotation, must be a multiple of 90 degrees.");
}
if (dontFlip) {
rotateC = -rotateC;
rotateD = -rotateD;
}
var offsetCanvasX, offsetCanvasY;
var width, height;
if (rotateA === 0) {
offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;
offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;
width = Math.abs(viewBox[3] - viewBox[1]) * scale;
height = Math.abs(viewBox[2] - viewBox[0]) * scale;
} else {
offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;
offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;
width = Math.abs(viewBox[2] - viewBox[0]) * scale;
height = Math.abs(viewBox[3] - viewBox[1]) * scale;
}
this.transform = [rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY];
this.width = width;
this.height = height;
},
'clone': function clone() {
var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref3$scale = _ref3.scale,
scale = _ref3$scale === void 0 ? this.scale : _ref3$scale,
_ref3$rotation = _ref3.rotation,
rotation = _ref3$rotation === void 0 ? this.rotation : _ref3$rotation,
_ref3$offsetX = _ref3.offsetX,
offsetX = _ref3$offsetX === void 0 ? this.offsetX : _ref3$offsetX,
_ref3$offsetY = _ref3.offsetY,
offsetY = _ref3$offsetY === void 0 ? this.offsetY : _ref3$offsetY,
_ref3$dontFlip = _ref3.dontFlip,
dontFlip = _ref3$dontFlip === void 0 ? false : _ref3$dontFlip;
return new PageViewport({
viewBox: this.viewBox.slice(),
scale: scale,
rotation: rotation,
offsetX: offsetX,
offsetY: offsetY,
dontFlip: dontFlip
});
},
'convertToViewportPoint': function convertToViewportPoint(x, y) {
return _util.Util.applyTransform([x, y], this.transform);
},
'convertToViewportRectangle': function convertToViewportRectangle(rect) {
var topLeft = _util.Util.applyTransform([rect[0], rect[1]], this.transform);
var bottomRight = _util.Util.applyTransform([rect[2], rect[3]], this.transform);
return [topLeft[0], topLeft[1], bottomRight[0], bottomRight[1]];
},
'convertToPdfPoint': function convertToPdfPoint(x, y) {
return _util.Util.applyInverseTransform([x, y], this.transform);
}
};
function PageViewport(_ref2) {
var viewBox = _ref2.viewBox,
scale = _ref2.scale,
rotation = _ref2.rotation,
_ref2$offsetX = _ref2.offsetX,
offsetX = _ref2$offsetX === void 0 ? 0 : _ref2$offsetX,
_ref2$offsetY = _ref2.offsetY,
offsetY = _ref2$offsetY === void 0 ? 0 : _ref2$offsetY,
_ref2$dontFlip = _ref2.dontFlip,
dontFlip = _ref2$dontFlip === void 0 ? false : _ref2$dontFlip;
_classCallCheck(this, PageViewport);
this.viewBox = viewBox;
this.scale = scale;
this.rotation = rotation;
this.offsetX = offsetX;
this.offsetY = offsetY;
var centerX = (viewBox[2] + viewBox[0]) / 2;
var centerY = (viewBox[3] + viewBox[1]) / 2;
var rotateA, rotateB, rotateC, rotateD;
rotation %= 360;
if (rotation < 0) {
rotation += 360;
}
switch (rotation) {
case 180:
rotateA = -1;
rotateB = 0;
rotateC = 0;
rotateD = 1;
break;
case 90:
rotateA = 0;
rotateB = 1;
rotateC = 1;
rotateD = 0;
break;
case 270:
rotateA = 0;
rotateB = -1;
rotateC = -1;
rotateD = 0;
break;
case 0:
rotateA = 1;
rotateB = 0;
rotateC = 0;
rotateD = -1;
break;
default:
throw new Error("PageViewport: Invalid rotation, must be a multiple of 90 degrees.");
}
if (dontFlip) {
rotateC = -rotateC;
rotateD = -rotateD;
}
var offsetCanvasX, offsetCanvasY;
var width, height;
if (rotateA === 0) {
offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;
offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;
width = Math.abs(viewBox[3] - viewBox[1]) * scale;
height = Math.abs(viewBox[2] - viewBox[0]) * scale;
} else {
offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;
offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;
width = Math.abs(viewBox[2] - viewBox[0]) * scale;
height = Math.abs(viewBox[3] - viewBox[1]) * scale;
}
this.transform = [rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY];
this.width = width;
this.height = height;
}.prototype = a;
export default a;