htmlnano 2.1.2 → 2.1.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 (191) hide show
  1. package/README.md +54 -12
  2. package/dist/_modules/collapseAttributeWhitespace.d.mts +57 -0
  3. package/dist/_modules/collapseAttributeWhitespace.d.ts +57 -0
  4. package/dist/_modules/collapseAttributeWhitespace.js +296 -0
  5. package/dist/_modules/collapseAttributeWhitespace.mjs +293 -0
  6. package/dist/_modules/collapseBooleanAttributes.d.mts +60 -0
  7. package/dist/_modules/collapseBooleanAttributes.d.ts +60 -0
  8. package/dist/_modules/collapseBooleanAttributes.js +159 -0
  9. package/{lib/modules → dist/_modules}/collapseBooleanAttributes.mjs +39 -57
  10. package/dist/_modules/collapseWhitespace.d.mts +57 -0
  11. package/dist/_modules/collapseWhitespace.d.ts +57 -0
  12. package/dist/_modules/collapseWhitespace.js +172 -0
  13. package/dist/_modules/collapseWhitespace.mjs +170 -0
  14. package/dist/_modules/custom.d.mts +57 -0
  15. package/dist/_modules/custom.d.ts +57 -0
  16. package/dist/_modules/custom.js +22 -0
  17. package/dist/_modules/custom.mjs +20 -0
  18. package/dist/_modules/deduplicateAttributeValues.d.mts +56 -0
  19. package/dist/_modules/deduplicateAttributeValues.d.ts +56 -0
  20. package/dist/_modules/deduplicateAttributeValues.js +38 -0
  21. package/dist/_modules/deduplicateAttributeValues.mjs +36 -0
  22. package/dist/_modules/example.d.mts +59 -0
  23. package/dist/_modules/example.d.ts +59 -0
  24. package/dist/_modules/example.js +67 -0
  25. package/dist/_modules/example.mjs +65 -0
  26. package/dist/_modules/mergeScripts.d.mts +56 -0
  27. package/dist/_modules/mergeScripts.d.ts +56 -0
  28. package/dist/_modules/mergeScripts.js +53 -0
  29. package/dist/_modules/mergeScripts.mjs +51 -0
  30. package/dist/_modules/mergeStyles.d.mts +56 -0
  31. package/dist/_modules/mergeStyles.d.ts +56 -0
  32. package/dist/_modules/mergeStyles.js +42 -0
  33. package/dist/_modules/mergeStyles.mjs +40 -0
  34. package/dist/_modules/minifyConditionalComments.d.mts +56 -0
  35. package/dist/_modules/minifyConditionalComments.d.ts +56 -0
  36. package/dist/_modules/minifyConditionalComments.js +54 -0
  37. package/{lib/modules → dist/_modules}/minifyConditionalComments.mjs +21 -22
  38. package/dist/_modules/minifyCss.d.mts +56 -0
  39. package/dist/_modules/minifyCss.d.ts +56 -0
  40. package/dist/_modules/minifyCss.js +84 -0
  41. package/dist/_modules/minifyCss.mjs +82 -0
  42. package/dist/_modules/minifyJs.d.mts +56 -0
  43. package/dist/_modules/minifyJs.d.ts +56 -0
  44. package/dist/_modules/minifyJs.js +108 -0
  45. package/dist/_modules/minifyJs.mjs +106 -0
  46. package/dist/_modules/minifyJson.d.mts +56 -0
  47. package/dist/_modules/minifyJson.d.ts +56 -0
  48. package/dist/_modules/minifyJson.js +35 -0
  49. package/dist/_modules/minifyJson.mjs +33 -0
  50. package/dist/_modules/minifySvg.d.mts +56 -0
  51. package/dist/_modules/minifySvg.d.ts +56 -0
  52. package/dist/_modules/minifySvg.js +40 -0
  53. package/dist/_modules/minifySvg.mjs +38 -0
  54. package/dist/_modules/minifyUrls.d.mts +56 -0
  55. package/dist/_modules/minifyUrls.d.ts +56 -0
  56. package/dist/_modules/minifyUrls.js +180 -0
  57. package/dist/_modules/minifyUrls.mjs +178 -0
  58. package/dist/_modules/normalizeAttributeValues.d.mts +56 -0
  59. package/dist/_modules/normalizeAttributeValues.d.ts +56 -0
  60. package/dist/_modules/normalizeAttributeValues.js +234 -0
  61. package/dist/_modules/normalizeAttributeValues.mjs +232 -0
  62. package/dist/_modules/removeAttributeQuotes.d.mts +56 -0
  63. package/dist/_modules/removeAttributeQuotes.d.ts +56 -0
  64. package/dist/_modules/removeAttributeQuotes.js +15 -0
  65. package/dist/_modules/removeAttributeQuotes.mjs +13 -0
  66. package/dist/_modules/removeComments.d.mts +58 -0
  67. package/dist/_modules/removeComments.d.ts +58 -0
  68. package/dist/_modules/removeComments.js +83 -0
  69. package/{lib/modules → dist/_modules}/removeComments.mjs +24 -35
  70. package/dist/_modules/removeEmptyAttributes.d.mts +56 -0
  71. package/dist/_modules/removeEmptyAttributes.d.ts +56 -0
  72. package/dist/_modules/removeEmptyAttributes.js +197 -0
  73. package/dist/_modules/removeEmptyAttributes.mjs +195 -0
  74. package/dist/_modules/removeOptionalTags.d.mts +56 -0
  75. package/dist/_modules/removeOptionalTags.d.ts +56 -0
  76. package/dist/_modules/removeOptionalTags.js +190 -0
  77. package/{lib/modules → dist/_modules}/removeOptionalTags.mjs +54 -91
  78. package/dist/_modules/removeRedundantAttributes.d.mts +57 -0
  79. package/dist/_modules/removeRedundantAttributes.d.ts +57 -0
  80. package/dist/_modules/removeRedundantAttributes.js +128 -0
  81. package/{lib/modules → dist/_modules}/removeRedundantAttributes.mjs +43 -59
  82. package/dist/_modules/removeUnusedCss.d.mts +60 -0
  83. package/dist/_modules/removeUnusedCss.d.ts +60 -0
  84. package/dist/_modules/removeUnusedCss.js +134 -0
  85. package/dist/_modules/removeUnusedCss.mjs +132 -0
  86. package/dist/_modules/sortAttributes.d.mts +57 -0
  87. package/dist/_modules/sortAttributes.d.ts +57 -0
  88. package/dist/_modules/sortAttributes.js +102 -0
  89. package/{lib/modules → dist/_modules}/sortAttributes.mjs +39 -58
  90. package/dist/_modules/sortAttributesWithLists.d.mts +56 -0
  91. package/dist/_modules/sortAttributesWithLists.d.ts +56 -0
  92. package/dist/_modules/sortAttributesWithLists.js +118 -0
  93. package/{lib/modules → dist/_modules}/sortAttributesWithLists.mjs +41 -59
  94. package/dist/helpers.d.ts +16 -0
  95. package/dist/helpers.js +72 -0
  96. package/dist/helpers.mjs +63 -0
  97. package/dist/index.d.ts +79 -0
  98. package/dist/index.js +223 -0
  99. package/dist/index.mjs +209 -0
  100. package/dist/presets/ampSafe.d.ts +47 -0
  101. package/dist/presets/ampSafe.js +19 -0
  102. package/{lib → dist}/presets/ampSafe.mjs +6 -4
  103. package/dist/presets/max.d.ts +47 -0
  104. package/dist/presets/max.js +28 -0
  105. package/{lib → dist}/presets/max.mjs +6 -4
  106. package/dist/presets/safe.d.ts +47 -0
  107. package/dist/presets/safe.js +60 -0
  108. package/{lib → dist}/presets/safe.mjs +13 -20
  109. package/package.json +53 -56
  110. package/.eslintignore +0 -3
  111. package/CHANGELOG.md +0 -409
  112. package/docs/README.md +0 -33
  113. package/docs/babel.config.js +0 -3
  114. package/docs/docs/010-introduction.md +0 -22
  115. package/docs/docs/020-usage.md +0 -117
  116. package/docs/docs/030-config.md +0 -21
  117. package/docs/docs/040-presets.md +0 -75
  118. package/docs/docs/050-modules.md +0 -855
  119. package/docs/docs/060-contribute.md +0 -16
  120. package/docs/docusaurus.config.js +0 -65
  121. package/docs/netlify.toml +0 -4
  122. package/docs/package-lock.json +0 -21630
  123. package/docs/package.json +0 -40
  124. package/docs/sidebars.js +0 -26
  125. package/docs/versioned_docs/version-1.1.1/010-introduction.md +0 -22
  126. package/docs/versioned_docs/version-1.1.1/020-usage.md +0 -77
  127. package/docs/versioned_docs/version-1.1.1/030-config.md +0 -21
  128. package/docs/versioned_docs/version-1.1.1/040-presets.md +0 -75
  129. package/docs/versioned_docs/version-1.1.1/050-modules.md +0 -785
  130. package/docs/versioned_docs/version-1.1.1/060-contribute.md +0 -16
  131. package/docs/versioned_docs/version-2.0.0/010-introduction.md +0 -22
  132. package/docs/versioned_docs/version-2.0.0/020-usage.md +0 -77
  133. package/docs/versioned_docs/version-2.0.0/030-config.md +0 -21
  134. package/docs/versioned_docs/version-2.0.0/040-presets.md +0 -75
  135. package/docs/versioned_docs/version-2.0.0/050-modules.md +0 -838
  136. package/docs/versioned_docs/version-2.0.0/060-contribute.md +0 -16
  137. package/docs/versioned_sidebars/version-1.1.1-sidebars.json +0 -8
  138. package/docs/versioned_sidebars/version-2.0.0-sidebars.json +0 -8
  139. package/docs/versions.json +0 -4
  140. package/index.cjs +0 -11
  141. package/index.d.cts +0 -3
  142. package/index.d.mts +0 -3
  143. package/index.d.ts +0 -94
  144. package/index.mjs +0 -2
  145. package/lib/helpers.cjs +0 -79
  146. package/lib/helpers.mjs +0 -53
  147. package/lib/htmlnano.cjs +0 -202
  148. package/lib/htmlnano.mjs +0 -198
  149. package/lib/modules/collapseAttributeWhitespace.cjs +0 -86
  150. package/lib/modules/collapseAttributeWhitespace.mjs +0 -104
  151. package/lib/modules/collapseBooleanAttributes.cjs +0 -62
  152. package/lib/modules/collapseWhitespace.cjs +0 -100
  153. package/lib/modules/collapseWhitespace.mjs +0 -132
  154. package/lib/modules/custom.cjs +0 -19
  155. package/lib/modules/custom.mjs +0 -16
  156. package/lib/modules/deduplicateAttributeValues.cjs +0 -38
  157. package/lib/modules/deduplicateAttributeValues.mjs +0 -40
  158. package/lib/modules/example.cjs +0 -85
  159. package/lib/modules/example.mjs +0 -75
  160. package/lib/modules/mergeScripts.cjs +0 -54
  161. package/lib/modules/mergeScripts.mjs +0 -56
  162. package/lib/modules/mergeStyles.cjs +0 -38
  163. package/lib/modules/mergeStyles.mjs +0 -36
  164. package/lib/modules/minifyConditionalComments.cjs +0 -47
  165. package/lib/modules/minifyCss.cjs +0 -73
  166. package/lib/modules/minifyCss.mjs +0 -88
  167. package/lib/modules/minifyJs.cjs +0 -103
  168. package/lib/modules/minifyJs.mjs +0 -121
  169. package/lib/modules/minifyJson.cjs +0 -24
  170. package/lib/modules/minifyJson.mjs +0 -21
  171. package/lib/modules/minifySvg.cjs +0 -37
  172. package/lib/modules/minifySvg.mjs +0 -30
  173. package/lib/modules/minifyUrls.cjs +0 -141
  174. package/lib/modules/minifyUrls.mjs +0 -229
  175. package/lib/modules/normalizeAttributeValues.cjs +0 -120
  176. package/lib/modules/normalizeAttributeValues.mjs +0 -140
  177. package/lib/modules/removeAttributeQuotes.cjs +0 -17
  178. package/lib/modules/removeAttributeQuotes.mjs +0 -12
  179. package/lib/modules/removeComments.cjs +0 -86
  180. package/lib/modules/removeEmptyAttributes.cjs +0 -72
  181. package/lib/modules/removeEmptyAttributes.mjs +0 -121
  182. package/lib/modules/removeOptionalTags.cjs +0 -183
  183. package/lib/modules/removeRedundantAttributes.cjs +0 -112
  184. package/lib/modules/removeUnusedCss.cjs +0 -113
  185. package/lib/modules/removeUnusedCss.mjs +0 -122
  186. package/lib/modules/sortAttributes.cjs +0 -98
  187. package/lib/modules/sortAttributesWithLists.cjs +0 -114
  188. package/lib/presets/ampSafe.cjs +0 -18
  189. package/lib/presets/max.cjs +0 -27
  190. package/lib/presets/safe.cjs +0 -65
  191. package/test.js +0 -23
