aboutsummaryrefslogtreecommitdiff
path: root/examples/monorepo
diff options
context:
space:
mode:
Diffstat (limited to 'examples/monorepo')
-rw-r--r--examples/monorepo/.gitignore7
-rw-r--r--examples/monorepo/.nova/Configuration.json4
-rw-r--r--examples/monorepo/build.zig30
-rw-r--r--examples/monorepo/build.zig.zon13
-rw-r--r--examples/monorepo/packages/alpha/build.zig17
-rw-r--r--examples/monorepo/packages/alpha/build.zig.zon8
-rw-r--r--examples/monorepo/packages/alpha/src/lib.zig23
-rw-r--r--examples/monorepo/packages/beta/build.zig17
-rw-r--r--examples/monorepo/packages/beta/build.zig.zon8
-rw-r--r--examples/monorepo/packages/beta/src/lib.zig44
-rw-r--r--examples/monorepo/src/main.zig9
11 files changed, 180 insertions, 0 deletions
diff --git a/examples/monorepo/.gitignore b/examples/monorepo/.gitignore
new file mode 100644
index 0000000..575c3ca
--- /dev/null
+++ b/examples/monorepo/.gitignore
@@ -0,0 +1,7 @@
+.zig-cache/
+zig-cache/
+zig-out/
+packages/alpha/.zig-cache/
+packages/alpha/zig-out/
+packages/beta/.zig-cache/
+packages/beta/zig-out/
diff --git a/examples/monorepo/.nova/Configuration.json b/examples/monorepo/.nova/Configuration.json
new file mode 100644
index 0000000..44cadf8
--- /dev/null
+++ b/examples/monorepo/.nova/Configuration.json
@@ -0,0 +1,4 @@
+{
+ "zls.enable_build_on_save" : false,
+ "zls.zig_exe_path" : "\/opt\/homebrew\/bin\/zig"
+}
diff --git a/examples/monorepo/build.zig b/examples/monorepo/build.zig
new file mode 100644
index 0000000..f565154
--- /dev/null
+++ b/examples/monorepo/build.zig
@@ -0,0 +1,30 @@
+const std = @import("std");
+
+// Root build.zig for a two-package monorepo.
+// Open the workspace root in Nova → discovers "test-all" and "gen-docs" steps.
+// Open packages/beta/ separately → discovers that package's own "test" step.
+pub fn build(b: *std.Build) void {
+ const target = b.standardTargetOptions(.{});
+ const optimize = b.standardOptimizeOption(.{});
+
+ const exe = b.addExecutable(.{
+ .name = "monorepo-root",
+ .root_module = b.createModule(.{
+ .root_source_file = b.path("src/main.zig"),
+ .target = target,
+ .optimize = optimize,
+ }),
+ });
+ b.installArtifact(exe);
+
+ const run_cmd = b.addRunArtifact(exe);
+ const run_step = b.step("run", "Run the root executable");
+ run_step.dependOn(&run_cmd.step);
+
+ // Placeholder step that would orchestrate sub-package tests in a real monorepo.
+ const test_all_step = b.step("test-all", "Run tests for all packages");
+ _ = test_all_step;
+
+ const docs_step = b.step("gen-docs", "Generate docs for all packages");
+ _ = docs_step;
+}
diff --git a/examples/monorepo/build.zig.zon b/examples/monorepo/build.zig.zon
new file mode 100644
index 0000000..ed71224
--- /dev/null
+++ b/examples/monorepo/build.zig.zon
@@ -0,0 +1,13 @@
+.{
+ .name = .monorepo_root,
+ .version = "0.1.0",
+ .fingerprint = 0xe044bb6d81fdc07a,
+ .minimum_zig_version = "0.16.0",
+ .dependencies = .{},
+ .paths = .{
+ "build.zig",
+ "build.zig.zon",
+ "src",
+ "packages",
+ },
+}
diff --git a/examples/monorepo/packages/alpha/build.zig b/examples/monorepo/packages/alpha/build.zig
new file mode 100644
index 0000000..9ec9553
--- /dev/null
+++ b/examples/monorepo/packages/alpha/build.zig
@@ -0,0 +1,17 @@
+const std = @import("std");
+
+pub fn build(b: *std.Build) void {
+ const target = b.standardTargetOptions(.{});
+ const optimize = b.standardOptimizeOption(.{});
+
+ const lib_tests = b.addTest(.{
+ .root_module = b.createModule(.{
+ .root_source_file = b.path("src/lib.zig"),
+ .target = target,
+ .optimize = optimize,
+ }),
+ });
+ const run_tests = b.addRunArtifact(lib_tests);
+ const test_step = b.step("test", "Run alpha tests");
+ test_step.dependOn(&run_tests.step);
+}
diff --git a/examples/monorepo/packages/alpha/build.zig.zon b/examples/monorepo/packages/alpha/build.zig.zon
new file mode 100644
index 0000000..b5b32fc
--- /dev/null
+++ b/examples/monorepo/packages/alpha/build.zig.zon
@@ -0,0 +1,8 @@
+.{
+ .name = .alpha,
+ .version = "0.1.0",
+ .fingerprint = 0xd0e0396aca382c40,
+ .minimum_zig_version = "0.16.0",
+ .dependencies = .{},
+ .paths = .{ "build.zig", "build.zig.zon", "src" },
+}
diff --git a/examples/monorepo/packages/alpha/src/lib.zig b/examples/monorepo/packages/alpha/src/lib.zig
new file mode 100644
index 0000000..2aa7716
--- /dev/null
+++ b/examples/monorepo/packages/alpha/src/lib.zig
@@ -0,0 +1,23 @@
+const std = @import("std");
+
+/// Double a value.
+pub fn double(x: i32) i32 {
+ return x * 2;
+}
+
+/// Square a value.
+pub fn square(x: i32) i32 {
+ return x * x;
+}
+
+test "alpha: double" {
+ try std.testing.expectEqual(@as(i32, 8), double(4));
+ try std.testing.expectEqual(@as(i32, -6), double(-3));
+ try std.testing.expectEqual(@as(i32, 0), double(0));
+}
+
+test "alpha: square" {
+ try std.testing.expectEqual(@as(i32, 9), square(3));
+ try std.testing.expectEqual(@as(i32, 9), square(-3));
+ try std.testing.expectEqual(@as(i32, 0), square(0));
+}
diff --git a/examples/monorepo/packages/beta/build.zig b/examples/monorepo/packages/beta/build.zig
new file mode 100644
index 0000000..fa4c1cd
--- /dev/null
+++ b/examples/monorepo/packages/beta/build.zig
@@ -0,0 +1,17 @@
+const std = @import("std");
+
+pub fn build(b: *std.Build) void {
+ const target = b.standardTargetOptions(.{});
+ const optimize = b.standardOptimizeOption(.{});
+
+ const lib_tests = b.addTest(.{
+ .root_module = b.createModule(.{
+ .root_source_file = b.path("src/lib.zig"),
+ .target = target,
+ .optimize = optimize,
+ }),
+ });
+ const run_tests = b.addRunArtifact(lib_tests);
+ const test_step = b.step("test", "Run beta tests");
+ test_step.dependOn(&run_tests.step);
+}
diff --git a/examples/monorepo/packages/beta/build.zig.zon b/examples/monorepo/packages/beta/build.zig.zon
new file mode 100644
index 0000000..94cccf7
--- /dev/null
+++ b/examples/monorepo/packages/beta/build.zig.zon
@@ -0,0 +1,8 @@
+.{
+ .name = .beta,
+ .version = "0.1.0",
+ .fingerprint = 0x8f910463cee85531,
+ .minimum_zig_version = "0.16.0",
+ .dependencies = .{},
+ .paths = .{ "build.zig", "build.zig.zon", "src" },
+}
diff --git a/examples/monorepo/packages/beta/src/lib.zig b/examples/monorepo/packages/beta/src/lib.zig
new file mode 100644
index 0000000..690b38c
--- /dev/null
+++ b/examples/monorepo/packages/beta/src/lib.zig
@@ -0,0 +1,44 @@
+// findNearestZigBuildDir walk-up test:
+//
+// When this file is the active editor in Nova, the "Current Zig File" clean
+// action calls findNearestZigBuildDir starting at packages/beta/src/.
+// It finds packages/beta/build.zig after one walk step and uses that
+// directory as the working directory — NOT the monorepo root build.zig.
+//
+// To verify: open this file, trigger clean, observe the task console shows
+// the beta package directory, not the monorepo root.
+const std = @import("std");
+
+/// Halve a value (integer division, truncated toward zero).
+pub fn halve(x: i32) i32 {
+ return @divTrunc(x, 2);
+}
+
+/// Negate a value.
+pub fn negate(x: i32) i32 {
+ return -x;
+}
+
+/// Absolute value.
+pub fn abs(x: i32) i32 {
+ return if (x < 0) -x else x;
+}
+
+test "beta: halve" {
+ try std.testing.expectEqual(@as(i32, 3), halve(6));
+ try std.testing.expectEqual(@as(i32, 3), halve(7)); // truncated
+ try std.testing.expectEqual(@as(i32, -2), halve(-5));
+ try std.testing.expectEqual(@as(i32, 0), halve(0));
+}
+
+test "beta: negate" {
+ try std.testing.expectEqual(@as(i32, -7), negate(7));
+ try std.testing.expectEqual(@as(i32, 7), negate(-7));
+ try std.testing.expectEqual(@as(i32, 0), negate(0));
+}
+
+test "beta: abs" {
+ try std.testing.expectEqual(@as(i32, 5), abs(5));
+ try std.testing.expectEqual(@as(i32, 5), abs(-5));
+ try std.testing.expectEqual(@as(i32, 0), abs(0));
+}
diff --git a/examples/monorepo/src/main.zig b/examples/monorepo/src/main.zig
new file mode 100644
index 0000000..667259e
--- /dev/null
+++ b/examples/monorepo/src/main.zig
@@ -0,0 +1,9 @@
+const std = @import("std");
+
+pub fn main(init: std.process.Init) !void {
+ const io = init.io;
+ var buf: [256]u8 = undefined;
+ var fw: std.Io.File.Writer = .init(.stdout(), io, &buf);
+ defer fw.interface.flush() catch {};
+ try fw.interface.print("monorepo root\n", .{});
+}