Файловый менеджер - Редактировать - /home/freeclou/app.optimyar.com/front-web/build/assets/fonts/iran-yekan/MobileFonts/wgdpf7/lib.tar
Назад
date.js 0000664 00000011006 15103224214 0006011 0 ustar 00 'use strict'; var moment = require('moment-timezone'); CronDate.prototype.addYear = function() { this._date.add(1, 'year'); }; CronDate.prototype.addMonth = function() { this._date.add(1, 'month').startOf('month'); }; CronDate.prototype.addDay = function() { this._date.add(1, 'day').startOf('day'); }; CronDate.prototype.addHour = function() { var prev = this.getTime(); this._date.add(1, 'hour').startOf('hour'); if (this.getTime() <= prev) { this._date.add(1, 'hour'); } }; CronDate.prototype.addMinute = function() { var prev = this.getTime(); this._date.add(1, 'minute').startOf('minute'); if (this.getTime() < prev) { this._date.add(1, 'hour'); } }; CronDate.prototype.addSecond = function() { var prev = this.getTime(); this._date.add(1, 'second').startOf('second'); if (this.getTime() < prev) { this._date.add(1, 'hour'); } }; CronDate.prototype.subtractYear = function() { this._date.subtract(1, 'year'); }; CronDate.prototype.subtractMonth = function() { this._date.subtract(1, 'month').endOf('month'); }; CronDate.prototype.subtractDay = function() { this._date.subtract(1, 'day').endOf('day'); }; CronDate.prototype.subtractHour = function() { var prev = this.getTime(); this._date.subtract(1, 'hour').endOf('hour'); if (this.getTime() >= prev) { this._date.subtract(1, 'hour'); } }; CronDate.prototype.subtractMinute = function() { var prev = this.getTime(); this._date.subtract(1, 'minute').endOf('minute'); if (this.getTime() > prev) { this._date.subtract(1, 'hour'); } }; CronDate.prototype.subtractSecond = function() { var prev = this.getTime(); this._date.subtract(1, 'second').startOf('second'); if (this.getTime() > prev) { this._date.subtract(1, 'hour'); } }; CronDate.prototype.getDate = function() { return this._date.date(); }; CronDate.prototype.getFullYear = function() { return this._date.year(); }; CronDate.prototype.getDay = function() { return this._date.day(); }; CronDate.prototype.getMonth = function() { return this._date.month(); }; CronDate.prototype.getHours = function() { return this._date.hours(); }; CronDate.prototype.getMinutes = function() { return this._date.minute(); }; CronDate.prototype.getSeconds = function() { return this._date.second(); }; CronDate.prototype.getMilliseconds = function() { return this._date.millisecond(); }; CronDate.prototype.getTime = function() { return this._date.valueOf(); }; CronDate.prototype.getUTCDate = function() { return this._getUTC().date(); }; CronDate.prototype.getUTCFullYear = function() { return this._getUTC().year(); }; CronDate.prototype.getUTCDay = function() { return this._getUTC().day(); }; CronDate.prototype.getUTCMonth = function() { return this._getUTC().month(); }; CronDate.prototype.getUTCHours = function() { return this._getUTC().hours(); }; CronDate.prototype.getUTCMinutes = function() { return this._getUTC().minute(); }; CronDate.prototype.getUTCSeconds = function() { return this._getUTC().second(); }; CronDate.prototype.toISOString = function() { return this._date.toISOString(); }; CronDate.prototype.toJSON = function() { return this._date.toJSON(); }; CronDate.prototype.setDate = function(d) { return this._date.date(d); }; CronDate.prototype.setFullYear = function(y) { return this._date.year(y); }; CronDate.prototype.setDay = function(d) { return this._date.day(d); }; CronDate.prototype.setMonth = function(m) { return this._date.month(m); }; CronDate.prototype.setHours = function(h) { return this._date.hour(h); }; CronDate.prototype.setMinutes = function(m) { return this._date.minute(m); }; CronDate.prototype.setSeconds = function(s) { return this._date.second(s); }; CronDate.prototype.setMilliseconds = function(s) { return this._date.millisecond(s); }; CronDate.prototype.getTime = function() { return this._date.valueOf(); }; CronDate.prototype._getUTC = function() { return moment.utc(this._date); }; CronDate.prototype.toString = function() { return this._date.toString(); }; CronDate.prototype.toDate = function() { return this._date.toDate(); }; CronDate.prototype.isLastDayOfMonth = function() { var newDate = this._date.clone(); //next day newDate.add(1, 'day').startOf('day'); return this._date.month() !== newDate.month(); }; function CronDate (timestamp, tz) { if (timestamp instanceof CronDate) { timestamp = timestamp._date; } if (!tz) { this._date = moment(timestamp); } else { this._date = moment.tz(timestamp, tz); } } module.exports = CronDate; expression.js 0000664 00000053575 15103224214 0007314 0 ustar 00 'use strict'; // Load Date class extensions var CronDate = require('./date'); // Get Number.isNaN or the polyfill var safeIsNaN = require('is-nan'); /** * Cron iteration loop safety limit */ var LOOP_LIMIT = 10000; /** * Detect if input range fully matches constraint bounds * @param {Array} range Input range * @param {Array} constraints Input constraints * @returns {Boolean} * @private */ function isWildcardRange(range, constraints) { if (range instanceof Array && !range.length) { return false; } if (constraints.length !== 2) { return false; } return range.length === (constraints[1] - (constraints[0] < 1 ? - 1 : 0)); } /** * Construct a new expression parser * * Options: * currentDate: iterator start date * endDate: iterator end date * * @constructor * @private * @param {Object} fields Expression fields parsed values * @param {Object} options Parser options */ function CronExpression (fields, options) { this._options = options; this._utc = options.utc || false; this._tz = this._utc ? 'UTC' : options.tz; this._currentDate = new CronDate(options.currentDate, this._tz); this._startDate = options.startDate ? new CronDate(options.startDate, this._tz) : null; this._endDate = options.endDate ? new CronDate(options.endDate, this._tz) : null; this._fields = fields; this._isIterator = options.iterator || false; this._hasIterated = false; this._nthDayOfWeek = options.nthDayOfWeek || 0; } /** * Field mappings * @type {Array} */ CronExpression.map = [ 'second', 'minute', 'hour', 'dayOfMonth', 'month', 'dayOfWeek' ]; /** * Prefined intervals * @type {Object} */ CronExpression.predefined = { '@yearly': '0 0 1 1 *', '@monthly': '0 0 1 * *', '@weekly': '0 0 * * 0', '@daily': '0 0 * * *', '@hourly': '0 * * * *' }; /** * Fields constraints * @type {Array} */ CronExpression.constraints = [ [ 0, 59 ], // Second [ 0, 59 ], // Minute [ 0, 23 ], // Hour [ 1, 31 ], // Day of month [ 1, 12 ], // Month [ 0, 7 ] // Day of week ]; /** * Days in month * @type {number[]} */ CronExpression.daysInMonth = [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; /** * Field aliases * @type {Object} */ CronExpression.aliases = { month: { jan: 1, feb: 2, mar: 3, apr: 4, may: 5, jun: 6, jul: 7, aug: 8, sep: 9, oct: 10, nov: 11, dec: 12 }, dayOfWeek: { sun: 0, mon: 1, tue: 2, wed: 3, thu: 4, fri: 5, sat: 6 } }; /** * Field defaults * @type {Array} */ CronExpression.parseDefaults = [ '0', '*', '*', '*', '*', '*' ]; CronExpression.standardValidCharacters = /^[\d|/|*|\-|,]+$/; CronExpression.dayOfWeekValidCharacters = /^[\d|/|*|\-|,|\?]+$/; CronExpression.dayOfMonthValidCharacters = /^[\d|L|/|*|\-|,|\?]+$/; CronExpression.validCharacters = { second: CronExpression.standardValidCharacters, minute: CronExpression.standardValidCharacters, hour: CronExpression.standardValidCharacters, dayOfMonth: CronExpression.dayOfMonthValidCharacters, month: CronExpression.standardValidCharacters, dayOfWeek: CronExpression.dayOfWeekValidCharacters, } /** * Parse input interval * * @param {String} field Field symbolic name * @param {String} value Field value * @param {Array} constraints Range upper and lower constraints * @return {Array} Sequence of sorted values * @private */ CronExpression._parseField = function _parseField (field, value, constraints) { // Replace aliases switch (field) { case 'month': case 'dayOfWeek': var aliases = CronExpression.aliases[field]; value = value.replace(/[a-z]{1,3}/gi, function(match) { match = match.toLowerCase(); if (typeof aliases[match] !== undefined) { return aliases[match]; } else { throw new Error('Cannot resolve alias "' + match + '"') } }); break; } // Check for valid characters. if (!(CronExpression.validCharacters[field].test(value))) { throw new Error('Invalid characters, got value: ' + value) } // Replace '*' and '?' if (value.indexOf('*') !== -1) { value = value.replace(/\*/g, constraints.join('-')); } else if (value.indexOf('?') !== -1) { value = value.replace(/\?/g, constraints.join('-')); } // // Inline parsing functions // // Parser path: // - parseSequence // - parseRepeat // - parseRange /** * Parse sequence * * @param {String} val * @return {Array} * @private */ function parseSequence (val) { var stack = []; function handleResult (result) { if (result instanceof Array) { // Make sequence linear for (var i = 0, c = result.length; i < c; i++) { var value = result[i]; // Check constraints if (value < constraints[0] || value > constraints[1]) { throw new Error( 'Constraint error, got value ' + value + ' expected range ' + constraints[0] + '-' + constraints[1] ); } stack.push(value); } } else { // Scalar value //TODO: handle the cases when there is a range and L, or list of dates and L if (field === 'dayOfMonth' && result === 'L') { stack.push(result); return; } result = +result; // Check constraints if (result < constraints[0] || result > constraints[1]) { throw new Error( 'Constraint error, got value ' + result + ' expected range ' + constraints[0] + '-' + constraints[1] ); } if (field == 'dayOfWeek') { result = result % 7; } stack.push(result); } } var atoms = val.split(','); if (!atoms.every(function (atom) { return atom.length > 0; })) { throw new Error('Invalid list value format'); } if (atoms.length > 1) { for (var i = 0, c = atoms.length; i < c; i++) { handleResult(parseRepeat(atoms[i])); } } else { handleResult(parseRepeat(val)); } stack.sort(function(a, b) { return a - b; }); return stack; } /** * Parse repetition interval * * @param {String} val * @return {Array} */ function parseRepeat (val) { var repeatInterval = 1; var atoms = val.split('/'); if (atoms.length > 1) { if (atoms[0] == +atoms[0]) { atoms = [atoms[0] + '-' + constraints[1], atoms[1]]; } return parseRange(atoms[0], atoms[atoms.length - 1]); } return parseRange(val, repeatInterval); } /** * Parse range * * @param {String} val * @param {Number} repeatInterval Repetition interval * @return {Array} * @private */ function parseRange (val, repeatInterval) { var stack = []; var atoms = val.split('-'); if (atoms.length > 1 ) { // Invalid range, return value if (atoms.length < 2) { return +val; } if (!atoms[0].length) { if (!atoms[1].length) { throw new Error('Invalid range: ' + val); } return +val; } // Validate range var min = +atoms[0]; var max = +atoms[1]; if (safeIsNaN(min) || safeIsNaN(max) || min < constraints[0] || max > constraints[1]) { throw new Error( 'Constraint error, got range ' + min + '-' + max + ' expected range ' + constraints[0] + '-' + constraints[1] ); } else if (min >= max) { throw new Error('Invalid range: ' + val); } // Create range var repeatIndex = +repeatInterval; if (safeIsNaN(repeatIndex) || repeatIndex <= 0) { throw new Error('Constraint error, cannot repeat at every ' + repeatIndex + ' time.'); } for (var index = min, count = max; index <= count; index++) { if (repeatIndex > 0 && (repeatIndex % repeatInterval) === 0) { repeatIndex = 1; stack.push(index); } else { repeatIndex++; } } return stack; } return isNaN(+val) ? val : +val; } return parseSequence(value); }; CronExpression.prototype._applyTimezoneShift = function(currentDate, dateMathVerb, method) { if ((method === 'Month') || (method === 'Day')) { var prevTime = currentDate.getTime(); currentDate[dateMathVerb + method](); var currTime = currentDate.getTime(); if (prevTime === currTime) { // Jumped into a not existent date due to a DST transition if ((currentDate.getMinutes() === 0) && (currentDate.getSeconds() === 0)) { currentDate.addHour(); } else if ((currentDate.getMinutes() === 59) && (currentDate.getSeconds() === 59)) { currentDate.subtractHour(); } } } else { var previousHour = currentDate.getHours(); currentDate[dateMathVerb + method](); var currentHour = currentDate.getHours(); var diff = currentHour - previousHour; if (diff === 2) { // Starting DST if (this._fields.hour.length !== 24) { // Hour is specified this._dstStart = currentHour; } } else if ((diff === 0) && (currentDate.getMinutes() === 0) && (currentDate.getSeconds() === 0)) { // Ending DST if (this._fields.hour.length !== 24) { // Hour is specified this._dstEnd = currentHour; } } } }; /** * Find next or previous matching schedule date * * @return {CronDate} * @private */ CronExpression.prototype._findSchedule = function _findSchedule (reverse) { /** * Match field value * * @param {String} value * @param {Array} sequence * @return {Boolean} * @private */ function matchSchedule (value, sequence) { for (var i = 0, c = sequence.length; i < c; i++) { if (sequence[i] >= value) { return sequence[i] === value; } } return sequence[0] === value; } /** * Helps determine if the provided date is the correct nth occurence of the * desired day of week. * * @param {CronDate} date * @param {Number} nthDayOfWeek * @return {Boolean} * @private */ function isNthDayMatch(date, nthDayOfWeek) { if (nthDayOfWeek < 6) { if ( date.getDate() < 8 && nthDayOfWeek === 1 // First occurence has to happen in first 7 days of the month ) { return true; } var offset = date.getDate() % 7 ? 1 : 0; // Math is off by 1 when dayOfWeek isn't divisible by 7 var adjustedDate = date.getDate() - (date.getDate() % 7); // find the first occurance var occurrence = Math.floor(adjustedDate / 7) + offset; return occurrence === nthDayOfWeek; } return false; } /** * Helper function that checks if 'L' is in the array * * @param {Array} dayOfMonth */ function isLInDayOfMonth(dayOfMonth) { return dayOfMonth.length > 0 && dayOfMonth.indexOf('L') >= 0; } // Whether to use backwards directionality when searching reverse = reverse || false; var dateMathVerb = reverse ? 'subtract' : 'add'; var currentDate = new CronDate(this._currentDate, this._tz); var startDate = this._startDate; var endDate = this._endDate; // Find matching schedule var startTimestamp = currentDate.getTime(); var stepCount = 0; while (stepCount < LOOP_LIMIT) { stepCount++; // Validate timespan if (reverse) { if (startDate && (currentDate.getTime() - startDate.getTime() < 0)) { throw new Error('Out of the timespan range'); } } else { if (endDate && (endDate.getTime() - currentDate.getTime()) < 0) { throw new Error('Out of the timespan range'); } } // Day of month and week matching: // // "The day of a command's execution can be specified by two fields -- // day of month, and day of week. If both fields are restricted (ie, // aren't *), the command will be run when either field matches the cur- // rent time. For example, "30 4 1,15 * 5" would cause a command to be // run at 4:30 am on the 1st and 15th of each month, plus every Friday." // // http://unixhelp.ed.ac.uk/CGI/man-cgi?crontab+5 // var dayOfMonthMatch = matchSchedule(currentDate.getDate(), this._fields.dayOfMonth); if (isLInDayOfMonth(this._fields.dayOfMonth)) { dayOfMonthMatch = dayOfMonthMatch || currentDate.isLastDayOfMonth(); } var dayOfWeekMatch = matchSchedule(currentDate.getDay(), this._fields.dayOfWeek); var isDayOfMonthWildcardMatch = isWildcardRange(this._fields.dayOfMonth, CronExpression.constraints[3]); var isDayOfWeekWildcardMatch = isWildcardRange(this._fields.dayOfWeek, CronExpression.constraints[5]); var currentHour = currentDate.getHours(); // Add or subtract day if select day not match with month (according to calendar) if (!dayOfMonthMatch && !dayOfWeekMatch) { this._applyTimezoneShift(currentDate, dateMathVerb, 'Day'); continue; } // Add or subtract day if not day of month is set (and no match) and day of week is wildcard if (!isDayOfMonthWildcardMatch && isDayOfWeekWildcardMatch && !dayOfMonthMatch) { this._applyTimezoneShift(currentDate, dateMathVerb, 'Day'); continue; } // Add or subtract day if not day of week is set (and no match) and day of month is wildcard if (isDayOfMonthWildcardMatch && !isDayOfWeekWildcardMatch && !dayOfWeekMatch) { this._applyTimezoneShift(currentDate, dateMathVerb, 'Day'); continue; } // Add or subtract day if day of month and week are non-wildcard values and both doesn't match if (!(isDayOfMonthWildcardMatch && isDayOfWeekWildcardMatch) && !dayOfMonthMatch && !dayOfWeekMatch) { this._applyTimezoneShift(currentDate, dateMathVerb, 'Day'); continue; } // Add or subtract day if day of week & nthDayOfWeek are set (and no match) if ( this._nthDayOfWeek > 0 && !isNthDayMatch(currentDate, this._nthDayOfWeek) ) { this._applyTimezoneShift(currentDate, dateMathVerb, 'Day'); continue; } // Match month if (!matchSchedule(currentDate.getMonth() + 1, this._fields.month)) { this._applyTimezoneShift(currentDate, dateMathVerb, 'Month'); continue; } // Match hour if (!matchSchedule(currentHour, this._fields.hour)) { if (this._dstStart !== currentHour) { this._dstStart = null; this._applyTimezoneShift(currentDate, dateMathVerb, 'Hour'); continue; } else if (!matchSchedule(currentHour - 1, this._fields.hour)) { currentDate[dateMathVerb + 'Hour'](); continue; } } else if (this._dstEnd === currentHour) { if (!reverse) { this._dstEnd = null; this._applyTimezoneShift(currentDate, 'add', 'Hour'); continue; } } // Match minute if (!matchSchedule(currentDate.getMinutes(), this._fields.minute)) { this._applyTimezoneShift(currentDate, dateMathVerb, 'Minute'); continue; } // Match second if (!matchSchedule(currentDate.getSeconds(), this._fields.second)) { this._applyTimezoneShift(currentDate, dateMathVerb, 'Second'); continue; } // Increase a second in case in the first iteration the currentDate was not // modified if (startTimestamp === currentDate.getTime()) { if ((dateMathVerb === 'add') || (currentDate.getMilliseconds() === 0)) { this._applyTimezoneShift(currentDate, dateMathVerb, 'Second'); } else { currentDate.setMilliseconds(0); } continue; } break; } if (stepCount >= LOOP_LIMIT) { throw new Error('Invalid expression, loop limit exceeded'); } this._currentDate = new CronDate(currentDate, this._tz); this._hasIterated = true; return currentDate; }; /** * Find next suitable date * * @public * @return {CronDate|Object} */ CronExpression.prototype.next = function next () { var schedule = this._findSchedule(); // Try to return ES6 compatible iterator if (this._isIterator) { return { value: schedule, done: !this.hasNext() }; } return schedule; }; /** * Find previous suitable date * * @public * @return {CronDate|Object} */ CronExpression.prototype.prev = function prev () { var schedule = this._findSchedule(true); // Try to return ES6 compatible iterator if (this._isIterator) { return { value: schedule, done: !this.hasPrev() }; } return schedule; }; /** * Check if next suitable date exists * * @public * @return {Boolean} */ CronExpression.prototype.hasNext = function() { var current = this._currentDate; var hasIterated = this._hasIterated; try { this._findSchedule(); return true; } catch (err) { return false; } finally { this._currentDate = current; this._hasIterated = hasIterated; } }; /** * Check if previous suitable date exists * * @public * @return {Boolean} */ CronExpression.prototype.hasPrev = function() { var current = this._currentDate; var hasIterated = this._hasIterated; try { this._findSchedule(true); return true; } catch (err) { return false; } finally { this._currentDate = current; this._hasIterated = hasIterated; } }; /** * Iterate over expression iterator * * @public * @param {Number} steps Numbers of steps to iterate * @param {Function} callback Optional callback * @return {Array} Array of the iterated results */ CronExpression.prototype.iterate = function iterate (steps, callback) { var dates = []; if (steps >= 0) { for (var i = 0, c = steps; i < c; i++) { try { var item = this.next(); dates.push(item); // Fire the callback if (callback) { callback(item, i); } } catch (err) { break; } } } else { for (var i = 0, c = steps; i > c; i--) { try { var item = this.prev(); dates.push(item); // Fire the callback if (callback) { callback(item, i); } } catch (err) { break; } } } return dates; }; /** * Reset expression iterator state * * @public */ CronExpression.prototype.reset = function reset (newDate) { this._currentDate = new CronDate(newDate || this._options.currentDate); }; /** * Parse input expression (async) * * @public * @param {String} expression Input expression * @param {Object} [options] Parsing options * @param {Function} [callback] */ CronExpression.parse = function parse(expression, options, callback) { var self = this; if (typeof options === 'function') { callback = options; options = {}; } function parse (expression, options) { if (!options) { options = {}; } if (typeof options.currentDate === 'undefined') { options.currentDate = new CronDate(undefined, self._tz); } // Is input expression predefined? if (CronExpression.predefined[expression]) { expression = CronExpression.predefined[expression]; } // Split fields var fields = []; var atoms = (expression + '').trim().split(/\s+/); if (atoms.length > 6) { throw new Error('Invalid cron expression'); } // Resolve fields var start = (CronExpression.map.length - atoms.length); for (var i = 0, c = CronExpression.map.length; i < c; ++i) { var field = CronExpression.map[i]; // Field name var value = atoms[atoms.length > c ? i : i - start]; // Field value if (i < start || !value) { // Use default value fields.push(CronExpression._parseField( field, CronExpression.parseDefaults[i], CronExpression.constraints[i]) ); } else { var val = field === 'dayOfWeek' ? parseNthDay(value) : value; fields.push(CronExpression._parseField( field, val, CronExpression.constraints[i]) ); } } var mappedFields = {}; for (var i = 0, c = CronExpression.map.length; i < c; i++) { var key = CronExpression.map[i]; mappedFields[key] = fields[i]; } // Filter out any day of month value that is larger than given month expects if (mappedFields.month.length === 1) { var daysInMonth = CronExpression.daysInMonth[mappedFields.month[0] - 1]; if (mappedFields.dayOfMonth[0] > daysInMonth) { throw new Error('Invalid explicit day of month definition'); } mappedFields.dayOfMonth = mappedFields.dayOfMonth.filter(function(dayOfMonth) { return dayOfMonth === 'L' ? true : dayOfMonth <= daysInMonth; }); //sort mappedFields.dayOfMonth.sort(function(a,b) { var aIsNumber = typeof a === 'number'; var bIsNumber = typeof b === 'number'; if (aIsNumber && bIsNumber) { return a - b; } if(!aIsNumber) { return 1; } return -1; }) } return new CronExpression(mappedFields, options); /** * Parses out the # special character for the dayOfWeek field & adds it to options. * * @param {String} val * @return {String} * @private */ function parseNthDay(val) { var atoms = val.split('#'); if (atoms.length > 1) { var nthValue = +atoms[atoms.length - 1]; if(/,/.test(val)) { throw new Error('Constraint error, invalid dayOfWeek `#` and `,` ' + 'special characters are incompatible'); } if(/\//.test(val)) { throw new Error('Constraint error, invalid dayOfWeek `#` and `/` ' + 'special characters are incompatible'); } if(/-/.test(val)) { throw new Error('Constraint error, invalid dayOfWeek `#` and `-` ' + 'special characters are incompatible'); } if (atoms.length > 2 || safeIsNaN(nthValue) || (nthValue < 1 || nthValue > 5)) { throw new Error('Constraint error, invalid dayOfWeek occurrence number (#)'); } options.nthDayOfWeek = nthValue; return atoms[0]; } return val; } } return parse(expression, options); }; module.exports = CronExpression; index.d.ts 0000664 00000004520 15103224214 0006442 0 ustar 00 export = CronParser declare class CronDate { addYear(): void addMonth(): void addDay(): void addHour(): void addMinute(): void addSecond(): void subtractYear(): void subtractMonth(): void subtractDay(): void subtractHour(): void subtractMinute(): void subtractSecond(): void getDate(): number getFullYear(): number getDay(): number getMonth(): number getHours(): number getMinutes(): number getSeconds(): number getMilliseconds(): number getTime(): number getUTCDate(): number getUTCFullYear(): number getUTCDay(): number getUTCMonth(): number getUTCHours(): number getUTCMinutes(): number getUTCSeconds(): number toISOString(): string toJSON(): string setDate(d: number): void setFullYear(y: number): void setDay(d: number): void setMonth(m: number): void setHours(h: number): void setMinutes(m: number): void setSeconds(s: number): void setMilliseconds(s: number): void getTime(): number toString(): string toDate(): Date } interface ParserOptions { currentDate?: string | number | Date startDate?: string | number | Date endDate?: string | number | Date iterator?: boolean utc?: boolean tz?: string } declare class CronExpression { constructor(fields: {}, options: {}) /** Find next suitable date */ next(): CronDate /** Find previous suitable date */ prev(): CronDate /** Check if next suitable date exists */ hasNext(): boolean /** Check if previous suitable date exists */ hasPrev(): boolean /** Iterate over expression iterator */ iterate(steps: number, callback?: (item: CronDate, i: number) => any): CronDate[] /** Reset expression iterator state */ reset(resetDate?: string | number | Date): void /** Parse input expression (async) */ parse(expression: string, options?: ParserOptions, callback?: () => any): CronExpression } interface StringResult { variables: { [key: string]: string }, expressions: CronExpression[], errors: { [key: string]: string } } declare namespace CronParser { /** Wrapper for CronExpression.parse method */ function parseExpression(expression: string, options?: ParserOptions): CronExpression /** Parse crontab file */ function parseFile(filePath: string, callback: (err: any, data: StringResult) => any): void /** Parse content string */ function parseString(data: string): StringResult } parser.js 0000664 00000004424 15103224214 0006376 0 ustar 00 'use strict'; var CronExpression = require('./expression'); function CronParser() {} /** * Parse crontab entry * * @private * @param {String} entry Crontab file entry/line */ CronParser._parseEntry = function _parseEntry (entry) { var atoms = entry.split(' '); if (atoms.length === 6) { return { interval: CronExpression.parse(entry) }; } else if (atoms.length > 6) { return { interval: CronExpression.parse( atoms.slice(0, 6).join(' ') ), command: atoms.slice(6, atoms.length) }; } else { throw new Error('Invalid entry: ' + entry); } }; /** * Wrapper for CronExpression.parser method * * @public * @param {String} expression Input expression * @param {Object} [options] Parsing options * @return {Object} */ CronParser.parseExpression = function parseExpression (expression, options, callback) { return CronExpression.parse(expression, options, callback); }; /** * Parse content string * * @public * @param {String} data Crontab content * @return {Object} */ CronParser.parseString = function parseString (data) { var self = this; var blocks = data.split('\n'); var response = { variables: {}, expressions: [], errors: {} }; for (var i = 0, c = blocks.length; i < c; i++) { var block = blocks[i]; var matches = null; var entry = block.replace(/^\s+|\s+$/g, ''); // Remove surrounding spaces if (entry.length > 0) { if (entry.match(/^#/)) { // Comment continue; } else if ((matches = entry.match(/^(.*)=(.*)$/))) { // Variable response.variables[matches[1]] = matches[2]; } else { // Expression? var result = null; try { result = self._parseEntry('0 ' + entry); response.expressions.push(result.interval); } catch (err) { response.errors[entry] = err; } } } } return response; }; /** * Parse crontab file * * @public * @param {String} filePath Path to file * @param {Function} callback */ CronParser.parseFile = function parseFile (filePath, callback) { require('fs').readFile(filePath, function(err, data) { if (err) { callback(err); return; } return callback(null, CronParser.parseString(data.toString())); }); }; module.exports = CronParser; browser.js 0000664 00000000145 15105452234 0006570 0 ustar 00 /* eslint-env browser */ module.exports = typeof self == 'object' ? self.FormData : window.FormData; form_data.js 0000664 00000027731 15105452234 0007053 0 ustar 00 var CombinedStream = require('combined-stream'); var util = require('util'); var path = require('path'); var http = require('http'); var https = require('https'); var parseUrl = require('url').parse; var fs = require('fs'); var mime = require('mime-types'); var asynckit = require('asynckit'); var populate = require('./populate.js'); // Public API module.exports = FormData; // make it a Stream util.inherits(FormData, CombinedStream); /** * Create readable "multipart/form-data" streams. * Can be used to submit forms * and file uploads to other web applications. * * @constructor * @param {Object} options - Properties to be added/overriden for FormData and CombinedStream */ function FormData(options) { if (!(this instanceof FormData)) { return new FormData(); } this._overheadLength = 0; this._valueLength = 0; this._valuesToMeasure = []; CombinedStream.call(this); options = options || {}; for (var option in options) { this[option] = options[option]; } } FormData.LINE_BREAK = '\r\n'; FormData.DEFAULT_CONTENT_TYPE = 'application/octet-stream'; FormData.prototype.append = function(field, value, options) { options = options || {}; // allow filename as single option if (typeof options == 'string') { options = {filename: options}; } var append = CombinedStream.prototype.append.bind(this); // all that streamy business can't handle numbers if (typeof value == 'number') { value = '' + value; } // https://github.com/felixge/node-form-data/issues/38 if (util.isArray(value)) { // Please convert your array into string // the way web server expects it this._error(new Error('Arrays are not supported.')); return; } var header = this._multiPartHeader(field, value, options); var footer = this._multiPartFooter(); append(header); append(value); append(footer); // pass along options.knownLength this._trackLength(header, value, options); }; FormData.prototype._trackLength = function(header, value, options) { var valueLength = 0; // used w/ getLengthSync(), when length is known. // e.g. for streaming directly from a remote server, // w/ a known file a size, and not wanting to wait for // incoming file to finish to get its size. if (options.knownLength != null) { valueLength += +options.knownLength; } else if (Buffer.isBuffer(value)) { valueLength = value.length; } else if (typeof value === 'string') { valueLength = Buffer.byteLength(value); } this._valueLength += valueLength; // @check why add CRLF? does this account for custom/multiple CRLFs? this._overheadLength += Buffer.byteLength(header) + FormData.LINE_BREAK.length; // empty or either doesn't have path or not an http response if (!value || ( !value.path && !(value.readable && value.hasOwnProperty('httpVersion')) )) { return; } // no need to bother with the length if (!options.knownLength) { this._valuesToMeasure.push(value); } }; FormData.prototype._lengthRetriever = function(value, callback) { if (value.hasOwnProperty('fd')) { // take read range into a account // `end` = Infinity –> read file till the end // // TODO: Looks like there is bug in Node fs.createReadStream // it doesn't respect `end` options without `start` options // Fix it when node fixes it. // https://github.com/joyent/node/issues/7819 if (value.end != undefined && value.end != Infinity && value.start != undefined) { // when end specified // no need to calculate range // inclusive, starts with 0 callback(null, value.end + 1 - (value.start ? value.start : 0)); // not that fast snoopy } else { // still need to fetch file size from fs fs.stat(value.path, function(err, stat) { var fileSize; if (err) { callback(err); return; } // update final size based on the range options fileSize = stat.size - (value.start ? value.start : 0); callback(null, fileSize); }); } // or http response } else if (value.hasOwnProperty('httpVersion')) { callback(null, +value.headers['content-length']); // or request stream http://github.com/mikeal/request } else if (value.hasOwnProperty('httpModule')) { // wait till response come back value.on('response', function(response) { value.pause(); callback(null, +response.headers['content-length']); }); value.resume(); // something else } else { callback('Unknown stream'); } }; FormData.prototype._multiPartHeader = function(field, value, options) { // custom header specified (as string)? // it becomes responsible for boundary // (e.g. to handle extra CRLFs on .NET servers) if (typeof options.header == 'string') { return options.header; } var contentDisposition = this._getContentDisposition(value, options); var contentType = this._getContentType(value, options); var contents = ''; var headers = { // add custom disposition as third element or keep it two elements if not 'Content-Disposition': ['form-data', 'name="' + field + '"'].concat(contentDisposition || []), // if no content type. allow it to be empty array 'Content-Type': [].concat(contentType || []) }; // allow custom headers. if (typeof options.header == 'object') { populate(headers, options.header); } var header; for (var prop in headers) { if (!headers.hasOwnProperty(prop)) continue; header = headers[prop]; // skip nullish headers. if (header == null) { continue; } // convert all headers to arrays. if (!Array.isArray(header)) { header = [header]; } // add non-empty headers. if (header.length) { contents += prop + ': ' + header.join('; ') + FormData.LINE_BREAK; } } return '--' + this.getBoundary() + FormData.LINE_BREAK + contents + FormData.LINE_BREAK; }; FormData.prototype._getContentDisposition = function(value, options) { var filename , contentDisposition ; if (typeof options.filepath === 'string') { // custom filepath for relative paths filename = path.normalize(options.filepath).replace(/\\/g, '/'); } else if (options.filename || value.name || value.path) { // custom filename take precedence // formidable and the browser add a name property // fs- and request- streams have path property filename = path.basename(options.filename || value.name || value.path); } else if (value.readable && value.hasOwnProperty('httpVersion')) { // or try http response filename = path.basename(value.client._httpMessage.path); } if (filename) { contentDisposition = 'filename="' + filename + '"'; } return contentDisposition; }; FormData.prototype._getContentType = function(value, options) { // use custom content-type above all var contentType = options.contentType; // or try `name` from formidable, browser if (!contentType && value.name) { contentType = mime.lookup(value.name); } // or try `path` from fs-, request- streams if (!contentType && value.path) { contentType = mime.lookup(value.path); } // or if it's http-reponse if (!contentType && value.readable && value.hasOwnProperty('httpVersion')) { contentType = value.headers['content-type']; } // or guess it from the filepath or filename if (!contentType && (options.filepath || options.filename)) { contentType = mime.lookup(options.filepath || options.filename); } // fallback to the default content type if `value` is not simple value if (!contentType && typeof value == 'object') { contentType = FormData.DEFAULT_CONTENT_TYPE; } return contentType; }; FormData.prototype._multiPartFooter = function() { return function(next) { var footer = FormData.LINE_BREAK; var lastPart = (this._streams.length === 0); if (lastPart) { footer += this._lastBoundary(); } next(footer); }.bind(this); }; FormData.prototype._lastBoundary = function() { return '--' + this.getBoundary() + '--' + FormData.LINE_BREAK; }; FormData.prototype.getHeaders = function(userHeaders) { var header; var formHeaders = { 'content-type': 'multipart/form-data; boundary=' + this.getBoundary() }; for (header in userHeaders) { if (userHeaders.hasOwnProperty(header)) { formHeaders[header.toLowerCase()] = userHeaders[header]; } } return formHeaders; }; FormData.prototype.getBoundary = function() { if (!this._boundary) { this._generateBoundary(); } return this._boundary; }; FormData.prototype._generateBoundary = function() { // This generates a 50 character boundary similar to those used by Firefox. // They are optimized for boyer-moore parsing. var boundary = '--------------------------'; for (var i = 0; i < 24; i++) { boundary += Math.floor(Math.random() * 10).toString(16); } this._boundary = boundary; }; // Note: getLengthSync DOESN'T calculate streams length // As workaround one can calculate file size manually // and add it as knownLength option FormData.prototype.getLengthSync = function() { var knownLength = this._overheadLength + this._valueLength; // Don't get confused, there are 3 "internal" streams for each keyval pair // so it basically checks if there is any value added to the form if (this._streams.length) { knownLength += this._lastBoundary().length; } // https://github.com/form-data/form-data/issues/40 if (!this.hasKnownLength()) { // Some async length retrievers are present // therefore synchronous length calculation is false. // Please use getLength(callback) to get proper length this._error(new Error('Cannot calculate proper length in synchronous way.')); } return knownLength; }; // Public API to check if length of added values is known // https://github.com/form-data/form-data/issues/196 // https://github.com/form-data/form-data/issues/262 FormData.prototype.hasKnownLength = function() { var hasKnownLength = true; if (this._valuesToMeasure.length) { hasKnownLength = false; } return hasKnownLength; }; FormData.prototype.getLength = function(cb) { var knownLength = this._overheadLength + this._valueLength; if (this._streams.length) { knownLength += this._lastBoundary().length; } if (!this._valuesToMeasure.length) { process.nextTick(cb.bind(this, null, knownLength)); return; } asynckit.parallel(this._valuesToMeasure, this._lengthRetriever, function(err, values) { if (err) { cb(err); return; } values.forEach(function(length) { knownLength += length; }); cb(null, knownLength); }); }; FormData.prototype.submit = function(params, cb) { var request , options , defaults = {method: 'post'} ; // parse provided url if it's string // or treat it as options object if (typeof params == 'string') { params = parseUrl(params); options = populate({ port: params.port, path: params.pathname, host: params.hostname, protocol: params.protocol }, defaults); // use custom params } else { options = populate(params, defaults); // if no port provided use default one if (!options.port) { options.port = options.protocol == 'https:' ? 443 : 80; } } // put that good code in getHeaders to some use options.headers = this.getHeaders(params.headers); // https if specified, fallback to http in any other case if (options.protocol == 'https:') { request = https.request(options); } else { request = http.request(options); } // get content length and fire away this.getLength(function(err, length) { if (err) { this._error(err); return; } // add content length request.setHeader('Content-Length', length); this.pipe(request); if (cb) { request.on('error', cb); request.on('response', cb.bind(this, null)); } }.bind(this)); return request; }; FormData.prototype._error = function(err) { if (!this.error) { this.error = err; this.pause(); this.emit('error', err); } }; FormData.prototype.toString = function () { return '[object FormData]'; }; populate.js 0000664 00000000261 15105452234 0006735 0 ustar 00 // populates missing values module.exports = function(dst, src) { Object.keys(src).forEach(function(prop) { dst[prop] = dst[prop] || src[prop]; }); return dst; };
| ver. 1.4 |
Github
|
.
| PHP 8.1.33 | Генерация страницы: 0.01 |
proxy
|
phpinfo
|
Настройка