Fix frontend cron-parser imports to use named export

Co-authored-by: whyour <22700758+whyour@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot] 2026-01-29 11:32:17 +00:00
parent 8de5bff700
commit 7d6dd3d42d
13 changed files with 7 additions and 207 deletions

4
.gitignore vendored
View File

@ -28,3 +28,7 @@ __pycache__
/shell/preload/notify.*
/shell/preload/*-notify.json
/shell/preload/__ql_notify__.*
# Test files
test-*.cjs
test-*.mjs

View File

@ -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';

View File

@ -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;

View File

@ -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() {

View File

@ -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);
}
});

View File

@ -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}`);
}
});

View File

@ -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}`);
}
});

View File

@ -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));

View File

@ -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}`);
}
});

View File

@ -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);

View File

@ -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}`);
}
});

View File

@ -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}`);
}
});

View File

@ -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}`);
}
});