@markuplint/types 3.5.1 → 3.6.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.
@@ -1,59 +1,59 @@
1
- "use strict";
1
+ 'use strict';
2
2
  // @ts-nocheck
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- const check_mime_type_1 = require("./check-mime-type");
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+ const check_mime_type_1 = require('./check-mime-type');
5
5
  const check = (0, check_mime_type_1.checkMIMEType)();
6
6
  const checkNoParam = (0, check_mime_type_1.checkMIMEType)({ withoutParameters: true });
7
7
  test('valid', () => {
8
- expect(check('x/y').matched).toBe(true);
9
- expect(check('x/y;a=b;c=D;E="F"').matched).toBe(true);
8
+ expect(check('x/y').matched).toBe(true);
9
+ expect(check('x/y;a=b;c=D;E="F"').matched).toBe(true);
10
10
  });
11
11
  test('excrescence-token', () => {
12
- expect(check('xy;')).toStrictEqual({
13
- column: 1,
14
- expects: [{ type: 'format', value: 'MIME Type' }],
15
- length: 3,
16
- line: 1,
17
- matched: false,
18
- offset: 0,
19
- raw: 'xy;',
20
- reason: 'syntax-error',
21
- ref: null,
22
- });
23
- expect(check('x/y;')).toStrictEqual({
24
- candidate: 'x/y',
25
- column: 4,
26
- expects: [{ type: 'format', value: 'MIME Type' }],
27
- length: 1,
28
- line: 1,
29
- matched: false,
30
- offset: 3,
31
- raw: ';',
32
- reason: 'extra-token',
33
- ref: null,
34
- });
35
- expect(checkNoParam('x/y;')).toStrictEqual({
36
- candidate: 'x/y',
37
- column: 4,
38
- expects: [{ type: 'format', value: 'MIME Type with no parameters' }],
39
- length: 1,
40
- line: 1,
41
- matched: false,
42
- offset: 3,
43
- raw: ';',
44
- reason: 'extra-token',
45
- ref: null,
46
- });
47
- expect(checkNoParam('x/y;a=b;c=D;E="F"')).toStrictEqual({
48
- candidate: 'x/y',
49
- column: 4,
50
- expects: [{ type: 'format', value: 'MIME Type with no parameters' }],
51
- length: 14,
52
- line: 1,
53
- matched: false,
54
- offset: 3,
55
- raw: ';a=b;c=D;E="F"',
56
- reason: 'extra-token',
57
- ref: null,
58
- });
12
+ expect(check('xy;')).toStrictEqual({
13
+ column: 1,
14
+ expects: [{ type: 'format', value: 'MIME Type' }],
15
+ length: 3,
16
+ line: 1,
17
+ matched: false,
18
+ offset: 0,
19
+ raw: 'xy;',
20
+ reason: 'syntax-error',
21
+ ref: null,
22
+ });
23
+ expect(check('x/y;')).toStrictEqual({
24
+ candidate: 'x/y',
25
+ column: 4,
26
+ expects: [{ type: 'format', value: 'MIME Type' }],
27
+ length: 1,
28
+ line: 1,
29
+ matched: false,
30
+ offset: 3,
31
+ raw: ';',
32
+ reason: 'extra-token',
33
+ ref: null,
34
+ });
35
+ expect(checkNoParam('x/y;')).toStrictEqual({
36
+ candidate: 'x/y',
37
+ column: 4,
38
+ expects: [{ type: 'format', value: 'MIME Type with no parameters' }],
39
+ length: 1,
40
+ line: 1,
41
+ matched: false,
42
+ offset: 3,
43
+ raw: ';',
44
+ reason: 'extra-token',
45
+ ref: null,
46
+ });
47
+ expect(checkNoParam('x/y;a=b;c=D;E="F"')).toStrictEqual({
48
+ candidate: 'x/y',
49
+ column: 4,
50
+ expects: [{ type: 'format', value: 'MIME Type with no parameters' }],
51
+ length: 14,
52
+ line: 1,
53
+ matched: false,
54
+ offset: 3,
55
+ raw: ';a=b;c=D;E="F"',
56
+ reason: 'extra-token',
57
+ ref: null,
58
+ });
59
59
  });
