From 7d6dd3d42d6bcdc8568064849d333661b660dd5c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 29 Jan 2026 11:32:17 +0000 Subject: [PATCH] Fix frontend cron-parser imports to use named export Co-authored-by: whyour <22700758+whyour@users.noreply.github.com> --- .gitignore | 4 ++++ src/pages/crontab/modal.tsx | 2 +- src/pages/subscription/modal.tsx | 2 +- src/utils/index.ts | 2 +- test-built-validation.cjs | 38 -------------------------------- test-cron.mjs | 23 ------------------- test-cron2.mjs | 22 ------------------ test-cron3.mjs | 6 ----- test-cron4.mjs | 20 ----------------- test-import.cjs | 8 ------- test-import2.cjs | 23 ------------------- test-validation.cjs | 32 --------------------------- test-validation.mjs | 32 --------------------------- 13 files changed, 7 insertions(+), 207 deletions(-) delete mode 100644 test-built-validation.cjs delete mode 100644 test-cron.mjs delete mode 100644 test-cron2.mjs delete mode 100644 test-cron3.mjs delete mode 100644 test-cron4.mjs delete mode 100644 test-import.cjs delete mode 100644 test-import2.cjs delete mode 100644 test-validation.cjs delete mode 100644 test-validation.mjs diff --git a/.gitignore b/.gitignore index 709791ed..6de0122f 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,7 @@ __pycache__ /shell/preload/notify.* /shell/preload/*-notify.json /shell/preload/__ql_notify__.* + +# Test files +test-*.cjs +test-*.mjs diff --git a/src/pages/crontab/modal.tsx b/src/pages/crontab/modal.tsx index f4848ff8..33afe91a 100644 --- a/src/pages/crontab/modal.tsx +++ b/src/pages/crontab/modal.tsx @@ -3,7 +3,7 @@ import config from '@/utils/config'; import { request } from '@/utils/http'; import { MinusCircleOutlined, PlusOutlined } from '@ant-design/icons'; import { Button, Form, Input, Modal, Select, Space, message } from 'antd'; -import CronExpressionParser from 'cron-parser'; +import { CronExpressionParser } from 'cron-parser'; import { useEffect, useState } from 'react'; import intl from 'react-intl-universal'; import { getScheduleType, scheduleTypeMap } from './const'; diff --git a/src/pages/subscription/modal.tsx b/src/pages/subscription/modal.tsx index d5b6afb4..c6b0bc6c 100644 --- a/src/pages/subscription/modal.tsx +++ b/src/pages/subscription/modal.tsx @@ -12,7 +12,7 @@ import { } from 'antd'; import { request } from '@/utils/http'; import config from '@/utils/config'; -import CronExpressionParser from 'cron-parser'; +import { CronExpressionParser } from 'cron-parser'; import isNil from 'lodash/isNil'; const { Option } = Select; diff --git a/src/utils/index.ts b/src/utils/index.ts index 9260a100..954b35b3 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,6 +1,6 @@ import intl from 'react-intl-universal'; import { LANG_MAP, LOG_END_SYMBOL } from './const'; -import CronExpressionParser from 'cron-parser'; +import { CronExpressionParser } from 'cron-parser'; import { ICrontab } from '@/pages/crontab/type'; export default function browserType() { diff --git a/test-built-validation.cjs b/test-built-validation.cjs deleted file mode 100644 index 6cca7996..00000000 --- a/test-built-validation.cjs +++ /dev/null @@ -1,38 +0,0 @@ -// Simulating the built code -const cron_parser_1 = require("cron-parser"); - -const validateSchedule = (value, helpers) => { - const mockHelpers = { - error: (msg) => ({ error: msg }) - }; - helpers = helpers || mockHelpers; - - try { - if (cron_parser_1.default.parse(value).hasNext()) { - return value; - } - } - catch (e) { - return helpers.error('any.invalid'); - } - return helpers.error('any.invalid'); -}; - -// Test cases -const testExpressions = [ - '*/8 * * * *', // 5 fields (every 8 minutes) - '*/8 * * * * ?', // 6 fields with seconds (every 8 seconds) - FROM THE IMAGE - '0 */8 * * * *', // 6 fields with seconds (every 8 minutes at 0 seconds) - '*/5 * * * * *', // 6 fields (every 5 seconds) -]; - -console.log('Testing built validation logic:\n'); - -testExpressions.forEach(expr => { - const result = validateSchedule(expr); - if (result === expr) { - console.log(`✓ "${expr}" - VALID`); - } else { - console.log(`✗ "${expr}" - INVALID:`, result); - } -}); diff --git a/test-cron.mjs b/test-cron.mjs deleted file mode 100644 index 23c52b25..00000000 --- a/test-cron.mjs +++ /dev/null @@ -1,23 +0,0 @@ -import * as parser from 'cron-parser'; - -console.log('Available exports:', Object.keys(parser)); -console.log('Default export:', parser.default); - -// Try with the named export -const testExpressions = [ - '*/8 * * * *', // 5 fields (every 8 minutes) - '*/8 * * * * ?', // 6 fields with seconds (every 8 seconds) - '0 */8 * * * *', // 6 fields with seconds (every 8 minutes at 0 seconds) - '*/5 * * * * *', // 6 fields (every 5 seconds) -]; - -console.log('\nTesting cron-parser with various expressions:\n'); - -testExpressions.forEach(expr => { - try { - const parsed = parser.CronExpressionParser.parse(expr); - console.log(`✓ "${expr}" - VALID, hasNext: ${parsed.hasNext()}`); - } catch (e) { - console.log(`✗ "${expr}" - INVALID: ${e.message}`); - } -}); diff --git a/test-cron2.mjs b/test-cron2.mjs deleted file mode 100644 index 1600a7d9..00000000 --- a/test-cron2.mjs +++ /dev/null @@ -1,22 +0,0 @@ -import CronExpressionParser from 'cron-parser'; - -// Test cases - same as the image shows -const testExpressions = [ - '*/8 * * * *', // 5 fields (every 8 minutes) - '*/8 * * * * ?', // 6 fields with seconds (every 8 seconds) - FROM THE IMAGE -]; - -console.log('Testing with default import (like the validation code):\n'); - -testExpressions.forEach(expr => { - try { - const parsed = CronExpressionParser.parse(expr); - if (parsed.hasNext()) { - console.log(`✓ "${expr}" - VALID, hasNext: true`); - } else { - console.log(`? "${expr}" - parsed but hasNext is false`); - } - } catch (e) { - console.log(`✗ "${expr}" - INVALID: ${e.message}`); - } -}); diff --git a/test-cron3.mjs b/test-cron3.mjs deleted file mode 100644 index 3fd00bb6..00000000 --- a/test-cron3.mjs +++ /dev/null @@ -1,6 +0,0 @@ -import CronExpressionParser from 'cron-parser'; - -console.log('Default import type:', typeof CronExpressionParser); -console.log('Default import:', CronExpressionParser); -console.log('Is it a class?', CronExpressionParser.prototype); -console.log('Available static methods:', Object.getOwnPropertyNames(CronExpressionParser)); diff --git a/test-cron4.mjs b/test-cron4.mjs deleted file mode 100644 index c5f122fb..00000000 --- a/test-cron4.mjs +++ /dev/null @@ -1,20 +0,0 @@ -import CronExpressionParser from 'cron-parser'; - -// Test both ways -const testExpressions = [ - '*/8 * * * *', // 5 fields (every 8 minutes) - '*/8 * * * * ?', // 6 fields with seconds (every 8 seconds) -]; - -console.log('Testing CronExpressionParser.CronExpressionParser.parse:\n'); - -testExpressions.forEach(expr => { - try { - const parsed = CronExpressionParser.CronExpressionParser.parse(expr); - if (parsed.hasNext()) { - console.log(`✓ "${expr}" - VALID`); - } - } catch (e) { - console.log(`✗ "${expr}" - INVALID: ${e.message}`); - } -}); diff --git a/test-import.cjs b/test-import.cjs deleted file mode 100644 index 1cf298cc..00000000 --- a/test-import.cjs +++ /dev/null @@ -1,8 +0,0 @@ -const cronParser = require('cron-parser'); - -console.log('Type:', typeof cronParser); -console.log('Keys:', Object.keys(cronParser)); -console.log('\nCronExpressionParser:', cronParser.CronExpressionParser); -console.log('Default:', cronParser.default); -console.log('\nIs parse a method on default?', typeof cronParser.default?.parse); -console.log('Is parse a method on CronExpressionParser?', typeof cronParser.CronExpressionParser?.parse); diff --git a/test-import2.cjs b/test-import2.cjs deleted file mode 100644 index 8b2cdc1c..00000000 --- a/test-import2.cjs +++ /dev/null @@ -1,23 +0,0 @@ -const cronParser = require('cron-parser'); -const CronExpressionParser = cronParser.default || cronParser; // Simulating esModuleInterop - -// Test cases -const testExpressions = [ - '*/8 * * * *', // 5 fields (every 8 minutes) - '*/8 * * * * ?', // 6 fields with seconds (every 8 seconds) - '0 */8 * * * *', // 6 fields with seconds (every 8 minutes at 0 seconds) - '*/5 * * * * *', // 6 fields (every 5 seconds) -]; - -console.log('Testing with .default:\n'); - -testExpressions.forEach(expr => { - try { - const parsed = CronExpressionParser.parse(expr); - if (parsed.hasNext()) { - console.log(`✓ "${expr}" - VALID`); - } - } catch (e) { - console.log(`✗ "${expr}" - INVALID: ${e.message}`); - } -}); diff --git a/test-validation.cjs b/test-validation.cjs deleted file mode 100644 index 24561830..00000000 --- a/test-validation.cjs +++ /dev/null @@ -1,32 +0,0 @@ -const CronExpressionParser = require('cron-parser'); - -// Replicate the validation logic -const validateSchedule = (value) => { - try { - if (CronExpressionParser.parse(value).hasNext()) { - return { valid: true }; - } - } catch (e) { - return { valid: false, error: e.message }; - } - return { valid: false, error: 'hasNext() returned false' }; -}; - -// Test cases from the issue -const testExpressions = [ - '*/8 * * * *', // 5 fields (every 8 minutes) - '*/8 * * * * ?', // 6 fields with seconds (every 8 seconds) - FROM THE IMAGE - '0 */8 * * * *', // 6 fields with seconds (every 8 minutes at 0 seconds) - '*/5 * * * * *', // 6 fields (every 5 seconds) -]; - -console.log('Testing validation logic with CommonJS:\n'); - -testExpressions.forEach(expr => { - const result = validateSchedule(expr); - if (result.valid) { - console.log(`✓ "${expr}" - VALID`); - } else { - console.log(`✗ "${expr}" - INVALID: ${result.error}`); - } -}); diff --git a/test-validation.mjs b/test-validation.mjs deleted file mode 100644 index 35774f93..00000000 --- a/test-validation.mjs +++ /dev/null @@ -1,32 +0,0 @@ -import CronExpressionParser from 'cron-parser'; - -// Replicate the validation logic -const validateSchedule = (value) => { - try { - if (CronExpressionParser.parse(value).hasNext()) { - return { valid: true }; - } - } catch (e) { - return { valid: false, error: e.message }; - } - return { valid: false, error: 'hasNext() returned false' }; -}; - -// Test cases from the issue -const testExpressions = [ - '*/8 * * * *', // 5 fields (every 8 minutes) - '*/8 * * * * ?', // 6 fields with seconds (every 8 seconds) - FROM THE IMAGE - '0 */8 * * * *', // 6 fields with seconds (every 8 minutes at 0 seconds) - '*/5 * * * * *', // 6 fields (every 5 seconds) -]; - -console.log('Testing validation logic:\n'); - -testExpressions.forEach(expr => { - const result = validateSchedule(expr); - if (result.valid) { - console.log(`✓ "${expr}" - VALID`); - } else { - console.log(`✗ "${expr}" - INVALID: ${result.error}`); - } -});