ilib-zic 0.0.1 → 1.0.1

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.
Files changed (95) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +70 -8
  3. package/ilib-zic.bat +3 -0
  4. package/lib/JsonZoneWriter.d.ts +42 -0
  5. package/lib/JsonZoneWriter.d.ts.map +1 -0
  6. package/lib/JsonZoneWriter.js +121 -0
  7. package/lib/JsonZoneWriter.js.map +1 -0
  8. package/lib/LocaleDataWriter.d.ts +77 -0
  9. package/lib/LocaleDataWriter.d.ts.map +1 -0
  10. package/lib/LocaleDataWriter.js +190 -0
  11. package/lib/LocaleDataWriter.js.map +1 -0
  12. package/lib/Offset.d.ts +86 -0
  13. package/lib/Offset.d.ts.map +1 -0
  14. package/lib/Offset.js +264 -0
  15. package/lib/Offset.js.map +1 -0
  16. package/lib/ParseException.d.ts +7 -0
  17. package/lib/ParseException.d.ts.map +1 -0
  18. package/lib/ParseException.js +33 -0
  19. package/lib/ParseException.js.map +1 -0
  20. package/lib/RelativeDate.d.ts +126 -0
  21. package/lib/RelativeDate.d.ts.map +1 -0
  22. package/lib/RelativeDate.js +464 -0
  23. package/lib/RelativeDate.js.map +1 -0
  24. package/lib/Rule.d.ts +76 -0
  25. package/lib/Rule.d.ts.map +1 -0
  26. package/lib/Rule.js +228 -0
  27. package/lib/Rule.js.map +1 -0
  28. package/lib/RuleSet.d.ts +34 -0
  29. package/lib/RuleSet.d.ts.map +1 -0
  30. package/lib/RuleSet.js +65 -0
  31. package/lib/RuleSet.js.map +1 -0
  32. package/lib/Zone.d.ts +59 -0
  33. package/lib/Zone.d.ts.map +1 -0
  34. package/lib/Zone.js +115 -0
  35. package/lib/Zone.js.map +1 -0
  36. package/lib/ZoneInfoCompiler.d.ts +73 -0
  37. package/lib/ZoneInfoCompiler.d.ts.map +1 -0
  38. package/lib/ZoneInfoCompiler.js +177 -0
  39. package/lib/ZoneInfoCompiler.js.map +1 -0
  40. package/lib/ZoneInfoEnricher.d.ts +50 -0
  41. package/lib/ZoneInfoEnricher.d.ts.map +1 -0
  42. package/lib/ZoneInfoEnricher.js +317 -0
  43. package/lib/ZoneInfoEnricher.js.map +1 -0
  44. package/lib/ZoneInfoFile.d.ts +64 -0
  45. package/lib/ZoneInfoFile.d.ts.map +1 -0
  46. package/lib/ZoneInfoFile.js +188 -0
  47. package/lib/ZoneInfoFile.js.map +1 -0
  48. package/lib/ZoneInfoPipeline.d.ts +64 -0
  49. package/lib/ZoneInfoPipeline.d.ts.map +1 -0
  50. package/lib/ZoneInfoPipeline.js +116 -0
  51. package/lib/ZoneInfoPipeline.js.map +1 -0
  52. package/lib/ZoneWriter.d.ts +16 -0
  53. package/lib/ZoneWriter.d.ts.map +1 -0
  54. package/lib/ZoneWriter.js +28 -0
  55. package/lib/ZoneWriter.js.map +1 -0
  56. package/lib/ZoneWriterFactory.d.ts +11 -0
  57. package/lib/ZoneWriterFactory.d.ts.map +1 -0
  58. package/lib/ZoneWriterFactory.js +37 -0
  59. package/lib/ZoneWriterFactory.js.map +1 -0
  60. package/lib/defaults.d.ts +23 -0
  61. package/lib/defaults.d.ts.map +1 -0
  62. package/lib/defaults.js +79 -0
  63. package/lib/defaults.js.map +1 -0
  64. package/lib/index.d.ts +19 -0
  65. package/lib/index.d.ts.map +1 -0
  66. package/lib/index.js +186 -0
  67. package/lib/index.js.map +1 -0
  68. package/lib/loadJson.d.ts +10 -0
  69. package/lib/loadJson.d.ts.map +1 -0
  70. package/lib/loadJson.js +81 -0
  71. package/lib/loadJson.js.map +1 -0
  72. package/lib/types.d.ts +90 -0
  73. package/lib/types.d.ts.map +1 -0
  74. package/lib/types.js +21 -0
  75. package/lib/types.js.map +1 -0
  76. package/package.json +91 -41
  77. package/src/JsonZoneWriter.ts +100 -0
  78. package/src/LocaleDataWriter.ts +209 -0
  79. package/src/Offset.ts +324 -0
  80. package/src/ParseException.ts +29 -0
  81. package/src/RelativeDate.ts +529 -0
  82. package/src/Rule.ts +247 -0
  83. package/src/RuleSet.ts +66 -0
  84. package/src/Zone.ts +126 -0
  85. package/src/ZoneInfoCompiler.ts +203 -0
  86. package/src/ZoneInfoEnricher.ts +361 -0
  87. package/src/ZoneInfoFile.ts +176 -0
  88. package/src/ZoneInfoPipeline.ts +137 -0
  89. package/src/ZoneWriter.ts +38 -0
  90. package/src/ZoneWriterFactory.ts +40 -0
  91. package/src/defaults.ts +79 -0
  92. package/src/index.ts +182 -0
  93. package/src/loadJson.ts +49 -0
  94. package/src/types.ts +109 -0
  95. package/index.js +0 -11
