@markuplint/rules 3.0.0-rc.2 → 3.0.0-rc.4

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.
Files changed (61) hide show
  1. package/README.md +1 -1
  2. package/lib/attr-check.d.ts +19 -8
  3. package/lib/attr-duplication/index.d.ts +1 -1
  4. package/lib/attr-value-quotes/index.d.ts +2 -2
  5. package/lib/case-sensitive-attr-name/index.d.ts +1 -1
  6. package/lib/case-sensitive-tag-name/index.d.ts +1 -1
  7. package/lib/character-reference/index.d.ts +1 -1
  8. package/lib/class-naming/index.d.ts +1 -1
  9. package/lib/class-naming/index.js +1 -1
  10. package/lib/create-message.d.ts +12 -2
  11. package/lib/deprecated-attr/index.d.ts +1 -1
  12. package/lib/deprecated-element/index.d.ts +1 -1
  13. package/lib/disallowed-element/index.d.ts +1 -1
  14. package/lib/doctype/index.d.ts +2 -2
  15. package/lib/end-tag/index.d.ts +1 -1
  16. package/lib/helpers.d.ts +35 -17
  17. package/lib/id-duplication/index.d.ts +1 -1
  18. package/lib/ineffective-attr/index.d.ts +1 -1
  19. package/lib/invalid-attr/index.d.ts +17 -13
  20. package/lib/label-has-control/index.d.ts +1 -1
  21. package/lib/landmark-roles/index.d.ts +3 -3
  22. package/lib/no-boolean-attr-value/index.d.ts +1 -1
  23. package/lib/no-default-value/index.d.ts +1 -1
  24. package/lib/no-empty-palpable-content/index.d.ts +3 -3
  25. package/lib/no-hard-code-id/index.d.ts +1 -1
  26. package/lib/no-refer-to-non-existent-id/index.d.ts +6 -3
  27. package/lib/no-use-event-handler-attr/index.d.ts +2 -2
  28. package/lib/permitted-contents/choice.d.ts +7 -1
  29. package/lib/permitted-contents/complex-branch.d.ts +7 -1
  30. package/lib/permitted-contents/count-pattern.d.ts +17 -2
  31. package/lib/permitted-contents/debug.browser.d.ts +30 -0
  32. package/lib/permitted-contents/debug.browser.js +14 -0
  33. package/lib/permitted-contents/debug.d.ts +2 -1
  34. package/lib/permitted-contents/debug.js +9 -1
  35. package/lib/permitted-contents/index.d.ts +1 -1
  36. package/lib/permitted-contents/matches-selector.d.ts +7 -1
  37. package/lib/permitted-contents/order.d.ts +7 -1
  38. package/lib/permitted-contents/recursive-branch.d.ts +7 -1
  39. package/lib/permitted-contents/represent-transparent-nodes.d.ts +7 -3
  40. package/lib/permitted-contents/start.d.ts +6 -1
  41. package/lib/permitted-contents/types.d.ts +26 -26
  42. package/lib/permitted-contents/utils.d.ts +35 -21
  43. package/lib/permitted-contents/utils.js +8 -8
  44. package/lib/require-accessible-name/index.d.ts +2 -2
  45. package/lib/required-attr/index.d.ts +3 -3
  46. package/lib/required-element/index.d.ts +2 -2
  47. package/lib/required-h1/index.d.ts +3 -3
  48. package/lib/use-list/index.d.ts +2 -2
  49. package/lib/wai-aria/checkings/default-value.d.ts +7 -3
  50. package/lib/wai-aria/checkings/deprecated-props.d.ts +8 -4
  51. package/lib/wai-aria/checkings/disallowed-prop.d.ts +8 -4
  52. package/lib/wai-aria/checkings/implicit-props.d.ts +8 -4
  53. package/lib/wai-aria/checkings/no-global-prop.d.ts +7 -3
  54. package/lib/wai-aria/checkings/required-owned-elements.d.ts +7 -3
  55. package/lib/wai-aria/checkings/required-owned-elements.js +22 -8
  56. package/lib/wai-aria/checkings/required-prop.d.ts +12 -6
  57. package/lib/wai-aria/checkings/value.d.ts +9 -5
  58. package/lib/wai-aria/index.d.ts +1 -1
  59. package/lib/wai-aria/types.d.ts +10 -10
  60. package/package.json +9 -6
  61. package/tsconfig.tsbuildinfo +1 -1
