Skip to content

Commit

Permalink
cleanup
Browse files Browse the repository at this point in the history
Signed-off-by: flakey5 <73616808+flakey5@users.noreply.github.com>
  • Loading branch information
flakey5 committed Feb 3, 2025
1 parent 953f248 commit 355e992
Show file tree
Hide file tree
Showing 5 changed files with 150 additions and 102 deletions.
3 changes: 1 addition & 2 deletions src/generators.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import availableGenerators from './generators/index.mjs';
* @param {ApiDocMetadataEntry} markdownInput The parsed API doc metadata entries
* @param {Array<import('acorn').Program>} parsedJsFiles
*/
const createGenerator = (markdownInput, jsInput) => {
const createGenerator = markdownInput => {
/**
* We store all the registered generators to be processed
* within a Record, so we can access their results at any time whenever needed
Expand All @@ -33,7 +33,6 @@ const createGenerator = (markdownInput, jsInput) => {
*/
const cachedGenerators = {
ast: Promise.resolve(markdownInput),
'ast-js': Promise.resolve(jsInput),
};

/**
Expand Down
1 change: 0 additions & 1 deletion src/generators/api-links/utils/checkIndirectReferences.mjs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { visit } from 'estree-util-visit';

/**
*
* @param program
* @param {import('../types.d.ts').ProgramExports} exports
* @param {Record<string, number>} nameToLineNumberMap
Expand Down
109 changes: 10 additions & 99 deletions src/generators/api-links/utils/extractExports.mjs
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
'use strict';

import { visit } from 'estree-util-visit';
import { CONSTRUCTOR_EXPRESSION } from '../constants.mjs';
import { handleExportedPropertyExpression } from './handleExportedPropertyExpression.mjs';
import { handleExportedObjectExpression } from './handleExportedObjectExpression.mjs';

/**
* @see https://github.com/estree/estree/blob/master/es5.md#assignmentexpression
Expand All @@ -18,8 +19,7 @@ function handleExpression(node, basename, nameToLineNumberMap) {
return;
}

// `a=b`, lhs=`a` and rhs=`b`
let { left: lhs, right: rhs, loc } = expression;
let { left: lhs } = expression;

if (lhs.type !== 'MemberExpression') {
return undefined;
Expand All @@ -41,105 +41,16 @@ function handleExpression(node, basename, nameToLineNumberMap) {
if (lhs.object.name === 'exports') {
// This is an assignment to a property in `module.exports` or `exports`
// (i.e. `module.exports.asd = ...`)

switch (rhs.type) {
/** @see https://github.com/estree/estree/blob/master/es5.md#functionexpression */
case 'FunctionExpression': {
// module.exports.something = () => {}
nameToLineNumberMap[`${basename}.${lhs.property.name}`] =
loc.start.line;

break;
}
/** @see https://github.com/estree/estree/blob/master/es5.md#identifier */
case 'Identifier': {
// Save this for later in case it's referenced
// module.exports.asd = something
if (rhs.name === lhs.property.name) {
exports.indirects[lhs.property.name] =
`${basename}.${lhs.property.name}`;
}

break;
}
default: {
if (lhs.property.name !== undefined) {
// Something else, let's save it for when we're searching for
// declarations
exports.identifiers.push(lhs.property.name);
}

break;
}
}
handleExportedPropertyExpression(
exports,
expression,
basename,
nameToLineNumberMap
);
} else if (lhs.object.name === 'module' && lhs.property.name === 'exports') {
// This is an assignment to `module.exports` as a whole
// (i.e. `module.exports = {}`)

// We need to move right until we find the value of the assignment.
// (if `a=b`, we want `b`)
while (rhs.type === 'AssignmentExpression') {
rhs = rhs.right;
}

switch (rhs.type) {
/** @see https://github.com/estree/estree/blob/master/es5.md#newexpression */
case 'NewExpression': {
// module.exports = new Asd()
exports.ctors.push(rhs.callee.name);
break;
}
/** @see https://github.com/estree/estree/blob/master/es5.md#objectexpression */
case 'ObjectExpression': {
// module.exports = {}
// we need to go through all of the properties and register them
rhs.properties.forEach(({ value }) => {
switch (value.type) {
case 'Identifier': {
exports.identifiers.push(value.name);

if (CONSTRUCTOR_EXPRESSION.test(value.name[0])) {
exports.ctors.push(value.name);
}

break;
}
case 'CallExpression': {
if (value.callee.name !== 'deprecate') {
break;
}

// Handle exports wrapped in the `deprecate` function
// Ex/ https://github.com/nodejs/node/blob/e96072ad57348ce423a8dd7639dcc3d1c34e847d/lib/buffer.js#L1334

exports.identifiers.push(value.arguments[0].name);

break;
}
default: {
// Not relevant
}
}
});

break;
}
/** @see https://github.com/estree/estree/blob/master/es5.md#identifier */
case 'Identifier': {
// Something else, let's save it for when we're searching for
// declarations

if (rhs.name !== undefined) {
exports.identifiers.push(rhs.name);
}

break;
}
default: {
// Not relevant
break;
}
}
handleExportedObjectExpression(exports, expression);
}

