├── .eslintignore ├── .eslintrc.cjs ├── .gitignore ├── .prettierrc ├── README.md ├── demo ├── en-US.json ├── index.html ├── pt-BR.json └── styles.css ├── dist └── editor.bundle.js ├── package-lock.json ├── package.json ├── rollup.config.js ├── src ├── autocompletion.ts ├── editor.ts ├── idiom-decimal-separator.ts ├── indent-completion-tab.ts └── prettier.ts └── tsconfig.json /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | browser: true, 5 | node: true 6 | }, 7 | parserOptions: { 8 | ecmaVersion: 2020, 9 | parser: '@typescript-eslint/parser' 10 | }, 11 | plugins: [ 12 | '@typescript-eslint', 13 | 'prettier' 14 | ], 15 | extends: [ 16 | 'eslint:recommended', 17 | 'plugin:@typescript-eslint/recommended', 18 | 'prettier' 19 | ], 20 | rules: { 21 | "no-console": 1, 22 | "prettier/prettier": 2 23 | } 24 | }; 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": true, 3 | "trailingComma": "none", 4 | "singleQuote": true, 5 | "printWidth": 80, 6 | "tabWidth": 2, 7 | "useTabs": false 8 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CodeMirror Spreadsheet app 2 | 3 | This repository is a demo implementation of the CodeMirror [spreadsheet language package](https://github.com/luizzappa/codemirror-lang-spreadsheet). 4 | 5 | ![excel formula](https://user-images.githubusercontent.com/65685842/229017866-3a2e16d7-84a5-4390-9659-e7084c69f3a7.gif) 6 | 7 | 👉 [Live demo](https://luizzappa.github.io/codemirror-app-spreadsheet/) 8 | 9 | ## Features 10 | 11 | 🔤 Syntax highlighting 12 | 13 | 🌎 Autocomplete with internationalization 14 | 15 | ✨ Prettier 16 | 17 | ## Usage 18 | 19 | Clone repository and install dependencies. Then run: 20 | 21 | ``` 22 | npm run start 23 | ``` 24 | 25 | ## List of functions 26 | 27 | The list of functions is stored as json for each idiom. They're fecthed asnychronously after an idiom change. The list **may not be complete with all functions**, the purpose here is just to illustrate how to implement autocomplete with internationalization. 28 | -------------------------------------------------------------------------------- /demo/en-US.json: -------------------------------------------------------------------------------- 1 | ["ABS","ACCRINT","ACCRINTM","ACOS","ACOSH","ACOT","ACOTH","AGGREGATE","ADDRESS","AMORDEGRC","AMORLINC","AND","ARABIC","AREAS","ARRAYTOTEXT","ASC","ASIN","ASINH","ATAN","ATAN2","ATANH","AVEDEV","AVERAGE","AVERAGEA","AVERAGEIF","AVERAGEIFS","BAHTTEXT","BASE","BESSELI","BESSELJ","BESSELK","BESSELY","BETADIST","BETA.DIST","BETAINV","BETA.INV","BIN2DEC","BIN2HEX","BIN2OCT","BINOMDIST","BINOM.DIST","BINOM.DIST.RANGE","BINOM.INV","BITAND","BITLSHIFT","BITOR","BITRSHIFT","BITXOR","BYCOL","BYROW","CALL","CEILING","CEILING.MATH","CEILING.PRECISE","CELL","CHAR","CHIDIST","CHIINV","CHITEST","CHISQ.DIST","CHISQ.DIST.RT","CHISQ.INV","CHISQ.INV.RT","CHISQ.TEST","CHOOSE","CHOOSECOLS","CHOOSEROWS","CLEAN","CODE","COLUMN","COLUMNS","COMBIN","COMBINA","COMPLEX","CONCAT","CONCATENATE","CONFIDENCE","CONFIDENCE.NORM","CONFIDENCE.T","CONVERT","CORREL","COS","COSH","COT","COTH","COUNT","COUNTA","COUNTBLANK","COUNTIF","COUNTIFS","COUPDAYBS","COUPDAYS","COUPDAYSNC","COUPNCD","COUPNUM","COUPPCD","COVAR","COVARIANCE.P","COVARIANCE.S","CRITBINOM","CSC","CSCH","CUBEKPIMEMBER","CUBEMEMBER","CUBEMEMBERPROPERTY","CUBERANKEDMEMBER","CUBESET","CUBESETCOUNT","CUBEVALUE","CUMIPMT","CUMPRINC","DATE","DATEDIF","DATEVALUE","DAVERAGE","DAY","DAYS","DAYS360","DB","DBCS","DCOUNT","DCOUNTA","DDB","DEC2BIN","DEC2HEX","DEC2OCT","DECIMAL","DEGREES","DELTA","DEVSQ","DGET","DISC","DMAX","DMIN","DOLLAR","DOLLARDE","DOLLARFR","DPRODUCT","DROP","DSTDEV","DSTDEVP","DSUM","DURATION","DVAR","DVARP","EDATE","EFFECT","ENCODEURL","EOMONTH","ERF","ERF.PRECISE","ERFC","ERFC.PRECISE","ERROR.TYPE","EUROCONVERT","EVEN","EXACT","EXP","EXPAND","EXPON.DIST","EXPONDIST","FACT","FACTDOUBLE","FALSE","F.DIST","FDIST","F.DIST.RT","FILTER","FILTERXML","FIND","F.INV","F.INV.RT","FINV","FISHER","FISHERINV","FIXED","FLOOR","FLOOR.MATH","FLOOR.PRECISE","FORECAST","Forecastings","FORMULATEXT","FREQUENCY","F.TEST","FTEST","FV","FVSCHEDULE","GAMMA","GAMMA.DIST","GAMMADIST","GAMMA.INV","GAMMAINV","GAMMALN","GAMMALN.PRECISE","GAUSS","GCD","GEOMEAN","GESTEP","GETPIVOTDATA","GROWTH","HARMEAN","HEX2BIN","HEX2DEC","HEX2OCT","HLOOKUP","HOUR","HSTACK","HYPERLINK","HYPGEOM.DIST","HYPGEOMDIST","IF","IFERROR","IFNA","IFS","IMABS","IMAGINARY","IMARGUMENT","IMCONJUGATE","IMCOS","IMCOSH","IMCOT","IMCSC","IMCSCH","IMDIV","IMEXP","IMLN","IMLOG10","IMLOG2","IMPOWER","IMPRODUCT","IMREAL","IMSEC","IMSECH","IMSIN","IMSINH","IMSQRT","IMSUB","IMSUM","IMTAN","INDEX","INDIRECT","INFO","INT","INTERCEPT","INTRATE","IPMT","IRR","ISBLANK","ISERR","ISERROR","ISEVEN","ISFORMULA","ISLOGICAL","ISNA","ISNONTEXT","ISNUMBER","ISODD","ISOMITTED","ISREF","ISTEXT","ISO.CEILING","ISOWEEKNUM","ISPMT","JIS","KURT","LAMBDA","LARGE","LCM","LEFT","LEN","LET","LINEST","LN","LOG","LOG10","LOGEST","LOGINV","LOGNORM.DIST","LOGNORMDIST","LOGNORM.INV","LOOKUP","LOWER","MAKEARRAY","MAP","MATCH","MAX","MAXA","MAXIFS","MDETERM","MDURATION","MEDIAN","MID","MIN","MINIFS","MINA","MINUTE","MINVERSE","MIRR","MMULT","MOD","MODE","MODE.MULT","MODE.SNGL","MONTH","MROUND","MULTINOMIAL","MUNIT","N","NA","NEGBINOM.DIST","NEGBINOMDIST","NETWORKDAYS","NETWORKDAYS.INTL","NOMINAL","NORM.DIST","NORMDIST","NORMINV","NORM.INV","NORM.S.DIST","NORMSDIST","NORM.S.INV","NORMSINV","NOT","NOW","NPER","NPV","NUMBERVALUE","OCT2BIN","OCT2DEC","OCT2HEX","ODD","ODDFPRICE","ODDFYIELD","ODDLPRICE","ODDLYIELD","OFFSET","OR","PDURATION","PEARSON","PERCENTILE.EXC","PERCENTILE.INC","PERCENTILE","PERCENTRANK.EXC","PERCENTRANK.INC","PERCENTRANK","PERMUT","PERMUTATIONA","PHI","PHONETIC","PI","PMT","POISSON.DIST","POISSON","POWER","PPMT","PRICE","PRICEDISC","PRICEMAT","PROB","PRODUCT","PROPER","PV","QUARTILE","QUARTILE.EXC","QUARTILE.INC","QUOTIENT","RADIANS","RAND","RANDARRAY","RANDBETWEEN","RANK.AVG","RANK.EQ","RANK","RATE","RECEIVED","REDUCE","REGISTER.ID","REPLACE","REPT","RIGHT","ROMAN","ROUND","ROUNDDOWN","ROUNDUP","ROW","ROWS","RRI","RSQ","RTD","SCAN","SEARCH","SEC","SECH","SECOND","SEQUENCE","SERIESSUM","SHEET","SHEETS","SIGN","SIN","SINH","SKEW","SKEW.P","SLN","SLOPE","SMALL","SORT","SORTBY","SQRT","SQRTPI","STANDARDIZE","STOCKHISTORY","STDEV","STDEV.P","STDEV.S","STDEVA","STDEVP","STDEVPA","STEYX","SUBSTITUTE","SUBTOTAL","SUM","SUMIF","SUMIFS","SUMPRODUCT","SUMSQ","SUMX2MY2","SUMX2PY2","SUMXMY2","SWITCH","SYD","T","TAN","TANH","TAKE","TBILLEQ","TBILLPRICE","TBILLYIELD","T.DIST","T.DIST.2T","T.DIST.RT","TDIST","TEXT","TEXTAFTER","TEXTBEFORE","TEXTJOIN","TEXTSPLIT","TIME","TIMEVALUE","T.INV","T.INV.2T","TINV","TOCOL","TOROW","TODAY","TRANSPOSE","TREND","TRIM","TRIMMEAN","TRUE","TRUNC","T.TEST","TTEST","TYPE","UNICHAR","UNICODE","UNIQUE","UPPER","VALUE","VALUETOTEXT","VAR","VAR.P","VAR.S","VARA","VARP","VARPA","VDB","VLOOKUP","VSTACK","WEBSERVICE","WEEKDAY","WEEKNUM","WEIBULL","WEIBULL.DIST","WORKDAY","WORKDAY.INTL","WRAPCOLS","WRAPROWS","XIRR","XLOOKUP","XMATCH","XNPV","XOR","YEAR","YEARFRAC","YIELD","YIELDDISC","YIELDMAT","Z.TEST","ZTEST"] -------------------------------------------------------------------------------- /demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Excel formula editor - CodeMirror6 8 | 9 | 10 | 11 |
12 |

Excel formula editor

