@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 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
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test-runner.d.ts.map
@@ -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
+ }