defmodule Webql.MixProject do use Mix.Project @app :webql @version "0.1.0-alpha.2" @description "A typed query language and runtime for building executable data graphs." def project do [ app: @app, version: @version, elixir: "~> 1.17", description: @description, docs: docs(), package: package(), erlc_paths: erlc_paths(), elixirc_paths: ["lib"], test_paths: ["test"], aliases: aliases(), dialyzer: dialyzer(), deps: deps() ] end def application do [ extra_applications: [:logger] ] end defp deps do [ {:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false}, {:ex_doc, "~> 0.40.3", only: :dev, runtime: false}, {:makeup_gleam, "~> 1.0", only: :dev, runtime: false}, {:spark, "~> 2.7.0"} ] end defp aliases do [ docs: [ "cmd gleam build --target erlang", # NOTE: there is an active issue is being tracked for compiling bash files in the gleam pipeline. # https://github.com/gleam-lang/gleam/issues/4474 "cmd rm -f build/#{Mix.env()}/erlang/*/_gleam_artefacts/gleam@@compile.erl", "cmd gleam docs build", &generate_gleam_extras/1, "docs" ] ] end defp erlc_paths do env = if Mix.env() == :prod, do: :prod, else: :dev [ "build/#{env}/erlang/webql/_gleam_artefacts", "build/#{env}/erlang/gleam_stdlib/_gleam_artefacts" ] end defp docs do [ main: "readme", extras: ["README.md"] ++ gleam_doc_links(), groups_for_extras: groups_for_extras(), groups_for_modules: groups_for_modules(), filter_modules: ~r/^Elixir\.Webql(\.|$)/ ] end defp package do [ name: "webql", description: @description, licenses: ["MIT"], build_tools: ["gleam", "mix"], links: %{"GitHub" => "https://github.com/webql-lang/webql"}, files: [ "gleam.toml", "manifest.toml", "lib", "src", "build/prod/erlang", "mix.exs", "README.md", "LICENSE" ] ] end defp dialyzer do [ paths: ["_build/#{Mix.env()}/lib/#{@app}/ebin"], exclude_files: [ "gleam.*\\.beam$", "webql@.*\\.beam$" ], flags: [:no_missing_calls], list_unused_filters: false ] end defp groups_for_modules do [ Webql: [Webql], Schema: ~r/^Webql\.Schema(\.|$)/ ] end defp groups_for_extras do [ Schema: ~r{^build/dev/exdoc_gleam/webql-schema\.md$}, Introspection: ~r{^build/dev/exdoc_gleam/webql-introspection\.md$}, Graph: ~r{^build/dev/exdoc_gleam/webql-graph\.md$}, Compiler: ~r{^build/dev/exdoc_gleam/webql-compiler(?:-|\.md$)}, Assembler: ~r{^build/dev/exdoc_gleam/webql-assembler(?:-|\.md$)}, Engine: ~r{^build/dev/exdoc_gleam/webql-engine(?:-|\.md$)}, Interpreter: [ ~r{^build/dev/exdoc_gleam/webql\.md$}, ~r{^build/dev/exdoc_gleam/webql-interpreter(?:-|\.md$)} ], Memory: ~r{^build/dev/exdoc_gleam/webql-memory(?:-|\.md$)}, Diagnostic: ~r{^build/dev/exdoc_gleam/webql-diagnostic\.md$} ] end defp gleam_modules do "src/**/*.gleam" |> Path.wildcard() |> Enum.sort() |> Enum.map(fn path -> path |> Path.rootname() |> Path.relative_to("src") end) end defp gleam_doc_links do for module <- gleam_modules() do filename = String.replace(module, "/", "-") { Path.join("build/dev/exdoc_gleam", filename <> ".md"), title: module, filename: filename, source: "src/#{module}.gleam" } end end defp generate_gleam_extras(_extra) do File.rm_rf!("build/dev/exdoc_gleam") File.mkdir_p!("build/dev/exdoc_gleam") items_by_module = "build/dev/docs/webql" |> Path.join("search-data.json") |> File.read!() |> :json.decode() |> Map.fetch!("items") |> Enum.reject(&(&1["type"] == "module")) |> Enum.group_by(& &1["parentTitle"]) for module <- gleam_modules() do filename = String.replace(module, "/", "-") path = Path.join("build/dev/exdoc_gleam", filename <> ".md") items = Map.get(items_by_module, module, []) body = [ "# #{module}\n\n", gleam_doc_section("Types", items, "type"), gleam_doc_section("Values", items, "value") ] File.write!(path, IO.iodata_to_binary(body)) end end defp gleam_doc_section(title, items, type) do items = items |> Enum.filter(&(&1["type"] == type)) |> Enum.sort_by(& &1["title"]) case items do [] -> [] items -> [ "## #{title}\n\n", for item <- items do doc = item["doc"] |> Kernel.||("") |> String.replace(~r/\nSynonyms:\n(.|\n)*\z/, "") |> String.trim() [ "### ", item["title"], "\n\n", doc, "\n\n" ] end ] end end end