Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
SeleniumHQ
GitHub Repository: SeleniumHQ/Selenium
Path: blob/trunk/javascript/private/jsdoc.bzl
4017 views
"""Rule for running jsdoc using Bazel-managed Node.js.

This rule creates a wrapper script that:
1. Runs jsdoc from the bazel-managed npm package
2. Outputs to the workspace build directory
3. Ignores jsdoc exit code (it exits 1 on type warnings) but verifies output was generated
"""

def _jsdoc_impl(ctx):
    jsdoc_bin = ctx.attr.jsdoc_binary[DefaultInfo].files_to_run.executable
    is_windows = ctx.target_platform_has_constraint(ctx.attr._windows_constraint[platform_common.ConstraintValueInfo])

    if is_windows:
        script = ctx.actions.declare_file(ctx.label.name + ".bat")
        ctx.actions.write(script, _WINDOWS_TEMPLATE.format(
            config = ctx.file.config.basename,
            jsdoc_bin = jsdoc_bin.short_path.replace("/", "\\\\"),
        ), is_executable = True)
    else:
        script = ctx.actions.declare_file(ctx.label.name + ".sh")
        ctx.actions.write(script, _UNIX_TEMPLATE.format(
            config = ctx.file.config.basename,
            jsdoc_bin = jsdoc_bin.short_path,
        ), is_executable = True)

    runfiles = ctx.runfiles(files = ctx.files.data + [ctx.file.config])
    runfiles = runfiles.merge(ctx.attr.jsdoc_binary[DefaultInfo].default_runfiles)
    return [DefaultInfo(executable = script, runfiles = runfiles)]

_UNIX_TEMPLATE = """#!/usr/bin/env bash
set -euo pipefail
cd "$BUILD_WORKSPACE_DIRECTORY/javascript/selenium-webdriver"
DEST="$BUILD_WORKSPACE_DIRECTORY/build/docs/api/javascript"
TEMPLATE="$0.runfiles/_main/javascript/selenium-webdriver/node_modules/clean-jsdoc-theme"

# Set BAZEL_BINDIR to suppress rules_js error for non-build actions
export BAZEL_BINDIR="."

# Clean destination to prevent stale files
rm -rf "$DEST"
mkdir -p "$DEST"

# Run jsdoc - ignore exit code since it fails on type warnings
"$0.runfiles/_main/{jsdoc_bin}" --configure {config} --destination "$DEST" --template "$TEMPLATE" "$@" || true

# Verify docs were generated
if [[ -f "$DEST/index.html" ]]; then
    echo "Documentation generated successfully at $DEST"
else
    echo "ERROR: Documentation was not generated"
    exit 1
fi
"""

_WINDOWS_TEMPLATE = """@echo off
cd /d "%BUILD_WORKSPACE_DIRECTORY%\\javascript\\selenium-webdriver"
set DEST=%BUILD_WORKSPACE_DIRECTORY%\\build\\docs\\api\\javascript
set TEMPLATE=%~dp0.runfiles\\_main\\javascript\\selenium-webdriver\\node_modules\\clean-jsdoc-theme
set BAZEL_BINDIR=.

if exist "%DEST%" rmdir /s /q "%DEST%"
mkdir "%DEST%"

"%~dp0.runfiles\\_main\\{jsdoc_bin}" --configure {config} --destination "%DEST%" --template "%TEMPLATE%" %*
if %ERRORLEVEL% neq 0 (
    echo jsdoc exited with warnings, checking output...
)

if exist "%DEST%\\index.html" (
    echo Documentation generated successfully at %DEST%
) else (
    echo ERROR: Documentation was not generated
    exit /b 1
)
"""

jsdoc = rule(
    implementation = _jsdoc_impl,
    executable = True,
    attrs = {
        "config": attr.label(
            mandatory = True,
            allow_single_file = [".json"],
        ),
        "data": attr.label_list(
            allow_files = True,
        ),
        "jsdoc_binary": attr.label(
            mandatory = True,
            executable = True,
            cfg = "target",
            doc = "The jsdoc binary target from npm",
        ),
        "_windows_constraint": attr.label(
            default = "@platforms//os:windows",
        ),
    },
)