ilib-zic 0.0.1 → 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/CHANGELOG.md +17 -0
- package/README.md +70 -8
- package/ilib-zic.bat +3 -0
- package/lib/JsonZoneWriter.d.ts +42 -0
- package/lib/JsonZoneWriter.d.ts.map +1 -0
- package/lib/JsonZoneWriter.js +121 -0
- package/lib/JsonZoneWriter.js.map +1 -0
- package/lib/LocaleDataWriter.d.ts +77 -0
- package/lib/LocaleDataWriter.d.ts.map +1 -0
- package/lib/LocaleDataWriter.js +190 -0
- package/lib/LocaleDataWriter.js.map +1 -0
- package/lib/Offset.d.ts +86 -0
- package/lib/Offset.d.ts.map +1 -0
- package/lib/Offset.js +264 -0
- package/lib/Offset.js.map +1 -0
- package/lib/ParseException.d.ts +7 -0
- package/lib/ParseException.d.ts.map +1 -0
- package/lib/ParseException.js +33 -0
- package/lib/ParseException.js.map +1 -0
- package/lib/RelativeDate.d.ts +126 -0
- package/lib/RelativeDate.d.ts.map +1 -0
- package/lib/RelativeDate.js +464 -0
- package/lib/RelativeDate.js.map +1 -0
- package/lib/Rule.d.ts +76 -0
- package/lib/Rule.d.ts.map +1 -0
- package/lib/Rule.js +228 -0
- package/lib/Rule.js.map +1 -0
- package/lib/RuleSet.d.ts +34 -0
- package/lib/RuleSet.d.ts.map +1 -0
- package/lib/RuleSet.js +65 -0
- package/lib/RuleSet.js.map +1 -0
- package/lib/Zone.d.ts +59 -0
- package/lib/Zone.d.ts.map +1 -0
- package/lib/Zone.js +115 -0
- package/lib/Zone.js.map +1 -0
- package/lib/ZoneInfoCompiler.d.ts +73 -0
- package/lib/ZoneInfoCompiler.d.ts.map +1 -0
- package/lib/ZoneInfoCompiler.js +177 -0
- package/lib/ZoneInfoCompiler.js.map +1 -0
- package/lib/ZoneInfoEnricher.d.ts +50 -0
- package/lib/ZoneInfoEnricher.d.ts.map +1 -0
- package/lib/ZoneInfoEnricher.js +317 -0
- package/lib/ZoneInfoEnricher.js.map +1 -0
- package/lib/ZoneInfoFile.d.ts +64 -0
- package/lib/ZoneInfoFile.d.ts.map +1 -0
- package/lib/ZoneInfoFile.js +188 -0
- package/lib/ZoneInfoFile.js.map +1 -0
- package/lib/ZoneInfoPipeline.d.ts +64 -0
- package/lib/ZoneInfoPipeline.d.ts.map +1 -0
- package/lib/ZoneInfoPipeline.js +116 -0
- package/lib/ZoneInfoPipeline.js.map +1 -0
- package/lib/ZoneWriter.d.ts +16 -0
- package/lib/ZoneWriter.d.ts.map +1 -0
- package/lib/ZoneWriter.js +28 -0
- package/lib/ZoneWriter.js.map +1 -0
- package/lib/ZoneWriterFactory.d.ts +11 -0
- package/lib/ZoneWriterFactory.d.ts.map +1 -0
- package/lib/ZoneWriterFactory.js +37 -0
- package/lib/ZoneWriterFactory.js.map +1 -0
- package/lib/defaults.d.ts +23 -0
- package/lib/defaults.d.ts.map +1 -0
- package/lib/defaults.js +79 -0
- package/lib/defaults.js.map +1 -0
- package/lib/index.d.ts +19 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +186 -0
- package/lib/index.js.map +1 -0
- package/lib/loadJson.d.ts +10 -0
- package/lib/loadJson.d.ts.map +1 -0
- package/lib/loadJson.js +81 -0
- package/lib/loadJson.js.map +1 -0
- package/lib/types.d.ts +90 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +21 -0
- package/lib/types.js.map +1 -0
- package/package.json +91 -41
- package/src/JsonZoneWriter.ts +100 -0
- package/src/LocaleDataWriter.ts +209 -0
- package/src/Offset.ts +324 -0
- package/src/ParseException.ts +29 -0
- package/src/RelativeDate.ts +529 -0
- package/src/Rule.ts +247 -0
- package/src/RuleSet.ts +66 -0
- package/src/Zone.ts +126 -0
- package/src/ZoneInfoCompiler.ts +203 -0
- package/src/ZoneInfoEnricher.ts +361 -0
- package/src/ZoneInfoFile.ts +176 -0
- package/src/ZoneInfoPipeline.ts +137 -0
- package/src/ZoneWriter.ts +38 -0
- package/src/ZoneWriterFactory.ts +40 -0
- package/src/defaults.ts +79 -0
- package/src/index.ts +182 -0
- package/src/loadJson.ts +49 -0
- package/src/types.ts +109 -0
- package/index.js +0 -11
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# ilib-zic
|
|
2
|
+
|
|
3
|
+
## 1.0.0
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- af1a7b6: First release of ilib-zic as a standalone package in the ilib-mono monorepo.
|
|
8
|
+
|
|
9
|
+
- TypeScript port of the Java zone info compiler from monolithic ilib (`com.ilib.tools.zic`), merged with the former Node `gentzinfo.js` enricher into one in-memory pipeline
|
|
10
|
+
- Compiles IANA tzdata → enriches (country codes, Windows display names, zonetab, per-country `timezone.jf`) → writes a locale tree in one pass
|
|
11
|
+
- CLI: `ilib-zic <src> <localeDir> [--verbose] [--compile-only]` (published as `ilib-zic` because npm `zic` is taken)
|
|
12
|
+
- Programmatic `ZoneInfoPipeline` API (or compile / enrich / write stages individually)
|
|
13
|
+
- Supports IANA `%z` abbreviation formats (zic `abbroffset`) for numeric UT abbrevs such as `-03/-02`
|
|
14
|
+
- Country defaults prefer `zone.tab` primaries; do not follow cross-country Link consolidations for `timezone.jf` or Windows `n`
|
|
15
|
+
- POSIX factory Links (`EST`, `CET`, …) are not treated as country-local zone ids
|
|
16
|
+
- Depends on `ilib-ctype`, `ilib-common`, `ilib-data-utils`, `cldr-core`, and `json-stable-stringify`
|
|
17
|
+
- Includes a CLI sample with a mini tzdata excerpt (including `America/Sao_Paulo` for `%z`) and an e2e snapshot suite
|
package/README.md
CHANGED
|
@@ -1,13 +1,75 @@
|
|
|
1
|
-
# ilib-zic
|
|
1
|
+
# ilib-zic
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
(OIDC)](https://docs.npmjs.com/trusted-publishers) configured for the
|
|
6
|
-
ilib-mono GitHub Actions Release workflow.
|
|
3
|
+
Zone info compiler that converts [IANA tzdata](https://www.iana.org/time-zones)
|
|
4
|
+
sources into JSON zoneinfo files used by ilib.
|
|
7
5
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
This package is a TypeScript port of the Java tool in
|
|
7
|
+
`com.ilib.tools.zic` from the monolithic
|
|
8
|
+
[ilib](https://github.com/iLib-js/iLib) repository, plus the former
|
|
9
|
+
`gentzinfo.js` enrichment step (country codes, Windows names, zonetab,
|
|
10
|
+
timezone.jf).
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
npm install ilib-zic
|
|
16
|
+
|
|
17
|
+
or
|
|
18
|
+
|
|
19
|
+
yarn add ilib-zic
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## CLI
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
ilib-zic /path/to/tzdata /path/to/locale [--verbose] [--compile-only]
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
| Argument / option | Description |
|
|
29
|
+
|-------------------|-------------|
|
|
30
|
+
| `src` | Directory containing unpacked IANA tzdata sources (required) |
|
|
31
|
+
| `localeDir` | Locale root to write (`zoneinfo/`, `timezone.jf`, `und/`) (required) |
|
|
32
|
+
| `-v, --verbose` | Print progress during compilation |
|
|
33
|
+
| `--compile-only` | Skip enrichment; write raw zoneinfo JSON only |
|
|
34
|
+
| `-V, --version` | Print version and exit |
|
|
35
|
+
| `-h, --help` | Show usage |
|
|
36
|
+
|
|
37
|
+
On Windows you can also run `ilib-zic.bat` from the package directory.
|
|
38
|
+
|
|
39
|
+
## Programmatic API
|
|
40
|
+
|
|
41
|
+
```javascript
|
|
42
|
+
import { ZoneInfoPipeline } from "ilib-zic";
|
|
43
|
+
|
|
44
|
+
const result = new ZoneInfoPipeline({
|
|
45
|
+
srcDir: "/path/to/tzdata",
|
|
46
|
+
localeDir: "/path/to/locale",
|
|
47
|
+
verbose: true,
|
|
48
|
+
}).run();
|
|
49
|
+
|
|
50
|
+
console.log(`Wrote ${result.zoneCount} zones to ${result.localeDir}`);
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Lower-level APIs (`ZoneInfoCompiler`, `ZoneInfoEnricher`, `LocaleDataWriter`)
|
|
54
|
+
are also exported for custom pipelines.
|
|
55
|
+
|
|
56
|
+
## Development
|
|
57
|
+
|
|
58
|
+
From the monorepo root:
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
pnpm --filter ilib-zic build
|
|
62
|
+
pnpm --filter ilib-zic test
|
|
63
|
+
pnpm --filter ilib-zic test:e2e
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Or from `packages/zic`:
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
pnpm build
|
|
70
|
+
pnpm test
|
|
71
|
+
pnpm test:e2e
|
|
72
|
+
```
|
|
11
73
|
|
|
12
74
|
## License
|
|
13
75
|
|
package/ilib-zic.bat
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Zone } from "./Zone";
|
|
2
|
+
import { ZoneWriter } from "./ZoneWriter";
|
|
3
|
+
/**
|
|
4
|
+
* Writes one JSON file per zone under the configured output directory.
|
|
5
|
+
*/
|
|
6
|
+
export declare class JsonZoneWriter extends ZoneWriter {
|
|
7
|
+
/**
|
|
8
|
+
* Root directory under which zone JSON files are written
|
|
9
|
+
* (for example `America/New_York.json` relative to this path).
|
|
10
|
+
*/
|
|
11
|
+
private readonly outputDir;
|
|
12
|
+
/**
|
|
13
|
+
* When true, log progress and warnings to the console.
|
|
14
|
+
*/
|
|
15
|
+
private readonly verbose;
|
|
16
|
+
/**
|
|
17
|
+
* @param outputDir Directory to write zone JSON files into
|
|
18
|
+
* @param verbose Whether to log progress
|
|
19
|
+
*/
|
|
20
|
+
constructor(outputDir: string, verbose?: boolean);
|
|
21
|
+
/**
|
|
22
|
+
* Write a single zone's JSON payload to disk.
|
|
23
|
+
*
|
|
24
|
+
* Creates parent directories as needed. Does nothing when `json` is
|
|
25
|
+
* `null` (optionally warning when verbose).
|
|
26
|
+
*
|
|
27
|
+
* @param zoneName IANA zone id (path segments separated by `/`)
|
|
28
|
+
* @param json Zone payload to serialize, or `null` to skip
|
|
29
|
+
*/
|
|
30
|
+
writeZone(zoneName: string, json: Record<string, unknown> | null): void;
|
|
31
|
+
/**
|
|
32
|
+
* Write every named zone in the map.
|
|
33
|
+
*
|
|
34
|
+
* Empty zone names are skipped and do not count toward the return value.
|
|
35
|
+
*
|
|
36
|
+
* @param zones Map of zone id to {@link Zone}
|
|
37
|
+
* @param currentOnly Passed through to {@link Zone.getJson}
|
|
38
|
+
* @returns Number of named zones processed
|
|
39
|
+
*/
|
|
40
|
+
writeZones(zones: Map<string, Zone>, currentOnly: boolean): number;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=JsonZoneWriter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JsonZoneWriter.d.ts","sourceRoot":"","sources":["../src/JsonZoneWriter.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;GAEG;AACH,qBAAa,cAAe,SAAQ,UAAU;IAC1C;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAElC;;;OAGG;gBACS,SAAS,EAAE,MAAM,EAAE,OAAO,UAAQ;IAM9C;;;;;;;;OAQG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,IAAI;IAkBvE;;;;;;;;OAQG;IACH,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,OAAO,GAAG,MAAM;CAarE"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* JsonZoneWriter.ts - write compiled zone info as JSON files
|
|
4
|
+
*
|
|
5
|
+
* Copyright © 2014, 2020, 2026 JEDLSoft
|
|
6
|
+
*
|
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
* you may not use this file except in compliance with the License.
|
|
9
|
+
* You may obtain a copy of the License at
|
|
10
|
+
*
|
|
11
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
*
|
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
*
|
|
17
|
+
* See the License for the specific language governing permissions and
|
|
18
|
+
* limitations under the License.
|
|
19
|
+
*/
|
|
20
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
23
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
24
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
25
|
+
}
|
|
26
|
+
Object.defineProperty(o, k2, desc);
|
|
27
|
+
}) : (function(o, m, k, k2) {
|
|
28
|
+
if (k2 === undefined) k2 = k;
|
|
29
|
+
o[k2] = m[k];
|
|
30
|
+
}));
|
|
31
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
32
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
33
|
+
}) : function(o, v) {
|
|
34
|
+
o["default"] = v;
|
|
35
|
+
});
|
|
36
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
37
|
+
var ownKeys = function(o) {
|
|
38
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
39
|
+
var ar = [];
|
|
40
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
41
|
+
return ar;
|
|
42
|
+
};
|
|
43
|
+
return ownKeys(o);
|
|
44
|
+
};
|
|
45
|
+
return function (mod) {
|
|
46
|
+
if (mod && mod.__esModule) return mod;
|
|
47
|
+
var result = {};
|
|
48
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
49
|
+
__setModuleDefault(result, mod);
|
|
50
|
+
return result;
|
|
51
|
+
};
|
|
52
|
+
})();
|
|
53
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
|
+
exports.JsonZoneWriter = void 0;
|
|
55
|
+
const fs = __importStar(require("fs"));
|
|
56
|
+
const path = __importStar(require("path"));
|
|
57
|
+
const ZoneWriter_1 = require("./ZoneWriter");
|
|
58
|
+
/**
|
|
59
|
+
* Writes one JSON file per zone under the configured output directory.
|
|
60
|
+
*/
|
|
61
|
+
class JsonZoneWriter extends ZoneWriter_1.ZoneWriter {
|
|
62
|
+
/**
|
|
63
|
+
* @param outputDir Directory to write zone JSON files into
|
|
64
|
+
* @param verbose Whether to log progress
|
|
65
|
+
*/
|
|
66
|
+
constructor(outputDir, verbose = false) {
|
|
67
|
+
super();
|
|
68
|
+
this.outputDir = outputDir;
|
|
69
|
+
this.verbose = verbose;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Write a single zone's JSON payload to disk.
|
|
73
|
+
*
|
|
74
|
+
* Creates parent directories as needed. Does nothing when `json` is
|
|
75
|
+
* `null` (optionally warning when verbose).
|
|
76
|
+
*
|
|
77
|
+
* @param zoneName IANA zone id (path segments separated by `/`)
|
|
78
|
+
* @param json Zone payload to serialize, or `null` to skip
|
|
79
|
+
*/
|
|
80
|
+
writeZone(zoneName, json) {
|
|
81
|
+
if (json === null) {
|
|
82
|
+
if (this.verbose) {
|
|
83
|
+
console.warn("Zone " + zoneName + " has no json.");
|
|
84
|
+
}
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const file = path.join(this.outputDir, zoneName + ".json");
|
|
88
|
+
const dir = path.dirname(file);
|
|
89
|
+
if (!fs.existsSync(dir)) {
|
|
90
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
91
|
+
}
|
|
92
|
+
if (this.verbose) {
|
|
93
|
+
console.log("Writing output file " + file);
|
|
94
|
+
}
|
|
95
|
+
fs.writeFileSync(file, JSON.stringify(json, null, 4), "utf-8");
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Write every named zone in the map.
|
|
99
|
+
*
|
|
100
|
+
* Empty zone names are skipped and do not count toward the return value.
|
|
101
|
+
*
|
|
102
|
+
* @param zones Map of zone id to {@link Zone}
|
|
103
|
+
* @param currentOnly Passed through to {@link Zone.getJson}
|
|
104
|
+
* @returns Number of named zones processed
|
|
105
|
+
*/
|
|
106
|
+
writeZones(zones, currentOnly) {
|
|
107
|
+
let count = 0;
|
|
108
|
+
for (const [zoneName, zone] of zones) {
|
|
109
|
+
if (zoneName && zoneName.length > 0) {
|
|
110
|
+
if (this.verbose) {
|
|
111
|
+
console.log("Processing zone " + zoneName);
|
|
112
|
+
}
|
|
113
|
+
this.writeZone(zoneName, zone.getJson(currentOnly));
|
|
114
|
+
count++;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return count;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.JsonZoneWriter = JsonZoneWriter;
|
|
121
|
+
//# sourceMappingURL=JsonZoneWriter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JsonZoneWriter.js","sourceRoot":"","sources":["../src/JsonZoneWriter.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAG7B,6CAA0C;AAE1C;;GAEG;AACH,MAAa,cAAe,SAAQ,uBAAU;IAY1C;;;OAGG;IACH,YAAY,SAAiB,EAAE,OAAO,GAAG,KAAK;QAC1C,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED;;;;;;;;OAQG;IACH,SAAS,CAAC,QAAgB,EAAE,IAAoC;QAC5D,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAChB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,QAAQ,GAAG,eAAe,CAAC,CAAC;YACvD,CAAC;YACD,OAAO;QACX,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAAC;QAC/C,CAAC;QACD,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACnE,CAAC;IAED;;;;;;;;OAQG;IACH,UAAU,CAAC,KAAwB,EAAE,WAAoB;QACrD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;YACnC,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACf,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,QAAQ,CAAC,CAAC;gBAC/C,CAAC;gBACD,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;gBACpD,KAAK,EAAE,CAAC;YACZ,CAAC;QACL,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ;AAvED,wCAuEC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { EnrichedTzData, ZoneInfo } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Options for {@link LocaleDataWriter}.
|
|
4
|
+
*/
|
|
5
|
+
export interface LocaleDataWriterOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Locale data root directory (parent of `zoneinfo/`, also receives
|
|
8
|
+
* `timezone.jf` and `und/<CC>/timezone.jf`).
|
|
9
|
+
*/
|
|
10
|
+
localeDir: string;
|
|
11
|
+
/**
|
|
12
|
+
* When true, emit progress messages to stdout.
|
|
13
|
+
*/
|
|
14
|
+
verbose?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Summary of a successful write.
|
|
18
|
+
*/
|
|
19
|
+
export interface WriteResult {
|
|
20
|
+
/** Number of per-zone JSON files written under `zoneinfo/`. */
|
|
21
|
+
zoneCount: number;
|
|
22
|
+
/** Number of `und/<CC>/timezone.jf` files written. */
|
|
23
|
+
countryTimezoneCount: number;
|
|
24
|
+
/** Absolute path to the locale root. */
|
|
25
|
+
localeDir: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Writes enriched timezone data to an ilib locale directory tree.
|
|
29
|
+
*
|
|
30
|
+
* Output layout matches `ilib/js/data/locale`:
|
|
31
|
+
* - `zoneinfo/<Continent>/<City>.json`
|
|
32
|
+
* - `zoneinfo/zonetab.json`
|
|
33
|
+
* - `timezone.jf`
|
|
34
|
+
* - `und/<CC>/timezone.jf`
|
|
35
|
+
*
|
|
36
|
+
* JSON is pretty-printed with 4-space indent and stable key ordering
|
|
37
|
+
* (via `json-stable-stringify`).
|
|
38
|
+
*/
|
|
39
|
+
export declare class LocaleDataWriter {
|
|
40
|
+
private readonly localeDir;
|
|
41
|
+
private readonly verbose;
|
|
42
|
+
/**
|
|
43
|
+
* @param options Writer configuration
|
|
44
|
+
*/
|
|
45
|
+
constructor(options: LocaleDataWriterOptions);
|
|
46
|
+
/**
|
|
47
|
+
* Persist a full enriched model under {@link LocaleDataWriterOptions.localeDir}.
|
|
48
|
+
*
|
|
49
|
+
* @param data Enriched zones and metadata from {@link ZoneInfoEnricher}
|
|
50
|
+
* @returns Write summary
|
|
51
|
+
* @throws Error when `data` is null/undefined/not an object, or when
|
|
52
|
+
* `zones`, `countryToZones`, `rootTimezone`, or `countryTimezones`
|
|
53
|
+
* are missing
|
|
54
|
+
* @throws Error when `localeDir` exists but is not a directory
|
|
55
|
+
*/
|
|
56
|
+
write(data: EnrichedTzData): WriteResult;
|
|
57
|
+
/**
|
|
58
|
+
* Persist compiler-only zone JSON under `localeDir/zoneinfo/`.
|
|
59
|
+
*
|
|
60
|
+
* Used by `--compile-only`: no `c`/`n`, no zonetab, no timezone.jf.
|
|
61
|
+
*
|
|
62
|
+
* @param zones Zone id → compiler output
|
|
63
|
+
* @returns Number of zone files written
|
|
64
|
+
* @throws Error when `zones` is null, undefined, or not an object
|
|
65
|
+
* @throws Error when `localeDir` exists but is not a directory
|
|
66
|
+
*/
|
|
67
|
+
writeZonesOnly(zones: Record<string, ZoneInfo>): number;
|
|
68
|
+
/**
|
|
69
|
+
* Resolve and validate the locale root directory.
|
|
70
|
+
*/
|
|
71
|
+
private ensureLocaleDir;
|
|
72
|
+
/**
|
|
73
|
+
* Write pretty-printed, stably keyed JSON.
|
|
74
|
+
*/
|
|
75
|
+
private writeJsonFile;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=LocaleDataWriter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocaleDataWriter.d.ts","sourceRoot":"","sources":["../src/LocaleDataWriter.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACpC;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,gBAAgB;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAElC;;OAEG;gBACS,OAAO,EAAE,uBAAuB;IAQ5C;;;;;;;;;OASG;IACH,KAAK,CAAC,IAAI,EAAE,cAAc,GAAG,WAAW;IAyDxC;;;;;;;;;OASG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,MAAM;IAoBvD;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACH,OAAO,CAAC,aAAa;CAWxB"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* LocaleDataWriter.ts - write enriched timezone locale data once
|
|
4
|
+
*
|
|
5
|
+
* Copyright © 2026 JEDLSoft
|
|
6
|
+
*
|
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
* you may not use this file except in compliance with the License.
|
|
9
|
+
* You may obtain a copy of the License at
|
|
10
|
+
*
|
|
11
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
*
|
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
*
|
|
17
|
+
* See the License for the specific language governing permissions and
|
|
18
|
+
* limitations under the License.
|
|
19
|
+
*/
|
|
20
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
23
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
24
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
25
|
+
}
|
|
26
|
+
Object.defineProperty(o, k2, desc);
|
|
27
|
+
}) : (function(o, m, k, k2) {
|
|
28
|
+
if (k2 === undefined) k2 = k;
|
|
29
|
+
o[k2] = m[k];
|
|
30
|
+
}));
|
|
31
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
32
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
33
|
+
}) : function(o, v) {
|
|
34
|
+
o["default"] = v;
|
|
35
|
+
});
|
|
36
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
37
|
+
var ownKeys = function(o) {
|
|
38
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
39
|
+
var ar = [];
|
|
40
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
41
|
+
return ar;
|
|
42
|
+
};
|
|
43
|
+
return ownKeys(o);
|
|
44
|
+
};
|
|
45
|
+
return function (mod) {
|
|
46
|
+
if (mod && mod.__esModule) return mod;
|
|
47
|
+
var result = {};
|
|
48
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
49
|
+
__setModuleDefault(result, mod);
|
|
50
|
+
return result;
|
|
51
|
+
};
|
|
52
|
+
})();
|
|
53
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
54
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
55
|
+
};
|
|
56
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
57
|
+
exports.LocaleDataWriter = void 0;
|
|
58
|
+
const fs = __importStar(require("fs"));
|
|
59
|
+
const path = __importStar(require("path"));
|
|
60
|
+
const json_stable_stringify_1 = __importDefault(require("json-stable-stringify"));
|
|
61
|
+
const ilib_data_utils_1 = require("ilib-data-utils");
|
|
62
|
+
/**
|
|
63
|
+
* Writes enriched timezone data to an ilib locale directory tree.
|
|
64
|
+
*
|
|
65
|
+
* Output layout matches `ilib/js/data/locale`:
|
|
66
|
+
* - `zoneinfo/<Continent>/<City>.json`
|
|
67
|
+
* - `zoneinfo/zonetab.json`
|
|
68
|
+
* - `timezone.jf`
|
|
69
|
+
* - `und/<CC>/timezone.jf`
|
|
70
|
+
*
|
|
71
|
+
* JSON is pretty-printed with 4-space indent and stable key ordering
|
|
72
|
+
* (via `json-stable-stringify`).
|
|
73
|
+
*/
|
|
74
|
+
class LocaleDataWriter {
|
|
75
|
+
/**
|
|
76
|
+
* @param options Writer configuration
|
|
77
|
+
*/
|
|
78
|
+
constructor(options) {
|
|
79
|
+
if (!options || !options.localeDir) {
|
|
80
|
+
throw new Error("localeDir is required");
|
|
81
|
+
}
|
|
82
|
+
this.localeDir = options.localeDir;
|
|
83
|
+
this.verbose = Boolean(options.verbose);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Persist a full enriched model under {@link LocaleDataWriterOptions.localeDir}.
|
|
87
|
+
*
|
|
88
|
+
* @param data Enriched zones and metadata from {@link ZoneInfoEnricher}
|
|
89
|
+
* @returns Write summary
|
|
90
|
+
* @throws Error when `data` is null/undefined/not an object, or when
|
|
91
|
+
* `zones`, `countryToZones`, `rootTimezone`, or `countryTimezones`
|
|
92
|
+
* are missing
|
|
93
|
+
* @throws Error when `localeDir` exists but is not a directory
|
|
94
|
+
*/
|
|
95
|
+
write(data) {
|
|
96
|
+
if (data === null || data === undefined || typeof data !== "object") {
|
|
97
|
+
throw new Error("data must be an object");
|
|
98
|
+
}
|
|
99
|
+
if (data.zones === undefined) {
|
|
100
|
+
throw new Error("data.zones is required");
|
|
101
|
+
}
|
|
102
|
+
if (data.countryToZones === undefined) {
|
|
103
|
+
throw new Error("data.countryToZones is required");
|
|
104
|
+
}
|
|
105
|
+
if (data.rootTimezone === undefined) {
|
|
106
|
+
throw new Error("data.rootTimezone is required");
|
|
107
|
+
}
|
|
108
|
+
if (data.countryTimezones === undefined) {
|
|
109
|
+
throw new Error("data.countryTimezones is required");
|
|
110
|
+
}
|
|
111
|
+
const localeDir = this.ensureLocaleDir();
|
|
112
|
+
const zoneinfoDir = path.join(localeDir, "zoneinfo");
|
|
113
|
+
ilib_data_utils_1.Utils.makeDirs(zoneinfoDir);
|
|
114
|
+
let zoneCount = 0;
|
|
115
|
+
for (const zoneId of Object.keys(data.zones)) {
|
|
116
|
+
this.writeJsonFile(path.join(zoneinfoDir, zoneId + ".json"), data.zones[zoneId]);
|
|
117
|
+
zoneCount++;
|
|
118
|
+
}
|
|
119
|
+
this.writeJsonFile(path.join(zoneinfoDir, "zonetab.json"), data.countryToZones);
|
|
120
|
+
this.writeJsonFile(path.join(localeDir, "timezone.jf"), data.rootTimezone);
|
|
121
|
+
let countryTimezoneCount = 0;
|
|
122
|
+
for (const cc of Object.keys(data.countryTimezones)) {
|
|
123
|
+
const dir = path.join(localeDir, "und", cc);
|
|
124
|
+
ilib_data_utils_1.Utils.makeDirs(dir);
|
|
125
|
+
this.writeJsonFile(path.join(dir, "timezone.jf"), data.countryTimezones[cc]);
|
|
126
|
+
countryTimezoneCount++;
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
zoneCount,
|
|
130
|
+
countryTimezoneCount,
|
|
131
|
+
localeDir,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Persist compiler-only zone JSON under `localeDir/zoneinfo/`.
|
|
136
|
+
*
|
|
137
|
+
* Used by `--compile-only`: no `c`/`n`, no zonetab, no timezone.jf.
|
|
138
|
+
*
|
|
139
|
+
* @param zones Zone id → compiler output
|
|
140
|
+
* @returns Number of zone files written
|
|
141
|
+
* @throws Error when `zones` is null, undefined, or not an object
|
|
142
|
+
* @throws Error when `localeDir` exists but is not a directory
|
|
143
|
+
*/
|
|
144
|
+
writeZonesOnly(zones) {
|
|
145
|
+
if (zones === null || zones === undefined || typeof zones !== "object") {
|
|
146
|
+
throw new Error("zones must be an object");
|
|
147
|
+
}
|
|
148
|
+
const localeDir = this.ensureLocaleDir();
|
|
149
|
+
const zoneinfoDir = path.join(localeDir, "zoneinfo");
|
|
150
|
+
ilib_data_utils_1.Utils.makeDirs(zoneinfoDir);
|
|
151
|
+
let count = 0;
|
|
152
|
+
for (const zoneId of Object.keys(zones)) {
|
|
153
|
+
this.writeJsonFile(path.join(zoneinfoDir, zoneId + ".json"), zones[zoneId]);
|
|
154
|
+
count++;
|
|
155
|
+
}
|
|
156
|
+
return count;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Resolve and validate the locale root directory.
|
|
160
|
+
*/
|
|
161
|
+
ensureLocaleDir() {
|
|
162
|
+
const localeDir = path.resolve(this.localeDir);
|
|
163
|
+
if (fs.existsSync(localeDir)) {
|
|
164
|
+
if (!fs.statSync(localeDir).isDirectory()) {
|
|
165
|
+
throw new Error(localeDir + " is not a directory");
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
ilib_data_utils_1.Utils.makeDirs(localeDir);
|
|
170
|
+
}
|
|
171
|
+
return localeDir;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Write pretty-printed, stably keyed JSON.
|
|
175
|
+
*/
|
|
176
|
+
writeJsonFile(filePath, value) {
|
|
177
|
+
var _a;
|
|
178
|
+
const dir = path.dirname(filePath);
|
|
179
|
+
if (!fs.existsSync(dir)) {
|
|
180
|
+
ilib_data_utils_1.Utils.makeDirs(dir);
|
|
181
|
+
}
|
|
182
|
+
if (this.verbose) {
|
|
183
|
+
console.log("Writing out " + filePath);
|
|
184
|
+
}
|
|
185
|
+
const text = (_a = (0, json_stable_stringify_1.default)(value, { space: 4 })) !== null && _a !== void 0 ? _a : "{}";
|
|
186
|
+
fs.writeFileSync(filePath, text, "utf-8");
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
exports.LocaleDataWriter = LocaleDataWriter;
|
|
190
|
+
//# sourceMappingURL=LocaleDataWriter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocaleDataWriter.js","sourceRoot":"","sources":["../src/LocaleDataWriter.ts"],"names":[],"mappings":"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"}
|
package/lib/Offset.d.ts
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { RelativeDate } from "./RelativeDate";
|
|
2
|
+
import { RuleSet } from "./RuleSet";
|
|
3
|
+
/**
|
|
4
|
+
* Models an offset from GMT in a particular time frame, optionally with
|
|
5
|
+
* a shared daylight-savings rule set.
|
|
6
|
+
*/
|
|
7
|
+
export declare class Offset {
|
|
8
|
+
/**
|
|
9
|
+
* Hours component of the GMT offset (may be negative).
|
|
10
|
+
*/
|
|
11
|
+
offsetHours: number;
|
|
12
|
+
/**
|
|
13
|
+
* Minutes component of the GMT offset.
|
|
14
|
+
*/
|
|
15
|
+
offsetMinutes: number;
|
|
16
|
+
/**
|
|
17
|
+
* Seconds component of the GMT offset.
|
|
18
|
+
*/
|
|
19
|
+
offsetSeconds: number;
|
|
20
|
+
/**
|
|
21
|
+
* Named DST rule set referenced by this offset, or `null` when none
|
|
22
|
+
* (`-` in tzdata).
|
|
23
|
+
*/
|
|
24
|
+
rules: RuleSet | null;
|
|
25
|
+
/**
|
|
26
|
+
* Abbreviation format string from tzdata FORMAT column
|
|
27
|
+
* (for example `"E%sT"`, `"%z"`, `"GMT"`, or `"-03/-02"`).
|
|
28
|
+
*
|
|
29
|
+
* When serializing, `%s` becomes `{c}` and `%z` becomes a numeric
|
|
30
|
+
* UT-offset abbreviation (`-03` or `-03/-02` for std/DST), matching
|
|
31
|
+
* IANA zic's `abbroffset` rules.
|
|
32
|
+
*/
|
|
33
|
+
format: string | null;
|
|
34
|
+
/**
|
|
35
|
+
* When this offset stops applying. `null` means it is still current
|
|
36
|
+
* (no until fields on the zone line).
|
|
37
|
+
*/
|
|
38
|
+
endDate: RelativeDate | null;
|
|
39
|
+
/**
|
|
40
|
+
* Create an empty offset, or parse fields from a Zone / continuation line.
|
|
41
|
+
*
|
|
42
|
+
* @param line Line text to parse (zone name may occupy `fields[0]`)
|
|
43
|
+
* @param ruleSets Shared map of named rule sets
|
|
44
|
+
* @param timeZoneName Zone id (kept for API parity; unused in parsing)
|
|
45
|
+
*/
|
|
46
|
+
constructor(line?: string, ruleSets?: Map<string, RuleSet>, timeZoneName?: string);
|
|
47
|
+
/**
|
|
48
|
+
* Populate this offset from a split Zone or continuation line.
|
|
49
|
+
*
|
|
50
|
+
* Always reads the numeric GMT offset from `fields[1]` after splitting
|
|
51
|
+
* on whitespace (matching the Java port).
|
|
52
|
+
*
|
|
53
|
+
* @param line Source line text
|
|
54
|
+
* @param ruleSets Shared map of named rule sets (created on demand)
|
|
55
|
+
* @param _timeZoneName Unused; retained for call-site compatibility
|
|
56
|
+
* @throws {ParseException} If the line does not have enough fields
|
|
57
|
+
*/
|
|
58
|
+
setFields(line: string, ruleSets: Map<string, RuleSet>, _timeZoneName: string): void;
|
|
59
|
+
/**
|
|
60
|
+
* Compare by end date. An offset with no end date (current) sorts last.
|
|
61
|
+
*
|
|
62
|
+
* @param other Offset to compare against
|
|
63
|
+
* @returns Negative if this ends earlier, positive if later, else `0`
|
|
64
|
+
*/
|
|
65
|
+
compareTo(other: Offset): number;
|
|
66
|
+
/**
|
|
67
|
+
* Serialize this offset to the compact JSON shape used in zoneinfo.
|
|
68
|
+
*
|
|
69
|
+
* When `currentOnly` is true and rules are present, also emits wall-time
|
|
70
|
+
* DST start (`s`) and end (`e`) rules for the current year.
|
|
71
|
+
*
|
|
72
|
+
* @param currentOnly Whether to include current DST start/end rules
|
|
73
|
+
* @returns JSON object with keys such as `o`, `f`, `s`, and `e`
|
|
74
|
+
*/
|
|
75
|
+
getJson(currentOnly: boolean): Record<string, unknown>;
|
|
76
|
+
/**
|
|
77
|
+
* Expand IANA `%z` FORMAT using zic's `abbroffset` rules:
|
|
78
|
+
* `±hh`, `±hhmm`, or `±hhmmss` (shortest form that keeps precision).
|
|
79
|
+
* With a DST savings rule, emit `std/dst` slash form (e.g. `-03/-02`).
|
|
80
|
+
*
|
|
81
|
+
* @param startRule Current DST-start rule with savings, if any
|
|
82
|
+
* @returns Numeric abbreviation string for `f`
|
|
83
|
+
*/
|
|
84
|
+
private formatPercentZ;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=Offset.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Offset.d.ts","sourceRoot":"","sources":["../src/Offset.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;GAGG;AACH,qBAAa,MAAM;IACf;;OAEG;IACH,WAAW,SAAK;IAEhB;;OAEG;IACH,aAAa,SAAK;IAElB;;OAEG;IACH,aAAa,SAAK;IAElB;;;OAGG;IACH,KAAK,EAAE,OAAO,GAAG,IAAI,CAAQ;IAE7B;;;;;;;OAOG;IACH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE7B;;;OAGG;IACH,OAAO,EAAE,YAAY,GAAG,IAAI,CAAQ;IAEpC;;;;;;OAMG;gBAEC,IAAI,CAAC,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,YAAY,CAAC,EAAE,MAAM;IAOzB;;;;;;;;;;OAUG;IACH,SAAS,CACL,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,aAAa,EAAE,MAAM,GACtB,IAAI;IA2CP;;;;;OAKG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAWhC;;;;;;;;OAQG;IACH,OAAO,CAAC,WAAW,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAgFtD;;;;;;;OAOG;IACH,OAAO,CAAC,cAAc;CAyBzB"}
|