mod2dom 1.1.0 → 1.2.0
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.
- package/Makefile +1 -1
- package/config/vitest.config.ts +11 -4
- package/dist/errors.d.ts +3 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +4 -0
- package/dist/errors.js.map +1 -1
- package/dist/validate.d.ts +1 -0
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +20 -0
- package/dist/validate.js.map +1 -1
- package/package.json +1 -1
- package/src/errors.ts +2 -0
- package/src/localServices/clipboard.ts +51 -11
- package/src/types.ts +1 -0
- package/src/utils/index.ts +7 -0
- package/src/validate.ts +22 -0
- package/tests/clipboard/simple.test.ts +61 -0
- package/tests/dom/error.test.ts +4 -4
- package/tests/dom/simple.test.ts +10 -0
- package/tsconfig.json +5 -1
package/Makefile
CHANGED
package/config/vitest.config.ts
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
|
-
import { defineConfig } from "vitest/config"
|
|
1
|
+
import { defineConfig } from "vitest/config";
|
|
2
|
+
import path from "path";
|
|
2
3
|
|
|
3
4
|
export default defineConfig({
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
resolve: {
|
|
6
|
+
alias: {
|
|
7
|
+
"@utils": path.resolve(__dirname, "../src/utils"),
|
|
8
|
+
},
|
|
9
|
+
},
|
|
10
|
+
|
|
11
|
+
test: {
|
|
12
|
+
environment: "jsdom",
|
|
13
|
+
},
|
|
7
14
|
});
|
package/dist/errors.d.ts
CHANGED
|
@@ -6,10 +6,13 @@ declare class InvalidTagName extends BadData {
|
|
|
6
6
|
}
|
|
7
7
|
declare class InvalidClassName extends BadData {
|
|
8
8
|
}
|
|
9
|
+
declare class InvalidElementName extends BadData {
|
|
10
|
+
}
|
|
9
11
|
export declare const mod2domErrors: Readonly<{
|
|
10
12
|
BadData: typeof BadData;
|
|
11
13
|
InvalidTagName: typeof InvalidTagName;
|
|
12
14
|
InvalidClassName: typeof InvalidClassName;
|
|
15
|
+
InvalidElementName: typeof InvalidElementName;
|
|
13
16
|
}>;
|
|
14
17
|
export {};
|
|
15
18
|
//# sourceMappingURL=errors.d.ts.map
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAa,SAAQ,KAAK;CAAG;AAE1C,cAAM,OAAQ,SAAQ,YAAY;CAAG;AACrC,cAAM,cAAe,SAAQ,OAAO;CAAG;AACvC,cAAM,gBAAiB,SAAQ,OAAO;CAAG;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAa,SAAQ,KAAK;CAAG;AAE1C,cAAM,OAAQ,SAAQ,YAAY;CAAG;AACrC,cAAM,cAAe,SAAQ,OAAO;CAAG;AACvC,cAAM,gBAAiB,SAAQ,OAAO;CAAG;AACzC,cAAM,kBAAmB,SAAQ,OAAO;CAAG;AAE3C,eAAO,MAAM,aAAa;;;;;EAKxB,CAAC"}
|
package/dist/errors.js
CHANGED
|
@@ -10,9 +10,13 @@ class InvalidTagName extends BadData {
|
|
|
10
10
|
class InvalidClassName extends BadData {
|
|
11
11
|
}
|
|
12
12
|
;
|
|
13
|
+
class InvalidElementName extends BadData {
|
|
14
|
+
}
|
|
15
|
+
;
|
|
13
16
|
export const mod2domErrors = Object.freeze({
|
|
14
17
|
BadData: BadData,
|
|
15
18
|
InvalidTagName: InvalidTagName,
|
|
16
19
|
InvalidClassName: InvalidClassName,
|
|
20
|
+
InvalidElementName: InvalidElementName,
|
|
17
21
|
});
|
|
18
22
|
//# sourceMappingURL=errors.js.map
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,YAAa,SAAQ,KAAK;CAAG;AAAA,CAAC;AAE3C,MAAM,OAAQ,SAAQ,YAAY;CAAG;AAAA,CAAC;AACtC,MAAM,cAAe,SAAQ,OAAO;CAAG;AAAA,CAAC;AACxC,MAAM,gBAAiB,SAAQ,OAAO;CAAG;AAAA,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,YAAa,SAAQ,KAAK;CAAG;AAAA,CAAC;AAE3C,MAAM,OAAQ,SAAQ,YAAY;CAAG;AAAA,CAAC;AACtC,MAAM,cAAe,SAAQ,OAAO;CAAG;AAAA,CAAC;AACxC,MAAM,gBAAiB,SAAQ,OAAO;CAAG;AAAA,CAAC;AAC1C,MAAM,kBAAmB,SAAQ,OAAO;CAAG;AAAA,CAAC;AAE5C,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;IACvC,OAAO,EAAE,OAAO;IAChB,cAAc,EAAE,cAAc;IAC9B,gBAAgB,EAAE,gBAAgB;IAClC,kBAAkB,EAAE,kBAAkB;CACzC,CAAC,CAAC"}
|
package/dist/validate.d.ts
CHANGED
package/dist/validate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAMA,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,QAY/C;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,QAY3C;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,QAY7C"}
|
package/dist/validate.js
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
import { mod2domErrors } from "./errors.js";
|
|
2
|
+
function isASCII(str) {
|
|
3
|
+
return /^[\x00-\x7F]*$/.test(str);
|
|
4
|
+
}
|
|
5
|
+
export function validateElementName(name) {
|
|
6
|
+
if (!isASCII(name))
|
|
7
|
+
throw new mod2domErrors.InvalidElementName(`Invalid element name (non-ASCII).`);
|
|
8
|
+
if (!name.trim())
|
|
9
|
+
throw new mod2domErrors.InvalidElementName(`Invalid element name (empty).`);
|
|
10
|
+
const invalid = name.match(/[/\\\s.#\[\]]/g);
|
|
11
|
+
if (invalid) {
|
|
12
|
+
throw new mod2domErrors.InvalidElementName(`Invalid element name: \`${name}\` (character: "${invalid[0]}")`);
|
|
13
|
+
}
|
|
14
|
+
let v;
|
|
15
|
+
if (v = name.match(/^[0-9]/))
|
|
16
|
+
throw new mod2domErrors.InvalidElementName(`Invalid element name: \`${name}\` (character: "${v}")`);
|
|
17
|
+
}
|
|
2
18
|
export function validateTagName(name) {
|
|
19
|
+
if (!isASCII(name))
|
|
20
|
+
throw new mod2domErrors.InvalidTagName(`Invalid tag name (non-ASCII).`);
|
|
3
21
|
if (!name.trim())
|
|
4
22
|
throw new mod2domErrors.InvalidTagName(`Invalid tag name (empty).`);
|
|
5
23
|
const invalid = name.match(/[/\\\s.#\[\]]/g);
|
|
@@ -11,6 +29,8 @@ export function validateTagName(name) {
|
|
|
11
29
|
throw new mod2domErrors.InvalidTagName(`Invalid tag name: \`${name}\` (character: "${v}")`);
|
|
12
30
|
}
|
|
13
31
|
export function validateClassName(name) {
|
|
32
|
+
if (!isASCII(name))
|
|
33
|
+
throw new mod2domErrors.InvalidTagName(`Invalid class name (non-ASCII).`);
|
|
14
34
|
if (!name.trim())
|
|
15
35
|
throw new mod2domErrors.InvalidTagName(`Invalid class name (empty).`);
|
|
16
36
|
const invalid = name.match(/[/\\\s.#\[\]]/g);
|
package/dist/validate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,UAAU,eAAe,CAAC,IAAY;IACxC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QACZ,MAAM,IAAI,aAAa,CAAC,cAAc,CAAC,2BAA2B,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC7C,IAAI,OAAO,EAAE,CAAC;QACV,MAAM,IAAI,aAAa,CAAC,cAAc,CAAC,uBAAuB,IAAI,mBAAmB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzG,CAAC;IACD,IAAI,CAAC,CAAC;IACN,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QACxB,MAAM,IAAI,aAAa,CAAC,cAAc,CAAC,uBAAuB,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC;AACpG,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC1C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QACZ,MAAM,IAAI,aAAa,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC7C,IAAI,OAAO,EAAE,CAAC;QACV,MAAM,IAAI,aAAa,CAAC,gBAAgB,CAAC,yBAAyB,IAAI,mBAAmB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7G,CAAC;IACD,IAAI,CAAC,CAAC;IACN,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QACxB,MAAM,IAAI,aAAa,CAAC,gBAAgB,CAAC,yBAAyB,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC;AACxG,CAAC"}
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,SAAS,OAAO,CAAC,GAAW;IACxB,OAAO,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC5C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QACd,MAAM,IAAI,aAAa,CAAC,kBAAkB,CAAC,mCAAmC,CAAC,CAAC;IACpF,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QACZ,MAAM,IAAI,aAAa,CAAC,kBAAkB,CAAC,+BAA+B,CAAC,CAAC;IAChF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC7C,IAAI,OAAO,EAAE,CAAC;QACV,MAAM,IAAI,aAAa,CAAC,kBAAkB,CAAC,2BAA2B,IAAI,mBAAmB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACjH,CAAC;IACD,IAAI,CAAC,CAAC;IACN,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QACxB,MAAM,IAAI,aAAa,CAAC,kBAAkB,CAAC,2BAA2B,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC;AAC5G,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IACxC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QACd,MAAM,IAAI,aAAa,CAAC,cAAc,CAAC,+BAA+B,CAAC,CAAC;IAC5E,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QACZ,MAAM,IAAI,aAAa,CAAC,cAAc,CAAC,2BAA2B,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC7C,IAAI,OAAO,EAAE,CAAC;QACV,MAAM,IAAI,aAAa,CAAC,cAAc,CAAC,uBAAuB,IAAI,mBAAmB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzG,CAAC;IACD,IAAI,CAAC,CAAC;IACN,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QACxB,MAAM,IAAI,aAAa,CAAC,cAAc,CAAC,uBAAuB,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC;AACpG,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC1C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QACd,MAAM,IAAI,aAAa,CAAC,cAAc,CAAC,iCAAiC,CAAC,CAAC;IAC9E,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QACZ,MAAM,IAAI,aAAa,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC7C,IAAI,OAAO,EAAE,CAAC;QACV,MAAM,IAAI,aAAa,CAAC,gBAAgB,CAAC,yBAAyB,IAAI,mBAAmB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7G,CAAC;IACD,IAAI,CAAC,CAAC;IACN,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QACxB,MAAM,IAAI,aAAa,CAAC,gBAAgB,CAAC,yBAAyB,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC;AACxG,CAAC"}
|
package/package.json
CHANGED
package/src/errors.ts
CHANGED
|
@@ -3,9 +3,11 @@ export class MOD2DOMError extends Error {};
|
|
|
3
3
|
class BadData extends MOD2DOMError {};
|
|
4
4
|
class InvalidTagName extends BadData {};
|
|
5
5
|
class InvalidClassName extends BadData {};
|
|
6
|
+
class InvalidElementName extends BadData {};
|
|
6
7
|
|
|
7
8
|
export const mod2domErrors = Object.freeze({
|
|
8
9
|
BadData: BadData,
|
|
9
10
|
InvalidTagName: InvalidTagName,
|
|
10
11
|
InvalidClassName: InvalidClassName,
|
|
12
|
+
InvalidElementName: InvalidElementName,
|
|
11
13
|
});
|
|
@@ -1,17 +1,57 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { mapAsync } from "@utils";
|
|
2
|
+
|
|
3
|
+
export class CLItem {
|
|
4
|
+
raw: ClipboardItem
|
|
5
|
+
|
|
6
|
+
constructor(item: ClipboardItem) {
|
|
7
|
+
this.raw = item;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
get text() {
|
|
11
|
+
return (async () => {
|
|
12
|
+
if (this.raw.types[0]?.match(/text\/.+/g)) {
|
|
13
|
+
return await (await this.raw.getType(this.raw.types[0])).text();
|
|
14
|
+
} else {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
})();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
get type() {
|
|
21
|
+
return this.raw.types[0];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
get types() {
|
|
25
|
+
return this.raw.types;
|
|
5
26
|
}
|
|
6
27
|
}
|
|
7
28
|
|
|
8
29
|
export const clipboard = {
|
|
9
|
-
|
|
30
|
+
ClipboardItem: CLItem,
|
|
31
|
+
|
|
32
|
+
raw: async function raw(): Promise<Array<CLItem>> {
|
|
10
33
|
const r = await navigator.clipboard.read();
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
34
|
+
|
|
35
|
+
return r.map((l) => new this.ClipboardItem(l));
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
readAll: async function readAll() {
|
|
39
|
+
const r = await this.raw();
|
|
40
|
+
|
|
41
|
+
return (await mapAsync(r, async (l) => {
|
|
42
|
+
return await l.text;
|
|
43
|
+
})).filter((v) => v !== undefined);
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
read: async function read() {
|
|
47
|
+
return (await this.readAll()).at(-1);
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
write: async function write(text: string) {
|
|
51
|
+
return await navigator.clipboard.writeText(text);
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
writeRaw: async function write(...raw: ClipboardItems) {
|
|
55
|
+
return await navigator.clipboard.write(raw);
|
|
56
|
+
},
|
|
17
57
|
}
|
package/src/types.ts
CHANGED
package/src/validate.ts
CHANGED
|
@@ -1,6 +1,26 @@
|
|
|
1
1
|
import { mod2domErrors } from "./errors.js";
|
|
2
2
|
|
|
3
|
+
function isASCII(str: string) {
|
|
4
|
+
return /^[\x00-\x7F]*$/.test(str);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function validateElementName(name: string) {
|
|
8
|
+
if (!isASCII(name))
|
|
9
|
+
throw new mod2domErrors.InvalidElementName(`Invalid element name (non-ASCII).`);
|
|
10
|
+
if (!name.trim())
|
|
11
|
+
throw new mod2domErrors.InvalidElementName(`Invalid element name (empty).`);
|
|
12
|
+
const invalid = name.match(/[/\\\s.#\[\]]/g);
|
|
13
|
+
if (invalid) {
|
|
14
|
+
throw new mod2domErrors.InvalidElementName(`Invalid element name: \`${name}\` (character: "${invalid[0]}")`);
|
|
15
|
+
}
|
|
16
|
+
let v;
|
|
17
|
+
if (v = name.match(/^[0-9]/))
|
|
18
|
+
throw new mod2domErrors.InvalidElementName(`Invalid element name: \`${name}\` (character: "${v}")`);
|
|
19
|
+
}
|
|
20
|
+
|
|
3
21
|
export function validateTagName(name: string) {
|
|
22
|
+
if (!isASCII(name))
|
|
23
|
+
throw new mod2domErrors.InvalidTagName(`Invalid tag name (non-ASCII).`);
|
|
4
24
|
if (!name.trim())
|
|
5
25
|
throw new mod2domErrors.InvalidTagName(`Invalid tag name (empty).`);
|
|
6
26
|
const invalid = name.match(/[/\\\s.#\[\]]/g);
|
|
@@ -13,6 +33,8 @@ export function validateTagName(name: string) {
|
|
|
13
33
|
}
|
|
14
34
|
|
|
15
35
|
export function validateClassName(name: string) {
|
|
36
|
+
if (!isASCII(name))
|
|
37
|
+
throw new mod2domErrors.InvalidTagName(`Invalid class name (non-ASCII).`);
|
|
16
38
|
if (!name.trim())
|
|
17
39
|
throw new mod2domErrors.InvalidTagName(`Invalid class name (empty).`);
|
|
18
40
|
const invalid = name.match(/[/\\\s.#\[\]]/g);
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { describe, it, vi, beforeEach, expect } from "vitest";
|
|
2
|
+
import { clipboard } from "../../src/localServices/clipboard.js";
|
|
3
|
+
import { CLItem } from "../../src/localServices/clipboard.js";
|
|
4
|
+
|
|
5
|
+
describe("read", () => {
|
|
6
|
+
describe("text", () => {
|
|
7
|
+
let navigatorMock = {
|
|
8
|
+
clipboard: {
|
|
9
|
+
read: vi.fn()
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
let makeClipboardItemMock = (types: any, blob: any) => {
|
|
13
|
+
return {
|
|
14
|
+
types: types,
|
|
15
|
+
getType: vi.fn().mockResolvedValue(blob)
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
vi.resetAllMocks();
|
|
20
|
+
|
|
21
|
+
vi.stubGlobal("navigator", navigatorMock);
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
it("Normal Read (1)", async () => {
|
|
26
|
+
const mockBlob = new Blob(["hello world"], {
|
|
27
|
+
type: "text/plain",
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const mockClipboardItem = makeClipboardItemMock(["text/plain"], mockBlob);
|
|
31
|
+
navigatorMock.clipboard.read.mockResolvedValue([mockClipboardItem]);
|
|
32
|
+
|
|
33
|
+
const result = await clipboard.read();
|
|
34
|
+
|
|
35
|
+
expect(mockClipboardItem.getType).toHaveBeenCalledOnce();
|
|
36
|
+
expect(navigatorMock.clipboard.read).toHaveBeenCalledOnce();
|
|
37
|
+
expect(result).toBe("hello world");
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("Normal Read (2)", async () => {
|
|
41
|
+
const wrongBlob = new Blob(["wrong"], {
|
|
42
|
+
type: "text/plain"
|
|
43
|
+
});
|
|
44
|
+
const wrongClipboardItem = makeClipboardItemMock(["text/plain"], wrongBlob);
|
|
45
|
+
|
|
46
|
+
const mockBlob = new Blob(["hello world"], {
|
|
47
|
+
type: "text/html",
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
const mockClipboardItem = makeClipboardItemMock(["text/html"], mockBlob);
|
|
51
|
+
navigatorMock.clipboard.read.mockResolvedValue([wrongClipboardItem, mockClipboardItem]);
|
|
52
|
+
|
|
53
|
+
const result = await clipboard.read();
|
|
54
|
+
|
|
55
|
+
expect(wrongClipboardItem.getType).toHaveBeenCalledOnce();
|
|
56
|
+
expect(mockClipboardItem.getType).toHaveBeenCalledOnce();
|
|
57
|
+
expect(navigatorMock.clipboard.read).toHaveBeenCalledOnce();
|
|
58
|
+
expect(result).toBe("hello world");
|
|
59
|
+
});
|
|
60
|
+
})
|
|
61
|
+
})
|
package/tests/dom/error.test.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { DOMParser } from "../../src/index";
|
|
|
3
3
|
import { TagName as IDName, Element, ClassName } from "../../src/query";
|
|
4
4
|
|
|
5
5
|
describe("invalidClass.empty.none", () => {
|
|
6
|
-
it("
|
|
6
|
+
it("fails to find an element", () => {
|
|
7
7
|
document.body.innerHTML = `
|
|
8
8
|
<div>
|
|
9
9
|
<button id="x" class="test">Hello, World!</button>
|
|
@@ -22,7 +22,7 @@ describe("invalidClass.empty.none", () => {
|
|
|
22
22
|
});
|
|
23
23
|
|
|
24
24
|
describe("invalidClass.empty.whitespace", () => {
|
|
25
|
-
it("
|
|
25
|
+
it("fails to find an element", () => {
|
|
26
26
|
document.body.innerHTML = `
|
|
27
27
|
<div>
|
|
28
28
|
<button id="x" class="test">Hello, World!</button>
|
|
@@ -41,7 +41,7 @@ describe("invalidClass.empty.whitespace", () => {
|
|
|
41
41
|
});
|
|
42
42
|
|
|
43
43
|
describe("invalidClass.character(1)", () => {
|
|
44
|
-
it("
|
|
44
|
+
it("fails to find an element", () => {
|
|
45
45
|
document.body.innerHTML = `
|
|
46
46
|
<div>
|
|
47
47
|
<button id="x" class="test">Hello, World!</button>
|
|
@@ -60,7 +60,7 @@ describe("invalidClass.character(1)", () => {
|
|
|
60
60
|
});
|
|
61
61
|
|
|
62
62
|
describe("invalidClass.character(2)", () => {
|
|
63
|
-
it("
|
|
63
|
+
it("fails to find an element", () => {
|
|
64
64
|
document.body.innerHTML = `
|
|
65
65
|
<div>
|
|
66
66
|
<button id="x" class="test">Hello, World!</button>
|
package/tests/dom/simple.test.ts
CHANGED
|
@@ -10,6 +10,16 @@ describe("findTheButton", () => {
|
|
|
10
10
|
|
|
11
11
|
const btn = DOMParser.find(Element('button', {}, IDName("x"), ClassName("test")));
|
|
12
12
|
|
|
13
|
+
expect(btn?.textContent).toBe("Hello, World!")
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it("finds an element based on an array query", () => {
|
|
17
|
+
document.body.innerHTML = `
|
|
18
|
+
<button id="x" class="test">Hello, World!</button>
|
|
19
|
+
`
|
|
20
|
+
|
|
21
|
+
const btn = DOMParser.find([Element('button', {}, IDName("x"), ClassName("test"))]);
|
|
22
|
+
|
|
13
23
|
expect(btn?.textContent).toBe("Hello, World!")
|
|
14
24
|
})
|
|
15
25
|
});
|
package/tsconfig.json
CHANGED
|
@@ -40,7 +40,11 @@
|
|
|
40
40
|
"isolatedModules": true,
|
|
41
41
|
"noUncheckedSideEffectImports": true,
|
|
42
42
|
"moduleDetection": "force",
|
|
43
|
-
"skipLibCheck": true
|
|
43
|
+
"skipLibCheck": true,
|
|
44
|
+
"paths": {
|
|
45
|
+
"@utils": ["./src/utils/index.ts"],
|
|
46
|
+
"@/*": ["./src/*"]
|
|
47
|
+
}
|
|
44
48
|
},
|
|
45
49
|
|
|
46
50
|
"include": [
|