@@ -5,6 +5,7 @@ cd "$(dirname "$0")/.."
55
66python3 - << 'PY_CHECK '
77import json
8+ import re
89from pathlib import Path
910
1011pkg = json.loads(Path("package.json").read_text())
@@ -22,14 +23,62 @@ if vendor_package.get("version") != "3.4.3":
2223 raise SystemExit("vendor bootstrap-sass must track npm bootstrap-sass 3.4.3")
2324if vendor_package.get("license") != "MIT":
2425 raise SystemExit("vendor bootstrap-sass license metadata must remain MIT")
26+
27+ build = Path("ember-cli-build.js").read_text(encoding="utf-8")
28+ runtime_imports = re.findall(
29+ r"app\.import\('(?P<path>vendor/bootstrap-sass/assets/javascripts/[^']+)'\)",
30+ build,
31+ )
32+ expected_imports = [
33+ "vendor/bootstrap-sass/assets/javascripts/bootstrap/transition.js",
34+ "vendor/bootstrap-sass/assets/javascripts/bootstrap/collapse.js",
35+ "vendor/bootstrap-sass/assets/javascripts/bootstrap/dropdown.js",
36+ ]
37+ if runtime_imports != expected_imports:
38+ raise SystemExit(
39+ "Bootstrap runtime allowlist drift: "
40+ f"actual={runtime_imports!r} expected={expected_imports!r}"
41+ )
42+
43+ forbidden_source_patterns = {
44+ "Bootstrap loading-state data API": re.compile(r"data-loading-text", re.I),
45+ "Bootstrap Button data API": re.compile(r"data-toggle\s*=\s*['\"]buttons?['\"]", re.I),
46+ "Bootstrap Tooltip data API": re.compile(r"data-toggle\s*=\s*['\"]tooltip['\"]", re.I),
47+ "Bootstrap Popover data API": re.compile(r"data-toggle\s*=\s*['\"]popover['\"]", re.I),
48+ "Bootstrap Button jQuery API": re.compile(r"\.button\s*\("),
49+ "Bootstrap Tooltip jQuery API": re.compile(r"\.tooltip\s*\("),
50+ "Bootstrap Popover jQuery API": re.compile(r"\.popover\s*\("),
51+ }
52+ active_sources = [
53+ path
54+ for root in (Path("app"), Path("tests"))
55+ for path in root.rglob("*")
56+ if path.is_file() and path.suffix in {".js", ".hbs", ".html"}
57+ ]
58+ violations = []
59+ for path in active_sources:
60+ source = path.read_text(encoding="utf-8")
61+ for description, pattern in forbidden_source_patterns.items():
62+ if pattern.search(source):
63+ violations.append(f"{path}: {description}")
64+ if violations:
65+ raise SystemExit(
66+ "Vulnerable Bootstrap runtime API restored:\n" + "\n".join(violations)
67+ )
2568PY_CHECK
2669
2770if grep -R " bower_components/bootstrap-sass-official\\ |node_modules/bootstrap-sass" -n ember-cli-build.js app/styles package.json docs/baselines/npm-package-lock.sass-replacement.node24-ignore-scripts.json 2> /dev/null; then
2871 echo " Bootstrap Sass must be imported from vendored maintenance source, not Bower or node_modules" >&2
2972 exit 1
3073fi
3174
32- grep -q " vendor/bootstrap-sass/assets/javascripts/bootstrap.js" ember-cli-build.js
75+ if grep -q " app.import('vendor/bootstrap-sass/assets/javascripts/bootstrap.js')" ember-cli-build.js; then
76+ echo " The unsupported aggregate Bootstrap JavaScript bundle must not be imported" >&2
77+ exit 1
78+ fi
79+ grep -q " vendor/bootstrap-sass/assets/javascripts/bootstrap/transition.js" ember-cli-build.js
80+ grep -q " vendor/bootstrap-sass/assets/javascripts/bootstrap/collapse.js" ember-cli-build.js
81+ grep -q " vendor/bootstrap-sass/assets/javascripts/bootstrap/dropdown.js" ember-cli-build.js
3382grep -q " vendor/bootstrap-sass/assets/stylesheets/bootstrap" app/styles/app-light.scss
3483grep -q " vendor/bootstrap-sass/assets/stylesheets/bootstrap" app/styles/app-dark.scss
3584test -f vendor/bootstrap-sass/LICENSE
0 commit comments