From d48eeaf6cf95693f979247b4615a71849388e6b3 Mon Sep 17 00:00:00 2001 From: cmatiello Date: Fri, 7 Jun 2019 08:52:51 -0300 Subject: [PATCH] Add constants (minTime, maxTime) (#1076) (closes #609) * Add constants: `minTime`, `maxTime`. * Integrate constants into build system & docs. --- CHANGELOG.md | 6 +++ docs/constants.md | 47 ++++++++++++++++++++ docs/index.js | 8 ++++ examples/flow/constants.js.flow | 11 +++++ examples/flow/package.json | 8 ++-- examples/typescript/constants.ts | 9 ++++ examples/typescript/package.json | 9 ++-- examples/webpack-1.x/constants.js | 9 ++++ examples/webpack-1.x/package.json | 10 +++-- examples/webpack-4.x/constants.js | 9 ++++ examples/webpack-4.x/package.json | 10 +++-- scripts/_lib/getConstants.js | 13 ++++++ scripts/_lib/listFns.js | 1 + scripts/build/_lib/typings/flow.js | 26 ++++++++--- scripts/build/_lib/typings/typeScript.js | 41 +++++++++++++----- scripts/build/indices.js | 55 ++++++++++++++++-------- scripts/build/typings.js | 7 ++- src/constants/index.d.ts | 2 + src/constants/index.js | 15 +++++++ src/constants/index.js.flow | 4 ++ src/esm/fp/index.js | 1 + src/esm/index.js | 1 + src/fp/index.js | 6 ++- src/fp/index.js.flow | 4 +- src/index.js | 6 ++- src/index.js.flow | 6 ++- typings.d.ts | 20 +++++++++ 27 files changed, 289 insertions(+), 55 deletions(-) create mode 100644 docs/constants.md create mode 100644 examples/flow/constants.js.flow create mode 100644 examples/typescript/constants.ts create mode 100644 examples/webpack-1.x/constants.js create mode 100644 examples/webpack-4.x/constants.js create mode 100644 scripts/_lib/getConstants.js create mode 100644 src/constants/index.d.ts create mode 100644 src/constants/index.js create mode 100644 src/constants/index.js.flow diff --git a/CHANGELOG.md b/CHANGELOG.md index c12e7661b4..e1bab7a432 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -713,6 +713,12 @@ for the list of changes made since `v2.0.0-alpha.1`. - `parseISO` function that parses ISO 8601 strings. See [#1023](https://github.com/date-fns/date-fns/pull/1023). +- Add constants: + + - `maxTime` + + - `minTime` + - New locales: - [Norwegian Nynorsk locale (nn)](https://github.com/date-fns/date-fns/pull/1172) diff --git a/docs/constants.md b/docs/constants.md new file mode 100644 index 0000000000..b792fd7721 --- /dev/null +++ b/docs/constants.md @@ -0,0 +1,47 @@ +# Constants + +date-fns provides with a number of useful constants. + +## Usage + +The constants could be imported from `date-fns/constants` or directly +from `date-fns`: + +```js +import { maxTime } from 'date-fns/constants' +import { minTime } from 'date-fns' + +function isAllowedTime(time) { + return time <= maxTime && time >= minTime +} +``` + +## Constants + +### `maxTime` + +Maximum allowed time: + +```js +import { maxTime } from 'date-fns' + +const isValid = 8640000000000001 <= maxTime +//=> false + +new Date(8640000000000001) +//=> Invalid Date +``` + +### `minTime` + +Minimum allowed time: + +```js +import { minTime } from 'date-fns' + +const isValid = -8640000000000001 >= minTime +//=> false + +new Date(-8640000000000001) +//=> Invalid Date +``` diff --git a/docs/index.js b/docs/index.js index 0946c55777..732a0681c8 100644 --- a/docs/index.js +++ b/docs/index.js @@ -47,6 +47,14 @@ module.exports = { description: 'Contribution manual', path: path.join(__dirname, '..', 'CONTRIBUTING.md') }, + { + type: 'markdown', + urlId: 'Constants', + category: 'General', + title: 'Constants', + description: 'Useful constants', + path: path.join(__dirname, 'constants.md') + }, { type: 'markdown', urlId: 'I18n', diff --git a/examples/flow/constants.js.flow b/examples/flow/constants.js.flow new file mode 100644 index 0000000000..28d3317d7d --- /dev/null +++ b/examples/flow/constants.js.flow @@ -0,0 +1,11 @@ +// @flow + +const dateFns = require('date-fns') +const constants = require('date-fns/constants') +const { minTime: fpMinTime } = require('date-fns/fp') + +console.log( + dateFns.maxTime === 8640000000000000 && + dateFns.minTime === constants.minTime && + constants.minTime === fpMinTime +) diff --git a/examples/flow/package.json b/examples/flow/package.json index 93e7bca72d..67c3fb98cd 100644 --- a/examples/flow/package.json +++ b/examples/flow/package.json @@ -14,13 +14,15 @@ "build": "yarn run build-date-fns && yarn run flow-check && yarn run build-babel", "flow-check": "flow check", "build-date-fns": "env PACKAGE_OUTPUT_PATH=\"$(pwd)/node_modules/date-fns\" ../../scripts/build/package.sh", - "build-babel": "yarn run build-babel-example && yarn run build-babel-fp && yarn run build-babel-misc", + "build-babel": "yarn run build-babel-example && yarn run build-babel-fp && yarn run build-babel-misc && yarn build-babel-constants", "build-babel-example": "mkdir -p dist && babel example.js.flow --out-file dist/example.js", "build-babel-fp": "mkdir -p dist && babel fp.js.flow --out-file dist/fp.js", "build-babel-misc": "mkdir -p dist && babel misc.js.flow --out-file dist/misc.js", - "test": "yarn run test-example && yarn run test-fp && yarn run test-misc", + "build-babel-constants": "mkdir -p dist && babel constants.js.flow --out-file dist/constants.js", + "test": "yarn run test-example && yarn run test-fp && yarn run test-misc && yarn run test-constants", "test-example": "test $(env TZ=UTC node ./dist/example.js) = true", "test-fp": "test $(env TZ=UTC node ./dist/fp.js) = true", - "test-misc": "test $(env TZ=UTC node ./dist/misc.js) = true" + "test-misc": "test $(env TZ=UTC node ./dist/misc.js) = true", + "test-constants": "test $(node ./dist/constants.js) = true" } } diff --git a/examples/typescript/constants.ts b/examples/typescript/constants.ts new file mode 100644 index 0000000000..832c131ece --- /dev/null +++ b/examples/typescript/constants.ts @@ -0,0 +1,9 @@ +import { maxTime as rootMaxTime, minTime as rootMinTime } from 'date-fns' +import { minTime } from 'date-fns/constants' +import { minTime as fpMinTime } from 'date-fns/fp' + +console.log( + rootMaxTime === 8640000000000000 && + rootMinTime === minTime && + minTime === fpMinTime +) diff --git a/examples/typescript/package.json b/examples/typescript/package.json index b07468281a..1dfe22e846 100644 --- a/examples/typescript/package.json +++ b/examples/typescript/package.json @@ -12,11 +12,12 @@ "scripts": { "build": "yarn run build-date-fns && yarn run build-typescript && yarn run build-webpack", "build-date-fns": "env PACKAGE_OUTPUT_PATH=\"$(pwd)/node_modules/date-fns\" ../../scripts/build/package.sh", - "build-typescript": "tsc --outDir dist example.ts fp.ts misc.ts", - "build-webpack": "webpack example=./dist/example.js fp=./dist/fp misc=./dist/misc.js --output-path dist --output-filename [name].bundle.js", - "test": "yarn run test-example && yarn run test-fp && yarn run test-misc", + "build-typescript": "tsc --outDir dist example.ts fp.ts misc.ts constants.ts", + "build-webpack": "webpack example=./dist/example.js fp=./dist/fp misc=./dist/misc.js constants=./dist/constants.js --output-path dist --output-filename [name].bundle.js", + "test": "yarn run test-example && yarn run test-fp && yarn run test-misc && yarn run test-constants", "test-example": "test $(env TZ=UTC node ./dist/example.bundle.js) = true", "test-fp": "test $(env TZ=UTC node ./dist/fp.bundle.js) = true", - "test-misc": "test $(env TZ=UTC node ./dist/misc.bundle.js) = true" + "test-misc": "test $(env TZ=UTC node ./dist/misc.bundle.js) = true", + "test-constants": "test $(node ./dist/constants.bundle.js) = true" } } diff --git a/examples/webpack-1.x/constants.js b/examples/webpack-1.x/constants.js new file mode 100644 index 0000000000..6942f287b9 --- /dev/null +++ b/examples/webpack-1.x/constants.js @@ -0,0 +1,9 @@ +const dateFns = require('date-fns') +const constants = require('date-fns/constants') +const { minTime: fpMinTime } = require('date-fns/fp') + +console.log( + dateFns.maxTime === 8640000000000000 && + dateFns.minTime === constants.minTime && + constants.minTime === fpMinTime +) diff --git a/examples/webpack-1.x/package.json b/examples/webpack-1.x/package.json index be74cdd0c0..cad4bcce3b 100644 --- a/examples/webpack-1.x/package.json +++ b/examples/webpack-1.x/package.json @@ -14,15 +14,17 @@ "scripts": { "build": "yarn run build-date-fns && yarn run build-webpack && yarn run build-babili", "build-date-fns": "env PACKAGE_OUTPUT_PATH=\"$(pwd)/node_modules/date-fns\" ../../scripts/build/package.sh", - "build-webpack": "webpack example=./example.js fp=./fp.js misc=./misc.js --output-path dist --output-file [name].js", - "build-babili": "yarn run build-babili-example && yarn run build-babili-fp && yarn run build-babili-misc && yarn run stats-size", + "build-webpack": "webpack example=./example.js fp=./fp.js misc=./misc.js constants=./constants.js --output-path dist --output-file [name].js", + "build-babili": "yarn run build-babili-example && yarn run build-babili-fp && yarn run build-babili-misc && yarn build-babili-constants && yarn run stats-size", "build-babili-example": "babili dist/example.js --out-file dist/example.min.js --minified --no-comments", "build-babili-fp": "babili dist/fp.js --out-file dist/fp.min.js --minified --no-comments", "build-babili-misc": "babili dist/misc.js --out-file dist/misc.min.js --minified --no-comments", + "build-babili-constants": "babili dist/constants.js --out-file dist/constants.min.js --minified --no-comments", "stats-size": "gzip-size dist/example.min.js | pretty-bytes", - "test": "yarn run test-example && yarn run test-fp && yarn run test-misc", + "test": "yarn test-example && yarn test-fp && yarn test-misc && yarn test-constants", "test-example": "test $(env TZ=UTC node ./dist/example.min.js) = true", "test-fp": "test $(env TZ=UTC node ./dist/fp.min.js) = true", - "test-misc": "test $(env TZ=UTC node ./dist/misc.min.js) = true" + "test-misc": "test $(env TZ=UTC node ./dist/misc.min.js) = true", + "test-constants": "test $(node ./dist/constants.min.js) = true" } } diff --git a/examples/webpack-4.x/constants.js b/examples/webpack-4.x/constants.js new file mode 100644 index 0000000000..832c131ece --- /dev/null +++ b/examples/webpack-4.x/constants.js @@ -0,0 +1,9 @@ +import { maxTime as rootMaxTime, minTime as rootMinTime } from 'date-fns' +import { minTime } from 'date-fns/constants' +import { minTime as fpMinTime } from 'date-fns/fp' + +console.log( + rootMaxTime === 8640000000000000 && + rootMinTime === minTime && + minTime === fpMinTime +) diff --git a/examples/webpack-4.x/package.json b/examples/webpack-4.x/package.json index 7c88730f66..bb4f97d54a 100644 --- a/examples/webpack-4.x/package.json +++ b/examples/webpack-4.x/package.json @@ -14,16 +14,18 @@ "scripts": { "build": "yarn build-date-fns && yarn build-webpack && yarn build-uglify", "build-date-fns": "env PACKAGE_OUTPUT_PATH=\"$(pwd)/node_modules/date-fns\" ../../scripts/build/package.sh", - "build-webpack": "webpack example=./example.js fp=./fp.js misc=./misc.js minimal=./minimal.js --output-path dist --output-filename [name].js", - "build-uglify": "yarn build-uglify-example && yarn build-uglify-fp && yarn build-uglify-misc && yarn build-uglify-minimal && yarn stats-size", + "build-webpack": "webpack example=./example.js fp=./fp.js misc=./misc.js minimal=./minimal.js constants=./constants.js --output-path dist --output-filename [name].js", + "build-uglify": "yarn build-uglify-example && yarn build-uglify-fp && yarn build-uglify-misc && yarn build-uglify-minimal && yarn build-uglify-constants && yarn stats-size", "build-uglify-example": "node_modules/uglify-es/bin/uglifyjs --compress --mangle --output dist/example.min.js dist/example.js", "build-uglify-fp": "node_modules/uglify-es/bin/uglifyjs --compress --mangle --output dist/fp.min.js dist/fp.js", "build-uglify-misc": "node_modules/uglify-es/bin/uglifyjs --compress --mangle --output dist/misc.min.js dist/misc.js", "build-uglify-minimal": "node_modules/uglify-es/bin/uglifyjs --compress --mangle --output dist/minimal.min.js dist/minimal.js", + "build-uglify-constants": "node_modules/uglify-es/bin/uglifyjs --compress --mangle --output dist/constants.min.js dist/constants.js", "stats-size": "echo \"Minimal size: $(gzip-size dist/minimal.min.js)\nFormat size: $(gzip-size dist/example.min.js)\nFP size: $(gzip-size dist/fp.min.js)\nMisc size: $(gzip-size dist/misc.min.js)\"", - "test": "yarn test-example && yarn test-fp && yarn test-misc", + "test": "yarn test-example && yarn test-fp && yarn test-misc && yarn test-constants", "test-example": "test $(env TZ=UTC node ./dist/example.min.js) = true", "test-fp": "test $(env TZ=UTC node ./dist/fp.min.js) = true", - "test-misc": "test $(env TZ=UTC node ./dist/misc.min.js) = true" + "test-misc": "test $(env TZ=UTC node ./dist/misc.min.js) = true", + "test-constants": "test $(env TZ=UTC node ./dist/constants.min.js) = true" } } diff --git a/scripts/_lib/getConstants.js b/scripts/_lib/getConstants.js new file mode 100644 index 0000000000..bcb1e6e607 --- /dev/null +++ b/scripts/_lib/getConstants.js @@ -0,0 +1,13 @@ +const path = require('path') +const jsDocParser = require('jsdoc-to-markdown') + +module.exports = getConstants + +function getConstants() { + return jsDocParser + .getJsdocDataSync({ + files: path.resolve(process.cwd(), 'src/constants/index.js'), + 'no-cache': true + }) + .filter(c => c.kind === 'constant' && !c.undocumented) +} diff --git a/scripts/_lib/listFns.js b/scripts/_lib/listFns.js index 63cae1778f..19ef69397c 100644 --- a/scripts/_lib/listFns.js +++ b/scripts/_lib/listFns.js @@ -7,6 +7,7 @@ const ignoredFiles = [ 'locale', 'esm', 'fp', + 'constants', 'index.js', 'test.js', 'index.js.flow', diff --git a/scripts/build/_lib/typings/flow.js b/scripts/build/_lib/typings/flow.js index 1b1d3f4668..f314857707 100644 --- a/scripts/build/_lib/typings/flow.js +++ b/scripts/build/_lib/typings/flow.js @@ -55,7 +55,7 @@ function generateFlowFnTyping(fn, aliasDeclarations) { writeFile(`src/${title}/index.js.flow`, typingFile) } -function generateFlowFnIndexTyping(fns, aliasDeclarations) { +function generateFlowFnIndexTyping(fns, aliasDeclarations, constants) { const fnsDeclarations = fns.map(({ title, args, content }) => { const params = getParams(args, { leftBorder: '(', rightBorder: ')' }) const returns = getType(content.returns[0].type.names) @@ -66,7 +66,10 @@ function generateFlowFnIndexTyping(fns, aliasDeclarations) { ${addSeparator(aliasDeclarations, '\n')} declare module.exports: { - ${addSeparator(fnsDeclarations, ',\n')} + ${addSeparator( + fnsDeclarations.concat(generateConstantsDeclarations(constants)), + ',\n' + )} } ` @@ -89,7 +92,7 @@ function generateFlowFPFnTyping(fn, aliasDeclarations) { writeFile(`src/fp/${title}/index.js.flow`, typingFile) } -function generateFlowFPFnIndexTyping(fns, aliasDeclarations) { +function generateFlowFPFnIndexTyping(fns, aliasDeclarations, constants) { const fnsDeclarations = fns.map( ({ title, args, content }) => `${title}: ${getFPFnType(args, content.returns[0].type.names)}` @@ -101,7 +104,10 @@ function generateFlowFPFnIndexTyping(fns, aliasDeclarations) { ${addSeparator(getFlowFPTypeAliases(), '\n')} declare module.exports: { - ${addSeparator(fnsDeclarations, ',')} + ${addSeparator( + fnsDeclarations.concat(generateConstantsDeclarations(constants)), + ',' + )} } ` @@ -132,7 +138,7 @@ function generateFlowLocaleIndexTyping(locales, localeAliasDeclaration) { writeFile('src/locale/index.js.flow', typingFile) } -function generateFlowTypings(fns, aliases, locales) { +function generateFlowTypings(fns, aliases, locales, constants) { const aliasDeclarations = aliases.map(getFlowTypeAlias) const localeAliasDeclaration = getFlowTypeAlias( aliases.find(alias => alias.title === 'Locale') @@ -152,15 +158,21 @@ function generateFlowTypings(fns, aliases, locales) { generateFlowFnIndexTyping( fns.filter(({ isFPFn }) => !isFPFn), - aliasDeclarations + aliasDeclarations, + constants ) generateFlowFPFnIndexTyping( fns.filter(({ isFPFn }) => isFPFn), - aliasDeclarations + aliasDeclarations, + constants ) generateFlowLocaleIndexTyping(locales, localeAliasDeclaration) } +function generateConstantsDeclarations(constants) { + return constants.map(c => `${c.name}: ${c.type.names.join(' | ')}`) +} + function writeFile(relativePath, content) { return fs.writeFileSync( path.resolve(process.cwd(), relativePath), diff --git a/scripts/build/_lib/typings/typeScript.js b/scripts/build/_lib/typings/typeScript.js index 07a57cd2f9..eb8e570f96 100644 --- a/scripts/build/_lib/typings/typeScript.js +++ b/scripts/build/_lib/typings/typeScript.js @@ -73,12 +73,19 @@ function getExportedTypeScriptTypeAliases(aliases) { ` } -function getTypeScriptDateFnsModuleDefinition(submodule, fns) { +function getTypeScriptDateFnsModuleDefinition( + submodule, + fns, + constantsDefinitions +) { const moduleName = `date-fns${submodule}` const definition = formatBlock` declare module '${moduleName}' { - ${addSeparator(fns.map(getTypeScriptFnDefinition), '\n')} + ${addSeparator( + fns.map(getTypeScriptFnDefinition).concat(constantsDefinitions), + '\n' + )} } ` @@ -88,14 +95,18 @@ function getTypeScriptDateFnsModuleDefinition(submodule, fns) { } } -function getTypeScriptDateFnsFPModuleDefinition(submodule, fns) { +function getTypeScriptDateFnsFPModuleDefinition( + submodule, + fns, + constantsDefinitions +) { const moduleName = `date-fns${submodule}/fp` const fnDefinitions = fns.map(getTypeScriptFPFnDefinition) const definition = formatBlock` declare module '${moduleName}' { - ${addSeparator(fnDefinitions, '\n')} + ${addSeparator(fnDefinitions.concat(constantsDefinitions), '\n')} } ` @@ -243,11 +254,16 @@ function generateTypescriptLocaleTyping(locale) { writeFile(`src/locale/${locale.code}/index.d.ts`, typingFile) } -function generateTypeScriptTypings(fns, aliases, locales) { +function generateTypeScriptTypings(fns, aliases, locales, constants) { const nonFPFns = fns.filter(fn => !fn.isFPFn) const fpFns = fns.filter(fn => fn.isFPFn) + const constantsDefinitions = constants.map( + c => `const ${c.name}: ${c.type.names.join(' | ')}` + ) - const moduleDefinitions = [getTypeScriptDateFnsModuleDefinition('', nonFPFns)] + const moduleDefinitions = [ + getTypeScriptDateFnsModuleDefinition('', nonFPFns, constantsDefinitions) + ] .concat(nonFPFns.map(getTypeScriptFnModuleDefinition.bind(null, '', ''))) .concat( nonFPFns.map(getTypeScriptFnModuleDefinition.bind(null, '', '/index')) @@ -258,7 +274,7 @@ function generateTypeScriptTypings(fns, aliases, locales) { .map(module => module.definition) const fpModuleDefinitions = [ - getTypeScriptDateFnsFPModuleDefinition('', fpFns) + getTypeScriptDateFnsFPModuleDefinition('', fpFns, constantsDefinitions) ] .concat( fpFns.map(getTypeScriptFPFnModuleDefinition.bind(null, '', '', false)) @@ -276,7 +292,7 @@ function generateTypeScriptTypings(fns, aliases, locales) { .map(module => module.definition) const esmModuleDefinitions = [ - getTypeScriptDateFnsModuleDefinition('/esm', nonFPFns) + getTypeScriptDateFnsModuleDefinition('/esm', nonFPFns, constantsDefinitions) ] .concat( nonFPFns.map(getTypeScriptFnModuleDefinition.bind(null, '/esm', '')) @@ -292,7 +308,7 @@ function generateTypeScriptTypings(fns, aliases, locales) { .map(module => module.definition) const esmFPModuleDefinitions = [ - getTypeScriptDateFnsFPModuleDefinition('/esm', fpFns) + getTypeScriptDateFnsFPModuleDefinition('/esm', fpFns, constantsDefinitions) ] .concat( fpFns.map(getTypeScriptFPFnModuleDefinition.bind(null, '/esm', '', true)) @@ -358,7 +374,12 @@ function generateTypeScriptTypings(fns, aliases, locales) { const globalInterfaceDefinition = formatBlock` interface dateFns { - ${addSeparator(nonFPFns.map(getTypeScriptInterfaceDefinition), '\n')} + ${addSeparator( + nonFPFns + .map(getTypeScriptInterfaceDefinition) + .concat(constants.map(c => `${c.name}: ${c.type.names.join(' | ')}`)), + '\n' + )} } ` diff --git a/scripts/build/indices.js b/scripts/build/indices.js index 7771f8fefa..a340a99cde 100755 --- a/scripts/build/indices.js +++ b/scripts/build/indices.js @@ -13,6 +13,7 @@ const prettier = require('./_lib/prettier') const listFns = require('../_lib/listFns') const listFPFns = require('../_lib/listFPFns') const listLocales = require('../_lib/listLocales') +const getConstants = require('../_lib/getConstants') const outdatedLocales = require('../../outdatedLocales.json') @@ -24,13 +25,14 @@ const fpFns = listFPFns() const locales = listLocales().filter( ({ code }) => !outdatedLocales.includes(code) ) +const constants = getConstants() -writeFile('src/index.js', generateIndex(fns)) -writeFile('src/fp/index.js', generateIndex(fpFns)) -writeFile('src/locale/index.js', generateIndex(locales)) -writeFile('src/esm/index.js', generateESMIndex(fns)) -writeFile('src/esm/fp/index.js', generateESMIndex(fpFns)) -writeFile('src/esm/locale/index.js', generateESMIndex(locales)) +writeFile('src/index.js', generateIndex(fns, false, constants)) +writeFile('src/fp/index.js', generateIndex(fpFns, true, constants)) +writeFile('src/locale/index.js', generateIndex(locales, false)) +writeFile('src/esm/index.js', generateESMIndex(fns, false, true)) +writeFile('src/esm/fp/index.js', generateESMIndex(fpFns, true, true)) +writeFile('src/esm/locale/index.js', generateESMIndex(locales, false, false)) function writeFile(relativePath, content) { return fs.writeFileSync( @@ -39,29 +41,48 @@ function writeFile(relativePath, content) { ) } -function generateIndex(files) { +function generateIndex(files, isFP, constants) { const propertyRequireLines = files.map( - fn => ` ${fn.name}: require('${fn.path.replace(/\.js$/, '')}/index.js')` + fn => `${fn.name}: require('${fn.path.replace(/\.js$/, '')}/index.js')` ) + const constantsExportLines = constants + ? constants.map(c => `${c.name}: constants.${c.name}`) + : [] const indexLines = [generatedAutomaticallyMessage] .concat('') + .concat( + constants + ? [ + `var constants = require('${ + isFP ? '..' : '.' + }/constants/index.js')`, + '' + ] + : [] + ) .concat('module.exports = {') - .concat(propertyRequireLines.join(',\n')) + .concat(propertyRequireLines.concat(constantsExportLines).join(',\n')) .concat('}') .join('\n') return `${indexLines}\n` } -function generateESMIndex(files) { - const fileLines = files.map( - fn => - `export { default as ${fn.name} } from '${fn.path.replace( - /\.js$/, - '' - )}/index.js'` - ) +function generateESMIndex(files, isFP, includeConstants) { + const fileLines = files + .map( + fn => + `export { default as ${fn.name} } from '${fn.path.replace( + /\.js$/, + '' + )}/index.js'` + ) + .concat( + includeConstants + ? `export * from '${isFP ? '..' : '.'}/constants/index.js'` + : [] + ) const indexLines = [generatedAutomaticallyMessage] .concat('') diff --git a/scripts/build/typings.js b/scripts/build/typings.js index afadbed88c..ea0dde5ba5 100755 --- a/scripts/build/typings.js +++ b/scripts/build/typings.js @@ -9,6 +9,7 @@ const path = require('path') const listLocales = require('../_lib/listLocales') +const getConstants = require('../_lib/getConstants') const jsDocs = require(path.resolve(process.cwd(), 'tmp/docs.json')) const { generateTypeScriptTypings } = require('./_lib/typings/typeScript') @@ -22,7 +23,9 @@ const fns = Object.keys(jsDocs) .filter(doc => doc.kind === 'function') .sort((a, b) => a.title.localeCompare(b.title, 'en-US')) +const constants = getConstants() + const aliases = jsDocs['Types'] -generateTypeScriptTypings(fns, aliases, locales) -generateFlowTypings(fns, aliases, locales) +generateTypeScriptTypings(fns, aliases, locales, constants) +generateFlowTypings(fns, aliases, locales, constants) diff --git a/src/constants/index.d.ts b/src/constants/index.d.ts new file mode 100644 index 0000000000..64e4bfa6b7 --- /dev/null +++ b/src/constants/index.d.ts @@ -0,0 +1,2 @@ +export const maxTime: number +export const minTime: number diff --git a/src/constants/index.js b/src/constants/index.js new file mode 100644 index 0000000000..3f1e161122 --- /dev/null +++ b/src/constants/index.js @@ -0,0 +1,15 @@ +/** + * Maximum allowed time. + * @constant + * @type {number} + * @default + */ +export const maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1000 + +/** + * Minimum allowed time. + * @constant + * @type {number} + * @default + */ +export const minTime = -maxTime diff --git a/src/constants/index.js.flow b/src/constants/index.js.flow new file mode 100644 index 0000000000..d57a406eda --- /dev/null +++ b/src/constants/index.js.flow @@ -0,0 +1,4 @@ +// @flow + +declare export var maxTime: number +declare export var minTime: number diff --git a/src/esm/fp/index.js b/src/esm/fp/index.js index 29a24eef61..4c0d54d093 100644 --- a/src/esm/fp/index.js +++ b/src/esm/fp/index.js @@ -248,3 +248,4 @@ export { default as subSeconds } from './subSeconds/index.js' export { default as subWeeks } from './subWeeks/index.js' export { default as subYears } from './subYears/index.js' export { default as toDate } from './toDate/index.js' +export * from '../constants/index.js' diff --git a/src/esm/index.js b/src/esm/index.js index abc6c67863..99a8526395 100644 --- a/src/esm/index.js +++ b/src/esm/index.js @@ -187,3 +187,4 @@ export { default as subSeconds } from './subSeconds/index.js' export { default as subWeeks } from './subWeeks/index.js' export { default as subYears } from './subYears/index.js' export { default as toDate } from './toDate/index.js' +export * from './constants/index.js' diff --git a/src/fp/index.js b/src/fp/index.js index 001ca8916d..4b3752748b 100644 --- a/src/fp/index.js +++ b/src/fp/index.js @@ -1,5 +1,7 @@ // This file is generated automatically by `scripts/build/indices.js`. Please, don't change it. +var constants = require('../constants/index.js') + module.exports = { addDays: require('./addDays/index.js'), addHours: require('./addHours/index.js'), @@ -180,5 +182,7 @@ module.exports = { subSeconds: require('./subSeconds/index.js'), subWeeks: require('./subWeeks/index.js'), subYears: require('./subYears/index.js'), - toDate: require('./toDate/index.js') + toDate: require('./toDate/index.js'), + maxTime: constants.maxTime, + minTime: constants.minTime } diff --git a/src/fp/index.js.flow b/src/fp/index.js.flow index 84dba5587b..711877e5f0 100644 --- a/src/fp/index.js.flow +++ b/src/fp/index.js.flow @@ -281,5 +281,7 @@ declare module.exports: { subSeconds: CurriedFn2, subWeeks: CurriedFn2, subYears: CurriedFn2, - toDate: CurriedFn1 + toDate: CurriedFn1, + maxTime: number, + minTime: number } diff --git a/src/index.js b/src/index.js index 0c7c7e9820..049ad813c7 100644 --- a/src/index.js +++ b/src/index.js @@ -1,5 +1,7 @@ // This file is generated automatically by `scripts/build/indices.js`. Please, don't change it. +var constants = require('./constants/index.js') + module.exports = { addDays: require('./addDays/index.js'), addHours: require('./addHours/index.js'), @@ -155,5 +157,7 @@ module.exports = { subSeconds: require('./subSeconds/index.js'), subWeeks: require('./subWeeks/index.js'), subYears: require('./subYears/index.js'), - toDate: require('./toDate/index.js') + toDate: require('./toDate/index.js'), + maxTime: constants.maxTime, + minTime: constants.minTime } diff --git a/src/index.js.flow b/src/index.js.flow index 1911f35505..5546e430d9 100644 --- a/src/index.js.flow +++ b/src/index.js.flow @@ -571,5 +571,9 @@ declare module.exports: { subYears: (date: Date | number, amount: number) => Date, - toDate: (argument: Date | number) => Date + toDate: (argument: Date | number) => Date, + + maxTime: number, + + minTime: number } diff --git a/typings.d.ts b/typings.d.ts index d60749b94e..d2cd4437dd 100644 --- a/typings.d.ts +++ b/typings.d.ts @@ -788,6 +788,10 @@ declare module 'date-fns' { function toDate(argument: Date | number): Date namespace toDate {} + + const maxTime: number + + const minTime: number } declare module 'date-fns/addDays' { @@ -3725,6 +3729,10 @@ declare module 'date-fns/fp' { const toDate: CurriedFn1 namespace toDate {} + + const maxTime: number + + const minTime: number } declare module 'date-fns/fp/addDays' { @@ -7130,6 +7138,10 @@ declare module 'date-fns/esm' { function toDate(argument: Date | number): Date namespace toDate {} + + const maxTime: number + + const minTime: number } declare module 'date-fns/esm/addDays' { @@ -10067,6 +10079,10 @@ declare module 'date-fns/esm/fp' { const toDate: CurriedFn1 namespace toDate {} + + const maxTime: number + + const minTime: number } declare module 'date-fns/esm/fp/addDays' { @@ -15326,4 +15342,8 @@ interface dateFns { subYears(date: Date | number, amount: number): Date toDate(argument: Date | number): Date + + maxTime: number + + minTime: number }