64 lines
1.9 KiB
JavaScript
64 lines
1.9 KiB
JavaScript
![]() |
/**
|
||
|
* @typedef {import('unist').Position} Position
|
||
|
*
|
||
|
* @typedef {[number, number]} RangeLike
|
||
|
*
|
||
|
* @typedef PointLike
|
||
|
* @property {number | null | undefined} [line]
|
||
|
* @property {number | null | undefined} [column]
|
||
|
*
|
||
|
* @typedef LocLike
|
||
|
* @property {PointLike | null | undefined} [start]
|
||
|
* @property {PointLike | null | undefined} [end]
|
||
|
*
|
||
|
* @typedef NodeLike
|
||
|
* @property {LocLike | null | undefined} [loc]
|
||
|
* @property {RangeLike | null | undefined} [range]
|
||
|
* @property {number | null | undefined} [start]
|
||
|
* @property {number | null | undefined} [end]
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Turn an estree `node` into a unist `position`.
|
||
|
*
|
||
|
* @param {NodeLike | null | undefined} [node]
|
||
|
* estree node.
|
||
|
* @returns {Position}
|
||
|
* unist position.
|
||
|
*/
|
||
|
export function positionFromEstree(node) {
|
||
|
const nodeLike = node || {}
|
||
|
const loc = nodeLike.loc || {}
|
||
|
const range = nodeLike.range || [0, 0]
|
||
|
const startColumn = loc.start
|
||
|
? numberOrUndefined(loc.start.column)
|
||
|
: undefined
|
||
|
const endColumn = loc.end ? numberOrUndefined(loc.end.column) : undefined
|
||
|
|
||
|
return {
|
||
|
start: {
|
||
|
// @ts-expect-error: return no point / no position next major.
|
||
|
line: loc.start ? numberOrUndefined(loc.start.line) : undefined,
|
||
|
// @ts-expect-error: return no point / no position next major.
|
||
|
column: startColumn === undefined ? undefined : startColumn + 1,
|
||
|
offset: numberOrUndefined(range[0] || nodeLike.start)
|
||
|
},
|
||
|
end: {
|
||
|
// @ts-expect-error: return no point / no position next major.
|
||
|
line: loc.end ? numberOrUndefined(loc.end.line) : undefined,
|
||
|
// @ts-expect-error: return no point / no position next major.
|
||
|
column: endColumn === undefined ? undefined : endColumn + 1,
|
||
|
offset: numberOrUndefined(range[1] || nodeLike.end)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* @param {number | null | undefined} value
|
||
|
* @returns {number | undefined}
|
||
|
*/
|
||
|
function numberOrUndefined(value) {
|
||
|
return typeof value === 'number' && value > -1 ? value : undefined
|
||
|
}
|