@o3co/ts.hocon 0.1.0 → 0.1.2

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 (106) hide show
  1. package/README.ja.md +49 -0
  2. package/README.md +49 -0
  3. package/dist/config-D4EyvNd8.d.cts +31 -0
  4. package/dist/config-D4EyvNd8.d.ts +31 -0
  5. package/dist/index.cjs +891 -0
  6. package/dist/index.d.cts +39 -0
  7. package/dist/index.d.ts +39 -0
  8. package/dist/index.js +847 -0
  9. package/dist/zod.cjs +39 -0
  10. package/dist/zod.d.cts +7 -0
  11. package/dist/zod.d.ts +7 -0
  12. package/dist/zod.js +13 -0
  13. package/package.json +13 -10
  14. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -29
  15. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -23
  16. package/.github/pull_request_template.md +0 -17
  17. package/.github/workflows/lint.yml +0 -33
  18. package/.github/workflows/release.yml +0 -41
  19. package/.github/workflows/test.yml +0 -53
  20. package/CHANGELOG.md +0 -22
  21. package/CONTRIBUTING.md +0 -62
  22. package/SECURITY.md +0 -20
  23. package/docs/superpowers/plans/2026-03-20-ts-hocon.md +0 -2412
  24. package/docs/superpowers/specs/2026-03-20-ts-hocon-design.md +0 -368
  25. package/src/config.ts +0 -108
  26. package/src/errors.ts +0 -34
  27. package/src/index.ts +0 -5
  28. package/src/internal/lexer/lexer.ts +0 -168
  29. package/src/internal/lexer/token.ts +0 -20
  30. package/src/internal/parser/ast.ts +0 -17
  31. package/src/internal/parser/parser.ts +0 -229
  32. package/src/internal/resolver/resolver.ts +0 -428
  33. package/src/parse.ts +0 -79
  34. package/src/value.ts +0 -5
  35. package/src/zod.ts +0 -12
  36. package/tests/config.test.ts +0 -100
  37. package/tests/errors.test.ts +0 -43
  38. package/tests/lexer.test.ts +0 -141
  39. package/tests/lightbend/lightbend.test.ts +0 -39
  40. package/tests/lightbend/testdata/a_1.conf +0 -1
  41. package/tests/lightbend/testdata/b_2.conf +0 -1
  42. package/tests/lightbend/testdata/beanconfig/beanconfig01.conf +0 -131
  43. package/tests/lightbend/testdata/bom.conf +0 -2
  44. package/tests/lightbend/testdata/cycle.conf +0 -1
  45. package/tests/lightbend/testdata/env-variables.conf +0 -16
  46. package/tests/lightbend/testdata/equiv01/comments.conf +0 -45
  47. package/tests/lightbend/testdata/equiv01/equals.conf +0 -41
  48. package/tests/lightbend/testdata/equiv01/no-commas.conf +0 -55
  49. package/tests/lightbend/testdata/equiv01/no-root-braces.conf +0 -40
  50. package/tests/lightbend/testdata/equiv01/no-whitespace.json +0 -1
  51. package/tests/lightbend/testdata/equiv01/omit-colons.conf +0 -44
  52. package/tests/lightbend/testdata/equiv01/original.json +0 -41
  53. package/tests/lightbend/testdata/equiv01/path-keys.conf +0 -29
  54. package/tests/lightbend/testdata/equiv01/properties-style.conf +0 -37
  55. package/tests/lightbend/testdata/equiv01/substitutions.conf +0 -41
  56. package/tests/lightbend/testdata/equiv01/unquoted.conf +0 -41
  57. package/tests/lightbend/testdata/equiv02/original.json +0 -17
  58. package/tests/lightbend/testdata/equiv02/path-keys-weird-whitespace.conf +0 -32
  59. package/tests/lightbend/testdata/equiv02/path-keys.conf +0 -9
  60. package/tests/lightbend/testdata/equiv03/includes.conf +0 -7
  61. package/tests/lightbend/testdata/equiv03/letters/a.conf +0 -6
  62. package/tests/lightbend/testdata/equiv03/letters/b.json +0 -3
  63. package/tests/lightbend/testdata/equiv03/letters/c.conf +0 -2
  64. package/tests/lightbend/testdata/equiv03/letters/c.properties +0 -1
  65. package/tests/lightbend/testdata/equiv03/letters/numbers/1.conf +0 -1
  66. package/tests/lightbend/testdata/equiv03/letters/numbers/2.properties +0 -1
  67. package/tests/lightbend/testdata/equiv03/original.json +0 -15
  68. package/tests/lightbend/testdata/equiv03/root/foo.conf +0 -1
  69. package/tests/lightbend/testdata/equiv04/missing-substitutions.conf +0 -4
  70. package/tests/lightbend/testdata/equiv04/original.json +0 -3
  71. package/tests/lightbend/testdata/equiv05/original.json +0 -16
  72. package/tests/lightbend/testdata/equiv05/triple-quotes.conf +0 -20
  73. package/tests/lightbend/testdata/file-include.conf +0 -5
  74. package/tests/lightbend/testdata/include-from-list.conf +0 -5
  75. package/tests/lightbend/testdata/onclasspath.conf +0 -2
  76. package/tests/lightbend/testdata/subdir/bar-file.conf +0 -1
  77. package/tests/lightbend/testdata/subdir/bar.conf +0 -1
  78. package/tests/lightbend/testdata/subdir/baz.conf +0 -1
  79. package/tests/lightbend/testdata/subdir/foo.conf +0 -5
  80. package/tests/lightbend/testdata/test01.conf +0 -96
  81. package/tests/lightbend/testdata/test01.json +0 -4
  82. package/tests/lightbend/testdata/test01.properties +0 -5
  83. package/tests/lightbend/testdata/test02.conf +0 -13
  84. package/tests/lightbend/testdata/test03-included.conf +0 -9
  85. package/tests/lightbend/testdata/test03.conf +0 -36
  86. package/tests/lightbend/testdata/test04.conf +0 -305
  87. package/tests/lightbend/testdata/test05.conf +0 -154
  88. package/tests/lightbend/testdata/test06.conf +0 -14
  89. package/tests/lightbend/testdata/test07.conf +0 -4
  90. package/tests/lightbend/testdata/test08.conf +0 -6
  91. package/tests/lightbend/testdata/test09.conf +0 -17
  92. package/tests/lightbend/testdata/test10.conf +0 -11
  93. package/tests/lightbend/testdata/test11.conf +0 -7
  94. package/tests/lightbend/testdata/test12.conf +0 -43
  95. package/tests/lightbend/testdata/test13-application-override-substitutions.conf +0 -1
  96. package/tests/lightbend/testdata/test13-reference-bad-substitutions.conf +0 -1
  97. package/tests/lightbend/testdata/test13-reference-with-substitutions.conf +0 -2
  98. package/tests/lightbend/testdata/validate-invalid.conf +0 -30
  99. package/tests/lightbend/testdata/validate-reference.conf +0 -32
  100. package/tests/parse.test.ts +0 -44
  101. package/tests/parser.test.ts +0 -154
  102. package/tests/resolver.test.ts +0 -159
  103. package/tests/zod.test.ts +0 -57
  104. package/tsconfig.json +0 -16
  105. package/tsup.config.ts +0 -12
  106. package/vitest.config.ts +0 -7
