diff --git a/buildScript/webpack.config.js b/buildScript/webpack.config.js index 35d396edd8..516809f41d 100644 --- a/buildScript/webpack.config.js +++ b/buildScript/webpack.config.js @@ -1,5 +1,4 @@ /* eslint-env node */ -/* global process */ import webpack from 'webpack'; import TerserPlugin from 'terser-webpack-plugin'; diff --git a/eslint.config.mjs b/eslint.config.mjs index aaa3794a8a..0eac06365a 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,3 +1,4 @@ +import js from "@eslint/js"; import react from "eslint-plugin-react"; import jsdoc from "eslint-plugin-jsdoc"; import reactHooks from "eslint-plugin-react-hooks"; @@ -19,6 +20,16 @@ const gitIgnorePath = path.resolve(__dirname, ".gitignore") export default [ includeIgnoreFile(gitIgnorePath), //ignore git-ignored dirs/files + + // vendored third-party source + {ignores: [ + "src/firefly/html/gpu-browser.min-*.js", + "src/firefly/js/externalSource/**", + ]}, + + // eslint's recommended rules; the block below layers over these + {files: ["**/*.js", "**/*.jsx"], ...js.configs.recommended}, + { files: ["**/*.js", "**/*.jsx"], @@ -66,6 +77,11 @@ export default [ "prefer-const": 1, "prefer-spread": 1, "prefer-template": 0, + + // recommended rules with existing violations: warn until the sites are addressed + "no-case-declarations": 1, + "no-async-promise-executor": 1, + "@stylistic/js/arrow-parens": [2, "always"], "@stylistic/js/comma-spacing": 0, "@stylistic/js/jsx-quotes": [1, "prefer-single"], @@ -73,7 +89,7 @@ export default [ "@stylistic/js/no-multi-spaces": 0, "@stylistic/js/semi": [2, "always"], "@stylistic/js/space-infix-ops": 0, - "@stylistic/js/quotes": [2, "single", "avoid-escape"], + "@stylistic/js/quotes": [2, "single", {avoidEscape: true, allowTemplateLiterals: "avoidEscape"}], "react/jsx-boolean-value": [1, "always"], "react/jsx-no-duplicate-props": 1, "react/jsx-no-undef": 1, @@ -108,13 +124,13 @@ export default [ 'react-hooks/unsupported-syntax': 'warn', 'react-hooks/use-memo': 'warn', 'react-hooks/incompatible-library': 'warn', - "jsdoc/check-param-names": 2, + "jsdoc/check-param-names": 1, "jsdoc/check-tag-names": 0, "jsdoc/check-types": 0, "jsdoc/newline-after-description": 0, "jsdoc/require-description-complete-sentence": 0, "jsdoc/require-hyphen-before-param-description": 0, - "jsdoc/require-param": 2, + "jsdoc/require-param": 1, "jsdoc/require-param-description": 0, "jsdoc/require-param-type": 0, "jsdoc/require-returns-description": 0, diff --git a/package.json b/package.json index 09d312f366..6cf6eaed2b 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,7 @@ "@babel/preset-react": "^7.24.7", "@babel/register": "^7.24.6", "@eslint/compat": "^1.1.0", + "@eslint/js": "~9.38", "@stylistic/eslint-plugin-js": "~4.4", "@svgr/webpack": "^8.1.0", "@testing-library/dom": "^10", diff --git a/src/firefly/html/demo/non-ascii-text.csv b/src/firefly/html/demo/non-ascii-text.csv new file mode 100644 index 0000000000..ccb2086765 --- /dev/null +++ b/src/firefly/html/demo/non-ascii-text.csv @@ -0,0 +1,3 @@ +object,line,wavelength +Réseau,Hα,6563 +Ångström,[O III],5007 diff --git a/src/firefly/js/api/webApiCommands/SiaCommands.js b/src/firefly/js/api/webApiCommands/SiaCommands.js index e60dd39d12..b8769bd547 100644 --- a/src/firefly/js/api/webApiCommands/SiaCommands.js +++ b/src/firefly/js/api/webApiCommands/SiaCommands.js @@ -33,7 +33,7 @@ export const siaPanelOverview= { obsCoreWavelengthRangeType : 'Type of Wavelength search for Observations. `contains` or `overlaps`', obsCoreWavelengthContains : `Wavelength value (in ${wvlUnit}) when selecting \`obsCoreWavelengthRangeType=contains\``, obsCoreWavelengthMinRange : `Upper limit of an observation's wavelength coverage (in ${wvlUnit}). Requires \`obsCoreWavelengthRangeType=overlaps\``, - obsCoreWavelengthMaxRange : `Lower limit of an observation\'s wavelength coverage (in ${wvlUnit}). Requires \`obsCoreWavelengthRangeType=overlaps\``, + obsCoreWavelengthMaxRange : `Lower limit of an observation's wavelength coverage (in ${wvlUnit}). Requires \`obsCoreWavelengthRangeType=overlaps\``, [ReservedParams.POSITION.name]: ['coordinates of the search',...ReservedParams.POSITION.desc], [ReservedParams.SR.name]: ['radius of search (optional)',...ReservedParams.SR.desc], diff --git a/src/firefly/js/api/webApiCommands/TapCommands.js b/src/firefly/js/api/webApiCommands/TapCommands.js index 0261a7fb02..bf7f289bae 100644 --- a/src/firefly/js/api/webApiCommands/TapCommands.js +++ b/src/firefly/js/api/webApiCommands/TapCommands.js @@ -33,7 +33,7 @@ export const tapPanelOverview= { obsCoreWavelengthRangeType : 'Type of Wavelength search for Observations. `contains` or `overlaps`', obsCoreWavelengthContains : `Wavelength value (in ${wvlUnit}) when selecting \`obsCoreWavelengthRangeType=contains\``, obsCoreWavelengthMinRange : `Upper limit of an observation's wavelength coverage (in ${wvlUnit}). Requires \`obsCoreWavelengthRangeType=overlaps\``, - obsCoreWavelengthMaxRange : `Lower limit of an observation\'s wavelength coverage (in ${wvlUnit}). Requires \`obsCoreWavelengthRangeType=overlaps\``, + obsCoreWavelengthMaxRange : `Lower limit of an observation's wavelength coverage (in ${wvlUnit}). Requires \`obsCoreWavelengthRangeType=overlaps\``, [ReservedParams.POSITION.name]: ['coordinates of the search',...ReservedParams.POSITION.desc], [ReservedParams.SR.name]: ['radius of search (optional)',...ReservedParams.SR.desc], polygon: 'polygon as a list of ra dec strings, example: 269.3 68.2, 272.85 68.2, 272.7 66.7, 269.3 66.7', @@ -134,7 +134,7 @@ WHERE CONTAINS(POINT('ICRS', ra, dec),CIRCLE('ICRS', 83.63321237, 22.01446012, 0 service: 'https://irsa.ipac.caltech.edu/TAP', adql: `SELECT ra,dec,sigra,sigdec,sigradec,w1mpro,w1sigmpro,w1snr,w1rchi2,w1mpro_allwise,w1sigmpro_allwise,w4mpro_allwise,w4sigmpro_allwise \ -FROM neowiser_p1bs_psd WHERE CONTAINS(POINT('ICRS', ra, dec), CIRCLE(\'ICRS\', 10.68479, 41.26906, 0.013))=1`, +FROM neowiser_p1bs_psd WHERE CONTAINS(POINT('ICRS', ra, dec), CIRCLE('ICRS', 10.68479, 41.26906, 0.013))=1`, } }, { @@ -143,7 +143,7 @@ FROM neowiser_p1bs_psd WHERE CONTAINS(POINT('ICRS', ra, dec), CIRCLE(\'ICRS\', 1 service: 'https://irsa.ipac.caltech.edu/TAP', adql: `SELECT ra,dec,sigra,sigdec,sigradec,w2mpro,w2sigmpro,w2snr,w2rchi2,w2mpro_allwise,w2sigmpro_allwise,w3mpro_allwise,w3sigmpro_allwise \ -FROM neowiser_p1bs_psd WHERE CONTAINS(POINT('ICRS', ra, dec), CIRCLE(\'ICRS\', 10.68479, 41.26906, 0.013))=1`, +FROM neowiser_p1bs_psd WHERE CONTAINS(POINT('ICRS', ra, dec), CIRCLE('ICRS', 10.68479, 41.26906, 0.013))=1`, execute: 'true', } } diff --git a/src/firefly/js/astro/conv/__tests__/CoordConv-test.js b/src/firefly/js/astro/conv/__tests__/CoordConv-test.js index 7feaf422e9..33bd5c4e71 100644 --- a/src/firefly/js/astro/conv/__tests__/CoordConv-test.js +++ b/src/firefly/js/astro/conv/__tests__/CoordConv-test.js @@ -412,16 +412,16 @@ describe('A test suite for CoordConv.js', function () { 179.69493905911276 ]; const expectedLats =[ - -89.72157064600971 - -89.72157064600971 - -89.72157064600971 - -89.72157064600971 - -89.72157064600971 - -89.72157064600971 - -89.72157064600971 - -89.72157064600971 - -89.72157064600971 - -89.72157064600968 + -89.72157064600971, + -89.72157064600971, + -89.72157064600971, + -89.72157064600971, + -89.72157064600971, + -89.72157064600971, + -89.72157064600971, + -89.72157064600971, + -89.72157064600971, + -89.72157064600968, -89.7215706460096, -89.7215706460096, -89.7215706460096, @@ -456,7 +456,6 @@ describe('A test suite for CoordConv.js', function () { const inLat = -90;//-35.955853; - var lons = []; var lats = []; var ret; const tobs=1983.5; @@ -558,7 +557,6 @@ describe('A test suite for CoordConv.js', function () { const inLat = 0.0; - var lons = []; var lats = []; var ret; const tobs=1983.5; @@ -581,7 +579,7 @@ describe('A test suite for CoordConv.js', function () { }); - test('should be equal when convert from inCoord = EQUATORIAL_J,inEquirox=20000 , to outCoord=ECLIPTIC_B outEquinox=1950 lat=-90.0', function () { + test('should be equal when convert from inCoord = EQUATORIAL_J,inEquirox=20000 , to outCoord=EQUATORIAL_B outEquinox=1950 lat=90.0', function () { const expectedLons = [ 359.68340855555186, @@ -661,7 +659,6 @@ describe('A test suite for CoordConv.js', function () { const inLat =90.0; - var lons = []; var lats = []; var ret; const tobs=1983.5; @@ -684,19 +681,19 @@ describe('A test suite for CoordConv.js', function () { }); - test('should be equal when convert from inCoord = EQUATORIAL_J,inEquirox=20000 , to outCoord=EQUATORIAL_B outEquinox=1950 lat=90.0', function () { + test('should be equal when convert from inCoord = EQUATORIAL_J,inEquirox=20000 , to outCoord=ECLIPTIC_B outEquinox=1950 lat=-90.0', function () { const expectedLons = [ - 69.3002173418388, - 69.3002173418388, - 69.3002173418388, - 69.3002173418388, - 69.3002173418388, - 69.3002173418388, - 69.3002173418388, - 69.3002173418388, - 69.3002173418388, - 69.3002173418387, + 269.3002173418388, + 269.3002173418388, + 269.3002173418388, + 269.3002173418388, + 269.3002173418388, + 269.3002173418388, + 269.3002173418388, + 269.3002173418388, + 269.3002173418388, + 269.3002173418387, 269.3002173418387, 269.3002173418387, 269.3002173418387, @@ -762,9 +759,8 @@ describe('A test suite for CoordConv.js', function () { lons[i] = deltaLon*i; } - const inLat =90.0; + const inLat = -90.0; - var lons = []; // TODO: this line causes test to skip over all of the assert below.. no test were performed var lats = []; var ret; const tobs=1983.5; diff --git a/src/firefly/js/astro/net/Resolver.js b/src/firefly/js/astro/net/Resolver.js index 774ce6ce87..eb1dafc330 100644 --- a/src/firefly/js/astro/net/Resolver.js +++ b/src/firefly/js/astro/net/Resolver.js @@ -24,7 +24,7 @@ export var parseResolver= function(resolveStr) { if (!resolveStr) return undefined; var retval= null; for( var resolveType in Resolver) { - if( Resolver.hasOwnProperty( resolveType ) ) { + if( Object.prototype.hasOwnProperty.call( Resolver, resolveType ) ) { if (resolveStr.toLowerCase()===Resolver[resolveType].key) { retval= Resolver[resolveType]; break; diff --git a/src/firefly/js/charts/ChartUtil.js b/src/firefly/js/charts/ChartUtil.js index 28a25485f4..e651dff326 100644 --- a/src/firefly/js/charts/ChartUtil.js +++ b/src/firefly/js/charts/ChartUtil.js @@ -727,7 +727,7 @@ export function getDataChangesForMappings({tableModel, mappings, traceNum}) { let getDataVal; const changes = {}; - changes[`fireflyData.${traceNum}.isLoading`] = !Boolean(tableModel); + changes[`fireflyData.${traceNum}.isLoading`] = !tableModel; if (tableModel) { const cols = tableModel.tableData.columns.map((c) => c.name); const transposed = tableModel.tableData.columns.map(() => []); diff --git a/src/firefly/js/charts/ChartsCntlr.js b/src/firefly/js/charts/ChartsCntlr.js index a1a7624c7f..79453e288e 100644 --- a/src/firefly/js/charts/ChartsCntlr.js +++ b/src/firefly/js/charts/ChartsCntlr.js @@ -360,7 +360,7 @@ function chartUpdate(action) { return (dispatch) => { const {chartId, changes, replaceTableSources=false} = action.payload; // when selection is undefined, selections layer must be removed - if (changes.hasOwnProperty('selection') && !changes.selection) changes['layout.selections'] = []; + if (Object.prototype.hasOwnProperty.call(changes, 'selection') && !changes.selection) changes['layout.selections'] = []; // remove any table's mappings from changes because it will be applied by the connectors. const changesWithoutTblMappings = omitBy(changes, (v) => isString(v) && v.match(TBL_SRC_PATTERN)); set(action, 'payload.changes', changesWithoutTblMappings); diff --git a/src/firefly/js/charts/ui/ChartsContainer.jsx b/src/firefly/js/charts/ui/ChartsContainer.jsx index 18a06aef99..b8819260db 100644 --- a/src/firefly/js/charts/ui/ChartsContainer.jsx +++ b/src/firefly/js/charts/ui/ChartsContainer.jsx @@ -176,7 +176,7 @@ export const ActiveChartsPanel = (props) => { chartId, tbl_group, toolbarVariant, - showToolbar: !Boolean(noChartToolbar), + showToolbar: !noChartToolbar, }}/> ); } diff --git a/src/firefly/js/charts/ui/MultiChartViewer.jsx b/src/firefly/js/charts/ui/MultiChartViewer.jsx index 48443c710f..a5ce8b2f7d 100644 --- a/src/firefly/js/charts/ui/MultiChartViewer.jsx +++ b/src/firefly/js/charts/ui/MultiChartViewer.jsx @@ -151,7 +151,7 @@ export class MultiChartViewer extends PureComponent { //console.log('Active chart ID: '+activeItemId); const ToolBar = expandedMode ? MultiChartToolbarExpanded : MultiChartToolbarStandard; - const showChartToolbar = !Boolean(noChartToolbar); + const showChartToolbar = !noChartToolbar; const borderSettings= useBorder ? {border: '1px solid', borderColor: 'divider', borderRadius: '5px'} : {}; diff --git a/src/firefly/js/charts/ui/PlotlyWrapper.jsx b/src/firefly/js/charts/ui/PlotlyWrapper.jsx index 09cf956cec..bdd44e280a 100644 --- a/src/firefly/js/charts/ui/PlotlyWrapper.jsx +++ b/src/firefly/js/charts/ui/PlotlyWrapper.jsx @@ -48,7 +48,7 @@ function deltas(a, b, wrapArray=true) { const doDiff = (a2, b2, r, wrapArray) => { forEach(a2, function(v, k) { // already checked this or equal or original has no value... - if (b2 && (r.hasOwnProperty(k) || shallowequal(b2[k], v))) return; + if (b2 && (Object.prototype.hasOwnProperty.call(r, k) || shallowequal(b2[k], v))) return; // but what if it returns an empty object? still attach? r[k] = b2 && isPlainObject(v) ? diff(v, b2[k], wrapArray) : v; if (wrapArray && Array.isArray(r[k])) { diff --git a/src/firefly/js/core/AppDataCntlr.js b/src/firefly/js/core/AppDataCntlr.js index 4af1814025..b599fcdeb1 100644 --- a/src/firefly/js/core/AppDataCntlr.js +++ b/src/firefly/js/core/AppDataCntlr.js @@ -160,7 +160,7 @@ export function dispatchConnectionStatus({lost, reason}) { export function dispatchNotifyRemoteAppReady() { const channel= getWsChannel(); if (!channel) return; - const [, sourceChannel, app] = channel.match(channel_matcher) || [,channel]; + const [, sourceChannel, app] = channel.match(channel_matcher) || [undefined, channel]; dispatchRemoteAction(sourceChannel,{ type : NOTIFY_REMOTE_APP_READY, payload: {ready:true, viewerChannel:channel}}); } diff --git a/src/firefly/js/core/background/BackgroundCntlr.js b/src/firefly/js/core/background/BackgroundCntlr.js index b5998b103c..2ebe55832f 100644 --- a/src/firefly/js/core/background/BackgroundCntlr.js +++ b/src/firefly/js/core/background/BackgroundCntlr.js @@ -247,7 +247,6 @@ function reducer(state={}, action={}) { nstate = TblUtil.smartMerge(nstate, updates); } return nstate; - break; case BG_LOAD_JOBS: { const {jobs, overflow} = action.payload; let nstate = state; @@ -256,14 +255,12 @@ function reducer(state={}, action={}) { nstate = updateObject(nstate, updates); } return nstate; - break; } case BG_SET_INFO : { const {email, notifEnabled} = action.payload; let nstate = updateSet(state, 'email', email); nstate = updateSet(nstate, 'notifEnabled', notifEnabled); return nstate; - break; } default: return state; diff --git a/src/firefly/js/drawingLayers/Artifact.js b/src/firefly/js/drawingLayers/Artifact.js index c810fbd41b..36601967b4 100644 --- a/src/firefly/js/drawingLayers/Artifact.js +++ b/src/firefly/js/drawingLayers/Artifact.js @@ -165,7 +165,6 @@ function getLayerChanges(drawLayer, action) { const {tableModel}= action.payload.changes; return tableModel ? Object.assign({tableModel}, createDrawData(drawLayer, tableModel)) : {tableModel:null, drawData: null}; - break; case ATTACH_LAYER_TO_PLOT: case CHANGE_VISIBILITY: diff --git a/src/firefly/js/drawingLayers/ComputeWebGridData.js b/src/firefly/js/drawingLayers/ComputeWebGridData.js index e7e4047ecc..3339b4ce0f 100644 --- a/src/firefly/js/drawingLayers/ComputeWebGridData.js +++ b/src/firefly/js/drawingLayers/ComputeWebGridData.js @@ -133,20 +133,20 @@ function getRangeFromFourSides(plot, csys, cc){ var wLen, hLen; wLen = width/det; hLen = height/det; - for (var i=0; i 360?tx-360:tx; tx=tx<0?tx+360:tx; @@ -1367,7 +1367,7 @@ function getLevels(ranges,factor, maxLines){ levels[i]=[]; } else if ( Math.abs(min - (-90.0)) < 0.1 && Math.abs(max - 90.0) <0.1){ //include both poles - levels[i]= [-75.,-60., -45., -30., -15., 0.,
15., 30., 45., 60., 75.]; + levels[i]= [-75.,-60., -45., -30., -15., 0., 15., 30., 45., 60., 75.]; } else { /* LZ DM-10491: introduced this simple algorithm to calculate the intervals. The previous one diff --git a/src/firefly/js/drawingLayers/FootprintTool.js b/src/firefly/js/drawingLayers/FootprintTool.js index 32fb577a10..ae7c10cb4c 100644 --- a/src/firefly/js/drawingLayers/FootprintTool.js +++ b/src/firefly/js/drawingLayers/FootprintTool.js @@ -20,7 +20,7 @@ import { } from './MarkerTool.js'; import {getFootprintToolUIComponent} from './FootprintToolUI.jsx'; import ShapeDataObj from '../visualize/draw/ShapeDataObj.js'; -import {clone} from '../util/WebUtil.js' +import {clone} from '../util/WebUtil.js'; import {getDS9Region} from '../rpc/PlotServicesJson.js'; import {FootprintFactory} from '../visualize/draw/FootprintFactory.js'; import {makeImagePt} from '../visualize/Point.js'; diff --git a/src/firefly/js/drawingLayers/SearchTarget.js b/src/firefly/js/drawingLayers/SearchTarget.js index a471945931..b2089d250c 100644 --- a/src/firefly/js/drawingLayers/SearchTarget.js +++ b/src/firefly/js/drawingLayers/SearchTarget.js @@ -52,7 +52,7 @@ function creator(initPayload, presetDefaults) { destroyWhenAllDetached: true, canUserChangeColor: ColorChangeType.DYNAMIC, canUserDelete, - allocatedColor: !Boolean(color), + allocatedColor: !color, }; return DrawLayer.makeDrawLayer(drawLayerId || `${ID}-${idCnt}`,TYPE_ID, {}, options, drawingDef, [RECENTER, UPDATE_SEARCH_TARGET]); } diff --git a/src/firefly/js/fieldGroup/FieldGroupUtils.js b/src/firefly/js/fieldGroup/FieldGroupUtils.js index 65da818b99..31207592fd 100644 --- a/src/firefly/js/fieldGroup/FieldGroupUtils.js +++ b/src/firefly/js/fieldGroup/FieldGroupUtils.js @@ -39,7 +39,7 @@ function validateSingle(groupKey, includeUnmounted) { const newValue= fields[key].value(); if (typeof newValue=== 'object' && // check to see if return is an object that includes {value: any} and not a promise !newValue.then && - newValue.hasOwnProperty('value') ) { + Object.prototype.hasOwnProperty.call(newValue, 'value') ) { dispatchValueChange({valid:true,fieldKey:key,groupKey,...newValue}); } else { diff --git a/src/firefly/js/metaConvert/DataProductsWatcher.js b/src/firefly/js/metaConvert/DataProductsWatcher.js index de9cc61780..e80ee42004 100644 --- a/src/firefly/js/metaConvert/DataProductsWatcher.js +++ b/src/firefly/js/metaConvert/DataProductsWatcher.js @@ -81,7 +81,7 @@ function watchDataProductsTable(tbl_id, action, cancelSelf, params) { const dpView= getViewer(mvRoot, dataTypeViewerId); if (!action) { - if (paused) paused= !Boolean(imView || dpView); + if (paused) paused= !(imView || dpView); if (!paused && getActiveTableId()===tbl_id) { updateDataProducts(factoryKey, null, firstTime, tbl_id, activateParams); firstTime= false; diff --git a/src/firefly/js/tables/TableUtil.js b/src/firefly/js/tables/TableUtil.js index ef906abd78..80935c4bac 100644 --- a/src/firefly/js/tables/TableUtil.js +++ b/src/firefly/js/tables/TableUtil.js @@ -1056,7 +1056,8 @@ export function tableToIpac(tableModel) { ' ' + columns.map((c, idx) => padEnd(formatValue(c, row[idx]), colWidths[idx]) - .replace(/[^\x1F-\x7F]/g, '\xBF')).join(' ') + // replace non-printable chars with (191 in LATIN-1) inverted '?'. same logic as DataType.format() + // eslint-disable-next-line no-control-regex + .replace(/[\x00-\x1F\x7F]/g, '\xBF')).join(' ') + // replace non-printable chars with (191 in LATIN-1) inverted '?'. same logic as DataType.format() ' ').join('\n'); return [meta, '\\', head, dataStr].join('\n'); @@ -1079,7 +1080,8 @@ export function tableTextView(columns, dataAry, tableMeta) { ' ' + cols.map(([c, idx]) => padEnd(formatValue(c, row[idx]), colWidths[idx]) - .replace(/[^\x1F-\x7F]/g, '\xBF')).join(' ') + // replace non-printable chars with (191 in LATIN-1) inverted '?'. same logic as DataType.format() + // eslint-disable-next-line no-control-regex + .replace(/[\x00-\x1F\x7F]/g, '\xBF')).join(' ') + // replace non-printable chars with (191 in LATIN-1) inverted '?'. same logic as DataType.format() ' ').join('\n'); return [meta, head, dataStr].filter((c) => c).join('\n'); diff --git a/src/firefly/js/tables/__tests__/FilterInfo-test.js b/src/firefly/js/tables/__tests__/FilterInfo-test.js index 1043f58712..7b3f538294 100644 --- a/src/firefly/js/tables/__tests__/FilterInfo-test.js +++ b/src/firefly/js/tables/__tests__/FilterInfo-test.js @@ -17,7 +17,7 @@ describe('FilterInfo', () => { } }; - TblUtil.getTblById = jest.fn().mockReturnValue(aStringColumn); // mock getTblById to return the aStringColumn table + jest.spyOn(TblUtil, 'getTblById').mockReturnValue(aStringColumn); // mock getTblById to return the aStringColumn table let actual = FilterInfo.conditionValidator('=abc', 'a_fake_tbl_id', 'desc'); expect(actual.valid).toBe(true); @@ -36,7 +36,7 @@ describe('FilterInfo', () => { } }; - TblUtil.getTblById = jest.fn().mockReturnValue(aNumericColumn); // once again mock getTblById to return the different (numeric) table + jest.spyOn(TblUtil, 'getTblById').mockReturnValue(aNumericColumn); // once again mock getTblById to return the different (numeric) table const {valid, value} = FilterInfo.conditionValidator('>1.23', 'a_fake_tbl_id', 'ra'); expect(valid).toBe(true); diff --git a/src/firefly/js/tables/__tests__/TableUtil-test.js b/src/firefly/js/tables/__tests__/TableUtil-test.js index 4a7ebd5963..60e0c3f273 100644 --- a/src/firefly/js/tables/__tests__/TableUtil-test.js +++ b/src/firefly/js/tables/__tests__/TableUtil-test.js @@ -355,7 +355,7 @@ describe('TableUtil: datarights', () => { ], } }; - TblUtil.getTblById = jest.fn().mockReturnValue(table); + jest.spyOn(TblUtil, 'getTblById').mockReturnValue(table); const dataRoot = dataReducer({data:{id123: table}}, {type: TABLE_LOADED, payload: table}); const otable = get(dataRoot, 'id123'); @@ -378,7 +378,7 @@ describe('TableUtil: datarights', () => { ], } }; - TblUtil.getTblById = jest.fn().mockReturnValue(table); + jest.spyOn(TblUtil, 'getTblById').mockReturnValue(table); const dataRoot = dataReducer({data:{id123: table}}, {type: TABLE_LOADED, payload: table}); const otable = get(dataRoot, 'id123'); @@ -401,7 +401,7 @@ describe('TableUtil: datarights', () => { ], } }; - TblUtil.getTblById = jest.fn().mockReturnValue(table); + jest.spyOn(TblUtil, 'getTblById').mockReturnValue(table); const dataRoot = dataReducer({data:{id123: table}}, {type: TABLE_LOADED, payload: table}); const otable = get(dataRoot, 'id123'); diff --git a/src/firefly/js/tables/reducer/TableDataReducer.js b/src/firefly/js/tables/reducer/TableDataReducer.js index e338dbcc02..fc584464ea 100644 --- a/src/firefly/js/tables/reducer/TableDataReducer.js +++ b/src/firefly/js/tables/reducer/TableDataReducer.js @@ -175,7 +175,7 @@ function fixStatus(root, tbl_id) { if (code && (code < 200 || code >= 400)) { if (!table.error) { // if there error status but no error in tableModel, add error for backward compatibility. const {message:error, cause} = parseError(message); - return updateSet(root, [tbl_id, 'error'], new Error(error, {cause}) || 'Unable to load table.'); + return updateSet(root, [tbl_id, 'error'], new Error(error, {cause})); } } } else { @@ -189,6 +189,6 @@ function fixStatus(root, tbl_id) { function parseStatus(error) { if (!error) return {code:200, message: ''}; - const [,code=500,message=error] = error.trim?.().match(/^(\d{3})\W+(.*)/) || [,,]; + const [,code=500,message=error] = error.trim?.().match(/^(\d{3})\W+(.*)/) || []; return {code, message}; } diff --git a/src/firefly/js/tables/ui/BasicTableView.jsx b/src/firefly/js/tables/ui/BasicTableView.jsx index 30cca40fad..e6f165445d 100644 --- a/src/firefly/js/tables/ui/BasicTableView.jsx +++ b/src/firefly/js/tables/ui/BasicTableView.jsx @@ -454,7 +454,7 @@ function makeColumnTag(props, col, idx) { tbl_id, renderers, startIdx, cellRenderers} = props; if (col.visibility && col.visibility !== 'show') return false; - const HeadRenderer = get(renderers, [col.name, 'headRenderer'], showHeader ? HeaderCell : ({})=>null); + const HeadRenderer = get(renderers, [col.name, 'headRenderer'], showHeader ? HeaderCell : ()=>null); const CellRenderer = renderers?.[col.name]?.cellRenderer || cellRenderers?.[idx]; const fixed = col.fixed || false; const {resizable=true} = col; diff --git a/src/firefly/js/tables/ui/TableRenderer.js b/src/firefly/js/tables/ui/TableRenderer.js index 8b67132172..d20549fa65 100644 --- a/src/firefly/js/tables/ui/TableRenderer.js +++ b/src/firefly/js/tables/ui/TableRenderer.js @@ -330,7 +330,7 @@ export function makeDefaultRenderer(col={}) { let renderer = (col.type === 'location' || !isEmpty(col.links)) ? LinkCell : TextCell; renderer.allowActions = true; if (col.cellRenderer) { - const [name='', propsStr] = col.cellRenderer?.split('::'); + const [name='', propsStr] = col.cellRenderer.split('::'); const XRef = RendererXRef[name.trim()]; if (XRef) { const XRefProps = getPropsFromStr(propsStr.trim()); diff --git a/src/firefly/js/templates/fireflyviewer/LandingPage.jsx b/src/firefly/js/templates/fireflyviewer/LandingPage.jsx index eb13d7e1e4..474da1ef37 100644 --- a/src/firefly/js/templates/fireflyviewer/LandingPage.jsx +++ b/src/firefly/js/templates/fireflyviewer/LandingPage.jsx @@ -112,7 +112,7 @@ function EmptyResults({icon, text, subtext, summaryText, actionItems, slotProps} return ( - + {icon} diff --git a/src/firefly/js/templates/lightcurve/LcResult.jsx b/src/firefly/js/templates/lightcurve/LcResult.jsx index 1b6dd27b23..7edba7cc4c 100644 --- a/src/firefly/js/templates/lightcurve/LcResult.jsx +++ b/src/firefly/js/templates/lightcurve/LcResult.jsx @@ -122,7 +122,7 @@ export class LcResult extends PureComponent { } export function defaultDownloadPanel(mission='', cutoutSize, addtlParams={}) { - mission = mission.replace(/[\/ ]/g, '_'); // clean up mission description to be used for save as value. + mission = mission.replace(/[/ ]/g, '_'); // clean up mission description to be used for save as value. return ( { diff --git a/src/firefly/js/templates/lightcurve/generic/errorMsg.js b/src/firefly/js/templates/lightcurve/generic/errorMsg.js index 7f11f72d6c..1426d2a952 100644 --- a/src/firefly/js/templates/lightcurve/generic/errorMsg.js +++ b/src/firefly/js/templates/lightcurve/generic/errorMsg.js @@ -1,3 +1,3 @@ export const ERROR_MSG_KEY = { IMAGE_FETCH: 'imageFetchedError' -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/firefly/js/ui/PositionFieldDef.js b/src/firefly/js/ui/PositionFieldDef.js index 27e973a61e..a9026be956 100644 --- a/src/firefly/js/ui/PositionFieldDef.js +++ b/src/firefly/js/ui/PositionFieldDef.js @@ -119,7 +119,7 @@ export function formatPosForHelp(wp) { } } else { - s = `
+ s = `
${lonStr}, ${latStr}  ${csys}
`; s += getEQJ2000(wp); } diff --git a/src/firefly/js/ui/TargetFeedback.jsx b/src/firefly/js/ui/TargetFeedback.jsx index 9c12a9025e..0ab15ac813 100644 --- a/src/firefly/js/ui/TargetFeedback.jsx +++ b/src/firefly/js/ui/TargetFeedback.jsx @@ -30,7 +30,7 @@ function formatExample(row, fieldKey, setFld) { } })} - ) + ); } diff --git a/src/firefly/js/ui/UploadTableChooser.js b/src/firefly/js/ui/UploadTableChooser.js index 52de1de44e..c27eac1c54 100644 --- a/src/firefly/js/ui/UploadTableChooser.js +++ b/src/firefly/js/ui/UploadTableChooser.js @@ -12,7 +12,7 @@ import {TABLES} from './FileUploadUtil.js'; import {FieldGroupTabs, Tab} from './panel/TabPanel.jsx'; import {LayoutType, PopupPanel} from './PopupPanel.jsx'; import {showInfoPopup} from './PopupUtil.jsx'; -import {getTableGroup, getTableUiByTblId, getTblById} from 'firefly/tables/TableUtil'; +import {getColumns, getTableGroup, getTableUiByTblId, getTblById} from 'firefly/tables/TableUtil'; import {TablePanel} from 'firefly/tables/ui/TablePanel'; import {FormPanel} from 'firefly/ui/FormPanel'; import {ServerParams} from 'firefly/data/ServerParams'; @@ -223,7 +223,7 @@ const LoadedTables= (props) => { if (!tbl.tableData) continue; //ToFix: converted row and col to string because searching their columns as number gives an error const title = [tables[tblId].title, - (tbl.tableData.columns?.filter( (c) => c.visibility!=='hidden').length).toString(), + getColumns(tbl).length.toString(), (tbl.totalRows).toString(), tblId]; data.push(title); } diff --git a/src/firefly/js/ui/dynamic/DLGenAnalyzeSearch.js b/src/firefly/js/ui/dynamic/DLGenAnalyzeSearch.js index af65bb37bd..f30f804692 100644 --- a/src/firefly/js/ui/dynamic/DLGenAnalyzeSearch.js +++ b/src/firefly/js/ui/dynamic/DLGenAnalyzeSearch.js @@ -224,7 +224,7 @@ export function supportsUpload(qAna, standardID, useConcurrent= false) { const hasUpload= getCisxUIValue(qAna,'IRSA_SIA_upload_extension') && isSIAStandardID(standardID); if (!hasUpload) return false; if (!useConcurrent) return true; - return !Boolean(qAna.concurrentSearchDef?.length); + return !qAna.concurrentSearchDef?.length; } diff --git a/src/firefly/js/ui/dynamic/DynComponents.jsx b/src/firefly/js/ui/dynamic/DynComponents.jsx index feac904b6a..85fd5209fa 100644 --- a/src/firefly/js/ui/dynamic/DynComponents.jsx +++ b/src/firefly/js/ui/dynamic/DynComponents.jsx @@ -142,7 +142,7 @@ export function isSimpleTargetPanel(fieldDefAry) { if (sizeKey && manageAllSpacial && targetDetails?.hipsUrl) { return false; } - return !Boolean(targetDetails?.hipsUrl); + return !targetDetails?.hipsUrl; } diff --git a/src/firefly/js/ui/tap/AdvancedADQL.jsx b/src/firefly/js/ui/tap/AdvancedADQL.jsx index bc3d1e9c15..8fb4e3c97f 100644 --- a/src/firefly/js/ui/tap/AdvancedADQL.jsx +++ b/src/firefly/js/ui/tap/AdvancedADQL.jsx @@ -451,7 +451,7 @@ export function AdvancedADQL({adqlKey, defAdqlKey, serviceUrl, capabilities, sty POLYGON('', POINT1, POINT2, POINT3...) DISTANCE(POINT1, POINT2) CONTAINS(REGION1, REGION2) - INTERSECTS(REGION1, REGION2)`).replace(/ +/g, '') + INTERSECTS(REGION1, REGION2)`).replace(/ {4,}/g, '') } diff --git a/src/firefly/js/ui/tap/ColumnConstraintsPanel.jsx b/src/firefly/js/ui/tap/ColumnConstraintsPanel.jsx index 524e71cd42..a59dc8ec6d 100644 --- a/src/firefly/js/ui/tap/ColumnConstraintsPanel.jsx +++ b/src/firefly/js/ui/tap/ColumnConstraintsPanel.jsx @@ -63,7 +63,7 @@ function validSingleCondition(s) { if (sUp.startsWith('IN')) return sUp.match(/^IN\s*\(.*\)$/); if (startsWithAny(sUp,['=','>','<',])) return validParam(sUp.substr(1)); if (startsWithAny(sUp,['!=','>=','<='])) return validParam(sUp.substr(2)); - return !Boolean(sUp.match(/( [A-Za-z]\S* )/)); + return !sUp.match(/( [A-Za-z]\S* )/); } function validParam(param) { diff --git a/src/firefly/js/ui/tap/Cutout.js b/src/firefly/js/ui/tap/Cutout.js index df522865e6..5445493131 100644 --- a/src/firefly/js/ui/tap/Cutout.js +++ b/src/firefly/js/ui/tap/Cutout.js @@ -150,7 +150,7 @@ export function getCutoutTargetType(dataProductsComponentKey=DEFAULT_DATA_PRODUC if (typeFromOptions === ROW_POSITION && canDoRow) return ROW_POSITION; // compute fallback from the default based on if a search target exist - if (canDoRow) return Boolean(getSearchTargetFromTable(tbl_id)) ? SEARCH_POSITION : ROW_POSITION; + if (canDoRow) return getSearchTargetFromTable(tbl_id) ? SEARCH_POSITION : ROW_POSITION; // fallback to SEARCH_POSITION return SEARCH_POSITION; diff --git a/src/firefly/js/ui/tap/TapViewType.jsx b/src/firefly/js/ui/tap/TapViewType.jsx index a64a970412..46ec5ae819 100644 --- a/src/firefly/js/ui/tap/TapViewType.jsx +++ b/src/firefly/js/ui/tap/TapViewType.jsx @@ -187,7 +187,7 @@ function BasicUI(props) { setTableName(lockedTableName); } else { - const [schema, table] = obsCoreTableModel?.tableData?.data[0]; + const [schema, table] = obsCoreTableModel.tableData.data[0]; setSchemaName(schema); setTableName(table); } @@ -306,7 +306,7 @@ function BasicUI(props) { }; const loadObsCoreMeta = (serviceUrl, obsCoreTableModel) => { - const [, obsCoreTable] = obsCoreTableModel?.tableData?.data?.[0]; + const [, obsCoreTable] = obsCoreTableModel?.tableData?.data?.[0] ?? []; const serviceId= getServiceId(serviceUrl); const supportsObsCoreMetadataLoad = getDataServiceOption('enableMetadataLoad', serviceId, false); diff --git a/src/firefly/js/ui/tap/TemporalSearch.jsx b/src/firefly/js/ui/tap/TemporalSearch.jsx index 45402ca9b4..50f26b2b52 100644 --- a/src/firefly/js/ui/tap/TemporalSearch.jsx +++ b/src/firefly/js/ui/tap/TemporalSearch.jsx @@ -143,7 +143,7 @@ export function TemporalSearch({cols, columnsModel, tableName}) { if (existingTimeCol) timeColExists = cols.some((c) => c.name === existingTimeCol); if (!timeColExists) existingTimeCol = findTimeCol; setVal(TemporalColumns, existingTimeCol, {validator: getColValidator(cols, true, false, errMsg), valid: true}); - if (Boolean(findTimeCol)) checkHeaderCtl.setPanelOpen(true); + if (findTimeCol) checkHeaderCtl.setPanelOpen(true); }, [columnsModel]); diff --git a/src/firefly/js/util/BrowserInfo.js b/src/firefly/js/util/BrowserInfo.js index dec6aa0324..1a39f2e565 100644 --- a/src/firefly/js/util/BrowserInfo.js +++ b/src/firefly/js/util/BrowserInfo.js @@ -198,7 +198,7 @@ function parseVersion(ua,key,browser) { let idx= ua.indexOf(key); if (idx!==-1) idx+= key.length; const ver= ua.substring(idx).match(/[0-9.]+/)?.[0]; - const sAry= ver?.split('\.') ?? []; + const sAry= ver?.split('.') ?? []; return { browser, majorVersion: !isNaN(Number(sAry[0])) ? parseInt(sAry[0]) : UNKNOWN_VER, diff --git a/src/firefly/js/util/expr/Expression.js b/src/firefly/js/util/expr/Expression.js index 916b1e0cb4..def5abcf3d 100644 --- a/src/firefly/js/util/expr/Expression.js +++ b/src/firefly/js/util/expr/Expression.js @@ -22,7 +22,7 @@ export class Expression { allowedVariables.forEach((v)=>{ parser.allow(makeVariable(v)); // also allow quoted variables - if (!v.startsWith('\"')) { + if (!v.startsWith('"')) { parser.allow(makeVariable(`"${v}"`)); } }); diff --git a/src/firefly/js/util/expr/__test__/Expression-test.js b/src/firefly/js/util/expr/__test__/Expression-test.js deleted file mode 100644 index 430d1f686f..0000000000 --- a/src/firefly/js/util/expr/__test__/Expression-test.js +++ /dev/null @@ -1,123 +0,0 @@ -/*eslint-env node, mocha */ - -// to run: from firefly/src/firefly -// node ../../node_modules/mocha/bin/mocha js/util/expr/__test__/*test.js --compilers js:babel-core/register --requires ignore-styles - - -import {expect} from 'chai'; -//import {assert} from 'chai'; - -import {Expression} from '../Expression.js'; - -describe('A test suite for expr/Expression.js', function () { - - - /* run once before testing */ - before(() => { - - - } - ); - /* run once testing is done */ - after(() => { - } - ); - - /* run before every test-case*/ - beforeEach(() => { - } - ); - /* run after every test-case*/ - afterEach(function () { - - } - ); - - /* Valid operators: * / + - ^ < > = , ( ) - * Supported functions: - * abs, acos, asin, atan, - * ceil, cos, exp, floor, - * lg, ln, round, sin, sqrt, - * tan, atan2, max, min - * Supported conditional if(condition, then, alternative) - * Supported constants: pi - */ - it('valid expression (functions)', function () { - var x,y; - - for (x=-1; x<=1; x+=0.2) { - const utests = [ - {e: 'abs(x)', r: Math.abs(x)}, - {e: 'acos(x)', r: Math.acos(x)}, - {e: 'asin(x)', r: Math.asin(x)}, - {e: 'atan(x)', r: Math.atan(x)}, - {e: 'ceil(x)', r: Math.ceil(x)}, - {e: 'cos(x)', r: Math.cos(x)}, - {e: 'exp(x)', r: Math.exp(x)}, - {e: 'floor(x)', r: Math.floor(x)}, - {e: 'lg(x)', r: Math.log10(x)}, - {e: 'log10(x)', r: Math.log10(x)}, - {e: 'log(x)', r: Math.log(x)}, - {e: 'ln(x)', r: Math.log(x)}, - {e: 'round(x)', r: Math.round(x)}, - {e: 'sin(x)', r: Math.sin(x)}, - {e: 'sqrt(x)', r: Math.sqrt(x)}, - {e: 'tan(x)', r: Math.tan(x)} - ]; - utests.forEach((t)=> { - //console.log(`${t.e} with ${x}`); - const e = new Expression(t.e, ['x']); - expect(e.isValid()).to.be.true; - expect(!e.getError()).to.be.true; - e.setVariableValue('x', x); - const r = e.getValue(); - !(Number.isNaN(r)&&Number.isNaN(t.r)) && expect(r).to.be.equal(t.r); - }); - } - - for (x=-2; x<=2; x+=0.5) { - for (y=-2; y<=2; y+=0.5) { - const btests = [ - {e: 'min(x,y)', r: Math.min(x,y)}, - {e: 'max(x,y)', r: Math.max(x,y)}, - {e: 'atan2(x,y)', r: Math.atan2(x,y)}, - {e: 'if(x>y,x,y)', r: (x>y?x:y)} - ]; - btests.forEach((t)=> { - //console.log(`${t.e} with ${x} and ${y}`); - const e = new Expression(t.e, ['x', 'y']); - expect(e.isValid()).to.be.true; - expect(!e.getError()).to.be.true; - e.setVariableValue('x', x); - e.setVariableValue('y', y); - const r = e.getValue(); - !(Number.isNaN(r)&&Number.isNaN(t.r)) && expect(r).to.be.equal(t.r); - }); - } - } - }); - - - it('valid expression (operators)', function () { - const x= 0.5, y=-2.2; - const expressionGood = new Expression('2*(sin(pi()-acos(x))+abs(y)^3)/x', ['x','y']); - expect(expressionGood.isValid()).to.be.true; - expect(!expressionGood.getError()).to.be.true; - expressionGood.setVariableValue('x', x); - expressionGood.setVariableValue('y', y); - expect(expressionGood.getValue()).to.be.equal(2*(Math.sin(Math.PI-Math.acos(x))+Math.pow(Math.abs(y),3))/x); - }); - - - - it('invalid expression', function () { - const expressionBad = new Expression('2*sin(x)+y/z', ['x','y']); - expect(expressionBad.isValid()).to.be.false; - const se = expressionBad.getError(); - expect(se).property('error'); - expect(se).property('details'); - expect(se).property('where'); - expect(se).property('why'); - console.log(se); - }); -}); diff --git a/src/firefly/js/visualize/HiPSMocUtil.js b/src/firefly/js/visualize/HiPSMocUtil.js index f65b0e4766..f64ba1e670 100644 --- a/src/firefly/js/visualize/HiPSMocUtil.js +++ b/src/firefly/js/visualize/HiPSMocUtil.js @@ -85,7 +85,7 @@ function doHeadersMatchMOCv2(entries, doTableValidation= true) { && entries.TTYPE1); if (doTableValidation) { - valid &&= entries.TFIELDS='1' && ['J','1J','K','1K'].includes(entries.TFORM1); + valid &&= entries.TFIELDS === '1' && ['J','1J','K','1K'].includes(entries.TFORM1); } const mocRetVal= valid && { uniqColName: entries.TTYPE1, mocOrder: entries.MOCORD_S+'' }; return {valid, [MOCInfo]: mocRetVal}; diff --git a/src/firefly/js/visualize/PlotViewUtil.js b/src/firefly/js/visualize/PlotViewUtil.js index c6ccf82b6c..6ff9fd0494 100644 --- a/src/firefly/js/visualize/PlotViewUtil.js +++ b/src/firefly/js/visualize/PlotViewUtil.js @@ -953,7 +953,7 @@ export function convertImageIdxToHDU(pv, imageIdx) { export const hasWLInfo= (plot) => Boolean(plot?.wlData?.hasPlainOnlyCoordInfo || plot?.wlData?.hasPixelLevelCoordInfo ); -export const wavelengthInfoParsedSuccessfully= (plot) => !Boolean(plot?.wlData?.failReason); +export const wavelengthInfoParsedSuccessfully= (plot) => !plot?.wlData?.failReason; export const getWavelengthParseFailReason= (plot) => plot?.wlData?.failReason; diff --git a/src/firefly/js/visualize/WebPlotRequest.js b/src/firefly/js/visualize/WebPlotRequest.js index f7ef8286d5..40571fef00 100644 --- a/src/firefly/js/visualize/WebPlotRequest.js +++ b/src/firefly/js/visualize/WebPlotRequest.js @@ -934,7 +934,7 @@ function cleanupObj(r) { * @return {String[]} an array of invalid keys */ export function findInvalidWPRKeys(r) { - return [...Object.keys(r),...plotAttKeys].filter( (k) => !Boolean(allKeys.get(k))); + return [...Object.keys(r),...plotAttKeys].filter( (k) => !allKeys.get(k)); } /** diff --git a/src/firefly/js/visualize/__tests__/HiPSMocUtil-test.js b/src/firefly/js/visualize/__tests__/HiPSMocUtil-test.js new file mode 100644 index 0000000000..ee90a3e3ed --- /dev/null +++ b/src/firefly/js/visualize/__tests__/HiPSMocUtil-test.js @@ -0,0 +1,30 @@ +import {isMOCFitsFromUploadAnalsysis} from '../HiPSMocUtil.js'; + + +describe('HiPSMocUtil', () => { + // upload analysis report of a MOC v2 FITS file; header rows are [#, key, value, comment] + const mocV2Report = (tfields) => ({ + dataTypes: 'HeaderOnly,Table', + parts: [ + {type: 'HeaderOnly'}, + {type: 'Table', details: {tableData: {data: [ + ['0', 'MOCVERS', '2.0', ''], + ['1', 'MOCDIM', 'SPACE', ''], + ['2', 'ORDERING', 'NUNIQ', ''], + ['3', 'COORDSYS', 'C', ''], + ['4', 'MOCORD_S', '10', ''], + ['5', 'TFIELDS', tfields, ''], + ['6', 'TTYPE1', 'UNIQ', ''], + ['7', 'TFORM1', 'K', ''], + ]}}}, + ], + }); + + test('isMOCFitsFromUploadAnalsysis accepts a MOC v2 table with one column', () => { + expect(isMOCFitsFromUploadAnalsysis(mocV2Report('1')).valid).toBe(true); + }); + + test('isMOCFitsFromUploadAnalsysis rejects a MOC v2 table with more than one column', () => { + expect(isMOCFitsFromUploadAnalsysis(mocV2Report('3')).valid).toBe(false); + }); +}); diff --git a/src/firefly/js/visualize/__tests__/PlotViewUtil-test.js b/src/firefly/js/visualize/__tests__/PlotViewUtil-test.js index 129eda3ea7..fda8d101eb 100644 --- a/src/firefly/js/visualize/__tests__/PlotViewUtil-test.js +++ b/src/firefly/js/visualize/__tests__/PlotViewUtil-test.js @@ -1,6 +1,6 @@ import {primePlot, getPlotViewById, isActivePlotView, getActivePlotView} from '../PlotViewUtil.js'; import {makePlotView} from '../reducer/PlotView.js'; -import {WebPlotRequest} from '../WebPlotRequest.js' +import {WebPlotRequest} from '../WebPlotRequest.js'; import {findPlot, primePlotType} from '../PlotViewUtil'; @@ -115,7 +115,6 @@ describe('Less used PlotViewUtil functions', () => { }); test('findPlot)', () => { - debugger; const pv= getPlotViewById(pvAry, 'testId1'); const plot= findPlot(pv, 'testId1-image1'); expect(plot).toBeDefined(); diff --git a/src/firefly/js/visualize/draw/PointDataObj.js b/src/firefly/js/visualize/draw/PointDataObj.js index 0bf0ffb718..8a24885616 100644 --- a/src/firefly/js/visualize/draw/PointDataObj.js +++ b/src/firefly/js/visualize/draw/PointDataObj.js @@ -423,7 +423,6 @@ function toRegion(pt, plot, drawObj, drawParams, renderOptions) { break; case DrawSymbol.ROTATE: return retList; // no region - break; default: pointType = 'box'; } diff --git a/src/firefly/js/visualize/draw/ShapeHighlight.js b/src/firefly/js/visualize/draw/ShapeHighlight.js index d20fe972a0..b242f18f05 100644 --- a/src/firefly/js/visualize/draw/ShapeHighlight.js +++ b/src/firefly/js/visualize/draw/ShapeHighlight.js @@ -71,17 +71,20 @@ export function getDrawobjArea(drawObj, cc, def={}) { rCover = getDrawobjPolygonArea(drawObj, cc); break; case ShapeDataObj.ShapeType.Annulus: - if (firstObj = get(drawObj, [doAry, '0'])) { + firstObj = get(drawObj, [doAry, '0']); + if (firstObj) { rCover = getDrawobjCircleArea(firstObj, cc, def); } break; case ShapeDataObj.ShapeType.BoxAnnulus: - if (firstObj = get(drawObj, [doAry, '0'])) { + firstObj = get(drawObj, [doAry, '0']); + if (firstObj) { rCover = getDrawobjRectArea(firstObj, cc, def); } break; case ShapeDataObj.ShapeType.EllipseAnnulus: - if (firstObj = get(drawObj, [doAry, '0'])) { + firstObj = get(drawObj, [doAry, '0']); + if (firstObj) { rCover = getDrawobjEllipseArea(firstObj, cc, def); } break; diff --git a/src/firefly/js/visualize/iv/EventLayer.jsx b/src/firefly/js/visualize/iv/EventLayer.jsx index c34dcc9c53..63ec4afe73 100644 --- a/src/firefly/js/visualize/iv/EventLayer.jsx +++ b/src/firefly/js/visualize/iv/EventLayer.jsx @@ -18,8 +18,8 @@ function fireEvent(inEvent, transform, plotId, mouseState, eventCallback, doPrev if (doStopPropagation) inEvent.stopPropagation(); const ev= inEvent.nativeEvent ?? inEvent; const {screenX, screenY}= ev.touches?.[0] - ?ev.touches?.[0] - :ev; + ? ev.touches[0] + : ev; let {offsetX, offsetY}= ev; if (ev.touches?.[0]) { const rect= ev.target.getBoundingClientRect(); diff --git a/src/firefly/js/visualize/rawData/RawDataCommon.js b/src/firefly/js/visualize/rawData/RawDataCommon.js index 0cef462f26..407c456504 100644 --- a/src/firefly/js/visualize/rawData/RawDataCommon.js +++ b/src/firefly/js/visualize/rawData/RawDataCommon.js @@ -97,7 +97,7 @@ export async function populateRawImagePixelDataInWorker(obj) { export function getTransferable(result) { if (!result?.rawTileDataGroup) return []; - const {rawTileDataAry}= result?.rawTileDataGroup; + const {rawTileDataAry}= result.rawTileDataGroup; let tran; tran = rawTileDataAry .map((e) => isArrayBuffer(e.pixelDataStandard) && e.pixelDataStandard) diff --git a/src/firefly/js/visualize/region/RegionFactory.js b/src/firefly/js/visualize/region/RegionFactory.js index d2c666a9c8..425aa2a7ff 100644 --- a/src/firefly/js/visualize/region/RegionFactory.js +++ b/src/firefly/js/visualize/region/RegionFactory.js @@ -461,7 +461,8 @@ export class RegionFactory { case RegionType.text: if (params.length < 2) break; - if (wp1 = this.parseXY(regionCsys, params[n], params[++n])) { + wp1 = this.parseXY(regionCsys, params[n], params[++n]); + if (wp1) { region = makeRegionText(wp1.pt); } if (params.length >= 3) { @@ -472,7 +473,8 @@ export class RegionFactory { case RegionType.point: if (params.length < 2) break; - if (wp1 = this.parseXY(regionCsys, params[n], params[++n])) { + wp1 = this.parseXY(regionCsys, params[n], params[++n]); + if (wp1) { region = makeRegionPoint(wp1.pt); } if (pointType) { diff --git a/src/firefly/js/visualize/saga/CoverageWatcher.js b/src/firefly/js/visualize/saga/CoverageWatcher.js index 801e525260..804ce5ccc4 100644 --- a/src/firefly/js/visualize/saga/CoverageWatcher.js +++ b/src/firefly/js/visualize/saga/CoverageWatcher.js @@ -608,7 +608,7 @@ function makeOverlayCoverageDrawing() { tblCatIdMap[tbl_id].forEach((cId) => { const layer = getDrawLayerById(getDlAry(), cId); - const tableRemoved= !Boolean(getTblById(tbl_id)); + const tableRemoved= !getTblById(tbl_id); if (layer && (tableRemoved || tbl_id===affectedTblId)) { drawingOptions[cId] = layer.drawingDef; // drawingDef and selectOption is stored as layer based selectOps[cId] = layer.selectOption; diff --git a/src/firefly/js/visualize/ui/ColorRGBHuePreservingPanel.jsx b/src/firefly/js/visualize/ui/ColorRGBHuePreservingPanel.jsx index 81e244143e..0bf4b5bbb9 100644 --- a/src/firefly/js/visualize/ui/ColorRGBHuePreservingPanel.jsx +++ b/src/firefly/js/visualize/ui/ColorRGBHuePreservingPanel.jsx @@ -23,7 +23,7 @@ export const ColorRGBHuePreservingPanel= ({rgbFields,groupKey}) => { ); if (!rgbFields) return
; const {zscale} = rgbFields; - const zscaleValue = zscale?.value + const zscaleValue = zscale?.value; const renderRange = (isZscale) => { if (isZscale) { return null; diff --git a/src/firefly/js/visualize/ui/CtxToolbarFunctions.js b/src/firefly/js/visualize/ui/CtxToolbarFunctions.js index 4a11682607..bcc324507b 100644 --- a/src/firefly/js/visualize/ui/CtxToolbarFunctions.js +++ b/src/firefly/js/visualize/ui/CtxToolbarFunctions.js @@ -135,7 +135,7 @@ function tabulateStatics(wpResult, cc) { tblData[STable] = [{'cells': ['', 'Position', 'Value']}]; for (let i = 0; i < ipMetrics.length; i++) { - if (!b.hasOwnProperty(ipMetrics[i])) { + if (!Object.prototype.hasOwnProperty.call(b, ipMetrics[i])) { continue; } diff --git a/src/firefly/js/visualize/ui/DrawLayerPanel.jsx b/src/firefly/js/visualize/ui/DrawLayerPanel.jsx index 5f5e6c9bd5..8416b3ec54 100644 --- a/src/firefly/js/visualize/ui/DrawLayerPanel.jsx +++ b/src/firefly/js/visualize/ui/DrawLayerPanel.jsx @@ -62,7 +62,7 @@ function DrawLayerPanel() { } const defaultTitle = 'Layers- '; -export function DrawLayerPanelTitle({}) { +export function DrawLayerPanelTitle() { const plotTitle = useStoreConnector(() => currentP().plot?.title); return (plotTitle ? `${defaultTitle}${plotTitle}` : defaultTitle); } diff --git a/src/firefly/js/visualize/ui/ImageSearchPanelV2.jsx b/src/firefly/js/visualize/ui/ImageSearchPanelV2.jsx index 9ef25ed498..777f74bc15 100644 --- a/src/firefly/js/visualize/ui/ImageSearchPanelV2.jsx +++ b/src/firefly/js/visualize/ui/ImageSearchPanelV2.jsx @@ -308,7 +308,7 @@ HiPSImage.propTypes = { imageMasterData: PropTypes.array, }; -function ImageType({}) { +function ImageType() { const options = [ {label: 'View FITS Images', value: 'singleChannel'}, {label: 'Create 3-Color Composite', value: 'threeColor'}]; diff --git a/src/firefly/js/visualize/ui/ImageTableRowViewer.jsx b/src/firefly/js/visualize/ui/ImageTableRowViewer.jsx index 2eb706fd63..9dcb385a77 100644 --- a/src/firefly/js/visualize/ui/ImageTableRowViewer.jsx +++ b/src/firefly/js/visualize/ui/ImageTableRowViewer.jsx @@ -262,7 +262,7 @@ function Toolbar({viewerId, tableId:tbl_id, closeFunc=null, maxImageCnt, default useEffect(()=>{ if (matchInit.wcsMatchInitDone) return; - const {pv}= currentP() + const {pv}= currentP(); const plotId= (!pv || pv.plotViewCtx.useForCoverage || !pv.plotViewCtx.useForSearchResults) ? undefined : activePlotId; if(plotId && wcsMatchType!==defaultWcsMatchType) { //to make sure wcsMatch checkbox is checked on initial render diff --git a/src/firefly/js/visualize/ui/MaskAddPanel.jsx b/src/firefly/js/visualize/ui/MaskAddPanel.jsx index 93dac97ccf..fe0d68da4d 100644 --- a/src/firefly/js/visualize/ui/MaskAddPanel.jsx +++ b/src/firefly/js/visualize/ui/MaskAddPanel.jsx @@ -29,7 +29,7 @@ export function showMaskDialog() { -export function MaskAddPanel({}) { +export function MaskAddPanel() { return ( diff --git a/src/firefly/js/visualize/ui/multiProduct/MultiProductViewer.jsx b/src/firefly/js/visualize/ui/multiProduct/MultiProductViewer.jsx index b78a3dda85..614f266acb 100644 --- a/src/firefly/js/visualize/ui/multiProduct/MultiProductViewer.jsx +++ b/src/firefly/js/visualize/ui/multiProduct/MultiProductViewer.jsx @@ -219,6 +219,6 @@ function shouldGetInput(dpId,dataProductsState) { const searchParams= getSearchParams(serviceParamsAry,activeMenuLookupKey,menuKey); const serDescActive = isServiceDescriptorActivated(dpId,serDef.internalServiceDescriptorID); if (noInputRequired && isDefined(serDescActive)) return !serDescActive; - return !Boolean(searchParams); + return !searchParams; } diff --git a/yarn.lock b/yarn.lock index 43f7297a65..ff4240f400 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1422,7 +1422,7 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@9.38.0": +"@eslint/js@9.38.0", "@eslint/js@~9.38": version "9.38.0" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.38.0.tgz#f7aa9c7577577f53302c1d795643589d7709ebd1" integrity sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==