return exports;
Expand Down
95 changes: 95 additions & 0 deletions src/generators/api-links/utils/handleExportedObjectExpression.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
'use strict';

import { CONSTRUCTOR_EXPRESSION } from '../constants.mjs';

/**
* @param {import('../types').ProgramExports} exports
* @param {import('acorn').NewExpression} rhs
*/
function handleNewExpression(exports, rhs) {
// module.exports = new Asd()
exports.ctors.push(rhs.callee.name);
}

/**
* @param {import('../types').ProgramExports} exports
* @param {import('acorn').ObjectExpression} rhs
*/
function handleObjectExpression(exports, rhs) {
// module.exports = {}
// We need to go through all of the properties and register them
rhs.properties.forEach(({ value }) => {
switch (value.type) {
case 'Identifier': {
exports.identifiers.push(value.name);

if (CONSTRUCTOR_EXPRESSION.test(value.name[0])) {
exports.ctors.push(value.name);
}

break;
}
case 'CallExpression': {
if (value.callee.name !== 'deprecate') {
break;
}

// Handle exports wrapped in the `deprecate` function
// Ex/ https://github.com/nodejs/node/blob/e96072ad57348ce423a8dd7639dcc3d1c34e847d/lib/buffer.js#L1334

exports.identifiers.push(value.arguments[0].name);

break;
}
default: {
// Not relevant
}
}
});
}

/**
* @param {import('../types').ProgramExports} exports
* @param {import('acorn').Identifier} rhs
*/
function handleIdentifier(exports, rhs) {
// Something else, let's save it for when we're searching for
// declarations
if (rhs.name !== undefined) {
exports.identifiers.push(rhs.name);
}
}

/**
* @param {import('../types').ProgramExports} exports
* @param {import('acorn').AssignmentExpression} param0
*/
export function handleExportedObjectExpression(exports, { right: rhs }) {
// We need to move right until we find the value of the assignment.
// (if `a=b`, we want `b`)
while (rhs.type === 'AssignmentExpression') {
rhs = rhs.right;
}

switch (rhs.type) {
/** @see https://github.com/estree/estree/blob/master/es5.md#newexpression */
case 'NewExpression': {
handleNewExpression(exports, rhs);
break;
}
/** @see https://github.com/estree/estree/blob/master/es5.md#objectexpression */
case 'ObjectExpression': {
handleObjectExpression(exports, rhs);
break;
}
/** @see https://github.com/estree/estree/blob/master/es5.md#identifier */
case 'Identifier': {
handleIdentifier(exports, rhs);
break;
}
default: {
// Not relevant
break;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
'use strict';

/**
* @param {import('../types.d.ts').ProgramExports} exports
* @param {import('acorn').AssignmentExpression} param1
* @param {string} basename
* @param {Record<string, number>} nameToLineNumberMap
*/
export function handleExportedPropertyExpression(
exports,
{ left: lhs, right: rhs, loc },
basename,
nameToLineNumberMap
) {
switch (rhs.type) {
/** @see https://github.com/estree/estree/blob/master/es5.md#functionexpression */
case 'FunctionExpression': {
// module.exports.something = () => {}
nameToLineNumberMap[`${basename}.${lhs.property.name}`] = loc.start.line;

break;
}
/** @see https://github.com/estree/estree/blob/master/es5.md#identifier */
case 'Identifier': {
// Save this for later in case it's referenced
// module.exports.asd = something
if (rhs.name === lhs.property.name) {
exports.indirects[lhs.property.name] =
`${basename}.${lhs.property.name}`;
}

break;
}
default: {
if (lhs.property.name !== undefined) {
// Something else, let's save it for when we're searching for
// declarations
exports.identifiers.push(lhs.property.name);
}

break;
}
}
}

0 comments on commit 355e992

Please sign in to comment.