@@ -1,9 +1,9 @@
1
- "use strict";
1
+ 'use strict';
2
2
  // @ts-nocheck
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- const is_abs_url_1 = require("./is-abs-url");
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+ const is_abs_url_1 = require('./is-abs-url');
5
5
  const is = (0, is_abs_url_1.isAbsURL)();
6
6
  test('valid', () => {
7
- expect(is('https://markuplint.dev')).toBe(true);
8
- expect(is('markuplint.dev')).toBe(false);
7
+ expect(is('https://markuplint.dev')).toBe(true);
8
+ expect(is('markuplint.dev')).toBe(false);
9
9
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@markuplint/types",
3
- "version": "3.5.1",
3
+ "version": "3.6.0",
4
4
  "description": "Type declaration and value checker",
5
5
  "repository": "git@github.com:markuplint/markuplint.git",
6
6
  "author": "Yusuke Hirao <yusukehirao@me.com>",
@@ -20,18 +20,16 @@
20
20
  "schema": "ts-node './gen/types.ts'; json2ts './types.schema.json' > './src/types.schema.ts'; prettier './src/types.schema.ts' './types.schema.json' --write; eslint './src/types.schema.ts' --fix; tsc;"
21
21
  },
22
22
  "dependencies": {
23
+ "@types/bcp-47": "1",
24
+ "@types/css-tree": "^2.0.1",
25
+ "@types/debug": "^4.1.7",
26
+ "@types/whatwg-mimetype": "3.0.0",
23
27
  "bcp-47": "1",
24
28
  "css-tree": "^2.3.1",
25
29
  "debug": "^4.3.4",
26
30
  "leven": "3",
27
- "whatwg-mimetype": "2"
28
- },
29
- "devDependencies": {
30
- "@types/bcp-47": "1",
31
- "@types/css-tree": "^2.0.1",
32
- "@types/debug": "^4.1.7",
33
- "@types/whatwg-mimetype": "2",
34
- "type-fest": "^3.6.1"
31
+ "type-fest": "^3.8.0",
32
+ "whatwg-mimetype": "^3.0.0"
35
33
  },
36
- "gitHead": "3cdf5a088b2da03773d5d4461d0e65ec32290a00"
34
+ "gitHead": "adc6e432cccba7cfad0dc8bf9f92e5aaf1107359"
37
35
  }