package/README.ja.md CHANGED
@@ -174,6 +174,55 @@ v0.1.0 で未対応の機能:
174
174
  - `include classpath(...)`
175
175
  - `.properties` ファイルのパース
176
176
 
177
+ ## パフォーマンス
178
+
179
+ ### ts.hocon のパースコスト
180
+
181
+ [Vitest bench](https://vitest.dev/guide/features.html#benchmarking)(tinybench)で計測。`pnpm bench` で再現できます。
182
+
183
+ | シナリオ | ops/sec | 1回あたりの時間 |
184
+ |---|---|---|
185
+ | 小規模設定(10キー) | ~200,000 | ~5 µs |
186
+ | 中規模設定(100キー) | ~23,000 | ~43 µs |
187
+ | 大規模設定(1,000キー) | ~2,100 | ~476 µs |
188
+ | substitution 10個 | ~74,000 | ~14 µs |
189
+ | substitution 50個 | ~14,000 | ~71 µs |
190
+ | substitution 100個 | ~6,900 | ~145 µs |
191
+ | ネスト深度 5 | ~210,000 | ~5 µs |
192
+ | ネスト深度 10 | ~147,000 | ~7 µs |
193
+ | ネスト深度 20 | ~80,000 | ~13 µs |
194
+
195
+ ### JSON.parse との比較
196
+
197
+ JSON.parse は V8 のネイティブ C++ 実装であり、最速の基準線です。この比較は HOCON の豊富な機能によるオーバーヘッドを示します。
198
+
199
+ | 設定サイズ | ts.hocon | JSON.parse | 倍率 |
200
+ |---|---|---|---|
201
+ | 小規模(10キー) | ~198K ops/s | ~1,967K ops/s | ~10x |
202
+ | 中規模(100キー) | ~23K ops/s | ~280K ops/s | ~12x |
203
+ | 大規模(1,000キー) | ~2.2K ops/s | ~12K ops/s | ~5.4x |
204
+
205
+ 一般的なアプリケーション設定(起動時に1回読み込み)であれば、パースコストは無視できるレベルです。1,000キーの設定でも 0.5 ms 未満でパースできます。
206
+
207
+ ### node-config との機能比較
208
+
209
+ ts.hocon は [node-config](https://github.com/node-config/node-config)(JSON)と比較して、大幅に豊富な設定機能を提供します:
210
+
211
+ | 機能 | ts.hocon | node-config (JSON) |
212
+ |---|---|---|
213
+ | コメント | `//` `#` | 非対応 |
214
+ | 複数行文字列 | `"""..."""` | 非対応 |
215
+ | substitution(`${path}`) | 対応 | 非対応 |
216
+ | optional substitution(`${?path}`) | 対応 | 非対応 |
217
+ | 環境変数参照 | 対応(substitution経由) | 部分対応(`custom-environment-variables` ファイル) |
218
+ | include | 対応 | 非対応 |
219
+ | ディープマージ | 対応(配列も対応) | 部分対応(配列は置換) |
220
+ | 追加演算子(`+=`) | 対応 | 非対応 |
221
+ | 環境別設定 | HOCON仕様で自由に構成可 | 対応(ファイル名規約) |
222
+ | スキーマ検証 | Zod 統合 | 非対応 |
223
+ | プログラマティック API | `parse(string)` | ファイルベース初期化後に `get()` |
224
+ | 型付きゲッター | `getString`, `getNumber` 等 | `get()`(any) |
225
+
177
226
  ## ブラウザ対応
178
227
 
179
228
  `parse()` と `parseAsync()` はブラウザで動作します。`parseFile()` と `parseFileAsync()` は Node.js(またはカスタムの `readFileSync`/`readFile` オプション)が必要です。
package/README.md CHANGED
@@ -174,6 +174,55 @@ Not supported in v0.1.0:
174
174
  - `include classpath(...)`
175
175
  - `.properties` file parsing
176
176
 
177
+ ## Performance
178
+
179
+ ### ts.hocon Parsing Cost
180
+
181
+ Measured with [Vitest bench](https://vitest.dev/guide/features.html#benchmarking) (tinybench). Run `pnpm bench` to reproduce.
182
+
183
+ | Scenario | ops/sec | Time per op |
184
+ |---|---|---|
185
+ | Small config (10 keys) | ~200,000 | ~5 µs |
186
+ | Medium config (100 keys) | ~23,000 | ~43 µs |
187
+ | Large config (1,000 keys) | ~2,100 | ~476 µs |
188
+ | 10 substitutions | ~74,000 | ~14 µs |
189
+ | 50 substitutions | ~14,000 | ~71 µs |
190
+ | 100 substitutions | ~6,900 | ~145 µs |
191
+ | Depth 5 nesting | ~210,000 | ~5 µs |
192
+ | Depth 10 nesting | ~147,000 | ~7 µs |
193
+ | Depth 20 nesting | ~80,000 | ~13 µs |
194
+
195
+ ### Comparison with JSON.parse
196
+
197
+ JSON.parse is V8's native C++ implementation — the fastest possible baseline. This comparison shows the overhead of HOCON's rich feature set.
198
+
199
+ | Config Size | ts.hocon | JSON.parse | Ratio |
200
+ |---|---|---|---|
201
+ | Small (10 keys) | ~198K ops/s | ~1,967K ops/s | ~10x |
202
+ | Medium (100 keys) | ~23K ops/s | ~280K ops/s | ~12x |
203
+ | Large (1,000 keys) | ~2.2K ops/s | ~12K ops/s | ~5.4x |
204
+
205
+ For typical application configs (loaded once at startup), the parsing cost is negligible — even a 1,000-key config parses in under 0.5 ms.
206
+
207
+ ### Feature Comparison with node-config
208
+
209
+ ts.hocon provides significantly richer configuration capabilities compared to [node-config](https://github.com/node-config/node-config) (JSON):
210
+
211
+ | Feature | ts.hocon | node-config (JSON) |
212
+ |---|---|---|
213
+ | Comments | `//` `#` | No |
214
+ | Multi-line strings | `"""..."""` | No |
215
+ | Substitution (`${path}`) | Yes | No |
216
+ | Optional substitution (`${?path}`) | Yes | No |
217
+ | Environment variable reference | Yes (via substitution) | Partial (`custom-environment-variables` file) |
218
+ | Include | Yes | No |
219
+ | Deep merge | Yes (arrays too) | Partial (arrays replaced) |
220
+ | Append operator (`+=`) | Yes | No |
221
+ | Environment-based config | Configurable via HOCON | Yes (filename convention) |
222
+ | Schema validation | Zod integration | No |
223
+ | Programmatic API | `parse(string)` | File-based initialization, then `get()` |
224
+ | Typed getters | `getString`, `getNumber`, etc. | `get()` (any) |
225
+
177
226
  ## Browser Compatibility
178
227
 
179
228
  `parse()` and `parseAsync()` work in browsers. `parseFile()` and `parseFileAsync()` require Node.js (or a custom `readFileSync`/`readFile` option).
@@ -0,0 +1,31 @@
1
+ type HoconValue = {
2
+ kind: 'object';
3
+ fields: Map<string, HoconValue>;
4
+ } | {
5
+ kind: 'array';
6
+ items: HoconValue[];
7
+ } | {
8
+ kind: 'scalar';
9
+ value: string | number | boolean | null;
10
+ };
11
+
12
+ declare class Config {
13
+ private readonly root;
14
+ constructor(root: HoconValue & {
15
+ kind: 'object';
16
+ });
17
+ get(path: string): unknown;
18
+ getString(path: string): string;
19
+ getNumber(path: string): number;
20
+ getBoolean(path: string): boolean;
21
+ getConfig(path: string): Config;
22
+ getList(path: string): unknown[];
23
+ has(path: string): boolean;
24
+ keys(): string[];
25
+ withFallback(fallback: Config): Config;
26
+ toObject(): unknown;
27
+ private lookupNode;
28
+ private requireScalar;
29
+ }
30
+
31
+ export { Config as C, type HoconValue as H };
@@ -0,0 +1,31 @@
1
+ type HoconValue = {
2
+ kind: 'object';
3
+ fields: Map<string, HoconValue>;
4
+ } | {
5
+ kind: 'array';
6
+ items: HoconValue[];
7
+ } | {
8
+ kind: 'scalar';
9
+ value: string | number | boolean | null;
10
+ };
11
+
12
+ declare class Config {
13
+ private readonly root;
14
+ constructor(root: HoconValue & {
15
+ kind: 'object';
16
+ });
17
+ get(path: string): unknown;
18
+ getString(path: string): string;
19
+ getNumber(path: string): number;
20
+ getBoolean(path: string): boolean;
21
+ getConfig(path: string): Config;
22
+ getList(path: string): unknown[];
23
+ has(path: string): boolean;
24
+ keys(): string[];
25
+ withFallback(fallback: Config): Config;
26
+ toObject(): unknown;
27
+ private lookupNode;
28
+ private requireScalar;
29
+ }
30
+
31
+ export { Config as C, type HoconValue as H };