diff --git a/CHANGELOG.md b/CHANGELOG.md
index aeded1fd21..7cba555ea9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -81,6 +81,9 @@ for the list of changes made since `v2.0.0-alpha.1`.
- [Vietnamese locale (vi)](https://github.com/date-fns/date-fns/pull/546)
(kudos to [@trongthanh](https://github.com/trongthanh))
+- Flow typings for `index.js`, `fp/index.js`, `locale/index.js`, and their ESM equivalents.
+ See PR [#558](https://github.com/date-fns/date-fns/pull/558)
+
### Changed
- **BREAKING**: function submodules now use camelCase naming schema:
diff --git a/scripts/_lib/listFPFns.js b/scripts/_lib/listFPFns.js
index af3e067e94..7c5821716c 100644
--- a/scripts/_lib/listFPFns.js
+++ b/scripts/_lib/listFPFns.js
@@ -3,7 +3,7 @@ const fs = require('fs')
module.exports = listFPFns
-const ignoredFiles = ['index.js', 'test.js']
+const ignoredFiles = ['index.js', 'test.js', 'index.js.flow']
function listFPFns () {
const files = fs.readdirSync(path.join(process.cwd(), 'src', 'fp'))
diff --git a/scripts/_lib/listFns.js b/scripts/_lib/listFns.js
index 333f3803e5..b00e2e8cc7 100644
--- a/scripts/_lib/listFns.js
+++ b/scripts/_lib/listFns.js
@@ -3,7 +3,7 @@ const fs = require('fs')
module.exports = listFns
-const ignoredFiles = ['locale', 'esm', 'fp', 'index.js', 'test.js']
+const ignoredFiles = ['locale', 'esm', 'fp', 'index.js', 'test.js', 'index.js.flow']
function listFns () {
const files = fs.readdirSync(path.join(process.cwd(), 'src'))
diff --git a/scripts/_lib/listLocales.js b/scripts/_lib/listLocales.js
index 8fac556977..2fb90afe3d 100644
--- a/scripts/_lib/listLocales.js
+++ b/scripts/_lib/listLocales.js
@@ -1,7 +1,7 @@
const path = require('path')
const fs = require('fs')
-const ignoredFiles = ['index.js', 'test.js']
+const ignoredFiles = ['index.js', 'test.js', 'index.js.flow']
module.exports = listLocales
diff --git a/scripts/build/package.sh b/scripts/build/package.sh
index ded4d7db7e..39f50ad4c3 100755
--- a/scripts/build/package.sh
+++ b/scripts/build/package.sh
@@ -38,6 +38,9 @@ do
cp -r "./src/$fnDir" "$dir/esm/"
done
+# Copy global flow typing
+cp ./src/index.js.flow "$dir/esm/index.js.flow"
+
# Copy esm indices
cp ./src/esm/index.js "$dir/esm/index.js"
cp ./src/esm/fp/index.js "$dir/esm/fp/index.js"
diff --git a/scripts/build/typings.js b/scripts/build/typings.js
index 1f13fcadc6..0eab8f0cfc 100755
--- a/scripts/build/typings.js
+++ b/scripts/build/typings.js
@@ -381,6 +381,28 @@ function generateFlowFnTyping (fn, aliasDeclarations) {
fs.writeFileSync(filename, typingString)
}
+function generateFlowFnIndexTyping (fns, aliasDeclarations) {
+ const filename = `./src/index.js.flow`
+
+ const fnsDeclarations = fns.map(({title, args, content}) => {
+ const params = getParams(args, {indent: 1, leftBorder: '(', rightBorder: ')'})
+ const returns = getType(content.returns[0].type.names)
+ return ` ${title}: ${params} => ${returns}`
+ })
+
+ const typingString = ['// @flow']
+ .concat(generatedAutomaticallyMessage)
+ .concat('')
+ .concat(aliasDeclarations.join('\n\n'))
+ .concat('')
+ .concat(`declare module.exports: {`)
+ .concat(fnsDeclarations.join(',\n\n'))
+ .concat(`}\n`)
+ .join('\n')
+
+ fs.writeFileSync(filename, typingString)
+}
+
function generateFlowFPFnTyping (fn, aliasDeclarations) {
const {title, args, content} = fn
const filename = `./src/fp/${title}/index.js.flow`
@@ -400,6 +422,28 @@ function generateFlowFPFnTyping (fn, aliasDeclarations) {
fs.writeFileSync(filename, typingString)
}
+function generateFlowFPFnIndexTyping (fns, aliasDeclarations) {
+ const filename = `./src/fp/index.js.flow`
+
+ const fnsDeclarations = fns.map(({title, args, content}) =>
+ ` ${title}: ${getFPFnType(args, content.returns[0].type.names)}`
+ )
+
+ const typingString = ['// @flow']
+ .concat(generatedAutomaticallyMessage)
+ .concat('')
+ .concat(aliasDeclarations.join('\n\n'))
+ .concat('')
+ .concat(flowFPAliases)
+ .concat('')
+ .concat(`declare module.exports: {`)
+ .concat(fnsDeclarations.join(',\n'))
+ .concat(`}\n`)
+ .join('\n')
+
+ fs.writeFileSync(filename, typingString)
+}
+
function generateFlowLocaleTyping (locale, localeAliasDeclaration) {
const {fullPath} = locale
const filename = `${fullPath}.flow`
@@ -415,6 +459,22 @@ function generateFlowLocaleTyping (locale, localeAliasDeclaration) {
fs.writeFileSync(filename, typingString)
}
+function generateFlowLocaleIndexTyping (locales, localeAliasDeclaration) {
+ const filename = './src/locale/index.js.flow'
+
+ const typingString = ['// @flow']
+ .concat(generatedAutomaticallyMessage)
+ .concat('')
+ .concat(localeAliasDeclaration)
+ .concat('')
+ .concat(`declare module.exports: {`)
+ .concat(locales.map(({name}) => ` ${name}: Locale`).join(',\n'))
+ .concat(`}\n`)
+ .join('\n')
+
+ fs.writeFileSync(filename, typingString)
+}
+
function generateFlowTypings (fns, aliases, locales) {
const aliasDeclarations = aliases.map(getFlowTypeAlias)
const localeAliasDeclaration = getFlowTypeAlias(aliases.find((alias) => alias.title === 'Locale'))
@@ -430,4 +490,8 @@ function generateFlowTypings (fns, aliases, locales) {
locales.forEach((locale) => {
generateFlowLocaleTyping(locale, localeAliasDeclaration)
})
+
+ generateFlowFnIndexTyping(fns.filter(({isFPFn}) => !isFPFn), aliasDeclarations)
+ generateFlowFPFnIndexTyping(fns.filter(({isFPFn}) => isFPFn), aliasDeclarations)
+ generateFlowLocaleIndexTyping(locales, localeAliasDeclaration)
}
diff --git a/src/fp/index.js.flow b/src/fp/index.js.flow
new file mode 100644
index 0000000000..0018e8d89e
--- /dev/null
+++ b/src/fp/index.js.flow
@@ -0,0 +1,335 @@
+// @flow
+// This file is generated automatically by `scripts/build/typings.js`. Please, don't change it.
+
+type Interval = {
+ start: Date | string | number,
+ end: Date | string | number
+}
+
+type Options = {
+ weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6,
+ additionalDigits?: 0 | 1 | 2,
+ locale?: Locale,
+ includeSeconds?: boolean,
+ addSuffix?: boolean,
+ unit?: 's' | 'm' | 'h' | 'd' | 'M' | 'Y',
+ roundingMethod?: 'floor' | 'ceil' | 'round'
+}
+
+type Locale = {
+ formatDistance: Function,
+ formatLong: Function,
+ formatRelative: Function,
+ localize: {
+ ordinalNumber: Function,
+ weekday: Function,
+ weekdays: Function,
+ month: Function,
+ months: Function,
+ timeOfDay: Function,
+ timesOfDay: Function
+ },
+ match: {
+ ordinalNumbers: Function,
+ ordinalNumber: Function,
+ weekdays: Function,
+ weekday: Function,
+ months: Function,
+ month: Function,
+ timesOfDay: Function,
+ timeOfDay: Function
+ },
+ formatters?: Object,
+ formattingTokensRegExp?: RegExp,
+ units?: Object,
+ parsers?: Object,
+ parsingTokensRegExp?: RegExp,
+ options?: {
+ weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6
+ }
+}
+
+type CurriedFn1 = (a: A) => R
+
+type CurriedFn2 = (a: A) => CurriedFn1
+ | (a: A, b: B) => R
+
+type CurriedFn3 = (a: A) => CurriedFn2
+ | (a: A, b: B) => CurriedFn1
+ | (a: A, b: B, c: C) => R
+
+type CurriedFn4 = (a: A) => CurriedFn3
+ | (a: A, b: B) => CurriedFn2
+ | (a: A, b: B, c: C) => CurriedFn1
+ | (a: A, b: B, c: C, d: D) => R
+
+declare module.exports: {
+ addDays: CurriedFn2,
+ addDaysWithOptions: CurriedFn3,
+ addHours: CurriedFn2,
+ addHoursWithOptions: CurriedFn3,
+ addISOYears: CurriedFn2,
+ addISOYearsWithOptions: CurriedFn3,
+ addMilliseconds: CurriedFn2,
+ addMillisecondsWithOptions: CurriedFn3,
+ addMinutes: CurriedFn2,
+ addMinutesWithOptions: CurriedFn3,
+ addMonths: CurriedFn2,
+ addMonthsWithOptions: CurriedFn3,
+ addQuarters: CurriedFn2,
+ addQuartersWithOptions: CurriedFn3,
+ addSeconds: CurriedFn2,
+ addSecondsWithOptions: CurriedFn3,
+ addWeeks: CurriedFn2,
+ addWeeksWithOptions: CurriedFn3,
+ addYears: CurriedFn2,
+ addYearsWithOptions: CurriedFn3,
+ areIntervalsOverlapping: CurriedFn2,
+ areIntervalsOverlappingWithOptions: CurriedFn3,
+ closestIndexTo: CurriedFn2<(Date | string | number)[], Date | string | number, number>,
+ closestIndexToWithOptions: CurriedFn3,
+ closestTo: CurriedFn2<(Date | string | number)[], Date | string | number, Date>,
+ closestToWithOptions: CurriedFn3,
+ compareAsc: CurriedFn2,
+ compareAscWithOptions: CurriedFn3,
+ compareDesc: CurriedFn2,
+ compareDescWithOptions: CurriedFn3,
+ differenceInCalendarDays: CurriedFn2,
+ differenceInCalendarDaysWithOptions: CurriedFn3,
+ differenceInCalendarISOWeeks: CurriedFn2,
+ differenceInCalendarISOWeeksWithOptions: CurriedFn3,
+ differenceInCalendarISOYears: CurriedFn2,
+ differenceInCalendarISOYearsWithOptions: CurriedFn3,
+ differenceInCalendarMonths: CurriedFn2,
+ differenceInCalendarMonthsWithOptions: CurriedFn3,
+ differenceInCalendarQuarters: CurriedFn2,
+ differenceInCalendarQuartersWithOptions: CurriedFn3,
+ differenceInCalendarWeeks: CurriedFn2,
+ differenceInCalendarWeeksWithOptions: CurriedFn3,
+ differenceInCalendarYears: CurriedFn2,
+ differenceInCalendarYearsWithOptions: CurriedFn3,
+ differenceInDays: CurriedFn2,
+ differenceInDaysWithOptions: CurriedFn3,
+ differenceInHours: CurriedFn2,
+ differenceInHoursWithOptions: CurriedFn3,
+ differenceInISOYears: CurriedFn2,
+ differenceInISOYearsWithOptions: CurriedFn3,
+ differenceInMilliseconds: CurriedFn2,
+ differenceInMillisecondsWithOptions: CurriedFn3,
+ differenceInMinutes: CurriedFn2,
+ differenceInMinutesWithOptions: CurriedFn3,
+ differenceInMonths: CurriedFn2,
+ differenceInMonthsWithOptions: CurriedFn3,
+ differenceInQuarters: CurriedFn2,
+ differenceInQuartersWithOptions: CurriedFn3,
+ differenceInSeconds: CurriedFn2,
+ differenceInSecondsWithOptions: CurriedFn3,
+ differenceInWeeks: CurriedFn2,
+ differenceInWeeksWithOptions: CurriedFn3,
+ differenceInYears: CurriedFn2,
+ differenceInYearsWithOptions: CurriedFn3,
+ eachDayOfInterval: CurriedFn1,
+ eachDayOfIntervalWithOptions: CurriedFn2,
+ endOfDay: CurriedFn1,
+ endOfDayWithOptions: CurriedFn2,
+ endOfHour: CurriedFn1,
+ endOfHourWithOptions: CurriedFn2,
+ endOfISOWeek: CurriedFn1,
+ endOfISOWeekWithOptions: CurriedFn2,
+ endOfISOYear: CurriedFn1,
+ endOfISOYearWithOptions: CurriedFn2,
+ endOfMinute: CurriedFn1,
+ endOfMinuteWithOptions: CurriedFn2,
+ endOfMonth: CurriedFn1,
+ endOfMonthWithOptions: CurriedFn2,
+ endOfQuarter: CurriedFn1,
+ endOfQuarterWithOptions: CurriedFn2,
+ endOfSecond: CurriedFn1,
+ endOfSecondWithOptions: CurriedFn2,
+ endOfWeek: CurriedFn1,
+ endOfWeekWithOptions: CurriedFn2,
+ endOfYear: CurriedFn1,
+ endOfYearWithOptions: CurriedFn2,
+ format: CurriedFn2,
+ formatDistance: CurriedFn2,
+ formatDistanceStrict: CurriedFn2,
+ formatDistanceStrictWithOptions: CurriedFn3,
+ formatDistanceWithOptions: CurriedFn3,
+ formatRelative: CurriedFn2,
+ formatRelativeWithOptions: CurriedFn3,
+ formatWithOptions: CurriedFn3,
+ getDate: CurriedFn1,
+ getDateWithOptions: CurriedFn2,
+ getDay: CurriedFn1,
+ getDayOfYear: CurriedFn1,
+ getDayOfYearWithOptions: CurriedFn2,
+ getDaysInMonth: CurriedFn1,
+ getDaysInMonthWithOptions: CurriedFn2,
+ getDaysInYear: CurriedFn1,
+ getDaysInYearWithOptions: CurriedFn2,
+ getDayWithOptions: CurriedFn2,
+ getHours: CurriedFn1,
+ getHoursWithOptions: CurriedFn2,
+ getISODay: CurriedFn1,
+ getISODayWithOptions: CurriedFn2,
+ getISOWeek: CurriedFn1,
+ getISOWeeksInYear: CurriedFn1,
+ getISOWeeksInYearWithOptions: CurriedFn2,
+ getISOWeekWithOptions: CurriedFn2,
+ getISOYear: CurriedFn1,
+ getISOYearWithOptions: CurriedFn2,
+ getMilliseconds: CurriedFn1,
+ getMillisecondsWithOptions: CurriedFn2,
+ getMinutes: CurriedFn1,
+ getMinutesWithOptions: CurriedFn2,
+ getMonth: CurriedFn1,
+ getMonthWithOptions: CurriedFn2,
+ getOverlappingDaysInIntervals: CurriedFn2,
+ getOverlappingDaysInIntervalsWithOptions: CurriedFn3,
+ getQuarter: CurriedFn1,
+ getQuarterWithOptions: CurriedFn2,
+ getSeconds: CurriedFn1,
+ getSecondsWithOptions: CurriedFn2,
+ getTime: CurriedFn1,
+ getTimeWithOptions: CurriedFn2,
+ getYear: CurriedFn1,
+ getYearWithOptions: CurriedFn2,
+ isAfter: CurriedFn2,
+ isAfterWithOptions: CurriedFn3,
+ isBefore: CurriedFn2,
+ isBeforeWithOptions: CurriedFn3,
+ isEqual: CurriedFn2,
+ isEqualWithOptions: CurriedFn3,
+ isFirstDayOfMonth: CurriedFn1,
+ isFirstDayOfMonthWithOptions: CurriedFn2,
+ isFriday: CurriedFn1,
+ isFridayWithOptions: CurriedFn2,
+ isLastDayOfMonth: CurriedFn1,
+ isLastDayOfMonthWithOptions: CurriedFn2,
+ isLeapYear: CurriedFn1,
+ isLeapYearWithOptions: CurriedFn2,
+ isMonday: CurriedFn1,
+ isMondayWithOptions: CurriedFn2,
+ isSameDay: CurriedFn2,
+ isSameDayWithOptions: CurriedFn3,
+ isSameHour: CurriedFn2,
+ isSameHourWithOptions: CurriedFn3,
+ isSameISOWeek: CurriedFn2,
+ isSameISOWeekWithOptions: CurriedFn3,
+ isSameISOYear: CurriedFn2,
+ isSameISOYearWithOptions: CurriedFn3,
+ isSameMinute: CurriedFn2,
+ isSameMinuteWithOptions: CurriedFn3,
+ isSameMonth: CurriedFn2,
+ isSameMonthWithOptions: CurriedFn3,
+ isSameQuarter: CurriedFn2,
+ isSameQuarterWithOptions: CurriedFn3,
+ isSameSecond: CurriedFn2,
+ isSameSecondWithOptions: CurriedFn3,
+ isSameWeek: CurriedFn2,
+ isSameWeekWithOptions: CurriedFn3,
+ isSameYear: CurriedFn2,
+ isSameYearWithOptions: CurriedFn3,
+ isSaturday: CurriedFn1,
+ isSaturdayWithOptions: CurriedFn2,
+ isSunday: CurriedFn1,
+ isSundayWithOptions: CurriedFn2,
+ isThursday: CurriedFn1,
+ isThursdayWithOptions: CurriedFn2,
+ isTuesday: CurriedFn1,
+ isTuesdayWithOptions: CurriedFn2,
+ isValid: CurriedFn1,
+ isValidWithOptions: CurriedFn2,
+ isWednesday: CurriedFn1,
+ isWednesdayWithOptions: CurriedFn2,
+ isWeekend: CurriedFn1,
+ isWeekendWithOptions: CurriedFn2,
+ isWithinInterval: CurriedFn2,
+ isWithinIntervalWithOptions: CurriedFn3,
+ lastDayOfISOWeek: CurriedFn1,
+ lastDayOfISOWeekWithOptions: CurriedFn2,
+ lastDayOfISOYear: CurriedFn1,
+ lastDayOfISOYearWithOptions: CurriedFn2,
+ lastDayOfMonth: CurriedFn1,
+ lastDayOfMonthWithOptions: CurriedFn2,
+ lastDayOfQuarter: CurriedFn1,
+ lastDayOfQuarterWithOptions: CurriedFn2,
+ lastDayOfWeek: CurriedFn1,
+ lastDayOfWeekWithOptions: CurriedFn2,
+ lastDayOfYear: CurriedFn1,
+ lastDayOfYearWithOptions: CurriedFn2,
+ max: CurriedFn1<(Date | string | number)[], Date>,
+ maxWithOptions: CurriedFn2,
+ min: CurriedFn1<(Date | string | number)[], Date>,
+ minWithOptions: CurriedFn2,
+ parse: CurriedFn3,
+ parseWithOptions: CurriedFn4,
+ setDate: CurriedFn2,
+ setDateWithOptions: CurriedFn3,
+ setDay: CurriedFn2,
+ setDayOfYear: CurriedFn2,
+ setDayOfYearWithOptions: CurriedFn3,
+ setDayWithOptions: CurriedFn3,
+ setHours: CurriedFn2,
+ setHoursWithOptions: CurriedFn3,
+ setISODay: CurriedFn2,
+ setISODayWithOptions: CurriedFn3,
+ setISOWeek: CurriedFn2,
+ setISOWeekWithOptions: CurriedFn3,
+ setISOYear: CurriedFn2,
+ setISOYearWithOptions: CurriedFn3,
+ setMilliseconds: CurriedFn2,
+ setMillisecondsWithOptions: CurriedFn3,
+ setMinutes: CurriedFn2,
+ setMinutesWithOptions: CurriedFn3,
+ setMonth: CurriedFn2,
+ setMonthWithOptions: CurriedFn3,
+ setQuarter: CurriedFn2,
+ setQuarterWithOptions: CurriedFn3,
+ setSeconds: CurriedFn2,
+ setSecondsWithOptions: CurriedFn3,
+ setYear: CurriedFn2,
+ setYearWithOptions: CurriedFn3,
+ startOfDay: CurriedFn1,
+ startOfDayWithOptions: CurriedFn2,
+ startOfHour: CurriedFn1,
+ startOfHourWithOptions: CurriedFn2,
+ startOfISOWeek: CurriedFn1,
+ startOfISOWeekWithOptions: CurriedFn2,
+ startOfISOYear: CurriedFn1,
+ startOfISOYearWithOptions: CurriedFn2,
+ startOfMinute: CurriedFn1,
+ startOfMinuteWithOptions: CurriedFn2,
+ startOfMonth: CurriedFn1,
+ startOfMonthWithOptions: CurriedFn2,
+ startOfQuarter: CurriedFn1,
+ startOfQuarterWithOptions: CurriedFn2,
+ startOfSecond: CurriedFn1,
+ startOfSecondWithOptions: CurriedFn2,
+ startOfWeek: CurriedFn1,
+ startOfWeekWithOptions: CurriedFn2,
+ startOfYear: CurriedFn1,
+ startOfYearWithOptions: CurriedFn2