@@ -0,0 +1,89 @@
1
+ const { check } = require('../lib/check');
2
+
3
+ test('Any', () => {
4
+ expect(check('', 'Any').matched).toBe(true);
5
+ expect(check(' ', 'Any').matched).toBe(true);
6
+ expect(check('a', 'Any').matched).toBe(true);
7
+ });
8
+
9
+ test('NoEmptyAny', () => {
10
+ expect(check('', 'NoEmptyAny').matched).toBe(false);
11
+ expect(check(' ', 'NoEmptyAny').matched).toBe(true);
12
+ expect(check('a', 'NoEmptyAny').matched).toBe(true);
13
+ });
14
+
15
+ test('OneLineAny', () => {
16
+ expect(check('', 'OneLineAny').matched).toBe(true);
17
+ expect(check(' ', 'OneLineAny').matched).toBe(true);
18
+ expect(check('a', 'OneLineAny').matched).toBe(true);
19
+ expect(check('a ', 'OneLineAny').matched).toBe(true);
20
+ expect(check('a b', 'OneLineAny').matched).toBe(true);
21
+ expect(check('a\n', 'OneLineAny').matched).toBe(false);
22
+ expect(check('a\nb', 'OneLineAny').matched).toBe(false);
23
+ expect(check('a\r\nb', 'OneLineAny').matched).toBe(false);
24
+ expect(check('a\rb', 'OneLineAny').matched).toBe(false);
25
+ });
26
+
27
+ test('Pattern', () => {
28
+ expect(check('.*', 'Pattern').matched).toBe(true);
29
+ expect(check('[a-z]+', 'Pattern').matched).toBe(true);
30
+ expect(check(']//[()?!+*', 'Pattern').matched).toBe(false);
31
+ });
32
+
33
+ test('BCP47', () => {
34
+ expect(check('en', 'BCP47').matched).toBe(true);
35
+ expect(check('en-US', 'BCP47').matched).toBe(true);
36
+ expect(check('ja', 'BCP47').matched).toBe(true);
37
+ expect(check(' ja ', 'BCP47').matched).toBe(false);
38
+ expect(check('', 'BCP47').matched).toBe(false);
39
+ expect(check('zh/cn', 'BCP47').matched).toBe(false);
40
+ });
41
+
42
+ test('Srcset', () => {
43
+ expect(check('a/bb/ccc/dddd', 'Srcset').matched).toBe(true);
44
+ expect(check('a/bb/ccc/dddd 200w', 'Srcset').matched).toBe(true);
45
+ expect(check('a/bb/ccc/dddd 200w, b/cc/ddd/eeee 1.5x', 'Srcset').matched).toBe(true);
46
+ expect(check('a/bb/ccc/dddd 200w, b/cc/ddd/eeee 1.5a', 'Srcset').matched).toBe(false);
47
+ });
48
+
49
+ test('IconSize', () => {
50
+ expect(check('any', 'IconSize').matched).toBe(true);
51
+ expect(check('Any', 'IconSize').matched).toBe(true);
52
+ expect(check('10x10', 'IconSize').matched).toBe(true);
53
+ expect(check('1x1', 'IconSize').matched).toBe(true);
54
+ expect(check('1x0', 'IconSize').matched).toBe(false);
55
+ expect(check('0x1', 'IconSize').matched).toBe(false);
56
+ expect(check('0x0', 'IconSize').matched).toBe(false);
57
+ expect(check('', 'IconSize').matched).toBe(false);
58
+ expect(check(' ', 'IconSize').matched).toBe(false);
59
+ expect(check('1', 'IconSize').matched).toBe(false);
60
+ expect(check('1x', 'IconSize').matched).toBe(false);
61
+ expect(check('x1', 'IconSize').matched).toBe(false);
62
+ });
63
+
64
+ test('Number', () => {
65
+ expect(check('10', { type: 'integer', gt: 0 }).matched).toBe(true);
66
+ expect(check('0', { type: 'integer', gt: 0 }).matched).toBe(false);
67
+ expect(check('0', { type: 'integer', gte: 0 }).matched).toBe(true);
68
+ expect(check('9', { type: 'integer', lt: 10 }).matched).toBe(true);
69
+ expect(check('10', { type: 'integer', lt: 10 }).matched).toBe(false);
70
+ });
71
+
72
+ test('Non-exist types', () => {
73
+ // @ts-ignore
74
+ expect(check('abc', 'String').matched).toBe(true);
75
+ // @ts-ignore
76
+ expect(check('abc', 'FooBar').matched).toBe(true);
77
+ // @ts-ignore
78
+ expect(check('abc', ' ').matched).toBe(true);
79
+ // @ts-ignore
80
+ expect(check('abc', '\n').matched).toBe(true);
81
+ // @ts-ignore
82
+ expect(check('abc', '').matched).toBe(true);
83
+ });
84
+
85
+ test('ItemProp', () => {
86
+ expect(check('itemListElement', 'ItemProp').matched).toBe(true);
87
+ expect(check('item', 'ItemProp').matched).toBe(true);
88
+ expect(check('position', 'ItemProp').matched).toBe(true);
89
+ });
@@ -0,0 +1,165 @@
1
+ const { cssSyntaxMatch } = require('../lib/css-syntax');
2
+
3
+ test('CSS Standard', () => {
4
+ expect(cssSyntaxMatch('10px', '<length>').matched).toBe(true);
5
+ expect(cssSyntaxMatch('one-pixel', '<length>').matched).toBe(false);
6
+ expect(cssSyntaxMatch('(prefers-color-scheme: dark)', '<media-query-list>').matched).toBe(true);
7
+ });
8
+
9
+ test('Extends', () => {
10
+ const sourceSizeList = {
11
+ ref: 'https://html.spec.whatwg.org/multipage/images.html#sizes-attributes',
12
+ syntax: {
13
+ apply: '<source-size-list>',
14
+ def: {
15
+ 'source-size-list': '[ <source-size># , ]? <source-size-value>',
16
+ 'source-size': '<media-condition> <source-size-value>',
17
+ 'source-size-value': '<length>',
18
+ },
19
+ },
20
+ };
21
+ expect(cssSyntaxMatch('50vw', sourceSizeList).matched).toBe(true);
22
+ expect(cssSyntaxMatch('(max-width: 600px) 200px, 50vw', sourceSizeList).matched).toBe(true);
23
+ expect(cssSyntaxMatch('print 300vw', sourceSizeList).matched).toBe(false);
24
+ expect(cssSyntaxMatch('(max-width: 600px) 200px', sourceSizeList).matched).toBe(false);
25
+ expect(
26
+ cssSyntaxMatch('(max-width: 600px) 200px', {
27
+ ...sourceSizeList,
28
+ syntax: {
29
+ ...sourceSizeList.syntax,
30
+ apply: '<source-size>',
31
+ },
32
+ }).matched,
33
+ ).toBe(true);
34
+
35
+ const keyTimes = {
36
+ ref: 'https://svgwg.org/specs/animations/#KeyTimesAttribute',
37
+ syntax: {
38
+ apply: '<key-times>',
39
+ def: {
40
+ 'key-times': '<number> [; <number>]* [;]?',
41
+ },
42
+ },
43
+ };
44
+ expect(cssSyntaxMatch('20; 20; 30', keyTimes).matched).toBe(true);
45
+ expect(cssSyntaxMatch('20; 20; 30;', keyTimes).matched).toBe(true);
46
+ expect(cssSyntaxMatch('20; 20; abc;', keyTimes).matched).toBe(false);
47
+ expect(cssSyntaxMatch('20; 20; ;', keyTimes).matched).toBe(false);
48
+
49
+ const SVGViewBox = {
50
+ ref: 'https://svgwg.org/svg2-draft/coords.html#ViewBoxAttribute',
51
+ syntax: {
52
+ apply: '<view-box>',
53
+ def: {
54
+ 'view-box': '<min-x> [,]? <min-y> [,]? <width> [,]? <height>',
55
+ 'min-x': '<number>',
56
+ 'min-y': '<number>',
57
+ width: '<number>',
58
+ height: '<number>',
59
+ },
60
+ },
61
+ };
62
+ expect(cssSyntaxMatch('0 0 30 10', SVGViewBox).matched).toBe(true);
63
+ expect(cssSyntaxMatch('0 0, 30, 10', SVGViewBox).matched).toBe(true);
64
+ expect(cssSyntaxMatch('0 0, 30', SVGViewBox).matched).toBe(false);
65
+
66
+ const percentageList = {
67
+ ref: 'https://developer.mozilla.org/en-US/docs/Web/SVG/Content_type#percentage',
68
+ syntax: {
69
+ apply: '<percentage-list>',
70
+ def: {
71
+ 'percentage-list': '[ <number> [,]? ]* <number>',
72
+ },
73
+ },
74
+ };
75
+ expect(cssSyntaxMatch('0 0 30 10', percentageList).matched).toBe(true);
76
+ expect(cssSyntaxMatch('0, 0, 30 10', percentageList).matched).toBe(true);
77
+ expect(cssSyntaxMatch('0', percentageList).matched).toBe(true);
78
+ expect(cssSyntaxMatch('', percentageList).matched).toBe(false);
79
+
80
+ const custom = {
81
+ ref: 'n/a',
82
+ syntax: {
83
+ apply: '<custom>',
84
+ def: {
85
+ custom: '0 | 1 | .',
86
+ },
87
+ },
88
+ };
89
+ expect(cssSyntaxMatch('0', custom).matched).toBe(true);
90
+ expect(cssSyntaxMatch('1', custom).matched).toBe(true);
91
+ expect(cssSyntaxMatch('.', custom).matched).toBe(true);
92
+ expect(cssSyntaxMatch('2', custom).matched).toBe(false);
93
+ expect(cssSyntaxMatch(':', custom).matched).toBe(false);
94
+ });
95
+
96
+ test('custom-type-checking', () => {
97
+ const custom = {
98
+ ref: 'n/a',
99
+ caseSensitive: true,
100
+ syntax: {
101
+ apply: '<custom>',
102
+ def: {
103
+ custom: '<custom-type>',
104
+ 'custom-type': token => {
105
+ if (!token) {
106
+ return 0;
107
+ }
108
+ return token.value === '1' ? 1 : 0;
109
+ },
110
+ },
111
+ },
112
+ };
113
+ expect(cssSyntaxMatch('1', custom).matched).toBe(true);
114
+ expect(cssSyntaxMatch('0', custom).matched).toBe(false);
115
+ });
116
+
117
+ test('case-sensitive', () => {
118
+ const custom = {
119
+ ref: 'n/a',
120
+ caseSensitive: true,
121
+ syntax: {
122
+ apply: '<custom>',
123
+ def: {
124
+ custom: 'CaSeS [a | B | aBc]',
125
+ },
126
+ },
127
+ };
128
+ expect(cssSyntaxMatch('CaSeS a', custom).matched).toBe(true);
129
+ expect(cssSyntaxMatch('CaSeS B', custom).matched).toBe(true);
130
+ expect(cssSyntaxMatch('CaSeS aBc', custom).matched).toBe(true);
131
+ expect(cssSyntaxMatch('CaSeS A', custom)).toStrictEqual({
132
+ column: 7,
133
+ line: 1,
134
+ matched: false,
135
+ length: 1,
136
+ offset: 6,
137
+ partName: 'value',
138
+ raw: 'A',
139
+ reason: 'syntax-error',
140
+ ref: 'n/a',
141
+ expects: [
142
+ {
143
+ type: 'syntax',
144
+ value: '<custom>',
145
+ },
146
+ ],
147
+ });
148
+ expect(cssSyntaxMatch('CaSeS abc', custom)).toStrictEqual({
149
+ column: 7,
150
+ line: 1,
151
+ matched: false,
152
+ length: 3,
153
+ offset: 6,
154
+ partName: 'value',
155
+ raw: 'abc',
156
+ reason: 'syntax-error',
157
+ ref: 'n/a',
158
+ expects: [
159
+ {
160
+ type: 'syntax',
161
+ value: '<custom>',
162
+ },
163
+ ],
164
+ });
165
+ });
@@ -0,0 +1,133 @@
1
+ const { checkList } = require('../lib/list');
2
+
3
+ test('Zero space', () => {
4
+ const type = { token: 'Zero', separator: 'space' };
5
+ expect(checkList('0', type).matched).toBe(true);
6
+ expect(checkList(' 0 ', type).matched).toBe(true);
7
+ expect(checkList(' 0 0', type).matched).toBe(true);
8
+ expect(checkList(' 0 0 ', type).matched).toBe(true);
9
+ expect(checkList('0 0 0 ', type).matched).toBe(true);
10
+ expect(checkList('0 0 0 0', type).matched).toBe(true);
11
+ expect(checkList('0 0 0 0', type).matched).toBe(true);
12
+ expect(checkList('1', type).matched).toBe(false);
13
+ expect(checkList(' 1 ', type).matched).toBe(false);
14
+ expect(checkList(' 1 0', type).matched).toBe(false);
15
+ expect(checkList(' 1 0 ', type).matched).toBe(false);
16
+ expect(checkList('0 1 0 ', type).matched).toBe(false);
17
+ expect(checkList('0 1 0 0', type).matched).toBe(false);
18
+ expect(checkList('0 1 0 0', type).matched).toBe(false);
19
+ });
20
+
21
+ test('Zero comma', () => {
22
+ const type = { token: 'Zero', separator: 'comma' };
23
+ expect(checkList('0', type).matched).toBe(true);
24
+ expect(checkList(' 0 ', type).matched).toBe(true);
25
+ expect(checkList(' 0 0', type).matched).toBe(false);
26
+ expect(checkList(' 0,0', type).matched).toBe(true);
27
+ expect(checkList(' 0,,0 ', type).matched).toBe(false);
28
+ expect(checkList('0 0 0 ', type).matched).toBe(false);
29
+ expect(checkList(' 0,0,0,0 ', type).matched).toBe(true);
30
+ expect(checkList('0, 0, 0 , 0', type).matched).toBe(true);
31
+ expect(checkList('0,0,0,0,', type).matched).toBe(false);
32
+ expect(checkList(',0,0,0,0', type).matched).toBe(false);
33
+ });
34
+
35
+ test('Zero comma (disallowToSurroundBySpaces)', () => {
36
+ const type = { token: 'Zero', separator: 'comma', disallowToSurroundBySpaces: true };
37
+ expect(checkList('0', type).matched).toBe(true);
38
+ expect(checkList(' 0 ', type).matched).toBe(false);
39
+ expect(checkList(' 0 0', type).matched).toBe(false);
40
+ expect(checkList(' 0,0', type).matched).toBe(false);
41
+ expect(checkList(' 0,,0 ', type).matched).toBe(false);
42
+ expect(checkList('0 0 0 ', type).matched).toBe(false);
43
+ expect(checkList(' 0,0,0,0 ', type).matched).toBe(false);
44
+ expect(checkList('0, 0, 0 , 0', type).matched).toBe(false);
45
+ expect(checkList('0,0,0,0', type).matched).toBe(true);
46
+ expect(checkList('0,0,0,0,', type).matched).toBe(false);
47
+ expect(checkList(',0,0,0,0', type).matched).toBe(false);
48
+ });
49
+
50
+ test('Location of the token', () => {
51
+ const type = { token: 'Accept', separator: 'comma' };
52
+ expect(checkList('x/y;a=b', type)).toStrictEqual({
53
+ candidate: 'x/y',
54
+ column: 4,
55
+ expects: [{ type: 'format', value: 'MIME Type with no parameters' }],
56
+ length: 4,
57
+ line: 1,
58
+ matched: false,
59
+ offset: 3,
60
+ raw: ';a=b',
61
+ reason: 'extra-token',
62
+ partName: 'the content of the list',
63
+ ref: 'https://html.spec.whatwg.org/multipage/input.html#attr-input-accept',
64
+ });
65
+ expect(checkList('x/y,x/y;a=b', type)).toStrictEqual({
66
+ candidate: 'x/y',
67
+ column: 8,
68
+ expects: [{ type: 'format', value: 'MIME Type with no parameters' }],
69
+ length: 4,
70
+ line: 1,
71
+ matched: false,
72
+ offset: 7,
73
+ raw: ';a=b',
74
+ reason: 'extra-token',
75
+ partName: 'the content of the list',
76
+ ref: 'https://html.spec.whatwg.org/multipage/input.html#attr-input-accept',
77
+ });
78
+ expect(checkList('x/y\n,\nx/y;a=b', type)).toStrictEqual({
79
+ candidate: 'x/y',
80
+ column: 4,
81
+ expects: [{ type: 'format', value: 'MIME Type with no parameters' }],
82
+ length: 4,
83
+ line: 3,
84
+ matched: false,
85
+ offset: 9,
86
+ raw: ';a=b',
87
+ reason: 'extra-token',
88
+ partName: 'the content of the list',
89
+ ref: 'https://html.spec.whatwg.org/multipage/input.html#attr-input-accept',
90
+ });
91
+ });
92
+
93
+ test('Expected comma', () => {
94
+ const type = { token: 'Accept', separator: 'comma' };
95
+ expect(checkList('x/y,', type)).toStrictEqual({
96
+ column: 4,
97
+ expects: undefined,
98
+ length: 1,
99
+ line: 1,
100
+ matched: false,
101
+ offset: 3,
102
+ raw: ',',
103
+ reason: 'extra-token',
104
+ ref: null,
105
+ });
106
+ expect(checkList('x/y,,x/y', type)).toStrictEqual({
107
+ column: 5,
108
+ expects: undefined,
109
+ length: 1,
110
+ line: 1,
111
+ matched: false,
112
+ offset: 4,
113
+ raw: ',',
114
+ reason: 'unexpected-comma',
115
+ ref: null,
116
+ });
117
+ });
118
+
119
+ test('Missing comma', () => {
120
+ const type = { token: 'Accept', separator: 'comma' };
121
+ expect(checkList('a/b,x/y a/z', type)).toStrictEqual({
122
+ column: 9,
123
+ candidate: ',a/z',
124
+ expects: undefined,
125
+ length: 3,
126
+ line: 1,
127
+ matched: false,
128
+ offset: 8,
129
+ raw: 'a/z',
130
+ reason: 'missing-comma',
131
+ ref: null,
132
+ });
133
+ });
@@ -0,0 +1,65 @@
1
+ const { isInt, isUint, isFloat, isNonZeroUint, isQuantity } = require('../../lib/primitive');
2
+
3
+ test('int', () => {
4
+ expect(isInt('0')).toBe(true);
5
+ expect(isInt('1')).toBe(true);
6
+ expect(isInt('-0')).toBe(true);
7
+ expect(isInt('-1')).toBe(true);
8
+ expect(isInt('10')).toBe(true);
9
+ expect(isInt('100')).toBe(true);
10
+ expect(isInt('1.00')).toBe(false);
11
+ expect(isInt('.001')).toBe(false);
12
+ expect(isInt(' 1 ')).toBe(false);
13
+ expect(isInt('- 1')).toBe(false);
14
+ });
15
+
16
+ test('uint', () => {
17
+ expect(isUint('0')).toBe(true);
18
+ expect(isUint('1')).toBe(true);
19
+ expect(isUint('10')).toBe(true);
20
+ expect(isUint('100')).toBe(true);
21
+ expect(isUint('-0')).toBe(false);
22
+ expect(isUint('-1')).toBe(false);
23
+ expect(isUint('1.00')).toBe(false);
24
+ expect(isUint('.001')).toBe(false);
25
+ expect(isUint(' 1 ')).toBe(false);
26
+ expect(isUint('- 1')).toBe(false);
27
+ });
28
+
29
+ test('float', () => {
30
+ expect(isFloat('0')).toBe(true);
31
+ expect(isFloat('1')).toBe(true);
32
+ expect(isFloat('10')).toBe(true);
33
+ expect(isFloat('100')).toBe(true);
34
+ expect(isFloat('-0')).toBe(true);
35
+ expect(isFloat('-1')).toBe(true);
36
+ expect(isFloat('1.00')).toBe(true);
37
+ expect(isFloat('.001')).toBe(true);
38
+ expect(isFloat(' 1 ')).toBe(false);
39
+ expect(isFloat('- 1')).toBe(false);
40
+ });
41
+
42
+ test('nonZeroUint', () => {
43
+ expect(isNonZeroUint('0')).toBe(false);
44
+ expect(isNonZeroUint('1')).toBe(true);
45
+ expect(isNonZeroUint('10')).toBe(true);
46
+ expect(isNonZeroUint('100')).toBe(true);
47
+ expect(isNonZeroUint('-0')).toBe(false);
48
+ expect(isNonZeroUint('-1')).toBe(false);
49
+ expect(isNonZeroUint('1.00')).toBe(false);
50
+ expect(isNonZeroUint('.001')).toBe(false);
51
+ expect(isNonZeroUint(' 1 ')).toBe(false);
52
+ expect(isNonZeroUint('- 1')).toBe(false);
53
+ });
54
+
55
+ test('quantity', () => {
56
+ expect(isQuantity('0px', ['px', 'em'])).toBe(true);
57
+ expect(isQuantity('.5px', ['px', 'em'])).toBe(true);
58
+ expect(isQuantity('1.5em', ['px', 'em'])).toBe(true);
59
+ expect(isQuantity('1.5cm', ['px', 'em'])).toBe(false);
60
+ expect(isQuantity('1.5px', ['px', 'em'], 'int')).toBe(false);
61
+ expect(isQuantity('-5px', ['px', 'em'], 'int')).toBe(true);
62
+ expect(isQuantity('-5px', ['px', 'em'], 'uint')).toBe(false);
63
+ expect(isQuantity('1.12e+21px', ['px', 'em'], 'float')).toBe(true);
64
+ expect(isQuantity('1.12e+21px', ['px', 'em'], 'int')).toBe(false);
65
+ });
@@ -0,0 +1,23 @@
1
+ const { isBCP47 } = require('../../lib/rfc/is-bcp-47');
2
+
3
+ const is = isBCP47();
4
+
5
+ test('en-us', () => {
6
+ expect(is('en-us')).toBe(true);
7
+ });
8
+
9
+ test('ja-JP', () => {
10
+ expect(is('ja-JP')).toBe(true);
11
+ });
12
+
13
+ test('Empty', () => {
14
+ expect(is('')).toBe(false);
15
+ });
16
+
17
+ test('Invalid', () => {
18
+ expect(is(':::')).toBe(false);
19
+ });
20
+
21
+ test('Surrounded by spaces', () => {
22
+ expect(is(' en ')).toBe(false);
23
+ });