@html-validate/plugin-utils 2.0.0 → 2.0.2
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/dist/{index.cjs.js → cjs/index.cjs} +8 -4
- package/dist/cjs/index.cjs.map +7 -0
- package/dist/esm/index.d.mts +75 -0
- package/dist/{index.esm.js → esm/index.mjs} +4 -0
- package/dist/esm/index.mjs.map +7 -0
- package/package.json +11 -7
- /package/dist/{index.d.ts → cjs/index.d.cts} +0 -0
- /package/dist/{tsdoc-metadata.json → cjs/tsdoc-metadata.json} +0 -0
|
@@ -27,14 +27,14 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
27
27
|
));
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
29
|
|
|
30
|
-
// src/
|
|
31
|
-
var
|
|
32
|
-
__export(
|
|
30
|
+
// src/entry-cjs.ts
|
|
31
|
+
var entry_cjs_exports = {};
|
|
32
|
+
__export(entry_cjs_exports, {
|
|
33
33
|
TemplateExtractor: () => TemplateExtractor,
|
|
34
34
|
positionFromOffset: () => positionFromOffset,
|
|
35
35
|
positionToOffset: () => positionToOffset
|
|
36
36
|
});
|
|
37
|
-
module.exports = __toCommonJS(
|
|
37
|
+
module.exports = __toCommonJS(entry_cjs_exports);
|
|
38
38
|
|
|
39
39
|
// src/position-from-offset.ts
|
|
40
40
|
function positionFromOffset(text, offset) {
|
|
@@ -151,6 +151,9 @@ function compareKey(node, key, filename) {
|
|
|
151
151
|
}
|
|
152
152
|
}
|
|
153
153
|
var TemplateExtractor = class _TemplateExtractor {
|
|
154
|
+
ast;
|
|
155
|
+
filename;
|
|
156
|
+
data;
|
|
154
157
|
constructor(ast, filename, data) {
|
|
155
158
|
this.ast = ast;
|
|
156
159
|
this.filename = filename;
|
|
@@ -215,3 +218,4 @@ var TemplateExtractor = class _TemplateExtractor {
|
|
|
215
218
|
positionFromOffset,
|
|
216
219
|
positionToOffset
|
|
217
220
|
});
|
|
221
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/entry-cjs.ts", "../../src/position-from-offset.ts", "../../src/position-to-offset.ts", "../../src/template-extractor.ts"],
|
|
4
|
+
"sourcesContent": ["/* istanbul ignore file */\n\nexport * from \"./index\";\n", "/**\n * Given an offset into a source, calculate the corresponding line and column.\n *\n * @public\n * @since 1.0.0\n */\nexport function positionFromOffset(text: string, offset: number): [line: number, column: number] {\n\tlet line = 1;\n\tlet prev = 0;\n\tlet pos = text.indexOf(\"\\n\");\n\n\t/* step one line at a time until newline position is beyond wanted offset */\n\twhile (pos !== -1) {\n\t\tif (pos >= offset) {\n\t\t\treturn [line, offset - prev + 1];\n\t\t}\n\t\tline++;\n\t\tprev = pos + 1;\n\t\tpos = text.indexOf(\"\\n\", pos + 1);\n\t}\n\n\t/* missing final newline */\n\treturn [line, offset - prev + 1];\n}\n", "import { type Position } from \"./position\";\n\n/**\n * Compute source offset from line and column and the given markup.\n *\n * @public\n * @since 1.0.0\n * @param position - Line and column.\n * @param data - Source markup.\n * @returns The byte offset into the markup which line and column corresponds to.\n */\nexport function positionToOffset(position: Position, data: string): number {\n\tlet line = position.line;\n\tlet column = position.column + 1;\n\tfor (let i = 0; i < data.length; i++) {\n\t\tif (line > 1) {\n\t\t\t/* not yet on the correct line */\n\t\t\tif (data[i] === \"\\n\") {\n\t\t\t\tline--;\n\t\t\t}\n\t\t} else if (column > 1) {\n\t\t\t/* not yet on the correct column */\n\t\t\tcolumn--;\n\t\t} else {\n\t\t\t/* line/column found, return current position */\n\t\t\treturn i;\n\t\t}\n\t}\n\t/* istanbul ignore next: should never reach this line unless espree passes bad\n\t * positions, no sane way to test */\n\tthrow new Error(\"Failed to compute location offset from position\");\n}\n", "/* eslint-disable @typescript-eslint/no-non-null-assertion -- declarations say\n * location fields are optional but they are always present when `{loc: true}` */\n\nimport * as espree from \"espree\";\nimport * as walk from \"acorn-walk\";\n\n/* eslint-disable-next-line n/no-extraneous-import -- type is pulled via acorn-walk */\nimport { type Node } from \"acorn\";\n\nimport { type Source } from \"html-validate\";\nimport { positionToOffset } from \"./position-to-offset\";\n\n/* espree puts location information a bit different than estree */\ndeclare module \"estree\" {\n\tinterface TemplateElement {\n\t\tstart: number;\n\t\tend: number;\n\t}\n}\n\nfunction joinTemplateLiteral(nodes: espree.TemplateElement[]): string {\n\tlet offset = nodes[0].start + 1;\n\tlet output = \"\";\n\tfor (const node of nodes) {\n\t\toutput += \" \".repeat(node.start + 1 - offset);\n\t\toutput += node.value.raw;\n\t\toffset = node.end - 2;\n\t}\n\treturn output;\n}\n\nfunction extractLiteral(\n\tnode: espree.Expression | espree.Pattern | espree.Literal | espree.BlockStatement,\n\tfilename: string,\n\tdata: string,\n): Source | null {\n\tswitch (node.type) {\n\t\t/* ignored nodes */\n\t\tcase \"FunctionExpression\":\n\t\tcase \"Identifier\":\n\t\t\treturn null;\n\n\t\tcase \"Literal\":\n\t\t\tif (typeof node.value !== \"string\") {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tdata: node.value.toString(),\n\t\t\t\tfilename,\n\t\t\t\tline: node.loc!.start.line,\n\t\t\t\tcolumn: node.loc!.start.column + 1,\n\t\t\t\toffset: positionToOffset(node.loc!.start, data) + 1,\n\t\t\t};\n\n\t\tcase \"TemplateLiteral\":\n\t\t\treturn {\n\t\t\t\tdata: joinTemplateLiteral(node.quasis),\n\t\t\t\tfilename,\n\t\t\t\tline: node.loc!.start.line,\n\t\t\t\tcolumn: node.loc!.start.column + 1,\n\t\t\t\toffset: positionToOffset(node.loc!.start, data) + 1,\n\t\t\t};\n\n\t\tcase \"TaggedTemplateExpression\":\n\t\t\treturn {\n\t\t\t\tdata: joinTemplateLiteral(node.quasi.quasis),\n\t\t\t\tfilename,\n\t\t\t\tline: node.quasi.loc!.start.line,\n\t\t\t\tcolumn: node.quasi.loc!.start.column + 1,\n\t\t\t\toffset: positionToOffset(node.quasi.loc!.start, data) + 1,\n\t\t\t};\n\n\t\tcase \"ArrowFunctionExpression\": {\n\t\t\tconst whitelist = [\"Literal\", \"TemplateLiteral\"];\n\t\t\tif (whitelist.includes(node.body.type)) {\n\t\t\t\treturn extractLiteral(node.body, filename, data);\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\t/* istanbul ignore next: this only provides a better error, all currently known nodes are tested */\n\t\tdefault: {\n\t\t\tconst loc = node.loc!.start;\n\t\t\tconst line = String(loc.line);\n\t\t\tconst column = String(loc.column);\n\t\t\tconst context = `${filename}:${line}:${column}`;\n\t\t\tthrow new Error(`Unhandled node type \"${node.type}\" at \"${context}\" in extractLiteral`);\n\t\t}\n\t}\n}\n\nfunction compareKey(\n\tnode: espree.Expression | espree.PrivateIdentifier,\n\tkey: string,\n\tfilename: string,\n): boolean {\n\tswitch (node.type) {\n\t\tcase \"Identifier\":\n\t\t\treturn node.name === key;\n\n\t\tcase \"Literal\":\n\t\t\treturn node.value === key;\n\n\t\t/* istanbul ignore next: this only provides a better error, all currently known nodes are tested */\n\t\tdefault: {\n\t\t\tconst loc = node.loc!.start;\n\t\t\tconst line = String(loc.line);\n\t\t\tconst column = String(loc.column);\n\t\t\tconst context = `${filename}:${line}:${column}`;\n\t\t\tthrow new Error(`Unhandled node type \"${node.type}\" at \"${context}\" in compareKey`);\n\t\t}\n\t}\n}\n\n/**\n * @public\n * @since 1.0.0\n */\nexport class TemplateExtractor {\n\tprivate ast: espree.Program;\n\n\tprivate filename: string;\n\tprivate data: string;\n\n\tprivate constructor(ast: espree.Program, filename: string, data: string) {\n\t\tthis.ast = ast;\n\t\tthis.filename = filename;\n\t\tthis.data = data;\n\t}\n\n\t/**\n\t * Create a new [[TemplateExtractor]] from javascript source code.\n\t *\n\t * `Source` offsets will be relative to the string, i.e. offset 0 is the first\n\t * character of the string. If the string is only a subset of a larger string\n\t * the offsets must be adjusted manually.\n\t *\n\t * @param source - Source code.\n\t * @param filename - Optional filename to set in the resulting\n\t * `Source`. Defauls to `\"inline\"`.\n\t */\n\tpublic static fromString(source: string, filename?: string): TemplateExtractor {\n\t\tconst ast = espree.parse(source, {\n\t\t\tecmaVersion: \"latest\",\n\t\t\tsourceType: \"module\",\n\t\t\tloc: true,\n\t\t});\n\t\treturn new TemplateExtractor(ast, filename ?? \"inline\", source);\n\t}\n\n\t/**\n\t * Extract object properties.\n\t *\n\t * Given a key `\"template\"` this method finds all objects literals with a\n\t * `\"template\"` property and creates a [[Source]] instance with proper offsets\n\t * with the value of the property. For instance:\n\t *\n\t * ```\n\t * const myObj = {\n\t * foo: 'bar',\n\t * };\n\t * ```\n\t *\n\t * The above snippet would yield a `Source` with the content `bar`.\n\t *\n\t */\n\tpublic extractObjectProperty(key: string): Source[] {\n\t\tconst result: Source[] = [];\n\t\tconst { filename, data } = this;\n\t\tconst node: Node = this.ast as unknown as Node;\n\t\twalk.simple(node, {\n\t\t\tProperty(node: espree.Property) {\n\t\t\t\tif (compareKey(node.key, key, filename)) {\n\t\t\t\t\tconst source = extractLiteral(node.value, filename, data);\n\t\t\t\t\tif (source) {\n\t\t\t\t\t\tsource.filename = filename;\n\t\t\t\t\t\tresult.push(source);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t} as unknown as walk.SimpleVisitors<unknown>);\n\t\treturn result;\n\t}\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["node"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Source } from 'html-validate';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Represents line and column.
|
|
5
|
+
*
|
|
6
|
+
* @public
|
|
7
|
+
* @since 1.0.0
|
|
8
|
+
*/
|
|
9
|
+
export declare interface Position {
|
|
10
|
+
/** Line number (First line is 1) */
|
|
11
|
+
line: number;
|
|
12
|
+
/** Column number (first column is 1) */
|
|
13
|
+
column: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Given an offset into a source, calculate the corresponding line and column.
|
|
18
|
+
*
|
|
19
|
+
* @public
|
|
20
|
+
* @since 1.0.0
|
|
21
|
+
*/
|
|
22
|
+
export declare function positionFromOffset(text: string, offset: number): [line: number, column: number];
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Compute source offset from line and column and the given markup.
|
|
26
|
+
*
|
|
27
|
+
* @public
|
|
28
|
+
* @since 1.0.0
|
|
29
|
+
* @param position - Line and column.
|
|
30
|
+
* @param data - Source markup.
|
|
31
|
+
* @returns The byte offset into the markup which line and column corresponds to.
|
|
32
|
+
*/
|
|
33
|
+
export declare function positionToOffset(position: Position, data: string): number;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @public
|
|
37
|
+
* @since 1.0.0
|
|
38
|
+
*/
|
|
39
|
+
export declare class TemplateExtractor {
|
|
40
|
+
private ast;
|
|
41
|
+
private filename;
|
|
42
|
+
private data;
|
|
43
|
+
private constructor();
|
|
44
|
+
/**
|
|
45
|
+
* Create a new [[TemplateExtractor]] from javascript source code.
|
|
46
|
+
*
|
|
47
|
+
* `Source` offsets will be relative to the string, i.e. offset 0 is the first
|
|
48
|
+
* character of the string. If the string is only a subset of a larger string
|
|
49
|
+
* the offsets must be adjusted manually.
|
|
50
|
+
*
|
|
51
|
+
* @param source - Source code.
|
|
52
|
+
* @param filename - Optional filename to set in the resulting
|
|
53
|
+
* `Source`. Defauls to `"inline"`.
|
|
54
|
+
*/
|
|
55
|
+
static fromString(source: string, filename?: string): TemplateExtractor;
|
|
56
|
+
/**
|
|
57
|
+
* Extract object properties.
|
|
58
|
+
*
|
|
59
|
+
* Given a key `"template"` this method finds all objects literals with a
|
|
60
|
+
* `"template"` property and creates a [[Source]] instance with proper offsets
|
|
61
|
+
* with the value of the property. For instance:
|
|
62
|
+
*
|
|
63
|
+
* ```
|
|
64
|
+
* const myObj = {
|
|
65
|
+
* foo: 'bar',
|
|
66
|
+
* };
|
|
67
|
+
* ```
|
|
68
|
+
*
|
|
69
|
+
* The above snippet would yield a `Source` with the content `bar`.
|
|
70
|
+
*
|
|
71
|
+
*/
|
|
72
|
+
extractObjectProperty(key: string): Source[];
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export { }
|
|
@@ -113,6 +113,9 @@ function compareKey(node, key, filename) {
|
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
115
|
var TemplateExtractor = class _TemplateExtractor {
|
|
116
|
+
ast;
|
|
117
|
+
filename;
|
|
118
|
+
data;
|
|
116
119
|
constructor(ast, filename, data) {
|
|
117
120
|
this.ast = ast;
|
|
118
121
|
this.filename = filename;
|
|
@@ -176,3 +179,4 @@ export {
|
|
|
176
179
|
positionFromOffset,
|
|
177
180
|
positionToOffset
|
|
178
181
|
};
|
|
182
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/position-from-offset.ts", "../../src/position-to-offset.ts", "../../src/template-extractor.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Given an offset into a source, calculate the corresponding line and column.\n *\n * @public\n * @since 1.0.0\n */\nexport function positionFromOffset(text: string, offset: number): [line: number, column: number] {\n\tlet line = 1;\n\tlet prev = 0;\n\tlet pos = text.indexOf(\"\\n\");\n\n\t/* step one line at a time until newline position is beyond wanted offset */\n\twhile (pos !== -1) {\n\t\tif (pos >= offset) {\n\t\t\treturn [line, offset - prev + 1];\n\t\t}\n\t\tline++;\n\t\tprev = pos + 1;\n\t\tpos = text.indexOf(\"\\n\", pos + 1);\n\t}\n\n\t/* missing final newline */\n\treturn [line, offset - prev + 1];\n}\n", "import { type Position } from \"./position\";\n\n/**\n * Compute source offset from line and column and the given markup.\n *\n * @public\n * @since 1.0.0\n * @param position - Line and column.\n * @param data - Source markup.\n * @returns The byte offset into the markup which line and column corresponds to.\n */\nexport function positionToOffset(position: Position, data: string): number {\n\tlet line = position.line;\n\tlet column = position.column + 1;\n\tfor (let i = 0; i < data.length; i++) {\n\t\tif (line > 1) {\n\t\t\t/* not yet on the correct line */\n\t\t\tif (data[i] === \"\\n\") {\n\t\t\t\tline--;\n\t\t\t}\n\t\t} else if (column > 1) {\n\t\t\t/* not yet on the correct column */\n\t\t\tcolumn--;\n\t\t} else {\n\t\t\t/* line/column found, return current position */\n\t\t\treturn i;\n\t\t}\n\t}\n\t/* istanbul ignore next: should never reach this line unless espree passes bad\n\t * positions, no sane way to test */\n\tthrow new Error(\"Failed to compute location offset from position\");\n}\n", "/* eslint-disable @typescript-eslint/no-non-null-assertion -- declarations say\n * location fields are optional but they are always present when `{loc: true}` */\n\nimport * as espree from \"espree\";\nimport * as walk from \"acorn-walk\";\n\n/* eslint-disable-next-line n/no-extraneous-import -- type is pulled via acorn-walk */\nimport { type Node } from \"acorn\";\n\nimport { type Source } from \"html-validate\";\nimport { positionToOffset } from \"./position-to-offset\";\n\n/* espree puts location information a bit different than estree */\ndeclare module \"estree\" {\n\tinterface TemplateElement {\n\t\tstart: number;\n\t\tend: number;\n\t}\n}\n\nfunction joinTemplateLiteral(nodes: espree.TemplateElement[]): string {\n\tlet offset = nodes[0].start + 1;\n\tlet output = \"\";\n\tfor (const node of nodes) {\n\t\toutput += \" \".repeat(node.start + 1 - offset);\n\t\toutput += node.value.raw;\n\t\toffset = node.end - 2;\n\t}\n\treturn output;\n}\n\nfunction extractLiteral(\n\tnode: espree.Expression | espree.Pattern | espree.Literal | espree.BlockStatement,\n\tfilename: string,\n\tdata: string,\n): Source | null {\n\tswitch (node.type) {\n\t\t/* ignored nodes */\n\t\tcase \"FunctionExpression\":\n\t\tcase \"Identifier\":\n\t\t\treturn null;\n\n\t\tcase \"Literal\":\n\t\t\tif (typeof node.value !== \"string\") {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tdata: node.value.toString(),\n\t\t\t\tfilename,\n\t\t\t\tline: node.loc!.start.line,\n\t\t\t\tcolumn: node.loc!.start.column + 1,\n\t\t\t\toffset: positionToOffset(node.loc!.start, data) + 1,\n\t\t\t};\n\n\t\tcase \"TemplateLiteral\":\n\t\t\treturn {\n\t\t\t\tdata: joinTemplateLiteral(node.quasis),\n\t\t\t\tfilename,\n\t\t\t\tline: node.loc!.start.line,\n\t\t\t\tcolumn: node.loc!.start.column + 1,\n\t\t\t\toffset: positionToOffset(node.loc!.start, data) + 1,\n\t\t\t};\n\n\t\tcase \"TaggedTemplateExpression\":\n\t\t\treturn {\n\t\t\t\tdata: joinTemplateLiteral(node.quasi.quasis),\n\t\t\t\tfilename,\n\t\t\t\tline: node.quasi.loc!.start.line,\n\t\t\t\tcolumn: node.quasi.loc!.start.column + 1,\n\t\t\t\toffset: positionToOffset(node.quasi.loc!.start, data) + 1,\n\t\t\t};\n\n\t\tcase \"ArrowFunctionExpression\": {\n\t\t\tconst whitelist = [\"Literal\", \"TemplateLiteral\"];\n\t\t\tif (whitelist.includes(node.body.type)) {\n\t\t\t\treturn extractLiteral(node.body, filename, data);\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\t/* istanbul ignore next: this only provides a better error, all currently known nodes are tested */\n\t\tdefault: {\n\t\t\tconst loc = node.loc!.start;\n\t\t\tconst line = String(loc.line);\n\t\t\tconst column = String(loc.column);\n\t\t\tconst context = `${filename}:${line}:${column}`;\n\t\t\tthrow new Error(`Unhandled node type \"${node.type}\" at \"${context}\" in extractLiteral`);\n\t\t}\n\t}\n}\n\nfunction compareKey(\n\tnode: espree.Expression | espree.PrivateIdentifier,\n\tkey: string,\n\tfilename: string,\n): boolean {\n\tswitch (node.type) {\n\t\tcase \"Identifier\":\n\t\t\treturn node.name === key;\n\n\t\tcase \"Literal\":\n\t\t\treturn node.value === key;\n\n\t\t/* istanbul ignore next: this only provides a better error, all currently known nodes are tested */\n\t\tdefault: {\n\t\t\tconst loc = node.loc!.start;\n\t\t\tconst line = String(loc.line);\n\t\t\tconst column = String(loc.column);\n\t\t\tconst context = `${filename}:${line}:${column}`;\n\t\t\tthrow new Error(`Unhandled node type \"${node.type}\" at \"${context}\" in compareKey`);\n\t\t}\n\t}\n}\n\n/**\n * @public\n * @since 1.0.0\n */\nexport class TemplateExtractor {\n\tprivate ast: espree.Program;\n\n\tprivate filename: string;\n\tprivate data: string;\n\n\tprivate constructor(ast: espree.Program, filename: string, data: string) {\n\t\tthis.ast = ast;\n\t\tthis.filename = filename;\n\t\tthis.data = data;\n\t}\n\n\t/**\n\t * Create a new [[TemplateExtractor]] from javascript source code.\n\t *\n\t * `Source` offsets will be relative to the string, i.e. offset 0 is the first\n\t * character of the string. If the string is only a subset of a larger string\n\t * the offsets must be adjusted manually.\n\t *\n\t * @param source - Source code.\n\t * @param filename - Optional filename to set in the resulting\n\t * `Source`. Defauls to `\"inline\"`.\n\t */\n\tpublic static fromString(source: string, filename?: string): TemplateExtractor {\n\t\tconst ast = espree.parse(source, {\n\t\t\tecmaVersion: \"latest\",\n\t\t\tsourceType: \"module\",\n\t\t\tloc: true,\n\t\t});\n\t\treturn new TemplateExtractor(ast, filename ?? \"inline\", source);\n\t}\n\n\t/**\n\t * Extract object properties.\n\t *\n\t * Given a key `\"template\"` this method finds all objects literals with a\n\t * `\"template\"` property and creates a [[Source]] instance with proper offsets\n\t * with the value of the property. For instance:\n\t *\n\t * ```\n\t * const myObj = {\n\t * foo: 'bar',\n\t * };\n\t * ```\n\t *\n\t * The above snippet would yield a `Source` with the content `bar`.\n\t *\n\t */\n\tpublic extractObjectProperty(key: string): Source[] {\n\t\tconst result: Source[] = [];\n\t\tconst { filename, data } = this;\n\t\tconst node: Node = this.ast as unknown as Node;\n\t\twalk.simple(node, {\n\t\t\tProperty(node: espree.Property) {\n\t\t\t\tif (compareKey(node.key, key, filename)) {\n\t\t\t\t\tconst source = extractLiteral(node.value, filename, data);\n\t\t\t\t\tif (source) {\n\t\t\t\t\t\tsource.filename = filename;\n\t\t\t\t\t\tresult.push(source);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t} as unknown as walk.SimpleVisitors<unknown>);\n\t\treturn result;\n\t}\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["node"]
|
|
7
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@html-validate/plugin-utils",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.2",
|
|
4
4
|
"description": "Plugin utilities and helpers for writing plugins to HTML-Validate",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"html-validate"
|
|
@@ -19,14 +19,18 @@
|
|
|
19
19
|
"type": "commonjs",
|
|
20
20
|
"exports": {
|
|
21
21
|
".": {
|
|
22
|
-
"
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
"import": {
|
|
23
|
+
"types": "./dist/esm/index.d.mts",
|
|
24
|
+
"default": "./dist/esm/index.mjs"
|
|
25
|
+
},
|
|
26
|
+
"require": {
|
|
27
|
+
"types": "./dist/cjs/index.d.cts",
|
|
28
|
+
"default": "./dist/cjs/index.cjs"
|
|
29
|
+
}
|
|
25
30
|
}
|
|
26
31
|
},
|
|
27
|
-
"main": "dist/index.cjs
|
|
28
|
-
"module": "dist/index.
|
|
29
|
-
"types": "dist/index.d.ts",
|
|
32
|
+
"main": "dist/cjs/index.cjs",
|
|
33
|
+
"module": "dist/esm/index.mjs",
|
|
30
34
|
"files": [
|
|
31
35
|
"dist"
|
|
32
36
|
],
|
|
File without changes
|
|
File without changes
|