@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.
@@ -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/index.ts
31
- var src_exports = {};
32
- __export(src_exports, {
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(src_exports);
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.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
- "types": "./dist/index.d.ts",
23
- "require": "./dist/index.cjs.js",
24
- "import": "./dist/index.esm.js"
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.js",
28
- "module": "dist/index.esm.js",
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