summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-09-21 20:57:36 +0100
committerMichael Williamson <mike@zwobble.org>2026-09-21 20:57:36 +0100
commit2bf02785d9aef8b7b265d41cd45e2519a7e04bb4 (patch)
tree72765bd081280ca0a36ad5f820a0659b35ff66ee
parent8b601565c9e14aa673dca94bd79c84ad6f2f04f3 (diff)
Support Option in typescript-types
-rw-r--r--examples/10-option/hobgoblin.json5 (renamed from examples/12-inductive-data-types/hobgoblin.json5)0
-rw-r--r--examples/10-option/output/java/.gitignore (renamed from examples/10-shared/output/java/.gitignore)0
l---------examples/10-option/output/java/pom.xml (renamed from examples/10-shared/output/java/pom.xml)0
-rw-r--r--examples/10-option/output/java/src/test/java/org/zwobble/example/PointTests.java32
-rw-r--r--examples/10-option/output/rust/.gitignore (renamed from examples/10-shared/output/rust/.gitignore)0
-rw-r--r--examples/10-option/output/rust/Cargo.lock (renamed from examples/10-shared/output/rust/Cargo.lock)0
-rw-r--r--examples/10-option/output/rust/Cargo.toml (renamed from examples/10-shared/output/rust/Cargo.toml)0
-rw-r--r--examples/10-option/output/rust/rust-toolchain.toml (renamed from examples/10-shared/output/rust/rust-toolchain.toml)0
-rw-r--r--examples/10-option/output/rust/src/lib.rs14
-rw-r--r--examples/10-option/output/rust/src/point.rs13
-rw-r--r--examples/10-option/output/typescript/.gitignore (renamed from examples/10-shared/output/typescript/.gitignore)0
l---------examples/10-option/output/typescript/package.json (renamed from examples/10-shared/output/typescript/package.json)0
-rw-r--r--examples/10-option/output/typescript/pnpm-lock.yaml834
-rw-r--r--examples/10-option/output/typescript/src/point.test.ts12
-rw-r--r--examples/10-option/output/typescript/src/point.ts39
l---------examples/10-option/output/typescript/tsconfig.json (renamed from examples/10-shared/output/typescript/tsconfig.json)0
-rw-r--r--examples/10-option/src/point.hob9
-rw-r--r--examples/11-shared/hobgoblin.json5 (renamed from examples/10-shared/hobgoblin.json5)0
-rw-r--r--examples/11-shared/output/java/.gitignore (renamed from examples/11-imports/output/java/.gitignore)0
l---------examples/11-shared/output/java/pom.xml (renamed from examples/11-imports/output/java/pom.xml)0
-rw-r--r--examples/11-shared/output/java/src/test/java/org/zwobble/example/PointTests.java (renamed from examples/10-shared/output/java/src/test/java/org/zwobble/example/PointTests.java)0
-rw-r--r--examples/11-shared/output/rust/.gitignore (renamed from examples/11-imports/output/rust/.gitignore)0
-rw-r--r--examples/11-shared/output/rust/Cargo.lock (renamed from examples/11-imports/output/rust/Cargo.lock)0
-rw-r--r--examples/11-shared/output/rust/Cargo.toml (renamed from examples/11-imports/output/rust/Cargo.toml)0
-rw-r--r--examples/11-shared/output/rust/rust-toolchain.toml (renamed from examples/11-imports/output/rust/rust-toolchain.toml)0
-rw-r--r--examples/11-shared/output/rust/src/lib.rs (renamed from examples/10-shared/output/rust/src/lib.rs)0
-rw-r--r--examples/11-shared/output/rust/src/point.rs (renamed from examples/10-shared/output/rust/src/point.rs)0
-rw-r--r--examples/11-shared/output/typescript/.gitignore (renamed from examples/11-imports/output/typescript/.gitignore)0
l---------examples/11-shared/output/typescript/package.json (renamed from examples/11-imports/output/typescript/package.json)0
-rw-r--r--examples/11-shared/output/typescript/pnpm-lock.yaml (renamed from examples/10-shared/output/typescript/pnpm-lock.yaml)0
-rw-r--r--examples/11-shared/output/typescript/src/point.test.ts (renamed from examples/10-shared/output/typescript/src/point.test.ts)0
-rw-r--r--examples/11-shared/output/typescript/src/point.ts (renamed from examples/10-shared/output/typescript/src/point.ts)0
l---------examples/11-shared/output/typescript/tsconfig.json (renamed from examples/11-imports/output/typescript/tsconfig.json)0
-rw-r--r--examples/11-shared/src/point.hob (renamed from examples/10-shared/src/point.hob)0
-rw-r--r--examples/12-imports/hobgoblin.json5 (renamed from examples/11-imports/hobgoblin.json5)0
-rw-r--r--examples/12-imports/output/java/.gitignore (renamed from examples/12-inductive-data-types/output/java/.gitignore)0
l---------examples/12-imports/output/java/pom.xml (renamed from examples/12-inductive-data-types/output/java/pom.xml)0
-rw-r--r--examples/12-imports/output/java/src/test/java/org/zwobble/example/LineTests.java (renamed from examples/11-imports/output/java/src/test/java/org/zwobble/example/LineTests.java)0
-rw-r--r--examples/12-imports/output/rust/.gitignore (renamed from examples/12-inductive-data-types/output/rust/.gitignore)0
-rw-r--r--examples/12-imports/output/rust/Cargo.lock (renamed from examples/12-inductive-data-types/output/rust/Cargo.lock)0
-rw-r--r--examples/12-imports/output/rust/Cargo.toml (renamed from examples/12-inductive-data-types/output/rust/Cargo.toml)0
-rw-r--r--examples/12-imports/output/rust/rust-toolchain.toml (renamed from examples/12-inductive-data-types/output/rust/rust-toolchain.toml)0
-rw-r--r--examples/12-imports/output/rust/src/lib.rs (renamed from examples/11-imports/output/rust/src/lib.rs)0
-rw-r--r--examples/12-imports/output/rust/src/line.rs (renamed from examples/11-imports/output/rust/src/line.rs)0
-rw-r--r--examples/12-imports/output/rust/src/point.rs (renamed from examples/11-imports/output/rust/src/point.rs)0
-rw-r--r--examples/12-imports/output/typescript/.gitignore (renamed from examples/12-inductive-data-types/output/typescript/.gitignore)0
l---------examples/12-imports/output/typescript/package.json (renamed from examples/12-inductive-data-types/output/typescript/package.json)0
-rw-r--r--examples/12-imports/output/typescript/pnpm-lock.yaml (renamed from examples/11-imports/output/typescript/pnpm-lock.yaml)0
-rw-r--r--examples/12-imports/output/typescript/src/line.test.ts (renamed from examples/11-imports/output/typescript/src/line.test.ts)0
-rw-r--r--examples/12-imports/output/typescript/src/line.ts (renamed from examples/11-imports/output/typescript/src/line.ts)0
-rw-r--r--examples/12-imports/output/typescript/src/point.ts (renamed from examples/11-imports/output/typescript/src/point.ts)0
l---------examples/12-imports/output/typescript/tsconfig.json (renamed from examples/12-inductive-data-types/output/typescript/tsconfig.json)0
-rw-r--r--examples/12-imports/src/line.hob (renamed from examples/11-imports/src/line.hob)0
-rw-r--r--examples/12-imports/src/point.hob (renamed from examples/11-imports/src/point.hob)0
-rw-r--r--examples/13-inductive-data-types/hobgoblin.json523
-rw-r--r--examples/13-inductive-data-types/output/java/.gitignore (renamed from examples/13-inductive-data-types-separate-namespaces/output/java/.gitignore)0
l---------examples/13-inductive-data-types/output/java/pom.xml (renamed from examples/13-inductive-data-types-separate-namespaces/output/java/pom.xml)0
-rw-r--r--examples/13-inductive-data-types/output/java/src/main/java/org/zwobble/example/Arithmetic.java (renamed from examples/12-inductive-data-types/output/java/src/main/java/org/zwobble/example/Arithmetic.java)0
-rw-r--r--examples/13-inductive-data-types/output/java/src/test/java/org/zwobble/example/ArithmeticTests.java (renamed from examples/12-inductive-data-types/output/java/src/test/java/org/zwobble/example/ArithmeticTests.java)0
-rw-r--r--examples/13-inductive-data-types/output/rust/.gitignore (renamed from examples/13-inductive-data-types-separate-namespaces/output/rust/.gitignore)0
-rw-r--r--examples/13-inductive-data-types/output/rust/Cargo.lock (renamed from examples/13-inductive-data-types-separate-namespaces/output/rust/Cargo.lock)0
-rw-r--r--examples/13-inductive-data-types/output/rust/Cargo.toml (renamed from examples/13-inductive-data-types-separate-namespaces/output/rust/Cargo.toml)0
-rw-r--r--examples/13-inductive-data-types/output/rust/rust-toolchain.toml (renamed from examples/13-inductive-data-types-separate-namespaces/output/rust/rust-toolchain.toml)0
-rw-r--r--examples/13-inductive-data-types/output/rust/src/arithmetic.rs (renamed from examples/12-inductive-data-types/output/rust/src/arithmetic.rs)0
-rw-r--r--examples/13-inductive-data-types/output/rust/src/lib.rs (renamed from examples/12-inductive-data-types/output/rust/src/lib.rs)0
-rw-r--r--examples/13-inductive-data-types/output/typescript/.gitignore (renamed from examples/14-struct-generic/output/typescript/.gitignore)0
l---------examples/13-inductive-data-types/output/typescript/package.json (renamed from examples/14-struct-generic/output/typescript/package.json)0
-rw-r--r--examples/13-inductive-data-types/output/typescript/pnpm-lock.yaml (renamed from examples/12-inductive-data-types/output/typescript/pnpm-lock.yaml)0
-rw-r--r--examples/13-inductive-data-types/output/typescript/src/arithmetic.test.ts (renamed from examples/12-inductive-data-types/output/typescript/src/arithmetic.test.ts)0
-rw-r--r--examples/13-inductive-data-types/output/typescript/src/arithmetic.ts (renamed from examples/12-inductive-data-types/output/typescript/src/arithmetic.ts)0
-rw-r--r--examples/13-inductive-data-types/output/typescript/src/index.ts (renamed from examples/12-inductive-data-types/output/typescript/src/index.ts)0
l---------examples/13-inductive-data-types/output/typescript/tsconfig.json (renamed from examples/14-struct-generic/output/typescript/tsconfig.json)0
-rw-r--r--examples/13-inductive-data-types/src/arithmetic.hob (renamed from examples/12-inductive-data-types/src/arithmetic.hob)0
-rw-r--r--examples/14-inductive-data-types-separate-namespaces/hobgoblin.json5 (renamed from examples/13-inductive-data-types-separate-namespaces/hobgoblin.json5)0
-rw-r--r--examples/14-inductive-data-types-separate-namespaces/output/java/.gitignore (renamed from examples/14-struct-generic/output/java/.gitignore)0
l---------examples/14-inductive-data-types-separate-namespaces/output/java/pom.xml (renamed from examples/14-struct-generic/output/java/pom.xml)0
-rw-r--r--examples/14-inductive-data-types-separate-namespaces/output/java/src/test/java/org/zwobble/example/DataTests.java (renamed from examples/13-inductive-data-types-separate-namespaces/output/java/src/test/java/org/zwobble/example/DataTests.java)0
-rw-r--r--examples/14-inductive-data-types-separate-namespaces/output/rust/.gitignore (renamed from examples/14-struct-generic/output/rust/.gitignore)0
-rw-r--r--examples/14-inductive-data-types-separate-namespaces/output/rust/Cargo.lock (renamed from examples/14-struct-generic/output/rust/Cargo.lock)0
-rw-r--r--examples/14-inductive-data-types-separate-namespaces/output/rust/Cargo.toml (renamed from examples/14-struct-generic/output/rust/Cargo.toml)0
-rw-r--r--examples/14-inductive-data-types-separate-namespaces/output/rust/rust-toolchain.toml (renamed from examples/14-struct-generic/output/rust/rust-toolchain.toml)0
-rw-r--r--examples/14-inductive-data-types-separate-namespaces/output/rust/src/data/a.rs (renamed from examples/13-inductive-data-types-separate-namespaces/output/rust/src/data/a.rs)0
-rw-r--r--examples/14-inductive-data-types-separate-namespaces/output/rust/src/data/b.rs (renamed from examples/13-inductive-data-types-separate-namespaces/output/rust/src/data/b.rs)0
-rw-r--r--examples/14-inductive-data-types-separate-namespaces/output/rust/src/data/mod.rs (renamed from examples/13-inductive-data-types-separate-namespaces/output/rust/src/data/mod.rs)0
-rw-r--r--examples/14-inductive-data-types-separate-namespaces/output/rust/src/lib.rs (renamed from examples/13-inductive-data-types-separate-namespaces/output/rust/src/lib.rs)0
-rw-r--r--examples/14-inductive-data-types-separate-namespaces/src/data/a.hob (renamed from examples/13-inductive-data-types-separate-namespaces/src/data/a.hob)0
-rw-r--r--examples/14-inductive-data-types-separate-namespaces/src/data/b.hob (renamed from examples/13-inductive-data-types-separate-namespaces/src/data/b.hob)0
-rw-r--r--examples/15-struct-generic/hobgoblin.json5 (renamed from examples/14-struct-generic/hobgoblin.json5)0
-rw-r--r--examples/15-struct-generic/output/java/.gitignore (renamed from examples/15-native-type-generic/output/java/.gitignore)0
l---------examples/15-struct-generic/output/java/pom.xml (renamed from examples/15-native-type-generic/output/java/pom.xml)0
-rw-r--r--examples/15-struct-generic/output/java/src/test/java/org/zwobble/example/PointTests.java (renamed from examples/14-struct-generic/output/java/src/test/java/org/zwobble/example/PointTests.java)0
-rw-r--r--examples/15-struct-generic/output/rust/.gitignore (renamed from examples/15-native-type-generic/output/rust/.gitignore)0
-rw-r--r--examples/15-struct-generic/output/rust/Cargo.lock (renamed from examples/15-native-type-generic/output/rust/Cargo.lock)0
-rw-r--r--examples/15-struct-generic/output/rust/Cargo.toml (renamed from examples/15-native-type-generic/output/rust/Cargo.toml)0
-rw-r--r--examples/15-struct-generic/output/rust/rust-toolchain.toml (renamed from examples/15-native-type-generic/output/rust/rust-toolchain.toml)0
-rw-r--r--examples/15-struct-generic/output/rust/src/lib.rs (renamed from examples/14-struct-generic/output/rust/src/lib.rs)0
-rw-r--r--examples/15-struct-generic/output/rust/src/point.rs (renamed from examples/14-struct-generic/output/rust/src/point.rs)0
-rw-r--r--examples/15-struct-generic/output/typescript/.gitignore (renamed from examples/15-native-type-generic/output/typescript/.gitignore)0
l---------examples/15-struct-generic/output/typescript/package.json (renamed from examples/15-native-type-generic/output/typescript/package.json)0
-rw-r--r--examples/15-struct-generic/output/typescript/pnpm-lock.yaml (renamed from examples/14-struct-generic/output/typescript/pnpm-lock.yaml)0
-rw-r--r--examples/15-struct-generic/output/typescript/src/point.test.ts (renamed from examples/14-struct-generic/output/typescript/src/point.test.ts)0
-rw-r--r--examples/15-struct-generic/output/typescript/src/point.ts (renamed from examples/14-struct-generic/output/typescript/src/point.ts)0
l---------examples/15-struct-generic/output/typescript/tsconfig.json (renamed from examples/15-native-type-generic/output/typescript/tsconfig.json)0
-rw-r--r--examples/15-struct-generic/src/point.hob (renamed from examples/14-struct-generic/src/point.hob)0
-rw-r--r--examples/16-native-type-generic/hobgoblin.json5 (renamed from examples/15-native-type-generic/hobgoblin.json5)0
-rw-r--r--examples/16-native-type-generic/output/java/.gitignore2
l---------examples/16-native-type-generic/output/java/pom.xml (renamed from examples/16-transient-0/output/java/pom.xml)0
-rw-r--r--examples/16-native-type-generic/output/java/src/main/java/org/zwobble/example/types/map/HobgoblinNativeMap.java (renamed from examples/15-native-type-generic/output/java/src/main/java/org/zwobble/example/types/map/HobgoblinNativeMap.java)0
-rw-r--r--examples/16-native-type-generic/output/java/src/test/java/org/zwobble/example/MapTests.java (renamed from examples/15-native-type-generic/output/java/src/test/java/org/zwobble/example/MapTests.java)0
-rw-r--r--examples/16-native-type-generic/output/rust/.gitignore1
-rw-r--r--examples/16-native-type-generic/output/rust/Cargo.lock (renamed from examples/16-transient-0/output/rust/Cargo.lock)0
-rw-r--r--examples/16-native-type-generic/output/rust/Cargo.toml (renamed from examples/16-transient-0/output/rust/Cargo.toml)0
-rw-r--r--examples/16-native-type-generic/output/rust/rust-toolchain.toml (renamed from examples/16-transient-0/output/rust/rust-toolchain.toml)0
-rw-r--r--examples/16-native-type-generic/output/rust/src/gen/map.rs (renamed from examples/15-native-type-generic/output/rust/src/gen/map.rs)0
-rw-r--r--examples/16-native-type-generic/output/rust/src/lib.rs (renamed from examples/15-native-type-generic/output/rust/src/lib.rs)0
-rw-r--r--examples/16-native-type-generic/output/rust/src/map.rs (renamed from examples/15-native-type-generic/output/rust/src/map.rs)0
-rw-r--r--examples/16-native-type-generic/output/typescript/.gitignore1
l---------examples/16-native-type-generic/output/typescript/package.json1
-rw-r--r--examples/16-native-type-generic/output/typescript/pnpm-lock.yaml (renamed from examples/15-native-type-generic/output/typescript/pnpm-lock.yaml)0
-rw-r--r--examples/16-native-type-generic/output/typescript/src/map.test.ts (renamed from examples/15-native-type-generic/output/typescript/src/map.test.ts)0
-rw-r--r--examples/16-native-type-generic/output/typescript/src/map.ts (renamed from examples/15-native-type-generic/output/typescript/src/map.ts)0
l---------examples/16-native-type-generic/output/typescript/tsconfig.json1
-rw-r--r--examples/16-native-type-generic/src/map.hob (renamed from examples/15-native-type-generic/src/map.hob)0
-rw-r--r--examples/17-transient-0/hobgoblin.json5 (renamed from examples/16-transient-0/hobgoblin.json5)0
-rw-r--r--examples/17-transient-0/output/java/.gitignore (renamed from examples/16-transient-0/output/java/.gitignore)0
l---------examples/17-transient-0/output/java/pom.xml1
-rw-r--r--examples/17-transient-0/output/java/src/main/java/org/zwobble/example/types/data/GenericNative.java (renamed from examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/data/GenericNative.java)0
-rw-r--r--examples/17-transient-0/output/java/src/main/java/org/zwobble/example/types/data/HobgoblinNativeData.java (renamed from examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/data/HobgoblinNativeData.java)0
-rw-r--r--examples/17-transient-0/output/java/src/main/java/org/zwobble/example/types/data/Native.java (renamed from examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/data/Native.java)0
-rw-r--r--examples/17-transient-0/output/java/src/main/java/org/zwobble/example/types/data/transient0/HobgoblinTransient0Data.java (renamed from examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/data/transient0/HobgoblinTransient0Data.java)0
-rw-r--r--examples/17-transient-0/output/java/src/main/java/org/zwobble/example/types/transient0/Decoder.java (renamed from examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/transient0/Decoder.java)0
-rw-r--r--examples/17-transient-0/output/java/src/main/java/org/zwobble/example/types/transient0/Encoder.java (renamed from examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/transient0/Encoder.java)0
-rw-r--r--examples/17-transient-0/output/java/src/main/java/org/zwobble/example/types/transient0/HobgoblinTransient0Builtins.java (renamed from examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/transient0/HobgoblinTransient0Builtins.java)0
-rw-r--r--examples/17-transient-0/output/java/src/main/java/org/zwobble/example/types/transient0/HobgoblinTransient0TaggedSharedValue.java (renamed from examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/transient0/HobgoblinTransient0TaggedSharedValue.java)0
-rw-r--r--examples/17-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java (renamed from examples/16-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java)0
-rw-r--r--examples/17-transient-0/output/rust/.gitignore (renamed from examples/16-transient-0/output/rust/.gitignore)0
-rw-r--r--examples/17-transient-0/output/rust/Cargo.lock7
-rw-r--r--examples/17-transient-0/output/rust/Cargo.toml6
-rw-r--r--examples/17-transient-0/output/rust/rust-toolchain.toml2
-rw-r--r--examples/17-transient-0/output/rust/src/data.rs (renamed from examples/16-transient-0/output/rust/src/data.rs)0
-rw-r--r--examples/17-transient-0/output/rust/src/gen/data.rs (renamed from examples/16-transient-0/output/rust/src/gen/data.rs)0
-rw-r--r--examples/17-transient-0/output/rust/src/gen/data/transient_0.rs (renamed from examples/16-transient-0/output/rust/src/gen/data/transient_0.rs)0
-rw-r--r--examples/17-transient-0/output/rust/src/gen/transient_0.rs (renamed from examples/16-transient-0/output/rust/src/gen/transient_0.rs)0
-rw-r--r--examples/17-transient-0/output/rust/src/lib.rs (renamed from examples/16-transient-0/output/rust/src/lib.rs)0
-rw-r--r--examples/17-transient-0/output/rust/src/transient_0.rs (renamed from examples/16-transient-0/output/rust/src/transient_0.rs)0
-rw-r--r--examples/17-transient-0/src/data.hob (renamed from examples/16-transient-0/src/data.hob)0
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptGenerator.java11
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/typescript/TypescriptTypes.java2
148 files changed, 1011 insertions, 0 deletions
diff --git a/examples/12-inductive-data-types/hobgoblin.json5 b/examples/10-option/hobgoblin.json5
index eac8d4a..eac8d4a 100644
--- a/examples/12-inductive-data-types/hobgoblin.json5
+++ b/examples/10-option/hobgoblin.json5
diff --git a/examples/10-shared/output/java/.gitignore b/examples/10-option/output/java/.gitignore
index ff511d4..ff511d4 100644
--- a/examples/10-shared/output/java/.gitignore
+++ b/examples/10-option/output/java/.gitignore
diff --git a/examples/10-shared/output/java/pom.xml b/examples/10-option/output/java/pom.xml
index 445fa65..445fa65 120000
--- a/examples/10-shared/output/java/pom.xml
+++ b/examples/10-option/output/java/pom.xml
diff --git a/examples/10-option/output/java/src/test/java/org/zwobble/example/PointTests.java b/examples/10-option/output/java/src/test/java/org/zwobble/example/PointTests.java
new file mode 100644
index 0000000..b1f0ccb
--- /dev/null
+++ b/examples/10-option/output/java/src/test/java/org/zwobble/example/PointTests.java
@@ -0,0 +1,32 @@
+package org.zwobble.example;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import org.junit.jupiter.api.Test;
+import java.util.List;
+import java.util.Optional;
+import org.zwobble.example.types.point.Line;
+import org.zwobble.example.types.point.Point;
+
+public class PointTests {
+ @Test
+ public void canCreateLineWithConstructor() {
+ var line = new Line(
+ Optional.of(new Point(10, 25)),
+ Optional.of(42)
+ );
+
+ assertEquals(line.start().get().x(), 10);
+ assertEquals(line.length().get(), 42);
+ }
+
+ @Test
+ public void canCreateLineWithBuilder() {
+ var line = Line.arbitrary()
+ .withStart(new Point(10, 25))
+ .withLength(42)
+ .build();
+
+ assertEquals(line.start().get().x(), 10);
+ assertEquals(line.length().get(), 42);
+ }
+}
diff --git a/examples/10-shared/output/rust/.gitignore b/examples/10-option/output/rust/.gitignore
index ea8c4bf..ea8c4bf 100644
--- a/examples/10-shared/output/rust/.gitignore
+++ b/examples/10-option/output/rust/.gitignore
diff --git a/examples/10-shared/output/rust/Cargo.lock b/examples/10-option/output/rust/Cargo.lock
index 9dc6e3e..9dc6e3e 100644
--- a/examples/10-shared/output/rust/Cargo.lock
+++ b/examples/10-option/output/rust/Cargo.lock
diff --git a/examples/10-shared/output/rust/Cargo.toml b/examples/10-option/output/rust/Cargo.toml
index 5d4c622..5d4c622 100644
--- a/examples/10-shared/output/rust/Cargo.toml
+++ b/examples/10-option/output/rust/Cargo.toml
diff --git a/examples/10-shared/output/rust/rust-toolchain.toml b/examples/10-option/output/rust/rust-toolchain.toml
index 4fedb95..4fedb95 100644
--- a/examples/10-shared/output/rust/rust-toolchain.toml
+++ b/examples/10-option/output/rust/rust-toolchain.toml
diff --git a/examples/10-option/output/rust/src/lib.rs b/examples/10-option/output/rust/src/lib.rs
new file mode 100644
index 0000000..7a41573
--- /dev/null
+++ b/examples/10-option/output/rust/src/lib.rs
@@ -0,0 +1,14 @@
+mod point;
+
+#[cfg(test)]
+mod test {
+ use super::point::{Line, Point};
+
+ #[test]
+ fn can_create_line_directly() {
+ let line = Line {
+ start: Some(Point { x: 10, y: 25 }),
+ length: Some(42),
+ };
+ }
+}
diff --git a/examples/10-option/output/rust/src/point.rs b/examples/10-option/output/rust/src/point.rs
new file mode 100644
index 0000000..7f481f8
--- /dev/null
+++ b/examples/10-option/output/rust/src/point.rs
@@ -0,0 +1,13 @@
+// Generated by hobgoblin.
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct Line {
+ pub start: ::std::option::Option::<crate::point::Point>,
+ pub length: ::std::option::Option::<::core::primitive::i32>,
+}
+
+#[derive(Clone, Debug, PartialEq)]
+pub struct Point {
+ pub x: ::core::primitive::i32,
+ pub y: ::core::primitive::i32,
+}
diff --git a/examples/10-shared/output/typescript/.gitignore b/examples/10-option/output/typescript/.gitignore
index 07e6e47..07e6e47 100644
--- a/examples/10-shared/output/typescript/.gitignore
+++ b/examples/10-option/output/typescript/.gitignore
diff --git a/examples/10-shared/output/typescript/package.json b/examples/10-option/output/typescript/package.json
index 0bc7349..0bc7349 120000
--- a/examples/10-shared/output/typescript/package.json
+++ b/examples/10-option/output/typescript/package.json
diff --git a/examples/10-option/output/typescript/pnpm-lock.yaml b/examples/10-option/output/typescript/pnpm-lock.yaml
new file mode 100644
index 0000000..f5404e5
--- /dev/null
+++ b/examples/10-option/output/typescript/pnpm-lock.yaml
@@ -0,0 +1,834 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ devDependencies:
+ '@types/mocha':
+ specifier: ^10.0.10
+ version: 10.0.10
+ '@types/node':
+ specifier: ^26.4.0
+ version: 26.6.2
+ mocha:
+ specifier: ^11.8.0
+ version: 11.8.0
+ typescript:
+ specifier: ^7.0.2
+ version: 7.0.2
+
+packages:
+
+ '@isaacs/cliui@8.0.2':
+ resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+ engines: {node: '>=12'}
+
+ '@pkgjs/parseargs@0.11.0':
+ resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+ engines: {node: '>=14'}
+
+ '@types/mocha@10.0.10':
+ resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==}
+
+ '@types/node@26.6.2':
+ resolution: {integrity: sha512-X1P21scMv4zGKLYqjdGjaKa7COa0RKVYYZZN/NfvLQ1JegxFhdhpZG/Lyn8AXx6CDUavKAd11v6BvfpkDByK8g==}
+
+ '@typescript/typescript-aix-ppc64@7.0.2':
+ resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==}
+ engines: {node: '>=16.20.0'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@typescript/typescript-darwin-arm64@7.0.2':
+ resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==}
+ engines: {node: '>=16.20.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@typescript/typescript-darwin-x64@7.0.2':
+ resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==}
+ engines: {node: '>=16.20.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@typescript/typescript-freebsd-arm64@7.0.2':
+ resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==}
+ engines: {node: '>=16.20.0'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@typescript/typescript-freebsd-x64@7.0.2':
+ resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==}
+ engines: {node: '>=16.20.0'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@typescript/typescript-linux-arm64@7.0.2':
+ resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==}
+ engines: {node: '>=16.20.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@typescript/typescript-linux-arm@7.0.2':
+ resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==}
+ engines: {node: '>=16.20.0'}
+ cpu: [arm]
+ os: [linux]
+
+ '@typescript/typescript-linux-loong64@7.0.2':
+ resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==}
+ engines: {node: '>=16.20.0'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@typescript/typescript-linux-mips64el@7.0.2':
+ resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==}
+ engines: {node: '>=16.20.0'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@typescript/typescript-linux-ppc64@7.0.2':
+ resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==}
+ engines: {node: '>=16.20.0'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@typescript/typescript-linux-riscv64@7.0.2':
+ resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==}
+ engines: {node: '>=16.20.0'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@typescript/typescript-linux-s390x@7.0.2':
+ resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==}
+ engines: {node: '>=16.20.0'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@typescript/typescript-linux-x64@7.0.2':
+ resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==}
+ engines: {node: '>=16.20.0'}
+ cpu: [x64]
+ os: [linux]
+
+ '@typescript/typescript-netbsd-arm64@7.0.2':
+ resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==}
+ engines: {node: '>=16.20.0'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@typescript/typescript-netbsd-x64@7.0.2':
+ resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==}
+ engines: {node: '>=16.20.0'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@typescript/typescript-openbsd-arm64@7.0.2':
+ resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==}
+ engines: {node: '>=16.20.0'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@typescript/typescript-openbsd-x64@7.0.2':
+ resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==}
+ engines: {node: '>=16.20.0'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@typescript/typescript-sunos-x64@7.0.2':
+ resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==}
+ engines: {node: '>=16.20.0'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@typescript/typescript-win32-arm64@7.0.2':
+ resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==}
+ engines: {node: '>=16.20.0'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@typescript/typescript-win32-x64@7.0.2':
+ resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==}
+ engines: {node: '>=16.20.0'}
+ cpu: [x64]
+ os: [win32]
+
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ ansi-regex@6.3.0:
+ resolution: {integrity: sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==}
+ engines: {node: '>=12'}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ ansi-styles@6.2.3:
+ resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
+ engines: {node: '>=12'}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ brace-expansion@2.1.7:
+ resolution: {integrity: sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==}
+
+ browser-stdout@1.3.1:
+ resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==}
+
+ camelcase@6.3.0:
+ resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+ engines: {node: '>=10'}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ chokidar@4.0.3:
+ resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
+ engines: {node: '>= 14.16.0'}
+
+ cliui@8.0.1:
+ resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+ engines: {node: '>=12'}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
+
+ debug@4.4.3:
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ decamelize@4.0.0:
+ resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==}
+ engines: {node: '>=10'}
+
+ diff@7.0.0:
+ resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==}
+ engines: {node: '>=0.3.1'}
+
+ eastasianwidth@0.2.0:
+ resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ emoji-regex@9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+
+ flat@5.0.2:
+ resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==}
+ hasBin: true
+
+ foreground-child@3.3.1:
+ resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
+ engines: {node: '>=14'}
+
+ get-caller-file@2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+
+ glob@10.5.0:
+ resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==}
+ deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
+ hasBin: true
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ he@1.2.0:
+ resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+ hasBin: true
+
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ is-path-inside@3.0.3:
+ resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
+ engines: {node: '>=8'}
+
+ is-plain-obj@2.1.0:
+ resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==}
+ engines: {node: '>=8'}
+
+ is-unicode-supported@0.1.0:
+ resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+ engines: {node: '>=10'}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ jackspeak@3.4.3:
+ resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
+
+ js-yaml@4.3.2:
+ resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==}
+ hasBin: true
+
+ locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+
+ log-symbols@4.1.0:
+ resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
+ engines: {node: '>=10'}
+
+ lru-cache@10.4.3:
+ resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
+
+ minimatch@9.0.9:
+ resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minipass@7.1.3:
+ resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ mocha@11.8.0:
+ resolution: {integrity: sha512-VyCeUdGN3A9lmCTTgG4yuvY9ixxaDk+xt2R/7/+1AP6EqNG+G9OKkzBwhVtVYoNX8YsxNSgAl8mOv3IAeOpFbw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ hasBin: true
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+
+ p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+
+ package-json-from-dist@1.0.1:
+ resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
+
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-scurry@1.11.1:
+ resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
+ engines: {node: '>=16 || 14 >=14.18'}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ randombytes@2.1.0:
+ resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
+
+ readdirp@4.1.2:
+ resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
+ engines: {node: '>= 14.18.0'}
+
+ require-directory@2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ serialize-javascript@6.0.2:
+ resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ signal-exit@4.1.0:
+ resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+ engines: {node: '>=14'}
+
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+
+ string-width@5.1.2:
+ resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+ engines: {node: '>=12'}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
+ strip-ansi@7.2.0:
+ resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==}
+ engines: {node: '>=12'}
+
+ strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ supports-color@8.1.1:
+ resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+ engines: {node: '>=10'}
+
+ typescript@7.0.2:
+ resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==}
+ engines: {node: '>=16.20.0'}
+ hasBin: true
+
+ undici-types@8.9.0:
+ resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==}
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ workerpool@9.3.4:
+ resolution: {integrity: sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==}
+
+ wrap-ansi@7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+
+ wrap-ansi@8.1.0:
+ resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+ engines: {node: '>=12'}
+
+ y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+
+ yargs-parser@21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+
+ yargs-unparser@2.0.0:
+ resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==}
+ engines: {node: '>=10'}
+
+ yargs@17.7.3:
+ resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==}
+ engines: {node: '>=12'}
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+snapshots:
+
+ '@isaacs/cliui@8.0.2':
+ dependencies:
+ string-width: 5.1.2
+ string-width-cjs: string-width@4.2.3
+ strip-ansi: 7.2.0
+ strip-ansi-cjs: strip-ansi@6.0.1
+ wrap-ansi: 8.1.0
+ wrap-ansi-cjs: wrap-ansi@7.0.0
+
+ '@pkgjs/parseargs@0.11.0':
+ optional: true
+
+ '@types/mocha@10.0.10': {}
+
+ '@types/node@26.6.2':
+ dependencies:
+ undici-types: 8.9.0
+
+ '@typescript/typescript-aix-ppc64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-darwin-arm64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-darwin-x64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-freebsd-arm64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-freebsd-x64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-linux-arm64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-linux-arm@7.0.2':
+ optional: true
+
+ '@typescript/typescript-linux-loong64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-linux-mips64el@7.0.2':
+ optional: true
+
+ '@typescript/typescript-linux-ppc64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-linux-riscv64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-linux-s390x@7.0.2':
+ optional: true
+
+ '@typescript/typescript-linux-x64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-netbsd-arm64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-netbsd-x64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-openbsd-arm64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-openbsd-x64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-sunos-x64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-win32-arm64@7.0.2':
+ optional: true
+
+ '@typescript/typescript-win32-x64@7.0.2':
+ optional: true
+
+ ansi-regex@5.0.1: {}
+
+ ansi-regex@6.3.0: {}
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ ansi-styles@6.2.3: {}
+
+ argparse@2.0.1: {}
+
+ balanced-match@1.0.2: {}
+
+ brace-expansion@2.1.7:
+ dependencies:
+ balanced-match: 1.0.2
+
+ browser-stdout@1.3.1: {}
+
+ camelcase@6.3.0: {}
+
+ chalk@4.1.2:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ chokidar@4.0.3:
+ dependencies:
+ readdirp: 4.1.2
+
+ cliui@8.0.1:
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.4: {}
+
+ cross-spawn@7.0.6:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ debug@4.4.3(supports-color@8.1.1):
+ dependencies:
+ ms: 2.1.3
+ optionalDependencies:
+ supports-color: 8.1.1
+
+ decamelize@4.0.0: {}
+
+ diff@7.0.0: {}
+
+ eastasianwidth@0.2.0: {}
+
+ emoji-regex@8.0.0: {}
+
+ emoji-regex@9.2.2: {}
+
+ escalade@3.2.0: {}
+
+ escape-string-regexp@4.0.0: {}
+
+ find-up@5.0.0:
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+
+ flat@5.0.2: {}
+
+ foreground-child@3.3.1:
+ dependencies:
+ cross-spawn: 7.0.6
+ signal-exit: 4.1.0
+
+ get-caller-file@2.0.5: {}
+
+ glob@10.5.0:
+ dependencies:
+ foreground-child: 3.3.1
+ jackspeak: 3.4.3
+ minimatch: 9.0.9
+ minipass: 7.1.3
+ package-json-from-dist: 1.0.1
+ path-scurry: 1.11.1
+
+ has-flag@4.0.0: {}
+
+ he@1.2.0: {}
+
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-path-inside@3.0.3: {}
+
+ is-plain-obj@2.1.0: {}
+
+ is-unicode-supported@0.1.0: {}
+
+ isexe@2.0.0: {}
+
+ jackspeak@3.4.3:
+ dependencies:
+ '@isaacs/cliui': 8.0.2
+ optionalDependencies:
+ '@pkgjs/parseargs': 0.11.0
+
+ js-yaml@4.3.2:
+ dependencies:
+ argparse: 2.0.1
+
+ locate-path@6.0.0:
+ dependencies:
+ p-locate: 5.0.0
+
+ log-symbols@4.1.0:
+ dependencies:
+ chalk: 4.1.2
+ is-unicode-supported: 0.1.0
+
+ lru-cache@10.4.3: {}
+
+ minimatch@9.0.9:
+ dependencies:
+ brace-expansion: 2.1.7
+
+ minipass@7.1.3: {}
+
+ mocha@11.8.0:
+ dependencies:
+ browser-stdout: 1.3.1
+ chokidar: 4.0.3
+ debug: 4.4.3(supports-color@8.1.1)
+ diff: 7.0.0
+ escape-string-regexp: 4.0.0
+ find-up: 5.0.0
+ glob: 10.5.0
+ he: 1.2.0
+ is-path-inside: 3.0.3
+ js-yaml: 4.3.2
+ log-symbols: 4.1.0
+ minimatch: 9.0.9
+ ms: 2.1.3
+ picocolors: 1.1.1
+ serialize-javascript: 6.0.2
+ strip-json-comments: 3.1.1
+ supports-color: 8.1.1
+ workerpool: 9.3.4
+ yargs: 17.7.3
+ yargs-parser: 21.1.1
+ yargs-unparser: 2.0.0
+
+ ms@2.1.3: {}
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+
+ p-locate@5.0.0:
+ dependencies:
+ p-limit: 3.1.0
+
+ package-json-from-dist@1.0.1: {}
+
+ path-exists@4.0.0: {}
+
+ path-key@3.1.1: {}
+
+ path-scurry@1.11.1:
+ dependencies:
+ lru-cache: 10.4.3
+ minipass: 7.1.3
+
+ picocolors@1.1.1: {}
+
+ randombytes@2.1.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ readdirp@4.1.2: {}
+
+ require-directory@2.1.1: {}
+
+ safe-buffer@5.2.1: {}
+
+ serialize-javascript@6.0.2:
+ dependencies:
+ randombytes: 2.1.0
+
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ signal-exit@4.1.0: {}
+
+ string-width@4.2.3:
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
+ string-width@5.1.2:
+ dependencies:
+ eastasianwidth: 0.2.0
+ emoji-regex: 9.2.2
+ strip-ansi: 7.2.0
+
+ strip-ansi@6.0.1:
+ dependencies:
+ ansi-regex: 5.0.1
+
+ strip-ansi@7.2.0:
+ dependencies:
+ ansi-regex: 6.3.0
+
+ strip-json-comments@3.1.1: {}
+
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
+ supports-color@8.1.1:
+ dependencies:
+ has-flag: 4.0.0
+
+ typescript@7.0.2:
+ optionalDependencies:
+ '@typescript/typescript-aix-ppc64': 7.0.2
+ '@typescript/typescript-darwin-arm64': 7.0.2
+ '@typescript/typescript-darwin-x64': 7.0.2
+ '@typescript/typescript-freebsd-arm64': 7.0.2
+ '@typescript/typescript-freebsd-x64': 7.0.2
+ '@typescript/typescript-linux-arm': 7.0.2
+ '@typescript/typescript-linux-arm64': 7.0.2
+ '@typescript/typescript-linux-loong64': 7.0.2
+ '@typescript/typescript-linux-mips64el': 7.0.2
+ '@typescript/typescript-linux-ppc64': 7.0.2
+ '@typescript/typescript-linux-riscv64': 7.0.2
+ '@typescript/typescript-linux-s390x': 7.0.2
+ '@typescript/typescript-linux-x64': 7.0.2
+ '@typescript/typescript-netbsd-arm64': 7.0.2
+ '@typescript/typescript-netbsd-x64': 7.0.2
+ '@typescript/typescript-openbsd-arm64': 7.0.2
+ '@typescript/typescript-openbsd-x64': 7.0.2
+ '@typescript/typescript-sunos-x64': 7.0.2
+ '@typescript/typescript-win32-arm64': 7.0.2
+ '@typescript/typescript-win32-x64': 7.0.2
+
+ undici-types@8.9.0: {}
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ workerpool@9.3.4: {}
+
+ wrap-ansi@7.0.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ wrap-ansi@8.1.0:
+ dependencies:
+ ansi-styles: 6.2.3
+ string-width: 5.1.2
+ strip-ansi: 7.2.0
+
+ y18n@5.0.8: {}
+
+ yargs-parser@21.1.1: {}
+
+ yargs-unparser@2.0.0:
+ dependencies:
+ camelcase: 6.3.0
+ decamelize: 4.0.0
+ flat: 5.0.2
+ is-plain-obj: 2.1.0
+
+ yargs@17.7.3:
+ dependencies:
+ cliui: 8.0.1
+ escalade: 3.2.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 21.1.1
+
+ yocto-queue@0.1.0: {}
diff --git a/examples/10-option/output/typescript/src/point.test.ts b/examples/10-option/output/typescript/src/point.test.ts
new file mode 100644
index 0000000..3a39407
--- /dev/null
+++ b/examples/10-option/output/typescript/src/point.test.ts
@@ -0,0 +1,12 @@
+import * as assert from "node:assert";
+
+import {test} from "mocha";
+
+import {Line, Point} from "./point.ts";
+
+test("can create line with constructor", () => {
+ const line = new Line(new Point(10, 25), 42);
+
+ assert.strictEqual(line.start!.x, 10);
+ assert.strictEqual(line.length, 42);
+});
diff --git a/examples/10-option/output/typescript/src/point.ts b/examples/10-option/output/typescript/src/point.ts
new file mode 100644
index 0000000..a6c6135
--- /dev/null
+++ b/examples/10-option/output/typescript/src/point.ts
@@ -0,0 +1,39 @@
+// Generated by hobgoblin.
+
+// Custom area start: imports
+// Custom area end: imports
+
+class Line {
+ public readonly start: Point | null;
+
+ public readonly length: number | null;
+
+ public constructor(start: Point | null, length: number | null) {
+ this.start = start;
+ this.length = length;
+ }
+
+ // Custom area start: Line, body
+ // Custom area end: Line, body
+}
+
+export {Line};
+
+class Point {
+ public readonly x: number;
+
+ public readonly y: number;
+
+ public constructor(x: number, y: number) {
+ this.x = x;
+ this.y = y;
+ }
+
+ // Custom area start: Point, body
+ // Custom area end: Point, body
+}
+
+export {Point};
+
+// Custom area start: body
+// Custom area end: body
diff --git a/examples/10-shared/output/typescript/tsconfig.json b/examples/10-option/output/typescript/tsconfig.json
index 3c7cb2a..3c7cb2a 120000
--- a/examples/10-shared/output/typescript/tsconfig.json
+++ b/examples/10-option/output/typescript/tsconfig.json
diff --git a/examples/10-option/src/point.hob b/examples/10-option/src/point.hob
new file mode 100644
index 0000000..c144d2e
--- /dev/null
+++ b/examples/10-option/src/point.hob
@@ -0,0 +1,9 @@
+struct Line {
+ field start: Option[Point];
+ field length: Option[Int32];
+}
+
+struct Point {
+ field x: Int32;
+ field y: Int32;
+}
diff --git a/examples/10-shared/hobgoblin.json5 b/examples/11-shared/hobgoblin.json5
index 19e0f93..19e0f93 100644
--- a/examples/10-shared/hobgoblin.json5
+++ b/examples/11-shared/hobgoblin.json5
diff --git a/examples/11-imports/output/java/.gitignore b/examples/11-shared/output/java/.gitignore
index ff511d4..ff511d4 100644
--- a/examples/11-imports/output/java/.gitignore
+++ b/examples/11-shared/output/java/.gitignore
diff --git a/examples/11-imports/output/java/pom.xml b/examples/11-shared/output/java/pom.xml
index 445fa65..445fa65 120000
--- a/examples/11-imports/output/java/pom.xml
+++ b/examples/11-shared/output/java/pom.xml
diff --git a/examples/10-shared/output/java/src/test/java/org/zwobble/example/PointTests.java b/examples/11-shared/output/java/src/test/java/org/zwobble/example/PointTests.java
index b4c140d..b4c140d 100644
--- a/examples/10-shared/output/java/src/test/java/org/zwobble/example/PointTests.java
+++ b/examples/11-shared/output/java/src/test/java/org/zwobble/example/PointTests.java
diff --git a/examples/11-imports/output/rust/.gitignore b/examples/11-shared/output/rust/.gitignore
index ea8c4bf..ea8c4bf 100644
--- a/examples/11-imports/output/rust/.gitignore
+++ b/examples/11-shared/output/rust/.gitignore
diff --git a/examples/11-imports/output/rust/Cargo.lock b/examples/11-shared/output/rust/Cargo.lock
index 9dc6e3e..9dc6e3e 100644
--- a/examples/11-imports/output/rust/Cargo.lock
+++ b/examples/11-shared/output/rust/Cargo.lock
diff --git a/examples/11-imports/output/rust/Cargo.toml b/examples/11-shared/output/rust/Cargo.toml
index 5d4c622..5d4c622 100644
--- a/examples/11-imports/output/rust/Cargo.toml
+++ b/examples/11-shared/output/rust/Cargo.toml
diff --git a/examples/11-imports/output/rust/rust-toolchain.toml b/examples/11-shared/output/rust/rust-toolchain.toml
index 4fedb95..4fedb95 100644
--- a/examples/11-imports/output/rust/rust-toolchain.toml
+++ b/examples/11-shared/output/rust/rust-toolchain.toml
diff --git a/examples/10-shared/output/rust/src/lib.rs b/examples/11-shared/output/rust/src/lib.rs
index af2c87f..af2c87f 100644
--- a/examples/10-shared/output/rust/src/lib.rs
+++ b/examples/11-shared/output/rust/src/lib.rs
diff --git a/examples/10-shared/output/rust/src/point.rs b/examples/11-shared/output/rust/src/point.rs
index 82df631..82df631 100644
--- a/examples/10-shared/output/rust/src/point.rs
+++ b/examples/11-shared/output/rust/src/point.rs
diff --git a/examples/11-imports/output/typescript/.gitignore b/examples/11-shared/output/typescript/.gitignore
index 07e6e47..07e6e47 100644
--- a/examples/11-imports/output/typescript/.gitignore
+++ b/examples/11-shared/output/typescript/.gitignore
diff --git a/examples/11-imports/output/typescript/package.json b/examples/11-shared/output/typescript/package.json
index 0bc7349..0bc7349 120000
--- a/examples/11-imports/output/typescript/package.json
+++ b/examples/11-shared/output/typescript/package.json
diff --git a/examples/10-shared/output/typescript/pnpm-lock.yaml b/examples/11-shared/output/typescript/pnpm-lock.yaml
index 016d629..016d629 100644
--- a/examples/10-shared/output/typescript/pnpm-lock.yaml
+++ b/examples/11-shared/output/typescript/pnpm-lock.yaml
diff --git a/examples/10-shared/output/typescript/src/point.test.ts b/examples/11-shared/output/typescript/src/point.test.ts
index 46fc446..46fc446 100644
--- a/examples/10-shared/output/typescript/src/point.test.ts
+++ b/examples/11-shared/output/typescript/src/point.test.ts
diff --git a/examples/10-shared/output/typescript/src/point.ts b/examples/11-shared/output/typescript/src/point.ts
index fccae01..fccae01 100644
--- a/examples/10-shared/output/typescript/src/point.ts
+++ b/examples/11-shared/output/typescript/src/point.ts
diff --git a/examples/11-imports/output/typescript/tsconfig.json b/examples/11-shared/output/typescript/tsconfig.json
index 3c7cb2a..3c7cb2a 120000
--- a/examples/11-imports/output/typescript/tsconfig.json
+++ b/examples/11-shared/output/typescript/tsconfig.json
diff --git a/examples/10-shared/src/point.hob b/examples/11-shared/src/point.hob
index 7b9a8e6..7b9a8e6 100644
--- a/examples/10-shared/src/point.hob
+++ b/examples/11-shared/src/point.hob
diff --git a/examples/11-imports/hobgoblin.json5 b/examples/12-imports/hobgoblin.json5
index d3f8c79..d3f8c79 100644
--- a/examples/11-imports/hobgoblin.json5
+++ b/examples/12-imports/hobgoblin.json5
diff --git a/examples/12-inductive-data-types/output/java/.gitignore b/examples/12-imports/output/java/.gitignore
index ff511d4..ff511d4 100644
--- a/examples/12-inductive-data-types/output/java/.gitignore
+++ b/examples/12-imports/output/java/.gitignore
diff --git a/examples/12-inductive-data-types/output/java/pom.xml b/examples/12-imports/output/java/pom.xml
index 445fa65..445fa65 120000
--- a/examples/12-inductive-data-types/output/java/pom.xml
+++ b/examples/12-imports/output/java/pom.xml
diff --git a/examples/11-imports/output/java/src/test/java/org/zwobble/example/LineTests.java b/examples/12-imports/output/java/src/test/java/org/zwobble/example/LineTests.java
index c376b19..c376b19 100644
--- a/examples/11-imports/output/java/src/test/java/org/zwobble/example/LineTests.java
+++ b/examples/12-imports/output/java/src/test/java/org/zwobble/example/LineTests.java
diff --git a/examples/12-inductive-data-types/output/rust/.gitignore b/examples/12-imports/output/rust/.gitignore
index ea8c4bf..ea8c4bf 100644
--- a/examples/12-inductive-data-types/output/rust/.gitignore
+++ b/examples/12-imports/output/rust/.gitignore
diff --git a/examples/12-inductive-data-types/output/rust/Cargo.lock b/examples/12-imports/output/rust/Cargo.lock
index 9dc6e3e..9dc6e3e 100644
--- a/examples/12-inductive-data-types/output/rust/Cargo.lock
+++ b/examples/12-imports/output/rust/Cargo.lock
diff --git a/examples/12-inductive-data-types/output/rust/Cargo.toml b/examples/12-imports/output/rust/Cargo.toml
index 5d4c622..5d4c622 100644
--- a/examples/12-inductive-data-types/output/rust/Cargo.toml
+++ b/examples/12-imports/output/rust/Cargo.toml
diff --git a/examples/12-inductive-data-types/output/rust/rust-toolchain.toml b/examples/12-imports/output/rust/rust-toolchain.toml
index 4fedb95..4fedb95 100644
--- a/examples/12-inductive-data-types/output/rust/rust-toolchain.toml
+++ b/examples/12-imports/output/rust/rust-toolchain.toml
diff --git a/examples/11-imports/output/rust/src/lib.rs b/examples/12-imports/output/rust/src/lib.rs
index ffbcbf4..ffbcbf4 100644
--- a/examples/11-imports/output/rust/src/lib.rs
+++ b/examples/12-imports/output/rust/src/lib.rs
diff --git a/examples/11-imports/output/rust/src/line.rs b/examples/12-imports/output/rust/src/line.rs
index ec51f56..ec51f56 100644
--- a/examples/11-imports/output/rust/src/line.rs
+++ b/examples/12-imports/output/rust/src/line.rs
diff --git a/examples/11-imports/output/rust/src/point.rs b/examples/12-imports/output/rust/src/point.rs
index 22f5389..22f5389 100644
--- a/examples/11-imports/output/rust/src/point.rs
+++ b/examples/12-imports/output/rust/src/point.rs
diff --git a/examples/12-inductive-data-types/output/typescript/.gitignore b/examples/12-imports/output/typescript/.gitignore
index 07e6e47..07e6e47 100644
--- a/examples/12-inductive-data-types/output/typescript/.gitignore
+++ b/examples/12-imports/output/typescript/.gitignore
diff --git a/examples/12-inductive-data-types/output/typescript/package.json b/examples/12-imports/output/typescript/package.json
index 0bc7349..0bc7349 120000
--- a/examples/12-inductive-data-types/output/typescript/package.json
+++ b/examples/12-imports/output/typescript/package.json
diff --git a/examples/11-imports/output/typescript/pnpm-lock.yaml b/examples/12-imports/output/typescript/pnpm-lock.yaml
index b29cfae..b29cfae 100644
--- a/examples/11-imports/output/typescript/pnpm-lock.yaml
+++ b/examples/12-imports/output/typescript/pnpm-lock.yaml
diff --git a/examples/11-imports/output/typescript/src/line.test.ts b/examples/12-imports/output/typescript/src/line.test.ts
index 9c2fbe6..9c2fbe6 100644
--- a/examples/11-imports/output/typescript/src/line.test.ts
+++ b/examples/12-imports/output/typescript/src/line.test.ts
diff --git a/examples/11-imports/output/typescript/src/line.ts b/examples/12-imports/output/typescript/src/line.ts
index 178e01a..178e01a 100644
--- a/examples/11-imports/output/typescript/src/line.ts
+++ b/examples/12-imports/output/typescript/src/line.ts
diff --git a/examples/11-imports/output/typescript/src/point.ts b/examples/12-imports/output/typescript/src/point.ts
index b051211..b051211 100644
--- a/examples/11-imports/output/typescript/src/point.ts
+++ b/examples/12-imports/output/typescript/src/point.ts
diff --git a/examples/12-inductive-data-types/output/typescript/tsconfig.json b/examples/12-imports/output/typescript/tsconfig.json
index 3c7cb2a..3c7cb2a 120000
--- a/examples/12-inductive-data-types/output/typescript/tsconfig.json
+++ b/examples/12-imports/output/typescript/tsconfig.json
diff --git a/examples/11-imports/src/line.hob b/examples/12-imports/src/line.hob
index 562d77f..562d77f 100644
--- a/examples/11-imports/src/line.hob
+++ b/examples/12-imports/src/line.hob
diff --git a/examples/11-imports/src/point.hob b/examples/12-imports/src/point.hob
index 87f9953..87f9953 100644
--- a/examples/11-imports/src/point.hob
+++ b/examples/12-imports/src/point.hob
diff --git a/examples/13-inductive-data-types/hobgoblin.json5 b/examples/13-inductive-data-types/hobgoblin.json5
new file mode 100644
index 0000000..eac8d4a
--- /dev/null
+++ b/examples/13-inductive-data-types/hobgoblin.json5
@@ -0,0 +1,23 @@
+{
+ outputs: {
+ langs: {
+ java: {
+ packageName: "org.zwobble.example.types",
+ },
+ },
+ generators: [
+ {
+ generator: "java-types",
+ path: "output/java/src/gen/java",
+ },
+ {
+ generator: "rust-types",
+ path: "output/rust/src",
+ },
+ {
+ generator: "typescript-types",
+ path: "output/typescript/src",
+ },
+ ],
+ },
+}
diff --git a/examples/13-inductive-data-types-separate-namespaces/output/java/.gitignore b/examples/13-inductive-data-types/output/java/.gitignore
index ff511d4..ff511d4 100644
--- a/examples/13-inductive-data-types-separate-namespaces/output/java/.gitignore
+++ b/examples/13-inductive-data-types/output/java/.gitignore
diff --git a/examples/13-inductive-data-types-separate-namespaces/output/java/pom.xml b/examples/13-inductive-data-types/output/java/pom.xml
index 445fa65..445fa65 120000
--- a/examples/13-inductive-data-types-separate-namespaces/output/java/pom.xml
+++ b/examples/13-inductive-data-types/output/java/pom.xml
diff --git a/examples/12-inductive-data-types/output/java/src/main/java/org/zwobble/example/Arithmetic.java b/examples/13-inductive-data-types/output/java/src/main/java/org/zwobble/example/Arithmetic.java
index 08cb75c..08cb75c 100644
--- a/examples/12-inductive-data-types/output/java/src/main/java/org/zwobble/example/Arithmetic.java
+++ b/examples/13-inductive-data-types/output/java/src/main/java/org/zwobble/example/Arithmetic.java
diff --git a/examples/12-inductive-data-types/output/java/src/test/java/org/zwobble/example/ArithmeticTests.java b/examples/13-inductive-data-types/output/java/src/test/java/org/zwobble/example/ArithmeticTests.java
index cd4fdd0..cd4fdd0 100644
--- a/examples/12-inductive-data-types/output/java/src/test/java/org/zwobble/example/ArithmeticTests.java
+++ b/examples/13-inductive-data-types/output/java/src/test/java/org/zwobble/example/ArithmeticTests.java
diff --git a/examples/13-inductive-data-types-separate-namespaces/output/rust/.gitignore b/examples/13-inductive-data-types/output/rust/.gitignore
index ea8c4bf..ea8c4bf 100644
--- a/examples/13-inductive-data-types-separate-namespaces/output/rust/.gitignore
+++ b/examples/13-inductive-data-types/output/rust/.gitignore
diff --git a/examples/13-inductive-data-types-separate-namespaces/output/rust/Cargo.lock b/examples/13-inductive-data-types/output/rust/Cargo.lock
index 9dc6e3e..9dc6e3e 100644
--- a/examples/13-inductive-data-types-separate-namespaces/output/rust/Cargo.lock
+++ b/examples/13-inductive-data-types/output/rust/Cargo.lock
diff --git a/examples/13-inductive-data-types-separate-namespaces/output/rust/Cargo.toml b/examples/13-inductive-data-types/output/rust/Cargo.toml
index 5d4c622..5d4c622 100644
--- a/examples/13-inductive-data-types-separate-namespaces/output/rust/Cargo.toml
+++ b/examples/13-inductive-data-types/output/rust/Cargo.toml
diff --git a/examples/13-inductive-data-types-separate-namespaces/output/rust/rust-toolchain.toml b/examples/13-inductive-data-types/output/rust/rust-toolchain.toml
index 4fedb95..4fedb95 100644
--- a/examples/13-inductive-data-types-separate-namespaces/output/rust/rust-toolchain.toml
+++ b/examples/13-inductive-data-types/output/rust/rust-toolchain.toml
diff --git a/examples/12-inductive-data-types/output/rust/src/arithmetic.rs b/examples/13-inductive-data-types/output/rust/src/arithmetic.rs
index e73fb87..e73fb87 100644
--- a/examples/12-inductive-data-types/output/rust/src/arithmetic.rs
+++ b/examples/13-inductive-data-types/output/rust/src/arithmetic.rs
diff --git a/examples/12-inductive-data-types/output/rust/src/lib.rs b/examples/13-inductive-data-types/output/rust/src/lib.rs
index 3265e69..3265e69 100644
--- a/examples/12-inductive-data-types/output/rust/src/lib.rs
+++ b/examples/13-inductive-data-types/output/rust/src/lib.rs
diff --git a/examples/14-struct-generic/output/typescript/.gitignore b/examples/13-inductive-data-types/output/typescript/.gitignore
index 07e6e47..07e6e47 100644
--- a/examples/14-struct-generic/output/typescript/.gitignore
+++ b/examples/13-inductive-data-types/output/typescript/.gitignore
diff --git a/examples/14-struct-generic/output/typescript/package.json b/examples/13-inductive-data-types/output/typescript/package.json
index 0bc7349..0bc7349 120000
--- a/examples/14-struct-generic/output/typescript/package.json
+++ b/examples/13-inductive-data-types/output/typescript/package.json
diff --git a/examples/12-inductive-data-types/output/typescript/pnpm-lock.yaml b/examples/13-inductive-data-types/output/typescript/pnpm-lock.yaml
index 016d629..016d629 100644
--- a/examples/12-inductive-data-types/output/typescript/pnpm-lock.yaml
+++ b/examples/13-inductive-data-types/output/typescript/pnpm-lock.yaml
diff --git a/examples/12-inductive-data-types/output/typescript/src/arithmetic.test.ts b/examples/13-inductive-data-types/output/typescript/src/arithmetic.test.ts
index 7d25224..7d25224 100644
--- a/examples/12-inductive-data-types/output/typescript/src/arithmetic.test.ts
+++ b/examples/13-inductive-data-types/output/typescript/src/arithmetic.test.ts
diff --git a/examples/12-inductive-data-types/output/typescript/src/arithmetic.ts b/examples/13-inductive-data-types/output/typescript/src/arithmetic.ts
index 486ac66..486ac66 100644
--- a/examples/12-inductive-data-types/output/typescript/src/arithmetic.ts
+++ b/examples/13-inductive-data-types/output/typescript/src/arithmetic.ts
diff --git a/examples/12-inductive-data-types/output/typescript/src/index.ts b/examples/13-inductive-data-types/output/typescript/src/index.ts
index 8395fea..8395fea 100644
--- a/examples/12-inductive-data-types/output/typescript/src/index.ts
+++ b/examples/13-inductive-data-types/output/typescript/src/index.ts
diff --git a/examples/14-struct-generic/output/typescript/tsconfig.json b/examples/13-inductive-data-types/output/typescript/tsconfig.json
index 3c7cb2a..3c7cb2a 120000
--- a/examples/14-struct-generic/output/typescript/tsconfig.json
+++ b/examples/13-inductive-data-types/output/typescript/tsconfig.json
diff --git a/examples/12-inductive-data-types/src/arithmetic.hob b/examples/13-inductive-data-types/src/arithmetic.hob
index d3b2051..d3b2051 100644
--- a/examples/12-inductive-data-types/src/arithmetic.hob
+++ b/examples/13-inductive-data-types/src/arithmetic.hob
diff --git a/examples/13-inductive-data-types-separate-namespaces/hobgoblin.json5 b/examples/14-inductive-data-types-separate-namespaces/hobgoblin.json5
index 12713d4..12713d4 100644
--- a/examples/13-inductive-data-types-separate-namespaces/hobgoblin.json5
+++ b/examples/14-inductive-data-types-separate-namespaces/hobgoblin.json5
diff --git a/examples/14-struct-generic/output/java/.gitignore b/examples/14-inductive-data-types-separate-namespaces/output/java/.gitignore
index ff511d4..ff511d4 100644
--- a/examples/14-struct-generic/output/java/.gitignore
+++ b/examples/14-inductive-data-types-separate-namespaces/output/java/.gitignore
diff --git a/examples/14-struct-generic/output/java/pom.xml b/examples/14-inductive-data-types-separate-namespaces/output/java/pom.xml
index 445fa65..445fa65 120000
--- a/examples/14-struct-generic/output/java/pom.xml
+++ b/examples/14-inductive-data-types-separate-namespaces/output/java/pom.xml
diff --git a/examples/13-inductive-data-types-separate-namespaces/output/java/src/test/java/org/zwobble/example/DataTests.java b/examples/14-inductive-data-types-separate-namespaces/output/java/src/test/java/org/zwobble/example/DataTests.java
index f01bf0a..f01bf0a 100644
--- a/examples/13-inductive-data-types-separate-namespaces/output/java/src/test/java/org/zwobble/example/DataTests.java
+++ b/examples/14-inductive-data-types-separate-namespaces/output/java/src/test/java/org/zwobble/example/DataTests.java
diff --git a/examples/14-struct-generic/output/rust/.gitignore b/examples/14-inductive-data-types-separate-namespaces/output/rust/.gitignore
index ea8c4bf..ea8c4bf 100644
--- a/examples/14-struct-generic/output/rust/.gitignore
+++ b/examples/14-inductive-data-types-separate-namespaces/output/rust/.gitignore
diff --git a/examples/14-struct-generic/output/rust/Cargo.lock b/examples/14-inductive-data-types-separate-namespaces/output/rust/Cargo.lock
index 9dc6e3e..9dc6e3e 100644
--- a/examples/14-struct-generic/output/rust/Cargo.lock
+++ b/examples/14-inductive-data-types-separate-namespaces/output/rust/Cargo.lock
diff --git a/examples/14-struct-generic/output/rust/Cargo.toml b/examples/14-inductive-data-types-separate-namespaces/output/rust/Cargo.toml
index 5d4c622..5d4c622 100644
--- a/examples/14-struct-generic/output/rust/Cargo.toml
+++ b/examples/14-inductive-data-types-separate-namespaces/output/rust/Cargo.toml
diff --git a/examples/14-struct-generic/output/rust/rust-toolchain.toml b/examples/14-inductive-data-types-separate-namespaces/output/rust/rust-toolchain.toml
index 4fedb95..4fedb95 100644
--- a/examples/14-struct-generic/output/rust/rust-toolchain.toml
+++ b/examples/14-inductive-data-types-separate-namespaces/output/rust/rust-toolchain.toml
diff --git a/examples/13-inductive-data-types-separate-namespaces/output/rust/src/data/a.rs b/examples/14-inductive-data-types-separate-namespaces/output/rust/src/data/a.rs
index 3796251..3796251 100644
--- a/examples/13-inductive-data-types-separate-namespaces/output/rust/src/data/a.rs
+++ b/examples/14-inductive-data-types-separate-namespaces/output/rust/src/data/a.rs
diff --git a/examples/13-inductive-data-types-separate-namespaces/output/rust/src/data/b.rs b/examples/14-inductive-data-types-separate-namespaces/output/rust/src/data/b.rs
index 1968eb3..1968eb3 100644
--- a/examples/13-inductive-data-types-separate-namespaces/output/rust/src/data/b.rs
+++ b/examples/14-inductive-data-types-separate-namespaces/output/rust/src/data/b.rs
diff --git a/examples/13-inductive-data-types-separate-namespaces/output/rust/src/data/mod.rs b/examples/14-inductive-data-types-separate-namespaces/output/rust/src/data/mod.rs
index 677af14..677af14 100644
--- a/examples/13-inductive-data-types-separate-namespaces/output/rust/src/data/mod.rs
+++ b/examples/14-inductive-data-types-separate-namespaces/output/rust/src/data/mod.rs
diff --git a/examples/13-inductive-data-types-separate-namespaces/output/rust/src/lib.rs b/examples/14-inductive-data-types-separate-namespaces/output/rust/src/lib.rs
index 01aaddf..01aaddf 100644
--- a/examples/13-inductive-data-types-separate-namespaces/output/rust/src/lib.rs
+++ b/examples/14-inductive-data-types-separate-namespaces/output/rust/src/lib.rs
diff --git a/examples/13-inductive-data-types-separate-namespaces/src/data/a.hob b/examples/14-inductive-data-types-separate-namespaces/src/data/a.hob
index e8c02ea..e8c02ea 100644
--- a/examples/13-inductive-data-types-separate-namespaces/src/data/a.hob
+++ b/examples/14-inductive-data-types-separate-namespaces/src/data/a.hob
diff --git a/examples/13-inductive-data-types-separate-namespaces/src/data/b.hob b/examples/14-inductive-data-types-separate-namespaces/src/data/b.hob
index 4d538fc..4d538fc 100644
--- a/examples/13-inductive-data-types-separate-namespaces/src/data/b.hob
+++ b/examples/14-inductive-data-types-separate-namespaces/src/data/b.hob
diff --git a/examples/14-struct-generic/hobgoblin.json5 b/examples/15-struct-generic/hobgoblin.json5
index c7dc903..c7dc903 100644
--- a/examples/14-struct-generic/hobgoblin.json5
+++ b/examples/15-struct-generic/hobgoblin.json5
diff --git a/examples/15-native-type-generic/output/java/.gitignore b/examples/15-struct-generic/output/java/.gitignore
index ff511d4..ff511d4 100644
--- a/examples/15-native-type-generic/output/java/.gitignore
+++ b/examples/15-struct-generic/output/java/.gitignore
diff --git a/examples/15-native-type-generic/output/java/pom.xml b/examples/15-struct-generic/output/java/pom.xml
index 445fa65..445fa65 120000
--- a/examples/15-native-type-generic/output/java/pom.xml
+++ b/examples/15-struct-generic/output/java/pom.xml
diff --git a/examples/14-struct-generic/output/java/src/test/java/org/zwobble/example/PointTests.java b/examples/15-struct-generic/output/java/src/test/java/org/zwobble/example/PointTests.java
index fba31c7..fba31c7 100644
--- a/examples/14-struct-generic/output/java/src/test/java/org/zwobble/example/PointTests.java
+++ b/examples/15-struct-generic/output/java/src/test/java/org/zwobble/example/PointTests.java
diff --git a/examples/15-native-type-generic/output/rust/.gitignore b/examples/15-struct-generic/output/rust/.gitignore
index ea8c4bf..ea8c4bf 100644
--- a/examples/15-native-type-generic/output/rust/.gitignore
+++ b/examples/15-struct-generic/output/rust/.gitignore
diff --git a/examples/15-native-type-generic/output/rust/Cargo.lock b/examples/15-struct-generic/output/rust/Cargo.lock
index 9dc6e3e..9dc6e3e 100644
--- a/examples/15-native-type-generic/output/rust/Cargo.lock
+++ b/examples/15-struct-generic/output/rust/Cargo.lock
diff --git a/examples/15-native-type-generic/output/rust/Cargo.toml b/examples/15-struct-generic/output/rust/Cargo.toml
index 5d4c622..5d4c622 100644
--- a/examples/15-native-type-generic/output/rust/Cargo.toml
+++ b/examples/15-struct-generic/output/rust/Cargo.toml
diff --git a/examples/15-native-type-generic/output/rust/rust-toolchain.toml b/examples/15-struct-generic/output/rust/rust-toolchain.toml
index 4fedb95..4fedb95 100644
--- a/examples/15-native-type-generic/output/rust/rust-toolchain.toml
+++ b/examples/15-struct-generic/output/rust/rust-toolchain.toml
diff --git a/examples/14-struct-generic/output/rust/src/lib.rs b/examples/15-struct-generic/output/rust/src/lib.rs
index 75ae1f1..75ae1f1 100644
--- a/examples/14-struct-generic/output/rust/src/lib.rs
+++ b/examples/15-struct-generic/output/rust/src/lib.rs
diff --git a/examples/14-struct-generic/output/rust/src/point.rs b/examples/15-struct-generic/output/rust/src/point.rs
index a6c6615..a6c6615 100644
--- a/examples/14-struct-generic/output/rust/src/point.rs
+++ b/examples/15-struct-generic/output/rust/src/point.rs
diff --git a/examples/15-native-type-generic/output/typescript/.gitignore b/examples/15-struct-generic/output/typescript/.gitignore
index 07e6e47..07e6e47 100644
--- a/examples/15-native-type-generic/output/typescript/.gitignore
+++ b/examples/15-struct-generic/output/typescript/.gitignore
diff --git a/examples/15-native-type-generic/output/typescript/package.json b/examples/15-struct-generic/output/typescript/package.json
index 0bc7349..0bc7349 120000
--- a/examples/15-native-type-generic/output/typescript/package.json
+++ b/examples/15-struct-generic/output/typescript/package.json
diff --git a/examples/14-struct-generic/output/typescript/pnpm-lock.yaml b/examples/15-struct-generic/output/typescript/pnpm-lock.yaml
index 016d629..016d629 100644
--- a/examples/14-struct-generic/output/typescript/pnpm-lock.yaml
+++ b/examples/15-struct-generic/output/typescript/pnpm-lock.yaml
diff --git a/examples/14-struct-generic/output/typescript/src/point.test.ts b/examples/15-struct-generic/output/typescript/src/point.test.ts
index 0d59417..0d59417 100644
--- a/examples/14-struct-generic/output/typescript/src/point.test.ts
+++ b/examples/15-struct-generic/output/typescript/src/point.test.ts
diff --git a/examples/14-struct-generic/output/typescript/src/point.ts b/examples/15-struct-generic/output/typescript/src/point.ts
index f3ecdec..f3ecdec 100644
--- a/examples/14-struct-generic/output/typescript/src/point.ts
+++ b/examples/15-struct-generic/output/typescript/src/point.ts
diff --git a/examples/15-native-type-generic/output/typescript/tsconfig.json b/examples/15-struct-generic/output/typescript/tsconfig.json
index 3c7cb2a..3c7cb2a 120000
--- a/examples/15-native-type-generic/output/typescript/tsconfig.json
+++ b/examples/15-struct-generic/output/typescript/tsconfig.json
diff --git a/examples/14-struct-generic/src/point.hob b/examples/15-struct-generic/src/point.hob
index 5beed86..5beed86 100644
--- a/examples/14-struct-generic/src/point.hob
+++ b/examples/15-struct-generic/src/point.hob
diff --git a/examples/15-native-type-generic/hobgoblin.json5 b/examples/16-native-type-generic/hobgoblin.json5
index 20c767f..20c767f 100644
--- a/examples/15-native-type-generic/hobgoblin.json5
+++ b/examples/16-native-type-generic/hobgoblin.json5
diff --git a/examples/16-native-type-generic/output/java/.gitignore b/examples/16-native-type-generic/output/java/.gitignore
new file mode 100644
index 0000000..ff511d4
--- /dev/null
+++ b/examples/16-native-type-generic/output/java/.gitignore
@@ -0,0 +1,2 @@
+/src/gen/
+/target/
diff --git a/examples/16-transient-0/output/java/pom.xml b/examples/16-native-type-generic/output/java/pom.xml
index 445fa65..445fa65 120000
--- a/examples/16-transient-0/output/java/pom.xml
+++ b/examples/16-native-type-generic/output/java/pom.xml
diff --git a/examples/15-native-type-generic/output/java/src/main/java/org/zwobble/example/types/map/HobgoblinNativeMap.java b/examples/16-native-type-generic/output/java/src/main/java/org/zwobble/example/types/map/HobgoblinNativeMap.java
index 39fd627..39fd627 100644
--- a/examples/15-native-type-generic/output/java/src/main/java/org/zwobble/example/types/map/HobgoblinNativeMap.java
+++ b/examples/16-native-type-generic/output/java/src/main/java/org/zwobble/example/types/map/HobgoblinNativeMap.java
diff --git a/examples/15-native-type-generic/output/java/src/test/java/org/zwobble/example/MapTests.java b/examples/16-native-type-generic/output/java/src/test/java/org/zwobble/example/MapTests.java
index 5b6a764..5b6a764 100644
--- a/examples/15-native-type-generic/output/java/src/test/java/org/zwobble/example/MapTests.java
+++ b/examples/16-native-type-generic/output/java/src/test/java/org/zwobble/example/MapTests.java
diff --git a/examples/16-native-type-generic/output/rust/.gitignore b/examples/16-native-type-generic/output/rust/.gitignore
new file mode 100644
index 0000000..ea8c4bf
--- /dev/null
+++ b/examples/16-native-type-generic/output/rust/.gitignore
@@ -0,0 +1 @@
+/target
diff --git a/examples/16-transient-0/output/rust/Cargo.lock b/examples/16-native-type-generic/output/rust/Cargo.lock
index 9dc6e3e..9dc6e3e 100644
--- a/examples/16-transient-0/output/rust/Cargo.lock
+++ b/examples/16-native-type-generic/output/rust/Cargo.lock
diff --git a/examples/16-transient-0/output/rust/Cargo.toml b/examples/16-native-type-generic/output/rust/Cargo.toml
index 5d4c622..5d4c622 100644
--- a/examples/16-transient-0/output/rust/Cargo.toml
+++ b/examples/16-native-type-generic/output/rust/Cargo.toml
diff --git a/examples/16-transient-0/output/rust/rust-toolchain.toml b/examples/16-native-type-generic/output/rust/rust-toolchain.toml
index 4fedb95..4fedb95 100644
--- a/examples/16-transient-0/output/rust/rust-toolchain.toml
+++ b/examples/16-native-type-generic/output/rust/rust-toolchain.toml
diff --git a/examples/15-native-type-generic/output/rust/src/gen/map.rs b/examples/16-native-type-generic/output/rust/src/gen/map.rs
index 59fb30f..59fb30f 100644
--- a/examples/15-native-type-generic/output/rust/src/gen/map.rs
+++ b/examples/16-native-type-generic/output/rust/src/gen/map.rs
diff --git a/examples/15-native-type-generic/output/rust/src/lib.rs b/examples/16-native-type-generic/output/rust/src/lib.rs
index b0adf47..b0adf47 100644
--- a/examples/15-native-type-generic/output/rust/src/lib.rs
+++ b/examples/16-native-type-generic/output/rust/src/lib.rs
diff --git a/examples/15-native-type-generic/output/rust/src/map.rs b/examples/16-native-type-generic/output/rust/src/map.rs
index 3dd0a72..3dd0a72 100644
--- a/examples/15-native-type-generic/output/rust/src/map.rs
+++ b/examples/16-native-type-generic/output/rust/src/map.rs
diff --git a/examples/16-native-type-generic/output/typescript/.gitignore b/examples/16-native-type-generic/output/typescript/.gitignore
new file mode 100644
index 0000000..07e6e47
--- /dev/null
+++ b/examples/16-native-type-generic/output/typescript/.gitignore
@@ -0,0 +1 @@
+/node_modules
diff --git a/examples/16-native-type-generic/output/typescript/package.json b/examples/16-native-type-generic/output/typescript/package.json
new file mode 120000
index 0000000..0bc7349
--- /dev/null
+++ b/examples/16-native-type-generic/output/typescript/package.json
@@ -0,0 +1 @@
+../../../templates/typescript/package.json \ No newline at end of file
diff --git a/examples/15-native-type-generic/output/typescript/pnpm-lock.yaml b/examples/16-native-type-generic/output/typescript/pnpm-lock.yaml
index 016d629..016d629 100644
--- a/examples/15-native-type-generic/output/typescript/pnpm-lock.yaml
+++ b/examples/16-native-type-generic/output/typescript/pnpm-lock.yaml
diff --git a/examples/15-native-type-generic/output/typescript/src/map.test.ts b/examples/16-native-type-generic/output/typescript/src/map.test.ts
index a442c2c..a442c2c 100644
--- a/examples/15-native-type-generic/output/typescript/src/map.test.ts
+++ b/examples/16-native-type-generic/output/typescript/src/map.test.ts
diff --git a/examples/15-native-type-generic/output/typescript/src/map.ts b/examples/16-native-type-generic/output/typescript/src/map.ts
index 394ad92..394ad92 100644
--- a/examples/15-native-type-generic/output/typescript/src/map.ts
+++ b/examples/16-native-type-generic/output/typescript/src/map.ts
diff --git a/examples/16-native-type-generic/output/typescript/tsconfig.json b/examples/16-native-type-generic/output/typescript/tsconfig.json
new file mode 120000
index 0000000..3c7cb2a
--- /dev/null
+++ b/examples/16-native-type-generic/output/typescript/tsconfig.json
@@ -0,0 +1 @@
+../../../templates/typescript/tsconfig.json \ No newline at end of file
diff --git a/examples/15-native-type-generic/src/map.hob b/examples/16-native-type-generic/src/map.hob
index 0118889..0118889 100644
--- a/examples/15-native-type-generic/src/map.hob
+++ b/examples/16-native-type-generic/src/map.hob
diff --git a/examples/16-transient-0/hobgoblin.json5 b/examples/17-transient-0/hobgoblin.json5
index e632b0a..e632b0a 100644
--- a/examples/16-transient-0/hobgoblin.json5
+++ b/examples/17-transient-0/hobgoblin.json5
diff --git a/examples/16-transient-0/output/java/.gitignore b/examples/17-transient-0/output/java/.gitignore
index 2fcf0b8..2fcf0b8 100644
--- a/examples/16-transient-0/output/java/.gitignore
+++ b/examples/17-transient-0/output/java/.gitignore
diff --git a/examples/17-transient-0/output/java/pom.xml b/examples/17-transient-0/output/java/pom.xml
new file mode 120000
index 0000000..445fa65
--- /dev/null
+++ b/examples/17-transient-0/output/java/pom.xml
@@ -0,0 +1 @@
+../../../templates/java-junit/pom.xml \ No newline at end of file
diff --git a/examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/data/GenericNative.java b/examples/17-transient-0/output/java/src/main/java/org/zwobble/example/types/data/GenericNative.java
index cfd16d5..cfd16d5 100644
--- a/examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/data/GenericNative.java
+++ b/examples/17-transient-0/output/java/src/main/java/org/zwobble/example/types/data/GenericNative.java
diff --git a/examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/data/HobgoblinNativeData.java b/examples/17-transient-0/output/java/src/main/java/org/zwobble/example/types/data/HobgoblinNativeData.java
index cc26b7b..cc26b7b 100644
--- a/examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/data/HobgoblinNativeData.java
+++ b/examples/17-transient-0/output/java/src/main/java/org/zwobble/example/types/data/HobgoblinNativeData.java
diff --git a/examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/data/Native.java b/examples/17-transient-0/output/java/src/main/java/org/zwobble/example/types/data/Native.java
index 366dd74..366dd74 100644
--- a/examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/data/Native.java
+++ b/examples/17-transient-0/output/java/src/main/java/org/zwobble/example/types/data/Native.java
diff --git a/examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/data/transient0/HobgoblinTransient0Data.java b/examples/17-transient-0/output/java/src/main/java/org/zwobble/example/types/data/transient0/HobgoblinTransient0Data.java
index f8799b7..f8799b7 100644
--- a/examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/data/transient0/HobgoblinTransient0Data.java
+++ b/examples/17-transient-0/output/java/src/main/java/org/zwobble/example/types/data/transient0/HobgoblinTransient0Data.java
diff --git a/examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/transient0/Decoder.java b/examples/17-transient-0/output/java/src/main/java/org/zwobble/example/types/transient0/Decoder.java
index ad1a6d0..ad1a6d0 100644
--- a/examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/transient0/Decoder.java
+++ b/examples/17-transient-0/output/java/src/main/java/org/zwobble/example/types/transient0/Decoder.java
diff --git a/examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/transient0/Encoder.java b/examples/17-transient-0/output/java/src/main/java/org/zwobble/example/types/transient0/Encoder.java
index 2ba43a6..2ba43a6 100644
--- a/examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/transient0/Encoder.java
+++ b/examples/17-transient-0/output/java/src/main/java/org/zwobble/example/types/transient0/Encoder.java
diff --git a/examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/transient0/HobgoblinTransient0Builtins.java b/examples/17-transient-0/output/java/src/main/java/org/zwobble/example/types/transient0/HobgoblinTransient0Builtins.java
index 861d7bb..861d7bb 100644
--- a/examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/transient0/HobgoblinTransient0Builtins.java
+++ b/examples/17-transient-0/output/java/src/main/java/org/zwobble/example/types/transient0/HobgoblinTransient0Builtins.java
diff --git a/examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/transient0/HobgoblinTransient0TaggedSharedValue.java b/examples/17-transient-0/output/java/src/main/java/org/zwobble/example/types/transient0/HobgoblinTransient0TaggedSharedValue.java
index 6c5b520..6c5b520 100644
--- a/examples/16-transient-0/output/java/src/main/java/org/zwobble/example/types/transient0/HobgoblinTransient0TaggedSharedValue.java
+++ b/examples/17-transient-0/output/java/src/main/java/org/zwobble/example/types/transient0/HobgoblinTransient0TaggedSharedValue.java
diff --git a/examples/16-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java b/examples/17-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java
index 1a1d659..1a1d659 100644
--- a/examples/16-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java
+++ b/examples/17-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java
diff --git a/examples/16-transient-0/output/rust/.gitignore b/examples/17-transient-0/output/rust/.gitignore
index fc03479..fc03479 100644
--- a/examples/16-transient-0/output/rust/.gitignore
+++ b/examples/17-transient-0/output/rust/.gitignore
diff --git a/examples/17-transient-0/output/rust/Cargo.lock b/examples/17-transient-0/output/rust/Cargo.lock
new file mode 100644
index 0000000..9dc6e3e
--- /dev/null
+++ b/examples/17-transient-0/output/rust/Cargo.lock
@@ -0,0 +1,7 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 4
+
+[[package]]
+name = "example"
+version = "0.1.0"
diff --git a/examples/17-transient-0/output/rust/Cargo.toml b/examples/17-transient-0/output/rust/Cargo.toml
new file mode 100644
index 0000000..5d4c622
--- /dev/null
+++ b/examples/17-transient-0/output/rust/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "example"
+version = "0.1.0"
+edition = "2024"
+
+[dependencies]
diff --git a/examples/17-transient-0/output/rust/rust-toolchain.toml b/examples/17-transient-0/output/rust/rust-toolchain.toml
new file mode 100644
index 0000000..4fedb95
--- /dev/null
+++ b/examples/17-transient-0/output/rust/rust-toolchain.toml
@@ -0,0 +1,2 @@
+[toolchain]
+channel = "1.96"
diff --git a/examples/16-transient-0/output/rust/src/data.rs b/examples/17-transient-0/output/rust/src/data.rs
index 2b890c2..2b890c2 100644
--- a/examples/16-transient-0/output/rust/src/data.rs
+++ b/examples/17-transient-0/output/rust/src/data.rs
diff --git a/examples/16-transient-0/output/rust/src/gen/data.rs b/examples/17-transient-0/output/rust/src/gen/data.rs
index 2b344e4..2b344e4 100644
--- a/examples/16-transient-0/output/rust/src/gen/data.rs
+++ b/examples/17-transient-0/output/rust/src/gen/data.rs
diff --git a/examples/16-transient-0/output/rust/src/gen/data/transient_0.rs b/examples/17-transient-0/output/rust/src/gen/data/transient_0.rs
index 3c40ea2..3c40ea2 100644
--- a/examples/16-transient-0/output/rust/src/gen/data/transient_0.rs
+++ b/examples/17-transient-0/output/rust/src/gen/data/transient_0.rs
diff --git a/examples/16-transient-0/output/rust/src/gen/transient_0.rs b/examples/17-transient-0/output/rust/src/gen/transient_0.rs
index 1b1b659..1b1b659 100644
--- a/examples/16-transient-0/output/rust/src/gen/transient_0.rs
+++ b/examples/17-transient-0/output/rust/src/gen/transient_0.rs
diff --git a/examples/16-transient-0/output/rust/src/lib.rs b/examples/17-transient-0/output/rust/src/lib.rs
index ea26e60..ea26e60 100644
--- a/examples/16-transient-0/output/rust/src/lib.rs
+++ b/examples/17-transient-0/output/rust/src/lib.rs
diff --git a/examples/16-transient-0/output/rust/src/transient_0.rs b/examples/17-transient-0/output/rust/src/transient_0.rs
index 8b2b800..8b2b800 100644
--- a/examples/16-transient-0/output/rust/src/transient_0.rs
+++ b/examples/17-transient-0/output/rust/src/transient_0.rs
diff --git a/examples/16-transient-0/src/data.hob b/examples/17-transient-0/src/data.hob
index 25fb1be..25fb1be 100644
--- a/examples/16-transient-0/src/data.hob
+++ b/examples/17-transient-0/src/data.hob
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptGenerator.java
index 25435c5..44bad46 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptGenerator.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptGenerator.java
@@ -1,6 +1,7 @@
package org.zwobble.hobgoblin.compiler.output.generators.typescript;
import org.zwobble.hobgoblin.compiler.builtins.NativeTypes;
+import org.zwobble.hobgoblin.compiler.output.lang.typescript.TypescriptTypes;
import org.zwobble.hobgoblin.compiler.output.lang.typescript.TypescriptWriter;
import org.zwobble.hobgoblin.compiler.output.lang.typescript.ast.*;
import org.zwobble.hobgoblin.compiler.typechecker.TypesInfo;
@@ -11,6 +12,7 @@ import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.LinkedHashSet;
+import java.util.List;
import java.util.SequencedSet;
import java.util.stream.Collectors;
@@ -81,6 +83,15 @@ public class TypescriptGenerator {
public TypescriptExpression generateTypeExpression(Type value, Context context) {
return switch (collapseType(value)) {
case ConstructedType constructedType -> {
+ if (constructedType.constructor().equals(NativeTypes.OPTION)) {
+ // TODO: How to deal with nested options? Forbid them in
+ // hobgoblin?
+ yield new TypescriptTypeUnion(List.of(
+ generateTypeExpression(constructedType.args().getFirst(), context),
+ TypescriptTypes.NULL
+ ));
+ }
+
yield new TypescriptConstructedType(
generateTypeExpression(constructedType.constructor().genericType(), context),
constructedType.args().stream()
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/typescript/TypescriptTypes.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/typescript/TypescriptTypes.java
index 22f24a3..e6fa609 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/typescript/TypescriptTypes.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/typescript/TypescriptTypes.java
@@ -1,5 +1,6 @@
package org.zwobble.hobgoblin.compiler.output.lang.typescript;
+import org.zwobble.hobgoblin.compiler.output.lang.typescript.ast.TypescriptExpression;
import org.zwobble.hobgoblin.compiler.output.lang.typescript.ast.TypescriptIdentifier;
import org.zwobble.hobgoblin.compiler.output.lang.typescript.ast.TypescriptRef;
@@ -7,6 +8,7 @@ public class TypescriptTypes {
private TypescriptTypes() {
}
+ public static final TypescriptExpression NULL = new TypescriptRef(TypescriptIdentifier.of("null"));
public static final TypescriptRef NUMBER = new TypescriptRef(TypescriptIdentifier.of("number"));
public static final TypescriptRef READONLY_ARRAY = new TypescriptRef(TypescriptIdentifier.of("ReadonlyArray"));
public static final TypescriptRef SYMBOL = new TypescriptRef(TypescriptIdentifier.of("Symbol"));