Commit c1e94b28a3

Loris Cro <kappaloris@gmail.com>
2023-09-17 18:21:31
autodoc: split json payload per field
this will make s3 re-enable compression for the stdlib's autodoc and improve loading times (and data usage) for users alongside this commit the deploy script for the official website is also being updated
1 parent 33f3a4d
Changed files (3)
lib/docs/index.html
@@ -1226,7 +1226,17 @@
         </div>
       </div>
     </div>
-    <script src="data.js"></script>
+    <script src="data-typeKinds.js"></script>
+    <script src="data-rootMod.js"></script>
+    <script src="data-modules.js"></script>
+    <script src="data-files.js"></script>
+    <script src="data-calls.js"></script>
+    <script src="data-types.js"></script>
+    <script src="data-decls.js"></script>
+    <script src="data-exprs.js"></script>
+    <script src="data-astNodes.js"></script>
+    <script src="data-comptimeExprs.js"></script>
+    <script src="data-guideSections.js"></script>
     <script src="commonmark.js"></script>
     <script src="ziglexer.js"></script>
     <script src="main.js"></script>
lib/docs/main.js
@@ -1,6 +1,19 @@
 "use strict";
 
-var zigAnalysis;
+var zigAnalysis = {
+  typeKinds, 
+  rootMod, 
+  modules, 
+  astNodes, 
+  calls, 
+  files, 
+  decls, 
+  exprs, 
+  types,
+  comptimeExprs, 
+  guideSections
+};
+
 let skipNextHashChange = null;
 
 const NAV_MODES = {
@@ -200,11 +213,8 @@ var scrollHistory = {};
   window.addEventListener("keydown", onWindowKeyDown, false);
   onHashChange();
 
-  let langRefVersion = zigAnalysis.params.zigVersion;
-  if (!/^\d+\.\d+\.\d+$/.test(langRefVersion)) {
-    // the version is probably not released yet
-    langRefVersion = "master";
-  }
+  // TODO: fix this once langref becomes part of autodoc
+  let langRefVersion = "master";
   domLangRefLink.href = `https://ziglang.org/documentation/${langRefVersion}/`;
 
   function renderTitle() {
@@ -528,8 +538,8 @@ var scrollHistory = {};
     }
 
     let activeGuide = undefined;
-    outer: for (let i = 0; i < zigAnalysis.guide_sections.length; i += 1) {
-      const section = zigAnalysis.guide_sections[i];
+    outer: for (let i = 0; i < zigAnalysis.guideSections.length; i += 1) {
+      const section = zigAnalysis.guideSections[i];
       for (let j = 0; j < section.guides.length; j += 1) {
         const guide = section.guides[j];
         if (guide.name == curNav.activeGuide) {
@@ -595,7 +605,7 @@ var scrollHistory = {};
       domGuideTocList.classList.add("hidden");
       domGuideTocListEmtpy.classList.remove("hidden");
       
-      if (zigAnalysis.guide_sections.length > 1 || (zigAnalysis.guide_sections[0].guides.length > 0)) {
+      if (zigAnalysis.guideSections.length > 1 || (zigAnalysis.guideSections[0].guides.length > 0)) {
         renderGuidesIndex();
       } else {
         noGuidesAtAll();
@@ -609,8 +619,8 @@ var scrollHistory = {};
   // TODO: ensure unique hashes
   // TODO: hash also guides and their headings
   function computeGuideHashes() {
-      for (let i = 1; i < zigAnalysis.guide_sections.length; i += 1) {
-        const section = zigAnalysis.guide_sections[i];
+      for (let i = 1; i < zigAnalysis.guideSections.length; i += 1) {
+        const section = zigAnalysis.guideSections[i];
         section.hash = "section-" + slugify(section.name || i);
       }
   }
@@ -619,8 +629,8 @@ var scrollHistory = {};
     // main content 
     {
     let html = "";
-      for (let i = 0; i < zigAnalysis.guide_sections.length; i += 1) {
-        const section = zigAnalysis.guide_sections[i];
+      for (let i = 0; i < zigAnalysis.guideSections.length; i += 1) {
+        const section = zigAnalysis.guideSections[i];
         if (i != 0) { // first section is the default section
           html += "<h2 id='"+ section.hash +"'>" + section.name + "</h2>";
       }
@@ -635,10 +645,10 @@ var scrollHistory = {};
     // sidebar / fast navigation
     {
       domGuidesMenuTitle.textContent = "Sections";
-      if (zigAnalysis.guide_sections.length > 1) {
+      if (zigAnalysis.guideSections.length > 1) {
         let html = "";
-        for (let i = 1; i < zigAnalysis.guide_sections.length; i += 1) {
-          const section = zigAnalysis.guide_sections[i];
+        for (let i = 1; i < zigAnalysis.guideSections.length; i += 1) {
+          const section = zigAnalysis.guideSections[i];
           html += "<li><a href='"+ NAV_MODES.GUIDES + ":" + section.hash +"'>" + section.name + "</a></li>";
         }
         domGuideTocList.innerHTML = "<ul>"+html+"</ul>";
@@ -3978,8 +3988,8 @@ Happy writing!
   }
 
   function parseGuides() {
-    for (let j = 0; j < zigAnalysis.guide_sections.length; j += 1) {
-      const section = zigAnalysis.guide_sections[j];
+    for (let j = 0; j < zigAnalysis.guideSections.length; j += 1) {
+      const section = zigAnalysis.guideSections[j];
       for (let i = 0; i < section.guides.length; i += 1) {
         let reader = new commonmark.Parser({ smart: true });
         const guide = section.guides[i];
src/Autodoc.zig
@@ -344,7 +344,6 @@ fn generateZirData(self: *Autodoc, output_dir: std.fs.Dir) !void {
     }
 
     var data = DocData{
-        .params = .{},
         .modules = self.modules,
         .files = self.files,
         .calls = self.calls.items,
@@ -353,28 +352,41 @@ fn generateZirData(self: *Autodoc, output_dir: std.fs.Dir) !void {
         .exprs = self.exprs.items,
         .astNodes = self.ast_nodes.items,
         .comptimeExprs = self.comptime_exprs.items,
-        .guide_sections = self.guide_sections,
+        .guideSections = self.guide_sections,
     };
 
-    {
-        const data_js_f = try output_dir.createFile("data.js", .{});
+    inline for (comptime std.meta.tags(std.meta.FieldEnum(DocData))) |f| {
+        const field_name = @tagName(f);
+        const file_name = "data-" ++ field_name ++ ".js";
+        const data_js_f = try output_dir.createFile(file_name, .{});
         defer data_js_f.close();
-        var buffer = std.io.bufferedWriter(data_js_f.writer());
 
+        var buffer = std.io.bufferedWriter(data_js_f.writer());
         const out = buffer.writer();
-        try out.print(
-            \\ /** @type {{DocData}} */
-            \\ var zigAnalysis=
-        , .{});
-        try std.json.stringifyArbitraryDepth(
-            self.arena,
-            data,
-            .{
-                .whitespace = .minified,
-                .emit_null_optional_fields = true,
-            },
-            out,
-        );
+
+        try out.print("var {s} =", .{field_name});
+
+        var jsw = std.json.writeStream(out, .{
+            .whitespace = .minified,
+            .emit_null_optional_fields = true,
+        });
+
+        switch (f) {
+            .files => try writeFileTableToJson(data.files, data.modules, &jsw),
+            .guideSections => try writeGuidesToJson(data.guideSections, &jsw),
+            .modules => try jsw.write(data.modules.values()),
+            else => try jsw.write(@field(data, field_name)),
+        }
+
+        // try std.json.stringifyArbitraryDepth(
+        //     self.arena,
+        //     @field(data, field.name),
+        //     .{
+        //         .whitespace = .minified,
+        //         .emit_null_optional_fields = true,
+        //     },
+        //     out,
+        // );
         try out.print(";", .{});
 
         // last thing (that can fail) that we do is flush
@@ -476,18 +488,12 @@ const Scope = struct {
 
 /// The output of our analysis process.
 const DocData = struct {
+    // NOTE: editing fields of DocData requires also updating:
+    //       - the deployment script for ziglang.org
+    //       - imports in index.html
     typeKinds: []const []const u8 = std.meta.fieldNames(DocTypeKinds),
     rootMod: u32 = 0,
-    params: struct {
-        zigId: []const u8 = "arst",
-        zigVersion: []const u8 = build_options.version,
-        target: []const u8 = "arst",
-        builds: []const struct { target: []const u8 } = &.{
-            .{ .target = "arst" },
-        },
-    },
     modules: std.AutoArrayHashMapUnmanaged(*Module, DocModule),
-    errors: []struct {} = &.{},
 
     // non-hardcoded stuff
     astNodes: []AstNode,
@@ -498,7 +504,7 @@ const DocData = struct {
     exprs: []Expr,
     comptimeExprs: []ComptimeExpr,
 
-    guide_sections: std.ArrayListUnmanaged(Section),
+    guideSections: std.ArrayListUnmanaged(Section),
 
     const Call = struct {
         func: Expr,
@@ -506,20 +512,6 @@ const DocData = struct {
         ret: Expr,
     };
 
-    pub fn jsonStringify(self: DocData, jsw: anytype) !void {
-        try jsw.beginObject();
-        inline for (comptime std.meta.tags(std.meta.FieldEnum(DocData))) |f| {
-            const f_name = @tagName(f);
-            try jsw.objectField(f_name);
-            switch (f) {
-                .files => try writeFileTableToJson(self.files, self.modules, jsw),
-                .guide_sections => try writeGuidesToJson(self.guide_sections, jsw),
-                .modules => try jsw.write(self.modules.values()),
-                else => try jsw.write(@field(self, f_name)),
-            }
-        }
-        try jsw.endObject();
-    }
     /// All the type "families" as described by `std.builtin.TypeId`
     /// plus a couple extra that are unique to our use case.
     ///