13 |
14 |
15 | 42 |
43 | 44 |
45 |
46 |
47 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /demo/pt-BR.json: -------------------------------------------------------------------------------- 1 | ["ABS","ACOS","ACOSH","ACOT ","ACOTH ","AGORA","AGREGAR","ALEATÓRIO","ALEATÓRIOENTRE","AMORDEGRC","AMORLINC","ANO","ARÁBICO ","ÁREAS","ARRED","ARREDMULTB","ARREDMULTB.MAT ","ARREDMULTB.PRECISO","ARREDONDAR.PARA.BAIXO","ARREDONDAR.PARA.CIMA","ARRUMAR","ASC","ASEN","ASENH","ATAN","ATAN2","ATANH","BAHTTEXT","BASE","BD","BDCONTAR","BDCONTARA","BDDESVPA","BDEST","BDEXTRAIR","BDMÁX","BDMÉDIA","BDMÍN","BDMULTIPL","BDSOMA","BDV","BDVAREST","BDVARP","BESSELI","BESSELJ","BESSELK","BESSELY","BETA.ACUM.INV","BINADEC","BINAHEX","BINAOCT","BITAND ","BITOR ","BITXOR ","CARACT","CARACTUNICODE ","CÉL","CHAMAR","CODIFURL ","CÓDIGO","COL","COLS","COMBIN","COMBINA ","COMPLEXO","CONCAT ","CONCATENAR","CONJUNTOCUBO","CONT.NÚM","CONT.SE","CONT.SES","CONT.VALORES","CONTAGEMCONJUNTOCUBO","CONTAR.VAZIO","CONVERTER","CONVERTEREURO","CORREL","CORRESP","COS","COSEC ","COSECH ","COSH","COT ","COTH ","COVAR","COVARIAÇÃO.P ","COVARIAÇÃO.S ","CRESCIMENTO","CRIT.BINOM","CUPDATAANT","CUPDATAPRÓX","CUPDIAS","CUPDIASINLIQ","CUPDIASPRÓX","CUPNÚM","CURT","DATA","DATA.VALOR","DATADIF","DATAM","DBCS ","DECABIN","DECAHEX","DECAOCT","DECIMAL ","DEGRAU","DELTA","DESC","DESLOC","DESLOCDIRBIT ","DESLOCESQBIT ","DESV.MÉDIO","DESVPAD","DESVPAD.A ","DESVPAD.P ","DESVPADA","DESVPADP","DESVPADPA","DESVQ","DIA","DIA.DA.SEMANA","DIAS ","DIAS360","DIATRABALHO","DIATRABALHO.INTL ","DIATRABALHOTOTAL","DIATRABALHOTOTAL.INTL ","DIREITA","DIST.BETA ","DIST.BIN.NEG","DIST.BIN.NEG.N ","DIST.F ","DIST.F.CD ","DIST.GAMA ","DIST.HIPERGEOM","DIST.HIPERGEOM.N","DIST.LOGNORMAL.N ","DIST.NORM","DIST.NORM.N ","DIST.NORMP","DIST.NORMP.N ","DIST.POISSON ","DIST.QUI","DIST.QUIQUA ","DIST.QUIQUA.CD ","DIST.T ","DIST.T.BC ","DIST.T.CD ","DIST.WEIBULL ","DISTBETA","DISTEXPON","DISTF","DISTGAMA","DISTLOGNORMAL","DISTORÇÃO","DISTORÇÃO.P ","DISTR.BINOM ","DISTR.EXPON ","DISTRBINOM","DISTT","DPD","DURAÇÃO","DURAÇÃOP ","E","É.NÃO.DISP","É.NÃO.TEXTO","ÉCÉL.VAZIA","ÉERRO","ÉERROS","EFETIVA","ÉFÓRMULA ","ÉIMPAR","ÉLÓGICO","ENDEREÇO","ÉNÚM","EPADYX,","ÉPAR","ÉPGTO","ÉREF","ESCOLHER","ESQUERDA","ÉTEXTO","EXATO","EXP","EXT.TEXTO","FATDUPLO","FATORIAL","FILTROXML ","FIMMÊS","FISHER","FISHERINV","FIXO","FONÉTICA","FÓRMULATEXTO ","FRAÇÃOANO","FREQUÊNCIA","função","FUNERRO","FUNERRO.PRECISO ","FUNERROCOMPL","FUNERROCOMPL.PRECISO ","GAMA ","GAUSS ","GRAUS","HEXABIN","HEXADEC","HEXAOCT","HIPERLINK","HOJE","HORA","IDENT.REGISTRO","IFS ","IMABS","IMAGINÁRIO","IMARG","IMCONJ","IMCOS","IMCOSEC ","IMCOSECH ","IMCOSH ","IMCOT ","IMDIV","IMEXP","IMLN","IMLOG10","IMLOG2","ÍMPAR","IMPOT","IMPROD","IMRAIZ","IMREAL","IMSEC ","IMSECH ","IMSENH ","IMSENO","IMSOMA","IMSUBTR","IMTAN ","INCLINAÇÃO","ÍNDICE","INDIRETO","INFODADOSTABELADINÂMICA","INFORMAÇÃO","INT","INT.CONFIANÇA","INT.CONFIANÇA.NORM ","INT.CONFIANÇA.T ","INTERCEPÇÃO","INTERV.DISTR.BINOM ","INV.BETA ","INV.BINOM ","INV.F ","INV.F.CD ","INV.GAMA ","INV.LOGNORMAL ","INV.NORM","INV.NORM.N ","INV.NORMP","INV.NORMP.N ","INV.QUI","INV.QUIQUA ","INV.QUIQUA.CD ","INV.T ","INV.T.BC ","INVF","INVGAMA","INVLOG","INVT","IPGTO","ISO.TETO ","JIS","JUROSACUM","JUROSACUMV","LIN","LINS","LN","LNGAMA","LNGAMA.PRECISO ","LOCALIZAR","LOG","LOG10","LUCRO","LUCRODESC","LUCROPRIMINC","LUCROÚLTINC","LUCROVENC","MAIOR","MAIÚSCULA","MARRED","MATRIZ.DETERM","MATRIZ.INVERSO","MATRIZ.MULT","MAXIFS ","MÁXIMO","MÁXIMOA","MDC","MDURAÇÃO","MED","MÉDIA","MÉDIA.GEOMÉTRICA","MÉDIA.HARMÔNICA","MÉDIA.INTERNA","MÉDIAA","MÉDIASE","MÉDIASES","MEMBROCLASSIFICADOCUBO","MEMBROCUBO","MEMBROKPICUBO","MENOR","MÊS","MINIFS ","MÍNIMO","MÍNIMOA","MINÚSCULA","MINUTO","MMC","MOD","MODO","MODO.MULT ","MODO.ÚNICO ","MOEDA","MOEDADEC","MOEDAFRA","MTIR","MUDAR","MULTINOMIAL","MUNIT ","N","NÃO","NÃO.DISP","NOMINAL","NPER","NÚM.CARACT","NÚMSEMANA","NÚMSEMANAISO ","OCTABIN","OCTADEC","OCTAHEX","ORDEM","ORDEM.EQ ","ORDEM.MÉD ","ORDEM.PORCENTUAL","ORDEM.PORCENTUAL.EXC ","ORDEM.PORCENTUAL.INC ","OTN","OTNLUCRO","OTNVALOR","OU","PADRONIZAR","PAR","PEARSON","PERCENTIL","PERCENTIL.EXC ","PERCENTIL.INC ","PERMUT","PERMUTAS ","PGTO","PGTOCAPACUM","PGTOJURACUM","PHI ","PI","PLAN ","PLANS ","POISSON","POTÊNCIA","PPGTO","PREÇO","PREÇODESC","PREÇOPRIMINC","PREÇOÚLTINC","PREÇOVENC","PREVISÃO","PREVISÃO.ETS ","PREVISÃO.ETS.CONFINT ","PREVISÃO.ETS.SAZONALIDADE","PREVISÃO.ETS.STAT ","PREVISÃO.LINEAR ","PRI.MAIÚSCULA","PROB","PROC","PROCH","PROCURAR","PROCV","PRODUTO","PROJ.LIN","PROJ.LOG","PROPRIEDADEMEMBROCUBO","QUARTIL","QUARTIL.EXC ","QUARTIL.INC ","QUOCIENTE","RADIANOS","RAIZ","RAIZPI","RECEBER","REPT","ROMANO","RQUAD","RTD","SDA","SE","SEC ","SECH ","SEERRO","SEGUNDO","SEN","SENÃODISP ","SENH","SERVIÇOWEB ","SINAL","SOMA","SOMAQUAD","SOMARPRODUTO","SOMASE","SOMASEQUÊNCIA","SOMASES","SOMAX2DY2","SOMAX2SY2","SOMAXMY2","SQL.REQUEST","SUBSTITUIR","SUBTOTAL","SWITCH ","T","TAN","TANH","TAXA","TAXAJURO ","TAXAJUROS","TEMPO","TENDÊNCIA","TESTE.F ","TESTE.QUI","TESTE.QUIQUA ","TESTE.T ","TESTE.Z ","TESTEF","TESTET","TESTEZ","TETO","TETO.MAT ","TETO.PRECISO","TEXTJOIN ","TEXTO","TIPO","TIPO.ERRO","TIR","TIRAR","TRANSPOR","TRUNCAR","UNICODE ","VALOR","VALOR.TEMPO","VALORCUBO","VALORNUMÉRICO ","VAR.A ","VAR.P ","VARA","VAREST","VARP","VARPA","VF","VFPLANO","VP","VPL","WEIBULL","XOR ","XTIR","XVPL","FALSE","TRUE"] -------------------------------------------------------------------------------- /demo/styles.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | margin: 10px; 4 | min-height: calc(100vh - 40px); 5 | display: flex; 6 | flex-direction: column; 7 | background: #fff; 8 | color: #444; 9 | font-family: "Gill Sans", "Gill Sans MT", Calibri, "Trebuchet MS", sans-serif; 10 | } 11 | 12 | header { 13 | min-height: 50px; 14 | } 15 | 16 | main { 17 | flex: 1 18 | } 19 | 20 | footer { 21 | min-height: 50px; 22 | align-self: center; 23 | display: flex; 24 | place-items: flex-start; 25 | gap: 25px; 26 | width: max-content; 27 | } 28 | 29 | h1 { 30 | margin-bottom: 50px; 31 | } 32 | 33 | #lang { 34 | margin-bottom: 25px; 35 | } 36 | 37 | .menu-container { 38 | width: 100%; 39 | min-width: 668px; 40 | } 41 | 42 | .left-menu { 43 | display: inline-flex; 44 | gap: 20px; 45 | } 46 | 47 | .right-menu { 48 | float: right; 49 | } 50 | 51 | .right-menu div { 52 | display: inline; 53 | } 54 | 55 | a:link, a:visited { 56 | background-color: #3672f4; 57 | color: white; 58 | padding: 7px 12px; 59 | text-align: center; 60 | text-decoration: none; 61 | display: inline-block; 62 | } 63 | 64 | a:hover, a:active { 65 | background-color: rgb(30, 26, 233); 66 | } 67 | 68 | #editor { 69 | min-height: 25px; 70 | max-height: calc(100vh - 40px - 30vh); 71 | } 72 | .cm-editor { 73 | height: 100%; 74 | max-height: inherit; 75 | } 76 | .cm-scroller { overflow: auto } 77 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "codemirror-app-spreadsheet", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "codemirror-app-spreadsheet", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@codemirror/autocomplete": "^6.4.2", 13 | "@codemirror/commands": "^6.2.1", 14 | "@codemirror/lang-javascript": "^6.1.4", 15 | "@codemirror/state": "^6.2.0", 16 | "@codemirror/view": "^6.9.2", 17 | "@rollup/plugin-node-resolve": "^15.0.1", 18 | "codemirror": "^6.0.1", 19 | "codemirror-lang-spreadsheet": "^1.0.3", 20 | "rollup": "^3.18.0" 21 | }, 22 | "devDependencies": { 23 | "@codemirror/language": "^6.6.0", 24 | "@lezer/highlight": "^1.1.3", 25 | "@typescript-eslint/eslint-plugin": "^5.57.0", 26 | "eslint": "^8.37.0", 27 | "eslint-config-prettier": "^8.8.0", 28 | "eslint-plugin-prettier": "^4.2.1", 29 | "prettier": "^2.8.7", 30 | "rollup-plugin-dts": "^5.3.0", 31 | "rollup-plugin-serve": "^2.0.2", 32 | "rollup-plugin-ts": "^3.2.0", 33 | "typescript": "^4.9.5" 34 | } 35 | }, 36 | "node_modules/@babel/code-frame": { 37 | "version": "7.18.6", 38 | "dev": true, 39 | "license": "MIT", 40 | "optional": true, 41 | "dependencies": { 42 | "@babel/highlight": "^7.18.6" 43 | }, 44 | "engines": { 45 | "node": ">=6.9.0" 46 | } 47 | }, 48 | "node_modules/@babel/helper-validator-identifier": { 49 | "version": "7.19.1", 50 | "dev": true, 51 | "license": "MIT", 52 | "optional": true, 53 | "engines": { 54 | "node": ">=6.9.0" 55 | } 56 | }, 57 | "node_modules/@babel/highlight": { 58 | "version": "7.18.6", 59 | "dev": true, 60 | "license": "MIT", 61 | "optional": true, 62 | "dependencies": { 63 | "@babel/helper-validator-identifier": "^7.18.6", 64 | "chalk": "^2.0.0", 65 | "js-tokens": "^4.0.0" 66 | }, 67 | "engines": { 68 | "node": ">=6.9.0" 69 | } 70 | }, 71 | "node_modules/@codemirror/autocomplete": { 72 | "version": "6.4.2", 73 | "license": "MIT", 74 | "dependencies": { 75 | "@codemirror/language": "^6.0.0", 76 | "@codemirror/state": "^6.0.0", 77 | "@codemirror/view": "^6.6.0", 78 | "@lezer/common": "^1.0.0" 79 | }, 80 | "peerDependencies": { 81 | "@codemirror/language": "^6.0.0", 82 | "@codemirror/state": "^6.0.0", 83 | "@codemirror/view": "^6.0.0", 84 | "@lezer/common": "^1.0.0" 85 | } 86 | }, 87 | "node_modules/@codemirror/commands": { 88 | "version": "6.2.1", 89 | "license": "MIT", 90 | "dependencies": { 91 | "@codemirror/language": "^6.0.0", 92 | "@codemirror/state": "^6.2.0", 93 | "@codemirror/view": "^6.0.0", 94 | "@lezer/common": "^1.0.0" 95 | } 96 | }, 97 | "node_modules/@codemirror/lang-javascript": { 98 | "version": "6.1.4", 99 | "license": "MIT", 100 | "dependencies": { 101 | "@codemirror/autocomplete": "^6.0.0", 102 | "@codemirror/language": "^6.6.0", 103 | "@codemirror/lint": "^6.0.0", 104 | "@codemirror/state": "^6.0.0", 105 | "@codemirror/view": "^6.0.0", 106 | "@lezer/common": "^1.0.0", 107 | "@lezer/javascript": "^1.0.0" 108 | } 109 | }, 110 | "node_modules/@codemirror/lang-javascript/node_modules/@codemirror/lint": { 111 | "version": "6.2.0", 112 | "license": "MIT", 113 | "dependencies": { 114 | "@codemirror/state": "^6.0.0", 115 | "@codemirror/view": "^6.0.0", 116 | "crelt": "^1.0.5" 117 | } 118 | }, 119 | "node_modules/@codemirror/language": { 120 | "version": "6.6.0", 121 | "license": "MIT", 122 | "dependencies": { 123 | "@codemirror/state": "^6.0.0", 124 | "@codemirror/view": "^6.0.0", 125 | "@lezer/common": "^1.0.0", 126 | "@lezer/highlight": "^1.0.0", 127 | "@lezer/lr": "^1.0.0", 128 | "style-mod": "^4.0.0" 129 | } 130 | }, 131 | "node_modules/@codemirror/state": { 132 | "version": "6.2.0", 133 | "license": "MIT" 134 | }, 135 | "node_modules/@codemirror/view": { 136 | "version": "6.9.2", 137 | "license": "MIT", 138 | "dependencies": { 139 | "@codemirror/state": "^6.1.4", 140 | "style-mod": "^4.0.0", 141 | "w3c-keyname": "^2.2.4" 142 | } 143 | }, 144 | "node_modules/@eslint-community/eslint-utils": { 145 | "version": "4.4.0", 146 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", 147 | "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", 148 | "dev": true, 149 | "dependencies": { 150 | "eslint-visitor-keys": "^3.3.0" 151 | }, 152 | "engines": { 153 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 154 | }, 155 | "peerDependencies": { 156 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 157 | } 158 | }, 159 | "node_modules/@eslint-community/regexpp": { 160 | "version": "4.5.0", 161 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", 162 | "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", 163 | "dev": true, 164 | "engines": { 165 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 166 | } 167 | }, 168 | "node_modules/@eslint/eslintrc": { 169 | "version": "2.0.2", 170 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", 171 | "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", 172 | "dev": true, 173 | "dependencies": { 174 | "ajv": "^6.12.4", 175 | "debug": "^4.3.2", 176 | "espree": "^9.5.1", 177 | "globals": "^13.19.0", 178 | "ignore": "^5.2.0", 179 | "import-fresh": "^3.2.1", 180 | "js-yaml": "^4.1.0", 181 | "minimatch": "^3.1.2", 182 | "strip-json-comments": "^3.1.1" 183 | }, 184 | "engines": { 185 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 186 | }, 187 | "funding": { 188 | "url": "https://opencollective.com/eslint" 189 | } 190 | }, 191 | "node_modules/@eslint/js": { 192 | "version": "8.37.0", 193 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.37.0.tgz", 194 | "integrity": "sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==", 195 | "dev": true, 196 | "engines": { 197 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 198 | } 199 | }, 200 | "node_modules/@humanwhocodes/config-array": { 201 | "version": "0.11.8", 202 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", 203 | "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", 204 | "dev": true, 205 | "dependencies": { 206 | "@humanwhocodes/object-schema": "^1.2.1", 207 | "debug": "^4.1.1", 208 | "minimatch": "^3.0.5" 209 | }, 210 | "engines": { 211 | "node": ">=10.10.0" 212 | } 213 | }, 214 | "node_modules/@humanwhocodes/module-importer": { 215 | "version": "1.0.1", 216 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 217 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 218 | "dev": true, 219 | "engines": { 220 | "node": ">=12.22" 221 | }, 222 | "funding": { 223 | "type": "github", 224 | "url": "https://github.com/sponsors/nzakas" 225 | } 226 | }, 227 | "node_modules/@humanwhocodes/object-schema": { 228 | "version": "1.2.1", 229 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 230 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 231 | "dev": true 232 | }, 233 | "node_modules/@jridgewell/sourcemap-codec": { 234 | "version": "1.4.14", 235 | "dev": true, 236 | "license": "MIT" 237 | }, 238 | "node_modules/@lezer/common": { 239 | "version": "1.0.2", 240 | "license": "MIT" 241 | }, 242 | "node_modules/@lezer/highlight": { 243 | "version": "1.1.3", 244 | "license": "MIT", 245 | "dependencies": { 246 | "@lezer/common": "^1.0.0" 247 | } 248 | }, 249 | "node_modules/@lezer/javascript": { 250 | "version": "1.4.1", 251 | "license": "MIT", 252 | "dependencies": { 253 | "@lezer/highlight": "^1.1.3", 254 | "@lezer/lr": "^1.3.0" 255 | } 256 | }, 257 | "node_modules/@lezer/lr": { 258 | "version": "1.3.3", 259 | "license": "MIT", 260 | "dependencies": { 261 | "@lezer/common": "^1.0.0" 262 | } 263 | }, 264 | "node_modules/@mdn/browser-compat-data": { 265 | "version": "5.2.45", 266 | "dev": true, 267 | "license": "CC0-1.0" 268 | }, 269 | "node_modules/@nodelib/fs.scandir": { 270 | "version": "2.1.5", 271 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 272 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 273 | "dev": true, 274 | "dependencies": { 275 | "@nodelib/fs.stat": "2.0.5", 276 | "run-parallel": "^1.1.9" 277 | }, 278 | "engines": { 279 | "node": ">= 8" 280 | } 281 | }, 282 | "node_modules/@nodelib/fs.stat": { 283 | "version": "2.0.5", 284 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 285 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 286 | "dev": true, 287 | "engines": { 288 | "node": ">= 8" 289 | } 290 | }, 291 | "node_modules/@nodelib/fs.walk": { 292 | "version": "1.2.8", 293 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 294 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 295 | "dev": true, 296 | "dependencies": { 297 | "@nodelib/fs.scandir": "2.1.5", 298 | "fastq": "^1.6.0" 299 | }, 300 | "engines": { 301 | "node": ">= 8" 302 | } 303 | }, 304 | "node_modules/@rollup/plugin-node-resolve": { 305 | "version": "15.0.1", 306 | "license": "MIT", 307 | "dependencies": { 308 | "@rollup/pluginutils": "^5.0.1", 309 | "@types/resolve": "1.20.2", 310 | "deepmerge": "^4.2.2", 311 | "is-builtin-module": "^3.2.0", 312 | "is-module": "^1.0.0", 313 | "resolve": "^1.22.1" 314 | }, 315 | "engines": { 316 | "node": ">=14.0.0" 317 | }, 318 | "peerDependencies": { 319 | "rollup": "^2.78.0||^3.0.0" 320 | }, 321 | "peerDependenciesMeta": { 322 | "rollup": { 323 | "optional": true 324 | } 325 | } 326 | }, 327 | "node_modules/@rollup/pluginutils": { 328 | "version": "5.0.2", 329 | "license": "MIT", 330 | "dependencies": { 331 | "@types/estree": "^1.0.0", 332 | "estree-walker": "^2.0.2", 333 | "picomatch": "^2.3.1" 334 | }, 335 | "engines": { 336 | "node": ">=14.0.0" 337 | }, 338 | "peerDependencies": { 339 | "rollup": "^1.20.0||^2.0.0||^3.0.0" 340 | }, 341 | "peerDependenciesMeta": { 342 | "rollup": { 343 | "optional": true 344 | } 345 | } 346 | }, 347 | "node_modules/@types/estree": { 348 | "version": "1.0.0", 349 | "license": "MIT" 350 | }, 351 | "node_modules/@types/json-schema": { 352 | "version": "7.0.11", 353 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", 354 | "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", 355 | "dev": true 356 | }, 357 | "node_modules/@types/node": { 358 | "version": "17.0.45", 359 | "dev": true, 360 | "license": "MIT" 361 | }, 362 | "node_modules/@types/object-path": { 363 | "version": "0.11.1", 364 | "dev": true, 365 | "license": "MIT" 366 | }, 367 | "node_modules/@types/resolve": { 368 | "version": "1.20.2", 369 | "license": "MIT" 370 | }, 371 | "node_modules/@types/semver": { 372 | "version": "7.3.13", 373 | "dev": true, 374 | "license": "MIT" 375 | }, 376 | "node_modules/@types/ua-parser-js": { 377 | "version": "0.7.36", 378 | "dev": true, 379 | "license": "MIT" 380 | }, 381 | "node_modules/@typescript-eslint/eslint-plugin": { 382 | "version": "5.57.0", 383 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.0.tgz", 384 | "integrity": "sha512-itag0qpN6q2UMM6Xgk6xoHa0D0/P+M17THnr4SVgqn9Rgam5k/He33MA7/D7QoJcdMxHFyX7U9imaBonAX/6qA==", 385 | "dev": true, 386 | "dependencies": { 387 | "@eslint-community/regexpp": "^4.4.0", 388 | "@typescript-eslint/scope-manager": "5.57.0", 389 | "@typescript-eslint/type-utils": "5.57.0", 390 | "@typescript-eslint/utils": "5.57.0", 391 | "debug": "^4.3.4", 392 | "grapheme-splitter": "^1.0.4", 393 | "ignore": "^5.2.0", 394 | "natural-compare-lite": "^1.4.0", 395 | "semver": "^7.3.7", 396 | "tsutils": "^3.21.0" 397 | }, 398 | "engines": { 399 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 400 | }, 401 | "funding": { 402 | "type": "opencollective", 403 | "url": "https://opencollective.com/typescript-eslint" 404 | }, 405 | "peerDependencies": { 406 | "@typescript-eslint/parser": "^5.0.0", 407 | "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" 408 | }, 409 | "peerDependenciesMeta": { 410 | "typescript": { 411 | "optional": true 412 | } 413 | } 414 | }, 415 | "node_modules/@typescript-eslint/parser": { 416 | "version": "5.57.0", 417 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.0.tgz", 418 | "integrity": "sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==", 419 | "dev": true, 420 | "peer": true, 421 | "dependencies": { 422 | "@typescript-eslint/scope-manager": "5.57.0", 423 | "@typescript-eslint/types": "5.57.0", 424 | "@typescript-eslint/typescript-estree": "5.57.0", 425 | "debug": "^4.3.4" 426 | }, 427 | "engines": { 428 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 429 | }, 430 | "funding": { 431 | "type": "opencollective", 432 | "url": "https://opencollective.com/typescript-eslint" 433 | }, 434 | "peerDependencies": { 435 | "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" 436 | }, 437 | "peerDependenciesMeta": { 438 | "typescript": { 439 | "optional": true 440 | } 441 | } 442 | }, 443 | "node_modules/@typescript-eslint/scope-manager": { 444 | "version": "5.57.0", 445 | "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.0.tgz", 446 | "integrity": "sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==", 447 | "dev": true, 448 | "dependencies": { 449 | "@typescript-eslint/types": "5.57.0", 450 | "@typescript-eslint/visitor-keys": "5.57.0" 451 | }, 452 | "engines": { 453 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 454 | }, 455 | "funding": { 456 | "type": "opencollective", 457 | "url": "https://opencollective.com/typescript-eslint" 458 | } 459 | }, 460 | "node_modules/@typescript-eslint/type-utils": { 461 | "version": "5.57.0", 462 | "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.0.tgz", 463 | "integrity": "sha512-kxXoq9zOTbvqzLbdNKy1yFrxLC6GDJFE2Yuo3KqSwTmDOFjUGeWSakgoXT864WcK5/NAJkkONCiKb1ddsqhLXQ==", 464 | "dev": true, 465 | "dependencies": { 466 | "@typescript-eslint/typescript-estree": "5.57.0", 467 | "@typescript-eslint/utils": "5.57.0", 468 | "debug": "^4.3.4", 469 | "tsutils": "^3.21.0" 470 | }, 471 | "engines": { 472 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 473 | }, 474 | "funding": { 475 | "type": "opencollective", 476 | "url": "https://opencollective.com/typescript-eslint" 477 | }, 478 | "peerDependencies": { 479 | "eslint": "*" 480 | }, 481 | "peerDependenciesMeta": { 482 | "typescript": { 483 | "optional": true 484 | } 485 | } 486 | }, 487 | "node_modules/@typescript-eslint/types": { 488 | "version": "5.57.0", 489 | "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.0.tgz", 490 | "integrity": "sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==", 491 | "dev": true, 492 | "engines": { 493 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 494 | }, 495 | "funding": { 496 | "type": "opencollective", 497 | "url": "https://opencollective.com/typescript-eslint" 498 | } 499 | }, 500 | "node_modules/@typescript-eslint/typescript-estree": { 501 | "version": "5.57.0", 502 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.0.tgz", 503 | "integrity": "sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==", 504 | "dev": true, 505 | "dependencies": { 506 | "@typescript-eslint/types": "5.57.0", 507 | "@typescript-eslint/visitor-keys": "5.57.0", 508 | "debug": "^4.3.4", 509 | "globby": "^11.1.0", 510 | "is-glob": "^4.0.3", 511 | "semver": "^7.3.7", 512 | "tsutils": "^3.21.0" 513 | }, 514 | "engines": { 515 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 516 | }, 517 | "funding": { 518 | "type": "opencollective", 519 | "url": "https://opencollective.com/typescript-eslint" 520 | }, 521 | "peerDependenciesMeta": { 522 | "typescript": { 523 | "optional": true 524 | } 525 | } 526 | }, 527 | "node_modules/@typescript-eslint/utils": { 528 | "version": "5.57.0", 529 | "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.0.tgz", 530 | "integrity": "sha512-ps/4WohXV7C+LTSgAL5CApxvxbMkl9B9AUZRtnEFonpIxZDIT7wC1xfvuJONMidrkB9scs4zhtRyIwHh4+18kw==", 531 | "dev": true, 532 | "dependencies": { 533 | "@eslint-community/eslint-utils": "^4.2.0", 534 | "@types/json-schema": "^7.0.9", 535 | "@types/semver": "^7.3.12", 536 | "@typescript-eslint/scope-manager": "5.57.0", 537 | "@typescript-eslint/types": "5.57.0", 538 | "@typescript-eslint/typescript-estree": "5.57.0", 539 | "eslint-scope": "^5.1.1", 540 | "semver": "^7.3.7" 541 | }, 542 | "engines": { 543 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 544 | }, 545 | "funding": { 546 | "type": "opencollective", 547 | "url": "https://opencollective.com/typescript-eslint" 548 | }, 549 | "peerDependencies": { 550 | "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" 551 | } 552 | }, 553 | "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { 554 | "version": "5.1.1", 555 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 556 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 557 | "dev": true, 558 | "dependencies": { 559 | "esrecurse": "^4.3.0", 560 | "estraverse": "^4.1.1" 561 | }, 562 | "engines": { 563 | "node": ">=8.0.0" 564 | } 565 | }, 566 | "node_modules/@typescript-eslint/utils/node_modules/estraverse": { 567 | "version": "4.3.0", 568 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 569 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 570 | "dev": true, 571 | "engines": { 572 | "node": ">=4.0" 573 | } 574 | }, 575 | "node_modules/@typescript-eslint/visitor-keys": { 576 | "version": "5.57.0", 577 | "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.0.tgz", 578 | "integrity": "sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==", 579 | "dev": true, 580 | "dependencies": { 581 | "@typescript-eslint/types": "5.57.0", 582 | "eslint-visitor-keys": "^3.3.0" 583 | }, 584 | "engines": { 585 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 586 | }, 587 | "funding": { 588 | "type": "opencollective", 589 | "url": "https://opencollective.com/typescript-eslint" 590 | } 591 | }, 592 | "node_modules/@wessberg/stringutil": { 593 | "version": "1.0.19", 594 | "dev": true, 595 | "license": "MIT", 596 | "engines": { 597 | "node": ">=8.0.0" 598 | } 599 | }, 600 | "node_modules/acorn": { 601 | "version": "8.8.2", 602 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", 603 | "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", 604 | "dev": true, 605 | "bin": { 606 | "acorn": "bin/acorn" 607 | }, 608 | "engines": { 609 | "node": ">=0.4.0" 610 | } 611 | }, 612 | "node_modules/acorn-jsx": { 613 | "version": "5.3.2", 614 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 615 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 616 | "dev": true, 617 | "peerDependencies": { 618 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 619 | } 620 | }, 621 | "node_modules/ajv": { 622 | "version": "6.12.6", 623 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 624 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 625 | "dev": true, 626 | "dependencies": { 627 | "fast-deep-equal": "^3.1.1", 628 | "fast-json-stable-stringify": "^2.0.0", 629 | "json-schema-traverse": "^0.4.1", 630 | "uri-js": "^4.2.2" 631 | }, 632 | "funding": { 633 | "type": "github", 634 | "url": "https://github.com/sponsors/epoberezkin" 635 | } 636 | }, 637 | "node_modules/ansi-colors": { 638 | "version": "4.1.3", 639 | "dev": true, 640 | "license": "MIT", 641 | "engines": { 642 | "node": ">=6" 643 | } 644 | }, 645 | "node_modules/ansi-regex": { 646 | "version": "5.0.1", 647 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 648 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 649 | "dev": true, 650 | "engines": { 651 | "node": ">=8" 652 | } 653 | }, 654 | "node_modules/ansi-styles": { 655 | "version": "3.2.1", 656 | "dev": true, 657 | "license": "MIT", 658 | "optional": true, 659 | "dependencies": { 660 | "color-convert": "^1.9.0" 661 | }, 662 | "engines": { 663 | "node": ">=4" 664 | } 665 | }, 666 | "node_modules/argparse": { 667 | "version": "2.0.1", 668 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 669 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 670 | "dev": true 671 | }, 672 | "node_modules/array-union": { 673 | "version": "2.1.0", 674 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 675 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 676 | "dev": true, 677 | "engines": { 678 | "node": ">=8" 679 | } 680 | }, 681 | "node_modules/balanced-match": { 682 | "version": "1.0.2", 683 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 684 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 685 | "dev": true 686 | }, 687 | "node_modules/brace-expansion": { 688 | "version": "1.1.11", 689 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 690 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 691 | "dev": true, 692 | "dependencies": { 693 | "balanced-match": "^1.0.0", 694 | "concat-map": "0.0.1" 695 | } 696 | }, 697 | "node_modules/braces": { 698 | "version": "3.0.2", 699 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 700 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 701 | "dev": true, 702 | "dependencies": { 703 | "fill-range": "^7.0.1" 704 | }, 705 | "engines": { 706 | "node": ">=8" 707 | } 708 | }, 709 | "node_modules/browserslist": { 710 | "version": "4.21.5", 711 | "dev": true, 712 | "funding": [ 713 | { 714 | "type": "opencollective", 715 | "url": "https://opencollective.com/browserslist" 716 | }, 717 | { 718 | "type": "tidelift", 719 | "url": "https://tidelift.com/funding/github/npm/browserslist" 720 | } 721 | ], 722 | "license": "MIT", 723 | "dependencies": { 724 | "caniuse-lite": "^1.0.30001449", 725 | "electron-to-chromium": "^1.4.284", 726 | "node-releases": "^2.0.8", 727 | "update-browserslist-db": "^1.0.10" 728 | }, 729 | "bin": { 730 | "browserslist": "cli.js" 731 | }, 732 | "engines": { 733 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 734 | } 735 | }, 736 | "node_modules/browserslist-generator": { 737 | "version": "2.0.3", 738 | "dev": true, 739 | "license": "MIT", 740 | "dependencies": { 741 | "@mdn/browser-compat-data": "^5.2.33", 742 | "@types/object-path": "^0.11.1", 743 | "@types/semver": "^7.3.13", 744 | "@types/ua-parser-js": "^0.7.36", 745 | "browserslist": "^4.21.5", 746 | "caniuse-lite": "^1.0.30001450", 747 | "isbot": "^3.6.5", 748 | "object-path": "^0.11.8", 749 | "semver": "^7.3.8", 750 | "ua-parser-js": "^1.0.33" 751 | }, 752 | "engines": { 753 | "node": ">=16.15.1", 754 | "npm": ">=7.0.0", 755 | "pnpm": ">=3.2.0", 756 | "yarn": ">=1.13" 757 | }, 758 | "funding": { 759 | "type": "github", 760 | "url": "https://github.com/wessberg/browserslist-generator?sponsor=1" 761 | } 762 | }, 763 | "node_modules/builtin-modules": { 764 | "version": "3.3.0", 765 | "license": "MIT", 766 | "engines": { 767 | "node": ">=6" 768 | }, 769 | "funding": { 770 | "url": "https://github.com/sponsors/sindresorhus" 771 | } 772 | }, 773 | "node_modules/callsites": { 774 | "version": "3.1.0", 775 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 776 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 777 | "dev": true, 778 | "engines": { 779 | "node": ">=6" 780 | } 781 | }, 782 | "node_modules/caniuse-lite": { 783 | "version": "1.0.30001470", 784 | "dev": true, 785 | "funding": [ 786 | { 787 | "type": "opencollective", 788 | "url": "https://opencollective.com/browserslist" 789 | }, 790 | { 791 | "type": "tidelift", 792 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 793 | } 794 | ], 795 | "license": "CC-BY-4.0" 796 | }, 797 | "node_modules/chalk": { 798 | "version": "2.4.2", 799 | "dev": true, 800 | "license": "MIT", 801 | "optional": true, 802 | "dependencies": { 803 | "ansi-styles": "^3.2.1", 804 | "escape-string-regexp": "^1.0.5", 805 | "supports-color": "^5.3.0" 806 | }, 807 | "engines": { 808 | "node": ">=4" 809 | } 810 | }, 811 | "node_modules/codemirror": { 812 | "version": "6.0.1", 813 | "license": "MIT", 814 | "dependencies": { 815 | "@codemirror/autocomplete": "^6.0.0", 816 | "@codemirror/commands": "^6.0.0", 817 | "@codemirror/language": "^6.0.0", 818 | "@codemirror/lint": "^6.0.0", 819 | "@codemirror/search": "^6.0.0", 820 | "@codemirror/state": "^6.0.0", 821 | "@codemirror/view": "^6.0.0" 822 | } 823 | }, 824 | "node_modules/codemirror-lang-spreadsheet": { 825 | "version": "1.0.3", 826 | "resolved": "https://registry.npmjs.org/codemirror-lang-spreadsheet/-/codemirror-lang-spreadsheet-1.0.3.tgz", 827 | "integrity": "sha512-kEEmyFA52GQ33BTmBgfApkZQTKT6SlUOtp0VXfjRk5NyQWycxH/ZCTpQeT4v8rVu1qpF+G48pKS6w0+DbXQGeQ==", 828 | "dependencies": { 829 | "@codemirror/language": "^6.6.0", 830 | "@lezer/highlight": "^1.0.0", 831 | "@lezer/lr": "^1.0.0" 832 | } 833 | }, 834 | "node_modules/codemirror/node_modules/@codemirror/lint": { 835 | "version": "6.2.0", 836 | "license": "MIT", 837 | "dependencies": { 838 | "@codemirror/state": "^6.0.0", 839 | "@codemirror/view": "^6.0.0", 840 | "crelt": "^1.0.5" 841 | } 842 | }, 843 | "node_modules/codemirror/node_modules/@codemirror/search": { 844 | "version": "6.2.3", 845 | "license": "MIT", 846 | "dependencies": { 847 | "@codemirror/state": "^6.0.0", 848 | "@codemirror/view": "^6.0.0", 849 | "crelt": "^1.0.5" 850 | } 851 | }, 852 | "node_modules/color-convert": { 853 | "version": "1.9.3", 854 | "dev": true, 855 | "license": "MIT", 856 | "optional": true, 857 | "dependencies": { 858 | "color-name": "1.1.3" 859 | } 860 | }, 861 | "node_modules/color-name": { 862 | "version": "1.1.3", 863 | "dev": true, 864 | "license": "MIT", 865 | "optional": true 866 | }, 867 | "node_modules/compatfactory": { 868 | "version": "2.0.9", 869 | "dev": true, 870 | "license": "MIT", 871 | "dependencies": { 872 | "helpertypes": "^0.0.19" 873 | }, 874 | "engines": { 875 | "node": ">=14.9.0" 876 | }, 877 | "peerDependencies": { 878 | "typescript": ">=3.x || >= 4.x" 879 | } 880 | }, 881 | "node_modules/concat-map": { 882 | "version": "0.0.1", 883 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 884 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 885 | "dev": true 886 | }, 887 | "node_modules/crelt": { 888 | "version": "1.0.5", 889 | "license": "MIT" 890 | }, 891 | "node_modules/cross-spawn": { 892 | "version": "7.0.3", 893 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 894 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 895 | "dev": true, 896 | "dependencies": { 897 | "path-key": "^3.1.0", 898 | "shebang-command": "^2.0.0", 899 | "which": "^2.0.1" 900 | }, 901 | "engines": { 902 | "node": ">= 8" 903 | } 904 | }, 905 | "node_modules/crosspath": { 906 | "version": "2.0.0", 907 | "dev": true, 908 | "license": "MIT", 909 | "dependencies": { 910 | "@types/node": "^17.0.36" 911 | }, 912 | "engines": { 913 | "node": ">=14.9.0" 914 | } 915 | }, 916 | "node_modules/debug": { 917 | "version": "4.3.4", 918 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 919 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 920 | "dev": true, 921 | "dependencies": { 922 | "ms": "2.1.2" 923 | }, 924 | "engines": { 925 | "node": ">=6.0" 926 | }, 927 | "peerDependenciesMeta": { 928 | "supports-color": { 929 | "optional": true 930 | } 931 | } 932 | }, 933 | "node_modules/deep-is": { 934 | "version": "0.1.4", 935 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 936 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 937 | "dev": true 938 | }, 939 | "node_modules/deepmerge": { 940 | "version": "4.3.0", 941 | "license": "MIT", 942 | "engines": { 943 | "node": ">=0.10.0" 944 | } 945 | }, 946 | "node_modules/dir-glob": { 947 | "version": "3.0.1", 948 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 949 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 950 | "dev": true, 951 | "dependencies": { 952 | "path-type": "^4.0.0" 953 | }, 954 | "engines": { 955 | "node": ">=8" 956 | } 957 | }, 958 | "node_modules/doctrine": { 959 | "version": "3.0.0", 960 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 961 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 962 | "dev": true, 963 | "dependencies": { 964 | "esutils": "^2.0.2" 965 | }, 966 | "engines": { 967 | "node": ">=6.0.0" 968 | } 969 | }, 970 | "node_modules/electron-to-chromium": { 971 | "version": "1.4.340", 972 | "dev": true, 973 | "license": "ISC" 974 | }, 975 | "node_modules/escalade": { 976 | "version": "3.1.1", 977 | "dev": true, 978 | "license": "MIT", 979 | "engines": { 980 | "node": ">=6" 981 | } 982 | }, 983 | "node_modules/escape-string-regexp": { 984 | "version": "1.0.5", 985 | "dev": true, 986 | "license": "MIT", 987 | "optional": true, 988 | "engines": { 989 | "node": ">=0.8.0" 990 | } 991 | }, 992 | "node_modules/eslint": { 993 | "version": "8.37.0", 994 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.37.0.tgz", 995 | "integrity": "sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==", 996 | "dev": true, 997 | "dependencies": { 998 | "@eslint-community/eslint-utils": "^4.2.0", 999 | "@eslint-community/regexpp": "^4.4.0", 1000 | "@eslint/eslintrc": "^2.0.2", 1001 | "@eslint/js": "8.37.0", 1002 | "@humanwhocodes/config-array": "^0.11.8", 1003 | "@humanwhocodes/module-importer": "^1.0.1", 1004 | "@nodelib/fs.walk": "^1.2.8", 1005 | "ajv": "^6.10.0", 1006 | "chalk": "^4.0.0", 1007 | "cross-spawn": "^7.0.2", 1008 | "debug": "^4.3.2", 1009 | "doctrine": "^3.0.0", 1010 | "escape-string-regexp": "^4.0.0", 1011 | "eslint-scope": "^7.1.1", 1012 | "eslint-visitor-keys": "^3.4.0", 1013 | "espree": "^9.5.1", 1014 | "esquery": "^1.4.2", 1015 | "esutils": "^2.0.2", 1016 | "fast-deep-equal": "^3.1.3", 1017 | "file-entry-cache": "^6.0.1", 1018 | "find-up": "^5.0.0", 1019 | "glob-parent": "^6.0.2", 1020 | "globals": "^13.19.0", 1021 | "grapheme-splitter": "^1.0.4", 1022 | "ignore": "^5.2.0", 1023 | "import-fresh": "^3.0.0", 1024 | "imurmurhash": "^0.1.4", 1025 | "is-glob": "^4.0.0", 1026 | "is-path-inside": "^3.0.3", 1027 | "js-sdsl": "^4.1.4", 1028 | "js-yaml": "^4.1.0", 1029 | "json-stable-stringify-without-jsonify": "^1.0.1", 1030 | "levn": "^0.4.1", 1031 | "lodash.merge": "^4.6.2", 1032 | "minimatch": "^3.1.2", 1033 | "natural-compare": "^1.4.0", 1034 | "optionator": "^0.9.1", 1035 | "strip-ansi": "^6.0.1", 1036 | "strip-json-comments": "^3.1.0", 1037 | "text-table": "^0.2.0" 1038 | }, 1039 | "bin": { 1040 | "eslint": "bin/eslint.js" 1041 | }, 1042 | "engines": { 1043 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1044 | }, 1045 | "funding": { 1046 | "url": "https://opencollective.com/eslint" 1047 | } 1048 | }, 1049 | "node_modules/eslint-config-prettier": { 1050 | "version": "8.8.0", 1051 | "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", 1052 | "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", 1053 | "dev": true, 1054 | "bin": { 1055 | "eslint-config-prettier": "bin/cli.js" 1056 | }, 1057 | "peerDependencies": { 1058 | "eslint": ">=7.0.0" 1059 | } 1060 | }, 1061 | "node_modules/eslint-plugin-prettier": { 1062 | "version": "4.2.1", 1063 | "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", 1064 | "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", 1065 | "dev": true, 1066 | "dependencies": { 1067 | "prettier-linter-helpers": "^1.0.0" 1068 | }, 1069 | "engines": { 1070 | "node": ">=12.0.0" 1071 | }, 1072 | "peerDependencies": { 1073 | "eslint": ">=7.28.0", 1074 | "prettier": ">=2.0.0" 1075 | }, 1076 | "peerDependenciesMeta": { 1077 | "eslint-config-prettier": { 1078 | "optional": true 1079 | } 1080 | } 1081 | }, 1082 | "node_modules/eslint-scope": { 1083 | "version": "7.1.1", 1084 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", 1085 | "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", 1086 | "dev": true, 1087 | "dependencies": { 1088 | "esrecurse": "^4.3.0", 1089 | "estraverse": "^5.2.0" 1090 | }, 1091 | "engines": { 1092 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1093 | } 1094 | }, 1095 | "node_modules/eslint-visitor-keys": { 1096 | "version": "3.4.0", 1097 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", 1098 | "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", 1099 | "dev": true, 1100 | "engines": { 1101 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1102 | }, 1103 | "funding": { 1104 | "url": "https://opencollective.com/eslint" 1105 | } 1106 | }, 1107 | "node_modules/eslint/node_modules/ansi-styles": { 1108 | "version": "4.3.0", 1109 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1110 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1111 | "dev": true, 1112 | "dependencies": { 1113 | "color-convert": "^2.0.1" 1114 | }, 1115 | "engines": { 1116 | "node": ">=8" 1117 | }, 1118 | "funding": { 1119 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1120 | } 1121 | }, 1122 | "node_modules/eslint/node_modules/chalk": { 1123 | "version": "4.1.2", 1124 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1125 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1126 | "dev": true, 1127 | "dependencies": { 1128 | "ansi-styles": "^4.1.0", 1129 | "supports-color": "^7.1.0" 1130 | }, 1131 | "engines": { 1132 | "node": ">=10" 1133 | }, 1134 | "funding": { 1135 | "url": "https://github.com/chalk/chalk?sponsor=1" 1136 | } 1137 | }, 1138 | "node_modules/eslint/node_modules/color-convert": { 1139 | "version": "2.0.1", 1140 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1141 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1142 | "dev": true, 1143 | "dependencies": { 1144 | "color-name": "~1.1.4" 1145 | }, 1146 | "engines": { 1147 | "node": ">=7.0.0" 1148 | } 1149 | }, 1150 | "node_modules/eslint/node_modules/color-name": { 1151 | "version": "1.1.4", 1152 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1153 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1154 | "dev": true 1155 | }, 1156 | "node_modules/eslint/node_modules/escape-string-regexp": { 1157 | "version": "4.0.0", 1158 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1159 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1160 | "dev": true, 1161 | "engines": { 1162 | "node": ">=10" 1163 | }, 1164 | "funding": { 1165 | "url": "https://github.com/sponsors/sindresorhus" 1166 | } 1167 | }, 1168 | "node_modules/eslint/node_modules/has-flag": { 1169 | "version": "4.0.0", 1170 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1171 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1172 | "dev": true, 1173 | "engines": { 1174 | "node": ">=8" 1175 | } 1176 | }, 1177 | "node_modules/eslint/node_modules/supports-color": { 1178 | "version": "7.2.0", 1179 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1180 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1181 | "dev": true, 1182 | "dependencies": { 1183 | "has-flag": "^4.0.0" 1184 | }, 1185 | "engines": { 1186 | "node": ">=8" 1187 | } 1188 | }, 1189 | "node_modules/espree": { 1190 | "version": "9.5.1", 1191 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", 1192 | "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", 1193 | "dev": true, 1194 | "dependencies": { 1195 | "acorn": "^8.8.0", 1196 | "acorn-jsx": "^5.3.2", 1197 | "eslint-visitor-keys": "^3.4.0" 1198 | }, 1199 | "engines": { 1200 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1201 | }, 1202 | "funding": { 1203 | "url": "https://opencollective.com/eslint" 1204 | } 1205 | }, 1206 | "node_modules/esquery": { 1207 | "version": "1.5.0", 1208 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", 1209 | "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", 1210 | "dev": true, 1211 | "dependencies": { 1212 | "estraverse": "^5.1.0" 1213 | }, 1214 | "engines": { 1215 | "node": ">=0.10" 1216 | } 1217 | }, 1218 | "node_modules/esrecurse": { 1219 | "version": "4.3.0", 1220 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1221 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1222 | "dev": true, 1223 | "dependencies": { 1224 | "estraverse": "^5.2.0" 1225 | }, 1226 | "engines": { 1227 | "node": ">=4.0" 1228 | } 1229 | }, 1230 | "node_modules/estraverse": { 1231 | "version": "5.3.0", 1232 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1233 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1234 | "dev": true, 1235 | "engines": { 1236 | "node": ">=4.0" 1237 | } 1238 | }, 1239 | "node_modules/estree-walker": { 1240 | "version": "2.0.2", 1241 | "license": "MIT" 1242 | }, 1243 | "node_modules/esutils": { 1244 | "version": "2.0.3", 1245 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1246 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1247 | "dev": true, 1248 | "engines": { 1249 | "node": ">=0.10.0" 1250 | } 1251 | }, 1252 | "node_modules/fast-deep-equal": { 1253 | "version": "3.1.3", 1254 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1255 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1256 | "dev": true 1257 | }, 1258 | "node_modules/fast-diff": { 1259 | "version": "1.2.0", 1260 | "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", 1261 | "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", 1262 | "dev": true 1263 | }, 1264 | "node_modules/fast-glob": { 1265 | "version": "3.2.12", 1266 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", 1267 | "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", 1268 | "dev": true, 1269 | "dependencies": { 1270 | "@nodelib/fs.stat": "^2.0.2", 1271 | "@nodelib/fs.walk": "^1.2.3", 1272 | "glob-parent": "^5.1.2", 1273 | "merge2": "^1.3.0", 1274 | "micromatch": "^4.0.4" 1275 | }, 1276 | "engines": { 1277 | "node": ">=8.6.0" 1278 | } 1279 | }, 1280 | "node_modules/fast-glob/node_modules/glob-parent": { 1281 | "version": "5.1.2", 1282 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1283 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1284 | "dev": true, 1285 | "dependencies": { 1286 | "is-glob": "^4.0.1" 1287 | }, 1288 | "engines": { 1289 | "node": ">= 6" 1290 | } 1291 | }, 1292 | "node_modules/fast-json-stable-stringify": { 1293 | "version": "2.1.0", 1294 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1295 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1296 | "dev": true 1297 | }, 1298 | "node_modules/fast-levenshtein": { 1299 | "version": "2.0.6", 1300 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1301 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 1302 | "dev": true 1303 | }, 1304 | "node_modules/fastq": { 1305 | "version": "1.15.0", 1306 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 1307 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 1308 | "dev": true, 1309 | "dependencies": { 1310 | "reusify": "^1.0.4" 1311 | } 1312 | }, 1313 | "node_modules/file-entry-cache": { 1314 | "version": "6.0.1", 1315 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 1316 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 1317 | "dev": true, 1318 | "dependencies": { 1319 | "flat-cache": "^3.0.4" 1320 | }, 1321 | "engines": { 1322 | "node": "^10.12.0 || >=12.0.0" 1323 | } 1324 | }, 1325 | "node_modules/fill-range": { 1326 | "version": "7.0.1", 1327 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1328 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1329 | "dev": true, 1330 | "dependencies": { 1331 | "to-regex-range": "^5.0.1" 1332 | }, 1333 | "engines": { 1334 | "node": ">=8" 1335 | } 1336 | }, 1337 | "node_modules/find-up": { 1338 | "version": "5.0.0", 1339 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1340 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1341 | "dev": true, 1342 | "dependencies": { 1343 | "locate-path": "^6.0.0", 1344 | "path-exists": "^4.0.0" 1345 | }, 1346 | "engines": { 1347 | "node": ">=10" 1348 | }, 1349 | "funding": { 1350 | "url": "https://github.com/sponsors/sindresorhus" 1351 | } 1352 | }, 1353 | "node_modules/flat-cache": { 1354 | "version": "3.0.4", 1355 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 1356 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 1357 | "dev": true, 1358 | "dependencies": { 1359 | "flatted": "^3.1.0", 1360 | "rimraf": "^3.0.2" 1361 | }, 1362 | "engines": { 1363 | "node": "^10.12.0 || >=12.0.0" 1364 | } 1365 | }, 1366 | "node_modules/flatted": { 1367 | "version": "3.2.7", 1368 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", 1369 | "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", 1370 | "dev": true 1371 | }, 1372 | "node_modules/fs.realpath": { 1373 | "version": "1.0.0", 1374 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1375 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1376 | "dev": true 1377 | }, 1378 | "node_modules/function-bind": { 1379 | "version": "1.1.1", 1380 | "license": "MIT" 1381 | }, 1382 | "node_modules/glob": { 1383 | "version": "7.2.3", 1384 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1385 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1386 | "dev": true, 1387 | "dependencies": { 1388 | "fs.realpath": "^1.0.0", 1389 | "inflight": "^1.0.4", 1390 | "inherits": "2", 1391 | "minimatch": "^3.1.1", 1392 | "once": "^1.3.0", 1393 | "path-is-absolute": "^1.0.0" 1394 | }, 1395 | "engines": { 1396 | "node": "*" 1397 | }, 1398 | "funding": { 1399 | "url": "https://github.com/sponsors/isaacs" 1400 | } 1401 | }, 1402 | "node_modules/glob-parent": { 1403 | "version": "6.0.2", 1404 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1405 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1406 | "dev": true, 1407 | "dependencies": { 1408 | "is-glob": "^4.0.3" 1409 | }, 1410 | "engines": { 1411 | "node": ">=10.13.0" 1412 | } 1413 | }, 1414 | "node_modules/globals": { 1415 | "version": "13.20.0", 1416 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", 1417 | "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", 1418 | "dev": true, 1419 | "dependencies": { 1420 | "type-fest": "^0.20.2" 1421 | }, 1422 | "engines": { 1423 | "node": ">=8" 1424 | }, 1425 | "funding": { 1426 | "url": "https://github.com/sponsors/sindresorhus" 1427 | } 1428 | }, 1429 | "node_modules/globby": { 1430 | "version": "11.1.0", 1431 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", 1432 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", 1433 | "dev": true, 1434 | "dependencies": { 1435 | "array-union": "^2.1.0", 1436 | "dir-glob": "^3.0.1", 1437 | "fast-glob": "^3.2.9", 1438 | "ignore": "^5.2.0", 1439 | "merge2": "^1.4.1", 1440 | "slash": "^3.0.0" 1441 | }, 1442 | "engines": { 1443 | "node": ">=10" 1444 | }, 1445 | "funding": { 1446 | "url": "https://github.com/sponsors/sindresorhus" 1447 | } 1448 | }, 1449 | "node_modules/grapheme-splitter": { 1450 | "version": "1.0.4", 1451 | "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", 1452 | "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", 1453 | "dev": true 1454 | }, 1455 | "node_modules/has": { 1456 | "version": "1.0.3", 1457 | "license": "MIT", 1458 | "dependencies": { 1459 | "function-bind": "^1.1.1" 1460 | }, 1461 | "engines": { 1462 | "node": ">= 0.4.0" 1463 | } 1464 | }, 1465 | "node_modules/has-flag": { 1466 | "version": "3.0.0", 1467 | "dev": true, 1468 | "license": "MIT", 1469 | "optional": true, 1470 | "engines": { 1471 | "node": ">=4" 1472 | } 1473 | }, 1474 | "node_modules/helpertypes": { 1475 | "version": "0.0.19", 1476 | "dev": true, 1477 | "license": "MIT", 1478 | "engines": { 1479 | "node": ">=10.0.0" 1480 | } 1481 | }, 1482 | "node_modules/ignore": { 1483 | "version": "5.2.4", 1484 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", 1485 | "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", 1486 | "dev": true, 1487 | "engines": { 1488 | "node": ">= 4" 1489 | } 1490 | }, 1491 | "node_modules/import-fresh": { 1492 | "version": "3.3.0", 1493 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1494 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1495 | "dev": true, 1496 | "dependencies": { 1497 | "parent-module": "^1.0.0", 1498 | "resolve-from": "^4.0.0" 1499 | }, 1500 | "engines": { 1501 | "node": ">=6" 1502 | }, 1503 | "funding": { 1504 | "url": "https://github.com/sponsors/sindresorhus" 1505 | } 1506 | }, 1507 | "node_modules/imurmurhash": { 1508 | "version": "0.1.4", 1509 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1510 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1511 | "dev": true, 1512 | "engines": { 1513 | "node": ">=0.8.19" 1514 | } 1515 | }, 1516 | "node_modules/inflight": { 1517 | "version": "1.0.6", 1518 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1519 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1520 | "dev": true, 1521 | "dependencies": { 1522 | "once": "^1.3.0", 1523 | "wrappy": "1" 1524 | } 1525 | }, 1526 | "node_modules/inherits": { 1527 | "version": "2.0.4", 1528 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1529 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1530 | "dev": true 1531 | }, 1532 | "node_modules/is-builtin-module": { 1533 | "version": "3.2.1", 1534 | "license": "MIT", 1535 | "dependencies": { 1536 | "builtin-modules": "^3.3.0" 1537 | }, 1538 | "engines": { 1539 | "node": ">=6" 1540 | }, 1541 | "funding": { 1542 | "url": "https://github.com/sponsors/sindresorhus" 1543 | } 1544 | }, 1545 | "node_modules/is-core-module": { 1546 | "version": "2.11.0", 1547 | "license": "MIT", 1548 | "dependencies": { 1549 | "has": "^1.0.3" 1550 | }, 1551 | "funding": { 1552 | "url": "https://github.com/sponsors/ljharb" 1553 | } 1554 | }, 1555 | "node_modules/is-extglob": { 1556 | "version": "2.1.1", 1557 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1558 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1559 | "dev": true, 1560 | "engines": { 1561 | "node": ">=0.10.0" 1562 | } 1563 | }, 1564 | "node_modules/is-glob": { 1565 | "version": "4.0.3", 1566 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1567 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1568 | "dev": true, 1569 | "dependencies": { 1570 | "is-extglob": "^2.1.1" 1571 | }, 1572 | "engines": { 1573 | "node": ">=0.10.0" 1574 | } 1575 | }, 1576 | "node_modules/is-module": { 1577 | "version": "1.0.0", 1578 | "license": "MIT" 1579 | }, 1580 | "node_modules/is-number": { 1581 | "version": "7.0.0", 1582 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1583 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1584 | "dev": true, 1585 | "engines": { 1586 | "node": ">=0.12.0" 1587 | } 1588 | }, 1589 | "node_modules/is-path-inside": { 1590 | "version": "3.0.3", 1591 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 1592 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 1593 | "dev": true, 1594 | "engines": { 1595 | "node": ">=8" 1596 | } 1597 | }, 1598 | "node_modules/isbot": { 1599 | "version": "3.6.7", 1600 | "dev": true, 1601 | "license": "Unlicense", 1602 | "engines": { 1603 | "node": ">=12" 1604 | } 1605 | }, 1606 | "node_modules/isexe": { 1607 | "version": "2.0.0", 1608 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1609 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1610 | "dev": true 1611 | }, 1612 | "node_modules/js-sdsl": { 1613 | "version": "4.4.0", 1614 | "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", 1615 | "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", 1616 | "dev": true, 1617 | "funding": { 1618 | "type": "opencollective", 1619 | "url": "https://opencollective.com/js-sdsl" 1620 | } 1621 | }, 1622 | "node_modules/js-tokens": { 1623 | "version": "4.0.0", 1624 | "dev": true, 1625 | "license": "MIT", 1626 | "optional": true 1627 | }, 1628 | "node_modules/js-yaml": { 1629 | "version": "4.1.0", 1630 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1631 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1632 | "dev": true, 1633 | "dependencies": { 1634 | "argparse": "^2.0.1" 1635 | }, 1636 | "bin": { 1637 | "js-yaml": "bin/js-yaml.js" 1638 | } 1639 | }, 1640 | "node_modules/json-schema-traverse": { 1641 | "version": "0.4.1", 1642 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1643 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1644 | "dev": true 1645 | }, 1646 | "node_modules/json-stable-stringify-without-jsonify": { 1647 | "version": "1.0.1", 1648 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1649 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 1650 | "dev": true 1651 | }, 1652 | "node_modules/levn": { 1653 | "version": "0.4.1", 1654 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1655 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1656 | "dev": true, 1657 | "dependencies": { 1658 | "prelude-ls": "^1.2.1", 1659 | "type-check": "~0.4.0" 1660 | }, 1661 | "engines": { 1662 | "node": ">= 0.8.0" 1663 | } 1664 | }, 1665 | "node_modules/locate-path": { 1666 | "version": "6.0.0", 1667 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1668 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1669 | "dev": true, 1670 | "dependencies": { 1671 | "p-locate": "^5.0.0" 1672 | }, 1673 | "engines": { 1674 | "node": ">=10" 1675 | }, 1676 | "funding": { 1677 | "url": "https://github.com/sponsors/sindresorhus" 1678 | } 1679 | }, 1680 | "node_modules/lodash.merge": { 1681 | "version": "4.6.2", 1682 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1683 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1684 | "dev": true 1685 | }, 1686 | "node_modules/lru-cache": { 1687 | "version": "6.0.0", 1688 | "dev": true, 1689 | "license": "ISC", 1690 | "dependencies": { 1691 | "yallist": "^4.0.0" 1692 | }, 1693 | "engines": { 1694 | "node": ">=10" 1695 | } 1696 | }, 1697 | "node_modules/magic-string": { 1698 | "version": "0.27.0", 1699 | "dev": true, 1700 | "license": "MIT", 1701 | "dependencies": { 1702 | "@jridgewell/sourcemap-codec": "^1.4.13" 1703 | }, 1704 | "engines": { 1705 | "node": ">=12" 1706 | } 1707 | }, 1708 | "node_modules/merge2": { 1709 | "version": "1.4.1", 1710 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1711 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1712 | "dev": true, 1713 | "engines": { 1714 | "node": ">= 8" 1715 | } 1716 | }, 1717 | "node_modules/micromatch": { 1718 | "version": "4.0.5", 1719 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 1720 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 1721 | "dev": true, 1722 | "dependencies": { 1723 | "braces": "^3.0.2", 1724 | "picomatch": "^2.3.1" 1725 | }, 1726 | "engines": { 1727 | "node": ">=8.6" 1728 | } 1729 | }, 1730 | "node_modules/mime": { 1731 | "version": "3.0.0", 1732 | "dev": true, 1733 | "license": "MIT", 1734 | "bin": { 1735 | "mime": "cli.js" 1736 | }, 1737 | "engines": { 1738 | "node": ">=10.0.0" 1739 | } 1740 | }, 1741 | "node_modules/minimatch": { 1742 | "version": "3.1.2", 1743 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1744 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1745 | "dev": true, 1746 | "dependencies": { 1747 | "brace-expansion": "^1.1.7" 1748 | }, 1749 | "engines": { 1750 | "node": "*" 1751 | } 1752 | }, 1753 | "node_modules/ms": { 1754 | "version": "2.1.2", 1755 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1756 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1757 | "dev": true 1758 | }, 1759 | "node_modules/natural-compare": { 1760 | "version": "1.4.0", 1761 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1762 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 1763 | "dev": true 1764 | }, 1765 | "node_modules/natural-compare-lite": { 1766 | "version": "1.4.0", 1767 | "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", 1768 | "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", 1769 | "dev": true 1770 | }, 1771 | "node_modules/node-releases": { 1772 | "version": "2.0.10", 1773 | "dev": true, 1774 | "license": "MIT" 1775 | }, 1776 | "node_modules/object-path": { 1777 | "version": "0.11.8", 1778 | "dev": true, 1779 | "license": "MIT", 1780 | "engines": { 1781 | "node": ">= 10.12.0" 1782 | } 1783 | }, 1784 | "node_modules/once": { 1785 | "version": "1.4.0", 1786 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1787 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1788 | "dev": true, 1789 | "dependencies": { 1790 | "wrappy": "1" 1791 | } 1792 | }, 1793 | "node_modules/opener": { 1794 | "version": "1.5.2", 1795 | "dev": true, 1796 | "license": "(WTFPL OR MIT)", 1797 | "bin": { 1798 | "opener": "bin/opener-bin.js" 1799 | } 1800 | }, 1801 | "node_modules/optionator": { 1802 | "version": "0.9.1", 1803 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 1804 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 1805 | "dev": true, 1806 | "dependencies": { 1807 | "deep-is": "^0.1.3", 1808 | "fast-levenshtein": "^2.0.6", 1809 | "levn": "^0.4.1", 1810 | "prelude-ls": "^1.2.1", 1811 | "type-check": "^0.4.0", 1812 | "word-wrap": "^1.2.3" 1813 | }, 1814 | "engines": { 1815 | "node": ">= 0.8.0" 1816 | } 1817 | }, 1818 | "node_modules/p-limit": { 1819 | "version": "3.1.0", 1820 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1821 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1822 | "dev": true, 1823 | "dependencies": { 1824 | "yocto-queue": "^0.1.0" 1825 | }, 1826 | "engines": { 1827 | "node": ">=10" 1828 | }, 1829 | "funding": { 1830 | "url": "https://github.com/sponsors/sindresorhus" 1831 | } 1832 | }, 1833 | "node_modules/p-locate": { 1834 | "version": "5.0.0", 1835 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1836 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1837 | "dev": true, 1838 | "dependencies": { 1839 | "p-limit": "^3.0.2" 1840 | }, 1841 | "engines": { 1842 | "node": ">=10" 1843 | }, 1844 | "funding": { 1845 | "url": "https://github.com/sponsors/sindresorhus" 1846 | } 1847 | }, 1848 | "node_modules/parent-module": { 1849 | "version": "1.0.1", 1850 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1851 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1852 | "dev": true, 1853 | "dependencies": { 1854 | "callsites": "^3.0.0" 1855 | }, 1856 | "engines": { 1857 | "node": ">=6" 1858 | } 1859 | }, 1860 | "node_modules/path-exists": { 1861 | "version": "4.0.0", 1862 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1863 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1864 | "dev": true, 1865 | "engines": { 1866 | "node": ">=8" 1867 | } 1868 | }, 1869 | "node_modules/path-is-absolute": { 1870 | "version": "1.0.1", 1871 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1872 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1873 | "dev": true, 1874 | "engines": { 1875 | "node": ">=0.10.0" 1876 | } 1877 | }, 1878 | "node_modules/path-key": { 1879 | "version": "3.1.1", 1880 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1881 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1882 | "dev": true, 1883 | "engines": { 1884 | "node": ">=8" 1885 | } 1886 | }, 1887 | "node_modules/path-parse": { 1888 | "version": "1.0.7", 1889 | "license": "MIT" 1890 | }, 1891 | "node_modules/path-type": { 1892 | "version": "4.0.0", 1893 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 1894 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 1895 | "dev": true, 1896 | "engines": { 1897 | "node": ">=8" 1898 | } 1899 | }, 1900 | "node_modules/picocolors": { 1901 | "version": "1.0.0", 1902 | "dev": true, 1903 | "license": "ISC" 1904 | }, 1905 | "node_modules/picomatch": { 1906 | "version": "2.3.1", 1907 | "license": "MIT", 1908 | "engines": { 1909 | "node": ">=8.6" 1910 | }, 1911 | "funding": { 1912 | "url": "https://github.com/sponsors/jonschlinkert" 1913 | } 1914 | }, 1915 | "node_modules/prelude-ls": { 1916 | "version": "1.2.1", 1917 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1918 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1919 | "dev": true, 1920 | "engines": { 1921 | "node": ">= 0.8.0" 1922 | } 1923 | }, 1924 | "node_modules/prettier": { 1925 | "version": "2.8.7", 1926 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", 1927 | "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", 1928 | "dev": true, 1929 | "bin": { 1930 | "prettier": "bin-prettier.js" 1931 | }, 1932 | "engines": { 1933 | "node": ">=10.13.0" 1934 | }, 1935 | "funding": { 1936 | "url": "https://github.com/prettier/prettier?sponsor=1" 1937 | } 1938 | }, 1939 | "node_modules/prettier-linter-helpers": { 1940 | "version": "1.0.0", 1941 | "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", 1942 | "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", 1943 | "dev": true, 1944 | "dependencies": { 1945 | "fast-diff": "^1.1.2" 1946 | }, 1947 | "engines": { 1948 | "node": ">=6.0.0" 1949 | } 1950 | }, 1951 | "node_modules/punycode": { 1952 | "version": "2.3.0", 1953 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", 1954 | "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", 1955 | "dev": true, 1956 | "engines": { 1957 | "node": ">=6" 1958 | } 1959 | }, 1960 | "node_modules/queue-microtask": { 1961 | "version": "1.2.3", 1962 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1963 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1964 | "dev": true, 1965 | "funding": [ 1966 | { 1967 | "type": "github", 1968 | "url": "https://github.com/sponsors/feross" 1969 | }, 1970 | { 1971 | "type": "patreon", 1972 | "url": "https://www.patreon.com/feross" 1973 | }, 1974 | { 1975 | "type": "consulting", 1976 | "url": "https://feross.org/support" 1977 | } 1978 | ] 1979 | }, 1980 | "node_modules/resolve": { 1981 | "version": "1.22.1", 1982 | "license": "MIT", 1983 | "dependencies": { 1984 | "is-core-module": "^2.9.0", 1985 | "path-parse": "^1.0.7", 1986 | "supports-preserve-symlinks-flag": "^1.0.0" 1987 | }, 1988 | "bin": { 1989 | "resolve": "bin/resolve" 1990 | }, 1991 | "funding": { 1992 | "url": "https://github.com/sponsors/ljharb" 1993 | } 1994 | }, 1995 | "node_modules/resolve-from": { 1996 | "version": "4.0.0", 1997 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1998 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1999 | "dev": true, 2000 | "engines": { 2001 | "node": ">=4" 2002 | } 2003 | }, 2004 | "node_modules/reusify": { 2005 | "version": "1.0.4", 2006 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2007 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2008 | "dev": true, 2009 | "engines": { 2010 | "iojs": ">=1.0.0", 2011 | "node": ">=0.10.0" 2012 | } 2013 | }, 2014 | "node_modules/rimraf": { 2015 | "version": "3.0.2", 2016 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 2017 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 2018 | "dev": true, 2019 | "dependencies": { 2020 | "glob": "^7.1.3" 2021 | }, 2022 | "bin": { 2023 | "rimraf": "bin.js" 2024 | }, 2025 | "funding": { 2026 | "url": "https://github.com/sponsors/isaacs" 2027 | } 2028 | }, 2029 | "node_modules/rollup": { 2030 | "version": "3.18.0", 2031 | "license": "MIT", 2032 | "bin": { 2033 | "rollup": "dist/bin/rollup" 2034 | }, 2035 | "engines": { 2036 | "node": ">=14.18.0", 2037 | "npm": ">=8.0.0" 2038 | }, 2039 | "optionalDependencies": { 2040 | "fsevents": "~2.3.2" 2041 | } 2042 | }, 2043 | "node_modules/rollup-plugin-dts": { 2044 | "version": "5.3.0", 2045 | "dev": true, 2046 | "license": "LGPL-3.0", 2047 | "dependencies": { 2048 | "magic-string": "^0.30.0" 2049 | }, 2050 | "engines": { 2051 | "node": ">=v14" 2052 | }, 2053 | "funding": { 2054 | "url": "https://github.com/sponsors/Swatinem" 2055 | }, 2056 | "optionalDependencies": { 2057 | "@babel/code-frame": "^7.18.6" 2058 | }, 2059 | "peerDependencies": { 2060 | "rollup": "^3.0.0", 2061 | "typescript": "^4.1 || ^5.0" 2062 | } 2063 | }, 2064 | "node_modules/rollup-plugin-dts/node_modules/magic-string": { 2065 | "version": "0.30.0", 2066 | "dev": true, 2067 | "license": "MIT", 2068 | "dependencies": { 2069 | "@jridgewell/sourcemap-codec": "^1.4.13" 2070 | }, 2071 | "engines": { 2072 | "node": ">=12" 2073 | } 2074 | }, 2075 | "node_modules/rollup-plugin-serve": { 2076 | "version": "2.0.2", 2077 | "dev": true, 2078 | "license": "MIT", 2079 | "dependencies": { 2080 | "mime": ">=2.4.6", 2081 | "opener": "1" 2082 | } 2083 | }, 2084 | "node_modules/rollup-plugin-ts": { 2085 | "version": "3.2.0", 2086 | "dev": true, 2087 | "license": "MIT", 2088 | "dependencies": { 2089 | "@rollup/pluginutils": "^5.0.2", 2090 | "@wessberg/stringutil": "^1.0.19", 2091 | "ansi-colors": "^4.1.3", 2092 | "browserslist": "^4.21.4", 2093 | "browserslist-generator": "^2.0.1", 2094 | "compatfactory": "^2.0.9", 2095 | "crosspath": "^2.0.0", 2096 | "magic-string": "^0.27.0", 2097 | "ts-clone-node": "^2.0.4", 2098 | "tslib": "^2.4.1" 2099 | }, 2100 | "engines": { 2101 | "node": ">=14.9.0", 2102 | "npm": ">=7.0.0", 2103 | "pnpm": ">=3.2.0", 2104 | "yarn": ">=1.13" 2105 | }, 2106 | "funding": { 2107 | "type": "github", 2108 | "url": "https://github.com/wessberg/rollup-plugin-ts?sponsor=1" 2109 | }, 2110 | "peerDependencies": { 2111 | "@babel/core": ">=6.x || >=7.x", 2112 | "@babel/plugin-transform-runtime": ">=6.x || >=7.x", 2113 | "@babel/preset-env": ">=6.x || >=7.x", 2114 | "@babel/preset-typescript": ">=6.x || >=7.x", 2115 | "@babel/runtime": ">=6.x || >=7.x", 2116 | "@swc/core": ">=1.x", 2117 | "@swc/helpers": ">=0.2", 2118 | "rollup": ">=1.x || >=2.x", 2119 | "typescript": ">=3.2.x || >= 4.x" 2120 | }, 2121 | "peerDependenciesMeta": { 2122 | "@babel/core": { 2123 | "optional": true 2124 | }, 2125 | "@babel/plugin-transform-runtime": { 2126 | "optional": true 2127 | }, 2128 | "@babel/preset-env": { 2129 | "optional": true 2130 | }, 2131 | "@babel/preset-typescript": { 2132 | "optional": true 2133 | }, 2134 | "@babel/runtime": { 2135 | "optional": true 2136 | }, 2137 | "@swc/core": { 2138 | "optional": true 2139 | }, 2140 | "@swc/helpers": { 2141 | "optional": true 2142 | } 2143 | } 2144 | }, 2145 | "node_modules/run-parallel": { 2146 | "version": "1.2.0", 2147 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2148 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2149 | "dev": true, 2150 | "funding": [ 2151 | { 2152 | "type": "github", 2153 | "url": "https://github.com/sponsors/feross" 2154 | }, 2155 | { 2156 | "type": "patreon", 2157 | "url": "https://www.patreon.com/feross" 2158 | }, 2159 | { 2160 | "type": "consulting", 2161 | "url": "https://feross.org/support" 2162 | } 2163 | ], 2164 | "dependencies": { 2165 | "queue-microtask": "^1.2.2" 2166 | } 2167 | }, 2168 | "node_modules/semver": { 2169 | "version": "7.3.8", 2170 | "dev": true, 2171 | "license": "ISC", 2172 | "dependencies": { 2173 | "lru-cache": "^6.0.0" 2174 | }, 2175 | "bin": { 2176 | "semver": "bin/semver.js" 2177 | }, 2178 | "engines": { 2179 | "node": ">=10" 2180 | } 2181 | }, 2182 | "node_modules/shebang-command": { 2183 | "version": "2.0.0", 2184 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2185 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2186 | "dev": true, 2187 | "dependencies": { 2188 | "shebang-regex": "^3.0.0" 2189 | }, 2190 | "engines": { 2191 | "node": ">=8" 2192 | } 2193 | }, 2194 | "node_modules/shebang-regex": { 2195 | "version": "3.0.0", 2196 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2197 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2198 | "dev": true, 2199 | "engines": { 2200 | "node": ">=8" 2201 | } 2202 | }, 2203 | "node_modules/slash": { 2204 | "version": "3.0.0", 2205 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 2206 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 2207 | "dev": true, 2208 | "engines": { 2209 | "node": ">=8" 2210 | } 2211 | }, 2212 | "node_modules/strip-ansi": { 2213 | "version": "6.0.1", 2214 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2215 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2216 | "dev": true, 2217 | "dependencies": { 2218 | "ansi-regex": "^5.0.1" 2219 | }, 2220 | "engines": { 2221 | "node": ">=8" 2222 | } 2223 | }, 2224 | "node_modules/strip-json-comments": { 2225 | "version": "3.1.1", 2226 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2227 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2228 | "dev": true, 2229 | "engines": { 2230 | "node": ">=8" 2231 | }, 2232 | "funding": { 2233 | "url": "https://github.com/sponsors/sindresorhus" 2234 | } 2235 | }, 2236 | "node_modules/style-mod": { 2237 | "version": "4.0.0", 2238 | "license": "MIT" 2239 | }, 2240 | "node_modules/supports-color": { 2241 | "version": "5.5.0", 2242 | "dev": true, 2243 | "license": "MIT", 2244 | "optional": true, 2245 | "dependencies": { 2246 | "has-flag": "^3.0.0" 2247 | }, 2248 | "engines": { 2249 | "node": ">=4" 2250 | } 2251 | }, 2252 | "node_modules/supports-preserve-symlinks-flag": { 2253 | "version": "1.0.0", 2254 | "license": "MIT", 2255 | "engines": { 2256 | "node": ">= 0.4" 2257 | }, 2258 | "funding": { 2259 | "url": "https://github.com/sponsors/ljharb" 2260 | } 2261 | }, 2262 | "node_modules/text-table": { 2263 | "version": "0.2.0", 2264 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2265 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 2266 | "dev": true 2267 | }, 2268 | "node_modules/to-regex-range": { 2269 | "version": "5.0.1", 2270 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2271 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2272 | "dev": true, 2273 | "dependencies": { 2274 | "is-number": "^7.0.0" 2275 | }, 2276 | "engines": { 2277 | "node": ">=8.0" 2278 | } 2279 | }, 2280 | "node_modules/ts-clone-node": { 2281 | "version": "2.0.4", 2282 | "dev": true, 2283 | "license": "MIT", 2284 | "dependencies": { 2285 | "compatfactory": "^2.0.9" 2286 | }, 2287 | "engines": { 2288 | "node": ">=14.9.0" 2289 | }, 2290 | "funding": { 2291 | "type": "github", 2292 | "url": "https://github.com/wessberg/ts-clone-node?sponsor=1" 2293 | }, 2294 | "peerDependencies": { 2295 | "typescript": "^3.x || ^4.x" 2296 | } 2297 | }, 2298 | "node_modules/tslib": { 2299 | "version": "2.5.0", 2300 | "dev": true, 2301 | "license": "0BSD" 2302 | }, 2303 | "node_modules/tsutils": { 2304 | "version": "3.21.0", 2305 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", 2306 | "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", 2307 | "dev": true, 2308 | "dependencies": { 2309 | "tslib": "^1.8.1" 2310 | }, 2311 | "engines": { 2312 | "node": ">= 6" 2313 | }, 2314 | "peerDependencies": { 2315 | "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" 2316 | } 2317 | }, 2318 | "node_modules/tsutils/node_modules/tslib": { 2319 | "version": "1.14.1", 2320 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 2321 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 2322 | "dev": true 2323 | }, 2324 | "node_modules/type-check": { 2325 | "version": "0.4.0", 2326 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 2327 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 2328 | "dev": true, 2329 | "dependencies": { 2330 | "prelude-ls": "^1.2.1" 2331 | }, 2332 | "engines": { 2333 | "node": ">= 0.8.0" 2334 | } 2335 | }, 2336 | "node_modules/type-fest": { 2337 | "version": "0.20.2", 2338 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 2339 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 2340 | "dev": true, 2341 | "engines": { 2342 | "node": ">=10" 2343 | }, 2344 | "funding": { 2345 | "url": "https://github.com/sponsors/sindresorhus" 2346 | } 2347 | }, 2348 | "node_modules/typescript": { 2349 | "version": "4.9.5", 2350 | "dev": true, 2351 | "license": "Apache-2.0", 2352 | "bin": { 2353 | "tsc": "bin/tsc", 2354 | "tsserver": "bin/tsserver" 2355 | }, 2356 | "engines": { 2357 | "node": ">=4.2.0" 2358 | } 2359 | }, 2360 | "node_modules/ua-parser-js": { 2361 | "version": "1.0.34", 2362 | "dev": true, 2363 | "funding": [ 2364 | { 2365 | "type": "opencollective", 2366 | "url": "https://opencollective.com/ua-parser-js" 2367 | }, 2368 | { 2369 | "type": "paypal", 2370 | "url": "https://paypal.me/faisalman" 2371 | } 2372 | ], 2373 | "license": "MIT", 2374 | "engines": { 2375 | "node": "*" 2376 | } 2377 | }, 2378 | "node_modules/update-browserslist-db": { 2379 | "version": "1.0.10", 2380 | "dev": true, 2381 | "funding": [ 2382 | { 2383 | "type": "opencollective", 2384 | "url": "https://opencollective.com/browserslist" 2385 | }, 2386 | { 2387 | "type": "tidelift", 2388 | "url": "https://tidelift.com/funding/github/npm/browserslist" 2389 | } 2390 | ], 2391 | "license": "MIT", 2392 | "dependencies": { 2393 | "escalade": "^3.1.1", 2394 | "picocolors": "^1.0.0" 2395 | }, 2396 | "bin": { 2397 | "browserslist-lint": "cli.js" 2398 | }, 2399 | "peerDependencies": { 2400 | "browserslist": ">= 4.21.0" 2401 | } 2402 | }, 2403 | "node_modules/uri-js": { 2404 | "version": "4.4.1", 2405 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2406 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2407 | "dev": true, 2408 | "dependencies": { 2409 | "punycode": "^2.1.0" 2410 | } 2411 | }, 2412 | "node_modules/w3c-keyname": { 2413 | "version": "2.2.6", 2414 | "license": "MIT" 2415 | }, 2416 | "node_modules/which": { 2417 | "version": "2.0.2", 2418 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2419 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2420 | "dev": true, 2421 | "dependencies": { 2422 | "isexe": "^2.0.0" 2423 | }, 2424 | "bin": { 2425 | "node-which": "bin/node-which" 2426 | }, 2427 | "engines": { 2428 | "node": ">= 8" 2429 | } 2430 | }, 2431 | "node_modules/word-wrap": { 2432 | "version": "1.2.3", 2433 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 2434 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 2435 | "dev": true, 2436 | "engines": { 2437 | "node": ">=0.10.0" 2438 | } 2439 | }, 2440 | "node_modules/wrappy": { 2441 | "version": "1.0.2", 2442 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2443 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2444 | "dev": true 2445 | }, 2446 | "node_modules/yallist": { 2447 | "version": "4.0.0", 2448 | "dev": true, 2449 | "license": "ISC" 2450 | }, 2451 | "node_modules/yocto-queue": { 2452 | "version": "0.1.0", 2453 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2454 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2455 | "dev": true, 2456 | "engines": { 2457 | "node": ">=10" 2458 | }, 2459 | "funding": { 2460 | "url": "https://github.com/sponsors/sindresorhus" 2461 | } 2462 | } 2463 | } 2464 | } 2465 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "codemirror-app-spreadsheet", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "./src/editor.js", 6 | "scripts": { 7 | "start": "rollup -c \"rollup.config.js\" -w", 8 | "test": "echo \"Error: no test specified\" && exit 1", 9 | "prettier-format": "prettier --config .prettierrc --write \"src/**/*.ts\"", 10 | "prettier-check": "prettier --check \"src/**/*.ts\"", 11 | "lint": "eslint --ext .ts --ignore-path .eslintignore ." 12 | }, 13 | "author": "", 14 | "license": "ISC", 15 | "type": "module", 16 | "dependencies": { 17 | "@codemirror/autocomplete": "^6.4.2", 18 | "@codemirror/commands": "^6.2.1", 19 | "@codemirror/lang-javascript": "^6.1.4", 20 | "@codemirror/state": "^6.2.0", 21 | "@codemirror/view": "^6.9.2", 22 | "@rollup/plugin-node-resolve": "^15.0.1", 23 | "codemirror": "^6.0.1", 24 | "codemirror-lang-spreadsheet": "^1.0.3", 25 | "rollup": "^3.18.0" 26 | }, 27 | "devDependencies": { 28 | "@codemirror/language": "^6.6.0", 29 | "@lezer/highlight": "^1.1.3", 30 | "@typescript-eslint/eslint-plugin": "^5.57.0", 31 | "eslint": "^8.37.0", 32 | "eslint-config-prettier": "^8.8.0", 33 | "eslint-plugin-prettier": "^4.2.1", 34 | "prettier": "^2.8.7", 35 | "rollup-plugin-dts": "^5.3.0", 36 | "rollup-plugin-serve": "^2.0.2", 37 | "rollup-plugin-ts": "^3.2.0", 38 | "typescript": "^4.9.5" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import { nodeResolve } from "@rollup/plugin-node-resolve" 2 | import typescript from "rollup-plugin-ts" 3 | import serve from 'rollup-plugin-serve' 4 | 5 | export default { 6 | input: "./src/editor.ts", 7 | output: { 8 | file: "./dist/editor.bundle.js", 9 | format: "iife", 10 | }, 11 | plugins: [ 12 | typescript(), 13 | nodeResolve(), 14 | serve({ 15 | open: true, 16 | verbose: true, 17 | contentBase: ['demo', 'dist'], 18 | host: 'localhost', 19 | port: 10001 20 | }), 21 | ], 22 | }; -------------------------------------------------------------------------------- /src/autocompletion.ts: -------------------------------------------------------------------------------- 1 | import { 2 | autocompletion, 3 | CompletionContext, 4 | Completion, 5 | CompletionResult 6 | } from '@codemirror/autocomplete'; 7 | import { syntaxTree } from '@codemirror/language'; 8 | import { Toptions } from 'codemirror-lang-spreadsheet'; 9 | import { EditorView } from '@codemirror/view'; 10 | import { Compartment } from '@codemirror/state'; 11 | 12 | /** 13 | * Dispatch a autocompletion reconfigure on editor 14 | * @param editor the Editor View 15 | * @param autocompleteCompartment the autocomplete compartment 16 | * @param newIdiom the new idiom to autocomplete 17 | */ 18 | export async function setAutocompletionIdiom( 19 | editor: EditorView, 20 | autocompleteCompartment: Compartment, 21 | newIdiom: NonNullable 22 | ): Promise { 23 | const fileName = `${newIdiom}.json`, 24 | optionsResponse = await fetch(fileName); 25 | if (!optionsResponse.ok) throw new Error(`Failed to fetch ${fileName}`); 26 | 27 | const options = await optionsResponse.json(); 28 | function completions(context: CompletionContext): CompletionResult | null { 29 | const currNode = syntaxTree(context.state).resolveInner(context.pos, 0); 30 | if (currNode.name === 'TextToken') return null; 31 | const word = context.matchBefore(/\w*/); 32 | if (word && word.from == word.to && !context.explicit) return null; 33 | return { 34 | from: word!.from, 35 | options: options.map( 36 | (label: string): Completion => ({ 37 | label, 38 | type: 'function', 39 | apply: `${label}(` 40 | }) 41 | ) 42 | }; 43 | } 44 | 45 | editor.dispatch({ 46 | effects: autocompleteCompartment.reconfigure( 47 | autocompletion({ override: [completions] }) 48 | ) 49 | }); 50 | } 51 | -------------------------------------------------------------------------------- /src/editor.ts: -------------------------------------------------------------------------------- 1 | //3rd's 2 | import { basicSetup } from 'codemirror'; 3 | import { EditorView, keymap } from '@codemirror/view'; 4 | import { spreadsheet, Toptions } from 'codemirror-lang-spreadsheet'; 5 | import { syntaxHighlighting, HighlightStyle } from '@codemirror/language'; 6 | import { tags } from '@lezer/highlight'; 7 | import { Compartment } from '@codemirror/state'; 8 | 9 | // Locals 10 | import { 11 | indentAndCompletionWithTab, 12 | tabObservable 13 | } from './indent-completion-tab'; 14 | import { setAutocompletionIdiom } from './autocompletion'; 15 | import { setEditorOptions } from './idiom-decimal-separator'; 16 | import { codePrettier } from './prettier'; 17 | 18 | const defaultIdiom = 'en-US', 19 | inptIdiom = document.getElementById('langComp') as HTMLSelectElement, 20 | inptSeparator = document.getElementById('separator') as HTMLSelectElement, 21 | inptIndent = document.getElementById('indent') as HTMLInputElement, 22 | btnPrettier = document.getElementById('prettier') as HTMLButtonElement, 23 | languageCompart = new Compartment(), 24 | autocompleteCompart = new Compartment(); 25 | 26 | /** 27 | * Configure highlighting 28 | */ 29 | const myHighlightStyle = HighlightStyle.define([ 30 | { tag: tags.name, color: 'green' }, // Color of functions 31 | { tag: tags.bool, color: '#A020F0' }, // Color of booleans (TRUE or FALSE) 32 | { tag: tags.color, color: '#0000FF' }, // Color of references (eg.: cell, range, named range,...) 33 | { tag: tags.invalid, color: '#FA6F66' } // Color of erros (eg.: #N/A, #DIV/0!, #REF!, #NAME!...) 34 | ]); 35 | 36 | /** 37 | * Create the editor 38 | */ 39 | const extensions = [ 40 | basicSetup, 41 | keymap.of([indentAndCompletionWithTab]), 42 | syntaxHighlighting(myHighlightStyle), 43 | tabObservable(), 44 | EditorView.lineWrapping 45 | ]; 46 | 47 | const editor = new EditorView({ 48 | doc: 'IF(SUM(IF(A1=A2,10,-1))=1, "Condition1", "Condition2")', 49 | extensions: [ 50 | ...extensions, 51 | languageCompart.of(spreadsheet()), 52 | autocompleteCompart.of([]) 53 | ], 54 | parent: document.getElementById('editor') as HTMLDivElement 55 | }); 56 | 57 | // Changes editor's config when change decimal separator 58 | inptSeparator.addEventListener('change', (e) => { 59 | const newDecimalSeparator = (e.target as HTMLTextAreaElement).value; 60 | setEditorOptions(editor, languageCompart, { 61 | idiom: inptIdiom.value as NonNullable, 62 | decimalSeparator: newDecimalSeparator as NonNullable< 63 | Toptions['decimalSeparator'] 64 | > 65 | }); 66 | }); 67 | 68 | // Set default autocompletion 69 | setAutocompletionIdiom(editor, autocompleteCompart, defaultIdiom); 70 | 71 | // Changes editor's config and autocompletion when idiom change 72 | inptIdiom.addEventListener('change', (e) => { 73 | const newIdiom = (e.target as HTMLTextAreaElement).value; 74 | setEditorOptions(editor, languageCompart, { 75 | idiom: newIdiom as NonNullable, 76 | decimalSeparator: inptSeparator.value as NonNullable< 77 | Toptions['decimalSeparator'] 78 | > 79 | }); 80 | setAutocompletionIdiom( 81 | editor, 82 | autocompleteCompart, 83 | newIdiom as NonNullable 84 | ); 85 | }); 86 | 87 | // Format formula 88 | btnPrettier.addEventListener('click', (e) => { 89 | codePrettier(editor, inptIndent.value); 90 | }); 91 | -------------------------------------------------------------------------------- /src/idiom-decimal-separator.ts: -------------------------------------------------------------------------------- 1 | import { 2 | spreadsheet, 3 | Toptions 4 | } from 'codemirror-lang-spreadsheet'; 5 | import { EditorView } from '@codemirror/view'; 6 | import { Compartment } from '@codemirror/state'; 7 | 8 | /** 9 | * Changes editor options (idiom and/or decimal separator) 10 | * @param editor the EditorView 11 | * @param languageCompartment the language compartment 12 | * @param options spreadsheet language options (idiom and/or decimal separator) 13 | */ 14 | export function setEditorOptions( 15 | editor: EditorView, 16 | languageCompartment: Compartment, 17 | options: Toptions 18 | ): void { 19 | editor.dispatch({ 20 | effects: languageCompartment.reconfigure(spreadsheet(options)), 21 | changes: { 22 | //Force reprocessing 23 | from: 0, 24 | to: editor.state.doc.length, 25 | insert: editor.state.doc.toString() 26 | } 27 | }); 28 | } 29 | -------------------------------------------------------------------------------- /src/indent-completion-tab.ts: -------------------------------------------------------------------------------- 1 | import { EditorView } from '@codemirror/view'; 2 | import { completionStatus, acceptCompletion } from '@codemirror/autocomplete'; 3 | import { ViewPlugin, ViewUpdate, KeyBinding, Command } from '@codemirror/view'; 4 | import { indentWithTab } from '@codemirror/commands'; 5 | 6 | // Select autocompletion with tab 7 | // Inspired by: https://sourcegraph.com/github.com/sourcegraph/sourcegraph@f1c08e272abf56e8f107589a49bc2a5c54429d19/-/blob/client/search-ui/src/input/extensions/loading-indicator.ts 8 | let isAutocompleteOpen = false; 9 | 10 | function tabRun(view: EditorView) { 11 | return isAutocompleteOpen 12 | ? acceptCompletion(view) 13 | : indentWithTab.run && indentWithTab.run(view); 14 | } 15 | 16 | export const indentAndCompletionWithTab: KeyBinding = { 17 | ...indentWithTab, 18 | run: tabRun as Command 19 | }; 20 | 21 | export function tabObservable() { 22 | return [ 23 | ViewPlugin.fromClass( 24 | class { 25 | constructor(private view: EditorView) {} 26 | 27 | update(update: ViewUpdate) { 28 | const status = completionStatus(update.state); 29 | isAutocompleteOpen = status !== null; 30 | } 31 | } 32 | ) 33 | ]; 34 | } 35 | -------------------------------------------------------------------------------- /src/prettier.ts: -------------------------------------------------------------------------------- 1 | import { EditorView } from '@codemirror/view'; 2 | import { ensureSyntaxTree } from '@codemirror/language'; 3 | 4 | /** 5 | * Improve function visualization by adding indentation 6 | * @param editor the EditorView 7 | * @param indentSize number of indent spaces 8 | * @returns 9 | */ 10 | export function codePrettier( 11 | editor: EditorView, 12 | indentSize: number | string 13 | ): void { 14 | // Just remove current whitespaces and line breakes 15 | editor.dispatch({ 16 | changes: { 17 | from: 0, 18 | to: editor.state.doc.length, 19 | insert: editor.state.doc.toString().replace(/(?:\r\n|\r|\n)/g, '') 20 | } 21 | }); 22 | 23 | const currDoc = editor.state.doc.toString(); 24 | 25 | // Get node tree 26 | const tree = ensureSyntaxTree(editor.state, currDoc.length, 5000); 27 | 28 | if (!tree) return; 29 | 30 | // Nodes that will be indent/dedent 31 | const indentNodes = ['Function', 'Argument', 'OpenParen', 'CloseParen'], 32 | indentIncrease = ['Function'], 33 | indentDecrease = ['CloseParen'], 34 | nodes: { from: number; to: number; indent: number }[] = []; // Stores node position and indentation value for later processing 35 | 36 | let indentDepth = 0; // Stores indent level 37 | tree.iterate({ 38 | enter: ({ name, from, to }) => { 39 | if (indentNodes.indexOf(name) === -1) return; 40 | if (indentDecrease.indexOf(name) !== -1) indentDepth--; 41 | nodes.push({ 42 | from, 43 | to, 44 | indent: +indentSize * indentDepth 45 | }); 46 | if (indentIncrease.indexOf(name) !== -1) indentDepth++; 47 | } 48 | }); 49 | 50 | let formattedDoc = ''; 51 | for (let idx = 0; idx < nodes.length; idx++) { 52 | const currNode = nodes[idx], 53 | nextNode = nodes[idx + 1]; 54 | 55 | formattedDoc = 56 | formattedDoc + 57 | ' '.repeat(currNode.indent) + 58 | currDoc.substring( 59 | idx === 0 ? 0 : currNode.from, 60 | nextNode?.from ?? currNode.to 61 | ) + 62 | (nextNode?.indent > 0 || currNode.indent > 0 ? '\n' : ''); 63 | } 64 | 65 | // Remove empty lines 66 | formattedDoc = (formattedDoc === '' ? currDoc : formattedDoc).replace( 67 | /^\s*[\r\n]/gm, 68 | '' 69 | ); 70 | 71 | editor.dispatch({ 72 | changes: { 73 | from: 0, 74 | to: editor.state.doc.length, 75 | insert: formattedDoc 76 | } 77 | }); 78 | } 79 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strict": true, 4 | "target": "es6", 5 | "module": "es2020", 6 | "newLine": "lf", 7 | "declaration": false, 8 | "moduleResolution": "node" 9 | }, 10 | "include": ["src/*.ts"] 11 | } 12 | --------------------------------------------------------------------------------