var assert = require('assert') /** * Get a list of all identifiers that are initialised by this (possibly destructuring) * node. * * eg with input: * * var { a: [b, ...c], d } = xyz * * this returns the nodes for 'b', 'c', and 'd' */ module.exports = function getAssignedIdentifiers (node, identifiers) { assert.equal(typeof node, 'object', 'get-assigned-identifiers: node must be object') assert.equal(typeof node.type, 'string', 'get-assigned-identifiers: node must have a type') identifiers = identifiers || [] if (node.type === 'ImportDeclaration') { node.specifiers.forEach(function (el) { getAssignedIdentifiers(el, identifiers) }) } if (node.type === 'ImportDefaultSpecifier' || node.type === 'ImportNamespaceSpecifier' || node.type === 'ImportSpecifier') { node = node.local } if (node.type === 'RestElement') { node = node.argument } if (node.type === 'ArrayPattern') { node.elements.forEach(function (el) { // `el` might be `null` in case of `[x,,y] = whatever` if (el) { getAssignedIdentifiers(el, identifiers) } }) } if (node.type === 'ObjectPattern') { node.properties.forEach(function (prop) { if (prop.type === 'Property') { getAssignedIdentifiers(prop.value, identifiers) } else if (prop.type === 'RestElement') { getAssignedIdentifiers(prop, identifiers) } }) } if (node.type === 'Identifier') { identifiers.push(node) } return identifiers }