@@ -0,0 +1,56 @@
1
+ import PostHTML from 'posthtml';
2
+ import { MinifyOptions } from 'terser';
3
+ import { Options } from 'cssnano';
4
+ import { Config } from 'svgo';
5
+
6
+ type PostHTMLTreeLike = [PostHTML.Node] & PostHTML.NodeAPI & {
7
+ options?: {
8
+ quoteAllAttributes?: boolean | undefined;
9
+ } | undefined;
10
+ render(): string;
11
+ render(node: PostHTML.Node | PostHTMLTreeLike, renderOptions?: any): string;
12
+ };
13
+ type MaybeArray<T> = T | Array<T>;
14
+ type PostHTMLNodeLike = PostHTML.Node | string;
15
+ interface HtmlnanoOptions {
16
+ skipConfigLoading?: boolean;
17
+ skipInternalWarnings?: boolean;
18
+ collapseAttributeWhitespace?: boolean;
19
+ collapseBooleanAttributes?: {
20
+ amphtml?: boolean;
21
+ };
22
+ collapseWhitespace?: 'conservative' | 'all' | 'aggressive';
23
+ custom?: MaybeArray<(tree: PostHTMLTreeLike, options?: any) => (PostHTML.Node | PostHTMLTreeLike)>;
24
+ deduplicateAttributeValues?: boolean;
25
+ minifyUrls?: URL | string | false;
26
+ mergeStyles?: boolean;
27
+ mergeScripts?: boolean;
28
+ minifyCss?: Options | boolean;
29
+ minifyConditionalComments?: boolean;
30
+ minifyJs?: MinifyOptions | boolean;
31
+ minifyJson?: boolean;
32
+ minifySvg?: Config | boolean;
33
+ normalizeAttributeValues?: boolean;
34
+ removeAttributeQuotes?: boolean;
35
+ removeComments?: boolean | 'safe' | 'all' | RegExp | ((comment: string) => boolean);
36
+ removeEmptyAttributes?: boolean;
37
+ removeRedundantAttributes?: boolean;
38
+ removeOptionalTags?: boolean;
39
+ removeUnusedCss?: boolean;
40
+ sortAttributes?: boolean | 'alphabetical' | 'frequency';
41
+ sortAttributesWithLists?: boolean | 'alphabetical' | 'frequency';
42
+ }
43
+ type HtmlnanoModuleAttrsHandler = (attrs: Record<string, string | boolean | void>, node: PostHTML.Node) => Record<string, string | boolean | void>;
44
+ type HtmlnanoModuleContentHandler = (content: Array<PostHTMLNodeLike>, node: PostHTML.Node) => MaybeArray<PostHTMLNodeLike>;
45
+ type HtmlnanoModuleNodeHandler = (node: PostHTMLNodeLike) => PostHTML.Node | string;
46
+ type OptionalOptions<T> = T extends boolean | string | Function | number | null | undefined ? T : T extends object ? Partial<T> : T;
47
+ type HtmlnanoModule<Options = any> = {
48
+ onAttrs?: (options: Partial<HtmlnanoOptions>, moduleOptions: OptionalOptions<Options>) => HtmlnanoModuleAttrsHandler;
49
+ onContent?: (options: Partial<HtmlnanoOptions>, moduleOptions: OptionalOptions<Options>) => HtmlnanoModuleContentHandler;
50
+ onNode?: (options: Partial<HtmlnanoOptions>, moduleOptions: OptionalOptions<Options>) => HtmlnanoModuleNodeHandler;
51
+ default?: (tree: PostHTMLTreeLike, options: Partial<HtmlnanoOptions>, moduleOptions: OptionalOptions<Options>) => PostHTMLTreeLike | Promise<PostHTMLTreeLike>;
52
+ };
53
+
54
+ declare const mod: HtmlnanoModule;
55
+
56
+ export { mod as default };
@@ -0,0 +1,56 @@
1
+ import PostHTML from 'posthtml';
2
+ import { MinifyOptions } from 'terser';
3
+ import { Options } from 'cssnano';
4
+ import { Config } from 'svgo';
5
+
6
+ type PostHTMLTreeLike = [PostHTML.Node] & PostHTML.NodeAPI & {
7
+ options?: {
8
+ quoteAllAttributes?: boolean | undefined;
9
+ } | undefined;
10
+ render(): string;
11
+ render(node: PostHTML.Node | PostHTMLTreeLike, renderOptions?: any): string;
12
+ };
13
+ type MaybeArray<T> = T | Array<T>;
14
+ type PostHTMLNodeLike = PostHTML.Node | string;
15
+ interface HtmlnanoOptions {
16
+ skipConfigLoading?: boolean;
17
+ skipInternalWarnings?: boolean;
18
+ collapseAttributeWhitespace?: boolean;
19
+ collapseBooleanAttributes?: {
20
+ amphtml?: boolean;
21
+ };
22
+ collapseWhitespace?: 'conservative' | 'all' | 'aggressive';
23
+ custom?: MaybeArray<(tree: PostHTMLTreeLike, options?: any) => (PostHTML.Node | PostHTMLTreeLike)>;
24
+ deduplicateAttributeValues?: boolean;
25
+ minifyUrls?: URL | string | false;
26
+ mergeStyles?: boolean;
27
+ mergeScripts?: boolean;
28
+ minifyCss?: Options | boolean;
29
+ minifyConditionalComments?: boolean;
30
+ minifyJs?: MinifyOptions | boolean;
31
+ minifyJson?: boolean;
32
+ minifySvg?: Config | boolean;
33
+ normalizeAttributeValues?: boolean;
34
+ removeAttributeQuotes?: boolean;
35
+ removeComments?: boolean | 'safe' | 'all' | RegExp | ((comment: string) => boolean);
36
+ removeEmptyAttributes?: boolean;
37
+ removeRedundantAttributes?: boolean;
38
+ removeOptionalTags?: boolean;
39
+ removeUnusedCss?: boolean;
40
+ sortAttributes?: boolean | 'alphabetical' | 'frequency';
41
+ sortAttributesWithLists?: boolean | 'alphabetical' | 'frequency';
42
+ }
43
+ type HtmlnanoModuleAttrsHandler = (attrs: Record<string, string | boolean | void>, node: PostHTML.Node) => Record<string, string | boolean | void>;
44
+ type HtmlnanoModuleContentHandler = (content: Array<PostHTMLNodeLike>, node: PostHTML.Node) => MaybeArray<PostHTMLNodeLike>;
45
+ type HtmlnanoModuleNodeHandler = (node: PostHTMLNodeLike) => PostHTML.Node | string;
46
+ type OptionalOptions<T> = T extends boolean | string | Function | number | null | undefined ? T : T extends object ? Partial<T> : T;
47
+ type HtmlnanoModule<Options = any> = {
48
+ onAttrs?: (options: Partial<HtmlnanoOptions>, moduleOptions: OptionalOptions<Options>) => HtmlnanoModuleAttrsHandler;
49
+ onContent?: (options: Partial<HtmlnanoOptions>, moduleOptions: OptionalOptions<Options>) => HtmlnanoModuleContentHandler;
50
+ onNode?: (options: Partial<HtmlnanoOptions>, moduleOptions: OptionalOptions<Options>) => HtmlnanoModuleNodeHandler;
51
+ default?: (tree: PostHTMLTreeLike, options: Partial<HtmlnanoOptions>, moduleOptions: OptionalOptions<Options>) => PostHTMLTreeLike | Promise<PostHTMLTreeLike>;
52
+ };
53
+
54
+ declare const mod: HtmlnanoModule;
55
+
56
+ export { mod as default };
@@ -0,0 +1,234 @@
1
+ Object.defineProperty(exports, '__esModule', { value: true });
2
+
3
+ const caseInsensitiveAttributes = {
4
+ autocomplete: [
5
+ 'form'
6
+ ],
7
+ charset: [
8
+ 'meta',
9
+ 'script'
10
+ ],
11
+ contenteditable: null,
12
+ crossorigin: [
13
+ 'audio',
14
+ 'img',
15
+ 'link',
16
+ 'script',
17
+ 'video'
18
+ ],
19
+ dir: null,
20
+ draggable: null,
21
+ dropzone: null,
22
+ formmethod: [
23
+ 'button',
24
+ 'input'
25
+ ],
26
+ inputmode: [
27
+ 'input',
28
+ 'textarea'
29
+ ],
30
+ kind: [
31
+ 'track'
32
+ ],
33
+ method: [
34
+ 'form'
35
+ ],
36
+ preload: [
37
+ 'audio',
38
+ 'video'
39
+ ],
40
+ referrerpolicy: null,
41
+ sandbox: [
42
+ 'iframe'
43
+ ],
44
+ spellcheck: null,
45
+ scope: [
46
+ 'th'
47
+ ],
48
+ shape: [
49
+ 'area'
50
+ ],
51
+ sizes: [
52
+ 'link'
53
+ ],
54
+ step: [
55
+ 'input'
56
+ ],
57
+ translate: null,
58
+ type: [
59
+ 'a',
60
+ 'link',
61
+ 'button',
62
+ 'embed',
63
+ 'object',
64
+ 'script',
65
+ 'source',
66
+ 'style',
67
+ 'input',
68
+ 'menu',
69
+ 'menuitem'
70
+ ],
71
+ wrap: [
72
+ 'textarea'
73
+ ]
74
+ };
75
+ // https://html.spec.whatwg.org/#invalid-value-default
76
+ const invalidValueDefault = {
77
+ crossorigin: {
78
+ tag: null,
79
+ default: 'anonymous',
80
+ valid: [
81
+ '',
82
+ 'anonymous',
83
+ 'use-credentials'
84
+ ]
85
+ },
86
+ // https://html.spec.whatwg.org/#referrer-policy-attributes
87
+ // The attribute's invalid value default and missing value default are both the empty string state.
88
+ referrerpolicy: {
89
+ tag: null,
90
+ default: '',
91
+ valid: [
92
+ '',
93
+ 'url',
94
+ 'origin',
95
+ 'no-referrer',
96
+ 'no-referrer-when-downgrade',
97
+ 'same-origin',
98
+ 'origin-when-cross-origin',
99
+ 'strict-origin-when-cross-origin',
100
+ 'unsafe-url'
101
+ ]
102
+ },
103
+ // https://html.spec.whatwg.org/#lazy-loading-attributes
104
+ loading: {
105
+ tag: [
106
+ 'img',
107
+ 'iframe'
108
+ ],
109
+ default: 'eager',
110
+ valid: [
111
+ 'lazy',
112
+ 'eager'
113
+ ]
114
+ },
115
+ // https://html.spec.whatwg.org/#the-img-element
116
+ // https://html.spec.whatwg.org/#image-decoding-hint
117
+ decoding: {
118
+ tag: [
119
+ 'img'
120
+ ],
121
+ default: 'auto',
122
+ valid: [
123
+ 'auto',
124
+ 'sync',
125
+ 'async'
126
+ ]
127
+ },
128
+ // https://html.spec.whatwg.org/#the-track-element
129
+ kind: {
130
+ tag: [
131
+ 'track'
132
+ ],
133
+ default: 'metadata',
134
+ valid: [
135
+ 'subtitles',
136
+ 'captions',
137
+ 'descriptions',
138
+ 'chapters',
139
+ 'metadata'
140
+ ]
141
+ },
142
+ type: {
143
+ tag: [
144
+ 'button'
145
+ ],
146
+ default: 'submit',
147
+ valid: [
148
+ 'submit',
149
+ 'reset',
150
+ 'button'
151
+ ]
152
+ },
153
+ wrap: {
154
+ tag: [
155
+ 'textarea'
156
+ ],
157
+ default: 'soft',
158
+ valid: [
159
+ 'soft',
160
+ 'hard'
161
+ ]
162
+ },
163
+ // https://html.spec.whatwg.org/#the-hidden-attribute
164
+ hidden: {
165
+ tag: null,
166
+ default: 'hidden',
167
+ valid: [
168
+ 'hidden',
169
+ 'until-found'
170
+ ]
171
+ },
172
+ // https://html.spec.whatwg.org/#autocapitalization
173
+ autocapitalize: {
174
+ tag: null,
175
+ default: 'sentences',
176
+ valid: [
177
+ 'none',
178
+ 'off',
179
+ 'on',
180
+ 'sentences',
181
+ 'words',
182
+ 'characters'
183
+ ]
184
+ },
185
+ // https://html.spec.whatwg.org/#the-marquee-element
186
+ behavior: {
187
+ tag: [
188
+ 'marquee'
189
+ ],
190
+ default: 'scroll',
191
+ valid: [
192
+ 'scroll',
193
+ 'slide',
194
+ 'alternate'
195
+ ]
196
+ },
197
+ direction: {
198
+ tag: [
199
+ 'marquee'
200
+ ],
201
+ default: 'left',
202
+ valid: [
203
+ 'left',
204
+ 'right',
205
+ 'up',
206
+ 'down'
207
+ ]
208
+ }
209
+ };
210
+ const mod = {
211
+ onAttrs () {
212
+ return (attrs, node)=>{
213
+ const newAttrs = attrs;
214
+ Object.entries(attrs).forEach(([attrName, attrValue])=>{
215
+ let newAttrValue = attrValue;
216
+ if (Object.hasOwnProperty.call(caseInsensitiveAttributes, attrName) && (caseInsensitiveAttributes[attrName] === null || node.tag && caseInsensitiveAttributes[attrName].includes(node.tag))) {
217
+ newAttrValue = typeof attrValue === 'string' ? attrValue.toLowerCase() : attrValue;
218
+ }
219
+ if (Object.hasOwnProperty.call(invalidValueDefault, attrName)) {
220
+ const meta = invalidValueDefault[attrName];
221
+ if (meta.tag === null || node && node.tag && meta.tag.includes(node.tag)) {
222
+ if (typeof newAttrValue !== 'string' || !meta.valid.includes(newAttrValue)) {
223
+ newAttrValue = meta.default;
224
+ }
225
+ }
226
+ }
227
+ newAttrs[attrName] = newAttrValue;
228
+ });
229
+ return newAttrs;
230
+ };
231
+ }
232
+ };
233
+
234
+ exports.default = mod;
@@ -0,0 +1,232 @@
1
+ const caseInsensitiveAttributes = {
2
+ autocomplete: [
3
+ 'form'
4
+ ],
5
+ charset: [
6
+ 'meta',
7
+ 'script'
8
+ ],
9
+ contenteditable: null,
10
+ crossorigin: [
11
+ 'audio',
12
+ 'img',
13
+ 'link',
14
+ 'script',
15
+ 'video'
16
+ ],
17
+ dir: null,
18
+ draggable: null,
19
+ dropzone: null,
20
+ formmethod: [
21
+ 'button',
22
+ 'input'
23
+ ],
24
+ inputmode: [
25
+ 'input',
26
+ 'textarea'
27
+ ],
28
+ kind: [
29
+ 'track'
30
+ ],
31
+ method: [
32
+ 'form'
33
+ ],
34
+ preload: [
35
+ 'audio',
36
+ 'video'
37
+ ],
38
+ referrerpolicy: null,
39
+ sandbox: [
40
+ 'iframe'
41
+ ],
42
+ spellcheck: null,
43
+ scope: [
44
+ 'th'
45
+ ],
46
+ shape: [
47
+ 'area'
48
+ ],
49
+ sizes: [
50
+ 'link'
51
+ ],
52
+ step: [
53
+ 'input'
54
+ ],
55
+ translate: null,
56
+ type: [
57
+ 'a',
58
+ 'link',
59
+ 'button',
60
+ 'embed',
61
+ 'object',
62
+ 'script',
63
+ 'source',
64
+ 'style',
65
+ 'input',
66
+ 'menu',
67
+ 'menuitem'
68
+ ],
69
+ wrap: [
70
+ 'textarea'
71
+ ]
72
+ };
73
+ // https://html.spec.whatwg.org/#invalid-value-default
74
+ const invalidValueDefault = {
75
+ crossorigin: {
76
+ tag: null,
77
+ default: 'anonymous',
78
+ valid: [
79
+ '',
80
+ 'anonymous',
81
+ 'use-credentials'
82
+ ]
83
+ },
84
+ // https://html.spec.whatwg.org/#referrer-policy-attributes
85
+ // The attribute's invalid value default and missing value default are both the empty string state.
86
+ referrerpolicy: {
87
+ tag: null,
88
+ default: '',
89
+ valid: [
90
+ '',
91
+ 'url',
92
+ 'origin',
93
+ 'no-referrer',
94
+ 'no-referrer-when-downgrade',
95
+ 'same-origin',
96
+ 'origin-when-cross-origin',
97
+ 'strict-origin-when-cross-origin',
98
+ 'unsafe-url'
99
+ ]
100
+ },
101
+ // https://html.spec.whatwg.org/#lazy-loading-attributes
102
+ loading: {
103
+ tag: [
104
+ 'img',
105
+ 'iframe'
106
+ ],
107
+ default: 'eager',
108
+ valid: [
109
+ 'lazy',
110
+ 'eager'
111
+ ]
112
+ },
113
+ // https://html.spec.whatwg.org/#the-img-element
114
+ // https://html.spec.whatwg.org/#image-decoding-hint
115
+ decoding: {
116
+ tag: [
117
+ 'img'
118
+ ],
119
+ default: 'auto',
120
+ valid: [
121
+ 'auto',
122
+ 'sync',
123
+ 'async'
124
+ ]
125
+ },
126
+ // https://html.spec.whatwg.org/#the-track-element
127
+ kind: {
128
+ tag: [
129
+ 'track'
130
+ ],
131
+ default: 'metadata',
132
+ valid: [
133
+ 'subtitles',
134
+ 'captions',
135
+ 'descriptions',
136
+ 'chapters',
137
+ 'metadata'
138
+ ]
139
+ },
140
+ type: {
141
+ tag: [
142
+ 'button'
143
+ ],
144
+ default: 'submit',
145
+ valid: [
146
+ 'submit',
147
+ 'reset',
148
+ 'button'
149
+ ]
150
+ },
151
+ wrap: {
152
+ tag: [
153
+ 'textarea'
154
+ ],
155
+ default: 'soft',
156
+ valid: [
157
+ 'soft',
158
+ 'hard'
159
+ ]
160
+ },
161
+ // https://html.spec.whatwg.org/#the-hidden-attribute
162
+ hidden: {
163
+ tag: null,
164
+ default: 'hidden',
165
+ valid: [
166
+ 'hidden',
167
+ 'until-found'
168
+ ]
169
+ },
170
+ // https://html.spec.whatwg.org/#autocapitalization
171
+ autocapitalize: {
172
+ tag: null,
173
+ default: 'sentences',
174
+ valid: [
175
+ 'none',
176
+ 'off',
177
+ 'on',
178
+ 'sentences',
179
+ 'words',
180
+ 'characters'
181
+ ]
182
+ },
183
+ // https://html.spec.whatwg.org/#the-marquee-element
184
+ behavior: {
185
+ tag: [
186
+ 'marquee'
187
+ ],
188
+ default: 'scroll',
189
+ valid: [
190
+ 'scroll',
191
+ 'slide',
192
+ 'alternate'
193
+ ]
194
+ },
195
+ direction: {
196
+ tag: [
197
+ 'marquee'
198
+ ],
199
+ default: 'left',
200
+ valid: [
201
+ 'left',
202
+ 'right',
203
+ 'up',
204
+ 'down'
205
+ ]
206
+ }
207
+ };
208
+ const mod = {
209
+ onAttrs () {
210
+ return (attrs, node)=>{
211
+ const newAttrs = attrs;
212
+ Object.entries(attrs).forEach(([attrName, attrValue])=>{
213
+ let newAttrValue = attrValue;
214
+ if (Object.hasOwnProperty.call(caseInsensitiveAttributes, attrName) && (caseInsensitiveAttributes[attrName] === null || node.tag && caseInsensitiveAttributes[attrName].includes(node.tag))) {
215
+ newAttrValue = typeof attrValue === 'string' ? attrValue.toLowerCase() : attrValue;
216
+ }
217
+ if (Object.hasOwnProperty.call(invalidValueDefault, attrName)) {
218
+ const meta = invalidValueDefault[attrName];
219
+ if (meta.tag === null || node && node.tag && meta.tag.includes(node.tag)) {
220
+ if (typeof newAttrValue !== 'string' || !meta.valid.includes(newAttrValue)) {
221
+ newAttrValue = meta.default;
222
+ }
223
+ }
224
+ }
225
+ newAttrs[attrName] = newAttrValue;
226
+ });
227
+ return newAttrs;
228
+ };
229
+ }
230
+ };
231
+
232
+ export { mod as default };
@@ -0,0 +1,56 @@
1
+ import PostHTML from 'posthtml';
2
+ import { MinifyOptions } from 'terser';
3
+ import { Options } from 'cssnano';
4
+ import { Config } from 'svgo';
5
+
6
+ type PostHTMLTreeLike = [PostHTML.Node] & PostHTML.NodeAPI & {
7
+ options?: {
8
+ quoteAllAttributes?: boolean | undefined;
9
+ } | undefined;
10
+ render(): string;
11
+ render(node: PostHTML.Node | PostHTMLTreeLike, renderOptions?: any): string;
12
+ };
13
+ type MaybeArray<T> = T | Array<T>;
14
+ type PostHTMLNodeLike = PostHTML.Node | string;
15
+ interface HtmlnanoOptions {
16
+ skipConfigLoading?: boolean;
17
+ skipInternalWarnings?: boolean;
18
+ collapseAttributeWhitespace?: boolean;
19
+ collapseBooleanAttributes?: {
20
+ amphtml?: boolean;
21
+ };
22
+ collapseWhitespace?: 'conservative' | 'all' | 'aggressive';
23
+ custom?: MaybeArray<(tree: PostHTMLTreeLike, options?: any) => (PostHTML.Node | PostHTMLTreeLike)>;
24
+ deduplicateAttributeValues?: boolean;
25
+ minifyUrls?: URL | string | false;
26
+ mergeStyles?: boolean;
27
+ mergeScripts?: boolean;
28
+ minifyCss?: Options | boolean;
29
+ minifyConditionalComments?: boolean;
30
+ minifyJs?: MinifyOptions | boolean;
31
+ minifyJson?: boolean;
32
+ minifySvg?: Config | boolean;
33
+ normalizeAttributeValues?: boolean;
34
+ removeAttributeQuotes?: boolean;
35
+ removeComments?: boolean | 'safe' | 'all' | RegExp | ((comment: string) => boolean);
36
+ removeEmptyAttributes?: boolean;
37
+ removeRedundantAttributes?: boolean;
38
+ removeOptionalTags?: boolean;
39
+ removeUnusedCss?: boolean;
40
+ sortAttributes?: boolean | 'alphabetical' | 'frequency';
41
+ sortAttributesWithLists?: boolean | 'alphabetical' | 'frequency';
42
+ }
43
+ type HtmlnanoModuleAttrsHandler = (attrs: Record<string, string | boolean | void>, node: PostHTML.Node) => Record<string, string | boolean | void>;
44
+ type HtmlnanoModuleContentHandler = (content: Array<PostHTMLNodeLike>, node: PostHTML.Node) => MaybeArray<PostHTMLNodeLike>;
45
+ type HtmlnanoModuleNodeHandler = (node: PostHTMLNodeLike) => PostHTML.Node | string;
46
+ type OptionalOptions<T> = T extends boolean | string | Function | number | null | undefined ? T : T extends object ? Partial<T> : T;
47
+ type HtmlnanoModule<Options = any> = {
48
+ onAttrs?: (options: Partial<HtmlnanoOptions>, moduleOptions: OptionalOptions<Options>) => HtmlnanoModuleAttrsHandler;
49
+ onContent?: (options: Partial<HtmlnanoOptions>, moduleOptions: OptionalOptions<Options>) => HtmlnanoModuleContentHandler;
50
+ onNode?: (options: Partial<HtmlnanoOptions>, moduleOptions: OptionalOptions<Options>) => HtmlnanoModuleNodeHandler;
51
+ default?: (tree: PostHTMLTreeLike, options: Partial<HtmlnanoOptions>, moduleOptions: OptionalOptions<Options>) => PostHTMLTreeLike | Promise<PostHTMLTreeLike>;
52
+ };
53
+
54
+ declare const mod: HtmlnanoModule;
55
+
56
+ export { mod as default };
@@ -0,0 +1,56 @@
1
+ import PostHTML from 'posthtml';
2
+ import { MinifyOptions } from 'terser';
3
+ import { Options } from 'cssnano';
4
+ import { Config } from 'svgo';
5
+
6
+ type PostHTMLTreeLike = [PostHTML.Node] & PostHTML.NodeAPI & {
7
+ options?: {
8
+ quoteAllAttributes?: boolean | undefined;
9
+ } | undefined;
10
+ render(): string;
11
+ render(node: PostHTML.Node | PostHTMLTreeLike, renderOptions?: any): string;
12
+ };
13
+ type MaybeArray<T> = T | Array<T>;
14
+ type PostHTMLNodeLike = PostHTML.Node | string;
15
+ interface HtmlnanoOptions {
16
+ skipConfigLoading?: boolean;
17
+ skipInternalWarnings?: boolean;
18
+ collapseAttributeWhitespace?: boolean;
19
+ collapseBooleanAttributes?: {
20
+ amphtml?: boolean;
21
+ };
22
+ collapseWhitespace?: 'conservative' | 'all' | 'aggressive';
23
+ custom?: MaybeArray<(tree: PostHTMLTreeLike, options?: any) => (PostHTML.Node | PostHTMLTreeLike)>;
24
+ deduplicateAttributeValues?: boolean;
25
+ minifyUrls?: URL | string | false;
26
+ mergeStyles?: boolean;
27
+ mergeScripts?: boolean;
28
+ minifyCss?: Options | boolean;
29
+ minifyConditionalComments?: boolean;
30
+ minifyJs?: MinifyOptions | boolean;
31
+ minifyJson?: boolean;
32
+ minifySvg?: Config | boolean;
33
+ normalizeAttributeValues?: boolean;
34
+ removeAttributeQuotes?: boolean;
35
+ removeComments?: boolean | 'safe' | 'all' | RegExp | ((comment: string) => boolean);
36
+ removeEmptyAttributes?: boolean;
37
+ removeRedundantAttributes?: boolean;
38
+ removeOptionalTags?: boolean;
39
+ removeUnusedCss?: boolean;
40
+ sortAttributes?: boolean | 'alphabetical' | 'frequency';
41
+ sortAttributesWithLists?: boolean | 'alphabetical' | 'frequency';
42
+ }
43
+ type HtmlnanoModuleAttrsHandler = (attrs: Record<string, string | boolean | void>, node: PostHTML.Node) => Record<string, string | boolean | void>;
44
+ type HtmlnanoModuleContentHandler = (content: Array<PostHTMLNodeLike>, node: PostHTML.Node) => MaybeArray<PostHTMLNodeLike>;
45
+ type HtmlnanoModuleNodeHandler = (node: PostHTMLNodeLike) => PostHTML.Node | string;
46
+ type OptionalOptions<T> = T extends boolean | string | Function | number | null | undefined ? T : T extends object ? Partial<T> : T;
47
+ type HtmlnanoModule<Options = any> = {
48
+ onAttrs?: (options: Partial<HtmlnanoOptions>, moduleOptions: OptionalOptions<Options>) => HtmlnanoModuleAttrsHandler;
49
+ onContent?: (options: Partial<HtmlnanoOptions>, moduleOptions: OptionalOptions<Options>) => HtmlnanoModuleContentHandler;
50
+ onNode?: (options: Partial<HtmlnanoOptions>, moduleOptions: OptionalOptions<Options>) => HtmlnanoModuleNodeHandler;
51
+ default?: (tree: PostHTMLTreeLike, options: Partial<HtmlnanoOptions>, moduleOptions: OptionalOptions<Options>) => PostHTMLTreeLike | Promise<PostHTMLTreeLike>;
52
+ };
53
+
54
+ declare const mod: HtmlnanoModule;
55
+
56
+ export { mod as default };