package/CHANGELOG.md ADDED
@@ -0,0 +1,26 @@
1
+ # ilib-zic
2
+
3
+ ## 1.0.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 729c49e: Allow Node 24 and 26 by widening engines.node upper bound from <23 to <27.
8
+
9
+ Yarn 1 enforces engines and refuses to install these packages on newer
10
+ Node releases when the range stops at Node 23.
11
+
12
+ ## 1.0.0
13
+
14
+ ### Major Changes
15
+
16
+ - af1a7b6: First release of ilib-zic as a standalone package in the ilib-mono monorepo.
17
+
18
+ - 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
19
+ - Compiles IANA tzdata → enriches (country codes, Windows display names, zonetab, per-country `timezone.jf`) → writes a locale tree in one pass
20
+ - CLI: `ilib-zic <src> <localeDir> [--verbose] [--compile-only]` (published as `ilib-zic` because npm `zic` is taken)
21
+ - Programmatic `ZoneInfoPipeline` API (or compile / enrich / write stages individually)
22
+ - Supports IANA `%z` abbreviation formats (zic `abbroffset`) for numeric UT abbrevs such as `-03/-02`
23
+ - Country defaults prefer `zone.tab` primaries; do not follow cross-country Link consolidations for `timezone.jf` or Windows `n`
24
+ - POSIX factory Links (`EST`, `CET`, …) are not treated as country-local zone ids
25
+ - Depends on `ilib-ctype`, `ilib-common`, `ilib-data-utils`, `cldr-core`, and `json-stable-stringify`
26
+ - 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 (0.0.1 placeholder)
1
+ # ilib-zic
2
2
 
3
- This is a **temporary placeholder** published only so the `ilib-zic` package
4
- exists on npmjs.com and can have [trusted publishing
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
- Do not depend on this version. The real package ships as `1.0.0` from
9
- [`packages/zic`](https://github.com/iLib-js/ilib-mono/tree/main/packages/zic)
10
- in the [ilib-mono](https://github.com/iLib-js/ilib-mono) monorepo.
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,3 @@
1
+ @echo off
2
+
3
+ node "%~dp0\lib\index.js" %*
@@ -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":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAE7B,kFAA8C;AAC9C,qDAAwC;AAgCxC;;;;;;;;;;;GAWG;AACH,MAAa,gBAAgB;IAIzB;;OAEG;IACH,YAAY,OAAgC;QACxC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,IAAoB;QACtB,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACzC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACrD,uBAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAE5B,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,EACxC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CACrB,CAAC;YACF,SAAS,EAAE,CAAC;QAChB,CAAC;QAED,IAAI,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EACtC,IAAI,CAAC,cAAc,CACtB,CAAC;QACF,IAAI,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,EACnC,IAAI,CAAC,YAAY,CACpB,CAAC;QAEF,IAAI,oBAAoB,GAAG,CAAC,CAAC;QAC7B,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAClD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAC5C,uBAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACpB,IAAI,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,EAC7B,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAC5B,CAAC;YACF,oBAAoB,EAAE,CAAC;QAC3B,CAAC;QAED,OAAO;YACH,SAAS;YACT,oBAAoB;YACpB,SAAS;SACZ,CAAC;IACN,CAAC;IAED;;;;;;;;;OASG;IACH,cAAc,CAAC,KAA+B;QAC1C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACzC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACrD,uBAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAE5B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,EACxC,KAAK,CAAC,MAAM,CAAC,CAChB,CAAC;YACF,KAAK,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;OAEG;IACK,eAAe;QACnB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CAAC,SAAS,GAAG,qBAAqB,CAAC,CAAC;YACvD,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,uBAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,QAAgB,EAAE,KAAc;;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,uBAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,QAAQ,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,IAAI,GAAG,MAAA,IAAA,+BAAS,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,mCAAI,IAAI,CAAC;QACpD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;CACJ;AA7ID,4CA6IC"}
@@ -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"}