diff --git a/package-lock.json b/package-lock.json index 2bc9bbb..b029a4b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,21 +1,21 @@ { "name": "@hebcal/hdate", - "version": "0.11.1", + "version": "0.11.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hebcal/hdate", - "version": "0.11.1", + "version": "0.11.2", "license": "GPL-2.0", "devDependencies": { "@types/jest": "^29.5.12", - "@types/node": "20.14.9", + "@types/node": "20.14.10", "gts": "^5.3.1", "jest": "^29.7.0", - "ts-jest": "^29.1.5", + "ts-jest": "^29.2.2", "ttag-cli": "^1.10.12", - "typedoc": "^0.26.3", + "typedoc": "^0.26.4", "typescript": "^5.5.3" } }, @@ -3096,9 +3096,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.14.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", - "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", + "version": "20.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", + "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3516,6 +3516,13 @@ "node": ">=0.10.0" } }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true, + "license": "MIT" + }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -4520,6 +4527,22 @@ "dev": true, "license": "MIT" }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.817", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.817.tgz", @@ -5218,6 +5241,39 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -6118,6 +6174,25 @@ "node": ">=8" } }, + "node_modules/jake": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", @@ -9147,13 +9222,14 @@ } }, "node_modules/ts-jest": { - "version": "29.1.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.5.tgz", - "integrity": "sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg==", + "version": "29.2.2", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.2.tgz", + "integrity": "sha512-sSW7OooaKT34AAngP6k1VS669a0HdLxkQZnlC7T76sckGCokXFnvJ3yRlQZGRTAoV5K19HfSgCiSwWOSIfcYlg==", "dev": true, "license": "MIT", "dependencies": { "bs-logger": "0.x", + "ejs": "^3.0.0", "fast-json-stable-stringify": "2.x", "jest-util": "^29.0.0", "json5": "^2.2.3", @@ -9645,9 +9721,9 @@ } }, "node_modules/typedoc": { - "version": "0.26.3", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.3.tgz", - "integrity": "sha512-6d2Sw9disvvpdk4K7VNjKr5/3hzijtfQVHRthhDqJgnhMHy1wQz4yPMJVKXElvnZhFr0nkzo+GzjXDTRV5yLpg==", + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.4.tgz", + "integrity": "sha512-FlW6HpvULDKgc3rK04V+nbFyXogPV88hurarDPOjuuB5HAwuAlrCMQ5NeH7Zt68a/ikOKu6Z/0hFXAeC9xPccQ==", "dev": true, "license": "Apache-2.0", "dependencies": { diff --git a/package.json b/package.json index f7afa73..0e7e6c4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hebcal/hdate", - "version": "0.11.1", + "version": "0.11.2", "description": "converts between Hebrew and Gregorian dates using Rata Die (R.D.) algorithm by Dershowitz and Reingold", "author": "Michael J. Radwin (https://github.com/mjradwin)", "contributors": [ @@ -47,12 +47,12 @@ }, "devDependencies": { "@types/jest": "^29.5.12", - "@types/node": "20.14.9", + "@types/node": "20.14.10", "gts": "^5.3.1", "jest": "^29.7.0", - "ts-jest": "^29.1.5", + "ts-jest": "^29.2.2", "ttag-cli": "^1.10.12", - "typedoc": "^0.26.3", + "typedoc": "^0.26.4", "typescript": "^5.5.3" } } diff --git a/src/dateFormat.ts b/src/dateFormat.ts index 19856ed..88e3c04 100644 --- a/src/dateFormat.ts +++ b/src/dateFormat.ts @@ -1,3 +1,5 @@ +import {pad2, pad4} from './pad'; + const _formatters = new Map(); /** @@ -51,36 +53,6 @@ export function getTimezoneOffset(tzid: string, date: Date): number { return Math.ceil(diffMs / 1000 / 60); } -/** - * Formats a number with leading zeros so the resulting string is 4 digits long. - * Similar to `string.padStart(4, '0')` but will also format - * negative numbers similar to how the JavaScript date formats - * negative year numbers (e.g. `-37` is formatted as `-000037`). - */ -export function pad4(num: number): string { - if (num < 0) { - return '-00' + pad4(-num); - } else if (num < 10) { - return '000' + num; - } else if (num < 100) { - return '00' + num; - } else if (num < 1000) { - return '0' + num; - } - return String(num); -} - -/** - * Formats a number with leading zeros so the resulting string is 2 digits long. - * Similar to `string.padStart(2, '0')`. - */ -export function pad2(num: number): string { - if (num >= 0 && num < 10) { - return '0' + num; - } - return String(num); -} - /** * Returns YYYY-MM-DD in the local timezone */ diff --git a/src/index.ts b/src/index.ts index 583f67d..87feab9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,6 +5,7 @@ export * from './anniversary'; export * from './gematriya'; export * from './omer'; export * from './molad'; +export * from './pad'; export * from './dateFormat'; export * from './locale'; export {HDate} from './hdate'; diff --git a/src/pad.ts b/src/pad.ts new file mode 100644 index 0000000..6ebb7b4 --- /dev/null +++ b/src/pad.ts @@ -0,0 +1,29 @@ +/** + * Formats a number with leading zeros so the resulting string is 4 digits long. + * Similar to `string.padStart(4, '0')` but will also format + * negative numbers similar to how the JavaScript date formats + * negative year numbers (e.g. `-37` is formatted as `-000037`). + */ +export function pad4(num: number): string { + if (num < 0) { + return '-00' + pad4(-num); + } else if (num < 10) { + return '000' + num; + } else if (num < 100) { + return '00' + num; + } else if (num < 1000) { + return '0' + num; + } + return String(num); +} + +/** + * Formats a number with leading zeros so the resulting string is 2 digits long. + * Similar to `string.padStart(2, '0')`. + */ +export function pad2(num: number): string { + if (num >= 0 && num < 10) { + return '0' + num; + } + return String(num); +} diff --git a/test/dateFormat.spec.ts b/test/dateFormat.spec.ts index 52cb497..c8280da 100644 --- a/test/dateFormat.spec.ts +++ b/test/dateFormat.spec.ts @@ -1,4 +1,4 @@ -import { getPseudoISO, getTimezoneOffset, pad2, pad4 } from '../src/dateFormat'; +import { getPseudoISO, getTimezoneOffset } from '../src/dateFormat'; test('getPseudoISO-2021', () => { const dt = new Date(Date.UTC(2021, 0, 31, 7, 30, 50, 551)); @@ -41,19 +41,3 @@ test('getTimezoneOffset', () => { expect(getTimezoneOffset('America/Phoenix', july)).toBe(420); expect(getTimezoneOffset('Asia/Jerusalem', july)).toBe(-180); }); - -test('pad2', () => { - expect(pad2(0)).toBe('00'); - expect(pad2(5)).toBe('05'); - expect(pad2(25)).toBe('25'); - expect(pad2(-3)).toBe('-3'); -}); - -test('pad4', () => { - expect(pad4(0)).toBe('0000'); - expect(pad4(5)).toBe('0005'); - expect(pad4(25)).toBe('0025'); - expect(pad4(125)).toBe('0125'); - expect(pad4(2025)).toBe('2025'); - expect(pad4(-38)).toBe('-000038'); -}); diff --git a/test/pad.spec.ts b/test/pad.spec.ts new file mode 100644 index 0000000..4382ea8 --- /dev/null +++ b/test/pad.spec.ts @@ -0,0 +1,17 @@ +import { pad2, pad4 } from '../src/pad'; + +test('pad2', () => { + expect(pad2(0)).toBe('00'); + expect(pad2(5)).toBe('05'); + expect(pad2(25)).toBe('25'); + expect(pad2(-3)).toBe('-3'); +}); + +test('pad4', () => { + expect(pad4(0)).toBe('0000'); + expect(pad4(5)).toBe('0005'); + expect(pad4(25)).toBe('0025'); + expect(pad4(125)).toBe('0125'); + expect(pad4(2025)).toBe('2025'); + expect(pad4(-38)).toBe('-000038'); +});