Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upgrade TypeScript and drop DOM global types #148

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 29 additions & 7 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
"ts-jest": "^26.1.1",
"ts-loader": "^5.2.2",
"tslint": "^5.18.0",
"typescript": "^3.9.5"
"typescript": "^4.5.5"
},
"repository": {
"type": "git",
Expand Down
11 changes: 2 additions & 9 deletions src/ClipboardItem/ClipboardItemPolyfill.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,6 @@
import { stringToBlob } from "./convert";
import {
ClipboardItemConstructor,
ClipboardItemDataType,
ClipboardItemInterface,
ClipboardItemOptions,
PresentationStyle,
} from "./spec";

export class ClipboardItemPolyfillImpl implements ClipboardItemInterface {
export class ClipboardItemPolyfillImpl implements ClipboardItem {
public readonly types: string[];
public readonly presentationStyle: PresentationStyle;
// We use an underscore to suggest that this field is private. We could
Expand Down Expand Up @@ -43,4 +36,4 @@ export class ClipboardItemPolyfillImpl implements ClipboardItemInterface {
}
}

export const ClipboardItemPolyfill: ClipboardItemConstructor = ClipboardItemPolyfillImpl;
export const ClipboardItemPolyfill: typeof ClipboardItem = ClipboardItemPolyfillImpl;
4 changes: 1 addition & 3 deletions src/ClipboardItem/check.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import { ClipboardItemInterface } from "./spec";

export function hasItemWithType(
clipboardItems: ClipboardItemInterface[],
clipboardItems: ClipboardItems,
typeName: string
): boolean {
for (const item of clipboardItems) {
Expand Down
16 changes: 5 additions & 11 deletions src/ClipboardItem/convert.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { ClipboardItemPolyfill } from "./ClipboardItemPolyfill";
import { TEXT_PLAIN } from "./data-types";
import { ClipboardItemInterface, ClipboardItemOptions } from "./spec";
import { originalWindowClipboardItem } from "../globals";

export function stringToBlob(type: string, str: string): Blob {
Expand All @@ -25,8 +24,8 @@ export async function blobToString(blob: Blob): Promise<string> {
}

export async function clipboardItemToGlobalClipboardItem(
clipboardItem: ClipboardItemInterface
): Promise<ClipboardItemInterface> {
clipboardItem: ClipboardItem
): Promise<ClipboardItem> {
// Note that we use `Blob` instead of `ClipboardItemDataType`. This is because
// Chrome 83 can only accept `Blob` (not `string`). The return value of
// `getType()` is already `Blob` per the spec, so this is simple for us.
Expand All @@ -35,20 +34,17 @@ export async function clipboardItemToGlobalClipboardItem(
items[type] = await clipboardItem.getType(type);
}
const options: ClipboardItemOptions = {};
if (clipboardItem.presentationStyle) {
options.presentationStyle = clipboardItem.presentationStyle;
}
return new originalWindowClipboardItem!(items, options);
}

export function textToClipboardItem(text: string): ClipboardItemInterface {
export function textToClipboardItem(text: string): ClipboardItem {
const items: { [type: string]: Blob } = {};
items[TEXT_PLAIN] = stringToBlob(text, TEXT_PLAIN);
return new ClipboardItemPolyfill(items);
}

export async function getTypeAsString(
clipboardItem: ClipboardItemInterface,
clipboardItem: ClipboardItem,
type: string
): Promise<string> {
const text: Blob = await clipboardItem.getType(type);
Expand All @@ -59,9 +55,7 @@ export interface StringItem {
[type: string]: string;
}

export async function toStringItem(
data: ClipboardItemInterface
): Promise<StringItem> {
export async function toStringItem(data: ClipboardItem): Promise<StringItem> {
const items: StringItem = {};
for (const type of data.types) {
items[type] = await getTypeAsString(data, type);
Expand Down
64 changes: 0 additions & 64 deletions src/ClipboardItem/spec.ts

This file was deleted.

13 changes: 2 additions & 11 deletions src/globals.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,9 @@
// it probably saves code), and 2) just in case an unknown/future implementation
// allows overwriting `navigator.clipboard` like this.

import {
ClipboardItemConstructor,
Clipboard,
ClipboardItems,
} from "./ClipboardItem/spec";

const originalNavigator =
typeof navigator === "undefined" ? undefined : navigator;
const originalNavigatorClipboard:
| Clipboard
| undefined = originalNavigator?.clipboard as any;
const originalNavigatorClipboard = originalNavigator?.clipboard;
export const originalNavigatorClipboardRead:
| (() => Promise<ClipboardItems>)
| undefined = originalNavigatorClipboard?.read?.bind(
Expand All @@ -51,5 +43,4 @@ export const originalNavigatorClipboardWriteText:
// The spec specifies that this goes on `window`, not e.g. `globalThis`. It's not (currently) available in workers.
export const originalWindow =
typeof window === "undefined" ? undefined : window;
export const originalWindowClipboardItem: ClipboardItemConstructor | undefined =
originalWindow?.ClipboardItem;
export const originalWindowClipboardItem = originalWindow?.ClipboardItem;
7 changes: 3 additions & 4 deletions src/implementations/blob.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,20 @@
import { hasItemWithType } from "../ClipboardItem/check";
import { clipboardItemToGlobalClipboardItem, toStringItem, textToClipboardItem } from "../ClipboardItem/convert";
import { TEXT_HTML, TEXT_PLAIN } from "../ClipboardItem/data-types";
import { ClipboardItemInterface, ClipboardItems } from "../ClipboardItem/spec";
import { debugLog, shouldShowWarnings } from "../debug";
import { originalNavigatorClipboardRead, originalNavigatorClipboardWrite, originalWindowClipboardItem } from "../globals";
import { readText } from "./text";
import { writeFallback } from "./write-fallback";

export async function write(data: ClipboardItemInterface[]): Promise<void> {
export async function write(data: ClipboardItems): Promise<void> {
// Use the browser implementation if it exists.
// TODO: detect `text/html`.
if (
originalNavigatorClipboardWrite &&
originalWindowClipboardItem
) {
debugLog("Using `navigator.clipboard.write()`.");
const globalClipboardItems: ClipboardItemInterface[] = await Promise.all(
const globalClipboardItems: ClipboardItems = await Promise.all(
data.map(clipboardItemToGlobalClipboardItem)
);
try {
Expand All @@ -31,7 +30,7 @@ export async function write(data: ClipboardItemInterface[]): Promise<void> {
}

const hasTextPlain = hasItemWithType(data, TEXT_PLAIN);
if (shouldShowWarnings && !hasTextPlain) {
if (shouldShowWarnings() && !hasTextPlain) {
debugLog(
"clipboard.write() was called without a " +
"`text/plain` data type. On some platforms, this may result in an " +
Expand Down
10 changes: 0 additions & 10 deletions src/targets/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,3 @@ export { writeText, readText } from "../implementations/text";
export { write, read } from "../implementations/blob";
export { setDebugLog, suppressWarnings } from "../debug";
export { ClipboardItemPolyfill as ClipboardItem } from "../ClipboardItem/ClipboardItemPolyfill";
export type {
ClipboardItems,
ClipboardItemData,
ClipboardItemConstructor,
ClipboardItemDataType,
ClipboardItemDelayedCallback,
ClipboardItemInterface,
PresentationStyle,
ClipboardItemOptions,
} from "../ClipboardItem/spec";
12 changes: 0 additions & 12 deletions src/targets/overwrite-globals.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,8 @@
import { readText, writeText } from "../implementations/text";
import { read, write } from "../implementations/blob";
import { ClipboardItemPolyfill } from "../ClipboardItem/ClipboardItemPolyfill";
import {
Clipboard as ClipboardInterface,
ClipboardItemConstructor,
} from "../ClipboardItem/spec";
import "../globals";

declare global {
const ClipboardItem: ClipboardItemConstructor;
interface Window {
ClipboardItem: ClipboardItemConstructor;
}
interface Clipboard extends ClipboardInterface {}
}

// Create the `navigator.clipboard` object if it doesn't exist.
if (!navigator.clipboard) {
(navigator as any).clipboard = {};
Expand Down