From a448ce86de7ce8caac96b948bc18b4175cd0cd20 Mon Sep 17 00:00:00 2001 From: "songtianyi.theo" Date: Thu, 9 Jul 2026 17:54:55 +0800 Subject: [PATCH] fix: simplify svglide ppe proxy setup --- scripts/dev-svglide-ppe-env.sh | 93 ++++------------------ scripts/dev-svglide-ppe-env.test.js | 116 ++++++++++++++++++++++++++++ 2 files changed, 132 insertions(+), 77 deletions(-) create mode 100644 scripts/dev-svglide-ppe-env.test.js diff --git a/scripts/dev-svglide-ppe-env.sh b/scripts/dev-svglide-ppe-env.sh index 6202838e..537bedb7 100755 --- a/scripts/dev-svglide-ppe-env.sh +++ b/scripts/dev-svglide-ppe-env.sh @@ -5,12 +5,6 @@ CANONICAL_RULE_NAME="lark-cli-openapi-ppe-svg-slides" PROXY_HOST="${LARK_CLI_PROXY_HOST:-127.0.0.1}" PROXY_PORT="${LARK_CLI_PROXY_PORT:-8899}" -# Keep this list intentionally small and explicit. These were previous local -# SVGlide/PPE rule names that can route generated SVG Slides to the wrong lane. -# Do not store them in a whitespace-split variable: this script is meant to be -# sourced by zsh as well as POSIX shells, and zsh does not split scalars by -# whitespace unless SH_WORD_SPLIT is enabled. - fail() { printf '%s\n' "[svglide-ppe] $*" >&2 return 1 2>/dev/null || exit 1 @@ -23,14 +17,15 @@ info() { usage() { cat <] [--port ] [--no-clear] + . ./scripts/dev-svglide-ppe-env.sh pre . ./scripts/dev-svglide-ppe-env.sh off ./scripts/dev-svglide-ppe-env.sh rules Notes: - Use "source" or "." for pre/off so proxy env vars apply to the current shell. - pre writes the canonical Whistle rule "${CANONICAL_RULE_NAME}". - - pre also clears known legacy SVGlide/PPE rule names unless --no-clear is passed. + - off disables only the canonical Whistle rule "${CANONICAL_RULE_NAME}". + - The only PPE lane is "ppe_svg_slides". - This is dev-only PPE plumbing, not production publish behavior. USAGE } @@ -89,11 +84,9 @@ RULES } disabled_rules() { - rule_name="$1" cat </dev/null 2>&1 || { rm -f "$tmp_js" @@ -129,41 +132,6 @@ apply_rule() { rm -f "$tmp_js" } -clear_legacy_rules() { - wcmd="$1" - clear_legacy_rule "$wcmd" "lark-cli-openapi-env-switch" - clear_legacy_rule "$wcmd" "lark-cli-openapi-ppe-svglide" - clear_legacy_rule "$wcmd" "lark-cli-openapi-ppe-pure-svg" - clear_legacy_rule "$wcmd" "lark-cli-openapi-ppe-pure-svg-control" - clear_legacy_rule "$wcmd" "lark-cli-openapi-ppe-svg-slides-header-only" - clear_legacy_rule "$wcmd" "lark-cli-pre-ppe-svglide-combined" - clear_legacy_rule "$wcmd" "lark-cli-ppe-pure-svg" - clear_legacy_rule "$wcmd" "lark-cli-ppe-svglide" - clear_legacy_rule "$wcmd" "lark-cli-prod-host-pre-env-ppe-header" - clear_legacy_rule "$wcmd" "lark-cli-prod-ppe-svglide-header-only" -} - -clear_legacy_rule() { - wcmd="$1" - rule_name="$2" - [ "$rule_name" = "$CANONICAL_RULE_NAME" ] && return 0 - remove_rule "$wcmd" "$rule_name" || apply_rule "$wcmd" "$rule_name" "$(disabled_rules "$rule_name")" - info "cleared legacy Whistle rule: ${rule_name}" -} - -remove_rule() { - _wcmd="$1" - rule_name="$2" - if ! command -v curl >/dev/null 2>&1; then - return 1 - fi - curl -fsS \ - -X POST \ - -H 'Content-Type: application/json' \ - --data "{\"name\":\"${rule_name}\"}" \ - "http://${PROXY_HOST}:${PROXY_PORT}/cgi-bin/rules/remove" >/dev/null 2>&1 -} - apply_proxy_env() { proxy_url="http://${PROXY_HOST}:${PROXY_PORT}" export HTTPS_PROXY="$proxy_url" @@ -189,32 +157,7 @@ mode="${1:-}" } shift || true -clear_legacy="1" -while [ "$#" -gt 0 ]; do - case "$1" in - --host) - [ "$#" -ge 2 ] || fail "--host requires a value" - PROXY_HOST="$2" - shift 2 - ;; - --port) - [ "$#" -ge 2 ] || fail "--port requires a value" - PROXY_PORT="$2" - shift 2 - ;; - --no-clear) - clear_legacy="0" - shift - ;; - -h|--help) - usage - return 0 2>/dev/null || exit 0 - ;; - *) - fail "unknown arg: $1" - ;; - esac -done +[ "$#" -eq 0 ] || fail "unexpected args for mode ${mode}" case "$mode" in rules) @@ -223,9 +166,6 @@ case "$mode" in pre) wcmd="$(pick_whistle_cmd)" ensure_whistle_running "$wcmd" - if [ "$clear_legacy" = "1" ]; then - clear_legacy_rules "$wcmd" - fi apply_rule "$wcmd" "$CANONICAL_RULE_NAME" "$(canonical_rules)" info "applied canonical Whistle rule: ${CANONICAL_RULE_NAME}" if is_sourced; then @@ -239,8 +179,7 @@ case "$mode" in off|cancel) wcmd="$(pick_whistle_cmd)" ensure_whistle_running "$wcmd" - clear_legacy_rules "$wcmd" - apply_rule "$wcmd" "$CANONICAL_RULE_NAME" "$(disabled_rules "$CANONICAL_RULE_NAME")" + apply_rule "$wcmd" "$CANONICAL_RULE_NAME" "$(disabled_rules)" info "disabled canonical Whistle rule: ${CANONICAL_RULE_NAME}" if is_sourced; then clear_proxy_env diff --git a/scripts/dev-svglide-ppe-env.test.js b/scripts/dev-svglide-ppe-env.test.js new file mode 100644 index 00000000..78ba42e0 --- /dev/null +++ b/scripts/dev-svglide-ppe-env.test.js @@ -0,0 +1,116 @@ +// Copyright (c) 2026 Lark Technologies Pte. Ltd. +// SPDX-License-Identifier: MIT + +const { describe, it } = require("node:test"); +const assert = require("node:assert/strict"); +const fs = require("node:fs"); +const os = require("node:os"); +const path = require("node:path"); +const { spawnSync } = require("node:child_process"); + +const repoRoot = path.resolve(__dirname, ".."); + +function createMockWhistle() { + const tmp = fs.mkdtempSync(path.join(os.tmpdir(), "svglide-ppe-test-")); + const binDir = path.join(tmp, "bin"); + const logPath = path.join(tmp, "w2.log"); + fs.mkdirSync(binDir); + + fs.writeFileSync(path.join(binDir, "w2"), `#!/usr/bin/env sh +case "$1" in + status) + printf '%s\\n' "Whistle is running" + ;; + add) + node -e 'require(process.argv[1])((rule) => console.log(JSON.stringify({ name: rule.name, rules: rule.rules })))' "$2" >>"$SVGLIDE_TEST_W2_LOG" + ;; + start) + printf '%s\\n' "START" >>"$SVGLIDE_TEST_W2_LOG" + ;; + *) + printf 'unexpected w2 args: %s\\n' "$*" >&2 + exit 2 + ;; +esac +`); + fs.chmodSync(path.join(binDir, "w2"), 0o755); + + return { binDir, logPath }; +} + +function readLoggedRules(logPath) { + return fs + .readFileSync(logPath, "utf8") + .trim() + .split("\n") + .filter(Boolean) + .map((line) => JSON.parse(line)); +} + +describe("dev-svglide-ppe-env", () => { + it("keeps one canonical rule name in the script source", () => { + const source = fs.readFileSync(path.join(repoRoot, "scripts/dev-svglide-ppe-env.sh"), "utf8"); + + assert.match(source, /CANONICAL_RULE_NAME="lark-cli-openapi-ppe-svg-slides"/); + assert.doesNotMatch( + source, + /lark-cli-openapi-env-switch|lark-cli-openapi-ppe-svglide|lark-cli-openapi-ppe-pure-svg|lark-cli-ppe-svglide|lark-cli-prod-ppe/ + ); + }); + + it("prints only the canonical SVG Slides PPE lane", () => { + const result = spawnSync("sh", ["scripts/dev-svglide-ppe-env.sh", "rules"], { + cwd: repoRoot, + encoding: "utf8", + }); + + assert.equal(result.status, 0, result.stderr); + assert.match(result.stdout, /open\.feishu-pre\.cn/); + assert.match(result.stdout, /x-tt-env=ppe_svg_slides/); + assert.match(result.stdout, /x-use-ppe=1/); + assert.doesNotMatch(result.stdout, /ppe_pure_svg|ppe_svglide/); + }); + + it("keeps pre mode to one written Whistle rule", () => { + const { binDir, logPath } = createMockWhistle(); + + const result = spawnSync("sh", ["-c", ". ./scripts/dev-svglide-ppe-env.sh pre"], { + cwd: repoRoot, + env: { + ...process.env, + PATH: `${binDir}${path.delimiter}${process.env.PATH}`, + SVGLIDE_TEST_W2_LOG: logPath, + }, + encoding: "utf8", + }); + + assert.equal(result.status, 0, result.stderr); + const rules = readLoggedRules(logPath); + assert.equal(rules.length, 1); + assert.equal(rules[0].name, "lark-cli-openapi-ppe-svg-slides"); + assert.match(rules[0].rules, /x-tt-env=ppe_svg_slides/); + assert.doesNotMatch(rules[0].rules, /ppe_pure_svg|ppe_svglide/); + }); + + it("keeps off mode to one disabled canonical Whistle rule", () => { + const { binDir, logPath } = createMockWhistle(); + + const result = spawnSync("sh", ["-c", ". ./scripts/dev-svglide-ppe-env.sh off"], { + cwd: repoRoot, + env: { + ...process.env, + PATH: `${binDir}${path.delimiter}${process.env.PATH}`, + SVGLIDE_TEST_W2_LOG: logPath, + }, + encoding: "utf8", + }); + + assert.equal(result.status, 0, result.stderr); + const rules = readLoggedRules(logPath); + assert.equal(rules.length, 1); + assert.equal(rules[0].name, "lark-cli-openapi-ppe-svg-slides"); + assert.match(rules[0].rules, /disabled by scripts\/dev-svglide-ppe-env\.sh/); + assert.match(rules[0].rules, /canonical SVGlide PPE rule: lark-cli-openapi-ppe-svg-slides/); + assert.doesNotMatch(rules[0].rules, /legacy|ppe_pure_svg|ppe_svglide/); + }); +});