ags
This commit is contained in:
parent
eddf7cecb8
commit
aea798d119
16631 changed files with 1480363 additions and 257 deletions
58
home/ags/node_modules/eslint-plugin-n/lib/util/cache.js
generated
vendored
Normal file
58
home/ags/node_modules/eslint-plugin-n/lib/util/cache.js
generated
vendored
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
/**
|
||||
* @author Toru Nagashima
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
"use strict"
|
||||
|
||||
const SKIP_TIME = 5000
|
||||
|
||||
/**
|
||||
* The class of cache.
|
||||
* The cache will dispose of each value if the value has not been accessed
|
||||
* during 5 seconds.
|
||||
*/
|
||||
module.exports = class Cache {
|
||||
/**
|
||||
* Initialize this cache instance.
|
||||
*/
|
||||
constructor() {
|
||||
this.map = new Map()
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the cached value of the given key.
|
||||
* @param {any} key The key to get.
|
||||
* @returns {any} The cached value or null.
|
||||
*/
|
||||
get(key) {
|
||||
const entry = this.map.get(key)
|
||||
const now = Date.now()
|
||||
|
||||
if (entry) {
|
||||
if (entry.expire > now) {
|
||||
entry.expire = now + SKIP_TIME
|
||||
return entry.value
|
||||
}
|
||||
this.map.delete(key)
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the value of the given key.
|
||||
* @param {any} key The key to set.
|
||||
* @param {any} value The value to set.
|
||||
* @returns {void}
|
||||
*/
|
||||
set(key, value) {
|
||||
const entry = this.map.get(key)
|
||||
const expire = Date.now() + SKIP_TIME
|
||||
|
||||
if (entry) {
|
||||
entry.value = value
|
||||
entry.expire = expire
|
||||
} else {
|
||||
this.map.set(key, { value, expire })
|
||||
}
|
||||
}
|
||||
}
|
||||
63
home/ags/node_modules/eslint-plugin-n/lib/util/check-existence.js
generated
vendored
Normal file
63
home/ags/node_modules/eslint-plugin-n/lib/util/check-existence.js
generated
vendored
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
/**
|
||||
* @author Toru Nagashima
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
"use strict"
|
||||
|
||||
const path = require("path")
|
||||
const exists = require("./exists")
|
||||
const getAllowModules = require("./get-allow-modules")
|
||||
const isTypescript = require("./is-typescript")
|
||||
const mapTypescriptExtension = require("../util/map-typescript-extension")
|
||||
|
||||
/**
|
||||
* Checks whether or not each requirement target exists.
|
||||
*
|
||||
* It looks up the target according to the logic of Node.js.
|
||||
* See Also: https://nodejs.org/api/modules.html
|
||||
*
|
||||
* @param {RuleContext} context - A context to report.
|
||||
* @param {ImportTarget[]} targets - A list of target information to check.
|
||||
* @returns {void}
|
||||
*/
|
||||
exports.checkExistence = function checkExistence(context, targets) {
|
||||
const allowed = new Set(getAllowModules(context))
|
||||
|
||||
for (const target of targets) {
|
||||
const missingModule =
|
||||
target.moduleName != null &&
|
||||
!allowed.has(target.moduleName) &&
|
||||
target.filePath == null
|
||||
|
||||
let missingFile = target.moduleName == null && !exists(target.filePath)
|
||||
if (missingFile && isTypescript(context)) {
|
||||
const parsed = path.parse(target.filePath)
|
||||
const reversedExts = mapTypescriptExtension(
|
||||
context,
|
||||
target.filePath,
|
||||
parsed.ext,
|
||||
true
|
||||
)
|
||||
const reversedPaths = reversedExts.map(
|
||||
reversedExt =>
|
||||
path.resolve(parsed.dir, parsed.name) + reversedExt
|
||||
)
|
||||
missingFile = reversedPaths.every(
|
||||
reversedPath =>
|
||||
target.moduleName == null && !exists(reversedPath)
|
||||
)
|
||||
}
|
||||
if (missingModule || missingFile) {
|
||||
context.report({
|
||||
node: target.node,
|
||||
loc: target.node.loc,
|
||||
messageId: "notFound",
|
||||
data: target,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
exports.messages = {
|
||||
notFound: '"{{name}}" is not found.',
|
||||
}
|
||||
56
home/ags/node_modules/eslint-plugin-n/lib/util/check-extraneous.js
generated
vendored
Normal file
56
home/ags/node_modules/eslint-plugin-n/lib/util/check-extraneous.js
generated
vendored
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
/**
|
||||
* @author Toru Nagashima
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
"use strict"
|
||||
|
||||
const getAllowModules = require("./get-allow-modules")
|
||||
const getPackageJson = require("./get-package-json")
|
||||
|
||||
/**
|
||||
* Checks whether or not each requirement target is published via package.json.
|
||||
*
|
||||
* It reads package.json and checks the target exists in `dependencies`.
|
||||
*
|
||||
* @param {RuleContext} context - A context to report.
|
||||
* @param {string} filePath - The current file path.
|
||||
* @param {ImportTarget[]} targets - A list of target information to check.
|
||||
* @returns {void}
|
||||
*/
|
||||
exports.checkExtraneous = function checkExtraneous(context, filePath, targets) {
|
||||
const packageInfo = getPackageJson(filePath)
|
||||
if (!packageInfo) {
|
||||
return
|
||||
}
|
||||
|
||||
const allowed = new Set(getAllowModules(context))
|
||||
const dependencies = new Set(
|
||||
[packageInfo.name].concat(
|
||||
Object.keys(packageInfo.dependencies || {}),
|
||||
Object.keys(packageInfo.devDependencies || {}),
|
||||
Object.keys(packageInfo.peerDependencies || {}),
|
||||
Object.keys(packageInfo.optionalDependencies || {})
|
||||
)
|
||||
)
|
||||
|
||||
for (const target of targets) {
|
||||
const extraneous =
|
||||
target.moduleName != null &&
|
||||
target.filePath != null &&
|
||||
!dependencies.has(target.moduleName) &&
|
||||
!allowed.has(target.moduleName)
|
||||
|
||||
if (extraneous) {
|
||||
context.report({
|
||||
node: target.node,
|
||||
loc: target.node.loc,
|
||||
messageId: "extraneous",
|
||||
data: target,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
exports.messages = {
|
||||
extraneous: '"{{moduleName}}" is extraneous.',
|
||||
}
|
||||
72
home/ags/node_modules/eslint-plugin-n/lib/util/check-prefer-global.js
generated
vendored
Normal file
72
home/ags/node_modules/eslint-plugin-n/lib/util/check-prefer-global.js
generated
vendored
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
/**
|
||||
* @author Toru Nagashima
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
"use strict"
|
||||
|
||||
const { ReferenceTracker } = require("@eslint-community/eslint-utils")
|
||||
const extendTrackmapWithNodePrefix = require("./extend-trackmap-with-node-prefix")
|
||||
|
||||
/**
|
||||
* Verifier for `prefer-global/*` rules.
|
||||
*/
|
||||
class Verifier {
|
||||
/**
|
||||
* Initialize this instance.
|
||||
* @param {RuleContext} context The rule context to report.
|
||||
* @param {{modules:object,globals:object}} trackMap The track map.
|
||||
*/
|
||||
constructor(context, trackMap) {
|
||||
this.context = context
|
||||
this.trackMap = trackMap
|
||||
this.verify =
|
||||
context.options[0] === "never"
|
||||
? this.verifyToPreferModules
|
||||
: this.verifyToPreferGlobals
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify the code to suggest the use of globals.
|
||||
* @returns {void}
|
||||
*/
|
||||
verifyToPreferGlobals() {
|
||||
const { context, trackMap } = this
|
||||
const sourceCode = context.sourceCode ?? context.getSourceCode() // TODO: just use context.sourceCode when dropping eslint < v9
|
||||
const scope =
|
||||
sourceCode.getScope?.(sourceCode.ast) ?? context.getScope() //TODO: remove context.getScope() when dropping support for ESLint < v9
|
||||
const tracker = new ReferenceTracker(scope, {
|
||||
mode: "legacy",
|
||||
})
|
||||
|
||||
const modules = extendTrackmapWithNodePrefix(trackMap.modules)
|
||||
|
||||
for (const { node } of [
|
||||
...tracker.iterateCjsReferences(modules),
|
||||
...tracker.iterateEsmReferences(modules),
|
||||
]) {
|
||||
context.report({ node, messageId: "preferGlobal" })
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify the code to suggest the use of modules.
|
||||
* @returns {void}
|
||||
*/
|
||||
verifyToPreferModules() {
|
||||
const { context, trackMap } = this
|
||||
const sourceCode = context.sourceCode ?? context.getSourceCode() // TODO: just use context.sourceCode when dropping eslint < v9
|
||||
const scope =
|
||||
sourceCode.getScope?.(sourceCode.ast) ?? context.getScope() //TODO: remove context.getScope() when dropping support for ESLint < v9
|
||||
const tracker = new ReferenceTracker(scope)
|
||||
|
||||
for (const { node } of tracker.iterateGlobalReferences(
|
||||
trackMap.globals
|
||||
)) {
|
||||
context.report({ node, messageId: "preferModule" })
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = function checkForPreferGlobal(context, trackMap) {
|
||||
new Verifier(context, trackMap).verify()
|
||||
}
|
||||
87
home/ags/node_modules/eslint-plugin-n/lib/util/check-publish.js
generated
vendored
Normal file
87
home/ags/node_modules/eslint-plugin-n/lib/util/check-publish.js
generated
vendored
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
/**
|
||||
* @author Toru Nagashima
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
"use strict"
|
||||
|
||||
const path = require("path")
|
||||
const getAllowModules = require("./get-allow-modules")
|
||||
const getConvertPath = require("./get-convert-path")
|
||||
const getNpmignore = require("./get-npmignore")
|
||||
const getPackageJson = require("./get-package-json")
|
||||
|
||||
/**
|
||||
* Checks whether or not each requirement target is published via package.json.
|
||||
*
|
||||
* It reads package.json and checks the target exists in `dependencies`.
|
||||
*
|
||||
* @param {RuleContext} context - A context to report.
|
||||
* @param {string} filePath - The current file path.
|
||||
* @param {ImportTarget[]} targets - A list of target information to check.
|
||||
* @returns {void}
|
||||
*/
|
||||
exports.checkPublish = function checkPublish(context, filePath, targets) {
|
||||
const packageInfo = getPackageJson(filePath)
|
||||
if (!packageInfo) {
|
||||
return
|
||||
}
|
||||
|
||||
// Private packages are never published so we don't need to check the imported dependencies either.
|
||||
// More information: https://docs.npmjs.com/cli/v8/configuring-npm/package-json#private
|
||||
if (packageInfo.private === true) {
|
||||
return
|
||||
}
|
||||
|
||||
const allowed = new Set(getAllowModules(context))
|
||||
const convertPath = getConvertPath(context)
|
||||
const basedir = path.dirname(packageInfo.filePath)
|
||||
|
||||
const toRelative = fullPath => {
|
||||
const retv = path.relative(basedir, fullPath).replace(/\\/gu, "/")
|
||||
return convertPath(retv)
|
||||
}
|
||||
const npmignore = getNpmignore(filePath)
|
||||
const devDependencies = new Set(
|
||||
Object.keys(packageInfo.devDependencies || {})
|
||||
)
|
||||
const dependencies = new Set(
|
||||
[].concat(
|
||||
Object.keys(packageInfo.dependencies || {}),
|
||||
Object.keys(packageInfo.peerDependencies || {}),
|
||||
Object.keys(packageInfo.optionalDependencies || {})
|
||||
)
|
||||
)
|
||||
|
||||
if (!npmignore.match(toRelative(filePath))) {
|
||||
// This file is published, so this cannot import private files.
|
||||
for (const target of targets) {
|
||||
const isPrivateFile = () => {
|
||||
if (target.moduleName != null) {
|
||||
return false
|
||||
}
|
||||
const relativeTargetPath = toRelative(target.filePath)
|
||||
return (
|
||||
relativeTargetPath !== "" &&
|
||||
npmignore.match(relativeTargetPath)
|
||||
)
|
||||
}
|
||||
const isDevPackage = () =>
|
||||
target.moduleName != null &&
|
||||
devDependencies.has(target.moduleName) &&
|
||||
!dependencies.has(target.moduleName) &&
|
||||
!allowed.has(target.moduleName)
|
||||
if (isPrivateFile() || isDevPackage()) {
|
||||
context.report({
|
||||
node: target.node,
|
||||
loc: target.node.loc,
|
||||
messageId: "notPublished",
|
||||
data: { name: target.moduleName || target.name },
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
exports.messages = {
|
||||
notPublished: '"{{name}}" is not published.',
|
||||
}
|
||||
114
home/ags/node_modules/eslint-plugin-n/lib/util/check-restricted.js
generated
vendored
Normal file
114
home/ags/node_modules/eslint-plugin-n/lib/util/check-restricted.js
generated
vendored
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
/**
|
||||
* @author Toru Nagashima
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
"use strict"
|
||||
|
||||
const path = require("path")
|
||||
const { Minimatch } = require("minimatch")
|
||||
|
||||
/** @typedef {import("../util/import-target")} ImportTarget */
|
||||
/**
|
||||
* @typedef {Object} DefinitionData
|
||||
* @property {string | string[]} name The name to disallow.
|
||||
* @property {string} [message] The custom message to show.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Check if matched or not.
|
||||
* @param {InstanceType<Minimatch>} matcher The matcher.
|
||||
* @param {boolean} absolute The flag that the matcher is for absolute paths.
|
||||
* @param {ImportTarget} importee The importee information.
|
||||
*/
|
||||
function match(matcher, absolute, { filePath, name }) {
|
||||
if (absolute) {
|
||||
return filePath != null && matcher.match(filePath)
|
||||
}
|
||||
return matcher.match(name)
|
||||
}
|
||||
|
||||
/** Restriction. */
|
||||
class Restriction {
|
||||
/**
|
||||
* Initialize this restriction.
|
||||
* @param {DefinitionData} def The definition of a restriction.
|
||||
*/
|
||||
constructor({ name, message }) {
|
||||
const names = Array.isArray(name) ? name : [name]
|
||||
const matchers = names.map(raw => {
|
||||
const negate = raw[0] === "!" && raw[1] !== "("
|
||||
const pattern = negate ? raw.slice(1) : raw
|
||||
const absolute = path.isAbsolute(pattern)
|
||||
const matcher = new Minimatch(pattern, { dot: true })
|
||||
return { absolute, matcher, negate }
|
||||
})
|
||||
|
||||
this.matchers = matchers
|
||||
this.message = message ? ` ${message}` : ""
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a given importee is disallowed.
|
||||
* @param {ImportTarget} importee The importee to check.
|
||||
* @returns {boolean} `true` if the importee is disallowed.
|
||||
*/
|
||||
match(importee) {
|
||||
return this.matchers.reduce(
|
||||
(ret, { absolute, matcher, negate }) =>
|
||||
negate
|
||||
? ret && !match(matcher, absolute, importee)
|
||||
: ret || match(matcher, absolute, importee),
|
||||
false
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a restriction.
|
||||
* @param {string | DefinitionData} def A definition.
|
||||
* @returns {Restriction} Created restriction.
|
||||
*/
|
||||
function createRestriction(def) {
|
||||
if (typeof def === "string") {
|
||||
return new Restriction({ name: def })
|
||||
}
|
||||
return new Restriction(def)
|
||||
}
|
||||
|
||||
/**
|
||||
* Create restrictions.
|
||||
* @param {(string | DefinitionData | GlobDefinition)[]} defs Definitions.
|
||||
* @returns {(Restriction | GlobRestriction)[]} Created restrictions.
|
||||
*/
|
||||
function createRestrictions(defs) {
|
||||
return (defs || []).map(createRestriction)
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if given importees are disallowed or not.
|
||||
* @param {RuleContext} context - A context to report.
|
||||
* @param {ImportTarget[]} targets - A list of target information to check.
|
||||
* @returns {void}
|
||||
*/
|
||||
exports.checkForRestriction = function checkForRestriction(context, targets) {
|
||||
const restrictions = createRestrictions(context.options[0])
|
||||
|
||||
for (const target of targets) {
|
||||
const restriction = restrictions.find(r => r.match(target))
|
||||
if (restriction) {
|
||||
context.report({
|
||||
node: target.node,
|
||||
messageId: "restricted",
|
||||
data: {
|
||||
name: target.name,
|
||||
customMessage: restriction.message,
|
||||
},
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
exports.messages = {
|
||||
restricted:
|
||||
"'{{name}}' module is restricted from being used.{{customMessage}}",
|
||||
}
|
||||
118
home/ags/node_modules/eslint-plugin-n/lib/util/check-unsupported-builtins.js
generated
vendored
Normal file
118
home/ags/node_modules/eslint-plugin-n/lib/util/check-unsupported-builtins.js
generated
vendored
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
/**
|
||||
* @author Toru Nagashima
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
"use strict"
|
||||
|
||||
const { Range, lt, major } = require("semver") // eslint-disable-line no-unused-vars
|
||||
const { ReferenceTracker } = require("@eslint-community/eslint-utils")
|
||||
const getConfiguredNodeVersion = require("./get-configured-node-version")
|
||||
const getSemverRange = require("./get-semver-range")
|
||||
const unprefixNodeColon = require("./unprefix-node-colon")
|
||||
|
||||
/**
|
||||
* @typedef {Object} SupportInfo
|
||||
* @property {string | null} supported The stably supported version. If `null` is present, it hasn't been supported yet.
|
||||
* @property {string[]} [backported] The backported versions.
|
||||
* @property {string} [experimental] The added version as experimental.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Parses the options.
|
||||
* @param {RuleContext} context The rule context.
|
||||
* @returns {{version:Range,ignores:Set<string>}} Parsed value.
|
||||
*/
|
||||
function parseOptions(context) {
|
||||
const raw = context.options[0] || {}
|
||||
const version = getConfiguredNodeVersion(context)
|
||||
const ignores = new Set(raw.ignores || [])
|
||||
|
||||
return Object.freeze({ version, ignores })
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if it has been supported.
|
||||
* @param {SupportInfo} info The support info.
|
||||
* @param {Range} configured The configured version range.
|
||||
*/
|
||||
function isSupported({ backported, supported }, configured) {
|
||||
if (
|
||||
backported &&
|
||||
backported.length >= 2 &&
|
||||
!backported.every((v, i) => i === 0 || lt(backported[i - 1], v))
|
||||
) {
|
||||
throw new Error("Invalid BackportConfiguration")
|
||||
}
|
||||
|
||||
if (supported == null) {
|
||||
return false
|
||||
}
|
||||
if (backported == null || backported.length === 0) {
|
||||
return !configured.intersects(getSemverRange(`<${supported}`))
|
||||
}
|
||||
|
||||
return !configured.intersects(
|
||||
getSemverRange(
|
||||
[...backported, supported]
|
||||
.map((v, i) => (i === 0 ? `<${v}` : `>=${major(v)}.0.0 <${v}`))
|
||||
.join(" || ")
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the formatted text of a given supported version.
|
||||
* @param {SupportInfo} info The support info.
|
||||
*/
|
||||
function supportedVersionToString({ backported, supported }) {
|
||||
if (supported == null) {
|
||||
return "(none yet)"
|
||||
}
|
||||
if (backported == null || backported.length === 0) {
|
||||
return supported
|
||||
}
|
||||
return `${supported} (backported: ^${backported.join(", ^")})`
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify the code to report unsupported APIs.
|
||||
* @param {RuleContext} context The rule context.
|
||||
* @param {{modules:object,globals:object}} trackMap The map for APIs to report.
|
||||
* @returns {void}
|
||||
*/
|
||||
module.exports.checkUnsupportedBuiltins = function checkUnsupportedBuiltins(
|
||||
context,
|
||||
trackMap
|
||||
) {
|
||||
const options = parseOptions(context)
|
||||
const sourceCode = context.sourceCode ?? context.getSourceCode() // TODO: just use context.sourceCode when dropping eslint < v9
|
||||
const scope = sourceCode.getScope?.(sourceCode.ast) ?? context.getScope() //TODO: remove context.getScope() when dropping support for ESLint < v9
|
||||
const tracker = new ReferenceTracker(scope, { mode: "legacy" })
|
||||
const references = [
|
||||
...tracker.iterateCjsReferences(trackMap.modules || {}),
|
||||
...tracker.iterateEsmReferences(trackMap.modules || {}),
|
||||
...tracker.iterateGlobalReferences(trackMap.globals || {}),
|
||||
]
|
||||
|
||||
for (const { node, path, info } of references) {
|
||||
const name = unprefixNodeColon(path.join("."))
|
||||
const supported = isSupported(info, options.version)
|
||||
|
||||
if (!supported && !options.ignores.has(name)) {
|
||||
context.report({
|
||||
node,
|
||||
messageId: "unsupported",
|
||||
data: {
|
||||
name,
|
||||
supported: supportedVersionToString(info),
|
||||
version: options.version.raw,
|
||||
},
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
exports.messages = {
|
||||
unsupported:
|
||||
"The '{{name}}' is not supported until Node.js {{supported}}. The configured version range is '{{version}}'.",
|
||||
}
|
||||
40
home/ags/node_modules/eslint-plugin-n/lib/util/enumerate-property-names.js
generated
vendored
Normal file
40
home/ags/node_modules/eslint-plugin-n/lib/util/enumerate-property-names.js
generated
vendored
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
/**
|
||||
* @author Toru Nagashima <https://github.com/mysticatea>
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
"use strict"
|
||||
|
||||
const { CALL, CONSTRUCT, READ } = require("@eslint-community/eslint-utils")
|
||||
const unprefixNodeColon = require("./unprefix-node-colon")
|
||||
|
||||
/**
|
||||
* Enumerate property names of a given object recursively.
|
||||
* @param {object} trackMap The map for APIs to enumerate.
|
||||
* @param {string[]|undefined} path The path to the current map.
|
||||
* @returns {IterableIterator<string>} The property names of the map.
|
||||
*/
|
||||
function* enumeratePropertyNames(trackMap, path = []) {
|
||||
for (const key of Object.keys(trackMap)) {
|
||||
const value = trackMap[key]
|
||||
if (typeof value !== "object") {
|
||||
continue
|
||||
}
|
||||
path.push(key)
|
||||
|
||||
const name = unprefixNodeColon(path.join("."))
|
||||
if (value[CALL]) {
|
||||
yield `${name}()`
|
||||
}
|
||||
if (value[CONSTRUCT]) {
|
||||
yield `new ${name}()`
|
||||
}
|
||||
if (value[READ]) {
|
||||
yield name
|
||||
}
|
||||
yield* enumeratePropertyNames(value, path)
|
||||
|
||||
path.pop()
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = enumeratePropertyNames
|
||||
58
home/ags/node_modules/eslint-plugin-n/lib/util/exists.js
generated
vendored
Normal file
58
home/ags/node_modules/eslint-plugin-n/lib/util/exists.js
generated
vendored
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
/**
|
||||
* @author Toru Nagashima
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
"use strict"
|
||||
|
||||
const fs = require("fs")
|
||||
const path = require("path")
|
||||
const Cache = require("./cache")
|
||||
|
||||
const ROOT = /^(?:[/.]|\.\.|[A-Z]:\\|\\\\)(?:[/\\]\.\.)*$/u
|
||||
const cache = new Cache()
|
||||
|
||||
/**
|
||||
* Check whether the file exists or not.
|
||||
* @param {string} filePath The file path to check.
|
||||
* @returns {boolean} `true` if the file exists.
|
||||
*/
|
||||
function existsCaseSensitive(filePath) {
|
||||
let dirPath = filePath
|
||||
|
||||
while (dirPath !== "" && !ROOT.test(dirPath)) {
|
||||
const fileName = path.basename(dirPath)
|
||||
dirPath = path.dirname(dirPath)
|
||||
|
||||
if (fs.readdirSync(dirPath).indexOf(fileName) === -1) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether or not the file of a given path exists.
|
||||
*
|
||||
* @param {string} filePath - A file path to check.
|
||||
* @returns {boolean} `true` if the file of a given path exists.
|
||||
*/
|
||||
module.exports = function exists(filePath) {
|
||||
let result = cache.get(filePath)
|
||||
if (result == null) {
|
||||
try {
|
||||
const relativePath = path.relative(process.cwd(), filePath)
|
||||
result =
|
||||
fs.statSync(relativePath).isFile() &&
|
||||
existsCaseSensitive(relativePath)
|
||||
} catch (error) {
|
||||
if (error.code !== "ENOENT") {
|
||||
throw error
|
||||
}
|
||||
result = false
|
||||
}
|
||||
cache.set(filePath, result)
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
21
home/ags/node_modules/eslint-plugin-n/lib/util/extend-trackmap-with-node-prefix.js
generated
vendored
Normal file
21
home/ags/node_modules/eslint-plugin-n/lib/util/extend-trackmap-with-node-prefix.js
generated
vendored
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
"use strict"
|
||||
|
||||
const isCoreModule = require("is-core-module")
|
||||
|
||||
/**
|
||||
* Extend trackMap.modules with `node:` prefixed modules
|
||||
* @param {Object} modules Like `{assert: foo}`
|
||||
* @returns {Object} Like `{assert: foo}, "node:assert": foo}`
|
||||
*/
|
||||
module.exports = function extendTrackMapWithNodePrefix(modules) {
|
||||
const ret = {
|
||||
...modules,
|
||||
...Object.fromEntries(
|
||||
Object.entries(modules)
|
||||
.map(([name, value]) => [`node:${name}`, value])
|
||||
// Note: "999" arbitrary to check current/future Node.js version
|
||||
.filter(([name]) => isCoreModule(name, "999"))
|
||||
),
|
||||
}
|
||||
return ret
|
||||
}
|
||||
49
home/ags/node_modules/eslint-plugin-n/lib/util/get-allow-modules.js
generated
vendored
Normal file
49
home/ags/node_modules/eslint-plugin-n/lib/util/get-allow-modules.js
generated
vendored
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
/**
|
||||
* @author Toru Nagashima
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
"use strict"
|
||||
|
||||
const DEFAULT_VALUE = Object.freeze([])
|
||||
|
||||
/**
|
||||
* Gets `allowModules` property from a given option object.
|
||||
*
|
||||
* @param {object|undefined} option - An option object to get.
|
||||
* @returns {string[]|null} The `allowModules` value, or `null`.
|
||||
*/
|
||||
function get(option) {
|
||||
if (option && option.allowModules && Array.isArray(option.allowModules)) {
|
||||
return option.allowModules.map(String)
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets "allowModules" setting.
|
||||
*
|
||||
* 1. This checks `options` property, then returns it if exists.
|
||||
* 2. This checks `settings.n` | `settings.node` property, then returns it if exists.
|
||||
* 3. This returns `[]`.
|
||||
*
|
||||
* @param {RuleContext} context - The rule context.
|
||||
* @returns {string[]} A list of extensions.
|
||||
*/
|
||||
module.exports = function getAllowModules(context) {
|
||||
return (
|
||||
get(context.options && context.options[0]) ||
|
||||
get(
|
||||
context.settings && (context.settings.n || context.settings.node)
|
||||
) ||
|
||||
DEFAULT_VALUE
|
||||
)
|
||||
}
|
||||
|
||||
module.exports.schema = {
|
||||
type: "array",
|
||||
items: {
|
||||
type: "string",
|
||||
pattern: "^(?:@[a-zA-Z0-9_\\-.]+/)?[a-zA-Z0-9_\\-.]+$",
|
||||
},
|
||||
uniqueItems: true,
|
||||
}
|
||||
61
home/ags/node_modules/eslint-plugin-n/lib/util/get-configured-node-version.js
generated
vendored
Normal file
61
home/ags/node_modules/eslint-plugin-n/lib/util/get-configured-node-version.js
generated
vendored
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
/**
|
||||
* @author Toru Nagashima <https://github.com/mysticatea>
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
"use strict"
|
||||
|
||||
const { Range } = require("semver") // eslint-disable-line no-unused-vars
|
||||
const getPackageJson = require("./get-package-json")
|
||||
const getSemverRange = require("./get-semver-range")
|
||||
|
||||
/**
|
||||
* Gets `version` property from a given option object.
|
||||
*
|
||||
* @param {object|undefined} option - An option object to get.
|
||||
* @returns {string[]|null} The `allowModules` value, or `null`.
|
||||
*/
|
||||
function get(option) {
|
||||
if (option && option.version) {
|
||||
return option.version
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the `engines.node` field of package.json.
|
||||
* @param {string} filename The path to the current linting file.
|
||||
* @returns {Range|null} The range object of the `engines.node` field.
|
||||
*/
|
||||
function getEnginesNode(filename) {
|
||||
const info = getPackageJson(filename)
|
||||
return getSemverRange(info && info.engines && info.engines.node)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets version configuration.
|
||||
*
|
||||
* 1. Parse a given version then return it if it's valid.
|
||||
* 2. Look package.json up and parse `engines.node` then return it if it's valid.
|
||||
* 3. Return `>=16.0.0`.
|
||||
*
|
||||
* @param {string|undefined} version The version range text.
|
||||
* @param {string} filename The path to the current linting file.
|
||||
* This will be used to look package.json up if `version` is not a valid version range.
|
||||
* @returns {Range} The configured version range.
|
||||
*/
|
||||
module.exports = function getConfiguredNodeVersion(context) {
|
||||
const version =
|
||||
get(context.options && context.options[0]) ||
|
||||
get(context.settings && (context.settings.n || context.settings.node))
|
||||
const filePath = context.filename ?? context.getFilename()
|
||||
|
||||
return (
|
||||
getSemverRange(version) ||
|
||||
getEnginesNode(filePath) ||
|
||||
getSemverRange(">=16.0.0")
|
||||
)
|
||||
}
|
||||
|
||||
module.exports.schema = {
|
||||
type: "string",
|
||||
}
|
||||
191
home/ags/node_modules/eslint-plugin-n/lib/util/get-convert-path.js
generated
vendored
Normal file
191
home/ags/node_modules/eslint-plugin-n/lib/util/get-convert-path.js
generated
vendored
Normal file
|
|
@ -0,0 +1,191 @@
|
|||
/**
|
||||
* @author Toru Nagashima
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
"use strict"
|
||||
|
||||
const Minimatch = require("minimatch").Minimatch
|
||||
|
||||
/**
|
||||
* @param {any} x - An any value.
|
||||
* @returns {any} Always `x`.
|
||||
*/
|
||||
function identity(x) {
|
||||
return x
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts old-style value to new-style value.
|
||||
*
|
||||
* @param {any} x - The value to convert.
|
||||
* @returns {({include: string[], exclude: string[], replace: string[]})[]} Normalized value.
|
||||
*/
|
||||
function normalizeValue(x) {
|
||||
if (Array.isArray(x)) {
|
||||
return x
|
||||
}
|
||||
|
||||
return Object.keys(x).map(pattern => ({
|
||||
include: [pattern],
|
||||
exclude: [],
|
||||
replace: x[pattern],
|
||||
}))
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures the given value is a string array.
|
||||
*
|
||||
* @param {any} x - The value to ensure.
|
||||
* @returns {string[]} The string array.
|
||||
*/
|
||||
function toStringArray(x) {
|
||||
if (Array.isArray(x)) {
|
||||
return x.map(String)
|
||||
}
|
||||
return []
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the function which checks whether a file path is matched with the given pattern or not.
|
||||
*
|
||||
* @param {string[]} includePatterns - The glob patterns to include files.
|
||||
* @param {string[]} excludePatterns - The glob patterns to exclude files.
|
||||
* @returns {function} Created predicate function.
|
||||
*/
|
||||
function createMatch(includePatterns, excludePatterns) {
|
||||
const include = includePatterns.map(pattern => new Minimatch(pattern))
|
||||
const exclude = excludePatterns.map(pattern => new Minimatch(pattern))
|
||||
|
||||
return filePath =>
|
||||
include.some(m => m.match(filePath)) &&
|
||||
!exclude.some(m => m.match(filePath))
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a function which replaces a given path.
|
||||
*
|
||||
* @param {RegExp} fromRegexp - A `RegExp` object to replace.
|
||||
* @param {string} toStr - A new string to replace.
|
||||
* @returns {function} A function which replaces a given path.
|
||||
*/
|
||||
function defineConvert(fromRegexp, toStr) {
|
||||
return filePath => filePath.replace(fromRegexp, toStr)
|
||||
}
|
||||
|
||||
/**
|
||||
* Combines given converters.
|
||||
* The result function converts a given path with the first matched converter.
|
||||
*
|
||||
* @param {{match: function, convert: function}} converters - A list of converters to combine.
|
||||
* @returns {function} A function which replaces a given path.
|
||||
*/
|
||||
function combine(converters) {
|
||||
return filePath => {
|
||||
for (const converter of converters) {
|
||||
if (converter.match(filePath)) {
|
||||
return converter.convert(filePath)
|
||||
}
|
||||
}
|
||||
return filePath
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses `convertPath` property from a given option object.
|
||||
*
|
||||
* @param {object|undefined} option - An option object to get.
|
||||
* @returns {function|null} A function which converts a path., or `null`.
|
||||
*/
|
||||
function parse(option) {
|
||||
if (
|
||||
!option ||
|
||||
!option.convertPath ||
|
||||
typeof option.convertPath !== "object"
|
||||
) {
|
||||
return null
|
||||
}
|
||||
|
||||
const converters = []
|
||||
for (const pattern of normalizeValue(option.convertPath)) {
|
||||
const include = toStringArray(pattern.include)
|
||||
const exclude = toStringArray(pattern.exclude)
|
||||
const fromRegexp = new RegExp(String(pattern.replace[0]))
|
||||
const toStr = String(pattern.replace[1])
|
||||
|
||||
converters.push({
|
||||
match: createMatch(include, exclude),
|
||||
convert: defineConvert(fromRegexp, toStr),
|
||||
})
|
||||
}
|
||||
|
||||
return combine(converters)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets "convertPath" setting.
|
||||
*
|
||||
* 1. This checks `options` property, then returns it if exists.
|
||||
* 2. This checks `settings.n` | `settings.node` property, then returns it if exists.
|
||||
* 3. This returns a function of identity.
|
||||
*
|
||||
* @param {RuleContext} context - The rule context.
|
||||
* @returns {function} A function which converts a path.
|
||||
*/
|
||||
module.exports = function getConvertPath(context) {
|
||||
return (
|
||||
parse(context.options && context.options[0]) ||
|
||||
parse(
|
||||
context.settings && (context.settings.n || context.settings.node)
|
||||
) ||
|
||||
identity
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* JSON Schema for `convertPath` option.
|
||||
*/
|
||||
module.exports.schema = {
|
||||
anyOf: [
|
||||
{
|
||||
type: "object",
|
||||
properties: {},
|
||||
patternProperties: {
|
||||
"^.+$": {
|
||||
type: "array",
|
||||
items: { type: "string" },
|
||||
minItems: 2,
|
||||
maxItems: 2,
|
||||
},
|
||||
},
|
||||
additionalProperties: false,
|
||||
},
|
||||
{
|
||||
type: "array",
|
||||
items: {
|
||||
type: "object",
|
||||
properties: {
|
||||
include: {
|
||||
type: "array",
|
||||
items: { type: "string" },
|
||||
minItems: 1,
|
||||
uniqueItems: true,
|
||||
},
|
||||
exclude: {
|
||||
type: "array",
|
||||
items: { type: "string" },
|
||||
uniqueItems: true,
|
||||
},
|
||||
replace: {
|
||||
type: "array",
|
||||
items: { type: "string" },
|
||||
minItems: 2,
|
||||
maxItems: 2,
|
||||
},
|
||||
},
|
||||
additionalProperties: false,
|
||||
required: ["include", "replace"],
|
||||
},
|
||||
minItems: 1,
|
||||
},
|
||||
],
|
||||
}
|
||||
187
home/ags/node_modules/eslint-plugin-n/lib/util/get-npmignore.js
generated
vendored
Normal file
187
home/ags/node_modules/eslint-plugin-n/lib/util/get-npmignore.js
generated
vendored
Normal file
|
|
@ -0,0 +1,187 @@
|
|||
/**
|
||||
* @author Toru Nagashima
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
"use strict"
|
||||
|
||||
const fs = require("fs")
|
||||
const path = require("path")
|
||||
const ignore = require("ignore")
|
||||
const Cache = require("./cache")
|
||||
const exists = require("./exists")
|
||||
const getPackageJson = require("./get-package-json")
|
||||
|
||||
const cache = new Cache()
|
||||
const PARENT_RELATIVE_PATH = /^\.\./u
|
||||
const NEVER_IGNORED =
|
||||
/^(?:readme\.[^.]*|(?:licen[cs]e|changes|changelog|history)(?:\.[^.]*)?)$/iu
|
||||
|
||||
/**
|
||||
* Checks whether or not a given file name is a relative path to a ancestor
|
||||
* directory.
|
||||
*
|
||||
* @param {string} filePath - A file name to check.
|
||||
* @returns {boolean} `true` if the file name is a relative path to a ancestor
|
||||
* directory.
|
||||
*/
|
||||
function isAncestorFiles(filePath) {
|
||||
return PARENT_RELATIVE_PATH.test(filePath)
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {function} f - A function.
|
||||
* @param {function} g - A function.
|
||||
* @returns {function} A logical-and function of `f` and `g`.
|
||||
*/
|
||||
function and(f, g) {
|
||||
return filePath => f(filePath) && g(filePath)
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {function} f - A function.
|
||||
* @param {function} g - A function.
|
||||
* @param {function|null} h - A function.
|
||||
* @returns {function} A logical-or function of `f`, `g`, and `h`.
|
||||
*/
|
||||
function or(f, g, h) {
|
||||
return filePath => f(filePath) || g(filePath) || (h && h(filePath))
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {function} f - A function.
|
||||
* @returns {function} A logical-not function of `f`.
|
||||
*/
|
||||
function not(f) {
|
||||
return filePath => !f(filePath)
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a function which checks whether or not a given file is ignoreable.
|
||||
*
|
||||
* @param {object} p - An object of package.json.
|
||||
* @returns {function} A function which checks whether or not a given file is ignoreable.
|
||||
*/
|
||||
function filterNeverIgnoredFiles(p) {
|
||||
const basedir = path.dirname(p.filePath)
|
||||
const mainFilePath =
|
||||
typeof p.main === "string" ? path.join(basedir, p.main) : null
|
||||
|
||||
return filePath =>
|
||||
path.join(basedir, filePath) !== mainFilePath &&
|
||||
filePath !== "package.json" &&
|
||||
!NEVER_IGNORED.test(path.relative(basedir, filePath))
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a function which checks whether or not a given file should be ignored.
|
||||
*
|
||||
* @param {string[]|null} files - File names of whitelist.
|
||||
* @returns {function|null} A function which checks whether or not a given file should be ignored.
|
||||
*/
|
||||
function parseWhiteList(files) {
|
||||
if (!files || !Array.isArray(files)) {
|
||||
return null
|
||||
}
|
||||
|
||||
const ig = ignore()
|
||||
const igN = ignore()
|
||||
let hasN = false
|
||||
|
||||
for (const file of files) {
|
||||
if (typeof file === "string" && file) {
|
||||
const body = path.posix
|
||||
.normalize(file.replace(/^!/u, ""))
|
||||
.replace(/\/+$/u, "")
|
||||
|
||||
if (file.startsWith("!")) {
|
||||
igN.add(`${body}`)
|
||||
igN.add(`${body}/**`)
|
||||
hasN = true
|
||||
} else {
|
||||
ig.add(`/${body}`)
|
||||
ig.add(`/${body}/**`)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return hasN
|
||||
? or(ig.createFilter(), not(igN.createFilter()))
|
||||
: ig.createFilter()
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a function which checks whether or not a given file should be ignored.
|
||||
*
|
||||
* @param {string} basedir - The directory path "package.json" exists.
|
||||
* @param {boolean} filesFieldExists - `true` if `files` field of `package.json` exists.
|
||||
* @returns {function|null} A function which checks whether or not a given file should be ignored.
|
||||
*/
|
||||
function parseNpmignore(basedir, filesFieldExists) {
|
||||
let filePath = path.join(basedir, ".npmignore")
|
||||
if (!exists(filePath)) {
|
||||
if (filesFieldExists) {
|
||||
return null
|
||||
}
|
||||
|
||||
filePath = path.join(basedir, ".gitignore")
|
||||
if (!exists(filePath)) {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
const ig = ignore()
|
||||
ig.add(fs.readFileSync(filePath, "utf8"))
|
||||
return not(ig.createFilter())
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an object to check whether a given path should be ignored or not.
|
||||
* The object is created from:
|
||||
*
|
||||
* - `files` field of `package.json`
|
||||
* - `.npmignore`
|
||||
*
|
||||
* @param {string} startPath - A file path to lookup.
|
||||
* @returns {object}
|
||||
* An object to check whther or not a given path should be ignored.
|
||||
* The object has a method `match`.
|
||||
* `match` returns `true` if a given file path should be ignored.
|
||||
*/
|
||||
module.exports = function getNpmignore(startPath) {
|
||||
const retv = { match: isAncestorFiles }
|
||||
|
||||
const p = getPackageJson(startPath)
|
||||
if (p) {
|
||||
const data = cache.get(p.filePath)
|
||||
if (data) {
|
||||
return data
|
||||
}
|
||||
|
||||
const filesIgnore = parseWhiteList(p.files)
|
||||
const npmignoreIgnore = parseNpmignore(
|
||||
path.dirname(p.filePath),
|
||||
Boolean(filesIgnore)
|
||||
)
|
||||
|
||||
if (filesIgnore && npmignoreIgnore) {
|
||||
retv.match = and(
|
||||
filterNeverIgnoredFiles(p),
|
||||
or(isAncestorFiles, filesIgnore, npmignoreIgnore)
|
||||
)
|
||||
} else if (filesIgnore) {
|
||||
retv.match = and(
|
||||
filterNeverIgnoredFiles(p),
|
||||
or(isAncestorFiles, filesIgnore)
|
||||
)
|
||||
} else if (npmignoreIgnore) {
|
||||
retv.match = and(
|
||||
filterNeverIgnoredFiles(p),
|
||||
or(isAncestorFiles, npmignoreIgnore)
|
||||
)
|
||||
}
|
||||
|
||||
cache.set(p.filePath, retv)
|
||||
}
|
||||
|
||||
return retv
|
||||
}
|
||||
75
home/ags/node_modules/eslint-plugin-n/lib/util/get-package-json.js
generated
vendored
Normal file
75
home/ags/node_modules/eslint-plugin-n/lib/util/get-package-json.js
generated
vendored
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
/**
|
||||
* @author Toru Nagashima
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
"use strict"
|
||||
|
||||
const fs = require("fs")
|
||||
const path = require("path")
|
||||
const Cache = require("./cache")
|
||||
|
||||
const cache = new Cache()
|
||||
|
||||
/**
|
||||
* Reads the `package.json` data in a given path.
|
||||
*
|
||||
* Don't cache the data.
|
||||
*
|
||||
* @param {string} dir - The path to a directory to read.
|
||||
* @returns {object|null} The read `package.json` data, or null.
|
||||
*/
|
||||
function readPackageJson(dir) {
|
||||
const filePath = path.join(dir, "package.json")
|
||||
try {
|
||||
const text = fs.readFileSync(filePath, "utf8")
|
||||
const data = JSON.parse(text)
|
||||
|
||||
if (typeof data === "object" && data !== null) {
|
||||
data.filePath = filePath
|
||||
return data
|
||||
}
|
||||
} catch (_err) {
|
||||
// do nothing.
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a `package.json` data.
|
||||
* The data is cached if found, then it's used after.
|
||||
*
|
||||
* @param {string} [startPath] - A file path to lookup.
|
||||
* @returns {object|null} A found `package.json` data or `null`.
|
||||
* This object have additional property `filePath`.
|
||||
*/
|
||||
module.exports = function getPackageJson(startPath = "a.js") {
|
||||
const startDir = path.dirname(path.resolve(startPath))
|
||||
let dir = startDir
|
||||
let prevDir = ""
|
||||
let data = null
|
||||
|
||||
do {
|
||||
data = cache.get(dir)
|
||||
if (data) {
|
||||
if (dir !== startDir) {
|
||||
cache.set(startDir, data)
|
||||
}
|
||||
return data
|
||||
}
|
||||
|
||||
data = readPackageJson(dir)
|
||||
if (data) {
|
||||
cache.set(dir, data)
|
||||
cache.set(startDir, data)
|
||||
return data
|
||||
}
|
||||
|
||||
// Go to next.
|
||||
prevDir = dir
|
||||
dir = path.resolve(dir, "..")
|
||||
} while (dir !== prevDir)
|
||||
|
||||
cache.set(startDir, null)
|
||||
return null
|
||||
}
|
||||
46
home/ags/node_modules/eslint-plugin-n/lib/util/get-resolve-paths.js
generated
vendored
Normal file
46
home/ags/node_modules/eslint-plugin-n/lib/util/get-resolve-paths.js
generated
vendored
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
/**
|
||||
* @author Toru Nagashima
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
"use strict"
|
||||
|
||||
const DEFAULT_VALUE = Object.freeze([])
|
||||
|
||||
/**
|
||||
* Gets `resolvePaths` property from a given option object.
|
||||
*
|
||||
* @param {object|undefined} option - An option object to get.
|
||||
* @returns {string[]|null} The `allowModules` value, or `null`.
|
||||
*/
|
||||
function get(option) {
|
||||
if (option && option.resolvePaths && Array.isArray(option.resolvePaths)) {
|
||||
return option.resolvePaths.map(String)
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets "resolvePaths" setting.
|
||||
*
|
||||
* 1. This checks `options` property, then returns it if exists.
|
||||
* 2. This checks `settings.n` | `settings.node` property, then returns it if exists.
|
||||
* 3. This returns `[]`.
|
||||
*
|
||||
* @param {RuleContext} context - The rule context.
|
||||
* @returns {string[]} A list of extensions.
|
||||
*/
|
||||
module.exports = function getResolvePaths(context, optionIndex = 0) {
|
||||
return (
|
||||
get(context.options && context.options[optionIndex]) ||
|
||||
get(
|
||||
context.settings && (context.settings.n || context.settings.node)
|
||||
) ||
|
||||
DEFAULT_VALUE
|
||||
)
|
||||
}
|
||||
|
||||
module.exports.schema = {
|
||||
type: "array",
|
||||
items: { type: "string" },
|
||||
uniqueItems: true,
|
||||
}
|
||||
30
home/ags/node_modules/eslint-plugin-n/lib/util/get-semver-range.js
generated
vendored
Normal file
30
home/ags/node_modules/eslint-plugin-n/lib/util/get-semver-range.js
generated
vendored
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
/**
|
||||
* @author Toru Nagashima <https://github.com/mysticatea>
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
"use strict"
|
||||
|
||||
const { Range } = require("semver")
|
||||
const cache = new Map()
|
||||
|
||||
/**
|
||||
* Get the `semver.Range` object of a given range text.
|
||||
* @param {string} x The text expression for a semver range.
|
||||
* @returns {Range|null} The range object of a given range text.
|
||||
* It's null if the `x` is not a valid range text.
|
||||
*/
|
||||
module.exports = function getSemverRange(x) {
|
||||
const s = String(x)
|
||||
let ret = cache.get(s) || null
|
||||
|
||||
if (!ret) {
|
||||
try {
|
||||
ret = new Range(s)
|
||||
} catch (_error) {
|
||||
// Ignore parsing error.
|
||||
}
|
||||
cache.set(s, ret)
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
49
home/ags/node_modules/eslint-plugin-n/lib/util/get-try-extensions.js
generated
vendored
Normal file
49
home/ags/node_modules/eslint-plugin-n/lib/util/get-try-extensions.js
generated
vendored
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
/**
|
||||
* @author Toru Nagashima
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
"use strict"
|
||||
|
||||
const DEFAULT_VALUE = Object.freeze([".js", ".json", ".node"])
|
||||
|
||||
/**
|
||||
* Gets `tryExtensions` property from a given option object.
|
||||
*
|
||||
* @param {object|undefined} option - An option object to get.
|
||||
* @returns {string[]|null} The `tryExtensions` value, or `null`.
|
||||
*/
|
||||
function get(option) {
|
||||
if (option && option.tryExtensions && Array.isArray(option.tryExtensions)) {
|
||||
return option.tryExtensions.map(String)
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets "tryExtensions" setting.
|
||||
*
|
||||
* 1. This checks `options` property, then returns it if exists.
|
||||
* 2. This checks `settings.n` | `settings.node` property, then returns it if exists.
|
||||
* 3. This returns `[".js", ".json", ".node"]`.
|
||||
*
|
||||
* @param {RuleContext} context - The rule context.
|
||||
* @returns {string[]} A list of extensions.
|
||||
*/
|
||||
module.exports = function getTryExtensions(context, optionIndex = 0) {
|
||||
return (
|
||||
get(context.options && context.options[optionIndex]) ||
|
||||
get(
|
||||
context.settings && (context.settings.n || context.settings.node)
|
||||
) ||
|
||||
DEFAULT_VALUE
|
||||
)
|
||||
}
|
||||
|
||||
module.exports.schema = {
|
||||
type: "array",
|
||||
items: {
|
||||
type: "string",
|
||||
pattern: "^\\.",
|
||||
},
|
||||
uniqueItems: true,
|
||||
}
|
||||
31
home/ags/node_modules/eslint-plugin-n/lib/util/get-tsconfig.js
generated
vendored
Normal file
31
home/ags/node_modules/eslint-plugin-n/lib/util/get-tsconfig.js
generated
vendored
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
"use strict"
|
||||
|
||||
const { getTsconfig, parseTsconfig } = require("get-tsconfig")
|
||||
const fsCache = new Map()
|
||||
|
||||
/**
|
||||
* Attempts to get the ExtensionMap from the tsconfig given the path to the tsconfig file.
|
||||
*
|
||||
* @param {string} filename - The path to the tsconfig.json file
|
||||
* @returns {import("get-tsconfig").TsConfigJsonResolved}
|
||||
*/
|
||||
function getTSConfig(filename) {
|
||||
return parseTsconfig(filename, fsCache)
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to get the ExtensionMap from the tsconfig of a given file.
|
||||
*
|
||||
* @param {string} filename - The path to the file we need to find the tsconfig.json of
|
||||
* @returns {import("get-tsconfig").TsConfigResult}
|
||||
*/
|
||||
function getTSConfigForFile(filename) {
|
||||
return getTsconfig(filename, "tsconfig.json", fsCache)
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getTSConfig,
|
||||
getTSConfigForFile,
|
||||
}
|
||||
|
||||
module.exports.schema = { type: "string" }
|
||||
147
home/ags/node_modules/eslint-plugin-n/lib/util/get-typescript-extension-map.js
generated
vendored
Normal file
147
home/ags/node_modules/eslint-plugin-n/lib/util/get-typescript-extension-map.js
generated
vendored
Normal file
|
|
@ -0,0 +1,147 @@
|
|||
"use strict"
|
||||
|
||||
const { getTSConfig, getTSConfigForFile } = require("./get-tsconfig")
|
||||
|
||||
const DEFAULT_MAPPING = normalise([
|
||||
["", ".js"],
|
||||
[".ts", ".js"],
|
||||
[".cts", ".cjs"],
|
||||
[".mts", ".mjs"],
|
||||
[".tsx", ".js"],
|
||||
])
|
||||
|
||||
const PRESERVE_MAPPING = normalise([
|
||||
["", ".js"],
|
||||
[".ts", ".js"],
|
||||
[".cts", ".cjs"],
|
||||
[".mts", ".mjs"],
|
||||
[".tsx", ".jsx"],
|
||||
])
|
||||
|
||||
const tsConfigMapping = {
|
||||
react: DEFAULT_MAPPING, // Emit .js files with JSX changed to the equivalent React.createElement calls
|
||||
"react-jsx": DEFAULT_MAPPING, // Emit .js files with the JSX changed to _jsx calls
|
||||
"react-jsxdev": DEFAULT_MAPPING, // Emit .js files with the JSX changed to _jsx calls
|
||||
"react-native": DEFAULT_MAPPING, // Emit .js files with the JSX unchanged
|
||||
preserve: PRESERVE_MAPPING, // Emit .jsx files with the JSX unchanged
|
||||
}
|
||||
|
||||
/**
|
||||
* @typedef {Object} ExtensionMap
|
||||
* @property {Record<string, string>} forward Convert from typescript to javascript
|
||||
* @property {Record<string, string[]>} backward Convert from javascript to typescript
|
||||
*/
|
||||
|
||||
function normalise(typescriptExtensionMap) {
|
||||
const forward = {}
|
||||
const backward = {}
|
||||
for (const [typescript, javascript] of typescriptExtensionMap) {
|
||||
forward[typescript] = javascript
|
||||
if (!typescript) {
|
||||
continue
|
||||
}
|
||||
backward[javascript] ??= []
|
||||
backward[javascript].push(typescript)
|
||||
}
|
||||
return { forward, backward }
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to get the ExtensionMap from the resolved tsconfig.
|
||||
*
|
||||
* @param {import("get-tsconfig").TsConfigJsonResolved} [tsconfig] - The resolved tsconfig
|
||||
* @returns {ExtensionMap} The `typescriptExtensionMap` value, or `null`.
|
||||
*/
|
||||
function getMappingFromTSConfig(tsconfig) {
|
||||
const jsx = tsconfig?.compilerOptions?.jsx
|
||||
|
||||
if ({}.hasOwnProperty.call(tsConfigMapping, jsx)) {
|
||||
return tsConfigMapping[jsx]
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets `typescriptExtensionMap` property from a given option object.
|
||||
*
|
||||
* @param {object|undefined} option - An option object to get.
|
||||
* @returns {ExtensionMap} The `typescriptExtensionMap` value, or `null`.
|
||||
*/
|
||||
function get(option) {
|
||||
if (
|
||||
{}.hasOwnProperty.call(tsConfigMapping, option?.typescriptExtensionMap)
|
||||
) {
|
||||
return tsConfigMapping[option.typescriptExtensionMap]
|
||||
}
|
||||
|
||||
if (Array.isArray(option?.typescriptExtensionMap)) {
|
||||
return normalise(option.typescriptExtensionMap)
|
||||
}
|
||||
|
||||
if (option?.tsconfigPath) {
|
||||
return getMappingFromTSConfig(getTSConfig(option?.tsconfigPath))
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to get the ExtensionMap from the tsconfig of a given file.
|
||||
*
|
||||
* @param {string} filename - The filename we're getting from
|
||||
* @returns {ExtensionMap} The `typescriptExtensionMap` value, or `null`.
|
||||
*/
|
||||
function getFromTSConfigFromFile(filename) {
|
||||
return getMappingFromTSConfig(getTSConfigForFile(filename)?.config)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets "typescriptExtensionMap" setting.
|
||||
*
|
||||
* 1. This checks `options.typescriptExtensionMap`, if its an array then it gets returned.
|
||||
* 2. This checks `options.typescriptExtensionMap`, if its a string, convert to the correct mapping.
|
||||
* 3. This checks `settings.n.typescriptExtensionMap`, if its an array then it gets returned.
|
||||
* 4. This checks `settings.node.typescriptExtensionMap`, if its an array then it gets returned.
|
||||
* 5. This checks `settings.n.typescriptExtensionMap`, if its a string, convert to the correct mapping.
|
||||
* 6. This checks `settings.node.typescriptExtensionMap`, if its a string, convert to the correct mapping.
|
||||
* 7. This checks for a `tsconfig.json` `config.compilerOptions.jsx` property, if its a string, convert to the correct mapping.
|
||||
* 8. This returns `PRESERVE_MAPPING`.
|
||||
*
|
||||
* @param {import("eslint").Rule.RuleContext} context - The rule context.
|
||||
* @returns {string[]} A list of extensions.
|
||||
*/
|
||||
module.exports = function getTypescriptExtensionMap(context) {
|
||||
const filename =
|
||||
context.physicalFilename ??
|
||||
context.getPhysicalFilename?.() ??
|
||||
context.filename ??
|
||||
context.getFilename?.() // TODO: remove context.get(PhysicalFilename|Filename) when dropping eslint < v10
|
||||
return (
|
||||
get(context.options?.[0]) ||
|
||||
get(context.settings?.n ?? context.settings?.node) ||
|
||||
getFromTSConfigFromFile(filename) ||
|
||||
PRESERVE_MAPPING
|
||||
)
|
||||
}
|
||||
|
||||
module.exports.schema = {
|
||||
oneOf: [
|
||||
{
|
||||
type: "array",
|
||||
items: {
|
||||
type: "array",
|
||||
prefixItems: [
|
||||
{ type: "string", pattern: "^(?:|\\.\\w+)$" },
|
||||
{ type: "string", pattern: "^\\.\\w+$" },
|
||||
],
|
||||
additionalItems: false,
|
||||
},
|
||||
uniqueItems: true,
|
||||
},
|
||||
{
|
||||
type: "string",
|
||||
enum: Object.keys(tsConfigMapping),
|
||||
},
|
||||
],
|
||||
}
|
||||
159
home/ags/node_modules/eslint-plugin-n/lib/util/import-target.js
generated
vendored
Normal file
159
home/ags/node_modules/eslint-plugin-n/lib/util/import-target.js
generated
vendored
Normal file
|
|
@ -0,0 +1,159 @@
|
|||
/**
|
||||
* @author Toru Nagashima
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
"use strict"
|
||||
|
||||
const path = require("path")
|
||||
const { pathToFileURL, fileURLToPath } = require("url")
|
||||
const isBuiltin = require("is-builtin-module")
|
||||
const resolve = require("resolve")
|
||||
const {
|
||||
defaultResolve: importResolve,
|
||||
} = require("../converted-esm/import-meta-resolve")
|
||||
|
||||
/**
|
||||
* Resolve the given id to file paths.
|
||||
* @param {boolean} isModule The flag which indicates this id is a module.
|
||||
* @param {string} id The id to resolve.
|
||||
* @param {object} options The options of node-resolve module.
|
||||
* It requires `options.basedir`.
|
||||
* @param {'import' | 'require'} moduleType - whether the target was require-ed or imported
|
||||
* @returns {string|null} The resolved path.
|
||||
*/
|
||||
function getFilePath(isModule, id, options, moduleType) {
|
||||
if (moduleType === "import") {
|
||||
const paths =
|
||||
options.paths && options.paths.length > 0
|
||||
? options.paths.map(p => path.resolve(process.cwd(), p))
|
||||
: [options.basedir]
|
||||
for (const aPath of paths) {
|
||||
try {
|
||||
const { url } = importResolve(id, {
|
||||
parentURL: pathToFileURL(path.join(aPath, "dummy-file.mjs"))
|
||||
.href,
|
||||
conditions: ["node", "import", "require"],
|
||||
})
|
||||
|
||||
if (url) {
|
||||
return fileURLToPath(url)
|
||||
}
|
||||
} catch (e) {
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
if (isModule) {
|
||||
return null
|
||||
}
|
||||
return path.resolve(
|
||||
(options.paths && options.paths[0]) || options.basedir,
|
||||
id
|
||||
)
|
||||
} else {
|
||||
try {
|
||||
return resolve.sync(id, options)
|
||||
} catch (_err) {
|
||||
try {
|
||||
const { url } = importResolve(id, {
|
||||
parentURL: pathToFileURL(
|
||||
path.join(options.basedir, "dummy-file.js")
|
||||
).href,
|
||||
conditions: ["node", "require"],
|
||||
})
|
||||
|
||||
return fileURLToPath(url)
|
||||
} catch (err) {
|
||||
if (isModule) {
|
||||
return null
|
||||
}
|
||||
return path.resolve(options.basedir, id)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function isNodeModule(name, options) {
|
||||
try {
|
||||
return require.resolve(name, options).startsWith(path.sep)
|
||||
} catch {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the module name of a given path.
|
||||
*
|
||||
* e.g. `eslint/lib/ast-utils` -> `eslint`
|
||||
*
|
||||
* @param {string} nameOrPath - A path to get.
|
||||
* @returns {string} The module name of the path.
|
||||
*/
|
||||
function getModuleName(nameOrPath) {
|
||||
let end = nameOrPath.indexOf("/")
|
||||
if (end !== -1 && nameOrPath[0] === "@") {
|
||||
end = nameOrPath.indexOf("/", 1 + end)
|
||||
}
|
||||
|
||||
return end === -1 ? nameOrPath : nameOrPath.slice(0, end)
|
||||
}
|
||||
|
||||
/**
|
||||
* Information of an import target.
|
||||
*/
|
||||
module.exports = class ImportTarget {
|
||||
/**
|
||||
* Initialize this instance.
|
||||
* @param {ASTNode} node - The node of a `require()` or a module declaraiton.
|
||||
* @param {string} name - The name of an import target.
|
||||
* @param {object} options - The options of `node-resolve` module.
|
||||
* @param {'import' | 'require'} moduleType - whether the target was require-ed or imported
|
||||
*/
|
||||
constructor(node, name, options, moduleType) {
|
||||
const isModule = !/^(?:[./\\]|\w+:)/u.test(name)
|
||||
|
||||
/**
|
||||
* The node of a `require()` or a module declaraiton.
|
||||
* @type {ASTNode}
|
||||
*/
|
||||
this.node = node
|
||||
|
||||
/**
|
||||
* The name of this import target.
|
||||
* @type {string}
|
||||
*/
|
||||
this.name = name
|
||||
|
||||
/**
|
||||
* What type of module is this
|
||||
* @type {'unknown'|'relative'|'absolute'|'node'|'npm'|'http'|void}
|
||||
*/
|
||||
this.moduleType = "unknown"
|
||||
|
||||
if (name.startsWith("./") || name.startsWith(".\\")) {
|
||||
this.moduleType = "relative"
|
||||
} else if (name.startsWith("/") || name.startsWith("\\")) {
|
||||
this.moduleType = "absolute"
|
||||
} else if (isBuiltin(name)) {
|
||||
this.moduleType = "node"
|
||||
} else if (isNodeModule(name, options)) {
|
||||
this.moduleType = "npm"
|
||||
} else if (name.startsWith("http://") || name.startsWith("https://")) {
|
||||
this.moduleType = "http"
|
||||
}
|
||||
|
||||
/**
|
||||
* The full path of this import target.
|
||||
* If the target is a module and it does not exist then this is `null`.
|
||||
* @type {string|null}
|
||||
*/
|
||||
this.filePath = getFilePath(isModule, name, options, moduleType)
|
||||
|
||||
/**
|
||||
* The module name of this import target.
|
||||
* If the target is a relative path then this is `null`.
|
||||
* @type {string|null}
|
||||
*/
|
||||
this.moduleName = isModule ? getModuleName(name) : null
|
||||
}
|
||||
}
|
||||
21
home/ags/node_modules/eslint-plugin-n/lib/util/is-typescript.js
generated
vendored
Normal file
21
home/ags/node_modules/eslint-plugin-n/lib/util/is-typescript.js
generated
vendored
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
"use strict"
|
||||
|
||||
const path = require("path")
|
||||
|
||||
const typescriptExtensions = [".ts", ".tsx", ".cts", ".mts"]
|
||||
|
||||
/**
|
||||
* Determine if the context source file is typescript.
|
||||
*
|
||||
* @param {RuleContext} context - A context
|
||||
* @returns {boolean}
|
||||
*/
|
||||
module.exports = function isTypescript(context) {
|
||||
const sourceFileExt = path.extname(
|
||||
context.physicalFilename ??
|
||||
context.getPhysicalFilename?.() ??
|
||||
context.filename ??
|
||||
context.getFilename?.()
|
||||
)
|
||||
return typescriptExtensions.includes(sourceFileExt)
|
||||
}
|
||||
40
home/ags/node_modules/eslint-plugin-n/lib/util/map-typescript-extension.js
generated
vendored
Normal file
40
home/ags/node_modules/eslint-plugin-n/lib/util/map-typescript-extension.js
generated
vendored
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
"use strict"
|
||||
|
||||
const path = require("path")
|
||||
const isTypescript = require("./is-typescript")
|
||||
const getTypescriptExtensionMap = require("./get-typescript-extension-map")
|
||||
|
||||
/**
|
||||
* Maps the typescript file extension that should be added in an import statement,
|
||||
* based on the given file extension of the referenced file OR fallsback to the original given extension.
|
||||
*
|
||||
* For example, in typescript, when referencing another typescript from a typescript file,
|
||||
* a .js extension should be used instead of the original .ts extension of the referenced file.
|
||||
*
|
||||
* @param {import('eslint').Rule.RuleContext} context
|
||||
* @param {string} filePath The filePath of the import
|
||||
* @param {string} fallbackExtension The non-typescript fallback
|
||||
* @param {boolean} reverse Execute a reverse path mapping
|
||||
* @returns {string} The file extension to append to the import statement.
|
||||
*/
|
||||
module.exports = function mapTypescriptExtension(
|
||||
context,
|
||||
filePath,
|
||||
fallbackExtension,
|
||||
reverse = false
|
||||
) {
|
||||
const { forward, backward } = getTypescriptExtensionMap(context)
|
||||
const ext = path.extname(filePath)
|
||||
if (reverse) {
|
||||
if (isTypescript(context) && ext in backward) {
|
||||
return backward[ext]
|
||||
}
|
||||
return [fallbackExtension]
|
||||
} else {
|
||||
if (isTypescript(context) && ext in forward) {
|
||||
return forward[ext]
|
||||
}
|
||||
}
|
||||
|
||||
return fallbackExtension
|
||||
}
|
||||
46
home/ags/node_modules/eslint-plugin-n/lib/util/merge-visitors-in-place.js
generated
vendored
Normal file
46
home/ags/node_modules/eslint-plugin-n/lib/util/merge-visitors-in-place.js
generated
vendored
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
/**
|
||||
* @author Toru Nagashima <https://github.com/mysticatea>
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
"use strict"
|
||||
|
||||
/**
|
||||
* Merge two visitors.
|
||||
* This function modifies `visitor1` directly to merge.
|
||||
* @param {Visitor} visitor1 The visitor which is assigned.
|
||||
* @param {Visitor} visitor2 The visitor which is assigning.
|
||||
* @returns {Visitor} `visitor1`.
|
||||
*/
|
||||
module.exports = function mergeVisitorsInPlace(visitor1, visitor2) {
|
||||
for (const key of Object.keys(visitor2)) {
|
||||
const handler1 = visitor1[key]
|
||||
const handler2 = visitor2[key]
|
||||
|
||||
if (typeof handler1 === "function") {
|
||||
if (handler1._handlers) {
|
||||
handler1._handlers.push(handler2)
|
||||
} else {
|
||||
const handlers = [handler1, handler2]
|
||||
visitor1[key] = Object.assign(dispatch.bind(null, handlers), {
|
||||
_handlers: handlers,
|
||||
})
|
||||
}
|
||||
} else {
|
||||
visitor1[key] = handler2
|
||||
}
|
||||
}
|
||||
|
||||
return visitor1
|
||||
}
|
||||
|
||||
/**
|
||||
* Dispatch all given functions with a node.
|
||||
* @param {function[]} handlers The function list to call.
|
||||
* @param {Node} node The AST node to be handled.
|
||||
* @returns {void}
|
||||
*/
|
||||
function dispatch(handlers, node) {
|
||||
for (const h of handlers) {
|
||||
h(node)
|
||||
}
|
||||
}
|
||||
10
home/ags/node_modules/eslint-plugin-n/lib/util/strip-import-path-params.js
generated
vendored
Normal file
10
home/ags/node_modules/eslint-plugin-n/lib/util/strip-import-path-params.js
generated
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
/**
|
||||
* @author Toru Nagashima
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
"use strict"
|
||||
|
||||
module.exports = function stripImportPathParams(path) {
|
||||
const i = path.indexOf("!")
|
||||
return i === -1 ? path : path.slice(0, i)
|
||||
}
|
||||
13
home/ags/node_modules/eslint-plugin-n/lib/util/unprefix-node-colon.js
generated
vendored
Normal file
13
home/ags/node_modules/eslint-plugin-n/lib/util/unprefix-node-colon.js
generated
vendored
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
"use strict"
|
||||
|
||||
/**
|
||||
* Remove `node:` prefix from module name
|
||||
* @param {string} name The module name such as `node:assert` or `assert`.
|
||||
* @returns {string} The unprefixed module name like `assert`.
|
||||
*/
|
||||
module.exports = function unprefixNodeColon(name) {
|
||||
if (name.startsWith("node:")) {
|
||||
return name.slice(5)
|
||||
}
|
||||
return name
|
||||
}
|
||||
80
home/ags/node_modules/eslint-plugin-n/lib/util/visit-import.js
generated
vendored
Normal file
80
home/ags/node_modules/eslint-plugin-n/lib/util/visit-import.js
generated
vendored
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
/**
|
||||
* @author Toru Nagashima
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
"use strict"
|
||||
|
||||
const path = require("path")
|
||||
const isCoreModule = require("is-core-module")
|
||||
const getResolvePaths = require("./get-resolve-paths")
|
||||
const getTryExtensions = require("./get-try-extensions")
|
||||
const ImportTarget = require("./import-target")
|
||||
const stripImportPathParams = require("./strip-import-path-params")
|
||||
|
||||
/**
|
||||
* Gets a list of `import`/`export` declaration targets.
|
||||
*
|
||||
* Core modules of Node.js (e.g. `fs`, `http`) are excluded.
|
||||
*
|
||||
* @param {RuleContext} context - The rule context.
|
||||
* @param {Object} [options] - The flag to include core modules.
|
||||
* @param {boolean} [options.includeCore] - The flag to include core modules.
|
||||
* @param {number} [options.optionIndex] - The index of rule options.
|
||||
* @param {boolean} [options.ignoreTypeImport] - The flag to ignore typescript type imports.
|
||||
* @param {function(ImportTarget[]):void} callback The callback function to get result.
|
||||
* @returns {ImportTarget[]} A list of found target's information.
|
||||
*/
|
||||
module.exports = function visitImport(
|
||||
context,
|
||||
{ includeCore = false, optionIndex = 0, ignoreTypeImport = false } = {},
|
||||
callback
|
||||
) {
|
||||
const targets = []
|
||||
const basedir = path.dirname(
|
||||
path.resolve(context.filename ?? context.getFilename())
|
||||
)
|
||||
const paths = getResolvePaths(context, optionIndex)
|
||||
const extensions = getTryExtensions(context, optionIndex)
|
||||
const options = { basedir, paths, extensions }
|
||||
|
||||
return {
|
||||
[[
|
||||
"ExportAllDeclaration",
|
||||
"ExportNamedDeclaration",
|
||||
"ImportDeclaration",
|
||||
"ImportExpression",
|
||||
]](node) {
|
||||
const sourceNode = node.source
|
||||
|
||||
// skip `import(foo)`
|
||||
if (
|
||||
node.type === "ImportExpression" &&
|
||||
sourceNode &&
|
||||
sourceNode.type !== "Literal"
|
||||
) {
|
||||
return
|
||||
}
|
||||
|
||||
// skip `import type { foo } from 'bar'` (for eslint-typescript)
|
||||
if (
|
||||
ignoreTypeImport &&
|
||||
node.type === "ImportDeclaration" &&
|
||||
node.importKind === "type"
|
||||
) {
|
||||
return
|
||||
}
|
||||
|
||||
const name = sourceNode && stripImportPathParams(sourceNode.value)
|
||||
// Note: "999" arbitrary to check current/future Node.js version
|
||||
if (name && (includeCore || !isCoreModule(name, "999"))) {
|
||||
targets.push(
|
||||
new ImportTarget(sourceNode, name, options, "import")
|
||||
)
|
||||
}
|
||||
},
|
||||
|
||||
"Program:exit"() {
|
||||
callback(targets)
|
||||
},
|
||||
}
|
||||
}
|
||||
71
home/ags/node_modules/eslint-plugin-n/lib/util/visit-require.js
generated
vendored
Normal file
71
home/ags/node_modules/eslint-plugin-n/lib/util/visit-require.js
generated
vendored
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
/**
|
||||
* @author Toru Nagashima
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
"use strict"
|
||||
|
||||
const path = require("path")
|
||||
const {
|
||||
CALL,
|
||||
ReferenceTracker,
|
||||
getStringIfConstant,
|
||||
} = require("@eslint-community/eslint-utils")
|
||||
const isCoreModule = require("is-core-module")
|
||||
const getResolvePaths = require("./get-resolve-paths")
|
||||
const getTryExtensions = require("./get-try-extensions")
|
||||
const ImportTarget = require("./import-target")
|
||||
const stripImportPathParams = require("./strip-import-path-params")
|
||||
|
||||
/**
|
||||
* Gets a list of `require()` targets.
|
||||
*
|
||||
* Core modules of Node.js (e.g. `fs`, `http`) are excluded.
|
||||
*
|
||||
* @param {RuleContext} context - The rule context.
|
||||
* @param {Object} [options] - The flag to include core modules.
|
||||
* @param {boolean} [options.includeCore] - The flag to include core modules.
|
||||
* @param {function(ImportTarget[]):void} callback The callback function to get result.
|
||||
* @returns {Object} The visitor.
|
||||
*/
|
||||
module.exports = function visitRequire(
|
||||
context,
|
||||
{ includeCore = false } = {},
|
||||
callback
|
||||
) {
|
||||
const targets = []
|
||||
const basedir = path.dirname(
|
||||
path.resolve(context.filename ?? context.getFilename())
|
||||
)
|
||||
const paths = getResolvePaths(context)
|
||||
const extensions = getTryExtensions(context)
|
||||
const options = { basedir, paths, extensions }
|
||||
|
||||
return {
|
||||
"Program:exit"(node) {
|
||||
const sourceCode = context.sourceCode ?? context.getSourceCode() // TODO: just use context.sourceCode when dropping eslint < v9
|
||||
const tracker = new ReferenceTracker(
|
||||
sourceCode.getScope?.(node) ?? context.getScope() //TODO: remove context.getScope() when dropping support for ESLint < v9
|
||||
)
|
||||
const references = tracker.iterateGlobalReferences({
|
||||
require: {
|
||||
[CALL]: true,
|
||||
resolve: { [CALL]: true },
|
||||
},
|
||||
})
|
||||
|
||||
for (const { node } of references) {
|
||||
const targetNode = node.arguments[0]
|
||||
const rawName = getStringIfConstant(targetNode)
|
||||
const name = rawName && stripImportPathParams(rawName)
|
||||
// Note: "999" arbitrary to check current/future Node.js version
|
||||
if (name && (includeCore || !isCoreModule(name, "999"))) {
|
||||
targets.push(
|
||||
new ImportTarget(targetNode, name, options, "require")
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
callback(targets)
|
||||
},
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue