From c08b4ea30df4491edadc129d5a2a1abb0fe4d798 Mon Sep 17 00:00:00 2001 From: Michael Wu Date: Wed, 25 Aug 2021 18:44:06 -0400 Subject: [PATCH] Fix Viewer API definitions and include in CI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Viewer API definitions do not compile because of missing imports and anonymous objects are typed as `Object`. These issues were not caught during CI because the test project was not compiling anything from the Viewer API. As an example of the first problem: ``` /** * @implements MyInterface */ export class MyClass { ... } ``` will generate a broken definition that doesn’t import MyInterface: ``` /** * @implements MyInterface */ export class MyClass implements MyInterface { ... } ``` This can be fixed by adding a typedef jsdoc to specify the import: ``` /** @typedef {import("./otherFile").MyInterface} MyInterface */ ``` See https://github.com/jsdoc/jsdoc/issues/1537 and https://github.com/microsoft/TypeScript/issues/22160 for more details. As an example of the second problem: ``` /** * Gets the size of the specified page, converted from PDF units to inches. * @param {Object} An Object containing the properties: {Array} `view`, * {number} `userUnit`, and {number} `rotate`. */ function getPageSizeInches({ view, userUnit, rotate }) { ... } ``` generates the broken definition: ``` function getPageSizeInches({ view, userUnit, rotate }: Object) { ... } ``` The jsdoc should specify the type of each nested property: ``` /** * Gets the size of the specified page, converted from PDF units to inches. * @param {Object} options An object containing the properties: {Array} `view`, * {number} `userUnit`, and {number} `rotate`. * @param {number[]} options.view * @param {number} options.userUnit * @param {number} options.rotate */ ``` --- external/dist/legacy/web/pdf_viewer.d.ts | 2 +- external/dist/web/pdf_viewer.d.ts | 2 +- test/types/main.ts | 3 +++ test/types/tsconfig.json | 2 +- web/annotation_layer_builder.js | 3 +++ web/base_viewer.js | 1 - web/interfaces.js | 7 +++++-- web/pdf_link_service.js | 2 ++ web/pdf_page_view.js | 2 ++ web/pdf_rendering_queue.js | 1 + web/struct_tree_layer_builder.js | 3 +++ web/text_highlighter.js | 5 ++++- web/text_layer_builder.js | 3 +++ web/ui_utils.js | 19 +++++++++++++++---- web/xfa_layer_builder.js | 3 +++ 15 files changed, 47 insertions(+), 11 deletions(-) diff --git a/external/dist/legacy/web/pdf_viewer.d.ts b/external/dist/legacy/web/pdf_viewer.d.ts index b0c3f5376..68c686d1b 100644 --- a/external/dist/legacy/web/pdf_viewer.d.ts +++ b/external/dist/legacy/web/pdf_viewer.d.ts @@ -1 +1 @@ -export * from "pdfjs-dist/types/web/pdf_viewer.component"; +export * from "../../types/web/pdf_viewer.component"; diff --git a/external/dist/web/pdf_viewer.d.ts b/external/dist/web/pdf_viewer.d.ts index b0c3f5376..181142b65 100644 --- a/external/dist/web/pdf_viewer.d.ts +++ b/external/dist/web/pdf_viewer.d.ts @@ -1 +1 @@ -export * from "pdfjs-dist/types/web/pdf_viewer.component"; +export * from "../types/web/pdf_viewer.component"; diff --git a/test/types/main.ts b/test/types/main.ts index 816a4bef6..e7bc379af 100644 --- a/test/types/main.ts +++ b/test/types/main.ts @@ -1,9 +1,12 @@ import { getDocument } from "pdfjs-dist"; +import { EventBus } from "pdfjs-dist/web/pdf_viewer.component"; class MainTest { + eventBus: EventBus; task: ReturnType | undefined; constructor(public file: string) { + this.eventBus = new EventBus({}); } loadPdf() { diff --git a/test/types/tsconfig.json b/test/types/tsconfig.json index 7bcf3b383..2cae7886b 100644 --- a/test/types/tsconfig.json +++ b/test/types/tsconfig.json @@ -17,7 +17,7 @@ ], "paths": { "pdfjs-dist": ["../../build/typestest"], - "pdfjs-dist/*": ["../../build/typestest/build/*"] + "pdfjs-dist/*": ["../../build/typestest/types/*"] } }, "files": [ diff --git a/web/annotation_layer_builder.js b/web/annotation_layer_builder.js index 3c4e3c7d3..8579e5f86 100644 --- a/web/annotation_layer_builder.js +++ b/web/annotation_layer_builder.js @@ -13,6 +13,9 @@ * limitations under the License. */ +// eslint-disable-next-line max-len +/** @typedef {import("./interfaces").IPDFAnnotationLayerFactory} IPDFAnnotationLayerFactory */ + import { AnnotationLayer } from "pdfjs-lib"; import { NullL10n } from "./l10n_utils.js"; import { SimpleLinkService } from "./pdf_link_service.js"; diff --git a/web/base_viewer.js b/web/base_viewer.js index 81a9c7701..ecd42f44c 100644 --- a/web/base_viewer.js +++ b/web/base_viewer.js @@ -139,7 +139,6 @@ function isSameScale(oldScale, newScale) { /** * Simple viewer control to display PDF content/pages. - * @implements {IRenderableView} */ class BaseViewer { /** diff --git a/web/interfaces.js b/web/interfaces.js index 8fdb09773..b3315eee4 100644 --- a/web/interfaces.js +++ b/web/interfaces.js @@ -106,6 +106,11 @@ class IPDFLinkService { * @interface */ class IRenderableView { + constructor() { + /** @type {function | null} */ + this.resume = null; + } + /** * @type {string} - Unique ID for rendering queue. */ @@ -120,8 +125,6 @@ class IRenderableView { * @returns {Promise} Resolved on draw completion. */ draw() {} - - resume() {} } /** diff --git a/web/pdf_link_service.js b/web/pdf_link_service.js index 490e0116f..32109f183 100644 --- a/web/pdf_link_service.js +++ b/web/pdf_link_service.js @@ -13,6 +13,8 @@ * limitations under the License. */ +/** @typedef {import("./interfaces").IPDFLinkService} IPDFLinkService */ + import { parseQueryString } from "./ui_utils.js"; /** diff --git a/web/pdf_page_view.js b/web/pdf_page_view.js index 0b11a9456..05e9ea449 100644 --- a/web/pdf_page_view.js +++ b/web/pdf_page_view.js @@ -13,6 +13,8 @@ * limitations under the License. */ +/** @typedef {import("./interfaces").IRenderableView} IRenderableView */ + import { AnnotationMode, createPromiseCapability, diff --git a/web/pdf_rendering_queue.js b/web/pdf_rendering_queue.js index 5de17d084..7e96c9d2c 100644 --- a/web/pdf_rendering_queue.js +++ b/web/pdf_rendering_queue.js @@ -33,6 +33,7 @@ class PDFRenderingQueue { this.pdfThumbnailViewer = null; this.onIdle = null; this.highestPriorityPage = null; + /** @type {number} */ this.idleTimeout = null; this.printing = false; this.isThumbnailViewEnabled = false; diff --git a/web/struct_tree_layer_builder.js b/web/struct_tree_layer_builder.js index 86775d70e..047387b62 100644 --- a/web/struct_tree_layer_builder.js +++ b/web/struct_tree_layer_builder.js @@ -13,6 +13,9 @@ * limitations under the License. */ +// eslint-disable-next-line max-len +/** @typedef {import("./interfaces").IPDFStructTreeLayerFactory} IPDFStructTreeLayerFactory */ + const PDF_ROLE_TO_HTML_ROLE = { // Document level structure types Document: null, // There's a "document" role, but it doesn't make sense here. diff --git a/web/text_highlighter.js b/web/text_highlighter.js index 54b73540f..c8a3d729a 100644 --- a/web/text_highlighter.js +++ b/web/text_highlighter.js @@ -14,7 +14,7 @@ */ /** - * @typedef {Object} TextHighlighter + * @typedef {Object} TextHighlighterOptions * @property {PDFFindController} findController * @property {EventBus} eventBus - The application event bus. * @property {number} pageIndex - The page index. @@ -25,6 +25,9 @@ * either the text layer or XFA layer depending on the type of document. */ class TextHighlighter { + /** + * @param {TextHighlighterOptions} options + */ constructor({ findController, eventBus, pageIndex }) { this.findController = findController; this.matches = []; diff --git a/web/text_layer_builder.js b/web/text_layer_builder.js index 8f214c518..765b88419 100644 --- a/web/text_layer_builder.js +++ b/web/text_layer_builder.js @@ -13,6 +13,9 @@ * limitations under the License. */ +// eslint-disable-next-line max-len +/** @typedef {import("./interfaces").IPDFTextLayerFactory} IPDFTextLayerFactory */ + import { renderTextLayer } from "pdfjs-lib"; const EXPAND_DIVS_TIMEOUT = 300; // ms diff --git a/web/ui_utils.js b/web/ui_utils.js index ad8fde1c0..8f2f473f2 100644 --- a/web/ui_utils.js +++ b/web/ui_utils.js @@ -284,12 +284,23 @@ function roundToDivide(x, div) { return r === 0 ? x : Math.round(x - r + div); } +/** + * @typedef {Object} GetPageSizeInchesParameters + * @property {number[]} view + * @property {number} userUnit + * @property {number} rotate + */ + +/** + * @typedef {Object} PageSize + * @property {number} width - In inches. + * @property {number} height - In inches. + */ + /** * Gets the size of the specified page, converted from PDF units to inches. - * @param {Object} An Object containing the properties: {Array} `view`, - * {number} `userUnit`, and {number} `rotate`. - * @returns {Object} An Object containing the properties: {number} `width` - * and {number} `height`, given in inches. + * @param {GetPageSizeInchesParameters} params + * @returns {PageSize} */ function getPageSizeInches({ view, userUnit, rotate }) { const [x1, y1, x2, y2] = view; diff --git a/web/xfa_layer_builder.js b/web/xfa_layer_builder.js index 0edfe905c..0a53d6ba7 100644 --- a/web/xfa_layer_builder.js +++ b/web/xfa_layer_builder.js @@ -13,12 +13,15 @@ * limitations under the License. */ +/** @typedef {import("./interfaces").IPDFXfaLayerFactory} IPDFXfaLayerFactory */ + import { XfaLayer } from "pdfjs-lib"; /** * @typedef {Object} XfaLayerBuilderOptions * @property {HTMLDivElement} pageDiv * @property {PDFPage} pdfPage + * @property {Object} [xfaHtml] * @property {AnnotationStorage} [annotationStorage] */