micromark-util-events-to-acorn
Advanced tools
Comparing version 1.0.6 to 1.1.0
/** | ||
* Parse a list of micromark events with acorn. | ||
* | ||
* @param {Event[]} events | ||
* @param {Array<Event>} events | ||
* @param {Options} options | ||
@@ -9,3 +9,3 @@ * @returns {{estree: Program|undefined, error: Error|undefined, swallow: boolean}} | ||
export function eventsToAcorn( | ||
events: import('micromark-util-types').Event[], | ||
events: Array<import('micromark-util-types').Event>, | ||
options: Options | ||
@@ -21,4 +21,6 @@ ): { | ||
export type Comment = import('acorn').Comment | ||
export type Node = import('acorn').Node | ||
export type Token = import('acorn').Token | ||
export type AcornNode = import('acorn').Node | ||
export type Program = import('estree').Program | ||
export type EstreeNode = import('estree-util-visit').Node | ||
export type Acorn = { | ||
@@ -25,0 +27,0 @@ parse: typeof import('acorn').parse |
120
dev/index.js
@@ -6,13 +6,10 @@ /** | ||
* @typedef {import('acorn').Comment} Comment | ||
* @typedef {import('acorn').Node} Node | ||
* @typedef {import('acorn').Token} Token | ||
* @typedef {import('acorn').Node} AcornNode | ||
* @typedef {import('estree').Program} Program | ||
*/ | ||
/** | ||
* @typedef {import('estree-util-visit').Node} EstreeNode | ||
* | ||
* @typedef {{parse: import('acorn').parse, parseExpressionAt: import('acorn').parseExpressionAt}} Acorn | ||
* @typedef {Error & {raisedAt: number, pos: number, loc: {line: number, column: number}}} AcornError | ||
* | ||
* @typedef {Error & {raisedAt: number, pos: number, loc: {line: number, column: number}}} AcornError | ||
*/ | ||
/** | ||
* @typedef Options | ||
@@ -36,15 +33,22 @@ * @property {Acorn} acorn | ||
* | ||
* @param {Event[]} events | ||
* @param {Array<Event>} events | ||
* @param {Options} options | ||
* @returns {{estree: Program|undefined, error: Error|undefined, swallow: boolean}} | ||
*/ | ||
// eslint-disable-next-line complexity | ||
export function eventsToAcorn(events, options) { | ||
const {prefix = '', suffix = ''} = options | ||
/** @type {Array.<Comment>} */ | ||
const acornOptions = Object.assign({}, options.acornOptions) | ||
/** @type {Array<Comment>} */ | ||
const comments = [] | ||
const acornConfig = Object.assign({}, options.acornOptions, { | ||
/** @type {Array<Token>} */ | ||
const tokens = [] | ||
const onComment = acornOptions.onComment | ||
const onToken = acornOptions.onToken | ||
const acornConfig = Object.assign({}, acornOptions, { | ||
onComment: comments, | ||
onToken: onToken ? tokens : undefined, | ||
preserveParens: true | ||
}) | ||
/** @type {Array.<string>} */ | ||
/** @type {Array<string>} */ | ||
const chunks = [] | ||
@@ -55,3 +59,3 @@ /** @type {Record<string, Point>} */ | ||
let swallow = false | ||
/** @type {Node|undefined} */ | ||
/** @type {AcornNode|undefined} */ | ||
let estree | ||
@@ -146,3 +150,5 @@ /** @type {Error|undefined} */ | ||
visit(estree, (esnode, field, index, parents) => { | ||
let context = /** @type {Node|Node[]} */ (parents[parents.length - 1]) | ||
let context = /** @type {AcornNode|Array<AcornNode>} */ ( | ||
parents[parents.length - 1] | ||
) | ||
/** @type {string|number|null} */ | ||
@@ -164,20 +170,34 @@ let prop = field | ||
assert('start' in esnode, 'expected `start` in node from acorn') | ||
assert('end' in esnode, 'expected `end` in node from acorn') | ||
// @ts-expect-error: acorn has positions. | ||
const pointStart = parseOffsetToUnistPoint(esnode.start) | ||
// @ts-expect-error: acorn has positions. | ||
const pointEnd = parseOffsetToUnistPoint(esnode.end) | ||
// @ts-expect-error: acorn has positions. | ||
esnode.start = pointStart.offset | ||
// @ts-expect-error: acorn has positions. | ||
esnode.end = pointEnd.offset | ||
// @ts-expect-error: acorn has positions. | ||
esnode.loc = { | ||
start: {line: pointStart.line, column: pointStart.column - 1}, | ||
end: {line: pointEnd.line, column: pointEnd.column - 1} | ||
fixPosition(esnode) | ||
}) | ||
// Comment positions are fixed by `visit` because they’re in the tree. | ||
if (Array.isArray(onComment)) { | ||
onComment.push(...comments) | ||
} else if (typeof onComment === 'function') { | ||
for (const comment of comments) { | ||
assert(comment.loc, 'expected `loc` on comment') | ||
onComment( | ||
comment.type === 'Block', | ||
comment.value, | ||
comment.start, | ||
comment.end, | ||
comment.loc.start, | ||
comment.loc.end | ||
) | ||
} | ||
// @ts-expect-error: acorn has positions. | ||
esnode.range = [esnode.start, esnode.end] | ||
}) | ||
} | ||
for (const token of tokens) { | ||
fixPosition(token) | ||
if (Array.isArray(onToken)) { | ||
onToken.push(token) | ||
} else { | ||
// `tokens` are not added if `onToken` is not defined, so it must be a | ||
// function. | ||
assert(typeof onToken === 'function', 'expected function') | ||
onToken(token) | ||
} | ||
} | ||
} | ||
@@ -189,4 +209,38 @@ | ||
/** | ||
* Update the position of a node. | ||
* | ||
* @param {AcornNode|EstreeNode|Token} nodeOrToken | ||
* @returns {void} | ||
*/ | ||
function fixPosition(nodeOrToken) { | ||
assert( | ||
'start' in nodeOrToken, | ||
'expected `start` in node or token from acorn' | ||
) | ||
assert('end' in nodeOrToken, 'expected `end` in node or token from acorn') | ||
const pointStart = parseOffsetToUnistPoint(nodeOrToken.start) | ||
const pointEnd = parseOffsetToUnistPoint(nodeOrToken.end) | ||
nodeOrToken.start = pointStart.offset | ||
nodeOrToken.end = pointEnd.offset | ||
nodeOrToken.loc = { | ||
start: { | ||
line: pointStart.line, | ||
column: pointStart.column - 1, | ||
offset: pointStart.offset | ||
}, | ||
end: { | ||
line: pointEnd.line, | ||
column: pointEnd.column - 1, | ||
offset: pointEnd.offset | ||
} | ||
} | ||
nodeOrToken.range = [nodeOrToken.start, nodeOrToken.end] | ||
} | ||
/** | ||
* Turn an arbitrary offset into the parsed value, into a point in the source | ||
* value. | ||
* | ||
* @param {number} acornOffset | ||
* @returs {Point} | ||
* @returns {Point} | ||
*/ | ||
@@ -211,3 +265,3 @@ function parseOffsetToUnistPoint(acornOffset) { | ||
const offset = lines[line].offset + (pointInSource.column - 1) | ||
return {line, column, offset} | ||
return /** @type {Point} */ ({line, column, offset}) | ||
} | ||
@@ -214,0 +268,0 @@ |
/** | ||
* Parse a list of micromark events with acorn. | ||
* | ||
* @param {Event[]} events | ||
* @param {Array<Event>} events | ||
* @param {Options} options | ||
@@ -9,3 +9,3 @@ * @returns {{estree: Program|undefined, error: Error|undefined, swallow: boolean}} | ||
export function eventsToAcorn( | ||
events: import('micromark-util-types').Event[], | ||
events: Array<import('micromark-util-types').Event>, | ||
options: Options | ||
@@ -21,4 +21,6 @@ ): { | ||
export type Comment = import('acorn').Comment | ||
export type Node = import('acorn').Node | ||
export type Token = import('acorn').Token | ||
export type AcornNode = import('acorn').Node | ||
export type Program = import('estree').Program | ||
export type EstreeNode = import('estree-util-visit').Node | ||
export type Acorn = { | ||
@@ -25,0 +27,0 @@ parse: typeof import('acorn').parse |
122
index.js
@@ -6,13 +6,10 @@ /** | ||
* @typedef {import('acorn').Comment} Comment | ||
* @typedef {import('acorn').Node} Node | ||
* @typedef {import('acorn').Token} Token | ||
* @typedef {import('acorn').Node} AcornNode | ||
* @typedef {import('estree').Program} Program | ||
*/ | ||
/** | ||
* @typedef {import('estree-util-visit').Node} EstreeNode | ||
* | ||
* @typedef {{parse: import('acorn').parse, parseExpressionAt: import('acorn').parseExpressionAt}} Acorn | ||
* @typedef {Error & {raisedAt: number, pos: number, loc: {line: number, column: number}}} AcornError | ||
* | ||
* @typedef {Error & {raisedAt: number, pos: number, loc: {line: number, column: number}}} AcornError | ||
*/ | ||
/** | ||
* @typedef Options | ||
@@ -33,17 +30,25 @@ * @property {Acorn} acorn | ||
* | ||
* @param {Event[]} events | ||
* @param {Array<Event>} events | ||
* @param {Options} options | ||
* @returns {{estree: Program|undefined, error: Error|undefined, swallow: boolean}} | ||
*/ | ||
// eslint-disable-next-line complexity | ||
export function eventsToAcorn(events, options) { | ||
const {prefix = '', suffix = ''} = options | ||
/** @type {Array.<Comment>} */ | ||
const acornOptions = Object.assign({}, options.acornOptions) | ||
/** @type {Array<Comment>} */ | ||
const comments = [] | ||
const acornConfig = Object.assign({}, options.acornOptions, { | ||
/** @type {Array<Token>} */ | ||
const tokens = [] | ||
const onComment = acornOptions.onComment | ||
const onToken = acornOptions.onToken | ||
const acornConfig = Object.assign({}, acornOptions, { | ||
onComment: comments, | ||
onToken: onToken ? tokens : undefined, | ||
preserveParens: true | ||
}) | ||
/** @type {Array.<string>} */ | ||
/** @type {Array<string>} */ | ||
@@ -56,3 +61,3 @@ const chunks = [] | ||
let swallow = false | ||
/** @type {Node|undefined} */ | ||
/** @type {AcornNode|undefined} */ | ||
@@ -155,3 +160,3 @@ let estree | ||
let context = | ||
/** @type {Node|Node[]} */ | ||
/** @type {AcornNode|Array<AcornNode>} */ | ||
parents[parents.length - 1] | ||
@@ -173,24 +178,31 @@ /** @type {string|number|null} */ | ||
// @ts-expect-error: acorn has positions. | ||
const pointStart = parseOffsetToUnistPoint(esnode.start) // @ts-expect-error: acorn has positions. | ||
fixPosition(esnode) | ||
}) // Comment positions are fixed by `visit` because they’re in the tree. | ||
const pointEnd = parseOffsetToUnistPoint(esnode.end) // @ts-expect-error: acorn has positions. | ||
if (Array.isArray(onComment)) { | ||
onComment.push(...comments) | ||
} else if (typeof onComment === 'function') { | ||
for (const comment of comments) { | ||
onComment( | ||
comment.type === 'Block', | ||
comment.value, | ||
comment.start, | ||
comment.end, | ||
comment.loc.start, | ||
comment.loc.end | ||
) | ||
} | ||
} | ||
esnode.start = pointStart.offset // @ts-expect-error: acorn has positions. | ||
for (const token of tokens) { | ||
fixPosition(token) | ||
esnode.end = pointEnd.offset // @ts-expect-error: acorn has positions. | ||
esnode.loc = { | ||
start: { | ||
line: pointStart.line, | ||
column: pointStart.column - 1 | ||
}, | ||
end: { | ||
line: pointEnd.line, | ||
column: pointEnd.column - 1 | ||
} | ||
} // @ts-expect-error: acorn has positions. | ||
esnode.range = [esnode.start, esnode.end] | ||
}) | ||
if (Array.isArray(onToken)) { | ||
onToken.push(token) | ||
} else { | ||
// `tokens` are not added if `onToken` is not defined, so it must be a | ||
// function. | ||
onToken(token) | ||
} | ||
} | ||
} // @ts-expect-error: It’s a program now. | ||
@@ -204,4 +216,33 @@ | ||
/** | ||
* Update the position of a node. | ||
* | ||
* @param {AcornNode|EstreeNode|Token} nodeOrToken | ||
* @returns {void} | ||
*/ | ||
function fixPosition(nodeOrToken) { | ||
const pointStart = parseOffsetToUnistPoint(nodeOrToken.start) | ||
const pointEnd = parseOffsetToUnistPoint(nodeOrToken.end) | ||
nodeOrToken.start = pointStart.offset | ||
nodeOrToken.end = pointEnd.offset | ||
nodeOrToken.loc = { | ||
start: { | ||
line: pointStart.line, | ||
column: pointStart.column - 1, | ||
offset: pointStart.offset | ||
}, | ||
end: { | ||
line: pointEnd.line, | ||
column: pointEnd.column - 1, | ||
offset: pointEnd.offset | ||
} | ||
} | ||
nodeOrToken.range = [nodeOrToken.start, nodeOrToken.end] | ||
} | ||
/** | ||
* Turn an arbitrary offset into the parsed value, into a point in the source | ||
* value. | ||
* | ||
* @param {number} acornOffset | ||
* @returs {Point} | ||
* @returns {Point} | ||
*/ | ||
@@ -222,7 +263,10 @@ | ||
const offset = lines[line].offset + (pointInSource.column - 1) | ||
return { | ||
line, | ||
column, | ||
offset | ||
} | ||
return ( | ||
/** @type {Point} */ | ||
{ | ||
line, | ||
column, | ||
offset | ||
} | ||
) | ||
} | ||
@@ -229,0 +273,0 @@ /** @param {Point} point */ |
{ | ||
"name": "micromark-util-events-to-acorn", | ||
"version": "1.0.6", | ||
"version": "1.1.0", | ||
"description": "micromark utility to try and parse events w/ acorn", | ||
@@ -5,0 +5,0 @@ "license": "MIT", |
@@ -82,3 +82,3 @@ # micromark-util-events-to-acorn | ||
* `events` (`Array.<Event>`) — Events | ||
* `events` (`Array<Event>`) — Events | ||
* `options.acorn` (`Acorn`, required) — Object with `acorn.parse` and | ||
@@ -85,0 +85,0 @@ `acorn.parseExpressionAt` |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
26305
613