@@ -1,14 +1,29 @@
1
1
  import type { ChildNode, Element, Specs } from './types';
2
- import type { PermittedContentPattern, PermittedContentChoice, PermittedContentOneOrMore, PermittedContentOptional, PermittedContentRequire, PermittedContentTransparent, PermittedContentZeroOrMore, Model } from '@markuplint/ml-spec';
2
+ import type {
3
+ PermittedContentPattern,
4
+ PermittedContentChoice,
5
+ PermittedContentOneOrMore,
6
+ PermittedContentOptional,
7
+ PermittedContentRequire,
8
+ PermittedContentTransparent,
9
+ PermittedContentZeroOrMore,
10
+ Model,
11
+ } from '@markuplint/ml-spec';
3
12
  export declare function getChildNodesWithoutWhitespaces(el: Element): ChildNode[];
4
13
  export declare function isModel(model: Model | PermittedContentPattern[]): model is Model;
5
- export declare function matches(selector: string, node: ChildNode, specs: Specs): {
6
- matched: boolean;
7
- not?: undefined;
8
- } | {
9
- matched: boolean;
10
- not: ChildNode | undefined;
11
- };
14
+ export declare function matches(
15
+ selector: string,
16
+ node: ChildNode,
17
+ specs: Specs,
18
+ ):
19
+ | {
20
+ matched: boolean;
21
+ not?: undefined;
22
+ }
23
+ | {
24
+ matched: boolean;
25
+ not: ChildNode | undefined;
26
+ };
12
27
  export declare function isRequire(content: PermittedContentPattern): content is PermittedContentRequire;
13
28
  export declare function isOptional(content: PermittedContentPattern): content is PermittedContentOptional;
14
29
  export declare function isOneOrMore(content: PermittedContentPattern): content is PermittedContentOneOrMore;
@@ -16,17 +31,16 @@ export declare function isZeroOrMore(content: PermittedContentPattern): content
16
31
  export declare function isChoice(content: PermittedContentPattern): content is PermittedContentChoice;
17
32
  export declare function isTransparent(content: PermittedContentPattern): content is PermittedContentTransparent;
18
33
  export declare class Collection {
19
- #private;
20
- constructor(origin: readonly ChildNode[]);
21
- get matched(): ChildNode[];
22
- get matchedCount(): number;
23
- get nodes(): ChildNode[];
24
- get unmatched(): ChildNode[];
25
- addMatched(nodes: ChildNode[]): boolean;
26
- back(): void;
27
- lock(): void;
28
- max(max: number): void;
29
- toString(highlightExtraNodes?: boolean): string;
30
- }
31
- export declare class UnsupportedError extends Error {
34
+ #private;
35
+ constructor(origin: readonly ChildNode[]);
36
+ get matched(): ChildNode[];
37
+ get matchedCount(): number;
38
+ get nodes(): ChildNode[];
39
+ get unmatched(): ChildNode[];
40
+ addMatched(nodes: ChildNode[]): boolean;
41
+ back(): void;
42
+ lock(): void;
43
+ max(max: number): void;
44
+ toString(highlightExtraNodes?: boolean): string;
32
45
  }
46
+ export declare class UnsupportedError extends Error {}
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.UnsupportedError = exports.Collection = exports.isTransparent = exports.isChoice = exports.isZeroOrMore = exports.isOneOrMore = exports.isOptional = exports.isRequire = exports.matches = exports.isModel = exports.getChildNodesWithoutWhitespaces = void 0;
5
5
  const tslib_1 = require("tslib");
6
6
  const selector_1 = require("@markuplint/selector");
7
- const ansi_colors_1 = require("ansi-colors");
7
+ const debug_1 = require("./debug");
8
8
  const represent_transparent_nodes_1 = require("./represent-transparent-nodes");
