1
This commit is contained in:
1
nodejs/node_modules/cron-parser/.idea/.name
generated
vendored
Executable file
1
nodejs/node_modules/cron-parser/.idea/.name
generated
vendored
Executable file
@ -0,0 +1 @@
|
||||
cron-parser
|
||||
8
nodejs/node_modules/cron-parser/.idea/cron-parser.iml
generated
vendored
Executable file
8
nodejs/node_modules/cron-parser/.idea/cron-parser.iml
generated
vendored
Executable file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="WEB_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
6
nodejs/node_modules/cron-parser/.idea/encodings.xml
generated
vendored
Executable file
6
nodejs/node_modules/cron-parser/.idea/encodings.xml
generated
vendored
Executable file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding">
|
||||
<file url="PROJECT" charset="UTF-8" />
|
||||
</component>
|
||||
</project>
|
||||
6
nodejs/node_modules/cron-parser/.idea/jsLibraryMappings.xml
generated
vendored
Executable file
6
nodejs/node_modules/cron-parser/.idea/jsLibraryMappings.xml
generated
vendored
Executable file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="JavaScriptLibraryMappings">
|
||||
<file url="file://$PROJECT_DIR$" libraries="{cron-parser/node_modules}" />
|
||||
</component>
|
||||
</project>
|
||||
8
nodejs/node_modules/cron-parser/.idea/modules.xml
generated
vendored
Executable file
8
nodejs/node_modules/cron-parser/.idea/modules.xml
generated
vendored
Executable file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/cron-parser.iml" filepath="$PROJECT_DIR$/.idea/cron-parser.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
6
nodejs/node_modules/cron-parser/.idea/vcs.xml
generated
vendored
Executable file
6
nodejs/node_modules/cron-parser/.idea/vcs.xml
generated
vendored
Executable file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
363
nodejs/node_modules/cron-parser/.idea/workspace.xml
generated
vendored
Executable file
363
nodejs/node_modules/cron-parser/.idea/workspace.xml
generated
vendored
Executable file
@ -0,0 +1,363 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="3b49e1a9-cdb2-4d4f-9d28-ba3b9a2392c0" name="Default" comment="">
|
||||
<change beforePath="$PROJECT_DIR$/component.json" beforeDir="false" afterPath="$PROJECT_DIR$/component.json" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/package.json" beforeDir="false" afterPath="$PROJECT_DIR$/package.json" afterDir="false" />
|
||||
</list>
|
||||
<ignored path="cron-parser.iws" />
|
||||
<ignored path=".idea/workspace.xml" />
|
||||
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||
</component>
|
||||
<component name="CreatePatchCommitExecutor">
|
||||
<option name="PATCH_PATH" value="" />
|
||||
</component>
|
||||
<component name="FUSProjectUsageTrigger">
|
||||
<session id="-29665231">
|
||||
<usages-collector id="statistics.lifecycle.project">
|
||||
<counts>
|
||||
<entry key="project.closed" value="1" />
|
||||
<entry key="project.open.time.1" value="2" />
|
||||
<entry key="project.opened" value="2" />
|
||||
</counts>
|
||||
</usages-collector>
|
||||
<usages-collector id="statistics.file.extensions.edit">
|
||||
<counts>
|
||||
<entry key="js" value="550" />
|
||||
<entry key="json" value="3" />
|
||||
</counts>
|
||||
</usages-collector>
|
||||
<usages-collector id="statistics.file.types.edit">
|
||||
<counts>
|
||||
<entry key="JSON" value="3" />
|
||||
<entry key="JavaScript" value="550" />
|
||||
</counts>
|
||||
</usages-collector>
|
||||
<usages-collector id="statistics.file.extensions.open">
|
||||
<counts>
|
||||
<entry key="json" value="2" />
|
||||
</counts>
|
||||
</usages-collector>
|
||||
<usages-collector id="statistics.file.types.open">
|
||||
<counts>
|
||||
<entry key="JSON" value="2" />
|
||||
</counts>
|
||||
</usages-collector>
|
||||
</session>
|
||||
</component>
|
||||
<component name="FavoritesManager">
|
||||
<favorites_list name="cron-parser" />
|
||||
</component>
|
||||
<component name="FileEditorManager">
|
||||
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/package.json">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="30">
|
||||
<caret line="2" column="17" selection-start-line="2" selection-start-column="17" selection-end-line="2" selection-end-column="17" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/lib/expression.js">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="-211">
|
||||
<caret line="427" selection-start-line="427" selection-end-line="427" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="true">
|
||||
<entry file="file://$PROJECT_DIR$/component.json">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="60">
|
||||
<caret line="4" column="17" selection-start-line="4" selection-start-column="17" selection-end-line="4" selection-end-column="17" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/test.js">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="15">
|
||||
<caret line="1" column="52" selection-start-line="1" selection-start-column="52" selection-end-line="1" selection-end-column="52" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
</leaf>
|
||||
</component>
|
||||
<component name="FindInProjectRecents">
|
||||
<findStrings>
|
||||
<find>iterator</find>
|
||||
<find>Dec</find>
|
||||
<find>currentDate</find>
|
||||
<find>const</find>
|
||||
<find>range</find>
|
||||
<find>explicit day of month definition</find>
|
||||
<find>Invalid explicit day of month definition</find>
|
||||
<find>yearly</find>
|
||||
<find>_parseField</find>
|
||||
<find>callback</find>
|
||||
</findStrings>
|
||||
<dirStrings>
|
||||
<dir>$PROJECT_DIR$/test</dir>
|
||||
<dir>$PROJECT_DIR$/lib</dir>
|
||||
</dirStrings>
|
||||
</component>
|
||||
<component name="Git.Settings">
|
||||
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||
</component>
|
||||
<component name="IdeDocumentHistory">
|
||||
<option name="CHANGED_PATHS">
|
||||
<list>
|
||||
<option value="$PROJECT_DIR$/README.md" />
|
||||
<option value="$PROJECT_DIR$/lib/date.js" />
|
||||
<option value="$PROJECT_DIR$/test/expression.js" />
|
||||
<option value="$PROJECT_DIR$/.travis.yml" />
|
||||
<option value="$PROJECT_DIR$/test.js" />
|
||||
<option value="$PROJECT_DIR$/lib/expression.js" />
|
||||
<option value="$PROJECT_DIR$/package.json" />
|
||||
<option value="$PROJECT_DIR$/component.json" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
<component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
|
||||
<component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER">
|
||||
<package-json value="$PROJECT_DIR$/package.json" />
|
||||
</component>
|
||||
<component name="JsGulpfileManager">
|
||||
<detection-done>true</detection-done>
|
||||
<sorting>DEFINITION_ORDER</sorting>
|
||||
</component>
|
||||
<component name="NodeModulesDirectoryManager">
|
||||
<handled-path value="$PROJECT_DIR$/node_modules" />
|
||||
</component>
|
||||
<component name="NodePackageJsonFileManager">
|
||||
<packageJsonPaths>
|
||||
<path value="$PROJECT_DIR$/package.json" />
|
||||
</packageJsonPaths>
|
||||
</component>
|
||||
<component name="ProjectFrameBounds">
|
||||
<option name="y" value="23" />
|
||||
<option name="width" value="1440" />
|
||||
<option name="height" value="873" />
|
||||
</component>
|
||||
<component name="ProjectView">
|
||||
<navigator proportions="" version="1">
|
||||
<foldersAlwaysOnTop value="true" />
|
||||
</navigator>
|
||||
<panes>
|
||||
<pane id="ProjectPane">
|
||||
<subPane>
|
||||
<expand>
|
||||
<path>
|
||||
<item name="cron-parser" type="b2602c69:ProjectViewProjectNode" />
|
||||
<item name="cron-parser" type="462c0819:PsiDirectoryNode" />
|
||||
</path>
|
||||
<path>
|
||||
<item name="cron-parser" type="b2602c69:ProjectViewProjectNode" />
|
||||
<item name="cron-parser" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="lib" type="462c0819:PsiDirectoryNode" />
|
||||
</path>
|
||||
<path>
|
||||
<item name="cron-parser" type="b2602c69:ProjectViewProjectNode" />
|
||||
<item name="cron-parser" type="462c0819:PsiDirectoryNode" />
|
||||
<item name="test" type="462c0819:PsiDirectoryNode" />
|
||||
</path>
|
||||
</expand>
|
||||
<select />
|
||||
</subPane>
|
||||
</pane>
|
||||
<pane id="Scope" />
|
||||
</panes>
|
||||
</component>
|
||||
<component name="PropertiesComponent">
|
||||
<property name="HbShouldOpenHtmlAsHb" value="" />
|
||||
<property name="WebServerToolWindowFactoryState" value="false" />
|
||||
<property name="javascript.nodejs.core.library.configured.version" value="4.2.1" />
|
||||
<property name="js-jscs-nodeInterpreter" value="/usr/local/bin/node" />
|
||||
<property name="js.eslint.eslintPackage" value="/usr/local/lib/node_modules/eslint" />
|
||||
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
|
||||
<property name="node.js.detected.package.prettier" value="true" />
|
||||
<property name="node.js.path.for.package.prettier" value="project" />
|
||||
<property name="node.js.selected.package.prettier" value="" />
|
||||
<property name="nodejs_interpreter_path" value="node" />
|
||||
</component>
|
||||
<component name="RunDashboard">
|
||||
<option name="ruleStates">
|
||||
<list>
|
||||
<RuleState>
|
||||
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
|
||||
</RuleState>
|
||||
<RuleState>
|
||||
<option name="name" value="StatusDashboardGroupingRule" />
|
||||
</RuleState>
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
<component name="RunManager">
|
||||
<configuration default="true" type="js.build_tools.gulp" factoryName="Gulp.js">
|
||||
<node-interpreter>project</node-interpreter>
|
||||
<node-options />
|
||||
<gulpfile />
|
||||
<tasks />
|
||||
<arguments />
|
||||
<envs />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<configuration default="true" type="mocha-javascript-test-runner" factoryName="Mocha">
|
||||
<node-interpreter>/usr/local/bin/node</node-interpreter>
|
||||
<node-options />
|
||||
<working-directory>$PROJECT_DIR$</working-directory>
|
||||
<pass-parent-env>true</pass-parent-env>
|
||||
<ui>bdd</ui>
|
||||
<extra-mocha-options />
|
||||
<test-kind>DIRECTORY</test-kind>
|
||||
<test-directory />
|
||||
<recursive>false</recursive>
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
</component>
|
||||
<component name="SvnConfiguration">
|
||||
<configuration />
|
||||
</component>
|
||||
<component name="TaskManager">
|
||||
<task active="true" id="Default" summary="Default task">
|
||||
<changelist id="3b49e1a9-cdb2-4d4f-9d28-ba3b9a2392c0" name="Default" comment="" />
|
||||
<created>1442076131230</created>
|
||||
<option name="number" value="Default" />
|
||||
<option name="presentableId" value="Default" />
|
||||
<updated>1442076131230</updated>
|
||||
<workItem from="1458542545259" duration="804000" />
|
||||
<workItem from="1458590396644" duration="1246000" />
|
||||
<workItem from="1458915118974" duration="1586000" />
|
||||
<workItem from="1464804181347" duration="1721000" />
|
||||
</task>
|
||||
<servers />
|
||||
</component>
|
||||
<component name="TimeTrackingManager">
|
||||
<option name="totallyTimeSpent" value="5357000" />
|
||||
</component>
|
||||
<component name="ToolWindowManager">
|
||||
<frame x="0" y="23" width="1440" height="873" extended-state="0" />
|
||||
<editor active="true" />
|
||||
<layout>
|
||||
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.25" />
|
||||
<window_info id="Structure" order="1" side_tool="true" weight="0.25" />
|
||||
<window_info id="npm" order="2" side_tool="true" />
|
||||
<window_info id="Favorites" order="3" side_tool="true" />
|
||||
<window_info anchor="bottom" id="Message" order="0" />
|
||||
<window_info anchor="bottom" id="Find" order="1" weight="0.329602" />
|
||||
<window_info anchor="bottom" id="Run" order="2" />
|
||||
<window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
|
||||
<window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
|
||||
<window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
|
||||
<window_info anchor="bottom" id="TODO" order="6" />
|
||||
<window_info anchor="bottom" id="Terminal" order="7" />
|
||||
<window_info anchor="bottom" id="Event Log" order="8" side_tool="true" />
|
||||
<window_info anchor="bottom" id="Version Control" order="9" />
|
||||
<window_info anchor="bottom" id="Application Servers" order="10" />
|
||||
<window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
|
||||
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
|
||||
<window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
|
||||
</layout>
|
||||
</component>
|
||||
<component name="TypeScriptGeneratedFilesManager">
|
||||
<option name="version" value="1" />
|
||||
</component>
|
||||
<component name="Vcs.Log.UiProperties">
|
||||
<option name="RECENTLY_FILTERED_USER_GROUPS">
|
||||
<collection />
|
||||
</option>
|
||||
<option name="RECENTLY_FILTERED_BRANCH_GROUPS">
|
||||
<collection />
|
||||
</option>
|
||||
</component>
|
||||
<component name="VcsContentAnnotationSettings">
|
||||
<option name="myLimit" value="2678400000" />
|
||||
</component>
|
||||
<component name="editorHistoryManager">
|
||||
<entry file="file://$PROJECT_DIR$/test/parser.js">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="-19" />
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/lib/parser.js">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="-64">
|
||||
<caret line="58" column="35" selection-start-line="58" selection-start-column="34" selection-end-line="58" selection-end-column="35" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/test/31_of_month.js">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="84">
|
||||
<caret line="6" column="37" selection-start-line="6" selection-start-column="37" selection-end-line="6" selection-end-column="47" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/lib/date.js">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="406">
|
||||
<caret line="29" column="3" selection-start-line="29" selection-start-column="3" selection-end-line="29" selection-end-column="3" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/README.md">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="406">
|
||||
<caret line="69" column="29" selection-start-line="69" selection-start-column="29" selection-end-line="69" selection-end-column="29" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/index.html" />
|
||||
<entry file="file://$PROJECT_DIR$/.travis.yml">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="75">
|
||||
<caret line="5" column="6" selection-start-line="5" selection-start-column="6" selection-end-line="5" selection-end-column="6" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/test/expression.js">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="10815">
|
||||
<caret line="721" column="4" selection-start-line="721" selection-start-column="4" selection-end-line="721" selection-end-column="4" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/lib/expression.js">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="-211">
|
||||
<caret line="427" selection-start-line="427" selection-end-line="427" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/test.js">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="15">
|
||||
<caret line="1" column="52" selection-start-line="1" selection-start-column="52" selection-end-line="1" selection-end-column="52" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/package.json">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="30">
|
||||
<caret line="2" column="17" selection-start-line="2" selection-start-column="17" selection-end-line="2" selection-end-column="17" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/component.json">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="60">
|
||||
<caret line="4" column="17" selection-start-line="4" selection-start-column="17" selection-end-line="4" selection-end-column="17" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</component>
|
||||
</project>
|
||||
8
nodejs/node_modules/cron-parser/.travis.yml
generated
vendored
Executable file
8
nodejs/node_modules/cron-parser/.travis.yml
generated
vendored
Executable file
@ -0,0 +1,8 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- "4"
|
||||
- "5"
|
||||
- "6"
|
||||
- "8"
|
||||
- "0.12"
|
||||
- "0.10"
|
||||
21
nodejs/node_modules/cron-parser/LICENSE
generated
vendored
Executable file
21
nodejs/node_modules/cron-parser/LICENSE
generated
vendored
Executable file
@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014-2016 Harri Siirak
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
129
nodejs/node_modules/cron-parser/README.md
generated
vendored
Executable file
129
nodejs/node_modules/cron-parser/README.md
generated
vendored
Executable file
@ -0,0 +1,129 @@
|
||||
cron-parser
|
||||
================
|
||||
|
||||
[](https://travis-ci.org/harrisiirak/cron-parser)
|
||||
[](http://badge.fury.io/js/cron-parser)
|
||||
|
||||
Node.js library for parsing crontab instructions. It includes support for timezones and DST transitions.
|
||||
|
||||
Setup
|
||||
========
|
||||
```bash
|
||||
npm install cron-parser
|
||||
```
|
||||
|
||||
Supported format
|
||||
========
|
||||
|
||||
```
|
||||
* * * * * *
|
||||
┬ ┬ ┬ ┬ ┬ ┬
|
||||
│ │ │ │ │ |
|
||||
│ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun)
|
||||
│ │ │ │ └───── month (1 - 12)
|
||||
│ │ │ └────────── day of month (1 - 31)
|
||||
│ │ └─────────────── hour (0 - 23)
|
||||
│ └──────────────────── minute (0 - 59)
|
||||
└───────────────────────── second (0 - 59, optional)
|
||||
```
|
||||
|
||||
Supports mixed use of ranges and range increments (L, W and # characters are not supported currently). See tests for examples.
|
||||
|
||||
Usage
|
||||
========
|
||||
|
||||
Simple expression.
|
||||
|
||||
```javascript
|
||||
var parser = require('cron-parser');
|
||||
|
||||
try {
|
||||
var interval = parser.parseExpression('*/2 * * * *');
|
||||
|
||||
console.log('Date: ', interval.next().toString()); // Sat Dec 29 2012 00:42:00 GMT+0200 (EET)
|
||||
console.log('Date: ', interval.next().toString()); // Sat Dec 29 2012 00:44:00 GMT+0200 (EET)
|
||||
|
||||
console.log('Date: ', interval.prev().toString()); // Sat Dec 29 2012 00:42:00 GMT+0200 (EET)
|
||||
console.log('Date: ', interval.prev().toString()); // Sat Dec 29 2012 00:40:00 GMT+0200 (EET)
|
||||
} catch (err) {
|
||||
console.log('Error: ' + err.message);
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
Iteration with limited timespan. Also returns ES6 compatible iterator (when iterator flag is set to true).
|
||||
|
||||
```javascript
|
||||
var parser = require('cron-parser');
|
||||
|
||||
var options = {
|
||||
currentDate: new Date('Wed, 26 Dec 2012 12:38:53 UTC'),
|
||||
endDate: new Date('Wed, 26 Dec 2012 14:40:00 UTC'),
|
||||
iterator: true
|
||||
};
|
||||
|
||||
try {
|
||||
var interval = parser.parseExpression('*/22 * * * *', options);
|
||||
|
||||
while (true) {
|
||||
try {
|
||||
var obj = interval.next();
|
||||
console.log('value:', obj.value.toString(), 'done:', obj.done);
|
||||
} catch (e) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// value: Wed Dec 26 2012 14:44:00 GMT+0200 (EET) done: false
|
||||
// value: Wed Dec 26 2012 15:00:00 GMT+0200 (EET) done: false
|
||||
// value: Wed Dec 26 2012 15:22:00 GMT+0200 (EET) done: false
|
||||
// value: Wed Dec 26 2012 15:44:00 GMT+0200 (EET) done: false
|
||||
// value: Wed Dec 26 2012 16:00:00 GMT+0200 (EET) done: false
|
||||
// value: Wed Dec 26 2012 16:22:00 GMT+0200 (EET) done: true
|
||||
} catch (err) {
|
||||
console.log('Error: ' + err.message);
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
Timezone support
|
||||
|
||||
```javascript
|
||||
var parser = require('cron-parser');
|
||||
|
||||
var options = {
|
||||
currentDate: '2016-03-27 00:00:01',
|
||||
tz: 'Europe/Athens'
|
||||
};
|
||||
|
||||
try {
|
||||
var interval = parser.parseExpression('0 * * * *', options);
|
||||
|
||||
console.log('Date: ', interval.next().toString()); // Date: Sun Mar 27 2016 01:00:00 GMT+0200
|
||||
console.log('Date: ', interval.next().toString()); // Date: Sun Mar 27 2016 02:00:00 GMT+0200
|
||||
console.log('Date: ', interval.next().toString()); // Date: Sun Mar 27 2016 04:00:00 GMT+0300 (Notice DST transition)
|
||||
} catch (err) {
|
||||
console.log('Error: ' + err.message);
|
||||
}
|
||||
```
|
||||
|
||||
Options
|
||||
========
|
||||
|
||||
* *currentDate* - Start date of the iteration
|
||||
* *endDate* - End date of the iteration
|
||||
|
||||
`currentDate` and `endDate` accept `string`, `integer` and `Date` as input.
|
||||
|
||||
In case of using `string` as input, not every string format accepted
|
||||
by the `Date` constructor will work correctly. The supported formats are: [`ISO8601`](http://momentjs.com/docs/#/parsing/string/) and the older
|
||||
[`ASP.NET JSON Date`](http://momentjs.com/docs/#/parsing/asp-net-json-date/) format. The reason being that those are the formats accepted by the
|
||||
[`moment`](http://momentjs.com) library which is being used to handle dates.
|
||||
|
||||
Using `Date` as an input can be problematic specially when using the `tz` option. The issue being that, when creating a new `Date` object without
|
||||
any timezone information, it will be created in the timezone of the system that is running the code. This (most of times) won't be what the user
|
||||
will be expecting. Using one of the supported `string` formats will solve the issue(see timezone example).
|
||||
|
||||
* *iterator* - Return ES6 compatible iterator object
|
||||
* *utc* - Enable UTC
|
||||
* *tz* - Timezone string. It won't be used in case `utc` is enabled
|
||||
11
nodejs/node_modules/cron-parser/component.json
generated
vendored
Executable file
11
nodejs/node_modules/cron-parser/component.json
generated
vendored
Executable file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"name": "cron-parser",
|
||||
"repo": "harrisiirak/cron-parser",
|
||||
"description": "Node.js library for parsing crontab instructions",
|
||||
"version": "2.6.0",
|
||||
"keywords": ["cron", "crontab", "parser"],
|
||||
"dependencies": {},
|
||||
"development": {},
|
||||
"main": "lib/parser.js",
|
||||
"scripts": [ "lib/parser.js", "lib/expression.js", "lib/date.js" ]
|
||||
}
|
||||
209
nodejs/node_modules/cron-parser/lib/date.js
generated
vendored
Executable file
209
nodejs/node_modules/cron-parser/lib/date.js
generated
vendored
Executable file
@ -0,0 +1,209 @@
|
||||
'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();
|
||||
};
|
||||
|
||||
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;
|
||||
737
nodejs/node_modules/cron-parser/lib/expression.js
generated
vendored
Executable file
737
nodejs/node_modules/cron-parser/lib/expression.js
generated
vendored
Executable file
@ -0,0 +1,737 @@
|
||||
'use strict';
|
||||
|
||||
// Load Date class extensions
|
||||
var CronDate = require('./date');
|
||||
|
||||
// Get Number.isNaN or the polyfill
|
||||
var safeIsNaN = require('is-nan');
|
||||
|
||||
/**
|
||||
* 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 = {};
|
||||
this._isIterator = options.iterator || false;
|
||||
this._hasIterated = false;
|
||||
|
||||
// Map fields
|
||||
for (var i = 0, c = CronExpression.map.length; i < c; i++) {
|
||||
var key = CronExpression.map[i];
|
||||
this._fields[key] = fields[i];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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,
|
||||
28,
|
||||
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.dayValidCharacters = /^[\d|/|*|\-|,|\?]+$/;
|
||||
CronExpression.validCharacters = {
|
||||
second: CronExpression.standardValidCharacters,
|
||||
minute: CronExpression.standardValidCharacters,
|
||||
hour: CronExpression.standardValidCharacters,
|
||||
dayOfMonth: CronExpression.dayValidCharacters,
|
||||
month: CronExpression.standardValidCharacters,
|
||||
dayOfWeek: CronExpression.dayValidCharacters,
|
||||
}
|
||||
|
||||
/**
|
||||
* 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) {
|
||||
var max = stack.length > 0 ? Math.max.apply(Math, stack) : -1;
|
||||
|
||||
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]
|
||||
);
|
||||
}
|
||||
|
||||
if (value > max) {
|
||||
stack.push(value);
|
||||
}
|
||||
|
||||
max = Math.max.apply(Math, stack);
|
||||
}
|
||||
} else { // Scalar value
|
||||
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.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) {
|
||||
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 || !atoms[0].length) {
|
||||
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 +val;
|
||||
}
|
||||
|
||||
return parseSequence(value);
|
||||
};
|
||||
|
||||
CronExpression.prototype._applyTimezoneShift = function(currentDate, method) {
|
||||
var previousHour = currentDate.getHours();
|
||||
currentDate[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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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));
|
||||
}
|
||||
|
||||
// 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 initial_ts = currentDate.getTime();
|
||||
while (true) {
|
||||
// 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);
|
||||
var dayOfWeekMatch = matchSchedule(currentDate.getDay(), this._fields.dayOfWeek);
|
||||
|
||||
var isDayOfMonthWildcardMatch = isWildcardRange(this._fields.dayOfMonth, CronExpression.constraints[3]);
|
||||
var isMonthWildcardMatch = isWildcardRange(this._fields.month, CronExpression.constraints[4]);
|
||||
var isDayOfWeekWildcardMatch = isWildcardRange(this._fields.dayOfWeek, CronExpression.constraints[5]);
|
||||
|
||||
var currentHour = currentDate.getHours();
|
||||
|
||||
// Validate days in month if explicit value is given
|
||||
if (!isMonthWildcardMatch) {
|
||||
var currentYear = currentDate.getFullYear();
|
||||
var currentMonth = currentDate.getMonth() + 1;
|
||||
var previousMonth = currentMonth === 1 ? 11 : currentMonth - 1;
|
||||
var daysInPreviousMonth = CronExpression.daysInMonth[previousMonth - 1];
|
||||
var daysOfMontRangeMax = this._fields.dayOfMonth[this._fields.dayOfMonth.length - 1];
|
||||
|
||||
var _daysInPreviousMonth = daysInPreviousMonth;
|
||||
var _daysOfMontRangeMax = daysOfMontRangeMax;
|
||||
|
||||
// Handle leap year
|
||||
var isLeap = !((currentYear % 4) || (!(currentYear % 100) && (currentYear % 400)));
|
||||
if (isLeap) {
|
||||
_daysInPreviousMonth = 29;
|
||||
_daysOfMontRangeMax = 29;
|
||||
}
|
||||
|
||||
if (this._fields.month[0] === previousMonth && _daysInPreviousMonth < _daysOfMontRangeMax) {
|
||||
throw new Error('Invalid explicit day of month definition');
|
||||
}
|
||||
}
|
||||
|
||||
// Add or subtract day if select day not match with month (according to calendar)
|
||||
if (!dayOfMonthMatch && !dayOfWeekMatch) {
|
||||
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) {
|
||||
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) {
|
||||
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) {
|
||||
currentDate[dateMathVerb + 'Day']();
|
||||
continue;
|
||||
}
|
||||
|
||||
// Match month
|
||||
if (!matchSchedule(currentDate.getMonth() + 1, this._fields.month)) {
|
||||
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, 'addHour');
|
||||
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 (initial_ts === currentDate.getTime()) {
|
||||
if ((dateMathVerb === 'add') || (currentDate.getMilliseconds() === 0)) {
|
||||
this._applyTimezoneShift(currentDate, dateMathVerb + 'Second');
|
||||
} else {
|
||||
currentDate.setMilliseconds(0);
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
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 () {
|
||||
this._currentDate = new CronDate(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+/);
|
||||
|
||||
// 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) {
|
||||
fields.push(CronExpression._parseField(
|
||||
field,
|
||||
CronExpression.parseDefaults[i],
|
||||
CronExpression.constraints[i])
|
||||
);
|
||||
} else { // Use default value
|
||||
fields.push(CronExpression._parseField(
|
||||
field,
|
||||
value,
|
||||
CronExpression.constraints[i])
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return new CronExpression(fields, options);
|
||||
}
|
||||
|
||||
return parse(expression, options);
|
||||
};
|
||||
|
||||
module.exports = CronExpression;
|
||||
97
nodejs/node_modules/cron-parser/lib/index.d.ts
generated
vendored
Executable file
97
nodejs/node_modules/cron-parser/lib/index.d.ts
generated
vendored
Executable file
@ -0,0 +1,97 @@
|
||||
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(): 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
|
||||
}
|
||||
103
nodejs/node_modules/cron-parser/lib/parser.js
generated
vendored
Executable file
103
nodejs/node_modules/cron-parser/lib/parser.js
generated
vendored
Executable file
@ -0,0 +1,103 @@
|
||||
'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(entry),
|
||||
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;
|
||||
136
nodejs/node_modules/cron-parser/package.json
generated
vendored
Executable file
136
nodejs/node_modules/cron-parser/package.json
generated
vendored
Executable file
@ -0,0 +1,136 @@
|
||||
{
|
||||
"_args": [
|
||||
[
|
||||
"cron-parser@2.6.0",
|
||||
"/www/wwwroot/Adminx.cc/nodejs"
|
||||
]
|
||||
],
|
||||
"_from": "cron-parser@2.6.0",
|
||||
"_id": "cron-parser@2.6.0",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-KGfDDTjBIx85MnVYcdhLccoJH/7jcYW+5Z/t3Wsg2QlJhmmjf+97z+9sQftS71lopOYYapjEKEvmWaCsym5Z4g==",
|
||||
"_location": "/cron-parser",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "version",
|
||||
"registry": true,
|
||||
"raw": "cron-parser@2.6.0",
|
||||
"name": "cron-parser",
|
||||
"escapedName": "cron-parser",
|
||||
"rawSpec": "2.6.0",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "2.6.0"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/node-schedule"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-2.6.0.tgz",
|
||||
"_spec": "2.6.0",
|
||||
"_where": "/www/wwwroot/Adminx.cc/nodejs",
|
||||
"author": {
|
||||
"name": "Harri Siirak"
|
||||
},
|
||||
"browser": {
|
||||
"fs": false
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/harrisiirak/cron-parser/issues"
|
||||
},
|
||||
"contributors": [
|
||||
{
|
||||
"name": "Nicholas Clawson"
|
||||
},
|
||||
{
|
||||
"name": "Daniel Prentis",
|
||||
"email": "daniel@salsitasoft.com"
|
||||
},
|
||||
{
|
||||
"name": "Renault John Lecoultre"
|
||||
},
|
||||
{
|
||||
"name": "Richard Astbury",
|
||||
"email": "richard.astbury@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Meaglin Wasabi",
|
||||
"email": "Meaglin.wasabi@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Mike Kusold",
|
||||
"email": "hello@mikekusold.com"
|
||||
},
|
||||
{
|
||||
"name": "Alex Kit",
|
||||
"email": "alex.kit@atmajs.com"
|
||||
},
|
||||
{
|
||||
"name": "Santiago Gimeno",
|
||||
"email": "santiago.gimeno@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Daniel",
|
||||
"email": "darc.tec@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Christian Steininger",
|
||||
"email": "christian.steininger.cs@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Mykola Piskovyi",
|
||||
"email": "m.piskovyi@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Brian Vaughn",
|
||||
"email": "brian.david.vaughn@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Nicholas Clawson",
|
||||
"email": "nickclaw@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Yasuhiroki",
|
||||
"email": "yasuhiroki.duck@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Nicholas Clawson",
|
||||
"email": "nickclaw@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Brendan Warkentin",
|
||||
"email": "faazshift@gmail.com"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"is-nan": "^1.2.1",
|
||||
"moment-timezone": "^0.5.0"
|
||||
},
|
||||
"description": "Node.js library for parsing crontab instructions",
|
||||
"devDependencies": {
|
||||
"sinon": "^1.17.7",
|
||||
"tap": "^0.5.0"
|
||||
},
|
||||
"directories": {
|
||||
"test": "test"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.8"
|
||||
},
|
||||
"homepage": "https://github.com/harrisiirak/cron-parser#readme",
|
||||
"keywords": [
|
||||
"cron",
|
||||
"crontab",
|
||||
"parser"
|
||||
],
|
||||
"license": "MIT",
|
||||
"main": "lib/parser.js",
|
||||
"name": "cron-parser",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/harrisiirak/cron-parser.git"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "tap ./test/*.js"
|
||||
},
|
||||
"types": "lib/index.d.ts",
|
||||
"version": "2.6.0"
|
||||
}
|
||||
17
nodejs/node_modules/cron-parser/test/31_of_month.js
generated
vendored
Executable file
17
nodejs/node_modules/cron-parser/test/31_of_month.js
generated
vendored
Executable file
@ -0,0 +1,17 @@
|
||||
var util = require('util');
|
||||
var test = require('tap').test;
|
||||
var expression = require('../lib/expression');
|
||||
|
||||
test('expression 31 of month', function(t) {
|
||||
try {
|
||||
var interval = expression.parse('0 0 31 * *');
|
||||
var i;
|
||||
var d;
|
||||
for (i = 0; i < 20; ++i) {
|
||||
d = interval.next();
|
||||
}
|
||||
t.end();
|
||||
} catch (err) {
|
||||
t.ifError(err, 'Interval parse error');
|
||||
}
|
||||
});
|
||||
32
nodejs/node_modules/cron-parser/test/bug.js
generated
vendored
Executable file
32
nodejs/node_modules/cron-parser/test/bug.js
generated
vendored
Executable file
@ -0,0 +1,32 @@
|
||||
var util = require('util');
|
||||
var test = require('tap').test;
|
||||
var CronExpression = require('../lib/expression');
|
||||
var CronDate = require('../lib/date');
|
||||
|
||||
|
||||
test('parse expression as UTC', function(t) {
|
||||
try {
|
||||
var options = {
|
||||
utc: true
|
||||
};
|
||||
|
||||
var interval = CronExpression.parse('0 0 10 * * *', options);
|
||||
|
||||
var date = interval.next();
|
||||
console.log(date.toString());
|
||||
t.equal(date.getUTCHours(), 10, 'Correct UTC hour value');
|
||||
|
||||
interval = CronExpression.parse('0 */5 * * * *', options);
|
||||
|
||||
var date = interval.next(), now = new Date();
|
||||
console.log(date.toString());
|
||||
now.setMinutes(now.getMinutes() + 5 - (now.getMinutes() % 5));
|
||||
console.log(now.toString(), date.getUTCHours(), now.getUTCHours());
|
||||
t.equal(date.getHours(), now.getUTCHours(), 'Correct local time for 5 minute interval');
|
||||
|
||||
} catch (err) {
|
||||
t.ifError(err, 'UTC parse error');
|
||||
}
|
||||
|
||||
t.end();
|
||||
});
|
||||
7
nodejs/node_modules/cron-parser/test/crontab.example
generated
vendored
Executable file
7
nodejs/node_modules/cron-parser/test/crontab.example
generated
vendored
Executable file
@ -0,0 +1,7 @@
|
||||
# Comment line (ignore)
|
||||
ENV1="test1"
|
||||
ENV2="test2"
|
||||
|
||||
*/10 * * * * /path/to/exe
|
||||
*/10 * * * * /path/to/exe
|
||||
0 09-18 * * 1-5 /path/to/exe
|
||||
1009
nodejs/node_modules/cron-parser/test/expression.js
generated
vendored
Executable file
1009
nodejs/node_modules/cron-parser/test/expression.js
generated
vendored
Executable file
File diff suppressed because it is too large
Load Diff
22
nodejs/node_modules/cron-parser/test/increment_on_first_iteration.js
generated
vendored
Executable file
22
nodejs/node_modules/cron-parser/test/increment_on_first_iteration.js
generated
vendored
Executable file
@ -0,0 +1,22 @@
|
||||
var util = require('util');
|
||||
var sinon = require('sinon');
|
||||
var test = require('tap').test;
|
||||
var CronExpression = require('../lib/expression');
|
||||
|
||||
test('increment_on_first_itereation', function(t) {
|
||||
try {
|
||||
var clock = sinon.useFakeTimers();
|
||||
var fake_now = new Date('Tue Feb 21 2017 16:45:00');
|
||||
clock.tick(fake_now.getTime());
|
||||
var interval = CronExpression.parse('* * * * *');
|
||||
t.ok(interval, 'Interval parsed');
|
||||
var next = interval.next();
|
||||
t.ok(next, 'Found next scheduled interval');
|
||||
// Make sure next has incremented in 1 minute
|
||||
t.equal(fake_now.getTime() + 60000, next.getTime());
|
||||
clock.restore();
|
||||
t.end();
|
||||
} catch (err) {
|
||||
t.ifError(err, 'Interval parse error');
|
||||
}
|
||||
});
|
||||
59
nodejs/node_modules/cron-parser/test/parser.js
generated
vendored
Executable file
59
nodejs/node_modules/cron-parser/test/parser.js
generated
vendored
Executable file
@ -0,0 +1,59 @@
|
||||
var util = require('util');
|
||||
var test = require('tap').test;
|
||||
var CronParser = require('../lib/parser');
|
||||
|
||||
// Globals
|
||||
|
||||
test('load crontab file', function(t) {
|
||||
CronParser.parseFile('./crontab.example', function(err, result) {
|
||||
t.ifError(err, 'File read error');
|
||||
t.ok(result, 'Crontab parsed parsed');
|
||||
|
||||
t.equal(Object.keys(result.variables).length, 2, 'variables length matches');
|
||||
t.equal(Object.keys(result.errors).length, 0, 'errors length matches');
|
||||
t.equal(result.expressions.length, 3, 'expressions length matches');
|
||||
|
||||
// Parse expressions
|
||||
var next = null;
|
||||
|
||||
t.equal(result.expressions[0].hasNext(), true);
|
||||
next = result.expressions[0].next();
|
||||
t.ok(next, 'first date');
|
||||
|
||||
next = result.expressions[1].next();
|
||||
t.ok(next, 'second date');
|
||||
|
||||
next = result.expressions[2].next();
|
||||
t.ok(next, 'third date');
|
||||
|
||||
t.end();
|
||||
});
|
||||
});
|
||||
|
||||
test('no next date', function(t) {
|
||||
var options = {
|
||||
currentDate: new Date(2014, 0, 1),
|
||||
endDate: new Date(2014, 0, 1)
|
||||
};
|
||||
|
||||
try {
|
||||
var interval = CronParser.parseExpression('* * 2 * *', options);
|
||||
t.equal(interval.hasNext(), false);
|
||||
} catch (err) {
|
||||
t.ifError(err, 'Parse read error');
|
||||
}
|
||||
|
||||
t.end();
|
||||
});
|
||||
|
||||
test('prev with CurrentDate greater than 0ms should work', function(t) {
|
||||
var options = {
|
||||
currentDate: new Date('2017-06-13T18:21:25.002Z')
|
||||
};
|
||||
|
||||
var interval = CronParser.parseExpression('*/5 * * * * *', options);
|
||||
var prev = interval.prev();
|
||||
t.equal(prev.getSeconds(), 25);
|
||||
|
||||
t.end();
|
||||
});
|
||||
379
nodejs/node_modules/cron-parser/test/timezone.js
generated
vendored
Executable file
379
nodejs/node_modules/cron-parser/test/timezone.js
generated
vendored
Executable file
@ -0,0 +1,379 @@
|
||||
var test = require('tap').test;
|
||||
var CronExpression = require('../lib/expression');
|
||||
|
||||
test('It works on DST start', function(t) {
|
||||
try {
|
||||
var options = {
|
||||
currentDate: '2016-03-27 02:00:01',
|
||||
tz: 'Europe/Athens'
|
||||
};
|
||||
|
||||
var interval, date;
|
||||
|
||||
interval = CronExpression.parse('0 * * * *', options);
|
||||
t.ok(interval, 'Interval parsed');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getMinutes(), 0, '0 Minutes');
|
||||
t.equal(date.getHours(), 4, 'Due to DST start in Athens, 3 is skipped');
|
||||
t.equal(date.getDate(), 27, 'on the 27th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getMinutes(), 0, '0 Minutes');
|
||||
t.equal(date.getHours(), 5, '5 AM');
|
||||
t.equal(date.getDate(), 27, 'on the 27th');
|
||||
|
||||
interval = CronExpression.parse('30 2 * * *', options);
|
||||
t.ok(interval, 'Interval parsed');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getMinutes(), 30, '30 Minutes');
|
||||
t.equal(date.getHours(), 2, '2 AM');
|
||||
t.equal(date.getDate(), 27, 'on the 27th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getMinutes(), 30, '30 Minutes');
|
||||
t.equal(date.getHours(), 2, '2 AM');
|
||||
t.equal(date.getDate(), 28, 'on the 28th');
|
||||
|
||||
interval = CronExpression.parse('0 3 * * *', options);
|
||||
t.ok(interval, 'Interval parsed');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getMinutes(), 0, '0 Minutes');
|
||||
t.equal(date.getHours(), 4, 'Due to DST start in Athens, 3 is skipped');
|
||||
t.equal(date.getDate(), 27, 'on the 27th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getMinutes(), 0, '0 Minutes');
|
||||
t.equal(date.getHours(), 3, '3 on the 28th');
|
||||
t.equal(date.getDate(), 28, 'on the 28th');
|
||||
|
||||
interval = CronExpression.parse('*/20 3 * * *', options);
|
||||
t.ok(interval, 'Interval parsed');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getMinutes(), 0, '0 Minutes');
|
||||
t.equal(date.getHours(), 4, 'Due to DST start in Athens, 3 is skipped');
|
||||
t.equal(date.getDate(), 27, 'on the 27th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getMinutes(), 20, '20 Minutes');
|
||||
t.equal(date.getHours(), 4, 'Due to DST start in Athens, 3 is skipped');
|
||||
t.equal(date.getDate(), 27, 'on the 27th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getMinutes(), 40, '20 Minutes');
|
||||
t.equal(date.getHours(), 4, 'Due to DST start in Athens, 3 is skipped');
|
||||
t.equal(date.getDate(), 27, 'on the 27th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getMinutes(), 0, '0 Minutes');
|
||||
t.equal(date.getHours(), 3, '3 AM');
|
||||
t.equal(date.getDate(), 28, 'on the 28th');
|
||||
|
||||
options.currentDate = '2016-03-27 00:00:01';
|
||||
|
||||
interval = CronExpression.parse('0 * 27 * *', options);
|
||||
t.ok(interval, 'Interval parsed');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getMinutes(), 0, '0 Minutes');
|
||||
t.equal(date.getHours(), 1, '1 AM');
|
||||
t.equal(date.getDate(), 27, 'on the 27th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getMinutes(), 0, '0 Minutes');
|
||||
t.equal(date.getHours(), 2, '2 AM');
|
||||
t.equal(date.getDate(), 27, 'on the 27th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getMinutes(), 0, '0 Minutes');
|
||||
t.equal(date.getHours(), 4, '4 AM');
|
||||
t.equal(date.getDate(), 27, 'on the 27th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getMinutes(), 0, '0 Minutes');
|
||||
t.equal(date.getHours(), 5, '5 AM');
|
||||
t.equal(date.getDate(), 27, 'on the 27th');
|
||||
|
||||
options.currentDate = '2016-03-27 00:00:01';
|
||||
options.endDate = '2016-03-27 03:00:01';
|
||||
|
||||
interval = CronExpression.parse('0 * * * *', options);
|
||||
t.ok(interval, 'Interval parsed');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getMinutes(), 0, '0 Minutes');
|
||||
t.equal(date.getHours(), 1, '1 AM');
|
||||
t.equal(date.getDate(), 27, 'on the 27th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getMinutes(), 0, '0 Minutes');
|
||||
t.equal(date.getHours(), 2, '2 AM');
|
||||
t.equal(date.getDate(), 27, 'on the 27th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getMinutes(), 0, '0 Minutes');
|
||||
t.equal(date.getHours(), 4, '4 AM');
|
||||
t.equal(date.getDate(), 27, 'on the 27th');
|
||||
|
||||
// Out of the timespan range
|
||||
t.throws(function() {
|
||||
date = interval.next();
|
||||
});
|
||||
} catch (err) {
|
||||
t.ifError(err, 'Interval parse error');
|
||||
}
|
||||
|
||||
t.end();
|
||||
});
|
||||
|
||||
test('It works on DST end', function(t) {
|
||||
try {
|
||||
var options = {
|
||||
currentDate: '2016-10-30 02:00:01',
|
||||
tz: 'Europe/Athens'
|
||||
};
|
||||
|
||||
var interval, date;
|
||||
|
||||
interval = CronExpression.parse('0 * * * *', options);
|
||||
t.ok(interval, 'Interval parsed');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 3, '3 AM');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 3, 'Due to DST end in Athens (4-->3)');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 4, '4 AM');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
|
||||
interval = CronExpression.parse('0 3 * * *', options);
|
||||
t.ok(interval, 'Interval parsed');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 3, '3 AM');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 3, '3 AM');
|
||||
t.equal(date.getDate(), 31, '31st');
|
||||
|
||||
interval = CronExpression.parse('*/20 3 * * *', options);
|
||||
t.ok(interval, 'Interval parsed');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getMinutes(), 0, '0');
|
||||
t.equal(date.getHours(), 3, '3 AM');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getMinutes(), 20, '20');
|
||||
t.equal(date.getHours(), 3, '3 AM');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getMinutes(), 40, '40');
|
||||
t.equal(date.getHours(), 3, '3 AM');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getMinutes(), 0, '0');
|
||||
t.equal(date.getHours(), 3, '3 AM');
|
||||
t.equal(date.getDate(), 31, '31st');
|
||||
|
||||
options.currentDate = '2016-10-30 00:00:01';
|
||||
|
||||
interval = CronExpression.parse('0 * 30 * *', options);
|
||||
t.ok(interval, 'Interval parsed');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 1, '1 AM');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 2, '2 AM');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 3, '3 AM');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 3, '3 AM');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 4, '4 AM');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
|
||||
options.currentDate = '2016-10-30 00:00:01';
|
||||
options.endDate = '2016-10-30 03:00:01';
|
||||
|
||||
interval = CronExpression.parse('0 * * * *', options);
|
||||
t.ok(interval, 'Interval parsed');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 1, '1 AM');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 2, '2 AM');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 3, '3 AM');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
|
||||
// Out of the timespan range
|
||||
t.throws(function() {
|
||||
date = interval.next();
|
||||
});
|
||||
|
||||
options.endDate = '2016-10-30 04:00:01';
|
||||
|
||||
interval = CronExpression.parse('0 * * * *', options);
|
||||
t.ok(interval, 'Interval parsed');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 1, '1 AM');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 2, '2 AM');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 3, '3 AM');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 3, '3 AM');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 4, '4 AM');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
|
||||
// Out of the timespan range
|
||||
t.throws(function() {
|
||||
date = interval.next();
|
||||
});
|
||||
|
||||
options = {
|
||||
currentDate : new Date('Sun Oct 29 2016 01:00:00 GMT+0200')
|
||||
}
|
||||
|
||||
interval = CronExpression.parse('0 12 * * *', options);
|
||||
t.ok(interval, 'Interval parsed');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 12, '12');
|
||||
t.equal(date.getDate(), 29, '29th');
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 12, '12');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 12, '12');
|
||||
t.equal(date.getDate(), 31, '31st');
|
||||
|
||||
options = {
|
||||
currentDate : new Date('Sun Oct 29 2016 02:59:00 GMT+0200')
|
||||
}
|
||||
|
||||
interval = CronExpression.parse('0 12 * * *', options);
|
||||
t.ok(interval, 'Interval parsed');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 12, '12');
|
||||
t.equal(date.getDate(), 29, '29th');
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 12, '12');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 12, '12');
|
||||
t.equal(date.getDate(), 31, '31st');
|
||||
|
||||
options = {
|
||||
currentDate : new Date('Sun Oct 29 2016 02:59:59 GMT+0200')
|
||||
}
|
||||
|
||||
interval = CronExpression.parse('0 12 * * *', options);
|
||||
t.ok(interval, 'Interval parsed');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 12, '12');
|
||||
t.equal(date.getDate(), 29, '29th');
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 12, '12');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 12, '12');
|
||||
t.equal(date.getDate(), 31, '31st');
|
||||
|
||||
options = {
|
||||
currentDate : new Date('Sun Oct 30 2016 01:00:00 GMT+0200')
|
||||
}
|
||||
|
||||
interval = CronExpression.parse('0 12 * * *', options);
|
||||
t.ok(interval, 'Interval parsed');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 12, '12');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 12, '12');
|
||||
t.equal(date.getDate(), 31, '31st');
|
||||
|
||||
options = {
|
||||
currentDate : new Date('Sun Oct 30 2016 01:59:00 GMT+0200')
|
||||
}
|
||||
|
||||
interval = CronExpression.parse('0 12 * * *', options);
|
||||
t.ok(interval, 'Interval parsed');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 12, '12');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 12, '12');
|
||||
t.equal(date.getDate(), 31, '31st');
|
||||
|
||||
options = {
|
||||
currentDate : new Date('Sun Oct 30 2016 01:59:59 GMT+0200')
|
||||
}
|
||||
|
||||
interval = CronExpression.parse('0 12 * * *', options);
|
||||
t.ok(interval, 'Interval parsed');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 12, '12');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 12, '12');
|
||||
t.equal(date.getDate(), 31, '31st');
|
||||
|
||||
options = {
|
||||
currentDate : new Date('Sun Oct 30 2016 02:59:00 GMT+0200')
|
||||
}
|
||||
|
||||
interval = CronExpression.parse('0 12 * * *', options);
|
||||
t.ok(interval, 'Interval parsed');
|
||||
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 12, '12');
|
||||
t.equal(date.getDate(), 30, '30th');
|
||||
date = interval.next();
|
||||
t.equal(date.getHours(), 12, '12');
|
||||
t.equal(date.getDate(), 31, '31st');
|
||||
} catch (err) {
|
||||
t.ifError(err, 'Interval parse error');
|
||||
}
|
||||
|
||||
t.end();
|
||||
});
|
||||
Reference in New Issue
Block a user