optimize screener for better extensions
This commit is contained in:
parent
0daee2279d
commit
d7fbff4306
@ -25,6 +25,79 @@
|
|||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
// Define all possible rules and their properties
|
||||||
|
const allRules = {
|
||||||
|
avgVolume: { label: 'Avg Volume', step: [100,50,20,10,5,1], unit: 'M', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
rsi: { label: 'RSI', step: [90,80,70,60,50,40,30,20], unit: '', category: 'ta', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
stochRSI: { label: 'Stoch RSI Fast', step: [90,80,70,60,50,40,30,20], unit: '', category: 'ta', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
mfi: { label: 'MFI', step: [90,80,70,60,50,40,30,20], unit: '', category: 'ta', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
cci: { label: 'CCI', step: [250,200,100,50,20,0,-20,-50,-100,-200,-250], unit: '', category: 'ta', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
atr: { label: 'ATR', step: [20,15,10,5,3,1], unit: '', category: 'ta', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
sma50: { label: 'SMA-50', step: [500,250,100,50,10,1], unit: '', category: 'ta', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
sma200: { label: 'SMA-200', step: [500,250,100,50,10,1], unit: '', category: 'ta', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
ema50: { label: 'EMA-50', step: [500,250,100,50,10,1], unit: '', category: 'ta', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
ema200: { label: 'EMA-200', step: [500,250,100,50,10,1], unit: '', category: 'ta', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
change1W: { label: 'Price Change 1W [%]', step: [20,10,5,1], unit: '%', category: 'ta', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
change1M: { label: 'Price Change 1M [%]', step: [100,50,20,10,5,1], unit: '%', category: 'ta', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
change3M: { label: 'Price Change 3M [%]', step: [100,50,20,10,5,1], unit: '%', category: 'ta', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
change6M: { label: 'Price Change 6M [%]', step: [100,50,20,10,5,1], unit: '%', category: 'ta', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
change1Y: { label: 'Price Change 1Y [%]', step: [100,50,20,10,5,1], unit: '%', category: 'ta', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
change3Y: { label: 'Price Change 3Y [%]', step: [100,50,20,10,5,1], unit: '%', category: 'ta', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
marketCap: { label: 'Market Cap', step: [100,50,10,1], unit: 'B', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
revenue: { label: 'Revenue', step: [200,100,50,20,10,1], unit: 'B', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
growthRevenue: { label: 'Revenue Growth [%]', step: [200,100,50,20,10,5,1], unit: '%', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
costOfRevenue: { label: 'Cost of Revenue', step: [200,100,50,20,10,1], unit: 'B', category: 'fund', defaultCondition: 'under', defaultValue: 'any' },
|
||||||
|
growthCostOfRevenue: { label: 'Cost of Revenue Growth [%]', step: [200,100,50,20,10,5,1], unit: '%', category: 'fund', defaultCondition: 'under', defaultValue: 'any' },
|
||||||
|
costAndExpenses: { label: 'Cost & Expenses', step: [200,100,50,20,10,1], unit: 'B', category: 'fund', defaultCondition: 'under', defaultValue: 'any' },
|
||||||
|
growthCostAndExpenses: { label: 'Cost & Expenses Growth [%]', step: [200,100,50,20,10,5,1], unit: '%', category: 'fund', defaultCondition: 'under', defaultValue: 'any' },
|
||||||
|
netIncome: { label: 'Net Income', step: [200,100,50,20,10,1], unit: 'B', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
growthNetIncome: { label: 'Net Income Growth [%]', step: [200,100,50,20,10,5,1], unit: '%', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
grossProfit: { label: 'Gross Profit', step: [200,100,50,20,10,1], unit: 'B', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
growthGrossProfit: { label: 'Gross Profit Growth [%]', step: [200,100,50,20,10,5,1], unit: '%', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
researchAndDevelopmentExpenses: { label: 'R&D Expenses', step: [100,50,10,1], unit: 'B', category: 'fund', defaultCondition: 'under', defaultValue: 'any' },
|
||||||
|
growthResearchAndDevelopmentExpenses: { label: 'R&D Expenses Growth [%]', step: [200,100,50,20,10,5,1], unit: '%', category: 'fund', defaultCondition: 'under', defaultValue: 'any' },
|
||||||
|
payoutRatio: { label: 'Payout Ratio [%]', step: [100,80,60,40,20,0,-20,-40], unit: '%', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
dividendYield: { label: 'Dividend Yield [%]', step: [50,20,10,5,1], unit: '%', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
annualDividend: { label: 'Annual Dividend', step: [10,5,3,2,1,0], unit: '', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
dividendGrowth: { label: 'Dividend Growth [%]', step: [50,20,10,5,3,2,1,0], unit: '%', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
eps: { label: 'EPS', step: [20,15,10,5,3,2,1,0], unit: '', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
growthEPS: { label: 'EPS Growth [%]', step: [200,100,50,20,10,5,1], unit: '%', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
interestIncome: { label: 'Interest Income', step: [200,100,50,20,10,1], unit: 'B', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
interestExpense: { label: 'Interest Expenses', step: [200,100,50,20,10,1], unit: 'B', category: 'fund', defaultCondition: 'under', defaultValue: 'any' },
|
||||||
|
growthInterestExpense: { label: 'Interest Expenses Growth [%]', step: [200,100,50,20,10,5,1], unit: '%', category: 'fund', defaultCondition: 'under', defaultValue: 'any' },
|
||||||
|
operatingExpenses: { label: 'Operating Expenses', step: [200,100,50,20,10,1], unit: 'B', category: 'fund', defaultCondition: 'under', defaultValue: 'any' },
|
||||||
|
growthOperatingExpenses: { label: 'Operating Expenses Growth [%]', step: [200,100,50,20,10,5,1], unit: '%', category: 'fund', defaultCondition: 'under', defaultValue: 'any' },
|
||||||
|
operatingIncome: { label: 'Operating Income', step: [200,100,50,20,10,1], unit: 'B', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
growthOperatingIncome: { label: 'Operating Income Growth [%]', step: [200,100,50,20,10,5,1], unit: '%', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
pe: { label: 'PE Ratio', step: [50,40,30,20,10,5,1], unit: '', category: 'fund', defaultCondition: 'under', defaultValue: 'any' },
|
||||||
|
forwardPE: { label: 'Forward PE', step: [50,20,10,5,1,0,-1,-5,-10,-20,-50], unit: '', category: 'fund', defaultCondition: 'under', defaultValue: 'any' },
|
||||||
|
priceToBookRatio: { label: 'PB Ratio', step: [50,40,30,20,10,5,1], unit: '', category: 'fund', defaultCondition: 'under', defaultValue: 'any' },
|
||||||
|
priceToSalesRatio: { label: 'PS Ratio', step: [50,40,30,20,10,5,1], unit: '', category: 'fund', defaultCondition: 'under', defaultValue: 'any' },
|
||||||
|
beta: { label: 'Beta', step: [10,5,1,-5,-10], unit: '', category: 'fund', defaultCondition: 'under', defaultValue: 'any' },
|
||||||
|
ebitda: { label: 'EBITDA', step: [200,100,50,20,10,1], unit: 'B', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
growthEBITDA: { label: 'EBITDA Growth [%]', step: [200,100,50,20,10,5,1], unit: '%', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
var: { label: 'Value at Risk', step: [-1,-5,-10,-15,-20], unit: '%', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
trendAnalysis: { label: 'AI Trend Analysis (Bullish)', step: [90,80,70,60,50], unit: '%', category: 'ai', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
fundamentalAnalysis: { label: 'AI Fundamental Analysis (Bullish)', step: [90,80,70,60,50], unit: '%', category: 'ai', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
analystRating: { label: 'Analyst Rating', step: ['Buy', 'Hold', 'Sell'], unit: '', category: 'fund', defaultCondition: 'equals', defaultValue: 'any' },
|
||||||
|
currentRatio: { label: 'Current Ratio', step: [50,40,30,20,10,5,1], unit: '', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
quickRatio: { label: 'Quick Ratio', step: [50,40,30,20,10,5,1], unit: '', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
debtEquityRatio: { label: 'Debt / Equity', step: [50,40,30,20,10,5,1], unit: '', category: 'fund', defaultCondition: 'under', defaultValue: 'any' },
|
||||||
|
debtRatio: { label: 'Debt Ratio', step: [50,40,30,20,10,5,1], unit: '', category: 'fund', defaultCondition: 'under', defaultValue: 'any' },
|
||||||
|
returnOnAssets: { label: 'Return on Assets', step: [10,8,6,4,2,1,0,-2,-4,-6,-8,-10], unit: '', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
returnOnEquity: { label: 'Return on Equity', step: [10,8,6,4,2,1,0,-2,-4,-6,-8,-10], unit: '', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
enterpriseValue: { label: 'Enterprise Value', step: [200,100,50,20,10,1], unit: 'B', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
freeCashFlowPerShare: { label: 'FCF / Share', step: [10,8,6,4,2,1,0], unit: '', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
cashPerShare: { label: 'Cash / Share', step: [50,20,10,5,1,0,-1,-5,-10,-20,-50], unit: '', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
priceToFreeCashFlowsRatio: { label: 'Price / FCF', step: [50,20,10,5,1,0,-1,-5,-10,-20,-50], unit: '', category: 'fund', defaultCondition: 'under', defaultValue: 'any' },
|
||||||
|
sharesShort: { label: 'Short Interest', step: [50,20,10,5,1,0], unit: 'M', category: 'fund', defaultCondition: 'under', defaultValue: 'any' },
|
||||||
|
shortRatio: { label: 'Short Ratio', step: [10,5,3,2,1,0], unit: '', category: 'fund', defaultCondition: 'under', defaultValue: 'any' },
|
||||||
|
shortFloatPercent: { label: 'Short % Float', step: [50,30,20,10,5,1,0], unit: '%', category: 'fund', defaultCondition: 'under', defaultValue: 'any' },
|
||||||
|
shortOutStandingPercent: { label: 'Short % Shares', step: [50,30,20,10,5,1,0], unit: '%', category: 'fund', defaultCondition: 'under', defaultValue: 'any' },
|
||||||
|
failToDeliver: { label: 'Fail to Deliver', step: [500,200,100,50,20,10,5], unit: 'K', category: 'fund', defaultCondition: 'under', defaultValue: 'any' },
|
||||||
|
freeCashFlow: { label: 'Free Cash Flow', step: [500,200,100,20,10,1], unit: 'M', category: 'fund', defaultCondition: 'over', defaultValue: 'any' },
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
const getStockScreenerData = async (rules) => {
|
const getStockScreenerData = async (rules) => {
|
||||||
const ruleNames = rules?.map(rule => rule?.name)?.sort()?.join(',');
|
const ruleNames = rules?.map(rule => rule?.name)?.sort()?.join(',');
|
||||||
@ -57,152 +130,12 @@ const getStockScreenerData = async (rules) => {
|
|||||||
let filteredData = [];
|
let filteredData = [];
|
||||||
let displayResults = [];
|
let displayResults = [];
|
||||||
let isSaved = false;
|
let isSaved = false;
|
||||||
let ruleCondition = {
|
|
||||||
avgVolume: (ruleOfList?.find(item => item.name === "avgVolume") || { condition: 'over' }).condition,
|
|
||||||
priceToBookRatio: (ruleOfList?.find(item => item.name === "priceToBookRati") || { condition: 'over' }).condition,
|
|
||||||
priceToSalesRatio: (ruleOfList?.find(item => item.name === "priceToSalesRatio") || { condition: 'over' }).condition,
|
|
||||||
rsi: (ruleOfList?.find(item => item.name === "rsi") || { condition: 'over' }).condition,
|
|
||||||
stochRSI: (ruleOfList?.find(item => item.name === "stochRSI") || { condition: 'over' }).condition,
|
|
||||||
mfi: (ruleOfList?.find(item => item.name === "mfi") || { condition: 'over' }).condition,
|
|
||||||
cci: (ruleOfList?.find(item => item.name === "cci") || { condition: 'over' }).condition,
|
|
||||||
atr: (ruleOfList?.find(item => item.name === "atr") || { condition: 'over' }).condition,
|
|
||||||
sma50: (ruleOfList?.find(item => item.name === "sma50") || { condition: 'over' }).condition,
|
|
||||||
sma200: (ruleOfList?.find(item => item.name === "sma200") || { condition: 'over' }).condition,
|
|
||||||
ema50: (ruleOfList?.find(item => item.name === "ema50") || { condition: 'over' }).condition,
|
|
||||||
ema200: (ruleOfList?.find(item => item.name === "ema200") || { condition: 'over' }).condition,
|
|
||||||
change1W: (ruleOfList?.find(item => item.name === "change1W") || { condition: 'over' }).condition,
|
|
||||||
change1M: (ruleOfList?.find(item => item.name === "change1M") || { condition: 'over' }).condition,
|
|
||||||
change3M: (ruleOfList?.find(item => item.name === "change3M") || { condition: 'over' }).condition,
|
|
||||||
change6M: (ruleOfList?.find(item => item.name === "change6M") || { condition: 'over' }).condition,
|
|
||||||
change1Y: (ruleOfList?.find(item => item.name === "change1Y") || { condition: 'over' }).condition,
|
|
||||||
change3Y: (ruleOfList?.find(item => item.name === "change3Y") || { condition: 'over' }).condition,
|
|
||||||
payoutRatio: (ruleOfList?.find(item => item.name === "payoutRatio") || { condition: 'over' }).condition,
|
|
||||||
annualDividend: (ruleOfList?.find(item => item.name === "annualDividend") || { condition: 'over' }).condition,
|
|
||||||
dividendYield: (ruleOfList?.find(item => item.name === "dividendYield") || { condition: 'over' }).condition,
|
|
||||||
dividendGrowth: (ruleOfList?.find(item => item.name === "dividendGrowth") || { condition: 'over' }).condition,
|
|
||||||
eps: (ruleOfList?.find(item => item.name === "eps") || { condition: 'over' }).condition,
|
|
||||||
growthEPS: (ruleOfList?.find(item => item.name === "growthEPS") || { condition: 'over' }).condition,
|
|
||||||
pe: (ruleOfList?.find(item => item.name === "pe") || { condition: 'over' }).condition,
|
|
||||||
forwardPE: (ruleOfList?.find(item => item.name === "forwardPE") || { condition: 'over' }).condition,
|
|
||||||
beta: (ruleOfList?.find(item => item.name === "beta") || { condition: 'over' }).condition,
|
|
||||||
ebitda: (ruleOfList?.find(item => item.name === "ebitda") || { condition: 'over' }).condition,
|
|
||||||
growthEBITDA: (ruleOfList?.find(item => item.name === "growthEBITDA") || { condition: 'over' }).condition,
|
|
||||||
revenue: (ruleOfList?.find(item => item.name === "revenue") || { condition: 'over' }).condition,
|
|
||||||
growthRevenue: (ruleOfList?.find(item => item.name === "growthRevenue") || { condition: 'over' }).condition,
|
|
||||||
costOfRevenue: (ruleOfList?.find(item => item.name === "costOfRevenue") || { condition: 'over' }).condition,
|
|
||||||
growthCostOfRevenue: (ruleOfList?.find(item => item.name === "growthCostOfRevenue") || { condition: 'over' }).condition,
|
|
||||||
costAndExpenses: (ruleOfList?.find(item => item.name === "costAndExpenses") || { condition: 'over' }).condition,
|
|
||||||
growthCostAndExpenses: (ruleOfList?.find(item => item.name === "growthCostAndExpenses") || { condition: 'over' }).condition,
|
|
||||||
netIncome: (ruleOfList?.find(item => item.name === "netIncome") || { condition: 'over' }).condition,
|
|
||||||
growthNetIncome: (ruleOfList?.find(item => item.name === "growthNetIncome") || { condition: 'over' }).condition,
|
|
||||||
researchAndDevelopmentExpenses: (ruleOfList?.find(item => item.name === "researchAndDevelopmentExpenses") || { condition: 'over' }).condition,
|
|
||||||
growthResearchAndDevelopmentExpenses: (ruleOfList?.find(item => item.name === "growthResearchAndDevelopmentExpenses") || { condition: 'over' }).condition,
|
|
||||||
grossProfit: (ruleOfList?.find(item => item.name === "grossProfit") || { condition: 'over' }).condition,
|
|
||||||
growthGrossProfit: (ruleOfList?.find(item => item.name === "growthGrossProfit") || { condition: 'over' }).condition,
|
|
||||||
interestIncome: (ruleOfList?.find(item => item.name === "interestIncome") || { condition: 'over' }).condition,
|
|
||||||
interestExpense: (ruleOfList?.find(item => item.name === "interestExpense") || { condition: 'over' }).condition,
|
|
||||||
growthInterestExpense: (ruleOfList?.find(item => item.name === "growthInterestExpense") || { condition: 'over' }).condition,
|
|
||||||
operatingExpenses: (ruleOfList?.find(item => item.name === "operatingExpense") || { condition: 'over' }).condition,
|
|
||||||
growthOperatingExpenses: (ruleOfList?.find(item => item.name === "growthOperatingExpense") || { condition: 'over' }).condition,
|
|
||||||
operatingIncome: (ruleOfList?.find(item => item.name === "operatingIncome") || { condition: 'over' }).condition,
|
|
||||||
growthOperatingIncome: (ruleOfList?.find(item => item.name === "growthOperatingIncome") || { condition: 'over' }).condition,
|
|
||||||
marketCap: (ruleOfList?.find(item => item.name === "marketCap") || { condition: 'over' }).condition,
|
|
||||||
var: (ruleOfList?.find(item => item.name === "var") || { condition: 'over' }).condition,
|
|
||||||
trendAnalysis: (ruleOfList?.find(item => item.name === "trendAnalysis") || { condition: 'over' }).condition,
|
|
||||||
fundamentalAnalysis: (ruleOfList?.find(item => item.name === "fundamentalAnalysis") || { condition: 'over' }).condition,
|
|
||||||
currentRatio: (ruleOfList?.find(item => item.name === "currentRatio") || { condition: 'over' }).condition,
|
|
||||||
quickRatio: (ruleOfList?.find(item => item.name === "quickRatio") || { condition: 'over' }).condition,
|
|
||||||
debtEquityRatio: (ruleOfList?.find(item => item.name === "debtEquityRatio") || { condition: 'over' }).condition,
|
|
||||||
debtRatio: (ruleOfList?.find(item => item.name === "debtRatio") || { condition: 'over' }).condition,
|
|
||||||
returnOnAssets: (ruleOfList?.find(item => item.name === "returnOnAssets") || { condition: 'over' }).condition,
|
|
||||||
returnOnEquity: (ruleOfList?.find(item => item.name === "returnOnEquity") || { condition: 'over' }).condition,
|
|
||||||
enterpriseValue: (ruleOfList?.find(item => item.name === "enterpriseValue") || { condition: 'over' }).condition,
|
|
||||||
freeCashFlowPerShare: (ruleOfList?.find(item => item.name === "freeCashFlowPerShare") || { condition: 'over' }).condition,
|
|
||||||
cashPerShare: (ruleOfList?.find(item => item.name === "cashPerShare") || { condition: 'over' }).condition,
|
|
||||||
priceToFreeCashFlowsRatio: (ruleOfList?.find(item => item.name === "priceToFreeCashFlowsRatio") || { condition: 'over' }).condition,
|
|
||||||
sharesShort: (ruleOfList?.find(item => item.name === "sharesShort") || { condition: 'over' }).condition,
|
|
||||||
shortRatio: (ruleOfList?.find(item => item.name === "shortRatio") || { condition: 'over' }).condition,
|
|
||||||
shortFloatPercent: (ruleOfList?.find(item => item.name === "shortFloatPercent") || { condition: 'over' }).condition,
|
|
||||||
shortOutStandingPercent: (ruleOfList?.find(item => item.name === "shortOutStandingPercent") || { condition: 'over' }).condition,
|
|
||||||
failToDeliver: (ruleOfList?.find(item => item.name === "failToDeliver") || { condition: 'over' }).condition,
|
|
||||||
freeCashFlow: (ruleOfList?.find(item => item.name === "freeCashFlow") || { condition: 'over' }).condition,
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
let allRows = [
|
|
||||||
{ rule: 'avgVolume', label: 'Avg Volume', step: [100,50,20,10,5,1], unit: 'M', category: 'fund' },
|
|
||||||
{ rule: 'rsi', label: 'RSI', step: [90,80,70,60,50,40,30,20], unit: '', category: 'ta' },
|
|
||||||
{ rule: 'stochRSI', label: 'Stoch RSI Fast', step: [90,80,70,60,50,40,30,20], unit: '', category: 'ta' },
|
|
||||||
{ rule: 'mfi', label: 'MFI', step: [90,80,70,60,50,40,30,20], unit: '', category: 'ta' },
|
|
||||||
{ rule: 'cci', label: 'CCI', step: [250,200,100,50,20,0,-20,-50,-100,-200,-250], unit: '', category: 'ta' },
|
|
||||||
{ rule: 'atr', label: 'ATR', step: [20,15,10,5,3,1],unit: '', category: 'ta' },
|
|
||||||
{ rule: 'sma50', label: 'SMA-50', step: [500,250,100,50,10,1], unit: '',category: 'ta' },
|
|
||||||
{ rule: 'sma200', label: 'SMA-200', step: [500,250,100,50,10,1], unit: '',category: 'ta' },
|
|
||||||
{ rule: 'ema50', label: 'EMA-50', step: [500,250,100,50,10,1], unit: '',category: 'ta' },
|
|
||||||
{ rule: 'ema200', label: 'EMA-200', step: [500,250,100,50,10,1],unit: '',category: 'ta' },
|
|
||||||
{ rule: 'change1W', label: 'Price Change 1W [%]', step: [20,10,5,1], unit: '%',category: 'ta' },
|
|
||||||
{ rule: 'change1M', label: 'Price Change 1M [%]', step: [100,50,20,10,5,1], unit: '%',category: 'ta' },
|
|
||||||
{ rule: 'change3M', label: 'Price Change 3M [%]', step: [100,50,20,10,5,1], unit: '%',category: 'ta' },
|
|
||||||
{ rule: 'change6M', label: 'Price Change 6M [%]', step: [100,50,20,10,5,1], unit: '%',category: 'ta' },
|
|
||||||
{ rule: 'change1Y', label: 'Price Change 1Y [%]', step: [100,50,20,10,5,1], unit: '%',category: 'ta' },
|
|
||||||
{ rule: 'change3Y', label: 'Price Change 3Y [%]', step: [100,50,20,10,5,1], unit: '%',category: 'ta' },
|
|
||||||
{ rule: 'marketCap', label: 'Market Cap', step: [100,50,10,1], unit: 'B', category: 'fund'},
|
|
||||||
{ rule: 'revenue', label: 'Revenue', step: [200,100,50,20,10,1], unit: 'B', category: 'fund' },
|
|
||||||
{ rule: 'growthRevenue', label: 'Revenue Growth [%]', step: [200,100,50,20,10,5,1], unit: '%', category: 'fund' },
|
|
||||||
{ rule: 'costOfRevenue', label: 'Cost of Revenue', step: [200,100,50,20,10,1], unit: 'B', category: 'fund' },
|
|
||||||
{ rule: 'growthCostOfRevenue', label: 'Cost of Revenue Growth [%]', step: [200,100,50,20,10,5,1], unit: '%', category: 'fund' },
|
|
||||||
{ rule: 'costAndExpenses', label: 'Cost & Expenses', step: [200,100,50,20,10,1], unit: 'B', category: 'fund' },
|
|
||||||
{ rule: 'growthCostAndExpenses', label: 'Cost & Expenses Growth [%]', step: [200,100,50,20,10,5,1], unit: '%', category: 'fund' },
|
|
||||||
{ rule: 'netIncome', label: 'Net Income', step: [200,100,50,20,10,1], unit: 'B', category: 'fund'},
|
|
||||||
{ rule: 'growthNetIncome', label: 'Net Income Growth [%]', step: [200,100,50,20,10,5,1], unit: '%', category: 'fund'},
|
|
||||||
{ rule: 'grossProfit', label: 'Gross Profit', step: [200,100,50,20,10,1], unit: 'B', category: 'fund'},
|
|
||||||
{ rule: 'growthGrossProfit', label: 'Gross Profit Growth [%]', step: [200,100,50,20,10,5,1], unit: '%', category: 'fund'},
|
|
||||||
{ rule: 'researchAndDevelopmentExpenses', label: 'R&D Expenses', step: [100,50,10,1], unit: 'B', category: 'fund'},
|
|
||||||
{ rule: 'growthResearchAndDevelopmentExpenses', label: 'R&D Expenses Growth [%]', step: [200,100,50,20,10,5,1], unit: '%', category: 'fund'},
|
|
||||||
{ rule: 'payoutRatio', label: 'Payout Ratio [%]', step: [100,80,60,40,20,0,-20,-40], unit: '%', category: 'fund' },
|
|
||||||
{ rule: 'dividendYield', label: 'Dividend Yield [%]', step: [50,20,10,5,1], unit: '%',category: 'fund' },
|
|
||||||
{ rule: 'annualDividend', label: 'Annual Dividend', step: [10,5,3,2,1,0], unit: '', category: 'fund' },
|
|
||||||
{ rule: 'dividendGrowth', label: 'Dividend Growth [%]', step: [50,20,10,5,3,2,1,0], unit: '%',category: 'fund' },
|
|
||||||
{ rule: 'eps', label: 'EPS', step: [20,15,10,5,3,2,1,0], unit: '', category: 'fund' },
|
|
||||||
{ rule: 'growthEPS', label: 'EPS Growth [%]', step: [200,100,50,20,10,5,1], unit: '%', category: 'fund' },
|
|
||||||
{ rule: 'interestIncome', label: 'Interest Income', step: [200,100,50,20,10,1], unit: 'B', category: 'fund' },
|
|
||||||
{ rule: 'interestExpense', label: 'Interest Expenses', step: [200,100,50,20,10,1], unit: 'B', category: 'fund' },
|
|
||||||
{ rule: 'growthInterestExpense', label: 'Interest Expenses Growth [%]', step: [200,100,50,20,10,5,1], unit: '%', category: 'fund' },
|
|
||||||
{ rule: 'operatingExpenses', label: 'Operating Expenses', step: [200,100,50,20,10,1], unit: 'B', category: 'fund' },
|
|
||||||
{ rule: 'growthOperatingExpenses', label: 'Operating Expenses Growth [%]', step: [200,100,50,20,10,5,1], unit: '%', category: 'fund' },
|
|
||||||
{ rule: 'operatingIncome', label: 'Operating Income', step: [200,100,50,20,10,1], unit: 'B', category: 'fund' },
|
|
||||||
{ rule: 'growthOperatingIncome', label: 'Operating Income Growth [%]', step: [200,100,50,20,10,5,1], unit: '%',category: 'fund' },
|
|
||||||
{ rule: 'pe', label: 'PE Ratio', step: [50,40,30,20,10,5,1], unit: '', category: 'fund'},
|
|
||||||
{ rule: 'forwardPE', label: 'Forward PE', step: [50,20,10,5,1,0,-1,-5,-10,-20,-50], unit: '', category: 'fund'},
|
|
||||||
{ rule: 'priceToBookRatio', label: 'PB Ratio', step: [50,40,30,20,10,5,1], unit: '', category: 'fund'},
|
|
||||||
{ rule: 'priceToSalesRatio', label: 'PS Ratio', step: [50,40,30,20,10,5,1], unit: '', category: 'fund'},
|
|
||||||
{ rule: 'beta', label: 'Beta', step: [10,5,1,-5, -10], unit:'', category: 'fund'},
|
|
||||||
{ rule: 'ebitda', label: 'EBITDA', step: [200,100,50,20,10,1], unit: 'B', category: 'fund'},
|
|
||||||
{ rule: 'growthEBITDA', label: 'EBITDA Growth [%]', step: [200,100,50,20,10,5,1], unit: '%', category: 'fund'},
|
|
||||||
{ rule: 'var', label: 'Value at Risk', step: [-1,-5,-10,-15,-20], unit: '%', category: 'fund' },
|
|
||||||
{ rule: 'trendAnalysis', label: 'AI Trend Analysis (Bullish)', step: [90,80,70,60,50], unit: '%', category: 'ai' },
|
|
||||||
{ rule: 'fundamentalAnalysis', label: 'AI Fundamental Analysis (Bullish)', step: [90,80,70,60,50], unit: '%', category: 'ai' },
|
|
||||||
{ rule: 'analystRating', label: 'Analyst Rating', step: ['Buy', 'Hold', 'Sell'], unit:'', category: 'fund'},
|
|
||||||
{ rule: 'currentRatio', label: 'Current Ratio', step: [50,40,30,20,10,5,1], unit: '', category: 'fund' },
|
|
||||||
{ rule: 'quickRatio', label: 'Quick Ratio', step: [50,40,30,20,10,5,1], unit: '', category: 'fund' },
|
|
||||||
{ rule: 'debtEquityRatio', label: 'Debt / Equity', step: [50,40,30,20,10,5,1], unit: '', category: 'fund' },
|
|
||||||
{ rule: 'debtRatio', label: 'Debt Ratio', step: [50,40,30,20,10,5,1], unit: '', category: 'fund' },
|
|
||||||
{ rule: 'returnOnAssets', label: 'Return on Assets', step: [10,8,6,4,2,1,0,-2,-4,-6,-8,-10], unit: '', category: 'fund' },
|
|
||||||
{ rule: 'returnOnEquity', label: 'Return on Equity', step: [10,8,6,4,2,1,0,-2,-4,-6,-8,-10], unit: '',category: 'fund' },
|
|
||||||
{ rule: 'enterpriseValue', label: 'Enterprise Value', step: [200,100,50,20,10,1], unit: 'B', category: 'fund' },
|
|
||||||
{ rule: 'freeCashFlowPerShare', label: 'FCF / Share', step: [10,8,6,4,2,1,0], unit: '',category: 'fund' },
|
|
||||||
{ rule: 'cashPerShare', label: 'Cash / Share', step: [50,20,10,5,1,0,-1,-5,-10,-20,-50], unit: '',category: 'fund' },
|
|
||||||
{ rule: 'priceToFreeCashFlowsRatio', label: 'Price / FCF', step: [50,20,10,5,1,0,-1,-5,-10,-20,-50], unit: '',category: 'fund' },
|
|
||||||
{ rule: 'sharesShort', label: 'Short Interest', step: [50,20,10,5,1,0], unit: 'M',category: 'fund' },
|
|
||||||
{ rule: 'shortRatio', label: 'Short Ratio', step: [10,5,3,2,1,0], unit: '',category: 'fund' },
|
|
||||||
{ rule: 'shortFloatPercent', label: 'Short % Float', step: [50,30,20,10,5,1,0], unit: '%',category: 'fund' },
|
|
||||||
{ rule: 'shortOutStandingPercent', label: 'Short % Shares', step: [50,30,20,10,5,1,0], unit: '%',category: 'fund' },
|
|
||||||
{ rule: 'failToDeliver', label: 'Fail to Deliver', step: [500,200,100,50,20,10,5], unit: 'K',category: 'fund' },
|
|
||||||
{ rule: 'freeCashFlow', label: 'Free Cash Flow', step: [500,200,100,50,20,10,1,0], unit: 'M',category: 'fund' },
|
|
||||||
|
|
||||||
];
|
|
||||||
|
|
||||||
|
// Generate allRows from allRules
|
||||||
|
$: allRows = Object.entries(allRules).map(([ruleName, ruleProps]) => ({
|
||||||
|
rule: ruleName,
|
||||||
|
...ruleProps
|
||||||
|
}));
|
||||||
|
|
||||||
|
|
||||||
allRows?.sort((a, b) => a.label.localeCompare(b.label));
|
allRows?.sort((a, b) => a.label.localeCompare(b.label));
|
||||||
@ -220,80 +153,19 @@ const getStockScreenerData = async (rules) => {
|
|||||||
|
|
||||||
// Define your default values
|
// Define your default values
|
||||||
|
|
||||||
let valueRevenue = (ruleOfList?.find(item => item.name === "revenue") || { value: 'any' }).value;
|
let ruleCondition = {};
|
||||||
let valueGrowthRevenue = (ruleOfList?.find(item => item.name === "growthRevenue") || { value: 'any'}).value;
|
let valueMappings = {};
|
||||||
let valueCostOfRevenue = (ruleOfList?.find(item => item.name === "costOfRevenue") || { value:'any'}).value;
|
|
||||||
let valueGrowthCostOfRevenue = (ruleOfList?.find(item => item.name === "growthCostAndExpenses") || { value: 'any'}).value;
|
|
||||||
let valueCostAndExpenses = (ruleOfList?.find(item => item.name === "costAndExpenses") || { value: 'any'}).value;
|
|
||||||
let valueGrowthCostAndExpenses= (ruleOfList?.find(item => item.name === "growthCostAndExpenses") || { value: 'any'}).value;
|
|
||||||
let valueResearchAndDevelopmentExpenses = (ruleOfList?.find(item => item.name === "researchAndDevelopmentExpenses") || { value: 'any'}).value;
|
|
||||||
let valueGrowthResearchAndDevelopmentExpenses = (ruleOfList?.find(item => item.name === "growthResearchAndDevelopmentExpenses") || { value: 'any'}).value;
|
|
||||||
let valueInterestIncome = (ruleOfList?.find(item => item.name === "interestIncome") || { value: 'any'}).value;
|
|
||||||
|
|
||||||
let valueInterestExpenses = (ruleOfList?.find(item => item.name === "interestExpenses") || { value: 'any'}).value;
|
Object.keys(allRules).forEach(ruleName => {
|
||||||
let valueGrowthInterestExpenses = (ruleOfList?.find(item => item.name === "growthInterestExpenses") || { value: 10 }).value;
|
ruleCondition[ruleName] = allRules[ruleName].defaultCondition;
|
||||||
let valueEBITDA = (ruleOfList?.find(item => item.name === "ebitda") || { value: 'any'}).value;
|
valueMappings[ruleName] = allRules[ruleName].defaultValue;
|
||||||
let valueGrowthEBITDA = (ruleOfList?.find(item => item.name === "growthEBITDA") || { value: 'any'}).value;
|
});
|
||||||
let valueOperatingExpenses = (ruleOfList?.find(item => item.name === "operatingExpenses") || { value: 'any'}).value;
|
|
||||||
let valueGrowthOperatingExpenses = (ruleOfList?.find(item => item.name === "growthOperatingExpenses") || { value: 'any'}).value;
|
|
||||||
let valueOperatingIncome = (ruleOfList?.find(item => item.name === "operatingIncome") || { value: 'any'}).value;
|
|
||||||
let valueGrowthOperatingIncome = (ruleOfList?.find(item => item.name === "growthOperatingIncome") || { value: 'any'}).value;
|
|
||||||
let valueNetIncome = (ruleOfList?.find(item => item.name === "netIncome") || { value: 'any'}).value;
|
|
||||||
let valueGrowthNetIncome = (ruleOfList?.find(item => item.name === "growthNetIncome") || { value: 'any'}).value;
|
|
||||||
let valueGrossProfit = (ruleOfList?.find(item => item.name === "grossProfit") || { value:'any'}).value;
|
|
||||||
let valueGrowthGrossProfit = (ruleOfList?.find(item => item.name === "growthGrossProfit") || { value: 'any'}).value;
|
|
||||||
let valueDividendYield = (ruleOfList?.find(item => item.name === "dividendYield") || { value: 'any'}).value;
|
|
||||||
let valueAnnualDividend = (ruleOfList?.find(item => item.name === "annualDividend") || { value: 'any'}).value;
|
|
||||||
let valueDividendGrowth = (ruleOfList?.find(item => item.name === "dividendGrowth") || { value: 'any'}).value;
|
|
||||||
let valuePayoutRatio = (ruleOfList?.find(item => item.name === "payoutRatio") || { value: 'any'}).value;
|
|
||||||
|
|
||||||
let valueCurrentRatio = (ruleOfList?.find(item => item.name === "currentRatio") || { value: 'any'}).value;
|
|
||||||
let valueQuickRatio = (ruleOfList?.find(item => item.name === "quickRatio") || { value: 'any'}).value;
|
|
||||||
let valueDebtEquityRatio = (ruleOfList?.find(item => item.name === "debtEquityRatio") || { value: 'any'}).value;
|
|
||||||
let valueDebtRatio = (ruleOfList?.find(item => item.name === "debtRatio") || { value: 'any' }).value;
|
|
||||||
let valueReturnOnAssets = (ruleOfList?.find(item => item.name === "returnOnAssets") || { value: 'any' }).value;
|
|
||||||
let valueReturnOnEquity = (ruleOfList?.find(item => item.name === "returnOnEquity") || { value: 'any' }).value;
|
|
||||||
|
|
||||||
let valueEPS = (ruleOfList?.find(item => item.name === "eps") || { value: 'any'}).value;
|
|
||||||
let valueGrowthEPS = (ruleOfList?.find(item => item.name === "growthEPS") || { value: 'any'}).value;
|
|
||||||
let valuePE = (ruleOfList?.find(item => item.name === "pe") || { value: 'any'}).value;
|
|
||||||
let valueForwardPE = (ruleOfList?.find(item => item.name === "forwardPE") || { value: 'any'}).value;
|
|
||||||
|
|
||||||
let valuePriceToBookRatio = (ruleOfList?.find(item => item.name === "priceToBookRatio") || { value: 'any'}).value;
|
|
||||||
let valuePriceToSalesRatio = (ruleOfList?.find(item => item.name === "priceToSalesRatio") || { value: 'any'}).value;
|
|
||||||
let valueBeta = (ruleOfList?.find(item => item.name === "beta") || { value: 'any' }).value;
|
|
||||||
let valueMarketCap = (ruleOfList?.find(item => item.name === "marketCap") || { value: 'any' }).value;
|
|
||||||
let valueAnalystRating = (ruleOfList?.find(item => item.name === "analystRating") || { value: 'any'}).value;
|
|
||||||
let valueRSI = (ruleOfList?.find(item => item.name === "rsi") || { value: 'any' }).value;
|
|
||||||
let valueStochRSI = (ruleOfList?.find(item => item.name === "stochRSI") || { value: 'any'}).value;
|
|
||||||
let valueMFI = (ruleOfList?.find(item => item.name === "mfi") || { value: 'any'}).value;
|
|
||||||
let valueCCI = (ruleOfList?.find(item => item.name === "cci") || { value: 'any'}).value;
|
|
||||||
let valueATR = (ruleOfList?.find(item => item.name === "atr") || { value: 'any'}).value;
|
|
||||||
let valueSMA50 = (ruleOfList?.find(item => item.name === "sma50") || { value: 'any'}).value;
|
|
||||||
let valueSMA200 = (ruleOfList?.find(item => item.name === "sma200") || { value: 'any'}).value;
|
|
||||||
let valueEMA50 = (ruleOfList?.find(item => item.name === "ema50") || { value: 'any'}).value;
|
|
||||||
let valueEMA200 = (ruleOfList?.find(item => item.name === "ema200") || { value: 'any'}).value;
|
|
||||||
let valueChange1W = (ruleOfList?.find(item => item.name === "change1W") || { value: 'any' }).value;
|
|
||||||
let valueChange1M = (ruleOfList?.find(item => item.name === "change1M") || { value: 'any' }).value;
|
|
||||||
let valueChange3M = (ruleOfList?.find(item => item.name === "change3M") || { value: 'any' }).value;
|
|
||||||
let valueChange6M = (ruleOfList?.find(item => item.name === "change6M") || { value: 'any' }).value;
|
|
||||||
let valueChange1Y = (ruleOfList?.find(item => item.name === "change1Y") || { value: 'any' }).value;
|
|
||||||
let valueChange3Y = (ruleOfList?.find(item => item.name === "change3Y") || { value: 'any' }).value;
|
|
||||||
let valueAvgVolume = (ruleOfList?.find(item => item.name === "avgVolume") || { value: 'any'}).value;
|
|
||||||
let valueVaR = (ruleOfList?.find(item => item.name === "var") || { value: 'any'}).value;
|
|
||||||
let valueTrendAnalysis = (ruleOfList?.find(item => item.name === "trendAnalysis") || { value: 'any'}).value;
|
|
||||||
let valueFundamentalAnalysis = (ruleOfList?.find(item => item.name === "fundamentalAnalysis") || { value: 'any'}).value;
|
|
||||||
let valueEnterpriseValue = (ruleOfList?.find(item => item.name === "enterpriseValue") || { value: 'any'}).value;
|
|
||||||
let valueFCFShare = (ruleOfList?.find(item => item.name === "freeCashFlowPerShare") || { value: 'any'}).value;
|
|
||||||
let valueCashShare = (ruleOfList?.find(item => item.name === "cashPerShare") || { value: 'any'}).value;
|
|
||||||
let valuePriceFCF = (ruleOfList?.find(item => item.name === "priceToFreeCashFlowsRatio") || { value: 'any'}).value;
|
|
||||||
let valueSharesShort = (ruleOfList?.find(item => item.name === "sharesShort") || { value: 'any'}).value;
|
|
||||||
let valueShortRatio = (ruleOfList?.find(item => item.name === "shortRatio") || { value: 'any'}).value;
|
|
||||||
let valueShortFloatPercent = (ruleOfList?.find(item => item.name === "shortFloatPercent") || { value: 'any'}).value;
|
|
||||||
let valueShortOutStandingPercent = (ruleOfList?.find(item => item.name === "shortOutStandingPercent") || { value: 'any'}).value;
|
|
||||||
let valueFailToDeliver = (ruleOfList?.find(item => item.name === "failToDeliver") || { value: 'any'}).value;
|
|
||||||
let valueFreeCashFlow = (ruleOfList?.find(item => item.name === "freeCashFlow") || { value: 'any'}).value;
|
|
||||||
|
|
||||||
|
// Update ruleCondition and valueMappings based on existing rules
|
||||||
|
ruleOfList.forEach(rule => {
|
||||||
|
ruleCondition[rule.name] = rule.condition || allRules[rule.name].defaultCondition;
|
||||||
|
valueMappings[rule.name] = rule.value || allRules[rule.name].defaultValue;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
function changeRule(state: string)
|
function changeRule(state: string)
|
||||||
@ -307,154 +179,9 @@ function changeRule(state: string)
|
|||||||
//closePopup?.dispatchEvent(new MouseEvent('click'))
|
//closePopup?.dispatchEvent(new MouseEvent('click'))
|
||||||
}
|
}
|
||||||
|
|
||||||
const valueMappings = {
|
|
||||||
revenue: valueRevenue,
|
|
||||||
growthRevenue: valueGrowthRevenue,
|
|
||||||
costOfRevenue: valueCostOfRevenue,
|
|
||||||
growthCostOfRevenue: valueGrowthCostOfRevenue,
|
|
||||||
costAndExpenses: valueCostAndExpenses,
|
|
||||||
growthCostAndExpenses: valueGrowthCostAndExpenses,
|
|
||||||
netIncome: valueNetIncome,
|
|
||||||
growthNetIncome: valueGrowthNetIncome,
|
|
||||||
grossProfit: valueGrossProfit,
|
|
||||||
growthGrossProfit: valueGrowthGrossProfit,
|
|
||||||
researchAndDevelopmentExpenses: valueResearchAndDevelopmentExpenses,
|
|
||||||
growthResearchAndDevelopmentExpenses: valueGrowthResearchAndDevelopmentExpenses,
|
|
||||||
eps: valueEPS,
|
|
||||||
dividendYield: valueDividendYield,
|
|
||||||
annualDividend: valueAnnualDividend,
|
|
||||||
dividendGrowth: valueDividendGrowth,
|
|
||||||
payoutRatio: valuePayoutRatio,
|
|
||||||
growthEPS: valueGrowthEPS,
|
|
||||||
interestIncome: valueInterestIncome,
|
|
||||||
interestExpense: valueInterestExpenses,
|
|
||||||
growthInterestExpense: valueGrowthInterestExpenses,
|
|
||||||
operatingExpenses: valueOperatingExpenses,
|
|
||||||
growthOperatingExpenses: valueGrowthOperatingExpenses,
|
|
||||||
operatingIncome: valueOperatingIncome,
|
|
||||||
growthOperatingIncome: valueGrowthOperatingIncome,
|
|
||||||
pe: valuePE,
|
|
||||||
forwardPE: valueForwardPE,
|
|
||||||
priceToBookRatio: valuePriceToBookRatio,
|
|
||||||
priceToSalesRatio: valuePriceToSalesRatio,
|
|
||||||
beta: valueBeta,
|
|
||||||
ebitda: valueEBITDA,
|
|
||||||
growthEBITDA: valueGrowthEBITDA,
|
|
||||||
marketCap: valueMarketCap,
|
|
||||||
rsi: valueRSI,
|
|
||||||
stochRSI: valueStochRSI,
|
|
||||||
mfi: valueMFI,
|
|
||||||
cci: valueCCI,
|
|
||||||
atr: valueATR,
|
|
||||||
sma50: valueSMA50,
|
|
||||||
sma200: valueSMA200,
|
|
||||||
ema50: valueEMA50,
|
|
||||||
ema200: valueEMA200,
|
|
||||||
change1W: valueChange1W,
|
|
||||||
change1M: valueChange1M,
|
|
||||||
change3M: valueChange3M,
|
|
||||||
change6M: valueChange6M,
|
|
||||||
change1Y: valueChange1Y,
|
|
||||||
change3Y: valueChange3Y,
|
|
||||||
avgVolume: valueAvgVolume,
|
|
||||||
var: valueVaR,
|
|
||||||
trendAnalysis: valueTrendAnalysis,
|
|
||||||
fundamentalAnalysis: valueFundamentalAnalysis,
|
|
||||||
currentRatio: valueCurrentRatio,
|
|
||||||
quickRatio: valueQuickRatio,
|
|
||||||
debtEquityRatio: valueDebtEquityRatio,
|
|
||||||
debtRatio: valueDebtRatio,
|
|
||||||
returnOnAssets: valueReturnOnAssets,
|
|
||||||
returnOnEquity: valueReturnOnEquity,
|
|
||||||
enterpriseValue: valueEnterpriseValue,
|
|
||||||
freeCashFlowPerShare: valueFCFShare,
|
|
||||||
cashPerShare: valueCashShare,
|
|
||||||
priceToFreeCashFlowsRatio: valuePriceFCF,
|
|
||||||
sharesShort: valueSharesShort,
|
|
||||||
shortRatio: valueShortRatio,
|
|
||||||
shortFloatPercent: valueShortFloatPercent,
|
|
||||||
shortOutStandingPercent: valueShortOutStandingPercent,
|
|
||||||
analystRating: valueAnalystRating,
|
|
||||||
failToDeliver: valueFailToDeliver,
|
|
||||||
freeCashFlow: valueFreeCashFlow,
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
const conditions = {
|
|
||||||
revenue: ruleCondition.revenue,
|
|
||||||
growthRevenue: ruleCondition.growthRevenue,
|
|
||||||
costOfRevenue: ruleCondition.costOfRevenue,
|
|
||||||
growthCostOfRevenue: ruleCondition.growthCostOfRevenue,
|
|
||||||
costAndExpenses: ruleCondition.costAndExpenses,
|
|
||||||
growthCostAndExpenses: ruleCondition.growthCostAndExpenses,
|
|
||||||
netIncome: ruleCondition.netIncome,
|
|
||||||
growthNetIncome: ruleCondition.growthNetIncome,
|
|
||||||
grossProfit: ruleCondition.grossProfit,
|
|
||||||
growthGrossProfit: ruleCondition.growthGrossProfit,
|
|
||||||
researchAndDevelopmentExpenses: ruleCondition.researchAndDevelopmentExpenses,
|
|
||||||
growthResearchAndDevelopmentExpenses: ruleCondition.growthResearchAndDevelopmentExpenses,
|
|
||||||
eps: ruleCondition.eps,
|
|
||||||
growthEPS: ruleCondition.growthEPS,
|
|
||||||
interestIncome: ruleCondition.interestIncome,
|
|
||||||
interestExpense: ruleCondition.interestExpense,
|
|
||||||
growthInterestExpense: ruleCondition.growthInterestExpense,
|
|
||||||
operatingExpenses: ruleCondition.operatingExpenses,
|
|
||||||
growthOperatingExpenses: ruleCondition.growthOperatingExpenses,
|
|
||||||
operatingIncome: ruleCondition.operatingIncome,
|
|
||||||
growthOperatingIncome: ruleCondition.growthOperatingIncome,
|
|
||||||
pe: ruleCondition.pe,
|
|
||||||
forwardPE: ruleCondition.forwardPE,
|
|
||||||
priceToBookRatio: ruleCondition.priceToBookRatio,
|
|
||||||
priceToSalesRatio: ruleCondition.priceToSalesRatio,
|
|
||||||
beta: ruleCondition.beta,
|
|
||||||
ebitda: ruleCondition.ebitda,
|
|
||||||
growthEBITDA: ruleCondition.growthEBITDA,
|
|
||||||
marketCap: ruleCondition.marketCap,
|
|
||||||
rsi: ruleCondition.rsi,
|
|
||||||
stochRSI: ruleCondition.stochRSI,
|
|
||||||
mfi: ruleCondition.mfi,
|
|
||||||
cci: ruleCondition.cci,
|
|
||||||
atr: ruleCondition.atr,
|
|
||||||
sma50: ruleCondition.sma50,
|
|
||||||
sma200: ruleCondition.sma200,
|
|
||||||
ema50: ruleCondition.ema50,
|
|
||||||
ema200: ruleCondition.ema200,
|
|
||||||
change1W: ruleCondition.change1W,
|
|
||||||
change1M: ruleCondition.change1M,
|
|
||||||
change3M: ruleCondition.change3M,
|
|
||||||
change6M: ruleCondition.change6M,
|
|
||||||
change1Y: ruleCondition.change1Y,
|
|
||||||
change3Y: ruleCondition.change3Y,
|
|
||||||
avgVolume: ruleCondition.avgVolume,
|
|
||||||
var: ruleCondition.var,
|
|
||||||
trendAnalysis: ruleCondition.trendAnalysis,
|
|
||||||
fundamentalAnalysis: ruleCondition.fundamentalAnalysis,
|
|
||||||
dividendGrowth: ruleCondition.dividendGrowth,
|
|
||||||
dividendYield: ruleCondition.dividendYield,
|
|
||||||
payoutRatio: ruleCondition.payoutRatio,
|
|
||||||
annualDividend: ruleCondition.annualDividend,
|
|
||||||
currentRatio: ruleCondition.currentRatio,
|
|
||||||
quickRatio: ruleCondition.quickRatio,
|
|
||||||
debtEquityRatio: ruleCondition.debtEquityRatio,
|
|
||||||
debtRatio: ruleCondition.debtRatio,
|
|
||||||
returnOnAssets: ruleCondition.returnOnAssets,
|
|
||||||
returnOnEquity: ruleCondition.returnOnEquity,
|
|
||||||
enterpriseValue: ruleCondition.enterpriseValue,
|
|
||||||
freeCashFlowPerShare: ruleCondition.freeCashFlowPerShare,
|
|
||||||
cashPerShare: ruleCondition.cashPerShare,
|
|
||||||
priceToFreeCashFlowsRatio: ruleCondition.priceToFreeCashFlowsRatio,
|
|
||||||
sharesShort: ruleCondition.sharesShort,
|
|
||||||
shortRatio: ruleCondition.shortRatio,
|
|
||||||
shortFloatPercent: ruleCondition.shortFloatPercent,
|
|
||||||
shortOutStandingPercent: ruleCondition.shortOutStandingPercent,
|
|
||||||
failToDeliver: ruleCondition.failToDeliver,
|
|
||||||
freeCashFlow: ruleCondition.freeCashFlow,
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
function handleAddRule() {
|
function handleAddRule() {
|
||||||
|
|
||||||
if (ruleName === '') {
|
if (ruleName === '') {
|
||||||
toast.error('Please select a rule', {
|
toast.error('Please select a rule', {
|
||||||
style: 'border-radius: 200px; background: #333; color: #fff;'
|
style: 'border-radius: 200px; background: #333; color: #fff;'
|
||||||
@ -462,24 +189,17 @@ function handleAddRule() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let newRule;
|
const newRule = {
|
||||||
|
name: ruleName,
|
||||||
|
condition: ruleCondition[ruleName],
|
||||||
|
value: valueMappings[ruleName]
|
||||||
|
};
|
||||||
|
|
||||||
switch (ruleName) {
|
|
||||||
case 'analystRating':
|
|
||||||
newRule = { name: ruleName, value: valueAnalystRating }; //ruleTrend[ruleName]
|
|
||||||
handleRule(newRule);
|
handleRule(newRule);
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// Handle other cases if needed
|
|
||||||
newRule = { name: ruleName, condition: conditions[ruleName], value: valueMappings[ruleName] };
|
|
||||||
handleRule(newRule);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
async function handleRule(newRule) {
|
async function handleRule(newRule) {
|
||||||
const existingRuleIndex = ruleOfList.findIndex(rule => rule.name === ruleName);
|
const existingRuleIndex = ruleOfList.findIndex(rule => rule.name === newRule.name);
|
||||||
if (existingRuleIndex !== -1) {
|
if (existingRuleIndex !== -1) {
|
||||||
const existingRule = ruleOfList[existingRuleIndex];
|
const existingRule = ruleOfList[existingRuleIndex];
|
||||||
if (existingRule.value === newRule.value && existingRule.condition === newRule.condition) {
|
if (existingRule.value === newRule.value && existingRule.condition === newRule.condition) {
|
||||||
@ -499,15 +219,11 @@ async function handleRule(newRule) {
|
|||||||
toast.success('Rule added', {
|
toast.success('Rule added', {
|
||||||
style: 'border-radius: 200px; background: #333; color: #fff;'
|
style: 'border-radius: 200px; background: #333; color: #fff;'
|
||||||
});
|
});
|
||||||
|
|
||||||
await updateStockScreenerData();
|
await updateStockScreenerData();
|
||||||
await handleSave(false);
|
await handleSave(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
async function updateStockScreenerData() {
|
async function updateStockScreenerData() {
|
||||||
try {
|
try {
|
||||||
const newData = await getStockScreenerData(ruleOfList);
|
const newData = await getStockScreenerData(ruleOfList);
|
||||||
@ -638,95 +354,20 @@ $: {
|
|||||||
if (ruleOfList) {
|
if (ruleOfList) {
|
||||||
const ruleToUpdate = ruleOfList?.find(rule => rule.name === ruleName);
|
const ruleToUpdate = ruleOfList?.find(rule => rule.name === ruleName);
|
||||||
if (ruleToUpdate) {
|
if (ruleToUpdate) {
|
||||||
const valueMap = {
|
ruleToUpdate.value = valueMappings[ruleToUpdate.name];
|
||||||
payoutRatio: valuePayoutRatio,
|
|
||||||
dividendGrowth: valueDividendGrowth,
|
|
||||||
dividendYield: valueDividendYield,
|
|
||||||
annualDividend: valueAnnualDividend,
|
|
||||||
eps: valueEPS,
|
|
||||||
growthEPS: valueGrowthEPS,
|
|
||||||
marketCap: valueMarketCap,
|
|
||||||
beta: valueBeta,
|
|
||||||
pe: valuePE,
|
|
||||||
forwardPE: valueForwardPE,
|
|
||||||
priceToBookRatio: valuePriceToBookRatio,
|
|
||||||
priceToSalesRatio: valuePriceToSalesRatio,
|
|
||||||
interestIncome: valueInterestIncome,
|
|
||||||
analystRating: valueAnalystRating,
|
|
||||||
revenue: valueRevenue,
|
|
||||||
growthRevenue: valueGrowthRevenue,
|
|
||||||
ebitda: valueEBITDA,
|
|
||||||
growthEBITDA: valueGrowthEBITDA,
|
|
||||||
operatingExpenses: valueOperatingExpenses,
|
|
||||||
growthOperatingExpenses: valueGrowthOperatingExpenses,
|
|
||||||
costOfRevenue: valueCostOfRevenue,
|
|
||||||
growthCostOfRevenue: valueGrowthCostOfRevenue,
|
|
||||||
costAndExpenses: valueCostAndExpenses,
|
|
||||||
growthCostAndExpenses: valueGrowthCostAndExpenses,
|
|
||||||
netIncome: valueNetIncome,
|
|
||||||
growthNetIncome: valueGrowthNetIncome,
|
|
||||||
grossProfit: valueGrossProfit,
|
|
||||||
growthGrossProfit: valueGrowthGrossProfit,
|
|
||||||
researchAndDevelopmentExpenses: valueResearchAndDevelopmentExpenses,
|
|
||||||
growthResearchAndDevelopmentExpenses: valueGrowthResearchAndDevelopmentExpenses,
|
|
||||||
interestExpense: valueInterestExpenses,
|
|
||||||
growthInterestExpense: valueGrowthInterestExpenses,
|
|
||||||
operatingIncome: valueOperatingIncome,
|
|
||||||
growthOperatingIncome: valueGrowthOperatingIncome,
|
|
||||||
rsi: valueRSI,
|
|
||||||
stochRSI: valueStochRSI,
|
|
||||||
mfi: valueMFI,
|
|
||||||
cci: valueCCI,
|
|
||||||
atr: valueATR,
|
|
||||||
sma50: valueSMA50,
|
|
||||||
sma200: valueSMA200,
|
|
||||||
ema50: valueEMA50,
|
|
||||||
ema200: valueEMA200,
|
|
||||||
change1W: valueChange1W,
|
|
||||||
change1M: valueChange1M,
|
|
||||||
change3M: valueChange3M,
|
|
||||||
change6M: valueChange6M,
|
|
||||||
change1Y: valueChange1Y,
|
|
||||||
change3Y: valueChange3Y,
|
|
||||||
avgVolume: valueAvgVolume,
|
|
||||||
var: valueVaR,
|
|
||||||
trendAnalysis: valueTrendAnalysis,
|
|
||||||
fundamentalAnalysis: valueFundamentalAnalysis,
|
|
||||||
currentRatio: valueCurrentRatio,
|
|
||||||
quickRatio: valueQuickRatio,
|
|
||||||
debtEquityRatio: valueDebtEquityRatio,
|
|
||||||
debtRatio: valueDebtRatio,
|
|
||||||
returnOnAssets: valueReturnOnAssets,
|
|
||||||
returnOnEquity: valueReturnOnEquity,
|
|
||||||
enterpriseValue: valueEnterpriseValue,
|
|
||||||
freeCashFlowPerShare: valueFCFShare,
|
|
||||||
cashPerShare: valueCashShare,
|
|
||||||
priceToFreeCashFlowsRatio: valuePriceFCF,
|
|
||||||
sharesShort: valueSharesShort,
|
|
||||||
shortRatio: valueShortRatio,
|
|
||||||
shortFloatPercent: valueShortFloatPercent,
|
|
||||||
shortOutStandingPercent: valueShortOutStandingPercent,
|
|
||||||
failToDeliver: valueFailToDeliver,
|
|
||||||
freeCashFlow: valueFreeCashFlow,
|
|
||||||
|
|
||||||
};
|
|
||||||
ruleToUpdate.value = valueMap[ruleToUpdate.name] ?? ruleToUpdate.value;
|
|
||||||
ruleToUpdate.condition = ruleCondition[ruleToUpdate.name];
|
ruleToUpdate.condition = ruleCondition[ruleToUpdate.name];
|
||||||
ruleOfList = [...ruleOfList];
|
ruleOfList = [...ruleOfList];
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('yes here')
|
|
||||||
displayRules = allRows?.filter(row => ruleOfList.some(rule => rule.name === row.rule));
|
displayRules = allRows?.filter(row => ruleOfList.some(rule => rule.name === row.rule));
|
||||||
filteredData = filterStockScreenerData();
|
filteredData = filterStockScreenerData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (ruleOfList?.some(item => item?.name === 'analystRating')) {
|
|
||||||
filteredData = filteredData?.filter(item => item?.analystRating === valueAnalystRating);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function filterStockScreenerData() {
|
function filterStockScreenerData() {
|
||||||
|
console.log(ruleOfList)
|
||||||
return stockScreenerData?.filter(item => {
|
return stockScreenerData?.filter(item => {
|
||||||
for (const rule of ruleOfList) {
|
for (const rule of ruleOfList) {
|
||||||
|
|
||||||
@ -861,221 +502,17 @@ $: isSaved = !ruleOfList;
|
|||||||
|
|
||||||
$: charNumber = $screenWidth < 640 ? 20 : 40;
|
$: charNumber = $screenWidth < 640 ? 20 : 40;
|
||||||
|
|
||||||
|
|
||||||
function changeRuleCondition(name: string, state: string) {
|
function changeRuleCondition(name: string, state: string) {
|
||||||
ruleName = name;
|
ruleName = name;
|
||||||
ruleCondition[ruleName] = state;
|
ruleCondition[ruleName] = state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function handleChangeValue(value) {
|
function handleChangeValue(value) {
|
||||||
const rule = ruleName
|
if (ruleName in valueMappings) {
|
||||||
|
valueMappings[ruleName] = value;
|
||||||
if (rule in valueMappings) {
|
|
||||||
valueMappings[rule] = value;
|
|
||||||
// If you need to keep the separate variables in sync:
|
|
||||||
switch (rule) {
|
|
||||||
case 'payoutRatio':
|
|
||||||
valuePayoutRatio = value;
|
|
||||||
break;
|
|
||||||
case 'dividendGrowth':
|
|
||||||
valueDividendGrowth = value;
|
|
||||||
break;
|
|
||||||
case 'dividendYield':
|
|
||||||
valueDividendYield = value;
|
|
||||||
break;
|
|
||||||
case 'annualDividend':
|
|
||||||
valueAnnualDividend = value;
|
|
||||||
break;
|
|
||||||
case 'eps':
|
|
||||||
valueEPS = value;
|
|
||||||
break;
|
|
||||||
case 'growthEPS':
|
|
||||||
valueGrowthEPS = value;
|
|
||||||
break;
|
|
||||||
case 'marketCap':
|
|
||||||
valueMarketCap = value;
|
|
||||||
break;
|
|
||||||
case 'beta':
|
|
||||||
valueBeta = value;
|
|
||||||
break;
|
|
||||||
case 'pe':
|
|
||||||
valuePE = value;
|
|
||||||
break;
|
|
||||||
case 'forwardPE':
|
|
||||||
valueForwardPE = value;
|
|
||||||
break;
|
|
||||||
case 'priceToBookRatio':
|
|
||||||
valuePriceToBookRatio = value;
|
|
||||||
break;
|
|
||||||
case 'priceToSalesRatio':
|
|
||||||
valuePriceToSalesRatio = value;
|
|
||||||
break;
|
|
||||||
case 'interestIncome':
|
|
||||||
valueInterestIncome = value;
|
|
||||||
break;
|
|
||||||
case 'analystRating':
|
|
||||||
valueAnalystRating = value;
|
|
||||||
break;
|
|
||||||
case 'revenue':
|
|
||||||
valueRevenue = value;
|
|
||||||
break;
|
|
||||||
case 'growthRevenue':
|
|
||||||
valueGrowthRevenue = value;
|
|
||||||
break;
|
|
||||||
case 'ebitda':
|
|
||||||
valueEBITDA = value;
|
|
||||||
break;
|
|
||||||
case 'growthEBITDA':
|
|
||||||
valueGrowthEBITDA = value;
|
|
||||||
break;
|
|
||||||
case 'operatingExpenses':
|
|
||||||
valueOperatingExpenses = value;
|
|
||||||
break;
|
|
||||||
case 'growthOperatingExpenses':
|
|
||||||
valueGrowthOperatingExpenses = value;
|
|
||||||
break;
|
|
||||||
case 'costOfRevenue':
|
|
||||||
valueCostOfRevenue = value;
|
|
||||||
break;
|
|
||||||
case 'growthCostOfRevenue':
|
|
||||||
valueGrowthCostOfRevenue = value;
|
|
||||||
break;
|
|
||||||
case 'costAndExpenses':
|
|
||||||
valueCostAndExpenses = value;
|
|
||||||
break;
|
|
||||||
case 'growthCostAndExpenses':
|
|
||||||
valueGrowthCostAndExpenses = value;
|
|
||||||
break;
|
|
||||||
case 'netIncome':
|
|
||||||
valueNetIncome = value;
|
|
||||||
break;
|
|
||||||
case 'growthNetIncome':
|
|
||||||
valueGrowthNetIncome = value;
|
|
||||||
break;
|
|
||||||
case 'grossProfit':
|
|
||||||
valueGrossProfit = value;
|
|
||||||
break;
|
|
||||||
case 'growthGrossProfit':
|
|
||||||
valueGrowthGrossProfit = value;
|
|
||||||
break;
|
|
||||||
case 'researchAndDevelopmentExpenses':
|
|
||||||
valueResearchAndDevelopmentExpenses = value;
|
|
||||||
break;
|
|
||||||
case 'growthResearchAndDevelopmentExpenses':
|
|
||||||
valueGrowthResearchAndDevelopmentExpenses = value;
|
|
||||||
break;
|
|
||||||
case 'interestExpense':
|
|
||||||
valueInterestExpenses = value;
|
|
||||||
break;
|
|
||||||
case 'growthInterestExpense':
|
|
||||||
valueGrowthInterestExpenses = value;
|
|
||||||
break;
|
|
||||||
case 'operatingIncome':
|
|
||||||
valueOperatingIncome = value;
|
|
||||||
break;
|
|
||||||
case 'growthOperatingIncome':
|
|
||||||
valueGrowthOperatingIncome = value;
|
|
||||||
break;
|
|
||||||
case 'rsi':
|
|
||||||
valueRSI = value;
|
|
||||||
break;
|
|
||||||
case 'stochRSI':
|
|
||||||
valueStochRSI = value;
|
|
||||||
break;
|
|
||||||
case 'mfi':
|
|
||||||
valueMFI = value;
|
|
||||||
break;
|
|
||||||
case 'cci':
|
|
||||||
valueCCI = value;
|
|
||||||
break;
|
|
||||||
case 'atr':
|
|
||||||
valueATR = value;
|
|
||||||
break;
|
|
||||||
case 'sma50':
|
|
||||||
valueSMA50 = value;
|
|
||||||
break;
|
|
||||||
case 'sma200':
|
|
||||||
valueSMA200 = value;
|
|
||||||
break;
|
|
||||||
case 'ema50':
|
|
||||||
valueEMA50 = value;
|
|
||||||
break;
|
|
||||||
case 'ema200':
|
|
||||||
valueEMA200 = value;
|
|
||||||
break;
|
|
||||||
case 'change1W':
|
|
||||||
valueChange1W = value;
|
|
||||||
break;
|
|
||||||
case 'change1M':
|
|
||||||
valueChange1M = value;
|
|
||||||
break;
|
|
||||||
case 'change3M':
|
|
||||||
valueChange3M = value;
|
|
||||||
break;
|
|
||||||
case 'change6M':
|
|
||||||
valueChange6M = value;
|
|
||||||
break;
|
|
||||||
case 'change1Y':
|
|
||||||
valueChange1Y = value;
|
|
||||||
break;
|
|
||||||
case 'change3Y':
|
|
||||||
valueChange3Y = value;
|
|
||||||
case 'avgVolume':
|
|
||||||
valueAvgVolume = value;
|
|
||||||
break;
|
|
||||||
case 'var':
|
|
||||||
valueVaR = value;
|
|
||||||
break;
|
|
||||||
case 'trendAnalysis':
|
|
||||||
valueTrendAnalysis = value;
|
|
||||||
break;
|
|
||||||
case 'fundamentalAnalysis':
|
|
||||||
valueFundamentalAnalysis = value;
|
|
||||||
break;
|
|
||||||
case 'currentRatio':
|
|
||||||
valueCurrentRatio = value;
|
|
||||||
break;
|
|
||||||
case 'quickRatio':
|
|
||||||
valueQuickRatio = value;
|
|
||||||
break;
|
|
||||||
case 'debtEquityRatio':
|
|
||||||
valueDebtEquityRatio = value;
|
|
||||||
break;
|
|
||||||
case 'debtRatio':
|
|
||||||
valueDebtRatio = value;
|
|
||||||
break;
|
|
||||||
case 'returnOnAssets':
|
|
||||||
valueReturnOnAssets = value;
|
|
||||||
break;
|
|
||||||
case 'returnOnEquity':
|
|
||||||
valueReturnOnEquity = value;
|
|
||||||
break;
|
|
||||||
case 'freeCashFlowPerShare':
|
|
||||||
valueFCFShare = value;
|
|
||||||
break;
|
|
||||||
case 'cashPerShare':
|
|
||||||
valueCashShare = value;
|
|
||||||
break;
|
|
||||||
case 'priceToFreeCashFlowsRatio':
|
|
||||||
valuePriceFCF = value;
|
|
||||||
case 'enterpriseValue':
|
|
||||||
valueEnterpriseValue = value;
|
|
||||||
case 'sharesShort':
|
|
||||||
valueSharesShort = value;
|
|
||||||
case 'shortRatio':
|
|
||||||
valueShortRatio = value;
|
|
||||||
case 'shortFloatPercent':
|
|
||||||
valueShortFloatPercent = value;
|
|
||||||
case 'shortOutStandingPercent':
|
|
||||||
valueShortOutStandingPercent = value;
|
|
||||||
case 'failToDeliver':
|
|
||||||
valueFailToDeliver = value;
|
|
||||||
case 'freeCashFlow':
|
|
||||||
valueFreeCashFlow = value;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
console.warn(`Unhandled rule: ${rule}`);
|
console.warn(`Unhandled rule: ${ruleName}`);
|
||||||
// Optionally handle unknown rules here
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user