9
9
  const getChildNodesWithoutWhitespacesCaches = new Map();
10
10
  function getChildNodesWithoutWhitespaces(el) {
@@ -142,33 +142,33 @@ class Collection {
142
142
  const raw = n.is(n.TEXT_NODE) ? `:text(${n.raw.replace(/\n/g, '\\n')})` : n.raw;
143
143
  if (tslib_1.__classPrivateFieldGet(this, _Collection_locked, "f").has(n)) {
144
144
  if (represent_transparent_nodes_1.transparentMode.has(n)) {
145
- out.push(ansi_colors_1.bgBlue.bold(raw));
145
+ out.push(debug_1.bgBlue.bold(raw));
146
146
  }
147
147
  else {
148
- out.push(ansi_colors_1.bgGreen.bold(raw));
148
+ out.push(debug_1.bgGreen.bold(raw));
149
149
  }
150
150
  continue;
151
151
  }
152
152
  if (tslib_1.__classPrivateFieldGet(this, _Collection_matched, "f").has(n)) {
153
153
  if (represent_transparent_nodes_1.transparentMode.has(n)) {
154
- out.push(ansi_colors_1.blue.bold(raw));
154
+ out.push(debug_1.blue.bold(raw));
155
155
  }
156
156
  else {
157
- out.push(ansi_colors_1.green.bold(raw));
157
+ out.push(debug_1.green.bold(raw));
158
158
  }
159
159
  continue;
160
160
  }
161
161
  if (highlightExtraNodes) {
162
162
  if (represent_transparent_nodes_1.transparentMode.has(n)) {
163
- out.push(ansi_colors_1.bgMagenta.bold(raw));
163
+ out.push(debug_1.bgMagenta.bold(raw));
164
164
  }
165
165
  else {
166
- out.push(ansi_colors_1.bgRed.bold(raw));
166
+ out.push(debug_1.bgRed.bold(raw));
167
167
  }
168
168
  continue;
169
169
  }
170
170
  if (represent_transparent_nodes_1.transparentMode.has(n)) {
171
- out.push((0, ansi_colors_1.cyan)(raw));
171
+ out.push((0, debug_1.cyan)(raw));
172
172
  }
173
173
  else {
174
174
  out.push(raw);
@@ -1,6 +1,6 @@
1
1
  import type { ARIAVersion } from '@markuplint/ml-spec';
2
2
  type Option = {
3
- ariaVersion: ARIAVersion;
3
+ ariaVersion: ARIAVersion;
4
4
  };
5
- declare const _default: import("@markuplint/ml-core").RuleSeed<boolean, Option>;
5
+ declare const _default: import('@markuplint/ml-core').RuleSeed<boolean, Option>;
6
6
  export default _default;
@@ -1,7 +1,7 @@
1
1
  type RequiredAttributes = string | (string | Attr)[];
2
2
  type Attr = {
3
- name: string;
4
- value: string | string[];
3
+ name: string;
4
+ value: string | string[];
5
5
  };
6
- declare const _default: import("@markuplint/ml-core").RuleSeed<RequiredAttributes, null>;
6
+ declare const _default: import('@markuplint/ml-core').RuleSeed<RequiredAttributes, null>;
7
7
  export default _default;
@@ -1,5 +1,5 @@
1
1
  type Options = {
2
- ignoreHasMutableContents: boolean;
2
+ ignoreHasMutableContents: boolean;
3
3
  };
4
- declare const _default: import("@markuplint/ml-core").RuleSeed<string[], Options>;
4
+ declare const _default: import('@markuplint/ml-core').RuleSeed<string[], Options>;
5
5
  export default _default;
@@ -1,6 +1,6 @@
1
1
  export interface Options {
2
- 'expected-once': boolean;
3
- 'in-document-fragment': boolean;
2
+ 'expected-once': boolean;
3
+ 'in-document-fragment': boolean;
4
4
  }
5
- declare const _default: import("@markuplint/ml-core").RuleSeed<boolean, Options>;
5
+ declare const _default: import('@markuplint/ml-core').RuleSeed<boolean, Options>;
6
6
  export default _default;
@@ -1,6 +1,6 @@
1
1
  type Bullets = string[];
2
2
  type Options = {
3
- spaceNeededBullets?: string[];
3
+ spaceNeededBullets?: string[];
4
4
  };
5
- declare const _default: import("@markuplint/ml-core").RuleSeed<Bullets, Options>;
5
+ declare const _default: import('@markuplint/ml-core').RuleSeed<Bullets, Options>;
6
6
  export default _default;
@@ -1,6 +1,10 @@
1
1
  import type { Options } from '../types';
2
2
  import type { AttrChecker } from '@markuplint/ml-core';
3
3
  import type { ARIAProperty } from '@markuplint/ml-spec';
4
- export declare const checkingDefaultValue: AttrChecker<boolean, Options, {
5
- propSpecs: ARIAProperty[];
6
- }>;
4
+ export declare const checkingDefaultValue: AttrChecker<
5
+ boolean,
6
+ Options,
7
+ {
8
+ propSpecs: ARIAProperty[];
9
+ }
10
+ >;
@@ -1,7 +1,11 @@
1
1
  import type { Options } from '../types';
2
2
  import type { AttrChecker } from '@markuplint/ml-core';
3
3
  import type { ARIAProperty, ARIARole } from '@markuplint/ml-spec';
4
- export declare const checkingDeprecatedProps: AttrChecker<boolean, Options, {
5
- role: ARIARole | null;
6
- propSpecs: ARIAProperty[];
7
- }>;
4
+ export declare const checkingDeprecatedProps: AttrChecker<
5
+ boolean,
6
+ Options,
7
+ {
8
+ role: ARIARole | null;
9
+ propSpecs: ARIAProperty[];
10
+ }
11
+ >;
@@ -1,7 +1,11 @@
1
1
  import type { Options } from '../types';
2
2
  import type { AttrChecker } from '@markuplint/ml-core';
3
3
  import type { ARIAProperty, ARIARole } from '@markuplint/ml-spec';
4
- export declare const checkingDisallowedProp: AttrChecker<boolean, Options, {
5
- role: ARIARole | null;
6
- propSpecs: ARIAProperty[];
7
- }>;
4
+ export declare const checkingDisallowedProp: AttrChecker<
5
+ boolean,
6
+ Options,
7
+ {
8
+ role: ARIARole | null;
9
+ propSpecs: ARIAProperty[];
10
+ }
11
+ >;
@@ -1,7 +1,11 @@
1
1
  import type { Options } from '../types';
2
2
  import type { AttrChecker } from '@markuplint/ml-core';
3
3
  import type { ARIAProperty, Attribute } from '@markuplint/ml-spec';
4
- export declare const checkingImplicitProps: AttrChecker<boolean, Options, {
5
- propSpecs: ARIAProperty[];
6
- attrSpecs: Attribute[] | null;
7
- }>;
4
+ export declare const checkingImplicitProps: AttrChecker<
5
+ boolean,
6
+ Options,
7
+ {
8
+ propSpecs: ARIAProperty[];
9
+ attrSpecs: Attribute[] | null;
10
+ }
11
+ >;
@@ -1,6 +1,10 @@
1
1
  import type { Options } from '../types';
2
2
  import type { AttrChecker } from '@markuplint/ml-core';
3
3
  import type { ARIAProperty } from '@markuplint/ml-spec';
4
- export declare const checkingNoGlobalProp: AttrChecker<boolean, Options, {
5
- propSpecs: ARIAProperty[];
6
- }>;
4
+ export declare const checkingNoGlobalProp: AttrChecker<
5
+ boolean,
6
+ Options,
7
+ {
8
+ propSpecs: ARIAProperty[];
9
+ }
10
+ >;
@@ -6,6 +6,10 @@ import type { ARIARole } from '@markuplint/ml-spec';
6
6
  *
7
7
  * @see https://w3c.github.io/aria/#mustContain
8
8
  */
9
- export declare const checkingRequiredOwnedElements: ElementChecker<boolean, Options, {
10
- role?: ARIARole | null;
11
- }>;
9
+ export declare const checkingRequiredOwnedElements: ElementChecker<
10
+ boolean,
11
+ Options,
12
+ {
13
+ role?: ARIARole | null;
14
+ }
15
+ >;
@@ -28,16 +28,11 @@ const checkingRequiredOwnedElements = ({ el, role }) => t => {
28
28
  return;
29
29
  }
30
30
  // TODO: Needs to resolve `aria-own`
31
- if (el.isEmpty()) {
32
- return {
33
- scope: el,
34
- message: t('{0}. Or, {1}', t('require {0}', role.requiredOwnedElements.length === 1
35
- ? t('the "{0*}" {1}', role.requiredOwnedElements[0], 'role')
36
- : t('the {0}', 'roles') + `: ${t(role.requiredOwnedElements)}`), t('require {0}', 'aria-busy="true"')),
37
- };
38
- }
39
31
  const children = Array.from(el.childNodes).map(child => {
40
32
  if (child.is(child.ELEMENT_NODE)) {
33
+ if (child.matches('[aria-busy="true" i]')) {
34
+ return [child, 'BUSY'];
35
+ }
41
36
  const computedChild = (0, ml_spec_1.getComputedRole)(child.ownerMLDocument.specs, child, child.rule.options.version);
42
37
  if (role.requiredOwnedElements.some(ownedRole => (0, ml_spec_1.isRequiredOwnedElement)(computedChild, ownedRole, child.ownerMLDocument.specs, child.rule.options.version))) {
43
38
  return [child, 'REQUIRED'];
@@ -49,6 +44,9 @@ const checkingRequiredOwnedElements = ({ el, role }) => t => {
49
44
  }
50
45
  return [null, 'NO_ELEMENT'];
51
46
  });
47
+ if (children.some(([, type]) => type === 'BUSY')) {
48
+ return;
49
+ }
52
50
  /**
53
51
  * > Any element that will be owned by the element with this role.
54
52
  * > For example, an element with the role list
@@ -77,6 +75,14 @@ const checkingRequiredOwnedElements = ({ el, role }) => t => {
77
75
  if (el.hasMutableChildren(true)) {
78
76
  return;
79
77
  }
78
+ if (mayBeBeforeCreated(el)) {
79
+ return {
80
+ scope: el,
81
+ message: t('{0}. Or, {1}', t('require {0}', role.requiredOwnedElements.length === 1
82
+ ? t('the "{0*}" {1}', role.requiredOwnedElements[0], 'role')
83
+ : t('the {0}', 'roles') + `: ${t(role.requiredOwnedElements)}`), t('require {0}', 'aria-busy="true"')),
84
+ };
85
+ }
80
86
  return {
81
87
  scope: el,
82
88
  message: t('{0} expects {1}', t('the "{0*}" {1}', role.name, 'role'), role.requiredOwnedElements.length === 1
@@ -85,3 +91,11 @@ const checkingRequiredOwnedElements = ({ el, role }) => t => {
85
91
  };
86
92
  };
87
93
  exports.checkingRequiredOwnedElements = checkingRequiredOwnedElements;
94
+ function mayBeBeforeCreated(el) {
95
+ if (el.isEmpty()) {
96
+ return true;
97
+ }
98
+ return Array.from(el.children).every(child => {
99
+ return ['script', 'template'].includes(child.localName);
100
+ });
101
+ }
@@ -1,9 +1,15 @@
1
1
  import type { Options } from '../types';
2
2
  import type { ElementChecker } from '@markuplint/ml-core';
3
3
  import type { ARIAProperty, ARIARole } from '@markuplint/ml-spec';
4
- export declare const checkingRequiredProp: ElementChecker<boolean, Options, {
5
- role?: (ARIARole & {
6
- isImplicit?: boolean;
7
- }) | null;
8
- propSpecs: ARIAProperty[];
9
- }>;
4
+ export declare const checkingRequiredProp: ElementChecker<
5
+ boolean,
6
+ Options,
7
+ {
8
+ role?:
9
+ | (ARIARole & {
10
+ isImplicit?: boolean;
11
+ })
12
+ | null;
13
+ propSpecs: ARIAProperty[];
14
+ }
15
+ >;
@@ -1,11 +1,15 @@
1
1
  import type { Options } from '../types';
2
2
  import type { AttrChecker } from '@markuplint/ml-core';
3
3
  import type { ARIAProperty, ARIARole } from '@markuplint/ml-spec';
4
- export declare const checkingValue: AttrChecker<boolean, Options, {
5
- role?: ARIARole | null;
6
- propSpecs: ARIAProperty[];
7
- booleanish?: boolean;
8
- }>;
4
+ export declare const checkingValue: AttrChecker<
5
+ boolean,
6
+ Options,
7
+ {
8
+ role?: ARIARole | null;
9
+ propSpecs: ARIAProperty[];
10
+ booleanish?: boolean;
11
+ }
12
+ >;
9
13
  /**
10
14
  *
11
15
  * @see https://www.w3.org/TR/wai-aria-1.2/#propcharacteristic_value
@@ -1,3 +1,3 @@
1
1
  import type { Options } from './types';
2
- declare const _default: import("@markuplint/ml-core").RuleSeed<boolean, Options>;
2
+ declare const _default: import('@markuplint/ml-core').RuleSeed<boolean, Options>;
3
3
  export default _default;
@@ -1,13 +1,13 @@
1
1
  import type { ARIAVersion } from '@markuplint/ml-spec';
2
2
  export type Options = {
3
- checkingValue: boolean;
4
- checkingDeprecatedProps: boolean;
5
- permittedAriaRoles: boolean;
6
- checkingRequiredOwnedElements: boolean;
7
- checkingPresentationalChildren: boolean;
8
- checkingInteractionInHidden: boolean;
9
- disallowSetImplicitRole: boolean;
10
- disallowSetImplicitProps: boolean;
11
- disallowDefaultValue: boolean;
12
- version: ARIAVersion;
3
+ checkingValue: boolean;
4
+ checkingDeprecatedProps: boolean;
5
+ permittedAriaRoles: boolean;
6
+ checkingRequiredOwnedElements: boolean;
7
+ checkingPresentationalChildren: boolean;
8
+ checkingInteractionInHidden: boolean;
9
+ disallowSetImplicitRole: boolean;
10
+ disallowSetImplicitProps: boolean;
11
+ disallowDefaultValue: boolean;
12
+ version: ARIAVersion;
13
13
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@markuplint/rules",
3
- "version": "3.0.0-rc.2",
3
+ "version": "3.0.0-rc.4",
4
4
  "description": "Built-in rules of markuplint",
5
5
  "repository": "git@github.com:markuplint/markuplint.git",
6
6
  "author": "Yusuke Hirao <yusukehirao@me.com>",
@@ -16,11 +16,14 @@
16
16
  "dev": "tsc --build --watch",
17
17
  "clean": "tsc --build --clean"
18
18
  },
19
+ "browser": {
20
+ "./lib/permitted-contents/debug.js": "./lib/permitted-contents/debug.browser.js"
21
+ },
19
22
  "dependencies": {
20
- "@markuplint/html-spec": "3.0.0-rc.2",
21
- "@markuplint/ml-core": "3.0.0-rc.2",
22
- "@markuplint/ml-spec": "3.0.0-rc.2",
23
- "@markuplint/types": "3.0.0-rc.2",
23
+ "@markuplint/html-spec": "3.0.0-rc.4",
24
+ "@markuplint/ml-core": "3.0.0-rc.4",
25
+ "@markuplint/ml-spec": "3.0.0-rc.4",
26
+ "@markuplint/types": "3.0.0-rc.4",
24
27
  "@ungap/structured-clone": "^1.0.1",
25
28
  "debug": "^4.3.4",
26
29
  "html-entities": "^2.3.3",
@@ -29,5 +32,5 @@
29
32
  "devDependencies": {
30
33
  "@types/debug": "^4.1.7"
31
34
  },
32
- "gitHead": "27a5c8d136f4b0cf8452552cff529dd0a4db6bba"
35
+ "gitHead": "6187135f1c3522eee13cc1e7e1e8501b0fbfa876"
33
36
  }