@jkumonpm/dayjs-roc 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +162 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/roc-utils.d.ts +52 -0
- package/dist/roc-utils.d.ts.map +1 -0
- package/dist/roc-utils.js +120 -0
- package/dist/roc-utils.js.map +1 -0
- package/dist/test-runner.d.ts +2 -0
- package/dist/test-runner.d.ts.map +1 -0
- package/dist/test-runner.js +134 -0
- package/dist/test-runner.js.map +1 -0
- package/package.json +55 -0
package/README.md
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# dayjs-roc
|
|
2
|
+
|
|
3
|
+
> Day.js plugin for Taiwan ROC (Republic of China) calendar year. Supports `RRR`/`RR` format output and ROC date parsing.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install dayjs-roc
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Requires [dayjs](https://day.js.org/) as a peer dependency.
|
|
12
|
+
|
|
13
|
+
## Quick Start
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import dayjs from 'dayjs'
|
|
17
|
+
import roc from 'dayjs-roc'
|
|
18
|
+
|
|
19
|
+
dayjs.extend(roc)
|
|
20
|
+
|
|
21
|
+
// Format with ROC year
|
|
22
|
+
dayjs('2026-04-04').format('RRR/MM/DD') // → '115/04/04'
|
|
23
|
+
dayjs('2026-04-04').format('RR/MM/DD') // → '15/04/04'
|
|
24
|
+
dayjs('1912-01-01').format('RRR年MM月DD日') // → '001年01月01日'
|
|
25
|
+
|
|
26
|
+
// Get ROC year directly
|
|
27
|
+
dayjs('2026-04-04').rocYear() // → 115
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Format Tokens
|
|
31
|
+
|
|
32
|
+
| Token | Output | Description |
|
|
33
|
+
|-------|--------|-------------|
|
|
34
|
+
| `RRR` | `115` | 3-digit ROC year (zero-padded) |
|
|
35
|
+
| `RR` | `15` | 2-digit ROC year (zero-padded) |
|
|
36
|
+
|
|
37
|
+
### Examples
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
const today = dayjs()
|
|
41
|
+
|
|
42
|
+
// Combine with standard Day.js tokens
|
|
43
|
+
today.format('RRR/MM/DD') // → '115/04/04'
|
|
44
|
+
today.format('RRR 年 M 月 D 日') // → '115 年 4 月 4 日'
|
|
45
|
+
today.format('dddd, RRR/MM/DD') // → 'Saturday, 115/04/04'
|
|
46
|
+
today.format('RR/MM/DD HH:mm') // → '15/04/04 14:30'
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Utility Functions
|
|
50
|
+
|
|
51
|
+
### `isROC(str)`
|
|
52
|
+
|
|
53
|
+
Check if a string is a valid ROC date format.
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
import { isROC } from 'dayjs-roc'
|
|
57
|
+
|
|
58
|
+
isROC('115/04/04') // → true
|
|
59
|
+
isROC('1/1/1') // → true
|
|
60
|
+
isROC('115-04-04') // → true
|
|
61
|
+
isROC('2024/01/01') // → true (AD year also valid as ROC)
|
|
62
|
+
isROC('115/13/01') // → false (invalid month)
|
|
63
|
+
isROC('abc') // → false
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### `parseROCDate(str)`
|
|
67
|
+
|
|
68
|
+
Parse a ROC date string into a Dayjs instance.
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
import { parseROCDate } from 'dayjs-roc'
|
|
72
|
+
|
|
73
|
+
const date = parseROCDate('115/04/04')
|
|
74
|
+
date?.year() // → 2026
|
|
75
|
+
date?.month() // → 3 (April, 0-indexed)
|
|
76
|
+
date?.date() // → 4
|
|
77
|
+
date?.format('YYYY-MM-DD') // → '2026-04-04'
|
|
78
|
+
|
|
79
|
+
parseROCDate('invalid') // → null
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Core Functions (no Day.js required)
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
import { rocToAD, adToROC, isROCDate, parseROC, formatRRR, formatRR } from 'dayjs-roc'
|
|
86
|
+
|
|
87
|
+
// Convert ROC year to AD year
|
|
88
|
+
rocToAD(115) // → 2026
|
|
89
|
+
rocToAD(1) // → 1912
|
|
90
|
+
rocToAD(0) // → null
|
|
91
|
+
|
|
92
|
+
// Convert AD year to ROC year
|
|
93
|
+
adToROC(2026) // → 115
|
|
94
|
+
adToROC(1912) // → 1
|
|
95
|
+
adToROC(1911) // → null
|
|
96
|
+
|
|
97
|
+
// Validate ROC date string
|
|
98
|
+
isROCDate('115/04/04') // → true
|
|
99
|
+
isROCDate('115/13/01') // → false
|
|
100
|
+
|
|
101
|
+
// Parse ROC date string to native Date
|
|
102
|
+
parseROC('115/04/04') // → Date(2026, 3, 4)
|
|
103
|
+
parseROC('invalid') // → null
|
|
104
|
+
|
|
105
|
+
// Format ROC year
|
|
106
|
+
formatRRR(115) // → '115'
|
|
107
|
+
formatRRR(1) // → '001'
|
|
108
|
+
formatRR(15) // → '15'
|
|
109
|
+
formatRR(1) // → '01'
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Supported Formats
|
|
113
|
+
|
|
114
|
+
| Input Format | Example | Supported |
|
|
115
|
+
|-------------|---------|-----------|
|
|
116
|
+
| `RRR/MM/DD` | `115/04/04` | ✅ |
|
|
117
|
+
| `RR/MM/DD` | `15/04/04` | ✅ |
|
|
118
|
+
| `RRR-MM-DD` | `115-04-04` | ✅ |
|
|
119
|
+
| `RR-MM-DD` | `15-04-04` | ✅ |
|
|
120
|
+
| `R/M/D` | `1/1/1` | ✅ |
|
|
121
|
+
|
|
122
|
+
## Limitations
|
|
123
|
+
|
|
124
|
+
- **ROC year 1 (AD 1912) onwards only** — dates before 1912 return `null`
|
|
125
|
+
- **No support for pre-ROC calendar** — historical dates before the Republic of China are not supported
|
|
126
|
+
- **RR token truncates** — years >= 100 will return `null` for `RR` format
|
|
127
|
+
|
|
128
|
+
## Conversion Rule
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
ROC year = AD year - 1911
|
|
132
|
+
AD year = ROC year + 1911
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
The Republic of China calendar starts from 1912 (ROC year 1).
|
|
136
|
+
|
|
137
|
+
## API Reference
|
|
138
|
+
|
|
139
|
+
### Plugin
|
|
140
|
+
|
|
141
|
+
| Method | Returns | Description |
|
|
142
|
+
|--------|---------|-------------|
|
|
143
|
+
| `dayjs().format('RRR/...')` | `string` | Format with 3-digit ROC year |
|
|
144
|
+
| `dayjs().format('RR/...')` | `string` | Format with 2-digit ROC year |
|
|
145
|
+
| `dayjs().rocYear()` | `number \| null` | Get ROC year number |
|
|
146
|
+
|
|
147
|
+
### Exports
|
|
148
|
+
|
|
149
|
+
| Function | Input | Output | Description |
|
|
150
|
+
|----------|-------|--------|-------------|
|
|
151
|
+
| `isROC(str)` | `string` | `boolean` | Validate ROC date format |
|
|
152
|
+
| `parseROCDate(str)` | `string` | `Dayjs \| null` | Parse ROC date to Dayjs |
|
|
153
|
+
| `rocToAD(year)` | `number` | `number \| null` | Convert ROC to AD year |
|
|
154
|
+
| `adToROC(year)` | `number` | `number \| null` | Convert AD to ROC year |
|
|
155
|
+
| `isROCDate(str)` | `string` | `boolean` | Validate ROC date (alias) |
|
|
156
|
+
| `parseROC(str)` | `string` | `Date \| null` | Parse ROC date to native Date |
|
|
157
|
+
| `formatRRR(year)` | `number` | `string \| null` | Format as 3-digit ROC year |
|
|
158
|
+
| `formatRR(year)` | `number` | `string \| null` | Format as 2-digit ROC year |
|
|
159
|
+
|
|
160
|
+
## License
|
|
161
|
+
|
|
162
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { PluginFunc, Dayjs } from 'dayjs';
|
|
2
|
+
declare module 'dayjs' {
|
|
3
|
+
interface Dayjs {
|
|
4
|
+
rocYear(): number | null;
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Check if a string is a valid ROC date format.
|
|
9
|
+
* @param str - Date string to check
|
|
10
|
+
* @returns true if valid ROC date format
|
|
11
|
+
*/
|
|
12
|
+
export declare function isROC(str: string): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Parse a ROC date string and return a Dayjs instance.
|
|
15
|
+
* @param str - ROC date string (RRR/MM/DD or RR/MM/DD)
|
|
16
|
+
* @returns Dayjs instance, or null if invalid
|
|
17
|
+
*/
|
|
18
|
+
export declare function parseROCDate(str: string): Dayjs | null;
|
|
19
|
+
declare const roc: PluginFunc;
|
|
20
|
+
export default roc;
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAU9C,OAAO,QAAQ,OAAO,CAAC;IACrB,UAAU,KAAK;QACb,OAAO,IAAI,MAAM,GAAG,IAAI,CAAA;KACzB;CACF;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE1C;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAItD;AAED,QAAA,MAAM,GAAG,EAAE,UA+BV,CAAA;AAED,eAAe,GAAG,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import dayjs from 'dayjs';
|
|
2
|
+
import { adToROC, isROCDate, parseROC, formatRRR, formatRR, } from './roc-utils.js';
|
|
3
|
+
/**
|
|
4
|
+
* Check if a string is a valid ROC date format.
|
|
5
|
+
* @param str - Date string to check
|
|
6
|
+
* @returns true if valid ROC date format
|
|
7
|
+
*/
|
|
8
|
+
export function isROC(str) {
|
|
9
|
+
return isROCDate(str);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Parse a ROC date string and return a Dayjs instance.
|
|
13
|
+
* @param str - ROC date string (RRR/MM/DD or RR/MM/DD)
|
|
14
|
+
* @returns Dayjs instance, or null if invalid
|
|
15
|
+
*/
|
|
16
|
+
export function parseROCDate(str) {
|
|
17
|
+
const date = parseROC(str);
|
|
18
|
+
if (date === null)
|
|
19
|
+
return null;
|
|
20
|
+
return dayjs(date);
|
|
21
|
+
}
|
|
22
|
+
const roc = (_option, dayjsClass, _dayjsFactory) => {
|
|
23
|
+
// --- Extend format() to support RRR and RR tokens ---
|
|
24
|
+
const oldFormat = dayjsClass.prototype.format;
|
|
25
|
+
dayjsClass.prototype.format = function (formatStr) {
|
|
26
|
+
if (formatStr === undefined) {
|
|
27
|
+
return oldFormat.call(this);
|
|
28
|
+
}
|
|
29
|
+
const adYear = this.year();
|
|
30
|
+
const rocYear = adToROC(adYear);
|
|
31
|
+
// Replace RRR / RR tokens
|
|
32
|
+
let result = formatStr;
|
|
33
|
+
if (rocYear !== null) {
|
|
34
|
+
const rrr = formatRRR(rocYear);
|
|
35
|
+
const rr = formatRR(rocYear);
|
|
36
|
+
if (rrr !== null) {
|
|
37
|
+
result = result.replace(/RRR/g, rrr);
|
|
38
|
+
}
|
|
39
|
+
if (rr !== null) {
|
|
40
|
+
result = result.replace(/RR/g, rr);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return oldFormat.call(this, result);
|
|
44
|
+
};
|
|
45
|
+
// --- Add rocYear() method to Dayjs prototype ---
|
|
46
|
+
dayjsClass.prototype.rocYear = function () {
|
|
47
|
+
return adToROC(this.year());
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
export default roc;
|
|
51
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EACL,OAAO,EACP,SAAS,EACT,QAAQ,EACR,SAAS,EACT,QAAQ,GACT,MAAM,gBAAgB,CAAA;AAQvB;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAC,GAAW;IAC/B,OAAO,SAAS,CAAC,GAAG,CAAC,CAAA;AACvB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;IAC1B,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,CAAA;AACpB,CAAC;AAED,MAAM,GAAG,GAAe,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE;IAC7D,uDAAuD;IACvD,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,MAAM,CAAA;IAC7C,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,UAAU,SAAkB;QACxD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC7B,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;QAE/B,0BAA0B;QAC1B,IAAI,MAAM,GAAG,SAAS,CAAA;QACtB,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;YAC9B,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;YAC5B,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACjB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;YACtC,CAAC;YACD,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBAChB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;YACpC,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACrC,CAAC,CAAA;IAED,kDAAkD;IAClD,UAAU,CAAC,SAAS,CAAC,OAAO,GAAG;QAC7B,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IAC7B,CAAC,CAAA;AACH,CAAC,CAAA;AAED,eAAe,GAAG,CAAA"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ROC (Republic of China) calendar utility functions.
|
|
3
|
+
* Pure functions with zero external dependencies.
|
|
4
|
+
*
|
|
5
|
+
* Core rule: ROC year = AD year - 1911
|
|
6
|
+
* Valid range: ROC year 1 (AD 1912) onwards
|
|
7
|
+
*/
|
|
8
|
+
/** The base year offset: AD 1912 = ROC 1 */
|
|
9
|
+
export declare const ROC_BASE_YEAR = 1911;
|
|
10
|
+
/**
|
|
11
|
+
* Convert ROC year to AD year.
|
|
12
|
+
* @param rocYear - Republic of China year (must be >= 1)
|
|
13
|
+
* @returns AD year, or null if rocYear < 1
|
|
14
|
+
*/
|
|
15
|
+
export declare function rocToAD(rocYear: number): number | null;
|
|
16
|
+
/**
|
|
17
|
+
* Convert AD year to ROC year.
|
|
18
|
+
* @param adYear - Anno Domini year (must be >= 1912)
|
|
19
|
+
* @returns ROC year, or null if adYear < 1912
|
|
20
|
+
*/
|
|
21
|
+
export declare function adToROC(adYear: number): number | null;
|
|
22
|
+
/**
|
|
23
|
+
* Check if a string matches ROC date format.
|
|
24
|
+
* Supports: RRR/MM/DD, RR/MM/DD, RRR-MM-DD, RR-MM-DD
|
|
25
|
+
* Also validates that the ROC year is >= 1.
|
|
26
|
+
*
|
|
27
|
+
* @param str - Date string to validate
|
|
28
|
+
* @returns true if valid ROC date format
|
|
29
|
+
*/
|
|
30
|
+
export declare function isROCDate(str: string): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Parse a ROC date string into a Date object.
|
|
33
|
+
* Supports: RRR/MM/DD, RR/MM/DD, R/MM/DD, RRR-MM-DD, RR-MM-DD
|
|
34
|
+
*
|
|
35
|
+
* @param str - ROC date string
|
|
36
|
+
* @returns Date object, or null if invalid
|
|
37
|
+
*/
|
|
38
|
+
export declare function parseROC(str: string): Date | null;
|
|
39
|
+
/**
|
|
40
|
+
* Format a ROC year as RRR (3-digit, zero-padded).
|
|
41
|
+
* @param rocYear - ROC year
|
|
42
|
+
* @returns 3-digit string, or null if invalid
|
|
43
|
+
*/
|
|
44
|
+
export declare function formatRRR(rocYear: number): string | null;
|
|
45
|
+
/**
|
|
46
|
+
* Format a ROC year as RR (2-digit, zero-padded).
|
|
47
|
+
* For years >= 100, returns the last 2 digits (like YY format).
|
|
48
|
+
* @param rocYear - ROC year
|
|
49
|
+
* @returns 2-digit string, or null if invalid
|
|
50
|
+
*/
|
|
51
|
+
export declare function formatRR(rocYear: number): string | null;
|
|
52
|
+
//# sourceMappingURL=roc-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roc-utils.d.ts","sourceRoot":"","sources":["../src/roc-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,4CAA4C;AAC5C,eAAO,MAAM,aAAa,OAAO,CAAA;AAEjC;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKtD;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKrD;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CA+B9C;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CA2BjD;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGxD;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGvD"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ROC (Republic of China) calendar utility functions.
|
|
3
|
+
* Pure functions with zero external dependencies.
|
|
4
|
+
*
|
|
5
|
+
* Core rule: ROC year = AD year - 1911
|
|
6
|
+
* Valid range: ROC year 1 (AD 1912) onwards
|
|
7
|
+
*/
|
|
8
|
+
/** The base year offset: AD 1912 = ROC 1 */
|
|
9
|
+
export const ROC_BASE_YEAR = 1911;
|
|
10
|
+
/**
|
|
11
|
+
* Convert ROC year to AD year.
|
|
12
|
+
* @param rocYear - Republic of China year (must be >= 1)
|
|
13
|
+
* @returns AD year, or null if rocYear < 1
|
|
14
|
+
*/
|
|
15
|
+
export function rocToAD(rocYear) {
|
|
16
|
+
if (!Number.isInteger(rocYear) || rocYear < 1) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return rocYear + ROC_BASE_YEAR;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Convert AD year to ROC year.
|
|
23
|
+
* @param adYear - Anno Domini year (must be >= 1912)
|
|
24
|
+
* @returns ROC year, or null if adYear < 1912
|
|
25
|
+
*/
|
|
26
|
+
export function adToROC(adYear) {
|
|
27
|
+
if (!Number.isInteger(adYear) || adYear < 1912) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
return adYear - ROC_BASE_YEAR;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if a string matches ROC date format.
|
|
34
|
+
* Supports: RRR/MM/DD, RR/MM/DD, RRR-MM-DD, RR-MM-DD
|
|
35
|
+
* Also validates that the ROC year is >= 1.
|
|
36
|
+
*
|
|
37
|
+
* @param str - Date string to validate
|
|
38
|
+
* @returns true if valid ROC date format
|
|
39
|
+
*/
|
|
40
|
+
export function isROCDate(str) {
|
|
41
|
+
if (typeof str !== 'string')
|
|
42
|
+
return false;
|
|
43
|
+
const pattern = /^(\d{1,4})[\/\-](\d{1,2})[\/\-](\d{1,2})$/;
|
|
44
|
+
const match = str.match(pattern);
|
|
45
|
+
if (!match)
|
|
46
|
+
return false;
|
|
47
|
+
const [, yearStr, monthStr, dayStr] = match;
|
|
48
|
+
const year = parseInt(yearStr, 10);
|
|
49
|
+
const month = parseInt(monthStr, 10);
|
|
50
|
+
const day = parseInt(dayStr, 10);
|
|
51
|
+
// ROC year must be >= 1
|
|
52
|
+
if (year < 1)
|
|
53
|
+
return false;
|
|
54
|
+
// Month must be 1-12
|
|
55
|
+
if (month < 1 || month > 12)
|
|
56
|
+
return false;
|
|
57
|
+
// Day must be 1-31 (basic check; full validation via Date)
|
|
58
|
+
if (day < 1 || day > 31)
|
|
59
|
+
return false;
|
|
60
|
+
// Verify the date is actually valid
|
|
61
|
+
const adYear = rocToAD(year);
|
|
62
|
+
if (adYear === null)
|
|
63
|
+
return false;
|
|
64
|
+
const date = new Date(adYear, month - 1, day);
|
|
65
|
+
return (date.getFullYear() === adYear &&
|
|
66
|
+
date.getMonth() === month - 1 &&
|
|
67
|
+
date.getDate() === day);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Parse a ROC date string into a Date object.
|
|
71
|
+
* Supports: RRR/MM/DD, RR/MM/DD, R/MM/DD, RRR-MM-DD, RR-MM-DD
|
|
72
|
+
*
|
|
73
|
+
* @param str - ROC date string
|
|
74
|
+
* @returns Date object, or null if invalid
|
|
75
|
+
*/
|
|
76
|
+
export function parseROC(str) {
|
|
77
|
+
if (typeof str !== 'string')
|
|
78
|
+
return null;
|
|
79
|
+
const pattern = /^(\d{1,4})[\/\-](\d{1,2})[\/\-](\d{1,2})$/;
|
|
80
|
+
const match = str.match(pattern);
|
|
81
|
+
if (!match)
|
|
82
|
+
return null;
|
|
83
|
+
const [, yearStr, monthStr, dayStr] = match;
|
|
84
|
+
const year = parseInt(yearStr, 10);
|
|
85
|
+
const month = parseInt(monthStr, 10);
|
|
86
|
+
const day = parseInt(dayStr, 10);
|
|
87
|
+
const adYear = rocToAD(year);
|
|
88
|
+
if (adYear === null)
|
|
89
|
+
return null;
|
|
90
|
+
const date = new Date(adYear, month - 1, day);
|
|
91
|
+
// Verify the parsed date matches input (catches invalid dates like 115/13/01)
|
|
92
|
+
if (date.getFullYear() !== adYear ||
|
|
93
|
+
date.getMonth() !== month - 1 ||
|
|
94
|
+
date.getDate() !== day) {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
return date;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Format a ROC year as RRR (3-digit, zero-padded).
|
|
101
|
+
* @param rocYear - ROC year
|
|
102
|
+
* @returns 3-digit string, or null if invalid
|
|
103
|
+
*/
|
|
104
|
+
export function formatRRR(rocYear) {
|
|
105
|
+
if (rocYear < 1 || rocYear > 999)
|
|
106
|
+
return null;
|
|
107
|
+
return String(rocYear).padStart(3, '0');
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Format a ROC year as RR (2-digit, zero-padded).
|
|
111
|
+
* For years >= 100, returns the last 2 digits (like YY format).
|
|
112
|
+
* @param rocYear - ROC year
|
|
113
|
+
* @returns 2-digit string, or null if invalid
|
|
114
|
+
*/
|
|
115
|
+
export function formatRR(rocYear) {
|
|
116
|
+
if (rocYear < 1)
|
|
117
|
+
return null;
|
|
118
|
+
return String(rocYear % 100).padStart(2, '0');
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=roc-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roc-utils.js","sourceRoot":"","sources":["../src/roc-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-runner.d.ts","sourceRoot":"","sources":["../src/test-runner.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import dayjs from 'dayjs';
|
|
2
|
+
import roc, { isROC, parseROCDate } from './index.js';
|
|
3
|
+
import { rocToAD, adToROC, isROCDate, parseROC, formatRRR, formatRR, } from './roc-utils.js';
|
|
4
|
+
// Register the plugin
|
|
5
|
+
dayjs.extend(roc);
|
|
6
|
+
let passed = 0;
|
|
7
|
+
let failed = 0;
|
|
8
|
+
function assert(test, label) {
|
|
9
|
+
if (test) {
|
|
10
|
+
passed++;
|
|
11
|
+
console.log(`✅ ${label}`);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
failed++;
|
|
15
|
+
console.log(`❌ ${label}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function assertEqual(actual, expected, label) {
|
|
19
|
+
if (actual === expected) {
|
|
20
|
+
passed++;
|
|
21
|
+
console.log(`✅ ${label}`);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
failed++;
|
|
25
|
+
console.log(`❌ ${label} — expected ${expected}, got ${actual}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// ============================================================
|
|
29
|
+
// 1. rocToAD — core conversion
|
|
30
|
+
// ============================================================
|
|
31
|
+
assertEqual(rocToAD(1), 1912, 'rocToAD(1) === 1912');
|
|
32
|
+
assertEqual(rocToAD(115), 2026, 'rocToAD(115) === 2026');
|
|
33
|
+
assertEqual(rocToAD(100), 2011, 'rocToAD(100) === 2011');
|
|
34
|
+
assertEqual(rocToAD(0), null, 'rocToAD(0) === null');
|
|
35
|
+
assertEqual(rocToAD(-1), null, 'rocToAD(-1) === null');
|
|
36
|
+
assertEqual(rocToAD(1.5), null, 'rocToAD(1.5) === null (non-integer)');
|
|
37
|
+
// ============================================================
|
|
38
|
+
// 2. adToROC — reverse conversion
|
|
39
|
+
// ============================================================
|
|
40
|
+
assertEqual(adToROC(1912), 1, 'adToROC(1912) === 1');
|
|
41
|
+
assertEqual(adToROC(2026), 115, 'adToROC(2026) === 115');
|
|
42
|
+
assertEqual(adToROC(2011), 100, 'adToROC(2011) === 100');
|
|
43
|
+
assertEqual(adToROC(1911), null, 'adToROC(1911) === null');
|
|
44
|
+
assertEqual(adToROC(0), null, 'adToROC(0) === null');
|
|
45
|
+
assertEqual(adToROC(1.5), null, 'adToROC(1.5) === null (non-integer)');
|
|
46
|
+
// ============================================================
|
|
47
|
+
// 3. isROCDate — format validation
|
|
48
|
+
// ============================================================
|
|
49
|
+
assert(isROCDate('115/04/04'), 'isROCDate("115/04/04") === true');
|
|
50
|
+
assert(isROCDate('1/1/1'), 'isROCDate("1/1/1") === true');
|
|
51
|
+
assert(isROCDate('100/12/31'), 'isROCDate("100/12/31") === true');
|
|
52
|
+
assert(isROCDate('115-04-04'), 'isROCDate("115-04-04") === true');
|
|
53
|
+
assert(isROCDate('15/04/04'), 'isROCDate("15/04/04") === true');
|
|
54
|
+
assert(!isROCDate('0/1/1'), 'isROCDate("0/1/1") === false (year 0)');
|
|
55
|
+
assert(!isROCDate('115/13/01'), 'isROCDate("115/13/01") === false (month 13)');
|
|
56
|
+
assert(!isROCDate('115/00/01'), 'isROCDate("115/00/01") === false (month 0)');
|
|
57
|
+
assert(!isROCDate('115/04/32'), 'isROCDate("115/04/32") === false (day 32)');
|
|
58
|
+
assert(!isROCDate('115/02/30'), 'isROCDate("115/02/30") === false (Feb 30)');
|
|
59
|
+
assert(!isROCDate('abc'), 'isROCDate("abc") === false');
|
|
60
|
+
assert(!isROCDate(''), 'isROCDate("") === false');
|
|
61
|
+
assert(isROCDate('2024/01/01'), 'isROCDate("2024/01/01") === true (ROC 2024 = AD 3935, valid)');
|
|
62
|
+
// ============================================================
|
|
63
|
+
// 4. parseROC — string to Date
|
|
64
|
+
// ============================================================
|
|
65
|
+
const d1 = parseROC('115/04/04');
|
|
66
|
+
assertEqual(d1?.getFullYear(), 2026, 'parseROC("115/04/04").year === 2026');
|
|
67
|
+
assertEqual(d1?.getMonth(), 3, 'parseROC("115/04/04").month === 3 (April)');
|
|
68
|
+
assertEqual(d1?.getDate(), 4, 'parseROC("115/04/04").date === 4');
|
|
69
|
+
const d2 = parseROC('1/1/1');
|
|
70
|
+
assertEqual(d2?.getFullYear(), 1912, 'parseROC("1/1/1").year === 1912');
|
|
71
|
+
assertEqual(d2?.getMonth(), 0, 'parseROC("1/1/1").month === 0 (Jan)');
|
|
72
|
+
assertEqual(d2?.getDate(), 1, 'parseROC("1/1/1").date === 1');
|
|
73
|
+
assertEqual(parseROC('115/13/01'), null, 'parseROC("115/13/01") === null');
|
|
74
|
+
assertEqual(parseROC('0/1/1'), null, 'parseROC("0/1/1") === null');
|
|
75
|
+
assertEqual(parseROC('abc'), null, 'parseROC("abc") === null');
|
|
76
|
+
assertEqual(parseROC('115-04-04')?.getFullYear(), 2026, 'parseROC("115-04-04") with dashes');
|
|
77
|
+
// ============================================================
|
|
78
|
+
// 5. formatRRR / formatRR
|
|
79
|
+
// ============================================================
|
|
80
|
+
assertEqual(formatRRR(1), '001', 'formatRRR(1) === "001"');
|
|
81
|
+
assertEqual(formatRRR(115), '115', 'formatRRR(115) === "115"');
|
|
82
|
+
assertEqual(formatRRR(15), '015', 'formatRRR(15) === "015"');
|
|
83
|
+
assertEqual(formatRRR(0), null, 'formatRRR(0) === null');
|
|
84
|
+
assertEqual(formatRR(1), '01', 'formatRR(1) === "01"');
|
|
85
|
+
assertEqual(formatRR(15), '15', 'formatRR(15) === "15"');
|
|
86
|
+
assertEqual(formatRR(99), '99', 'formatRR(99) === "99"');
|
|
87
|
+
assertEqual(formatRR(100), '00', 'formatRR(100) === "00" (truncated)');
|
|
88
|
+
assertEqual(formatRR(0), null, 'formatRR(0) === null');
|
|
89
|
+
// ============================================================
|
|
90
|
+
// 6. Day.js plugin — format('RRR') / format('RR')
|
|
91
|
+
// ============================================================
|
|
92
|
+
const dayjs2026 = dayjs('2026-04-04');
|
|
93
|
+
assertEqual(dayjs2026.format('RRR/MM/DD'), '115/04/04', 'dayjs(2026-04-04).format("RRR/MM/DD")');
|
|
94
|
+
assertEqual(dayjs2026.format('RR/MM/DD'), '15/04/04', 'dayjs(2026-04-04).format("RR/MM/DD")');
|
|
95
|
+
const dayjs1912 = dayjs('1912-01-01');
|
|
96
|
+
assertEqual(dayjs1912.format('RRR/MM/DD'), '001/01/01', 'dayjs(1912-01-01).format("RRR/MM/DD")');
|
|
97
|
+
assertEqual(dayjs1912.format('RR/MM/DD'), '01/01/01', 'dayjs(1912-01-01).format("RR/MM/DD")');
|
|
98
|
+
const dayjs2011 = dayjs('2011-12-31');
|
|
99
|
+
assertEqual(dayjs2011.format('RRR/MM/DD'), '100/12/31', 'dayjs(2011-12-31).format("RRR/MM/DD")');
|
|
100
|
+
// ============================================================
|
|
101
|
+
// 7. Day.js plugin — rocYear() method
|
|
102
|
+
// ============================================================
|
|
103
|
+
assertEqual(dayjs2026.rocYear(), 115, 'dayjs(2026-04-04).rocYear() === 115');
|
|
104
|
+
assertEqual(dayjs1912.rocYear(), 1, 'dayjs(1912-01-01).rocYear() === 1');
|
|
105
|
+
assertEqual(dayjs('1911-12-31').rocYear(), null, 'dayjs(1911-12-31).rocYear() === null');
|
|
106
|
+
// ============================================================
|
|
107
|
+
// 8. isROC() exported function
|
|
108
|
+
// ============================================================
|
|
109
|
+
assert(isROC('115/04/04'), 'isROC("115/04/04") === true');
|
|
110
|
+
assert(isROC('1/1/1'), 'isROC("1/1/1") === true');
|
|
111
|
+
assert(!isROC('abc'), 'isROC("abc") === false');
|
|
112
|
+
assert(!isROC('115/13/01'), 'isROC("115/13/01") === false');
|
|
113
|
+
// ============================================================
|
|
114
|
+
// 9. parseROCDate() exported function
|
|
115
|
+
// ============================================================
|
|
116
|
+
const parsed = parseROCDate('115/04/04');
|
|
117
|
+
assert(parsed !== null, 'parseROCDate("115/04/04") !== null');
|
|
118
|
+
assertEqual(parsed?.year(), 2026, 'parseROCDate("115/04/04").year() === 2026');
|
|
119
|
+
assertEqual(parsed?.month(), 3, 'parseROCDate("115/04/04").month() === 3');
|
|
120
|
+
assertEqual(parsed?.date(), 4, 'parseROCDate("115/04/04").date() === 4');
|
|
121
|
+
assertEqual(parseROCDate('invalid'), null, 'parseROCDate("invalid") === null');
|
|
122
|
+
// ============================================================
|
|
123
|
+
// Summary
|
|
124
|
+
// ============================================================
|
|
125
|
+
console.log(`\n${'─'.repeat(40)}`);
|
|
126
|
+
console.log(`Results: ${passed} passed, ${failed} failed, ${passed + failed} total`);
|
|
127
|
+
if (failed > 0) {
|
|
128
|
+
console.log(`\n❌ ${failed} test(s) failed!`);
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
console.log('\n✅ All tests passed!');
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=test-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-runner.js","sourceRoot":"","sources":["../src/test-runner.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jkumonpm/dayjs-roc",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Day.js plugin for Taiwan ROC calendar year. Supports RRR/RR format and ROC date parsing.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc",
|
|
19
|
+
"typecheck": "tsc --noEmit",
|
|
20
|
+
"test": "npm run build && node dist/test-runner.js",
|
|
21
|
+
"clean": "node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\"",
|
|
22
|
+
"release:patch": "npm version patch && npm run build && npm publish",
|
|
23
|
+
"release:minor": "npm version minor && npm run build && npm publish",
|
|
24
|
+
"prepublishOnly": "npm run typecheck && npm run build"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"dayjs",
|
|
28
|
+
"dayjs-plugin",
|
|
29
|
+
"roc",
|
|
30
|
+
"taiwan",
|
|
31
|
+
"taiwan-calendar",
|
|
32
|
+
"republic-of-china",
|
|
33
|
+
"民國年",
|
|
34
|
+
"date-format",
|
|
35
|
+
"RRR",
|
|
36
|
+
"calendar"
|
|
37
|
+
],
|
|
38
|
+
"author": "",
|
|
39
|
+
"license": "MIT",
|
|
40
|
+
"repository": {
|
|
41
|
+
"type": "git",
|
|
42
|
+
"url": ""
|
|
43
|
+
},
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=18.0.0"
|
|
46
|
+
},
|
|
47
|
+
"peerDependencies": {
|
|
48
|
+
"dayjs": "^1.11.0"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@types/node": "^22.0.0",
|
|
52
|
+
"dayjs": "^1.11.13",
|
|
53
|
+
"typescript": "^5.7.2"
|
|
54
|
+
}
|
|
55
|
+
}
|