eslint-plugin-jwt-security 3.5.2 → 3.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-jwt-security",
3
- "version": "3.5.2",
3
+ "version": "3.5.3",
4
4
  "description": "ESLint plugin for JWT security — detects algorithm confusion (CVE-2022-23540), alg:none, weak or hardcoded secrets, and decode-without-verify.",
5
5
  "type": "commonjs",
6
6
  "main": "./src/index.js",
@@ -79,7 +79,7 @@
79
79
  "node": ">=18.0.0"
80
80
  },
81
81
  "dependencies": {
82
- "@interlace/eslint-devkit": "^1.19.0"
82
+ "@interlace/eslint-devkit": "^1.20.2"
83
83
  },
84
84
  "peerDependencies": {
85
85
  "eslint": "^8.40.0 || ^9.0.0 || ^10.0.0",
package/src/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noSensitivePayload=exports.requireMaxAge=exports.noTimestampManipulation=exports.requireAudienceValidation=exports.requireIssuerValidation=exports.requireIssuedAt=exports.noHardcodedSecret=exports.requireExpiration=exports.noWeakSecret=exports.noDecodeWithoutVerify=exports.requireAlgorithmWhitelist=exports.noAlgorithmConfusion=exports.noAlgorithmNone=exports.configs=exports.plugin=exports.rules=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const no_algorithm_none_1=require("./rules/no-algorithm-none");Object.defineProperty(exports,"noAlgorithmNone",{enumerable:true,get:function(){return no_algorithm_none_1.noAlgorithmNone}});const no_algorithm_confusion_1=require("./rules/no-algorithm-confusion");Object.defineProperty(exports,"noAlgorithmConfusion",{enumerable:true,get:function(){return no_algorithm_confusion_1.noAlgorithmConfusion}});const require_algorithm_whitelist_1=require("./rules/require-algorithm-whitelist");Object.defineProperty(exports,"requireAlgorithmWhitelist",{enumerable:true,get:function(){return require_algorithm_whitelist_1.requireAlgorithmWhitelist}});const no_decode_without_verify_1=require("./rules/no-decode-without-verify");Object.defineProperty(exports,"noDecodeWithoutVerify",{enumerable:true,get:function(){return no_decode_without_verify_1.noDecodeWithoutVerify}});const no_weak_secret_1=require("./rules/no-weak-secret");Object.defineProperty(exports,"noWeakSecret",{enumerable:true,get:function(){return no_weak_secret_1.noWeakSecret}});const require_expiration_1=require("./rules/require-expiration");Object.defineProperty(exports,"requireExpiration",{enumerable:true,get:function(){return require_expiration_1.requireExpiration}});const no_hardcoded_secret_1=require("./rules/no-hardcoded-secret");Object.defineProperty(exports,"noHardcodedSecret",{enumerable:true,get:function(){return no_hardcoded_secret_1.noHardcodedSecret}});const require_issued_at_1=require("./rules/require-issued-at");Object.defineProperty(exports,"requireIssuedAt",{enumerable:true,get:function(){return require_issued_at_1.requireIssuedAt}});const require_issuer_validation_1=require("./rules/require-issuer-validation");Object.defineProperty(exports,"requireIssuerValidation",{enumerable:true,get:function(){return require_issuer_validation_1.requireIssuerValidation}});const require_audience_validation_1=require("./rules/require-audience-validation");Object.defineProperty(exports,"requireAudienceValidation",{enumerable:true,get:function(){return require_audience_validation_1.requireAudienceValidation}});const no_timestamp_manipulation_1=require("./rules/no-timestamp-manipulation");Object.defineProperty(exports,"noTimestampManipulation",{enumerable:true,get:function(){return no_timestamp_manipulation_1.noTimestampManipulation}});const require_max_age_1=require("./rules/require-max-age");Object.defineProperty(exports,"requireMaxAge",{enumerable:true,get:function(){return require_max_age_1.requireMaxAge}});const no_sensitive_payload_1=require("./rules/no-sensitive-payload");Object.defineProperty(exports,"noSensitivePayload",{enumerable:true,get:function(){return no_sensitive_payload_1.noSensitivePayload}});exports.rules={get"no-algorithm-none"(){return require("./rules/no-algorithm-none").noAlgorithmNone},get"no-algorithm-confusion"(){return require("./rules/no-algorithm-confusion").noAlgorithmConfusion},get"require-algorithm-whitelist"(){return require("./rules/require-algorithm-whitelist").requireAlgorithmWhitelist},get"no-decode-without-verify"(){return require("./rules/no-decode-without-verify").noDecodeWithoutVerify},get"no-weak-secret"(){return require("./rules/no-weak-secret").noWeakSecret},get"require-expiration"(){return require("./rules/require-expiration").requireExpiration},get"no-hardcoded-secret"(){return require("./rules/no-hardcoded-secret").noHardcodedSecret},get"require-issued-at"(){return require("./rules/require-issued-at").requireIssuedAt},get"require-issuer-validation"(){return require("./rules/require-issuer-validation").requireIssuerValidation},get"require-audience-validation"(){return require("./rules/require-audience-validation").requireAudienceValidation},get"no-timestamp-manipulation"(){return require("./rules/no-timestamp-manipulation").noTimestampManipulation},get"require-max-age"(){return require("./rules/require-max-age").requireMaxAge},get"no-sensitive-payload"(){return require("./rules/no-sensitive-payload").noSensitivePayload}};(0,eslint_devkit_1.withCanonicalDocsUrls)("plugin-jwt-security",exports.rules);exports.plugin={meta:{name:"eslint-plugin-jwt-security",version:"3.5.2"},rules:exports.rules};const recommendedRules={"jwt-security/no-algorithm-none":"error","jwt-security/no-algorithm-confusion":"error","jwt-security/require-algorithm-whitelist":"error","jwt-security/no-decode-without-verify":"error","jwt-security/no-weak-secret":"error","jwt-security/no-hardcoded-secret":"error","jwt-security/no-timestamp-manipulation":"error","jwt-security/require-expiration":"error","jwt-security/no-sensitive-payload":"warn","jwt-security/require-issued-at":"warn"};const strictRules={"jwt-security/no-algorithm-none":"error","jwt-security/no-algorithm-confusion":"error","jwt-security/require-algorithm-whitelist":"error","jwt-security/no-decode-without-verify":"error","jwt-security/no-weak-secret":"error","jwt-security/no-hardcoded-secret":"error","jwt-security/require-expiration":"error","jwt-security/require-issued-at":"error","jwt-security/require-issuer-validation":"error","jwt-security/require-audience-validation":"error","jwt-security/no-timestamp-manipulation":"error","jwt-security/require-max-age":"error","jwt-security/no-sensitive-payload":"error"};const legacyRules={"jwt-security/no-algorithm-none":"error","jwt-security/no-algorithm-confusion":"error","jwt-security/no-hardcoded-secret":"warn"};exports.configs={flagship:{plugins:{"jwt-security":exports.plugin,jwt:exports.plugin},rules:{"jwt-security/no-algorithm-none":"error"}},recommended:{plugins:{"jwt-security":exports.plugin,jwt:exports.plugin},rules:recommendedRules},strict:{plugins:{"jwt-security":exports.plugin,jwt:exports.plugin},rules:strictRules},legacy:{plugins:{"jwt-security":exports.plugin,jwt:exports.plugin},rules:legacyRules},all:{plugins:{"jwt-security":exports.plugin,jwt:exports.plugin},rules:strictRules}};exports.default=exports.plugin;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.noSensitivePayload=exports.requireMaxAge=exports.noTimestampManipulation=exports.requireAudienceValidation=exports.requireIssuerValidation=exports.requireIssuedAt=exports.noHardcodedSecret=exports.requireExpiration=exports.noWeakSecret=exports.noDecodeWithoutVerify=exports.requireAlgorithmWhitelist=exports.noAlgorithmConfusion=exports.noAlgorithmNone=exports.configs=exports.plugin=exports.rules=void 0;const eslint_devkit_1=require("@interlace/eslint-devkit");const no_algorithm_none_1=require("./rules/no-algorithm-none");Object.defineProperty(exports,"noAlgorithmNone",{enumerable:true,get:function(){return no_algorithm_none_1.noAlgorithmNone}});const no_algorithm_confusion_1=require("./rules/no-algorithm-confusion");Object.defineProperty(exports,"noAlgorithmConfusion",{enumerable:true,get:function(){return no_algorithm_confusion_1.noAlgorithmConfusion}});const require_algorithm_whitelist_1=require("./rules/require-algorithm-whitelist");Object.defineProperty(exports,"requireAlgorithmWhitelist",{enumerable:true,get:function(){return require_algorithm_whitelist_1.requireAlgorithmWhitelist}});const no_decode_without_verify_1=require("./rules/no-decode-without-verify");Object.defineProperty(exports,"noDecodeWithoutVerify",{enumerable:true,get:function(){return no_decode_without_verify_1.noDecodeWithoutVerify}});const no_weak_secret_1=require("./rules/no-weak-secret");Object.defineProperty(exports,"noWeakSecret",{enumerable:true,get:function(){return no_weak_secret_1.noWeakSecret}});const require_expiration_1=require("./rules/require-expiration");Object.defineProperty(exports,"requireExpiration",{enumerable:true,get:function(){return require_expiration_1.requireExpiration}});const no_hardcoded_secret_1=require("./rules/no-hardcoded-secret");Object.defineProperty(exports,"noHardcodedSecret",{enumerable:true,get:function(){return no_hardcoded_secret_1.noHardcodedSecret}});const require_issued_at_1=require("./rules/require-issued-at");Object.defineProperty(exports,"requireIssuedAt",{enumerable:true,get:function(){return require_issued_at_1.requireIssuedAt}});const require_issuer_validation_1=require("./rules/require-issuer-validation");Object.defineProperty(exports,"requireIssuerValidation",{enumerable:true,get:function(){return require_issuer_validation_1.requireIssuerValidation}});const require_audience_validation_1=require("./rules/require-audience-validation");Object.defineProperty(exports,"requireAudienceValidation",{enumerable:true,get:function(){return require_audience_validation_1.requireAudienceValidation}});const no_timestamp_manipulation_1=require("./rules/no-timestamp-manipulation");Object.defineProperty(exports,"noTimestampManipulation",{enumerable:true,get:function(){return no_timestamp_manipulation_1.noTimestampManipulation}});const require_max_age_1=require("./rules/require-max-age");Object.defineProperty(exports,"requireMaxAge",{enumerable:true,get:function(){return require_max_age_1.requireMaxAge}});const no_sensitive_payload_1=require("./rules/no-sensitive-payload");Object.defineProperty(exports,"noSensitivePayload",{enumerable:true,get:function(){return no_sensitive_payload_1.noSensitivePayload}});exports.rules={get"no-algorithm-none"(){return require("./rules/no-algorithm-none").noAlgorithmNone},get"no-algorithm-confusion"(){return require("./rules/no-algorithm-confusion").noAlgorithmConfusion},get"require-algorithm-whitelist"(){return require("./rules/require-algorithm-whitelist").requireAlgorithmWhitelist},get"no-decode-without-verify"(){return require("./rules/no-decode-without-verify").noDecodeWithoutVerify},get"no-weak-secret"(){return require("./rules/no-weak-secret").noWeakSecret},get"require-expiration"(){return require("./rules/require-expiration").requireExpiration},get"no-hardcoded-secret"(){return require("./rules/no-hardcoded-secret").noHardcodedSecret},get"require-issued-at"(){return require("./rules/require-issued-at").requireIssuedAt},get"require-issuer-validation"(){return require("./rules/require-issuer-validation").requireIssuerValidation},get"require-audience-validation"(){return require("./rules/require-audience-validation").requireAudienceValidation},get"no-timestamp-manipulation"(){return require("./rules/no-timestamp-manipulation").noTimestampManipulation},get"require-max-age"(){return require("./rules/require-max-age").requireMaxAge},get"no-sensitive-payload"(){return require("./rules/no-sensitive-payload").noSensitivePayload}};(0,eslint_devkit_1.withCanonicalDocsUrls)("plugin-jwt-security",exports.rules);exports.plugin={meta:{name:"eslint-plugin-jwt-security",version:"3.5.3"},rules:exports.rules};const recommendedRules={"jwt-security/no-algorithm-none":"error","jwt-security/no-algorithm-confusion":"error","jwt-security/require-algorithm-whitelist":"error","jwt-security/no-decode-without-verify":"error","jwt-security/no-weak-secret":"error","jwt-security/no-hardcoded-secret":"error","jwt-security/no-timestamp-manipulation":"error","jwt-security/require-expiration":"error","jwt-security/no-sensitive-payload":"warn","jwt-security/require-issued-at":"warn"};const strictRules={"jwt-security/no-algorithm-none":"error","jwt-security/no-algorithm-confusion":"error","jwt-security/require-algorithm-whitelist":"error","jwt-security/no-decode-without-verify":"error","jwt-security/no-weak-secret":"error","jwt-security/no-hardcoded-secret":"error","jwt-security/require-expiration":"error","jwt-security/require-issued-at":"error","jwt-security/require-issuer-validation":"error","jwt-security/require-audience-validation":"error","jwt-security/no-timestamp-manipulation":"error","jwt-security/require-max-age":"error","jwt-security/no-sensitive-payload":"error"};const legacyRules={"jwt-security/no-algorithm-none":"error","jwt-security/no-algorithm-confusion":"error","jwt-security/no-hardcoded-secret":"warn"};exports.configs={flagship:{plugins:{"jwt-security":exports.plugin,jwt:exports.plugin},rules:{"jwt-security/no-algorithm-none":"error"}},recommended:{plugins:{"jwt-security":exports.plugin,jwt:exports.plugin},rules:recommendedRules},strict:{plugins:{"jwt-security":exports.plugin,jwt:exports.plugin},rules:strictRules},legacy:{plugins:{"jwt-security":exports.plugin,jwt:exports.plugin},rules:legacyRules},all:{plugins:{"jwt-security":exports.plugin,jwt:exports.plugin},rules:strictRules}};exports.default=exports.plugin;
@@ -1 +1 @@
1
- "use strict";var __createBinding=this&&this.__createBinding||(Object.create?(function(o,m,k,k2){if(k2===void 0)k2=k;var desc=Object.getOwnPropertyDescriptor(m,k);if(!desc||("get"in desc?!m.__esModule:desc.writable||desc.configurable)){desc={enumerable:true,get:function(){return m[k]}}}Object.defineProperty(o,k2,desc)}):(function(o,m,k,k2){if(k2===void 0)k2=k;o[k2]=m[k]}));var __setModuleDefault=this&&this.__setModuleDefault||(Object.create?(function(o,v){Object.defineProperty(o,"default",{enumerable:true,value:v})}):function(o,v){o["default"]=v});var __importStar=this&&this.__importStar||(function(){var ownKeys=function(o){ownKeys=Object.getOwnPropertyNames||function(o2){var ar=[];for(var k in o2)if(Object.prototype.hasOwnProperty.call(o2,k))ar[ar.length]=k;return ar};return ownKeys(o)};return function(mod){if(mod&&mod.__esModule)return mod;var result={};if(mod!=null){for(var k=ownKeys(mod),i=0;i<k.length;i++)if(k[i]!=="default")__createBinding(result,mod,k[i])}__setModuleDefault(result,mod);return result}})();Object.defineProperty(exports,"__esModule",{value:true});exports.parseSource=parseSource;exports.parseFileCached=parseFileCached;exports.relativeExportModule=relativeExportModule;exports.resolveSymbol=resolveSymbol;exports.bindsName=bindsName;const fs=__importStar(require("node:fs"));const path=__importStar(require("node:path"));const node_module_1=require("node:module");const eslint_devkit_1=require("@interlace/eslint-devkit");const value_flow_1=require("./value-flow");const MAX_FILE_HOPS=4;const RESOLUTION_SUFFIXES=["",".ts",".tsx",".js",".mjs",".cjs","/index.ts","/index.tsx","/index.js","/index.mjs","/index.cjs"];const parsed=new Map;function fallbackParser(){try{return(0,node_module_1.createRequire)(path.join(process.cwd(),"noop.js"))("@typescript-eslint/parser")}catch{return null}}function tryParse(candidate,code,filePath){const parser=candidate;if(!parser)return null;const options={ecmaVersion:"latest",sourceType:"module",range:true,loc:true,filePath};try{return parser.parseForESLint?parser.parseForESLint(code,options).ast:parser.parse(code,options)}catch{return null}}function parseSource(code,filePath,parser){return tryParse(parser,code,filePath)??tryParse(fallbackParser(),code,filePath)}function parseFileCached(filePath,parser){const mtimeMs=fs.statSync(filePath,{throwIfNoEntry:false})?.mtimeMs??-1;const cached=parsed.get(filePath);if(cached?.mtimeMs===mtimeMs)return cached.program;let program=null;try{program=parseSource(fs.readFileSync(filePath,"utf8"),filePath,parser)}catch{program=null}parsed.set(filePath,{mtimeMs,program});return program}function resolveRelative(fromFile,specifier){const base=path.resolve(path.dirname(path.resolve(fromFile)),specifier);const typescriptTwin=base.replace(/\.js$/,".ts");for(const candidate of[...RESOLUTION_SUFFIXES.map(suffix=>base+suffix),typescriptTwin]){if(fs.statSync(candidate,{throwIfNoEntry:false})?.isFile()){return candidate}}return null}function bindingModule(program,name){for(const stmt of program.body){if(stmt.type===eslint_devkit_1.AST_NODE_TYPES.ImportDeclaration){for(const spec of stmt.specifiers){if(spec.local.name!==name)continue;return{source:String(stmt.source.value),exportName:spec.type===eslint_devkit_1.AST_NODE_TYPES.ImportSpecifier?(0,eslint_devkit_1.objectKeyName)({key:spec.imported,computed:false}):null}}}if(stmt.type===eslint_devkit_1.AST_NODE_TYPES.VariableDeclaration){for(const declarator of stmt.declarations){const source=(0,value_flow_1.requireSpecifier)(declarator.init);if(source===null)continue;if(declarator.id.type===eslint_devkit_1.AST_NODE_TYPES.Identifier&&declarator.id.name===name){const init=declarator.init;return{source,exportName:init.type===eslint_devkit_1.AST_NODE_TYPES.MemberExpression?(0,eslint_devkit_1.propertyName)(init):null}}if(declarator.id.type===eslint_devkit_1.AST_NODE_TYPES.ObjectPattern){for(const prop of declarator.id.properties){if(prop.type===eslint_devkit_1.AST_NODE_TYPES.Property&&prop.value.type===eslint_devkit_1.AST_NODE_TYPES.Identifier&&prop.value.name===name){return{source,exportName:(0,eslint_devkit_1.objectKeyName)(prop)}}}}}}}return null}function exportedValue(program,name){for(const stmt of program.body){if(stmt.type===eslint_devkit_1.AST_NODE_TYPES.ExpressionStatement&&stmt.expression.type===eslint_devkit_1.AST_NODE_TYPES.AssignmentExpression&&stmt.expression.left.type===eslint_devkit_1.AST_NODE_TYPES.MemberExpression){const{left,right}=stmt.expression;const target=(0,eslint_devkit_1.propertyName)(left);if(target===name)return{kind:"value",node:right};if(target==="exports"&&right.type===eslint_devkit_1.AST_NODE_TYPES.ObjectExpression){for(const prop of right.properties){if(prop.type===eslint_devkit_1.AST_NODE_TYPES.Property&&(0,eslint_devkit_1.objectKeyName)(prop)===name){return{kind:"value",node:prop.value}}}}}if(stmt.type!==eslint_devkit_1.AST_NODE_TYPES.ExportNamedDeclaration)continue;if(stmt.declaration?.type===eslint_devkit_1.AST_NODE_TYPES.VariableDeclaration){for(const declarator of stmt.declaration.declarations){if(declarator.id.type===eslint_devkit_1.AST_NODE_TYPES.Identifier&&declarator.id.name===name&&declarator.init!==null){return{kind:"value",node:declarator.init}}}}for(const spec of stmt.specifiers){const exported=(0,eslint_devkit_1.objectKeyName)({key:spec.exported,computed:false});if(exported!==name)continue;const local=(0,eslint_devkit_1.objectKeyName)({key:spec.local,computed:false});return stmt.source?{kind:"reexport",source:String(stmt.source.value),exportName:local}:{kind:"value",node:{type:eslint_devkit_1.AST_NODE_TYPES.Identifier,name:local}}}}return null}function relativeExportModule(fromFile,specifier,exportName,parser,hops=0){if(hops>=MAX_FILE_HOPS)return null;const file=resolveRelative(fromFile,specifier);if(file===null)return null;const program=parseFileCached(file,parser);if(program===null)return null;const value=exportedValue(program,exportName);if(value===null)return null;let binding;if(value.kind==="reexport"){binding=value}else{const node=value.node;const required=(0,value_flow_1.requireSpecifier)(node);binding=required!==null?{source:required,exportName:node.type===eslint_devkit_1.AST_NODE_TYPES.MemberExpression?(0,eslint_devkit_1.propertyName)(node):null}:node.type===eslint_devkit_1.AST_NODE_TYPES.Identifier?bindingModule(program,node.name):null}if(binding===null)return null;if(!binding.source.startsWith("."))return binding.source;return binding.exportName===null?null:relativeExportModule(file,binding.source,binding.exportName,parser,hops+1)}function topLevelDeclaration(program,name){for(const stmt of program.body){const declaration=stmt.type===eslint_devkit_1.AST_NODE_TYPES.ExportNamedDeclaration||stmt.type===eslint_devkit_1.AST_NODE_TYPES.ExportDefaultDeclaration?stmt.declaration??stmt:stmt;if((declaration.type===eslint_devkit_1.AST_NODE_TYPES.FunctionDeclaration||declaration.type===eslint_devkit_1.AST_NODE_TYPES.ClassDeclaration||declaration.type===eslint_devkit_1.AST_NODE_TYPES.TSInterfaceDeclaration||declaration.type===eslint_devkit_1.AST_NODE_TYPES.TSTypeAliasDeclaration)&&declaration.id?.name===name){return declaration}if(declaration.type!==eslint_devkit_1.AST_NODE_TYPES.VariableDeclaration)continue;for(const declarator of declaration.declarations){if(declarator.id.type===eslint_devkit_1.AST_NODE_TYPES.Identifier&&declarator.id.name===name&&declarator.init!==null&&(0,value_flow_1.requireSpecifier)(declarator.init)===null){return declarator.init}}}return null}function loadRelative(module,specifier){const file=resolveRelative(module.filename,specifier);const program=file===null?null:parseFileCached(file,module.parser);return program===null?null:{program,filename:file,parser:module.parser}}function resolveExport(module,name,hops){if(hops>=MAX_FILE_HOPS)return null;const declared=topLevelDeclaration(module.program,name);if(declared!==null)return{kind:"local",node:declared,module};for(const stmt of module.program.body){if(stmt.type!==eslint_devkit_1.AST_NODE_TYPES.ExportNamedDeclaration)continue;for(const spec of stmt.specifiers){if((0,eslint_devkit_1.objectKeyName)({key:spec.exported,computed:false})!==name){continue}const local=(0,eslint_devkit_1.objectKeyName)({key:spec.local,computed:false});if(stmt.source===null)return resolveSymbol(module,local,hops+1);const source=String(stmt.source.value);if(!source.startsWith("."))return{kind:"external",source};const next=loadRelative(module,source);return next===null?null:resolveExport(next,local,hops+1)}}return null}function resolveSymbol(module,name,hops=0){const local=topLevelDeclaration(module.program,name);if(local!==null)return{kind:"local",node:local,module};const binding=bindingModule(module.program,name);if(binding===null)return null;if(!binding.source.startsWith(".")){return{kind:"external",source:binding.source}}if(binding.exportName===null)return null;const target=loadRelative(module,binding.source);return target===null?null:resolveExport(target,binding.exportName,hops+1)}function bindsName(module,name){return topLevelDeclaration(module.program,name)!==null||bindingModule(module.program,name)!==null}
1
+ "use strict";var __createBinding=this&&this.__createBinding||(Object.create?(function(o,m,k,k2){if(k2===void 0)k2=k;var desc=Object.getOwnPropertyDescriptor(m,k);if(!desc||("get"in desc?!m.__esModule:desc.writable||desc.configurable)){desc={enumerable:true,get:function(){return m[k]}}}Object.defineProperty(o,k2,desc)}):(function(o,m,k,k2){if(k2===void 0)k2=k;o[k2]=m[k]}));var __setModuleDefault=this&&this.__setModuleDefault||(Object.create?(function(o,v){Object.defineProperty(o,"default",{enumerable:true,value:v})}):function(o,v){o["default"]=v});var __importStar=this&&this.__importStar||(function(){var ownKeys=function(o){ownKeys=Object.getOwnPropertyNames||function(o2){var ar=[];for(var k in o2)if(Object.prototype.hasOwnProperty.call(o2,k))ar[ar.length]=k;return ar};return ownKeys(o)};return function(mod){if(mod&&mod.__esModule)return mod;var result={};if(mod!=null){for(var k=ownKeys(mod),i=0;i<k.length;i++)if(k[i]!=="default")__createBinding(result,mod,k[i])}__setModuleDefault(result,mod);return result}})();Object.defineProperty(exports,"__esModule",{value:true});exports.MAX_CACHED_MODULES=void 0;exports.cachedModuleCount=cachedModuleCount;exports.parseSource=parseSource;exports.parseFileCached=parseFileCached;exports.relativeExportModule=relativeExportModule;exports.resolveSymbol=resolveSymbol;exports.bindsName=bindsName;const fs=__importStar(require("node:fs"));const path=__importStar(require("node:path"));const node_module_1=require("node:module");const eslint_devkit_1=require("@interlace/eslint-devkit");const value_flow_1=require("./value-flow");const MAX_FILE_HOPS=4;const RESOLUTION_SUFFIXES=["",".ts",".tsx",".js",".mjs",".cjs","/index.ts","/index.tsx","/index.js","/index.mjs","/index.cjs"];exports.MAX_CACHED_MODULES=512;const parsed=(0,eslint_devkit_1.createLRUCache)(exports.MAX_CACHED_MODULES);function cachedModuleCount(){return parsed.size}function fallbackParser(){try{return(0,node_module_1.createRequire)(path.join(process.cwd(),"noop.js"))("@typescript-eslint/parser")}catch{return null}}function tryParse(candidate,code,filePath){const parser=candidate;if(!parser)return null;const options={ecmaVersion:"latest",sourceType:"module",range:true,loc:true,filePath};try{return parser.parseForESLint?parser.parseForESLint(code,options).ast:parser.parse(code,options)}catch{return null}}function parseSource(code,filePath,parser){return tryParse(parser,code,filePath)??tryParse(fallbackParser(),code,filePath)}function parseFileCached(filePath,parser){const mtimeMs=fs.statSync(filePath,{throwIfNoEntry:false})?.mtimeMs??-1;const cached=parsed.get(filePath);if(cached?.mtimeMs===mtimeMs)return cached.program;let program=null;try{program=parseSource(fs.readFileSync(filePath,"utf8"),filePath,parser)}catch{program=null}parsed.set(filePath,{mtimeMs,program});return program}function resolveRelative(fromFile,specifier){const base=path.resolve(path.dirname(path.resolve(fromFile)),specifier);const typescriptTwin=base.replace(/\.js$/,".ts");for(const candidate of[...RESOLUTION_SUFFIXES.map(suffix=>base+suffix),typescriptTwin]){if(fs.statSync(candidate,{throwIfNoEntry:false})?.isFile()){return candidate}}return null}function bindingModule(program,name){for(const stmt of program.body){if(stmt.type===eslint_devkit_1.AST_NODE_TYPES.ImportDeclaration){for(const spec of stmt.specifiers){if(spec.local.name!==name)continue;return{source:String(stmt.source.value),exportName:spec.type===eslint_devkit_1.AST_NODE_TYPES.ImportSpecifier?(0,eslint_devkit_1.objectKeyName)({key:spec.imported,computed:false}):null}}}if(stmt.type===eslint_devkit_1.AST_NODE_TYPES.VariableDeclaration){for(const declarator of stmt.declarations){const source=(0,value_flow_1.requireSpecifier)(declarator.init);if(source===null)continue;if(declarator.id.type===eslint_devkit_1.AST_NODE_TYPES.Identifier&&declarator.id.name===name){const init=declarator.init;return{source,exportName:init.type===eslint_devkit_1.AST_NODE_TYPES.MemberExpression?(0,eslint_devkit_1.propertyName)(init):null}}if(declarator.id.type===eslint_devkit_1.AST_NODE_TYPES.ObjectPattern){for(const prop of declarator.id.properties){if(prop.type===eslint_devkit_1.AST_NODE_TYPES.Property&&prop.value.type===eslint_devkit_1.AST_NODE_TYPES.Identifier&&prop.value.name===name){return{source,exportName:(0,eslint_devkit_1.objectKeyName)(prop)}}}}}}}return null}function exportedValue(program,name){for(const stmt of program.body){if(stmt.type===eslint_devkit_1.AST_NODE_TYPES.ExpressionStatement&&stmt.expression.type===eslint_devkit_1.AST_NODE_TYPES.AssignmentExpression&&stmt.expression.left.type===eslint_devkit_1.AST_NODE_TYPES.MemberExpression){const{left,right}=stmt.expression;const target=(0,eslint_devkit_1.propertyName)(left);if(target===name)return{kind:"value",node:right};if(target==="exports"&&right.type===eslint_devkit_1.AST_NODE_TYPES.ObjectExpression){for(const prop of right.properties){if(prop.type===eslint_devkit_1.AST_NODE_TYPES.Property&&(0,eslint_devkit_1.objectKeyName)(prop)===name){return{kind:"value",node:prop.value}}}}}if(stmt.type!==eslint_devkit_1.AST_NODE_TYPES.ExportNamedDeclaration)continue;if(stmt.declaration?.type===eslint_devkit_1.AST_NODE_TYPES.VariableDeclaration){for(const declarator of stmt.declaration.declarations){if(declarator.id.type===eslint_devkit_1.AST_NODE_TYPES.Identifier&&declarator.id.name===name&&declarator.init!==null){return{kind:"value",node:declarator.init}}}}for(const spec of stmt.specifiers){const exported=(0,eslint_devkit_1.objectKeyName)({key:spec.exported,computed:false});if(exported!==name)continue;const local=(0,eslint_devkit_1.objectKeyName)({key:spec.local,computed:false});return stmt.source?{kind:"reexport",source:String(stmt.source.value),exportName:local}:{kind:"value",node:{type:eslint_devkit_1.AST_NODE_TYPES.Identifier,name:local}}}}return null}function relativeExportModule(fromFile,specifier,exportName,parser,hops=0){if(hops>=MAX_FILE_HOPS)return null;const file=resolveRelative(fromFile,specifier);if(file===null)return null;const program=parseFileCached(file,parser);if(program===null)return null;const value=exportedValue(program,exportName);if(value===null)return null;let binding;if(value.kind==="reexport"){binding=value}else{const node=value.node;const required=(0,value_flow_1.requireSpecifier)(node);binding=required!==null?{source:required,exportName:node.type===eslint_devkit_1.AST_NODE_TYPES.MemberExpression?(0,eslint_devkit_1.propertyName)(node):null}:node.type===eslint_devkit_1.AST_NODE_TYPES.Identifier?bindingModule(program,node.name):null}if(binding===null)return null;if(!binding.source.startsWith("."))return binding.source;return binding.exportName===null?null:relativeExportModule(file,binding.source,binding.exportName,parser,hops+1)}function topLevelDeclaration(program,name){for(const stmt of program.body){const declaration=stmt.type===eslint_devkit_1.AST_NODE_TYPES.ExportNamedDeclaration||stmt.type===eslint_devkit_1.AST_NODE_TYPES.ExportDefaultDeclaration?stmt.declaration??stmt:stmt;if((declaration.type===eslint_devkit_1.AST_NODE_TYPES.FunctionDeclaration||declaration.type===eslint_devkit_1.AST_NODE_TYPES.ClassDeclaration||declaration.type===eslint_devkit_1.AST_NODE_TYPES.TSInterfaceDeclaration||declaration.type===eslint_devkit_1.AST_NODE_TYPES.TSTypeAliasDeclaration)&&declaration.id?.name===name){return declaration}if(declaration.type!==eslint_devkit_1.AST_NODE_TYPES.VariableDeclaration)continue;for(const declarator of declaration.declarations){if(declarator.id.type===eslint_devkit_1.AST_NODE_TYPES.Identifier&&declarator.id.name===name&&declarator.init!==null&&(0,value_flow_1.requireSpecifier)(declarator.init)===null){return declarator.init}}}return null}function loadRelative(module,specifier){const file=resolveRelative(module.filename,specifier);const program=file===null?null:parseFileCached(file,module.parser);return program===null?null:{program,filename:file,parser:module.parser}}function resolveExport(module,name,hops){if(hops>=MAX_FILE_HOPS)return null;const declared=topLevelDeclaration(module.program,name);if(declared!==null)return{kind:"local",node:declared,module};for(const stmt of module.program.body){if(stmt.type!==eslint_devkit_1.AST_NODE_TYPES.ExportNamedDeclaration)continue;for(const spec of stmt.specifiers){if((0,eslint_devkit_1.objectKeyName)({key:spec.exported,computed:false})!==name){continue}const local=(0,eslint_devkit_1.objectKeyName)({key:spec.local,computed:false});if(stmt.source===null)return resolveSymbol(module,local,hops+1);const source=String(stmt.source.value);if(!source.startsWith("."))return{kind:"external",source};const next=loadRelative(module,source);return next===null?null:resolveExport(next,local,hops+1)}}return null}function resolveSymbol(module,name,hops=0){const local=topLevelDeclaration(module.program,name);if(local!==null)return{kind:"local",node:local,module};const binding=bindingModule(module.program,name);if(binding===null)return null;if(!binding.source.startsWith(".")){return{kind:"external",source:binding.source}}if(binding.exportName===null)return null;const target=loadRelative(module,binding.source);return target===null?null:resolveExport(target,binding.exportName,hops+1)}function bindsName(module,name){return topLevelDeclaration(module.program,name)!==null||bindingModule(module.program,name)!==null}